diff --git a/packages/adguard-api/CHANGELOG.md b/packages/adguard-api/CHANGELOG.md index 7c9742217..c80566286 100644 --- a/packages/adguard-api/CHANGELOG.md +++ b/packages/adguard-api/CHANGELOG.md @@ -4,10 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.3.0] - 2023-08-10 ### Changed - [BREAKING CHANGE] Assistant script is separated and dynamically injected. You need to provide it in your project. -- Update `@adguard/tswebextension` to `v0.0.62` +- Update `@adguard/tswebextension` to `v0.3.9` +- Update `@adguard/assistant` to `v4.3.70` ## [1.2.2] - 2022-12-02 diff --git a/packages/adguard-api/README.md b/packages/adguard-api/README.md index 4dc729f04..46fdf9676 100644 --- a/packages/adguard-api/README.md +++ b/packages/adguard-api/README.md @@ -1,5 +1,5 @@ # AdGuard API -**Version: 1.2.0** +**Version: 1.3.0** AdGuard API is filtering library, provided following features: @@ -33,13 +33,13 @@ AdGuard API is filtering library, provided following features: The library code can be loaded either via `script` tag or as an `npm` module. ### Installation via `script` tag -1. Copy `adguard-api.js` and `adguard-content.js` scripts from `dist` to the directory near `manifest.json` +1. Copy `adguard-api.js`, `adguard-content.js` and `adguard-assistant.js` scripts from `dist` to the directory near `manifest.json` 2. Create `adguard` directory near `manifest.json` 3. Place [web accessible resources](#required-web-accessible-resources) into `adguard` directory -4. Add AdGuard's content script to the manifest: +4. Add AdGuard's content scripts to the manifest: ``` { "all_frames": true, @@ -73,20 +73,26 @@ or yarn add @adguard/api ``` -1. Import `AdguardApi` class to background script +2. Import `AdguardApi` class to background script ``` import { AdguardApi } from "@adguard/api"; ``` -1. Import `adguard-contents` in top of you content script entry +3. Import `adguard-contents` in top of you content script entry ``` import '@adguard/api/content-script'; ``` -4. Add [web accessible resources](#required-web-accessible-resources) downloading in you build pipeline or load it manually +4. Import `adguard-assistant` in top of you assistant script entry -5. Setup manifest content-script with imported `adguard-contents` as follow +``` +import '@adguard/api/assistant'; +``` + +5. Add [web accessible resources](#required-web-accessible-resources) downloading in you build pipeline or load it manually + +6. Setup manifest content-script with imported `adguard-contents` as follow ``` { diff --git a/packages/adguard-api/dist/adguard-api.js b/packages/adguard-api/dist/adguard-api.js index 5b3d92729..a49bd5873 100644 --- a/packages/adguard-api/dist/adguard-api.js +++ b/packages/adguard-api/dist/adguard-api.js @@ -11,7 +11,7 @@ return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ -/***/ 3492: +/***/ 7744: /***/ ((module) => { /** @@ -172,7 +172,7 @@ module.exports = (() => { /***/ }), -/***/ 9784: +/***/ 5771: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -601,7 +601,7 @@ const FiltersDownloaderCreator = (FileDownloadWrapper) => { if (typeof URL !== 'undefined') { return new URL(url); } else { - let URL = (__webpack_require__(883).URL); + let URL = (__webpack_require__(7545).URL); return new URL(url); } }; @@ -620,14 +620,14 @@ module.exports = FiltersDownloaderCreator; /***/ }), -/***/ 2846: +/***/ 5042: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // This file replaces `index.js` in bundlers like webpack or Rollup, // according to `browser` config in `package.json`. -const filtersDownloaderCreator = __webpack_require__(9784); -const FileDownloadWrapper = __webpack_require__(3492); +const filtersDownloaderCreator = __webpack_require__(5771); +const FileDownloadWrapper = __webpack_require__(7744); const FiltersDownloader = filtersDownloaderCreator(FileDownloadWrapper); @@ -636,31979 +636,31670 @@ module.exports = FiltersDownloader; /***/ }), -/***/ 1586: -/***/ ((module, exports, __webpack_require__) => { +/***/ 9662: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__; -/** - * AdGuard Scriptlets - * Version 1.9.7 - */ +var isCallable = __webpack_require__(614); +var tryToString = __webpack_require__(6330); -(function (factory) { - true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : - __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : - 0; -})((function () { - /** - * Concat dependencies to scriptlet code - * - * @param {string} scriptlet string view of scriptlet - * @returns {string} string view of scriptlet with attached dependencies - */ - function attachDependencies(scriptlet) { - const _scriptlet$injections = scriptlet.injections, - injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections; - return injections.reduce(function (accum, dep) { - return "".concat(accum, "\n").concat(dep.toString()); - }, scriptlet.toString()); - } +var $TypeError = TypeError; - /** - * Add scriptlet call to existing code - * - * @param {Function} scriptlet scriptlet func - * @param {string} code scriptlet's string representation - * @returns {string} wrapped scriptlet call - */ - function addCall(scriptlet, code) { - return "".concat(code, "\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n ").concat(scriptlet.name, ".apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }"); - } +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw $TypeError(tryToString(argument) + ' is not a function'); +}; - /** - * Wrap function into IIFE (Immediately invoked function expression) - * - * @example - * const source = { - * args: ["aaa", "bbb"], - * name: 'noeval', - * }; - * const code = "function noeval(source, args) { alert(source); } noeval.apply(this, args);" - * const result = wrapInIIFE(source, code); - * - * // result - * `(function(source, args) { - * function noeval(source) { alert(source); } - * noeval.apply(this, args); - * )({"args": ["aaa", "bbb"], "name":"noeval"}, ["aaa", "bbb"])` - * @param {Object} source - object with scriptlet properties - * @param {string} code - scriptlet source code with dependencies - * @param {boolean} redirect if function is redirect - * @returns {string} full scriptlet code - */ - function passSourceAndProps(source, code) { - let redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (source.hit) { - source.hit = source.hit.toString(); - } - const sourceString = JSON.stringify(source); - const argsString = source.args ? "[".concat(source.args.map(JSON.stringify), "]") : undefined; - const params = argsString ? "".concat(sourceString, ", ").concat(argsString) : sourceString; - if (redirect) { - return "(function(source, args){\n".concat(code, "\n})(").concat(params, ");"); - } - return "(".concat(code, ")(").concat(params, ");"); - } - /** - * Wrap code in no name function - * - * @param {string} code which must be wrapped - * @returns {string} wrapped code - */ - function wrapInNonameFunc(code) { - return "function(source, args){\n".concat(code, "\n}"); - } +/***/ }), - /** - * Converts object to array of pairs. - * Object.entries() polyfill because it is not supported by IE - * https://caniuse.com/?search=Object.entries - * - * @param {Object} object arbitrary object - * @returns {Array} array of pairs - */ - const getObjectEntries = function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - }; +/***/ 6077: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Converts array of pairs to object. - * Object.fromEntries() polyfill because it is not supported by IE - * https://caniuse.com/?search=Object.fromEntries - * - * @param {Array} entries - array of pairs - * @returns {Object} result object - */ - const getObjectFromEntries = function getObjectFromEntries(entries) { - const output = entries.reduce(function (acc, el) { - const key = el[0]; - const value = el[1]; - acc[key] = value; - return acc; - }, {}); - return output; - }; +var isCallable = __webpack_require__(614); - /** - * Checks whether the obj is an empty object - * - * @param {Object} obj arbitrary object - * @returns {boolean} if object is empty - */ - const isEmptyObject = function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - }; +var $String = String; +var $TypeError = TypeError; - /** - * Safely retrieve property descriptor - * - * @param {Object} obj target object - * @param {string} prop target property - * @returns {object|null} descriptor or null if it's not available or non-configurable - */ - const safeGetDescriptor = function safeGetDescriptor(obj, prop) { - const descriptor = Object.getOwnPropertyDescriptor(obj, prop); - if (descriptor && descriptor.configurable) { - return descriptor; - } - return null; - }; +module.exports = function (argument) { + if (typeof argument == 'object' || isCallable(argument)) return argument; + throw $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; - /** - * Set getter and setter to property if it's configurable - * - * @param {Object} object target object with property - * @param {string} property property name - * @param {Object} descriptor contains getter and setter functions - * @returns {boolean} is operation successful - */ - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; - } - /** - * Determines whether the passed value is NaN - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN - * - * @param {any} num arbitrary value - * @returns {boolean} if provided value is NaN - */ - const nativeIsNaN = function nativeIsNaN(num) { - // eslint-disable-next-line no-restricted-properties - const native = Number.isNaN || window.isNaN; - return native(num); - }; +/***/ }), - /** - * Determines whether the passed value is a finite number - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite - * - * @param {any} num arbitrary value - * @returns {boolean} if provided value is finite - */ - const nativeIsFinite = function nativeIsFinite(num) { - // eslint-disable-next-line no-restricted-properties - const native = Number.isFinite || window.isFinite; - return native(num); - }; +/***/ 1223: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Parses string for a number, if possible, otherwise returns null. - * - * @param {any} rawString arbitrary string - * @returns {number|null} number or null if string not parsable - */ - const getNumberFromString = function getNumberFromString(rawString) { - const parsedDelay = parseInt(rawString, 10); - const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; - return validDelay; - }; +var wellKnownSymbol = __webpack_require__(5112); +var create = __webpack_require__(30); +var defineProperty = (__webpack_require__(3070).f); - /** - * Generate a random integer between two values, inclusive - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive - * - * @param {number} min range minimum - * @param {number} max range maximum - * @returns {number} random number - */ - function getRandomIntInclusive(min, max) { - min = Math.ceil(min); - max = Math.floor(max); - return Math.floor(Math.random() * (max - min + 1) + min); - } +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; - /** - * String.prototype.replaceAll polyfill - * - * @param {string} input input string - * @param {string} substr to look for - * @param {string} newSubstr replacement - * @returns {string} result string - */ - const replaceAll = function replaceAll(input, substr, newSubstr) { - return input.split(substr).join(newSubstr); - }; +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] == undefined) { + defineProperty(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} - /** - * Escapes special chars in string - * - * @param {string} str raw string - * @returns {string} string with escaped special characters - */ - const escapeRegExp = function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - }; +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; - /** - * A literal string or regexp pattern wrapped in forward slashes. - * For example, 'simpleStr' or '/adblock|_0x/'. - * - * @typedef {string} RawStrPattern - */ - /** - * Converts string to the regexp - * TODO think about nested dependencies, but be careful with dependency loops - * - * @param {RawStrPattern} [input=''] literal string or regexp pattern; defaults to '' (empty string) - * @returns {RegExp} regular expression; defaults to /.?/ - * @throws {SyntaxError} Throw an error for invalid regex pattern - */ - const toRegExp = function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - const DEFAULT_VALUE = '.?'; - const FORWARD_SLASH = '/'; - if (input === '') { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - return new RegExp(escaped); - }; +/***/ }), - /** - * Checks whether the input string can be converted to regexp - * - * @param {RawStrPattern} input literal string or regexp pattern - * @returns {boolean} if input can be converted to regexp - */ - const isValidStrPattern = function isValidStrPattern(input) { - const FORWARD_SLASH = '/'; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); - } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; - } - return isValid; - }; +/***/ 9670: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Get string before regexp first match - * - * @param {string} str input string - * @param {RegExp} rx find pattern - * @returns {string} result string - */ - const getBeforeRegExp = function getBeforeRegExp(str, rx) { - const index = str.search(rx); - return str.substring(0, index); - }; +var isObject = __webpack_require__(111); - /** - * Checks whether the string starts with the substring - * - * @param {string} str full string - * @param {string} prefix substring - * @returns {boolean} if string start with the substring - */ - const startsWith$1 = function startsWith(str, prefix) { - // if str === '', (str && false) will return '' - // that's why it has to be !!str - return !!str && str.indexOf(prefix) === 0; - }; +var $String = String; +var $TypeError = TypeError; - /** - * Checks whether the string ends with the substring - * - * @param {string} str full string - * @param {string} ending substring - * @returns {boolean} string ends with the substring - */ - const endsWith = function endsWith(str, ending) { - // if str === '', (str && false) will return '' - // that's why it has to be !!str - return !!str && str.lastIndexOf(ending) === str.length - ending.length; - }; - const substringAfter$1 = function substringAfter(str, separator) { - if (!str) { - return str; - } - const index = str.indexOf(separator); - return index < 0 ? '' : str.substring(index + separator.length); - }; - const substringBefore = function substringBefore(str, separator) { - if (!str || !separator) { - return str; - } - const index = str.indexOf(separator); - return index < 0 ? str : str.substring(0, index); - }; +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw $TypeError($String(argument) + ' is not an object'); +}; - /** - * Wrap str in single quotes and replaces single quotes to double one - * - * @param {string} str input string - * @returns {string} string with swapped quotes - */ - const wrapInSingleQuotes = function wrapInSingleQuotes(str) { - if (str[0] === '\'' && str[str.length - 1] === '\'' || str[0] === '"' && str[str.length - 1] === '"') { - str = str.substring(1, str.length - 1); - } - // eslint-disable-next-line no-useless-escape - str = str.replace(/\'/g, '"'); - return "'".concat(str, "'"); - }; - /** - * Returns substring enclosed in the widest braces - * - * @param {string} str input string - * @returns {string} substring - */ - const getStringInBraces = function getStringInBraces(str) { - const firstIndex = str.indexOf('('); - const lastIndex = str.lastIndexOf(')'); - return str.substring(firstIndex + 1, lastIndex); - }; +/***/ }), - /** - * Prepares RTCPeerConnection config as string for proper logging - * - * @param {any} config RTC config - * @returns {string} stringified config - */ - const convertRtcConfigToString = function convertRtcConfigToString(config) { - const UNDEF_STR = 'undefined'; - let str = UNDEF_STR; - if (config === null) { - str = 'null'; - } else if (config instanceof Object) { - const SERVERS_PROP_NAME = 'iceServers'; - const URLS_PROP_NAME = 'urls'; - /* - const exampleConfig = { - 'iceServers': [ - 'urls': ['stun:35.66.206.188:443'], - ], - }; - */ - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { - str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); - } - } - return str; - }; +/***/ 1318: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Checks whether the match input string can be converted to regexp, - * used for match inputs with possible negation - * - * @param {string} match literal string or regexp pattern - * @returns {boolean} true if input can be converted to regexp - */ - const isValidMatchStr = function isValidMatchStr(match) { - const INVERT_MARKER = '!'; - let str = match; - if (startsWith$1(match, INVERT_MARKER)) { - str = match.slice(1); - } - return isValidStrPattern(str); - }; +var toIndexedObject = __webpack_require__(5656); +var toAbsoluteIndex = __webpack_require__(1400); +var lengthOfArrayLike = __webpack_require__(6244); - /** - * Validates the match input number, - * used for match inputs with possible negation - * - * @param {string} match string of match number - * @returns {boolean} if match number is valid - */ - const isValidMatchNumber = function isValidMatchNumber(match) { - const INVERT_MARKER = '!'; - let str = match; - if (startsWith$1(match, INVERT_MARKER)) { - str = match.slice(1); - } - const num = parseFloat(str); - return !nativeIsNaN(num) && nativeIsFinite(num); - }; +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; - /** - * @typedef {Object} MatchData - * @property {boolean} isInvertedMatch if matching should be inverted - * @property {RegExp} matchRegexp match value parsed into regex - */ +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; - /** - * Parses match arg with possible negation for no matching. - * Needed for prevent-setTimeout, prevent-setInterval, - * prevent-requestAnimationFrame and prevent-window-open - * - * @param {string} match matching arg - * @returns {MatchData} data prepared for matching - */ - const parseMatchArg = function parseMatchArg(match) { - const INVERT_MARKER = '!'; - // In case if "match" is "undefined" return "false" - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); - return { - isInvertedMatch, - matchRegexp, - matchValue - }; - }; - /** - * @typedef {Object} DelayData - * @property {boolean} isInvertedDelayMatch if matching should be inverted - * @property {number|null} delayMatch parsed delay or null if delay is invalid - */ +/***/ }), - /** - * Parses delay arg with possible negation for no matching. - * Needed for prevent-setTimeout and prevent-setInterval - * - * @param {string} delay scriptlet's delay arg - * @returns {DelayData} parsed delay data - */ - const parseDelayArg = function parseDelayArg(delay) { - const INVERT_MARKER = '!'; - const isInvertedDelayMatch = startsWith$1(delay, INVERT_MARKER); - let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; - delayValue = parseInt(delayValue, 10); - const delayMatch = nativeIsNaN(delayValue) ? null : delayValue; - return { - isInvertedDelayMatch, - delayMatch - }; - }; +/***/ 3658: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Converts object to string for logging - * - * @param {Object} obj data object - * @returns {string} object's string representation - */ - const objectToString = function objectToString(obj) { - // In case if the type of passed obj is different than Object - // https://github.com/AdguardTeam/Scriptlets/issues/282 - if (!obj || typeof obj !== 'object') { - return String(obj); - } - return isEmptyObject(obj) ? '{}' : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); - } - return "".concat(key, ":\"").concat(recordValueStr, "\""); - }).join(' '); - }; +"use strict"; - /** - * Converts types into a string - * - * @param {any} value input value type - * @returns {string} type's string representation - */ - const convertTypeToString = function convertTypeToString(value) { - let output; - if (typeof value === 'undefined') { - output = 'undefined'; - } else if (typeof value === 'object') { - if (value === null) { - output = 'null'; - } else { - output = objectToString(value); - } - } else { - output = value.toString(); - } - return output; - }; +var DESCRIPTORS = __webpack_require__(9781); +var isArray = __webpack_require__(3157); - /** - * Generate a random string, a length of the string is provided as an argument - * - * @param {number} length output's length - * @returns {string} random string - */ - function getRandomStrByLength(length) { - let result = ''; - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~'; - const charactersLength = characters.length; - for (let i = 0; i < length; i += 1) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; - } +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - /** - * Generate a random string - * - * @param {string} customResponseText response text to include in output - * @returns {string|null} random string or null if passed argument is invalid - */ - function generateRandomResponse(customResponseText) { - let customResponse = customResponseText; - if (customResponse === 'true') { - // Generate random alphanumeric string of 10 symbols - customResponse = Math.random().toString(36).slice(-10); - return customResponse; - } - customResponse = customResponse.replace('length:', ''); - const rangeRegex = /^\d+-\d+$/; - // Return empty string if range is invalid - if (!rangeRegex.test(customResponse)) { - return null; - } - let rangeMin = getNumberFromString(customResponse.split('-')[0]); - let rangeMax = getNumberFromString(customResponse.split('-')[1]); - if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { - return null; - } +// Safari < 13 does not throw an error in this case +var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { + // makes no sense without proper strict mode support + if (this !== undefined) return true; + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).length = 1; + } catch (error) { + return error instanceof TypeError; + } +}(); - // If rangeMin > rangeMax, swap variables - if (rangeMin > rangeMax) { - const temp = rangeMin; - rangeMin = rangeMax; - rangeMax = temp; - } - const LENGTH_RANGE_LIMIT = 500 * 1000; - if (rangeMax > LENGTH_RANGE_LIMIT) { - return null; - } - const length = getRandomIntInclusive(rangeMin, rangeMax); - customResponse = getRandomStrByLength(length); - return customResponse; - } +module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { + if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { + throw $TypeError('Cannot set read only .length'); + } return O.length = length; +} : function (O, length) { + return O.length = length; +}; - /** - * Infers value from string argument - * Inferring goes from more specific to more ambiguous options - * Arrays, objects and strings are parsed via JSON.parse - * - * @param {string} value arbitrary string - * @returns {any} converted value - * @throws an error on unexpected input - */ - function inferValue(value) { - if (value === 'undefined') { - return undefined; - } - if (value === 'false') { - return false; - } - if (value === 'true') { - return true; - } - if (value === 'null') { - return null; - } - if (value === 'NaN') { - return NaN; - } - // Number class constructor works 2 times faster than JSON.parse - // and wont interpret mixed inputs like '123asd' as parseFloat would - const MAX_ALLOWED_NUM = 32767; - const numVal = Number(value); - if (!nativeIsNaN(numVal)) { - if (Math.abs(numVal) > MAX_ALLOWED_NUM) { - throw new Error('number values bigger than 32767 are not allowed'); - } - return numVal; - } - let errorMessage = "'".concat(value, "' value type can't be inferred"); - try { - // Parse strings, arrays and objects represented as JSON strings - // '[1,2,3,"string"]' > [1, 2, 3, 'string'] - // '"arbitrary string"' > 'arbitrary string' - const parsableVal = JSON.parse(value); - if (parsableVal instanceof Object || typeof parsableVal === 'string') { - return parsableVal; - } - } catch (e) { - errorMessage += ": ".concat(e); - } - throw new TypeError(errorMessage); - } +/***/ }), - /** - * Iterate over iterable argument and evaluate current state with transitions - * - * @param {Array|string} iterable rule or list or rules - * @param {Object} transitions transtion functions - * @param {string} init first transition name - * @param {any} args arguments which should be passed to transition functions - * @returns {string} state - */ - function iterateWithTransitions(iterable, transitions, init, args) { - let state = init || Object.keys(transitions)[0]; - for (let i = 0; i < iterable.length; i += 1) { - state = transitions[state](iterable, i, args); - } - return state; - } +/***/ 4326: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * AdGuard scriptlet rule mask - */ - const ADG_SCRIPTLET_MASK = '#//scriptlet'; +var uncurryThis = __webpack_require__(1702); - /** - * Helper to accumulate an array of strings char by char - * - * @returns {Object} object with helper methods - */ - const wordSaver = function wordSaver() { - let str = ''; - const strings = []; - const saveSymb = function saveSymb(s) { - str += s; - return str; - }; - const saveStr = function saveStr() { - strings.push(str); - str = ''; - }; - const getAll = function getAll() { - return [...strings]; - }; - return { - saveSymb, - saveStr, - getAll - }; - }; - const substringAfter = function substringAfter(str, separator) { - if (!str) { - return str; - } - const index = str.indexOf(separator); - return index < 0 ? '' : str.substring(index + separator.length); - }; +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); - /** - * Parses scriptlet rule and validates its syntax. - * - * @param {string} ruleText Rule string - * - * @returns {{name: string, args: Array}} Parsed rule data. - * @throws An error on invalid rule syntax. - */ - const parseRule = function parseRule(ruleText) { - ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK); - /** - * Transition names - */ - const TRANSITION = { - OPENED: 'opened', - PARAM: 'param', - CLOSED: 'closed' - }; +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; - /** - * Transition function: the current index position in start, end or between params - * - * @param {string} rule rule string - * @param {number} index index - * @param {Object} Object helper object - * @param {Object} Object.sep contains prop symb with current separator char - * @throws {string} throws if given rule is not a scriptlet - * @returns {string} transition - */ - const opened = function opened(rule, index, _ref) { - let sep = _ref.sep; - const char = rule[index]; - let transition; - switch (char) { - case ' ': - case '(': - case ',': - { - transition = TRANSITION.OPENED; - break; - } - case '\'': - case '"': - { - sep.symb = char; - transition = TRANSITION.PARAM; - break; - } - case ')': - { - transition = index === rule.length - 1 ? TRANSITION.CLOSED : TRANSITION.OPENED; - break; - } - default: - { - throw new Error('The rule is not a scriptlet'); - } - } - return transition; - }; - /** - * Transition function: the current index position inside param - * - * @param {string} rule rule string - * @param {number} index index - * @param {Object} Object helper object - * @param {Object} Object.sep contains prop `symb` with current separator char - * @param {Object} Object.saver helper which allow to save strings by car by char - * @returns {void} - */ - const param = function param(rule, index, _ref2) { - let saver = _ref2.saver, - sep = _ref2.sep; - const char = rule[index]; - switch (char) { - case '\'': - case '"': - { - const preIndex = index - 1; - const before = rule[preIndex]; - if (char === sep.symb && before !== '\\') { - sep.symb = null; - saver.saveStr(); - return TRANSITION.OPENED; - } - } - // eslint-disable-next-line no-fallthrough - default: - { - saver.saveSymb(char); - return TRANSITION.PARAM; - } - } - }; - const transitions = { - [TRANSITION.OPENED]: opened, - [TRANSITION.PARAM]: param, - [TRANSITION.CLOSED]: function () {} - }; - const sep = { - symb: null - }; - const saver = wordSaver(); - const state = iterateWithTransitions(ruleText, transitions, TRANSITION.OPENED, { - sep, - saver - }); - if (state !== 'closed') { - throw new Error("Invalid scriptlet rule ".concat(ruleText)); - } - const args = saver.getAll(); - return { - name: args[0], - args: args.slice(1) - }; - }; - /** - * Validates event type - * - * @param {any} type event type - * @returns {boolean} if type is valid - */ - const validateType = function validateType(type) { - // https://github.com/AdguardTeam/Scriptlets/issues/125 - return typeof type !== 'undefined'; - }; +/***/ }), - /** - * Validates event listener - * - * @param {any} listener event listener - * @returns {boolean} if listener callback is valid - */ - const validateListener = function validateListener(listener) { - // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters - return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object' - // https://github.com/AdguardTeam/Scriptlets/issues/76 - && listener !== null && typeof listener.handleEvent === 'function'); - }; +/***/ 648: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @typedef {object|Function|null} EventListener - */ +var TO_STRING_TAG_SUPPORT = __webpack_require__(1694); +var isCallable = __webpack_require__(614); +var classofRaw = __webpack_require__(4326); +var wellKnownSymbol = __webpack_require__(5112); - /** - * Serialize valid event listener - * https://developer.mozilla.org/en-US/docs/Web/API/EventListener - * - * @param {EventListener} listener valid listener - * @returns {string} listener string - */ - const listenerToString = function listenerToString(listener) { - return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString(); - }; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; - const shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) { - return delay === '*'; - }; +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; - /** - * Handles input delay value - * - * @param {any} delay matchDelay argument of adjust-* scriptlets - * @returns {number} proper number delay value - */ - const getMatchDelay = function getMatchDelay(delay) { - const DEFAULT_DELAY = 1000; - const parsedDelay = parseInt(delay, 10); - const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY // default scriptlet value - : parsedDelay; - return delayMatch; - }; +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; - /** - * Checks delay match condition - * - * @param {any} inputDelay matchDelay argument of adjust-* scriptlets - * @param {number} realDelay delay argument of setTimeout/setInterval - * @returns {boolean} if given delays match - */ - const isDelayMatched = function isDelayMatched(inputDelay, realDelay) { - return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); - }; +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; - /** - * Handles input boost value - * - * @param {any} boost boost argument of adjust-* scriptlets - * @returns {number} proper number boost multiplier value - */ - const getBoostMultiplier = function getBoostMultiplier(boost) { - const DEFAULT_MULTIPLIER = 0.05; - // https://github.com/AdguardTeam/Scriptlets/issues/262 - const MIN_MULTIPLIER = 0.001; - const MAX_MULTIPLIER = 50; - const parsedBoost = parseFloat(boost); - let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value - : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { - boostMultiplier = MIN_MULTIPLIER; - } - if (boostMultiplier > MAX_MULTIPLIER) { - boostMultiplier = MAX_MULTIPLIER; - } - return boostMultiplier; - }; - /** - * Some browsers do not support Array.prototype.flat() - * for example, Opera 42 which is used for browserstack tests - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat - * - * @param {Array} input arbitrary array - * @returns {Array} flattened array - */ - const flatten = function flatten(input) { - const stack = []; - input.forEach(function (el) { - return stack.push(el); - }); - const res = []; - while (stack.length) { - // pop value from stack - const next = stack.pop(); - if (Array.isArray(next)) { - // push back array items, won't modify the original input - next.forEach(function (el) { - return stack.push(el); - }); - } else { - res.push(next); - } - } - // reverse to restore input order - return res.reverse(); - }; +/***/ }), - /** - * Predicate method to check if the array item exists - * - * @param {any} item arbitrary - * @returns {boolean} if item is truthy or not - */ - const isExisting = function isExisting(item) { - return !!item; - }; +/***/ 9920: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Checks whether the input path is supported - * - * @param {string} rawPath input path - * @returns {boolean} if cookie path is valid - */ - const isValidCookiePath = function isValidCookiePath(rawPath) { - return rawPath === '/' || rawPath === 'none'; - }; +var hasOwn = __webpack_require__(2597); +var ownKeys = __webpack_require__(3887); +var getOwnPropertyDescriptorModule = __webpack_require__(1236); +var definePropertyModule = __webpack_require__(3070); - /** - * Returns 'path=/' if rawPath is '/' - * or empty string '' for other cases, `rawPath === 'none'` included - * - * @param {string} rawPath path argument of *set-cookie-* scriptlets - * @returns {string} cookie path - */ - const getCookiePath = function getCookiePath(rawPath) { - if (rawPath === '/') { - return 'path=/'; - } - // otherwise do not set path as invalid - // the same for pathArg === 'none' - return ''; - }; +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; - /** - * Combines input cookie name, value, and path into string. - * - * @param {string} rawName name argument of *set-cookie-* scriptlets - * @param {string} rawValue value argument of *set-cookie-* scriptlets - * @param {string} rawPath path argument of *set-cookie-* scriptlets - * @returns {string|null} string OR `null` if path is not supported - */ - const concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { - // eslint-disable-next-line max-len - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); - }; - /** - * Gets supported cookie value - * - * @param {string} value input cookie value - * @returns {string|null} valid cookie string if ok OR null if not - */ - const getLimitedCookieValue = function getLimitedCookieValue(value) { - if (!value) { - return null; - } - let validValue; - if (value === 'true') { - validValue = 'true'; - } else if (value === 'True') { - validValue = 'True'; - } else if (value === 'false') { - validValue = 'false'; - } else if (value === 'False') { - validValue = 'False'; - } else if (value === 'yes') { - validValue = 'yes'; - } else if (value === 'Yes') { - validValue = 'Yes'; - } else if (value === 'Y') { - validValue = 'Y'; - } else if (value === 'no') { - validValue = 'no'; - } else if (value === 'ok') { - validValue = 'ok'; - } else if (value === 'OK') { - validValue = 'OK'; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - return null; - } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - return null; - } - } else { - return null; - } - return validValue; - }; +/***/ }), - /** - * Parses cookie string into object - * - * @param {string} cookieString string that conforms to document.cookie format - * @returns {Object} key:value object that corresponds with incoming cookies keys and values - */ - const parseCookieString = function parseCookieString(cookieString) { - const COOKIE_DELIMITER = '='; - const COOKIE_PAIRS_DELIMITER = ';'; +/***/ 8880: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // Get raw cookies - const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); - const cookieData = {}; - cookieChunks.forEach(function (singleCookie) { - let cookieKey; - let cookieValue; - const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); - if (delimiterIndex === -1) { - cookieKey = singleCookie.trim(); - } else { - cookieKey = singleCookie.slice(0, delimiterIndex).trim(); - cookieValue = singleCookie.slice(delimiterIndex + 1); - } - // Save cookie key=value data with null instead of empty ('') values - cookieData[cookieKey] = cookieValue || null; - }); - return cookieData; - }; +var DESCRIPTORS = __webpack_require__(9781); +var definePropertyModule = __webpack_require__(3070); +var createPropertyDescriptor = __webpack_require__(9114); - /** - * Check if cookie with specified name and value is present in a cookie string - * - * @param {string} cookieString 'document.cookie'-like string - * @param {string} name name argument of *set-cookie-* scriptlets - * @param {string} value value argument of *set-cookie-* scriptlets - * @returns {boolean} if cookie is already set - */ - const isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) { - return cookieString.split(';').some(function (cookieStr) { - const pos = cookieStr.indexOf('='); - if (pos === -1) { - return false; - } - const cookieName = cookieStr.slice(0, pos).trim(); - const cookieValue = cookieStr.slice(pos + 1).trim(); - return name === cookieName && value === cookieValue; - }); - }; +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; - /** - * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid - * - * @param {string} offsetExpiresSec input offset param in seconds - * @returns {number|null} number is milliseconds OR null - */ - const getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { - const ONE_YEAR_EXPIRATION_KEYWORD = '1year'; - const ONE_DAY_EXPIRATION_KEYWORD = '1day'; - const MS_IN_SEC = 1000; - const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - const SECONDS_IN_DAY = 24 * 60 * 60; - let parsedSec; - // Set predefined expire value if corresponding keyword was passed - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_DAY; - } else { - parsedSec = Number.parseInt(offsetExpiresSec, 10); - // If offsetExpiresSec has been parsed to NaN - do not set cookie at all - if (Number.isNaN(parsedSec)) { - return null; - } - } - return parsedSec * MS_IN_SEC; - }; - /** - * Noop function - * - * @returns {undefined} undefined - */ - const noopFunc = function noopFunc() {}; +/***/ }), - /** - * Function returns noopFunc - * - * @returns {Function} noopFunc - */ - const noopCallbackFunc = function noopCallbackFunc() { - return noopFunc; - }; +/***/ 9114: +/***/ ((module) => { - /** - * Function returns null - * - * @returns {null} null - */ - const noopNull = function noopNull() { - return null; - }; +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; - /** - * Function returns true - * - * @returns {boolean} true - */ - const trueFunc = function trueFunc() { - return true; - }; - /** - * Function returns false - * - * @returns {boolean} false - */ - const falseFunc = function falseFunc() { - return false; - }; +/***/ }), - /** - * Function returns this - * - * @returns {this} this object - */ - function noopThis() { - return this; - } +/***/ 8052: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Function returns empty string - * - * @returns {string} empty string - */ - const noopStr = function noopStr() { - return ''; - }; +var isCallable = __webpack_require__(614); +var definePropertyModule = __webpack_require__(3070); +var makeBuiltIn = __webpack_require__(6339); +var defineGlobalProperty = __webpack_require__(3072); - /** - * Function returns empty array - * - * @returns {Array} empty array - */ - const noopArray = function noopArray() { - return []; - }; +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; - /** - * Function returns empty object - * - * @returns {Object} empty object - */ - const noopObject = function noopObject() { - return {}; - }; - /** - * Function throws an error - * - * @throws - */ - const throwFunc = function throwFunc() { - throw new Error(); - }; +/***/ }), - /** - * Function returns Promise.reject() - * - * @returns {Promise} rejected Promise - */ - const noopPromiseReject = function noopPromiseReject() { - return Promise.reject(); - }; +/***/ 3072: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Returns Promise object that is resolved with specified props - * - * @param {string} [responseBody='{}'] value to set as responseBody - * @param {string} [responseUrl=''] value to set as responseUrl - * @param {string} [responseType='default'] value to set as responseType - * @returns {Promise|undefined} resolved Promise or undefined if Response interface is not available - */ - const noopPromiseResolve = function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}'; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default'; - if (typeof Response === 'undefined') { - return; - } - const response = new Response(responseBody, { - status: 200, - statusText: 'OK' - }); +var global = __webpack_require__(7854); - // Mock response' url & type to avoid adb checks - // https://github.com/AdguardTeam/Scriptlets/issues/216 - Object.defineProperties(response, { - url: { - value: responseUrl - }, - type: { - value: responseType - } - }); +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; - // eslint-disable-next-line consistent-return - return Promise.resolve(response); - }; +module.exports = function (key, value) { + try { + defineProperty(global, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global[key] = value; + } return value; +}; - /** - * Determines if type of script is inline or injected - * and when it's one of them then return true, otherwise false - * https://github.com/AdguardTeam/Scriptlets/issues/201 - * - * @param {string|undefined} stackMatch - input stack value to match - * @param {string} stackTrace - script error stack trace - * @returns {boolean} if stacks match - */ - const shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = 'inlineScript'; - const INJECTED_SCRIPT_STRING = 'injectedScript'; - const INJECTED_SCRIPT_MARKER = ''; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; - }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; - }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { - return false; - } - let documentURL = window.location.href; - const pos = documentURL.indexOf('#'); - // Remove URL hash - // in Chrome, URL in stackTrace doesn't contain hash - // so, it's necessary to remove it, otherwise location.href - // will not match with location from stackTrace - if (pos !== -1) { - documentURL = documentURL.slice(0, pos); - } - const stackSteps = stackTrace.split('\n').slice(2).map(function (line) { - return line.trim(); - }); - const stackLines = stackSteps.map(function (line) { - let stack; - // Get stack trace URL - // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20 - // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16) - // so, first group "(.*?@)" is required for Firefox, second group contains URL - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith$1(stackURL, '(')) { - stackURL = stackURL.slice(1); - } - if (startsWith$1(stackURL, INJECTED_SCRIPT_MARKER)) { - stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith$1(stackFunction, 'at')) { - stackFunction = stackFunction.slice(2).trim(); - } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); - } else { - stack = stackURL; - } - } else { - stack = line; - } - return stack; - }); - if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { - if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { - return true; - } - if (isInjectedScript(stackMatch) && startsWith$1(stackLines[index], INJECTED_SCRIPT_STRING)) { - return true; - } - } - } - return false; - }; - /** - * Finds shadow-dom host (elements with shadowRoot property) in DOM of rootElement. - * - * @param {HTMLElement} rootElement shadow dom root - * @returns {HTMLElement[]} shadow-dom hosts - */ - const findHostElements = function findHostElements(rootElement) { - const hosts = []; - // Element.querySelectorAll() returns list of elements - // which are defined in DOM of Element. - // Meanwhile, inner DOM of the element with shadowRoot property - // is absolutely another DOM and which can not be reached by querySelectorAll('*') - const domElems = rootElement.querySelectorAll('*'); - domElems.forEach(function (el) { - if (el.shadowRoot) { - hosts.push(el); - } - }); - return hosts; - }; +/***/ }), - /** - * A collection of nodes. - * - * @external NodeList - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/NodeList NodeList} - */ +/***/ 9781: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @typedef {Object} PierceData - * @property {HTMLElement[]} targets found elements that match the specified selector - * @property {HTMLElement[]} innerHosts inner shadow-dom hosts - */ - - /** - * Pierces open shadow-dom in order to find: - * - elements by 'selector' matching - * - inner shadow-dom hosts - * - * @param {string} selector DOM elements selector - * @param {HTMLElement[]|external:NodeList} hostElements shadow-dom hosts - * @returns {PierceData} object with found elements and shadow-dom hosts - */ - const pierceShadowDom = function pierceShadowDom(selector, hostElements) { - let targets = []; - const innerHostsAcc = []; +var fails = __webpack_require__(7293); - // it's possible to get a few hostElements found by baseSelector on the page - hostElements.forEach(function (host) { - // check presence of selector element inside base element if it's not in shadow-dom - const simpleElems = host.querySelectorAll(selector); - targets = targets.concat([].slice.call(simpleElems)); - const shadowRootElem = host.shadowRoot; - const shadowChildren = shadowRootElem.querySelectorAll(selector); - targets = targets.concat([].slice.call(shadowChildren)); +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; +}); - // find inner shadow-dom hosts inside processing shadow-dom - innerHostsAcc.push(findHostElements(shadowRootElem)); - }); - // if there were more than one host element, - // innerHostsAcc is an array of arrays and should be flatten - const innerHosts = flatten(innerHostsAcc); - return { - targets, - innerHosts - }; - }; +/***/ }), - /** - * Checks whether the passed arg is proper callback - * - * @param {any} callback arbitrary callback - * @returns {boolean} if callback is valid - */ - const isValidCallback = function isValidCallback(callback) { - return callback instanceof Function - // passing string as 'code' arg is not recommended - // but it is possible and not restricted - // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters - || typeof callback === 'string'; - }; +/***/ 4154: +/***/ ((module) => { - /** - * Parses delay argument of setTimeout / setInterval methods into - * rounded down number for number/string values or passes on for other types. - * Needed for prevent-setTimeout and prevent-setInterval - * - * @param {any} delay native method delay arg - * @returns {any} number as parsed delay or any input type if `delay` is not parsable - */ - const parseRawDelay = function parseRawDelay(delay) { - const parsedDelay = Math.floor(parseInt(delay, 10)); - return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; - }; +var documentAll = typeof document == 'object' && document.all; - /** - * Checks whether 'callback' and 'delay' are matching - * by given parameters 'matchCallback' and 'matchDelay'. - * Used for prevent-setTimeout and prevent-setInterval. - * - * @param {Object} preventData set of data to determine if scriptlet should match - * @param {Function} preventData.callback method's callback arg - * @param {any} preventData.delay method's delay arg - * @param {string} preventData.matchCallback scriptlets's callback arg - * @param {string} preventData.matchDelay scriptlets's delay arg - * @returns {boolean} if scriptlet should match - */ - const isPreventionNeeded = function isPreventionNeeded(_ref) { - let callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - // if callback is has not valid type - // scriptlet can not prevent it - // so no need for more checking and do not call hit() later - if (!isValidCallback(callback)) { - return false; - } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { - return false; - } - const _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - const _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +var IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined; - // Parse delay for decimal, string and non-number values - // https://github.com/AdguardTeam/Scriptlets/issues/247 - const parsedDelay = parseRawDelay(delay); - let shouldPrevent = false; - // https://github.com/AdguardTeam/Scriptlets/issues/105 - const callbackStr = String(callback); - if (delayMatch === null) { - shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; - } else if (!matchCallback) { - shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch; - } else { - shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch; - } - return shouldPrevent; - }; +module.exports = { + all: documentAll, + IS_HTMLDDA: IS_HTMLDDA +}; - const handleOldReplacement = function handleOldReplacement(replacement) { - let result; - // defaults to return noopFunc instead of window.open - if (!replacement) { - result = noopFunc; - } else if (replacement === 'trueFunc') { - result = trueFunc; - } else if (replacement.indexOf('=') > -1) { - // We should return noopFunc instead of window.open - // but with some property if website checks it (examples 5, 6) - // https://github.com/AdguardTeam/Scriptlets/issues/71 - const isProp = startsWith$1(replacement, '{') && endsWith(replacement, '}'); - if (isProp) { - const propertyPart = replacement.slice(1, -1); - const propertyName = substringBefore(propertyPart, '='); - const propertyValue = substringAfter$1(propertyPart, '='); - if (propertyValue === 'noopFunc') { - result = {}; - result[propertyName] = noopFunc; - } - } - } - return result; - }; - const createDecoy = function createDecoy(args) { - const OBJECT_TAG_NAME = 'object'; - const OBJECT_URL_PROP_NAME = 'data'; - const IFRAME_TAG_NAME = 'iframe'; - const IFRAME_URL_PROP_NAME = 'src'; - const replacement = args.replacement, - url = args.url, - delay = args.delay; - let tag; - let urlProp; - if (replacement === 'obj') { - tag = OBJECT_TAG_NAME; - urlProp = OBJECT_URL_PROP_NAME; - } else { - tag = IFRAME_TAG_NAME; - urlProp = IFRAME_URL_PROP_NAME; - } - const decoy = document.createElement(tag); - decoy[urlProp] = url; - decoy.style.setProperty('height', '1px', 'important'); - decoy.style.setProperty('position', 'fixed', 'important'); - decoy.style.setProperty('top', '-1px', 'important'); - decoy.style.setProperty('width', '1px', 'important'); - document.body.appendChild(decoy); - setTimeout(function () { - return decoy.remove(); - }, delay * 1000); - return decoy; - }; - const getPreventGetter = function getPreventGetter(nativeGetter) { - const preventGetter = function preventGetter(target, prop) { - if (prop && prop === 'closed') { - return false; - } - if (typeof nativeGetter === 'function') { - return noopFunc; - } - return prop && target[prop]; - }; - return preventGetter; - }; - const getNativeRegexpTest = function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, 'test').value; - }; +/***/ }), - /** - * Returns array of request props that are supported by fetch/xhr scriptlets. - * Includes common 'url' and 'method' props and all other fetch-specific props - * - * @returns {string[]} list of request props - */ - const getRequestProps = function getRequestProps() { - return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal']; - }; +/***/ 317: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Collects Request options to object - * - * @param {Request} request Request instance to collect properties from - * @returns {Object} data object - */ - const getRequestData = function getRequestData(request) { - const requestInitOptions = getRequestProps(); - const entries = requestInitOptions.map(function (key) { - // if request has no such option, value will be undefined - const value = request[key]; - return [key, value]; - }); - return getObjectFromEntries(entries); - }; +var global = __webpack_require__(7854); +var isObject = __webpack_require__(111); - /** - * Collects fetch args to object - * - * @param {any} args fetch args - * @returns {Object} data object - */ - const getFetchData = function getFetchData(args) { - const fetchPropsObj = {}; - let fetchUrl; - let fetchInit; - if (args[0] instanceof Request) { - // if Request passed to fetch, it will be in array - const requestData = getRequestData(args[0]); - fetchUrl = requestData.url; - fetchInit = requestData; - } else { - fetchUrl = args[0]; // eslint-disable-line prefer-destructuring - fetchInit = args[1]; // eslint-disable-line prefer-destructuring - } +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { - Object.keys(fetchInit).forEach(function (prop) { - fetchPropsObj[prop] = fetchInit[prop]; - }); - } - return fetchPropsObj; - }; +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; - /** - * Collect xhr.open arguments to object - * - * @param {string} method request method - * @param {string} url request url - * @param {string} async request async prop - * @param {string} user request user prop - * @param {string} password request password prop - * @returns {Object} aggregated request data - */ - const getXhrData = function getXhrData(method, url, async, user, password) { - return { - method, - url, - async, - user, - password - }; - }; - /** - * Parse propsToMatch input string into object; - * used for prevent-fetch and prevent-xhr - * - * @param {string} propsToMatchStr string of space-separated request properties to match - * @returns {Object} object where 'key' is prop name and 'value' is prop value - */ - const parseMatchProps = function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = ' '; - const PAIRS_MARKER = ':'; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); - props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); - propsObj[key] = value; - } else { - // Escape multiple colons in prop - // i.e regex value and/or url with protocol specified, with or without 'url:' match prop - // https://github.com/AdguardTeam/Scriptlets/issues/216#issuecomment-1178591463 - propsObj.url = prop; - } - }); - return propsObj; - }; +/***/ }), - /** - * Validates parsed data values - * - * @param {Object} data request data - * @returns {boolean} if data is valid - */ - const validateParsedData = function validateParsedData(data) { - return Object.values(data).every(function (value) { - return isValidStrPattern(value); - }); - }; +/***/ 7207: +/***/ ((module) => { - /** - * Converts valid parsed data to data obj for further matching - * - * @param {Object} data parsed request data - * @returns {Object} data obj ready for matching - */ - const getMatchPropsData = function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { - matchData[key] = toRegExp(data[key]); - }); - return matchData; - }; +var $TypeError = TypeError; +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 - /** - * Conditionally logs message to console. - * Convention is to log messages by source.verbose if such log - * is not a part of scriptlet's functionality, eg on invalid input, - * and use 'forced' argument otherwise. - * - * @param {Object} source required, scriptlet properties - * @param {any} message required, message to log - * @param {boolean} [forced=false] to log message unconditionally - * @param {boolean} [convertMessageToString=true] to convert message to string - */ - const logMessage = function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } +module.exports = function (it) { + if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded'); + return it; +}; - // eslint-disable-next-line no-console - const nativeConsole = console.log; - if (!convertMessageToString) { - // Template literals convert object to string, - // so 'message' should not be passed to template literals - // as it will not be logged correctly - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - // Extract scriptlet part from rule text - if (ruleText) { - const RULE_MARKER = '#%#//scriptlet'; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - }; +/***/ }), - /** - * Sets item to a specified storage, if storage isn't full. - * - * @param {Object} source scriptlet's configuration - * @param {Storage} storage storage instance to set item into - * @param {string} key storage key - * @param {string} value staroge value - */ - const setStorageItem = function setStorageItem(source, storage, key, value) { - // setItem() may throw an exception if the storage is full. - try { - storage.setItem(key, value); - } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); - logMessage(source, message); - } - }; +/***/ 8113: +/***/ ((module) => { - /** - * Gets supported storage item value - * - * @param {string} value input item value - * @returns {string|null|undefined|boolean} valid item value if ok OR null if not - */ - const getLimitedStorageItemValue = function getLimitedStorageItemValue(value) { - if (typeof value !== 'string') { - throw new Error('Invalid value'); - } - let validValue; - if (value === 'undefined') { - validValue = undefined; - } else if (value === 'false') { - validValue = false; - } else if (value === 'true') { - validValue = true; - } else if (value === 'null') { - validValue = null; - } else if (value === 'emptyArr') { - validValue = '[]'; - } else if (value === 'emptyObj') { - validValue = '{}'; - } else if (value === '') { - validValue = ''; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - throw new Error('Invalid value'); - } - if (Math.abs(validValue) > 32767) { - throw new Error('Invalid value'); - } - } else if (value === 'yes') { - validValue = 'yes'; - } else if (value === 'no') { - validValue = 'no'; - } else { - throw new Error('Invalid value'); - } - return validValue; - }; +module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || ''; - /** - * Generates function which silents global errors on page generated by scriptlet - * If error doesn't belong to our error we transfer it to the native onError handler - * - * @param {string} rid - unique identifier of scriptlet - * @returns {Function} window.onerror handler - */ - function createOnErrorHandler(rid) { - // eslint-disable-next-line consistent-return - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === 'string' && error.indexOf(rid) !== -1) { - return true; - } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); - } - return false; - }; - } - /** - * Generate random seven symbols id - * - * @returns {string} randomized id - */ - function randomId() { - return Math.random().toString(36).slice(2, 9); - } +/***/ }), - /** - * Prevents infinite loops when trapping props that could be used by scriptlet's own helpers - * Example: window.RegExp, that is used by matchStackTrace > toRegExp - * - * https://github.com/AdguardTeam/Scriptlets/issues/251 - * https://github.com/AdguardTeam/Scriptlets/issues/226 - * https://github.com/AdguardTeam/Scriptlets/issues/232 - * - * @returns {Object} descriptor addon - */ - function getDescriptorAddon() { - return { - isAbortingSuspended: false, - isolateCallback(cb) { - this.isAbortingSuspended = true; - // try...catch is required in case there are more than one inline scripts - // which should be aborted, - // so after the first successful abortion, `cb(...args);` will throw error, - // and we should not stop on that and continue to abort other scripts - try { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - const result = cb(...args); - this.isAbortingSuspended = false; - return result; - } catch (_unused) { - const rid = randomId(); - this.isAbortingSuspended = false; - // It's necessary to throw error - // otherwise script will be not aborted - throw new ReferenceError(rid); - } - } - }; - } +/***/ 7392: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @typedef ChainInfo - * @property {Object} base current chain base - * @property {string} prop current chain prop - * @property {string} [chain] string representation - */ +var global = __webpack_require__(7854); +var userAgent = __webpack_require__(8113); - /** - * Check if the property exists in the base object (recursively) - * - * If property doesn't exist in base object, - * defines this property as 'undefined' - * and returns base, property name and remaining part of property chain - * - * @param {Object} base object that owns chain - * @param {string} chain chain of owner properties - * @returns {ChainInfo} chain info object - */ - function getPropertyInChain(base, chain) { - const pos = chain.indexOf('.'); - if (pos === -1) { - return { - base, - prop: chain - }; - } - const prop = chain.slice(0, pos); +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; - // https://github.com/AdguardTeam/Scriptlets/issues/128 - if (base === null) { - // if base is null, return 'null' as base. - // it's needed for triggering the reason logging while debugging - return { - base, - prop, - chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { - // for empty objects in chain - return { - base, - prop, - chain - }; - } - if (nextBase === null) { - return { - base, - prop, - chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base, - prop, - chain - }; - } +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} - /** - * @typedef ChainInfo - * @property {Object} base current chain base - * @property {string} prop current chain prop - * @property {string} [chain] string representation - */ +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} - /** - * Check if the property exists in the base object (recursively). - * Similar to getPropertyInChain but upgraded for json-prune: - * handle wildcard properties and does not define nonexistent base property as 'undefined' - * - * @param {Object} base object that owns chain - * @param {string} chain chain of owner properties - * @param {boolean} [lookThrough=false] - * should the method look through it's props in order to wildcard - * @param {Array} [output=[]] result acc - * @returns {ChainInfo[]} array of objects - */ - function getWildcardPropertyInChain(base, chain) { - let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - const pos = chain.indexOf('.'); - if (pos === -1) { - // for paths like 'a.b.*' every final nested prop should be processed - if (chain === '*' || chain === '[]') { - // eslint-disable-next-line no-restricted-syntax - for (const key in base) { - // to process each key in base except inherited ones - if (Object.prototype.hasOwnProperty.call(base, key)) { - output.push({ - base, - prop: key - }); - } - } - } else { - output.push({ - base, - prop: chain - }); - } - return output; - } - const prop = chain.slice(0, pos); - const shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object; - if (shouldLookThrough) { - const nextProp = chain.slice(pos + 1); - const baseKeys = Object.keys(base); +module.exports = version; - // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'), - // each one of base keys should be considered as a potential chain prop in final path - baseKeys.forEach(function (key) { - const item = base[key]; - getWildcardPropertyInChain(item, nextProp, lookThrough, output); - }); - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if (nextBase !== undefined) { - getWildcardPropertyInChain(nextBase, chain, lookThrough, output); - } - return output; - } - /* eslint-disable no-console, no-underscore-dangle */ +/***/ }), - /** - * Hit used only for debug purposes now - * - * @param {Object} source scriptlet properties - * use LOG_MARKER = 'log: ' at the start of a message - * for logging scriptlets - */ - const hit = function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ''; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = '#%#//'; - const UBO_SCRIPTLET_MARKER = '##+js'; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - // delete all domains from ruleText and leave just rule part - const rulePart = source.ruleText.slice(ruleStartIndex); - // prepare applied scriptlet rule for specific domain - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) { - // try catch for Edge 15 - // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/ - // console.log throws an error - } +/***/ 748: +/***/ ((module) => { - // This is necessary for unit-tests only! - if (typeof window.__debug === 'function') { - window.__debug(source); - } - }; +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; - /** - * Checks if given propsToMatch string matches with given request data - * This is used by prevent-xhr, prevent-fetch, trusted-replace-xhr-response - * and trusted-replace-fetch-response scriptlets - * - * @param {Object} source scriptlet properties - * @param {string} propsToMatch string of space-separated request properties to match - * @param {Object} requestData object with standard properties of fetch/xhr like url, method etc - * @returns {boolean} if request properties match - */ - const matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === '' || propsToMatch === '*') { - return true; - } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; - } else { - const matchData = getMatchPropsData(parsedData); - // prevent only if all props match - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); - } - return isMatched; - }; - /** - * Checks if the stackTrace contains stackRegexp - * https://github.com/AdguardTeam/Scriptlets/issues/82 - * - * @param {string|undefined} stackMatch - input stack value to match - * @param {string} stackTrace - script error stack trace - * @returns {boolean} if the stackTrace contains stackRegexp - */ - const matchStackTrace = function matchStackTrace(stackMatch, stackTrace) { - if (!stackMatch || stackMatch === '') { - return true; - } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { - return true; - } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split('\n').slice(2) // get rid of our own functions in the stack trace - .map(function (line) { - return line.trim(); - }) // trim the lines - .join('\n'); - return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); - }; +/***/ }), - /** - * Returns a wrapper, passing the call to 'method' at maximum once per 'delay' milliseconds. - * Those calls that fall into the "cooldown" period, are ignored - * - * @param {Function} cb callback - * @param {number} delay - milliseconds - * @returns {Function} throttled callback - */ - const throttle = function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - // "savedArgs" might contains few arguments, so it's necessary to use spread operator - // https://github.com/AdguardTeam/Scriptlets/issues/284#issuecomment-1419464354 - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; - }; +/***/ 1060: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * DOM tree changes observer. Used for 'remove-attr' and 'remove-class' scriptlets - * - * @param {Function} callback function to call on each mutation - * @param {boolean} [observeAttrs] if observer should observe attributes changes - * @param {Array} [attrsToObserve] list of attributes to observe - */ - const observeDOMChanges = function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - /** - * 'delay' in milliseconds for 'throttle' method - */ - const THROTTLE_DELAY_MS = 20; - /** - * Used for remove-class - */ - // eslint-disable-next-line no-use-before-define - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); - } - }; - const disconnect = function disconnect() { - observer.disconnect(); - }; +var uncurryThis = __webpack_require__(1702); - /** - * Callback wrapper to prevent loops - * when callback tinkers with attributes - */ - function callbackWrapper() { - disconnect(); - callback(); - connect(); - } - connect(); - }; +var $Error = Error; +var replace = uncurryThis(''.replace); - /** - * @typedef {Object} FlagsData object that holds info about valid flags - * and provides method for easy access - * @property {string} ASAP asap flag string - * @property {string} COMPLETE complete flag string - * @property {string} STAY stay flag string - * @property {Function} hasFlag to check if given flag is present - */ +var TEST = (function (arg) { return String($Error(arg).stack); })('zxcasd'); +// eslint-disable-next-line redos/no-vulnerable -- safe +var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; +var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); - /** - * Behaviour flags string parser - * - * @param {string} flags required, 'applying' argument string - * @returns {FlagsData} object with parsed flags - */ - const parseFlags = function parseFlags(flags) { - const FLAGS_DIVIDER = ' '; - const ASAP_FLAG = 'asap'; - const COMPLETE_FLAG = 'complete'; - const STAY_FLAG = 'stay'; - const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; - const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { - return VALID_FLAGS.indexOf(f) !== -1; - }); - return { - ASAP: ASAP_FLAG, - COMPLETE: COMPLETE_FLAG, - STAY: STAY_FLAG, - hasFlag(flag) { - return passedFlags.indexOf(flag) !== -1; - } - }; - }; +module.exports = function (stack, dropEntries) { + if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) { + while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + } return stack; +}; - /** - * Modifies passed keyword value according to its purpose. - * Returns initial value if it's not a keyword. - * - * Supported keywords: - * - '$now$' - returns current time in ms, e.g 1667915146503 - * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' - * - * @param {string} rawValue keyword - * @returns {string} parsed value - */ - const parseKeywordValue = function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = '$now$'; - const CURRENT_DATE_KEYWORD = '$currentDate$'; - let parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { - // Set to current time in ms, e.g 1667915146503 - parsedValue = Date.now().toString(); - } else if (rawValue === CURRENT_DATE_KEYWORD) { - // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' - parsedValue = Date(); - } - return parsedValue; - }; - /** - * Makes arbitrary operations on shadow root element, - * to be passed as callback to hijackAttachShadow - * - * @callback attachShadowCallback - * @param {HTMLElement} shadowRoot - * @returns {void} - */ +/***/ }), - /** - * Overrides attachShadow method of Element API on a given context - * to pass retrieved shadowRoots to callback - * - * @param {Object} context e.g global window object or contentWindow of an iframe - * @param {string} hostSelector selector to determine if callback should be called on current shadow subtree - * @param {attachShadowCallback} callback callback to call on shadow root - */ - const hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) { - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const shadowRoot = Reflect.apply(target, thisArg, args); - if (thisArg && thisArg.matches(hostSelector || '*')) { - callback(shadowRoot); - } - return shadowRoot; - }; - const attachShadowHandler = { - apply: handlerWrapper - }; - context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler); - }; +/***/ 5392: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable max-len */ - /** - * @trustedScriptlet trusted-click-element - * @description - * Clicks selected elements in a strict sequence, ordered by selectors passed, and waiting for them to render in the DOM first. - * Deactivates after all elements have been clicked or by 10s timeout. - * - * **Syntax** - * ``` - * example.com#%#//scriptlet('trusted-click-element', selectors[, extraMatch[, delay]]) - * ``` - * - * - `selectors` — required, string with query selectors delimited by comma - * - `extraMatch` — optional, extra condition to check on a page; allows to match `cookie` and `localStorage`; can be set as `name:key[=value]` where `value` is optional. - * If `cookie`/`localStorage` starts with `!` then the element will only be clicked if specified cookie/localStorage item does not exist. - * Multiple conditions are allowed inside one `extraMatch` but they should be delimited by comma and each of them should match the syntax. Possible `name`s: - * - `cookie` - test string or regex against cookies on a page - * - `localStorage` - check if localStorage item is present - * - `delay` — optional, time in ms to delay scriptlet execution, defaults to instant execution. - * - * **Examples** - * 1. Click single element by selector - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]') - * ``` - * - * 2. Delay click execution by 500ms - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '', '500') - * ``` - * - * 3. Click multiple elements by selector with a delay - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name="check"], input[type="submit"][value="akkoord"]', '', '500') - * ``` - * - * 4. Match cookies by keys using regex and string - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'cookie:userConsentCommunity, cookie:/cmpconsent|cmp/') - * ``` - * - * 5. Match by cookie key=value pairs using regex and string - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'cookie:userConsentCommunity=true, cookie:/cmpconsent|cmp/=/[a-z]{1,5}/') - * ``` - * - * 6. Match by localStorage item 'promo' key - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'localStorage:promo') - * ``` - * - * 7. Click multiple elements with delay and matching by both cookie string and localStorage item - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], input[type="submit"][value="akkoord"]', 'cookie:cmpconsent, localStorage:promo', '250') - * ``` - * - * 8. Click element only if cookie with name `cmpconsent` does not exist - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '!cookie:cmpconsent') - * ``` - * - * 9. Click element only if specified cookie string and localStorage item does not exist - * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '!cookie:cmpconsent, !localStorage:promo') - * ``` - */ - /* eslint-enable max-len */ - function trustedClickElement$1(source, selectors) { - let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; - if (!selectors) { - return; - } - const OBSERVER_TIMEOUT_MS = 10000; - const THROTTLE_DELAY_MS = 20; - const STATIC_CLICK_DELAY_MS = 150; - const COOKIE_MATCH_MARKER = 'cookie:'; - const LOCAL_STORAGE_MATCH_MARKER = 'localStorage:'; - const SELECTORS_DELIMITER = ','; - const COOKIE_STRING_DELIMITER = ';'; - // Regex to split match pairs by commas, avoiding the ones included in regexes - const EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; - const sleep = function sleep(delayMs) { - return new Promise(function (resolve) { - return setTimeout(resolve, delayMs); - }); - }; - let parsedDelay; - if (delay) { - parsedDelay = parseInt(delay, 10); - const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; - if (!isValidDelay) { - // eslint-disable-next-line max-len - const message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); - logMessage(source, message); - return; - } - } - let canClick = !parsedDelay; - const cookieMatches = []; - const localStorageMatches = []; - let isInvertedMatchCookie = false; - let isInvertedMatchLocalStorage = false; - if (extraMatch) { - // Get all match marker:value pairs from argument - const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { - return matchStr.trim(); - }); +var createNonEnumerableProperty = __webpack_require__(8880); +var clearErrorStack = __webpack_require__(1060); +var ERROR_STACK_INSTALLABLE = __webpack_require__(2914); - // Filter match pairs by marker - parsedExtraMatch.forEach(function (matchStr) { - if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) { - const _parseMatchArg = parseMatchArg(matchStr), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchValue = _parseMatchArg.matchValue; - isInvertedMatchCookie = isInvertedMatch; - const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ''); - cookieMatches.push(cookieMatch); - } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { - const _parseMatchArg2 = parseMatchArg(matchStr), - isInvertedMatch = _parseMatchArg2.isInvertedMatch, - matchValue = _parseMatchArg2.matchValue; - isInvertedMatchLocalStorage = isInvertedMatch; - const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ''); - localStorageMatches.push(localStorageMatch); - } - }); - } - if (cookieMatches.length > 0) { - const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); - const parsedCookies = parseCookieString(document.cookie); - const cookieKeys = Object.keys(parsedCookies); - if (cookieKeys.length === 0) { - return; - } - const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { - // Avoid getting /.?/ result from toRegExp on undefined - // as cookie may be set without value, - // on which cookie parsing will return cookieKey:undefined pair - const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; - const keyMatch = toRegExp(key); - return cookieKeys.some(function (key) { - const keysMatched = keyMatch.test(key); - if (!keysMatched) { - return false; - } +// non-standard V8 +var captureStackTrace = Error.captureStackTrace; - // Key matching is enough if cookie value match is not specified - if (!valueMatch) { - return true; - } - return valueMatch.test(parsedCookies[key]); - }); - }); - const shouldRun = cookiesMatched !== isInvertedMatchCookie; - if (!shouldRun) { - return; - } - } - if (localStorageMatches.length > 0) { - const localStorageMatched = localStorageMatches.every(function (str) { - const itemValue = window.localStorage.getItem(str); - return itemValue || itemValue === ''; - }); - const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; - if (!shouldRun) { - return; - } - } +module.exports = function (error, C, stack, dropEntries) { + if (ERROR_STACK_INSTALLABLE) { + if (captureStackTrace) captureStackTrace(error, C); + else createNonEnumerableProperty(error, 'stack', clearErrorStack(stack, dropEntries)); + } +}; - /** - * Create selectors array and swap selectors to null on finding it's element - * - * Selectors / nulls should not be (re)moved from array to: - * - keep track of selectors order - * - always know on what index corresponding element should be put - * - prevent selectors from being queried multiple times - */ - let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { - return selector.trim(); - }); - const createElementObj = function createElementObj(element) { - return { - element: element || null, - clicked: false - }; - }; - const elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); - /** - * Go through elementsSequence from left to right, clicking on found elements - * - * Element should not be clicked if it is already clicked, - * or a previous element is not found or clicked yet - */ - const clickElementsBySequence = async function clickElementsBySequence() { - for (let i = 0; i < elementsSequence.length; i += 1) { - const elementObj = elementsSequence[i]; - // Add a delay between clicks to every element except the first one - // https://github.com/AdguardTeam/Scriptlets/issues/284 - if (i >= 1) { - await sleep(STATIC_CLICK_DELAY_MS); - } - // Stop clicking if that pos element is not found yet - if (!elementObj.element) { - break; - } - // Skip already clicked elements - if (!elementObj.clicked) { - elementObj.element.click(); - elementObj.clicked = true; - } - } - const allElementsClicked = elementsSequence.every(function (elementObj) { - return elementObj.clicked === true; - }); - if (allElementsClicked) { - // At this stage observer is already disconnected - hit(source); - } - }; - const handleElement = function handleElement(element, i) { - const elementObj = createElementObj(element); - elementsSequence[i] = elementObj; - if (canClick) { - clickElementsBySequence(); - } - }; +/***/ }), - /** - * Query all selectors from queue on each mutation - * Each selector is swapped to null in selectorsSequence on founding corresponding element - * - * We start looking for elements before possible delay is over, to avoid cases - * when delay is getting off after the last mutation took place. - * - */ - const findElements = function findElements(mutations, observer) { - const fulfilledSelectors = []; - selectorsSequence.forEach(function (selector, i) { - if (!selector) { - return; - } - const element = document.querySelector(selector); - if (!element) { - return; - } - handleElement(element, i); - fulfilledSelectors.push(selector); - }); +/***/ 2914: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // selectorsSequence should be modified after the loop to not break loop indexation - selectorsSequence = selectorsSequence.map(function (selector) { - return fulfilledSelectors.indexOf(selector) === -1 ? selector : null; - }); +var fails = __webpack_require__(7293); +var createPropertyDescriptor = __webpack_require__(9114); - // Disconnect observer after finding all elements - const allSelectorsFulfilled = selectorsSequence.every(function (selector) { - return selector === null; - }); - if (allSelectorsFulfilled) { - observer.disconnect(); - } - }; - const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); - observer.observe(document.documentElement, { - attributes: true, - childList: true, - subtree: true - }); - if (parsedDelay) { - setTimeout(function () { - // Click previously collected elements - clickElementsBySequence(); - canClick = true; - }, parsedDelay); - } - setTimeout(function () { - return observer.disconnect(); - }, OBSERVER_TIMEOUT_MS); - } - trustedClickElement$1.names = ['trusted-click-element' - // trusted scriptlets support no aliases - ]; +module.exports = !fails(function () { + var error = Error('a'); + if (!('stack' in error)) return true; + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); + return error.stack !== 7; +}); - trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage, parseMatchArg]; - /* eslint-disable max-len */ - /** - * @scriptlet abort-on-property-read - * @description - * Aborts a script when it attempts to **read** the specified property. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-readjs- - * - * Related ABP source: - * https://github.com/adblockplus/adblockpluscore/blob/6b2a309054cc23432102b85d13f12559639ef495/lib/content/snippets.js#L864 - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('abort-on-property-read', property) - * ``` - * - * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window` - * - * **Examples** - * ``` - * ! Aborts script when it tries to access `window.alert` - * example.org#%#//scriptlet('abort-on-property-read', 'alert') - * - * ! Aborts script when it tries to access `navigator.language` - * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language') - * ``` - */ - /* eslint-enable max-len */ - function abortOnPropertyRead$1(source, property) { - if (!property) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - throw new ReferenceError(rid); - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - setPropertyAccess(base, prop, { - get: abort, - set: function set() {} - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - abortOnPropertyRead$1.names = ['abort-on-property-read', - // aliases are needed for matching the related scriptlet converted into our syntax - 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read']; - abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; +/***/ }), - /* eslint-disable max-len */ - /** - * @scriptlet abort-on-property-write - * @description - * Aborts a script when it attempts to **write** the specified property. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-writejs- - * - * Related ABP source: - * https://github.com/adblockplus/adblockpluscore/blob/6b2a309054cc23432102b85d13f12559639ef495/lib/content/snippets.js#L896 - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('abort-on-property-write', property) - * ``` - * - * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window` - * - * **Examples** - * ``` - * ! Aborts script when it tries to set `window.adblock` value - * example.org#%#//scriptlet('abort-on-property-write', 'adblock') - * ``` - */ - /* eslint-enable max-len */ - function abortOnPropertyWrite$1(source, property) { - if (!property) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - throw new ReferenceError(rid); - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - setPropertyAccess(base, prop, { - set: abort - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - abortOnPropertyWrite$1.names = ['abort-on-property-write', - // aliases are needed for matching the related scriptlet converted into our syntax - 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write']; - abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; +/***/ 2109: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable max-len */ - /** - * @scriptlet prevent-setTimeout - * @description - * Prevents a `setTimeout` call if: - * 1) the text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`; - * otherwise mismatched calls should be defused; - * 2) the delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-settimeout-ifjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-setTimeout'[, matchCallback[, matchDelay]]) - * ``` - * - * Call with no arguments will log calls to setTimeout while debugging (`log-setTimeout` superseding), - * so production filter lists' rules definitely require at least one of the parameters: - * - `matchCallback` — optional, string or regular expression; invalid regular expression will be skipped and all callbacks will be matched. - * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. - * If do not start with `!`, the stringified callback will be matched. - * If not set, prevents all `setTimeout` calls due to specified `matchDelay`. - * - `matchDelay` — optional, must be an integer. - * If starts with `!`, scriptlet will not match the delay but all other will be defused. - * If do not start with `!`, the delay passed to the `setTimeout` call will be matched. - * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. - * - * > If `prevent-setTimeout` log looks like `setTimeout(undefined, 1000)`, - * it means that no callback was passed to setTimeout() and that's not scriptlet issue - * and obviously it can not be matched by `matchCallback`. - * - * **Examples** - * 1. Prevents `setTimeout` calls if the callback matches `/\.test/` regardless of the delay. - * ```bash - * example.org#%#//scriptlet('prevent-setTimeout', '/\.test/') - * ``` - * - * For instance, the following call will be prevented: - * ```javascript - * setTimeout(function () { - * window.test = "value"; - * }, 100); - * ``` - * - * 2. Prevents `setTimeout` calls if the callback does not contain `value`. - * ``` - * example.org#%#//scriptlet('prevent-setTimeout', '!value') - * ``` - * - * For instance, only the first of the following calls will be prevented: - * ```javascript - * setTimeout(function () { - * window.test = "test -- prevented"; - * }, 300); - * setTimeout(function () { - * window.test = "value -- executed"; - * }, 400); - * setTimeout(function () { - * window.value = "test -- executed"; - * }, 500); - * ``` - * - * 3. Prevents `setTimeout` calls if the callback contains `value` and the delay is not set to `300`. - * ``` - * example.org#%#//scriptlet('prevent-setTimeout', 'value', '!300') - * ``` - * - * For instance, only the first of the following calls will not be prevented: - * ```javascript - * setTimeout(function () { - * window.test = "value 1 -- executed"; - * }, 300); - * setTimeout(function () { - * window.test = "value 2 -- prevented"; - * }, 400); - * setTimeout(function () { - * window.test = "value 3 -- prevented"; - * }, 500); - * ``` - * - * 4. Prevents `setTimeout` calls if the callback does not contain `value` and the delay is not set to `300`. - * ``` - * example.org#%#//scriptlet('prevent-setTimeout', '!value', '!300') - * ``` - * - * For instance, only the second of the following calls will be prevented: - * ```javascript - * setTimeout(function () { - * window.test = "test -- executed"; - * }, 300); - * setTimeout(function () { - * window.test = "test -- prevented"; - * }, 400); - * setTimeout(function () { - * window.test = "value -- executed"; - * }, 400); - * setTimeout(function () { - * window.value = "test -- executed"; - * }, 500); - * ``` - * - * 5. Prevents `setTimeout` calls if the callback contains `value` and delay is a decimal. - * ``` - * example.org#%#//scriptlet('prevent-setTimeout', 'value', '300') - * ``` - * - * For instance, the following calls will be prevented: - * ```javascript - * setTimeout(function () { - * window.test = "value"; - * }, 300); - * setTimeout(function () { - * window.test = "value"; - * }, 300 + Math.random()); - * ``` - */ - /* eslint-enable max-len */ - function preventSetTimeout$1(source, matchCallback, matchDelay) { - // logs setTimeouts to console if no arguments have been specified - const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; - if (shouldLog) { - hit(source); - // https://github.com/AdguardTeam/Scriptlets/issues/105 - logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); - } else { - shouldPrevent = isPreventionNeeded({ - callback, - delay, - matchCallback, - matchDelay - }); - } - if (shouldPrevent) { - hit(source); - args[0] = noopFunc; - } - return target.apply(thisArg, args); - }; - const setTimeoutHandler = { - apply: handlerWrapper - }; - window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler); - } - preventSetTimeout$1.names = ['prevent-setTimeout', - // aliases are needed for matching the related scriptlet converted into our syntax - 'no-setTimeout-if.js', - // new implementation of setTimeout-defuser.js - 'ubo-no-setTimeout-if.js', 'nostif.js', - // new short name of no-setTimeout-if - 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif', - // old scriptlet names which should be supported as well. - // should be removed eventually. - // do not remove until other filter lists maintainers use them - 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std']; - preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, - // following helpers should be injected as helpers above use them - parseMatchArg, parseDelayArg, toRegExp, startsWith$1, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay]; +var global = __webpack_require__(7854); +var getOwnPropertyDescriptor = (__webpack_require__(1236).f); +var createNonEnumerableProperty = __webpack_require__(8880); +var defineBuiltIn = __webpack_require__(8052); +var defineGlobalProperty = __webpack_require__(3072); +var copyConstructorProperties = __webpack_require__(9920); +var isForced = __webpack_require__(4705); - /* eslint-disable max-len */ - /** - * @scriptlet prevent-setInterval - * @description - * Prevents a `setInterval` call if: - * 1) the text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`; - * otherwise mismatched calls should be defused; - * 2) the delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-setinterval-ifjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-setInterval'[, matchCallback[, matchDelay]]) - * ``` - * - * Call with no arguments will log calls to setInterval while debugging (`log-setInterval` superseding), - * so production filter lists' rules definitely require at least one of the parameters: - * - `matchCallback` — optional, string or regular expression; invalid regular expression will be skipped and all callbacks will be matched. - * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. - * If do not start with `!`, the stringified callback will be matched. - * If not set, prevents all `setInterval` calls due to specified `matchDelay`. - * - `matchDelay` — optional, must be an integer. - * If starts with `!`, scriptlet will not match the delay but all other will be defused. - * If do not start with `!`, the delay passed to the `setInterval` call will be matched. - * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. - * - * > If `prevent-setInterval` log looks like `setInterval(undefined, 1000)`, - * it means that no callback was passed to setInterval() and that's not scriptlet issue - * and obviously it can not be matched by `matchCallback`. - * - * **Examples** - * 1. Prevents `setInterval` calls if the callback matches `/\.test/` regardless of the delay. - * ```bash - * example.org#%#//scriptlet('prevent-setInterval', '/\.test/') - * ``` - * - * For instance, the following call will be prevented: - * ```javascript - * setInterval(function () { - * window.test = "value"; - * }, 100); - * ``` - * - * 2. Prevents `setInterval` calls if the callback does not contain `value`. - * ``` - * example.org#%#//scriptlet('prevent-setInterval', '!value') - * ``` - * - * For instance, only the first of the following calls will be prevented: - * ```javascript - * setInterval(function () { - * window.test = "test -- prevented"; - * }, 300); - * setInterval(function () { - * window.test = "value -- executed"; - * }, 400); - * setInterval(function () { - * window.value = "test -- executed"; - * }, 500); - * ``` - * - * 3. Prevents `setInterval` calls if the callback contains `value` and the delay is not set to `300`. - * ``` - * example.org#%#//scriptlet('prevent-setInterval', 'value', '!300') - * ``` - * - * For instance, only the first of the following calls will not be prevented: - * ```javascript - * setInterval(function () { - * window.test = "value 1 -- executed"; - * }, 300); - * setInterval(function () { - * window.test = "value 2 -- prevented"; - * }, 400); - * setInterval(function () { - * window.test = "value 3 -- prevented"; - * }, 500); - * ``` - * - * 4. Prevents `setInterval` calls if the callback does not contain `value` and the delay is not set to `300`. - * ``` - * example.org#%#//scriptlet('prevent-setInterval', '!value', '!300') - * ``` - * - * For instance, only the second of the following calls will be prevented: - * ```javascript - * setInterval(function () { - * window.test = "test -- executed"; - * }, 300); - * setInterval(function () { - * window.test = "test -- prevented"; - * }, 400); - * setInterval(function () { - * window.test = "value -- executed"; - * }, 400); - * setInterval(function () { - * window.value = "test -- executed"; - * }, 500); - * ``` - * - * 5. Prevents `setInterval` calls if the callback contains `value` and delay is a decimal. - * ``` - * example.org#%#//scriptlet('prevent-setInterval', 'value', '300') - * ``` - * - * For instance, the following calls will be prevented: - * ```javascript - * setInterval(function () { - * window.test = "value"; - * }, 300); - * setInterval(function () { - * window.test = "value"; - * }, 300 + Math.random()); - * ``` - */ - /* eslint-enable max-len */ - function preventSetInterval$1(source, matchCallback, matchDelay) { - // logs setIntervals to console if no arguments have been specified - const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; - if (shouldLog) { - hit(source); - // https://github.com/AdguardTeam/Scriptlets/issues/105 - logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); - } else { - shouldPrevent = isPreventionNeeded({ - callback, - delay, - matchCallback, - matchDelay - }); - } - if (shouldPrevent) { - hit(source); - args[0] = noopFunc; - } - return target.apply(thisArg, args); - }; - const setIntervalHandler = { - apply: handlerWrapper - }; - window.setInterval = new Proxy(window.setInterval, setIntervalHandler); +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); } - preventSetInterval$1.names = ['prevent-setInterval', - // aliases are needed for matching the related scriptlet converted into our syntax - 'no-setInterval-if.js', - // new implementation of setInterval-defuser.js - 'ubo-no-setInterval-if.js', 'setInterval-defuser.js', - // old name should be supported as well - 'ubo-setInterval-defuser.js', 'nosiif.js', - // new short name of no-setInterval-if - 'ubo-nosiif.js', 'sid.js', - // old short scriptlet name - 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid']; - preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, - // following helpers should be injected as helpers above use them - toRegExp, startsWith$1, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay]; + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; - /* eslint-disable max-len */ - /** - * @scriptlet prevent-window-open - * @description - * Prevents `window.open` calls when URL either matches or not matches the specified string/regexp. Using it without parameters prevents all `window.open` calls. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#windowopen-defuserjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-window-open'[, match[, delay[, replacement]]]) - * ``` - * - * - `match` — optional, string or regular expression. If not set or regular expression is invalid, all window.open calls will be matched. - * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. - * If do not start with `!`, the stringified callback will be matched. - * - `delay` — optional, number of seconds. If not set, scriptlet will return `null`, - * otherwise valid sham window object as injected `iframe` will be returned - * for accessing its methods (blur(), focus() etc.) and will be removed after the delay. - * - `replacement` — optional, string; one of the predefined constants: - * - `obj` — for returning an object instead of default iframe; - * for cases when the page requires a valid `window` instance to be returned - * - `log` — for logging window.open calls; permitted for production filter lists. - * - * **Examples** - * 1. Prevent all `window.open` calls: - * ``` - * example.org#%#//scriptlet('prevent-window-open') - * ``` - * - * 2. Prevent `window.open` for all URLs containing `example`: - * ``` - * example.org#%#//scriptlet('prevent-window-open', 'example') - * ``` - * - * 3. Prevent `window.open` for all URLs matching RegExp `/example\./`: - * ``` - * example.org#%#//scriptlet('prevent-window-open', '/example\./') - * ``` - * - * 4. Prevent `window.open` for all URLs **NOT** containing `example`: - * ``` - * example.org#%#//scriptlet('prevent-window-open', '!example') - * ``` - * - * Old syntax of prevent-window-open parameters: - * - `match` — optional, defaults to "matching", any positive number or nothing for "matching", 0 or empty string for "not matching" - * - `search` — optional, string or regexp for matching the URL passed to `window.open` call; defaults to search all `window.open` call - * - `replacement` — optional, string to return prop value or property instead of window.open; defaults to return noopFunc. - * **Examples** - * ``` - * example.org#%#//scriptlet('prevent-window-open', '1', '/example\./') - * example.org#%#//scriptlet('prevent-window-open', '0', 'example') - * example.org#%#//scriptlet('prevent-window-open', '', '', 'trueFunc') - * example.org#%#//scriptlet('prevent-window-open', '1', '', '{propName=noopFunc}') - * ``` - * - * > For better compatibility with uBO, old syntax is not recommended to use. - */ - /* eslint-enable max-len */ - function preventWindowOpen$1(source) { - let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*'; - let delay = arguments.length > 2 ? arguments[2] : undefined; - let replacement = arguments.length > 3 ? arguments[3] : undefined; - // default match value is needed for preventing all window.open calls - // if scriptlet runs without args - const nativeOpen = window.open; - const isNewSyntax = match !== '0' && match !== '1'; - const oldOpenWrapper = function oldOpenWrapper(str) { - match = Number(match) > 0; - // 'delay' was 'search' prop for matching in old syntax - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - if (!isValidStrPattern(delay)) { - logMessage(source, "Invalid parameter: ".concat(delay)); - return nativeOpen.apply(window, [str, ...args]); - } - const searchRegexp = toRegExp(delay); - if (match !== searchRegexp.test(str)) { - return nativeOpen.apply(window, [str, ...args]); - } - hit(source); - return handleOldReplacement(replacement); - }; - const newOpenWrapper = function newOpenWrapper(url) { - const shouldLog = replacement && replacement.indexOf('log') > -1; - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - if (shouldLog) { - const argsStr = args && args.length > 0 ? ", ".concat(args.join(', ')) : ''; - const message = "".concat(url).concat(argsStr); - logMessage(source, message, true); - hit(source); - } - let shouldPrevent = false; - if (match === '*') { - shouldPrevent = true; - } else if (isValidMatchStr(match)) { - const _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; - } else { - logMessage(source, "Invalid parameter: ".concat(match)); - shouldPrevent = false; - } - if (shouldPrevent) { - const parsedDelay = parseInt(delay, 10); - let result; - if (nativeIsNaN(parsedDelay)) { - result = noopNull(); - } else { - const decoyArgs = { - replacement, - url, - delay: parsedDelay - }; - const decoy = createDecoy(decoyArgs); - let popup = decoy.contentWindow; - if (typeof popup === 'object' && popup !== null) { - Object.defineProperty(popup, 'closed', { - value: false - }); - Object.defineProperty(popup, 'opener', { - value: window - }); - Object.defineProperty(popup, 'frameElement', { - value: null - }); - } else { - const nativeGetter = decoy.contentWindow && decoy.contentWindow.get; - Object.defineProperty(decoy, 'contentWindow', { - get: getPreventGetter(nativeGetter) - }); - popup = decoy.contentWindow; - } - result = popup; - } - hit(source); - return result; - } - return nativeOpen.apply(window, [url, ...args]); - }; - window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; - // Protect window.open from native code check - window.open.toString = nativeOpen.toString.bind(nativeOpen); - } - preventWindowOpen$1.names = ['prevent-window-open', - // aliases are needed for matching the related scriptlet converted into our syntax - 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif']; - preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith$1, endsWith, substringBefore, substringAfter$1]; +/***/ }), - /* eslint-disable max-len */ - /** - * @scriptlet abort-current-inline-script - * @description - * Aborts an inline script when it attempts to **read** or **write to** the specified property - * AND when the contents of the ` - * ``` - * - * 3. Aborts inline scripts which are trying to access `window.alert` and match this regexp: `/Hello.+world/`. - * ``` - * example.org#%#//scriptlet('abort-current-inline-script', 'alert', '/Hello.+world/') - * ``` - * - * For instance, the following scripts will be aborted: - * ```html - * - * ``` - * ```html - * - * ``` - * - * This script will not be aborted: - * ```html - * - * ``` - */ - /* eslint-enable max-len */ - function abortCurrentInlineScript$1(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const SRC_DATA_MARKER = 'data:text/javascript;base64,'; - const getCurrentScript = function getCurrentScript() { - if ('currentScript' in document) { - return document.currentScript; - } - const scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); - if (!scriptEl) { - return; - } - let content = scriptEl.textContent; +/***/ 7293: +/***/ ((module) => { - // We are using Node.prototype.textContent property descriptor - // to get the real script content - // even when document.currentScript.textContent is replaced. - // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 - try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; - content = textContentGetter.call(scriptEl); - } catch (e) {} // eslint-disable-line no-empty +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; - // https://github.com/AdguardTeam/Scriptlets/issues/130 - if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith$1(scriptEl.src, SRC_DATA_MARKER)) { - const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); - content = window.atob(encodedContent); - } - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { - hit(source); - throw new ReferenceError(rid); - } - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - // The scriptlet might be executed before the chain property has been created - // (for instance, document.body before the HTML body was loaded). - // In this case we're checking whether the base element exists or not - // and if not, we simply exit without overriding anything. - // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 - if (base instanceof Object === false && base === null) { - const props = property.split('.'); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); - logMessage(source, message); - return; - } - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - let currentValue = base[prop]; - let origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { - currentValue = base[prop]; - origDescriptor = undefined; - } - const descriptorWrapper = Object.assign(getDescriptorAddon(), { - currentValue, - get() { - if (!this.isAbortingSuspended) { - this.isolateCallback(abort); - } - if (origDescriptor instanceof Object) { - return origDescriptor.get.call(base); - } - return this.currentValue; - }, - set(newValue) { - if (!this.isAbortingSuspended) { - this.isolateCallback(abort); - } - if (origDescriptor instanceof Object) { - origDescriptor.set.call(base, newValue); - } else { - this.currentValue = newValue; - } - } - }); - setPropertyAccess(base, prop, { - // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values - get() { - return descriptorWrapper.get.call(descriptorWrapper); - }, - set(newValue) { - descriptorWrapper.set.call(descriptorWrapper, newValue); - } - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - abortCurrentInlineScript$1.names = ['abort-current-inline-script', - // aliases are needed for matching the related scriptlet converted into our syntax - 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js', - // "ubo"-aliases with no "js"-ending - 'ubo-abort-current-script', 'ubo-acs', - // obsolete but supported aliases - 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script']; - abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith$1, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; +/***/ }), - /* eslint-disable max-len */ - /** - * @scriptlet set-constant - * @description - * Creates a constant property and assigns it one of the values from the predefined list. - * - * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type. - * - * > If empty object is present in chain it will be trapped until chain leftovers appear. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#set-constantjs- - * - * Related ABP snippet: - * https://github.com/adblockplus/adblockpluscore/blob/adblockpluschrome-3.9.4/lib/content/snippets.js#L1361 - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('set-constant', property, value[, stack]) - * ``` - * - * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`. - * - `value` — required. Possible values: - * - positive decimal integer `<= 32767` - * - one of the predefined constants: - * - `undefined` - * - `false` - * - `true` - * - `null` - * - `emptyObj` — empty object - * - `emptyArr` — empty array - * - `noopFunc` — function with empty body - * - `noopCallbackFunc` — function returning noopFunc - * - `trueFunc` — function returning true - * - `falseFunc` — function returning false - * - `throwFunc` — function throwing an error - * - `noopPromiseResolve` — function returning Promise object that is resolved with an empty response - * - `noopPromiseReject` — function returning Promise.reject() - * - `''` — empty string - * - `-1` — number value `-1` - * - `yes` - * - `no` - * - `stack` — optional, string or regular expression that must match the current function call stack trace; - * if regular expression is invalid it will be skipped - * - * **Examples** - * ``` - * ! Any access to `window.first` will return `false` - * example.org#%#//scriptlet('set-constant', 'first', 'false') - * - * ✔ window.first === false - * ``` - * - * ``` - * ! Any call to `window.second()` will return `true` - * example.org#%#//scriptlet('set-constant', 'second', 'trueFunc') - * - * ✔ window.second() === true - * ✔ window.second.toString() === "function trueFunc() {return true;}" - * ``` - * - * ``` - * ! Any call to `document.third()` will return `true` if the method is related to `checking.js` - * example.org#%#//scriptlet('set-constant', 'document.third', 'trueFunc', 'checking.js') - * - * ✔ document.third() === true // if the condition described above is met - * ``` - */ - /* eslint-enable max-len */ - function setConstant$1(source, property, value, stack) { - if (!property || !matchStackTrace(stack, new Error().stack)) { - return; - } - const emptyArr = noopArray(); - const emptyObj = noopObject(); - let constantValue; - if (value === 'undefined') { - constantValue = undefined; - } else if (value === 'false') { - constantValue = false; - } else if (value === 'true') { - constantValue = true; - } else if (value === 'null') { - constantValue = null; - } else if (value === 'emptyArr') { - constantValue = emptyArr; - } else if (value === 'emptyObj') { - constantValue = emptyObj; - } else if (value === 'noopFunc') { - constantValue = noopFunc; - } else if (value === 'noopCallbackFunc') { - constantValue = noopCallbackFunc; - } else if (value === 'trueFunc') { - constantValue = trueFunc; - } else if (value === 'falseFunc') { - constantValue = falseFunc; - } else if (value === 'throwFunc') { - constantValue = throwFunc; - } else if (value === 'noopPromiseResolve') { - constantValue = noopPromiseResolve; - } else if (value === 'noopPromiseReject') { - constantValue = noopPromiseReject; - } else if (/^\d+$/.test(value)) { - constantValue = parseFloat(value); - if (nativeIsNaN(constantValue)) { - return; - } - if (Math.abs(constantValue) > 32767) { - return; - } - } else if (value === '-1') { - constantValue = -1; - } else if (value === '') { - constantValue = ''; - } else if (value === 'yes') { - constantValue = 'yes'; - } else if (value === 'no') { - constantValue = 'no'; - } else { - return; - } - let canceled = false; - const mustCancel = function mustCancel(value) { - if (canceled) { - return canceled; - } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; - return canceled; - }; +/***/ 2104: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Safely sets property on a given object - * - * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as - * reorganizing this to common helpers will most definitely complicate debugging - * - * @param {Object} base arbitrary reachable object - * @param {string} prop property name - * @param {boolean} configurable if set property should be configurable - * @param {Object} handler custom property descriptor object - * @returns {boolean} true if prop was trapped successfully - */ - const trapProp = function trapProp(base, prop, configurable, handler) { - if (!handler.init(base[prop])) { - return false; - } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; - // This is required to prevent scriptlets overwrite each over - if (origDescriptor instanceof Object) { - // This check is required to avoid defining non-configurable props - if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); - logMessage(source, message); - return false; - } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { - prevSetter = origDescriptor.set; - } - } - Object.defineProperty(base, prop, { - configurable, - get() { - return handler.get(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); - } - handler.set(a); - } - }); - return true; - }; +var NATIVE_BIND = __webpack_require__(4374); - /** - * Traverses given chain to set constant value to its end prop - * Chains that yet include non-object values (e.g null) are valid and will be - * traversed when appropriate chain member is set by an external script - * - * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as - * reorganizing this to common helpers will most definitely complicate debugging - * - * @param {Object} owner object that owns chain - * @param {string} property chain of owner properties - */ - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; +var FunctionPrototype = Function.prototype; +var apply = FunctionPrototype.apply; +var call = FunctionPrototype.call; - // Handler method init is used to keep track of factual value - // and apply mustCancel() check only on end prop - const inChainPropHandler = { - factValue: undefined, - init(a) { - this.factValue = a; - return true; - }, - get() { - return this.factValue; - }, - set(a) { - // Prevent breakage due to loop assignments like win.obj = win.obj - if (this.factValue === a) { - return; - } - this.factValue = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - } - }; - const endPropHandler = { - init(a) { - if (mustCancel(a)) { - return false; - } - return true; - }, - get() { - return constantValue; - }, - set(a) { - if (!mustCancel(a)) { - return; - } - constantValue = a; - } - }; +// eslint-disable-next-line es/no-reflect -- safe +module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () { + return call.apply(apply, arguments); +}); - // End prop case - if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { - hit(source); - } - return; - } - // Null prop in chain - if (base !== undefined && base[prop] === null) { - trapProp(base, prop, true, inChainPropHandler); - return; - } +/***/ }), - // Empty object prop in chain - if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { - trapProp(base, prop, true, inChainPropHandler); - } +/***/ 4374: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // Defined prop in chain - const propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { - setChainPropAccess(propValue, chain); - } +var fails = __webpack_require__(7293); - // Undefined prop in chain - trapProp(base, prop, true, inChainPropHandler); - }; - setChainPropAccess(window, property); - } - setConstant$1.names = ['set-constant', - // aliases are needed for matching the related scriptlet converted into our syntax - 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read']; - setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest, - // following helpers should be imported and injected - // because they are used by helpers above - shouldAbortInlineOrInjectedScript]; +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = (function () { /* empty */ }).bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); - /* eslint-disable max-len */ - /** - * @scriptlet remove-cookie - * @description - * Removes current page cookies by passed string matching with name. For current domain and subdomains. Runs on load and before unload. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#cookie-removerjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('remove-cookie'[, match]) - * ``` - * - * - `match` — optional, string or regex matching the cookie name. If not specified all accessible cookies will be removed. - * - * **Examples** - * 1. Removes all cookies: - * ``` - * example.org#%#//scriptlet('remove-cookie') - * ``` - * - * 2. Removes cookies which name contains `example` string: - * ``` - * example.org#%#//scriptlet('remove-cookie', 'example') - * ``` - * - * For instance this cookie will be removed: - * - * ```javascript - * document.cookie = '__example=randomValue'; - * ``` - */ - /* eslint-enable max-len */ - function removeCookie$1(source, match) { - const matchRegexp = toRegExp(match); - const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { - const cookieSpec = "".concat(cookieName, "="); - const domain1 = "; domain=".concat(hostName); - const domain2 = "; domain=.".concat(hostName); - const path = '; path=/'; - const expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT'; - document.cookie = cookieSpec + expiration; - document.cookie = cookieSpec + domain1 + expiration; - document.cookie = cookieSpec + domain2 + expiration; - document.cookie = cookieSpec + path + expiration; - document.cookie = cookieSpec + domain1 + path + expiration; - document.cookie = cookieSpec + domain2 + path + expiration; - hit(source); - }; - const rmCookie = function rmCookie() { - document.cookie.split(';').forEach(function (cookieStr) { - const pos = cookieStr.indexOf('='); - if (pos === -1) { - return; - } - const cookieName = cookieStr.slice(0, pos).trim(); - if (!matchRegexp.test(cookieName)) { - return; - } - const hostParts = document.location.hostname.split('.'); - for (let i = 0; i <= hostParts.length - 1; i += 1) { - const hostName = hostParts.slice(i).join('.'); - if (hostName) { - removeCookieFromHost(cookieName, hostName); - } - } - }); - }; - rmCookie(); - window.addEventListener('beforeunload', rmCookie); - } - removeCookie$1.names = ['remove-cookie', - // aliases are needed for matching the related scriptlet converted into our syntax - 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover']; - removeCookie$1.injections = [toRegExp, hit]; - /* eslint-disable max-len */ - /** - * @scriptlet prevent-addEventListener - * @description - * Prevents adding event listeners for the specified events and callbacks. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-defuserjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-addEventListener'[, typeSearch[, listenerSearch]]) - * ``` - * - * - `typeSearch` — optional, string or regular expression matching the type (event name); - * defaults to match all types; invalid regular expression will cause exit and rule will not work - * - `listenerSearch` — optional, string or regular expression matching the listener function body; - * defaults to match all listeners; invalid regular expression will cause exit and rule will not work - * - * **Examples** - * 1. Prevent all `click` listeners: - * ``` - * example.org#%#//scriptlet('prevent-addEventListener', 'click') - * ``` - * - 2. Prevent 'click' listeners with the callback body containing `searchString`. - * ``` - * example.org#%#//scriptlet('prevent-addEventListener', 'click', 'searchString') - * ``` - * - * For instance, this listener will not be called: - * - * ```javascript - * el.addEventListener('click', () => { - * window.test = 'searchString'; - * }); - * ``` - */ - /* eslint-enable max-len */ - function preventAddEventListener$1(source, typeSearch, listenerSearch) { - const typeSearchRegexp = toRegExp(typeSearch); - const listenerSearchRegexp = toRegExp(listenerSearch); - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { - var _this$constructor; - let shouldPrevent = false; - if (validateType(type) && validateListener(listener)) { - shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); - } - if (shouldPrevent) { - hit(source); - return undefined; - } +/***/ }), - // Avoid illegal invocations due to lost context - // https://github.com/AdguardTeam/Scriptlets/issues/271 - let context = this; - if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { - context = window; - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeAddEventListener.apply(context, [type, listener, ...args]); - } - const descriptor = { - configurable: true, - set: function set() {}, - get: function get() { - return addEventListenerWrapper; - } - }; - // https://github.com/AdguardTeam/Scriptlets/issues/215 - // https://github.com/AdguardTeam/Scriptlets/issues/143 - Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); - Object.defineProperty(window, 'addEventListener', descriptor); - Object.defineProperty(document, 'addEventListener', descriptor); - } - preventAddEventListener$1.names = ['prevent-addEventListener', - // aliases are needed for matching the related scriptlet converted into our syntax - 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld']; - preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString]; +/***/ 6916: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable consistent-return, no-eval */ +var NATIVE_BIND = __webpack_require__(4374); - /** - * @scriptlet prevent-bab - * @description - * Prevents BlockAdblock script from detecting an ad blocker. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#bab-defuserjs- - * - * It also can be used as `$redirect` sometimes. - * See [redirect description](../wiki/about-redirects.md#prevent-bab). - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-bab') - * ``` - */ - function preventBab$2(source) { - const nativeSetTimeout = window.setTimeout; - const babRegex = /\.bab_elementid.$/; - const timeoutWrapper = function timeoutWrapper(callback) { - if (typeof callback !== 'string' || !babRegex.test(callback)) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeSetTimeout.apply(window, [callback, ...args]); - } - hit(source); - }; - window.setTimeout = timeoutWrapper; - const signatures = [['blockadblock'], ['babasbm'], [/getItem\('babn'\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']]; - const check = function check(str) { - if (typeof str !== 'string') { - return false; - } - for (let i = 0; i < signatures.length; i += 1) { - const tokens = signatures[i]; - let match = 0; - for (let j = 0; j < tokens.length; j += 1) { - const token = tokens[j]; - const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; - if (found) { - match += 1; - } - } - if (match / tokens.length >= 0.8) { - return true; - } - } - return false; - }; - const nativeEval = window.eval; - const evalWrapper = function evalWrapper(str) { - if (!check(str)) { - return nativeEval(str); - } - hit(source); - const bodyEl = document.body; - if (bodyEl) { - bodyEl.style.removeProperty('visibility'); - } - const el = document.getElementById('babasbmsgx'); - if (el) { - el.parentNode.removeChild(el); - } - }; - window.eval = evalWrapper.bind(window); - } - preventBab$2.names = ['prevent-bab' - // there is no aliases for this scriptlet - ]; +var call = Function.prototype.call; - preventBab$2.injections = [hit]; +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; - /* eslint-disable no-unused-vars, no-extra-bind, func-names */ - /* eslint-disable max-len */ - /** - * @scriptlet nowebrtc - * @description - * Disables WebRTC by overriding `RTCPeerConnection`. The overridden function will log every attempt to create a new connection. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#nowebrtcjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('nowebrtc') - * ``` - */ - /* eslint-enable max-len */ - function nowebrtc$1(source) { - let propertyName = ''; - if (window.RTCPeerConnection) { - propertyName = 'RTCPeerConnection'; - } else if (window.webkitRTCPeerConnection) { - propertyName = 'webkitRTCPeerConnection'; - } - if (propertyName === '') { - return; - } - const rtcReplacement = function rtcReplacement(config) { - // eslint-disable-next-line max-len - const message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); - logMessage(source, message); - hit(source); - }; - rtcReplacement.prototype = { - close: noopFunc, - createDataChannel: noopFunc, - createOffer: noopFunc, - setRemoteDescription: noopFunc - }; - const rtc = window[propertyName]; - window[propertyName] = rtcReplacement; - if (rtc.prototype) { - rtc.prototype.createDataChannel = function (a, b) { - return { - close: noopFunc, - send: noopFunc - }; - }.bind(null); - } - } - nowebrtc$1.names = ['nowebrtc', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc']; - nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString]; +/***/ }), - /** - * @scriptlet log-addEventListener - * @description - * Logs all addEventListener calls to the console. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-loggerjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('log-addEventListener') - * ``` - */ - function logAddEventListener$1(source) { - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { - var _this$constructor; - if (validateType(type) && validateListener(listener)) { - const message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); - logMessage(source, message, true); - hit(source); - } +/***/ 6530: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // logging while debugging - const message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); - logMessage(source, message, true); +var DESCRIPTORS = __webpack_require__(9781); +var hasOwn = __webpack_require__(2597); - // Avoid illegal invocations due to lost context - // https://github.com/AdguardTeam/Scriptlets/issues/271 - let context = this; - if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { - context = window; - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeAddEventListener.apply(context, [type, listener, ...args]); - } - const descriptor = { - configurable: true, - set: function set() {}, - get: function get() { - return addEventListenerWrapper; - } - }; - // https://github.com/AdguardTeam/Scriptlets/issues/215 - // https://github.com/AdguardTeam/Scriptlets/issues/143 - Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); - Object.defineProperty(window, 'addEventListener', descriptor); - Object.defineProperty(document, 'addEventListener', descriptor); - } - logAddEventListener$1.names = ['log-addEventListener', - // aliases are needed for matching the related scriptlet converted into our syntax - 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell']; - logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject, getObjectEntries]; +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; - /* eslint-disable no-eval */ +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); - /** - * @scriptlet log-eval - * @description - * Logs all `eval()` or `new Function()` calls to the console. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('log-eval') - * ``` - */ - function logEval$1(source) { - // wrap eval function - const nativeEval = window.eval; - function evalWrapper(str) { - hit(source); - logMessage(source, "eval(\"".concat(str, "\")"), true); - return nativeEval(str); - } - window.eval = evalWrapper; +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; - // wrap new Function - const nativeFunction = window.Function; - function FunctionWrapper() { - hit(source); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - logMessage(source, "new Function(".concat(args.join(', '), ")"), true); - return nativeFunction.apply(this, [...args]); - } - FunctionWrapper.prototype = Object.create(nativeFunction.prototype); - FunctionWrapper.prototype.constructor = FunctionWrapper; - window.Function = FunctionWrapper; - } - logEval$1.names = ['log-eval']; - logEval$1.injections = [hit, logMessage]; - /** - * @scriptlet log - * @description - * A simple scriptlet which only purpose is to print arguments to console. - * This scriptlet can be helpful for debugging and troubleshooting other scriptlets. - * - * **Example** - * ``` - * example.org#%#//scriptlet('log', 'arg1', 'arg2') - * ``` - */ - function log$1() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - console.log(args); // eslint-disable-line no-console - } +/***/ }), - log$1.names = ['log']; +/***/ 5668: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable no-eval, no-extra-bind */ +var uncurryThis = __webpack_require__(1702); +var aCallable = __webpack_require__(9662); - /** - * @scriptlet noeval - * @description - * Prevents page to use eval. - * Notifies about attempts in the console - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#noevaljs- - * - * It also can be used as `$redirect` rules sometimes. - * See [redirect description](../wiki/about-redirects.md#noeval). - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('noeval') - * ``` - */ - function noeval$1(source) { - window.eval = function evalWrapper(s) { - hit(source); - logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); - }.bind(); - } - noeval$1.names = ['noeval', - // aliases are needed for matching the related scriptlet converted into our syntax - 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval']; - noeval$1.injections = [hit, logMessage]; +module.exports = function (object, key, method) { + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); + } catch (error) { /* empty */ } +}; - /* eslint-disable no-eval, no-extra-bind, func-names */ - /** - * @scriptlet prevent-eval-if - * @description - * Prevents page to use eval matching payload. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#noeval-ifjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-eval-if'[, search]) - * ``` - * - * - `search` — optional, string or regular expression matching the stringified eval payload; - * defaults to match all stringified eval payloads; - * invalid regular expression will cause exit and rule will not work - * - * **Examples** - * ``` - * ! Prevents eval if it matches 'test' - * example.org#%#//scriptlet('prevent-eval-if', 'test') - * ``` - */ - function preventEvalIf$1(source, search) { - const searchRegexp = toRegExp(search); - const nativeEval = window.eval; - window.eval = function (payload) { - if (!searchRegexp.test(payload.toString())) { - return nativeEval.call(window, payload); - } - hit(source); - return undefined; - }.bind(window); - } - preventEvalIf$1.names = ['prevent-eval-if', - // aliases are needed for matching the related scriptlet converted into our syntax - 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if']; - preventEvalIf$1.injections = [toRegExp, hit]; +/***/ }), - /* eslint-disable func-names, no-multi-assign */ +/***/ 1702: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @scriptlet prevent-fab-3.2.0 - * @description - * Prevents execution of the FAB script v3.2.0. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#fuckadblockjs-320- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-fab-3.2.0') - * ``` - */ - function preventFab$1(source) { - hit(source); +var NATIVE_BIND = __webpack_require__(4374); - // redefines Fab function for adblock detection - const Fab = function Fab() {}; - Fab.prototype.check = noopFunc; - Fab.prototype.clearEvent = noopFunc; - Fab.prototype.emitEvent = noopFunc; - Fab.prototype.on = function (a, b) { - if (!a) { - b(); - } - return this; - }; - Fab.prototype.onDetected = noopThis; - Fab.prototype.onNotDetected = function (a) { - a(); - return this; - }; - Fab.prototype.setOption = noopFunc; - Fab.prototype.options = { - set: noopFunc, - get: noopFunc - }; - const fab = new Fab(); - const getSetFab = { - get() { - return Fab; - }, - set() {} - }; - const getsetfab = { - get() { - return fab; - }, - set() {} - }; +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); - // redefined Fab data properties which if 'FuckAdBlock' variable exists - if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) { - window.FuckAdBlock = Fab; - } else { - // or redefined Fab accessor properties - Object.defineProperty(window, 'FuckAdBlock', getSetFab); - } - if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) { - window.BlockAdBlock = Fab; - } else { - Object.defineProperty(window, 'BlockAdBlock', getSetFab); - } - if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) { - window.SniffAdBlock = Fab; - } else { - Object.defineProperty(window, 'SniffAdBlock', getSetFab); - } - if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) { - window.fuckAdBlock = fab; - } else { - Object.defineProperty(window, 'fuckAdBlock', getsetfab); - } - if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) { - window.blockAdBlock = fab; - } else { - Object.defineProperty(window, 'blockAdBlock', getsetfab); - } - if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) { - window.sniffAdBlock = fab; - } else { - Object.defineProperty(window, 'sniffAdBlock', getsetfab); - } - } - preventFab$1.names = ['prevent-fab-3.2.0', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab']; - preventFab$1.injections = [hit, noopFunc, noopThis]; +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; - /* eslint-disable func-names, no-multi-assign */ - /** - * @scriptlet set-popads-dummy - * @description - * Sets static properties PopAds and popns. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#popads-dummyjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('set-popads-dummy') - * ``` - */ - function setPopadsDummy$1(source) { - delete window.PopAds; - delete window.popns; - Object.defineProperties(window, { - PopAds: { - get: function get() { - hit(source); - return {}; - } - }, - popns: { - get: function get() { - hit(source); - return {}; - } - } - }); - } - setPopadsDummy$1.names = ['set-popads-dummy', - // aliases are needed for matching the related scriptlet converted into our syntax - 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy']; - setPopadsDummy$1.injections = [hit]; +/***/ }), - /** - * @scriptlet prevent-popads-net - * @description - * Aborts on property write (PopAds, popns), throws reference error with random id. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#popadsnetjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-popads-net') - * ``` - */ - function preventPopadsNet$1(source) { - const rid = randomId(); - const throwError = function throwError() { - throw new ReferenceError(rid); - }; - delete window.PopAds; - delete window.popns; - Object.defineProperties(window, { - PopAds: { - set: throwError - }, - popns: { - set: throwError - } - }); - window.onerror = createOnErrorHandler(rid).bind(); - hit(source); - } - preventPopadsNet$1.names = ['prevent-popads-net', - // aliases are needed for matching the related scriptlet converted into our syntax - 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net']; - preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit]; +/***/ 5005: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable func-names */ +var global = __webpack_require__(7854); +var isCallable = __webpack_require__(614); - /** - * @scriptlet prevent-adfly - * @description - * Prevents anti-adblock scripts on adfly short links. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#adfly-defuserjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-adfly') - * ``` - */ - function preventAdfly$1(source) { - const isDigit = function isDigit(data) { - return /^\d$/.test(data); - }; - const handler = function handler(encodedURL) { - let evenChars = ''; - let oddChars = ''; - for (let i = 0; i < encodedURL.length; i += 1) { - if (i % 2 === 0) { - evenChars += encodedURL.charAt(i); - } else { - oddChars = encodedURL.charAt(i) + oddChars; - } - } - let data = (evenChars + oddChars).split(''); - for (let i = 0; i < data.length; i += 1) { - if (isDigit(data[i])) { - for (let ii = i + 1; ii < data.length; ii += 1) { - if (isDigit(data[ii])) { - // eslint-disable-next-line no-bitwise - const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10); - if (temp < 10) { - data[i] = temp.toString(); - } - i = ii; - break; - } - } - } - } - data = data.join(''); - const decodedURL = window.atob(data).slice(16, -16); - if (window.stop) { - window.stop(); - } - window.onbeforeunload = null; - window.location.href = decodedURL; - }; - let val; - // Do not apply handler more than one time - let applyHandler = true; - const result = setPropertyAccess(window, 'ysmm', { - configurable: false, - set: function set(value) { - if (applyHandler) { - applyHandler = false; - try { - if (typeof value === 'string') { - handler(value); - } - } catch (err) {} // eslint-disable-line no-empty - } +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; - val = value; - }, - get: function get() { - return val; - } - }); - if (result) { - hit(source); - } else { - logMessage(source, 'Failed to set up prevent-adfly scriptlet'); - } - } - preventAdfly$1.names = ['prevent-adfly', - // aliases are needed for matching the related scriptlet converted into our syntax - 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser']; - preventAdfly$1.injections = [setPropertyAccess, hit, logMessage]; +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; - /* eslint-disable max-len */ - /** - * @scriptlet debug-on-property-read - * @description - * This scriptlet is basically the same as [abort-on-property-read](#abort-on-property-read), but instead of aborting it starts the debugger. - * - * **It is not supposed to be used in production filter lists!** - * - * **Syntax** - * ``` - * ! Debug script if it tries to access `window.alert` - * example.org#%#//scriptlet('debug-on-property-read', 'alert') - * ! of `window.open` - * example.org#%#//scriptlet('debug-on-property-read', 'open') - * ``` - */ - /* eslint-enable max-len */ - function debugOnPropertyRead$1(source, property) { - if (!property) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - debugger; // eslint-disable-line no-debugger - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - setPropertyAccess(base, prop, { - get: abort, - set: noopFunc - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - debugOnPropertyRead$1.names = ['debug-on-property-read']; - debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject]; +/***/ }), - /* eslint-disable max-len */ - /** - * @scriptlet debug-on-property-write - * @description - * This scriptlet is basically the same as [abort-on-property-write](#abort-on-property-write), but instead of aborting it starts the debugger. - * - * **It is not supposed to be used in production filter lists!** - * - * **Syntax** - * ``` - * ! Aborts script when it tries to write in property `window.test` - * example.org#%#//scriptlet('debug-on-property-write', 'test') - * ``` - */ - /* eslint-enable max-len */ - function debugOnPropertyWrite$1(source, property) { - if (!property) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - debugger; // eslint-disable-line no-debugger - }; +/***/ 8173: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - setPropertyAccess(base, prop, { - set: abort - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - debugOnPropertyWrite$1.names = ['debug-on-property-write']; - debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; +var aCallable = __webpack_require__(9662); +var isNullOrUndefined = __webpack_require__(8554); - /* eslint-disable max-len */ - /** - * @scriptlet debug-current-inline-script - * @description - * This scriptlet is basically the same as [abort-current-inline-script](#abort-current-inline-script), but instead of aborting it starts the debugger. - * - * **It is not supposed to be used in production filter lists!** - * - * **Syntax** - *``` - * ! Aborts script when it tries to access `window.alert` - * example.org#%#//scriptlet('debug-current-inline-script', 'alert') - * ``` - */ - /* eslint-enable max-len */ - function debugCurrentInlineScript$1(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const getCurrentScript = function getCurrentScript() { - if ('currentScript' in document) { - return document.currentScript; - } - const scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); - if (!scriptEl) { - return; - } - let content = scriptEl.textContent; +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; - // We are using Node.prototype.textContent property descriptor - // to get the real script content - // even when document.currentScript.textContent is replaced. - // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 - try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; - content = textContentGetter.call(scriptEl); - } catch (e) {} // eslint-disable-line no-empty - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { - hit(source); - debugger; // eslint-disable-line no-debugger - } - }; +/***/ }), - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; +/***/ 7854: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - // The scriptlet might be executed before the chain property has been created - // (for instance, document.body before the HTML body was loaded). - // In this case we're checking whether the base element exists or not - // and if not, we simply exit without overriding anything. - // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 - if (base instanceof Object === false && base === null) { - const props = property.split('.'); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); - logMessage(message, source.verbose); - return; - } - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - let currentValue = base[prop]; - setPropertyAccess(base, prop, { - set: function set(value) { - abort(); - currentValue = value; - }, - get: function get() { - abort(); - return currentValue; - } - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - debugCurrentInlineScript$1.names = ['debug-current-inline-script']; - debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject]; +var check = function (it) { + return it && it.Math == Math && it; +}; - /* eslint-disable max-len */ - /** - * @scriptlet remove-attr - * @description - * Removes the specified attributes from DOM nodes. This scriptlet runs once when the page loads - * and after that periodically in order to DOM tree changes by default, - * or as specified by applying argument. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-attrjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('remove-attr', attrs[, selector, applying]) - * ``` - * - * - `attrs` — required, attribute or list of attributes joined by '|' - * - `selector` — optional, CSS selector, specifies DOM nodes from which the attributes will be removed - * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, defaults to 'asap stay'; possible flags: - * - `asap` — runs as fast as possible **once** - * - `complete` — runs **once** after the whole page has been loaded - * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes - * - * **Examples** - * 1. Removes by attribute - * ``` - * example.org#%#//scriptlet('remove-attr', 'example|test') - * ``` - * - * ```html - * - *
Some text
- * - * - *
Some text
- * ``` - * - * 2. Removes with specified selector - * ``` - * example.org#%#//scriptlet('remove-attr', 'example', 'div[class="inner"]') - * ``` - * - * ```html - * - *
- *
Some text
- *
- * - * - *
- *
Some text
- *
- * ``` - * - * 3. Using flags - * ``` - * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete') - * ``` - */ - /* eslint-enable max-len */ - function removeAttr$1(source, attrs, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; - if (!attrs) { - return; - } - attrs = attrs.split(/\s*\|\s*/); - if (!selector) { - selector = "[".concat(attrs.join('],['), "]"); - } - const rmattr = function rmattr() { - let nodes = []; - try { - nodes = [].slice.call(document.querySelectorAll(selector)); - } catch (e) { - logMessage(source, "Invalid selector arg: '".concat(selector, "'")); - } - let removed = false; - nodes.forEach(function (node) { - attrs.forEach(function (attr) { - node.removeAttribute(attr); - removed = true; - }); - }); - if (removed) { - hit(source); - } - }; - const flags = parseFlags(applying); - const run = function run() { - rmattr(); - if (!flags.hasFlag(flags.STAY)) { - return; - } - // 'true' for observing attributes - observeDOMChanges(rmattr, true); - }; - if (flags.hasFlag(flags.ASAP)) { - // https://github.com/AdguardTeam/Scriptlets/issues/245 - // Call rmattr on DOM content loaded - // to ensure that target node is present on the page - if (document.readyState === 'loading') { - window.addEventListener('DOMContentLoaded', rmattr, { - once: true - }); - } else { - rmattr(); - } - } - if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { - window.addEventListener('load', run, { - once: true - }); - } else if (flags.hasFlag(flags.STAY)) { - // Only call rmattr for single 'stay' flag - if (!applying.indexOf(' ') !== -1) { - rmattr(); - } - // 'true' for observing attributes - observeDOMChanges(rmattr, true); - } - } - removeAttr$1.names = ['remove-attr', - // aliases are needed for matching the related scriptlet converted into our syntax - 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra']; - removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage, - // following helpers should be imported and injected - // because they are used by helpers above - throttle]; +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof __webpack_require__.g == 'object' && __webpack_require__.g) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || this || Function('return this')(); - /* eslint-disable max-len */ - /** - * @scriptlet set-attr - * @description - * Sets the specified attribute on the specified elements. This scriptlet runs once when the page loads - * and after that and after that on DOM tree changes. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('set-attr', selector, attr[, value]) - * ``` - * - * - `selector` — required, CSS selector, specifies DOM nodes to set attributes on - * - `attr` — required, attribute to be set - * - `value` — the value to assign to the attribute, defaults to ''. Possible values: - * - `''` — empty string - * - positive decimal integer `<= 32767` - * - `true` / `false` in any case variation - * - * **Examples** - * 1. Set attribute by selector - * ``` - * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', '0') - * ``` - * - * ```html - * - * Some text - * - * - * Some text - * ``` - * 2. Set attribute without value - * ``` - * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute') - * ``` - * - * ```html - * - * Some text - * - * - * Some text - * ``` - * 3. Set attribute value to `TRUE` - * ``` - * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'TRUE') - * ``` - * - * ```html - * - * Some text - * - * - * Some text - * ``` - * 4. Set attribute value to `fAlse` - * ``` - * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'fAlse') - * ``` - * - * ```html - * - * Some text - * - * - * Some text - * ``` - */ - /* eslint-enable max-len */ - function setAttr$1(source, selector, attr) { - let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - if (!selector || !attr) { - return; - } - const allowedValues = ['true', 'false']; - // Drop strings that cant be parsed into number, negative numbers and numbers below 32767 - if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) { - return; - } - const setAttr = function setAttr() { - const nodes = [].slice.call(document.querySelectorAll(selector)); - let set = false; - nodes.forEach(function (node) { - node.setAttribute(attr, value); - set = true; - }); - if (set) { - hit(source); - } - }; - setAttr(); - observeDOMChanges(setAttr, true); - } - setAttr$1.names = ['set-attr']; - setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN, - // following helpers should be imported and injected - // because they are used by helpers above - throttle]; +/***/ }), - /* eslint-disable max-len */ - /** - * @scriptlet remove-class - * @description - * Removes the specified classes from DOM nodes. This scriptlet runs once after the page loads - * and after that periodically in order to DOM tree changes. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-classjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('remove-class', classes[, selector, applying]) - * ``` - * - * - `classes` — required, class or list of classes separated by '|' - * - `selector` — optional, CSS selector, specifies DOM nodes from which the classes will be removed. - * If there is no `selector`, each class of `classes` independently will be removed from all nodes which has one - * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, defaults to 'asap stay'; possible flags: - * - `asap` — runs as fast as possible **once** - * - `complete` — runs **once** after the whole page has been loaded - * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes - * - * **Examples** - * 1. Removes by classes - * ``` - * example.org#%#//scriptlet('remove-class', 'example|test') - * ``` - * - * ```html - * - *
Some text
- *
Some text
- *
Some text
- * - * - *
Some text
- *
Some text
- *
Some text
- * ``` - * - * 2. Removes with specified selector - * ``` - * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]') - * ``` - * - * ```html - * - *
- *
Some text
- *
- * - * - *
- *
Some text
- *
- * ``` - * - * 3. Using flags - * ``` - * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]', 'asap complete') - * ``` - */ - /* eslint-enable max-len */ +/***/ 2597: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - function removeClass$1(source, classNames, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; - if (!classNames) { - return; - } - classNames = classNames.split(/\s*\|\s*/); - let selectors = []; - if (!selector) { - selectors = classNames.map(function (className) { - return ".".concat(className); - }); - } - const removeClassHandler = function removeClassHandler() { - const nodes = new Set(); - if (selector) { - let foundNodes = []; - try { - foundNodes = [].slice.call(document.querySelectorAll(selector)); - } catch (e) { - logMessage(source, "Invalid selector arg: '".concat(selector, "'")); - } - foundNodes.forEach(function (n) { - return nodes.add(n); - }); - } else if (selectors.length > 0) { - selectors.forEach(function (s) { - const elements = document.querySelectorAll(s); - for (let i = 0; i < elements.length; i += 1) { - const element = elements[i]; - nodes.add(element); - } - }); - } - let removed = false; - nodes.forEach(function (node) { - classNames.forEach(function (className) { - if (node.classList.contains(className)) { - node.classList.remove(className); - removed = true; - } - }); - }); - if (removed) { - hit(source); - } - }; - const CLASS_ATTR_NAME = ['class']; - const flags = parseFlags(applying); - const run = function run() { - removeClassHandler(); - if (!flags.hasFlag(flags.STAY)) { - return; - } - // 'true' for observing attributes - // 'class' for observing only classes - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); - }; - if (flags.hasFlag(flags.ASAP)) { - // https://github.com/AdguardTeam/Scriptlets/issues/245 - // Call removeClassHandler on DOM content loaded - // to ensure that target node is present on the page - if (document.readyState === 'loading') { - window.addEventListener('DOMContentLoaded', removeClassHandler, { - once: true - }); - } else { - removeClassHandler(); - } - } - if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { - window.addEventListener('load', run, { - once: true - }); - } else if (flags.hasFlag(flags.STAY)) { - // Only call removeClassHandler for single 'stay' flag - if (!applying.indexOf(' ') !== -1) { - removeClassHandler(); - } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); - } - } - removeClass$1.names = ['remove-class', - // aliases are needed for matching the related scriptlet converted into our syntax - 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc']; - removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags, - // following helpers should be imported and injected - // because they are used by helpers above - throttle]; +var uncurryThis = __webpack_require__(1702); +var toObject = __webpack_require__(7908); - /** - * @scriptlet disable-newtab-links - * @description - * Prevents opening new tabs and windows if there is `target` attribute in element. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#disable-newtab-linksjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('disable-newtab-links') - * ``` - */ - function disableNewtabLinks$1(source) { - document.addEventListener('click', function (ev) { - let target = ev.target; - while (target !== null) { - if (target.localName === 'a' && target.hasAttribute('target')) { - ev.stopPropagation(); - ev.preventDefault(); - hit(source); - break; - } - target = target.parentNode; - } - }); - } - disableNewtabLinks$1.names = ['disable-newtab-links', - // aliases are needed for matching the related scriptlet converted into our syntax - 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links']; - disableNewtabLinks$1.injections = [hit]; +var hasOwnProperty = uncurryThis({}.hasOwnProperty); - /* eslint-disable max-len */ - /** - * @scriptlet adjust-setInterval - * @description - * Adjusts delay for specified setInterval() callbacks. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-setinterval-boosterjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('adjust-setInterval'[, matchCallback [, matchDelay[, boost]]]) - * ``` - * - * - `matchCallback` — optional, string or regular expression for stringified callback matching; - * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work - * - `matchDelay` — optional, defaults to 1000, matching setInterval delay; decimal integer OR '*' for any delay - * - `boost` — optional, default to 0.05, float, capped at 1000 times for up and 50 for down (0.001...50), setInterval delay multiplier - * - * **Examples** - * 1. Adjust all setInterval() x20 times where delay equal 1000ms: - * ``` - * example.org#%#//scriptlet('adjust-setInterval') - * ``` - * - * 2. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 1000ms - * ``` - * example.org#%#//scriptlet('adjust-setInterval', 'example') - * ``` - * - * 3. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 400ms - * ``` - * example.org#%#//scriptlet('adjust-setInterval', 'example', '400') - * ``` - * - * 4. Slow down setInterval() x2 times where callback matched with `example` and delay equal 1000ms - * ``` - * example.org#%#//scriptlet('adjust-setInterval', 'example', '', '2') - * ``` - * 5. Adjust all setInterval() x50 times where delay equal 2000ms - * ``` - * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.02') - * ``` - * 6. Adjust all setInterval() x1000 times where delay equal 2000ms - * ``` - * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.001') - * ``` - * 7. Adjust all setInterval() x50 times where delay is randomized - * ``` - * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02') - * ``` - */ - /* eslint-enable max-len */ - function adjustSetInterval$1(source, matchCallback, matchDelay, boost) { - const nativeSetInterval = window.setInterval; - const matchRegexp = toRegExp(matchCallback); - const intervalWrapper = function intervalWrapper(callback, delay) { - // https://github.com/AdguardTeam/Scriptlets/issues/221 - if (!isValidCallback(callback)) { - // eslint-disable-next-line max-len - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); - logMessage(source, message); - } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { - delay *= getBoostMultiplier(boost); - hit(source); - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeSetInterval.apply(window, [callback, delay, ...args]); - }; - window.setInterval = intervalWrapper; - } - adjustSetInterval$1.names = ['adjust-setInterval', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib']; - adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, - // following helpers should be injected as helpers above use them - nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; - /* eslint-disable max-len */ - /** - * @scriptlet adjust-setTimeout - * @description - * Adjusts delay for specified setTimeout() callbacks. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-settimeout-boosterjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('adjust-setTimeout'[, matchCallback [, matchDelay[, boost]]]) - * ``` - * - * - `matchCallback` — optional, string or regular expression for stringified callback matching; - * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work - * - `matchDelay` — optional, defaults to 1000, matching setTimeout delay; decimal integer OR '*' for any delay - * - `boost` — optional, default to 0.05, float, capped at 1000 times for up and 50 for down (0.001...50), setTimeout delay multiplier - * - * **Examples** - * 1. Adjust all setTimeout() x20 times where timeout equal 1000ms: - * ``` - * example.org#%#//scriptlet('adjust-setTimeout') - * ``` - * - * 2. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 1000ms - * ``` - * example.org#%#//scriptlet('adjust-setTimeout', 'example') - * ``` - * - * 3. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 400ms - * ``` - * example.org#%#//scriptlet('adjust-setTimeout', 'example', '400') - * ``` - * - * 4. Slow down setTimeout() x2 times where callback matched with `example` and timeout equal 1000ms - * ``` - * example.org#%#//scriptlet('adjust-setTimeout', 'example', '', '2') - * ``` - * 5. Adjust all setTimeout() x50 times where timeout equal 2000ms - * ``` - * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.02') - * ``` - * 6. Adjust all setTimeout() x1000 times where timeout equal 2000ms - * ``` - * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.001') - * ``` - * 7. Adjust all setTimeout() x20 times where callback matched with `test` and timeout is randomized - * ``` - * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*') - * ``` - */ - /* eslint-enable max-len */ - function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) { - const nativeSetTimeout = window.setTimeout; - const matchRegexp = toRegExp(matchCallback); - const timeoutWrapper = function timeoutWrapper(callback, delay) { - // https://github.com/AdguardTeam/Scriptlets/issues/221 - if (!isValidCallback(callback)) { - // eslint-disable-next-line max-len - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); - logMessage(source, message); - } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { - delay *= getBoostMultiplier(boost); - hit(source); - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeSetTimeout.apply(window, [callback, delay, ...args]); - }; - window.setTimeout = timeoutWrapper; - } - adjustSetTimeout$1.names = ['adjust-setTimeout', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb']; - adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, - // following helpers should be injected as helpers above use them - nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; - /* eslint-disable max-len */ - /** - * @scriptlet dir-string - * @description - * Wraps the `console.dir` API to call the `toString` method of the argument. - * There are several adblock circumvention systems that detect browser devtools - * and hide themselves. Therefore, if we force them to think - * that devtools are open (using this scriptlet), - * it will automatically disable the adblock circumvention script. - * - * Related ABP source: - * https://github.com/adblockplus/adblockpluscore/blob/6b2a309054cc23432102b85d13f12559639ef495/lib/content/snippets.js#L766 - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('dir-string'[, times]) - * ``` - * - `times` — optional, the number of times to call the `toString` method of the argument to `console.dir` - * - * **Example** - * ``` - * ! Run 2 times - * example.org#%#//scriptlet('dir-string', '2') - * ``` - */ - /* eslint-enable max-len */ - function dirString$1(source, times) { - const _console = console, - dir = _console.dir; - function dirWrapper(object) { - if (typeof dir === 'function') { - dir.call(this, object); - } - hit(source); - } - // eslint-disable-next-line no-console - console.dir = dirWrapper; - } - dirString$1.names = ['dir-string', 'abp-dir-string']; - dirString$1.injections = [hit]; +/***/ }), - /* eslint-disable max-len */ - /** - * @scriptlet json-prune - * @description - * Removes specified properties from the result of calling JSON.parse and returns the caller - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#json-prunejs- - * - * Related ABP source: - * https://github.com/adblockplus/adblockpluscore/blob/master/lib/content/snippets.js#L1285 - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('json-prune'[, propsToRemove [, obligatoryProps [, stack]]]) - * ``` - * - * - `propsToRemove` — optional, string of space-separated properties to remove - * - `obligatoryProps` — optional, string of space-separated properties which must be all present for the pruning to occur - * - `stack` — optional, string or regular expression that must match the current function call stack trace; - * if regular expression is invalid it will be skipped - * - * > Note please that you can use wildcard `*` for chain property name. - * e.g. 'ad.*.src' instead of 'ad.0.src ad.1.src ad.2.src ...' - * - * **Examples** - * 1. Removes property `example` from the results of JSON.parse call - * ``` - * example.org#%#//scriptlet('json-prune', 'example') - * ``` - * - * For instance, the following call will return `{ one: 1}` - * - * ```html - * JSON.parse('{"one":1,"example":true}') - * ``` - * - * 2. If there are no specified properties in the result of JSON.parse call, pruning will NOT occur - * ``` - * example.org#%#//scriptlet('json-prune', 'one', 'obligatoryProp') - * ``` - * - * For instance, the following call will return `{ one: 1, two: 2}` - * - * ```html - * JSON.parse('{"one":1,"two":2}') - * ``` - * - * 3. A property in a list of properties can be a chain of properties - * - * ``` - * example.org#%#//scriptlet('json-prune', 'a.b', 'adpath.url.first') - * ``` - * - * 4. Removes property `content.ad` from the results of JSON.parse call if its error stack trace contains `test.js` - * ``` - * example.org#%#//scriptlet('json-prune', 'content.ad', '', 'test.js') - * ``` - * - * 5. A property in a list of properties can be a chain of properties with wildcard in it - * - * ``` - * example.org#%#//scriptlet('json-prune', 'content.*.media.src', 'content.*.media.preroll') - * ``` - * - * 6. Call with no arguments will log the current hostname and json payload at the console - * ``` - * example.org#%#//scriptlet('json-prune') - * ``` - * - * 7. Call with only second argument will log the current hostname and matched json payload at the console - * ``` - * example.org#%#//scriptlet('json-prune', '', '"id":"117458"') - * ``` - */ - /* eslint-enable max-len */ - function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) { - if (!!stack && !matchStackTrace(stack, new Error().stack)) { - return; - } - const prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; - const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { - if (!root) { - return false; - } - let shouldProcess; +/***/ 3501: +/***/ ((module) => { - // Only log hostname and matched JSON payload if only second argument is present - if (prunePaths.length === 0 && requiredPaths.length > 0) { - const rootString = JSON.stringify(root); - const matchRegex = toRegExp(requiredPaths.join('')); - const shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === 'object') { - logMessage(source, root, true, false); - } - shouldProcess = false; - return shouldProcess; - } - } - for (let i = 0; i < requiredPaths.length; i += 1) { - const requiredPath = requiredPaths[i]; - const lastNestedPropName = requiredPath.split('.').pop(); - const hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1; +module.exports = {}; - // if the path has wildcard, getPropertyInChain should 'look through' chain props - const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); - // start value of 'shouldProcess' due to checking below - shouldProcess = !hasWildcard; - for (let i = 0; i < details.length; i += 1) { - if (hasWildcard) { - // if there is a wildcard, - // at least one (||) of props chain should be present in object - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess; - } else { - // otherwise each one (&&) of them should be there - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess; - } - } - } - return shouldProcess; - } +/***/ }), - /** - * Prunes properties of 'root' object - * - * @param {Object} root - * @returns {Object} pruned root - */ - const jsonPruner = function jsonPruner(root) { - if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === 'object') { - logMessage(source, root, true, false); - } - return root; - } - try { - if (isPruningNeeded(root) === false) { - return root; - } +/***/ 490: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // if pruning is needed, we check every input pathToRemove - // and delete it if root has it - prunePaths.forEach(function (path) { - const ownerObjArr = getWildcardPropertyInChain(root, path, true); - ownerObjArr.forEach(function (ownerObj) { - if (ownerObj !== undefined && ownerObj.base) { - delete ownerObj.base[ownerObj.prop]; - hit(source); - } - }); - }); - } catch (e) { - logMessage(source, e); - } - return root; - }; - const nativeJSONParse = JSON.parse; - const jsonParseWrapper = function jsonParseWrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - // dealing with stringified json in args, which should be parsed. - // so we call nativeJSONParse as JSON.parse which is bound to JSON object - const root = nativeJSONParse.apply(JSON, args); - return jsonPruner(root); - }; +var getBuiltIn = __webpack_require__(5005); - // JSON.parse mocking - jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); - JSON.parse = jsonParseWrapper; - const nativeResponseJson = Response.prototype.json; - // eslint-disable-next-line func-names - const responseJsonWrapper = function responseJsonWrapper() { - const promise = nativeResponseJson.apply(this); - return promise.then(function (obj) { - return jsonPruner(obj); - }); - }; +module.exports = getBuiltIn('document', 'documentElement'); - // do nothing if browser does not support Response (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/API/Response - if (typeof Response === 'undefined') { - return; - } - Response.prototype.json = responseJsonWrapper; - } - jsonPrune$1.names = ['json-prune', - // aliases are needed for matching the related scriptlet converted into our syntax - 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune']; - jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, - // following helpers are needed for helpers above - toRegExp, getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; - /* eslint-disable max-len */ - /** - * @scriptlet prevent-requestAnimationFrame - * @description - * Prevents a `requestAnimationFrame` call - * if the text of the callback is matching the specified search string which does not start with `!`; - * otherwise mismatched calls should be defused. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-requestanimationframe-ifjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-requestAnimationFrame'[, search]) - * ``` - * - * - `search` — optional, string or regular expression; invalid regular expression will be skipped and all callbacks will be matched. - * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. - * If do not start with `!`, the stringified callback will be matched. - * - * Call with no argument will log all requestAnimationFrame calls while debugging. - * So do not use the scriptlet without any parameter in production filter lists. - * - * **Examples** - * 1. Prevents `requestAnimationFrame` calls if the callback matches `/\.test/`. - * ```bash - * example.org#%#//scriptlet('prevent-requestAnimationFrame', '/\.test/') - * ``` - * - * For instance, the following call will be prevented: - * ```javascript - * var times = 0; - * requestAnimationFrame(function change() { - * window.test = 'new value'; - * if (times < 2) { - * times += 1; - * requestAnimationFrame(change); - * } - * }); - * ``` - * 2. Prevents `requestAnimationFrame` calls if **does not match** 'check'. - * ```bash - * example.org#%#//scriptlet('prevent-requestAnimationFrame', '!check') - * ``` - * - * For instance, only the first call will be prevented: - * - * ```javascript - * var timesFirst = 0; - * requestAnimationFrame(function changeFirst() { - * window.check = 'should not be prevented'; - * if (timesFirst < 2) { - * timesFirst += 1; - * requestAnimationFrame(changeFirst); - * } - * }); - * - * var timesSecond = 0; - * requestAnimationFrame(function changeSecond() { - * window.second = 'should be prevented'; - * if (timesSecond < 2) { - * timesSecond += 1; - * requestAnimationFrame(changeSecond); - * } - * }); - * ``` - */ - /* eslint-enable max-len */ +/***/ }), - function preventRequestAnimationFrame$1(source, match) { - const nativeRequestAnimationFrame = window.requestAnimationFrame; +/***/ 4664: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // logs requestAnimationFrame to console if no arguments have been specified - const shouldLog = typeof match === 'undefined'; - const _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - const rafWrapper = function rafWrapper(callback) { - let shouldPrevent = false; - if (shouldLog) { - hit(source); - logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); - } else if (isValidCallback(callback) && isValidStrPattern(match)) { - shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; - } - if (shouldPrevent) { - hit(source); - return nativeRequestAnimationFrame(noopFunc); - } - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeRequestAnimationFrame.apply(window, [callback, ...args]); - }; - window.requestAnimationFrame = rafWrapper; - } - preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame', - // aliases are needed for matching the related scriptlet converted into our syntax - 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif']; - preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage, - // following helpers should be injected as helpers above use them - escapeRegExp, toRegExp, startsWith$1]; +var DESCRIPTORS = __webpack_require__(9781); +var fails = __webpack_require__(7293); +var createElement = __webpack_require__(317); - /* eslint-disable max-len */ - /** - * @scriptlet set-cookie - * @description - * Sets a cookie with the specified name, value, and path. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('set-cookie', name, value[, path]) - * ``` - * - * - `name` — required, cookie name to be set - * - `value` — required, cookie value; possible values: - * - number `>= 0 && <= 15` - * - one of the predefined constants: - * - `true` / `True` - * - `false` / `False` - * - `yes` / `Yes` / `Y` - * - `no` - * - `ok` / `OK` - * - `path` — optional, cookie path, defaults to `/`; possible values: - * - `/` — root path - * - `none` — to set no path at all - * - * **Examples** - * ``` - * example.org#%#//scriptlet('set-cookie', 'CookieConsent', '1') - * - * example.org#%#//scriptlet('set-cookie', 'gdpr-settings-cookie', 'true') - * - * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none') - * ``` - */ - /* eslint-enable max-len */ - function setCookie$1(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - const validValue = getLimitedCookieValue(value); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); - return; - } - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { - return; - } - hit(source); - document.cookie = cookieToSet; - } - setCookie$1.names = ['set-cookie']; - setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a != 7; +}); - /** - * @scriptlet set-cookie-reload - * @description - * Sets a cookie with the specified name and value, and path, - * and reloads the current page after the cookie setting. - * If reloading option is not needed, use [set-cookie](#set-cookie) scriptlet. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('set-cookie-reload', name, value[, path]) - * ``` - * - * - `name` — required, cookie name to be set - * - `value` — required, cookie value; possible values: - * - number `>= 0 && <= 15` - * - one of the predefined constants: - * - `true` / `True` - * - `false` / `False` - * - `yes` / `Yes` / `Y` - * - `no` - * - `ok` / `OK` - * - `path` — optional, cookie path, defaults to `/`; possible values: - * - `/` — root path - * - `none` — to set no path at all - * - * **Examples** - * ``` - * example.org#%#//scriptlet('set-cookie-reload', 'checking', 'ok') - * - * example.org#%#//scriptlet('set-cookie-reload', 'gdpr-settings-cookie', '1') - * - * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none') - * ``` - */ - function setCookieReload$1(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - if (isCookieSetWithValue(document.cookie, name, value)) { - return; - } - const validValue = getLimitedCookieValue(value); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); - return; - } - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { - return; - } - document.cookie = cookieToSet; - hit(source); - // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } - } - setCookieReload$1.names = ['set-cookie-reload']; - setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; +/***/ }), - /** - * @scriptlet hide-in-shadow-dom - * @description - * Hides elements inside open shadow DOM elements. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('hide-in-shadow-dom', selector[, baseSelector]) - * ``` - * - * - `selector` — required, CSS selector of element in shadow-dom to hide - * - `baseSelector` — optional, selector of specific page DOM element, - * narrows down the part of the page DOM where shadow-dom host supposed to be, - * defaults to document.documentElement - * - * > `baseSelector` should match element of the page DOM, but not of shadow DOM - * - * **Examples** - * ``` - * ! hides menu bar - * virustotal.com#%#//scriptlet('hide-in-shadow-dom', 'iron-pages', 'vt-virustotal-app') - * - * ! hides floating element - * virustotal.com#%#//scriptlet('hide-in-shadow-dom', 'vt-ui-contact-fab') - * ``` - */ - function hideInShadowDom$1(source, selector, baseSelector) { - // do nothing if browser does not support ShadowRoot - // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot - if (!Element.prototype.attachShadow) { - return; - } - const hideElement = function hideElement(targetElement) { - const DISPLAY_NONE_CSS = 'display:none!important;'; - targetElement.style.cssText = DISPLAY_NONE_CSS; - }; +/***/ 8361: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Handles shadow-dom piercing and hiding of found elements - */ - const hideHandler = function hideHandler() { - // start value of shadow-dom hosts for the page dom - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); +var uncurryThis = __webpack_require__(1702); +var fails = __webpack_require__(7293); +var classof = __webpack_require__(4326); - // if there is shadow-dom host, they should be explored - while (hostElements.length !== 0) { - let isHidden = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - targets.forEach(function (targetEl) { - hideElement(targetEl); - isHidden = true; - }); - if (isHidden) { - hit(source); - } +var $Object = Object; +var split = uncurryThis(''.split); - // continue to pierce for inner shadow-dom hosts - // and search inside them while the next iteration - hostElements = innerHosts; - } - }; - hideHandler(); - observeDOMChanges(hideHandler, true); - } - hideInShadowDom$1.names = ['hide-in-shadow-dom']; - hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, - // following helpers should be imported and injected - // because they are used by helpers above - flatten, throttle]; +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split(it, '') : $Object(it); +} : $Object; - /** - * @scriptlet remove-in-shadow-dom - * @description - * Removes elements inside open shadow DOM elements. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('remove-in-shadow-dom', selector[, baseSelector]) - * ``` - * - * - `selector` — required, CSS selector of element in shadow-dom to remove - * - `baseSelector` — optional, selector of specific page DOM element, - * narrows down the part of the page DOM where shadow-dom host supposed to be, - * defaults to document.documentElement - * - * > `baseSelector` should match element of the page DOM, but not of shadow DOM - * - * **Examples** - * ``` - * ! removes menu bar - * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'iron-pages', 'vt-virustotal-app') - * - * ! removes floating element - * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab') - * ``` - */ - function removeInShadowDom$1(source, selector, baseSelector) { - // do nothing if browser does not support ShadowRoot - // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot - if (!Element.prototype.attachShadow) { - return; - } - const removeElement = function removeElement(targetElement) { - targetElement.remove(); - }; - /** - * Handles shadow-dom piercing and removing of found elements - */ - const removeHandler = function removeHandler() { - // start value of shadow-dom hosts for the page dom - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); +/***/ }), - // if there is shadow-dom host, they should be explored - while (hostElements.length !== 0) { - let isRemoved = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - targets.forEach(function (targetEl) { - removeElement(targetEl); - isRemoved = true; - }); - if (isRemoved) { - hit(source); - } +/***/ 9587: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // continue to pierce for inner shadow-dom hosts - // and search inside them while the next iteration - hostElements = innerHosts; - } - }; - removeHandler(); - observeDOMChanges(removeHandler, true); - } - removeInShadowDom$1.names = ['remove-in-shadow-dom']; - removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, - // following helpers should be imported and injected - // because they are used by helpers above - flatten, throttle]; +var isCallable = __webpack_require__(614); +var isObject = __webpack_require__(111); +var setPrototypeOf = __webpack_require__(7674); - /* eslint-disable max-len */ - /** - * @scriptlet prevent-fetch - * @description - * Prevents `fetch` calls if **all** given parameters match - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-fetch-ifjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-fetch'[, propsToMatch[, responseBody[, responseType]]]) - * ``` - * - * - `propsToMatch` — optional, string of space-separated properties to match; possible props: - * - string or regular expression for matching the URL passed to fetch call; empty string, wildcard `*` or invalid regular expression will match all fetch calls - * - colon-separated pairs `name:value` where - * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters) - * - `value` is string or regular expression for matching the value of the option passed to fetch call; invalid regular expression will cause any value matching - * - `responseBody` — optional, string for defining response body value, defaults to `emptyObj`. Possible values: - * - `emptyObj` — empty object - * - `emptyArr` — empty array - * - `responseType` — optional, string for defining response type, defaults to `default`. Possible values: - * - `default` - * - `opaque` - * - * > Usage with no arguments will log fetch calls to browser console; - * which is useful for debugging but not permitted for production filter lists. - * - * **Examples** - * 1. Log all fetch calls - * ``` - * example.org#%#//scriptlet('prevent-fetch') - * ``` - * - * 2. Prevent all fetch calls - * ``` - * example.org#%#//scriptlet('prevent-fetch', '*') - * OR - * example.org#%#//scriptlet('prevent-fetch', '') - * ``` - * - * 3. Prevent fetch call for specific url - * ``` - * example.org#%#//scriptlet('prevent-fetch', '/url\\.part/') - * ``` - * - * 4. Prevent fetch call for specific request method - * ``` - * example.org#%#//scriptlet('prevent-fetch', 'method:HEAD') - * ``` - * - * 5. Prevent fetch call for specific url and request method - * ``` - * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/') - * ``` - * - * 6. Prevent fetch call and specify response body value - * ``` - * ! Specify response body for fetch call to a specific url - * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/', 'emptyArr') - * - * ! Specify response body for all fetch calls - * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr') - * ``` - * - * 7. Prevent all fetch calls and specify response type value - * ``` - * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque') - * ``` - */ - /* eslint-enable max-len */ - function preventFetch$1(source, propsToMatch) { - let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj'; - let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default'; - // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { - return; - } - let strResponseBody; - if (responseBody === '' || responseBody === 'emptyObj') { - strResponseBody = '{}'; - } else if (responseBody === 'emptyArr') { - strResponseBody = '[]'; - } else { - return; - } +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; - // Skip disallowed response types - if (!(responseType === 'default' || responseType === 'opaque')) { - logMessage(source, "Invalid parameter: ".concat(responseType)); - return; - } - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - let shouldPrevent = false; - const fetchData = getFetchData(args); - if (typeof propsToMatch === 'undefined') { - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); - if (shouldPrevent) { - hit(source); - return noopPromiseResolve(strResponseBody, fetchData.url, responseType); - } - return Reflect.apply(target, thisArg, args); - }; - const fetchHandler = { - apply: handlerWrapper - }; - fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign - } - preventFetch$1.names = ['prevent-fetch', - // aliases are needed for matching the related scriptlet converted into our syntax - 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if']; - preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; +/***/ }), - /* eslint-disable max-len */ - /** - * @scriptlet set-local-storage-item - * @description - * Adds specified key and its value to localStorage object, or updates the value of the key if it already exists. - * Scriptlet won't set item if storage is full. - * - * **Syntax** - * ``` - * example.com#%#//scriptlet('set-local-storage-item', 'key', 'value') - * ``` - * - * - `key` — required, key name to be set. - * - `value` — required, key value; possible values: - * - positive decimal integer `<= 32767` - * - one of the predefined constants: - * - `undefined` - * - `false` - * - `true` - * - `null` - * - `emptyObj` — empty object - * - `emptyArr` — empty array - * - `''` — empty string - * - `yes` - * - `no` - * - * **Examples** - * ``` - * example.org#%#//scriptlet('set-local-storage-item', 'player.live.current.mute', 'false') - * - * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1') - * ``` - */ - /* eslint-enable max-len */ +/***/ 2788: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - function setLocalStorageItem$1(source, key, value) { - if (typeof key === 'undefined') { - logMessage(source, 'Item key should be specified.'); - return; - } - let validValue; - try { - validValue = getLimitedStorageItemValue(value); - } catch (_unused) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return; - } - const _window = window, - localStorage = _window.localStorage; - setStorageItem(source, localStorage, key, validValue); - hit(source); - } - setLocalStorageItem$1.names = ['set-local-storage-item']; - setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; +var uncurryThis = __webpack_require__(1702); +var isCallable = __webpack_require__(614); +var store = __webpack_require__(5465); - /* eslint-disable max-len */ - /** - * @scriptlet set-session-storage-item - * @description - * Adds specified key and its value to sessionStorage object, or updates the value of the key if it already exists. - * Scriptlet won't set item if storage is full. - * - * **Syntax** - * ``` - * example.com#%#//scriptlet('set-session-storage-item', 'key', 'value') - * ``` - * - * - `key` — required, key name to be set. - * - `value` — required, key value; possible values: - * - positive decimal integer `<= 32767` - * - one of the predefined constants: - * - `undefined` - * - `false` - * - `true` - * - `null` - * - `emptyObj` — empty object - * - `emptyArr` — empty array - * - `''` — empty string - * - `yes` - * - `no` - * - * **Examples** - * ``` - * example.org#%#//scriptlet('set-session-storage-item', 'player.live.current.mute', 'false') - * - * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1') - * ``` - */ - /* eslint-enable max-len */ +var functionToString = uncurryThis(Function.toString); - function setSessionStorageItem$1(source, key, value) { - if (typeof key === 'undefined') { - logMessage(source, 'Item key should be specified.'); - return; - } - let validValue; - try { - validValue = getLimitedStorageItemValue(value); - } catch (_unused) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return; - } - const _window = window, - sessionStorage = _window.sessionStorage; - setStorageItem(source, sessionStorage, key, validValue); - hit(source); - } - setSessionStorageItem$1.names = ['set-session-storage-item']; - setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} - /* eslint-disable max-len */ - /** - * @scriptlet abort-on-stack-trace - * @description - * Aborts a script when it attempts to utilize (read or write to) the specified property and it's error stack trace contains given value. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock-for-firefox-legacy/commit/7099186ae54e70b588d5e99554a05d783cabc8ff - * - * **Syntax** - * ``` - * example.com#%#//scriptlet('abort-on-stack-trace', property, stack) - * ``` - * - * - `property` — required, path to a property. The property must be attached to window. - * - `stack` — required, string that must match the current function call stack trace. - * - values to abort inline or injected script, accordingly: - * - `inlineScript` - * - `injectedScript` - * - * **Examples** - * ``` - * ! Aborts script when it tries to access `window.Ya` and it's error stack trace contains `test.js` - * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'test.js') - * - * ! Aborts script when it tries to access `window.Ya.videoAd` and it's error stack trace contains `test.js` - * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya.videoAd', 'test.js') - * - * ! Aborts script when stack trace matches with any of these parameters - * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexFuncName') - * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexScriptName') - * - * ! Aborts script when it tries to access `window.Ya` and it's an inline script - * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'inlineScript') - * - * ! Aborts script when it tries to access `window.Ya` and it's an injected script - * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript') - * ``` - */ - /* eslint-enable max-len */ - function abortOnStackTrace$1(source, property, stack) { - if (!property || !stack) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - throw new ReferenceError(rid); - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { - logMessage(source, "Invalid parameter: ".concat(stack)); - return; - } +module.exports = store.inspectSource; - // Prevent infinite loops when trapping prop used by helpers in getter/setter - const descriptorWrapper = Object.assign(getDescriptorAddon(), { - value: base[prop], - get() { - if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { - abort(); - } - return this.value; - }, - set(newValue) { - if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { - abort(); - } - this.value = newValue; - } - }); - setPropertyAccess(base, prop, { - // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values - get() { - return descriptorWrapper.get.call(descriptorWrapper); - }, - set(newValue) { - descriptorWrapper.set.call(descriptorWrapper, newValue); - } - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - abortOnStackTrace$1.names = ['abort-on-stack-trace', - // aliases are needed for matching the related scriptlet converted into our syntax - 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace']; - abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith$1, shouldAbortInlineOrInjectedScript]; - /* eslint-disable max-len */ - /** - * @scriptlet log-on-stack-trace - * @description - * This scriptlet is basically the same as [abort-on-stack-trace](#abort-on-stack-trace), but instead of aborting it logs: - * - function and source script names pairs that access the given property - * - was that get or set attempt - * - script being injected or inline - * - * **Syntax** - * ``` - * example.com#%#//scriptlet('log-on-stack-trace', 'property') - * ``` - * - * - `property` — required, path to a property. The property must be attached to window. - */ - /* eslint-enable max-len */ - function logOnStacktrace$1(source, property) { - if (!property) { - return; - } - const refineStackTrace = function refineStackTrace(stackString) { - // Split stack trace string by lines and remove first two elements ('Error' and getter call) - // Remove ' at ' at the start of each string - const stackSteps = stackString.split('\n').slice(2).map(function (line) { - return line.replace(/ {4}at /, ''); - }); - // Trim each line extracting funcName : fullPath pair - const logInfoArray = stackSteps.map(function (line) { - let funcName; - let funcFullPath; - /* eslint-disable-next-line no-useless-escape */ - const reg = /\(([^\)]+)\)/; - const regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; - if (line.match(reg)) { - funcName = line.split(' ').slice(0, -1).join(' '); - /* eslint-disable-next-line prefer-destructuring */ - funcFullPath = line.match(reg)[1]; - } else if (line.match(regFirefox)) { - funcName = line.split('@').slice(0, -1).join(' '); - /* eslint-disable-next-line prefer-destructuring */ - funcFullPath = line.match(regFirefox)[2]; - } else { - // For when func name is not available - funcName = 'function name is not available'; - funcFullPath = line; - } - return [funcName, funcFullPath]; - }); - // Convert array into object for better display using console.table - const logInfoObject = {}; - logInfoArray.forEach(function (pair) { - /* eslint-disable-next-line prefer-destructuring */ - logInfoObject[pair[0]] = pair[1]; - }); - return logInfoObject; - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - let value = base[prop]; - /* eslint-disable no-console */ - setPropertyAccess(base, prop, { - get() { - hit(source); - logMessage(source, "Get ".concat(prop), true); - console.table(refineStackTrace(new Error().stack)); - return value; - }, - set(newValue) { - hit(source); - logMessage(source, "Set ".concat(prop), true); - console.table(refineStackTrace(new Error().stack)); - value = newValue; - } - }); - /* eslint-enable no-console */ - }; +/***/ }), - setChainPropAccess(window, property); - } - logOnStacktrace$1.names = ['log-on-stack-trace']; - logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject]; +/***/ 8340: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable max-len */ - /** - * @scriptlet prevent-xhr - * @description - * Prevents `xhr` calls if **all** given parameters match. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-xhr-ifjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-xhr'[, propsToMatch[, randomize]]) - * ``` - * - * - `propsToMatch` — optional, string of space-separated properties to match; possible props: - * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call; empty string or wildcard `*` for all `XMLHttpRequest.open()` calls match - * - colon-separated pairs `name:value` where - * - `name` is XMLHttpRequest object property name - * - `value` is string or regular expression for matching the value of the option passed to `XMLHttpRequest.open()` call - * - `randomize` — defaults to `false` for empty responseText, optional argument to randomize responseText of matched XMLHttpRequest's response; possible values: - * - `true` to randomize responseText, random alphanumeric string of 10 symbols - * - colon-separated pair `name:value` string value to customize responseText data where - * - `name` — only `length` supported for now - * - `value` — range on numbers, for example `100-300`, limited to 500000 characters - * - * > Usage with no arguments will log XMLHttpRequest objects to browser console; - * which is useful for debugging but not allowed for production filter lists. - * - * **Examples** - * 1. Log all XMLHttpRequests - * ``` - * example.org#%#//scriptlet('prevent-xhr') - * ``` - * - * 2. Prevent all XMLHttpRequests - * ``` - * example.org#%#//scriptlet('prevent-xhr', '*') - * example.org#%#//scriptlet('prevent-xhr', '') - * ``` - * - * 3. Prevent XMLHttpRequests for specific url - * ``` - * example.org#%#//scriptlet('prevent-xhr', 'example.org') - * ``` - * - * 4. Prevent XMLHttpRequests for specific request method - * ``` - * example.org#%#//scriptlet('prevent-xhr', 'method:HEAD') - * ``` - * - * 5. Prevent XMLHttpRequests for specific url and specified request methods - * ``` - * example.org#%#//scriptlet('prevent-xhr', 'example.org method:/HEAD|GET/') - * ``` - * - * 6. Prevent XMLHttpRequests for specific url and randomize it's response text - * ``` - * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'true') - * ``` - * - * 7. Prevent XMLHttpRequests for specific url and randomize it's response text with range - * ``` - * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300') - * ``` - */ - /* eslint-enable max-len */ - function preventXHR$1(source, propsToMatch, customResponseText) { - // do nothing if browser does not support Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - if (typeof Proxy === 'undefined') { - return; - } - let response = ''; - let responseText = ''; - let responseUrl; - const openWrapper = function openWrapper(target, thisArg, args) { - // Get method and url from .open() - const xhrData = { - method: args[0], - url: args[1] - }; - responseUrl = xhrData.url; - if (typeof propsToMatch === 'undefined') { - // Log if no propsToMatch given - logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); - hit(source); - } else if (matchRequestProps(source, propsToMatch, xhrData)) { - thisArg.shouldBePrevented = true; - } - return Reflect.apply(target, thisArg, args); - }; - const sendWrapper = function sendWrapper(target, thisArg, args) { - if (!thisArg.shouldBePrevented) { - return Reflect.apply(target, thisArg, args); - } - if (thisArg.responseType === 'blob') { - response = new Blob(); - } - if (thisArg.responseType === 'arraybuffer') { - response = new ArrayBuffer(); - } - if (customResponseText) { - const randomText = generateRandomResponse(customResponseText); - if (randomText) { - responseText = randomText; - } else { - logMessage(source, "Invalid range: ".concat(customResponseText)); - } - } - // Mock response object - Object.defineProperties(thisArg, { - readyState: { - value: 4, - writable: false - }, - response: { - value: response, - writable: false - }, - responseText: { - value: responseText, - writable: false - }, - responseURL: { - value: responseUrl, - writable: false - }, - responseXML: { - value: '', - writable: false - }, - status: { - value: 200, - writable: false - }, - statusText: { - value: 'OK', - writable: false - } - }); - // Mock events - setTimeout(function () { - const stateEvent = new Event('readystatechange'); - thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event('load'); - thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event('loadend'); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - return undefined; - }; - const openHandler = { - apply: openWrapper - }; - const sendHandler = { - apply: sendWrapper - }; - XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); - XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); - } - preventXHR$1.names = ['prevent-xhr', - // aliases are needed for matching the related scriptlet converted into our syntax - 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if']; - preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; +var isObject = __webpack_require__(111); +var createNonEnumerableProperty = __webpack_require__(8880); - /** - * @scriptlet close-window - * @description - * Closes the browser tab immediately. - * - * > `window.close()` usage is restricted in Chrome. In this case - * tab will only be closed when using AdGuard browser extension. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('close-window'[, path]) - * ``` - * - * - `path` — optional, string or regular expression - * matching the current location's path: `window.location.pathname` + `window.location.search`. - * Defaults to execute on every page. - * - * **Examples** - * ``` - * ! closes any example.org tab - * example.org#%#//scriptlet('close-window') - * - * ! closes specific example.org tab - * example.org#%#//scriptlet('close-window', '/example-page.html') - * ``` - */ - function forceWindowClose$1(source) { - let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036 - if (typeof window.close !== 'function') { - const message = 'window.close() is not a function so \'close-window\' scriptlet is unavailable'; - logMessage(source, message); - return; - } - const closeImmediately = function closeImmediately() { - try { - hit(source); - window.close(); - } catch (e) { - // log the error if window closing is impossible - // https://developer.mozilla.org/en-US/docs/Web/API/Window/close - logMessage(source, e); - } - }; - const closeByExtension = function closeByExtension() { - const extCall = function extCall() { - dispatchEvent(new Event('adguard:scriptlet-close-window')); - }; - window.addEventListener('adguard:subscribed-to-close-window', extCall, { - once: true - }); - setTimeout(function () { - window.removeEventListener('adguard:subscribed-to-close-window', extCall, { - once: true - }); - }, 5000); - }; - const shouldClose = function shouldClose() { - if (path === '') { - return true; - } - const pathRegexp = toRegExp(path); - const currentPath = "".concat(window.location.pathname).concat(window.location.search); - return pathRegexp.test(currentPath); - }; - if (shouldClose()) { - closeImmediately(); - if (navigator.userAgent.indexOf('Chrome') > -1) { - closeByExtension(); - } - } - } - forceWindowClose$1.names = ['close-window', 'window-close-if.js', 'ubo-window-close-if.js', 'ubo-window-close-if']; - forceWindowClose$1.injections = [hit, toRegExp, logMessage]; +// `InstallErrorCause` abstract operation +// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause +module.exports = function (O, options) { + if (isObject(options) && 'cause' in options) { + createNonEnumerableProperty(O, 'cause', options.cause); + } +}; - /* eslint-disable max-len */ - /** - * @scriptlet prevent-refresh - * @description - * Prevents reloading of a document through a meta "refresh" tag. - * - * Related UBO scriptlet: - * https://github.com/gorhill/uBlock/wiki/Resources-Library#refresh-defuserjs- - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-refresh'[, delay]) - * ``` - * - * - `delay` — optional, number of seconds for delay that indicates when scriptlet should run. If not set, source tag value will be applied. - * - * **Examples** - * 1. Prevent reloading of a document through a meta "refresh" tag. - * ``` - * enrt.eu#%#//scriptlet('prevent-refresh') - * ``` - * - * 2. Prevent reloading of a document with delay. - * ``` - * cryptodirectories.com#%#//scriptlet('prevent-refresh', 3) - * ``` - */ - /* eslint-enable max-len */ - function preventRefresh$1(source, delaySec) { - const getMetaElements = function getMetaElements() { - let metaNodes = []; - try { - metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); - } catch (e) { - // 'i' attribute flag is problematic in Edge 15 - try { - metaNodes = document.querySelectorAll('meta[http-equiv="refresh"][content]'); - } catch (e) { - logMessage(source, e); - } - } - return Array.from(metaNodes); - }; - const getMetaContentDelay = function getMetaContentDelay(metaElements) { - const delays = metaElements.map(function (meta) { - const contentString = meta.getAttribute('content'); - if (contentString.length === 0) { - return null; - } - let contentDelay; - // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv - const limiterIndex = contentString.indexOf(';'); - if (limiterIndex !== -1) { - const delaySubstring = contentString.substring(0, limiterIndex); - contentDelay = getNumberFromString(delaySubstring); - } else { - contentDelay = getNumberFromString(contentString); - } - return contentDelay; - }).filter(function (delay) { - return delay !== null; - }); - // Check if "delays" array is empty, may happens when meta's content is invalid - // and reduce() method cannot be used with empty arrays without initial value - if (!delays.length) { - return null; - } - // Get smallest delay of all metas on the page - const minDelay = delays.reduce(function (a, b) { - return Math.min(a, b); - }); - // eslint-disable-next-line consistent-return - return minDelay; - }; - const stop = function stop() { - const metaElements = getMetaElements(); - if (metaElements.length === 0) { - return; - } - let secondsToRun = getNumberFromString(delaySec); - // Check if argument is provided - if (secondsToRun === null) { - secondsToRun = getMetaContentDelay(metaElements); - } - // Check if meta tag has delay - if (secondsToRun === null) { - return; - } - const delayMs = secondsToRun * 1000; - setTimeout(function () { - window.stop(); - hit(source); - }, delayMs); - }; - if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', stop, { - once: true - }); - } else { - stop(); - } - } - preventRefresh$1.names = ['prevent-refresh', - // Aliases are needed for matching the related scriptlet converted into our syntax - // These are used by UBO rules syntax - // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets - 'refresh-defuser.js', 'refresh-defuser', - // Prefix 'ubo-' is required to run converted rules - 'ubo-refresh-defuser.js', 'ubo-refresh-defuser']; - preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN]; - /* eslint-disable max-len, consistent-return */ - /** - * @scriptlet prevent-element-src-loading - * @description - * Prevents target element source loading without triggering 'onerror' listeners and not breaking 'onload' ones. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('prevent-element-src-loading', tagName, match) - * ``` - * - * - `tagName` — required, case-insensitive target element tagName which `src` property resource loading will be silently prevented; possible values: - * - `script` - * - `img` - * - `iframe` - * - `match` — required, string or regular expression for matching the element's URL; - * - * **Examples** - * 1. Prevent script source loading: - * ``` - * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle') - * ``` - */ - /* eslint-enable max-len */ - function preventElementSrcLoading$1(source, tagName, match) { - // do nothing if browser does not support Proxy or Reflect - if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { - return; - } - const srcMockData = { - // "KCk9Pnt9" = "()=>{}" - script: 'data:text/javascript;base64,KCk9Pnt9', - // Empty 1x1 image - img: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==', - // Empty h1 tag - iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=' - }; - let instance; - if (tagName === 'script') { - instance = HTMLScriptElement; - } else if (tagName === 'img') { - instance = HTMLImageElement; - } else if (tagName === 'iframe') { - instance = HTMLIFrameElement; - } else { - return; - } +/***/ }), - // For websites that use Trusted Types - // https://w3c.github.io/webappsec-trusted-types/dist/spec/ - const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; - let policy; - if (hasTrustedTypes) { - // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can - // allow our policy if the server has restricted the creation of a trusted-types policy with - // the directive 'Content-Security-Policy: trusted-types ;`. - // If such a header is presented in the server response, corelibs adds permission to create - // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. - // See AG-18204 for details. - policy = window.trustedTypes.createPolicy('AGPolicy', { - createScriptURL: function createScriptURL(arg) { - return arg; - } - }); - } - const SOURCE_PROPERTY_NAME = 'src'; - const ONERROR_PROPERTY_NAME = 'onerror'; - const searchRegexp = toRegExp(match); +/***/ 9909: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // This will be needed to silent error events on matched element, - // as url wont be available - const setMatchedAttribute = function setMatchedAttribute(elem) { - return elem.setAttribute(source.name, 'matched'); - }; - const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { - // Check if arguments are present - if (!args[0] || !args[1]) { - return Reflect.apply(target, thisArg, args); - } - const nodeName = thisArg.nodeName.toLowerCase(); - const attrName = args[0].toLowerCase(); - const attrValue = args[1]; - const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); - if (!isMatched) { - return Reflect.apply(target, thisArg, args); - } - hit(source); - setMatchedAttribute(thisArg); - // Forward the URI that corresponds with element's MIME type - return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); - }; - const setAttributeHandler = { - apply: setAttributeWrapper - }; - // eslint-disable-next-line max-len - instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); - const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); - if (!origSrcDescriptor) { - return; - } - Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { - enumerable: true, - configurable: true, - get() { - return origSrcDescriptor.get.call(this); - }, - set(urlValue) { - const nodeName = this.nodeName.toLowerCase(); - const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); - if (!isMatched) { - origSrcDescriptor.set.call(this, urlValue); - return true; - } +var NATIVE_WEAK_MAP = __webpack_require__(4811); +var global = __webpack_require__(7854); +var isObject = __webpack_require__(111); +var createNonEnumerableProperty = __webpack_require__(8880); +var hasOwn = __webpack_require__(2597); +var shared = __webpack_require__(5465); +var sharedKey = __webpack_require__(6200); +var hiddenKeys = __webpack_require__(3501); - // eslint-disable-next-line no-undef - if (policy && urlValue instanceof TrustedScriptURL) { - const trustedSrc = policy.createScriptURL(urlValue); - origSrcDescriptor.set.call(this, trustedSrc); - hit(source); - return; - } - setMatchedAttribute(this); - origSrcDescriptor.set.call(this, srcMockData[nodeName]); - hit(source); - } - }); +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; - // https://github.com/AdguardTeam/Scriptlets/issues/228 - // Prevent error event being triggered by other sources - const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); - if (!origOnerrorDescriptor) { - return; - } - Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { - enumerable: true, - configurable: true, - get() { - return origOnerrorDescriptor.get.call(this); - }, - set(cb) { - const isMatched = this.getAttribute(source.name) === 'matched'; - if (!isMatched) { - origOnerrorDescriptor.set.call(this, cb); - return true; - } - origOnerrorDescriptor.set.call(this, noopFunc); - return true; - } - }); - const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { - // Check if arguments are present - if (!args[0] || !args[1] || !thisArg) { - return Reflect.apply(target, thisArg, args); - } - const eventName = args[0]; - const isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; - if (isMatched) { - return Reflect.apply(target, thisArg, [eventName, noopFunc]); - } - return Reflect.apply(target, thisArg, args); - }; - const addEventListenerHandler = { - apply: addEventListenerWrapper - }; - // eslint-disable-next-line max-len - EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); - } - preventElementSrcLoading$1.names = ['prevent-element-src-loading']; - preventElementSrcLoading$1.injections = [hit, toRegExp, safeGetDescriptor, noopFunc]; +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; - /** - * @scriptlet no-topics - * @description - * Prevents using The Topics API - * https://developer.chrome.com/docs/privacy-sandbox/topics/ - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('no-topics') - * ``` - */ - function noTopics$1(source) { - const TOPICS_PROPERTY_NAME = 'browsingTopics'; - if (Document instanceof Object === false) { - return; - } - if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { - return; - } +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; - // document.browsingTopics() is async function so it's better to return noopPromiseResolve() - // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works - Document.prototype[TOPICS_PROPERTY_NAME] = function () { - return noopPromiseResolve('[]'); - }; - hit(source); - } - noTopics$1.names = ['no-topics']; - noTopics$1.injections = [hit, noopPromiseResolve]; +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} - /* eslint-disable max-len */ - /** - * @trustedScriptlet trusted-replace-xhr-response - * @description - * Replaces response content of `xhr` requests if **all** given parameters match. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]]) - * ``` - * - * - `pattern` — optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required; - * possible values: - * - `*` to match all text content - * - non-empty string - * - regular expression - * - `replacement` — optional, should be set if `pattern` is set. String to replace matched content with. Empty string to remove content. - * - `propsToMatch` — optional, string of space-separated properties to match for extra condition; possible props: - * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call; - * - colon-separated pairs `name:value` where - * - `name` — string or regular expression for matching XMLHttpRequest property name - * - `value` — string or regular expression for matching the value of the option passed to `XMLHttpRequest.open()` call - * - * > Usage with no arguments will log XMLHttpRequest objects to browser console; - * which is useful for debugging but not permitted for production filter lists. - * - * **Examples** - * 1. Log all XMLHttpRequests - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response') - * ``` - * - * 2. Replace text content of XMLHttpRequests with specific url - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org') - * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') - * ``` - * - * 3. Remove all text content of XMLHttpRequests with specific request method - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET') - * ``` - * - * 4. Replace text content of XMLHttpRequests matching by URL regex and request methods - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') - * ``` - * 5. Remove all text content of all XMLHttpRequests for example.com - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') - * ``` - */ - /* eslint-enable max-len */ - function trustedReplaceXhrResponse$1(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - // do nothing if browser does not support Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - if (typeof Proxy === 'undefined') { - return; - } +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; - // Only allow pattern as empty string for logging purposes - if (pattern === '' && replacement !== '') { - const message = 'Pattern argument should not be empty string.'; - logMessage(source, message); - return; - } - const shouldLog = pattern === '' && replacement === ''; - const nativeOpen = window.XMLHttpRequest.prototype.open; - const nativeSend = window.XMLHttpRequest.prototype.send; - let xhrData; - const openWrapper = function openWrapper(target, thisArg, args) { - // eslint-disable-next-line prefer-spread - xhrData = getXhrData.apply(null, args); - if (shouldLog) { - // Log if no propsToMatch given - const message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, message, true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - if (matchRequestProps(source, propsToMatch, xhrData)) { - thisArg.shouldBePrevented = true; - } - // Trap setRequestHeader of target xhr object to mimic request headers later - if (thisArg.shouldBePrevented) { - thisArg.collectedHeaders = []; - const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { - // Collect headers - thisArg.collectedHeaders.push(args); - return Reflect.apply(target, thisArg, args); - }; - const setRequestHeaderHandler = { - apply: setRequestHeaderWrapper - }; +/***/ }), - // setRequestHeader can only be called on open xhr object, - // so we can safely proxy it here - thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); - } - return Reflect.apply(target, thisArg, args); - }; - const sendWrapper = function sendWrapper(target, thisArg, args) { - if (!thisArg.shouldBePrevented) { - return Reflect.apply(target, thisArg, args); - } +/***/ 3157: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Create separate XHR request with original request's input - * to be able to collect response data without triggering - * listeners on original XHR object - */ - const forgedRequest = new XMLHttpRequest(); - forgedRequest.addEventListener('readystatechange', function () { - if (forgedRequest.readyState !== 4) { - return; - } - const readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; +var classof = __webpack_require__(4326); - // Extract content from response - const content = responseText || response; - if (typeof content !== 'string') { - return; - } - const patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); - const modifiedContent = content.replace(patternRegexp, replacement); +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) == 'Array'; +}; - // Manually put required values into target XHR object - // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied - Object.defineProperties(thisArg, { - readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent - }, - responseURL: { - value: responseURL - }, - responseXML: { - value: responseXML - }, - status: { - value: status - }, - statusText: { - value: statusText - } - }); - // Mock events - setTimeout(function () { - const stateEvent = new Event('readystatechange'); - thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event('load'); - thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event('loadend'); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); +/***/ }), - // Mimic request headers before sending - // setRequestHeader can only be called on open request objects - thisArg.collectedHeaders.forEach(function (header) { - const name = header[0]; - const value = header[1]; - forgedRequest.setRequestHeader(name, value); - }); - thisArg.collectedHeaders = []; - try { - nativeSend.call(forgedRequest, args); - } catch (_unused) { - return Reflect.apply(target, thisArg, args); - } - return undefined; - }; - const openHandler = { - apply: openWrapper - }; - const sendHandler = { - apply: sendWrapper - }; - XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); - XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); - } - trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' - // trusted scriptlets support no aliases - ]; +/***/ 614: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; +var $documentAll = __webpack_require__(4154); - /* eslint-disable max-len */ - /** - * @scriptlet xml-prune - * @description - * Removes an element from the specified XML. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('xml-prune'[, propsToMatch[, optionalProp[, urlToMatch]]]) - * ``` - * - * - `propsToMatch` — optional, selector of elements which will be removed from XML - * - `optionalProp` — optional, selector of elements that must occur in XML document - * - `urlToMatch` — optional, string or regular expression for matching the request's URL - * > Usage with no arguments will log response payload and URL to browser console; - * which is useful for debugging but prohibited for production filter lists. - * - * **Examples** - * 1. Remove `Period` tag whose `id` contains `-ad-` from all requests - * ``` - * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]') - * ``` - * - * 2. Remove `Period` tag whose `id` contains `-ad-`, only if XML contains `SegmentTemplate` - * ``` - * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]', 'SegmentTemplate') - * ``` - * - * 3. Remove `Period` tag whose `id` contains `-ad-`, only if request's URL contains `.mpd` - * ``` - * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]', '', '.mpd') - * ``` - * - * 4. Call with no arguments will log response payload and URL at the console - * ``` - * example.org#%#//scriptlet('xml-prune') - * ``` - * - * 5. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL - * ``` - * example.org#%#//scriptlet('xml-prune', '', '', '.mpd') - * ``` - */ - /* eslint-enable max-len */ +var documentAll = $documentAll.all; - function xmlPrune$1(source, propsToRemove) { - var _this = this; - let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect - if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { - return; - } - let shouldPruneResponse = true; - if (!propsToRemove) { - // If "propsToRemove" is not defined, then response shouldn't be pruned - // but it should be logged in browser console - shouldPruneResponse = false; - } - const urlMatchRegexp = toRegExp(urlToMatch); - const isXML = function isXML(text) { - // It's necessary to check the type of 'text' - // because 'text' is obtained from the xhr/fetch response, - // so it could also be Blob/ArrayBuffer/Object or another type - if (typeof text === 'string') { - // Check if "text" starts with "<" and check if it ends with ">" - // If so, then it might be an XML file and should be pruned or logged - const trimedText = text.trim(); - if (trimedText.startsWith('<') && trimedText.endsWith('>')) { - return true; - } - } - return false; - }; - const createXMLDocument = function createXMLDocument(text) { - const xmlParser = new DOMParser(); - const xmlDocument = xmlParser.parseFromString(text, 'text/xml'); - return xmlDocument; - }; - const pruneXML = function pruneXML(text) { - if (!isXML(text)) { - shouldPruneResponse = false; - return text; - } - const xmlDoc = createXMLDocument(text); - const errorNode = xmlDoc.querySelector('parsererror'); - if (errorNode) { - return text; - } - if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) { - shouldPruneResponse = false; - return text; - } - const elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { - shouldPruneResponse = false; - return text; - } - elems.forEach(function (elem) { - elem.remove(); - }); - const serializer = new XMLSerializer(); - text = serializer.serializeToString(xmlDoc); - return text; - }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== 'string' || xhrURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener('readystatechange', function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener('readystatechange', pruneResponse); - if (!shouldPruneResponse) { - if (isXML(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - logMessage(source, createXMLDocument(response), true, false); - } - } else { - const prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { - Object.defineProperty(thisArg, 'response', { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, 'responseText', { - value: prunedResponseContent - }); - hit(source); - } - // In case if response shouldn't be pruned - // pruneXML sets shouldPruneResponse to false - // so it's necessary to set it to true again - // otherwise response will be only logged - shouldPruneResponse = true; - } - } - }); - } - return Reflect.apply(target, thisArg, args); - }; - const xhrHandler = { - apply: xhrWrapper - }; - // eslint-disable-next-line max-len - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; - if (typeof fetchURL !== 'string' || fetchURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(fetchURL)) { - return nativeFetch.apply(_this, args).then(function (response) { - return response.text().then(function (text) { - if (!shouldPruneResponse) { - if (isXML(text)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text); - logMessage(source, message); - logMessage(source, createXMLDocument(text), true, false); - } - return Reflect.apply(target, thisArg, args); - } - const prunedText = pruneXML(text); - if (shouldPruneResponse) { - hit(source); - return new Response(prunedText, { - status: response.status, - statusText: response.statusText, - headers: response.headers - }); - } - // If response shouldn't be pruned - // pruneXML sets shouldPruneResponse to false - // so it's necessary to set it to true again - // otherwise response will be only logged - shouldPruneResponse = true; - return Reflect.apply(target, thisArg, args); - }); - }); - } - return Reflect.apply(target, thisArg, args); - }; - const fetchHandler = { - apply: fetchWrapper - }; - window.fetch = new Proxy(window.fetch, fetchHandler); - } - xmlPrune$1.names = ['xml-prune', - // aliases are needed for matching the related scriptlet converted into our syntax - 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune']; - xmlPrune$1.injections = [hit, logMessage, toRegExp]; +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +module.exports = $documentAll.IS_HTMLDDA ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; - /* eslint-disable max-len */ - /** - * @scriptlet m3u-prune - * @description - * Removes content from the specified M3U file. - * - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch]]) - * ``` - * - * - `propsToRemove` — optional, string or regular expression to match the URL line (segment) which will be removed alongside with its tags - * - `urlToMatch` — optional, string or regular expression for matching the request's URL - * > Usage with no arguments will log response payload and URL to browser console; - * which is useful for debugging but prohibited for production filter lists. - * - * **Examples** - * 1. Removes a tag which contains `tvessaiprod.nbcuni.com/video/`, from all requests - * ``` - * example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/') - * ``` - * - * 2. Removes a line which contains `tvessaiprod.nbcuni.com/video/`, only if request's URL contains `.m3u8` - * ``` - * example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/', '.m3u8') - * ``` - * - * 3. Call with no arguments will log response payload and URL at the console - * ``` - * example.org#%#//scriptlet('m3u-prune') - * ``` - * - * 4. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL - * ``` - * example.org#%#//scriptlet('m3u-prune', '', '.m3u8') - * ``` - */ - /* eslint-enable max-len */ - function m3uPrune$1(source, propsToRemove, urlToMatch) { - // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect - if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { - return; - } - let shouldPruneResponse = false; - const urlMatchRegexp = toRegExp(urlToMatch); - const SEGMENT_MARKER = '#'; - const AD_MARKER = { - ASSET: '#EXT-X-ASSET:', - CUE: '#EXT-X-CUE:', - CUE_IN: '#EXT-X-CUE-IN', - DISCONTINUITY: '#EXT-X-DISCONTINUITY', - EXTINF: '#EXTINF', - EXTM3U: '#EXTM3U', - SCTE35: '#EXT-X-SCTE35:' - }; - const COMCAST_AD_MARKER = { - AD: '-AD-', - VAST: '-VAST-', - VMAP_AD: '-VMAP-AD-', - VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:' - }; +/***/ }), - // List of tags which should not be removed - const TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START']; - const isAllowedTag = function isAllowedTag(str) { - return TAGS_ALLOWLIST.some(function (el) { - return str.startsWith(el); - }); - }; +/***/ 4705: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Sets an item in array to undefined, if it contains one of the - * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY - * - * @param {Array} lines - * @param {number} i - * @returns {Object} { array, index } - */ - const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { - let array = lines.slice(); - let index = i; - if (array[index].includes(AD_MARKER.EXTINF)) { - array[index] = undefined; - index += 1; - if (array[index].includes(AD_MARKER.DISCONTINUITY)) { - array[index] = undefined; - index += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, index); - array = prunedExtinf.array; - index = prunedExtinf.index; - } - } - return { - array, - index - }; - }; +var fails = __webpack_require__(7293); +var isCallable = __webpack_require__(614); - /** - * Sets an item in array to undefined, if it contains one of the - * COMCAST_AD_MARKER: COMCAST_AD_MARKER.VMAP_AD, COMCAST_AD_MARKER.VAST, COMCAST_AD_MARKER.AD - * - * @param {Array} lines - * @returns {Array} - */ - const pruneVmapBlock = function pruneVmapBlock(lines) { - let array = lines.slice(); - for (let i = 0; i < array.length - 1; i += 1) { - if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) { - array[i] = undefined; - if (array[i + 1].includes(AD_MARKER.EXTINF)) { - i += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, i); - array = prunedExtinf.array; - // It's necessary to subtract 1 from "i", - // otherwise one line will be skipped - i = prunedExtinf.index - 1; - } - } - } - return array; - }; +var replacement = /#|\.prototype\./; - /** - * Sets an item in array to undefined, if it contains one of the - * AD_MARKER: AD_MARKER.CUE, AD_MARKER.ASSET, AD_MARKER.SCTE35, AD_MARKER.CUE_IN - * - * @param {string} line - * @param {number} index - * @param {Array} array - * @returns {string|undefined} - */ +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; - const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { - if (!line.startsWith(AD_MARKER.CUE)) { - return line; - } - line = undefined; - index += 1; - if (array[index].startsWith(AD_MARKER.ASSET)) { - array[index] = undefined; - index += 1; - } - if (array[index].startsWith(AD_MARKER.SCTE35)) { - array[index] = undefined; - index += 1; - } - if (array[index].startsWith(AD_MARKER.CUE_IN)) { - array[index] = undefined; - index += 1; - } - if (array[index].startsWith(AD_MARKER.SCTE35)) { - array[index] = undefined; - } - return line; - }; - const removeM3ULineRegexp = toRegExp(propsToRemove); +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; - /** - * Sets an item in array to undefined, if it contains removeM3ULineRegexp and one of the - * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY - * - * @param {string} line - * @param {number} index - * @param {Array} array - * @returns {string|undefined} - */ +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; - const pruneInfBlock = function pruneInfBlock(line, index, array) { - if (!line.startsWith(AD_MARKER.EXTINF)) { - return line; - } - if (!removeM3ULineRegexp.test(array[index + 1])) { - return line; - } - if (!isAllowedTag(array[index])) { - array[index] = undefined; - } - index += 1; - if (!isAllowedTag(array[index])) { - array[index] = undefined; - } - index += 1; - if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) { - array[index] = undefined; - } - return line; - }; +module.exports = isForced; - /** - * Removes block of segments (if it contains removeM3ULineRegexp) until another segment occurs - * - * @param {Array} lines - * @returns {Array} - */ - const pruneSegments = function pruneSegments(lines) { - for (let i = 0; i < lines.length - 1; i += 1) { - var _lines$i; - if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) { - const segmentName = lines[i].substring(0, lines[i].indexOf(':')); - if (!segmentName) { - return lines; - } - lines[i] = undefined; - i += 1; - for (let j = i; j < lines.length; j += 1) { - if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) { - lines[j] = undefined; - } else { - i = j - 1; - break; - } - } - } - } - return lines; - }; - /** - * Determines if text contains "#EXTM3U" or "VMAP_AD_BREAK" - * - * @param {*} text - * @returns {boolean} - */ - const isM3U = function isM3U(text) { - if (typeof text === 'string') { - // Check if "text" starts with "#EXTM3U" or with "VMAP_AD_BREAK" - // If so, then it might be an M3U file and should be pruned or logged - const trimmedText = text.trim(); - return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK); - } - return false; - }; +/***/ }), - /** - * Determines if pruning is needed - * - * @param {string} text - * @param {RegExp} regexp - * @returns {boolean} - */ - const isPruningNeeded = function isPruningNeeded(text, regexp) { - return isM3U(text) && regexp.test(text); - }; +/***/ 8554: +/***/ ((module) => { - /** - * Prunes lines which contain removeM3ULineRegexp and specific AD_MARKER - * - * @param {string} text - * @returns {string} - */ - // TODO: make it compatible with $hls modifier - const pruneM3U = function pruneM3U(text) { - let lines = text.split(/\n\r|\n|\r/); - if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) { - lines = pruneVmapBlock(lines); - return lines.filter(function (l) { - return !!l; - }).join('\n'); - } - lines = pruneSegments(lines); - return lines.map(function (line, index, array) { - if (typeof line === 'undefined') { - return line; - } - line = pruneSpliceoutBlock(line, index, array); - if (typeof line !== 'undefined') { - line = pruneInfBlock(line, index, array); - } - return line; - }).filter(function (l) { - return !!l; - }).join('\n'); - }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== 'string' || xhrURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener('readystatechange', function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener('readystatechange', pruneResponse); - // If "propsToRemove" is not defined, then response should be logged only - if (!propsToRemove) { - if (isM3U(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - } - } else { - shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); - } - if (shouldPruneResponse) { - const prunedResponseContent = pruneM3U(response); - Object.defineProperty(thisArg, 'response', { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, 'responseText', { - value: prunedResponseContent - }); - hit(source); - } - } - }); - } - return Reflect.apply(target, thisArg, args); - }; - const xhrHandler = { - apply: xhrWrapper - }; - // eslint-disable-next-line max-len - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = async function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; - if (typeof fetchURL !== 'string' || fetchURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(fetchURL)) { - const response = await nativeFetch(...args); - const responseText = await response.text(); - // If "propsToRemove" is not defined, then response should be logged only - if (!propsToRemove && isM3U(responseText)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - } - if (isPruningNeeded(responseText, removeM3ULineRegexp)) { - const prunedText = pruneM3U(responseText); - hit(source); - return new Response(prunedText, { - status: response.status, - statusText: response.statusText, - headers: response.headers - }); - } - return Reflect.apply(target, thisArg, args); - } - return Reflect.apply(target, thisArg, args); - }; - const fetchHandler = { - apply: fetchWrapper - }; - window.fetch = new Proxy(window.fetch, fetchHandler); - } - m3uPrune$1.names = ['m3u-prune', - // aliases are needed for matching the related scriptlet converted into our syntax - 'm3u-prune.js', 'ubo-m3u-prune.js', 'ubo-m3u-prune']; - m3uPrune$1.injections = [hit, toRegExp, logMessage]; +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; - /* eslint-disable max-len */ - /** - * @trustedScriptlet trusted-set-cookie - * @description - * Sets a cookie with arbitrary name and value, - * and with optional ability to offset cookie attribute 'expires' and set path. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]]) - * ``` - * - * - `name` — required, cookie name to be set - * - `value` — required, cookie value. Possible values: - * - arbitrary value - * - empty string for no value - * - `$now$` keyword for setting current time in ms, e.g 1667915146503 - * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' - * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; defaults to no offset - * Possible values: - * - positive integer in seconds - * - `1year` keyword for setting expiration date to one year - * - `1day` keyword for setting expiration date to one day - * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values: - * - `/` — root path - * - `none` — to set no path at all - * - * **Examples** - * 1. Set cookie - * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept') - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '1-accept_1') - * ``` - * - * 2. Set cookie with `new Date().getTime()` value - * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$') - * ``` - * - * 3. Set cookie which will expire in 3 days - * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '259200') - * ``` - * - * 4. Set cookie which will expire in one year - * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year') - * ``` - * - * 5. Set cookie with no path - * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') - * ``` - */ - /* eslint-enable max-len */ - function trustedSetCookie$1(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; - if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified'); - return; - } - if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified'); - return; - } - const parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { - return; - } - if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; - } - const expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); - } - document.cookie = cookieToSet; - hit(source); - } - trustedSetCookie$1.names = ['trusted-set-cookie' - // trusted scriptlets support no aliases - ]; +/***/ }), - trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; +/***/ 111: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable max-len */ - /** - * @trustedScriptlet trusted-set-cookie-reload - * @description - * Sets a cookie with arbitrary name and value, - * and with optional ability to offset cookie attribute 'expires' and set path. - * Also reloads the current page after the cookie setting. - * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie). - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]]) - * ``` - * - * - `name` — required, cookie name to be set - * - `value` — required, cookie value. Possible values: - * - arbitrary value - * - empty string for no value - * - `$now$` keyword for setting current time in ms, e.g 1667915146503 - * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' - * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; defaults to no offset - * Possible values: - * - positive integer in seconds - * - `1year` keyword for setting expiration date to one year - * - `1day` keyword for setting expiration date to one day - * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values: - * - `/` — root path - * - `none` — to set no path at all - * - * **Examples** - * 1. Set cookie and reload the page after it - * ``` - * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept') - * ``` - * - * 2. Set cookie with `new Date().getTime()` value and reload the page after it - * ``` - * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$') - * ``` - * - * 3. Set cookie which will expire in 3 days and reload the page after it - * ``` - * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200') - * ``` - * - * 4. Set cookie which will expire in one year and reload the page after it - * ``` - * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year') - * ``` - * - * 5. Set cookie with no 'expire' and no path, reload the page after it - * ``` - * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') - * ``` - */ - /* eslint-enable max-len */ +var isCallable = __webpack_require__(614); +var $documentAll = __webpack_require__(4154); - function trustedSetCookieReload$1(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; - if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified'); - return; - } - if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified'); - return; - } +var documentAll = $documentAll.all; - // Prevent infinite reloads if cookie was already set or blocked by the browser - // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (isCookieSetWithValue(document.cookie, name, value)) { - return; - } - const parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { - return; - } - if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; - } - const expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); - } - document.cookie = cookieToSet; - hit(source); +module.exports = $documentAll.IS_HTMLDDA ? function (it) { + return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll; +} : function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; - // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } - } - trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' - // trusted scriptlets support no aliases - ]; - trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; +/***/ }), - /* eslint-disable max-len */ - /** - * @trustedScriptlet trusted-replace-fetch-response - * @description - * Replaces response text content of `fetch` requests if **all** given parameters match. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('trusted-replace-fetch-response'[, pattern, replacement[, propsToMatch]]) - * ``` - * - * - `pattern` — optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required; - * possible values: - * - `*` to match all text content - * - non-empty string - * - regular expression - * - `replacement` — optional, should be set if `pattern` is set. String to replace the response text content matched by `pattern`. - * Empty string to remove content. Defaults to empty string. - * - `propsToMatch` — optional, string of space-separated properties to match; possible props: - * - string or regular expression for matching the URL passed to fetch call; empty string, wildcard `*` or invalid regular expression will match all fetch calls - * - colon-separated pairs `name:value` where - * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters) - * - `value` is string or regular expression for matching the value of the option passed to fetch call; invalid regular expression will cause any value matching - * - * > Usage with no arguments will log fetch calls to browser console; - * which is useful for debugging but only allowed for production filter lists. - * - * > Scriptlet does nothing if response body can't be converted to text. - * - * **Examples** - * 1. Log all fetch calls - * ``` - * example.org#%#//scriptlet('trusted-replace-fetch-response') - * ``` - * - * 2. Replace response text content of fetch requests with specific url - * ``` - * example.org#%#//scriptlet('trusted-replace-fetch-response', 'adb_detect:true', 'adb_detect:false', 'example.org') - * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') - * ``` - * - * 3. Remove all text content of fetch responses with specific request method - * ``` - * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'method:GET') - * ``` - * - * 4. Replace response text content of fetch requests matching by URL regex and request methods - * ``` - * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') - * ``` - * 5. Remove text content of all fetch responses for example.com - * ``` - * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com') - * ``` - */ - /* eslint-enable max-len */ - function trustedReplaceFetchResponse$1(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { - return; - } +/***/ 1913: +/***/ ((module) => { - // Only allow pattern as empty string for logging purposes - if (pattern === '' && replacement !== '') { - logMessage(source, 'Pattern argument should not be empty string'); - return; - } - const shouldLog = pattern === '' && replacement === ''; - const nativeFetch = fetch; - let shouldReplace = false; - let fetchData; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - fetchData = getFetchData(args); - if (shouldLog) { - // log if no propsToMatch given - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - if (!shouldReplace) { - return Reflect.apply(target, thisArg, args); - } +module.exports = false; - /** - * Create new Response object using original response' properties - * and given text as body content - * - * @param {Response} response original response to copy properties from - * @param {string} textContent text to set as body content - * @returns {Response} - */ - const forgeResponse = function forgeResponse(response, textContent) { - const bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; - const forgedResponse = new Response(textContent, { - status, - statusText, - headers - }); - // Manually set properties which can't be set by Response constructor - Object.defineProperties(forgedResponse, { - url: { - value: url - }, - type: { - value: type - }, - ok: { - value: ok - }, - bodyUsed: { - value: bodyUsed - }, - redirected: { - value: redirected - } - }); - return forgedResponse; - }; +/***/ }), - // eslint-disable-next-line prefer-spread - return nativeFetch.apply(null, args).then(function (response) { - return response.text().then(function (bodyText) { - const patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); - const modifiedTextContent = bodyText.replace(patternRegexp, replacement); - const forgedResponse = forgeResponse(response, modifiedTextContent); - hit(source); - return forgedResponse; - }).catch(function () { - // log if response body can't be converted to a string - const fetchDataStr = objectToString(fetchData); - const message = "Response body can't be converted to text: ".concat(fetchDataStr); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - }); - }).catch(function () { - return Reflect.apply(target, thisArg, args); - }); - }; - const fetchHandler = { - apply: handlerWrapper - }; - fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign - } +/***/ 2190: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response']; - trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; +var getBuiltIn = __webpack_require__(5005); +var isCallable = __webpack_require__(614); +var isPrototypeOf = __webpack_require__(7976); +var USE_SYMBOL_AS_UID = __webpack_require__(3307); - /* eslint-disable max-len */ - /** - * @trustedScriptlet trusted-set-local-storage-item - * @description - * Adds item with arbitrary key and value to localStorage object, or updates the value of the key if it already exists. - * Scriptlet won't set item if storage is full. - * - * **Syntax** - * ``` - * example.com#%#//scriptlet('trusted-set-local-storage-item', 'key', 'value') - * ``` - * - * - `key` — required, key name to be set. - * - `value` — required, key value; possible values: - * - arbitrary value - * - `$now$` keyword for setting current time in ms, corresponds to `Date.now()` and `(new Date).getTime()` calls - * - `$currentDate$` keyword for setting string representation of the current date and time, corresponds to `Date()` and `(new Date).toString()` calls - * - * **Examples** - * 1. Set local storage item - * ``` - * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.mute', 'false') - * - * example.org#%#//scriptlet('trusted-set-local-storage-item', 'COOKIE_CONSENTS', '{"preferences":3,"marketing":false}') - * - * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '[16364,88364]') - * - * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '{"providers":[16364,88364],"consent":"all"}') - * ``` - * - * 2. Set item with current time since unix epoch in ms - * ``` - * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$now$') - * ``` - * - * 3. Set item with current date, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' - * ``` - * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$currentDate$') - * ``` - * - * 4. Set item without value - * ``` - * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '') - * ``` - */ - /* eslint-enable max-len */ +var $Object = Object; - function trustedSetLocalStorageItem$1(source, key, value) { - if (typeof key === 'undefined') { - logMessage(source, 'Item key should be specified'); - return; - } - if (typeof value === 'undefined') { - logMessage(source, 'Item value should be specified'); - return; - } - const parsedValue = parseKeywordValue(value); - const _window = window, - localStorage = _window.localStorage; - setStorageItem(source, localStorage, key, parsedValue); - hit(source); - } - trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item' - // trusted scriptlets support no aliases - ]; +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; - trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue]; - /* eslint-disable max-len */ - /** - * @trustedScriptlet trusted-set-constant - * @description - * Creates a constant property and assigns it a specified value. - * - * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type. - * - * > If empty object is present in chain it will be trapped until chain leftovers appear. - * - * > Use [set-constant](./about-scriptlets.md#set-constant) to set predefined values and functions. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('trusted-set-constant', property, value[, stack]) - * ``` - * - * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`. - * - `value` — required, an arbitrary value to be set; value type is being inferred from the argument, e.g '500' will be set as number; - * to set string type value wrap argument into another pair of quotes: `'"500"'`; - * - `stack` — optional, string or regular expression that must match the current function call stack trace; - * if regular expression is invalid it will be skipped - * - * **Examples** - * 1. Set property values of different types - * ``` - * ! Set string value wrapping argument into another pair of quotes - * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '"null"') - * - * ✔ window.click_r === 'null' - * ✔ typeof window.click_r === 'string' - * - * ! Set inferred null value - * example.org#%#//scriptlet('trusted-set-constant', 'click_r', 'null') - * - * ✔ window.click_r === null - * ✔ typeof window.click_r === 'object' - * - * ! Set number type value - * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '48') - * - * ✔ window.click_r === 48 - * ✔ typeof window.click_r === 'number' - * - * ! Set array or object as property value, argument should be a JSON string - * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '[1,"string"]') - * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '{"aaa":123,"bbb":{"ccc":"string"}}') - * ``` - * - * 2. Use script stack matching to set value - * ``` - * ! `document.first` will return `1` if the method is related to `checking.js` - * example.org#%#//scriptlet('trusted-set-constant', 'document.first', '1', 'checking.js') - * - * ✔ document.first === 1 // if the condition described above is met - * ``` - */ - /* eslint-enable max-len */ - function trustedSetConstant$1(source, property, value, stack) { - if (!property || !matchStackTrace(stack, new Error().stack)) { - return; - } - let constantValue; - try { - constantValue = inferValue(value); - } catch (e) { - logMessage(source, e); - return; - } - let canceled = false; - const mustCancel = function mustCancel(value) { - if (canceled) { - return canceled; - } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; - return canceled; - }; +/***/ }), - /** - * Safely sets property on a given object - * - * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as - * reorganizing this to common helpers will most definitely complicate debugging - * - * @param {Object} base arbitrary reachable object - * @param {string} prop property name - * @param {boolean} configurable if set property should be configurable - * @param {Object} handler custom property descriptor object - * @returns {boolean} true if prop was trapped successfully - */ - const trapProp = function trapProp(base, prop, configurable, handler) { - if (!handler.init(base[prop])) { - return false; - } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; - // This is required to prevent scriptlets overwrite each over - if (origDescriptor instanceof Object) { - // This check is required to avoid defining non-configurable props - if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); - logMessage(source, message); - return false; - } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { - prevSetter = origDescriptor.set; - } - } - Object.defineProperty(base, prop, { - configurable, - get() { - return handler.get(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); - } - handler.set(a); - } - }); - return true; - }; +/***/ 6244: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Traverses given chain to set constant value to its end prop - * Chains that yet include non-object values (e.g null) are valid and will be - * traversed when appropriate chain member is set by an external script - * - * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as - * reorganizing this to common helpers will most definitely complicate debugging - * - * @param {Object} owner object that owns chain - * @param {string} property chain of owner properties - */ - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; +var toLength = __webpack_require__(7466); - // Handler method init is used to keep track of factual value - // and apply mustCancel() check only on end prop - const inChainPropHandler = { - factValue: undefined, - init(a) { - this.factValue = a; - return true; - }, - get() { - return this.factValue; - }, - set(a) { - // Prevent breakage due to loop assignments like win.obj = win.obj - if (this.factValue === a) { - return; - } - this.factValue = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - } - }; - const endPropHandler = { - init(a) { - if (mustCancel(a)) { - return false; - } - return true; - }, - get() { - return constantValue; - }, - set(a) { - if (!mustCancel(a)) { - return; - } - constantValue = a; - } - }; +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; - // End prop case - if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { - hit(source); - } - return; - } - // Null prop in chain - if (base !== undefined && base[prop] === null) { - trapProp(base, prop, true, inChainPropHandler); - return; - } +/***/ }), - // Empty object prop in chain - if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { - trapProp(base, prop, true, inChainPropHandler); - } +/***/ 6339: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // Defined prop in chain - const propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { - setChainPropAccess(propValue, chain); - } +var uncurryThis = __webpack_require__(1702); +var fails = __webpack_require__(7293); +var isCallable = __webpack_require__(614); +var hasOwn = __webpack_require__(2597); +var DESCRIPTORS = __webpack_require__(9781); +var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(6530).CONFIGURABLE); +var inspectSource = __webpack_require__(2788); +var InternalStateModule = __webpack_require__(9909); - // Undefined prop in chain - trapProp(base, prop, true, inChainPropHandler); - }; - setChainPropAccess(window, property); - } - trustedSetConstant$1.names = ['trusted-set-constant' - // trusted scriptlets support no aliases - ]; +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); - trustedSetConstant$1.injections = [hit, inferValue, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest, - // following helpers should be imported and injected - // because they are used by helpers above - shouldAbortInlineOrInjectedScript]; +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); - /* eslint-disable max-len */ - /** - * @scriptlet inject-css-in-shadow-dom - * @description - * Injects CSS rule into selected Shadow DOM subtrees on a page - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('inject-css-in-shadow-dom', cssRule[, hostSelector]) - * ``` - * - * - `cssRule` — required, string representing a single css rule - * - `hostSelector` — optional, string, selector to match shadow host elements. CSS rule will be only applied to shadow roots inside these elements. - * Defaults to injecting css rule into all available roots. - * - * **Examples** - * 1. Apply style to all shadow dom subtrees - * ``` - * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#advertisement { display: none !important; }') - * ``` - * - * 2. Apply style to a specific shadow dom subtree - * ``` - * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#content { margin-top: 0 !important; }', '.row > #hidden') - * ``` - */ - /* eslint-enable max-len */ +var TEMPLATE = String(String).split('String'); - function injectCssInShadowDom$1(source, cssRule) { - let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - // do nothing if browser does not support ShadowRoot, Proxy or Reflect - // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot - if (!Element.prototype.attachShadow || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { - return; - } +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\)/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; - // Prevent url() and image-set() styles from being applied - if (cssRule.match(/(url|image-set)\(.*\)/i)) { - logMessage(source, '"url()" function is not allowed for css rules'); - return; - } - const callback = function callback(shadowRoot) { - try { - // adoptedStyleSheets and CSSStyleSheet constructor are not yet supported by Safari - // https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptedStyleSheets - // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet - const stylesheet = new CSSStyleSheet(); - try { - stylesheet.insertRule(cssRule); - } catch (e) { - logMessage(source, "Unable to apply the rule '".concat(cssRule, "' due to: \n'").concat(e.message, "'")); - return; - } - shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet]; - } catch (_unused) { - const styleTag = document.createElement('style'); - styleTag.innerText = cssRule; - shadowRoot.appendChild(styleTag); - } - hit(source); - }; - hijackAttachShadow(window, hostSelector, callback); - } - injectCssInShadowDom$1.names = ['inject-css-in-shadow-dom']; - injectCssInShadowDom$1.injections = [hit, logMessage, hijackAttachShadow]; +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); - /** - * This file must export all scriptlets which should be accessible - */ - var scriptletList = /*#__PURE__*/Object.freeze({ - __proto__: null, - trustedClickElement: trustedClickElement$1, - abortOnPropertyRead: abortOnPropertyRead$1, - abortOnPropertyWrite: abortOnPropertyWrite$1, - preventSetTimeout: preventSetTimeout$1, - preventSetInterval: preventSetInterval$1, - preventWindowOpen: preventWindowOpen$1, - abortCurrentInlineScript: abortCurrentInlineScript$1, - setConstant: setConstant$1, - removeCookie: removeCookie$1, - preventAddEventListener: preventAddEventListener$1, - preventBab: preventBab$2, - nowebrtc: nowebrtc$1, - logAddEventListener: logAddEventListener$1, - logEval: logEval$1, - log: log$1, - noeval: noeval$1, - preventEvalIf: preventEvalIf$1, - preventFab: preventFab$1, - setPopadsDummy: setPopadsDummy$1, - preventPopadsNet: preventPopadsNet$1, - preventAdfly: preventAdfly$1, - debugOnPropertyRead: debugOnPropertyRead$1, - debugOnPropertyWrite: debugOnPropertyWrite$1, - debugCurrentInlineScript: debugCurrentInlineScript$1, - removeAttr: removeAttr$1, - setAttr: setAttr$1, - removeClass: removeClass$1, - disableNewtabLinks: disableNewtabLinks$1, - adjustSetInterval: adjustSetInterval$1, - adjustSetTimeout: adjustSetTimeout$1, - dirString: dirString$1, - jsonPrune: jsonPrune$1, - preventRequestAnimationFrame: preventRequestAnimationFrame$1, - setCookie: setCookie$1, - setCookieReload: setCookieReload$1, - hideInShadowDom: hideInShadowDom$1, - removeInShadowDom: removeInShadowDom$1, - preventFetch: preventFetch$1, - setLocalStorageItem: setLocalStorageItem$1, - setSessionStorageItem: setSessionStorageItem$1, - abortOnStackTrace: abortOnStackTrace$1, - logOnStacktrace: logOnStacktrace$1, - preventXHR: preventXHR$1, - forceWindowClose: forceWindowClose$1, - preventRefresh: preventRefresh$1, - preventElementSrcLoading: preventElementSrcLoading$1, - noTopics: noTopics$1, - trustedReplaceXhrResponse: trustedReplaceXhrResponse$1, - xmlPrune: xmlPrune$1, - m3uPrune: m3uPrune$1, - trustedSetCookie: trustedSetCookie$1, - trustedSetCookieReload: trustedSetCookieReload$1, - trustedReplaceFetchResponse: trustedReplaceFetchResponse$1, - trustedSetLocalStorageItem: trustedSetLocalStorageItem$1, - trustedSetConstant: trustedSetConstant$1, - injectCssInShadowDom: injectCssInShadowDom$1 - }); +/***/ }), - /** - * Store of ADG redirects names and their analogs. - * As it is not a compatibility table, no need to keep in redirects array third-party redirects. - * - * Needed only for conversion purposes. - * e.g. googletagmanager-gtm is removed and should be removed from compatibility table as well - * but now it works as alias for google-analytics so it should stay valid for compiler - */ - const redirects$1 = [{ - adg: '1x1-transparent.gif', - ubo: '1x1.gif', - abp: '1x1-transparent-gif' - }, { - adg: '2x2-transparent.png', - ubo: '2x2.png', - abp: '2x2-transparent-png' - }, { - adg: '3x2-transparent.png', - ubo: '3x2.png', - abp: '3x2-transparent-png' - }, { - adg: '32x32-transparent.png', - ubo: '32x32.png', - abp: '32x32-transparent-png' - }, { - adg: 'amazon-apstag', - ubo: 'amazon_apstag.js' - }, { - adg: 'ati-smarttag' - }, { - adg: 'didomi-loader' - }, { - adg: 'click2load.html', - ubo: 'click2load.html' - }, { - adg: 'fingerprintjs2', - ubo: 'fingerprint2.js' - }, { - adg: 'fingerprintjs3', - ubo: 'fingerprint3.js' - }, { - adg: 'google-analytics', - ubo: 'google-analytics_analytics.js' - }, { - adg: 'google-analytics-ga', - ubo: 'google-analytics_ga.js' - }, { - adg: 'googlesyndication-adsbygoogle', - ubo: 'googlesyndication_adsbygoogle.js' - }, { - // https://github.com/AdguardTeam/Scriptlets/issues/162 - adg: 'googlesyndication-adsbygoogle', - ubo: 'googlesyndication.com/adsbygoogle.js' - }, { - // https://github.com/AdguardTeam/Scriptlets/issues/127 - adg: 'googletagmanager-gtm', - ubo: 'google-analytics_ga.js' - }, { - // https://github.com/AdguardTeam/Scriptlets/issues/260 - adg: 'googletagmanager-gtm', - ubo: 'googletagmanager_gtm.js' - }, { - adg: 'googletagservices-gpt', - ubo: 'googletagservices_gpt.js' - }, { - adg: 'google-ima3', - ubo: 'google-ima.js' - }, { - adg: 'gemius' - }, { - adg: 'matomo' - }, { - adg: 'metrika-yandex-watch' - }, { - adg: 'metrika-yandex-tag' - }, { - adg: 'naver-wcslog' - }, { - adg: 'noeval', - ubo: 'noeval-silent.js' - }, { - adg: 'noopcss', - ubo: 'noop.css', - abp: 'blank-css' - }, { - adg: 'noopframe', - ubo: 'noop.html', - abp: 'blank-html' - }, { - adg: 'noopjs', - ubo: 'noop.js', - abp: 'blank-js' - }, { - adg: 'noopjson' - }, { - adg: 'nooptext', - ubo: 'noop.txt', - abp: 'blank-text' - }, { - adg: 'noopmp3-0.1s', - ubo: 'noop-0.1s.mp3', - abp: 'blank-mp3' - }, { - adg: 'noopmp4-1s', - ubo: 'noop-1s.mp4', - abp: 'blank-mp4' - }, { - adg: 'noopvmap-1.0', - ubo: 'noop-vmap1.0.xml' - }, { - adg: 'noopvast-2.0' - }, { - adg: 'noopvast-3.0' - }, { - adg: 'noopvast-4.0' - }, { - adg: 'prebid' - }, { - adg: 'pardot-1.0' - }, { - adg: 'prevent-bab', - ubo: 'nobab.js' - }, { - adg: 'prevent-bab2', - ubo: 'nobab2.js' - }, { - adg: 'prevent-fab-3.2.0', - ubo: 'nofab.js' - }, { - // AG-15917 - adg: 'prevent-fab-3.2.0', - ubo: 'fuckadblock.js-3.2.0' - }, { - adg: 'prevent-popads-net', - ubo: 'popads.js' - }, { - adg: 'scorecardresearch-beacon', - ubo: 'scorecardresearch_beacon.js' - }, { - adg: 'set-popads-dummy', - ubo: 'popads-dummy.js' - }, { - adg: 'empty', - ubo: 'empty' - }, { - adg: 'prebid-ads', - ubo: 'prebid-ads.js' - }]; +/***/ 4758: +/***/ ((module) => { - const JS_RULE_MARKER = '#%#'; - const COMMENT_MARKER = '!'; +var ceil = Math.ceil; +var floor = Math.floor; - /** - * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false) - * - * @param {string} rule rule text - * @returns {boolean} if rule text is comment - */ - const isComment = function isComment(rule) { - return startsWith$1(rule, COMMENT_MARKER); - }; +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; - /* ************************************************************************ - * - * Scriptlets - * - ************************************************************************** */ - /** - * uBlock scriptlet rule mask - */ - const UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\s*\+js/; - const UBO_SCRIPTLET_MASK_1 = '##+js'; - const UBO_SCRIPTLET_MASK_2 = '##script:inject'; - const UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js'; - const UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject'; +/***/ }), - /** - * AdBlock Plus snippet rule mask - */ - const ABP_SCRIPTLET_MASK = '#$#'; - const ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#'; +/***/ 6277: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * AdGuard CSS rule mask - */ - const ADG_CSS_MASK_REG = /#@?\$#.+?\s*\{.*\}\s*$/g; +var toString = __webpack_require__(1340); - /** - * Checks if the `rule` is AdGuard scriptlet rule - * - * @param {string} rule - rule text - * @returns {boolean} if given rule is adg rule - */ - const isAdgScriptletRule = function isAdgScriptletRule(rule) { - return !isComment(rule) && rule.indexOf(ADG_SCRIPTLET_MASK) > -1; - }; +module.exports = function (argument, $default) { + return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); +}; - /** - * Checks if the `rule` is uBO scriptlet rule - * - * @param {string} rule rule text - * @returns {boolean} if given rule is ubo rule - */ - const isUboScriptletRule = function isUboScriptletRule(rule) { - return (rule.indexOf(UBO_SCRIPTLET_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_MASK_2) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_2) > -1) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule); - }; - /** - * Checks if the `rule` is AdBlock Plus snippet - * - * @param {string} rule rule text - * @returns {boolean} if given rule is abp rule - */ - const isAbpSnippetRule = function isAbpSnippetRule(rule) { - return (rule.indexOf(ABP_SCRIPTLET_MASK) > -1 || rule.indexOf(ABP_SCRIPTLET_EXCEPTION_MASK) > -1) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule); - }; +/***/ }), - /** - * Returns array of scriptlet objects. - * Needed for scriptlet name validation which will check aliases names. - * - * @returns {Array} Array of all scriptlet objects. - */ - const getScriptletsObjList = function getScriptletsObjList() { - return Object.values(scriptletList); - }; +/***/ 30: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Finds scriptlet by the `name`. - * - * @param {string} name Scriptlet name. - * @param {Array} scriptlets Array of all scriptlet objects. - * @returns {Function} Scriptlet function. - */ - const getScriptletByName = function getScriptletByName(name, scriptlets) { - if (!scriptlets) { - scriptlets = getScriptletsObjList(); - } - return scriptlets.find(function (s) { - return s.names - // full match name checking - && (s.names.indexOf(name) > -1 - // or check ubo alias name without '.js' at the end - || !endsWith(name, '.js') && s.names.indexOf("".concat(name, ".js")) > -1); - }); - }; - const scriptletObjects = getScriptletsObjList(); +/* global ActiveXObject -- old IE, WSH */ +var anObject = __webpack_require__(9670); +var definePropertiesModule = __webpack_require__(6048); +var enumBugKeys = __webpack_require__(748); +var hiddenKeys = __webpack_require__(3501); +var html = __webpack_require__(490); +var documentCreateElement = __webpack_require__(317); +var sharedKey = __webpack_require__(6200); - /** - * Checks whether the scriptlet `name` is valid by checking the scriptlet list object. - * - * @param {string} name Scriptlet name. - * @returns {boolean} True if scriptlet name is valid. - */ - const isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) { - if (!name) { - return false; - } - const scriptlet = getScriptletByName(name, scriptletObjects); - if (!scriptlet) { - return false; - } - return true; - }; +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); - /** - * Cache for better performance of scriptlet name validation. - */ - const scriptletNameValidationCache = new Map(); +var EmptyConstructor = function () { /* empty */ }; - /** - * Checks whether the `name` is valid scriptlet name. - * Uses cache for better performance. - * - * @param {string} name Scriptlet name. - * @returns {boolean} True if scriptlet name is valid. - */ - const isValidScriptletName = function isValidScriptletName(name) { - if (!name) { - return false; - } - // if there is no cached validation value - if (!scriptletNameValidationCache.has(name)) { - // we should calculate it first - const isValid = isValidScriptletNameNotCached(name); - // and save it to the cache then - scriptletNameValidationCache.set(name, isValid); - return isValid; - } - // otherwise return cached validation result - return scriptletNameValidationCache.get(name); - }; +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; - /* ************************************************************************ - * - * Redirects - * - ************************************************************************** */ +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; - /** - * Redirect resources markers - */ - const ADG_UBO_REDIRECT_MARKER = 'redirect='; - const ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule='; - const ABP_REDIRECT_MARKER = 'rewrite=abp-resource:'; - const EMPTY_REDIRECT_MARKER = 'empty'; - const VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other']; +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; - /** - * Source types for redirect rules if there is no one of them. - * Used for ADG -> UBO conversion. - */ - const ABSENT_SOURCE_TYPE_REPLACEMENT = [{ - NAME: 'nooptext', - TYPES: VALID_SOURCE_TYPES - }, { - NAME: 'noopcss', - TYPES: ['stylesheet'] - }, { - NAME: 'noopjs', - TYPES: ['script'] - }, { - NAME: 'noopframe', - TYPES: ['subdocument'] - }, { - NAME: '1x1-transparent.gif', - TYPES: ['image'] - }, { - NAME: 'noopmp3-0.1s', - TYPES: ['media'] - }, { - NAME: 'noopmp4-1s', - TYPES: ['media'] - }, { - NAME: 'googlesyndication-adsbygoogle', - TYPES: ['xmlhttprequest', 'script'] - }, { - NAME: 'google-analytics', - TYPES: ['script'] - }, { - NAME: 'googletagservices-gpt', - TYPES: ['script'] - }]; - const validAdgRedirects = redirects$1.filter(function (el) { - return el.adg; - }); +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; - /** - * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names - * It's used for UBO -> ADG converting - */ - const uboToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { - return el.ubo; - }).map(function (el) { - return [el.ubo, el.adg]; - })); +hiddenKeys[IE_PROTO] = true; - /** - * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names - * It's used for ABP -> ADG converting - */ - const abpToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { - return el.abp; - }).map(function (el) { - return [el.abp, el.adg]; - })); +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; - /** - * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names - * It's used for ADG -> UBO converting - */ - const adgToUboCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { - return el.ubo; - }).map(function (el) { - return [el.adg, el.ubo]; - })); - /** - * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names - * 'adgToUboCompatibility' is still needed for ADG -> UBO converting - */ - const validAdgCompatibility = getObjectFromEntries(validAdgRedirects.map(function (el) { - return [el.adg, 'valid adg redirect']; - })); - const REDIRECT_RULE_TYPES = { - VALID_ADG: { - redirectMarker: ADG_UBO_REDIRECT_MARKER, - redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER, - compatibility: validAdgCompatibility - }, - ADG: { - redirectMarker: ADG_UBO_REDIRECT_MARKER, - redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER, - compatibility: adgToUboCompatibility - }, - UBO: { - redirectMarker: ADG_UBO_REDIRECT_MARKER, - redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER, - compatibility: uboToAdgCompatibility - }, - ABP: { - redirectMarker: ABP_REDIRECT_MARKER, - compatibility: abpToAdgCompatibility - } - }; - - /** - * Parses redirect rule modifiers - * - * @param {string} rule rule text - * @returns {Array} list of rule modifiers - */ - const parseModifiers = function parseModifiers(rule) { - return substringAfter$1(rule, '$').split(','); - }; - - /** - * Gets redirect resource name - * - * @param {string} rule rule text - * @param {string} marker - specific Adg/Ubo or Abp redirect resources marker - * @returns {string} - redirect resource name - */ - const getRedirectName = function getRedirectName(rule, marker) { - const ruleModifiers = parseModifiers(rule); - const redirectNamePart = ruleModifiers.find(function (el) { - return el.includes(marker); - }); - return substringAfter$1(redirectNamePart, marker); - }; +/***/ }), - /** - * Checks if the `rule` is AdGuard redirect rule. - * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier. - * - * @param {string} rule - rule text - * @returns {boolean} if given rule is adg redirect - */ - const isAdgRedirectRule = function isAdgRedirectRule(rule) { - const MARKER_IN_BASE_PART_MASK = '/((?!\\$|\\,).{1})redirect((-rule)?)=(.{0,}?)\\$(popup)?/'; - return !isComment(rule) && (rule.includes(REDIRECT_RULE_TYPES.ADG.redirectMarker) || rule.includes(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker)) - // some js rules may have 'redirect=' in it, so we should get rid of them - && !rule.includes(JS_RULE_MARKER) - // get rid of rules like '_redirect=*://look.$popup' - && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule); - }; +/***/ 6048: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - // const getRedirectResourceMarkerData = () +var DESCRIPTORS = __webpack_require__(9781); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(3353); +var definePropertyModule = __webpack_require__(3070); +var anObject = __webpack_require__(9670); +var toIndexedObject = __webpack_require__(5656); +var objectKeys = __webpack_require__(1956); - /** - * Checks if the `rule` satisfies the `type` - * - * @param {string} rule - rule text - * @param {'VALID_ADG'|'ADG'|'UBO'|'ABP'} type - type of a redirect rule - * @returns {boolean} if the `rule` satisfies the `type` - */ - const isRedirectRuleByType = function isRedirectRuleByType(rule, type) { - const _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[type], - redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, - redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker, - compatibility = _REDIRECT_RULE_TYPES$.compatibility; - if (rule && !isComment(rule)) { - let marker; - // check if there is a $redirect-rule modifier in rule - let markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1; - if (markerIndex > -1) { - marker = redirectRuleMarker; - } else { - // check if there $redirect modifier in rule - markerIndex = rule.indexOf(redirectMarker); - if (markerIndex > -1) { - marker = redirectMarker; - } else { - return false; - } - } - const redirectName = getRedirectName(rule, marker); - if (!redirectName) { - return false; - } - return redirectName === Object.keys(compatibility).find(function (el) { - return el === redirectName; - }); - } - return false; - }; +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; - /** - * Checks if the `rule` is **valid** AdGuard redirect resource rule - * - * @param {string} rule - rule text - * @returns {boolean} if given rule is valid adg redirect - */ - const isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) { - return isRedirectRuleByType(rule, 'VALID_ADG'); - }; - /** - * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion - * - * @param {string} rule - AdGuard rule text - * @returns {boolean} - true if the rule can be converted to Ubo - */ - const isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) { - return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, 'ADG'); - }; +/***/ }), - /** - * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion - * - * @param {string} rule - Ubo rule text - * @returns {boolean} - true if the rule can be converted to AdGuard - */ - const isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) { - return isRedirectRuleByType(rule, 'UBO'); - }; +/***/ 3070: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - /** - * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion - * - * @param {string} rule - Abp rule text - * @returns {boolean} - true if the rule can be converted to AdGuard - */ - const isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) { - return isRedirectRuleByType(rule, 'ABP'); - }; +var DESCRIPTORS = __webpack_require__(9781); +var IE8_DOM_DEFINE = __webpack_require__(4664); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(3353); +var anObject = __webpack_require__(9670); +var toPropertyKey = __webpack_require__(4948); - /** - * Checks if the rule has specified content type before Adg -> Ubo conversion. - * - * Used ONLY for Adg -> Ubo conversion - * because Ubo redirect rules must contain content type, but Adg and Abp must not. - * - * Also source type can not be added automatically because of such valid rules: - * ! Abp: - * $rewrite=abp-resource:blank-js,xmlhttprequest - * ! Adg: - * $script,redirect=noopvast-2.0 - * $xmlhttprequest,redirect=noopvast-2.0 - * - * @param {string} rule rule text - * @returns {boolean} if the rule has specified content type before conversion - */ - const hasValidContentType = function hasValidContentType(rule) { - const ruleModifiers = parseModifiers(rule); - // rule can have more than one source type modifier - const sourceTypes = ruleModifiers.filter(function (el) { - return VALID_SOURCE_TYPES.includes(el); - }); - const isSourceTypeSpecified = sourceTypes.length > 0; - const isEmptyRedirect = ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER)); - if (isEmptyRedirect) { - // no source type for 'empty' is allowed - return true; - } - return isSourceTypeSpecified; - }; - const validator = { - UBO_SCRIPTLET_MASK_REG, - ABP_SCRIPTLET_MASK, - ABP_SCRIPTLET_EXCEPTION_MASK, - isComment, - isAdgScriptletRule, - isUboScriptletRule, - isAbpSnippetRule, - getScriptletByName, - isValidScriptletName, - ADG_UBO_REDIRECT_RULE_MARKER, - REDIRECT_RULE_TYPES, - ABSENT_SOURCE_TYPE_REPLACEMENT, - isAdgRedirectRule, - isValidAdgRedirectRule, - isAdgRedirectCompatibleWithUbo, - isUboRedirectCompatibleWithAdg, - isAbpRedirectCompatibleWithAdg, - parseModifiers, - getRedirectName, - hasValidContentType - }; +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; } - var arrayWithHoles = _arrayWithHoles; + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - var iterableToArray = _iterableToArray; - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - return arr2; - } - var arrayLikeToArray = _arrayLikeToArray; +/***/ }), - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); - } - var unsupportedIterableToArray = _unsupportedIterableToArray; +/***/ 1236: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - var nonIterableRest = _nonIterableRest; +var DESCRIPTORS = __webpack_require__(9781); +var call = __webpack_require__(6916); +var propertyIsEnumerableModule = __webpack_require__(5296); +var createPropertyDescriptor = __webpack_require__(9114); +var toIndexedObject = __webpack_require__(5656); +var toPropertyKey = __webpack_require__(4948); +var hasOwn = __webpack_require__(2597); +var IE8_DOM_DEFINE = __webpack_require__(4664); - function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); - } - var toArray$1 = _toArray; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - /** - * AdGuard scriptlet rule - */ - const ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; - // eslint-disable-next-line no-template-curly-in-string - const ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; - // eslint-disable-next-line no-template-curly-in-string - const ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})'; +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; - /** - * uBlock scriptlet rule mask - */ - // eslint-disable-next-line no-template-curly-in-string - const UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; - // eslint-disable-next-line no-template-curly-in-string - const UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})'; - const UBO_ALIAS_NAME_MARKER = 'ubo-'; - const UBO_SCRIPTLET_JS_ENDING = '.js'; - // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr - const UBO_XHR_TYPE = 'xhr'; - const ADG_XHR_TYPE = 'xmlhttprequest'; - const ADG_SET_CONSTANT_NAME = 'set-constant'; - const ADG_SET_CONSTANT_EMPTY_STRING = ''; - const ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr'; - const ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj'; - const UBO_SET_CONSTANT_EMPTY_STRING = '\'\''; - const UBO_SET_CONSTANT_EMPTY_ARRAY = '[]'; - const UBO_SET_CONSTANT_EMPTY_OBJECT = '{}'; - const ADG_PREVENT_FETCH_NAME = 'prevent-fetch'; - const ADG_PREVENT_FETCH_EMPTY_STRING = ''; - const ADG_PREVENT_FETCH_WILDCARD = '*'; - const UBO_NO_FETCH_IF_WILDCARD = '/^/'; - const ESCAPED_COMMA_SEPARATOR = '\\,'; - const COMMA_SEPARATOR = ','; - const REMOVE_ATTR_METHOD = 'removeAttr'; - const REMOVE_CLASS_METHOD = 'removeClass'; - const REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names; - const REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names; - const ADG_REMOVE_ATTR_NAME = REMOVE_ATTR_ALIASES[0]; - const ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0]; - const REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; +/***/ }), - /** - * Returns array of strings separated by space which is not in quotes - * - * @param {string} str arbitrary string - * @returns {string[]} result array - */ - const getSentences = function getSentences(str) { - const reg = /'.*?'|".*?"|\S+/g; - return str.match(reg); - }; +/***/ 8006: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - /** - * Replaces string with data by placeholders - * - * @param {string} str string with placeholders - * @param {Object} data where keys are placeholders names - * @returns {string} string filled with data - */ - const replacePlaceholders = function replacePlaceholders(str, data) { - return Object.keys(data).reduce(function (acc, key) { - const reg = new RegExp("\\$\\{".concat(key, "\\}"), 'g'); - acc = acc.replace(reg, data[key]); - return acc; - }, str); - }; - const splitArgs = function splitArgs(str) { - const args = []; - let prevArgStart = 0; - for (let i = 0; i < str.length; i += 1) { - // do not split args by escaped comma - // https://github.com/AdguardTeam/Scriptlets/issues/133 - if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\') { - args.push(str.slice(prevArgStart, i).trim()); - prevArgStart = i + 1; - } - } - // collect arg after last comma - args.push(str.slice(prevArgStart, str.length).trim()); - return args; - }; +var internalObjectKeys = __webpack_require__(6324); +var enumBugKeys = __webpack_require__(748); - /** - * Validates remove-attr/class scriptlet args - * - * @param {string[]} parsedArgs scriptlet arguments - * @returns {string[]|Error} valid args OR error for invalid selector - */ - const validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) { - const _parsedArgs = toArray$1(parsedArgs), - name = _parsedArgs[0], - value = _parsedArgs[1], - restArgs = _parsedArgs.slice(2); - // no extra checking if there are only scriptlet name and value - // https://github.com/AdguardTeam/Scriptlets/issues/235 - if (restArgs.length === 0) { - return [name, value]; - } +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); - // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should: - // 1. check if last arg is 'applying' parameter - // 2. join 'selector' into one arg - // 3. combine all args - // https://github.com/AdguardTeam/Scriptlets/issues/133 - const lastArg = restArgs.pop(); - let applying; - // check the last parsed arg for matching possible 'applying' vale - if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) { - return lastArg.indexOf(el) > -1; - })) { - applying = lastArg; - } else { - restArgs.push(lastArg); - } - const selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR); - if (selector.length > 0 && typeof document !== 'undefined') { - // empty selector is valid for these scriptlets as it applies to all elements, - // all other selectors should be validated - // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html') - document.querySelectorAll(selector); - } - const validArgs = applying ? [name, value, selector, applying] : [name, value, selector]; - return validArgs; - }; +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; - /** - * Converts string of UBO scriptlet rule to AdGuard scriptlet rule - * - * @param {string} rule UBO scriptlet rule - * @returns {string[]} array with one AdGuard scriptlet rule - */ - const convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) { - const domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG); - const mask = rule.match(validator.UBO_SCRIPTLET_MASK_REG)[0]; - let template; - if (mask.indexOf('@') > -1) { - template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; - } else { - template = ADGUARD_SCRIPTLET_TEMPLATE; - } - const argsStr = getStringInBraces(rule); - let parsedArgs = splitArgs(argsStr); - const scriptletName = parsedArgs[0].indexOf(UBO_SCRIPTLET_JS_ENDING) > -1 ? "ubo-".concat(parsedArgs[0]) : "ubo-".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING); - if (REMOVE_ATTR_ALIASES.indexOf(scriptletName) > -1 || REMOVE_CLASS_ALIASES.indexOf(scriptletName) > -1) { - parsedArgs = validateRemoveAttrClassArgs(parsedArgs); - } - const args = parsedArgs.map(function (arg, index) { - let outputArg = arg; - if (index === 0) { - outputArg = scriptletName; - } - // for example: example.org##+js(abort-current-inline-script, $, popup) - if (arg === '$') { - outputArg = '$$'; - } - return outputArg; - }).map(function (arg) { - return wrapInSingleQuotes(arg); - }).join("".concat(COMMA_SEPARATOR, " ")); - const adgRule = replacePlaceholders(template, { - domains, - args - }); - return [adgRule]; - }; - /** - * Convert string of ABP snippet rule to AdGuard scriptlet rule - * - * @param {string} rule ABP snippet rule - * @returns {Array} array of AdGuard scriptlet rules, one or few items depends on Abp-rule - */ - const convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) { - const SEMICOLON_DIVIDER = /;(?=(?:(?:[^"]*"){2})*[^"]*$)/g; - const mask = rule.indexOf(validator.ABP_SCRIPTLET_MASK) > -1 ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK; - const template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; - const domains = substringBefore(rule, mask); - const args = substringAfter$1(rule, mask); - return args.split(SEMICOLON_DIVIDER) - // abp-rule may have `;` at the end which makes last array item irrelevant - // https://github.com/AdguardTeam/Scriptlets/issues/236 - .filter(isExisting).map(function (args) { - return getSentences(args).map(function (arg, index) { - return index === 0 ? "abp-".concat(arg) : arg; - }).map(function (arg) { - return wrapInSingleQuotes(arg); - }).join("".concat(COMMA_SEPARATOR, " ")); - }).map(function (args) { - return replacePlaceholders(template, { - domains, - args - }); - }); - }; +/***/ }), - /** - * Validates ADG scriptlet rule syntax. - * - * IMPORTANT! The method is not very fast as it parses the rule and checks its syntax. - * - * @param {string} adgRuleText Single ADG scriptlet rule. - * - * @returns {boolean} False if ADG scriptlet rule syntax is not valid - * or `adgRuleText` is not an ADG scriptlet rule. - */ - const isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) { - if (!adgRuleText) { - return false; - } - if (!validator.isAdgScriptletRule(adgRuleText)) { - return false; - } - // isAdgScriptletRule() does not check the rule syntax - let parsedRule; - try { - // parseRule() ensures that the rule syntax is valid - // and it will throw an error if it is not - parsedRule = parseRule(adgRuleText); - return validator.isValidScriptletName(parsedRule.name); - } catch (e) { - return false; - } - }; +/***/ 5181: +/***/ ((__unused_webpack_module, exports) => { - /** - * Converts any scriptlet rule into AdGuard syntax rule. - * Comment is returned as is. - * - * @param {string} rule Scriptlet rule. - * - * @returns {string[]} Array of AdGuard scriptlet rules: one array item for ADG and UBO or few items for ABP. - * For the ADG `rule`, validates its syntax and returns an empty array if it is invalid. - */ - const convertScriptletToAdg = function convertScriptletToAdg(rule) { - let result; - // TODO: multiple conditions may be refactored - if (validator.isUboScriptletRule(rule)) { - result = convertUboScriptletToAdg(rule); - } else if (validator.isAbpSnippetRule(rule)) { - result = convertAbpSnippetToAdg(rule); - } else if (validator.isAdgScriptletRule(rule)) { - if (isValidAdgScriptletRuleSyntax(rule)) { - result = [rule]; - } else { - // eslint-disable-next-line no-console - console.log("Invalid AdGuard scriptlet rule: ".concat(rule)); - result = []; - } - } else if (validator.isComment(rule)) { - result = [rule]; - } - return result; - }; +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; - /** - * Converts UBO scriptlet rule to AdGuard one - * - * @param {string} rule AdGuard scriptlet rule - * @returns {string} UBO scriptlet rule - */ - const convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) { - let res; - if (validator.isAdgScriptletRule(rule)) { - const _parseRule = parseRule(rule), - parsedName = _parseRule.name, - parsedParams = _parseRule.args; - let preparedParams; - if (parsedName === ADG_SET_CONSTANT_NAME - // https://github.com/AdguardTeam/FiltersCompiler/issues/102 - && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { - preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; - } else if (parsedName === ADG_SET_CONSTANT_NAME - // https://github.com/uBlockOrigin/uBlock-issues/issues/2411 - && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) { - preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY]; - } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) { - preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT]; - } else if (parsedName === ADG_PREVENT_FETCH_NAME - // https://github.com/AdguardTeam/Scriptlets/issues/109 - && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) { - preparedParams = [UBO_NO_FETCH_IF_WILDCARD]; - } else if ((parsedName === ADG_REMOVE_ATTR_NAME || parsedName === ADG_REMOVE_CLASS_NAME) && parsedParams[1] && parsedParams[1].indexOf(COMMA_SEPARATOR) > -1) { - preparedParams = [parsedParams[0], replaceAll(parsedParams[1], COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR)]; - } else { - preparedParams = parsedParams; - } - // object of name and aliases for the Adg-scriptlet - const adgScriptletObject = Object.keys(scriptletList).map(function (el) { - return scriptletList[el]; - }).map(function (s) { - const _s$names = toArray$1(s.names), - name = _s$names[0], - aliases = _s$names.slice(1); - return { - name, - aliases - }; - }).find(function (el) { - return el.name === parsedName || el.aliases.indexOf(parsedName) >= 0; - }); - const aliases = adgScriptletObject.aliases; - if (aliases.length > 0) { - const uboAlias = adgScriptletObject.aliases - // eslint-disable-next-line no-restricted-properties - .find(function (alias) { - return alias.includes(UBO_ALIAS_NAME_MARKER); - }); - if (uboAlias) { - const mask = rule.match(ADGUARD_SCRIPTLET_MASK_REG)[0]; - let template; - if (mask.indexOf('@') > -1) { - template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE; - } else { - template = UBO_SCRIPTLET_TEMPLATE; - } - const domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG); - const uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') - // '.js' in the Ubo scriptlet name can be omitted - // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets - .replace(UBO_SCRIPTLET_JS_ENDING, ''); - const args = preparedParams.length > 0 ? "".concat(uboName, ", ").concat(preparedParams.join("".concat(COMMA_SEPARATOR, " "))) : uboName; - const uboRule = replacePlaceholders(template, { - domains, - args - }); - res = uboRule; - } - } - } - return res; - }; +/***/ }), - /** - * Returns scriptlet name from `rule`. - * - * @param {string} rule AdGuard syntax scriptlet rule. - * @returns {string|null} Scriptlet name or null. - */ - const getAdgScriptletName = function getAdgScriptletName(rule) { - // get substring after '#//scriptlet(' - let buffer = substringAfter$1(rule, "".concat(ADG_SCRIPTLET_MASK, "(")); - if (!buffer) { - return null; - } - // get the quote used for the first scriptlet parameter which is a name - const nameQuote = buffer[0]; - // delete the quote from the buffer - buffer = buffer.slice(1); - if (!buffer) { - return null; - } - // get a supposed scriptlet name - const name = substringBefore(buffer, nameQuote); - return name === buffer ? null : name; - }; +/***/ 7976: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * 1. For ADG scriptlet checks whether the scriptlet syntax and name are valid. - * 2. For UBO and ABP scriptlet first checks their compatibility with ADG - * by converting them into ADG syntax, and after that checks the name. - * - * ADG or UBO rules are "single-scriptlet", but ABP rule may contain more than one snippet - * so if at least one of them is not valid — whole `ruleText` rule is not valid too. - * - * @param {string} ruleText Any scriptlet rule — ADG or UBO or ABP. - * - * @returns {boolean} True if scriptlet name is valid in rule. - */ - const isValidScriptletRule = function isValidScriptletRule(ruleText) { - if (!ruleText) { - return false; - } +var uncurryThis = __webpack_require__(1702); - // `ruleText` with ABP syntax may contain more than one snippet in one rule - const rulesArray = convertScriptletToAdg(ruleText); +module.exports = uncurryThis({}.isPrototypeOf); - // for ADG rule with invalid syntax convertScriptletToAdg() will return empty array - if (rulesArray.length === 0) { - return false; - } - // checking if each of parsed scriptlets is valid - // if at least one of them is not valid - whole `ruleText` is not valid too - const isValid = rulesArray.every(function (rule) { - const name = getAdgScriptletName(rule); - return validator.isValidScriptletName(name); - }); - return isValid; - }; +/***/ }), - /** - * Gets index and redirect resource marker from UBO/ADG modifiers array - * - * @param {string[]} modifiers rule modifiers - * @param {Object} redirectsData validator.REDIRECT_RULE_TYPES.(UBO|ADG) - * @param {string} rule rule string - * @returns {Object} { index, marker } - */ - const getMarkerData = function getMarkerData(modifiers, redirectsData, rule) { - let marker; - let index = modifiers.findIndex(function (m) { - return m.indexOf(redirectsData.redirectRuleMarker) > -1; - }); - if (index > -1) { - marker = redirectsData.redirectRuleMarker; - } else { - index = modifiers.findIndex(function (m) { - return m.indexOf(redirectsData.redirectMarker) > -1; - }); - if (index > -1) { - marker = redirectsData.redirectMarker; - } else { - throw new Error("No redirect resource modifier found in rule: ".concat(rule)); - } - } - return { - index, - marker - }; - }; +/***/ 6324: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * Converts Ubo redirect rule to Adg one - * - * @param {string} rule ubo redirect rule - * @returns {string} converted adg rule - */ - const convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) { - const firstPartOfRule = substringBefore(rule, '$'); - const uboModifiers = validator.parseModifiers(rule); - const uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule); - const adgModifiers = uboModifiers.map(function (modifier, index) { - if (index === uboMarkerData.index) { - const uboName = substringAfter$1(modifier, uboMarkerData.marker); - const adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName]; - const adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker; - return "".concat(adgMarker).concat(adgName); - } - if (modifier === UBO_XHR_TYPE) { - return ADG_XHR_TYPE; - } - return modifier; - }).join(COMMA_SEPARATOR); - return "".concat(firstPartOfRule, "$").concat(adgModifiers); - }; +var uncurryThis = __webpack_require__(1702); +var hasOwn = __webpack_require__(2597); +var toIndexedObject = __webpack_require__(5656); +var indexOf = (__webpack_require__(1318).indexOf); +var hiddenKeys = __webpack_require__(3501); - /** - * Converts Abp redirect rule to Adg one - * - * @param {string} rule abp redirect rule - * @returns {string} converted adg rule - */ - const convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) { - const firstPartOfRule = substringBefore(rule, '$'); - const abpModifiers = validator.parseModifiers(rule); - const adgModifiers = abpModifiers.map(function (modifier) { - if (modifier.indexOf(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker) > -1) { - const abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker); - const adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName]; - return "".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName); - } - return modifier; - }).join(COMMA_SEPARATOR); - return "".concat(firstPartOfRule, "$").concat(adgModifiers); - }; +var push = uncurryThis([].push); - /** - * Converts redirect rule to AdGuard one - * - * @param {string} rule redirect rule - * @returns {string} converted adg rule - */ - const convertRedirectToAdg = function convertRedirectToAdg(rule) { - let result; - if (validator.isUboRedirectCompatibleWithAdg(rule)) { - result = convertUboRedirectToAdg(rule); - } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) { - result = convertAbpRedirectToAdg(rule); - } else if (validator.isValidAdgRedirectRule(rule)) { - result = rule; - } - return result; - }; +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; - /** - * Converts Adg redirect rule to Ubo one - * 1. Checks if there is Ubo analog for Adg rule - * 2. Parses the rule and checks if there are any source type modifiers which are required by Ubo - * and if there are no one we add it manually to the end. - * Source types are chosen according to redirect name - * e.g. ||ad.com^$redirect=,important ->> ||ad.com^$redirect=,important,script - * 3. Replaces Adg redirect name by Ubo analog - * - * @param {string} rule adg rule - * @returns {string} converted ubo rule - * @throws on incompatible rule - */ - const convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) { - if (!validator.isAdgRedirectCompatibleWithUbo(rule)) { - throw new Error("Unable to convert for uBO - unsupported redirect in rule: ".concat(rule)); - } - const basePart = substringBefore(rule, '$'); - const adgModifiers = validator.parseModifiers(rule); - const adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule); - const adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length); - if (!validator.hasValidContentType(rule)) { - // add missed source types as content type modifiers - const sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) { - return el.NAME === adgRedirectName; - }); - if (typeof sourceTypesData === 'undefined') { - // eslint-disable-next-line max-len - throw new Error("Unable to convert for uBO - no types to add for specific redirect in rule: ".concat(rule)); - } - const additionModifiers = sourceTypesData.TYPES; - adgModifiers.push(...additionModifiers); - } - const uboModifiers = adgModifiers.map(function (el, index) { - if (index === adgMarkerData.index) { - const uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; - // eslint-disable-next-line max-len - const uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName]; - return "".concat(uboMarker).concat(uboRedirectName); - } - return el; - }).join(COMMA_SEPARATOR); - return "".concat(basePart, "$").concat(uboModifiers); - }; - /** - * @redirect google-analytics - * @description - * Mocks Google's Analytics and Tag Manager APIs. - * [Covers obsolete googletagmanager-gtm redirect functionality](https://github.com/AdguardTeam/Scriptlets/issues/127). - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/8cd2a1d263a96421487b39040c1d23eb01169484/src/web_accessible_resources/google-analytics_analytics.js - * - * **Example** - * ``` - * ||google-analytics.com/analytics.js$script,redirect=google-analytics - * ||googletagmanager.com/gtm.js$script,redirect=googletagmanager-gtm - * ``` - */ - function GoogleAnalytics(source) { - // eslint-disable-next-line func-names - const Tracker = function Tracker() {}; // constructor - const proto = Tracker.prototype; - proto.get = noopFunc; - proto.set = noopFunc; - proto.send = noopFunc; - const googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; - // a -- fake arg for 'ga.length < 1' antiadblock checking - // eslint-disable-next-line no-unused-vars - function ga(a) { - const len = arguments.length; - if (len === 0) { - return; - } - // eslint-disable-next-line prefer-rest-params - const lastArg = arguments[len - 1]; - let replacer; - if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') { - replacer = lastArg.hitCallback; - } else if (typeof lastArg === 'function') { - // https://github.com/AdguardTeam/Scriptlets/issues/98 - replacer = function replacer() { - lastArg(ga.create()); - }; - } - try { - setTimeout(replacer, 1); - // eslint-disable-next-line no-empty - } catch (ex) {} - } - ga.create = function () { - return new Tracker(); - }; - // https://github.com/AdguardTeam/Scriptlets/issues/134 - ga.getByName = function () { - return new Tracker(); - }; - ga.getAll = function () { - return [new Tracker()]; - }; - ga.remove = noopFunc; - ga.loaded = true; - window[googleAnalyticsName] = ga; - const _window = window, - dataLayer = _window.dataLayer, - google_optimize = _window.google_optimize; // eslint-disable-line camelcase - if (dataLayer instanceof Object === false) { - return; - } - if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') { - dataLayer.hide.end(); - } +/***/ }), - /** - * checks data object and delays callback - * - * @param {object|Array} dataObj gtag payload - * @param {string} funcName callback prop name - */ - const handleCallback = function handleCallback(dataObj, funcName) { - if (dataObj && typeof dataObj[funcName] === 'function') { - setTimeout(dataObj[funcName]); - } - }; - if (typeof dataLayer.push === 'function') { - dataLayer.push = function (data) { - if (data instanceof Object) { - handleCallback(data, 'eventCallback'); - // eslint-disable-next-line no-restricted-syntax, guard-for-in - for (const key in data) { - handleCallback(data[key], 'event_callback'); - } - // eslint-disable-next-line no-prototype-builtins - if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) { - [].push.call(window.dataLayer, data); - } - } - if (Array.isArray(data)) { - data.forEach(function (arg) { - handleCallback(arg, 'callback'); - }); - } - return noopFunc; - }; - } +/***/ 1956: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // https://github.com/AdguardTeam/Scriptlets/issues/81 - // eslint-disable-next-line camelcase - if (google_optimize instanceof Object && typeof google_optimize.get === 'function') { - const googleOptimizeWrapper = { - get: noopFunc - }; - window.google_optimize = googleOptimizeWrapper; - } - hit(source); - } - GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js', - // https://github.com/AdguardTeam/Scriptlets/issues/127 - 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js']; - GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray]; +var internalObjectKeys = __webpack_require__(6324); +var enumBugKeys = __webpack_require__(748); - /* eslint-disable no-underscore-dangle */ +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; - /** - * @redirect google-analytics-ga - * @description - * Mocks old Google Analytics API. - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/google-analytics_ga.js - * - * **Example** - * ``` - * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga - * ``` - */ - function GoogleAnalyticsGa(source) { - // Gaq constructor - function Gaq() {} - Gaq.prototype.Na = noopFunc; - Gaq.prototype.O = noopFunc; - Gaq.prototype.Sa = noopFunc; - Gaq.prototype.Ta = noopFunc; - Gaq.prototype.Va = noopFunc; - Gaq.prototype._createAsyncTracker = noopFunc; - Gaq.prototype._getAsyncTracker = noopFunc; - Gaq.prototype._getPlugin = noopFunc; - Gaq.prototype.push = function (data) { - if (typeof data === 'function') { - data(); - return; - } - if (Array.isArray(data) === false) { - return; - } - // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link - // https://github.com/uBlockOrigin/uBlock-issues/issues/1807 - if (typeof data[0] === 'string' && /(^|\.)_link$/.test(data[0]) && typeof data[1] === 'string') { - window.location.assign(data[1]); - } - // https://github.com/gorhill/uBlock/issues/2162 - if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') { - data[2](); - } - }; - const gaq = new Gaq(); - const asyncTrackers = window._gaq || []; - if (Array.isArray(asyncTrackers)) { - while (asyncTrackers[0]) { - gaq.push(asyncTrackers.shift()); - } - } - // eslint-disable-next-line no-multi-assign - window._gaq = gaq.qf = gaq; - // Gat constructor - function Gat() {} +/***/ }), - // Mock tracker api - const api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode']; - const tracker = api.reduce(function (res, funcName) { - res[funcName] = noopFunc; - return res; - }, {}); - tracker._getLinkerUrl = function (a) { - return a; - }; - // https://github.com/AdguardTeam/Scriptlets/issues/154 - tracker._link = function (url) { - if (typeof url !== 'string') { - return; - } - try { - window.location.assign(url); - } catch (e) { - logMessage(source, e); - } - }; - Gat.prototype._anonymizeIP = noopFunc; - Gat.prototype._createTracker = noopFunc; - Gat.prototype._forceSSL = noopFunc; - Gat.prototype._getPlugin = noopFunc; - Gat.prototype._getTracker = function () { - return tracker; - }; - Gat.prototype._getTrackerByName = function () { - return tracker; - }; - Gat.prototype._getTrackers = noopFunc; - Gat.prototype.aa = noopFunc; - Gat.prototype.ab = noopFunc; - Gat.prototype.hb = noopFunc; - Gat.prototype.la = noopFunc; - Gat.prototype.oa = noopFunc; - Gat.prototype.pa = noopFunc; - Gat.prototype.u = noopFunc; - const gat = new Gat(); - window._gat = gat; - hit(source); - } - GoogleAnalyticsGa.names = ['google-analytics-ga', 'ubo-google-analytics_ga.js', 'google-analytics_ga.js']; - GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage]; +/***/ 5296: +/***/ ((__unused_webpack_module, exports) => { - /* eslint-disable max-len */ - /** - * @redirect googlesyndication-adsbygoogle - * @description - * Mocks Google AdSense API. - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/googlesyndication_adsbygoogle.js - * - * **Example** - * ``` - * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle - * ``` - */ - /* eslint-enable max-len */ - function GoogleSyndicationAdsByGoogle(source) { - window.adsbygoogle = { - // https://github.com/AdguardTeam/Scriptlets/issues/113 - // length: 0, - loaded: true, - // https://github.com/AdguardTeam/Scriptlets/issues/184 - push(arg) { - if (typeof this.length === 'undefined') { - this.length = 0; - this.length += 1; - } - if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') { - // eslint-disable-next-line no-restricted-syntax - for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) { - const key = _Object$keys[_i]; - if (typeof arg[key] === 'function') { - try { - // https://github.com/AdguardTeam/Scriptlets/issues/252 - // argument "{}" is needed to fix issue with undefined argument - arg[key].call(this, {}); - } catch (_unused) { - /* empty */ - } - } - } - } - } - }; - const adElems = document.querySelectorAll('.adsbygoogle'); - const css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;'; - const statusAttrName = 'data-adsbygoogle-status'; - const ASWIFT_IFRAME_MARKER = 'aswift_'; - const GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_'; - let executed = false; - for (let i = 0; i < adElems.length; i += 1) { - const adElemChildNodes = adElems[i].childNodes; - const childNodesQuantity = adElemChildNodes.length; - // childNodes of .adsbygoogle can be defined if scriptlet was executed before - // so we should check that childNodes are exactly defined by us - // TODO: remake after scriptlets context developing in 1.3 - let areIframesDefined = false; - if (childNodesQuantity > 0) { - // it should be only 2 child iframes if scriptlet was executed - areIframesDefined = childNodesQuantity === 2 - // the first of child nodes should be aswift iframe - && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1 - // the second of child nodes should be google_ads iframe - && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.indexOf(GOOGLE_ADS_IFRAME_MARKER) > -1; - } - if (!areIframesDefined) { - // here we do the job if scriptlet has not been executed earlier - adElems[i].setAttribute(statusAttrName, 'done'); - const aswiftIframe = document.createElement('iframe'); - aswiftIframe.id = "".concat(ASWIFT_IFRAME_MARKER).concat(i); - aswiftIframe.style = css; - adElems[i].appendChild(aswiftIframe); - const innerAswiftIframe = document.createElement('iframe'); - aswiftIframe.contentWindow.document.body.appendChild(innerAswiftIframe); - const googleadsIframe = document.createElement('iframe'); - googleadsIframe.id = "".concat(GOOGLE_ADS_IFRAME_MARKER).concat(i); - googleadsIframe.style = css; - adElems[i].appendChild(googleadsIframe); - const innerGoogleadsIframe = document.createElement('iframe'); - googleadsIframe.contentWindow.document.body.appendChild(innerGoogleadsIframe); - executed = true; - } - } - if (executed) { - hit(source); - } - } - GoogleSyndicationAdsByGoogle.names = ['googlesyndication-adsbygoogle', 'ubo-googlesyndication_adsbygoogle.js', 'googlesyndication_adsbygoogle.js']; - GoogleSyndicationAdsByGoogle.injections = [hit]; +"use strict"; - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - return _arr; - } - var iterableToArrayLimit = _iterableToArrayLimit; +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); - } - var slicedToArray = _slicedToArray; +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); - /** - * @redirect googletagservices-gpt - * @description - * Mocks Google Publisher Tag API. - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/googletagservices_gpt.js - * - * **Example** - * ``` - * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt - * ``` - */ - function GoogleTagServicesGpt(source) { - const slots = new Map(); - const slotsById = new Map(); - const slotsPerPath = new Map(); - const slotCreatives = new Map(); - const eventCallbacks = new Map(); - const gTargeting = new Map(); - const addEventListener = function addEventListener(name, listener) { - if (!eventCallbacks.has(name)) { - eventCallbacks.set(name, new Set()); - } - eventCallbacks.get(name).add(listener); - return this; - }; - const removeEventListener = function removeEventListener(name, listener) { - if (eventCallbacks.has(name)) { - return eventCallbacks.get(name).delete(listener); - } - return false; - }; - const fireSlotEvent = function fireSlotEvent(name, slot) { - return new Promise(function (resolve) { - requestAnimationFrame(function () { - const size = [0, 0]; - const callbacksSet = eventCallbacks.get(name) || []; - const callbackArray = Array.from(callbacksSet); - for (let i = 0; i < callbackArray.length; i += 1) { - callbackArray[i]({ - isEmpty: true, - size, - slot - }); - } - resolve(); - }); - }); - }; - const emptySlotElement = function emptySlotElement(slot) { - const node = document.getElementById(slot.getSlotElementId()); - while (node !== null && node !== void 0 && node.lastChild) { - node.lastChild.remove(); - } - }; - const recreateIframeForSlot = function recreateIframeForSlot(slot) { - var _document$getElementB; - const eid = "google_ads_iframe_".concat(slot.getId()); - (_document$getElementB = document.getElementById(eid)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove(); - const node = document.getElementById(slot.getSlotElementId()); - if (node) { - const f = document.createElement('iframe'); - f.id = eid; - f.srcdoc = ''; - f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0'; - f.setAttribute('width', 0); - f.setAttribute('height', 0); - // https://github.com/AdguardTeam/Scriptlets/issues/259 - f.setAttribute('data-load-complete', true); - f.setAttribute('data-google-container-id', true); - f.setAttribute('sandbox', true); - node.appendChild(f); - } - }; - const displaySlot = function displaySlot(slot) { - if (!slot) { - return; - } - const id = slot.getSlotElementId(); - if (!document.getElementById(id)) { - return; - } - const parent = document.getElementById(id); - if (parent) { - parent.appendChild(document.createElement('div')); - } - emptySlotElement(slot); - recreateIframeForSlot(slot); - fireSlotEvent('slotRenderEnded', slot); - fireSlotEvent('slotRequested', slot); - fireSlotEvent('slotResponseReceived', slot); - fireSlotEvent('slotOnload', slot); - fireSlotEvent('impressionViewable', slot); - }; - const companionAdsService = { - addEventListener, - removeEventListener, - enableSyncLoading: noopFunc, - setRefreshUnfilledSlots: noopFunc, - getSlots: noopArray - }; - const contentService = { - addEventListener, - removeEventListener, - setContent: noopFunc - }; - function PassbackSlot() {} // constructor +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; - PassbackSlot.prototype.display = noopFunc; - PassbackSlot.prototype.get = noopNull; - PassbackSlot.prototype.set = noopThis; - PassbackSlot.prototype.setClickUrl = noopThis; - PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis; - PassbackSlot.prototype.setTargeting = noopThis; - PassbackSlot.prototype.updateTargetingFromMap = noopThis; - function SizeMappingBuilder() {} // constructor - SizeMappingBuilder.prototype.addSize = noopThis; - SizeMappingBuilder.prototype.build = noopNull; - const getTargetingValue = function getTargetingValue(v) { - if (typeof v === 'string') { - return [v]; - } - try { - return [Array.prototype.flat.call(v)[0]]; - } catch (_unused) { - // do nothing - } - return []; - }; - const updateTargeting = function updateTargeting(targeting, map) { - if (typeof map === 'object') { - const entries = Object.entries(map || {}); - for (var _i = 0, _entries = entries; _i < _entries.length; _i++) { - const _entries$_i = slicedToArray(_entries[_i], 2), - k = _entries$_i[0], - v = _entries$_i[1]; - targeting.set(k, getTargetingValue(v)); - } - } - }; - const defineSlot = function defineSlot(adUnitPath, creatives, optDiv) { - if (slotsById.has(optDiv)) { - var _document$getElementB2; - (_document$getElementB2 = document.getElementById(optDiv)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.remove(); - return slotsById.get(optDiv); - } - const attributes = new Map(); - const targeting = new Map(); - const exclusions = new Set(); - const response = { - advertiserId: undefined, - campaignId: undefined, - creativeId: undefined, - creativeTemplateId: undefined, - lineItemId: undefined - }; - const sizes = [{ - getHeight: function getHeight() { - return 2; - }, - getWidth: function getWidth() { - return 2; - } - }]; - const num = (slotsPerPath.get(adUnitPath) || 0) + 1; - slotsPerPath.set(adUnitPath, num); - const id = "".concat(adUnitPath, "_").concat(num); - let clickUrl = ''; - let collapseEmptyDiv = null; - const services = new Set(); - const slot = { - addService(e) { - services.add(e); - return slot; - }, - clearCategoryExclusions: noopThis, - clearTargeting(k) { - if (k === undefined) { - targeting.clear(); - } else { - targeting.delete(k); - } - }, - defineSizeMapping(mapping) { - slotCreatives.set(optDiv, mapping); - return this; - }, - get: function get(k) { - return attributes.get(k); - }, - getAdUnitPath: function getAdUnitPath() { - return adUnitPath; - }, - getAttributeKeys: function getAttributeKeys() { - return Array.from(attributes.keys()); - }, - getCategoryExclusions: function getCategoryExclusions() { - return Array.from(exclusions); - }, - getClickUrl: function getClickUrl() { - return clickUrl; - }, - getCollapseEmptyDiv: function getCollapseEmptyDiv() { - return collapseEmptyDiv; - }, - getContentUrl: function getContentUrl() { - return ''; - }, - getDivStartsCollapsed: function getDivStartsCollapsed() { - return null; - }, - getDomId: function getDomId() { - return optDiv; - }, - getEscapedQemQueryId: function getEscapedQemQueryId() { - return ''; - }, - getFirstLook: function getFirstLook() { - return 0; - }, - getId: function getId() { - return id; - }, - getHtml: function getHtml() { - return ''; - }, - getName: function getName() { - return id; - }, - getOutOfPage: function getOutOfPage() { - return false; - }, - getResponseInformation: function getResponseInformation() { - return response; - }, - getServices: function getServices() { - return Array.from(services); - }, - getSizes: function getSizes() { - return sizes; - }, - getSlotElementId: function getSlotElementId() { - return optDiv; - }, - getSlotId: function getSlotId() { - return slot; - }, - getTargeting: function getTargeting(k) { - return targeting.get(k) || gTargeting.get(k) || []; - }, - getTargetingKeys: function getTargetingKeys() { - return Array.from(new Set(Array.of(...gTargeting.keys(), ...targeting.keys()))); - }, - getTargetingMap: function getTargetingMap() { - return Object.assign(Object.fromEntries(gTargeting.entries()), Object.fromEntries(targeting.entries())); - }, - set(k, v) { - attributes.set(k, v); - return slot; - }, - setCategoryExclusion(e) { - exclusions.add(e); - return slot; - }, - setClickUrl(u) { - clickUrl = u; - return slot; - }, - setCollapseEmptyDiv(v) { - collapseEmptyDiv = !!v; - return slot; - }, - setSafeFrameConfig: noopThis, - setTagForChildDirectedTreatment: noopThis, - setTargeting(k, v) { - targeting.set(k, getTargetingValue(v)); - return slot; - }, - toString: function toString() { - return id; - }, - updateTargetingFromMap(map) { - updateTargeting(targeting, map); - return slot; - } - }; - slots.set(adUnitPath, slot); - slotsById.set(optDiv, slot); - slotCreatives.set(optDiv, creatives); - return slot; - }; - const pubAdsService = { - addEventListener, - removeEventListener, - clear: noopFunc, - clearCategoryExclusions: noopThis, - clearTagForChildDirectedTreatment: noopThis, - clearTargeting(k) { - if (k === undefined) { - gTargeting.clear(); - } else { - gTargeting.delete(k); - } - }, - collapseEmptyDivs: noopFunc, - defineOutOfPagePassback() { - return new PassbackSlot(); - }, - definePassback() { - return new PassbackSlot(); - }, - disableInitialLoad: noopFunc, - display: noopFunc, - enableAsyncRendering: noopFunc, - enableLazyLoad: noopFunc, - enableSingleRequest: noopFunc, - enableSyncRendering: noopFunc, - enableVideoAds: noopFunc, - get: noopNull, - getAttributeKeys: noopArray, - getTargeting: noopArray, - getTargetingKeys: noopArray, - getSlots: noopArray, - isInitialLoadDisabled: trueFunc, - refresh: noopFunc, - set: noopThis, - setCategoryExclusion: noopThis, - setCentering: noopFunc, - setCookieOptions: noopThis, - setForceSafeFrame: noopThis, - setLocation: noopThis, - setPublisherProvidedId: noopThis, - setRequestNonPersonalizedAds: noopThis, - setSafeFrameConfig: noopThis, - setTagForChildDirectedTreatment: noopThis, - setTargeting: noopThis, - setVideoContent: noopThis, - updateCorrelator: noopFunc - }; - const _window = window, - _window$googletag = _window.googletag, - googletag = _window$googletag === void 0 ? {} : _window$googletag; - const _googletag$cmd = googletag.cmd, - cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd; - googletag.apiReady = true; - googletag.cmd = []; - googletag.cmd.push = function (a) { - try { - a(); - // eslint-disable-next-line no-empty - } catch (ex) {} - return 1; - }; - googletag.companionAds = function () { - return companionAdsService; - }; - googletag.content = function () { - return contentService; - }; - googletag.defineOutOfPageSlot = defineSlot; - googletag.defineSlot = defineSlot; - googletag.destroySlots = function () { - slots.clear(); - slotsById.clear(); - }; - googletag.disablePublisherConsole = noopFunc; - googletag.display = function (arg) { - let id; - if (arg !== null && arg !== void 0 && arg.getSlotElementId) { - id = arg.getSlotElementId(); - } else if (arg !== null && arg !== void 0 && arg.nodeType) { - id = arg.id; - } else { - id = String(arg); - } - displaySlot(slotsById.get(id)); - }; - googletag.enableServices = noopFunc; - googletag.getVersion = noopStr; - googletag.pubads = function () { - return pubAdsService; - }; - googletag.pubadsReady = true; - googletag.setAdIframeTitle = noopFunc; - googletag.sizeMapping = function () { - return new SizeMappingBuilder(); - }; - window.googletag = googletag; - while (cmd.length !== 0) { - googletag.cmd.push(cmd.shift()); - } - hit(source); - } - GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js']; - GoogleTagServicesGpt.injections = [hit, noopFunc, noopThis, noopNull, noopArray, noopStr, trueFunc]; - /** - * @redirect scorecardresearch-beacon - * @description - * Mocks Scorecard Research API. - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/scorecardresearch_beacon.js - * - * **Example** - * ``` - * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon - * ``` - */ - function ScoreCardResearchBeacon(source) { - window.COMSCORE = { - purge() { - // eslint-disable-next-line no-underscore-dangle - window._comscore = []; - }, - beacon() {} - }; - hit(source); - } - ScoreCardResearchBeacon.names = ['scorecardresearch-beacon', 'ubo-scorecardresearch_beacon.js', 'scorecardresearch_beacon.js']; - ScoreCardResearchBeacon.injections = [hit]; +/***/ }), - /** - * @redirect metrika-yandex-tag - * @description - * Mocks Yandex Metrika API. - * https://yandex.ru/support/metrica/objects/method-reference.html - * - * **Example** - * ``` - * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag - * ``` - */ - function metrikaYandexTag(source) { - const asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) { - let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - let callback = options.callback; - const ctx = options.ctx; - if (typeof callback === 'function') { - callback = ctx !== undefined ? callback.bind(ctx) : callback; - setTimeout(function () { - return callback(); - }); - } - }; +/***/ 7674: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * https://yandex.ru/support/metrica/objects/addfileextension.html - */ - const addFileExtension = noopFunc; +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = __webpack_require__(5668); +var anObject = __webpack_require__(9670); +var aPossiblePrototype = __webpack_require__(6077); - /** - * https://yandex.ru/support/metrica/objects/extlink.html - */ - const extLink = asyncCallbackFromOptions; +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); - /** - * https://yandex.ru/support/metrica/objects/file.html - */ - const file = asyncCallbackFromOptions; - /** - * https://yandex.ru/support/metrica/objects/get-client-id.html - * - * @param {string} id - * @param {Function} cb - */ - const getClientID = function getClientID(id, cb) { - if (!cb) { - return; - } - setTimeout(cb(null)); - }; +/***/ }), - /** - * https://yandex.ru/support/metrica/objects/hit.html - */ - const hitFunc = asyncCallbackFromOptions; +/***/ 2140: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * https://yandex.ru/support/metrica/objects/notbounce.html - */ - const notBounce = asyncCallbackFromOptions; +var call = __webpack_require__(6916); +var isCallable = __webpack_require__(614); +var isObject = __webpack_require__(111); - /** - * https://yandex.ru/support/metrica/objects/params-method.html - */ - const params = noopFunc; +var $TypeError = TypeError; - /** - * https://yandex.ru/support/metrica/objects/reachgoal.html - * - * @param {string} id - * @param {string} target - * @param {Object} params - * @param {Function} callback - * @param {any} ctx - */ - const reachGoal = function reachGoal(id, target, params, callback, ctx) { - asyncCallbackFromOptions(null, null, { - callback, - ctx - }); - }; +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw $TypeError("Can't convert object to primitive value"); +}; - /** - * https://yandex.ru/support/metrica/objects/set-user-id.html - */ - const setUserID = noopFunc; - /** - * https://yandex.ru/support/metrica/objects/user-params.html - */ - const userParams = noopFunc; +/***/ }), - // https://github.com/AdguardTeam/Scriptlets/issues/198 - const destruct = noopFunc; - const api = { - addFileExtension, - extLink, - file, - getClientID, - hit: hitFunc, - notBounce, - params, - reachGoal, - setUserID, - userParams, - destruct - }; - function ym(id, funcName) { - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return api[funcName] && api[funcName](id, ...args); - } - function init(id) { - // yaCounter object should provide api - window["yaCounter".concat(id)] = api; - document.dispatchEvent(new Event("yacounter".concat(id, "inited"))); - } - if (typeof window.ym === 'undefined') { - window.ym = ym; - ym.a = []; - } else if (window.ym && window.ym.a) { - // Keep initial counters array intact - ym.a = window.ym.a; - window.ym = ym; - window.ym.a.forEach(function (params) { - const id = params[0]; - init(id); - }); - } - hit(source); - } - metrikaYandexTag.names = ['metrika-yandex-tag']; - metrikaYandexTag.injections = [hit, noopFunc]; +/***/ 3887: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @redirect metrika-yandex-watch - * @description - * Mocks the old Yandex Metrika API. - * https://yandex.ru/support/metrica/objects/_method-reference.html - * - * **Example** - * ``` - * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch - * ``` - */ - function metrikaYandexWatch(source) { - const cbName = 'yandex_metrika_callbacks'; +var getBuiltIn = __webpack_require__(5005); +var uncurryThis = __webpack_require__(1702); +var getOwnPropertyNamesModule = __webpack_require__(8006); +var getOwnPropertySymbolsModule = __webpack_require__(5181); +var anObject = __webpack_require__(9670); - /** - * Gets callback and its context from options and call it in async way - * - * @param {Object} options Yandex Metrika API options - */ - const asyncCallbackFromOptions = function asyncCallbackFromOptions() { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let callback = options.callback; - const ctx = options.ctx; - if (typeof callback === 'function') { - callback = ctx !== undefined ? callback.bind(ctx) : callback; - setTimeout(function () { - return callback(); - }); - } - }; - function Metrika() {} // constructor - Metrika.counters = noopArray; - // Methods without options - Metrika.prototype.addFileExtension = noopFunc; - Metrika.prototype.getClientID = noopFunc; - Metrika.prototype.setUserID = noopFunc; - Metrika.prototype.userParams = noopFunc; - Metrika.prototype.params = noopFunc; - Metrika.prototype.counters = noopArray; +var concat = uncurryThis([].concat); - // Methods with options - // The order of arguments should be kept in according to API - Metrika.prototype.extLink = function (url, options) { - asyncCallbackFromOptions(options); - }; - Metrika.prototype.file = function (url, options) { - asyncCallbackFromOptions(options); - }; - Metrika.prototype.hit = function (url, options) { - asyncCallbackFromOptions(options); - }; - Metrika.prototype.reachGoal = function (target, params, cb, ctx) { - asyncCallbackFromOptions({ - callback: cb, - ctx - }); - }; - Metrika.prototype.notBounce = asyncCallbackFromOptions; - if (window.Ya) { - window.Ya.Metrika = Metrika; - } else { - window.Ya = { - Metrika - }; - } - if (window[cbName] && Array.isArray(window[cbName])) { - window[cbName].forEach(function (func) { - if (typeof func === 'function') { - func(); - } - }); - } - hit(source); - } - metrikaYandexWatch.names = ['metrika-yandex-watch']; - metrikaYandexWatch.injections = [hit, noopFunc, noopArray]; +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; - /* eslint-disable func-names */ - /** - * @redirect pardot-1.0 - * @description - * Mocks the pd.js file of Salesforce. - * https://pi.pardot.com/pd.js - * https://developer.salesforce.com/docs/marketing/pardot/overview - * - * **Example** - * ``` - * ||pi.pardot.com/pd.js$script,redirect=pardot - * ||pacedg.com.au/pd.js$redirect=pardot - * ``` - */ +/***/ }), - function Pardot(source) { - window.piVersion = '1.0.2'; - window.piScriptNum = 0; - window.piScriptObj = []; - window.checkNamespace = noopFunc; - window.getPardotUrl = noopStr; - window.piGetParameter = noopNull; - window.piSetCookie = noopFunc; - window.piGetCookie = noopStr; - function piTracker() { - window.pi = { - tracker: { - visitor_id: '', - visitor_id_sign: '', - pi_opt_in: '', - campaign_id: '' - } - }; - window.piScriptNum += 1; - } - window.piResponse = noopFunc; - window.piTracker = piTracker; - piTracker(); - hit(source); - } - Pardot.names = ['pardot-1.0']; - Pardot.injections = [hit, noopFunc, noopStr, noopNull]; +/***/ 2626: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @redirect prevent-bab - * @description - * Prevents BlockAdblock script from detecting an ad blocker. - * - * Mostly it is used as `scriptlet`. - * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab). - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/nobab.js - * - * **Example** - * ``` - * /blockadblock.$script,redirect=prevent-bab - * ``` - */ - const preventBab$1 = preventBab$2; - preventBab$1.names = ['prevent-bab', - // list of prevent-bab redirect aliases - 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; +var defineProperty = (__webpack_require__(3070).f); - /** - * @redirect amazon-apstag - * @description - * Mocks Amazon's apstag.js - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/f842ab6d3c1cf0394f95d27092bf59627262da40/src/web_accessible_resources/amazon_apstag.js - * - * **Example** - * ``` - * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag - * ``` - */ - function AmazonApstag(source) { - const apstagWrapper = { - fetchBids(a, b) { - if (typeof b === 'function') { - b([]); - } - }, - init: noopFunc, - setDisplayBids: noopFunc, - targetingKeys: noopFunc - }; - window.apstag = apstagWrapper; - hit(source); - } - AmazonApstag.names = ['amazon-apstag', 'ubo-amazon_apstag.js', 'amazon_apstag.js']; - AmazonApstag.injections = [hit, noopFunc]; +module.exports = function (Target, Source, key) { + key in Target || defineProperty(Target, key, { + configurable: true, + get: function () { return Source[key]; }, + set: function (it) { Source[key] = it; } + }); +}; - /* eslint-disable func-names */ - /** - * @redirect matomo - * @description - * Mocks the piwik.js file of Matomo (formerly Piwik). - * - * **Example** - * ``` - * ||example.org/piwik.js$script,redirect=matomo - * ``` - */ +/***/ }), - function Matomo(source) { - const Tracker = function Tracker() {}; - Tracker.prototype.setDoNotTrack = noopFunc; - Tracker.prototype.setDomains = noopFunc; - Tracker.prototype.setCustomDimension = noopFunc; - Tracker.prototype.trackPageView = noopFunc; - const AsyncTracker = function AsyncTracker() {}; - AsyncTracker.prototype.addListener = noopFunc; - const matomoWrapper = { - getTracker: Tracker, - getAsyncTracker: AsyncTracker - }; - window.Piwik = matomoWrapper; - hit(source); - } - Matomo.names = ['matomo']; - Matomo.injections = [hit, noopFunc]; +/***/ 4488: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* eslint-disable func-names */ +var isNullOrUndefined = __webpack_require__(8554); - /** - * @redirect fingerprintjs2 - * @description - * Mocks FingerprintJS v2 - * https://github.com/fingerprintjs - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint2.js - * - * **Example** - * ``` - * ||the-japan-news.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2 - * ``` - */ - function Fingerprintjs2(source) { - let browserId = ''; - for (let i = 0; i < 8; i += 1) { - browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); - } - const Fingerprint2 = function Fingerprint2() {}; - Fingerprint2.get = function (options, callback) { - if (!callback) { - callback = options; - } - setTimeout(function () { - if (callback) { - callback(browserId, []); - } - }, 1); - }; - Fingerprint2.prototype = { - get: Fingerprint2.get - }; - window.Fingerprint2 = Fingerprint2; - hit(source); - } - Fingerprintjs2.names = ['fingerprintjs2', - // redirect aliases are needed for conversion: - // prefixed for us - 'ubo-fingerprint2.js', - // original ubo name - 'fingerprint2.js']; - Fingerprintjs2.injections = [hit]; +var $TypeError = TypeError; - /* eslint-disable func-names */ +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw $TypeError("Can't call method on " + it); + return it; +}; - /** - * @redirect fingerprintjs3 - * @description - * Mocks FingerprintJS v3 - * https://github.com/fingerprintjs - * - * Related UBO redirect resource: - * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint3.js - * - * **Example** - * ``` - * ||sephora.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3 - * ``` - */ - function Fingerprintjs3(source) { - const visitorId = function () { - let id = ''; - for (let i = 0; i < 8; i += 1) { - id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); - } - return id; - }(); - const FingerprintJS = function FingerprintJS() {}; - FingerprintJS.prototype = { - load() { - return Promise.resolve(new FingerprintJS()); - }, - get() { - return Promise.resolve({ - visitorId - }); - }, - hashComponents: noopStr - }; - window.FingerprintJS = new FingerprintJS(); - hit(source); - } - Fingerprintjs3.names = ['fingerprintjs3', - // redirect aliases are needed for conversion: - // prefixed for us - 'ubo-fingerprint3.js', - // original ubo name - 'fingerprint3.js']; - Fingerprintjs3.injections = [hit, noopStr]; - /* eslint-disable func-names */ +/***/ }), - /** - * @redirect gemius - * @description - * Mocks Gemius Analytics. - * https://flowplayer.com/developers/plugins/gemius - * - * **Example** - * ``` - * ||gapt.hit.gemius.pl/gplayer.js$script,redirect=gemius - * ``` - */ - function Gemius(source) { - const GemiusPlayer = function GemiusPlayer() {}; - GemiusPlayer.prototype = { - setVideoObject: noopFunc, - newProgram: noopFunc, - programEvent: noopFunc, - newAd: noopFunc, - adEvent: noopFunc - }; - window.GemiusPlayer = GemiusPlayer; - hit(source); - } - Gemius.names = ['gemius']; - Gemius.injections = [hit, noopFunc]; +/***/ 6200: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @redirect ati-smarttag - * @description - * Mocks AT Internat SmartTag. - * https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/ - * - * **Example** - * ``` - * ||bloctel.gouv.fr/assets/scripts/smarttag.js$script,redirect=ati-smarttag - * ``` - */ - function ATInternetSmartTag(source) { - const setNoopFuncWrapper = { - set: noopFunc - }; - const sendNoopFuncWrapper = { - send: noopFunc - }; - const ecommerceWrapper = { - displayCart: { - products: setNoopFuncWrapper, - cart: setNoopFuncWrapper - }, - updateCart: { - cart: setNoopFuncWrapper - }, - displayProduct: { - products: setNoopFuncWrapper - }, - displayPageProduct: { - products: setNoopFuncWrapper - }, - addProduct: { - products: setNoopFuncWrapper - }, - removeProduct: { - products: setNoopFuncWrapper - } - }; +var shared = __webpack_require__(2309); +var uid = __webpack_require__(9711); - // eslint-disable-next-line new-cap, func-names - const tag = function tag() {}; - tag.prototype = { - setConfig: noopFunc, - setParam: noopFunc, - dispatch: noopFunc, - customVars: setNoopFuncWrapper, - publisher: setNoopFuncWrapper, - order: setNoopFuncWrapper, - click: sendNoopFuncWrapper, - clickListener: sendNoopFuncWrapper, - internalSearch: { - set: noopFunc, - send: noopFunc - }, - ecommerce: ecommerceWrapper, - identifiedVisitor: { - unset: noopFunc - }, - page: { - set: noopFunc, - send: noopFunc - }, - selfPromotion: { - add: noopFunc, - send: noopFunc - }, - privacy: { - setVisitorMode: noopFunc, - getVisitorMode: noopFunc, - hit: noopFunc - }, - richMedia: { - add: noopFunc, - send: noopFunc, - remove: noopFunc, - removeAll: noopFunc - } - }; - const smartTagWrapper = { - Tracker: { - Tag: tag - } - }; - window.ATInternet = smartTagWrapper; - hit(source); - } - ATInternetSmartTag.names = ['ati-smarttag']; - ATInternetSmartTag.injections = [hit, noopFunc]; +var keys = shared('keys'); - /* eslint-disable consistent-return, no-eval */ +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; - /** - * @redirect prevent-bab2 - * @description - * Prevents BlockAdblock script from detecting an ad blocker. - * - * Related UBO redirect: - * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab2.js - * - * See [redirect description](../wiki/about-redirects.md#prevent-bab2). - * - * **Syntax** - * ``` - * /blockadblock.$script,redirect=prevent-bab2 - * ``` - */ - function preventBab2(source) { - const script = document.currentScript; - if (script === null) { - return; - } - const url = script.src; - if (typeof url !== 'string') { - return; - } - const domainsStr = ['adclixx\\.net', 'adnetasia\\.com', 'adtrackers\\.net', 'bannertrack\\.net'].join('|'); - const matchStr = "^https?://[\\w-]+\\.(".concat(domainsStr, ")/."); - const domainsRegex = new RegExp(matchStr); - if (domainsRegex.test(url) === false) { - return; - } - window.nH7eXzOsG = 858; - hit(source); - } - preventBab2.names = ['prevent-bab2', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nobab2.js']; - preventBab2.injections = [hit]; - /* eslint-disable func-names, no-underscore-dangle */ +/***/ }), - /** - * @redirect google-ima3 - * @description - * Mocks the IMA SDK of Google. - * - * **Example** - * ``` - * ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima3 - * ``` - */ +/***/ 5465: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - function GoogleIma3(source) { - const VERSION = '3.453.0'; - const ima = {}; - const AdDisplayContainer = function AdDisplayContainer() {}; - AdDisplayContainer.prototype.destroy = noopFunc; - AdDisplayContainer.prototype.initialize = noopFunc; - const ImaSdkSettings = function ImaSdkSettings() {}; - ImaSdkSettings.CompanionBackfillMode = { - ALWAYS: 'always', - ON_MASTER_AD: 'on_master_ad' - }; - ImaSdkSettings.VpaidMode = { - DISABLED: 0, - ENABLED: 1, - INSECURE: 2 - }; - ImaSdkSettings.prototype = { - c: true, - f: {}, - i: false, - l: '', - p: '', - r: 0, - t: '', - v: '', - getCompanionBackfill: noopFunc, - getDisableCustomPlaybackForIOS10Plus() { - return this.i; - }, - getDisabledFlashAds: function getDisabledFlashAds() { - return true; - }, - getFeatureFlags() { - return this.f; - }, - getLocale() { - return this.l; - }, - getNumRedirects() { - return this.r; - }, - getPlayerType() { - return this.t; - }, - getPlayerVersion() { - return this.v; - }, - getPpid() { - return this.p; - }, - getVpaidMode() { - return this.C; - }, - isCookiesEnabled() { - return this.c; - }, - isVpaidAdapter() { - return this.M; - }, - setCompanionBackfill: noopFunc, - setAutoPlayAdBreaks(a) { - this.K = a; - }, - setCookiesEnabled(c) { - this.c = !!c; - }, - setDisableCustomPlaybackForIOS10Plus(i) { - this.i = !!i; - }, - setDisableFlashAds: noopFunc, - setFeatureFlags(f) { - this.f = !!f; - }, - setIsVpaidAdapter(a) { - this.M = a; - }, - setLocale(l) { - this.l = !!l; - }, - setNumRedirects(r) { - this.r = !!r; - }, - setPageCorrelator(a) { - this.R = a; - }, - setPlayerType(t) { - this.t = !!t; - }, - setPlayerVersion(v) { - this.v = !!v; - }, - setPpid(p) { - this.p = !!p; - }, - setVpaidMode(a) { - this.C = a; - }, - setSessionId: noopFunc, - setStreamCorrelator: noopFunc, - setVpaidAllowed: noopFunc, - CompanionBackfillMode: { - ALWAYS: 'always', - ON_MASTER_AD: 'on_master_ad' - }, - VpaidMode: { - DISABLED: 0, - ENABLED: 1, - INSECURE: 2 - } - }; - const EventHandler = function EventHandler() { - this.listeners = new Map(); - this._dispatch = function (e) { - const listeners = this.listeners.get(e.type) || []; - // eslint-disable-next-line no-restricted-syntax - for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) { - const listener = _Array$from[_i]; - try { - listener(e); - } catch (r) { - logMessage(source, r); - } - } - }; - this.addEventListener = function (t, c) { - if (!this.listeners.has(t)) { - this.listeners.set(t, new Set()); - } - this.listeners.get(t).add(c); - }; - this.removeEventListener = function (t, c) { - var _this$listeners$get; - (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c); - }; - }; - const AdsManager = new EventHandler(); - /* eslint-disable no-use-before-define */ - AdsManager.volume = 1; - AdsManager.collapse = noopFunc; - AdsManager.configureAdsManager = noopFunc; - AdsManager.destroy = noopFunc; - AdsManager.discardAdBreak = noopFunc; - AdsManager.expand = noopFunc; - AdsManager.focus = noopFunc; - AdsManager.getAdSkippableState = function () { - return false; - }; - AdsManager.getCuePoints = function () { - return [0]; - }; - AdsManager.getCurrentAd = function () { - return currentAd; - }; - AdsManager.getCurrentAdCuePoints = function () { - return []; - }; - AdsManager.getRemainingTime = function () { - return 0; - }; - AdsManager.getVolume = function () { - return this.volume; - }; - AdsManager.init = noopFunc; - AdsManager.isCustomClickTrackingUsed = function () { - return false; - }; - AdsManager.isCustomPlaybackUsed = function () { - return false; - }; - AdsManager.pause = noopFunc; - AdsManager.requestNextAdBreak = noopFunc; - AdsManager.resize = noopFunc; - AdsManager.resume = noopFunc; - AdsManager.setVolume = function (v) { - this.volume = v; - }; - AdsManager.skip = noopFunc; - AdsManager.start = function () { - // eslint-disable-next-line no-restricted-syntax - for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) { - const type = _arr[_i2]; - try { - this._dispatch(new ima.AdEvent(type)); - } catch (e) { - logMessage(source, e); - } - } - }; - AdsManager.stop = noopFunc; - AdsManager.updateAdsRenderingSettings = noopFunc; - /* eslint-enable no-use-before-define */ +var global = __webpack_require__(7854); +var defineGlobalProperty = __webpack_require__(3072); - const manager = Object.create(AdsManager); - const AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) { - this.type = type; - this.adsRequest = adsRequest; - this.userRequestContext = userRequestContext; - }; - AdsManagerLoadedEvent.prototype = { - getAdsManager: function getAdsManager() { - return manager; - }, - getUserRequestContext() { - if (this.userRequestContext) { - return this.userRequestContext; - } - return {}; - } - }; - AdsManagerLoadedEvent.Type = { - ADS_MANAGER_LOADED: 'adsManagerLoaded' - }; - const AdsLoader = EventHandler; - AdsLoader.prototype.settings = new ImaSdkSettings(); - AdsLoader.prototype.contentComplete = noopFunc; - AdsLoader.prototype.destroy = noopFunc; - AdsLoader.prototype.getSettings = function () { - return this.settings; - }; - AdsLoader.prototype.getVersion = function () { - return VERSION; - }; - AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) { - var _this = this; - requestAnimationFrame(function () { - const ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED; - const event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext); - _this._dispatch(event); - }); - const e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext); - requestAnimationFrame(function () { - _this._dispatch(new ima.AdErrorEvent(e)); - }); - }; - const AdsRenderingSettings = noopFunc; - const AdsRequest = function AdsRequest() {}; - AdsRequest.prototype = { - setAdWillAutoPlay: noopFunc, - setAdWillPlayMuted: noopFunc, - setContinuousPlayback: noopFunc - }; - const AdPodInfo = function AdPodInfo() {}; - AdPodInfo.prototype = { - getAdPosition: function getAdPosition() { - return 1; - }, - getIsBumper: function getIsBumper() { - return false; - }, - getMaxDuration: function getMaxDuration() { - return -1; - }, - getPodIndex: function getPodIndex() { - return 1; - }, - getTimeOffset: function getTimeOffset() { - return 0; - }, - getTotalAds: function getTotalAds() { - return 1; - } - }; - const Ad = function Ad() {}; - Ad.prototype = { - pi: new AdPodInfo(), - getAdId: function getAdId() { - return ''; - }, - getAdPodInfo() { - return this.pi; - }, - getAdSystem: function getAdSystem() { - return ''; - }, - getAdvertiserName: function getAdvertiserName() { - return ''; - }, - getApiFramework: function getApiFramework() { - return null; - }, - getCompanionAds: function getCompanionAds() { - return []; - }, - getContentType: function getContentType() { - return ''; - }, - getCreativeAdId: function getCreativeAdId() { - return ''; - }, - getDealId: function getDealId() { - return ''; - }, - getDescription: function getDescription() { - return ''; - }, - getDuration: function getDuration() { - return 8.5; - }, - getHeight: function getHeight() { - return 0; - }, - getMediaUrl: function getMediaUrl() { - return null; - }, - getMinSuggestedDuration: function getMinSuggestedDuration() { - return -2; - }, - getSkipTimeOffset: function getSkipTimeOffset() { - return -1; - }, - getSurveyUrl: function getSurveyUrl() { - return null; - }, - getTitle: function getTitle() { - return ''; - }, - getTraffickingParametersString: function getTraffickingParametersString() { - return ''; - }, - getUiElements: function getUiElements() { - return ['']; - }, - getUniversalAdIdRegistry: function getUniversalAdIdRegistry() { - return 'unknown'; - }, - getUniversalAdIds: function getUniversalAdIds() { - return ['']; - }, - getUniversalAdIdValue: function getUniversalAdIdValue() { - return 'unknown'; - }, - getVastMediaBitrate: function getVastMediaBitrate() { - return 0; - }, - getVastMediaHeight: function getVastMediaHeight() { - return 0; - }, - getVastMediaWidth: function getVastMediaWidth() { - return 0; - }, - getWidth: function getWidth() { - return 0; - }, - getWrapperAdIds: function getWrapperAdIds() { - return ['']; - }, - getWrapperAdSystems: function getWrapperAdSystems() { - return ['']; - }, - getWrapperCreativeIds: function getWrapperCreativeIds() { - return ['']; - }, - isLinear: function isLinear() { - return true; - }, - isSkippable() { - return true; - } - }; - const CompanionAd = function CompanionAd() {}; - CompanionAd.prototype = { - getAdSlotId: function getAdSlotId() { - return ''; - }, - getContent: function getContent() { - return ''; - }, - getContentType: function getContentType() { - return ''; - }, - getHeight: function getHeight() { - return 1; - }, - getWidth: function getWidth() { - return 1; - } - }; - const AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) { - this.errorCode = code; - this.message = message; - this.type = type; - this.adsRequest = adsRequest; - this.userRequestContext = userRequestContext; - this.getErrorCode = function () { - return this.errorCode; - }; - this.getInnerError = function () {}; - this.getMessage = function () { - return this.message; - }; - this.getType = function () { - return this.type; - }; - this.getVastErrorCode = function () { - return this.vastErrorCode; - }; - this.toString = function () { - return "AdError ".concat(this.errorCode, ": ").concat(this.message); - }; - }; - AdError.ErrorCode = {}; - AdError.Type = {}; - const isEngadget = function isEngadget() { - try { - // eslint-disable-next-line no-restricted-syntax - for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) { - var _ctx$getPlayer, _ctx$getPlayer$div; - const ctx = _Object$values[_i3]; - // eslint-disable-next-line no-restricted-properties - if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) { - return true; - } - } - } catch (e) {} // eslint-disable-line no-empty - return false; - }; - const currentAd = isEngadget() ? undefined : new Ad(); - const AdEvent = function AdEvent(type) { - this.type = type; - }; - AdEvent.prototype = { - getAd: function getAd() { - return currentAd; - }, - getAdData: function getAdData() {} - }; - AdEvent.Type = { - AD_BREAK_READY: 'adBreakReady', - AD_BUFFERING: 'adBuffering', - AD_CAN_PLAY: 'adCanPlay', - AD_METADATA: 'adMetadata', - AD_PROGRESS: 'adProgress', - ALL_ADS_COMPLETED: 'allAdsCompleted', - CLICK: 'click', - COMPLETE: 'complete', - CONTENT_PAUSE_REQUESTED: 'contentPauseRequested', - CONTENT_RESUME_REQUESTED: 'contentResumeRequested', - DURATION_CHANGE: 'durationChange', - EXPANDED_CHANGED: 'expandedChanged', - FIRST_QUARTILE: 'firstQuartile', - IMPRESSION: 'impression', - INTERACTION: 'interaction', - LINEAR_CHANGE: 'linearChange', - LINEAR_CHANGED: 'linearChanged', - LOADED: 'loaded', - LOG: 'log', - MIDPOINT: 'midpoint', - PAUSED: 'pause', - RESUMED: 'resume', - SKIPPABLE_STATE_CHANGED: 'skippableStateChanged', - SKIPPED: 'skip', - STARTED: 'start', - THIRD_QUARTILE: 'thirdQuartile', - USER_CLOSE: 'userClose', - VIDEO_CLICKED: 'videoClicked', - VIDEO_ICON_CLICKED: 'videoIconClicked', - VIEWABLE_IMPRESSION: 'viewable_impression', - VOLUME_CHANGED: 'volumeChange', - VOLUME_MUTED: 'mute' - }; - const AdErrorEvent = function AdErrorEvent(error) { - this.error = error; - this.type = 'adError'; - this.getError = function () { - return this.error; - }; - this.getUserRequestContext = function () { - var _this$error; - if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) { - return this.error.userRequestContext; - } - return {}; - }; - }; - AdErrorEvent.Type = { - AD_ERROR: 'adError' - }; - const CustomContentLoadedEvent = function CustomContentLoadedEvent() {}; - CustomContentLoadedEvent.Type = { - CUSTOM_CONTENT_LOADED: 'deprecated-event' - }; - const CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {}; - CompanionAdSelectionSettings.CreativeType = { - ALL: 'All', - FLASH: 'Flash', - IMAGE: 'Image' - }; - CompanionAdSelectionSettings.ResourceType = { - ALL: 'All', - HTML: 'Html', - IFRAME: 'IFrame', - STATIC: 'Static' - }; - CompanionAdSelectionSettings.SizeCriteria = { - IGNORE: 'IgnoreSize', - SELECT_EXACT_MATCH: 'SelectExactMatch', - SELECT_NEAR_MATCH: 'SelectNearMatch' - }; - const AdCuePoints = function AdCuePoints() {}; - AdCuePoints.prototype = { - getCuePoints: function getCuePoints() { - return []; - }, - getAdIdRegistry: function getAdIdRegistry() { - return ''; - }, - getAdIsValue: function getAdIsValue() { - return ''; - } - }; - const AdProgressData = noopFunc; - const UniversalAdIdInfo = function UniversalAdIdInfo() {}; - Object.assign(ima, { - AdCuePoints, - AdDisplayContainer, - AdError, - AdErrorEvent, - AdEvent, - AdPodInfo, - AdProgressData, - AdsLoader, - AdsManager: manager, - AdsManagerLoadedEvent, - AdsRenderingSettings, - AdsRequest, - CompanionAd, - CompanionAdSelectionSettings, - CustomContentLoadedEvent, - gptProxyInstance: {}, - ImaSdkSettings, - OmidAccessMode: { - DOMAIN: 'domain', - FULL: 'full', - LIMITED: 'limited' - }, - settings: new ImaSdkSettings(), - UiElements: { - AD_ATTRIBUTION: 'adAttribution', - COUNTDOWN: 'countdown' - }, - UniversalAdIdInfo, - VERSION, - ViewMode: { - FULLSCREEN: 'fullscreen', - NORMAL: 'normal' - } - }); - if (!window.google) { - window.google = {}; - } - window.google.ima = ima; - hit(source); - } - GoogleIma3.names = ['google-ima3', - // prefixed name - 'ubo-google-ima.js', - // original ubo name - 'google-ima.js']; - GoogleIma3.injections = [hit, noopFunc, logMessage]; +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || defineGlobalProperty(SHARED, {}); - /* eslint-disable func-names, no-underscore-dangle */ +module.exports = store; - /** - * @redirect didomi-loader - * @description - * Mocks Didomi's CMP loader script. - * https://developers.didomi.io/ - * - * **Example** - * ``` - * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader - * ``` - */ - function DidomiLoader(source) { - function UserConsentStatusForVendorSubscribe() {} - UserConsentStatusForVendorSubscribe.prototype.filter = function () { - return new UserConsentStatusForVendorSubscribe(); - }; - UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc; - function UserConsentStatusForVendor() {} - UserConsentStatusForVendor.prototype.first = function () { - return new UserConsentStatusForVendorSubscribe(); - }; - UserConsentStatusForVendor.prototype.filter = function () { - return new UserConsentStatusForVendorSubscribe(); - }; - UserConsentStatusForVendor.prototype.subscribe = noopFunc; - const DidomiWrapper = { - isConsentRequired: falseFunc, - getUserConsentStatusForPurpose: trueFunc, - getUserConsentStatus: trueFunc, - getUserStatus: noopFunc, - getRequiredPurposes: noopArray, - getUserConsentStatusForVendor: trueFunc, - Purposes: { - Cookies: 'cookies' - }, - notice: { - configure: noopFunc, - hide: noopFunc, - isVisible: falseFunc, - show: noopFunc, - showDataProcessing: trueFunc - }, - isUserConsentStatusPartial: falseFunc, - on() { - return { - actions: {}, - emitter: {}, - services: {}, - store: {} - }; - }, - shouldConsentBeCollected: falseFunc, - getUserConsentStatusForAll: noopFunc, - getObservableOnUserConsentStatusForVendor() { - return new UserConsentStatusForVendor(); - } - }; - window.Didomi = DidomiWrapper; - const didomiStateWrapper = { - didomiExperimentId: '', - didomiExperimentUserGroup: '', - didomiGDPRApplies: 1, - didomiIABConsent: '', - didomiPurposesConsent: '', - didomiPurposesConsentDenied: '', - didomiPurposesConsentUnknown: '', - didomiVendorsConsent: '', - didomiVendorsConsentDenied: '', - didomiVendorsConsentUnknown: '', - didomiVendorsRawConsent: '', - didomiVendorsRawConsentDenied: '', - didomiVendorsRawConsentUnknown: '' - }; - window.didomiState = didomiStateWrapper; - const tcData = { - eventStatus: 'tcloaded', - gdprApplies: false, - listenerId: noopFunc, - vendor: { - consents: [] - }, - purpose: { - consents: [] - } - }; - // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api - const __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) { - if (typeof callback !== 'function' || command === 'removeEventListener') { - return; - } - callback(tcData, true); - }; - window.__tcfapi = __tcfapiWrapper; - const didomiEventListenersWrapper = { - stub: true, - push: noopFunc - }; - window.didomiEventListeners = didomiEventListenersWrapper; - const didomiOnReadyWrapper = { - stub: true, - push(arg) { - if (typeof arg !== 'function') { - return; - } - if (document.readyState !== 'complete') { - window.addEventListener('load', function () { - setTimeout(arg(window.Didomi)); - }); - } else { - setTimeout(arg(window.Didomi)); - } - } - }; - window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper; - if (Array.isArray(window.didomiOnReady)) { - window.didomiOnReady.forEach(function (arg) { - if (typeof arg === 'function') { - try { - setTimeout(arg(window.Didomi)); - } catch (e) { - /* empty */ - } - } - }); - } - hit(source); - } - DidomiLoader.names = ['didomi-loader']; - DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc]; +/***/ }), - /* eslint-disable func-names */ +/***/ 2309: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @redirect prebid - * @description - * Mocks the prebid.js header bidding suit. - * https://docs.prebid.org/ - * - * **Example** - * ``` - * ||tmgrup.com.tr/bd/hb/prebid.js$script,redirect=prebid - * ``` - */ +var IS_PURE = __webpack_require__(1913); +var store = __webpack_require__(5465); - function Prebid(source) { - const pushFunction = function pushFunction(arg) { - if (typeof arg === 'function') { - try { - arg.call(); - } catch (ex) { - /* empty */ - } - } - }; - const pbjsWrapper = { - addAdUnits() {}, - adServers: { - dfp: { - // https://docs.prebid.org/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html - // returns ad URL - buildVideoUrl: noopStr - } - }, - adUnits: [], - aliasBidder() {}, - cmd: [], - enableAnalytics() {}, - getHighestCpmBids: noopArray, - libLoaded: true, - que: [], - requestBids(arg) { - if (arg instanceof Object && arg.bidsBackHandler) { - try { - arg.bidsBackHandler.call(); // https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html - } catch (ex) { - /* empty */ - } - } - }, - removeAdUnit() {}, - setBidderConfig() {}, - setConfig() {}, - setTargetingForGPTAsync() {} - }; - pbjsWrapper.cmd.push = pushFunction; - pbjsWrapper.que.push = pushFunction; - window.pbjs = pbjsWrapper; - hit(source); - } - Prebid.names = ['prebid']; - Prebid.injections = [hit, noopFunc, noopStr, noopArray]; +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.30.2', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)', + license: 'https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); - /* eslint-disable func-names */ - /** - * @redirect prebid-ads - * @description - * Sets predefined constants on a page: - * - `canRunAds`: `true` - * - `isAdBlockActive`: `false` - * - * **Example** - * ``` - * ||playerdrive.me/assets/js/prebid-ads.js$script,redirect=prebid-ads - * ``` - */ - function prebidAds(source) { - window.canRunAds = true; - window.isAdBlockActive = false; - hit(source); - } - prebidAds.names = ['prebid-ads', 'ubo-prebid-ads.js', 'prebid-ads.js']; - prebidAds.injections = [hit]; +/***/ }), - /* eslint-disable func-names */ +/***/ 6293: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /** - * @redirect naver-wcslog - * @description - * Mocks wcslog.js of Naver Analytics. - * - * **Example** - * ``` - * ||wcs.naver.net/wcslog.js$script,redirect=naver-wcslog - * ``` - */ +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = __webpack_require__(7392); +var fails = __webpack_require__(7293); +var global = __webpack_require__(7854); - function NaverWcslog(source) { - window.wcs_add = {}; - window.wcs_do = noopFunc; - window.wcs = { - inflow: noopFunc - }; - hit(source); - } - NaverWcslog.names = ['naver-wcslog']; - NaverWcslog.injections = [hit, noopFunc]; +var $String = global.String; - var redirectsList = /*#__PURE__*/Object.freeze({ - __proto__: null, - noeval: noeval$1, - GoogleAnalytics: GoogleAnalytics, - GoogleAnalyticsGa: GoogleAnalyticsGa, - GoogleSyndicationAdsByGoogle: GoogleSyndicationAdsByGoogle, - GoogleTagServicesGpt: GoogleTagServicesGpt, - ScoreCardResearchBeacon: ScoreCardResearchBeacon, - metrikaYandexTag: metrikaYandexTag, - metrikaYandexWatch: metrikaYandexWatch, - Pardot: Pardot, - preventFab: preventFab$1, - preventBab: preventBab$1, - setPopadsDummy: setPopadsDummy$1, - preventPopadsNet: preventPopadsNet$1, - AmazonApstag: AmazonApstag, - Matomo: Matomo, - Fingerprintjs2: Fingerprintjs2, - Fingerprintjs3: Fingerprintjs3, - Gemius: Gemius, - ATInternetSmartTag: ATInternetSmartTag, - preventBab2: preventBab2, - GoogleIma3: GoogleIma3, - DidomiLoader: DidomiLoader, - Prebid: Prebid, - prebidAds: prebidAds, - NaverWcslog: NaverWcslog - }); +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol(); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); - function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; - } - var defineProperty = _defineProperty; - function isNothing(subject) { - return typeof subject === 'undefined' || subject === null; - } - function isObject(subject) { - return typeof subject === 'object' && subject !== null; - } - function toArray(sequence) { - if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return []; - return [sequence]; - } - function extend(target, source) { - var index, length, key, sourceKeys; - if (source) { - sourceKeys = Object.keys(source); - for (index = 0, length = sourceKeys.length; index < length; index += 1) { - key = sourceKeys[index]; - target[key] = source[key]; - } - } - return target; - } - function repeat(string, count) { - var result = '', - cycle; - for (cycle = 0; cycle < count; cycle += 1) { - result += string; - } - return result; - } - function isNegativeZero(number) { - return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; - } - var isNothing_1 = isNothing; - var isObject_1 = isObject; - var toArray_1 = toArray; - var repeat_1 = repeat; - var isNegativeZero_1 = isNegativeZero; - var extend_1 = extend; - var common = { - isNothing: isNothing_1, - isObject: isObject_1, - toArray: toArray_1, - repeat: repeat_1, - isNegativeZero: isNegativeZero_1, - extend: extend_1 - }; +/***/ }), - // YAML error class. http://stackoverflow.com/questions/8458984 +/***/ 1400: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - function YAMLException$1(reason, mark) { - // Super constructor - Error.call(this); - this.name = 'YAMLException'; - this.reason = reason; - this.mark = mark; - this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); +var toIntegerOrInfinity = __webpack_require__(9303); - // Include stack trace in error object - if (Error.captureStackTrace) { - // Chrome and NodeJS - Error.captureStackTrace(this, this.constructor); - } else { - // FF, IE 10+ and Safari 6+. Fallback for others - this.stack = new Error().stack || ''; - } - } +var max = Math.max; +var min = Math.min; - // Inherit from Error - YAMLException$1.prototype = Object.create(Error.prototype); - YAMLException$1.prototype.constructor = YAMLException$1; - YAMLException$1.prototype.toString = function toString(compact) { - var result = this.name + ': '; - result += this.reason || '(unknown reason)'; - if (!compact && this.mark) { - result += ' ' + this.mark.toString(); - } - return result; - }; - var exception = YAMLException$1; +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; - function Mark(name, buffer, position, line, column) { - this.name = name; - this.buffer = buffer; - this.position = position; - this.line = line; - this.column = column; - } - Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { - var head, start, tail, end, snippet; - if (!this.buffer) return null; - indent = indent || 4; - maxLength = maxLength || 75; - head = ''; - start = this.position; - while (start > 0 && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(start - 1)) === -1) { - start -= 1; - if (this.position - start > maxLength / 2 - 1) { - head = ' ... '; - start += 5; - break; - } - } - tail = ''; - end = this.position; - while (end < this.buffer.length && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(end)) === -1) { - end += 1; - if (end - this.position > maxLength / 2 - 1) { - tail = ' ... '; - end -= 5; - break; - } - } - snippet = this.buffer.slice(start, end); - return common.repeat(' ', indent) + head + snippet + tail + '\n' + common.repeat(' ', indent + this.position - start + head.length) + '^'; - }; - Mark.prototype.toString = function toString(compact) { - var snippet, - where = ''; - if (this.name) { - where += 'in "' + this.name + '" '; - } - where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); - if (!compact) { - snippet = this.getSnippet(); - if (snippet) { - where += ':\n' + snippet; - } - } - return where; - }; - var mark = Mark; - var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases']; - var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping']; - function compileStyleAliases(map) { - var result = {}; - if (map !== null) { - Object.keys(map).forEach(function (style) { - map[style].forEach(function (alias) { - result[String(alias)] = style; - }); - }); - } - return result; - } - function Type$1(tag, options) { - options = options || {}; - Object.keys(options).forEach(function (name) { - if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { - throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); - } - }); +/***/ }), - // TODO: Add tag format check. - this.tag = tag; - this.kind = options['kind'] || null; - this.resolve = options['resolve'] || function () { - return true; - }; - this.construct = options['construct'] || function (data) { - return data; - }; - this.instanceOf = options['instanceOf'] || null; - this.predicate = options['predicate'] || null; - this.represent = options['represent'] || null; - this.defaultStyle = options['defaultStyle'] || null; - this.styleAliases = compileStyleAliases(options['styleAliases'] || null); - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { - throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); - } - } - var type = Type$1; +/***/ 5656: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /*eslint-disable max-len*/ +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(8361); +var requireObjectCoercible = __webpack_require__(4488); - function compileList(schema, name, result) { - var exclude = []; - schema.include.forEach(function (includedSchema) { - result = compileList(includedSchema, name, result); - }); - schema[name].forEach(function (currentType) { - result.forEach(function (previousType, previousIndex) { - if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) { - exclude.push(previousIndex); - } - }); - result.push(currentType); - }); - return result.filter(function (type, index) { - return exclude.indexOf(index) === -1; - }); - } - function compileMap( /* lists... */ - ) { - var result = { - scalar: {}, - sequence: {}, - mapping: {}, - fallback: {} - }, - index, - length; - function collectType(type) { - result[type.kind][type.tag] = result['fallback'][type.tag] = type; - } - for (index = 0, length = arguments.length; index < length; index += 1) { - arguments[index].forEach(collectType); - } - return result; - } - function Schema$1(definition) { - this.include = definition.include || []; - this.implicit = definition.implicit || []; - this.explicit = definition.explicit || []; - this.implicit.forEach(function (type) { - if (type.loadKind && type.loadKind !== 'scalar') { - throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); - } - }); - this.compiledImplicit = compileList(this, 'implicit', []); - this.compiledExplicit = compileList(this, 'explicit', []); - this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); - } - Schema$1.DEFAULT = null; - Schema$1.create = function createSchema() { - var schemas, types; - switch (arguments.length) { - case 1: - schemas = Schema$1.DEFAULT; - types = arguments[0]; - break; - case 2: - schemas = arguments[0]; - types = arguments[1]; - break; - default: - throw new exception('Wrong number of arguments for Schema.create function'); - } - schemas = common.toArray(schemas); - types = common.toArray(types); - if (!schemas.every(function (schema) { - return schema instanceof Schema$1; - })) { - throw new exception('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); - } - if (!types.every(function (type$1) { - return type$1 instanceof type; - })) { - throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); - } - return new Schema$1({ - include: schemas, - explicit: types - }); - }; - var schema = Schema$1; +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; - var str = new type('tag:yaml.org,2002:str', { - kind: 'scalar', - construct: function construct(data) { - return data !== null ? data : ''; - } - }); - var seq = new type('tag:yaml.org,2002:seq', { - kind: 'sequence', - construct: function construct(data) { - return data !== null ? data : []; - } - }); +/***/ }), - var map = new type('tag:yaml.org,2002:map', { - kind: 'mapping', - construct: function construct(data) { - return data !== null ? data : {}; - } - }); +/***/ 9303: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - var failsafe = new schema({ - explicit: [str, seq, map] - }); +var trunc = __webpack_require__(4758); - function resolveYamlNull(data) { - if (data === null) return true; - var max = data.length; - return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'); - } - function constructYamlNull() { - return null; - } - function isNull(object) { - return object === null; - } - var _null = new type('tag:yaml.org,2002:null', { - kind: 'scalar', - resolve: resolveYamlNull, - construct: constructYamlNull, - predicate: isNull, - represent: { - canonical: function canonical() { - return '~'; - }, - lowercase: function lowercase() { - return 'null'; - }, - uppercase: function uppercase() { - return 'NULL'; - }, - camelcase: function camelcase() { - return 'Null'; - } - }, - defaultStyle: 'lowercase' - }); +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; - function resolveYamlBoolean(data) { - if (data === null) return false; - var max = data.length; - return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'); - } - function constructYamlBoolean(data) { - return data === 'true' || data === 'True' || data === 'TRUE'; - } - function isBoolean(object) { - return Object.prototype.toString.call(object) === '[object Boolean]'; - } - var bool = new type('tag:yaml.org,2002:bool', { - kind: 'scalar', - resolve: resolveYamlBoolean, - construct: constructYamlBoolean, - predicate: isBoolean, - represent: { - lowercase: function lowercase(object) { - return object ? 'true' : 'false'; - }, - uppercase: function uppercase(object) { - return object ? 'TRUE' : 'FALSE'; - }, - camelcase: function camelcase(object) { - return object ? 'True' : 'False'; - } - }, - defaultStyle: 'lowercase' - }); - function isHexCode(c) { - return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */; - } +/***/ }), - function isOctCode(c) { - return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */; - } +/***/ 7466: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - function isDecCode(c) { - return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */; - } +var toIntegerOrInfinity = __webpack_require__(9303); - function resolveYamlInteger(data) { - if (data === null) return false; - var max = data.length, - index = 0, - hasDigits = false, - ch; - if (!max) return false; - ch = data[index]; +var min = Math.min; - // sign - if (ch === '-' || ch === '+') { - ch = data[++index]; - } - if (ch === '0') { - // 0 - if (index + 1 === max) return true; - ch = data[++index]; +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; - // base 2, base 8, base 16 - if (ch === 'b') { - // base 2 - index++; - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (ch !== '0' && ch !== '1') return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } - if (ch === 'x') { - // base 16 - index++; - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isHexCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } +/***/ }), - // base 8 - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isOctCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } +/***/ 7908: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // base 10 (except 0) or base 60 +var requireObjectCoercible = __webpack_require__(4488); - // value should not start with `_`; - if (ch === '_') return false; - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (ch === ':') break; - if (!isDecCode(data.charCodeAt(index))) { - return false; - } - hasDigits = true; - } +var $Object = Object; - // Should have digits and should not end with `_` - if (!hasDigits || ch === '_') return false; +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; - // if !base60 - done; - if (ch !== ':') return true; - // base60 almost not used, no needs to optimize - return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); - } - function constructYamlInteger(data) { - var value = data, - sign = 1, - ch, - base, - digits = []; - if (value.indexOf('_') !== -1) { - value = value.replace(/_/g, ''); - } - ch = value[0]; - if (ch === '-' || ch === '+') { - if (ch === '-') sign = -1; - value = value.slice(1); - ch = value[0]; - } - if (value === '0') return 0; - if (ch === '0') { - if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); - if (value[1] === 'x') return sign * parseInt(value, 16); - return sign * parseInt(value, 8); - } - if (value.indexOf(':') !== -1) { - value.split(':').forEach(function (v) { - digits.unshift(parseInt(v, 10)); - }); - value = 0; - base = 1; - digits.forEach(function (d) { - value += d * base; - base *= 60; - }); - return sign * value; - } - return sign * parseInt(value, 10); - } - function isInteger(object) { - return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common.isNegativeZero(object); - } - var int = new type('tag:yaml.org,2002:int', { - kind: 'scalar', - resolve: resolveYamlInteger, - construct: constructYamlInteger, - predicate: isInteger, - represent: { - binary: function binary(obj) { - return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); - }, - octal: function octal(obj) { - return obj >= 0 ? '0' + obj.toString(8) : '-0' + obj.toString(8).slice(1); - }, - decimal: function decimal(obj) { - return obj.toString(10); - }, - /* eslint-disable max-len */ - hexadecimal: function hexadecimal(obj) { - return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); - } - }, - defaultStyle: 'decimal', - styleAliases: { - binary: [2, 'bin'], - octal: [8, 'oct'], - decimal: [10, 'dec'], - hexadecimal: [16, 'hex'] - } - }); +/***/ }), - var YAML_FLOAT_PATTERN = new RegExp( - // 2.5e4, 2.5 and integers - '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + - // .2e4, .2 - // special case, seems not from spec - '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + - // 20:59 - '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + - // .inf - '|[-+]?\\.(?:inf|Inf|INF)' + - // .nan - '|\\.(?:nan|NaN|NAN))$'); - function resolveYamlFloat(data) { - if (data === null) return false; - if (!YAML_FLOAT_PATTERN.test(data) || - // Quick hack to not allow integers end with `_` - // Probably should update regexp & check speed - data[data.length - 1] === '_') { - return false; - } - return true; - } - function constructYamlFloat(data) { - var value, sign, base, digits; - value = data.replace(/_/g, '').toLowerCase(); - sign = value[0] === '-' ? -1 : 1; - digits = []; - if ('+-'.indexOf(value[0]) >= 0) { - value = value.slice(1); - } - if (value === '.inf') { - return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; - } else if (value === '.nan') { - return NaN; - } else if (value.indexOf(':') >= 0) { - value.split(':').forEach(function (v) { - digits.unshift(parseFloat(v, 10)); - }); - value = 0.0; - base = 1; - digits.forEach(function (d) { - value += d * base; - base *= 60; - }); - return sign * value; - } - return sign * parseFloat(value, 10); - } - var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; - function representYamlFloat(object, style) { - var res; - if (isNaN(object)) { - switch (style) { - case 'lowercase': - return '.nan'; - case 'uppercase': - return '.NAN'; - case 'camelcase': - return '.NaN'; - } - } else if (Number.POSITIVE_INFINITY === object) { - switch (style) { - case 'lowercase': - return '.inf'; - case 'uppercase': - return '.INF'; - case 'camelcase': - return '.Inf'; - } - } else if (Number.NEGATIVE_INFINITY === object) { - switch (style) { - case 'lowercase': - return '-.inf'; - case 'uppercase': - return '-.INF'; - case 'camelcase': - return '-.Inf'; - } - } else if (common.isNegativeZero(object)) { - return '-0.0'; - } - res = object.toString(10); +/***/ 7593: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // JS stringifier can build scientific format without dots: 5e-100, - // while YAML requres dot: 5.e-100. Fix it with simple hack +var call = __webpack_require__(6916); +var isObject = __webpack_require__(111); +var isSymbol = __webpack_require__(2190); +var getMethod = __webpack_require__(8173); +var ordinaryToPrimitive = __webpack_require__(2140); +var wellKnownSymbol = __webpack_require__(5112); - return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; - } - function isFloat(object) { - return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common.isNegativeZero(object)); - } - var float = new type('tag:yaml.org,2002:float', { - kind: 'scalar', - resolve: resolveYamlFloat, - construct: constructYamlFloat, - predicate: isFloat, - represent: representYamlFloat, - defaultStyle: 'lowercase' - }); +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - var json = new schema({ - include: [failsafe], - implicit: [_null, bool, int, float] - }); +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; - var core = new schema({ - include: [json] - }); - var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + - // [1] year - '-([0-9][0-9])' + - // [2] month - '-([0-9][0-9])$'); // [3] day +/***/ }), - var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + - // [1] year - '-([0-9][0-9]?)' + - // [2] month - '-([0-9][0-9]?)' + - // [3] day - '(?:[Tt]|[ \\t]+)' + - // ... - '([0-9][0-9]?)' + - // [4] hour - ':([0-9][0-9])' + - // [5] minute - ':([0-9][0-9])' + - // [6] second - '(?:\\.([0-9]*))?' + - // [7] fraction - '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + - // [8] tz [9] tz_sign [10] tz_hour - '(?::([0-9][0-9]))?))?$'); // [11] tz_minute +/***/ 4948: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - function resolveYamlTimestamp(data) { - if (data === null) return false; - if (YAML_DATE_REGEXP.exec(data) !== null) return true; - if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; - return false; - } - function constructYamlTimestamp(data) { - var match, - year, - month, - day, - hour, - minute, - second, - fraction = 0, - delta = null, - tz_hour, - tz_minute, - date; - match = YAML_DATE_REGEXP.exec(data); - if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); - if (match === null) throw new Error('Date resolve error'); +var toPrimitive = __webpack_require__(7593); +var isSymbol = __webpack_require__(2190); - // match: [1] year [2] month [3] day +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; - year = +match[1]; - month = +match[2] - 1; // JS month starts with 0 - day = +match[3]; - if (!match[4]) { - // no hour - return new Date(Date.UTC(year, month, day)); - } - // match: [4] hour [5] minute [6] second [7] fraction +/***/ }), - hour = +match[4]; - minute = +match[5]; - second = +match[6]; - if (match[7]) { - fraction = match[7].slice(0, 3); - while (fraction.length < 3) { - // milli-seconds - fraction += '0'; - } - fraction = +fraction; - } +/***/ 1694: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute +var wellKnownSymbol = __webpack_require__(5112); - if (match[9]) { - tz_hour = +match[10]; - tz_minute = +(match[11] || 0); - delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds - if (match[9] === '-') delta = -delta; - } - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); - if (delta) date.setTime(date.getTime() - delta); - return date; - } - function representYamlTimestamp(object /*, style*/) { - return object.toISOString(); - } - var timestamp = new type('tag:yaml.org,2002:timestamp', { - kind: 'scalar', - resolve: resolveYamlTimestamp, - construct: constructYamlTimestamp, - instanceOf: Date, - represent: representYamlTimestamp - }); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; - function resolveYamlMerge(data) { - return data === '<<' || data === null; - } - var merge = new type('tag:yaml.org,2002:merge', { - kind: 'scalar', - resolve: resolveYamlMerge - }); +test[TO_STRING_TAG] = 'z'; - function commonjsRequire (target) { - throw new Error('Could not dynamically require "' + target + '". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.'); - } +module.exports = String(test) === '[object z]'; - /*eslint-disable no-bitwise*/ - var NodeBuffer; - try { - // A trick for browserified version, to not include `Buffer` shim - var _require$1 = commonjsRequire; - NodeBuffer = _require$1('buffer').Buffer; - } catch (__) {} +/***/ }), - // [ 64, 65, 66 ] -> [ padding, CR, LF ] - var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - function resolveYamlBinary(data) { - if (data === null) return false; - var code, - idx, - bitlen = 0, - max = data.length, - map = BASE64_MAP; +/***/ 1340: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // Convert one by one. - for (idx = 0; idx < max; idx++) { - code = map.indexOf(data.charAt(idx)); +var classof = __webpack_require__(648); - // Skip CR/LF - if (code > 64) continue; +var $String = String; - // Fail on illegal characters - if (code < 0) return false; - bitlen += 6; - } +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; - // If there are any bits left, source was corrupted - return bitlen % 8 === 0; - } - function constructYamlBinary(data) { - var idx, - tailbits, - input = data.replace(/[\r\n=]/g, ''), - // remove CR/LF & padding to simplify scan - max = input.length, - map = BASE64_MAP, - bits = 0, - result = []; - // Collect by 6*4 bits (3 bytes) +/***/ }), - for (idx = 0; idx < max; idx++) { - if (idx % 4 === 0 && idx) { - result.push(bits >> 16 & 0xFF); - result.push(bits >> 8 & 0xFF); - result.push(bits & 0xFF); - } - bits = bits << 6 | map.indexOf(input.charAt(idx)); - } +/***/ 6330: +/***/ ((module) => { - // Dump tail +var $String = String; - tailbits = max % 4 * 6; - if (tailbits === 0) { - result.push(bits >> 16 & 0xFF); - result.push(bits >> 8 & 0xFF); - result.push(bits & 0xFF); - } else if (tailbits === 18) { - result.push(bits >> 10 & 0xFF); - result.push(bits >> 2 & 0xFF); - } else if (tailbits === 12) { - result.push(bits >> 4 & 0xFF); - } +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; - // Wrap into Buffer for NodeJS and leave Array for browser - if (NodeBuffer) { - // Support node 6.+ Buffer API when available - return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); - } - return result; - } - function representYamlBinary(object /*, style*/) { - var result = '', - bits = 0, - idx, - tail, - max = object.length, - map = BASE64_MAP; - // Convert every three bytes to 4 ASCII characters. +/***/ }), - for (idx = 0; idx < max; idx++) { - if (idx % 3 === 0 && idx) { - result += map[bits >> 18 & 0x3F]; - result += map[bits >> 12 & 0x3F]; - result += map[bits >> 6 & 0x3F]; - result += map[bits & 0x3F]; - } - bits = (bits << 8) + object[idx]; - } +/***/ 9711: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // Dump tail +var uncurryThis = __webpack_require__(1702); - tail = max % 3; - if (tail === 0) { - result += map[bits >> 18 & 0x3F]; - result += map[bits >> 12 & 0x3F]; - result += map[bits >> 6 & 0x3F]; - result += map[bits & 0x3F]; - } else if (tail === 2) { - result += map[bits >> 10 & 0x3F]; - result += map[bits >> 4 & 0x3F]; - result += map[bits << 2 & 0x3F]; - result += map[64]; - } else if (tail === 1) { - result += map[bits >> 2 & 0x3F]; - result += map[bits << 4 & 0x3F]; - result += map[64]; - result += map[64]; - } - return result; - } - function isBinary(object) { - return NodeBuffer && NodeBuffer.isBuffer(object); - } - var binary = new type('tag:yaml.org,2002:binary', { - kind: 'scalar', - resolve: resolveYamlBinary, - construct: constructYamlBinary, - predicate: isBinary, - represent: representYamlBinary - }); +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); - var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; - var _toString$2 = Object.prototype.toString; - function resolveYamlOmap(data) { - if (data === null) return true; - var objectKeys = [], - index, - length, - pair, - pairKey, - pairHasKey, - object = data; - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - pairHasKey = false; - if (_toString$2.call(pair) !== '[object Object]') return false; - for (pairKey in pair) { - if (_hasOwnProperty$3.call(pair, pairKey)) { - if (!pairHasKey) pairHasKey = true;else return false; - } - } - if (!pairHasKey) return false; - if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false; - } - return true; - } - function constructYamlOmap(data) { - return data !== null ? data : []; - } - var omap = new type('tag:yaml.org,2002:omap', { - kind: 'sequence', - resolve: resolveYamlOmap, - construct: constructYamlOmap - }); +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; - var _toString$1 = Object.prototype.toString; - function resolveYamlPairs(data) { - if (data === null) return true; - var index, - length, - pair, - keys, - result, - object = data; - result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - if (_toString$1.call(pair) !== '[object Object]') return false; - keys = Object.keys(pair); - if (keys.length !== 1) return false; - result[index] = [keys[0], pair[keys[0]]]; - } - return true; - } - function constructYamlPairs(data) { - if (data === null) return []; - var index, - length, - pair, - keys, - result, - object = data; - result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - keys = Object.keys(pair); - result[index] = [keys[0], pair[keys[0]]]; - } - return result; - } - var pairs = new type('tag:yaml.org,2002:pairs', { - kind: 'sequence', - resolve: resolveYamlPairs, - construct: constructYamlPairs - }); - var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; - function resolveYamlSet(data) { - if (data === null) return true; - var key, - object = data; - for (key in object) { - if (_hasOwnProperty$2.call(object, key)) { - if (object[key] !== null) return false; - } - } - return true; - } - function constructYamlSet(data) { - return data !== null ? data : {}; - } - var set = new type('tag:yaml.org,2002:set', { - kind: 'mapping', - resolve: resolveYamlSet, - construct: constructYamlSet - }); +/***/ }), - var default_safe = new schema({ - include: [core], - implicit: [timestamp, merge], - explicit: [binary, omap, pairs, set] - }); +/***/ 3307: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - function resolveJavascriptUndefined() { - return true; - } - function constructJavascriptUndefined() { - /*eslint-disable no-undefined*/ - return undefined; - } - function representJavascriptUndefined() { - return ''; - } - function isUndefined(object) { - return typeof object === 'undefined'; - } - var _undefined = new type('tag:yaml.org,2002:js/undefined', { - kind: 'scalar', - resolve: resolveJavascriptUndefined, - construct: constructJavascriptUndefined, - predicate: isUndefined, - represent: representJavascriptUndefined - }); +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = __webpack_require__(6293); - function resolveJavascriptRegExp(data) { - if (data === null) return false; - if (data.length === 0) return false; - var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; - // if regexp starts with '/' it can have modifiers and must be properly closed - // `/foo/gim` - modifiers tail can be maximum 3 chars - if (regexp[0] === '/') { - if (tail) modifiers = tail[1]; - if (modifiers.length > 3) return false; - // if expression starts with /, is should be properly terminated - if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; - } - return true; - } - function constructJavascriptRegExp(data) { - var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; - // `/foo/gim` - tail can be maximum 4 chars - if (regexp[0] === '/') { - if (tail) modifiers = tail[1]; - regexp = regexp.slice(1, regexp.length - modifiers.length - 1); - } - return new RegExp(regexp, modifiers); - } - function representJavascriptRegExp(object /*, style*/) { - var result = '/' + object.source + '/'; - if (object.global) result += 'g'; - if (object.multiline) result += 'm'; - if (object.ignoreCase) result += 'i'; - return result; - } - function isRegExp(object) { - return Object.prototype.toString.call(object) === '[object RegExp]'; - } - var regexp = new type('tag:yaml.org,2002:js/regexp', { - kind: 'scalar', - resolve: resolveJavascriptRegExp, - construct: constructJavascriptRegExp, - predicate: isRegExp, - represent: representJavascriptRegExp - }); +/***/ }), - var esprima; +/***/ 3353: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - // Browserified version does not have esprima - // - // 1. For node.js just require module as deps - // 2. For browser try to require mudule via external AMD system. - // If not found - try to fallback to window.esprima. If not - // found too - then fail to parse. - // - try { - // workaround to exclude package from browserify list. - var _require = commonjsRequire; - esprima = _require('esprima'); - } catch (_) { - /* eslint-disable no-redeclare */ - /* global window */ - if (typeof window !== 'undefined') esprima = window.esprima; - } - function resolveJavascriptFunction(data) { - if (data === null) return false; - try { - var source = '(' + data + ')', - ast = esprima.parse(source, { - range: true - }); - if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { - return false; - } - return true; - } catch (err) { - return false; - } - } - function constructJavascriptFunction(data) { - /*jslint evil:true*/ +var DESCRIPTORS = __webpack_require__(9781); +var fails = __webpack_require__(7293); - var source = '(' + data + ')', - ast = esprima.parse(source, { - range: true - }), - params = [], - body; - if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { - throw new Error('Failed to resolve function'); - } - ast.body[0].expression.params.forEach(function (param) { - params.push(param.name); - }); - body = ast.body[0].expression.body.range; +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype != 42; +}); - // Esprima's ranges include the first '{' and the last '}' characters on - // function expressions. So cut them out. - if (ast.body[0].expression.body.type === 'BlockStatement') { - /*eslint-disable no-new-func*/ - return new Function(params, source.slice(body[0] + 1, body[1] - 1)); - } - // ES6 arrow functions can omit the BlockStatement. In that case, just return - // the body. - /*eslint-disable no-new-func*/ - return new Function(params, 'return ' + source.slice(body[0], body[1])); - } - function representJavascriptFunction(object /*, style*/) { - return object.toString(); - } - function isFunction(object) { - return Object.prototype.toString.call(object) === '[object Function]'; - } - var _function = new type('tag:yaml.org,2002:js/function', { - kind: 'scalar', - resolve: resolveJavascriptFunction, - construct: constructJavascriptFunction, - predicate: isFunction, - represent: representJavascriptFunction - }); - var default_full = schema.DEFAULT = new schema({ - include: [default_safe], - explicit: [_undefined, regexp, _function] - }); +/***/ }), - /*eslint-disable max-len,no-use-before-define*/ +/***/ 4811: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; - var CONTEXT_FLOW_IN = 1; - var CONTEXT_FLOW_OUT = 2; - var CONTEXT_BLOCK_IN = 3; - var CONTEXT_BLOCK_OUT = 4; - var CHOMPING_CLIP = 1; - var CHOMPING_STRIP = 2; - var CHOMPING_KEEP = 3; - var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; - var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; - var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; - var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; - var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - function _class(obj) { - return Object.prototype.toString.call(obj); - } - function is_EOL(c) { - return c === 0x0A /* LF */ || c === 0x0D /* CR */; - } +var global = __webpack_require__(7854); +var isCallable = __webpack_require__(614); - function is_WHITE_SPACE(c) { - return c === 0x09 /* Tab */ || c === 0x20 /* Space */; - } +var WeakMap = global.WeakMap; - function is_WS_OR_EOL(c) { - return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */; - } +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); - function is_FLOW_INDICATOR(c) { - return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */; - } - function fromHexCode(c) { - var lc; - if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { - return c - 0x30; - } +/***/ }), - /*eslint-disable no-bitwise*/ - lc = c | 0x20; - if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) { - return lc - 0x61 + 10; - } - return -1; - } - function escapedHexLen(c) { - if (c === 0x78 /* x */) { - return 2; - } - if (c === 0x75 /* u */) { - return 4; - } - if (c === 0x55 /* U */) { - return 8; - } - return 0; - } - function fromDecimalCode(c) { - if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { - return c - 0x30; - } - return -1; - } - function simpleEscapeSequence(c) { - /* eslint-disable indent */ - return c === 0x30 /* 0 */ ? '\x00' : c === 0x61 /* a */ ? '\x07' : c === 0x62 /* b */ ? '\x08' : c === 0x74 /* t */ ? '\x09' : c === 0x09 /* Tab */ ? '\x09' : c === 0x6E /* n */ ? '\x0A' : c === 0x76 /* v */ ? '\x0B' : c === 0x66 /* f */ ? '\x0C' : c === 0x72 /* r */ ? '\x0D' : c === 0x65 /* e */ ? '\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* " */ ? '\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \ */ ? '\x5C' : c === 0x4E /* N */ ? '\x85' : c === 0x5F /* _ */ ? '\xA0' : c === 0x4C /* L */ ? "\u2028" : c === 0x50 /* P */ ? "\u2029" : ''; - } - function charFromCodepoint(c) { - if (c <= 0xFFFF) { - return String.fromCharCode(c); - } - // Encode UTF-16 surrogate pair - // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF - return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00); - } - var simpleEscapeCheck = new Array(256); // integer, for fast access - var simpleEscapeMap = new Array(256); - for (var i = 0; i < 256; i++) { - simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; - simpleEscapeMap[i] = simpleEscapeSequence(i); - } - function State$1(input, options) { - this.input = input; - this.filename = options['filename'] || null; - this.schema = options['schema'] || default_full; - this.onWarning = options['onWarning'] || null; - this.legacy = options['legacy'] || false; - this.json = options['json'] || false; - this.listener = options['listener'] || null; - this.implicitTypes = this.schema.compiledImplicit; - this.typeMap = this.schema.compiledTypeMap; - this.length = input.length; - this.position = 0; - this.line = 0; - this.lineStart = 0; - this.lineIndent = 0; - this.documents = []; +/***/ 5112: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - /* - this.version; - this.checkLineBreaks; - this.tagMap; - this.anchorMap; - this.tag; - this.anchor; - this.kind; - this.result;*/ - } +var global = __webpack_require__(7854); +var shared = __webpack_require__(2309); +var hasOwn = __webpack_require__(2597); +var uid = __webpack_require__(9711); +var NATIVE_SYMBOL = __webpack_require__(6293); +var USE_SYMBOL_AS_UID = __webpack_require__(3307); - function generateError(state, message) { - return new exception(message, new mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); - } - function throwError(state, message) { - throw generateError(state, message); - } - function throwWarning(state, message) { - if (state.onWarning) { - state.onWarning.call(null, generateError(state, message)); - } - } - var directiveHandlers = { - YAML: function handleYamlDirective(state, name, args) { - var match, major, minor; - if (state.version !== null) { - throwError(state, 'duplication of %YAML directive'); - } - if (args.length !== 1) { - throwError(state, 'YAML directive accepts exactly one argument'); - } - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - if (match === null) { - throwError(state, 'ill-formed argument of the YAML directive'); - } - major = parseInt(match[1], 10); - minor = parseInt(match[2], 10); - if (major !== 1) { - throwError(state, 'unacceptable YAML version of the document'); - } - state.version = args[0]; - state.checkLineBreaks = minor < 2; - if (minor !== 1 && minor !== 2) { - throwWarning(state, 'unsupported YAML version of the document'); - } - }, - TAG: function handleTagDirective(state, name, args) { - var handle, prefix; - if (args.length !== 2) { - throwError(state, 'TAG directive accepts exactly two arguments'); - } - handle = args[0]; - prefix = args[1]; - if (!PATTERN_TAG_HANDLE.test(handle)) { - throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); - } - if (_hasOwnProperty$1.call(state.tagMap, handle)) { - throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); - } - if (!PATTERN_TAG_URI.test(prefix)) { - throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); - } - state.tagMap[handle] = prefix; - } - }; - function captureSegment(state, start, end, checkJson) { - var _position, _length, _character, _result; - if (start < end) { - _result = state.input.slice(start, end); - if (checkJson) { - for (_position = 0, _length = _result.length; _position < _length; _position += 1) { - _character = _result.charCodeAt(_position); - if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) { - throwError(state, 'expected valid JSON character'); - } - } - } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state, 'the stream contains non-printable characters'); - } - state.result += _result; - } - } - function mergeMappings(state, destination, source, overridableKeys) { - var sourceKeys, key, index, quantity; - if (!common.isObject(source)) { - throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); - } - sourceKeys = Object.keys(source); - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { - key = sourceKeys[index]; - if (!_hasOwnProperty$1.call(destination, key)) { - destination[key] = source[key]; - overridableKeys[key] = true; - } - } - } - function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { - var index, quantity; +var Symbol = global.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; - // The output is a plain object here, so keys can only be strings. - // We need to convert keyNode to a string, but doing so can hang the process - // (deeply nested arrays that explode exponentially using aliases). - if (Array.isArray(keyNode)) { - keyNode = Array.prototype.slice.call(keyNode); - for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { - if (Array.isArray(keyNode[index])) { - throwError(state, 'nested arrays are not supported inside keys'); - } - if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { - keyNode[index] = '[object Object]'; - } - } - } +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; - // Avoid code execution in load() via toString property - // (still use its own toString for arrays, timestamps, - // and whatever user schema extensions happen to have @@toStringTag) - if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { - keyNode = '[object Object]'; - } - keyNode = String(keyNode); - if (_result === null) { - _result = {}; - } - if (keyTag === 'tag:yaml.org,2002:merge') { - if (Array.isArray(valueNode)) { - for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { - mergeMappings(state, _result, valueNode[index], overridableKeys); - } - } else { - mergeMappings(state, _result, valueNode, overridableKeys); - } - } else { - if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) { - state.line = startLine || state.line; - state.position = startPos || state.position; - throwError(state, 'duplicated mapping key'); - } - _result[keyNode] = valueNode; - delete overridableKeys[keyNode]; - } - return _result; - } - function readLineBreak(state) { - var ch; - ch = state.input.charCodeAt(state.position); - if (ch === 0x0A /* LF */) { - state.position++; - } else if (ch === 0x0D /* CR */) { - state.position++; - if (state.input.charCodeAt(state.position) === 0x0A /* LF */) { - state.position++; - } - } else { - throwError(state, 'a line break is expected'); - } - state.line += 1; - state.lineStart = state.position; - } - function skipSeparationSpace(state, allowComments, checkIndent) { - var lineBreaks = 0, - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - if (allowComments && ch === 0x23 /* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0); - } - if (is_EOL(ch)) { - readLineBreak(state); - ch = state.input.charCodeAt(state.position); - lineBreaks++; - state.lineIndent = 0; - while (ch === 0x20 /* Space */) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - } else { - break; - } - } - if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { - throwWarning(state, 'deficient indentation'); - } - return lineBreaks; - } - function testDocumentSeparator(state) { - var _position = state.position, - ch; - ch = state.input.charCodeAt(_position); - // Condition state.position === state.lineStart is tested - // in parent on each call, for efficiency. No needs to test here again. - if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { - _position += 3; - ch = state.input.charCodeAt(_position); - if (ch === 0 || is_WS_OR_EOL(ch)) { - return true; - } - } - return false; - } - function writeFoldedLines(state, count) { - if (count === 1) { - state.result += ' '; - } else if (count > 1) { - state.result += common.repeat('\n', count - 1); - } +/***/ }), + +/***/ 9191: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var getBuiltIn = __webpack_require__(5005); +var hasOwn = __webpack_require__(2597); +var createNonEnumerableProperty = __webpack_require__(8880); +var isPrototypeOf = __webpack_require__(7976); +var setPrototypeOf = __webpack_require__(7674); +var copyConstructorProperties = __webpack_require__(9920); +var proxyAccessor = __webpack_require__(2626); +var inheritIfRequired = __webpack_require__(9587); +var normalizeStringArgument = __webpack_require__(6277); +var installErrorCause = __webpack_require__(8340); +var installErrorStack = __webpack_require__(5392); +var DESCRIPTORS = __webpack_require__(9781); +var IS_PURE = __webpack_require__(1913); + +module.exports = function (FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) { + var STACK_TRACE_LIMIT = 'stackTraceLimit'; + var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1; + var path = FULL_NAME.split('.'); + var ERROR_NAME = path[path.length - 1]; + var OriginalError = getBuiltIn.apply(null, path); + + if (!OriginalError) return; + + var OriginalErrorPrototype = OriginalError.prototype; + + // V8 9.3- bug https://bugs.chromium.org/p/v8/issues/detail?id=12006 + if (!IS_PURE && hasOwn(OriginalErrorPrototype, 'cause')) delete OriginalErrorPrototype.cause; + + if (!FORCED) return OriginalError; + + var BaseError = getBuiltIn('Error'); + + var WrappedError = wrapper(function (a, b) { + var message = normalizeStringArgument(IS_AGGREGATE_ERROR ? b : a, undefined); + var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError(); + if (message !== undefined) createNonEnumerableProperty(result, 'message', message); + installErrorStack(result, WrappedError, result.stack, 2); + if (this && isPrototypeOf(OriginalErrorPrototype, this)) inheritIfRequired(result, this, WrappedError); + if (arguments.length > OPTIONS_POSITION) installErrorCause(result, arguments[OPTIONS_POSITION]); + return result; + }); + + WrappedError.prototype = OriginalErrorPrototype; + + if (ERROR_NAME !== 'Error') { + if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError); + else copyConstructorProperties(WrappedError, BaseError, { name: true }); + } else if (DESCRIPTORS && STACK_TRACE_LIMIT in OriginalError) { + proxyAccessor(WrappedError, OriginalError, STACK_TRACE_LIMIT); + proxyAccessor(WrappedError, OriginalError, 'prepareStackTrace'); + } + + copyConstructorProperties(WrappedError, OriginalError); + + if (!IS_PURE) try { + // Safari 13- bug: WebAssembly errors does not have a proper `.name` + if (OriginalErrorPrototype.name !== ERROR_NAME) { + createNonEnumerableProperty(OriginalErrorPrototype, 'name', ERROR_NAME); } - function readPlainScalar(state, nodeIndent, withinFlowCollection) { - var preceding, - following, - captureStart, - captureEnd, - hasPendingContent, - _line, - _lineStart, - _lineIndent, - _kind = state.kind, - _result = state.result, - ch; - ch = state.input.charCodeAt(state.position); - if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* " */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) { - return false; - } - if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) { - following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; - } - } - state.kind = 'scalar'; - state.result = ''; - captureStart = captureEnd = state.position; - hasPendingContent = false; - while (ch !== 0) { - if (ch === 0x3A /* : */) { - following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - } else if (ch === 0x23 /* # */) { - preceding = state.input.charCodeAt(state.position - 1); - if (is_WS_OR_EOL(preceding)) { - break; - } - } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { - break; - } else if (is_EOL(ch)) { - _line = state.line; - _lineStart = state.lineStart; - _lineIndent = state.lineIndent; - skipSeparationSpace(state, false, -1); - if (state.lineIndent >= nodeIndent) { - hasPendingContent = true; - ch = state.input.charCodeAt(state.position); - continue; - } else { - state.position = captureEnd; - state.line = _line; - state.lineStart = _lineStart; - state.lineIndent = _lineIndent; - break; - } - } - if (hasPendingContent) { - captureSegment(state, captureStart, captureEnd, false); - writeFoldedLines(state, state.line - _line); - captureStart = captureEnd = state.position; - hasPendingContent = false; - } - if (!is_WHITE_SPACE(ch)) { - captureEnd = state.position + 1; - } - ch = state.input.charCodeAt(++state.position); - } - captureSegment(state, captureStart, captureEnd, false); - if (state.result) { - return true; - } - state.kind = _kind; - state.result = _result; - return false; - } - function readSingleQuotedScalar(state, nodeIndent) { - var ch, captureStart, captureEnd; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x27 /* ' */) { - return false; - } - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x27 /* ' */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - if (ch === 0x27 /* ' */) { - captureStart = state.position; - state.position++; - captureEnd = state.position; - } else { - return true; - } - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a single quoted scalar'); - } else { - state.position++; - captureEnd = state.position; - } - } - throwError(state, 'unexpected end of the stream within a single quoted scalar'); - } - function readDoubleQuotedScalar(state, nodeIndent) { - var captureStart, captureEnd, hexLength, hexResult, tmp, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x22 /* " */) { - return false; - } - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x22 /* " */) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; - } else if (ch === 0x5C /* \ */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); + OriginalErrorPrototype.constructor = WrappedError; + } catch (error) { /* empty */ } - // TODO: rework to inline fn with no type cast? - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; - } else { - throwError(state, 'expected hexadecimal character'); - } - } - state.result += charFromCodepoint(hexResult); - state.position++; - } else { - throwError(state, 'unknown escape sequence'); - } - captureStart = captureEnd = state.position; - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a double quoted scalar'); - } else { - state.position++; - captureEnd = state.position; - } - } - throwError(state, 'unexpected end of the stream within a double quoted scalar'); - } - function readFlowCollection(state, nodeIndent) { - var readNext = true, - _line, - _tag = state.tag, - _result, - _anchor = state.anchor, - following, - terminator, - isPair, - isExplicitPair, - isMapping, - overridableKeys = {}, - keyNode, - keyTag, - valueNode, - ch; - ch = state.input.charCodeAt(state.position); - if (ch === 0x5B /* [ */) { - terminator = 0x5D; /* ] */ - isMapping = false; - _result = []; - } else if (ch === 0x7B /* { */) { - terminator = 0x7D; /* } */ - isMapping = true; - _result = {}; - } else { - return false; - } - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - ch = state.input.charCodeAt(++state.position); - while (ch !== 0) { - skipSeparationSpace(state, true, nodeIndent); - ch = state.input.charCodeAt(state.position); - if (ch === terminator) { - state.position++; - state.tag = _tag; - state.anchor = _anchor; - state.kind = isMapping ? 'mapping' : 'sequence'; - state.result = _result; - return true; - } else if (!readNext) { - throwError(state, 'missed comma between flow collection entries'); - } - keyTag = keyNode = valueNode = null; - isPair = isExplicitPair = false; - if (ch === 0x3F /* ? */) { - following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } - } - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state.tag; - keyNode = state.result; - skipSeparationSpace(state, true, nodeIndent); - ch = state.input.charCodeAt(state.position); - if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) { - isPair = true; - ch = state.input.charCodeAt(++state.position); - skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; - } - if (isMapping) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); - } else if (isPair) { - _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); - } else { - _result.push(keyNode); - } - skipSeparationSpace(state, true, nodeIndent); - ch = state.input.charCodeAt(state.position); - if (ch === 0x2C /* , */) { - readNext = true; - ch = state.input.charCodeAt(++state.position); - } else { - readNext = false; - } - } - throwError(state, 'unexpected end of the stream within a flow collection'); - } - function readBlockScalar(state, nodeIndent) { - var captureStart, - folding, - chomping = CHOMPING_CLIP, - didReadContent = false, - detectedIndent = false, - textIndent = nodeIndent, - emptyLines = 0, - atMoreIndented = false, - tmp, - ch; - ch = state.input.charCodeAt(state.position); - if (ch === 0x7C /* | */) { - folding = false; - } else if (ch === 0x3E /* > */) { - folding = true; - } else { - return false; - } - state.kind = 'scalar'; - state.result = ''; - while (ch !== 0) { - ch = state.input.charCodeAt(++state.position); - if (ch === 0x2B /* + */ || ch === 0x2D /* - */) { - if (CHOMPING_CLIP === chomping) { - chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, 'repeat of a chomping mode identifier'); - } - } else if ((tmp = fromDecimalCode(ch)) >= 0) { - if (tmp === 0) { - throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); - } else if (!detectedIndent) { - textIndent = nodeIndent + tmp - 1; - detectedIndent = true; - } else { - throwError(state, 'repeat of an indentation width identifier'); - } - } else { - break; - } - } - if (is_WHITE_SPACE(ch)) { - do { - ch = state.input.charCodeAt(++state.position); - } while (is_WHITE_SPACE(ch)); - if (ch === 0x23 /* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } while (!is_EOL(ch) && ch !== 0); - } - } - while (ch !== 0) { - readLineBreak(state); - state.lineIndent = 0; - ch = state.input.charCodeAt(state.position); - while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - if (!detectedIndent && state.lineIndent > textIndent) { - textIndent = state.lineIndent; - } - if (is_EOL(ch)) { - emptyLines++; - continue; - } + return WrappedError; +}; - // End of the scalar. - if (state.lineIndent < textIndent) { - // Perform the chomping. - if (chomping === CHOMPING_KEEP) { - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } else if (chomping === CHOMPING_CLIP) { - if (didReadContent) { - // i.e. only if the scalar is not empty. - state.result += '\n'; - } - } - // Break this `while` cycle and go to the funciton's epilogue. - break; - } +/***/ }), - // Folded style: use fancy rules to handle line breaks. - if (folding) { - // Lines starting with white space characters (more-indented lines) are not folded. - if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; - // except for the first content line (cf. Example 8.1) - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); +/***/ 2262: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - // End of more-indented block. - } else if (atMoreIndented) { - atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); +"use strict"; - // Just one line break - perceive as the same line. - } else if (emptyLines === 0) { - if (didReadContent) { - // i.e. only if we have already read some scalar content. - state.result += ' '; - } +var $ = __webpack_require__(2109); +var toObject = __webpack_require__(7908); +var lengthOfArrayLike = __webpack_require__(6244); +var toIntegerOrInfinity = __webpack_require__(9303); +var addToUnscopables = __webpack_require__(1223); - // Several line breaks - perceive as different lines. - } else { - state.result += common.repeat('\n', emptyLines); - } +// `Array.prototype.at` method +// https://github.com/tc39/proposal-relative-indexing-method +$({ target: 'Array', proto: true }, { + at: function at(index) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; + return (k < 0 || k >= len) ? undefined : O[k]; + } +}); - // Literal style: just add exact number of line breaks between content lines. - } else { - // Keep all line breaks except the header line break. - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } - didReadContent = true; - detectedIndent = true; - emptyLines = 0; - captureStart = state.position; - while (!is_EOL(ch) && ch !== 0) { - ch = state.input.charCodeAt(++state.position); - } - captureSegment(state, captureStart, state.position, false); - } - return true; - } - function readBlockSequence(state, nodeIndent) { - var _line, - _tag = state.tag, - _anchor = state.anchor, - _result = [], - following, - detected = false, - ch; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - if (ch !== 0x2D /* - */) { - break; - } - following = state.input.charCodeAt(state.position + 1); - if (!is_WS_OR_EOL(following)) { - break; - } - detected = true; - state.position++; - if (skipSeparationSpace(state, true, -1)) { - if (state.lineIndent <= nodeIndent) { - _result.push(null); - ch = state.input.charCodeAt(state.position); - continue; - } - } - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { - throwError(state, 'bad indentation of a sequence entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'sequence'; - state.result = _result; - return true; - } - return false; - } - function readBlockMapping(state, nodeIndent, flowIndent) { - var following, - allowCompact, - _line, - _pos, - _tag = state.tag, - _anchor = state.anchor, - _result = {}, - overridableKeys = {}, - keyTag = null, - keyNode = null, - valueNode = null, - atExplicitKey = false, - detected = false, - ch; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - following = state.input.charCodeAt(state.position + 1); - _line = state.line; // Save the current line. - _pos = state.position; +addToUnscopables('at'); - // - // Explicit notation case. There are two separate blocks: - // first for the key (denoted by "?") and second for the value (denoted by ":") - // - if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) { - if (ch === 0x3F /* ? */) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - detected = true; - atExplicitKey = true; - allowCompact = true; - } else if (atExplicitKey) { - // i.e. 0x3A/* : */ === character after the explicit key. - atExplicitKey = false; - allowCompact = true; - } else { - throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); - } - state.position += 1; - ch = following; - // - // Implicit notation case. Flow-style node as the key first, then ":", and the value. - // - } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - if (state.line === _line) { - ch = state.input.charCodeAt(state.position); - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - if (ch === 0x3A /* : */) { - ch = state.input.charCodeAt(++state.position); - if (!is_WS_OR_EOL(ch)) { - throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); - } - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; - } else if (detected) { - throwError(state, 'can not read an implicit mapping pair; a colon is missed'); - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - } else if (detected) { - throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - } else { - break; // Reading is done. Go to the epilogue. - } +/***/ }), - // - // Common reading code for both explicit and implicit notations. - // - if (state.line === _line || state.lineIndent > nodeIndent) { - if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { - if (atExplicitKey) { - keyNode = state.result; - } else { - valueNode = state.result; - } - } - if (!atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); - keyTag = keyNode = valueNode = null; - } - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - } - if (state.lineIndent > nodeIndent && ch !== 0) { - throwError(state, 'bad indentation of a mapping entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } +/***/ 6699: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - // - // Epilogue. - // +"use strict"; - // Special case: last mapping's node contains only the key in explicit notation. - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - } +var $ = __webpack_require__(2109); +var $includes = (__webpack_require__(1318).includes); +var fails = __webpack_require__(7293); +var addToUnscopables = __webpack_require__(1223); - // Expose the resulting mapping. - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'mapping'; - state.result = _result; - } - return detected; - } - function readTagProperty(state) { - var _position, - isVerbatim = false, - isNamed = false, - tagHandle, - tagName, - ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x21 /* ! */) return false; - if (state.tag !== null) { - throwError(state, 'duplication of a tag property'); - } - ch = state.input.charCodeAt(++state.position); - if (ch === 0x3C /* < */) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); - } else if (ch === 0x21 /* ! */) { - isNamed = true; - tagHandle = '!!'; - ch = state.input.charCodeAt(++state.position); - } else { - tagHandle = '!'; - } - _position = state.position; - if (isVerbatim) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && ch !== 0x3E /* > */); +// FF99+ bug +var BROKEN_ON_SPARSE = fails(function () { + // eslint-disable-next-line es/no-array-prototype-includes -- detection + return !Array(1).includes(); +}); - if (state.position < state.length) { - tagName = state.input.slice(_position, state.position); - ch = state.input.charCodeAt(++state.position); - } else { - throwError(state, 'unexpected end of the stream within a verbatim tag'); - } - } else { - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - if (ch === 0x21 /* ! */) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, 'named tag handle cannot contain such characters'); - } - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, 'tag suffix cannot contain exclamation marks'); - } - } - ch = state.input.charCodeAt(++state.position); - } - tagName = state.input.slice(_position, state.position); - if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state, 'tag suffix cannot contain flow indicator characters'); - } - } - if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state, 'tag name cannot contain such characters: ' + tagName); - } - if (isVerbatim) { - state.tag = tagName; - } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { - state.tag = state.tagMap[tagHandle] + tagName; - } else if (tagHandle === '!') { - state.tag = '!' + tagName; - } else if (tagHandle === '!!') { - state.tag = 'tag:yaml.org,2002:' + tagName; - } else { - throwError(state, 'undeclared tag handle "' + tagHandle + '"'); - } - return true; - } - function readAnchorProperty(state) { - var _position, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x26 /* & */) return false; - if (state.anchor !== null) { - throwError(state, 'duplication of an anchor property'); - } - ch = state.input.charCodeAt(++state.position); - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - if (state.position === _position) { - throwError(state, 'name of an anchor node must contain at least one character'); - } - state.anchor = state.input.slice(_position, state.position); - return true; - } - function readAlias(state) { - var _position, alias, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x2A /* * */) return false; - ch = state.input.charCodeAt(++state.position); - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - if (state.position === _position) { - throwError(state, 'name of an alias node must contain at least one character'); - } - alias = state.input.slice(_position, state.position); - if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { - throwError(state, 'unidentified alias "' + alias + '"'); - } - state.result = state.anchorMap[alias]; - skipSeparationSpace(state, true, -1); - return true; - } - function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { - var allowBlockStyles, - allowBlockScalars, - allowBlockCollections, - indentStatus = 1, - // 1: this>parent, 0: this=parent, -1: this parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } - } - if (indentStatus === 1) { - while (readTagProperty(state) || readAnchorProperty(state)) { - if (skipSeparationSpace(state, true, -1)) { - atNewLine = true; - allowBlockCollections = allowBlockStyles; - if (state.lineIndent > parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } else { - allowBlockCollections = false; - } - } - } - if (allowBlockCollections) { - allowBlockCollections = atNewLine || allowCompact; - } - if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { - if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { - flowIndent = parentIndent; - } else { - flowIndent = parentIndent + 1; - } - blockIndent = state.position - state.lineStart; - if (indentStatus === 1) { - if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { - hasContent = true; - } else { - if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { - hasContent = true; - } else if (readAlias(state)) { - hasContent = true; - if (state.tag !== null || state.anchor !== null) { - throwError(state, 'alias node should not have any properties'); - } - } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { - hasContent = true; - if (state.tag === null) { - state.tag = '?'; - } - } - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } else if (indentStatus === 0) { - // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 - hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); - } - } - if (state.tag !== null && state.tag !== '!') { - if (state.tag === '?') { - // Implicit resolving is not allowed for non-scalar types, and '?' - // non-specific tag is only automatically assigned to plain scalars. - // - // We only need to check kind conformity in case user explicitly assigns '?' - // tag, for example like this: "! [0]" - // - if (state.result !== null && state.kind !== 'scalar') { - throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); - } - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { - type = state.implicitTypes[typeIndex]; - if (type.resolve(state.result)) { - // `state.result` updated in resolver if matched - state.result = type.construct(state.result); - state.tag = type.tag; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - break; - } - } - } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) { - type = state.typeMap[state.kind || 'fallback'][state.tag]; - if (state.result !== null && type.kind !== state.kind) { - throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); - } - if (!type.resolve(state.result)) { - // `state.result` updated in resolver if matched - throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); - } else { - state.result = type.construct(state.result); - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } else { - throwError(state, 'unknown tag !<' + state.tag + '>'); - } - } - if (state.listener !== null) { - state.listener('close', state); - } - return state.tag !== null || state.anchor !== null || hasContent; - } - function readDocument(state) { - var documentStart = state.position, - _position, - directiveName, - directiveArgs, - hasDirectives = false, - ch; - state.version = null; - state.checkLineBreaks = state.legacy; - state.tagMap = {}; - state.anchorMap = {}; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - if (state.lineIndent > 0 || ch !== 0x25 /* % */) { - break; - } - hasDirectives = true; - ch = state.input.charCodeAt(++state.position); - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - directiveName = state.input.slice(_position, state.position); - directiveArgs = []; - if (directiveName.length < 1) { - throwError(state, 'directive name must not be less than one character in length'); - } - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - if (ch === 0x23 /* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && !is_EOL(ch)); - break; - } - if (is_EOL(ch)) break; - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - directiveArgs.push(state.input.slice(_position, state.position)); - } - if (ch !== 0) readLineBreak(state); - if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state, directiveName, directiveArgs); - } else { - throwWarning(state, 'unknown document directive "' + directiveName + '"'); - } - } - skipSeparationSpace(state, true, -1); - if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } else if (hasDirectives) { - throwError(state, 'directives end mark is expected'); - } - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); - skipSeparationSpace(state, true, -1); - if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { - throwWarning(state, 'non-ASCII line breaks are interpreted as content'); - } - state.documents.push(state.result); - if (state.position === state.lineStart && testDocumentSeparator(state)) { - if (state.input.charCodeAt(state.position) === 0x2E /* . */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } - return; - } - if (state.position < state.length - 1) { - throwError(state, 'end of the stream or a document separator is expected'); - } else { - return; - } - } - function loadDocuments(input, options) { - input = String(input); - options = options || {}; - if (input.length !== 0) { - // Add tailing `\n` if not exists - if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) { - input += '\n'; - } +// `Array.prototype.includes` method +// https://tc39.es/ecma262/#sec-array.prototype.includes +$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); - // Strip BOM - if (input.charCodeAt(0) === 0xFEFF) { - input = input.slice(1); - } - } - var state = new State$1(input, options); - var nullpos = input.indexOf('\0'); - if (nullpos !== -1) { - state.position = nullpos; - throwError(state, 'null byte is not allowed in input'); - } +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('includes'); - // Use 0 as string terminator. That significantly simplifies bounds check. - state.input += '\0'; - while (state.input.charCodeAt(state.position) === 0x20 /* Space */) { - state.lineIndent += 1; - state.position += 1; - } - while (state.position < state.length - 1) { - readDocument(state); - } - return state.documents; - } - function loadAll$1(input, iterator, options) { - if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { - options = iterator; - iterator = null; - } - var documents = loadDocuments(input, options); - if (typeof iterator !== 'function') { - return documents; - } - for (var index = 0, length = documents.length; index < length; index += 1) { - iterator(documents[index]); - } - } - function load$1(input, options) { - var documents = loadDocuments(input, options); - if (documents.length === 0) { - /*eslint-disable no-undefined*/ - return undefined; - } else if (documents.length === 1) { - return documents[0]; - } - throw new exception('expected a single document in the stream, but found more'); - } - function safeLoadAll$1(input, iterator, options) { - if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') { - options = iterator; - iterator = null; - } - return loadAll$1(input, iterator, common.extend({ - schema: default_safe - }, options)); - } - function safeLoad$1(input, options) { - return load$1(input, common.extend({ - schema: default_safe - }, options)); - } - var loadAll_1 = loadAll$1; - var load_1 = load$1; - var safeLoadAll_1 = safeLoadAll$1; - var safeLoad_1 = safeLoad$1; - var loader = { - loadAll: loadAll_1, - load: load_1, - safeLoadAll: safeLoadAll_1, - safeLoad: safeLoad_1 - }; - /*eslint-disable no-use-before-define*/ +/***/ }), - var _toString = Object.prototype.toString; - var _hasOwnProperty = Object.prototype.hasOwnProperty; - var CHAR_TAB = 0x09; /* Tab */ - var CHAR_LINE_FEED = 0x0A; /* LF */ - var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ - var CHAR_SPACE = 0x20; /* Space */ - var CHAR_EXCLAMATION = 0x21; /* ! */ - var CHAR_DOUBLE_QUOTE = 0x22; /* " */ - var CHAR_SHARP = 0x23; /* # */ - var CHAR_PERCENT = 0x25; /* % */ - var CHAR_AMPERSAND = 0x26; /* & */ - var CHAR_SINGLE_QUOTE = 0x27; /* ' */ - var CHAR_ASTERISK = 0x2A; /* * */ - var CHAR_COMMA = 0x2C; /* , */ - var CHAR_MINUS = 0x2D; /* - */ - var CHAR_COLON = 0x3A; /* : */ - var CHAR_EQUALS = 0x3D; /* = */ - var CHAR_GREATER_THAN = 0x3E; /* > */ - var CHAR_QUESTION = 0x3F; /* ? */ - var CHAR_COMMERCIAL_AT = 0x40; /* @ */ - var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ - var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ - var CHAR_GRAVE_ACCENT = 0x60; /* ` */ - var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ - var CHAR_VERTICAL_LINE = 0x7C; /* | */ - var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ +/***/ 7658: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - var ESCAPE_SEQUENCES = {}; - ESCAPE_SEQUENCES[0x00] = '\\0'; - ESCAPE_SEQUENCES[0x07] = '\\a'; - ESCAPE_SEQUENCES[0x08] = '\\b'; - ESCAPE_SEQUENCES[0x09] = '\\t'; - ESCAPE_SEQUENCES[0x0A] = '\\n'; - ESCAPE_SEQUENCES[0x0B] = '\\v'; - ESCAPE_SEQUENCES[0x0C] = '\\f'; - ESCAPE_SEQUENCES[0x0D] = '\\r'; - ESCAPE_SEQUENCES[0x1B] = '\\e'; - ESCAPE_SEQUENCES[0x22] = '\\"'; - ESCAPE_SEQUENCES[0x5C] = '\\\\'; - ESCAPE_SEQUENCES[0x85] = '\\N'; - ESCAPE_SEQUENCES[0xA0] = '\\_'; - ESCAPE_SEQUENCES[0x2028] = '\\L'; - ESCAPE_SEQUENCES[0x2029] = '\\P'; - var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF']; - function compileStyleMap(schema, map) { - var result, keys, index, length, tag, style, type; - if (map === null) return {}; - result = {}; - keys = Object.keys(map); - for (index = 0, length = keys.length; index < length; index += 1) { - tag = keys[index]; - style = String(map[tag]); - if (tag.slice(0, 2) === '!!') { - tag = 'tag:yaml.org,2002:' + tag.slice(2); - } - type = schema.compiledTypeMap['fallback'][tag]; - if (type && _hasOwnProperty.call(type.styleAliases, style)) { - style = type.styleAliases[style]; - } - result[tag] = style; - } - return result; - } - function encodeHex(character) { - var string, handle, length; - string = character.toString(16).toUpperCase(); - if (character <= 0xFF) { - handle = 'x'; - length = 2; - } else if (character <= 0xFFFF) { - handle = 'u'; - length = 4; - } else if (character <= 0xFFFFFFFF) { - handle = 'U'; - length = 8; - } else { - throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); - } - return '\\' + handle + common.repeat('0', length - string.length) + string; - } - function State(options) { - this.schema = options['schema'] || default_full; - this.indent = Math.max(1, options['indent'] || 2); - this.noArrayIndent = options['noArrayIndent'] || false; - this.skipInvalid = options['skipInvalid'] || false; - this.flowLevel = common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']; - this.styleMap = compileStyleMap(this.schema, options['styles'] || null); - this.sortKeys = options['sortKeys'] || false; - this.lineWidth = options['lineWidth'] || 80; - this.noRefs = options['noRefs'] || false; - this.noCompatMode = options['noCompatMode'] || false; - this.condenseFlow = options['condenseFlow'] || false; - this.implicitTypes = this.schema.compiledImplicit; - this.explicitTypes = this.schema.compiledExplicit; - this.tag = null; - this.result = ''; - this.duplicates = []; - this.usedDuplicates = null; - } +"use strict"; - // Indents every line in a string. Empty lines (\n only) are not indented. - function indentString(string, spaces) { - var ind = common.repeat(' ', spaces), - position = 0, - next = -1, - result = '', - line, - length = string.length; - while (position < length) { - next = string.indexOf('\n', position); - if (next === -1) { - line = string.slice(position); - position = length; - } else { - line = string.slice(position, next + 1); - position = next + 1; - } - if (line.length && line !== '\n') result += ind; - result += line; - } - return result; - } - function generateNextLine(state, level) { - return '\n' + common.repeat(' ', state.indent * level); - } - function testImplicitResolving(state, str) { - var index, length, type; - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { - type = state.implicitTypes[index]; - if (type.resolve(str)) { - return true; - } - } - return false; - } +var $ = __webpack_require__(2109); +var toObject = __webpack_require__(7908); +var lengthOfArrayLike = __webpack_require__(6244); +var setArrayLength = __webpack_require__(3658); +var doesNotExceedSafeInteger = __webpack_require__(7207); +var fails = __webpack_require__(7293); - // [33] s-white ::= s-space | s-tab - function isWhitespace(c) { - return c === CHAR_SPACE || c === CHAR_TAB; - } +var INCORRECT_TO_LENGTH = fails(function () { + return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; +}); - // Returns true if the character can be printed without escaping. - // From YAML 1.2: "any allowed characters known to be non-printable - // should also be escaped. [However,] This isn’t mandatory" - // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. - function isPrintable(c) { - return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF; - } +// V8 and Safari <= 15.4, FF < 23 throws InternalError +// https://bugs.chromium.org/p/v8/issues/detail?id=12681 +var properErrorOnNonWritableLength = function () { + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).push(); + } catch (error) { + return error instanceof TypeError; + } +}; - // [34] ns-char ::= nb-char - s-white - // [27] nb-char ::= c-printable - b-char - c-byte-order-mark - // [26] b-char ::= b-line-feed | b-carriage-return - // [24] b-line-feed ::= #xA /* LF */ - // [25] b-carriage-return ::= #xD /* CR */ - // [3] c-byte-order-mark ::= #xFEFF - function isNsChar(c) { - return isPrintable(c) && !isWhitespace(c) - // byte-order-mark - && c !== 0xFEFF - // b-char - && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; - } +var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); - // Simplified test for values allowed after the first character in plain style. - function isPlainSafe(c, prev) { - // Uses a subset of nb-char - c-flow-indicator - ":" - "#" - // where nb-char ::= c-printable - b-char - c-byte-order-mark. - return isPrintable(c) && c !== 0xFEFF - // - c-flow-indicator - && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET - // - ":" - "#" - // /* An ns-char preceding */ "#" - && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev)); +// `Array.prototype.push` method +// https://tc39.es/ecma262/#sec-array.prototype.push +$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + push: function push(item) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var argCount = arguments.length; + doesNotExceedSafeInteger(len + argCount); + for (var i = 0; i < argCount; i++) { + O[len] = arguments[i]; + len++; } + setArrayLength(O, len); + return len; + } +}); - // Simplified test for values allowed as the first character in plain style. - function isPlainSafeFirst(c) { - // Uses a subset of ns-char - c-indicator - // where ns-char = nb-char - s-white. - return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white - // - (c-indicator ::= - // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” - && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET - // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” - && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE - // | “%” | “@” | “`”) - && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; - } - // Determines whether block indentation indicator is required. - function needIndentIndicator(string) { - var leadingSpaceRe = /^\n* /; - return leadingSpaceRe.test(string); - } - var STYLE_PLAIN = 1, - STYLE_SINGLE = 2, - STYLE_LITERAL = 3, - STYLE_FOLDED = 4, - STYLE_DOUBLE = 5; +/***/ }), - // Determines which scalar styles are possible and returns the preferred style. - // lineWidth = -1 => no limit. - // Pre-conditions: str.length > 0. - // Post-conditions: - // STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. - // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). - // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). - function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) { - var i; - var char, prev_char; - var hasLineBreak = false; - var hasFoldableLine = false; // only checked if shouldTrackWidth - var shouldTrackWidth = lineWidth !== -1; - var previousLineBreak = -1; // count the first line correctly - var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1)); - if (singleLineOnly) { - // Case: no block styles. - // Check for disallowed characters to rule out plain and single. - for (i = 0; i < string.length; i++) { - char = string.charCodeAt(i); - if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - prev_char = i > 0 ? string.charCodeAt(i - 1) : null; - plain = plain && isPlainSafe(char, prev_char); - } - } else { - // Case: block styles permitted. - for (i = 0; i < string.length; i++) { - char = string.charCodeAt(i); - if (char === CHAR_LINE_FEED) { - hasLineBreak = true; - // Check if any line can be folded. - if (shouldTrackWidth) { - hasFoldableLine = hasFoldableLine || - // Foldable line = too long, and not more-indented. - i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; - previousLineBreak = i; - } - } else if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - prev_char = i > 0 ? string.charCodeAt(i - 1) : null; - plain = plain && isPlainSafe(char, prev_char); - } - // in case the end is missing a \n - hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; - } - // Although every style can represent \n without escaping, prefer block styles - // for multiline, since they're more readable and they don't add empty lines. - // Also prefer folding a super-long line. - if (!hasLineBreak && !hasFoldableLine) { - // Strings interpretable as another type have to be quoted; - // e.g. the string 'true' vs. the boolean true. - return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE; - } - // Edge case: block indentation indicator can only have one digit. - if (indentPerLevel > 9 && needIndentIndicator(string)) { - return STYLE_DOUBLE; - } - // At this point we know block styles are valid. - // Prefer literal style unless we want to fold. - return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; - } +/***/ 1703: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - // Note: line breaking/folding is implemented for only the folded style. - // NB. We drop the last trailing newline (if any) of a returned block scalar - // since the dumper adds its own newline. This always works: - // • No ending newline => unaffected; already using strip "-" chomping. - // • Ending newline => removed then restored. - // Importantly, this keeps the "+" chomp indicator from gaining an extra line. - function writeScalar(state, string, level, iskey) { - state.dump = function () { - if (string.length === 0) { - return "''"; - } - if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { - return "'" + string + "'"; - } - var indent = state.indent * Math.max(1, level); // no 0-indent scalars - // As indentation gets deeper, let the width decrease monotonically - // to the lower bound min(state.lineWidth, 40). - // Note that this implies - // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. - // state.lineWidth > 40 + state.indent: width decreases until the lower bound. - // This behaves better than a constant minimum width which disallows narrower options, - // or an indent threshold which causes the width to suddenly increase. - var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); +/* eslint-disable no-unused-vars -- required for functions `.length` */ +var $ = __webpack_require__(2109); +var global = __webpack_require__(7854); +var apply = __webpack_require__(2104); +var wrapErrorConstructorWithCause = __webpack_require__(9191); - // Without knowing if keys are implicit/explicit, assume implicit for safety. - var singleLineOnly = iskey - // No block styles in flow mode. - || state.flowLevel > -1 && level >= state.flowLevel; - function testAmbiguity(string) { - return testImplicitResolving(state, string); - } - switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { - case STYLE_PLAIN: - return string; - case STYLE_SINGLE: - return "'" + string.replace(/'/g, "''") + "'"; - case STYLE_LITERAL: - return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent)); - case STYLE_FOLDED: - return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); - case STYLE_DOUBLE: - return '"' + escapeString(string) + '"'; - default: - throw new exception('impossible error: invalid scalar style'); - } - }(); - } +var WEB_ASSEMBLY = 'WebAssembly'; +var WebAssembly = global[WEB_ASSEMBLY]; - // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. - function blockHeader(string, indentPerLevel) { - var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; +var FORCED = Error('e', { cause: 7 }).cause !== 7; - // note the special case: the string '\n' counts as a "trailing" empty line. - var clip = string[string.length - 1] === '\n'; - var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); - var chomp = keep ? '+' : clip ? '' : '-'; - return indentIndicator + chomp + '\n'; - } +var exportGlobalErrorCauseWrapper = function (ERROR_NAME, wrapper) { + var O = {}; + O[ERROR_NAME] = wrapErrorConstructorWithCause(ERROR_NAME, wrapper, FORCED); + $({ global: true, constructor: true, arity: 1, forced: FORCED }, O); +}; - // (See the note for writeScalar.) - function dropEndingNewline(string) { - return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; - } +var exportWebAssemblyErrorCauseWrapper = function (ERROR_NAME, wrapper) { + if (WebAssembly && WebAssembly[ERROR_NAME]) { + var O = {}; + O[ERROR_NAME] = wrapErrorConstructorWithCause(WEB_ASSEMBLY + '.' + ERROR_NAME, wrapper, FORCED); + $({ target: WEB_ASSEMBLY, stat: true, constructor: true, arity: 1, forced: FORCED }, O); + } +}; - // Note: a long line without a suitable break point will exceed the width limit. - // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. - function foldString(string, width) { - // In folded style, $k$ consecutive newlines output as $k+1$ newlines— - // unless they're before or after a more-indented line, or at the very - // beginning or end, in which case $k$ maps to $k$. - // Therefore, parse each chunk as newline(s) followed by a content line. - var lineRe = /(\n+)([^\n]*)/g; +// https://tc39.es/ecma262/#sec-nativeerror +// https://github.com/tc39/proposal-error-cause +exportGlobalErrorCauseWrapper('Error', function (init) { + return function Error(message) { return apply(init, this, arguments); }; +}); +exportGlobalErrorCauseWrapper('EvalError', function (init) { + return function EvalError(message) { return apply(init, this, arguments); }; +}); +exportGlobalErrorCauseWrapper('RangeError', function (init) { + return function RangeError(message) { return apply(init, this, arguments); }; +}); +exportGlobalErrorCauseWrapper('ReferenceError', function (init) { + return function ReferenceError(message) { return apply(init, this, arguments); }; +}); +exportGlobalErrorCauseWrapper('SyntaxError', function (init) { + return function SyntaxError(message) { return apply(init, this, arguments); }; +}); +exportGlobalErrorCauseWrapper('TypeError', function (init) { + return function TypeError(message) { return apply(init, this, arguments); }; +}); +exportGlobalErrorCauseWrapper('URIError', function (init) { + return function URIError(message) { return apply(init, this, arguments); }; +}); +exportWebAssemblyErrorCauseWrapper('CompileError', function (init) { + return function CompileError(message) { return apply(init, this, arguments); }; +}); +exportWebAssemblyErrorCauseWrapper('LinkError', function (init) { + return function LinkError(message) { return apply(init, this, arguments); }; +}); +exportWebAssemblyErrorCauseWrapper('RuntimeError', function (init) { + return function RuntimeError(message) { return apply(init, this, arguments); }; +}); - // first line (possibly an empty line) - var result = function () { - var nextLF = string.indexOf('\n'); - nextLF = nextLF !== -1 ? nextLF : string.length; - lineRe.lastIndex = nextLF; - return foldLine(string.slice(0, nextLF), width); - }(); - // If we haven't reached the first content line yet, don't add an extra \n. - var prevMoreIndented = string[0] === '\n' || string[0] === ' '; - var moreIndented; - // rest of the lines - var match; - while (match = lineRe.exec(string)) { - var prefix = match[1], - line = match[2]; - moreIndented = line[0] === ' '; - result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\n' : '') + foldLine(line, width); - prevMoreIndented = moreIndented; - } - return result; - } +/***/ }), - // Greedy line breaking. - // Picks the longest line under the limit each time, - // otherwise settles for the shortest line over the limit. - // NB. More-indented lines *cannot* be folded, as that would add an extra \n. - function foldLine(line, width) { - if (line === '' || line[0] === ' ') return line; +/***/ 4506: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - // Since a more-indented line adds a \n, breaks can't be followed by a space. - var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. - var match; - // start is an inclusive index. end, curr, and next are exclusive. - var start = 0, - end, - curr = 0, - next = 0; - var result = ''; +"use strict"; - // Invariants: 0 <= start <= length-1. - // 0 <= curr <= next <= max(0, length-2). curr - start <= width. - // Inside the loop: - // A match implies length >= 2, so curr and next are <= length-2. - while (match = breakRe.exec(line)) { - next = match.index; - // maintain invariant: curr - start <= width - if (next - start > width) { - end = curr > start ? curr : next; // derive end <= length-2 - result += '\n' + line.slice(start, end); - // skip the space that was output as \n - start = end + 1; // derive start <= length-1 - } +var $ = __webpack_require__(2109); +var uncurryThis = __webpack_require__(1702); +var requireObjectCoercible = __webpack_require__(4488); +var toIntegerOrInfinity = __webpack_require__(9303); +var toString = __webpack_require__(1340); +var fails = __webpack_require__(7293); - curr = next; - } +var charAt = uncurryThis(''.charAt); - // By the invariants, start <= length-1, so there is something left over. - // It is either the whole string or a part starting from non-whitespace. - result += '\n'; - // Insert a break if the remainder is too long and there is a break available. - if (line.length - start > width && curr > start) { - result += line.slice(start, curr) + '\n' + line.slice(curr + 1); - } else { - result += line.slice(start); - } - return result.slice(1); // drop extra \n joiner - } +var FORCED = fails(function () { + // eslint-disable-next-line es/no-array-string-prototype-at -- safe + return '𠮷'.at(-2) !== '\uD842'; +}); - // Escapes a double-quoted string. - function escapeString(string) { - var result = ''; - var char, nextChar; - var escapeSeq; - for (var i = 0; i < string.length; i++) { - char = string.charCodeAt(i); - // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). - if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) { - nextChar = string.charCodeAt(i + 1); - if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) { - // Combine the surrogate pair and store it escaped. - result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); - // Advance index one extra since we already used that char here. - i++; - continue; - } - } - escapeSeq = ESCAPE_SEQUENCES[char]; - result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char); - } - return result; - } - function writeFlowSequence(state, level, object) { - var _result = '', - _tag = state.tag, - index, - length; - for (index = 0, length = object.length; index < length; index += 1) { - // Write only valid elements. - if (writeNode(state, level, object[index], false, false)) { - if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : ''); - _result += state.dump; - } - } - state.tag = _tag; - state.dump = '[' + _result + ']'; - } - function writeBlockSequence(state, level, object, compact) { - var _result = '', - _tag = state.tag, - index, - length; - for (index = 0, length = object.length; index < length; index += 1) { - // Write only valid elements. - if (writeNode(state, level + 1, object[index], true, true)) { - if (!compact || index !== 0) { - _result += generateNextLine(state, level); - } - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - _result += '-'; - } else { - _result += '- '; - } - _result += state.dump; - } - } - state.tag = _tag; - state.dump = _result || '[]'; // Empty sequence if no valid values. - } +// `String.prototype.at` method +// https://github.com/tc39/proposal-relative-indexing-method +$({ target: 'String', proto: true, forced: FORCED }, { + at: function at(index) { + var S = toString(requireObjectCoercible(this)); + var len = S.length; + var relativeIndex = toIntegerOrInfinity(index); + var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; + return (k < 0 || k >= len) ? undefined : charAt(S, k); + } +}); - function writeFlowMapping(state, level, object) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - pairBuffer; - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; - if (index !== 0) pairBuffer += ', '; - if (state.condenseFlow) pairBuffer += '"'; - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - if (!writeNode(state, level, objectKey, false, false)) { - continue; // Skip this pair because of invalid key; - } - if (state.dump.length > 1024) pairBuffer += '? '; - pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); - if (!writeNode(state, level, objectValue, false, false)) { - continue; // Skip this pair because of invalid value. - } +/***/ }), - pairBuffer += state.dump; +/***/ 3150: +/***/ (function(module, exports) { - // Both key and value are valid. - _result += pairBuffer; - } - state.tag = _tag; - state.dump = '{' + _result + '}'; - } - function writeBlockMapping(state, level, object, compact) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - explicitPair, - pairBuffer; +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { var mod; } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) { + /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */ - // Allow sorting keys so that the output file is deterministic - if (state.sortKeys === true) { - // Default sorting - objectKeyList.sort(); - } else if (typeof state.sortKeys === 'function') { - // Custom sort function - objectKeyList.sort(state.sortKeys); - } else if (state.sortKeys) { - // Something is wrong - throw new exception('sortKeys must be a boolean or a function'); - } - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; - if (!compact || index !== 0) { - pairBuffer += generateNextLine(state, level); - } - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - if (!writeNode(state, level + 1, objectKey, true, true, true)) { - continue; // Skip this pair because of invalid key. - } + /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ - explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024; - if (explicitPair) { - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += '?'; - } else { - pairBuffer += '? '; - } - } - pairBuffer += state.dump; - if (explicitPair) { - pairBuffer += generateNextLine(state, level); - } - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { - continue; // Skip this pair because of invalid value. - } + /* vim: set sts=2 sw=2 et tw=80: */ - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += ':'; - } else { - pairBuffer += ': '; - } - pairBuffer += state.dump; + /* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + "use strict"; - // Both key and value are valid. - _result += pairBuffer; - } - state.tag = _tag; - state.dump = _result || '{}'; // Empty mapping if no valid pairs. - } + if (!globalThis.chrome?.runtime?.id) { + throw new Error("This script should only be loaded in a browser extension."); + } - function detectType(state, object, explicit) { - var _result, typeList, index, length, type, style; - typeList = explicit ? state.explicitTypes : state.implicitTypes; - for (index = 0, length = typeList.length; index < length; index += 1) { - type = typeList[index]; - if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) { - state.tag = explicit ? type.tag : '?'; - if (type.represent) { - style = state.styleMap[type.tag] || type.defaultStyle; - if (_toString.call(type.represent) === '[object Function]') { - _result = type.represent(object, style); - } else if (_hasOwnProperty.call(type.represent, style)) { - _result = type.represent[style](object, style); - } else { - throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); - } - state.dump = _result; - } - return true; - } - } - return false; - } + if (typeof globalThis.browser === "undefined" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) { + const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; // Wrapping the bulk of this polyfill in a one-time-use function is a minor + // optimization for Firefox. Since Spidermonkey does not fully parse the + // contents of a function until the first time it's called, and since it will + // never actually need to be called, this allows the polyfill to be included + // in Firefox nearly for free. - // Serializes `object` and writes it to global `result`. - // Returns true on success, or false on invalid object. - // - function writeNode(state, level, object, block, compact, iskey) { - state.tag = null; - state.dump = object; - if (!detectType(state, object, false)) { - detectType(state, object, true); - } - var type = _toString.call(state.dump); - if (block) { - block = state.flowLevel < 0 || state.flowLevel > level; - } - var objectOrArray = type === '[object Object]' || type === '[object Array]', - duplicateIndex, - duplicate; - if (objectOrArray) { - duplicateIndex = state.duplicates.indexOf(object); - duplicate = duplicateIndex !== -1; - } - if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) { - compact = false; - } - if (duplicate && state.usedDuplicates[duplicateIndex]) { - state.dump = '*ref_' + duplicateIndex; - } else { - if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { - state.usedDuplicates[duplicateIndex] = true; - } - if (type === '[object Object]') { - if (block && Object.keys(state.dump).length !== 0) { - writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowMapping(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } + const wrapAPIs = extensionAPIs => { + // NOTE: apiMetadata is associated to the content of the api-metadata.json file + // at build time by replacing the following "include" with the content of the + // JSON file. + const apiMetadata = { + "alarms": { + "clear": { + "minArgs": 0, + "maxArgs": 1 + }, + "clearAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 } - } else if (type === '[object Array]') { - var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level; - if (block && state.dump.length !== 0) { - writeBlockSequence(state, arrayLevel, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowSequence(state, arrayLevel, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } + }, + "bookmarks": { + "create": { + "minArgs": 1, + "maxArgs": 1 + }, + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getChildren": { + "minArgs": 1, + "maxArgs": 1 + }, + "getRecent": { + "minArgs": 1, + "maxArgs": 1 + }, + "getSubTree": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTree": { + "minArgs": 0, + "maxArgs": 0 + }, + "move": { + "minArgs": 2, + "maxArgs": 2 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeTree": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 } - } else if (type === '[object String]') { - if (state.tag !== '?') { - writeScalar(state, state.dump, level, iskey); + }, + "browserAction": { + "disable": { + "minArgs": 0, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "enable": { + "minArgs": 0, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "getBadgeBackgroundColor": { + "minArgs": 1, + "maxArgs": 1 + }, + "getBadgeText": { + "minArgs": 1, + "maxArgs": 1 + }, + "getPopup": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTitle": { + "minArgs": 1, + "maxArgs": 1 + }, + "openPopup": { + "minArgs": 0, + "maxArgs": 0 + }, + "setBadgeBackgroundColor": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setBadgeText": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setIcon": { + "minArgs": 1, + "maxArgs": 1 + }, + "setPopup": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setTitle": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true } - } else { - if (state.skipInvalid) return false; - throw new exception('unacceptable kind of an object to dump ' + type); - } - if (state.tag !== null && state.tag !== '?') { - state.dump = '!<' + state.tag + '> ' + state.dump; - } - } - return true; - } - function getDuplicateReferences(object, state) { - var objects = [], - duplicatesIndexes = [], - index, - length; - inspectNode(object, objects, duplicatesIndexes); - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { - state.duplicates.push(objects[duplicatesIndexes[index]]); - } - state.usedDuplicates = new Array(length); - } - function inspectNode(object, objects, duplicatesIndexes) { - var objectKeyList, index, length; - if (object !== null && typeof object === 'object') { - index = objects.indexOf(object); - if (index !== -1) { - if (duplicatesIndexes.indexOf(index) === -1) { - duplicatesIndexes.push(index); + }, + "browsingData": { + "remove": { + "minArgs": 2, + "maxArgs": 2 + }, + "removeCache": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeCookies": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeDownloads": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeFormData": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeHistory": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeLocalStorage": { + "minArgs": 1, + "maxArgs": 1 + }, + "removePasswords": { + "minArgs": 1, + "maxArgs": 1 + }, + "removePluginData": { + "minArgs": 1, + "maxArgs": 1 + }, + "settings": { + "minArgs": 0, + "maxArgs": 0 } - } else { - objects.push(object); - if (Array.isArray(object)) { - for (index = 0, length = object.length; index < length; index += 1) { - inspectNode(object[index], objects, duplicatesIndexes); + }, + "commands": { + "getAll": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "contextMenus": { + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + }, + "cookies": { + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAllCookieStores": { + "minArgs": 0, + "maxArgs": 0 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "devtools": { + "inspectedWindow": { + "eval": { + "minArgs": 1, + "maxArgs": 2, + "singleCallbackArg": false } - } else { - objectKeyList = Object.keys(object); - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); + }, + "panels": { + "create": { + "minArgs": 3, + "maxArgs": 3, + "singleCallbackArg": true + }, + "elements": { + "createSidebarPane": { + "minArgs": 1, + "maxArgs": 1 + } } } - } - } - } - function dump$1(input, options) { - options = options || {}; - var state = new State(options); - if (!state.noRefs) getDuplicateReferences(input, state); - if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; - return ''; - } - function safeDump$1(input, options) { - return dump$1(input, common.extend({ - schema: default_safe - }, options)); - } - var dump_1 = dump$1; - var safeDump_1 = safeDump$1; - var dumper = { - dump: dump_1, - safeDump: safeDump_1 - }; - - function deprecated(name) { - return function () { - throw new Error('Function ' + name + ' is deprecated and cannot be used.'); - }; - } - var Type = type; - var Schema = schema; - var FAILSAFE_SCHEMA = failsafe; - var JSON_SCHEMA = json; - var CORE_SCHEMA = core; - var DEFAULT_SAFE_SCHEMA = default_safe; - var DEFAULT_FULL_SCHEMA = default_full; - var load = loader.load; - var loadAll = loader.loadAll; - var safeLoad = loader.safeLoad; - var safeLoadAll = loader.safeLoadAll; - var dump = dumper.dump; - var safeDump = dumper.safeDump; - var YAMLException = exception; - - // Deprecated schema names from JS-YAML 2.0.x - var MINIMAL_SCHEMA = failsafe; - var SAFE_SCHEMA = default_safe; - var DEFAULT_SCHEMA = default_full; - - // Deprecated functions from JS-YAML 1.x.x - var scan = deprecated('scan'); - var parse = deprecated('parse'); - var compose = deprecated('compose'); - var addConstructor = deprecated('addConstructor'); - var jsYaml$1 = { - Type: Type, - Schema: Schema, - FAILSAFE_SCHEMA: FAILSAFE_SCHEMA, - JSON_SCHEMA: JSON_SCHEMA, - CORE_SCHEMA: CORE_SCHEMA, - DEFAULT_SAFE_SCHEMA: DEFAULT_SAFE_SCHEMA, - DEFAULT_FULL_SCHEMA: DEFAULT_FULL_SCHEMA, - load: load, - loadAll: loadAll, - safeLoad: safeLoad, - safeLoadAll: safeLoadAll, - dump: dump, - safeDump: safeDump, - YAMLException: YAMLException, - MINIMAL_SCHEMA: MINIMAL_SCHEMA, - SAFE_SCHEMA: SAFE_SCHEMA, - DEFAULT_SCHEMA: DEFAULT_SCHEMA, - scan: scan, - parse: parse, - compose: compose, - addConstructor: addConstructor - }; - - var jsYaml = jsYaml$1; - - function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - - /** - * Redirect - object used to redirect some requests - * e.g. - * { - * title: 1x1-transparent.gif - * comment: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever - * contentType: image/gif;base64 - * content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== - * } - * - * @typedef {Object} Redirect - * @property {string} title resource name - * @property {string} comment resource description - * @property {string} content encoded resource content - * @property {string} contentType MIME type - * @property {boolean} [isBlocking] e.g click2load redirect - * @property {string} [sha] hash - */ - - class Redirects { - /** - * Converts rawYaml into JS object with sources titles used as keys - * - * @param {string} rawYaml - * @returns {Object} - return object with titles in the keys and RedirectSources - * in the values - */ - constructor(rawYaml) { - try { - const arrOfRedirects = jsYaml.safeLoad(rawYaml); - this.redirects = arrOfRedirects.reduce(function (acc, redirect) { - return _objectSpread(_objectSpread({}, acc), {}, { - [redirect.title]: redirect - }); - }, {}); - } catch (e) { - // eslint-disable-next-line no-console - console.log("Was unable to load YAML into JS due to: ".concat(e.message)); - throw e; - } - } - - /** - * Returns redirect source object - * - * @param {string} title - * @returns {Redirect|undefined} Found redirect source object, or `undefined` if not found. - */ - getRedirect(title) { - var _this = this; - if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { - return this.redirects[title]; - } - - // look title among aliases - const values = Object.keys(this.redirects).map(function (key) { - return _this.redirects[key]; - }); - return values.find(function (redirect) { - const aliases = redirect.aliases; - if (!aliases) { - return false; + }, + "downloads": { + "cancel": { + "minArgs": 1, + "maxArgs": 1 + }, + "download": { + "minArgs": 1, + "maxArgs": 1 + }, + "erase": { + "minArgs": 1, + "maxArgs": 1 + }, + "getFileIcon": { + "minArgs": 1, + "maxArgs": 2 + }, + "open": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "pause": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeFile": { + "minArgs": 1, + "maxArgs": 1 + }, + "resume": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + }, + "show": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true } - return aliases.indexOf(title) > -1; - }); - } - - /** - * Checks if redirect is blocking like click2load.html - * - * @param {string} title Title of the redirect. - * @returns {boolean} True if redirect is blocking otherwise returns `false` even if redirect name is - * unknown. - */ - isBlocking(title) { - const redirect = this.redirects[title]; - if (redirect) { - return !!redirect.isBlocking; - } - return false; - } - } - - const redirectsMap = { - "1x1-transparent.gif": "1x1-transparent.gif", - "1x1.gif": "1x1-transparent.gif", - "1x1-transparent-gif": "1x1-transparent.gif", - "2x2-transparent.png": "2x2-transparent.png", - "2x2.png": "2x2-transparent.png", - "2x2-transparent-png": "2x2-transparent.png", - "3x2-transparent.png": "3x2-transparent.png", - "3x2.png": "3x2-transparent.png", - "3x2-transparent-png": "3x2-transparent.png", - "32x32-transparent.png": "32x32-transparent.png", - "32x32.png": "32x32-transparent.png", - "32x32-transparent-png": "32x32-transparent.png", - noopframe: "noopframe.html", - "noop.html": "noopframe.html", - "blank-html": "noopframe.html", - noopcss: "noopcss.css", - "noop.css": "noopcss.css", - "blank-css": "noopcss.css", - noopjs: "noopjs.js", - "noop.js": "noopjs.js", - "blank-js": "noopjs.js", - noopjson: "noopjson.json", - nooptext: "nooptext.js", - "noop.txt": "nooptext.js", - "blank-text": "nooptext.js", - empty: "nooptext.js", - "noopvmap-1.0": "noopvmap01.xml", - "noop-vmap1.0.xml": "noopvmap01.xml", - "noopvast-2.0": "noopvast02.xml", - "noopvast-3.0": "noopvast03.xml", - "noopvast-4.0": "noopvast04.xml", - "noopmp3-0.1s": "noopmp3.mp3", - "blank-mp3": "noopmp3.mp3", - "noopmp4-1s": "noopmp4.mp4", - "noop-1s.mp4": "noopmp4.mp4", - "blank-mp4": "noopmp4.mp4", - "click2load.html": "click2load.html", - "ubo-click2load.html": "click2load.html", - "amazon-apstag": "amazon-apstag.js", - "ubo-amazon_apstag.js": "amazon-apstag.js", - "amazon_apstag.js": "amazon-apstag.js", - "ati-smarttag": "ati-smarttag.js", - "didomi-loader": "didomi-loader.js", - fingerprintjs2: "fingerprintjs2.js", - "ubo-fingerprint2.js": "fingerprintjs2.js", - "fingerprint2.js": "fingerprintjs2.js", - fingerprintjs3: "fingerprintjs3.js", - "ubo-fingerprint3.js": "fingerprintjs3.js", - "fingerprint3.js": "fingerprintjs3.js", - gemius: "gemius.js", - "google-analytics-ga": "google-analytics-ga.js", - "ubo-google-analytics_ga.js": "google-analytics-ga.js", - "google-analytics_ga.js": "google-analytics-ga.js", - "google-analytics": "google-analytics.js", - "ubo-google-analytics_analytics.js": "google-analytics.js", - "google-analytics_analytics.js": "google-analytics.js", - "googletagmanager-gtm": "google-analytics.js", - "ubo-googletagmanager_gtm.js": "google-analytics.js", - "googletagmanager_gtm.js": "google-analytics.js", - "google-ima3": "google-ima3.js", - "ubo-google-ima.js": "google-ima3.js", - "google-ima.js": "google-ima3.js", - "googlesyndication-adsbygoogle": "googlesyndication-adsbygoogle.js", - "ubo-googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", - "googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", - "googletagservices-gpt": "googletagservices-gpt.js", - "ubo-googletagservices_gpt.js": "googletagservices-gpt.js", - "googletagservices_gpt.js": "googletagservices-gpt.js", - matomo: "matomo.js", - "metrika-yandex-tag": "metrika-yandex-tag.js", - "metrika-yandex-watch": "metrika-yandex-watch.js", - "naver-wcslog": "naver-wcslog.js", - noeval: "noeval.js", - "noeval.js": "noeval.js", - "silent-noeval.js": "noeval.js", - "ubo-noeval.js": "noeval.js", - "ubo-silent-noeval.js": "noeval.js", - "ubo-noeval": "noeval.js", - "ubo-silent-noeval": "noeval.js", - "pardot-1.0": "pardot-1.0.js", - "prebid-ads": "prebid-ads.js", - "ubo-prebid-ads.js": "prebid-ads.js", - "prebid-ads.js": "prebid-ads.js", - prebid: "prebid.js", - "prevent-bab": "prevent-bab.js", - "nobab.js": "prevent-bab.js", - "ubo-nobab.js": "prevent-bab.js", - "bab-defuser.js": "prevent-bab.js", - "ubo-bab-defuser.js": "prevent-bab.js", - "ubo-nobab": "prevent-bab.js", - "ubo-bab-defuser": "prevent-bab.js", - "prevent-bab2": "prevent-bab2.js", - "nobab2.js": "prevent-bab2.js", - "prevent-fab-3.2.0": "prevent-fab-3.2.0.js", - "nofab.js": "prevent-fab-3.2.0.js", - "ubo-nofab.js": "prevent-fab-3.2.0.js", - "fuckadblock.js-3.2.0": "prevent-fab-3.2.0.js", - "ubo-fuckadblock.js-3.2.0": "prevent-fab-3.2.0.js", - "ubo-nofab": "prevent-fab-3.2.0.js", - "prevent-popads-net": "prevent-popads-net.js", - "popads.net.js": "prevent-popads-net.js", - "ubo-popads.net.js": "prevent-popads-net.js", - "ubo-popads.net": "prevent-popads-net.js", - "scorecardresearch-beacon": "scorecardresearch-beacon.js", - "ubo-scorecardresearch_beacon.js": "scorecardresearch-beacon.js", - "scorecardresearch_beacon.js": "scorecardresearch-beacon.js", - "set-popads-dummy": "set-popads-dummy.js", - "popads-dummy.js": "set-popads-dummy.js", - "ubo-popads-dummy.js": "set-popads-dummy.js", - "ubo-popads-dummy": "set-popads-dummy.js" - }; - - /** - * Finds redirect resource by it's name - * - * @param {string} name - redirect name - * @returns {Function} - */ - const getRedirectByName = function getRedirectByName(name) { - const redirects = Object.keys(redirectsList).map(function (key) { - return redirectsList[key]; - }); - return redirects.find(function (r) { - return r.names && r.names.indexOf(name) > -1; - }); - }; - - /** - * @typedef {Object} Source - redirect properties - * @property {string} name redirect name - * @property {Array} args Arguments for redirect function - * @property {'extension'|'test'} [engine] - - * Defines the final form of redirect string presentation - * @property {boolean} [verbose] flag to enable printing to console debug information - */ - - /** - * Returns redirect code by param - * - * @param {Source} source - * @returns {string} redirect code - */ - const getRedirectCode = function getRedirectCode(source) { - const redirect = getRedirectByName(source.name); - let result = attachDependencies(redirect); - result = addCall(redirect, result); - - // redirect code for different sources is checked in tests - // so it should be just a code without any source and props passed - result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true); - return result; - }; - const getRedirectFilename = function getRedirectFilename(name) { - return redirectsMap[name]; - }; - const redirects = { - Redirects, - getRedirectFilename, - getCode: getRedirectCode, - isAdgRedirectRule: validator.isAdgRedirectRule, - isValidAdgRedirectRule: validator.isValidAdgRedirectRule, - isAdgRedirectCompatibleWithUbo: validator.isAdgRedirectCompatibleWithUbo, - isUboRedirectCompatibleWithAdg: validator.isUboRedirectCompatibleWithAdg, - isAbpRedirectCompatibleWithAdg: validator.isAbpRedirectCompatibleWithAdg, - convertUboRedirectToAdg, - convertAbpRedirectToAdg, - convertRedirectToAdg, - convertAdgRedirectToUbo - }; - - function abortCurrentInlineScript(source, args) { - function abortCurrentInlineScript(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const SRC_DATA_MARKER = "data:text/javascript;base64,"; - const getCurrentScript = function getCurrentScript() { - if ("currentScript" in document) { - return document.currentScript; - } - const scripts = document.getElementsByTagName("script"); - return scripts[scripts.length - 1]; - }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); - if (!scriptEl) { - return; + }, + "extension": { + "isAllowedFileSchemeAccess": { + "minArgs": 0, + "maxArgs": 0 + }, + "isAllowedIncognitoAccess": { + "minArgs": 0, + "maxArgs": 0 } - let content = scriptEl.textContent; - try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; - content = textContentGetter.call(scriptEl); - } catch (e) {} - if (content.length === 0 && typeof scriptEl.src !== "undefined" && startsWith(scriptEl.src, SRC_DATA_MARKER)) { - const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); - content = window.atob(encodedContent); + }, + "history": { + "addUrl": { + "minArgs": 1, + "maxArgs": 1 + }, + "deleteAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "deleteRange": { + "minArgs": 1, + "maxArgs": 1 + }, + "deleteUrl": { + "minArgs": 1, + "maxArgs": 1 + }, + "getVisits": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 } - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { - hit(source); - throw new ReferenceError(rid); + }, + "i18n": { + "detectLanguage": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAcceptLanguages": { + "minArgs": 0, + "maxArgs": 0 } - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (base instanceof Object === false && base === null) { - const props = property.split("."); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); - logMessage(source, message); - return; + }, + "identity": { + "launchWebAuthFlow": { + "minArgs": 1, + "maxArgs": 1 } - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; + }, + "idle": { + "queryState": { + "minArgs": 1, + "maxArgs": 1 } - let currentValue = base[prop]; - let origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { - currentValue = base[prop]; - origDescriptor = undefined; + }, + "management": { + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "getSelf": { + "minArgs": 0, + "maxArgs": 0 + }, + "setEnabled": { + "minArgs": 2, + "maxArgs": 2 + }, + "uninstallSelf": { + "minArgs": 0, + "maxArgs": 1 } - const descriptorWrapper = Object.assign(getDescriptorAddon(), { - currentValue: currentValue, - get() { - if (!this.isAbortingSuspended) { - this.isolateCallback(abort); - } - if (origDescriptor instanceof Object) { - return origDescriptor.get.call(base); - } - return this.currentValue; - }, - set(newValue) { - if (!this.isAbortingSuspended) { - this.isolateCallback(abort); - } - if (origDescriptor instanceof Object) { - origDescriptor.set.call(base, newValue); - } else { - this.currentValue = newValue; - } - } - }); - setPropertyAccess(base, prop, { - get() { - return descriptorWrapper.get.call(descriptorWrapper); - }, - set(newValue) { - descriptorWrapper.set.call(descriptorWrapper, newValue); - } - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - function randomId() { - return Math.random().toString(36).slice(2, 9); - } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; - } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { - return true; + }, + "notifications": { + "clear": { + "minArgs": 1, + "maxArgs": 1 + }, + "create": { + "minArgs": 1, + "maxArgs": 2 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "getPermissionLevel": { + "minArgs": 0, + "maxArgs": 0 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); + }, + "pageAction": { + "getPopup": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTitle": { + "minArgs": 1, + "maxArgs": 1 + }, + "hide": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setIcon": { + "minArgs": 1, + "maxArgs": 1 + }, + "setPopup": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setTitle": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "show": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true } - return false; - }; - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + }, + "permissions": { + "contains": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "request": { + "minArgs": 1, + "maxArgs": 1 } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + }, + "runtime": { + "getBackgroundPage": { + "minArgs": 0, + "maxArgs": 0 + }, + "getPlatformInfo": { + "minArgs": 0, + "maxArgs": 0 + }, + "openOptionsPage": { + "minArgs": 0, + "maxArgs": 0 + }, + "requestUpdateCheck": { + "minArgs": 0, + "maxArgs": 0 + }, + "sendMessage": { + "minArgs": 1, + "maxArgs": 3 + }, + "sendNativeMessage": { + "minArgs": 2, + "maxArgs": 2 + }, + "setUninstallURL": { + "minArgs": 1, + "maxArgs": 1 } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + }, + "sessions": { + "getDevices": { + "minArgs": 0, + "maxArgs": 1 + }, + "getRecentlyClosed": { + "minArgs": 0, + "maxArgs": 1 + }, + "restore": { + "minArgs": 0, + "maxArgs": 1 } - } - nativeConsole(messageStr); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getDescriptorAddon() { - return { - isAbortingSuspended: false, - isolateCallback(cb) { - this.isAbortingSuspended = true; - try { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - const result = cb(...args); - this.isAbortingSuspended = false; - return result; - } catch (_unused) { - const rid = randomId(); - this.isAbortingSuspended = false; - throw new ReferenceError(rid); + }, + "storage": { + "local": { + "clear": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "managed": { + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + } + }, + "sync": { + "clear": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 } } - }; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - abortCurrentInlineScript.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function abortOnPropertyRead(source, args) { - function abortOnPropertyRead(source, property) { - if (!property) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - throw new ReferenceError(rid); - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; + }, + "tabs": { + "captureVisibleTab": { + "minArgs": 0, + "maxArgs": 2 + }, + "create": { + "minArgs": 1, + "maxArgs": 1 + }, + "detectLanguage": { + "minArgs": 0, + "maxArgs": 1 + }, + "discard": { + "minArgs": 0, + "maxArgs": 1 + }, + "duplicate": { + "minArgs": 1, + "maxArgs": 1 + }, + "executeScript": { + "minArgs": 1, + "maxArgs": 2 + }, + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getCurrent": { + "minArgs": 0, + "maxArgs": 0 + }, + "getZoom": { + "minArgs": 0, + "maxArgs": 1 + }, + "getZoomSettings": { + "minArgs": 0, + "maxArgs": 1 + }, + "goBack": { + "minArgs": 0, + "maxArgs": 1 + }, + "goForward": { + "minArgs": 0, + "maxArgs": 1 + }, + "highlight": { + "minArgs": 1, + "maxArgs": 1 + }, + "insertCSS": { + "minArgs": 1, + "maxArgs": 2 + }, + "move": { + "minArgs": 2, + "maxArgs": 2 + }, + "query": { + "minArgs": 1, + "maxArgs": 1 + }, + "reload": { + "minArgs": 0, + "maxArgs": 2 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeCSS": { + "minArgs": 1, + "maxArgs": 2 + }, + "sendMessage": { + "minArgs": 2, + "maxArgs": 3 + }, + "setZoom": { + "minArgs": 1, + "maxArgs": 2 + }, + "setZoomSettings": { + "minArgs": 1, + "maxArgs": 2 + }, + "update": { + "minArgs": 1, + "maxArgs": 2 } - setPropertyAccess(base, prop, { - get: abort, - set: function set() {} - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - function randomId() { - return Math.random().toString(36).slice(2, 9); - } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; - } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; - } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { - return true; + }, + "topSites": { + "get": { + "minArgs": 0, + "maxArgs": 0 } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); + }, + "webNavigation": { + "getAllFrames": { + "minArgs": 1, + "maxArgs": 1 + }, + "getFrame": { + "minArgs": 1, + "maxArgs": 1 } - return false; - }; - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + }, + "webRequest": { + "handlerBehaviorChanged": { + "minArgs": 0, + "maxArgs": 0 } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + }, + "windows": { + "create": { + "minArgs": 0, + "maxArgs": 1 + }, + "get": { + "minArgs": 1, + "maxArgs": 2 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 1 + }, + "getCurrent": { + "minArgs": 0, + "maxArgs": 1 + }, + "getLastFocused": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); } + }; + + if (Object.keys(apiMetadata).length === 0) { + throw new Error("api-metadata.json has not been included in browser-polyfill"); } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - abortOnPropertyRead.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function abortOnPropertyWrite(source, args) { - function abortOnPropertyWrite(source, property) { - if (!property) { - return; + /** + * A WeakMap subclass which creates and stores a value for any key which does + * not exist when accessed, but behaves exactly as an ordinary WeakMap + * otherwise. + * + * @param {function} createItem + * A function which will be called in order to create the value for any + * key which does not exist, the first time it is accessed. The + * function receives, as its only argument, the key being created. + */ + + + class DefaultWeakMap extends WeakMap { + constructor(createItem, items = undefined) { + super(items); + this.createItem = createItem; } - const rid = randomId(); - const abort = function abort() { - hit(source); - throw new ReferenceError(rid); - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; + + get(key) { + if (!this.has(key)) { + this.set(key, this.createItem(key)); } - setPropertyAccess(base, prop, { - set: abort - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - function randomId() { - return Math.random().toString(36).slice(2, 9); - } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; - } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); + + return super.get(key); } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; + } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { - return true; - } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); + /** + * Returns true if the given object is an object with a `then` method, and can + * therefore be assumed to behave as a Promise. + * + * @param {*} value The value to test. + * @returns {boolean} True if the value is thenable. + */ + + + const isThenable = value => { + return value && typeof value === "object" && typeof value.then === "function"; + }; + /** + * Creates and returns a function which, when called, will resolve or reject + * the given promise based on how it is called: + * + * - If, when called, `chrome.runtime.lastError` contains a non-null object, + * the promise is rejected with that value. + * - If the function is called with exactly one argument, the promise is + * resolved to that value. + * - Otherwise, the promise is resolved to an array containing all of the + * function's arguments. + * + * @param {object} promise + * An object containing the resolution and rejection functions of a + * promise. + * @param {function} promise.resolve + * The promise's resolution function. + * @param {function} promise.reject + * The promise's rejection function. + * @param {object} metadata + * Metadata about the wrapped method which has created the callback. + * @param {boolean} metadata.singleCallbackArg + * Whether or not the promise is resolved with only the first + * argument of the callback, alternatively an array of all the + * callback arguments is resolved. By default, if the callback + * function is invoked with only a single argument, that will be + * resolved to the promise, while all arguments will be resolved as + * an array if multiple are given. + * + * @returns {function} + * The generated callback function. + */ + + + const makeCallback = (promise, metadata) => { + return (...callbackArgs) => { + if (extensionAPIs.runtime.lastError) { + promise.reject(new Error(extensionAPIs.runtime.lastError.message)); + } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) { + promise.resolve(callbackArgs[0]); + } else { + promise.resolve(callbackArgs); } - return false; }; - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - abortOnPropertyWrite.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function abortOnStackTrace(source, args) { - function abortOnStackTrace(source, property, stack) { - if (!property || !stack) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - throw new ReferenceError(rid); - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; + }; + + const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments"; + /** + * Creates a wrapper function for a method with the given name and metadata. + * + * @param {string} name + * The name of the method which is being wrapped. + * @param {object} metadata + * Metadata about the method being wrapped. + * @param {integer} metadata.minArgs + * The minimum number of arguments which must be passed to the + * function. If called with fewer than this number of arguments, the + * wrapper will raise an exception. + * @param {integer} metadata.maxArgs + * The maximum number of arguments which may be passed to the + * function. If called with more than this number of arguments, the + * wrapper will raise an exception. + * @param {boolean} metadata.singleCallbackArg + * Whether or not the promise is resolved with only the first + * argument of the callback, alternatively an array of all the + * callback arguments is resolved. By default, if the callback + * function is invoked with only a single argument, that will be + * resolved to the promise, while all arguments will be resolved as + * an array if multiple are given. + * + * @returns {function(object, ...*)} + * The generated wrapper function. + */ + + + const wrapAsyncFunction = (name, metadata) => { + return function asyncFunctionWrapper(target, ...args) { + if (args.length < metadata.minArgs) { + throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); } - if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { - logMessage(source, "Invalid parameter: ".concat(stack)); - return; + + if (args.length > metadata.maxArgs) { + throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); } - const descriptorWrapper = Object.assign(getDescriptorAddon(), { - value: base[prop], - get() { - if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { - abort(); - } - return this.value; - }, - set(newValue) { - if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { - abort(); + + return new Promise((resolve, reject) => { + if (metadata.fallbackToNoCallback) { + // This API method has currently no callback on Chrome, but it return a promise on Firefox, + // and so the polyfill will try to call it with a callback first, and it will fallback + // to not passing the callback if the first call fails. + try { + target[name](...args, makeCallback({ + resolve, + reject + }, metadata)); + } catch (cbError) { + console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError); + target[name](...args); // Update the API method metadata, so that the next API calls will not try to + // use the unsupported callback anymore. + + metadata.fallbackToNoCallback = false; + metadata.noCallback = true; + resolve(); } - this.value = newValue; - } - }); - setPropertyAccess(base, prop, { - get() { - return descriptorWrapper.get.call(descriptorWrapper); - }, - set(newValue) { - descriptorWrapper.set.call(descriptorWrapper, newValue); + } else if (metadata.noCallback) { + target[name](...args); + resolve(); + } else { + target[name](...args, makeCallback({ + resolve, + reject + }, metadata)); } }); }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - function randomId() { - return Math.random().toString(36).slice(2, 9); - } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; - } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; - } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { - return true; - } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); - } - return false; - }; - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); - } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; - } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function matchStackTrace(stackMatch, stackTrace) { - if (!stackMatch || stackMatch === "") { - return true; - } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { - return true; - } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }).join("\n"); - return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); - } - function getDescriptorAddon() { - return { - isAbortingSuspended: false, - isolateCallback(cb) { - this.isAbortingSuspended = true; - try { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - const result = cb(...args); - this.isAbortingSuspended = false; - return result; - } catch (_unused) { - const rid = randomId(); - this.isAbortingSuspended = false; - throw new ReferenceError(rid); - } - } - }; - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + }; + /** + * Wraps an existing method of the target object, so that calls to it are + * intercepted by the given wrapper function. The wrapper function receives, + * as its first argument, the original `target` object, followed by each of + * the arguments passed to the original method. + * + * @param {object} target + * The original target object that the wrapped method belongs to. + * @param {function} method + * The method being wrapped. This is used as the target of the Proxy + * object which is created to wrap the method. + * @param {function} wrapper + * The wrapper function which is called in place of a direct invocation + * of the wrapped method. + * + * @returns {Proxy} + * A Proxy object for the given method, which invokes the given wrapper + * method in its place. + */ + + + const wrapMethod = (target, method, wrapper) => { + return new Proxy(method, { + apply(targetMethod, thisObj, args) { + return wrapper.call(thisObj, target, ...args); } - } - nativeConsole(messageStr); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; - } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; - }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; - }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { - return false; - } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); - if (pos !== -1) { - documentURL = documentURL.slice(0, pos); - } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); + }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { - stackURL = stackURL.slice(1); + }; + + let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); + /** + * Wraps an object in a Proxy which intercepts and wraps certain methods + * based on the given `wrappers` and `metadata` objects. + * + * @param {object} target + * The target object to wrap. + * + * @param {object} [wrappers = {}] + * An object tree containing wrapper functions for special cases. Any + * function present in this object tree is called in place of the + * method in the same location in the `target` object tree. These + * wrapper methods are invoked as described in {@see wrapMethod}. + * + * @param {object} [metadata = {}] + * An object tree containing metadata used to automatically generate + * Promise-based wrapper functions for asynchronous. Any function in + * the `target` object tree which has a corresponding metadata object + * in the same location in the `metadata` tree is replaced with an + * automatically-generated wrapper function, as described in + * {@see wrapAsyncFunction} + * + * @returns {Proxy} + */ + + const wrapObject = (target, wrappers = {}, metadata = {}) => { + let cache = Object.create(null); + let handlers = { + has(proxyTarget, prop) { + return prop in target || prop in cache; + }, + + get(proxyTarget, prop, receiver) { + if (prop in cache) { + return cache[prop]; } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { - stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { - stackFunction = stackFunction.slice(2).trim(); + + if (!(prop in target)) { + return undefined; + } + + let value = target[prop]; + + if (typeof value === "function") { + // This is a method on the underlying object. Check if we need to do + // any wrapping. + if (typeof wrappers[prop] === "function") { + // We have a special-case wrapper for this method. + value = wrapMethod(target, target[prop], wrappers[prop]); + } else if (hasOwnProperty(metadata, prop)) { + // This is an async method that we have metadata for. Create a + // Promise wrapper for it. + let wrapper = wrapAsyncFunction(prop, metadata[prop]); + value = wrapMethod(target, target[prop], wrapper); + } else { + // This is a method that we don't know or care about. Return the + // original method, bound to the underlying object. + value = value.bind(target); } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { + // This is an object that we need to do some wrapping for the children + // of. Create a sub-object wrapper for it with the appropriate child + // metadata. + value = wrapObject(value, wrappers[prop], metadata[prop]); + } else if (hasOwnProperty(metadata, "*")) { + // Wrap all properties in * namespace. + value = wrapObject(value, wrappers[prop], metadata["*"]); } else { - stack = stackURL; - } - } else { - stack = line; - } - return stack; - }); - if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { - if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { - return true; + // We don't need to do any wrapping for this property, + // so just forward all access to the underlying object. + Object.defineProperty(cache, prop, { + configurable: true, + enumerable: true, + + get() { + return target[prop]; + }, + + set(value) { + target[prop] = value; + } + + }); + return value; } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { - return true; + + cache[prop] = value; + return value; + }, + + set(proxyTarget, prop, value, receiver) { + if (prop in cache) { + cache[prop] = value; + } else { + target[prop] = value; } + + return true; + }, + + defineProperty(proxyTarget, prop, desc) { + return Reflect.defineProperty(cache, prop, desc); + }, + + deleteProperty(proxyTarget, prop) { + return Reflect.deleteProperty(cache, prop); } + + }; // Per contract of the Proxy API, the "get" proxy handler must return the + // original value of the target if that value is declared read-only and + // non-configurable. For this reason, we create an object with the + // prototype set to `target` instead of using `target` directly. + // Otherwise we cannot return a custom object for APIs that + // are declared read-only and non-configurable, such as `chrome.devtools`. + // + // The proxy handlers themselves will still use the original `target` + // instead of the `proxyTarget`, so that the methods and properties are + // dereferenced via the original targets. + + let proxyTarget = Object.create(target); + return new Proxy(proxyTarget, handlers); + }; + /** + * Creates a set of wrapper functions for an event object, which handles + * wrapping of listener functions that those messages are passed. + * + * A single wrapper is created for each listener function, and stored in a + * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener` + * retrieve the original wrapper, so that attempts to remove a + * previously-added listener work as expected. + * + * @param {DefaultWeakMap} wrapperMap + * A DefaultWeakMap object which will create the appropriate wrapper + * for a given listener function when one does not exist, and retrieve + * an existing one when it does. + * + * @returns {object} + */ + + + const wrapEvent = wrapperMap => ({ + addListener(target, listener, ...args) { + target.addListener(wrapperMap.get(listener), ...args); + }, + + hasListener(target, listener) { + return target.hasListener(wrapperMap.get(listener)); + }, + + removeListener(target, listener) { + target.removeListener(wrapperMap.get(listener)); } - return false; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - abortOnStackTrace.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function adjustSetInterval(source, args) { - function adjustSetInterval(source, matchCallback, matchDelay, boost) { - const nativeSetInterval = window.setInterval; - const matchRegexp = toRegExp(matchCallback); - const intervalWrapper = function intervalWrapper(callback, delay) { - if (!isValidCallback(callback)) { - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); - logMessage(source, message); - } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { - delay *= getBoostMultiplier(boost); - hit(source); - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeSetInterval.apply(window, [callback, delay, ...args]); - }; - window.setInterval = intervalWrapper; - } - function hit(source) { - if (source.verbose !== true) { - return; + + }); + + const onRequestFinishedWrappers = new DefaultWeakMap(listener => { + if (typeof listener !== "function") { + return listener; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + /** + * Wraps an onRequestFinished listener function so that it will return a + * `getContent()` property which returns a `Promise` rather than using a + * callback API. + * + * @param {object} req + * The HAR entry object representing the network request. + */ + + + return function onRequestFinished(req) { + const wrappedReq = wrapObject(req, {} + /* wrappers */ + , { + getContent: { + minArgs: 0, + maxArgs: 0 } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + }); + listener(wrappedReq); + }; + }); + const onMessageWrappers = new DefaultWeakMap(listener => { + if (typeof listener !== "function") { + return listener; + } + /** + * Wraps a message listener function so that it may send responses based on + * its return value, rather than by returning a sentinel value and calling a + * callback. If the listener function returns a Promise, the response is + * sent when the promise either resolves or rejects. + * + * @param {*} message + * The message sent by the other end of the channel. + * @param {object} sender + * Details about the sender of the message. + * @param {function(*)} sendResponse + * A callback which, when called with an arbitrary argument, sends + * that value as a response. + * @returns {boolean} + * True if the wrapped listener returned a Promise, which will later + * yield a response. False otherwise. + */ + + + return function onMessage(message, sender, sendResponse) { + let didCallSendResponse = false; + let wrappedSendResponse; + let sendResponsePromise = new Promise(resolve => { + wrappedSendResponse = function (response) { + didCallSendResponse = true; + resolve(response); + }; + }); + let result; + + try { + result = listener(message, sender, wrappedSendResponse); + } catch (err) { + result = Promise.reject(err); } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + + const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called + // wrappedSendResponse synchronously, we can exit earlier + // because there will be no response sent from this listener. + + if (result !== true && !isResultThenable && !didCallSendResponse) { + return false; + } // A small helper to send the message if the promise resolves + // and an error if the promise rejects (a wrapped sendMessage has + // to translate the message into a resolved promise or a rejected + // promise). + + + const sendPromisedResult = promise => { + promise.then(msg => { + // send the message value. + sendResponse(msg); + }, error => { + // Send a JSON representation of the error if the rejected value + // is an instance of error, or the object itself otherwise. + let message; + + if (error && (error instanceof Error || typeof error.message === "string")) { + message = error.message; + } else { + message = "An unexpected error occurred"; + } + + sendResponse({ + __mozWebExtensionPolyfillReject__: true, + message + }); + }).catch(err => { + // Print an error on the console if unable to send the response. + console.error("Failed to send onMessage rejected reply", err); + }); + }; // If the listener returned a Promise, send the resolved value as a + // result, otherwise wait the promise related to the wrappedSendResponse + // callback to resolve and send it as a response. + + + if (isResultThenable) { + sendPromisedResult(result); + } else { + sendPromisedResult(sendResponsePromise); + } // Let Chrome know that the listener is replying. + + + return true; + }; + }); + + const wrappedSendMessageCallback = ({ + reject, + resolve + }, reply) => { + if (extensionAPIs.runtime.lastError) { + // Detect when none of the listeners replied to the sendMessage call and resolve + // the promise to undefined as in Firefox. + // See https://github.com/mozilla/webextension-polyfill/issues/130 + if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) { + resolve(); + } else { + reject(new Error(extensionAPIs.runtime.lastError.message)); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function isValidCallback(callback) { - return callback instanceof Function || typeof callback === "string"; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + } else if (reply && reply.__mozWebExtensionPolyfillReject__) { + // Convert back the JSON representation of the error into + // an Error instance. + reject(new Error(reply.message)); + } else { + resolve(reply); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function getBoostMultiplier(boost) { - const DEFAULT_MULTIPLIER = .05; - const MIN_MULTIPLIER = .001; - const MAX_MULTIPLIER = 50; - const parsedBoost = parseFloat(boost); - let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { - boostMultiplier = MIN_MULTIPLIER; + }; + + const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => { + if (args.length < metadata.minArgs) { + throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); } - if (boostMultiplier > MAX_MULTIPLIER) { - boostMultiplier = MAX_MULTIPLIER; + + if (args.length > metadata.maxArgs) { + throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); } - return boostMultiplier; - } - function isDelayMatched(inputDelay, realDelay) { - return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + + return new Promise((resolve, reject) => { + const wrappedCb = wrappedSendMessageCallback.bind(null, { + resolve, + reject + }); + args.push(wrappedCb); + apiNamespaceObj.sendMessage(...args); + }); + }; + + const staticWrappers = { + devtools: { + network: { + onRequestFinished: wrapEvent(onRequestFinishedWrappers) + } + }, + runtime: { + onMessage: wrapEvent(onMessageWrappers), + onMessageExternal: wrapEvent(onMessageWrappers), + sendMessage: wrappedSendMessage.bind(null, "sendMessage", { + minArgs: 1, + maxArgs: 3 + }) + }, + tabs: { + sendMessage: wrappedSendMessage.bind(null, "sendMessage", { + minArgs: 2, + maxArgs: 3 + }) } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + }; + const settingMetadata = { + clear: { + minArgs: 1, + maxArgs: 1 + }, + get: { + minArgs: 1, + maxArgs: 1 + }, + set: { + minArgs: 1, + maxArgs: 1 } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + }; + apiMetadata.privacy = { + network: { + "*": settingMetadata + }, + services: { + "*": settingMetadata + }, + websites: { + "*": settingMetadata } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; - return native(num); - } - function getMatchDelay(delay) { - const DEFAULT_DELAY = 1e3; - const parsedDelay = parseInt(delay, 10); - const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; - return delayMatch; + }; + return wrapObject(extensionAPIs, staticWrappers, apiMetadata); + }; // The build process adds a UMD wrapper around this file, which makes the + // `module` variable available. + + + module.exports = wrapAPIs(chrome); + } else { + module.exports = globalThis.browser; + } +}); +//# sourceMappingURL=browser-polyfill.js.map + + +/***/ }), + +/***/ 3636: +/***/ ((module, exports, __webpack_require__) => { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__; +/** + * AdGuard Scriptlets + * Version 1.9.62 + */ + +(function (factory) { + true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : + __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : + 0; +})((function () { + /** + * Concat dependencies to scriptlet code + * + * @param scriptlet scriptlet or redirect function + * @returns string view of scriptlet with attached dependencies + */ + function attachDependencies(scriptlet) { + var _scriptlet$injections = scriptlet.injections, + injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections; + return injections.reduce(function (accum, dep) { + return "".concat(accum, "\n").concat(dep.toString()); + }, scriptlet.toString()); + } + + /** + * Add scriptlet call to existing code + * + * @param scriptlet scriptlet func + * @param code scriptlet's string representation + * @returns wrapped scriptlet call + */ + function addCall(scriptlet, code) { + return "".concat(code, "\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n ").concat(scriptlet.name, ".apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }"); + } + + /** + * Wrap function into IIFE (Immediately invoked function expression) + * + * @example + * const source = { + * args: ["aaa", "bbb"], + * name: 'noeval', + * }; + * const code = "function noeval(source, args) { alert(source); } noeval.apply(this, args);" + * const result = wrapInIIFE(source, code); + * + * // result + * `(function(source, args) { + * function noeval(source) { alert(source); } + * noeval.apply(this, args); + * )({"args": ["aaa", "bbb"], "name":"noeval"}, ["aaa", "bbb"])` + * @param source - object with scriptlet properties + * @param code - scriptlet source code with dependencies + * @param redirect if function is redirect + * @returns full scriptlet code + */ + function passSourceAndProps(source, code) { + var redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var sourceString = JSON.stringify(source); + var argsString = source.args ? "[".concat(source.args.map(function (arg) { + return JSON.stringify(arg); + }), "]") : undefined; + var params = argsString ? "".concat(sourceString, ", ").concat(argsString) : sourceString; + if (redirect) { + return "(function(source, args){\n".concat(code, "\n})(").concat(params, ");"); } - function shouldMatchAnyDelay(delay) { - return delay === "*"; + return "(".concat(code, ")(").concat(params, ");"); + } + + /** + * Wrap code in no name function + * + * @param code which must be wrapped + * @returns wrapped code + */ + function wrapInNonameFunc(code) { + return "function(source, args){\n".concat(code, "\n}"); + } + + /** + * Checks whether the obj is an empty object + * + * @param obj arbitrary object + * @returns if object is empty + */ + var isEmptyObject = function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + }; + + /** + * Safely retrieve property descriptor + * + * @param obj target object + * @param prop target property + * @returns descriptor or null if it's not available or non-configurable + */ + var safeGetDescriptor = function safeGetDescriptor(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + if (descriptor && descriptor.configurable) { + return descriptor; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - adjustSetInterval.apply(this, updatedArgs); - } catch (e) { - console.log(e); + return null; + }; + + /** + * Set getter and setter to property if it's configurable + * + * @param object target object with property + * @param property property name + * @param descriptor contains getter and setter functions + * @returns is operation successful + */ + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; } + Object.defineProperty(object, property, descriptor); + return true; } - function adjustSetTimeout(source, args) { - function adjustSetTimeout(source, matchCallback, matchDelay, boost) { - const nativeSetTimeout = window.setTimeout; - const matchRegexp = toRegExp(matchCallback); - const timeoutWrapper = function timeoutWrapper(callback, delay) { - if (!isValidCallback(callback)) { - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); - logMessage(source, message); - } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { - delay *= getBoostMultiplier(boost); - hit(source); - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeSetTimeout.apply(window, [callback, delay, ...args]); - }; - window.setTimeout = timeoutWrapper; + + /** + * Determines whether the passed value is NaN + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN + * + * @param num arbitrary value + * @returns if provided value is NaN + */ + var nativeIsNaN = function nativeIsNaN(num) { + // eslint-disable-next-line no-restricted-properties + var native = Number.isNaN || window.isNaN; + return native(num); + }; + /** + * Determines whether the passed value is a finite number + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite + * + * @param num arbitrary value + * @returns if provided value is finite + */ + var nativeIsFinite = function nativeIsFinite(num) { + // eslint-disable-next-line no-restricted-properties + var native = Number.isFinite || window.isFinite; + return native(num); + }; + + /** + * Parses string for a number, if possible, otherwise returns null. + * + * @param rawString arbitrary string + * @returns number or null if string not parsable + */ + var getNumberFromString = function getNumberFromString(rawString) { + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return validDelay; + }; + + /** + * Generate a random integer between two values, inclusive + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive + * + * @param min range minimum + * @param max range maximum + * @returns random number + */ + function getRandomIntInclusive(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1) + min); + } + + /** + * A literal string or regexp pattern wrapped in forward slashes. + * For example, 'simpleStr' or '/adblock|_0x/'. + */ + + /** + * String.prototype.replaceAll polyfill + * + * @param input input string + * @param substr to look for + * @param newSubstr replacement + * @returns result string + */ + var replaceAll = function replaceAll(input, substr, newSubstr) { + return input.split(substr).join(newSubstr); + }; + + /** + * Escapes special chars in string + * + * @param str raw string + * @returns string with escaped special characters + */ + var escapeRegExp = function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }; + + /** + * Converts string to the regexp, + * if string contains valid regexp flags it will be converted to regexp with flags + * TODO think about nested dependencies, but be careful with dependency loops + * + * @param input literal string or regexp pattern; defaults to '' (empty string) + * @returns regular expression; defaults to /.?/ + */ + var toRegExp = function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var DEFAULT_VALUE = '.?'; + var FORWARD_SLASH = '/'; + if (input === '') { + return new RegExp(DEFAULT_VALUE); } - function hit(source) { - if (source.verbose !== true) { - return; + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + + /** + * Checks whether the string is a valid regexp flag + * + * @param flag string + * @returns True if regexp flag is valid, otherwise false. + */ + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function isValidCallback(callback) { - return callback instanceof Function || typeof callback === "string"; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + // eslint-disable-next-line no-new + new RegExp('', flag); + return true; + } catch (ex) { + return false; } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + }; + + /** + * Checks whether the text string contains valid regexp flags, + * and returns `flagsStr` if valid, otherwise empty string. + * + * @param regExpStr string + * @param flagsStr string + * @returns `flagsStr` if it is valid, otherwise empty string. + */ + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) + // Not a correct regex if ends with '\\/' + && !regExpStr.endsWith('\\/') && isValidRegExpFlag(flagsStr)) { + return flagsStr; } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); + return ''; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input + // remove quotes' escapes for cases where scriptlet rule argument has own escaped quotes + // e.g #%#//scriptlet('prevent-setTimeout', '.css(\'display\',\'block\');') + .replace(/\\'/g, '\'').replace(/\\"/g, '"') + // escape special characters for following RegExp construction + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + return new RegExp(escaped); + }; + + /** + * Checks whether the input string can be converted to regexp + * + * @param input literal string or regexp pattern + * @returns if input can be converted to regexp + */ + var isValidStrPattern = function isValidStrPattern(input) { + var FORWARD_SLASH = '/'; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); } - function getBoostMultiplier(boost) { - const DEFAULT_MULTIPLIER = .05; - const MIN_MULTIPLIER = .001; - const MAX_MULTIPLIER = 50; - const parsedBoost = parseFloat(boost); - let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { - boostMultiplier = MIN_MULTIPLIER; - } - if (boostMultiplier > MAX_MULTIPLIER) { - boostMultiplier = MAX_MULTIPLIER; - } - return boostMultiplier; + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; } - function isDelayMatched(inputDelay, realDelay) { - return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); + return isValid; + }; + + /** + * Get string before regexp first match + * + * @param str input string + * @param rx find pattern + * @returns result string + */ + var getBeforeRegExp = function getBeforeRegExp(str, rx) { + var index = str.search(rx); + return str.substring(0, index); + }; + var substringAfter$1 = function substringAfter(str, separator) { + if (!str) { + return str; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; - return native(num); - } - function getMatchDelay(delay) { - const DEFAULT_DELAY = 1e3; - const parsedDelay = parseInt(delay, 10); - const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; - return delayMatch; - } - function shouldMatchAnyDelay(delay) { - return delay === "*"; + var index = str.indexOf(separator); + return index < 0 ? '' : str.substring(index + separator.length); + }; + var substringBefore = function substringBefore(str, separator) { + if (!str || !separator) { + return str; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - adjustSetTimeout.apply(this, updatedArgs); - } catch (e) { - console.log(e); + var index = str.indexOf(separator); + return index < 0 ? str : str.substring(0, index); + }; + + /** + * Wrap str in single quotes and replaces single quotes to double one + * + * @param str input string + * @returns string with swapped quotes + */ + var wrapInSingleQuotes = function wrapInSingleQuotes(str) { + if (str[0] === '\'' && str[str.length - 1] === '\'' || str[0] === '"' && str[str.length - 1] === '"') { + str = str.substring(1, str.length - 1); } - } - function debugCurrentInlineScript(source, args) { - function debugCurrentInlineScript(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const getCurrentScript = function getCurrentScript() { - if ("currentScript" in document) { - return document.currentScript; - } - const scripts = document.getElementsByTagName("script"); - return scripts[scripts.length - 1]; - }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); - if (!scriptEl) { - return; - } - let content = scriptEl.textContent; - try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; - content = textContentGetter.call(scriptEl); - } catch (e) {} - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { - hit(source); - debugger; - } - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (base instanceof Object === false && base === null) { - const props = property.split("."); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); - logMessage(message, source.verbose); - return; - } - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } + // eslint-disable-next-line no-useless-escape + str = str.replace(/\'/g, '"'); + return "'".concat(str, "'"); + }; + + /** + * Returns substring enclosed in the widest braces + * + * @param str input string + * @returns substring + */ + var getStringInBraces = function getStringInBraces(str) { + var firstIndex = str.indexOf('('); + var lastIndex = str.lastIndexOf(')'); + return str.substring(firstIndex + 1, lastIndex); + }; + + /** + * Prepares RTCPeerConnection config as string for proper logging + * + * @param config RTC config + * @returns stringified config + */ + var convertRtcConfigToString = function convertRtcConfigToString(config) { + var UNDEF_STR = 'undefined'; + var str = UNDEF_STR; + if (config === null) { + str = 'null'; + } else if (config instanceof Object) { + var SERVERS_PROP_NAME = 'iceServers'; + var URLS_PROP_NAME = 'urls'; + /* + const exampleConfig = { + 'iceServers': [ + 'urls': ['stun:35.66.206.188:443'], + ], }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - let currentValue = base[prop]; - setPropertyAccess(base, prop, { - set: function set(value) { - abort(); - currentValue = value; - }, - get: function get() { - abort(); - return currentValue; - } - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); + */ + if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { + str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); + } } - function randomId() { - return Math.random().toString(36).slice(2, 9); + return str; + }; + + /** + * Checks whether the match input string can be converted to regexp, + * used for match inputs with possible negation + * + * @param match literal string or regexp pattern + * @returns true if input can be converted to regexp + */ + var isValidMatchStr = function isValidMatchStr(match) { + var INVERT_MARKER = '!'; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { + str = match.slice(1); } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; + return isValidStrPattern(str); + }; + + /** + * Validates the match input number, + * used for match inputs with possible negation + * + * @param match string of match number + * @returns if match number is valid + */ + var isValidMatchNumber = function isValidMatchNumber(match) { + var INVERT_MARKER = '!'; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { + str = match.slice(1); } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; + var num = parseFloat(str); + return !nativeIsNaN(num) && nativeIsFinite(num); + }; + + /** + * Parses match arg with possible negation for no matching. + * Needed for prevent-setTimeout, prevent-setInterval, + * prevent-requestAnimationFrame and prevent-window-open + * + * @param match matching arg + * @returns data prepared for matching + */ + var parseMatchArg = function parseMatchArg(match) { + var INVERT_MARKER = '!'; + // In case if "match" is "undefined" return "false" + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); + return { + isInvertedMatch, + matchRegexp, + matchValue + }; + }; + + /** + * Parses delay arg with possible negation for no matching. + * Needed for prevent-setTimeout and prevent-setInterval + * + * @param delay scriptlet's delay arg + * @returns parsed delay data + */ + var parseDelayArg = function parseDelayArg(delay) { + var INVERT_MARKER = '!'; + var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER); + var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; + var parsedDelay = parseInt(delayValue, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return { + isInvertedDelayMatch, + delayMatch + }; + }; + + /** + * Converts object to string for logging + * + * @param obj data object + * @returns object's string representation + */ + var objectToString = function objectToString(obj) { + // In case if the type of passed obj is different than Object + // https://github.com/AdguardTeam/Scriptlets/issues/282 + if (!obj || typeof obj !== 'object') { + return String(obj); } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + return isEmptyObject(obj) ? '{}' : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + return "".concat(key, ":\"").concat(recordValueStr, "\""); + }).join(' '); + }; + + /** + * Converts types into a string + * + * @param value input value type + * @returns type's string representation + */ + var convertTypeToString = function convertTypeToString(value) { + var output; + if (typeof value === 'undefined') { + output = 'undefined'; + } else if (typeof value === 'object') { + if (value === null) { + output = 'null'; + } else { + output = objectToString(value); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); + } else { + output = value.toString(); } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { - return true; - } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); - } - return false; - }; + return output; + }; + + /** + * Generate a random string, a length of the string is provided as an argument + * + * @param length output's length + * @returns random string + */ + function getRandomStrByLength(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~'; + var charactersLength = characters.length; + for (var i = 0; i < length; i += 1) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } + return result; + } + + /** + * Generate a random string + * + * @param customResponseText response text to include in output + * @returns random string or null if passed argument is invalid + */ + function generateRandomResponse(customResponseText) { + var customResponse = customResponseText; + if (customResponse === 'true') { + // Generate random alphanumeric string of 10 symbols + customResponse = Math.random().toString(36).slice(-10); + return customResponse; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + customResponse = customResponse.replace('length:', ''); + var rangeRegex = /^\d+-\d+$/; + // Return empty string if range is invalid + if (!rangeRegex.test(customResponse)) { + return null; } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; + var rangeMin = getNumberFromString(customResponse.split('-')[0]); + var rangeMax = getNumberFromString(customResponse.split('-')[1]); + if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { + return null; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - debugCurrentInlineScript.apply(this, updatedArgs); - } catch (e) { - console.log(e); + + // If rangeMin > rangeMax, swap variables + if (rangeMin > rangeMax) { + var temp = rangeMin; + rangeMin = rangeMax; + rangeMax = temp; + } + var LENGTH_RANGE_LIMIT = 500 * 1000; + if (rangeMax > LENGTH_RANGE_LIMIT) { + return null; } + var length = getRandomIntInclusive(rangeMin, rangeMax); + customResponse = getRandomStrByLength(length); + return customResponse; } - function debugOnPropertyRead(source, args) { - function debugOnPropertyRead(source, property) { - if (!property) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - debugger; - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - setPropertyAccess(base, prop, { - get: abort, - set: noopFunc - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); + + /** + * Infers value from string argument + * Inferring goes from more specific to more ambiguous options + * Arrays, objects and strings are parsed via JSON.parse + * + * @param value arbitrary string + * @returns converted value + * @throws an error on unexpected input + */ + function inferValue(value) { + if (value === 'undefined') { + return undefined; } - function randomId() { - return Math.random().toString(36).slice(2, 9); + if (value === 'false') { + return false; } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); + if (value === 'true') { return true; } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; + if (value === 'null') { + return null; } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { - return true; - } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); - } - return false; - }; + if (value === 'NaN') { + return NaN; } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + + // Number class constructor works 2 times faster than JSON.parse + // and wont interpret mixed inputs like '123asd' as parseFloat would + var MAX_ALLOWED_NUM = 32767; + var numVal = Number(value); + if (!nativeIsNaN(numVal)) { + if (Math.abs(numVal) > MAX_ALLOWED_NUM) { + throw new Error('number values bigger than 32767 are not allowed'); } + return numVal; } - function noopFunc() {} - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var errorMessage = "'".concat(value, "' value type can't be inferred"); try { - debugOnPropertyRead.apply(this, updatedArgs); + // Parse strings, arrays and objects represented as JSON strings + // '[1,2,3,"string"]' > [1, 2, 3, 'string'] + // '"arbitrary string"' > 'arbitrary string' + var parsableVal = JSON.parse(value); + if (parsableVal instanceof Object || typeof parsableVal === 'string') { + return parsableVal; + } } catch (e) { - console.log(e); + errorMessage += ": ".concat(e); } + throw new TypeError(errorMessage); } - function debugOnPropertyWrite(source, args) { - function debugOnPropertyWrite(source, property) { - if (!property) { - return; - } - const rid = randomId(); - const abort = function abort() { - hit(source); - debugger; - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - setPropertyAccess(base, prop, { - set: abort - }); - }; - setChainPropAccess(window, property); - window.onerror = createOnErrorHandler(rid).bind(); - } - function randomId() { - return Math.random().toString(36).slice(2, 9); - } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; - } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; - } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { - return true; - } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); - } - return false; - }; - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - debugOnPropertyWrite.apply(this, updatedArgs); - } catch (e) { - console.log(e); + + /** + * Transition names + */ + + /** + * Iterate over iterable argument and evaluate current state with transitions + * + * @param iterable rule or list or rules + * @param transitions helper object with transition functions + * @param init first transition name + * @param args arguments which should be passed to transition functions + * @returns state + */ + function iterateWithTransitions(iterable, transitions, init, args) { + var state = init || Object.keys(transitions)[0]; + for (var i = 0; i < iterable.length; i += 1) { + state = transitions[state](iterable, i, args); } + return state; } - function dirString(source, args) { - function dirString(source, times) { - const _console = console, - dir = _console.dir; - function dirWrapper(object) { - if (typeof dir === "function") { - dir.call(this, object); - } - hit(source); - } - console.dir = dirWrapper; + + /** + * AdGuard scriptlet rule mask + */ + var ADG_SCRIPTLET_MASK = '#//scriptlet'; + + /** + * Helper to accumulate an array of strings char by char + * + * @returns object with helper methods + */ + var wordSaver = function wordSaver() { + var str = ''; + var strings = []; + var saveSymb = function saveSymb(s) { + str += s; + return str; + }; + var saveStr = function saveStr() { + strings.push(str); + str = ''; + }; + var getAll = function getAll() { + return [...strings]; + }; + return { + saveSymb, + saveStr, + getAll + }; + }; + var substringAfter = function substringAfter(str, separator) { + if (!str) { + return str; } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + var index = str.indexOf(separator); + return index < 0 ? '' : str.substring(index + separator.length); + }; + + /** + * Parses scriptlet rule and validates its syntax. + * + * @param ruleText Rule string + * + * @returns Parsed rule data. + * @throws An error on invalid rule syntax. + */ + var parseRule = function parseRule(ruleText) { + ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK); + /** + * Transition function: the current index position in start, end or between params + * + * @param rule rule string + * @param index index + * @param Object helper object that contains prop symb with current separator char + * @param Object.sep contains prop `symb` with current separator char + * @throws throws if given rule is not a scriptlet + * @returns transition + */ + var opened = function opened(rule, index, _ref) { + var sep = _ref.sep; + var char = rule[index]; + var transition; + switch (char) { + case ' ': + case '(': + case ',': + { + transition = "opened"; + break; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - dirString.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function disableNewtabLinks(source, args) { - function disableNewtabLinks(source) { - document.addEventListener("click", function (ev) { - let target = ev.target; - while (target !== null) { - if (target.localName === "a" && target.hasAttribute("target")) { - ev.stopPropagation(); - ev.preventDefault(); - hit(source); + case '\'': + case '"': + { + sep.symb = char; + transition = "param"; break; } - target = target.parentNode; - } - }); - } - function hit(source) { - if (source.verbose !== true) { - return; + case ')': + { + transition = index === rule.length - 1 ? "closed" : "opened"; + break; + } + default: + { + throw new Error('The rule is not a scriptlet'); + } } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + return transition; + }; + + /** + * Transition function: the current index position inside param + * + * @param rule rule string + * @param index index + * @param Object helper object + * @param Object.sep contains prop `symb` with current separator char + * @param Object.saver helper which allow to save strings by car by cha + * @returns transition + */ + var param = function param(rule, index, _ref2) { + var saver = _ref2.saver, + sep = _ref2.sep; + var char = rule[index]; + switch (char) { + case '\'': + case '"': + { + var preIndex = index - 1; + var before = rule[preIndex]; + if (char === sep.symb && before !== '\\') { + sep.symb = null; + saver.saveStr(); + return "opened"; + } + } + // eslint-disable-next-line no-fallthrough + default: + { + saver.saveSymb(char); + return "param"; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); } + }; + var transitions = { + ["opened"]: opened, + ["param"]: param, + ["closed"]: function () {} + }; + var sep = { + symb: null + }; + var saver = wordSaver(); + var state = iterateWithTransitions(ruleText, transitions, "opened", { + sep, + saver + }); + if (state !== "closed") { + throw new Error("Invalid scriptlet rule ".concat(ruleText)); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - disableNewtabLinks.apply(this, updatedArgs); - } catch (e) { - console.log(e); + var args = saver.getAll(); + return { + name: args[0], + args: args.slice(1) + }; + }; + + /** + * Validates event type + * + * @param type event type + * @returns true if type is valid + */ + var validateType = function validateType(type) { + // https://github.com/AdguardTeam/Scriptlets/issues/125 + return typeof type !== 'undefined'; + }; + + /** + * Validates event listener + * + * @param listener event listener + * @returns true if listener callback is valid + */ + var validateListener = function validateListener(listener) { + // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters + return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object' + // https://github.com/AdguardTeam/Scriptlets/issues/76 + && listener !== null && 'handleEvent' in listener && typeof listener.handleEvent === 'function'); + }; + + /** + * Serialize valid event listener + * https://developer.mozilla.org/en-US/docs/Web/API/EventListener + * + * @param listener valid listener + * @returns listener string + */ + var listenerToString = function listenerToString(listener) { + return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString(); + }; + + var shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) { + return delay === '*'; + }; + + /** + * Handles input delay value + * + * @param delay matchDelay argument of adjust-* scriptlets + * @returns proper number delay value + */ + var getMatchDelay = function getMatchDelay(delay) { + var DEFAULT_DELAY = 1000; + var parsedDelay = parseInt(delay, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY // default scriptlet value + : parsedDelay; + return delayMatch; + }; + + /** + * Checks delay match condition + * + * @param inputDelay matchDelay argument of adjust-* scriptlets + * @param realDelay delay argument of setTimeout/setInterval + * @returns if given delays match + */ + var isDelayMatched = function isDelayMatched(inputDelay, realDelay) { + return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); + }; + + /** + * Handles input boost value + * + * @param boost boost argument of adjust-* scriptlets + * @returns proper number boost multiplier value + */ + var getBoostMultiplier = function getBoostMultiplier(boost) { + var DEFAULT_MULTIPLIER = 0.05; + // https://github.com/AdguardTeam/Scriptlets/issues/262 + var MIN_MULTIPLIER = 0.001; + var MAX_MULTIPLIER = 50; + var parsedBoost = parseFloat(boost); + var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value + : parsedBoost; + if (boostMultiplier < MIN_MULTIPLIER) { + boostMultiplier = MIN_MULTIPLIER; } - } - function forceWindowClose(source, args) { - function forceWindowClose(source) { - let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - if (typeof window.close !== "function") { - const message = "window.close() is not a function so 'close-window' scriptlet is unavailable"; - logMessage(source, message); - return; - } - const closeImmediately = function closeImmediately() { - try { - hit(source); - window.close(); - } catch (e) { - logMessage(source, e); - } - }; - const closeByExtension = function closeByExtension() { - const extCall = function extCall() { - dispatchEvent(new Event("adguard:scriptlet-close-window")); - }; - window.addEventListener("adguard:subscribed-to-close-window", extCall, { - once: true + if (boostMultiplier > MAX_MULTIPLIER) { + boostMultiplier = MAX_MULTIPLIER; + } + return boostMultiplier; + }; + + /** + * Some browsers do not support Array.prototype.flat() + * for example, Opera 42 which is used for browserstack tests + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat + * + * @param input arbitrary array + * @returns flattened array + */ + var flatten = function flatten(input) { + var stack = []; + input.forEach(function (el) { + return stack.push(el); + }); + var res = []; + while (stack.length) { + // pop value from stack + var next = stack.pop(); + if (Array.isArray(next)) { + // push back array items, won't modify the original input + next.forEach(function (el) { + return stack.push(el); }); - setTimeout(function () { - window.removeEventListener("adguard:subscribed-to-close-window", extCall, { - once: true - }); - }, 5e3); - }; - const shouldClose = function shouldClose() { - if (path === "") { - return true; - } - const pathRegexp = toRegExp(path); - const currentPath = "".concat(window.location.pathname).concat(window.location.search); - return pathRegexp.test(currentPath); - }; - if (shouldClose()) { - closeImmediately(); - if (navigator.userAgent.indexOf("Chrome") > -1) { - closeByExtension(); - } + } else { + res.push(next); } } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } + // reverse to restore input order + return res.reverse(); + }; + + /** + * Predicate method to check if the array item exists + * + * @param item arbitrary + * @returns if item is truthy or not + */ + var isExisting = function isExisting(item) { + return !!item; + }; + + /** + * Converts NodeList to array + * + * @param {NodeList} nodeList arbitrary NodeList + * @returns {Node[Array]} array of nodes + */ + var nodeListToArray = function nodeListToArray(nodeList) { + var nodes = []; + for (var i = 0; i < nodeList.length; i += 1) { + nodes.push(nodeList[i]); } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + return nodes; + }; + + /** + * Checks whether the input path is supported + * + * @param rawPath input path + * @returns if cookie path is valid + */ + var isValidCookiePath = function isValidCookiePath(rawPath) { + return rawPath === '/' || rawPath === 'none'; + }; + + /** + * Returns 'path=/' if rawPath is '/' + * or empty string '' for other cases, `rawPath === 'none'` included + * + * @param rawPath path argument of *set-cookie-* scriptlets + * @returns cookie path + */ + var getCookiePath = function getCookiePath(rawPath) { + if (rawPath === '/') { + return 'path=/'; + } + // otherwise do not set path as invalid + // the same for pathArg === 'none' + return ''; + }; + + /** + * Combines input cookie name, value, and path into string. + * + * @param rawName name argument of *set-cookie-* scriptlets + * @param rawValue value argument of *set-cookie-* scriptlets + * @param rawPath path argument of *set-cookie-* scriptlets + * @param shouldEncode if cookie's name and value should be encoded + * @returns string OR `null` if name or value is invalid + */ + var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ';'; + // semicolon will cause the cookie to break + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + }; + + /** + * Gets supported cookie value + * + * @param value input cookie value + * @returns valid cookie string if ok OR null if not + */ + var getLimitedCookieValue = function getLimitedCookieValue(value) { + if (!value) { + return null; + } + var allowedCookieValues = new Set(['true', 'false', 'yes', 'y', 'no', 'n', 'ok', 'accept', 'reject', 'allow', 'deny']); + var validValue; + if (allowedCookieValues.has(value.toLowerCase())) { + validValue = value; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + return null; } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { + return null; } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); + } else { + return null; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + return validValue; + }; + + /** + * Object to represent document.cookie-like string + */ + + /** + * Parses cookie string into object + * + * @param cookieString string that conforms to document.cookie format + * @returns key:value object that corresponds with incoming cookies keys and values + */ + var parseCookieString = function parseCookieString(cookieString) { + var COOKIE_DELIMITER = '='; + var COOKIE_PAIRS_DELIMITER = ';'; + + // Get raw cookies + var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); + var cookieData = {}; + cookieChunks.forEach(function (singleCookie) { + var cookieKey; + var cookieValue = ''; + var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); + if (delimiterIndex === -1) { + cookieKey = singleCookie.trim(); + } else { + cookieKey = singleCookie.slice(0, delimiterIndex).trim(); + cookieValue = singleCookie.slice(delimiterIndex + 1); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + // Save cookie key=value data with null instead of empty ('') values + cookieData[cookieKey] = cookieValue || null; + }); + return cookieData; + }; + + /** + * Check if cookie with specified name and value is present in a cookie string + * + * @param cookieString 'document.cookie'-like string + * @param name name argument of *set-cookie-* scriptlets + * @param value value argument of *set-cookie-* scriptlets + * @returns if cookie is already set + */ + var isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) { + return cookieString.split(';').some(function (cookieStr) { + var pos = cookieStr.indexOf('='); + if (pos === -1) { + return false; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + var cookieName = cookieStr.slice(0, pos).trim(); + var cookieValue = cookieStr.slice(pos + 1).trim(); + return name === cookieName && value === cookieValue; + }); + }; + + /** + * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid + * + * @param offsetExpiresSec input offset param in seconds + * @returns number is milliseconds OR null + */ + var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { + var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; + var ONE_DAY_EXPIRATION_KEYWORD = '1day'; + var MS_IN_SEC = 1000; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; + // Set predefined expire value if corresponding keyword was passed + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + // If offsetExpiresSec has been parsed to NaN - do not set cookie at all + if (Number.isNaN(parsedSec)) { + return null; } - nativeConsole(messageStr); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - forceWindowClose.apply(this, updatedArgs); - } catch (e) { - console.log(e); } - } - function hideInShadowDom(source, args) { - function hideInShadowDom(source, selector, baseSelector) { - if (!Element.prototype.attachShadow) { - return; - } - const hideElement = function hideElement(targetElement) { - const DISPLAY_NONE_CSS = "display:none!important;"; - targetElement.style.cssText = DISPLAY_NONE_CSS; - }; - const hideHandler = function hideHandler() { - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { - let isHidden = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - targets.forEach(function (targetEl) { - hideElement(targetEl); - isHidden = true; - }); - if (isHidden) { - hit(source); - } - hostElements = innerHosts; - } - }; - hideHandler(); - observeDOMChanges(hideHandler, true); + return parsedSec * MS_IN_SEC; + }; + + /** + * Noop function + */ + var noopFunc = function noopFunc() {}; + + /** + * Function returns noopFunc + * + * @returns noopFunc + */ + var noopCallbackFunc = function noopCallbackFunc() { + return noopFunc; + }; + + /** + * Function returns null + * + * @returns null + */ + var noopNull = function noopNull() { + return null; + }; + + /** + * Function returns true + * + * @returns true + */ + var trueFunc = function trueFunc() { + return true; + }; + + /** + * Function returns false + * + * @returns false + */ + var falseFunc = function falseFunc() { + return false; + }; + + /** + * Function returns this + * + * @returns this object + */ + function noopThis() { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return this; + } + + /** + * Function returns empty string + * + * @returns empty string + */ + var noopStr = function noopStr() { + return ''; + }; + + /** + * Function returns empty array + * + * @returns empty array + */ + var noopArray = function noopArray() { + return []; + }; + + /** + * Function returns empty object + * + * @returns empty object + */ + var noopObject = function noopObject() { + return {}; + }; + + /** + * Function throws an error + * + * @throws + */ + var throwFunc = function throwFunc() { + throw new Error(); + }; + + /** + * Function returns Promise.reject() + * + * @returns rejected Promise + */ + var noopPromiseReject = function noopPromiseReject() { + return Promise.reject(); + }; + + /** + * Returns Promise object that is resolved with specified props + * + * @param responseBody value to set as responseBody + * @param responseUrl value to set as responseUrl + * @param responseType value to set as responseType + * @returns resolved Promise or undefined if Response interface is not available + */ + var noopPromiseResolve = function noopPromiseResolve() { + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}'; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default'; + if (typeof Response === 'undefined') { + return; } - function hit(source) { - if (source.verbose !== true) { - return; + var response = new Response(responseBody, { + status: 200, + statusText: 'OK' + }); + + // Mock response' url & type to avoid adb checks + // https://github.com/AdguardTeam/Scriptlets/issues/216 + Object.defineProperties(response, { + url: { + value: responseUrl + }, + type: { + value: responseType } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + }); + + // eslint-disable-next-line consistent-return + return Promise.resolve(response); + }; + + /** + * Determines if type of script is inline or injected + * and when it's one of them then return true, otherwise false + * https://github.com/AdguardTeam/Scriptlets/issues/201 + * + * @param stackMatch input stack value to match + * @param stackTrace script error stack trace + * @returns if stacks match + */ + var shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = 'inlineScript'; + var INJECTED_SCRIPT_STRING = 'injectedScript'; + var INJECTED_SCRIPT_MARKER = ''; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf('#'); + // Remove URL hash + // in Chrome, URL in stackTrace doesn't contain hash + // so, it's necessary to remove it, otherwise location.href + // will not match with location from stackTrace + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split('\n').slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + // Get stack trace URL + // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20 + // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16) + // so, first group "(.*?@)" is required for Firefox, second group contains URL + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith('(')) { + stackURL = stackURL.slice(1); } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith('at')) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + } else { + stack = line; } - } - function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; } - }; - const disconnect = function disconnect() { - observer.disconnect(); - }; - function callbackWrapper() { - disconnect(); - callback(); - connect(); } - connect(); } - function findHostElements(rootElement) { - const hosts = []; - const domElems = rootElement.querySelectorAll("*"); + return false; + }; + + /** + * Finds shadow-dom host (elements with shadowRoot property) in DOM of rootElement. + * + * @param rootElement shadow dom root + * @returns shadow-dom hosts + */ + var findHostElements = function findHostElements(rootElement) { + var hosts = []; + if (rootElement) { + // Element.querySelectorAll() returns list of elements + // which are defined in DOM of Element. + // Meanwhile, inner DOM of the element with shadowRoot property + // is absolutely another DOM and which can not be reached by querySelectorAll('*') + var domElems = rootElement.querySelectorAll('*'); domElems.forEach(function (el) { if (el.shadowRoot) { hosts.push(el); } }); - return hosts; } - function pierceShadowDom(selector, hostElements) { - let targets = []; - const innerHostsAcc = []; - hostElements.forEach(function (host) { - const simpleElems = host.querySelectorAll(selector); - targets = targets.concat([].slice.call(simpleElems)); - const shadowRootElem = host.shadowRoot; - const shadowChildren = shadowRootElem.querySelectorAll(selector); - targets = targets.concat([].slice.call(shadowChildren)); - innerHostsAcc.push(findHostElements(shadowRootElem)); - }); - const innerHosts = flatten(innerHostsAcc); - return { - targets: targets, - innerHosts: innerHosts - }; + return hosts; + }; + + /** + * A collection of nodes. + * + * @external NodeList + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/NodeList NodeList} + */ + + /** + * Pierces open shadow-dom in order to find: + * - elements by 'selector' matching + * - inner shadow-dom hosts + * + * @param selector DOM elements selector + * @param hostElements shadow-dom hosts + * @returns object with found elements and shadow-dom hosts + */ + var pierceShadowDom = function pierceShadowDom(selector, hostElements) { + var targets = []; + var innerHostsAcc = []; + + // it's possible to get a few hostElements found by baseSelector on the page + hostElements.forEach(function (host) { + // check presence of selector element inside base element if it's not in shadow-dom + var simpleElems = host.querySelectorAll(selector); + targets = targets.concat([].slice.call(simpleElems)); + var shadowRootElem = host.shadowRoot; + var shadowChildren = shadowRootElem.querySelectorAll(selector); + targets = targets.concat([].slice.call(shadowChildren)); + + // find inner shadow-dom hosts inside processing shadow-dom + innerHostsAcc.push(findHostElements(shadowRootElem)); + }); + + // if there were more than one host element, + // innerHostsAcc is an array of arrays and should be flatten + var innerHosts = flatten(innerHostsAcc); + return { + targets, + innerHosts + }; + }; + + /** + * Checks whether the passed arg is proper callback + * + * @param callback arbitrary callback + * @returns if callback is valid + */ + var isValidCallback = function isValidCallback(callback) { + return callback instanceof Function + // passing string as 'code' arg is not recommended + // but it is possible and not restricted + // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters + || typeof callback === 'string'; + }; + + /** + * Parses delay argument of setTimeout / setInterval methods into + * rounded down number for number/string values or passes on for other types. + * Needed for prevent-setTimeout and prevent-setInterval + * + * @param delay native method delay arg + * @returns number as parsed delay or any input type if `delay` is not parsable + */ + var parseRawDelay = function parseRawDelay(delay) { + var parsedDelay = Math.floor(parseInt(delay, 10)); + return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; + }; + /** + * Checks whether 'callback' and 'delay' are matching + * by given parameters 'matchCallback' and 'matchDelay'. + * Used for prevent-setTimeout and prevent-setInterval. + * + * @param preventData set of data to determine if scriptlet should match + * @param preventData.callback method's callback arg + * @param preventData.delay method's delay arg + * @param preventData.matchCallback scriptlets's callback arg + * @param preventData.matchDelay scriptlets's delay arg + * @returns if scriptlet should match + */ + var isPreventionNeeded = function isPreventionNeeded(_ref) { + var callback = _ref.callback, + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; + // if callback is has not valid type + // scriptlet can not prevent it + // so no need for more checking and do not call hit() later + if (!isValidCallback(callback)) { + return false; } - function flatten(input) { - const stack = []; - input.forEach(function (el) { - return stack.push(el); - }); - const res = []; - while (stack.length) { - const next = stack.pop(); - if (Array.isArray(next)) { - next.forEach(function (el) { - return stack.push(el); - }); - } else { - res.push(next); + if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { + return false; + } + var _parseMatchArg = parseMatchArg(matchCallback), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; + var _parseDelayArg = parseDelayArg(matchDelay), + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; + + // Parse delay for decimal, string and non-number values + // https://github.com/AdguardTeam/Scriptlets/issues/247 + var parsedDelay = parseRawDelay(delay); + var shouldPrevent = false; + // https://github.com/AdguardTeam/Scriptlets/issues/105 + var callbackStr = String(callback); + if (delayMatch === null) { + shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; + } else if (!matchCallback) { + shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch; + } else { + shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch; + } + return shouldPrevent; + }; + + var handleOldReplacement = function handleOldReplacement(replacement) { + var result; + // defaults to return noopFunc instead of window.open + if (!replacement) { + result = noopFunc; + } else if (replacement === 'trueFunc') { + result = trueFunc; + } else if (replacement.includes('=')) { + // We should return noopFunc instead of window.open + // but with some property if website checks it (examples 5, 6) + // https://github.com/AdguardTeam/Scriptlets/issues/71 + var isProp = replacement.startsWith('{') && replacement.endsWith('}'); + if (isProp) { + var propertyPart = replacement.slice(1, -1); + var propertyName = substringBefore(propertyPart, '='); + var propertyValue = substringAfter$1(propertyPart, '='); + if (propertyValue === 'noopFunc') { + result = {}; + result[propertyName] = noopFunc; } } - return res.reverse(); } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; + return result; + }; + /** + * Creates a decoy HTML element with a specified URL and delay before removal + * + * @param args an object with `replacement`, `url`, and `delay` properties + * @returns the decoy element that was created and added to the document body + */ + var createDecoy = function createDecoy(args) { + var UrlPropNameOf = /*#__PURE__*/function (UrlPropNameOf) { + UrlPropNameOf["Object"] = "data"; + UrlPropNameOf["Iframe"] = "src"; + return UrlPropNameOf; + }({}); + var replacement = args.replacement, + url = args.url, + delay = args.delay; + var tag; + if (replacement === 'obj') { + tag = "object"; + } else { + tag = "iframe"; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - hideInShadowDom.apply(this, updatedArgs); - } catch (e) { - console.log(e); + var decoy = document.createElement(tag); + if (decoy instanceof HTMLObjectElement) { + decoy[UrlPropNameOf.Object] = url; + } else if (decoy instanceof HTMLIFrameElement) { + decoy[UrlPropNameOf.Iframe] = url; } - } - function injectCssInShadowDom(source, args) { - function injectCssInShadowDom(source, cssRule) { - let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - if (!Element.prototype.attachShadow || typeof Proxy === "undefined" || typeof Reflect === "undefined") { - return; + decoy.style.setProperty('height', '1px', 'important'); + decoy.style.setProperty('position', 'fixed', 'important'); + decoy.style.setProperty('top', '-1px', 'important'); + decoy.style.setProperty('width', '1px', 'important'); + document.body.appendChild(decoy); + setTimeout(function () { + return decoy.remove(); + }, delay * 1000); + return decoy; + }; + var getPreventGetter = function getPreventGetter(nativeGetter) { + var preventGetter = function preventGetter(target, prop) { + if (prop && prop === 'closed') { + return false; } - if (cssRule.match(/(url|image-set)\(.*\)/i)) { - logMessage(source, '"url()" function is not allowed for css rules'); - return; + if (typeof nativeGetter === 'function') { + return noopFunc; } - const callback = function callback(shadowRoot) { - try { - const stylesheet = new CSSStyleSheet(); - try { - stylesheet.insertRule(cssRule); - } catch (e) { - logMessage(source, "Unable to apply the rule '".concat(cssRule, "' due to: \n'").concat(e.message, "'")); - return; - } - shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet]; - } catch (_unused) { - const styleTag = document.createElement("style"); - styleTag.innerText = cssRule; - shadowRoot.appendChild(styleTag); - } - hit(source); - }; - hijackAttachShadow(window, hostSelector, callback); + return prop && target[prop]; + }; + return preventGetter; + }; + + /* eslint-disable no-console, no-underscore-dangle */ + + /** + * Hit used only for debug purposes now + * + * @param source scriptlet properties + * use LOG_MARKER = 'log: ' at the start of a message + * for logging scriptlets + */ + var hit = function hit(source) { + if (source.verbose !== true) { + return; } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ''; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = '#%#//'; + var UBO_SCRIPTLET_MARKER = '##+js'; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + // delete all domains from ruleText and leave just rule part + var rulePart = source.ruleText.slice(ruleStartIndex); + // prepare applied scriptlet rule for specific domain + prefix = "".concat(source.domainName).concat(rulePart); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + log("".concat(prefix, " trace start")); + if (trace) { + trace(); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + log("".concat(prefix, " trace end")); + } catch (e) { + // try catch for Edge 15 + // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/ + // console.log throws an error + } + + // This is necessary for unit-tests only! + if (typeof window.__debug === 'function') { + window.__debug(source); + } + }; + + /** + * Check if the property exists in the base object (recursively). + * Similar to getPropertyInChain but upgraded for json-prune: + * handle wildcard properties and does not define nonexistent base property as 'undefined' + * + * @param base object that owns chain + * @param chain chain of owner properties + * @param lookThrough should the method look through it's props in order to find wildcard + * @param output result acc + * @returns list of ChainInfo objects + */ + function getWildcardPropertyInChain(base, chain) { + var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + var pos = chain.indexOf('.'); + if (pos === -1) { + // for paths like 'a.b.*' every final nested prop should be processed + if (chain === '*' || chain === '[]') { + // eslint-disable-next-line no-restricted-syntax + for (var key in base) { + // to process each key in base except inherited ones + if (Object.prototype.hasOwnProperty.call(base, key)) { + output.push({ + base, + prop: key + }); + } } + } else { + output.push({ + base, + prop: chain + }); } - nativeConsole(messageStr); + return output; } - function hijackAttachShadow(context, hostSelector, callback) { - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const shadowRoot = Reflect.apply(target, thisArg, args); - if (thisArg && thisArg.matches(hostSelector || "*")) { - callback(shadowRoot); - } - return shadowRoot; - }; - const attachShadowHandler = { - apply: handlerWrapper - }; - context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler); + var prop = chain.slice(0, pos); + var shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object; + if (shouldLookThrough) { + var nextProp = chain.slice(pos + 1); + var baseKeys = Object.keys(base); + + // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'), + // each one of base keys should be considered as a potential chain prop in final path + baseKeys.forEach(function (key) { + var item = base[key]; + getWildcardPropertyInChain(item, nextProp, lookThrough, output); + }); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - injectCssInShadowDom.apply(this, updatedArgs); - } catch (e) { - console.log(e); + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if (nextBase !== undefined) { + getWildcardPropertyInChain(nextBase, chain, lookThrough, output); } + return output; } - function jsonPrune(source, args) { - function jsonPrune(source, propsToRemove, requiredInitialProps, stack) { - if (!!stack && !matchStackTrace(stack, new Error().stack)) { - return; - } - const prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; - const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { - if (!root) { - return false; - } - let shouldProcess; - if (prunePaths.length === 0 && requiredPaths.length > 0) { - const rootString = JSON.stringify(root); - const matchRegex = toRegExp(requiredPaths.join("")); - const shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === "object") { - logMessage(source, root, true, false); - } - shouldProcess = false; - return shouldProcess; - } - } - for (let i = 0; i < requiredPaths.length; i += 1) { - const requiredPath = requiredPaths[i]; - const lastNestedPropName = requiredPath.split(".").pop(); - const hasWildcard = requiredPath.indexOf(".*.") > -1 || requiredPath.indexOf("*.") > -1 || requiredPath.indexOf(".*") > -1 || requiredPath.indexOf(".[].") > -1 || requiredPath.indexOf("[].") > -1 || requiredPath.indexOf(".[]") > -1; - const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); - shouldProcess = !hasWildcard; - for (let i = 0; i < details.length; i += 1) { - if (hasWildcard) { - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess; - } else { - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess; - } - } - } - return shouldProcess; - } - const jsonPruner = function jsonPruner(root) { - if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === "object") { - logMessage(source, root, true, false); - } - return root; - } - try { - if (isPruningNeeded(root) === false) { - return root; - } - prunePaths.forEach(function (path) { - const ownerObjArr = getWildcardPropertyInChain(root, path, true); - ownerObjArr.forEach(function (ownerObj) { - if (ownerObj !== undefined && ownerObj.base) { - delete ownerObj.base[ownerObj.prop]; - hit(source); - } - }); - }); - } catch (e) { - logMessage(source, e); - } - return root; - }; - const nativeJSONParse = JSON.parse; - const jsonParseWrapper = function jsonParseWrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - const root = nativeJSONParse.apply(JSON, args); - return jsonPruner(root); - }; - jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); - JSON.parse = jsonParseWrapper; - const nativeResponseJson = Response.prototype.json; - const responseJsonWrapper = function responseJsonWrapper() { - const promise = nativeResponseJson.apply(this); - return promise.then(function (obj) { - return jsonPruner(obj); - }); - }; - if (typeof Response === "undefined") { - return; - } - Response.prototype.json = responseJsonWrapper; - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } + + /** + * Conditionally logs message to console. + * Convention is to log messages by source.verbose if such log + * is not a part of scriptlet's functionality, eg on invalid input, + * and use 'forced' argument otherwise. + * + * @param source required, scriptlet properties + * @param message required, message to log + * @param forced to log message unconditionally + * @param convertMessageToString to convert message to string + */ + var logMessage = function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - function matchStackTrace(stackMatch, stackTrace) { - if (!stackMatch || stackMatch === "") { - return true; - } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { - return true; - } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }).join("\n"); - return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + + // eslint-disable-next-line no-console + var nativeConsole = console.log; + if (!convertMessageToString) { + // Template literals convert object to string, + // so 'message' should not be passed to template literals + // as it will not be logged correctly + nativeConsole("".concat(name, ":"), message); + return; } - function getWildcardPropertyInChain(base, chain) { - let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - const pos = chain.indexOf("."); - if (pos === -1) { - if (chain === "*" || chain === "[]") { - for (const key in base) { - if (Object.prototype.hasOwnProperty.call(base, key)) { - output.push({ - base: base, - prop: key - }); - } - } - } else { - output.push({ - base: base, - prop: chain - }); - } - return output; - } - const prop = chain.slice(0, pos); - const shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; - if (shouldLookThrough) { - const nextProp = chain.slice(pos + 1); - const baseKeys = Object.keys(base); - baseKeys.forEach(function (key) { - const item = base[key]; - getWildcardPropertyInChain(item, nextProp, lookThrough, output); - }); - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if (nextBase !== undefined) { - getWildcardPropertyInChain(nextBase, chain, lookThrough, output); - } - return output; + nativeConsole("".concat(name, ": ").concat(message)); + }; + + /** + * Checks if prunning is required + * + * @param source required, scriptlet properties + * @param root object which should be pruned or logged + * @param prunePaths array with string of space-separated property chains to remove + * @param requiredPaths array with string of space-separated propertiy chains + * which must be all present for the pruning to occur + * @returns true if prunning is required + */ + function isPruningNeeded(source, root, prunePaths, requiredPaths) { + if (!root) { + return false; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + var shouldProcess; + + // Only log hostname and matched JSON payload if only second argument is present + if (prunePaths.length === 0 && requiredPaths.length > 0) { + var rootString = JSON.stringify(root); + var matchRegex = toRegExp(requiredPaths.join('')); + var shouldLog = matchRegex.test(rootString); + if (shouldLog) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === 'object') { + logMessage(source, root, true, false); } + shouldProcess = false; + return shouldProcess; } - nativeConsole(messageStr); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; - }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; - }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { - return false; - } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); - if (pos !== -1) { - documentURL = documentURL.slice(0, pos); - } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); + var wildcardSymbols = ['.*.', '*.', '.*', '.[].', '[].', '.[]']; + var _loop = function _loop() { + var requiredPath = requiredPaths[i]; + var lastNestedPropName = requiredPath.split('.').pop(); + var hasWildcard = wildcardSymbols.some(function (symbol) { + return requiredPath.includes(symbol); }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { - stackURL = stackURL.slice(1); - } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { - stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { - stackFunction = stackFunction.slice(2).trim(); - } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); - } else { - stack = stackURL; - } + + // if the path has wildcard, getPropertyInChain should 'look through' chain props + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + + // start value of 'shouldProcess' due to checking below + shouldProcess = !hasWildcard; + for (var j = 0; j < details.length; j += 1) { + var hasRequiredProp = typeof lastNestedPropName === 'string' && details[j].base[lastNestedPropName] !== undefined; + if (hasWildcard) { + // if there is a wildcard, + // at least one (||) of props chain should be present in object + shouldProcess = hasRequiredProp || shouldProcess; } else { - stack = line; - } - return stack; - }); - if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { - if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { - return true; - } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { - return true; - } + // otherwise each one (&&) of them should be there + shouldProcess = hasRequiredProp && shouldProcess; } } - return false; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - jsonPrune.apply(this, updatedArgs); - } catch (e) { - console.log(e); + }; + for (var i = 0; i < requiredPaths.length; i += 1) { + _loop(); } + return shouldProcess; } - function log(source, args) { - function log() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; + + /** + * Prunes properties of 'root' object + * + * @param source required, scriptlet properties + * @param root object which should be pruned or logged + * @param prunePaths array with string of space-separated properties to remove + * @param requiredPaths array with string of space-separated properties + * which must be all present for the pruning to occur + * @returns pruned root + */ + var jsonPruner = function jsonPruner(source, root, prunePaths, requiredPaths) { + if (prunePaths.length === 0 && requiredPaths.length === 0) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === 'object') { + logMessage(source, root, true, false); } - console.log(args); + return root; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - log.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function logAddEventListener(source, args) { - function logAddEventListener(source) { - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { - var _this$constructor; - if (validateType(type) && validateListener(listener)) { - const message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); - logMessage(source, message, true); - hit(source); - } - const message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); - logMessage(source, message, true); - let context = this; - if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { - context = window; - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeAddEventListener.apply(context, [type, listener, ...args]); - } - const descriptor = { - configurable: true, - set: function set() {}, - get: function get() { - return addEventListenerWrapper; - } - }; - Object.defineProperty(window.EventTarget.prototype, "addEventListener", descriptor); - Object.defineProperty(window, "addEventListener", descriptor); - Object.defineProperty(document, "addEventListener", descriptor); - } - function hit(source) { - if (source.verbose !== true) { - return; + if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) { + return root; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + + // if pruning is needed, we check every input pathToRemove + // and delete it if root has it + prunePaths.forEach(function (path) { + var ownerObjArr = getWildcardPropertyInChain(root, path, true); + ownerObjArr.forEach(function (ownerObj) { + if (ownerObj !== undefined && ownerObj.base) { + delete ownerObj.base[ownerObj.prop]; + hit(source); } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function validateType(type) { - return typeof type !== "undefined"; - } - function validateListener(listener) { - return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); + }); + }); + } catch (e) { + logMessage(source, e); } - function listenerToString(listener) { - return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); + return root; + }; + + /** + * Returns the native `RegExp.prototype.test` method if it exists. + * + * @returns The native `RegExp.prototype.test` method. + * @throws If `RegExp.prototype.test` is not a function. + */ + var getNativeRegexpTest = function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'test'); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === 'function') { + return nativeRegexTest; } - function convertTypeToString(value) { - let output; - if (typeof value === "undefined") { - output = "undefined"; - } else if (typeof value === "object") { - if (value === null) { - output = "null"; - } else { - output = objectToString(value); - } - } else { - output = value.toString(); + throw new Error('RegExp.prototype.test is not a function'); + }; + + /** + * Modifies original response with the given replacement data. + * + * @param origResponse Original response. + * @param replacement Replacement data for response with possible keys: + * - `body`: optional, string, default to '{}'; + * - `type`: optional, string, original response type is used if not specified. + * + * @returns Modified response. + */ + var modifyResponse = function modifyResponse(origResponse) { + var _origResponse$headers; + var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + body: '{}' + }; + var headers = {}; + origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) { + headers[key] = value; + }); + var modifiedResponse = new Response(replacement.body, { + status: origResponse.status, + statusText: origResponse.statusText, + headers + }); + + // Mock response url and type to avoid adblocker detection + // https://github.com/AdguardTeam/Scriptlets/issues/216 + Object.defineProperties(modifiedResponse, { + url: { + value: origResponse.url + }, + type: { + value: replacement.type || origResponse.type } - return output; + }); + return modifiedResponse; + }; + + /** + * Aggregates fetch and XMLHttpRequest.open arguments + * to operate on arbitrary request data objects + */ + + /** + * Object which is populated with request data from scriptlet arguments + */ + + /** + * Derivative of ParsedMatchProps with its values being + * converted to RegExp + */ + + /** + * Fetch and xhr.open options that are valid props + * to match for (trusted-)prevent-(fetch|xhr) scriptlets + * + * This type is being derived from getRequestProps return type + * as enums would be lost at build time disregarding 'const' + */ + + /** + * Returns array of request props that are supported by fetch/xhr scriptlets. + * Includes common 'url' and 'method' props and all other fetch-specific props + * + * @returns list of request props + */ + var getRequestProps = function getRequestProps() { + return ['url', 'method', 'headers', 'body', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal', 'mode']; + }; + + /** + * Collects Request options to object + * + * @param request Request instance to collect properties from + * @returns data object + */ + var getRequestData = function getRequestData(request) { + var requestInitOptions = getRequestProps(); + var entries = requestInitOptions.map(function (key) { + // if request has no such option, value will be undefined + var value = request[key]; + return [key, value]; + }); + return Object.fromEntries(entries); + }; + + /** + * Collects fetch args to object + * + * @param args fetch args + * @returns data object + */ + var getFetchData = function getFetchData(args) { + var fetchPropsObj = {}; + var fetchUrl; + var fetchInit; + if (args[0] instanceof Request) { + // if Request passed to fetch, it will be in array + var requestData = getRequestData(args[0]); + fetchUrl = requestData.url; + fetchInit = requestData; + } else { + fetchUrl = args[0]; // eslint-disable-line prefer-destructuring + fetchInit = args[1]; // eslint-disable-line prefer-destructuring } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + + fetchPropsObj.url = fetchUrl; + if (fetchInit instanceof Object) { + var props = Object.keys(fetchInit); + props.forEach(function (prop) { + fetchPropsObj[prop] = fetchInit[prop]; + }); } - function objectToString(obj) { - if (!obj || typeof obj !== "object") { - return String(obj); + return fetchPropsObj; + }; + + /** + * Collect xhr.open arguments to object + * + * @param method request method + * @param url request url + * @param async request async prop + * @param user request user prop + * @param password request password prop + * @returns aggregated request data + */ + var getXhrData = function getXhrData(method, url, async, user, password) { + return { + method, + url, + async, + user, + password + }; + }; + + /** + * Parse propsToMatch input string into object; + * used for prevent-fetch and prevent-xhr + * + * @param propsToMatchStr string of space-separated request properties to match + * @returns object where 'key' is prop name and 'value' is prop value + */ + var parseMatchProps = function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = ' '; + var PAIRS_MARKER = ':'; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + // Escape multiple colons in prop + // i.e regex value and/or url with protocol specified, with or without 'url:' match prop + // https://github.com/AdguardTeam/Scriptlets/issues/216#issuecomment-1178591463 + propsObj.url = prop; } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); - } - return "".concat(key, ':"').concat(recordValueStr, '"'); - }).join(" "); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; + }); + return propsObj; + }; + + /** + * Validates parsed data values + * + * @param data request data + * @returns if data is valid + */ + var isValidParsedData = function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + }; + + /** + * Converts valid parsed data to data obj for further matching + * + * @param data parsed request data + * @returns data obj ready for matching + */ + var getMatchPropsData = function getMatchPropsData(data) { + var matchData = {}; + // Assertion is required, as Object.keys always returns string[] + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + }; + + /** + * Sets item to a specified storage, if storage isn't full. + * + * @param source scriptlet's configuration + * @param storage storage instance to set item into + * @param key storage key + * @param value staroge value + */ + var setStorageItem = function setStorageItem(source, storage, key, value) { + // setItem() may throw an exception if the storage is full. + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + }; + + /** + * Removes the key/value pair with the given `key` from the `storage`. + * If unable to remove, logs the reason to console in debug mode. + * + * @param source scriptlet's configuration + * @param storage storage instance from which item has to be removed + * @param key storage key + */ + var removeStorageItem = function removeStorageItem(source, storage, key) { try { - logAddEventListener.apply(this, updatedArgs); + storage.removeItem(key); } catch (e) { - console.log(e); + var message = "Unable to remove storage item due to: ".concat(e.message); + logMessage(source, message); } - } - function logEval(source, args) { - function logEval(source) { - const nativeEval = window.eval; - function evalWrapper(str) { - hit(source); - logMessage(source, 'eval("'.concat(str, '")'), true); - return nativeEval(str); + }; + + /** + * Gets supported storage item value + * + * @param value input item value + * @returns valid item value if ok OR null if not + */ + var getLimitedStorageItemValue = function getLimitedStorageItemValue(value) { + if (typeof value !== 'string') { + throw new Error('Invalid value'); + } + var validValue; + if (value === 'undefined') { + validValue = undefined; + } else if (value === 'false') { + validValue = false; + } else if (value === 'true') { + validValue = true; + } else if (value === 'null') { + validValue = null; + } else if (value === 'emptyArr') { + validValue = '[]'; + } else if (value === 'emptyObj') { + validValue = '{}'; + } else if (value === '') { + validValue = ''; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + throw new Error('Invalid value'); } - window.eval = evalWrapper; - const nativeFunction = window.Function; - function FunctionWrapper() { - hit(source); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - logMessage(source, "new Function(".concat(args.join(", "), ")"), true); - return nativeFunction.apply(this, [...args]); + if (Math.abs(validValue) > 32767) { + throw new Error('Invalid value'); } - FunctionWrapper.prototype = Object.create(nativeFunction.prototype); - FunctionWrapper.prototype.constructor = FunctionWrapper; - window.Function = FunctionWrapper; + } else if (value === 'yes') { + validValue = 'yes'; + } else if (value === 'no') { + validValue = 'no'; + } else if (value === '$remove$') { + validValue = '$remove$'; + } else { + throw new Error('Invalid value'); } - function hit(source) { - if (source.verbose !== true) { - return; + return validValue; + }; + + /** + * Generates function which silents global errors on page generated by scriptlet + * If error doesn't belong to our error we transfer it to the native onError handler + * + * @param rid - unique identifier of scriptlet + * @returns window.onerror handler + */ + function createOnErrorHandler(rid) { + // eslint-disable-next-line consistent-return + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === 'string' && error.includes(rid)) { + return true; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + return nativeOnError.apply(window, [error, ...args]); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + return false; + }; + } + + /** + * Generate random seven symbols id + * + * @returns randomized id + */ + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + + /** + * Prevents infinite loops when trapping props that could be used by scriptlet's own helpers + * Example: window.RegExp, that is used by matchStackTrace > toRegExp + * + * https://github.com/AdguardTeam/Scriptlets/issues/251 + * https://github.com/AdguardTeam/Scriptlets/issues/226 + * https://github.com/AdguardTeam/Scriptlets/issues/232 + * + * @returns descriptor addon + */ + function getDescriptorAddon() { + return { + isAbortingSuspended: false, + isolateCallback(cb) { + this.isAbortingSuspended = true; + // try...catch is required in case there are more than one inline scripts + // which should be aborted, + // so after the first successful abortion, `cb(...args);` will throw error, + // and we should not stop on that and continue to abort other scripts + try { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + var result = cb(...args); + this.isAbortingSuspended = false; + return result; + } catch (_unused) { + var rid = randomId(); + this.isAbortingSuspended = false; + // It's necessary to throw error + // otherwise script will be not aborted + throw new ReferenceError(rid); } } - nativeConsole(messageStr); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - logEval.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + }; } - function logOnStacktrace(source, args) { - function logOnStacktrace(source, property) { - if (!property) { - return; - } - const refineStackTrace = function refineStackTrace(stackString) { - const stackSteps = stackString.split("\n").slice(2).map(function (line) { - return line.replace(/ {4}at /, ""); - }); - const logInfoArray = stackSteps.map(function (line) { - let funcName; - let funcFullPath; - const reg = /\(([^\)]+)\)/; - const regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; - if (line.match(reg)) { - funcName = line.split(" ").slice(0, -1).join(" "); - funcFullPath = line.match(reg)[1]; - } else if (line.match(regFirefox)) { - funcName = line.split("@").slice(0, -1).join(" "); - funcFullPath = line.match(regFirefox)[2]; - } else { - funcName = "function name is not available"; - funcFullPath = line; - } - return [funcName, funcFullPath]; - }); - const logInfoObject = {}; - logInfoArray.forEach(function (pair) { - logInfoObject[pair[0]] = pair[1]; - }); - return logInfoObject; + + /** + * Check if the property exists in the base object (recursively) + * + * If property doesn't exist in base object, + * defines this property as 'undefined' + * and returns base, property name and remaining part of property chain + * + * @param base object that owns chain + * @param chain chain of owner properties + * @returns chain info object + */ + function getPropertyInChain(base, chain) { + var pos = chain.indexOf('.'); + if (pos === -1) { + return { + base, + prop: chain }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - if (chain) { - const setter = function setter(a) { - base = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - }; - Object.defineProperty(owner, prop, { - get: function get() { - return base; - }, - set: setter - }); - return; - } - let value = base[prop]; - setPropertyAccess(base, prop, { - get() { - hit(source); - logMessage(source, "Get ".concat(prop), true); - console.table(refineStackTrace(new Error().stack)); - return value; - }, - set(newValue) { - hit(source); - logMessage(source, "Set ".concat(prop), true); - console.table(refineStackTrace(new Error().stack)); - value = newValue; - } - }); + } + var prop = chain.slice(0, pos); + + // https://github.com/AdguardTeam/Scriptlets/issues/128 + if (base === null) { + // if base is null, return 'null' as base. + // it's needed for triggering the reason logging while debugging + return { + base, + prop, + chain }; - setChainPropAccess(window, property); } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { + // for empty objects in chain return { - base: base, - prop: prop, - chain: chain + base, + prop, + chain }; } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); + if (nextBase === null) { + return { + base, + prop, + chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base, + prop, + chain + }; + } + + /** + * Checks if given propsToMatch string matches with given request data + * This is used by prevent-xhr, prevent-fetch, trusted-replace-xhr-response + * and trusted-replace-fetch-response scriptlets + * + * @param source scriptlet properties + * @param propsToMatch string of space-separated request properties to match + * @param requestData object with standard properties of fetch/xhr like url, method etc + * @returns if request properties match + */ + var matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === '' || propsToMatch === '*') { return true; } - function hit(source) { - if (source.verbose !== true) { + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + // prevent only if all props match + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === 'string' && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; + }; + + /** + * Checks if the stackTrace contains stackRegexp + * https://github.com/AdguardTeam/Scriptlets/issues/82 + * + * @param stackMatch - input stack value to match + * @param stackTrace - script error stack trace + * @returns if the stackTrace contains stackRegexp + */ + var matchStackTrace = function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === '') { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split('\n').slice(2) // get rid of our own functions in the stack trace + .map(function (line) { + return line.trim(); + }) // trim the lines + .join('\n'); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + }; + + /** + * Returns a wrapper, passing the call to 'method' at maximum once per 'delay' milliseconds. + * Those calls that fall into the "cooldown" period, are ignored + * + * @param cb callback + * @param delay - milliseconds + * @returns throttled callback + */ + var throttle = function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; return; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + // "savedArgs" might contains few arguments, so it's necessary to use spread operator + // https://github.com/AdguardTeam/Scriptlets/issues/284#issuecomment-1419464354 + wrapper(...savedArgs); + savedArgs = null; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + }, delay); + }; + return wrapper; + }; + + /** + * DOM tree changes observer. Used for 'remove-attr' and 'remove-class' scriptlets + * + * @param callback function to call on each mutation + * @param observeAttrs if observer should observe attributes changes + * @param attrsToObserve list of attributes to observe + */ + var observeDOMChanges = function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + /** + * 'delay' in milliseconds for 'throttle' method + */ + var THROTTLE_DELAY_MS = 20; + /** + * Used for remove-class + */ + // eslint-disable-next-line @typescript-eslint/no-use-before-define + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + + /** + * Callback wrapper to prevent loops + * when callback tinkers with attributes + */ + function callbackWrapper() { + disconnect(); + callback(); + connect(); } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + connect(); + }; + + /** + * Returns the list of added nodes from the list of mutations + * + * @param mutations list of mutations + * @returns list of added nodes + */ + var getAddedNodes = function getAddedNodes(mutations) { + var nodes = []; + for (var i = 0; i < mutations.length; i += 1) { + var addedNodes = mutations[i].addedNodes; + for (var j = 0; j < addedNodes.length; j += 1) { + nodes.push(addedNodes[j]); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + } + return nodes; + }; + + /** + * Creates and runs a MutationObserver on the document element with optional + * throttling and disconnect timeout. + * + * @param {Function} callback MutationObserver callback + * @param {object} options MutationObserver options + * @param timeout Disconnect timeout in ms + */ + var observeDocumentWithTimeout = function observeDocumentWithTimeout(callback, options) { + var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10000; + var documentObserver = new MutationObserver(function (mutations, observer) { + observer.disconnect(); + callback(mutations, observer); + observer.observe(document.documentElement, options); + }); + documentObserver.observe(document.documentElement, options); + if (typeof timeout === 'number') { + setTimeout(function () { + return documentObserver.disconnect(); + }, timeout); + } + }; + + /** + * Behaviour flags string parser + * + * @param flags required, 'applying' argument string + * @returns object with parsed flags + */ + var parseFlags = function parseFlags(flags) { + var FLAGS_DIVIDER = ' '; + var ASAP_FLAG = 'asap'; + var COMPLETE_FLAG = 'complete'; + var STAY_FLAG = 'stay'; + var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; + var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { + return VALID_FLAGS.includes(f); + }); + return { + ASAP: ASAP_FLAG, + COMPLETE: COMPLETE_FLAG, + STAY: STAY_FLAG, + hasFlag(flag) { + return passedFlags.includes(flag); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + }; + }; + + /** + * Modifies passed keyword value according to its purpose. + * Returns initial value if it's not a keyword. + * + * Supported keywords: + * - '$now$' - returns current time in ms, e.g 1667915146503 + * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * + * @param rawValue keyword + * @returns parsed value + */ + var parseKeywordValue = function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = '$now$'; + var CURRENT_DATE_KEYWORD = '$currentDate$'; + var parsedValue = rawValue; + if (rawValue === NOW_VALUE_KEYWORD) { + // Set to current time in ms, e.g 1667915146503 + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + parsedValue = Date(); + } + return parsedValue; + }; + + /** + * Makes arbitrary operations on shadow root element, + * to be passed as callback to hijackAttachShadow + */ + + /** + * Overrides attachShadow method of Element API on a given context + * to pass retrieved shadowRoots to callback + * + * @param context e.g global window object or contentWindow of an iframe + * @param hostSelector selector to determine if callback should be called on current shadow subtree + * @param callback callback to call on shadow root + */ + var hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) { + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var shadowRoot = Reflect.apply(target, thisArg, args); + if (thisArg && thisArg.matches(hostSelector || '*')) { + callback(shadowRoot); } - nativeConsole(messageStr); + return shadowRoot; + }; + var attachShadowHandler = { + apply: handlerWrapper + }; + context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler); + }; + + /** + * Grabs existing nodes and passes them to a given handler. + * + * @param selector CSS selector to find nodes by + * @param handler handler to pass nodes to + */ + var handleExistingNodes = function handleExistingNodes(selector, handler) { + var nodeList = document.querySelectorAll(selector); + var nodes = nodeListToArray(nodeList); + handler(nodes); + }; + + /** + * Extracts added nodes from mutations and passes them to a given handler. + * + * @param mutations mutations to find eligible nodes in + * @param handler handler to pass eligible nodes to + */ + var handleMutations = function handleMutations(mutations, handler) { + var addedNodes = getAddedNodes(mutations); + handler(addedNodes); + }; + + /** + * Checks if given node's text content should be replaced + * + * @param node node to check + * @param nodeNameMatch regexp or string to match node name + * @param textContentMatch regexp or string to match node's text content + * @returns true if node's text content should be replaced + */ + var isTargetNode = function isTargetNode(node, nodeNameMatch, textContentMatch) { + var nodeName = node.nodeName, + textContent = node.textContent; + var nodeNameLowerCase = nodeName.toLowerCase(); + return textContent !== null && textContent !== '' && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch)); + }; + + /** + * Replaces given node's text content with a given replacement. + * + * @param source source of the scriptlet + * @param node node to replace text content in + * @param pattern pattern to match text content + * @param replacement replacement for matched text content + */ + var replaceNodeText = function replaceNodeText(source, node, pattern, replacement) { + var textContent = node.textContent; + if (textContent) { + node.textContent = textContent.replace(pattern, replacement); + hit(source); } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; + }; + + /** + * Modifies arguments for trusted-replace-node-text and remove-node-text scriptlets + * + * @param nodeName string or stringified regexp to match node name + * @param textMatch string or stringified regexp to match node's text content + * @param pattern string or stringified regexp to match replace pattern + * @returns derivative params + */ + var parseNodeTextParams = function parseNodeTextParams(nodeName, textMatch) { + var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var REGEXP_START_MARKER = '/'; + var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER)); + var selector = isStringNameMatch ? nodeName : '*'; + var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName); + var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch); + var patternMatch; + if (pattern) { + patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - logOnStacktrace.apply(this, updatedArgs); - } catch (e) { - console.log(e); + return { + selector, + nodeNameMatch, + textContentMatch, + patternMatch + }; + }; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-click-element + * + * @description + * Clicks selected elements in a strict sequence, ordered by selectors passed, + * and waiting for them to render in the DOM first. + * Deactivates after all elements have been clicked or by 10s timeout. + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('trusted-click-element', selectors[, extraMatch[, delay]]) + * ``` + * + * - `selectors` — required, string with query selectors delimited by comma + * - `extraMatch` — optional, extra condition to check on a page; allows to match `cookie` and `localStorage`; + * can be set as `name:key[=value]` where `value` is optional. + * If `cookie`/`localStorage` starts with `!` then the element will only be clicked + * if specified cookie/localStorage item does not exist. + * Multiple conditions are allowed inside one `extraMatch` but they should be delimited by comma + * and each of them should match the syntax. Possible `name`s: + * - `cookie` — test string or regex against cookies on a page + * - `localStorage` — check if localStorage item is present + * - `delay` — optional, time in ms to delay scriptlet execution, defaults to instant execution. + * + * ### Examples + * + * 1. Click single element by selector + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]') + * ``` + * + * 1. Delay click execution by 500ms + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '', '500') + * ``` + * + * 1. Click multiple elements by selector with a delay + * + * + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name="check"], input[type="submit"][value="akkoord"]', '', '500') + * ``` + * + * 1. Match cookies by keys using regex and string + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'cookie:userConsentCommunity, cookie:/cmpconsent|cmp/') + * ``` + * + * 1. Match by cookie key=value pairs using regex and string + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'cookie:userConsentCommunity=true, cookie:/cmpconsent|cmp/=/[a-z]{1,5}/') + * ``` + * + * 1. Match by localStorage item 'promo' key + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'localStorage:promo') + * ``` + * + * 1. Click multiple elements with delay and matching by both cookie string and localStorage item + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], input[type="submit"][value="akkoord"]', 'cookie:cmpconsent, localStorage:promo', '250') + * ``` + * + * + * + * 1. Click element only if cookie with name `cmpconsent` does not exist + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '!cookie:cmpconsent') + * ``` + * + * 1. Click element only if specified cookie string and localStorage item does not exist + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '!cookie:consent, !localStorage:promo') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ + function trustedClickElement$1(source, selectors) { + var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; + if (!selectors) { + return; } - } - function m3uPrune(source, args) { - function m3uPrune(source, propsToRemove, urlToMatch) { - if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + var OBSERVER_TIMEOUT_MS = 10000; + var THROTTLE_DELAY_MS = 20; + var STATIC_CLICK_DELAY_MS = 150; + var COOKIE_MATCH_MARKER = 'cookie:'; + var LOCAL_STORAGE_MATCH_MARKER = 'localStorage:'; + var SELECTORS_DELIMITER = ','; + var COOKIE_STRING_DELIMITER = ';'; + // Regex to split match pairs by commas, avoiding the ones included in regexes + var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; + var sleep = function sleep(delayMs) { + return new Promise(function (resolve) { + return setTimeout(resolve, delayMs); + }); + }; + var parsedDelay; + if (delay) { + parsedDelay = parseInt(delay, 10); + var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; + if (!isValidDelay) { + // eslint-disable-next-line max-len + var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); + logMessage(source, message); return; } - let shouldPruneResponse = false; - const urlMatchRegexp = toRegExp(urlToMatch); - const SEGMENT_MARKER = "#"; - const AD_MARKER = { - ASSET: "#EXT-X-ASSET:", - CUE: "#EXT-X-CUE:", - CUE_IN: "#EXT-X-CUE-IN", - DISCONTINUITY: "#EXT-X-DISCONTINUITY", - EXTINF: "#EXTINF", - EXTM3U: "#EXTM3U", - SCTE35: "#EXT-X-SCTE35:" - }; - const COMCAST_AD_MARKER = { - AD: "-AD-", - VAST: "-VAST-", - VMAP_AD: "-VMAP-AD-", - VMAP_AD_BREAK: "#EXT-X-VMAP-AD-BREAK:" - }; - const TAGS_ALLOWLIST = ["#EXT-X-TARGETDURATION", "#EXT-X-MEDIA-SEQUENCE", "#EXT-X-DISCONTINUITY-SEQUENCE", "#EXT-X-ENDLIST", "#EXT-X-PLAYLIST-TYPE", "#EXT-X-I-FRAMES-ONLY", "#EXT-X-MEDIA", "#EXT-X-STREAM-INF", "#EXT-X-I-FRAME-STREAM-INF", "#EXT-X-SESSION-DATA", "#EXT-X-SESSION-KEY", "#EXT-X-INDEPENDENT-SEGMENTS", "#EXT-X-START"]; - const isAllowedTag = function isAllowedTag(str) { - return TAGS_ALLOWLIST.some(function (el) { - return str.startsWith(el); - }); - }; - const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { - let array = lines.slice(); - let index = i; - if (array[index].includes(AD_MARKER.EXTINF)) { - array[index] = undefined; - index += 1; - if (array[index].includes(AD_MARKER.DISCONTINUITY)) { - array[index] = undefined; - index += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, index); - array = prunedExtinf.array; - index = prunedExtinf.index; - } - } - return { - array: array, - index: index - }; - }; - const pruneVmapBlock = function pruneVmapBlock(lines) { - let array = lines.slice(); - for (let i = 0; i < array.length - 1; i += 1) { - if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) { - array[i] = undefined; - if (array[i + 1].includes(AD_MARKER.EXTINF)) { - i += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, i); - array = prunedExtinf.array; - i = prunedExtinf.index - 1; - } - } - } - return array; - }; - const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { - if (!line.startsWith(AD_MARKER.CUE)) { - return line; - } - line = undefined; - index += 1; - if (array[index].startsWith(AD_MARKER.ASSET)) { - array[index] = undefined; - index += 1; - } - if (array[index].startsWith(AD_MARKER.SCTE35)) { - array[index] = undefined; - index += 1; - } - if (array[index].startsWith(AD_MARKER.CUE_IN)) { - array[index] = undefined; - index += 1; - } - if (array[index].startsWith(AD_MARKER.SCTE35)) { - array[index] = undefined; - } - return line; - }; - const removeM3ULineRegexp = toRegExp(propsToRemove); - const pruneInfBlock = function pruneInfBlock(line, index, array) { - if (!line.startsWith(AD_MARKER.EXTINF)) { - return line; - } - if (!removeM3ULineRegexp.test(array[index + 1])) { - return line; - } - if (!isAllowedTag(array[index])) { - array[index] = undefined; - } - index += 1; - if (!isAllowedTag(array[index])) { - array[index] = undefined; - } - index += 1; - if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) { - array[index] = undefined; - } - return line; - }; - const pruneSegments = function pruneSegments(lines) { - for (let i = 0; i < lines.length - 1; i += 1) { - var _lines$i; - if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) { - const segmentName = lines[i].substring(0, lines[i].indexOf(":")); - if (!segmentName) { - return lines; - } - lines[i] = undefined; - i += 1; - for (let j = i; j < lines.length; j += 1) { - if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) { - lines[j] = undefined; - } else { - i = j - 1; - break; - } - } - } - } - return lines; - }; - const isM3U = function isM3U(text) { - if (typeof text === "string") { - const trimmedText = text.trim(); - return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK); - } - return false; - }; - const isPruningNeeded = function isPruningNeeded(text, regexp) { - return isM3U(text) && regexp.test(text); - }; - const pruneM3U = function pruneM3U(text) { - let lines = text.split(/\n\r|\n|\r/); - if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) { - lines = pruneVmapBlock(lines); - return lines.filter(function (l) { - return !!l; - }).join("\n"); - } - lines = pruneSegments(lines); - return lines.map(function (line, index, array) { - if (typeof line === "undefined") { - return line; - } - line = pruneSpliceoutBlock(line, index, array); - if (typeof line !== "undefined") { - line = pruneInfBlock(line, index, array); - } - return line; - }).filter(function (l) { - return !!l; - }).join("\n"); - }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== "string" || xhrURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener("readystatechange", function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener("readystatechange", pruneResponse); - if (!propsToRemove) { - if (isM3U(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - } - } else { - shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); - } - if (shouldPruneResponse) { - const prunedResponseContent = pruneM3U(response); - Object.defineProperty(thisArg, "response", { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, "responseText", { - value: prunedResponseContent - }); - hit(source); - } - } - }); - } - return Reflect.apply(target, thisArg, args); - }; - const xhrHandler = { - apply: xhrWrapper - }; - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = async function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; - if (typeof fetchURL !== "string" || fetchURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(fetchURL)) { - const response = await nativeFetch(...args); - const responseText = await response.text(); - if (!propsToRemove && isM3U(responseText)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - } - if (isPruningNeeded(responseText, removeM3ULineRegexp)) { - const prunedText = pruneM3U(responseText); - hit(source); - return new Response(prunedText, { - status: response.status, - statusText: response.statusText, - headers: response.headers - }); - } - return Reflect.apply(target, thisArg, args); - } - return Reflect.apply(target, thisArg, args); - }; - const fetchHandler = { - apply: fetchWrapper - }; - window.fetch = new Proxy(window.fetch, fetchHandler); } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + var canClick = !parsedDelay; + var cookieMatches = []; + var localStorageMatches = []; + var isInvertedMatchCookie = false; + var isInvertedMatchLocalStorage = false; + if (extraMatch) { + // Get all match marker:value pairs from argument + var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { + return matchStr.trim(); + }); + + // Filter match pairs by marker + parsedExtraMatch.forEach(function (matchStr) { + if (matchStr.includes(COOKIE_MATCH_MARKER)) { + var _parseMatchArg = parseMatchArg(matchStr), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchValue = _parseMatchArg.matchValue; + isInvertedMatchCookie = isInvertedMatch; + var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ''); + cookieMatches.push(cookieMatch); } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) { + var _parseMatchArg2 = parseMatchArg(matchStr), + _isInvertedMatch = _parseMatchArg2.isInvertedMatch, + _matchValue = _parseMatchArg2.matchValue; + isInvertedMatchLocalStorage = _isInvertedMatch; + var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ''); + localStorageMatches.push(localStorageMatch); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); + }); } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { + if (cookieMatches.length > 0) { + var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); + var parsedCookies = parseCookieString(document.cookie); + var cookieKeys = Object.keys(parsedCookies); + if (cookieKeys.length === 0) { return; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { + // Avoid getting /.?/ result from toRegExp on undefined + // as cookie may be set without value, + // on which cookie parsing will return cookieKey:undefined pair + var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; + var keyMatch = toRegExp(key); + return cookieKeys.some(function (key) { + var keysMatched = keyMatch.test(key); + if (!keysMatched) { + return false; + } + + // Key matching is enough if cookie value match is not specified + if (!valueMatch) { + return true; + } + return valueMatch.test(parsedCookies[key]); + }); + }); + var shouldRun = cookiesMatched !== isInvertedMatchCookie; + if (!shouldRun) { return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - m3uPrune.apply(this, updatedArgs); - } catch (e) { - console.log(e); } - } - function noTopics(source, args) { - function noTopics(source) { - const TOPICS_PROPERTY_NAME = "browsingTopics"; - if (Document instanceof Object === false) { - return; - } - if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { + if (localStorageMatches.length > 0) { + var localStorageMatched = localStorageMatches.every(function (str) { + var itemValue = window.localStorage.getItem(str); + return itemValue || itemValue === ''; + }); + var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; + if (!_shouldRun) { return; } - Document.prototype[TOPICS_PROPERTY_NAME] = function () { - return noopPromiseResolve("[]"); - }; - hit(source); } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + + /** + * Create selectors array and swap selectors to null on finding it's element + * + * Selectors / nulls should not be (re)moved from array to: + * - keep track of selectors order + * - always know on what index corresponding element should be put + * - prevent selectors from being queried multiple times + */ + var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { + return selector.trim(); + }); + var createElementObj = function createElementObj(element) { + return { + element: element || null, + clicked: false + }; + }; + var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); + + /** + * Go through elementsSequence from left to right, clicking on found elements + * + * Element should not be clicked if it is already clicked, + * or a previous element is not found or clicked yet + */ + var clickElementsBySequence = async function clickElementsBySequence() { + for (var i = 0; i < elementsSequence.length; i += 1) { + var elementObj = elementsSequence[i]; + // Add a delay between clicks to every element except the first one + // https://github.com/AdguardTeam/Scriptlets/issues/284 + if (i >= 1) { + await sleep(STATIC_CLICK_DELAY_MS); } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + // Stop clicking if that pos element is not found yet + if (!elementObj.element) { + break; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { - return; - } - const response = new Response(responseBody, { - status: 200, - statusText: "OK" - }); - Object.defineProperties(response, { - url: { - value: responseUrl - }, - type: { - value: responseType + // Skip already clicked elements + if (!elementObj.clicked) { + elementObj.element.click(); + elementObj.clicked = true; } + } + var allElementsClicked = elementsSequence.every(function (elementObj) { + return elementObj.clicked === true; }); - return Promise.resolve(response); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - noTopics.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function noeval(source, args) { - function noeval(source) { - window.eval = function evalWrapper(s) { + if (allElementsClicked) { + // At this stage observer is already disconnected hit(source); - logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); - }.bind(); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + }; + var handleElement = function handleElement(element, i) { + var elementObj = createElementObj(element); + elementsSequence[i] = elementObj; + if (canClick) { + clickElementsBySequence(); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + }; + + /** + * Query all selectors from queue on each mutation + * Each selector is swapped to null in selectorsSequence on founding corresponding element + * + * We start looking for elements before possible delay is over, to avoid cases + * when delay is getting off after the last mutation took place. + * + */ + var findElements = function findElements(mutations, observer) { + var fulfilledSelectors = []; + selectorsSequence.forEach(function (selector, i) { + if (!selector) { + return; + } + var element = document.querySelector(selector); + if (!element) { + return; } + handleElement(element, i); + fulfilledSelectors.push(selector); + }); + + // selectorsSequence should be modified after the loop to not break loop indexation + selectorsSequence = selectorsSequence.map(function (selector) { + return fulfilledSelectors.includes(selector) ? null : selector; + }); + + // Disconnect observer after finding all elements + var allSelectorsFulfilled = selectorsSequence.every(function (selector) { + return selector === null; + }); + if (allSelectorsFulfilled) { + observer.disconnect(); } - nativeConsole(messageStr); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - noeval.apply(this, updatedArgs); - } catch (e) { - console.log(e); + }; + var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); + observer.observe(document.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + if (parsedDelay) { + setTimeout(function () { + // Click previously collected elements + clickElementsBySequence(); + canClick = true; + }, parsedDelay); } + setTimeout(function () { + return observer.disconnect(); + }, OBSERVER_TIMEOUT_MS); } - function nowebrtc(source, args) { - function nowebrtc(source) { - let propertyName = ""; - if (window.RTCPeerConnection) { - propertyName = "RTCPeerConnection"; - } else if (window.webkitRTCPeerConnection) { - propertyName = "webkitRTCPeerConnection"; - } - if (propertyName === "") { - return; - } - const rtcReplacement = function rtcReplacement(config) { - const message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); - logMessage(source, message); - hit(source); - }; - rtcReplacement.prototype = { - close: noopFunc, - createDataChannel: noopFunc, - createOffer: noopFunc, - setRemoteDescription: noopFunc - }; - const rtc = window[propertyName]; - window[propertyName] = rtcReplacement; - if (rtc.prototype) { - rtc.prototype.createDataChannel = function (a, b) { - return { - close: noopFunc, - send: noopFunc - }; - }.bind(null); - } + trustedClickElement$1.names = ['trusted-click-element' + // trusted scriptlets support no aliases + ]; + + trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage, parseMatchArg]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-on-property-read + * + * @description + * Aborts a script when it attempts to **read** the specified property. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-readjs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-read.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('abort-on-property-read', property) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window` + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to access `window.alert` + * example.org#%#//scriptlet('abort-on-property-read', 'alert') + * + * ! Aborts script when it tries to access `navigator.language` + * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function abortOnPropertyRead$1(source, property) { + if (!property) { + return; } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + var rid = randomId(); + var abort = function abort() { + hit(source); + throw new ReferenceError(rid); + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function noopFunc() {} - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function convertRtcConfigToString(config) { - const UNDEF_STR = "undefined"; - let str = UNDEF_STR; - if (config === null) { - str = "null"; - } else if (config instanceof Object) { - const SERVERS_PROP_NAME = "iceServers"; - const URLS_PROP_NAME = "urls"; - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { - str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); - } - } - return str; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - nowebrtc.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function preventAddEventListener(source, args) { - function preventAddEventListener(source, typeSearch, listenerSearch) { - const typeSearchRegexp = toRegExp(typeSearch); - const listenerSearchRegexp = toRegExp(listenerSearch); - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { - var _this$constructor; - let shouldPrevent = false; - if (validateType(type) && validateListener(listener)) { - shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); - } - if (shouldPrevent) { - hit(source); - return undefined; - } - let context = this; - if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { - context = window; - } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - return nativeAddEventListener.apply(context, [type, listener, ...args]); - } - const descriptor = { - configurable: true, - set: function set() {}, - get: function get() { - return addEventListenerWrapper; - } - }; - Object.defineProperty(window.EventTarget.prototype, "addEventListener", descriptor); - Object.defineProperty(window, "addEventListener", descriptor); - Object.defineProperty(document, "addEventListener", descriptor); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function validateType(type) { - return typeof type !== "undefined"; - } - function validateListener(listener) { - return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); - } - function listenerToString(listener) { - return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventAddEventListener.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function preventAdfly(source, args) { - function preventAdfly(source) { - const isDigit = function isDigit(data) { - return /^\d$/.test(data); - }; - const handler = function handler(encodedURL) { - let evenChars = ""; - let oddChars = ""; - for (let i = 0; i < encodedURL.length; i += 1) { - if (i % 2 === 0) { - evenChars += encodedURL.charAt(i); - } else { - oddChars = encodedURL.charAt(i) + oddChars; - } - } - let data = (evenChars + oddChars).split(""); - for (let i = 0; i < data.length; i += 1) { - if (isDigit(data[i])) { - for (let ii = i + 1; ii < data.length; ii += 1) { - if (isDigit(data[ii])) { - const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10); - if (temp < 10) { - data[i] = temp.toString(); - } - i = ii; - break; - } - } - } - } - data = data.join(""); - const decodedURL = window.atob(data).slice(16, -16); - if (window.stop) { - window.stop(); - } - window.onbeforeunload = null; - window.location.href = decodedURL; - }; - let val; - let applyHandler = true; - const result = setPropertyAccess(window, "ysmm", { - configurable: false, - set: function set(value) { - if (applyHandler) { - applyHandler = false; - try { - if (typeof value === "string") { - handler(value); - } - } catch (err) {} - } - val = value; - }, - get: function get() { - return val; - } + setPropertyAccess(base, prop, { + get: abort, + set: function set() {} }); - if (result) { - hit(source); - } else { - logMessage(source, "Failed to set up prevent-adfly scriptlet"); - } - } - function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { - return false; - } - Object.defineProperty(object, property, descriptor); - return true; + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + abortOnPropertyRead$1.names = ['abort-on-property-read', + // aliases are needed for matching the related scriptlet converted into our syntax + 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read']; + abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-on-property-write + * + * @description + * Aborts a script when it attempts to **write** the specified property. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-writejs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-write.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('abort-on-property-write', property) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). + * The property must be attached to `window` + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to set `window.adblock` value + * example.org#%#//scriptlet('abort-on-property-write', 'adblock') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function abortOnPropertyWrite$1(source, property) { + if (!property) { + return; } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + var rid = randomId(); + var abort = function abort() { + hit(source); + throw new ReferenceError(rid); + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventAdfly.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + setPropertyAccess(base, prop, { + set: abort + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); } - function preventBab(source, args) { - function preventBab(source) { - const nativeSetTimeout = window.setTimeout; - const babRegex = /\.bab_elementid.$/; - const timeoutWrapper = function timeoutWrapper(callback) { - if (typeof callback !== "string" || !babRegex.test(callback)) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeSetTimeout.apply(window, [callback, ...args]); - } - hit(source); - }; - window.setTimeout = timeoutWrapper; - const signatures = [["blockadblock"], ["babasbm"], [/getItem\('babn'\)/], ["getElementById", "String.fromCharCode", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "charAt", "DOMContentLoaded", "AdBlock", "addEventListener", "doScroll", "fromCharCode", "<<2|r>>4", "sessionStorage", "clientWidth", "localStorage", "Math", "random"]]; - const check = function check(str) { - if (typeof str !== "string") { - return false; - } - for (let i = 0; i < signatures.length; i += 1) { - const tokens = signatures[i]; - let match = 0; - for (let j = 0; j < tokens.length; j += 1) { - const token = tokens[j]; - const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; - if (found) { - match += 1; - } - } - if (match / tokens.length >= .8) { - return true; - } - } - return false; - }; - const nativeEval = window.eval; - const evalWrapper = function evalWrapper(str) { - if (!check(str)) { - return nativeEval(str); - } + abortOnPropertyWrite$1.names = ['abort-on-property-write', + // aliases are needed for matching the related scriptlet converted into our syntax + 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write']; + abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-setTimeout + * + * @description + * Prevents a `setTimeout` call if: + * + * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`; + * otherwise mismatched calls should be defused. + * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-settimeout-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-setTimeout'[, matchCallback[, matchDelay]]) + * ``` + * + * > Call with no arguments will log all setTimeout calls (`log-setTimeout` superseding), + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * - `matchCallback` — optional, string or regular expression; + * invalid regular expression will be skipped and all callbacks will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * If not set, prevents all `setTimeout` calls due to specified `matchDelay`. + * - `matchDelay` — optional, must be an integer. + * If starts with `!`, scriptlet will not match the delay but all other will be defused. + * If do not start with `!`, the delay passed to the `setTimeout` call will be matched. + * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. + * + * > If `prevent-setTimeout` log looks like `setTimeout(undefined, 1000)`, + * > it means that no callback was passed to setTimeout() and that's not scriptlet issue + * > and obviously it can not be matched by `matchCallback`. + * + * ### Examples + * + * 1. Prevents `setTimeout` calls if the callback matches `/\.test/` regardless of the delay + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', '/\.test/') + * ``` + * + * For instance, the following call will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "value"; + * }, 100); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback does not contain `value` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', '!value') + * ``` + * + * For instance, only the first of the following calls will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "test -- prevented"; + * }, 300); + * setTimeout(function () { + * window.test = "value -- executed"; + * }, 400); + * setTimeout(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback contains `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', 'value', '!300') + * ``` + * + * For instance, only the first of the following calls will not be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "value 1 -- executed"; + * }, 300); + * setTimeout(function () { + * window.test = "value 2 -- prevented"; + * }, 400); + * setTimeout(function () { + * window.test = "value 3 -- prevented"; + * }, 500); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback does not contain `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', '!value', '!300') + * ``` + * + * For instance, only the second of the following calls will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "test -- executed"; + * }, 300); + * setTimeout(function () { + * window.test = "test -- prevented"; + * }, 400); + * setTimeout(function () { + * window.test = "value -- executed"; + * }, 400); + * setTimeout(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback contains `value` and delay is a decimal + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', 'value', '300') + * ``` + * + * For instance, the following calls will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "value"; + * }, 300); + * setTimeout(function () { + * window.test = "value"; + * }, 300 + Math.random()); + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function preventSetTimeout$1(source, matchCallback, matchDelay) { + // logs setTimeouts to console if no arguments have been specified + var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; + if (shouldLog) { hit(source); - const bodyEl = document.body; - if (bodyEl) { - bodyEl.style.removeProperty("visibility"); - } - const el = document.getElementById("babasbmsgx"); - if (el) { - el.parentNode.removeChild(el); - } - }; - window.eval = evalWrapper.bind(window); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventBab.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function preventElementSrcLoading(source, args) { - function preventElementSrcLoading(source, tagName, match) { - if (typeof Proxy === "undefined" || typeof Reflect === "undefined") { - return; - } - const srcMockData = { - script: "data:text/javascript;base64,KCk9Pnt9", - img: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", - iframe: "data:text/html;base64, PGRpdj48L2Rpdj4=" - }; - let instance; - if (tagName === "script") { - instance = HTMLScriptElement; - } else if (tagName === "img") { - instance = HTMLImageElement; - } else if (tagName === "iframe") { - instance = HTMLIFrameElement; + // https://github.com/AdguardTeam/Scriptlets/issues/105 + logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); } else { - return; - } - const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; - let policy; - if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy("AGPolicy", { - createScriptURL: function createScriptURL(arg) { - return arg; - } + shouldPrevent = isPreventionNeeded({ + callback, + delay, + matchCallback, + matchDelay }); } - const SOURCE_PROPERTY_NAME = "src"; - const ONERROR_PROPERTY_NAME = "onerror"; - const searchRegexp = toRegExp(match); - const setMatchedAttribute = function setMatchedAttribute(elem) { - return elem.setAttribute(source.name, "matched"); - }; - const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { - if (!args[0] || !args[1]) { - return Reflect.apply(target, thisArg, args); - } - const nodeName = thisArg.nodeName.toLowerCase(); - const attrName = args[0].toLowerCase(); - const attrValue = args[1]; - const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); - if (!isMatched) { - return Reflect.apply(target, thisArg, args); - } + if (shouldPrevent) { hit(source); - setMatchedAttribute(thisArg); - return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); - }; - const setAttributeHandler = { - apply: setAttributeWrapper - }; - instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); - const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); - if (!origSrcDescriptor) { - return; - } - Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { - enumerable: true, - configurable: true, - get() { - return origSrcDescriptor.get.call(this); - }, - set(urlValue) { - const nodeName = this.nodeName.toLowerCase(); - const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); - if (!isMatched) { - origSrcDescriptor.set.call(this, urlValue); - return true; - } - if (policy && urlValue instanceof TrustedScriptURL) { - const trustedSrc = policy.createScriptURL(urlValue); - origSrcDescriptor.set.call(this, trustedSrc); - hit(source); - return; - } - setMatchedAttribute(this); - origSrcDescriptor.set.call(this, srcMockData[nodeName]); - hit(source); - } - }); - const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); - if (!origOnerrorDescriptor) { - return; - } - Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { - enumerable: true, - configurable: true, - get() { - return origOnerrorDescriptor.get.call(this); - }, - set(cb) { - const isMatched = this.getAttribute(source.name) === "matched"; - if (!isMatched) { - origOnerrorDescriptor.set.call(this, cb); - return true; - } - origOnerrorDescriptor.set.call(this, noopFunc); - return true; - } - }); - const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { - if (!args[0] || !args[1] || !thisArg) { - return Reflect.apply(target, thisArg, args); - } - const eventName = args[0]; - const isMatched = typeof thisArg.getAttribute === "function" && thisArg.getAttribute(source.name) === "matched" && eventName === "error"; - if (isMatched) { - return Reflect.apply(target, thisArg, [eventName, noopFunc]); - } - return Reflect.apply(target, thisArg, args); - }; - const addEventListenerHandler = { - apply: addEventListenerWrapper - }; - EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); - } - function hit(source) { - if (source.verbose !== true) { - return; + args[0] = noopFunc; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function safeGetDescriptor(obj, prop) { - const descriptor = Object.getOwnPropertyDescriptor(obj, prop); - if (descriptor && descriptor.configurable) { - return descriptor; - } - return null; - } - function noopFunc() {} - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventElementSrcLoading.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + return target.apply(thisArg, args); + }; + var setTimeoutHandler = { + apply: handlerWrapper + }; + window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler); } - function preventEvalIf(source, args) { - function preventEvalIf(source, search) { - const searchRegexp = toRegExp(search); - const nativeEval = window.eval; - window.eval = function (payload) { - if (!searchRegexp.test(payload.toString())) { - return nativeEval.call(window, payload); - } + preventSetTimeout$1.names = ['prevent-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-setTimeout-if.js', + // new implementation of setTimeout-defuser.js + 'ubo-no-setTimeout-if.js', 'nostif.js', + // new short name of no-setTimeout-if + 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif', + // old scriptlet names which should be supported as well. + // should be removed eventually. + // do not remove until other filter lists maintainers use them + 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std']; + preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, + // following helpers should be injected as helpers above use them + parseMatchArg, parseDelayArg, toRegExp, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-setInterval + * + * @description + * Prevents a `setInterval` call if: + * + * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`; + * otherwise mismatched calls should be defused. + * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-setinterval-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-setInterval'[, matchCallback[, matchDelay]]) + * ``` + * + * > Call with no arguments will log all setInterval calls (`log-setInterval` superseding), + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * - `matchCallback` — optional, string or regular expression; + * invalid regular expression will be skipped and all callbacks will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * If not set, prevents all `setInterval` calls due to specified `matchDelay`. + * - `matchDelay` — optional, must be an integer. + * If starts with `!`, scriptlet will not match the delay but all other will be defused. + * If do not start with `!`, the delay passed to the `setInterval` call will be matched. + * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. + * + * > If `prevent-setInterval` log looks like `setInterval(undefined, 1000)`, + * > it means that no callback was passed to setInterval() and that's not scriptlet issue + * > and obviously it can not be matched by `matchCallback`. + * + * ### Examples + * + * 1. Prevents `setInterval` calls if the callback matches `/\.test/` regardless of the delay + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', '/\.test/') + * ``` + * + * For instance, the following call will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "value"; + * }, 100); + * ``` + * + * 1. Prevents `setInterval` calls if the callback does not contain `value` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', '!value') + * ``` + * + * For instance, only the first of the following calls will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "test -- prevented"; + * }, 300); + * setInterval(function () { + * window.test = "value -- executed"; + * }, 400); + * setInterval(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setInterval` calls if the callback contains `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', 'value', '!300') + * ``` + * + * For instance, only the first of the following calls will not be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "value 1 -- executed"; + * }, 300); + * setInterval(function () { + * window.test = "value 2 -- prevented"; + * }, 400); + * setInterval(function () { + * window.test = "value 3 -- prevented"; + * }, 500); + * ``` + * + * 1. Prevents `setInterval` calls if the callback does not contain `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', '!value', '!300') + * ``` + * + * For instance, only the second of the following calls will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "test -- executed"; + * }, 300); + * setInterval(function () { + * window.test = "test -- prevented"; + * }, 400); + * setInterval(function () { + * window.test = "value -- executed"; + * }, 400); + * setInterval(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setInterval` calls if the callback contains `value` and delay is a decimal number + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', 'value', '300') + * ``` + * + * For instance, the following calls will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "value"; + * }, 300); + * setInterval(function () { + * window.test = "value"; + * }, 300 + Math.random()); + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function preventSetInterval$1(source, matchCallback, matchDelay) { + // logs setIntervals to console if no arguments have been specified + var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; + if (shouldLog) { hit(source); - return undefined; - }.bind(window); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function hit(source) { - if (source.verbose !== true) { - return; + // https://github.com/AdguardTeam/Scriptlets/issues/105 + logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); + } else { + shouldPrevent = isPreventionNeeded({ + callback, + delay, + matchCallback, + matchDelay + }); } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + if (shouldPrevent) { + hit(source); + args[0] = noopFunc; } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventEvalIf.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + return target.apply(thisArg, args); + }; + var setIntervalHandler = { + apply: handlerWrapper + }; + window.setInterval = new Proxy(window.setInterval, setIntervalHandler); } - function preventFab(source, args) { - function preventFab(source) { - hit(source); - const Fab = function Fab() {}; - Fab.prototype.check = noopFunc; - Fab.prototype.clearEvent = noopFunc; - Fab.prototype.emitEvent = noopFunc; - Fab.prototype.on = function (a, b) { - if (!a) { - b(); - } - return this; - }; - Fab.prototype.onDetected = noopThis; - Fab.prototype.onNotDetected = function (a) { - a(); - return this; - }; - Fab.prototype.setOption = noopFunc; - Fab.prototype.options = { - set: noopFunc, - get: noopFunc - }; - const fab = new Fab(); - const getSetFab = { - get() { - return Fab; - }, - set() {} - }; - const getsetfab = { - get() { - return fab; - }, - set() {} - }; - if (Object.prototype.hasOwnProperty.call(window, "FuckAdBlock")) { - window.FuckAdBlock = Fab; - } else { - Object.defineProperty(window, "FuckAdBlock", getSetFab); + preventSetInterval$1.names = ['prevent-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-setInterval-if.js', + // new implementation of setInterval-defuser.js + 'ubo-no-setInterval-if.js', 'setInterval-defuser.js', + // old name should be supported as well + 'ubo-setInterval-defuser.js', 'nosiif.js', + // new short name of no-setInterval-if + 'ubo-nosiif.js', 'sid.js', + // old short scriptlet name + 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid']; + preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, + // following helpers should be injected as helpers above use them + toRegExp, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-window-open + * + * @description + * Prevents `window.open` calls when URL either matches or not matches the specified string/regexp. + * Using it without parameters prevents all `window.open` calls. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#windowopen-defuserjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-window-open'[, match[, delay[, replacement]]]) + * ``` + * + * - `match` — optional, string or regular expression. + * If not set or regular expression is invalid, all window.open calls will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * - `delay` — optional, number of seconds. If not set, scriptlet will return `null`, + * otherwise valid sham window object as injected `iframe` will be returned + * for accessing its methods (blur(), focus() etc.) and will be removed after the delay. + * - `replacement` — optional, string; one of the predefined constants: + * - `obj` — for returning an object instead of default iframe; + * for cases when the page requires a valid `window` instance to be returned + * - `log` — for logging window.open calls; not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Prevent all `window.open` calls + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open') + * ``` + * + * 1. Prevent `window.open` for all URLs containing `example` + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', 'example') + * ``` + * + * 1. Prevent `window.open` for all URLs matching RegExp `/example\./` + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', '/example\./') + * ``` + * + * 1. Prevent `window.open` for all URLs **NOT** containing `example` + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', '!example') + * ``` + * + * ### Old syntax of prevent-window-open parameters + * + * - `match` — optional, defaults to "matching", any positive number or nothing for "matching", + * 0 or empty string for "not matching" + * - `search` — optional, string or regexp for matching the URL passed to `window.open` call; + * defaults to search all `window.open` call + * - `replacement` — optional, string to return prop value or property instead of window.open; + * defaults to return noopFunc. + * + * ### Examples of old syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', '1', '/example\./') + * example.org#%#//scriptlet('prevent-window-open', '0', 'example') + * example.org#%#//scriptlet('prevent-window-open', '', '', 'trueFunc') + * example.org#%#//scriptlet('prevent-window-open', '1', '', '{propName=noopFunc}') + * ``` + * + * > For better compatibility with uBO, old syntax is not recommended to use. + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function preventWindowOpen$1(source) { + var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*'; + var delay = arguments.length > 2 ? arguments[2] : undefined; + var replacement = arguments.length > 3 ? arguments[3] : undefined; + // default match value is needed for preventing all window.open calls + // if scriptlet runs without args + var nativeOpen = window.open; + var isNewSyntax = match !== '0' && match !== '1'; + var oldOpenWrapper = function oldOpenWrapper(str) { + match = Number(match) > 0; + // 'delay' was 'search' prop for matching in old syntax + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; } - if (Object.prototype.hasOwnProperty.call(window, "BlockAdBlock")) { - window.BlockAdBlock = Fab; - } else { - Object.defineProperty(window, "BlockAdBlock", getSetFab); + if (!isValidStrPattern(delay)) { + logMessage(source, "Invalid parameter: ".concat(delay)); + return nativeOpen.apply(window, [str, ...args]); } - if (Object.prototype.hasOwnProperty.call(window, "SniffAdBlock")) { - window.SniffAdBlock = Fab; - } else { - Object.defineProperty(window, "SniffAdBlock", getSetFab); + var searchRegexp = toRegExp(delay); + if (match !== searchRegexp.test(str)) { + return nativeOpen.apply(window, [str, ...args]); } - if (Object.prototype.hasOwnProperty.call(window, "fuckAdBlock")) { - window.fuckAdBlock = fab; - } else { - Object.defineProperty(window, "fuckAdBlock", getsetfab); + hit(source); + return handleOldReplacement(replacement); + }; + var newOpenWrapper = function newOpenWrapper(url) { + var shouldLog = replacement && replacement.includes('log'); + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; } - if (Object.prototype.hasOwnProperty.call(window, "blockAdBlock")) { - window.blockAdBlock = fab; - } else { - Object.defineProperty(window, "blockAdBlock", getsetfab); + if (shouldLog) { + var argsStr = args && args.length > 0 ? ", ".concat(args.join(', ')) : ''; + var message = "".concat(url).concat(argsStr); + logMessage(source, message, true); + hit(source); } - if (Object.prototype.hasOwnProperty.call(window, "sniffAdBlock")) { - window.sniffAdBlock = fab; + var shouldPrevent = false; + if (match === '*') { + shouldPrevent = true; + } else if (isValidMatchStr(match)) { + var _parseMatchArg = parseMatchArg(match), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; + shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; } else { - Object.defineProperty(window, "sniffAdBlock", getsetfab); - } - } - function hit(source) { - if (source.verbose !== true) { - return; + logMessage(source, "Invalid parameter: ".concat(match)); + shouldPrevent = false; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + if (shouldPrevent) { + var parsedDelay = parseInt(delay, 10); + var result; + if (nativeIsNaN(parsedDelay)) { + result = noopNull(); + } else { + var decoyArgs = { + replacement, + url, + delay: parsedDelay + }; + var decoy = createDecoy(decoyArgs); + var popup = decoy.contentWindow; + if (typeof popup === 'object' && popup !== null) { + Object.defineProperty(popup, 'closed', { + value: false + }); + Object.defineProperty(popup, 'opener', { + value: window + }); + Object.defineProperty(popup, 'frameElement', { + value: null + }); + } else { + var nativeGetter = decoy.contentWindow && decoy.contentWindow.get; + Object.defineProperty(decoy, 'contentWindow', { + get: getPreventGetter(nativeGetter) + }); + popup = decoy.contentWindow; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + result = popup; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + hit(source); + return result; } - } - function noopFunc() {} - function noopThis() { - return this; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventFab.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + return nativeOpen.apply(window, [url, ...args]); + }; + window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; + + // Protect window.open from native code check + window.open.toString = nativeOpen.toString.bind(nativeOpen); } - function preventFetch(source, args) { - function preventFetch(source, propsToMatch) { - let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "emptyObj"; - let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "default"; - if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { - return; + preventWindowOpen$1.names = ['prevent-window-open', + // aliases are needed for matching the related scriptlet converted into our syntax + 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif']; + preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, substringBefore, substringAfter$1]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-current-inline-script + * + * @description + * Aborts an inline script when it attempts to **read** or **write to** the specified property + * AND when the contents of the ` + * ``` + * + * 1. Aborts inline scripts which are trying to access `window.alert` and match regexp `/Hello.+world/` + * + * ```adblock + * example.org#%#//scriptlet('abort-current-inline-script', 'alert', '/Hello.+world/') + * ``` + * + * For instance, the following scripts will be aborted: + * + * ```html + * + * ``` + * + * ```html + * + * ``` + * + * And this script will not be aborted: + * + * ```html + * + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function abortCurrentInlineScript$1(source, property, search) { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var SRC_DATA_MARKER = 'data:text/javascript;base64,'; + var getCurrentScript = function getCurrentScript() { + if ('currentScript' in document) { + return document.currentScript; } - let strResponseBody; - if (responseBody === "" || responseBody === "emptyObj") { - strResponseBody = "{}"; - } else if (responseBody === "emptyArr") { - strResponseBody = "[]"; - } else { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + }; + var ourScript = getCurrentScript(); + var abort = function abort() { + var _scriptEl$src; + var scriptEl = getCurrentScript(); + if (!scriptEl) { return; } - if (!(responseType === "default" || responseType === "opaque")) { - logMessage(source, "Invalid parameter: ".concat(responseType)); - return; + var content = scriptEl.textContent; + + // We are using Node.prototype.textContent property descriptor + // to get the real script content + // even when document.currentScript.textContent is replaced. + // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 + try { + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; + content = textContentGetter.call(scriptEl); + } catch (e) {} // eslint-disable-line no-empty + + // https://github.com/AdguardTeam/Scriptlets/issues/130 + if (content.length === 0 && typeof scriptEl.src !== 'undefined' && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) { + var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); + content = window.atob(encodedContent); } - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - let shouldPrevent = false; - const fetchData = getFetchData(args); - if (typeof propsToMatch === "undefined") { - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); - if (shouldPrevent) { - hit(source); - return noopPromiseResolve(strResponseBody, fetchData.url, responseType); - } - return Reflect.apply(target, thisArg, args); - }; - const fetchHandler = { - apply: handlerWrapper - }; - fetch = new Proxy(fetch, fetchHandler); - } - function hit(source) { - if (source.verbose !== true) { + if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { + hit(source); + throw new ReferenceError(rid); + } + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + + // The scriptlet might be executed before the chain property has been created + // (for instance, document.body before the HTML body was loaded). + // In this case we're checking whether the base element exists or not + // and if not, we simply exit without overriding anything. + // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 + if (base instanceof Object === false && base === null) { + var props = property.split('.'); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + logMessage(source, message); return; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function getFetchData(args) { - const fetchPropsObj = {}; - let fetchUrl; - let fetchInit; - if (args[0] instanceof Request) { - const requestData = getRequestData(args[0]); - fetchUrl = requestData.url; - fetchInit = requestData; - } else { - fetchUrl = args[0]; - fetchInit = args[1]; - } - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { - Object.keys(fetchInit).forEach(function (prop) { - fetchPropsObj[prop] = fetchInit[prop]; + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter }); + return; } - return fetchPropsObj; - } - function objectToString(obj) { - if (!obj || typeof obj !== "object") { - return String(obj); + var currentValue = base[prop]; + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { + currentValue = base[prop]; + origDescriptor = undefined; } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); + var descriptorWrapper = Object.assign(getDescriptorAddon(), { + currentValue, + get() { + if (!this.isAbortingSuspended) { + this.isolateCallback(abort); + } + if (origDescriptor instanceof Object) { + return origDescriptor.get.call(base); + } + return this.currentValue; + }, + set(newValue) { + if (!this.isAbortingSuspended) { + this.isolateCallback(abort); + } + if (origDescriptor instanceof Object) { + origDescriptor.set.call(base, newValue); + } else { + this.currentValue = newValue; + } } - return "".concat(key, ':"').concat(recordValueStr, '"'); - }).join(" "); - } - function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { - return; - } - const response = new Response(responseBody, { - status: 200, - statusText: "OK" }); - Object.defineProperties(response, { - url: { - value: responseUrl + setPropertyAccess(base, prop, { + // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values + get() { + return descriptorWrapper.get.call(descriptorWrapper); }, - type: { - value: responseType + set(newValue) { + descriptorWrapper.set.call(descriptorWrapper, newValue); } }); - return Promise.resolve(response); - } - function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === "" || propsToMatch === "*") { - return true; - } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; - } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + abortCurrentInlineScript$1.names = ['abort-current-inline-script', + // aliases are needed for matching the related scriptlet converted into our syntax + 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js', + // "ubo"-aliases with no "js"-ending + 'ubo-abort-current-script', 'ubo-acs', + // obsolete but supported aliases + 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script']; + abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-constant + * + * @description + * Creates a constant property and assigns it one of the values from the predefined list. + * + * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type. + * + * > If empty object is present in chain it will be trapped until chain leftovers appear. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#set-constantjs- + * + * Related ABP snippet: + * https://github.com/adblockplus/adblockpluscore/blob/adblockpluschrome-3.9.4/lib/content/snippets.js#L1361 + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-constant', property, value[, stack]) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`. + * - `value` — required. Possible values: + * - positive decimal integer `<= 32767` + * - one of the predefined constants: + * - `undefined` + * - `false` + * - `true` + * - `null` + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `noopFunc` — function with empty body + * - `noopCallbackFunc` — function returning noopFunc + * - `trueFunc` — function returning true + * - `falseFunc` — function returning false + * - `throwFunc` — function throwing an error + * - `noopPromiseResolve` — function returning Promise object that is resolved with an empty response + * - `noopPromiseReject` — function returning Promise.reject() + * - `''` — empty string + * - `-1` — number value `-1` + * - `yes` + * - `no` + * - `stack` — string or regular expression that must match the current function call stack trace, + * defaults to matching every call; if regular expression is invalid, it will be skipped + * - `valueWrapper` – optional, string to modify a value to be set. Possible wrappers: + * - `asFunction` – function returning value + * - `asCallback` – function returning callback, that would return value + * - `asResolved` – Promise that would resolve with value + * - `asRejected` – Promise that would reject with value + * + * ### Examples + * + * ```adblock + * ! Any access to `window.first` will return `false` + * example.org#%#//scriptlet('set-constant', 'first', 'false') + * + * ✔ window.first === false + * ``` + * + * ```adblock + * ! Any call to `window.second()` will return `true` + * example.org#%#//scriptlet('set-constant', 'second', 'trueFunc') + * + * ✔ window.second() === true + * ✔ window.second.toString() === "function trueFunc() {return true;}" + * ``` + * + * ```adblock + * ! Any call to `document.third()` will return `true` if the method is related to `checking.js` + * example.org#%#//scriptlet('set-constant', 'document.third', 'trueFunc', 'checking.js') + * + * ✔ document.third() === true // if the condition described above is met + * ``` + * + * ```adblock + * ! Any call to `document.fourth()` will return `yes` + * example.org#%#//scriptlet('set-constant', 'document.fourth', 'yes', '', 'asFunction') + * + * ✔ document.fourth() === 'yes' + * ``` + * + * ```adblock + * ! Any call to `document.fifth()` will return `yes` + * example.org#%#//scriptlet('set-constant', 'document.fifth', '42', '', 'asRejected') + * + * ✔ document.fifth.catch((reason) => reason === 42) // promise rejects with specified number + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function setConstant$1(source, property, value) { + var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; + var uboAliases = ['set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set']; + + /** + * UBO set-constant analog has it's own args sequence: + * (property, value, defer | wrapper) + * 'defer' – a stringified number, which defines execution time, or + * 'wrapper' - string which defines value wrapper name + * + * joysound.com##+js(set, document.body.oncopy, null, 3) + * kompetent.de##+js(set, Object.keys, 42, asFunction) + */ + if (uboAliases.includes(source.name)) { + /** + * Check that third argument was intended as 'valueWrapper' argument, + * by excluding 'defer' single digits case, and move it to 'valueWrapper' + */ + if (stack.length !== 1 && !getNumberFromString(stack)) { + valueWrapper = stack; } - return isMatched; + /** + * ubo doesn't support 'stack', while adg doesn't support 'defer' + * that goes in the same spot, so we discard it + */ + stack = undefined; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { + if (!property || !matchStackTrace(stack, new Error().stack)) { + return; + } + var emptyArr = noopArray(); + var emptyObj = noopObject(); + var constantValue; + if (value === 'undefined') { + constantValue = undefined; + } else if (value === 'false') { + constantValue = false; + } else if (value === 'true') { + constantValue = true; + } else if (value === 'null') { + constantValue = null; + } else if (value === 'emptyArr') { + constantValue = emptyArr; + } else if (value === 'emptyObj') { + constantValue = emptyObj; + } else if (value === 'noopFunc') { + constantValue = noopFunc; + } else if (value === 'noopCallbackFunc') { + constantValue = noopCallbackFunc; + } else if (value === 'trueFunc') { + constantValue = trueFunc; + } else if (value === 'falseFunc') { + constantValue = falseFunc; + } else if (value === 'throwFunc') { + constantValue = throwFunc; + } else if (value === 'noopPromiseResolve') { + constantValue = noopPromiseResolve; + } else if (value === 'noopPromiseReject') { + constantValue = noopPromiseReject; + } else if (/^\d+$/.test(value)) { + constantValue = parseFloat(value); + if (nativeIsNaN(constantValue)) { return; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + if (Math.abs(constantValue) > 32767) { return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + } else if (value === '-1') { + constantValue = -1; + } else if (value === '') { + constantValue = ''; + } else if (value === 'yes') { + constantValue = 'yes'; + } else if (value === 'no') { + constantValue = 'no'; + } else { + return; } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); + var valueWrapperNames = ['asFunction', 'asCallback', 'asResolved', 'asRejected']; + if (valueWrapperNames.includes(valueWrapper)) { + var valueWrappersMap = { + asFunction(v) { + return function () { + return v; + }; + }, + asCallback(v) { + return function () { + return function () { + return v; + }; + }; + }, + asResolved(v) { + return Promise.resolve(v); + }, + asRejected(v) { + return Promise.reject(v); + } + }; + constantValue = valueWrappersMap[valueWrapper](constantValue); } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); + var canceled = false; + var mustCancel = function mustCancel(value) { + if (canceled) { + return canceled; } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; + canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; + return canceled; + }; + + /** + * Safely sets property on a given object + * + * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} base arbitrary reachable object + * @param {string} prop property name + * @param {boolean} configurable if set property should be configurable + * @param {object} handler custom property descriptor object + * @returns {boolean} true if prop was trapped successfully + */ + var trapProp = function trapProp(base, prop, configurable, handler) { + if (!handler.init(base[prop])) { + return false; } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getRequestData(request) { - const requestInitOptions = getRequestProps(); - const entries = requestInitOptions.map(function (key) { - const value = request[key]; - return [key, value]; - }); - return getObjectFromEntries(entries); - } - function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - } - function getObjectFromEntries(entries) { - const output = entries.reduce(function (acc, el) { - const key = el[0]; - const value = el[1]; - acc[key] = value; - return acc; - }, {}); - return output; - } - function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); - props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); - propsObj[key] = value; - } else { - propsObj.url = prop; + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + // This is required to prevent scriptlets overwrite each over + if (origDescriptor instanceof Object) { + // This check is required to avoid defining non-configurable props + if (!origDescriptor.configurable) { + var message = "Property '".concat(prop, "' is not configurable"); + logMessage(source, message); + return false; } - }); - return propsObj; - } - function validateParsedData(data) { - return Object.values(data).every(function (value) { - return isValidStrPattern(value); - }); - } - function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { - matchData[key] = toRegExp(data[key]); - }); - return matchData; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventFetch.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function preventPopadsNet(source, args) { - function preventPopadsNet(source) { - const rid = randomId(); - const throwError = function throwError() { - throw new ReferenceError(rid); - }; - delete window.PopAds; - delete window.popns; - Object.defineProperties(window, { - PopAds: { - set: throwError + base[prop] = constantValue; + if (origDescriptor.set instanceof Function) { + prevSetter = origDescriptor.set; + } + } + Object.defineProperty(base, prop, { + configurable, + get() { + return handler.get(); }, - popns: { - set: throwError + set(a) { + if (prevSetter !== undefined) { + prevSetter(a); + } + handler.set(a); } }); - window.onerror = createOnErrorHandler(rid).bind(); - hit(source); - } - function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; - return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + return true; + }; + + /** + * Traverses given chain to set constant value to its end prop + * Chains that yet include non-object values (e.g null) are valid and will be + * traversed when appropriate chain member is set by an external script + * + * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} owner object that owns chain + * @param {string} property chain of owner properties + */ + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + + // Handler method init is used to keep track of factual value + // and apply mustCancel() check only on end prop + var inChainPropHandler = { + factValue: undefined, + init(a) { + this.factValue = a; return true; - } - if (nativeOnError instanceof Function) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return nativeOnError.apply(this, [error, ...args]); - } - return false; - }; - } - function randomId() { - return Math.random().toString(36).slice(2, 9); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + }, + get() { + return this.factValue; + }, + set(a) { + // Prevent breakage due to loop assignments like win.obj = win.obj + if (this.factValue === a) { + return; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventPopadsNet.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function preventRefresh(source, args) { - function preventRefresh(source, delaySec) { - const getMetaElements = function getMetaElements() { - let metaNodes = []; - try { - metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); - } catch (e) { - try { - metaNodes = document.querySelectorAll('meta[http-equiv="refresh"][content]'); - } catch (e) { - logMessage(source, e); + this.factValue = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); } } - return Array.from(metaNodes); }; - const getMetaContentDelay = function getMetaContentDelay(metaElements) { - const delays = metaElements.map(function (meta) { - const contentString = meta.getAttribute("content"); - if (contentString.length === 0) { - return null; + var endPropHandler = { + init(a) { + if (mustCancel(a)) { + return false; } - let contentDelay; - const limiterIndex = contentString.indexOf(";"); - if (limiterIndex !== -1) { - const delaySubstring = contentString.substring(0, limiterIndex); - contentDelay = getNumberFromString(delaySubstring); - } else { - contentDelay = getNumberFromString(contentString); + return true; + }, + get() { + return constantValue; + }, + set(a) { + if (!mustCancel(a)) { + return; } - return contentDelay; - }).filter(function (delay) { - return delay !== null; - }); - if (!delays.length) { - return null; + constantValue = a; } - const minDelay = delays.reduce(function (a, b) { - return Math.min(a, b); - }); - return minDelay; }; - const stop = function stop() { - const metaElements = getMetaElements(); - if (metaElements.length === 0) { - return; - } - let secondsToRun = getNumberFromString(delaySec); - if (secondsToRun === null) { - secondsToRun = getMetaContentDelay(metaElements); - } - if (secondsToRun === null) { - return; - } - const delayMs = secondsToRun * 1e3; - setTimeout(function () { - window.stop(); + + // End prop case + if (!chain) { + var isTrapped = trapProp(base, prop, false, endPropHandler); + if (isTrapped) { hit(source); - }, delayMs); - }; - if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", stop, { - once: true - }); - } else { - stop(); - } - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function getNumberFromString(rawString) { - const parsedDelay = parseInt(rawString, 10); - const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; - return validDelay; - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { return; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + + // Null prop in chain + if (base !== undefined && base[prop] === null) { + trapProp(base, prop, true, inChainPropHandler); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + + // Empty object prop in chain + if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { + trapProp(base, prop, true, inChainPropHandler); } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventRefresh.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + + // Defined prop in chain + var propValue = owner[prop]; + if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { + setChainPropAccess(propValue, chain); + } + + // Undefined prop in chain + trapProp(base, prop, true, inChainPropHandler); + }; + setChainPropAccess(window, property); } - function preventRequestAnimationFrame(source, args) { - function preventRequestAnimationFrame(source, match) { - const nativeRequestAnimationFrame = window.requestAnimationFrame; - const shouldLog = typeof match === "undefined"; - const _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - const rafWrapper = function rafWrapper(callback) { - let shouldPrevent = false; - if (shouldLog) { - hit(source); - logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); - } else if (isValidCallback(callback) && isValidStrPattern(match)) { - shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; - } - if (shouldPrevent) { - hit(source); - return nativeRequestAnimationFrame(noopFunc); + setConstant$1.names = ['set-constant', + // aliases are needed for matching the related scriptlet converted into our syntax + 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read']; + setConstant$1.injections = [hit, logMessage, getNumberFromString, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, matchStackTrace, nativeIsNaN, isEmptyObject, + // following helpers should be imported and injected + // because they are used by helpers above + shouldAbortInlineOrInjectedScript, getNativeRegexpTest, setPropertyAccess, toRegExp]; + + /* eslint-disable max-len */ + /** + * @scriptlet remove-cookie + * + * @description + * Removes current page cookies by passed string matching with name. For current domain and subdomains. + * Runs on load and before unload. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#cookie-removerjs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/cookie-remover.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-cookie'[, match]) + * ``` + * + * - `match` — optional, string or regex matching the cookie name. + * If not specified all accessible cookies will be removed. + * + * ### Examples + * + * 1. Removes all cookies + * + * ```adblock + * example.org#%#//scriptlet('remove-cookie') + * ``` + * + * 1. Removes cookies which name contains `example` string + * + * ```adblock + * example.org#%#//scriptlet('remove-cookie', 'example') + * ``` + * + * For instance this cookie will be removed: + * + * ```javascript + * document.cookie = '__example=randomValue'; + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function removeCookie$1(source, match) { + var matchRegexp = toRegExp(match); + var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { + var cookieSpec = "".concat(cookieName, "="); + var domain1 = "; domain=".concat(hostName); + var domain2 = "; domain=.".concat(hostName); + var path = '; path=/'; + var expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT'; + document.cookie = cookieSpec + expiration; + document.cookie = cookieSpec + domain1 + expiration; + document.cookie = cookieSpec + domain2 + expiration; + document.cookie = cookieSpec + path + expiration; + document.cookie = cookieSpec + domain1 + path + expiration; + document.cookie = cookieSpec + domain2 + path + expiration; + hit(source); + }; + var rmCookie = function rmCookie() { + document.cookie.split(';').forEach(function (cookieStr) { + var pos = cookieStr.indexOf('='); + if (pos === -1) { + return; } - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; + var cookieName = cookieStr.slice(0, pos).trim(); + if (!matchRegexp.test(cookieName)) { + return; } - return nativeRequestAnimationFrame.apply(window, [callback, ...args]); - }; - window.requestAnimationFrame = rafWrapper; - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + var hostParts = document.location.hostname.split('.'); + for (var i = 0; i <= hostParts.length - 1; i += 1) { + var hostName = hostParts.slice(i).join('.'); + if (hostName) { + removeCookieFromHost(cookieName, hostName); } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function noopFunc() {} - function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); - return { - isInvertedMatch: isInvertedMatch, - matchRegexp: matchRegexp, - matchValue: matchValue - }; - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); - } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; + }); + }; + rmCookie(); + window.addEventListener('beforeunload', rmCookie); + } + removeCookie$1.names = ['remove-cookie', + // aliases are needed for matching the related scriptlet converted into our syntax + 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover']; + removeCookie$1.injections = [toRegExp, hit]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-addEventListener + * + * @description + * Prevents adding event listeners for the specified events and callbacks. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-defuserjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-addEventListener'[, typeSearch[, listenerSearch]]) + * ``` + * + * - `typeSearch` — optional, string or regular expression matching the type (event name); + * defaults to match all types; invalid regular expression will cause exit and rule will not work + * - `listenerSearch` — optional, string or regular expression matching the listener function body; + * defaults to match all listeners; invalid regular expression will cause exit and rule will not work + * + * ### Examples + * + * 1. Prevent all `click` listeners + * + * ```adblock + * example.org#%#//scriptlet('prevent-addEventListener', 'click') + * ``` + * + * 1. Prevent 'click' listeners with the callback body containing `searchString` + * + * ```adblock + * example.org#%#//scriptlet('prevent-addEventListener', 'click', 'searchString') + * ``` + * + * For instance, this listener will not be called: + * + * ```javascript + * el.addEventListener('click', () => { + * window.test = 'searchString'; + * }); + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function preventAddEventListener$1(source, typeSearch, listenerSearch) { + var typeSearchRegexp = toRegExp(typeSearch); + var listenerSearchRegexp = toRegExp(listenerSearch); + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; + function addEventListenerWrapper(type, listener) { + var _this$constructor; + var shouldPrevent = false; + if (validateType(type) && validateListener(listener)) { + shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); } - return isValid; - } - function isValidCallback(callback) { - return callback instanceof Function || typeof callback === "string"; - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + if (shouldPrevent) { + hit(source); + return undefined; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; } - nativeConsole(messageStr); - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return nativeAddEventListener.apply(context, [type, listener, ...args]); } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var descriptor = { + configurable: true, + set: function set() {}, + get: function get() { + return addEventListenerWrapper; } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventRequestAnimationFrame.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 + // https://github.com/AdguardTeam/Scriptlets/issues/143 + Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); + Object.defineProperty(window, 'addEventListener', descriptor); + Object.defineProperty(document, 'addEventListener', descriptor); } - function preventSetInterval(source, args) { - function preventSetInterval(source, matchCallback, matchDelay) { - const shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; - if (shouldLog) { - hit(source); - logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); - } else { - shouldPrevent = isPreventionNeeded({ - callback: callback, - delay: delay, - matchCallback: matchCallback, - matchDelay: matchDelay - }); - } - if (shouldPrevent) { - hit(source); - args[0] = noopFunc; + preventAddEventListener$1.names = ['prevent-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax + 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld']; + preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString]; + + /* eslint-disable consistent-return, no-eval */ + + /** + * @scriptlet prevent-bab + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#bab-defuserjs- + * + * It also can be used as `$redirect` sometimes. + * See [redirect description](../wiki/about-redirects.md#prevent-bab). + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-bab') + * ``` + * + * @added v1.0.4. + */ + function preventBab$2(source) { + var nativeSetTimeout = window.setTimeout; + var babRegex = /\.bab_elementid.$/; + var timeoutWrapper = function timeoutWrapper(callback) { + if (typeof callback !== 'string' || !babRegex.test(callback)) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; } - return target.apply(thisArg, args); - }; - const setIntervalHandler = { - apply: handlerWrapper - }; - window.setInterval = new Proxy(window.setInterval, setIntervalHandler); - } - function hit(source) { - if (source.verbose !== true) { - return; + return nativeSetTimeout.apply(window, [callback, ...args]); } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + hit(source); + }; + window.setTimeout = timeoutWrapper; + var signatures = [['blockadblock'], ['babasbm'], [/getItem\('babn'\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']]; + var check = function check(str) { + if (typeof str !== 'string') { + return false; + } + for (var i = 0; i < signatures.length; i += 1) { + var tokens = signatures[i]; + var match = 0; + for (var j = 0; j < tokens.length; j += 1) { + var token = tokens[j]; + var found = token instanceof RegExp ? token.test(str) : str.includes(token); + if (found) { + match += 1; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + if (match / tokens.length >= 0.8) { + return true; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function noopFunc() {} - function isPreventionNeeded(_ref) { - let callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - if (!isValidCallback(callback)) { - return false; } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { - return false; - } - const _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - const _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - const parsedDelay = parseRawDelay(delay); - let shouldPrevent = false; - const callbackStr = String(callback); - if (delayMatch === null) { - shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; - } else if (!matchCallback) { - shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch; - } else { - shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch; - } - return shouldPrevent; - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + return false; + }; + var nativeEval = window.eval; + var evalWrapper = function evalWrapper(str) { + if (!check(str)) { + return nativeEval(str); } - nativeConsole(messageStr); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + hit(source); + var bodyEl = document.body; + if (bodyEl) { + bodyEl.style.removeProperty('visibility'); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var el = document.getElementById('babasbmsgx'); + if (el) { + el.parentNode.removeChild(el); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); - return { - isInvertedMatch: isInvertedMatch, - matchRegexp: matchRegexp, - matchValue: matchValue - }; + }; + window.eval = evalWrapper.bind(window); + } + preventBab$2.names = ['prevent-bab' + // there is no aliases for this scriptlet + ]; + + preventBab$2.injections = [hit]; + + /* eslint-disable no-unused-vars, no-extra-bind, func-names */ + + /* eslint-disable max-len */ + /** + * @scriptlet nowebrtc + * + * @description + * Disables WebRTC by overriding `RTCPeerConnection`. + * The overridden function will log every attempt to create a new connection. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#nowebrtcjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('nowebrtc') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function nowebrtc$1(source) { + var propertyName = ''; + if (window.RTCPeerConnection) { + propertyName = 'RTCPeerConnection'; + } else if (window.webkitRTCPeerConnection) { + propertyName = 'webkitRTCPeerConnection'; } - function parseDelayArg(delay) { - const INVERT_MARKER = "!"; - const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); - let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; - delayValue = parseInt(delayValue, 10); - const delayMatch = nativeIsNaN(delayValue) ? null : delayValue; - return { - isInvertedDelayMatch: isInvertedDelayMatch, - delayMatch: delayMatch - }; + if (propertyName === '') { + return; } - function isValidCallback(callback) { - return callback instanceof Function || typeof callback === "string"; + var rtcReplacement = function rtcReplacement(config) { + // eslint-disable-next-line max-len + var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); + logMessage(source, message); + hit(source); + }; + rtcReplacement.prototype = { + close: noopFunc, + createDataChannel: noopFunc, + createOffer: noopFunc, + setRemoteDescription: noopFunc + }; + var rtc = window[propertyName]; + window[propertyName] = rtcReplacement; + if (rtc.prototype) { + rtc.prototype.createDataChannel = function (a, b) { + return { + close: noopFunc, + send: noopFunc + }; + }.bind(null); } - function isValidMatchStr(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { - str = match.slice(1); + } + nowebrtc$1.names = ['nowebrtc', + // aliases are needed for matching the related scriptlet converted into our syntax + 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc']; + nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString]; + + /** + * @scriptlet log-addEventListener + * + * @description + * Logs all addEventListener calls to the console. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-loggerjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('log-addEventListener') + * ``` + * + * @added v1.0.4. + */ + function logAddEventListener$1(source) { + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; + function addEventListenerWrapper(type, listener) { + var _this$constructor; + if (validateType(type) && validateListener(listener)) { + var message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); + logMessage(source, message, true); + hit(source); + } else { + // logging while debugging + var _message = "Invalid event type or listener passed to addEventListener:\n type: ".concat(convertTypeToString(type), "\n listener: ").concat(convertTypeToString(listener)); + logMessage(source, _message, true); } - return isValidStrPattern(str); - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; } - return isValid; + return nativeAddEventListener.apply(context, [type, listener, ...args]); } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; - return native(num); - } - function isValidMatchNumber(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { - str = match.slice(1); + var descriptor = { + configurable: true, + set: function set() {}, + get: function get() { + return addEventListenerWrapper; } - const num = parseFloat(str); - return !nativeIsNaN(num) && nativeIsFinite(num); - } - function parseRawDelay(delay) { - const parsedDelay = Math.floor(parseInt(delay, 10)); - return typeof parsedDelay === "number" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventSetInterval.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 + // https://github.com/AdguardTeam/Scriptlets/issues/143 + Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); + Object.defineProperty(window, 'addEventListener', descriptor); + Object.defineProperty(document, 'addEventListener', descriptor); } - function preventSetTimeout(source, args) { - function preventSetTimeout(source, matchCallback, matchDelay) { - const shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; - if (shouldLog) { - hit(source); - logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); - } else { - shouldPrevent = isPreventionNeeded({ - callback: callback, - delay: delay, - matchCallback: matchCallback, - matchDelay: matchDelay - }); - } - if (shouldPrevent) { - hit(source); - args[0] = noopFunc; - } - return target.apply(thisArg, args); - }; - const setTimeoutHandler = { - apply: handlerWrapper - }; - window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function noopFunc() {} - function isPreventionNeeded(_ref) { - let callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - if (!isValidCallback(callback)) { - return false; - } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { - return false; - } - const _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - const _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - const parsedDelay = parseRawDelay(delay); - let shouldPrevent = false; - const callbackStr = String(callback); - if (delayMatch === null) { - shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; - } else if (!matchCallback) { - shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch; - } else { - shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch; - } - return shouldPrevent; + logAddEventListener$1.names = ['log-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax + 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell']; + logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject]; + + /* eslint-disable no-eval */ + + /** + * @scriptlet log-eval + * + * @description + * Logs all `eval()` or `new Function()` calls to the console. + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('log-eval') + * ``` + * + * @added v1.0.4. + */ + function logEval$1(source) { + // wrap eval function + var nativeEval = window.eval; + function evalWrapper(str) { + hit(source); + logMessage(source, "eval(\"".concat(str, "\")"), true); + return nativeEval(str); } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + window.eval = evalWrapper; + + // wrap new Function + var nativeFunction = window.Function; + function FunctionWrapper() { + hit(source); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; } - nativeConsole(messageStr); - } - function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); - return { - isInvertedMatch: isInvertedMatch, - matchRegexp: matchRegexp, - matchValue: matchValue - }; + logMessage(source, "new Function(".concat(args.join(', '), ")"), true); + return nativeFunction.apply(this, [...args]); } - function parseDelayArg(delay) { - const INVERT_MARKER = "!"; - const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); - let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; - delayValue = parseInt(delayValue, 10); - const delayMatch = nativeIsNaN(delayValue) ? null : delayValue; - return { - isInvertedDelayMatch: isInvertedDelayMatch, - delayMatch: delayMatch - }; + FunctionWrapper.prototype = Object.create(nativeFunction.prototype); + FunctionWrapper.prototype.constructor = FunctionWrapper; + window.Function = FunctionWrapper; + } + logEval$1.names = ['log-eval']; + logEval$1.injections = [hit, logMessage]; + + /** + * @scriptlet log + * + * @description + * A simple scriptlet which only purpose is to print arguments to console. + * This scriptlet can be helpful for debugging and troubleshooting other scriptlets. + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('log', 'arg1', 'arg2') + * ``` + * + * @added v1.0.4. + */ + function log$1() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + console.log(args); // eslint-disable-line no-console + } + + log$1.names = ['log']; + + /* eslint-disable no-eval, no-extra-bind */ + + /** + * @scriptlet noeval + * + * @description + * Prevents page to use eval. + * Notifies about attempts in the console + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#noevaljs- + * + * It also can be used as `$redirect` rules sometimes. + * See [redirect description](../wiki/about-redirects.md#noeval). + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('noeval') + * ``` + * + * @added v1.0.4. + */ + function noeval$1(source) { + window.eval = function evalWrapper(s) { + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); + }.bind(); + } + noeval$1.names = ['noeval', + // aliases are needed for matching the related scriptlet converted into our syntax + 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval']; + noeval$1.injections = [hit, logMessage]; + + /* eslint-disable no-eval, no-extra-bind, func-names */ + + + /** + * @scriptlet prevent-eval-if + * + * @description + * Prevents page to use eval matching payload. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#noeval-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-eval-if'[, search]) + * ``` + * + * - `search` — optional, string or regular expression matching the stringified eval payload; + * defaults to match all stringified eval payloads; + * invalid regular expression will cause exit and rule will not work + * + * ### Examples + * + * ```adblock + * ! Prevents eval if it matches 'test' + * example.org#%#//scriptlet('prevent-eval-if', 'test') + * ``` + * + * @added v1.0.4. + */ + function preventEvalIf$1(source, search) { + var searchRegexp = toRegExp(search); + var nativeEval = window.eval; + window.eval = function (payload) { + if (!searchRegexp.test(payload.toString())) { + return nativeEval.call(window, payload); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function isValidCallback(callback) { - return callback instanceof Function || typeof callback === "string"; - } - function isValidMatchStr(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { - str = match.slice(1); + hit(source); + return undefined; + }.bind(window); + } + preventEvalIf$1.names = ['prevent-eval-if', + // aliases are needed for matching the related scriptlet converted into our syntax + 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if']; + preventEvalIf$1.injections = [toRegExp, hit]; + + /* eslint-disable func-names, no-multi-assign */ + + /** + * @scriptlet prevent-fab-3.2.0 + * + * @description + * Prevents execution of the FAB script v3.2.0. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#fuckadblockjs-320- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-fab-3.2.0') + * ``` + * + * @added v1.0.4. + */ + function preventFab$1(source) { + hit(source); + + // redefines Fab function for adblock detection + var Fab = function Fab() {}; + Fab.prototype.check = noopFunc; + Fab.prototype.clearEvent = noopFunc; + Fab.prototype.emitEvent = noopFunc; + Fab.prototype.on = function (a, b) { + if (!a) { + b(); } - return isValidStrPattern(str); - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return this; + }; + Fab.prototype.onDetected = noopThis; + Fab.prototype.onNotDetected = function (a) { + a(); + return this; + }; + Fab.prototype.setOption = noopFunc; + Fab.prototype.options = { + set: noopFunc, + get: noopFunc + }; + var fab = new Fab(); + var getSetFab = { + get() { + return Fab; + }, + set() {} + }; + var getsetfab = { + get() { + return fab; + }, + set() {} + }; + + // redefined Fab data properties which if 'FuckAdBlock' variable exists + if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) { + window.FuckAdBlock = Fab; + } else { + // or redefined Fab accessor properties + Object.defineProperty(window, 'FuckAdBlock', getSetFab); } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); - } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; - } - return isValid; + if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) { + window.BlockAdBlock = Fab; + } else { + Object.defineProperty(window, 'BlockAdBlock', getSetFab); } - function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; - return native(num); + if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) { + window.SniffAdBlock = Fab; + } else { + Object.defineProperty(window, 'SniffAdBlock', getSetFab); } - function isValidMatchNumber(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { - str = match.slice(1); - } - const num = parseFloat(str); - return !nativeIsNaN(num) && nativeIsFinite(num); + if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) { + window.fuckAdBlock = fab; + } else { + Object.defineProperty(window, 'fuckAdBlock', getsetfab); } - function parseRawDelay(delay) { - const parsedDelay = Math.floor(parseInt(delay, 10)); - return typeof parsedDelay === "number" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; + if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) { + window.blockAdBlock = fab; + } else { + Object.defineProperty(window, 'blockAdBlock', getsetfab); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventSetTimeout.apply(this, updatedArgs); - } catch (e) { - console.log(e); + if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) { + window.sniffAdBlock = fab; + } else { + Object.defineProperty(window, 'sniffAdBlock', getsetfab); } } - function preventWindowOpen(source, args) { - function preventWindowOpen(source) { - let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "*"; - let delay = arguments.length > 2 ? arguments[2] : undefined; - let replacement = arguments.length > 3 ? arguments[3] : undefined; - const nativeOpen = window.open; - const isNewSyntax = match !== "0" && match !== "1"; - const oldOpenWrapper = function oldOpenWrapper(str) { - match = Number(match) > 0; - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - if (!isValidStrPattern(delay)) { - logMessage(source, "Invalid parameter: ".concat(delay)); - return nativeOpen.apply(window, [str, ...args]); - } - const searchRegexp = toRegExp(delay); - if (match !== searchRegexp.test(str)) { - return nativeOpen.apply(window, [str, ...args]); - } - hit(source); - return handleOldReplacement(replacement); - }; - const newOpenWrapper = function newOpenWrapper(url) { - const shouldLog = replacement && replacement.indexOf("log") > -1; - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - if (shouldLog) { - const argsStr = args && args.length > 0 ? ", ".concat(args.join(", ")) : ""; - const message = "".concat(url).concat(argsStr); - logMessage(source, message, true); + preventFab$1.names = ['prevent-fab-3.2.0', + // aliases are needed for matching the related scriptlet converted into our syntax + 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab']; + preventFab$1.injections = [hit, noopFunc, noopThis]; + + /* eslint-disable func-names, no-multi-assign */ + + /** + * @scriptlet set-popads-dummy + * + * @description + * Sets static properties PopAds and popns. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#popads-dummyjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('set-popads-dummy') + * ``` + * + * @added v1.0.4. + */ + function setPopadsDummy$1(source) { + delete window.PopAds; + delete window.popns; + Object.defineProperties(window, { + PopAds: { + get: function get() { hit(source); + return {}; } - let shouldPrevent = false; - if (match === "*") { - shouldPrevent = true; - } else if (isValidMatchStr(match)) { - const _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; - } else { - logMessage(source, "Invalid parameter: ".concat(match)); - shouldPrevent = false; - } - if (shouldPrevent) { - const parsedDelay = parseInt(delay, 10); - let result; - if (nativeIsNaN(parsedDelay)) { - result = noopNull(); - } else { - const decoyArgs = { - replacement: replacement, - url: url, - delay: parsedDelay - }; - const decoy = createDecoy(decoyArgs); - let popup = decoy.contentWindow; - if (typeof popup === "object" && popup !== null) { - Object.defineProperty(popup, "closed", { - value: false - }); - Object.defineProperty(popup, "opener", { - value: window - }); - Object.defineProperty(popup, "frameElement", { - value: null - }); - } else { - const nativeGetter = decoy.contentWindow && decoy.contentWindow.get; - Object.defineProperty(decoy, "contentWindow", { - get: getPreventGetter(nativeGetter) - }); - popup = decoy.contentWindow; - } - result = popup; - } + }, + popns: { + get: function get() { hit(source); - return result; - } - return nativeOpen.apply(window, [url, ...args]); - }; - window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; - window.open.toString = nativeOpen.toString.bind(nativeOpen); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + return {}; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); } - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); + }); + } + setPopadsDummy$1.names = ['set-popads-dummy', + // aliases are needed for matching the related scriptlet converted into our syntax + 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy']; + setPopadsDummy$1.injections = [hit]; + + /** + * @scriptlet prevent-popads-net + * + * @description + * Aborts on property write (PopAds, popns), throws reference error with random id. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#popadsnetjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-popads-net') + * ``` + * + * @added v1.0.4. + */ + function preventPopadsNet$1(source) { + var rid = randomId(); + var throwError = function throwError() { + throw new ReferenceError(rid); + }; + delete window.PopAds; + delete window.popns; + Object.defineProperties(window, { + PopAds: { + set: throwError + }, + popns: { + set: throwError } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; - } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function isValidMatchStr(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { - str = match.slice(1); - } - return isValidStrPattern(str); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + }); + window.onerror = createOnErrorHandler(rid).bind(); + hit(source); + } + preventPopadsNet$1.names = ['prevent-popads-net', + // aliases are needed for matching the related scriptlet converted into our syntax + 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net']; + preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit]; + + /* eslint-disable func-names */ + + /** + * @scriptlet prevent-adfly + * + * @description + * Prevents anti-adblock scripts on adfly short links. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#adfly-defuserjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-adfly') + * ``` + * + * @added v1.0.4. + */ + function preventAdfly$1(source) { + var isDigit = function isDigit(data) { + return /^\d$/.test(data); + }; + var handler = function handler(encodedURL) { + var evenChars = ''; + var oddChars = ''; + for (var i = 0; i < encodedURL.length; i += 1) { + if (i % 2 === 0) { + evenChars += encodedURL.charAt(i); + } else { + oddChars = encodedURL.charAt(i) + oddChars; + } } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); - return { - isInvertedMatch: isInvertedMatch, - matchRegexp: matchRegexp, - matchValue: matchValue - }; - } - function handleOldReplacement(replacement) { - let result; - if (!replacement) { - result = noopFunc; - } else if (replacement === "trueFunc") { - result = trueFunc; - } else if (replacement.indexOf("=") > -1) { - const isProp = startsWith(replacement, "{") && endsWith(replacement, "}"); - if (isProp) { - const propertyPart = replacement.slice(1, -1); - const propertyName = substringBefore(propertyPart, "="); - const propertyValue = substringAfter(propertyPart, "="); - if (propertyValue === "noopFunc") { - result = {}; - result[propertyName] = noopFunc; + var data = (evenChars + oddChars).split(''); + for (var _i = 0; _i < data.length; _i += 1) { + if (isDigit(data[_i])) { + for (var ii = _i + 1; ii < data.length; ii += 1) { + if (isDigit(data[ii])) { + // eslint-disable-next-line no-bitwise + var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); + if (temp < 10) { + data[_i] = temp.toString(); + } + _i = ii; + break; + } } } } - return result; - } - function createDecoy(args) { - const OBJECT_TAG_NAME = "object"; - const OBJECT_URL_PROP_NAME = "data"; - const IFRAME_TAG_NAME = "iframe"; - const IFRAME_URL_PROP_NAME = "src"; - const replacement = args.replacement, - url = args.url, - delay = args.delay; - let tag; - let urlProp; - if (replacement === "obj") { - tag = OBJECT_TAG_NAME; - urlProp = OBJECT_URL_PROP_NAME; - } else { - tag = IFRAME_TAG_NAME; - urlProp = IFRAME_URL_PROP_NAME; + data = data.join(''); + var decodedURL = window.atob(data).slice(16, -16); + if (window.stop) { + window.stop(); } - const decoy = document.createElement(tag); - decoy[urlProp] = url; - decoy.style.setProperty("height", "1px", "important"); - decoy.style.setProperty("position", "fixed", "important"); - decoy.style.setProperty("top", "-1px", "important"); - decoy.style.setProperty("width", "1px", "important"); - document.body.appendChild(decoy); - setTimeout(function () { - return decoy.remove(); - }, delay * 1e3); - return decoy; - } - function getPreventGetter(nativeGetter) { - const preventGetter = function preventGetter(target, prop) { - if (prop && prop === "closed") { - return false; - } - if (typeof nativeGetter === "function") { - return noopFunc; + window.onbeforeunload = null; + window.location.href = decodedURL; + }; + var val; + // Do not apply handler more than one time + var applyHandler = true; + var result = setPropertyAccess(window, 'ysmm', { + configurable: false, + set: function set(value) { + if (applyHandler) { + applyHandler = false; + try { + if (typeof value === 'string') { + handler(value); + } + } catch (err) {} // eslint-disable-line no-empty } - return prop && target[prop]; - }; - return preventGetter; + + val = value; + }, + get: function get() { + return val; + } + }); + if (result) { + hit(source); + } else { + logMessage(source, 'Failed to set up prevent-adfly scriptlet'); } - function noopNull() { - return null; + } + preventAdfly$1.names = ['prevent-adfly', + // aliases are needed for matching the related scriptlet converted into our syntax + 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser']; + preventAdfly$1.injections = [setPropertyAccess, hit, logMessage]; + + /* eslint-disable max-len */ + /** + * @scriptlet debug-on-property-read + * + * @description + * This scriptlet is basically the same as [abort-on-property-read](#abort-on-property-read), + * but instead of aborting it starts the debugger. + * + * > It is not allowed for prod versions of filter lists. + * + * ### Examples + * + * ```adblock + * ! Debug script if it tries to access `window.alert` + * example.org#%#//scriptlet('debug-on-property-read', 'alert') + * + * ! or `window.open` + * example.org#%#//scriptlet('debug-on-property-read', 'open') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function debugOnPropertyRead$1(source, property) { + if (!property) { + return; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { + var rid = randomId(); + var abort = function abort() { + hit(source); + debugger; // eslint-disable-line no-debugger + }; + + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); return; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + setPropertyAccess(base, prop, { + get: abort, + set: noopFunc + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + debugOnPropertyRead$1.names = ['debug-on-property-read']; + debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet debug-on-property-write + * + * @description + * This scriptlet is basically the same as [abort-on-property-write](#abort-on-property-write), + * but instead of aborting it starts the debugger. + * + * > It is not allowed for prod versions of filter lists. + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to write in property `window.test` + * example.org#%#//scriptlet('debug-on-property-write', 'test') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function debugOnPropertyWrite$1(source, property) { + if (!property) { + return; + } + var rid = randomId(); + var abort = function abort() { + hit(source); + debugger; // eslint-disable-line no-debugger + }; + + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + setPropertyAccess(base, prop, { + set: abort + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + debugOnPropertyWrite$1.names = ['debug-on-property-write']; + debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet debug-current-inline-script + * + * @description + * This scriptlet is basically the same as [abort-current-inline-script](#abort-current-inline-script), + * but instead of aborting it starts the debugger. + * + * > It is not allowed for prod versions of filter lists. + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to access `window.alert` + * example.org#%#//scriptlet('debug-current-inline-script', 'alert') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function debugCurrentInlineScript$1(source, property, search) { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var getCurrentScript = function getCurrentScript() { + if ('currentScript' in document) { + return document.currentScript; } - nativeConsole(messageStr); - } - function noopFunc() {} - function trueFunc() { - return true; - } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } - function endsWith(str, ending) { - return !!str && str.lastIndexOf(ending) === str.length - ending.length; - } - function substringBefore(str, separator) { - if (!str || !separator) { - return str; + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + }; + var ourScript = getCurrentScript(); + var abort = function abort() { + var scriptEl = getCurrentScript(); + if (!scriptEl) { + return; } - const index = str.indexOf(separator); - return index < 0 ? str : str.substring(0, index); - } - function substringAfter(str, separator) { - if (!str) { - return str; + var content = scriptEl.textContent; + + // We are using Node.prototype.textContent property descriptor + // to get the real script content + // even when document.currentScript.textContent is replaced. + // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 + try { + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; + content = textContentGetter.call(scriptEl); + } catch (e) {} // eslint-disable-line no-empty + + if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { + hit(source); + debugger; // eslint-disable-line no-debugger } - const index = str.indexOf(separator); - return index < 0 ? "" : str.substring(index + separator.length); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventWindowOpen.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function preventXHR(source, args) { - function preventXHR(source, propsToMatch, customResponseText) { - if (typeof Proxy === "undefined") { + }; + + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + + // The scriptlet might be executed before the chain property has been created + // (for instance, document.body before the HTML body was loaded). + // In this case we're checking whether the base element exists or not + // and if not, we simply exit without overriding anything. + // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 + if (base instanceof Object === false && base === null) { + var props = property.split('.'); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + logMessage(message, source.verbose); return; } - let response = ""; - let responseText = ""; - let responseUrl; - const openWrapper = function openWrapper(target, thisArg, args) { - const xhrData = { - method: args[0], - url: args[1] - }; - responseUrl = xhrData.url; - if (typeof propsToMatch === "undefined") { - logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); - hit(source); - } else if (matchRequestProps(source, propsToMatch, xhrData)) { - thisArg.shouldBePrevented = true; - } - return Reflect.apply(target, thisArg, args); - }; - const sendWrapper = function sendWrapper(target, thisArg, args) { - if (!thisArg.shouldBePrevented) { - return Reflect.apply(target, thisArg, args); - } - if (thisArg.responseType === "blob") { - response = new Blob(); - } - if (thisArg.responseType === "arraybuffer") { - response = new ArrayBuffer(); - } - if (customResponseText) { - const randomText = generateRandomResponse(customResponseText); - if (randomText) { - responseText = randomText; - } else { - logMessage(source, "Invalid range: ".concat(customResponseText)); + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); } - } - Object.defineProperties(thisArg, { - readyState: { - value: 4, - writable: false - }, - response: { - value: response, - writable: false - }, - responseText: { - value: responseText, - writable: false - }, - responseURL: { - value: responseUrl, - writable: false - }, - responseXML: { - value: "", - writable: false - }, - status: { - value: 200, - writable: false + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; }, - statusText: { - value: "OK", - writable: false - } + set: setter }); - setTimeout(function () { - const stateEvent = new Event("readystatechange"); - thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event("load"); - thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event("loadend"); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - return undefined; - }; - const openHandler = { - apply: openWrapper - }; - const sendHandler = { - apply: sendWrapper - }; - XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); - XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); - } - function hit(source) { - if (source.verbose !== true) { return; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + var currentValue = base[prop]; + setPropertyAccess(base, prop, { + set: function set(value) { + abort(); + currentValue = value; + }, + get: function get() { + abort(); + return currentValue; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + debugCurrentInlineScript$1.names = ['debug-current-inline-script']; + debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet remove-attr + * + * @description + * Removes the specified attributes from DOM nodes. This scriptlet runs once when the page loads + * and after that periodically in order to DOM tree changes by default, + * or as specified by applying argument. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-attrjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-attr', attrs[, selector, applying]) + * ``` + * + * - `attrs` — required, attribute or list of attributes joined by '|' + * - `selector` — optional, CSS selector, specifies DOM nodes from which the attributes will be removed + * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, + * defaults to 'asap stay'; possible flags: + * - `asap` — runs as fast as possible **once** + * - `complete` — runs **once** after the whole page has been loaded + * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes + * + * ### Examples + * + * 1. Removes by attribute + * + * ```adblock + * example.org#%#//scriptlet('remove-attr', 'example|test') + * ``` + * + * ```html + * + *
Some text
+ * + * + *
Some text
+ * ``` + * + * 1. Removes with specified selector + * + * ```adblock + * example.org#%#//scriptlet('remove-attr', 'example', 'div[class="inner"]') + * ``` + * + * ```html + * + *
+ *
Some text
+ *
+ * + * + *
+ *
Some text
+ *
+ * ``` + * + * 1. Using flags + * + * ```adblock + * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function removeAttr$1(source, attrs, selector) { + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; + if (!attrs) { + return; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + attrs = attrs.split(/\s*\|\s*/); + if (!selector) { + selector = "[".concat(attrs.join('],['), "]"); + } + var rmattr = function rmattr() { + var nodes = []; + try { + nodes = [].slice.call(document.querySelectorAll(selector)); + } catch (e) { + logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + var removed = false; + nodes.forEach(function (node) { + attrs.forEach(function (attr) { + node.removeAttribute(attr); + removed = true; + }); + }); + if (removed) { + hit(source); + } + }; + var flags = parseFlags(applying); + var run = function run() { + rmattr(); + if (!flags.hasFlag(flags.STAY)) { return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + // 'true' for observing attributes + observeDOMChanges(rmattr, true); + }; + if (flags.hasFlag(flags.ASAP)) { + // https://github.com/AdguardTeam/Scriptlets/issues/245 + // Call rmattr on DOM content loaded + // to ensure that target node is present on the page + if (document.readyState === 'loading') { + window.addEventListener('DOMContentLoaded', rmattr, { + once: true + }); + } else { + rmattr(); } - nativeConsole(messageStr); } - function objectToString(obj) { - if (!obj || typeof obj !== "object") { - return String(obj); - } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); - } - return "".concat(key, ':"').concat(recordValueStr, '"'); - }).join(" "); - } - function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === "" || propsToMatch === "*") { - return true; - } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; - } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); - } - return isMatched; - } - function generateRandomResponse(customResponseText) { - let customResponse = customResponseText; - if (customResponse === "true") { - customResponse = Math.random().toString(36).slice(-10); - return customResponse; - } - customResponse = customResponse.replace("length:", ""); - const rangeRegex = /^\d+-\d+$/; - if (!rangeRegex.test(customResponse)) { - return null; - } - let rangeMin = getNumberFromString(customResponse.split("-")[0]); - let rangeMax = getNumberFromString(customResponse.split("-")[1]); - if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { - return null; - } - if (rangeMin > rangeMax) { - const temp = rangeMin; - rangeMin = rangeMax; - rangeMax = temp; - } - const LENGTH_RANGE_LIMIT = 500 * 1e3; - if (rangeMax > LENGTH_RANGE_LIMIT) { - return null; - } - const length = getRandomIntInclusive(rangeMin, rangeMax); - customResponse = getRandomStrByLength(length); - return customResponse; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); - } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; - } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); + if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { + window.addEventListener('load', run, { + once: true }); - return entries; - } - function getNumberFromString(rawString) { - const parsedDelay = parseInt(rawString, 10); - const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; - return validDelay; - } - function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; - return native(num); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); + } else if (flags.hasFlag(flags.STAY)) { + // Only call rmattr for single 'stay' flag + if (!applying.includes(' ')) { + rmattr(); + } + // 'true' for observing attributes + observeDOMChanges(rmattr, true); } - function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); - props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); - propsObj[key] = value; - } else { - propsObj.url = prop; - } - }); - return propsObj; + } + removeAttr$1.names = ['remove-attr', + // aliases are needed for matching the related scriptlet converted into our syntax + 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra']; + removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage, + // following helpers should be imported and injected + // because they are used by helpers above + throttle]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-attr + * + * @description + * Sets the specified attribute on the specified elements. This scriptlet runs once when the page loads + * and after that and after that on DOM tree changes. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-attr', selector, attr[, value]) + * ``` + * + * - `selector` — required, CSS selector, specifies DOM nodes to set attributes on + * - `attr` — required, attribute to be set + * - `value` — the value to assign to the attribute, defaults to ''. Possible values: + * - `''` — empty string + * - positive decimal integer `<= 32767` + * - `true` / `false` in any case variation + * + * ### Examples + * + * 1. Set attribute by selector + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', '0') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * 1. Set attribute without value + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * 1. Set attribute value to `TRUE` + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'TRUE') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * 1. Set attribute value to `fAlse` + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'fAlse') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ + function setAttr$1(source, selector, attr) { + var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + if (!selector || !attr) { + return; } - function validateParsedData(data) { - return Object.values(data).every(function (value) { - return isValidStrPattern(value); - }); + var allowedValues = ['true', 'false']; + + // Drop strings that cant be parsed into number, negative numbers and numbers below 32767 + if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) { + return; } - function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { - matchData[key] = toRegExp(data[key]); + var setAttr = function setAttr() { + var nodes = [].slice.call(document.querySelectorAll(selector)); + var set = false; + nodes.forEach(function (node) { + node.setAttribute(attr, value); + set = true; }); - return matchData; - } - function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; - } - function getRandomIntInclusive(min, max) { - min = Math.ceil(min); - max = Math.floor(max); - return Math.floor(Math.random() * (max - min + 1) + min); - } - function getRandomStrByLength(length) { - let result = ""; - const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~"; - const charactersLength = characters.length; - for (let i = 0; i < length; i += 1) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); + if (set) { + hit(source); } - return result; + }; + setAttr(); + observeDOMChanges(setAttr, true); + } + setAttr$1.names = ['set-attr']; + setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN, + // following helpers should be imported and injected + // because they are used by helpers above + throttle]; + + /* eslint-disable max-len */ + /** + * @scriptlet remove-class + * + * @description + * Removes the specified classes from DOM nodes. This scriptlet runs once after the page loads + * and after that periodically in order to DOM tree changes. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-classjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-class', classes[, selector, applying]) + * ``` + * + * - `classes` — required, class or list of classes separated by '|' + * - `selector` — optional, CSS selector, specifies DOM nodes from which the classes will be removed. + * If there is no `selector`, each class of `classes` independently will be removed from all nodes which has one + * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, + * defaults to 'asap stay'; possible flags: + * - `asap` — runs as fast as possible **once** + * - `complete` — runs **once** after the whole page has been loaded + * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes + * + * ### Examples + * + * 1. Removes by classes + * + * ```adblock + * example.org#%#//scriptlet('remove-class', 'example|test') + * ``` + * + * ```html + * + *
Some text
+ *
Some text
+ *
Some text
+ * + * + *
Some text
+ *
Some text
+ *
Some text
+ * ``` + * + * 1. Removes with specified selector + * + * ```adblock + * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]') + * ``` + * + * ```html + * + *
+ *
Some text
+ *
+ * + * + *
+ *
Some text
+ *
+ * ``` + * + * 1. Using flags + * + * ```adblock + * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]', 'asap complete') + * ``` + * + * @added v1.1.1. + */ + /* eslint-enable max-len */ + + function removeClass$1(source, classNames, selector) { + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; + if (!classNames) { + return; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - preventXHR.apply(this, updatedArgs); - } catch (e) { - console.log(e); + classNames = classNames.split(/\s*\|\s*/); + var selectors = []; + if (!selector) { + selectors = classNames.map(function (className) { + return ".".concat(className); + }); } - } - function removeAttr(source, args) { - function removeAttr(source, attrs, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; - if (!attrs) { - return; - } - attrs = attrs.split(/\s*\|\s*/); - if (!selector) { - selector = "[".concat(attrs.join("],["), "]"); - } - const rmattr = function rmattr() { - let nodes = []; + var removeClassHandler = function removeClassHandler() { + var nodes = new Set(); + if (selector) { + var foundNodes = []; try { - nodes = [].slice.call(document.querySelectorAll(selector)); + foundNodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - let removed = false; - nodes.forEach(function (node) { - attrs.forEach(function (attr) { - node.removeAttribute(attr); - removed = true; - }); + foundNodes.forEach(function (n) { + return nodes.add(n); }); - if (removed) { - hit(source); - } - }; - const flags = parseFlags(applying); - const run = function run() { - rmattr(); - if (!flags.hasFlag(flags.STAY)) { - return; - } - observeDOMChanges(rmattr, true); - }; - if (flags.hasFlag(flags.ASAP)) { - if (document.readyState === "loading") { - window.addEventListener("DOMContentLoaded", rmattr, { - once: true - }); - } else { - rmattr(); - } - } - if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { - window.addEventListener("load", run, { - once: true + } else if (selectors.length > 0) { + selectors.forEach(function (s) { + var elements = document.querySelectorAll(s); + for (var i = 0; i < elements.length; i += 1) { + var element = elements[i]; + nodes.add(element); + } }); - } else if (flags.hasFlag(flags.STAY)) { - if (!applying.indexOf(" ") !== -1) { - rmattr(); - } - observeDOMChanges(rmattr, true); - } - } - function hit(source) { - if (source.verbose !== true) { - return; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + var removed = false; + nodes.forEach(function (node) { + classNames.forEach(function (className) { + if (node.classList.contains(className)) { + node.classList.remove(className); + removed = true; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); - } - }; - const disconnect = function disconnect() { - observer.disconnect(); - }; - function callbackWrapper() { - disconnect(); - callback(); - connect(); - } - connect(); - } - function parseFlags(flags) { - const FLAGS_DIVIDER = " "; - const ASAP_FLAG = "asap"; - const COMPLETE_FLAG = "complete"; - const STAY_FLAG = "stay"; - const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; - const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { - return VALID_FLAGS.indexOf(f) !== -1; + }); }); - return { - ASAP: ASAP_FLAG, - COMPLETE: COMPLETE_FLAG, - STAY: STAY_FLAG, - hasFlag(flag) { - return passedFlags.indexOf(flag) !== -1; - } - }; - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + if (removed) { + hit(source); } - nativeConsole(messageStr); - } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - removeAttr.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function removeClass(source, args) { - function removeClass(source, classNames, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; - if (!classNames) { + }; + var CLASS_ATTR_NAME = ['class']; + var flags = parseFlags(applying); + var run = function run() { + removeClassHandler(); + if (!flags.hasFlag(flags.STAY)) { return; } - classNames = classNames.split(/\s*\|\s*/); - let selectors = []; - if (!selector) { - selectors = classNames.map(function (className) { - return ".".concat(className); - }); - } - const removeClassHandler = function removeClassHandler() { - const nodes = new Set(); - if (selector) { - let foundNodes = []; - try { - foundNodes = [].slice.call(document.querySelectorAll(selector)); - } catch (e) { - logMessage(source, "Invalid selector arg: '".concat(selector, "'")); - } - foundNodes.forEach(function (n) { - return nodes.add(n); - }); - } else if (selectors.length > 0) { - selectors.forEach(function (s) { - const elements = document.querySelectorAll(s); - for (let i = 0; i < elements.length; i += 1) { - const element = elements[i]; - nodes.add(element); - } - }); - } - let removed = false; - nodes.forEach(function (node) { - classNames.forEach(function (className) { - if (node.classList.contains(className)) { - node.classList.remove(className); - removed = true; - } - }); + // 'true' for observing attributes + // 'class' for observing only classes + observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); + }; + if (flags.hasFlag(flags.ASAP)) { + // https://github.com/AdguardTeam/Scriptlets/issues/245 + // Call removeClassHandler on DOM content loaded + // to ensure that target node is present on the page + if (document.readyState === 'loading') { + window.addEventListener('DOMContentLoaded', removeClassHandler, { + once: true }); - if (removed) { - hit(source); - } - }; - const CLASS_ATTR_NAME = ["class"]; - const flags = parseFlags(applying); - const run = function run() { + } else { removeClassHandler(); - if (!flags.hasFlag(flags.STAY)) { - return; - } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); - }; - if (flags.hasFlag(flags.ASAP)) { - if (document.readyState === "loading") { - window.addEventListener("DOMContentLoaded", removeClassHandler, { - once: true - }); - } else { - removeClassHandler(); - } } - if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { - window.addEventListener("load", run, { - once: true - }); - } else if (flags.hasFlag(flags.STAY)) { - if (!applying.indexOf(" ") !== -1) { - removeClassHandler(); - } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); + } + if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { + window.addEventListener('load', run, { + once: true + }); + } else if (flags.hasFlag(flags.STAY)) { + // Only call removeClassHandler for single 'stay' flag + if (!applying.includes(' ')) { + removeClassHandler(); } + observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); + } + removeClass$1.names = ['remove-class', + // aliases are needed for matching the related scriptlet converted into our syntax + 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc']; + removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags, + // following helpers should be imported and injected + // because they are used by helpers above + throttle]; + + /** + * @scriptlet disable-newtab-links + * + * @description + * Prevents opening new tabs and windows if there is `target` attribute in element. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#disable-newtab-linksjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('disable-newtab-links') + * ``` + * + * @added v1.0.4. + */ + function disableNewtabLinks$1(source) { + document.addEventListener('click', function (ev) { + var target = ev.target; + while (target !== null) { + if (target.localName === 'a' && target.hasAttribute('target')) { + ev.stopPropagation(); + ev.preventDefault(); + hit(source); + break; } - }; - const disconnect = function disconnect() { - observer.disconnect(); - }; - function callbackWrapper() { - disconnect(); - callback(); - connect(); + target = target.parentNode; } - connect(); - } - function parseFlags(flags) { - const FLAGS_DIVIDER = " "; - const ASAP_FLAG = "asap"; - const COMPLETE_FLAG = "complete"; - const STAY_FLAG = "stay"; - const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; - const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { - return VALID_FLAGS.indexOf(f) !== -1; - }); - return { - ASAP: ASAP_FLAG, - COMPLETE: COMPLETE_FLAG, - STAY: STAY_FLAG, - hasFlag(flag) { - return passedFlags.indexOf(flag) !== -1; - } - }; - } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - removeClass.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + }); } - function removeCookie(source, args) { - function removeCookie(source, match) { - const matchRegexp = toRegExp(match); - const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { - const cookieSpec = "".concat(cookieName, "="); - const domain1 = "; domain=".concat(hostName); - const domain2 = "; domain=.".concat(hostName); - const path = "; path=/"; - const expiration = "; expires=Thu, 01 Jan 1970 00:00:00 GMT"; - document.cookie = cookieSpec + expiration; - document.cookie = cookieSpec + domain1 + expiration; - document.cookie = cookieSpec + domain2 + expiration; - document.cookie = cookieSpec + path + expiration; - document.cookie = cookieSpec + domain1 + path + expiration; - document.cookie = cookieSpec + domain2 + path + expiration; + disableNewtabLinks$1.names = ['disable-newtab-links', + // aliases are needed for matching the related scriptlet converted into our syntax + 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links']; + disableNewtabLinks$1.injections = [hit]; + + /* eslint-disable max-len */ + /** + * @scriptlet adjust-setInterval + * + * @description + * Adjusts delay for specified setInterval() callbacks. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-setinterval-boosterjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('adjust-setInterval'[, matchCallback [, matchDelay[, boost]]]) + * ``` + * + * - `matchCallback` — optional, string or regular expression for stringified callback matching; + * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work + * - `matchDelay` — optional, defaults to 1000, matching setInterval delay; decimal integer OR '*' for any delay + * - `boost` — optional, default to 0.05, float, + * capped at 1000 times for up and 50 for down (0.001...50), setInterval delay multiplier + * + * ### Examples + * + * 1. Adjust all setInterval() x20 times where delay equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval') + * ``` + * + * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', 'example') + * ``` + * + * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 400ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', 'example', '400') + * ``` + * + * 1. Slow down setInterval() x2 times where callback matched with `example` and delay equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', 'example', '', '2') + * ``` + * + * 1. Adjust all setInterval() x50 times where delay equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.02') + * ``` + * + * 1. Adjust all setInterval() x1000 times where delay equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.001') + * ``` + * + * 1. Adjust all setInterval() x50 times where delay is randomized + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function adjustSetInterval$1(source, matchCallback, matchDelay, boost) { + var nativeSetInterval = window.setInterval; + var matchRegexp = toRegExp(matchCallback); + var intervalWrapper = function intervalWrapper(callback, delay) { + // https://github.com/AdguardTeam/Scriptlets/issues/221 + if (!isValidCallback(callback)) { + // eslint-disable-next-line max-len + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + logMessage(source, message); + } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { + delay *= getBoostMultiplier(boost); hit(source); - }; - const rmCookie = function rmCookie() { - document.cookie.split(";").forEach(function (cookieStr) { - const pos = cookieStr.indexOf("="); - if (pos === -1) { - return; - } - const cookieName = cookieStr.slice(0, pos).trim(); - if (!matchRegexp.test(cookieName)) { - return; - } - const hostParts = document.location.hostname.split("."); - for (let i = 0; i <= hostParts.length - 1; i += 1) { - const hostName = hostParts.slice(i).join("."); - if (hostName) { - removeCookieFromHost(cookieName, hostName); - } - } - }); - }; - rmCookie(); - window.addEventListener("beforeunload", rmCookie); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function hit(source) { - if (source.verbose !== true) { - return; + return nativeSetInterval.apply(window, [callback, delay, ...args]); + }; + window.setInterval = intervalWrapper; + } + adjustSetInterval$1.names = ['adjust-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax + 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib']; + adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them + nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet adjust-setTimeout + * + * @description + * Adjusts delay for specified setTimeout() callbacks. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-settimeout-boosterjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('adjust-setTimeout'[, matchCallback [, matchDelay[, boost]]]) + * ``` + * + * - `matchCallback` — optional, string or regular expression for stringified callback matching; + * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work + * - `matchDelay` — optional, defaults to 1000, matching setTimeout delay; decimal integer OR '*' for any delay + * - `boost` — optional, default to 0.05, float, + * capped at 1000 times for up and 50 for down (0.001...50), setTimeout delay multiplier + * + * ### Examples + * + * 1. Adjust all setTimeout() x20 times where timeout equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout') + * ``` + * + * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'example') + * ``` + * + * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 400ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'example', '400') + * ``` + * + * 1. Slow down setTimeout() x2 times where callback matched with `example` and timeout equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'example', '', '2') + * ``` + * + * 1. Adjust all setTimeout() x50 times where timeout equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.02') + * ``` + * + * 1. Adjust all setTimeout() x1000 times where timeout equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.001') + * ``` + * + * 1. Adjust all setTimeout() x20 times where callback matched with `test` and timeout is randomized + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) { + var nativeSetTimeout = window.setTimeout; + var matchRegexp = toRegExp(matchCallback); + var timeoutWrapper = function timeoutWrapper(callback, delay) { + // https://github.com/AdguardTeam/Scriptlets/issues/221 + if (!isValidCallback(callback)) { + // eslint-disable-next-line max-len + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + logMessage(source, message); + } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { + delay *= getBoostMultiplier(boost); + hit(source); } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - removeCookie.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + return nativeSetTimeout.apply(window, [callback, delay, ...args]); + }; + window.setTimeout = timeoutWrapper; } - function removeInShadowDom(source, args) { - function removeInShadowDom(source, selector, baseSelector) { - if (!Element.prototype.attachShadow) { - return; + adjustSetTimeout$1.names = ['adjust-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax + 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb']; + adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them + nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet dir-string + * + * @description + * Wraps the `console.dir` API to call the `toString` method of the argument. + * There are several adblock circumvention systems that detect browser devtools + * and hide themselves. Therefore, if we force them to think + * that devtools are open (using this scriptlet), + * it will automatically disable the adblock circumvention script. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('dir-string'[, times]) + * ``` + * + * - `times` — optional, the number of times to call the `toString` method of the argument to `console.dir` + * + * ### Examples + * + * ```adblock + * ! Run 2 times + * example.org#%#//scriptlet('dir-string', '2') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function dirString$1(source, times) { + var _console = console, + dir = _console.dir; + function dirWrapper(object) { + if (typeof dir === 'function') { + dir.call(this, object); } - const removeElement = function removeElement(targetElement) { - targetElement.remove(); - }; - const removeHandler = function removeHandler() { - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { - let isRemoved = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - targets.forEach(function (targetEl) { - removeElement(targetEl); - isRemoved = true; - }); - if (isRemoved) { - hit(source); - } - hostElements = innerHosts; - } - }; - removeHandler(); - observeDOMChanges(removeHandler, true); + hit(source); } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } + // eslint-disable-next-line no-console + console.dir = dirWrapper; + } + dirString$1.names = ['dir-string']; + dirString$1.injections = [hit]; + + /* eslint-disable max-len */ + /** + * @scriptlet json-prune + * + * @description + * Removes specified properties from the result of calling JSON.parse and returns the caller. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#json-prunejs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/json-prune.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('json-prune'[, propsToRemove [, obligatoryProps [, stack]]]) + * ``` + * + * - `propsToRemove` — optional, string of space-separated properties to remove + * - `obligatoryProps` — optional, string of space-separated properties + * which must be all present for the pruning to occur + * - `stack` — optional, string or regular expression that must match the current function call stack trace; + * if regular expression is invalid it will be skipped + * + * > Note please that you can use wildcard `*` for chain property name, + * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`. + * + * ### Examples + * + * 1. Removes property `example` from the results of JSON.parse call + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'example') + * ``` + * + * For instance, the following call will return `{ one: 1}` + * + * ```html + * JSON.parse('{"one":1,"example":true}') + * ``` + * + * 1. If there are no specified properties in the result of JSON.parse call, pruning will NOT occur + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'one', 'obligatoryProp') + * ``` + * + * For instance, the following call will return `{ one: 1, two: 2}` + * + * ```html + * JSON.parse('{"one":1,"two":2}') + * ``` + * + * 1. A property in a list of properties can be a chain of properties + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'a.b', 'ads.url.first') + * ``` + * + * 1. Removes property `content.ad` from the results of JSON.parse call if its error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'content.ad', '', 'test.js') + * ``` + * + * 1. A property in a list of properties can be a chain of properties with wildcard in it + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'content.*.media.src', 'content.*.media.ad') + * ``` + * + * 1. Call with no arguments will log the current hostname and json payload at the console + * + * ```adblock + * example.org#%#//scriptlet('json-prune') + * ``` + * + * 1. Call with only second argument will log the current hostname and matched json payload at the console + * + * ```adblock + * example.org#%#//scriptlet('json-prune', '', '"id":"117458"') + * ``` + * + * @added v1.1.0. + */ + /* eslint-enable max-len */ + function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) { + if (!!stack && !matchStackTrace(stack, new Error().stack)) { + return; } - function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); - } - }; - const disconnect = function disconnect() { - observer.disconnect(); - }; - function callbackWrapper() { - disconnect(); - callback(); - connect(); + var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; + var nativeJSONParse = JSON.parse; + var jsonParseWrapper = function jsonParseWrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; } - connect(); - } - function findHostElements(rootElement) { - const hosts = []; - const domElems = rootElement.querySelectorAll("*"); - domElems.forEach(function (el) { - if (el.shadowRoot) { - hosts.push(el); - } + // dealing with stringified json in args, which should be parsed. + // so we call nativeJSONParse as JSON.parse which is bound to JSON object + var root = nativeJSONParse.apply(JSON, args); + return jsonPruner(source, root, prunePaths, requiredPaths); + }; + + // JSON.parse mocking + jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); + JSON.parse = jsonParseWrapper; + var nativeResponseJson = Response.prototype.json; + // eslint-disable-next-line func-names + var responseJsonWrapper = function responseJsonWrapper() { + var promise = nativeResponseJson.apply(this); + return promise.then(function (obj) { + return jsonPruner(source, obj, prunePaths, requiredPaths); }); - return hosts; + }; + + // do nothing if browser does not support Response (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/Response + if (typeof Response === 'undefined') { + return; } - function pierceShadowDom(selector, hostElements) { - let targets = []; - const innerHostsAcc = []; - hostElements.forEach(function (host) { - const simpleElems = host.querySelectorAll(selector); - targets = targets.concat([].slice.call(simpleElems)); - const shadowRootElem = host.shadowRoot; - const shadowChildren = shadowRootElem.querySelectorAll(selector); - targets = targets.concat([].slice.call(shadowChildren)); - innerHostsAcc.push(findHostElements(shadowRootElem)); - }); - const innerHosts = flatten(innerHostsAcc); - return { - targets: targets, - innerHosts: innerHosts - }; - } - function flatten(input) { - const stack = []; - input.forEach(function (el) { - return stack.push(el); - }); - const res = []; - while (stack.length) { - const next = stack.pop(); - if (Array.isArray(next)) { - next.forEach(function (el) { - return stack.push(el); - }); - } else { - res.push(next); - } + Response.prototype.json = responseJsonWrapper; + } + jsonPrune$1.names = ['json-prune', + // aliases are needed for matching the related scriptlet converted into our syntax + 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune']; + jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, isPruningNeeded, jsonPruner, + // following helpers are needed for helpers above + toRegExp, getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-requestAnimationFrame + * + * @description + * Prevents a `requestAnimationFrame` call + * if the text of the callback is matching the specified search string which does not start with `!`; + * otherwise mismatched calls should be defused. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-requestanimationframe-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-requestAnimationFrame'[, search]) + * ``` + * + * - `search` — optional, string or regular expression; + * invalid regular expression will be skipped and all callbacks will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * + * > Call with no argument will log all requestAnimationFrame calls, + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Prevents `requestAnimationFrame` calls if the callback matches `/\.test/` + * + * ```adblock + * example.org#%#//scriptlet('prevent-requestAnimationFrame', '/\.test/') + * ``` + * + * For instance, the following call will be prevented: + * + * ```javascript + * var times = 0; + * requestAnimationFrame(function change() { + * window.test = 'new value'; + * if (times < 2) { + * times += 1; + * requestAnimationFrame(change); + * } + * }); + * ``` + * + * 1. Prevents `requestAnimationFrame` calls if **does not match** 'check' + * + * ```adblock + * example.org#%#//scriptlet('prevent-requestAnimationFrame', '!check') + * ``` + * + * For instance, only the first call will be prevented: + * + * ```javascript + * var timesFirst = 0; + * requestAnimationFrame(function changeFirst() { + * window.check = 'should not be prevented'; + * if (timesFirst < 2) { + * timesFirst += 1; + * requestAnimationFrame(changeFirst); + * } + * }); + * + * var timesSecond = 0; + * requestAnimationFrame(function changeSecond() { + * window.second = 'should be prevented'; + * if (timesSecond < 2) { + * timesSecond += 1; + * requestAnimationFrame(changeSecond); + * } + * }); + * ``` + * + * @added v1.1.15. + */ + /* eslint-enable max-len */ + + function preventRequestAnimationFrame$1(source, match) { + var nativeRequestAnimationFrame = window.requestAnimationFrame; + + // logs requestAnimationFrame to console if no arguments have been specified + var shouldLog = typeof match === 'undefined'; + var _parseMatchArg = parseMatchArg(match), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; + var rafWrapper = function rafWrapper(callback) { + var shouldPrevent = false; + if (shouldLog) { + hit(source); + logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); + } else if (isValidCallback(callback) && isValidStrPattern(match)) { + shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; } - return res.reverse(); + if (shouldPrevent) { + hit(source); + return nativeRequestAnimationFrame(noopFunc); + } + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeRequestAnimationFrame.apply(window, [callback, ...args]); + }; + window.requestAnimationFrame = rafWrapper; + } + preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif']; + preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage, + // following helpers should be injected as helpers above use them + escapeRegExp, toRegExp]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-cookie + * + * @description + * Sets a cookie with the specified name, value, and path. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-cookie', name, value[, path]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value; possible values: + * - number `>= 0 && <= 15` + * - one of the predefined constants in any case variation: + * - `true` + * - `false` + * - `yes` / `y` + * - `no` / `n` + * - `ok` + * - `accept`/ `reject` + * - `allow` / `deny` + * - `path` — optional, cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet encodes cookie names and values, + * > e.g value `"{ test: 'value'}"` becomes `%7B%20test%3A%20'value'%7D`. + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-cookie', 'CookieConsent', '1') + * + * example.org#%#//scriptlet('set-cookie', 'gdpr-settings-cookie', 'true') + * + * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none') + * ``` + * + * @added v1.2.3. + */ + /* eslint-enable max-len */ + function setCookie$1(source, name, value) { + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; + var validValue = getLimitedCookieValue(value); + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + return; } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - removeInShadowDom.apply(this, updatedArgs); - } catch (e) { - console.log(e); + var cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); + return; } + hit(source); + document.cookie = cookieToSet; } - function setAttr(source, args) { - function setAttr(source, selector, attr) { - let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (!selector || !attr) { - return; - } - const allowedValues = ["true", "false"]; - if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) { - return; - } - const setAttr = function setAttr() { - const nodes = [].slice.call(document.querySelectorAll(selector)); - let set = false; - nodes.forEach(function (node) { - node.setAttribute(attr, value); - set = true; + setCookie$1.names = ['set-cookie']; + setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; + + /** + * @scriptlet set-cookie-reload + * + * @description + * Sets a cookie with the specified name and value, and path, + * and reloads the current page after the cookie setting. + * If reloading option is not needed, use [set-cookie](#set-cookie) scriptlet. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-cookie-reload', name, value[, path]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value; possible values: + * - number `>= 0 && <= 15` + * - one of the predefined constants in any case variation: + * - `true` + * - `false` + * - `yes` / `y` + * - `no` / `n` + * - `ok` + * - `accept`/ `reject` + * - `allow` / `deny` + * - `path` — optional, cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet encodes cookie names and values, + * > e.g value `"{ test: 'value'}"` becomes `%7B%20test%3A%20'value'%7D`. + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-cookie-reload', 'checking', 'ok') + * + * example.org#%#//scriptlet('set-cookie-reload', 'gdpr-settings-cookie', '1') + * + * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none') + * ``` + * + * @added v1.3.14. + */ + function setCookieReload$1(source, name, value) { + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; + if (isCookieSetWithValue(document.cookie, name, value)) { + return; + } + var validValue = getLimitedCookieValue(value); + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(value, "'")); + return; + } + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); + return; + } + document.cookie = cookieToSet; + hit(source); + + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); + } + } + setCookieReload$1.names = ['set-cookie-reload']; + setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; + + /** + * @scriptlet hide-in-shadow-dom + * + * @description + * Hides elements inside open shadow DOM elements. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('hide-in-shadow-dom', selector[, baseSelector]) + * ``` + * + * - `selector` — required, CSS selector of element in shadow-dom to hide + * - `baseSelector` — optional, selector of specific page DOM element, + * narrows down the part of the page DOM where shadow-dom host supposed to be, + * defaults to document.documentElement + * + * > `baseSelector` should match element of the page DOM, but not of shadow DOM. + * + * ### Examples + * + * ```adblock + * ! hides menu bar + * example.com#%#//scriptlet('hide-in-shadow-dom', '.storyAd', '#app') + * + * ! hides floating element + * example.com#%#//scriptlet('hide-in-shadow-dom', '.contact-fab') + * ``` + * + * @added v1.3.0. + */ + function hideInShadowDom$1(source, selector, baseSelector) { + // do nothing if browser does not support ShadowRoot + // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot + if (!Element.prototype.attachShadow) { + return; + } + var hideElement = function hideElement(targetElement) { + var DISPLAY_NONE_CSS = 'display:none!important;'; + targetElement.style.cssText = DISPLAY_NONE_CSS; + }; + + /** + * Handles shadow-dom piercing and hiding of found elements + */ + var hideHandler = function hideHandler() { + // start value of shadow-dom hosts for the page dom + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + + // if there is shadow-dom host, they should be explored + var _loop = function _loop() { + var isHidden = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; + targets.forEach(function (targetEl) { + hideElement(targetEl); + isHidden = true; }); - if (set) { + if (isHidden) { hit(source); } + + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration + hostElements = innerHosts; }; - setAttr(); - observeDOMChanges(setAttr, true); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + while (hostElements.length !== 0) { + _loop(); } + }; + hideHandler(); + observeDOMChanges(hideHandler, true); + } + hideInShadowDom$1.names = ['hide-in-shadow-dom']; + hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected + // because they are used by helpers above + flatten, throttle]; + + /** + * @scriptlet remove-in-shadow-dom + * + * @description + * Removes elements inside open shadow DOM elements. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-in-shadow-dom', selector[, baseSelector]) + * ``` + * + * - `selector` — required, CSS selector of element in shadow-dom to remove + * - `baseSelector` — optional, selector of specific page DOM element, + * narrows down the part of the page DOM where shadow-dom host supposed to be, + * defaults to document.documentElement + * + * > `baseSelector` should match element of the page DOM, but not of shadow DOM. + * + * ### Examples + * + * ```adblock + * ! removes menu bar + * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'iron-pages', 'vt-virustotal-app') + * + * ! removes floating element + * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab') + * ``` + * + * @added v1.3.14. + */ + function removeInShadowDom$1(source, selector, baseSelector) { + // do nothing if browser does not support ShadowRoot + // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot + if (!Element.prototype.attachShadow) { + return; } - function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); + var removeElement = function removeElement(targetElement) { + targetElement.remove(); + }; + + /** + * Handles shadow-dom piercing and removing of found elements + */ + var removeHandler = function removeHandler() { + // start value of shadow-dom hosts for the page dom + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + + // if there is shadow-dom host, they should be explored + var _loop = function _loop() { + var isRemoved = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; + targets.forEach(function (targetEl) { + removeElement(targetEl); + isRemoved = true; + }); + if (isRemoved) { + hit(source); } + + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration + hostElements = innerHosts; }; - const disconnect = function disconnect() { - observer.disconnect(); - }; - function callbackWrapper() { - disconnect(); - callback(); - connect(); + while (hostElements.length !== 0) { + _loop(); } - connect(); + }; + removeHandler(); + observeDOMChanges(removeHandler, true); + } + removeInShadowDom$1.names = ['remove-in-shadow-dom']; + removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected + // because they are used by helpers above + flatten, throttle]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-fetch + * + * @description + * Prevents `fetch` calls if **all** given parameters match. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-fetch-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-fetch'[, propsToMatch[, responseBody[, responseType]]]) + * ``` + * + * - `propsToMatch` — optional, string of space-separated properties to match; possible props: + * - string or regular expression for matching the URL passed to fetch call; + * empty string, wildcard `*` or invalid regular expression will match all fetch calls + * - colon-separated pairs `name:value` where + * + * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters) + * - `value` is string or regular expression for matching the value of the option passed to fetch call; + * invalid regular expression will cause any value matching + * - `responseBody` — optional, string for defining response body value, + * defaults to `emptyObj`. Possible values: + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `responseType` — optional, string for defining response type, + * original response type is used if not specified. Possible values: + * - `default` + * - `opaque` + * + * > Usage with no arguments will log fetch calls to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Log all fetch calls + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch') + * ``` + * + * 1. Prevent all fetch calls + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '*') + * ! or + * example.org#%#//scriptlet('prevent-fetch', '') + * ``` + * + * 1. Prevent fetch call for specific url + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '/url\\.part/') + * ``` + * + * 1. Prevent fetch call for specific request method + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', 'method:HEAD') + * ``` + * + * 1. Prevent fetch call for specific url and request method + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/') + * ``` + * + * 1. Prevent fetch call and specify response body value + * + * ```adblock + * ! Specify response body for fetch call to a specific url + * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/', 'emptyArr') + * + * ! Specify response body for all fetch calls + * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr') + * ``` + * + * 1. Prevent all fetch calls and specify response type value + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque') + * ``` + * + * @added v1.3.18. + */ + /* eslint-enable max-len */ + function preventFetch$1(source, propsToMatch) { + var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj'; + var responseType = arguments.length > 3 ? arguments[3] : undefined; + // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { + return; } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); + var strResponseBody; + if (responseBody === '' || responseBody === 'emptyObj') { + strResponseBody = '{}'; + } else if (responseBody === 'emptyArr') { + strResponseBody = '[]'; + } else { + logMessage(source, "Invalid responseBody parameter: '".concat(responseBody, "'")); + return; } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; + var isResponseTypeSpecified = typeof responseType !== 'undefined'; + var isResponseTypeSupported = function isResponseTypeSupported(responseType) { + var SUPPORTED_TYPES = ['default', 'opaque']; + return SUPPORTED_TYPES.includes(responseType); + }; + // Skip disallowed response types, + // specified responseType has limited list of possible values + if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) { + logMessage(source, "Invalid responseType parameter: '".concat(responseType, "'")); + return; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setAttr.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function setConstant(source, args) { - function setConstant(source, property, value, stack) { - if (!property || !matchStackTrace(stack, new Error().stack)) { - return; - } - const emptyArr = noopArray(); - const emptyObj = noopObject(); - let constantValue; - if (value === "undefined") { - constantValue = undefined; - } else if (value === "false") { - constantValue = false; - } else if (value === "true") { - constantValue = true; - } else if (value === "null") { - constantValue = null; - } else if (value === "emptyArr") { - constantValue = emptyArr; - } else if (value === "emptyObj") { - constantValue = emptyObj; - } else if (value === "noopFunc") { - constantValue = noopFunc; - } else if (value === "noopCallbackFunc") { - constantValue = noopCallbackFunc; - } else if (value === "trueFunc") { - constantValue = trueFunc; - } else if (value === "falseFunc") { - constantValue = falseFunc; - } else if (value === "throwFunc") { - constantValue = throwFunc; - } else if (value === "noopPromiseResolve") { - constantValue = noopPromiseResolve; - } else if (value === "noopPromiseReject") { - constantValue = noopPromiseReject; - } else if (/^\d+$/.test(value)) { - constantValue = parseFloat(value); - if (nativeIsNaN(constantValue)) { - return; - } - if (Math.abs(constantValue) > 32767) { - return; - } - } else if (value === "-1") { - constantValue = -1; - } else if (value === "") { - constantValue = ""; - } else if (value === "yes") { - constantValue = "yes"; - } else if (value === "no") { - constantValue = "no"; - } else { - return; - } - let canceled = false; - const mustCancel = function mustCancel(value) { - if (canceled) { - return canceled; - } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; - return canceled; - }; - const trapProp = function trapProp(base, prop, configurable, handler) { - if (!handler.init(base[prop])) { - return false; - } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; - if (origDescriptor instanceof Object) { - if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); - logMessage(source, message); - return false; - } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { - prevSetter = origDescriptor.set; - } - } - Object.defineProperty(base, prop, { - configurable: configurable, - get() { - return handler.get(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); - } - handler.set(a); - } - }); - return true; - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - const inChainPropHandler = { - factValue: undefined, - init(a) { - this.factValue = a; - return true; - }, - get() { - return this.factValue; - }, - set(a) { - if (this.factValue === a) { - return; - } - this.factValue = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - } - }; - const endPropHandler = { - init(a) { - if (mustCancel(a)) { - return false; - } - return true; - }, - get() { - return constantValue; - }, - set(a) { - if (!mustCancel(a)) { - return; - } - constantValue = a; - } - }; - if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { - hit(source); - } - return; - } - if (base !== undefined && base[prop] === null) { - trapProp(base, prop, true, inChainPropHandler); - return; - } - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - trapProp(base, prop, true, inChainPropHandler); - } - const propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { - setChainPropAccess(propValue, chain); - } - trapProp(base, prop, true, inChainPropHandler); - }; - setChainPropAccess(window, property); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + var handlerWrapper = async function handlerWrapper(target, thisArg, args) { + var shouldPrevent = false; + var fetchData = getFetchData(args); + if (typeof propsToMatch === 'undefined') { + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); + if (shouldPrevent) { + hit(source); + try { + var origResponse = await Reflect.apply(target, thisArg, args); + // In the case of apps, the blocked request has status 500 + // and no error is thrown, so it's necessary to check response.ok + // https://github.com/AdguardTeam/Scriptlets/issues/334 + if (!origResponse.ok) { + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + } + return modifyResponse(origResponse, { + body: strResponseBody, + type: responseType + }); + } catch (ex) { + // https://github.com/AdguardTeam/Scriptlets/issues/334 + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); } } - nativeConsole(messageStr); - } - function noopArray() { - return []; - } - function noopObject() { - return {}; + return Reflect.apply(target, thisArg, args); + }; + var fetchHandler = { + apply: handlerWrapper + }; + fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign + } + + preventFetch$1.names = ['prevent-fetch', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if']; + preventFetch$1.injections = [hit, getFetchData, objectToString, matchRequestProps, logMessage, noopPromiseResolve, modifyResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-local-storage-item + * + * @description + * Adds specified key and its value to localStorage object, or updates the value of the key if it already exists. + * Scriptlet won't set item if storage is full. + * + * To remove item from localStorage use `$remove$` as a value. + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('set-local-storage-item', 'key', 'value') + * ``` + * + * - `key` — required, key name to be set. + * - `value` — required, key value; possible values: + * - positive decimal integer `<= 32767` + * - one of the predefined constants: + * - `undefined` + * - `false` + * - `true` + * - `null` + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `''` — empty string + * - `yes` + * - `no` + * - `$remove$` — remove specific item from localStorage + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-local-storage-item', 'player.live.current.mute', 'false') + * + * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1') + * + * ! Removes the item with key 'foo' from local storage + * example.org#%#//scriptlet('set-local-storage-item', 'foo', '$remove$') + * ``` + * + * @added v1.4.3. + */ + /* eslint-enable max-len */ + + function setLocalStorageItem$1(source, key, value) { + if (typeof key === 'undefined') { + logMessage(source, 'Item key should be specified.'); + return; } - function noopFunc() {} - function noopCallbackFunc() { - return noopFunc; + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); + return; } - function trueFunc() { - return true; + var _window = window, + localStorage = _window.localStorage; + if (validValue === '$remove$') { + removeStorageItem(source, localStorage, key); + } else { + setStorageItem(source, localStorage, key, validValue); } - function falseFunc() { - return false; + hit(source); + } + setLocalStorageItem$1.names = ['set-local-storage-item']; + setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-session-storage-item + * + * @description + * Adds specified key and its value to sessionStorage object, or updates the value of the key if it already exists. + * Scriptlet won't set item if storage is full. + * + * To remove item from sessionStorage use `$remove$` as a value. + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('set-session-storage-item', 'key', 'value') + * ``` + * + * - `key` — required, key name to be set. + * - `value` — required, key value; possible values: + * - positive decimal integer `<= 32767` + * - one of the predefined constants: + * - `undefined` + * - `false` + * - `true` + * - `null` + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `''` — empty string + * - `yes` + * - `no` + * - `$remove$` — remove specific item from sessionStorage + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-session-storage-item', 'player.live.current.mute', 'false') + * + * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1') + * + * ! Removes the item with key 'foo' from session storage + * example.org#%#//scriptlet('set-session-storage-item', 'foo', '$remove$') + * ``` + * + * @added v1.4.3. + */ + /* eslint-enable max-len */ + + function setSessionStorageItem$1(source, key, value) { + if (typeof key === 'undefined') { + logMessage(source, 'Item key should be specified.'); + return; } - function throwFunc() { - throw new Error(); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); + return; } - function noopPromiseReject() { - return Promise.reject(); + var _window = window, + sessionStorage = _window.sessionStorage; + if (validValue === '$remove$') { + removeStorageItem(source, sessionStorage, key); + } else { + setStorageItem(source, sessionStorage, key, validValue); } - function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { - return; - } - const response = new Response(responseBody, { - status: 200, - statusText: "OK" - }); - Object.defineProperties(response, { - url: { - value: responseUrl - }, - type: { - value: responseType - } - }); - return Promise.resolve(response); + hit(source); + } + setSessionStorageItem$1.names = ['set-session-storage-item']; + setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-on-stack-trace + * + * @description + * Aborts a script when it attempts to utilize (read or write to) the specified property + * and it's error stack trace contains given value. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock-for-firefox-legacy/commit/7099186ae54e70b588d5e99554a05d783cabc8ff + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('abort-on-stack-trace', property, stack) + * ``` + * + * - `property` — required, path to a property. The property must be attached to window. + * - `stack` — required, string that must match the current function call stack trace. + * - values to abort inline or injected script, accordingly: + * - `inlineScript` + * - `injectedScript` + * + * ### Examples + * + * 1. Aborts script when it tries to access `window.Ya` and it's error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'test.js') + * ``` + * + * 1. Aborts script when it tries to access `window.Ya.videoAd` and it's error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya.videoAd', 'test.js') + * ``` + * + * 1. Aborts script when stack trace matches with any of these parameters + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexFuncName') + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexScriptName') + * ``` + * + * 1. Aborts script when it tries to access `window.Ya` and it's an inline script + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'inlineScript') + * ``` + * + * 1. Aborts script when it tries to access `window.Ya` and it's an injected script + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript') + * ``` + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ + function abortOnStackTrace$1(source, property, stack) { + if (!property || !stack) { + return; } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain + var rid = randomId(); + var abort = function abort() { + hit(source); + throw new ReferenceError(rid); + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function matchStackTrace(stackMatch, stackTrace) { - if (!stackMatch || stackMatch === "") { - return true; - } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { - return true; - } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }).join("\n"); - return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; - } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; - }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; - }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { - return false; - } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); - if (pos !== -1) { - documentURL = documentURL.slice(0, pos); + if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { + logMessage(source, "Invalid parameter: ".concat(stack)); + return; } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { - stackURL = stackURL.slice(1); + + // Prevent infinite loops when trapping prop used by helpers in getter/setter + var descriptorWrapper = Object.assign(getDescriptorAddon(), { + value: base[prop], + get() { + if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { + abort(); } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { - stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { - stackFunction = stackFunction.slice(2).trim(); - } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); - } else { - stack = stackURL; + return this.value; + }, + set(newValue) { + if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { + abort(); } - } else { - stack = line; + this.value = newValue; } - return stack; }); - if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { - if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { - return true; - } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { - return true; - } + setPropertyAccess(base, prop, { + // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values + get() { + return descriptorWrapper.get.call(descriptorWrapper); + }, + set(newValue) { + descriptorWrapper.set.call(descriptorWrapper, newValue); } - } - return false; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setConstant.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); } - function setCookie(source, args) { - function setCookie(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - const validValue = getLimitedCookieValue(value); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); - return; - } - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { - return; - } - hit(source); - document.cookie = cookieToSet; + abortOnStackTrace$1.names = ['abort-on-stack-trace', + // aliases are needed for matching the related scriptlet converted into our syntax + 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace']; + abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; + + /* eslint-disable max-len */ + /** + * @scriptlet log-on-stack-trace + * + * @description + * This scriptlet is basically the same as [abort-on-stack-trace](#abort-on-stack-trace), + * but instead of aborting it logs: + * + * - function and source script names pairs that access the given property + * - was that get or set attempt + * - script being injected or inline + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('log-on-stack-trace', 'property') + * ``` + * + * - `property` — required, path to a property. The property must be attached to window. + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ + function logOnStacktrace$1(source, property) { + if (!property) { + return; } - function hit(source) { - if (source.verbose !== true) { + var refineStackTrace = function refineStackTrace(stackString) { + // Split stack trace string by lines and remove first two elements ('Error' and getter call) + // Remove ' at ' at the start of each string + var stackSteps = stackString.split('\n').slice(2).map(function (line) { + return line.replace(/ {4}at /, ''); + }); + // Trim each line extracting funcName : fullPath pair + var logInfoArray = stackSteps.map(function (line) { + var funcName; + var funcFullPath; + /* eslint-disable-next-line no-useless-escape */ + var reg = /\(([^\)]+)\)/; + var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; + if (line.match(reg)) { + funcName = line.split(' ').slice(0, -1).join(' '); + /* eslint-disable-next-line prefer-destructuring */ + funcFullPath = line.match(reg)[1]; + } else if (line.match(regFirefox)) { + funcName = line.split('@').slice(0, -1).join(' '); + /* eslint-disable-next-line prefer-destructuring */ + funcFullPath = line.match(regFirefox)[2]; + } else { + // For when func name is not available + funcName = 'function name is not available'; + funcFullPath = line; + } + return [funcName, funcFullPath]; + }); + // Convert array into object for better display using console.table + var logInfoObject = {}; + logInfoArray.forEach(function (pair) { + /* eslint-disable-next-line prefer-destructuring */ + logInfoObject[pair[0]] = pair[1]; + }); + return logInfoObject; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); return; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + var value = base[prop]; + /* eslint-disable no-console */ + setPropertyAccess(base, prop, { + get() { + hit(source); + logMessage(source, "Get ".concat(prop), true); + console.table(refineStackTrace(new Error().stack)); + return value; + }, + set(newValue) { + hit(source); + logMessage(source, "Set ".concat(prop), true); + console.table(refineStackTrace(new Error().stack)); + value = newValue; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } + }); + /* eslint-enable no-console */ + }; + + setChainPropAccess(window, property); + } + logOnStacktrace$1.names = ['log-on-stack-trace']; + logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-xhr + * + * @description + * Prevents `xhr` calls if **all** given parameters match. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-xhr-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-xhr'[, propsToMatch[, randomize]]) + * ``` + * + * - `propsToMatch` — optional, string of space-separated properties to match; possible props: + * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call; + * empty string or wildcard `*` for all `XMLHttpRequest.open()` calls match + * - colon-separated pairs `name:value` where + * - `name` is XMLHttpRequest object property name + * - `value` is string or regular expression for matching the value of the option + * passed to `XMLHttpRequest.open()` call + * - `randomize` — defaults to `false` for empty responseText, + * optional argument to randomize responseText of matched XMLHttpRequest's response; possible values: + * - `true` to randomize responseText, random alphanumeric string of 10 symbols + * - colon-separated pair `name:value` string value to customize responseText data where + * - `name` — only `length` supported for now + * - `value` — range on numbers, for example `100-300`, limited to 500000 characters + * + * > Usage with no arguments will log XMLHttpRequest objects to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Log all XMLHttpRequests + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr') + * ``` + * + * 1. Prevent all XMLHttpRequests + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', '*') + * example.org#%#//scriptlet('prevent-xhr', '') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org') + * ``` + * + * 1. Prevent XMLHttpRequests for specific request method + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'method:HEAD') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url and specified request methods + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org method:/HEAD|GET/') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url and randomize it's response text + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'true') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url and randomize it's response text with range + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300') + * ``` + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ + function preventXHR$1(source, propsToMatch, customResponseText) { + // do nothing if browser does not support Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + if (typeof Proxy === 'undefined') { + return; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader; + var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders; + var xhrData; + var modifiedResponse = ''; + var modifiedResponseText = ''; + var openWrapper = function openWrapper(target, thisArg, args) { + // Get original request properties + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); + if (typeof propsToMatch === 'undefined') { + // Log if no propsToMatch given + logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); + hit(source); + } else if (matchRequestProps(source, propsToMatch, xhrData)) { + thisArg.shouldBePrevented = true; + // Add xhrData to thisArg to keep original values in case of multiple requests + // https://github.com/AdguardTeam/Scriptlets/issues/347 + thisArg.xhrData = xhrData; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + + // Trap setRequestHeader of target xhr object to mimic request headers later; + // needed for getResponseHeader() and getAllResponseHeaders() methods + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + // setRequestHeader() can only be called on xhr.open(), + // so we can safely proxy it here + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return Reflect.apply(target, thisArg, args); } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function getLimitedCookieValue(value) { - if (!value) { - return null; + if (thisArg.responseType === 'blob') { + modifiedResponse = new Blob(); } - let validValue; - if (value === "true") { - validValue = "true"; - } else if (value === "True") { - validValue = "True"; - } else if (value === "false") { - validValue = "false"; - } else if (value === "False") { - validValue = "False"; - } else if (value === "yes") { - validValue = "yes"; - } else if (value === "Yes") { - validValue = "Yes"; - } else if (value === "Y") { - validValue = "Y"; - } else if (value === "no") { - validValue = "no"; - } else if (value === "ok") { - validValue = "ok"; - } else if (value === "OK") { - validValue = "OK"; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - return null; - } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - return null; - } - } else { - return null; + if (thisArg.responseType === 'arraybuffer') { + modifiedResponse = new ArrayBuffer(); } - return validValue; - } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); - } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; - } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; + if (customResponseText) { + var randomText = generateRandomResponse(customResponseText); + if (randomText) { + modifiedResponseText = randomText; + } else { + logMessage(source, "Invalid randomize parameter: '".concat(customResponseText, "'")); + } } - return ""; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setCookie.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function setCookieReload(source, args) { - function setCookieReload(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(document.cookie, name, value)) { - return; + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + statusText = forgedRequest.statusText; + + // Mock response object + Object.defineProperties(thisArg, { + // original values + readyState: { + value: readyState, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + // If the request is blocked, responseURL is an empty string + responseURL: { + value: responseURL || thisArg.xhrData.url, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + // modified values + status: { + value: 200, + writable: false + }, + response: { + value: modifiedResponse, + writable: false + }, + responseText: { + value: modifiedResponseText, + writable: false + } + }); + + // Mock events + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } - const validValue = getLimitedCookieValue(value); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); - return; + return undefined; + }; + + /** + * Mock XMLHttpRequest.prototype.getHeaderHandler() to avoid adblocker detection. + * + * @param {Function} target XMLHttpRequest.prototype.getHeaderHandler(). + * @param {XMLHttpRequest} thisArg The request. + * @param {string[]} args Header name is passed as first argument. + * + * @returns {string|null} Header value or null if header is not set. + */ + var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return nativeGetResponseHeader.apply(thisArg, args); } - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; + if (!thisArg.collectedHeaders.length) { + return null; } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { - return; + // The search for the header name is case-insensitive + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getResponseHeader + var searchHeaderName = args[0].toLowerCase(); + var matchedHeader = thisArg.collectedHeaders.find(function (header) { + var headerName = header[0].toLowerCase(); + return headerName === searchHeaderName; + }); + return matchedHeader ? matchedHeader[1] : null; + }; + + /** + * Mock XMLHttpRequest.prototype.getAllResponseHeaders() to avoid adblocker detection. + * + * @param {Function} target XMLHttpRequest.prototype.getAllResponseHeaders(). + * @param {XMLHttpRequest} thisArg The request. + * + * @returns {string} All headers as a string. For no headers an empty string is returned. + */ + var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) { + if (!thisArg.shouldBePrevented) { + return nativeGetAllResponseHeaders.call(thisArg); } - document.cookie = cookieToSet; - hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); + if (!thisArg.collectedHeaders.length) { + return ''; } + var allHeadersStr = thisArg.collectedHeaders.map(function (header) { + /** + * TODO: array destructuring may be used here + * after the typescript implementation and bundling refactoring + * as now there is an error: slicedToArray is not defined + */ + var headerName = header[0]; + var headerValue = header[1]; + // In modern browsers, the header names are returned in all lower case, as per the latest spec. + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders + return "".concat(headerName.toLowerCase(), ": ").concat(headerValue); + }).join('\r\n'); + return allHeadersStr; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + var getHeaderHandler = { + apply: getHeaderWrapper + }; + var getAllHeadersHandler = { + apply: getAllHeadersWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler); + XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler); + } + preventXHR$1.names = ['prevent-xhr', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if']; + preventXHR$1.injections = [hit, objectToString, generateRandomResponse, matchRequestProps, getXhrData, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, isValidParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; + + /** + * @scriptlet close-window + * + * @description + * Closes the browser tab immediately. + * + * > `window.close()` usage is restricted in the Chrome browser. + * > In this case tab will only be closed when using AdGuard Browser extension. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('close-window'[, path]) + * ``` + * + * - `path` — optional, string or regular expression + * matching the current location's path: `window.location.pathname` + `window.location.search`. + * Defaults to execute on every page. + * + * ### Examples + * + * ```adblock + * ! closes any example.org tab + * example.org#%#//scriptlet('close-window') + * + * ! closes specific example.org tab + * example.org#%#//scriptlet('close-window', '/example-page.html') + * ``` + * + * @added v1.5.0. + */ + function forceWindowClose$1(source) { + var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036 + if (typeof window.close !== 'function') { + var message = 'window.close() is not a function so \'close-window\' scriptlet is unavailable'; + logMessage(source, message); + return; } - function hit(source) { - if (source.verbose !== true) { - return; - } + var closeImmediately = function closeImmediately() { try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + hit(source); + window.close(); + } catch (e) { + // log the error if window closing is impossible + // https://developer.mozilla.org/en-US/docs/Web/API/Window/close + logMessage(source, e); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + }; + var closeByExtension = function closeByExtension() { + var extCall = function extCall() { + dispatchEvent(new Event('adguard:scriptlet-close-window')); + }; + window.addEventListener('adguard:subscribed-to-close-window', extCall, { + once: true + }); + setTimeout(function () { + window.removeEventListener('adguard:subscribed-to-close-window', extCall, { + once: true + }); + }, 5000); + }; + var shouldClose = function shouldClose() { + if (path === '') { + return true; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + var pathRegexp = toRegExp(path); + var currentPath = "".concat(window.location.pathname).concat(window.location.search); + return pathRegexp.test(currentPath); + }; + if (shouldClose()) { + closeImmediately(); + if (navigator.userAgent.includes('Chrome')) { + closeByExtension(); } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); } - function isCookieSetWithValue(cookieString, name, value) { - return cookieString.split(";").some(function (cookieStr) { - const pos = cookieStr.indexOf("="); - if (pos === -1) { - return false; + } + forceWindowClose$1.names = ['close-window', 'window-close-if.js', 'ubo-window-close-if.js', 'ubo-window-close-if']; + forceWindowClose$1.injections = [hit, toRegExp, logMessage]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-refresh + * + * @description + * Prevents reloading of a document through a meta "refresh" tag. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#refresh-defuserjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-refresh'[, delay]) + * ``` + * + * - `delay` — optional, number of seconds for delay that indicates when scriptlet should run. + * If not set, source tag value will be applied. + * + * ### Examples + * + * 1. Prevent reloading of a document through a meta "refresh" tag + * + * ```adblock + * example.org#%#//scriptlet('prevent-refresh') + * ``` + * + * 1. Prevent reloading of a document with delay + * + * ```adblock + * example.com#%#//scriptlet('prevent-refresh', 3) + * ``` + * + * @added v1.6.2. + */ + /* eslint-enable max-len */ + function preventRefresh$1(source, delaySec) { + var getMetaElements = function getMetaElements() { + var metaNodes = []; + try { + metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); + } catch (e) { + // 'i' attribute flag is problematic in Edge 15 + try { + metaNodes = document.querySelectorAll('meta[http-equiv="refresh"][content]'); + } catch (e) { + logMessage(source, e); } - const cookieName = cookieStr.slice(0, pos).trim(); - const cookieValue = cookieStr.slice(pos + 1).trim(); - return name === cookieName && value === cookieValue; - }); - } - function getLimitedCookieValue(value) { - if (!value) { - return null; } - let validValue; - if (value === "true") { - validValue = "true"; - } else if (value === "True") { - validValue = "True"; - } else if (value === "false") { - validValue = "false"; - } else if (value === "False") { - validValue = "False"; - } else if (value === "yes") { - validValue = "yes"; - } else if (value === "Yes") { - validValue = "Yes"; - } else if (value === "Y") { - validValue = "Y"; - } else if (value === "no") { - validValue = "no"; - } else if (value === "ok") { - validValue = "ok"; - } else if (value === "OK") { - validValue = "OK"; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { + return Array.from(metaNodes); + }; + var getMetaContentDelay = function getMetaContentDelay(metaElements) { + var delays = metaElements.map(function (meta) { + var contentString = meta.getAttribute('content'); + if (contentString.length === 0) { return null; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - return null; + var contentDelay; + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv + var limiterIndex = contentString.indexOf(';'); + if (limiterIndex !== -1) { + var delaySubstring = contentString.substring(0, limiterIndex); + contentDelay = getNumberFromString(delaySubstring); + } else { + contentDelay = getNumberFromString(contentString); } - } else { - return null; - } - return validValue; - } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); - } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; - } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; - } - return ""; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setCookieReload.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function setLocalStorageItem(source, args) { - function setLocalStorageItem(source, key, value) { - if (typeof key === "undefined") { - logMessage(source, "Item key should be specified."); - return; - } - let validValue; - try { - validValue = getLimitedStorageItemValue(value); - } catch (_unused) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return; + return contentDelay; + }).filter(function (delay) { + return delay !== null; + }); + // Check if "delays" array is empty, may happens when meta's content is invalid + // and reduce() method cannot be used with empty arrays without initial value + if (!delays.length) { + return null; } - const _window = window, - localStorage = _window.localStorage; - setStorageItem(source, localStorage, key, validValue); - hit(source); - } - function hit(source) { - if (source.verbose !== true) { + // Get smallest delay of all metas on the page + var minDelay = delays.reduce(function (a, b) { + return Math.min(a, b); + }); + // eslint-disable-next-line consistent-return + return minDelay; + }; + var stop = function stop() { + var metaElements = getMetaElements(); + if (metaElements.length === 0) { return; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + var secondsToRun = getNumberFromString(delaySec); + // Check if argument is provided + if (secondsToRun === null) { + secondsToRun = getMetaContentDelay(metaElements); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + // Check if meta tag has delay + if (secondsToRun === null) { return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function setStorageItem(source, storage, key, value) { - try { - storage.setItem(key, value); - } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); - logMessage(source, message); - } + var delayMs = secondsToRun * 1000; + setTimeout(function () { + window.stop(); + hit(source); + }, delayMs); + }; + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', stop, { + once: true + }); + } else { + stop(); } - function getLimitedStorageItemValue(value) { - if (typeof value !== "string") { - throw new Error("Invalid value"); - } - let validValue; - if (value === "undefined") { - validValue = undefined; - } else if (value === "false") { - validValue = false; - } else if (value === "true") { - validValue = true; - } else if (value === "null") { - validValue = null; - } else if (value === "emptyArr") { - validValue = "[]"; - } else if (value === "emptyObj") { - validValue = "{}"; - } else if (value === "") { - validValue = ""; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - throw new Error("Invalid value"); - } - if (Math.abs(validValue) > 32767) { - throw new Error("Invalid value"); - } - } else if (value === "yes") { - validValue = "yes"; - } else if (value === "no") { - validValue = "no"; - } else { - throw new Error("Invalid value"); - } - return validValue; + } + preventRefresh$1.names = ['prevent-refresh', + // Aliases are needed for matching the related scriptlet converted into our syntax + // These are used by UBO rules syntax + // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets + 'refresh-defuser.js', 'refresh-defuser', + // Prefix 'ubo-' is required to run converted rules + 'ubo-refresh-defuser.js', 'ubo-refresh-defuser']; + preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN]; + + /* eslint-disable max-len, consistent-return */ + /** + * @scriptlet prevent-element-src-loading + * + * @description + * Prevents target element source loading without triggering 'onerror' listeners and not breaking 'onload' ones. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-element-src-loading', tagName, match) + * ``` + * + * - `tagName` — required, case-insensitive target element tagName + * which `src` property resource loading will be silently prevented; possible values: + * - `script` + * - `img` + * - `iframe` + * - `link` + * - `match` — required, string or regular expression for matching the element's URL; + * + * ### Examples + * + * 1. Prevent script source loading + * + * ```adblock + * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle') + * ``` + * + * @added v1.6.2. + */ + /* eslint-enable max-len */ + function preventElementSrcLoading$1(source, tagName, match) { + // do nothing if browser does not support Proxy or Reflect + if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { + return; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setLocalStorageItem.apply(this, updatedArgs); - } catch (e) { - console.log(e); + var srcMockData = { + // "KCk9Pnt9" = "()=>{}" + script: 'data:text/javascript;base64,KCk9Pnt9', + // Empty 1x1 image + img: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==', + // Empty h1 tag + iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=', + // Empty data + link: 'data:text/plain;base64,' + }; + var instance; + if (tagName === 'script') { + instance = HTMLScriptElement; + } else if (tagName === 'img') { + instance = HTMLImageElement; + } else if (tagName === 'iframe') { + instance = HTMLIFrameElement; + } else if (tagName === 'link') { + instance = HTMLLinkElement; + } else { + return; } - } - function setPopadsDummy(source, args) { - function setPopadsDummy(source) { - delete window.PopAds; - delete window.popns; - Object.defineProperties(window, { - PopAds: { - get: function get() { - hit(source); - return {}; - } - }, - popns: { - get: function get() { - hit(source); - return {}; - } + + // For websites that use Trusted Types + // https://w3c.github.io/webappsec-trusted-types/dist/spec/ + var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; + var policy; + if (hasTrustedTypes) { + // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can + // allow our policy if the server has restricted the creation of a trusted-types policy with + // the directive 'Content-Security-Policy: trusted-types ;`. + // If such a header is presented in the server response, corelibs adds permission to create + // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. + // See AG-18204 for details. + policy = window.trustedTypes.createPolicy('AGPolicy', { + createScriptURL: function createScriptURL(arg) { + return arg; } }); } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setPopadsDummy.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function setSessionStorageItem(source, args) { - function setSessionStorageItem(source, key, value) { - if (typeof key === "undefined") { - logMessage(source, "Item key should be specified."); - return; + var SOURCE_PROPERTY_NAME = tagName === 'link' ? 'href' : 'src'; + var ONERROR_PROPERTY_NAME = 'onerror'; + var searchRegexp = toRegExp(match); + + // This will be needed to silent error events on matched element, + // as url wont be available + var setMatchedAttribute = function setMatchedAttribute(elem) { + return elem.setAttribute(source.name, 'matched'); + }; + var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { + // Check if arguments are present + if (!args[0] || !args[1]) { + return Reflect.apply(target, thisArg, args); } - let validValue; - try { - validValue = getLimitedStorageItemValue(value); - } catch (_unused) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return; + var nodeName = thisArg.nodeName.toLowerCase(); + var attrName = args[0].toLowerCase(); + var attrValue = args[1]; + var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); + if (!isMatched) { + return Reflect.apply(target, thisArg, args); } - const _window = window, - sessionStorage = _window.sessionStorage; - setStorageItem(source, sessionStorage, key, validValue); hit(source); + setMatchedAttribute(thisArg); + // Forward the URI that corresponds with element's MIME type + return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); + }; + var setAttributeHandler = { + apply: setAttributeWrapper + }; + // eslint-disable-next-line max-len + instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); + var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); + if (!origSrcDescriptor) { + return; } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { + enumerable: true, + configurable: true, + get() { + return origSrcDescriptor.get.call(this); + }, + set(urlValue) { + var nodeName = this.nodeName.toLowerCase(); + var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); + if (!isMatched) { + origSrcDescriptor.set.call(this, urlValue); + return true; } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + + // eslint-disable-next-line no-undef + if (policy && urlValue instanceof TrustedScriptURL) { + var trustedSrc = policy.createScriptURL(urlValue); + origSrcDescriptor.set.call(this, trustedSrc); + hit(source); + return; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + setMatchedAttribute(this); + origSrcDescriptor.set.call(this, srcMockData[nodeName]); + hit(source); } + }); + + // https://github.com/AdguardTeam/Scriptlets/issues/228 + // Prevent error event being triggered by other sources + var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); + if (!origOnerrorDescriptor) { + return; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { + enumerable: true, + configurable: true, + get() { + return origOnerrorDescriptor.get.call(this); + }, + set(cb) { + var isMatched = this.getAttribute(source.name) === 'matched'; + if (!isMatched) { + origOnerrorDescriptor.set.call(this, cb); + return true; } + origOnerrorDescriptor.set.call(this, noopFunc); + return true; } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function setStorageItem(source, storage, key, value) { - try { - storage.setItem(key, value); - } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); - logMessage(source, message); + }); + var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { + // Check if arguments are present + if (!args[0] || !args[1] || !thisArg) { + return Reflect.apply(target, thisArg, args); } - } - function getLimitedStorageItemValue(value) { - if (typeof value !== "string") { - throw new Error("Invalid value"); + var eventName = args[0]; + var isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; + if (isMatched) { + return Reflect.apply(target, thisArg, [eventName, noopFunc]); } - let validValue; - if (value === "undefined") { - validValue = undefined; - } else if (value === "false") { - validValue = false; - } else if (value === "true") { - validValue = true; - } else if (value === "null") { - validValue = null; - } else if (value === "emptyArr") { - validValue = "[]"; - } else if (value === "emptyObj") { - validValue = "{}"; - } else if (value === "") { - validValue = ""; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - throw new Error("Invalid value"); + return Reflect.apply(target, thisArg, args); + }; + var addEventListenerHandler = { + apply: addEventListenerWrapper + }; + // eslint-disable-next-line max-len + EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); + var preventInlineOnerror = function preventInlineOnerror(tagName, src) { + window.addEventListener('error', function (event) { + if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) { + return; } - if (Math.abs(validValue) > 32767) { - throw new Error("Invalid value"); + hit(source); + if (typeof event.target.onload === 'function') { + event.target.onerror = event.target.onload; + return; } - } else if (value === "yes") { - validValue = "yes"; - } else if (value === "no") { - validValue = "no"; - } else { - throw new Error("Invalid value"); - } - return validValue; + event.target.onerror = noopFunc; + }, true); + }; + preventInlineOnerror(tagName, searchRegexp); + } + preventElementSrcLoading$1.names = ['prevent-element-src-loading']; + preventElementSrcLoading$1.injections = [hit, toRegExp, safeGetDescriptor, noopFunc]; + + /** + * @scriptlet no-topics + * + * @description + * Prevents using the Topics API. + * https://developer.chrome.com/docs/privacy-sandbox/topics/ + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('no-topics') + * ``` + * + * @added v1.6.18. + */ + function noTopics$1(source) { + var TOPICS_PROPERTY_NAME = 'browsingTopics'; + if (Document instanceof Object === false) { + return; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setSessionStorageItem.apply(this, updatedArgs); - } catch (e) { - console.log(e); + if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { + return; } + + // document.browsingTopics() is async function so it's better to return noopPromiseResolve() + // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works + Document.prototype[TOPICS_PROPERTY_NAME] = function () { + return noopPromiseResolve('[]'); + }; + hit(source); } - function trustedClickElement(source, args) { - function trustedClickElement(source, selectors) { - let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; - if (!selectors) { - return; + noTopics$1.names = ['no-topics']; + noTopics$1.injections = [hit, noopPromiseResolve]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-replace-xhr-response + * + * @description + * Replaces response content of `xhr` requests if **all** given parameters match. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]]) + * ``` + * + * - `pattern` — optional, argument for matching contents of responseText that should be replaced. + * If set, `replacement` is required. Possible values: + * - `*` to match all text content + * - non-empty string + * - regular expression + * - `replacement` — optional, should be set if `pattern` is set. String to replace matched content with. + * Empty string to remove content. + * - `propsToMatch` — optional, string of space-separated properties to match for extra condition; possible props: + * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call; + * - colon-separated pairs `name:value` where + * - `name` — string or regular expression for matching XMLHttpRequest property name + * - `value` — string or regular expression for matching the value of the option + * passed to `XMLHttpRequest.open()` call + * + * > Usage with no arguments will log XMLHttpRequest objects to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Log all XMLHttpRequests + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response') + * ``` + * + * 1. Replace text content of XMLHttpRequests with specific url + * + * + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org') + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') + * ``` + * + * + * + * 1. Remove all text content of XMLHttpRequests with specific request method + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET') + * ``` + * + * 1. Replace text content of XMLHttpRequests matching by URL regex and request methods + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') + * ``` + * + * 1. Remove all text content of all XMLHttpRequests for example.com + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ + function trustedReplaceXhrResponse$1(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + // do nothing if browser does not support Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + if (typeof Proxy === 'undefined') { + return; + } + + // Only allow pattern as empty string for logging purposes + if (pattern === '' && replacement !== '') { + var message = 'Pattern argument should not be empty string.'; + logMessage(source, message); + return; + } + var shouldLog = pattern === '' && replacement === ''; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); + if (shouldLog) { + // Log if no propsToMatch given + var _message = "xhr( ".concat(objectToString(xhrData), " )"); + logMessage(source, _message, true); + hit(source); + return Reflect.apply(target, thisArg, args); } - const OBSERVER_TIMEOUT_MS = 1e4; - const THROTTLE_DELAY_MS = 20; - const STATIC_CLICK_DELAY_MS = 150; - const COOKIE_MATCH_MARKER = "cookie:"; - const LOCAL_STORAGE_MATCH_MARKER = "localStorage:"; - const SELECTORS_DELIMITER = ","; - const COOKIE_STRING_DELIMITER = ";"; - const EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; - const sleep = function sleep(delayMs) { - return new Promise(function (resolve) { - return setTimeout(resolve, delayMs); - }); - }; - let parsedDelay; - if (delay) { - parsedDelay = parseInt(delay, 10); - const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; - if (!isValidDelay) { - const message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); - logMessage(source, message); - return; - } + if (matchRequestProps(source, propsToMatch, xhrData)) { + thisArg.shouldBePrevented = true; } - let canClick = !parsedDelay; - const cookieMatches = []; - const localStorageMatches = []; - let isInvertedMatchCookie = false; - let isInvertedMatchLocalStorage = false; - if (extraMatch) { - const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { - return matchStr.trim(); - }); - parsedExtraMatch.forEach(function (matchStr) { - if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) { - const _parseMatchArg = parseMatchArg(matchStr), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchValue = _parseMatchArg.matchValue; - isInvertedMatchCookie = isInvertedMatch; - const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ""); - cookieMatches.push(cookieMatch); - } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { - const _parseMatchArg2 = parseMatchArg(matchStr), - isInvertedMatch = _parseMatchArg2.isInvertedMatch, - matchValue = _parseMatchArg2.matchValue; - isInvertedMatchLocalStorage = isInvertedMatch; - const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ""); - localStorageMatches.push(localStorageMatch); - } - }); + + // Trap setRequestHeader of target xhr object to mimic request headers later + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - if (cookieMatches.length > 0) { - const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); - const parsedCookies = parseCookieString(document.cookie); - const cookieKeys = Object.keys(parsedCookies); - if (cookieKeys.length === 0) { - return; - } - const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { - const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; - const keyMatch = toRegExp(key); - return cookieKeys.some(function (key) { - const keysMatched = keyMatch.test(key); - if (!keysMatched) { - return false; - } - if (!valueMatch) { - return true; - } - return valueMatch.test(parsedCookies[key]); - }); - }); - const shouldRun = cookiesMatched !== isInvertedMatchCookie; - if (!shouldRun) { - return; - } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return Reflect.apply(target, thisArg, args); } - if (localStorageMatches.length > 0) { - const localStorageMatched = localStorageMatches.every(function (str) { - const itemValue = window.localStorage.getItem(str); - return itemValue || itemValue === ""; - }); - const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; - if (!shouldRun) { + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { return; } - } - let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { - return selector.trim(); - }); - const createElementObj = function createElementObj(element) { - return { - element: element || null, - clicked: false - }; - }; - const elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); - const clickElementsBySequence = async function clickElementsBySequence() { - for (let i = 0; i < elementsSequence.length; i += 1) { - const elementObj = elementsSequence[i]; - if (i >= 1) { - await sleep(STATIC_CLICK_DELAY_MS); - } - if (!elementObj.element) { - break; - } - if (!elementObj.clicked) { - elementObj.element.click(); - elementObj.clicked = true; - } - } - const allElementsClicked = elementsSequence.every(function (elementObj) { - return elementObj.clicked === true; - }); - if (allElementsClicked) { - hit(source); - } - }; - const handleElement = function handleElement(element, i) { - const elementObj = createElementObj(element); - elementsSequence[i] = elementObj; - if (canClick) { - clickElementsBySequence(); + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + + // Extract content from response + var content = responseText || response; + if (typeof content !== 'string') { + return; } - }; - const findElements = function findElements(mutations, observer) { - const fulfilledSelectors = []; - selectorsSequence.forEach(function (selector, i) { - if (!selector) { - return; - } - const element = document.querySelector(selector); - if (!element) { - return; + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); + + // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied + Object.defineProperties(thisArg, { + // original values + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + // modified values + response: { + value: modifiedContent, + writable: false + }, + responseText: { + value: modifiedContent, + writable: false } - handleElement(element, i); - fulfilledSelectors.push(selector); - }); - selectorsSequence = selectorsSequence.map(function (selector) { - return fulfilledSelectors.indexOf(selector) === -1 ? selector : null; }); - const allSelectorsFulfilled = selectorsSequence.every(function (selector) { - return selector === null; - }); - if (allSelectorsFulfilled) { - observer.disconnect(); - } - }; - const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); - observer.observe(document.documentElement, { - attributes: true, - childList: true, - subtree: true - }); - if (parsedDelay) { + + // Mock events setTimeout(function () { - clickElementsBySequence(); - canClick = true; - }, parsedDelay); - } - setTimeout(function () { - return observer.disconnect(); - }, OBSERVER_TIMEOUT_MS); - } - function hit(source) { - if (source.verbose !== true) { - return; - } + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + } + trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' + // trusted scriptlets support no aliases + ]; + + trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet xml-prune + * + * @description + * Removes an element from the specified XML. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#xml-prunejs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('xml-prune'[, propsToMatch[, optionalProp[, urlToMatch]]]) + * ``` + * + * - `propsToMatch` — optional, selector of elements which will be removed from XML + * - `optionalProp` — optional, selector of elements that must occur in XML document + * - `urlToMatch` — optional, string or regular expression for matching the request's URL + * + * > Usage with no arguments will log response payload and URL to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Remove `Period` tag whose `id` contains `-ad-` from all requests + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]') + * ``` + * + * 1. Remove `Period` tag whose `id` contains `-ad-`, only if XML contains `SegmentTemplate` + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]', 'SegmentTemplate') + * ``` + * + * 1. Remove `Period` tag whose `id` contains `-ad-`, only if request's URL contains `.mpd` + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]', '', '.mpd') + * ``` + * + * 1. Call with no arguments will log response payload and URL at the console + * + * ```adblock + * example.org#%#//scriptlet('xml-prune') + * ``` + * + * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', '', '', '.mpd') + * ``` + * + * @added 1.7.3. + */ + /* eslint-enable max-len */ + + function xmlPrune$1(source, propsToRemove) { + var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect + if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { + return; } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var isXML = function isXML(text) { + // It's necessary to check the type of 'text' + // because 'text' is obtained from the xhr/fetch response, + // so it could also be Blob/ArrayBuffer/Object or another type + if (typeof text === 'string') { + // Check if "text" starts with "<" and check if it ends with ">" + // If so, then it might be an XML file and should be pruned or logged + var trimmedText = text.trim(); + if (trimmedText.startsWith('<') && trimmedText.endsWith('>')) { + return true; + } } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + return false; + }; + var createXMLDocument = function createXMLDocument(text) { + var xmlParser = new DOMParser(); + var xmlDocument = xmlParser.parseFromString(text, 'text/xml'); + return xmlDocument; + }; + var isPruningNeeded = function isPruningNeeded(response, propsToRemove) { + if (!isXML(response)) { + return false; } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function parseCookieString(cookieString) { - const COOKIE_DELIMITER = "="; - const COOKIE_PAIRS_DELIMITER = ";"; - const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); - const cookieData = {}; - cookieChunks.forEach(function (singleCookie) { - let cookieKey; - let cookieValue; - const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); - if (delimiterIndex === -1) { - cookieKey = singleCookie.trim(); - } else { - cookieKey = singleCookie.slice(0, delimiterIndex).trim(); - cookieValue = singleCookie.slice(delimiterIndex + 1); - } - cookieData[cookieKey] = cookieValue || null; - }); - return cookieData; - } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + var docXML = createXMLDocument(response); + return !!docXML.querySelector(propsToRemove); + }; + var pruneXML = function pruneXML(text) { + if (!isXML(text)) { + shouldPruneResponse = false; + return text; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + var xmlDoc = createXMLDocument(text); + var errorNode = xmlDoc.querySelector('parsererror'); + if (errorNode) { + return text; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) { + shouldPruneResponse = false; + return text; } - nativeConsole(messageStr); - } - function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); - return { - isInvertedMatch: isInvertedMatch, - matchRegexp: matchRegexp, - matchValue: matchValue - }; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedClickElement.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function trustedReplaceFetchResponse(source, args) { - function trustedReplaceFetchResponse(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { - return; + var elems = xmlDoc.querySelectorAll(propsToRemove); + if (!elems.length) { + shouldPruneResponse = false; + return text; } - if (pattern === "" && replacement !== "") { - logMessage(source, "Pattern argument should not be empty string"); - return; + elems.forEach(function (elem) { + elem.remove(); + }); + var serializer = new XMLSerializer(); + text = serializer.serializeToString(xmlDoc); + return text; + }; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; } - const shouldLog = pattern === "" && replacement === ""; - const nativeFetch = fetch; - let shouldReplace = false; - let fetchData; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - fetchData = getFetchData(args); - if (shouldLog) { - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - if (!shouldReplace) { + + // Trap setRequestHeader of target xhr object to mimic request headers later + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + thisArg.collectedHeaders.push(args); return Reflect.apply(target, thisArg, args); - } - const forgeResponse = function forgeResponse(response, textContent) { - const bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; - const forgedResponse = new Response(textContent, { - status: status, - statusText: statusText, - headers: headers - }); - Object.defineProperties(forgedResponse, { - url: { - value: url - }, - type: { - value: type - }, - ok: { - value: ok - }, - bodyUsed: { - value: bodyUsed - }, - redirected: { - value: redirected - } - }); - return forgedResponse; }; - return nativeFetch.apply(null, args).then(function (response) { - return response.text().then(function (bodyText) { - const patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); - const modifiedTextContent = bodyText.replace(patternRegexp, replacement); - const forgedResponse = forgeResponse(response, modifiedTextContent); - hit(source); - return forgedResponse; - }).catch(function () { - const fetchDataStr = objectToString(fetchData); - const message = "Response body can't be converted to text: ".concat(fetchDataStr); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - }); - }).catch(function () { - return Reflect.apply(target, thisArg, args); - }); - }; - const fetchHandler = { - apply: handlerWrapper - }; - fetch = new Proxy(fetch, fetchHandler); - } - function hit(source) { - if (source.verbose !== true) { - return; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ['', 'text']; + // Do nothing if request do not match + // or response type is not a string + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { + return Reflect.apply(target, thisArg, args); + } + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + + // Extract content from response + var content = responseText || response; + if (typeof content !== 'string') { + return; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + if (!propsToRemove) { + if (isXML(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); + logMessage(source, createXMLDocument(response), true, false); + } + } else { + shouldPruneResponse = isPruningNeeded(response, propsToRemove); } - } - nativeConsole(messageStr); - } - function getFetchData(args) { - const fetchPropsObj = {}; - let fetchUrl; - let fetchInit; - if (args[0] instanceof Request) { - const requestData = getRequestData(args[0]); - fetchUrl = requestData.url; - fetchInit = requestData; - } else { - fetchUrl = args[0]; - fetchInit = args[1]; - } - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { - Object.keys(fetchInit).forEach(function (prop) { - fetchPropsObj[prop] = fetchInit[prop]; + var responseContent = shouldPruneResponse ? pruneXML(response) : response; + // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied + Object.defineProperties(thisArg, { + // original values + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + // modified values + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false + } }); - } - return fetchPropsObj; - } - function objectToString(obj) { - if (!obj || typeof obj !== "object") { - return String(obj); - } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); - } - return "".concat(key, ':"').concat(recordValueStr, '"'); - }).join(" "); - } - function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === "" || propsToMatch === "*") { - return true; - } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; - } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); - } - return isMatched; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); - } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; - } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getRequestData(request) { - const requestInitOptions = getRequestProps(); - const entries = requestInitOptions.map(function (key) { - const value = request[key]; - return [key, value]; - }); - return getObjectFromEntries(entries); - } - function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - } - function getObjectFromEntries(entries) { - const output = entries.reduce(function (acc, el) { - const key = el[0]; - const value = el[1]; - acc[key] = value; - return acc; - }, {}); - return output; - } - function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); - props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); - propsObj[key] = value; - } else { - propsObj.url = prop; - } - }); - return propsObj; - } - function validateParsedData(data) { - return Object.values(data).every(function (value) { - return isValidStrPattern(value); + + // Mock events + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); }); - } - function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { - matchData[key] = toRegExp(data[key]); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); }); - return matchData; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedReplaceFetchResponse.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function trustedReplaceXhrResponse(source, args) { - function trustedReplaceXhrResponse(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof Proxy === "undefined") { - return; - } - if (pattern === "" && replacement !== "") { - const message = "Pattern argument should not be empty string."; - logMessage(source, message); - return; + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } - const shouldLog = pattern === "" && replacement === ""; - const nativeOpen = window.XMLHttpRequest.prototype.open; - const nativeSend = window.XMLHttpRequest.prototype.send; - let xhrData; - const openWrapper = function openWrapper(target, thisArg, args) { - xhrData = getXhrData.apply(null, args); - if (shouldLog) { - const message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, message, true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - if (matchRequestProps(source, propsToMatch, xhrData)) { - thisArg.shouldBePrevented = true; - } - if (thisArg.shouldBePrevented) { - thisArg.collectedHeaders = []; - const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { - thisArg.collectedHeaders.push(args); - return Reflect.apply(target, thisArg, args); - }; - const setRequestHeaderHandler = { - apply: setRequestHeaderWrapper - }; - thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); - } + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + if (typeof fetchURL !== 'string' || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); - }; - const sendWrapper = function sendWrapper(target, thisArg, args) { - if (!thisArg.shouldBePrevented) { - return Reflect.apply(target, thisArg, args); + } + if (urlMatchRegexp.test(fetchURL)) { + var response = await nativeFetch(...args); + // It's required to fix issue with - Request with body": Failed to execute 'fetch' on 'Window': + // Cannot construct a Request with a Request object that has already been used. + // For example, it occurs on youtube when scriptlet is used without arguments + var clonedResponse = response.clone(); + var responseText = await response.text(); + shouldPruneResponse = isPruningNeeded(responseText, propsToRemove); + if (!shouldPruneResponse) { + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + logMessage(source, message); + logMessage(source, createXMLDocument(responseText), true, false); + return clonedResponse; } - const forgedRequest = new XMLHttpRequest(); - forgedRequest.addEventListener("readystatechange", function () { - if (forgedRequest.readyState !== 4) { - return; - } - const readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; - const content = responseText || response; - if (typeof content !== "string") { - return; - } - const patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); - const modifiedContent = content.replace(patternRegexp, replacement); - Object.defineProperties(thisArg, { - readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent - }, - responseURL: { - value: responseURL - }, - responseXML: { - value: responseXML - }, - status: { - value: status - }, - statusText: { - value: statusText - } - }); - setTimeout(function () { - const stateEvent = new Event("readystatechange"); - thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event("load"); - thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event("loadend"); - thisArg.dispatchEvent(loadEndEvent); - }, 1); + var prunedText = pruneXML(responseText); + if (shouldPruneResponse) { hit(source); - }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); - thisArg.collectedHeaders.forEach(function (header) { - const name = header[0]; - const value = header[1]; - forgedRequest.setRequestHeader(name, value); - }); - thisArg.collectedHeaders = []; - try { - nativeSend.call(forgedRequest, args); - } catch (_unused) { - return Reflect.apply(target, thisArg, args); + return new Response(prunedText, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }); } - return undefined; - }; - const openHandler = { - apply: openWrapper - }; - const sendHandler = { - apply: sendWrapper - }; - XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); - XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + return clonedResponse; + } + return Reflect.apply(target, thisArg, args); + }; + var fetchHandler = { + apply: fetchWrapper + }; + window.fetch = new Proxy(window.fetch, fetchHandler); + } + xmlPrune$1.names = ['xml-prune', + // aliases are needed for matching the related scriptlet converted into our syntax + 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune']; + xmlPrune$1.injections = [hit, logMessage, toRegExp, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet m3u-prune + * + * @description + * Removes content from the specified M3U file. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#m3u-prunejs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch]]) + * ``` + * + * - `propsToRemove` — optional, string or regular expression + * to match the URL line (segment) which will be removed alongside with its tags + * - `urlToMatch` — optional, string or regular expression for matching the request's URL + * + * > Usage with no arguments will log response payload and URL to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Removes a tag which contains `example.com/video/`, from all requests + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune', 'example.com/video/') + * ``` + * + * 1. Removes a line which contains `example.com/video/`, only if request's URL contains `.m3u8` + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune', 'example.com/video/', '.m3u8') + * ``` + * + * 1. Call with no arguments will log response payload and URL at the console + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune') + * ``` + * + * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune', '', '.m3u8') + * ``` + * + * @added v1.9.1. + */ + /* eslint-enable max-len */ + + function m3uPrune$1(source, propsToRemove) { + var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect + if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { + return; } - function hit(source) { - if (source.verbose !== true) { - return; + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var SEGMENT_MARKER = '#'; + var AD_MARKER = { + ASSET: '#EXT-X-ASSET:', + CUE: '#EXT-X-CUE:', + CUE_IN: '#EXT-X-CUE-IN', + DISCONTINUITY: '#EXT-X-DISCONTINUITY', + EXTINF: '#EXTINF', + EXTM3U: '#EXTM3U', + SCTE35: '#EXT-X-SCTE35:' + }; + var COMCAST_AD_MARKER = { + AD: '-AD-', + VAST: '-VAST-', + VMAP_AD: '-VMAP-AD-', + VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:' + }; + + // List of tags which should not be removed + var TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START']; + var isAllowedTag = function isAllowedTag(str) { + return TAGS_ALLOWLIST.some(function (el) { + return str.startsWith(el); + }); + }; + + /** + * Sets an item in array to undefined, if it contains one of the + * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY + * + * @param {Array} lines + * @param {number} i + * @returns {object} { array, index } + */ + var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { + var array = lines.slice(); + var index = i; + if (array[index].includes(AD_MARKER.EXTINF)) { + array[index] = undefined; + index += 1; + if (array[index].includes(AD_MARKER.DISCONTINUITY)) { + array[index] = undefined; + index += 1; + var prunedExtinf = pruneExtinfFromVmapBlock(array, index); + array = prunedExtinf.array; + index = prunedExtinf.index; + } } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + return { + array, + index + }; + }; + + /** + * Sets an item in array to undefined, if it contains one of the + * COMCAST_AD_MARKER: COMCAST_AD_MARKER.VMAP_AD, COMCAST_AD_MARKER.VAST, COMCAST_AD_MARKER.AD + * + * @param {Array} lines + * @returns {Array} + */ + var pruneVmapBlock = function pruneVmapBlock(lines) { + var array = lines.slice(); + for (var i = 0; i < array.length - 1; i += 1) { + if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) { + array[i] = undefined; + if (array[i + 1].includes(AD_MARKER.EXTINF)) { + i += 1; + var prunedExtinf = pruneExtinfFromVmapBlock(array, i); + array = prunedExtinf.array; + // It's necessary to subtract 1 from "i", + // otherwise one line will be skipped + i = prunedExtinf.index - 1; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + return array; + }; + + /** + * Sets an item in array to undefined, if it contains one of the + * AD_MARKER: AD_MARKER.CUE, AD_MARKER.ASSET, AD_MARKER.SCTE35, AD_MARKER.CUE_IN + * + * @param {string} line + * @param {number} index + * @param {Array} array + * @returns {string|undefined} + */ + + var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { + if (!line.startsWith(AD_MARKER.CUE)) { + return line; } - nativeConsole(messageStr); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + line = undefined; + index += 1; + if (array[index].startsWith(AD_MARKER.ASSET)) { + array[index] = undefined; + index += 1; } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + if (array[index].startsWith(AD_MARKER.SCTE35)) { + array[index] = undefined; + index += 1; } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function objectToString(obj) { - if (!obj || typeof obj !== "object") { - return String(obj); + if (array[index].startsWith(AD_MARKER.CUE_IN)) { + array[index] = undefined; + index += 1; } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); - } - return "".concat(key, ':"').concat(recordValueStr, '"'); - }).join(" "); - } - function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === "" || propsToMatch === "*") { - return true; + if (array[index].startsWith(AD_MARKER.SCTE35)) { + array[index] = undefined; } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; - } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); + return line; + }; + var removeM3ULineRegexp = toRegExp(propsToRemove); + + /** + * Sets an item in array to undefined, if it contains removeM3ULineRegexp and one of the + * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY + * + * @param {string} line + * @param {number} index + * @param {Array} array + * @returns {string|undefined} + */ + + var pruneInfBlock = function pruneInfBlock(line, index, array) { + if (!line.startsWith(AD_MARKER.EXTINF)) { + return line; } - return isMatched; - } - function getXhrData(method, url, async, user, password) { - return { - method: method, - url: url, - async: async, - user: user, - password: password - }; - } - function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { - matchData[key] = toRegExp(data[key]); - }); - return matchData; - } - function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; - } - function validateParsedData(data) { - return Object.values(data).every(function (value) { - return isValidStrPattern(value); - }); - } - function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); - props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); - propsObj[key] = value; - } else { - propsObj.url = prop; - } - }); - return propsObj; - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); + if (!removeM3ULineRegexp.test(array[index + 1])) { + return line; } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; + if (!isAllowedTag(array[index])) { + array[index] = undefined; } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedReplaceXhrResponse.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function trustedSetConstant(source, args) { - function trustedSetConstant(source, property, value, stack) { - if (!property || !matchStackTrace(stack, new Error().stack)) { - return; + index += 1; + if (!isAllowedTag(array[index])) { + array[index] = undefined; } - let constantValue; - try { - constantValue = inferValue(value); - } catch (e) { - logMessage(source, e); - return; + index += 1; + if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) { + array[index] = undefined; } - let canceled = false; - const mustCancel = function mustCancel(value) { - if (canceled) { - return canceled; - } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; - return canceled; - }; - const trapProp = function trapProp(base, prop, configurable, handler) { - if (!handler.init(base[prop])) { - return false; - } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; - if (origDescriptor instanceof Object) { - if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); - logMessage(source, message); - return false; - } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { - prevSetter = origDescriptor.set; + return line; + }; + + /** + * Removes block of segments (if it contains removeM3ULineRegexp) until another segment occurs + * + * @param {Array} lines + * @returns {Array} + */ + var pruneSegments = function pruneSegments(lines) { + for (var i = 0; i < lines.length - 1; i += 1) { + var _lines$i; + if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) { + var segmentName = lines[i].substring(0, lines[i].indexOf(':')); + if (!segmentName) { + return lines; } - } - Object.defineProperty(base, prop, { - configurable: configurable, - get() { - return handler.get(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); + lines[i] = undefined; + i += 1; + for (var j = i; j < lines.length; j += 1) { + if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) { + lines[j] = undefined; + } else { + i = j - 1; + break; } - handler.set(a); } - }); - return true; - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - const inChainPropHandler = { - factValue: undefined, - init(a) { - this.factValue = a; - return true; - }, - get() { - return this.factValue; - }, - set(a) { - if (this.factValue === a) { - return; - } - this.factValue = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - } - }; - const endPropHandler = { - init(a) { - if (mustCancel(a)) { - return false; - } - return true; - }, - get() { - return constantValue; - }, - set(a) { - if (!mustCancel(a)) { - return; - } - constantValue = a; - } - }; - if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { - hit(source); - } - return; - } - if (base !== undefined && base[prop] === null) { - trapProp(base, prop, true, inChainPropHandler); - return; - } - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - trapProp(base, prop, true, inChainPropHandler); - } - const propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { - setChainPropAccess(propValue, chain); - } - trapProp(base, prop, true, inChainPropHandler); - }; - setChainPropAccess(window, property); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function inferValue(value) { - if (value === "undefined") { - return undefined; - } - if (value === "false") { - return false; - } - if (value === "true") { - return true; - } - if (value === "null") { - return null; } - if (value === "NaN") { - return NaN; + return lines; + }; + + /** + * Determines if text contains "#EXTM3U" or "VMAP_AD_BREAK" + * + * @param {*} text + * @returns {boolean} + */ + var isM3U = function isM3U(text) { + if (typeof text === 'string') { + // Check if "text" starts with "#EXTM3U" or with "VMAP_AD_BREAK" + // If so, then it might be an M3U file and should be pruned or logged + var trimmedText = text.trim(); + return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK); } - const MAX_ALLOWED_NUM = 32767; - const numVal = Number(value); - if (!nativeIsNaN(numVal)) { - if (Math.abs(numVal) > MAX_ALLOWED_NUM) { - throw new Error("number values bigger than 32767 are not allowed"); - } - return numVal; + return false; + }; + + /** + * Determines if pruning is needed + * + * @param {string} text + * @param {RegExp} regexp + * @returns {boolean} + */ + var isPruningNeeded = function isPruningNeeded(text, regexp) { + return isM3U(text) && regexp.test(text); + }; + + /** + * Prunes lines which contain removeM3ULineRegexp and specific AD_MARKER + * + * @param {string} text + * @returns {string} + */ + // TODO: make it compatible with $hls modifier + var pruneM3U = function pruneM3U(text) { + var lines = text.split(/\n\r|\n|\r/); + if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) { + lines = pruneVmapBlock(lines); + return lines.filter(function (l) { + return !!l; + }).join('\n'); } - let errorMessage = "'".concat(value, "' value type can't be inferred"); - try { - const parsableVal = JSON.parse(value); - if (parsableVal instanceof Object || typeof parsableVal === "string") { - return parsableVal; + lines = pruneSegments(lines); + return lines.map(function (line, index, array) { + if (typeof line === 'undefined') { + return line; } - } catch (e) { - errorMessage += ": ".concat(e); - } - throw new TypeError(errorMessage); - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + line = pruneSpliceoutBlock(line, index, array); + if (typeof line !== 'undefined') { + line = pruneInfBlock(line, index, array); } + return line; + }).filter(function (l) { + return !!l; + }).join('\n'); + }; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; } - nativeConsole(messageStr); - } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain + + // Trap setRequestHeader of target xhr object to mimic request headers later + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper }; + + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function matchStackTrace(stackMatch, stackTrace) { - if (!stackMatch || stackMatch === "") { - return true; - } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { - return true; - } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }).join("\n"); - return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; - } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; - }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; - }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { - return false; - } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); - if (pos !== -1) { - documentURL = documentURL.slice(0, pos); + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ['', 'text']; + // Do nothing if request do not match + // or response type is not a string + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { + return Reflect.apply(target, thisArg, args); } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { - stackURL = stackURL.slice(1); - } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { - stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { - stackFunction = stackFunction.slice(2).trim(); - } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); - } else { - stack = stackURL; - } - } else { - stack = line; - } - return stack; - }); - if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { - if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { - return true; - } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { - return true; - } + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; } - } - return false; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedSetConstant.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function trustedSetCookie(source, args) { - function trustedSetCookie(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { - logMessage(source, "Cookie name should be specified"); - return; - } - if (typeof value === "undefined") { - logMessage(source, "Cookie value should be specified"); - return; - } - const parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { - return; - } - if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + + // Extract content from response + var content = responseText || response; + if (typeof content !== 'string') { return; } - const expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); - } - document.cookie = cookieToSet; - hit(source); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + if (!propsToRemove) { + if (isM3U(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + } else { + shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + var responseContent = shouldPruneResponse ? pruneM3U(response) : response; + // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied + Object.defineProperties(thisArg, { + // original values + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + // modified values + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false + } + }); + + // Mock events + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + if (typeof fetchURL !== 'string' || fetchURL.length === 0) { + return Reflect.apply(target, thisArg, args); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + if (urlMatchRegexp.test(fetchURL)) { + var response = await nativeFetch(...args); + // It's required to fix issue with - Request with body": Failed to execute 'fetch' on 'Window': + // Cannot construct a Request with a Request object that has already been used. + // For example, it occurs on youtube when scriptlet is used without arguments + var clonedResponse = response.clone(); + var responseText = await response.text(); + // If "propsToRemove" is not defined, then response should be logged only + if (!propsToRemove && isM3U(responseText)) { + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + logMessage(source, message); + return clonedResponse; + } + if (isPruningNeeded(responseText, removeM3ULineRegexp)) { + var prunedText = pruneM3U(responseText); + hit(source); + return new Response(prunedText, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }); } + return clonedResponse; } - nativeConsole(messageStr); + return Reflect.apply(target, thisArg, args); + }; + var fetchHandler = { + apply: fetchWrapper + }; + window.fetch = new Proxy(window.fetch, fetchHandler); + } + m3uPrune$1.names = ['m3u-prune', + // aliases are needed for matching the related scriptlet converted into our syntax + 'm3u-prune.js', 'ubo-m3u-prune.js', 'ubo-m3u-prune']; + m3uPrune$1.injections = [hit, toRegExp, logMessage, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-cookie + * + * @description + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value. Possible values: + * - arbitrary value + * - empty string for no value + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; + * defaults to no offset. Possible values: + * - positive integer in seconds + * - `1year` keyword for setting expiration date to one year + * - `1day` keyword for setting expiration date to one day + * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet does not encode cookie names and values. + * > As a result, if a cookie's name or value includes `;`, + * > the scriptlet will not set the cookie since this may cause the cookie to break. + * + * ### Examples + * + * 1. Set cookie + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept') + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '1-accept_1') + * ``` + * + * 1. Set cookie with `new Date().getTime()` value + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$') + * ``` + * + * 1. Set cookie which will expire in 3 days + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '259200') + * ``` + * + * 1. Set cookie which will expire in one year + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year') + * ``` + * + * 1. Set cookie with no path + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ + + function trustedSetCookie$1(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; + if (typeof name === 'undefined') { + logMessage(source, 'Cookie name should be specified'); + return; } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + if (typeof value === 'undefined') { + logMessage(source, 'Cookie value should be specified'); + return; } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; + var parsedValue = parseKeywordValue(value); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - const ONE_YEAR_EXPIRATION_KEYWORD = "1year"; - const ONE_DAY_EXPIRATION_KEYWORD = "1day"; - const MS_IN_SEC = 1e3; - const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - const SECONDS_IN_DAY = 24 * 60 * 60; - let parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_DAY; - } else { - parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { - return null; - } - } - return parsedSec * MS_IN_SEC; + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); + if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); + return; } - function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = "$now$"; - const CURRENT_DATE_KEYWORD = "$currentDate$"; - let parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { - parsedValue = Date.now().toString(); - } else if (rawValue === CURRENT_DATE_KEYWORD) { - parsedValue = Date(); + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; } - return parsedValue; + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; - } - return ""; + document.cookie = cookieToSet; + hit(source); + } + trustedSetCookie$1.names = ['trusted-set-cookie' + // trusted scriptlets support no aliases + ]; + + trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-cookie-reload + * + * @description + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. + * Also reloads the current page after the cookie setting. + * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie). + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value. Possible values: + * - arbitrary value + * - empty string for no value + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; + * defaults to no offset. Possible values: + * - positive integer in seconds + * - `1year` keyword for setting expiration date to one year + * - `1day` keyword for setting expiration date to one day + * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet does not encode cookie names and values. + * > As a result, if a cookie's name or value includes `;`, + * > the scriptlet will not set the cookie since this may cause the cookie to break. + * + * ### Examples + * + * 1. Set cookie and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept') + * ``` + * + * 1. Set cookie with `new Date().getTime()` value and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$') + * ``` + * + * 1. Set cookie which will expire in 3 days and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200') + * ``` + * + * 1. Set cookie which will expire in one year and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year') + * ``` + * + * 1. Set cookie with no 'expire' and no path, reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') + * ``` + * + * @added v1.7.10. + */ + /* eslint-enable max-len */ + + function trustedSetCookieReload$1(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; + if (typeof name === 'undefined') { + logMessage(source, 'Cookie name should be specified'); + return; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedSetCookie.apply(this, updatedArgs); - } catch (e) { - console.log(e); + if (typeof value === 'undefined') { + logMessage(source, 'Cookie value should be specified'); + return; } - } - function trustedSetCookieReload(source, args) { - function trustedSetCookieReload(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { - logMessage(source, "Cookie name should be specified"); - return; - } - if (typeof value === "undefined") { - logMessage(source, "Cookie value should be specified"); - return; - } - if (isCookieSetWithValue(document.cookie, name, value)) { - return; - } - const parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { - return; - } - if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; - } - const expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); - } - document.cookie = cookieToSet; - hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + + // Prevent infinite reloads if cookie was already set or blocked by the browser + // https://github.com/AdguardTeam/Scriptlets/issues/212 + if (isCookieSetWithValue(document.cookie, name, value)) { + return; } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } + var parsedValue = parseKeywordValue(value); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); + if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); + return; + } + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - function isCookieSetWithValue(cookieString, name, value) { - return cookieString.split(";").some(function (cookieStr) { - const pos = cookieStr.indexOf("="); - if (pos === -1) { - return false; - } - const cookieName = cookieStr.slice(0, pos).trim(); - const cookieValue = cookieStr.slice(pos + 1).trim(); - return name === cookieName && value === cookieValue; - }); + document.cookie = cookieToSet; + hit(source); + + // Get cookie value, it's required for checking purpose + // in case if $now$ or $currentDate$ value is used + // https://github.com/AdguardTeam/Scriptlets/issues/291 + var cookieValueToCheck = parseCookieString(document.cookie)[name]; + + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 + if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) { + window.location.reload(); } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + } + trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' + // trusted scriptlets support no aliases + ]; + + trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, parseCookieString, getCookiePath]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-replace-fetch-response + * + * @description + * Replaces response text content of `fetch` requests if **all** given parameters match. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-replace-fetch-response'[, pattern, replacement[, propsToMatch]]) + * ``` + * + * - `pattern` — optional, argument for matching contents of responseText that should be replaced. + * If set, `replacement` is required. Possible values: + * - `*` to match all text content + * - non-empty string + * - regular expression + * - `replacement` — optional, should be set if `pattern` is set. String to replace the response text content + * matched by `pattern`. Empty string to remove content. Defaults to empty string. + * - `propsToMatch` — optional, string of space-separated properties to match; possible props: + * - string or regular expression for matching the URL passed to fetch call; + * empty string, wildcard `*` or invalid regular expression will match all fetch calls + * - colon-separated pairs `name:value` where + * + * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters) + * - `value` is string or regular expression for matching the value of the option passed to fetch call; + * invalid regular expression will cause any value matching + * + * > Usage with no arguments will log fetch calls to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * > Scriptlet does nothing if response body can't be converted to text. + * + * ### Examples + * + * 1. Log all fetch calls + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response') + * ``` + * + * 1. Replace response text content of fetch requests with specific url + * + * + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', 'adb_detect:true', 'adb_detect:false', 'example.org') + * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') + * ``` + * + * + * + * 1. Remove all text content of fetch responses with specific request method + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'method:GET') + * ``` + * + * 1. Replace response text content of fetch requests matching by URL regex and request methods + * + * + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') + * ``` + * + * + * + * 1. Remove text content of all fetch responses for example.com + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ + function trustedReplaceFetchResponse$1(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { + return; } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; + + // Only allow pattern as empty string for logging purposes + if (pattern === '' && replacement !== '') { + logMessage(source, 'Pattern argument should not be empty string'); + return; } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - const ONE_YEAR_EXPIRATION_KEYWORD = "1year"; - const ONE_DAY_EXPIRATION_KEYWORD = "1day"; - const MS_IN_SEC = 1e3; - const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - const SECONDS_IN_DAY = 24 * 60 * 60; - let parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_DAY; - } else { - parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { - return null; - } + var shouldLog = pattern === '' && replacement === ''; + var nativeFetch = fetch; + var shouldReplace = false; + var fetchData; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + fetchData = getFetchData(args); + if (shouldLog) { + // log if no propsToMatch given + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); } - return parsedSec * MS_IN_SEC; - } - function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = "$now$"; - const CURRENT_DATE_KEYWORD = "$currentDate$"; - let parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { - parsedValue = Date.now().toString(); - } else if (rawValue === CURRENT_DATE_KEYWORD) { - parsedValue = Date(); + shouldReplace = matchRequestProps(source, propsToMatch, fetchData); + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); } - return parsedValue; + + /** + * Create new Response object using original response' properties + * and given text as body content + * + * @param {Response} response original response to copy properties from + * @param {string} textContent text to set as body content + * @returns {Response} + */ + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; + var forgedResponse = new Response(textContent, { + status, + statusText, + headers + }); + + // Manually set properties which can't be set by Response constructor + Object.defineProperties(forgedResponse, { + url: { + value: url + }, + type: { + value: type + }, + ok: { + value: ok + }, + bodyUsed: { + value: bodyUsed + }, + redirected: { + value: redirected + } + }); + return forgedResponse; + }; + + // eslint-disable-next-line prefer-spread + return nativeFetch.apply(null, args).then(function (response) { + return response.text().then(function (bodyText) { + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); + hit(source); + return forgedResponse; + }).catch(function () { + // log if response body can't be converted to a string + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + }); + }).catch(function () { + return Reflect.apply(target, thisArg, args); + }); + }; + var fetchHandler = { + apply: handlerWrapper + }; + fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign + } + + trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response' + // trusted scriptlets support no aliases + ]; + + trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-local-storage-item + * + * @description + * Adds item with arbitrary key and value to localStorage object, or updates the value of the key if it already exists. + * Scriptlet won't set item if storage is full. + * + * ### Syntax + * + * ```adblock + * example.com#%#//scriptlet('trusted-set-local-storage-item', 'key', 'value') + * ``` + * + * - `key` — required, key name to be set. + * - `value` — required, key value; possible values: + * - arbitrary value + * - `$now$` keyword for setting current time in ms, corresponds to `Date.now()` and `(new Date).getTime()` calls + * - `$currentDate$` keyword for setting string representation of the current date and time, + * corresponds to `Date()` and `(new Date).toString()` calls + * + * ### Examples + * + * 1. Set local storage item + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.mute', 'false') + * + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'COOKIE_CONSENTS', '{"preferences":3,"flag":false}') + * + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '[16364,88364]') + * + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '{"providers":[123,456],"consent":"all"}') + * ``` + * + * 1. Set item with current time since unix epoch in ms + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$now$') + * ``` + * + * 1. Set item with current date, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$currentDate$') + * ``` + * + * 1. Set item without value + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ + + function trustedSetLocalStorageItem$1(source, key, value) { + if (typeof key === 'undefined') { + logMessage(source, 'Item key should be specified'); + return; } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; - } - return ""; + if (typeof value === 'undefined') { + logMessage(source, 'Item value should be specified'); + return; + } + var parsedValue = parseKeywordValue(value); + var _window = window, + localStorage = _window.localStorage; + setStorageItem(source, localStorage, key, parsedValue); + hit(source); + } + trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item' + // trusted scriptlets support no aliases + ]; + + trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-constant + * + * @description + * Creates a constant property and assigns it a specified value. + * + * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type. + * + * > If empty object is present in chain it will be trapped until chain leftovers appear. + * + * > Use [set-constant](./about-scriptlets.md#set-constant) to set predefined values and functions. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-set-constant', property, value[, stack]) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`. + * - `value` — required, an arbitrary value to be set; value type is being inferred from the argument, + * e.g '500' will be set as number; to set string type value wrap argument into another pair of quotes: `'"500"'`; + * - `stack` — optional, string or regular expression that must match the current function call stack trace; + * if regular expression is invalid it will be skipped + * + * ### Examples + * + * 1. Set property values of different types + * + * ```adblock + * ! Set string value wrapping argument into another pair of quotes + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '"null"') + * + * ✔ window.click_r === 'null' + * ✔ typeof window.click_r === 'string' + * + * ! Set inferred null value + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', 'null') + * + * ✔ window.click_r === null + * ✔ typeof window.click_r === 'object' + * + * ! Set number type value + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '48') + * + * ✔ window.click_r === 48 + * ✔ typeof window.click_r === 'number' + * + * ! Set array or object as property value, argument should be a JSON string + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '[1,"string"]') + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '{"aaa":123,"bbb":{"ccc":"string"}}') + * ``` + * + * 1. Use script stack matching to set value + * + * ```adblock + * ! `document.first` will return `1` if the method is related to `checking.js` + * example.org#%#//scriptlet('trusted-set-constant', 'document.first', '1', 'checking.js') + * + * ✔ document.first === 1 // if the condition described above is met + * ``` + * + * @added v1.8.2. + */ + /* eslint-enable max-len */ + function trustedSetConstant$1(source, property, value, stack) { + if (!property || !matchStackTrace(stack, new Error().stack)) { + return; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var constantValue; try { - trustedSetCookieReload.apply(this, updatedArgs); + constantValue = inferValue(value); } catch (e) { - console.log(e); + logMessage(source, e); + return; } - } - function trustedSetLocalStorageItem(source, args) { - function trustedSetLocalStorageItem(source, key, value) { - if (typeof key === "undefined") { - logMessage(source, "Item key should be specified"); - return; - } - if (typeof value === "undefined") { - logMessage(source, "Item value should be specified"); - return; + var canceled = false; + var mustCancel = function mustCancel(value) { + if (canceled) { + return canceled; } - const parsedValue = parseKeywordValue(value); - const _window = window, - localStorage = _window.localStorage; - setStorageItem(source, localStorage, key, parsedValue); - hit(source); - } - function hit(source) { - if (source.verbose !== true) { - return; + canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; + return canceled; + }; + + /** + * Safely sets property on a given object + * + * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} base arbitrary reachable object + * @param {string} prop property name + * @param {boolean} configurable if set property should be configurable + * @param {object} handler custom property descriptor object + * @returns {boolean} true if prop was trapped successfully + */ + var trapProp = function trapProp(base, prop, configurable, handler) { + if (!handler.init(base[prop])) { + return false; } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + // This is required to prevent scriptlets overwrite each over + if (origDescriptor instanceof Object) { + // This check is required to avoid defining non-configurable props + if (!origDescriptor.configurable) { + var message = "Property '".concat(prop, "' is not configurable"); + logMessage(source, message); + return false; } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + base[prop] = constantValue; + if (origDescriptor.set instanceof Function) { + prevSetter = origDescriptor.set; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + Object.defineProperty(base, prop, { + configurable, + get() { + return handler.get(); + }, + set(a) { + if (prevSetter !== undefined) { + prevSetter(a); + } + handler.set(a); } - } - nativeConsole(messageStr); - } - function setStorageItem(source, storage, key, value) { - try { - storage.setItem(key, value); - } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); - logMessage(source, message); - } - } - function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = "$now$"; - const CURRENT_DATE_KEYWORD = "$currentDate$"; - let parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { - parsedValue = Date.now().toString(); - } else if (rawValue === CURRENT_DATE_KEYWORD) { - parsedValue = Date(); - } - return parsedValue; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedSetLocalStorageItem.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function xmlPrune(source, args) { - function xmlPrune(source, propsToRemove) { - var _this = this; - let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { - return; - } - let shouldPruneResponse = true; - if (!propsToRemove) { - shouldPruneResponse = false; - } - const urlMatchRegexp = toRegExp(urlToMatch); - const isXML = function isXML(text) { - if (typeof text === "string") { - const trimedText = text.trim(); - if (trimedText.startsWith("<") && trimedText.endsWith(">")) { - return true; + }); + return true; + }; + + /** + * Traverses given chain to set constant value to its end prop + * Chains that yet include non-object values (e.g null) are valid and will be + * traversed when appropriate chain member is set by an external script + * + * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} owner object that owns chain + * @param {string} property chain of owner properties + */ + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + + // Handler method init is used to keep track of factual value + // and apply mustCancel() check only on end prop + var inChainPropHandler = { + factValue: undefined, + init(a) { + this.factValue = a; + return true; + }, + get() { + return this.factValue; + }, + set(a) { + // Prevent breakage due to loop assignments like win.obj = win.obj + if (this.factValue === a) { + return; + } + this.factValue = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); } } - return false; - }; - const createXMLDocument = function createXMLDocument(text) { - const xmlParser = new DOMParser(); - const xmlDocument = xmlParser.parseFromString(text, "text/xml"); - return xmlDocument; - }; - const pruneXML = function pruneXML(text) { - if (!isXML(text)) { - shouldPruneResponse = false; - return text; - } - const xmlDoc = createXMLDocument(text); - const errorNode = xmlDoc.querySelector("parsererror"); - if (errorNode) { - return text; - } - if (optionalProp !== "" && xmlDoc.querySelector(optionalProp) === null) { - shouldPruneResponse = false; - return text; - } - const elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { - shouldPruneResponse = false; - return text; - } - elems.forEach(function (elem) { - elem.remove(); - }); - const serializer = new XMLSerializer(); - text = serializer.serializeToString(xmlDoc); - return text; - }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== "string" || xhrURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener("readystatechange", function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener("readystatechange", pruneResponse); - if (!shouldPruneResponse) { - if (isXML(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - logMessage(source, createXMLDocument(response), true, false); - } - } else { - const prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { - Object.defineProperty(thisArg, "response", { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, "responseText", { - value: prunedResponseContent - }); - hit(source); - } - shouldPruneResponse = true; - } - } - }); - } - return Reflect.apply(target, thisArg, args); - }; - const xhrHandler = { - apply: xhrWrapper - }; - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; - if (typeof fetchURL !== "string" || fetchURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(fetchURL)) { - return nativeFetch.apply(_this, args).then(function (response) { - return response.text().then(function (text) { - if (!shouldPruneResponse) { - if (isXML(text)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text); - logMessage(source, message); - logMessage(source, createXMLDocument(text), true, false); - } - return Reflect.apply(target, thisArg, args); - } - const prunedText = pruneXML(text); - if (shouldPruneResponse) { - hit(source); - return new Response(prunedText, { - status: response.status, - statusText: response.statusText, - headers: response.headers - }); - } - shouldPruneResponse = true; - return Reflect.apply(target, thisArg, args); - }); - }); - } - return Reflect.apply(target, thisArg, args); }; - const fetchHandler = { - apply: fetchWrapper - }; - window.fetch = new Proxy(window.fetch, fetchHandler); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + var endPropHandler = { + init(a) { + if (mustCancel(a)) { + return false; } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + return true; + }, + get() { + return constantValue; + }, + set(a) { + if (!mustCancel(a)) { + return; + } + constantValue = a; } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + }; + + // End prop case + if (!chain) { + var isTrapped = trapProp(base, prop, false, endPropHandler); + if (isTrapped) { + hit(source); } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { return; } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); + + // Null prop in chain + if (base !== undefined && base[prop] === null) { + trapProp(base, prop, true, inChainPropHandler); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + + // Empty object prop in chain + if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { + trapProp(base, prop, true, inChainPropHandler); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + + // Defined prop in chain + var propValue = owner[prop]; + if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { + setChainPropAccess(propValue, chain); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - xmlPrune.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } + + // Undefined prop in chain + trapProp(base, prop, true, inChainPropHandler); + }; + setChainPropAccess(window, property); } - const scriptletsMap = { - "abort-current-inline-script": abortCurrentInlineScript, - "abort-current-script.js": abortCurrentInlineScript, - "ubo-abort-current-script.js": abortCurrentInlineScript, - "acs.js": abortCurrentInlineScript, - "ubo-acs.js": abortCurrentInlineScript, - "ubo-abort-current-script": abortCurrentInlineScript, - "ubo-acs": abortCurrentInlineScript, - "abort-current-inline-script.js": abortCurrentInlineScript, - "ubo-abort-current-inline-script.js": abortCurrentInlineScript, - "acis.js": abortCurrentInlineScript, - "ubo-acis.js": abortCurrentInlineScript, - "ubo-abort-current-inline-script": abortCurrentInlineScript, - "ubo-acis": abortCurrentInlineScript, - "abp-abort-current-inline-script": abortCurrentInlineScript, - "abort-on-property-read": abortOnPropertyRead, - "abort-on-property-read.js": abortOnPropertyRead, - "ubo-abort-on-property-read.js": abortOnPropertyRead, - "aopr.js": abortOnPropertyRead, - "ubo-aopr.js": abortOnPropertyRead, - "ubo-abort-on-property-read": abortOnPropertyRead, - "ubo-aopr": abortOnPropertyRead, - "abp-abort-on-property-read": abortOnPropertyRead, - "abort-on-property-write": abortOnPropertyWrite, - "abort-on-property-write.js": abortOnPropertyWrite, - "ubo-abort-on-property-write.js": abortOnPropertyWrite, - "aopw.js": abortOnPropertyWrite, - "ubo-aopw.js": abortOnPropertyWrite, - "ubo-abort-on-property-write": abortOnPropertyWrite, - "ubo-aopw": abortOnPropertyWrite, - "abp-abort-on-property-write": abortOnPropertyWrite, - "abort-on-stack-trace": abortOnStackTrace, - "abort-on-stack-trace.js": abortOnStackTrace, - "ubo-abort-on-stack-trace.js": abortOnStackTrace, - "aost.js": abortOnStackTrace, - "ubo-aost.js": abortOnStackTrace, - "ubo-abort-on-stack-trace": abortOnStackTrace, - "ubo-aost": abortOnStackTrace, - "abp-abort-on-stack-trace": abortOnStackTrace, - "adjust-setInterval": adjustSetInterval, - "nano-setInterval-booster.js": adjustSetInterval, - "ubo-nano-setInterval-booster.js": adjustSetInterval, - "nano-sib.js": adjustSetInterval, - "ubo-nano-sib.js": adjustSetInterval, - "ubo-nano-setInterval-booster": adjustSetInterval, - "ubo-nano-sib": adjustSetInterval, - "adjust-setTimeout": adjustSetTimeout, - "nano-setTimeout-booster.js": adjustSetTimeout, - "ubo-nano-setTimeout-booster.js": adjustSetTimeout, - "nano-stb.js": adjustSetTimeout, - "ubo-nano-stb.js": adjustSetTimeout, - "ubo-nano-setTimeout-booster": adjustSetTimeout, - "ubo-nano-stb": adjustSetTimeout, - "debug-current-inline-script": debugCurrentInlineScript, - "debug-on-property-read": debugOnPropertyRead, - "debug-on-property-write": debugOnPropertyWrite, - "dir-string": dirString, - "abp-dir-string": dirString, - "disable-newtab-links": disableNewtabLinks, - "disable-newtab-links.js": disableNewtabLinks, - "ubo-disable-newtab-links.js": disableNewtabLinks, - "ubo-disable-newtab-links": disableNewtabLinks, - "close-window": forceWindowClose, - "window-close-if.js": forceWindowClose, - "ubo-window-close-if.js": forceWindowClose, - "ubo-window-close-if": forceWindowClose, - "hide-in-shadow-dom": hideInShadowDom, - "inject-css-in-shadow-dom": injectCssInShadowDom, - "json-prune": jsonPrune, - "json-prune.js": jsonPrune, - "ubo-json-prune.js": jsonPrune, - "ubo-json-prune": jsonPrune, - "abp-json-prune": jsonPrune, - log: log, - "log-addEventListener": logAddEventListener, - "addEventListener-logger.js": logAddEventListener, - "ubo-addEventListener-logger.js": logAddEventListener, - "aell.js": logAddEventListener, - "ubo-aell.js": logAddEventListener, - "ubo-addEventListener-logger": logAddEventListener, - "ubo-aell": logAddEventListener, - "log-eval": logEval, - "log-on-stack-trace": logOnStacktrace, - "m3u-prune": m3uPrune, - "m3u-prune.js": m3uPrune, - "ubo-m3u-prune.js": m3uPrune, - "ubo-m3u-prune": m3uPrune, - "no-topics": noTopics, - noeval: noeval, - "noeval.js": noeval, - "silent-noeval.js": noeval, - "ubo-noeval.js": noeval, - "ubo-silent-noeval.js": noeval, - "ubo-noeval": noeval, - "ubo-silent-noeval": noeval, - nowebrtc: nowebrtc, - "nowebrtc.js": nowebrtc, - "ubo-nowebrtc.js": nowebrtc, - "ubo-nowebrtc": nowebrtc, - "prevent-addEventListener": preventAddEventListener, - "addEventListener-defuser.js": preventAddEventListener, - "ubo-addEventListener-defuser.js": preventAddEventListener, - "aeld.js": preventAddEventListener, - "ubo-aeld.js": preventAddEventListener, - "ubo-addEventListener-defuser": preventAddEventListener, - "ubo-aeld": preventAddEventListener, - "prevent-adfly": preventAdfly, - "adfly-defuser.js": preventAdfly, - "ubo-adfly-defuser.js": preventAdfly, - "ubo-adfly-defuser": preventAdfly, - "prevent-bab": preventBab, - "prevent-element-src-loading": preventElementSrcLoading, - "prevent-eval-if": preventEvalIf, - "noeval-if.js": preventEvalIf, - "ubo-noeval-if.js": preventEvalIf, - "ubo-noeval-if": preventEvalIf, - "prevent-fab-3.2.0": preventFab, - "nofab.js": preventFab, - "ubo-nofab.js": preventFab, - "fuckadblock.js-3.2.0": preventFab, - "ubo-fuckadblock.js-3.2.0": preventFab, - "ubo-nofab": preventFab, - "prevent-fetch": preventFetch, - "no-fetch-if.js": preventFetch, - "ubo-no-fetch-if.js": preventFetch, - "ubo-no-fetch-if": preventFetch, - "prevent-popads-net": preventPopadsNet, - "popads.net.js": preventPopadsNet, - "ubo-popads.net.js": preventPopadsNet, - "ubo-popads.net": preventPopadsNet, - "prevent-refresh": preventRefresh, - "refresh-defuser.js": preventRefresh, - "refresh-defuser": preventRefresh, - "ubo-refresh-defuser.js": preventRefresh, - "ubo-refresh-defuser": preventRefresh, - "prevent-requestAnimationFrame": preventRequestAnimationFrame, - "no-requestAnimationFrame-if.js": preventRequestAnimationFrame, - "ubo-no-requestAnimationFrame-if.js": preventRequestAnimationFrame, - "norafif.js": preventRequestAnimationFrame, - "ubo-norafif.js": preventRequestAnimationFrame, - "ubo-no-requestAnimationFrame-if": preventRequestAnimationFrame, - "ubo-norafif": preventRequestAnimationFrame, - "prevent-setInterval": preventSetInterval, - "no-setInterval-if.js": preventSetInterval, - "ubo-no-setInterval-if.js": preventSetInterval, - "setInterval-defuser.js": preventSetInterval, - "ubo-setInterval-defuser.js": preventSetInterval, - "nosiif.js": preventSetInterval, - "ubo-nosiif.js": preventSetInterval, - "sid.js": preventSetInterval, - "ubo-sid.js": preventSetInterval, - "ubo-no-setInterval-if": preventSetInterval, - "ubo-setInterval-defuser": preventSetInterval, - "ubo-nosiif": preventSetInterval, - "ubo-sid": preventSetInterval, - "prevent-setTimeout": preventSetTimeout, - "no-setTimeout-if.js": preventSetTimeout, - "ubo-no-setTimeout-if.js": preventSetTimeout, - "nostif.js": preventSetTimeout, - "ubo-nostif.js": preventSetTimeout, - "ubo-no-setTimeout-if": preventSetTimeout, - "ubo-nostif": preventSetTimeout, - "setTimeout-defuser.js": preventSetTimeout, - "ubo-setTimeout-defuser.js": preventSetTimeout, - "ubo-setTimeout-defuser": preventSetTimeout, - "std.js": preventSetTimeout, - "ubo-std.js": preventSetTimeout, - "ubo-std": preventSetTimeout, - "prevent-window-open": preventWindowOpen, - "window.open-defuser.js": preventWindowOpen, - "ubo-window.open-defuser.js": preventWindowOpen, - "ubo-window.open-defuser": preventWindowOpen, - "nowoif.js": preventWindowOpen, - "ubo-nowoif.js": preventWindowOpen, - "ubo-nowoif": preventWindowOpen, - "prevent-xhr": preventXHR, - "no-xhr-if.js": preventXHR, - "ubo-no-xhr-if.js": preventXHR, - "ubo-no-xhr-if": preventXHR, - "remove-attr": removeAttr, - "remove-attr.js": removeAttr, - "ubo-remove-attr.js": removeAttr, - "ra.js": removeAttr, - "ubo-ra.js": removeAttr, - "ubo-remove-attr": removeAttr, - "ubo-ra": removeAttr, - "remove-class": removeClass, - "remove-class.js": removeClass, - "ubo-remove-class.js": removeClass, - "rc.js": removeClass, - "ubo-rc.js": removeClass, - "ubo-remove-class": removeClass, - "ubo-rc": removeClass, - "remove-cookie": removeCookie, - "cookie-remover.js": removeCookie, - "ubo-cookie-remover.js": removeCookie, - "ubo-cookie-remover": removeCookie, - "remove-in-shadow-dom": removeInShadowDom, - "set-attr": setAttr, - "set-constant": setConstant, - "set-constant.js": setConstant, - "ubo-set-constant.js": setConstant, - "set.js": setConstant, - "ubo-set.js": setConstant, - "ubo-set-constant": setConstant, - "ubo-set": setConstant, - "abp-override-property-read": setConstant, - "set-cookie": setCookie, - "set-cookie-reload": setCookieReload, - "set-local-storage-item": setLocalStorageItem, - "set-popads-dummy": setPopadsDummy, - "popads-dummy.js": setPopadsDummy, - "ubo-popads-dummy.js": setPopadsDummy, - "ubo-popads-dummy": setPopadsDummy, - "set-session-storage-item": setSessionStorageItem, - "trusted-click-element": trustedClickElement, - "trusted-replace-fetch-response": trustedReplaceFetchResponse, - "trusted-replace-xhr-response": trustedReplaceXhrResponse, - "trusted-set-constant": trustedSetConstant, - "trusted-set-cookie": trustedSetCookie, - "trusted-set-cookie-reload": trustedSetCookieReload, - "trusted-set-local-storage-item": trustedSetLocalStorageItem, - "xml-prune": xmlPrune, - "xml-prune.js": xmlPrune, - "ubo-xml-prune.js": xmlPrune, - "ubo-xml-prune": xmlPrune - }; - var getScriptletFunction = function getScriptletFunction(name) { - return scriptletsMap[name]; - }; + trustedSetConstant$1.names = ['trusted-set-constant' + // trusted scriptlets support no aliases + ]; - /** - * @typedef {Object} Source Scriptlet properties. - * @property {string} name Scriptlet name. - * @property {Array} args Arguments for scriptlet function. - * @property {'extension'|'corelibs'|'test'} engine Defines the final form of scriptlet string presentation. - * @property {string} [version] Extension version. - * @property {boolean} [verbose] Flag to enable debug information printing to console. - * @property {string} [ruleText] Source rule text, needed for debug purposes. - * @property {string} [domainName] Domain name where scriptlet is applied, needed for debug purposes. - */ + trustedSetConstant$1.injections = [hit, inferValue, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest, + // following helpers should be imported and injected + // because they are used by helpers above + shouldAbortInlineOrInjectedScript]; + /* eslint-disable max-len */ /** - * Returns scriptlet code by `source`. + * @scriptlet inject-css-in-shadow-dom * - * @param {Source} source Scriptlet properties. + * @description + * Injects CSS rule into selected Shadow DOM subtrees on a page * - * @returns {string|null} Scriptlet code. - * @throws An error on unknown scriptlet name. + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('inject-css-in-shadow-dom', cssRule[, hostSelector]) + * ``` + * + * - `cssRule` — required, string representing a single css rule + * - `hostSelector` — optional, string, selector to match shadow host elements. + * CSS rule will be only applied to shadow roots inside these elements. + * Defaults to injecting css rule into all available roots. + * + * ### Examples + * + * 1. Apply style to all shadow dom subtrees + * + * ```adblock + * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#advertisement { display: none !important; }') + * ``` + * + * 1. Apply style to a specific shadow dom subtree + * + * ```adblock + * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#content { margin-top: 0 !important; }', '#banner') + * ``` + * + * @added v1.8.2. */ - function getScriptletCode(source) { - if (!validator.isValidScriptletName(source.name)) { - return null; + /* eslint-enable max-len */ + + function injectCssInShadowDom$1(source, cssRule) { + var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + // do nothing if browser does not support ShadowRoot, Proxy or Reflect + // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot + if (!Element.prototype.attachShadow || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { + return; } - const scriptletFunction = getScriptletFunction(source.name); - // In case isValidScriptletName check will pass invalid scriptlet name, - // for example when there is a bad alias - if (typeof scriptletFunction !== 'function') { - throw new Error("Error: cannot invoke scriptlet with name: '".concat(source.name, "'")); + + // Prevent url() and image-set() styles from being applied + if (cssRule.match(/(url|image-set)\(.*\)/i)) { + logMessage(source, '"url()" function is not allowed for css rules'); + return; } - const scriptletFunctionString = scriptletFunction.toString(); - const result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString); - return result; + var callback = function callback(shadowRoot) { + try { + // adoptedStyleSheets and CSSStyleSheet constructor are not yet supported by Safari + // https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptedStyleSheets + // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet + var stylesheet = new CSSStyleSheet(); + try { + stylesheet.insertRule(cssRule); + } catch (e) { + logMessage(source, "Unable to apply the rule '".concat(cssRule, "' due to: \n'").concat(e.message, "'")); + return; + } + shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet]; + } catch (_unused) { + var styleTag = document.createElement('style'); + styleTag.innerText = cssRule; + shadowRoot.appendChild(styleTag); + } + hit(source); + }; + hijackAttachShadow(window, hostSelector, callback); } + injectCssInShadowDom$1.names = ['inject-css-in-shadow-dom']; + injectCssInShadowDom$1.injections = [hit, logMessage, hijackAttachShadow]; + /* eslint-disable max-len */ /** - * Scriptlets variable + * @scriptlet remove-node-text * - * @returns {Object} object with methods: - * `invoke` method receives one argument with `Source` type - * `validate` method receives one argument with `String` type - */ - const scriptletsObject = function () { - return { - invoke: getScriptletCode, - getScriptletFunction, - isValidScriptletName: validator.isValidScriptletName, - isValidScriptletRule, - isAdgScriptletRule: validator.isAdgScriptletRule, - isUboScriptletRule: validator.isUboScriptletRule, - isAbpSnippetRule: validator.isAbpSnippetRule, - convertUboToAdg: convertUboScriptletToAdg, - convertAbpToAdg: convertAbpSnippetToAdg, - convertScriptletToAdg, - convertAdgToUbo: convertAdgScriptletToUbo, - redirects - }; - }(); - - /** - * Add module exports to be used as node package - */ - module.exports = scriptletsObject; - -})); - -/** - * ------------------------------------------- - * | | - * | If you want to add your own scriptlet | - * | please put your code below | - * | | - * ------------------------------------------- - */ - + * @description + * Removes text from DOM nodes. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/commit/2bb446797a12086f2eebc0c8635b671b8b90c477 + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('remove-node-text', nodeName, condition) + * ``` + * + * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed. + * Must target lowercased node names, e.g `div` instead of `DIV`. + * - `textMatch` — required, string or RegExp to match against node's text content. + * If matched, the whole text will be removed. Case sensitive. + * + * ### Examples + * + * 1. Remove node's text content: + * + * ```adblock + * example.org#%#//scriptlet('remove-node-text', 'div', 'some text') + * ``` + * + * ```html + * + *
some text
+ * some text + * + * + *
+ * some text + * ``` + * + * 2. Remove node's text content, matching both node name and condition by RegExp: + * + * ```adblock + * example.org#%#//scriptlet('remove-node-text', '/[a-z]*[0-9]/', '/text/') + * ``` + * + * ```html + * + * some text + * some text + * + * + * + * some text + * ``` + * + * @added v1.9.37. + */ + /* eslint-enable max-len */ + function removeNodeText$1(source, nodeName, textMatch) { + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch; -/***/ }), + /** + * Handles nodes by removing text content of matched nodes + * + * Note: instead of drilling down all the arguments for both replace-node-text + * and trusted-replace-node-text scriptlets, only the handler is being passed + * + * @param {Node[]} nodes nodes to handle + * @returns {void} + */ + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + var ALL_TEXT_PATTERN = /^[\s\S]*$/; + var REPLACEMENT = ''; + replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT); + } + }); + }; -/***/ 7160: -/***/ (function(module) { + // Apply dedicated handler to already rendered nodes... + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); + } -!function(e,t){ true?module.exports=t():0}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=90)}({17:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n=r(18),i=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},e.getAndroidVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),a=Math.max(i,s),o=0,u=e.map([t,r],(function(t){var r=a-e.getVersionPrecision(t),n=t+new Array(r+1).join(".0");return e.map(n.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(n&&(o=a-Math.min(i,s)),a-=1;a>=o;){if(u[0][a]>u[1][a])return 1;if(u[0][a]===u[1][a]){if(a===o)return 0;a-=1}else if(u[0][a]1?i-1:0),a=1;a0){var a=Object.keys(r),u=o.default.find(a,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=o.default.find(a,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(s>0){var l=Object.keys(i),h=o.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(i[h])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=o.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if("string"==typeof i)return">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(n=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(o.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\/(\d+(\.?_?\d+)+)/i,a=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(e){var t={name:"Opera Touch"},r=i.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},r=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},r=i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=i.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},r=i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=a,e.exports=t.default},93:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/Roku\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return{name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=i.default.getWindowsVersionName(t);return{name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:s.OS_MAP.iOS},r=i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return{name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||i.default.getFirstMatch(/\bbb(\d+)/i,e);return{name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.PlayStation4,version:t}}}];t.default=a,e.exports=t.default},94:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:s.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:s.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return"android"===e.getOSName(!0)&&t>=3},describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}}];t.default=a,e.exports=t.default},95:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return{name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return{name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=a,e.exports=t.default}})})); + // and newly added nodes + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + removeNodeText$1.names = ['remove-node-text', + // aliases are needed for matching the related scriptlet converted into our syntax + 'remove-node-text.js', 'ubo-remove-node-text.js', 'rmnt.js', 'ubo-rmnt.js', 'ubo-remove-node-text', 'ubo-rmnt']; + removeNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams, + // following helpers should be imported and injected + // because they are used by helpers above + hit, nodeListToArray, getAddedNodes, toRegExp]; -/***/ }), + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-replace-node-text + * + * @description + * Replaces text in text content of matched DOM nodes. + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-node-text', nodeName, textMatch, pattern, replacement) + * ``` + * + * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed. + * Must target lowercased node names, e.g `div` instead of `DIV`. + * - `textMatch` — required, string or RegExp to match against node's text content. + * If matched, the whole text will be removed. Case sensitive. + * - `pattern` — required, string or regexp for matching contents of `node.textContent` that should be replaced. + * - `replacement` — required, string to replace text content matched by `pattern`. + * + * ### Examples + * + * 1. Replace node's text content: + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-node-text', 'div', 'some', 'text', 'other text') + * ``` + * + * ```html + * + *
some text
+ *
text
+ * some text + * + * + *
some other text
+ *
text
+ * some text + * ``` + * + * 2. Replace node's text content, matching both node name, text and pattern by RegExp: + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-node-text', '/[a-z]*[0-9]/', '/s\dme/', '/t\dxt/', 'other text') + * ``` + * + * ```html + * + * s0me t3xt // this node is going to be matched by both node name and text + * text // this node won't be matched by text content nor text content + * some text + * + * + * s0me other text // text content has changed + * text + * some text + * ``` + * + * @added v1.9.37. + */ + /* eslint-enable max-len */ + function trustedReplaceNodeText$1(source, nodeName, textMatch, pattern, replacement) { + var uboAliases = ['replace-node-text.js', 'rpnt.js', 'sed.js']; -/***/ 7111: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * UBO replaceNodeText scriptlet has different signature: + * function replaceNodeText(nodeName, pattern, replacement, ...extraArgs) {...} + * + * with extra params being passed as ['paramname', paramvalue] + */ + if (uboAliases.includes(source.name)) { + replacement = pattern; + pattern = textMatch; + // eslint-disable-next-line prefer-destructuring, prefer-rest-params + for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) { + extraArgs[_key - 5] = arguments[_key]; + } + for (var i = 0; i < extraArgs.length; i += 1) { + var arg = extraArgs[i]; + if (arg === 'condition') { + textMatch = extraArgs[i + 1]; + break; + } + } + } + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch, + patternMatch = _parseNodeTextParams.patternMatch; -var isCallable = __webpack_require__(6733); -var tryToString = __webpack_require__(9821); + /** + * Handles nodes by removing text content of matched nodes + * + * Note: instead of drilling down all the arguments for both replace-node-text + * and trusted-replace-node-text scriptlets, only the handler is being passed + * + * @param {Node[]} nodes nodes to handle + * @returns {void} + */ + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + replaceNodeText(source, node, patternMatch, replacement); + } + }); + }; -var $TypeError = TypeError; + // Apply dedicated handler to already rendered nodes... + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); + } -// `Assert: IsCallable(argument) is true` -module.exports = function (argument) { - if (isCallable(argument)) return argument; - throw $TypeError(tryToString(argument) + ' is not a function'); -}; + // and newly added nodes + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + trustedReplaceNodeText$1.names = ['trusted-replace-node-text' + // trusted scriptlets support no aliases + ]; + trustedReplaceNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams, + // following helpers should be imported and injected + // because they are used by helpers above + hit, nodeListToArray, getAddedNodes, toRegExp]; -/***/ }), + /* eslint-disable max-len */ + /** + * @scriptlet evaldata-prune + * + * @description + * Removes specified properties from the result of calling eval (if payloads contains `Object`) and returns to the caller. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/commit/c8de9041917b61035171e454df886706f27fc4f3 + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('evaldata-prune'[, propsToRemove [, obligatoryProps [, stack]]]) + * ``` + * + * - `propsToRemove` — optional, string of space-separated properties to remove + * - `obligatoryProps` — optional, string of space-separated properties + * which must be all present for the pruning to occur + * - `stack` — optional, string or regular expression that must match the current function call stack trace; + * if regular expression is invalid it will be skipped + * + * > Note please that you can use wildcard `*` for chain property name, + * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`. + * + * ### Examples + * + * 1. Removes property `example` from the payload of the eval call + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'example') + * ``` + * + * For instance, the following call will return `{ one: 1}` + * + * ```html + * eval({ one: 1, example: true }) + * ``` + * + * 2. If there are no specified properties in the payload of eval call, pruning will NOT occur + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'one', 'obligatoryProp') + * ``` + * + * For instance, the following call will return `{ one: 1, two: 2}` + * + * ```html + * JSON.parse('{"one":1,"two":2}') + * ``` + * + * 3. A property in a list of properties can be a chain of properties + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'a.b', 'ads.url.first') + * ``` + * + * 4. Removes property `content.ad` from the payload of eval call if its error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'content.ad', '', 'test.js') + * ``` + * + * 5. A property in a list of properties can be a chain of properties with wildcard in it + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'content.*.media.src', 'content.*.media.ad') + * ``` + * + * 6. Call with no arguments will log the current hostname and object payload at the console + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune') + * ``` + * + * 7. Call with only second argument will log the current hostname and matched object payload at the console + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', '', '"id":"117458"') + * ``` + * + * @added v1.9.37. + */ + /* eslint-enable max-len */ + function evalDataPrune$1(source, propsToRemove, requiredInitialProps, stack) { + if (!!stack && !matchStackTrace(stack, new Error().stack)) { + return; + } + var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; + var evalWrapper = function evalWrapper(target, thisArg, args) { + var data = Reflect.apply(target, thisArg, args); + if (typeof data === 'object') { + data = jsonPruner(source, data, prunePaths, requiredPaths); + } + return data; + }; + var evalHandler = { + apply: evalWrapper + }; + // eslint-disable-next-line no-eval + window.eval = new Proxy(window.eval, evalHandler); + } + evalDataPrune$1.names = ['evaldata-prune', + // aliases are needed for matching the related scriptlet converted into our syntax + 'evaldata-prune.js', 'ubo-evaldata-prune.js', 'ubo-evaldata-prune']; + evalDataPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, toRegExp, isPruningNeeded, jsonPruner, + // following helpers are needed for helpers above + getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; -/***/ 8505: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * This file must export all scriptlets which should be accessible + */ -var isCallable = __webpack_require__(6733); + var scriptletList = /*#__PURE__*/Object.freeze({ + __proto__: null, + abortCurrentInlineScript: abortCurrentInlineScript$1, + abortOnPropertyRead: abortOnPropertyRead$1, + abortOnPropertyWrite: abortOnPropertyWrite$1, + abortOnStackTrace: abortOnStackTrace$1, + adjustSetInterval: adjustSetInterval$1, + adjustSetTimeout: adjustSetTimeout$1, + debugCurrentInlineScript: debugCurrentInlineScript$1, + debugOnPropertyRead: debugOnPropertyRead$1, + debugOnPropertyWrite: debugOnPropertyWrite$1, + dirString: dirString$1, + disableNewtabLinks: disableNewtabLinks$1, + evalDataPrune: evalDataPrune$1, + forceWindowClose: forceWindowClose$1, + hideInShadowDom: hideInShadowDom$1, + injectCssInShadowDom: injectCssInShadowDom$1, + jsonPrune: jsonPrune$1, + log: log$1, + logAddEventListener: logAddEventListener$1, + logEval: logEval$1, + logOnStacktrace: logOnStacktrace$1, + m3uPrune: m3uPrune$1, + noTopics: noTopics$1, + noeval: noeval$1, + nowebrtc: nowebrtc$1, + preventAddEventListener: preventAddEventListener$1, + preventAdfly: preventAdfly$1, + preventBab: preventBab$2, + preventElementSrcLoading: preventElementSrcLoading$1, + preventEvalIf: preventEvalIf$1, + preventFab: preventFab$1, + preventFetch: preventFetch$1, + preventPopadsNet: preventPopadsNet$1, + preventRefresh: preventRefresh$1, + preventRequestAnimationFrame: preventRequestAnimationFrame$1, + preventSetInterval: preventSetInterval$1, + preventSetTimeout: preventSetTimeout$1, + preventWindowOpen: preventWindowOpen$1, + preventXHR: preventXHR$1, + removeAttr: removeAttr$1, + removeClass: removeClass$1, + removeCookie: removeCookie$1, + removeInShadowDom: removeInShadowDom$1, + removeNodeText: removeNodeText$1, + setAttr: setAttr$1, + setConstant: setConstant$1, + setCookie: setCookie$1, + setCookieReload: setCookieReload$1, + setLocalStorageItem: setLocalStorageItem$1, + setPopadsDummy: setPopadsDummy$1, + setSessionStorageItem: setSessionStorageItem$1, + trustedClickElement: trustedClickElement$1, + trustedReplaceFetchResponse: trustedReplaceFetchResponse$1, + trustedReplaceNodeText: trustedReplaceNodeText$1, + trustedReplaceXhrResponse: trustedReplaceXhrResponse$1, + trustedSetConstant: trustedSetConstant$1, + trustedSetCookie: trustedSetCookie$1, + trustedSetCookieReload: trustedSetCookieReload$1, + trustedSetLocalStorageItem: trustedSetLocalStorageItem$1, + xmlPrune: xmlPrune$1 + }); -var $String = String; -var $TypeError = TypeError; + /** + * Store of ADG redirects names and their analogs. + * As it is not a compatibility table, no need to keep in redirects array third-party redirects. + * + * Needed only for conversion purposes. + * e.g. googletagmanager-gtm is removed and should be removed from compatibility table as well + * but now it works as alias for google-analytics so it should stay valid for compiler + */ + var redirects$1 = [{ + adg: '1x1-transparent.gif', + ubo: '1x1.gif', + abp: '1x1-transparent-gif' + }, { + adg: '2x2-transparent.png', + ubo: '2x2.png', + abp: '2x2-transparent-png' + }, { + adg: '3x2-transparent.png', + ubo: '3x2.png', + abp: '3x2-transparent-png' + }, { + adg: '32x32-transparent.png', + ubo: '32x32.png', + abp: '32x32-transparent-png' + }, { + adg: 'amazon-apstag', + ubo: 'amazon_apstag.js' + }, { + adg: 'ati-smarttag' + }, { + adg: 'didomi-loader' + }, { + adg: 'click2load.html', + ubo: 'click2load.html' + }, { + adg: 'fingerprintjs2', + ubo: 'fingerprint2.js' + }, { + adg: 'fingerprintjs3', + ubo: 'fingerprint3.js' + }, { + adg: 'google-analytics', + ubo: 'google-analytics_analytics.js' + }, { + adg: 'google-analytics-ga', + ubo: 'google-analytics_ga.js' + }, { + adg: 'googlesyndication-adsbygoogle', + ubo: 'googlesyndication_adsbygoogle.js' + }, { + // https://github.com/AdguardTeam/Scriptlets/issues/162 + adg: 'googlesyndication-adsbygoogle', + ubo: 'googlesyndication.com/adsbygoogle.js' + }, { + // https://github.com/AdguardTeam/Scriptlets/issues/127 + adg: 'googletagmanager-gtm', + ubo: 'google-analytics_ga.js' + }, { + // https://github.com/AdguardTeam/Scriptlets/issues/260 + adg: 'googletagmanager-gtm', + ubo: 'googletagmanager_gtm.js' + }, { + adg: 'googletagservices-gpt', + ubo: 'googletagservices_gpt.js' + }, { + adg: 'google-ima3', + ubo: 'google-ima.js' + }, { + adg: 'gemius' + }, { + adg: 'matomo' + }, { + adg: 'metrika-yandex-watch' + }, { + adg: 'metrika-yandex-tag' + }, { + adg: 'naver-wcslog' + }, { + adg: 'noeval', + ubo: 'noeval-silent.js' + }, { + adg: 'noopcss', + ubo: 'noop.css', + abp: 'blank-css' + }, { + adg: 'noopframe', + ubo: 'noop.html', + abp: 'blank-html' + }, { + adg: 'noopjs', + ubo: 'noop.js', + abp: 'blank-js' + }, { + adg: 'noopjson' + }, { + adg: 'nooptext', + ubo: 'noop.txt', + abp: 'blank-text' + }, { + adg: 'noopmp3-0.1s', + ubo: 'noop-0.1s.mp3', + abp: 'blank-mp3' + }, { + adg: 'noopmp4-1s', + ubo: 'noop-1s.mp4', + abp: 'blank-mp4' + }, { + adg: 'noopvmap-1.0', + ubo: 'noop-vmap1.0.xml' + }, { + adg: 'noopvast-2.0' + }, { + adg: 'noopvast-3.0' + }, { + adg: 'noopvast-4.0' + }, { + adg: 'prebid' + }, { + adg: 'pardot-1.0' + }, { + adg: 'prevent-bab', + ubo: 'nobab.js' + }, { + adg: 'prevent-bab2', + ubo: 'nobab2.js' + }, { + adg: 'prevent-fab-3.2.0', + ubo: 'nofab.js' + }, { + // AG-15917 + adg: 'prevent-fab-3.2.0', + ubo: 'fuckadblock.js-3.2.0' + }, { + adg: 'prevent-popads-net', + ubo: 'popads.js' + }, { + adg: 'scorecardresearch-beacon', + ubo: 'scorecardresearch_beacon.js' + }, { + adg: 'set-popads-dummy', + ubo: 'popads-dummy.js' + }, { + adg: 'empty', + ubo: 'empty' + }, { + adg: 'prebid-ads', + ubo: 'prebid-ads.js' + }]; -module.exports = function (argument) { - if (typeof argument == 'object' || isCallable(argument)) return argument; - throw $TypeError("Can't set " + $String(argument) + ' as a prototype'); -}; + var JS_RULE_MARKER = '#%#'; + var COMMENT_MARKER = '!'; + /** + * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false) + * + * @param rule rule text + * @returns if rule text is comment + */ + var isComment = function isComment(rule) { + return rule.startsWith(COMMENT_MARKER); + }; -/***/ }), + /* ************************************************************************ + * + * Scriptlets + * + ************************************************************************** */ -/***/ 9736: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * uBlock scriptlet rule mask + */ + var UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\s*\+js/; + var UBO_SCRIPTLET_MASK_1 = '##+js'; + var UBO_SCRIPTLET_MASK_2 = '##script:inject'; + var UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js'; + var UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject'; -var wellKnownSymbol = __webpack_require__(95); -var create = __webpack_require__(2391); -var defineProperty = (__webpack_require__(1787).f); + /** + * AdBlock Plus snippet rule mask + */ + var ABP_SCRIPTLET_MASK = '#$#'; + var ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#'; -var UNSCOPABLES = wellKnownSymbol('unscopables'); -var ArrayPrototype = Array.prototype; + /** + * AdGuard CSS rule mask + */ + var ADG_CSS_MASK_REG = /#@?\$#.+?\s*\{.*\}\s*$/g; -// Array.prototype[@@unscopables] -// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables -if (ArrayPrototype[UNSCOPABLES] == undefined) { - defineProperty(ArrayPrototype, UNSCOPABLES, { - configurable: true, - value: create(null) - }); -} + /** + * Checks if the `rule` is AdGuard scriptlet rule + * + * @param rule - rule text + * @returns true if given rule is adg rule + */ + var isAdgScriptletRule = function isAdgScriptletRule(rule) { + return !isComment(rule) && rule.includes(ADG_SCRIPTLET_MASK); + }; -// add a key to Array.prototype[@@unscopables] -module.exports = function (key) { - ArrayPrototype[UNSCOPABLES][key] = true; -}; + /** + * Checks if the `rule` is uBO scriptlet rule + * + * @param rule rule text + * @returns true if given rule is ubo rule + */ + var isUboScriptletRule = function isUboScriptletRule(rule) { + return (rule.includes(UBO_SCRIPTLET_MASK_1) || rule.includes(UBO_SCRIPTLET_MASK_2) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_1) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_2)) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule); + }; + /** + * Checks if the `rule` is AdBlock Plus snippet + * + * @param rule rule text + * @returns true if given rule is abp rule + */ + var isAbpSnippetRule = function isAbpSnippetRule(rule) { + return (rule.includes(ABP_SCRIPTLET_MASK) || rule.includes(ABP_SCRIPTLET_EXCEPTION_MASK)) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule); + }; -/***/ }), + /** + * Returns array of scriptlet objects. + * Needed for scriptlet name validation which will check aliases names. + * + * @returns Array of all scriptlet objects. + */ + var getScriptletsObjList = function getScriptletsObjList() { + return Object.values(scriptletList); + }; -/***/ 1176: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * Finds scriptlet by the `name`. + * + * @param name Scriptlet name. + * @param scriptlets Array of all scriptlet objects. + * @returns {Function} Scriptlet function. + */ + var getScriptletByName = function getScriptletByName(name, scriptlets) { + if (!scriptlets) { + scriptlets = getScriptletsObjList(); + } + return scriptlets.find(function (s) { + return s.names + // full match name checking + && (s.names.includes(name) + // or check ubo alias name without '.js' at the end + || !name.endsWith('.js') && s.names.includes("".concat(name, ".js"))); + }); + }; + var scriptletObjects = getScriptletsObjList(); -var isObject = __webpack_require__(5052); + /** + * Checks whether the scriptlet `name` is valid by checking the scriptlet list object. + * + * @param name Scriptlet name. + * @returns True if scriptlet name is valid. + */ + var isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) { + if (!name) { + return false; + } + return !!getScriptletByName(name, scriptletObjects); + }; -var $String = String; -var $TypeError = TypeError; + /** + * Cache for better performance of scriptlet name validation. + */ + var scriptletNameValidationCache = new Map(); -// `Assert: Type(argument) is Object` -module.exports = function (argument) { - if (isObject(argument)) return argument; - throw $TypeError($String(argument) + ' is not an object'); -}; + /** + * Checks whether the `name` is valid scriptlet name. + * Uses cache for better performance. + * + * @param name Scriptlet name. + * @returns true if scriptlet name is a valid one. + */ + var isValidScriptletName = function isValidScriptletName(name) { + if (!name) { + return false; + } + // if there is no cached validation value + if (!scriptletNameValidationCache.has(name)) { + // we should calculate it first + var isValid = isValidScriptletNameNotCached(name); + // and save it to the cache then + scriptletNameValidationCache.set(name, isValid); + return isValid; + } + // otherwise return cached validation result + return scriptletNameValidationCache.get(name); + }; + /* ************************************************************************ + * + * Redirects + * + ************************************************************************** */ -/***/ }), + /** + * Redirect resources markers + */ + var ADG_UBO_REDIRECT_MARKER = 'redirect='; + var ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule='; + var ABP_REDIRECT_MARKER = 'rewrite=abp-resource:'; + var EMPTY_REDIRECT_MARKER = 'empty'; + var VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other']; -/***/ 9540: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toIndexedObject = __webpack_require__(905); -var toAbsoluteIndex = __webpack_require__(3231); -var lengthOfArrayLike = __webpack_require__(9646); + /** + * Source types for redirect rules if there is no one of them. + * Used for ADG -> UBO conversion. + */ + var ABSENT_SOURCE_TYPE_REPLACEMENT = [{ + NAME: 'nooptext', + TYPES: VALID_SOURCE_TYPES + }, { + NAME: 'noopcss', + TYPES: ['stylesheet'] + }, { + NAME: 'noopjs', + TYPES: ['script'] + }, { + NAME: 'noopframe', + TYPES: ['subdocument'] + }, { + NAME: '1x1-transparent.gif', + TYPES: ['image'] + }, { + NAME: 'noopmp3-0.1s', + TYPES: ['media'] + }, { + NAME: 'noopmp4-1s', + TYPES: ['media'] + }, { + NAME: 'googlesyndication-adsbygoogle', + TYPES: ['xmlhttprequest', 'script'] + }, { + NAME: 'google-analytics', + TYPES: ['script'] + }, { + NAME: 'googletagservices-gpt', + TYPES: ['script'] + }]; + var validAdgRedirects = redirects$1.filter(function (el) { + return !!el.adg; + }); -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = lengthOfArrayLike(O); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare -- NaN check - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare -- NaN check - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; + /** + * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names + * It's used for UBO -> ADG converting + */ + var uboToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) { + return !!el.ubo; + }).map(function (el) { + return [el.ubo, el.adg]; + })); -module.exports = { - // `Array.prototype.includes` method - // https://tc39.es/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.es/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) -}; + /** + * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names + * It's used for ABP -> ADG converting + */ + var abpToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) { + return !!el.abp; + }).map(function (el) { + return [el.abp, el.adg]; + })); + /** + * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names + * It's used for ADG -> UBO converting + */ + var adgToUboCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) { + return el.ubo; + }).map(function (el) { + return [el.adg, el.ubo]; + })); -/***/ }), + /** + * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names + * 'adgToUboCompatibility' is still needed for ADG -> UBO converting + */ + var validAdgCompatibility = Object.fromEntries(validAdgRedirects.map(function (el) { + return [el.adg, 'valid adg redirect']; + })); + var REDIRECT_RULE_TYPES = { + ["VALID_ADG"]: { + redirectMarker: ADG_UBO_REDIRECT_MARKER, + compatibility: validAdgCompatibility, + redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER + }, + ["ADG"]: { + redirectMarker: ADG_UBO_REDIRECT_MARKER, + compatibility: adgToUboCompatibility, + redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER + }, + ["UBO"]: { + redirectMarker: ADG_UBO_REDIRECT_MARKER, + compatibility: uboToAdgCompatibility, + redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER + }, + ["ABP"]: { + redirectMarker: ABP_REDIRECT_MARKER, + compatibility: abpToAdgCompatibility + } + }; -/***/ 6554: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * Parses redirect rule modifiers + * + * @param rule rule text + * @returns list of rule modifiers + */ + var parseModifiers = function parseModifiers(rule) { + return substringAfter$1(rule, '$').split(','); + }; -"use strict"; + /** + * Gets redirect resource name + * + * @param rule rule text + * @param marker - specific Adg/Ubo or Abp redirect resources marker + * @returns - redirect resource name + */ + var getRedirectName = function getRedirectName(rule, marker) { + var ruleModifiers = parseModifiers(rule); + var redirectNamePart = ruleModifiers.find(function (el) { + return el.includes(marker); + }); + return redirectNamePart ? substringAfter$1(redirectNamePart, marker) : null; + }; -var DESCRIPTORS = __webpack_require__(7400); -var isArray = __webpack_require__(3718); + /** + * Checks if the `rule` is AdGuard redirect rule. + * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier. + * + * @param rule - rule text + * @returns true if given rule is adg redirect + */ + var isAdgRedirectRule = function isAdgRedirectRule(rule) { + var MARKER_IN_BASE_PART_MASK = '/((?!\\$|\\,).{1})redirect((-rule)?)=(.{0,}?)\\$(popup)?/'; + var _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES["ADG"], + redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, + redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker; + return !isComment(rule) && (rule.includes(redirectMarker) || typeof redirectRuleMarker === 'string' && rule.includes(redirectRuleMarker)) + // some js rules may have 'redirect=' in it, so we should get rid of them + && !rule.includes(JS_RULE_MARKER) + // get rid of rules like '_redirect=*://look.$popup' + && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule); + }; -var $TypeError = TypeError; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + /** + * Checks if the `rule` satisfies the `type` + * + * @param rule - rule text + * @param type - type of a redirect rule + * @returns if the `rule` satisfies the `type` + */ + var isRedirectRuleByType = function isRedirectRuleByType(rule, type) { + var _REDIRECT_RULE_TYPES$2 = REDIRECT_RULE_TYPES[type], + redirectMarker = _REDIRECT_RULE_TYPES$2.redirectMarker, + redirectRuleMarker = _REDIRECT_RULE_TYPES$2.redirectRuleMarker, + compatibility = _REDIRECT_RULE_TYPES$2.compatibility; + if (rule && !isComment(rule)) { + var marker; + // check if there is a $redirect-rule modifier in rule + var markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1; + if (markerIndex > -1) { + marker = redirectRuleMarker; + } else { + // check if there $redirect modifier in rule + markerIndex = rule.indexOf(redirectMarker); + if (markerIndex > -1) { + marker = redirectMarker; + } else { + return false; + } + } + if (!marker) { + return false; + } + var redirectName = getRedirectName(rule, marker); + if (!redirectName) { + return false; + } + return redirectName === Object.keys(compatibility).find(function (el) { + return el === redirectName; + }); + } + return false; + }; -// Safari < 13 does not throw an error in this case -var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { - // makes no sense without proper strict mode support - if (this !== undefined) return true; - try { - // eslint-disable-next-line es/no-object-defineproperty -- safe - Object.defineProperty([], 'length', { writable: false }).length = 1; - } catch (error) { - return error instanceof TypeError; - } -}(); + /** + * Checks if the `rule` is **valid** AdGuard redirect resource rule + * + * @param rule - rule text + * @returns true if given rule is valid adg redirect + */ + var isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) { + return isRedirectRuleByType(rule, "VALID_ADG"); + }; -module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { - if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { - throw $TypeError('Cannot set read only .length'); - } return O.length = length; -} : function (O, length) { - return O.length = length; -}; + /** + * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion + * + * @param rule - AdGuard rule text + * @returns - true if the rule can be converted to Ubo + */ + var isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) { + return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, "ADG"); + }; + /** + * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion + * + * @param rule - Ubo rule text + * @returns - true if the rule can be converted to AdGuard + */ + var isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) { + return isRedirectRuleByType(rule, "UBO"); + }; -/***/ }), + /** + * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion + * + * @param rule - Abp rule text + * @returns - true if the rule can be converted to AdGuard + */ + var isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) { + return isRedirectRuleByType(rule, "ABP"); + }; -/***/ 7079: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * Checks if the rule has specified content type before Adg -> Ubo conversion. + * + * Used ONLY for Adg -> Ubo conversion + * because Ubo redirect rules must contain content type, but Adg and Abp must not. + * + * Also source type can not be added automatically because of such valid rules: + * ! Abp: + * $rewrite=abp-resource:blank-js,xmlhttprequest + * ! Adg: + * $script,redirect=noopvast-2.0 + * $xmlhttprequest,redirect=noopvast-2.0 + * + * @param rule rule text + * @returns if the rule has specified content type before conversion + */ + var hasValidContentType = function hasValidContentType(rule) { + var ruleModifiers = parseModifiers(rule); + // rule can have more than one source type modifier + var sourceTypes = ruleModifiers.filter(function (el) { + return VALID_SOURCE_TYPES.includes(el); + }); + var isSourceTypeSpecified = sourceTypes.length > 0; + var isEmptyRedirect = ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER)); + if (isEmptyRedirect) { + // no source type for 'empty' is allowed + return true; + } + return isSourceTypeSpecified; + }; + var validator = { + UBO_SCRIPTLET_MASK_REG, + ABP_SCRIPTLET_MASK, + ABP_SCRIPTLET_EXCEPTION_MASK, + isComment, + isAdgScriptletRule, + isUboScriptletRule, + isAbpSnippetRule, + getScriptletByName, + isValidScriptletName, + ADG_UBO_REDIRECT_RULE_MARKER, + REDIRECT_RULE_TYPES, + ABSENT_SOURCE_TYPE_REPLACEMENT, + isAdgRedirectRule, + isValidAdgRedirectRule, + isAdgRedirectCompatibleWithUbo, + isUboRedirectCompatibleWithAdg, + isAbpRedirectCompatibleWithAdg, + parseModifiers, + getRedirectName, + hasValidContentType + }; -var uncurryThis = __webpack_require__(5968); + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } -var toString = uncurryThis({}.toString); -var stringSlice = uncurryThis(''.slice); + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); + } -module.exports = function (it) { - return stringSlice(toString(it), 8, -1); -}; + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } -/***/ }), + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } -/***/ 1589: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + function _toArray(arr) { + return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); + } -var TO_STRING_TAG_SUPPORT = __webpack_require__(1601); -var isCallable = __webpack_require__(6733); -var classofRaw = __webpack_require__(7079); -var wellKnownSymbol = __webpack_require__(95); + /** + * AdGuard scriptlet rule + */ + var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; + // eslint-disable-next-line no-template-curly-in-string + var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; + // eslint-disable-next-line no-template-curly-in-string + var ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})'; -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var $Object = Object; + /** + * uBlock scriptlet rule mask + */ + // eslint-disable-next-line no-template-curly-in-string + var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; + // eslint-disable-next-line no-template-curly-in-string + var UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})'; + var UBO_ALIAS_NAME_MARKER = 'ubo-'; + var UBO_SCRIPTLET_JS_ENDING = '.js'; -// ES3 wrong here -var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr + var UBO_XHR_TYPE = 'xhr'; + var ADG_XHR_TYPE = 'xmlhttprequest'; + var ADG_SET_CONSTANT_NAME = 'set-constant'; + var ADG_SET_CONSTANT_EMPTY_STRING = ''; + var ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr'; + var ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj'; + var UBO_SET_CONSTANT_EMPTY_STRING = '\'\''; + var UBO_SET_CONSTANT_EMPTY_ARRAY = '[]'; + var UBO_SET_CONSTANT_EMPTY_OBJECT = '{}'; + var ADG_PREVENT_FETCH_NAME = 'prevent-fetch'; + var ADG_PREVENT_FETCH_EMPTY_STRING = ''; + var ADG_PREVENT_FETCH_WILDCARD = '*'; + var UBO_NO_FETCH_IF_WILDCARD = '/^/'; + var ESCAPED_COMMA_SEPARATOR = '\\,'; + var COMMA_SEPARATOR = ','; + var REMOVE_ATTR_METHOD = 'removeAttr'; + var REMOVE_CLASS_METHOD = 'removeClass'; + var REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names; + var REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names; + var REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; + var ABP_RESOURCE_MARKER = 'abp-resource:'; + + /** + * Possible rule origins. + */ + var Origin = /*#__PURE__*/function (Origin) { + Origin["Ubo"] = "ubo"; + Origin["Abp"] = "abp"; + Origin["AdgValid"] = "adgValid"; + Origin["AdgInvalid"] = "adgInvalid"; + return Origin; + }(Origin || {}); + /** + * Array of origin names in the order they must be checked for rule conversion. + */ + var originNames = [Origin.Ubo, Origin.Abp, Origin.AdgValid, Origin.AdgInvalid]; -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } -}; + /** + * Returns array of strings separated by space which is not in quotes + * + * @param str arbitrary string + * @returns result array + * @throws + */ + var getAbpSnippetArguments = function getAbpSnippetArguments(str) { + var reg = /'.*?'|".*?"|\S+/g; + var sentences = str.match(reg); + if (!sentences) { + throw new Error('Invalid ABP snippet args.'); + } + return sentences; + }; -// getting tag from ES6+ `Object.prototype.toString` -module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; -}; + /** + * Replaces string with data by placeholders + * + * @param str string with placeholders + * @param data where keys are placeholders names + * @returns string filled with data + */ + var replacePlaceholders = function replacePlaceholders(str, data) { + return Object.keys(data).reduce(function (acc, key) { + var reg = new RegExp("\\$\\{".concat(key, "\\}"), 'g'); + acc = acc.replace(reg, data[key]); + return acc; + }, str); + }; + var splitArgs = function splitArgs(str) { + var args = []; + var prevArgStart = 0; + for (var i = 0; i < str.length; i += 1) { + // do not split args by escaped comma + // https://github.com/AdguardTeam/Scriptlets/issues/133 + if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\') { + args.push(str.slice(prevArgStart, i).trim()); + prevArgStart = i + 1; + } + } + // collect arg after last comma + args.push(str.slice(prevArgStart, str.length).trim()); + return args; + }; + /** + * Validates remove-attr/class scriptlet args + * + * @param parsedArgs scriptlet arguments + * @returns valid args OR error for invalid selector + */ + var validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) { + var _parsedArgs = _toArray(parsedArgs), + name = _parsedArgs[0], + value = _parsedArgs[1], + restArgs = _parsedArgs.slice(2); + // no extra checking if there are only scriptlet name and value + // https://github.com/AdguardTeam/Scriptlets/issues/235 + if (restArgs.length === 0) { + return [name, value]; + } -/***/ }), + // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should: + // 1. check if last arg is 'applying' parameter + // 2. join 'selector' into one arg + // 3. combine all args + // https://github.com/AdguardTeam/Scriptlets/issues/133 + var lastArg = restArgs.pop(); // https://github.com/microsoft/TypeScript/issues/30406 + var applying; + // check the last parsed arg for matching possible 'applying' vale + if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) { + return lastArg.includes(el); + })) { + applying = lastArg; + } else { + restArgs.push(lastArg); + } + var selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR); + if (selector.length > 0 && typeof document !== 'undefined') { + // empty selector is valid for these scriptlets as it applies to all elements, + // all other selectors should be validated + // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html') + document.querySelectorAll(selector); + } + var validArgs = applying ? [name, value, selector, applying] : [name, value, selector]; + return validArgs; + }; -/***/ 7081: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * Converts string of UBO scriptlet rule to AdGuard scriptlet rule + * + * @param rule UBO scriptlet rule + * @returns array with one AdGuard scriptlet rule + */ + var convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) { + var domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG); + var matchResult = rule.match(validator.UBO_SCRIPTLET_MASK_REG); + var mask = Array.isArray(matchResult) ? matchResult[0] : null; + var template; + if (mask !== null && mask !== void 0 && mask.includes('@')) { + template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; + } else { + template = ADGUARD_SCRIPTLET_TEMPLATE; + } + var argsStr = getStringInBraces(rule); + var parsedArgs = splitArgs(argsStr); + var scriptletName = parsedArgs[0].includes(UBO_SCRIPTLET_JS_ENDING) ? "ubo-".concat(parsedArgs[0]) : "ubo-".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING); + if (REMOVE_ATTR_ALIASES.includes(scriptletName) || REMOVE_CLASS_ALIASES.includes(scriptletName)) { + parsedArgs = validateRemoveAttrClassArgs(parsedArgs); + } + var args = parsedArgs.map(function (arg, index) { + var outputArg = arg; + if (index === 0) { + outputArg = scriptletName; + } + // for example: example.org##+js(abort-current-inline-script, $, popup) + if (arg === '$') { + outputArg = '$$'; + } + return outputArg; + }).map(function (arg) { + return wrapInSingleQuotes(arg); + }).join("".concat(COMMA_SEPARATOR, " ")); + var adgRule = replacePlaceholders(template, { + domains, + args + }); + return [adgRule]; + }; -var hasOwn = __webpack_require__(8270); -var ownKeys = __webpack_require__(4826); -var getOwnPropertyDescriptorModule = __webpack_require__(7933); -var definePropertyModule = __webpack_require__(1787); + /** + * Convert string of ABP snippet rule to AdGuard scriptlet rule + * + * @param rule ABP snippet rule + * @returns array of AdGuard scriptlet rules, one or few items depends on Abp-rule + */ + var convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) { + var SEMICOLON_DIVIDER = /;(?=(?:(?:[^"]*"){2})*[^"]*$)/g; + var mask = rule.includes(validator.ABP_SCRIPTLET_MASK) ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK; + var template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; + var domains = substringBefore(rule, mask); + var args = substringAfter$1(rule, mask); -module.exports = function (target, source, exceptions) { - var keys = ownKeys(source); - var defineProperty = definePropertyModule.f; - var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { - defineProperty(target, key, getOwnPropertyDescriptor(source, key)); - } - } -}; + /* eslint-disable @typescript-eslint/no-shadow */ + return args.split(SEMICOLON_DIVIDER) + // abp-rule may have `;` at the end which makes last array item irrelevant + // https://github.com/AdguardTeam/Scriptlets/issues/236 + .filter(isExisting).map(function (args) { + return getAbpSnippetArguments(args).map(function (arg, index) { + return index === 0 ? "abp-".concat(arg) : arg; + }).map(function (arg) { + return wrapInSingleQuotes(arg); + }).join("".concat(COMMA_SEPARATOR, " ")); + }).map(function (args) { + return replacePlaceholders(template, { + domains, + args + }); + }); + /* eslint-enable @typescript-eslint/no-shadow */ + }; + /** + * Validates ADG scriptlet rule syntax. + * + * IMPORTANT! The method is not very fast as it parses the rule and checks its syntax. + * + * @param adgRuleText Single ADG scriptlet rule. + * + * @returns False if ADG scriptlet rule syntax is not valid + * or `adgRuleText` is not an ADG scriptlet rule. + */ + var isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) { + if (!adgRuleText) { + return false; + } + if (!validator.isAdgScriptletRule(adgRuleText)) { + return false; + } + // isAdgScriptletRule() does not check the rule syntax + var parsedRule; + try { + // parseRule() ensures that the rule syntax is valid + // and it will throw an error if it is not + parsedRule = parseRule(adgRuleText); + return validator.isValidScriptletName(parsedRule.name); + } catch (e) { + return false; + } + }; -/***/ }), + /** + * Functions to validate if a given string corresponds to a scriptlet rule of a particular origin. + */ + var OriginValidator = { + [Origin.Ubo]: validator.isUboScriptletRule, + [Origin.Abp]: validator.isAbpSnippetRule, + [Origin.AdgValid]: isValidAdgScriptletRuleSyntax, + [Origin.AdgInvalid]: function (r) { + return validator.isAdgScriptletRule(r) && !isValidAdgScriptletRuleSyntax(r); + } + }; -/***/ 5762: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // Functions to convert a given scriptlet rule from a mapped origin to an AdGuard rule + var Converter = { + [Origin.Ubo]: convertUboScriptletToAdg, + [Origin.Abp]: convertAbpSnippetToAdg, + [Origin.AdgValid]: function (r) { + return [r]; + }, + [Origin.AdgInvalid]: function (r) { + // eslint-disable-next-line no-console + console.log("Invalid AdGuard scriptlet rule: ".concat(r)); + return []; + } + }; -var DESCRIPTORS = __webpack_require__(7400); -var definePropertyModule = __webpack_require__(1787); -var createPropertyDescriptor = __webpack_require__(5358); + /** + * Returns rule origin name in a meaningful order. + * + * @param rule The rule string to check. + * @returns Rule origin name or undefined if the rule has no valid origin. + */ + var getRuleOrigin = function getRuleOrigin(rule) { + return originNames.find(function (originName) { + return OriginValidator[originName](rule); + }); + }; -module.exports = DESCRIPTORS ? function (object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; + /** + * Converts any scriptlet rule into AdGuard syntax rule. + * Comments and non-scriptlet rules are returned without changes. + * + * @param rule Rule. + * + * @returns Array of AdGuard scriptlet rules: one array item for ADG and UBO or few items for ABP. + * For the ADG `rule` validates its syntax, and returns an empty array if it is invalid. + */ + var convertScriptletToAdg = function convertScriptletToAdg(rule) { + if (validator.isComment(rule)) { + return [rule]; + } + // Determine rule's origin + var originName = getRuleOrigin(rule); -/***/ }), + // if the origin is unknown, return rule unchanged + // as it is a non-scriptlet rule + if (!originName) { + return [rule]; + } -/***/ 5358: -/***/ ((module) => { + // Call converter of given origin + return Converter[originName](rule); + }; -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; + /** + * Converts AdGuard scriptlet rule to UBO syntax. + * + * @param rule AdGuard scriptlet rule + * @returns UBO scriptlet rule + * or undefined if `rule` is not valid AdGuard scriptlet rule. + */ + var convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) { + var res; + if (validator.isAdgScriptletRule(rule)) { + var _parseRule = parseRule(rule), + parsedName = _parseRule.name, + parsedParams = _parseRule.args; + var preparedParams; + if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/AdguardTeam/FiltersCompiler/issues/102 + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; + } else if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/uBlockOrigin/uBlock-issues/issues/2411 + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY]; + } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT]; + } else if (parsedName === ADG_PREVENT_FETCH_NAME + // https://github.com/AdguardTeam/Scriptlets/issues/109 + && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) { + preparedParams = [UBO_NO_FETCH_IF_WILDCARD]; + } else { + preparedParams = parsedParams; + } + if (preparedParams && preparedParams.length > 0) { + // escape all commas in params + // https://github.com/AdguardTeam/FiltersCompiler/issues/185 + preparedParams = preparedParams.map(function (param) { + if (param.includes(COMMA_SEPARATOR)) { + return replaceAll(param, COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR); + } + return param; + }); + } + // object of name and aliases for the Adg-scriptlet + var scriptletNames = Object.keys(scriptletList); + var adgScriptletObject = scriptletNames.map(function (name) { + return scriptletList[name]; + }).map(function (scriptlet) { + var _scriptlet$names = _toArray(scriptlet.names), + name = _scriptlet$names[0], + aliases = _scriptlet$names.slice(1); + return { + name, + aliases + }; + }).find(function (el) { + return el.name === parsedName || el.aliases.includes(parsedName); + }); + var aliases = adgScriptletObject.aliases; + if (aliases.length > 0) { + var uboAlias = adgScriptletObject.aliases.find(function (alias) { + return alias.includes(UBO_ALIAS_NAME_MARKER); + }); + if (uboAlias) { + var matchResult = rule.match(ADGUARD_SCRIPTLET_MASK_REG); + var mask = Array.isArray(matchResult) ? matchResult[0] : null; + var template; + if (mask !== null && mask !== void 0 && mask.includes('@')) { + template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE; + } else { + template = UBO_SCRIPTLET_TEMPLATE; + } + var domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG); + var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') + // '.js' in the Ubo scriptlet name can be omitted + // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets + .replace(UBO_SCRIPTLET_JS_ENDING, ''); + var args = preparedParams.length > 0 ? "".concat(uboName, ", ").concat(preparedParams.join("".concat(COMMA_SEPARATOR, " "))) : uboName; + var uboRule = replacePlaceholders(template, { + domains, + args + }); + res = uboRule; + } + } + } + return res; + }; -/***/ }), - -/***/ 4768: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isCallable = __webpack_require__(6733); -var definePropertyModule = __webpack_require__(1787); -var makeBuiltIn = __webpack_require__(6039); -var defineGlobalProperty = __webpack_require__(8400); - -module.exports = function (O, key, value, options) { - if (!options) options = {}; - var simple = options.enumerable; - var name = options.name !== undefined ? options.name : key; - if (isCallable(value)) makeBuiltIn(value, name, options); - if (options.global) { - if (simple) O[key] = value; - else defineGlobalProperty(key, value); - } else { - try { - if (!options.unsafe) delete O[key]; - else if (O[key]) simple = true; - } catch (error) { /* empty */ } - if (simple) O[key] = value; - else definePropertyModule.f(O, key, { - value: value, - enumerable: false, - configurable: !options.nonConfigurable, - writable: !options.nonWritable - }); - } return O; -}; - - -/***/ }), - -/***/ 8400: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(9859); - -// eslint-disable-next-line es/no-object-defineproperty -- safe -var defineProperty = Object.defineProperty; - -module.exports = function (key, value) { - try { - defineProperty(global, key, { value: value, configurable: true, writable: true }); - } catch (error) { - global[key] = value; - } return value; -}; - - -/***/ }), - -/***/ 7400: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fails = __webpack_require__(4229); + /** + * Returns scriptlet name from `rule`. + * + * @param rule AdGuard syntax scriptlet rule. + * @returns Scriptlet name or null. + */ + var getAdgScriptletName = function getAdgScriptletName(rule) { + // get substring after '#//scriptlet(' + var buffer = substringAfter$1(rule, "".concat(ADG_SCRIPTLET_MASK, "(")); + if (!buffer) { + return null; + } + // get the quote used for the first scriptlet parameter which is a name + var nameQuote = buffer[0]; + // delete the quote from the buffer + buffer = buffer.slice(1); + if (!buffer) { + return null; + } + // get a supposed scriptlet name + var name = substringBefore(buffer, nameQuote); + return name === buffer ? null : name; + }; -// Detect IE8's incomplete defineProperty implementation -module.exports = !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- required for testing - return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; -}); + /** + * 1. For ADG scriptlet checks whether the scriptlet syntax and name are valid. + * 2. For UBO and ABP scriptlet first checks their compatibility with ADG + * by converting them into ADG syntax, and after that checks the name. + * + * ADG or UBO rules are "single-scriptlet", but ABP rule may contain more than one snippet + * so if at least one of them is not valid — whole `ruleText` rule is not valid too. + * + * @param ruleText Any scriptlet rule — ADG or UBO or ABP. + * + * @returns True if scriptlet name is valid in rule. + */ + var isValidScriptletRule = function isValidScriptletRule(ruleText) { + if (!ruleText) { + return false; + } + // `ruleText` with ABP syntax may contain more than one snippet in one rule + var rulesArray = convertScriptletToAdg(ruleText); -/***/ }), + // for ADG rule with invalid syntax convertScriptletToAdg() will return empty array + if (rulesArray.length === 0) { + return false; + } -/***/ 3777: -/***/ ((module) => { + // checking if each of parsed scriptlets is valid + // if at least one of them is not valid - whole `ruleText` is not valid too + var isValid = rulesArray.every(function (rule) { + var name = getAdgScriptletName(rule); + return name && validator.isValidScriptletName(name); + }); + return isValid; + }; -var documentAll = typeof document == 'object' && document.all; + /** + * Gets index and redirect resource marker from UBO/ADG modifiers array + * + * @param modifiers rule modifiers + * @param redirectsData validator.REDIRECT_RULE_TYPES.(UBO|ADG) + * @param rule rule string + * @returns merker data object + */ + var getMarkerData = function getMarkerData(modifiers, redirectsData, rule) { + var redirectRuleMarker = redirectsData.redirectRuleMarker, + redirectMarker = redirectsData.redirectMarker; + var index; + if (redirectRuleMarker) { + index = modifiers.findIndex(function (m) { + return m.includes(redirectRuleMarker); + }); + if (index > -1) { + return { + index, + marker: redirectRuleMarker + }; + } + } + index = modifiers.findIndex(function (m) { + return m.includes(redirectMarker); + }); + if (index > -1) { + return { + index, + marker: redirectMarker + }; + } + throw new Error("No redirect resource modifier found in rule: ".concat(rule)); + }; -// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot -// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing -var IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined; + /** + * Converts Ubo redirect rule to Adg one + * + * @param rule ubo redirect rule + * @returns converted adg rule + */ + var convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) { + var firstPartOfRule = substringBefore(rule, '$'); + var uboModifiers = validator.parseModifiers(rule); + var uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule); + var adgModifiers = uboModifiers.map(function (modifier, index) { + if (index === uboMarkerData.index) { + var uboName = substringAfter$1(modifier, uboMarkerData.marker); + var adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName]; + var adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker; + return "".concat(adgMarker).concat(adgName); + } + if (modifier === UBO_XHR_TYPE) { + return ADG_XHR_TYPE; + } + return modifier; + }).join(COMMA_SEPARATOR); + return "".concat(firstPartOfRule, "$").concat(adgModifiers); + }; -module.exports = { - all: documentAll, - IS_HTMLDDA: IS_HTMLDDA -}; + /** + * Converts Abp redirect rule to Adg one + * + * @param rule abp redirect rule + * @returns converted adg rule + */ + var convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) { + var firstPartOfRule = substringBefore(rule, '$'); + var abpModifiers = validator.parseModifiers(rule); + var adgModifiers = abpModifiers.map(function (modifier) { + if (modifier.includes(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker)) { + var abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker); + var adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName]; + return "".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName); + } + return modifier; + }).join(COMMA_SEPARATOR); + return "".concat(firstPartOfRule, "$").concat(adgModifiers); + }; + /** + * Converts redirect rule to AdGuard one + * + * @param {string} rule redirect rule + * @returns converted adg rule + */ + var convertRedirectToAdg = function convertRedirectToAdg(rule) { + var result; + if (validator.isUboRedirectCompatibleWithAdg(rule)) { + result = convertUboRedirectToAdg(rule); + } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) { + result = convertAbpRedirectToAdg(rule); + } else if (validator.isValidAdgRedirectRule(rule)) { + result = rule; + } + return result; + }; -/***/ }), + /** + * Converts Adg redirect rule to Ubo one + * 1. Checks if there is Ubo analog for Adg rule + * 2. Parses the rule and checks if there are any source type modifiers which are required by Ubo + * and if there are no one we add it manually to the end. + * Source types are chosen according to redirect name + * e.g. ||ad.com^$redirect=,important ->> ||ad.com^$redirect=,important,script + * 3. Replaces Adg redirect name by Ubo analog + * + * @param rule adg rule + * @returns converted ubo rule + * @throws on incompatible rule + */ + var convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) { + if (!validator.isAdgRedirectCompatibleWithUbo(rule)) { + throw new Error("Unable to convert for uBO - unsupported redirect in rule: ".concat(rule)); + } + var basePart = substringBefore(rule, '$'); + var adgModifiers = validator.parseModifiers(rule); + var adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule); + var adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length); + if (!validator.hasValidContentType(rule)) { + // add missed source types as content type modifiers + var sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) { + return el.NAME === adgRedirectName; + }); + if (typeof sourceTypesData === 'undefined') { + // eslint-disable-next-line max-len + throw new Error("Unable to convert for uBO - no types to add for specific redirect in rule: ".concat(rule)); + } + var additionModifiers = sourceTypesData.TYPES; + adgModifiers.push(...additionModifiers); + } + var uboModifiers = adgModifiers.map(function (el, index) { + if (index === adgMarkerData.index) { + var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; + // eslint-disable-next-line max-len + var uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName]; + return "".concat(uboMarker).concat(uboRedirectName); + } + return el; + }).join(COMMA_SEPARATOR); + return "".concat(basePart, "$").concat(uboModifiers); + }; -/***/ 2635: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * Converts a redirect name to ADG compatible one, if possible + * + * @param name Redirect name to convert + * @returns Converted ADG compatible redirect name or `undefined` if the redirect isn't supported + */ + var convertRedirectNameToAdg = function convertRedirectNameToAdg(name) { + var nameToCheck = name.trim(); -var global = __webpack_require__(9859); -var isObject = __webpack_require__(5052); + // Check if the redirect is already ADG compatible + if (validator.REDIRECT_RULE_TYPES.ADG.compatibility[nameToCheck]) { + return nameToCheck; + } -var document = global.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document) && isObject(document.createElement); + // Convert uBO redirects to ADG + if (validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck]) { + return validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck]; + } -module.exports = function (it) { - return EXISTS ? document.createElement(it) : {}; -}; + // Convert ABP redirects to ADG + // AGTree parses '$rewrite=abp-resource:blank-js' as 'rewrite' modifier with + // 'abp-resource:blank-js' value. So at this point we have to check if the + // redirect name starts with 'abp-resource:' and remove it if it does. + if (nameToCheck.startsWith(ABP_RESOURCE_MARKER)) { + nameToCheck = nameToCheck.slice(ABP_RESOURCE_MARKER.length).trim(); + } + // This also returns `undefined` if the redirect isn't supported + return validator.REDIRECT_RULE_TYPES.ABP.compatibility[nameToCheck]; + }; -/***/ }), + /** + * @redirect google-analytics + * + * @description + * Mocks Google's Analytics and Tag Manager APIs. + * Covers functionality of + * the [obsolete googletagmanager-gtm redirect](https://github.com/AdguardTeam/Scriptlets/issues/127). + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_analytics.js + * + * ### Examples + * + * ```adblock + * ||google-analytics.com/analytics.js$script,redirect=google-analytics + * ||googletagmanager.com/gtm.js$script,redirect=google-analytics + * ``` + * + * @added v1.0.10. + */ + function GoogleAnalytics(source) { + // eslint-disable-next-line func-names + var Tracker = function Tracker() {}; // constructor + var proto = Tracker.prototype; + proto.get = noopFunc; + proto.set = noopFunc; + proto.send = noopFunc; + var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; + // a -- fake arg for 'ga.length < 1' antiadblock checking + // eslint-disable-next-line no-unused-vars + function ga(a) { + var len = arguments.length; + if (len === 0) { + return; + } + // eslint-disable-next-line prefer-rest-params + var lastArg = arguments[len - 1]; + var replacer; + if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') { + replacer = lastArg.hitCallback; + } else if (typeof lastArg === 'function') { + // https://github.com/AdguardTeam/Scriptlets/issues/98 + replacer = function replacer() { + lastArg(ga.create()); + }; + } + try { + setTimeout(replacer, 1); + // eslint-disable-next-line no-empty + } catch (ex) {} + } + ga.create = function () { + return new Tracker(); + }; + // https://github.com/AdguardTeam/Scriptlets/issues/134 + ga.getByName = function () { + return new Tracker(); + }; + ga.getAll = function () { + return [new Tracker()]; + }; + ga.remove = noopFunc; + ga.loaded = true; + window[googleAnalyticsName] = ga; + var _window = window, + dataLayer = _window.dataLayer, + google_optimize = _window.google_optimize; // eslint-disable-line camelcase + if (dataLayer instanceof Object === false) { + return; + } + if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') { + dataLayer.hide.end(); + } -/***/ 3064: -/***/ ((module) => { + /** + * checks data object and delays callback + * + * @param {object|Array} dataObj gtag payload + * @param {string} funcName callback prop name + */ + var handleCallback = function handleCallback(dataObj, funcName) { + if (dataObj && typeof dataObj[funcName] === 'function') { + setTimeout(dataObj[funcName]); + } + }; + if (typeof dataLayer.push === 'function') { + dataLayer.push = function (data) { + if (data instanceof Object) { + handleCallback(data, 'eventCallback'); + // eslint-disable-next-line no-restricted-syntax, guard-for-in + for (var key in data) { + handleCallback(data[key], 'event_callback'); + } + // eslint-disable-next-line no-prototype-builtins + if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) { + [].push.call(window.dataLayer, data); + } + } + if (Array.isArray(data)) { + data.forEach(function (arg) { + handleCallback(arg, 'callback'); + }); + } + return noopFunc; + }; + } -var $TypeError = TypeError; -var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 + // https://github.com/AdguardTeam/Scriptlets/issues/81 + // eslint-disable-next-line camelcase + if (google_optimize instanceof Object && typeof google_optimize.get === 'function') { + var googleOptimizeWrapper = { + get: noopFunc + }; + window.google_optimize = googleOptimizeWrapper; + } + hit(source); + } + GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js', + // https://github.com/AdguardTeam/Scriptlets/issues/127 + 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js']; + GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray]; -module.exports = function (it) { - if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded'); - return it; -}; + /* eslint-disable no-underscore-dangle */ + /** + * @redirect google-analytics-ga + * + * @description + * Mocks old Google Analytics API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_ga.js + * + * ### Examples + * + * ```adblock + * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga + * ``` + * + * @added v1.0.10. + */ + function GoogleAnalyticsGa(source) { + // Gaq constructor + function Gaq() {} + Gaq.prototype.Na = noopFunc; + Gaq.prototype.O = noopFunc; + Gaq.prototype.Sa = noopFunc; + Gaq.prototype.Ta = noopFunc; + Gaq.prototype.Va = noopFunc; + Gaq.prototype._createAsyncTracker = noopFunc; + Gaq.prototype._getAsyncTracker = noopFunc; + Gaq.prototype._getPlugin = noopFunc; + Gaq.prototype.push = function (data) { + if (typeof data === 'function') { + data(); + return; + } + if (Array.isArray(data) === false) { + return; + } + // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link + // https://github.com/uBlockOrigin/uBlock-issues/issues/1807 + if (typeof data[0] === 'string' && /(^|\.)_link$/.test(data[0]) && typeof data[1] === 'string') { + window.location.assign(data[1]); + } + // https://github.com/gorhill/uBlock/issues/2162 + if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') { + data[2](); + } + }; + var gaq = new Gaq(); + var asyncTrackers = window._gaq || []; + if (Array.isArray(asyncTrackers)) { + while (asyncTrackers[0]) { + gaq.push(asyncTrackers.shift()); + } + } + // eslint-disable-next-line no-multi-assign + window._gaq = gaq.qf = gaq; -/***/ }), + // Gat constructor + function Gat() {} -/***/ 598: -/***/ ((module) => { + // Mock tracker api + var api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode']; + var tracker = api.reduce(function (res, funcName) { + res[funcName] = noopFunc; + return res; + }, {}); + tracker._getLinkerUrl = function (a) { + return a; + }; + // https://github.com/AdguardTeam/Scriptlets/issues/154 + tracker._link = function (url) { + if (typeof url !== 'string') { + return; + } + try { + window.location.assign(url); + } catch (e) { + logMessage(source, e); + } + }; + Gat.prototype._anonymizeIP = noopFunc; + Gat.prototype._createTracker = noopFunc; + Gat.prototype._forceSSL = noopFunc; + Gat.prototype._getPlugin = noopFunc; + Gat.prototype._getTracker = function () { + return tracker; + }; + Gat.prototype._getTrackerByName = function () { + return tracker; + }; + Gat.prototype._getTrackers = noopFunc; + Gat.prototype.aa = noopFunc; + Gat.prototype.ab = noopFunc; + Gat.prototype.hb = noopFunc; + Gat.prototype.la = noopFunc; + Gat.prototype.oa = noopFunc; + Gat.prototype.pa = noopFunc; + Gat.prototype.u = noopFunc; + var gat = new Gat(); + window._gat = gat; + hit(source); + } + GoogleAnalyticsGa.names = ['google-analytics-ga', 'ubo-google-analytics_ga.js', 'google-analytics_ga.js']; + GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage]; -module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || ''; + /* eslint-disable max-len */ + /** + * @redirect googlesyndication-adsbygoogle + * + * @description + * Mocks Google AdSense API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googlesyndication_adsbygoogle.js + * + * ### Examples + * + * ```adblock + * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle + * ``` + * + * @added v1.0.10. + */ + /* eslint-enable max-len */ + function GoogleSyndicationAdsByGoogle(source) { + window.adsbygoogle = { + // https://github.com/AdguardTeam/Scriptlets/issues/113 + // length: 0, + loaded: true, + // https://github.com/AdguardTeam/Scriptlets/issues/184 + push(arg) { + if (typeof this.length === 'undefined') { + this.length = 0; + this.length += 1; + } + if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') { + // eslint-disable-next-line no-restricted-syntax + for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) { + var key = _Object$keys[_i]; + if (typeof arg[key] === 'function') { + try { + // https://github.com/AdguardTeam/Scriptlets/issues/252 + // argument "{}" is needed to fix issue with undefined argument + arg[key].call(this, {}); + } catch (_unused) { + /* empty */ + } + } + } + } + } + }; + var adElems = document.querySelectorAll('.adsbygoogle'); + var css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;'; + var statusAttrName = 'data-adsbygoogle-status'; + var ASWIFT_IFRAME_MARKER = 'aswift_'; + var GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_'; + var executed = false; + for (var i = 0; i < adElems.length; i += 1) { + var adElemChildNodes = adElems[i].childNodes; + var childNodesQuantity = adElemChildNodes.length; + // childNodes of .adsbygoogle can be defined if scriptlet was executed before + // so we should check that childNodes are exactly defined by us + // TODO: remake after scriptlets context developing in 1.3 + var areIframesDefined = false; + if (childNodesQuantity > 0) { + // it should be only 2 child iframes if scriptlet was executed + areIframesDefined = childNodesQuantity === 2 + // the first of child nodes should be aswift iframe + && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.includes(ASWIFT_IFRAME_MARKER) + // the second of child nodes should be google_ads iframe + && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.includes(GOOGLE_ADS_IFRAME_MARKER); + } + if (!areIframesDefined) { + // here we do the job if scriptlet has not been executed earlier + adElems[i].setAttribute(statusAttrName, 'done'); + var aswiftIframe = document.createElement('iframe'); + aswiftIframe.id = "".concat(ASWIFT_IFRAME_MARKER).concat(i); + aswiftIframe.style = css; + adElems[i].appendChild(aswiftIframe); + var innerAswiftIframe = document.createElement('iframe'); + aswiftIframe.contentWindow.document.body.appendChild(innerAswiftIframe); + var googleadsIframe = document.createElement('iframe'); + googleadsIframe.id = "".concat(GOOGLE_ADS_IFRAME_MARKER).concat(i); + googleadsIframe.style = css; + adElems[i].appendChild(googleadsIframe); + var innerGoogleadsIframe = document.createElement('iframe'); + googleadsIframe.contentWindow.document.body.appendChild(innerGoogleadsIframe); + executed = true; + } + } + if (executed) { + hit(source); + } + } + GoogleSyndicationAdsByGoogle.names = ['googlesyndication-adsbygoogle', 'ubo-googlesyndication_adsbygoogle.js', 'googlesyndication_adsbygoogle.js']; + GoogleSyndicationAdsByGoogle.injections = [hit]; + /* eslint-disable func-names */ -/***/ }), - -/***/ 6358: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(9859); -var userAgent = __webpack_require__(598); - -var process = global.process; -var Deno = global.Deno; -var versions = process && process.versions || Deno && Deno.version; -var v8 = versions && versions.v8; -var match, version; - -if (v8) { - match = v8.split('.'); - // in old Chrome, versions of V8 isn't V8 = Chrome / 10 - // but their correct versions are not interesting for us - version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); -} - -// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` -// so check `userAgent` even if `.v8` exists, but 0 -if (!version && userAgent) { - match = userAgent.match(/Edge\/(\d+)/); - if (!match || match[1] >= 74) { - match = userAgent.match(/Chrome\/(\d+)/); - if (match) version = +match[1]; - } -} - -module.exports = version; - - -/***/ }), - -/***/ 3837: -/***/ ((module) => { - -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; - - -/***/ }), - -/***/ 5299: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * @redirect googletagservices-gpt + * + * @description + * Mocks Google Publisher Tag API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googletagservices_gpt.js + * + * ### Examples + * + * ```adblock + * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt + * ``` + * + * @added v1.0.10. + */ + function GoogleTagServicesGpt(source) { + var slots = new Map(); + var slotsById = new Map(); + var slotsPerPath = new Map(); + var slotCreatives = new Map(); + var eventCallbacks = new Map(); + var gTargeting = new Map(); + var addEventListener = function addEventListener(name, listener) { + if (!eventCallbacks.has(name)) { + eventCallbacks.set(name, new Set()); + } + eventCallbacks.get(name).add(listener); + return this; + }; + var removeEventListener = function removeEventListener(name, listener) { + if (eventCallbacks.has(name)) { + return eventCallbacks.get(name).delete(listener); + } + return false; + }; + var fireSlotEvent = function fireSlotEvent(name, slot) { + return new Promise(function (resolve) { + requestAnimationFrame(function () { + var size = [0, 0]; + var callbacksSet = eventCallbacks.get(name) || []; + var callbackArray = Array.from(callbacksSet); + for (var i = 0; i < callbackArray.length; i += 1) { + callbackArray[i]({ + isEmpty: true, + size, + slot + }); + } + resolve(); + }); + }); + }; + var emptySlotElement = function emptySlotElement(slot) { + var node = document.getElementById(slot.getSlotElementId()); + while (node !== null && node !== void 0 && node.lastChild) { + node.lastChild.remove(); + } + }; + var recreateIframeForSlot = function recreateIframeForSlot(slot) { + var _document$getElementB; + var eid = "google_ads_iframe_".concat(slot.getId()); + (_document$getElementB = document.getElementById(eid)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove(); + var node = document.getElementById(slot.getSlotElementId()); + if (node) { + var f = document.createElement('iframe'); + f.id = eid; + f.srcdoc = ''; + f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0'; + f.setAttribute('width', 0); + f.setAttribute('height', 0); + // https://github.com/AdguardTeam/Scriptlets/issues/259 + f.setAttribute('data-load-complete', true); + f.setAttribute('data-google-container-id', true); + f.setAttribute('sandbox', ''); + node.appendChild(f); + } + }; + var displaySlot = function displaySlot(slot) { + if (!slot) { + return; + } + var id = slot.getSlotElementId(); + if (!document.getElementById(id)) { + return; + } + var parent = document.getElementById(id); + if (parent) { + parent.appendChild(document.createElement('div')); + } + emptySlotElement(slot); + recreateIframeForSlot(slot); + fireSlotEvent('slotRenderEnded', slot); + fireSlotEvent('slotRequested', slot); + fireSlotEvent('slotResponseReceived', slot); + fireSlotEvent('slotOnload', slot); + fireSlotEvent('impressionViewable', slot); + }; + var companionAdsService = { + addEventListener, + removeEventListener, + enableSyncLoading: noopFunc, + setRefreshUnfilledSlots: noopFunc, + getSlots: noopArray + }; + var contentService = { + addEventListener, + removeEventListener, + setContent: noopFunc + }; + function PassbackSlot() {} // constructor -var uncurryThis = __webpack_require__(5968); + PassbackSlot.prototype.display = noopFunc; + PassbackSlot.prototype.get = noopNull; + PassbackSlot.prototype.set = noopThis; + PassbackSlot.prototype.setClickUrl = noopThis; + PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis; + PassbackSlot.prototype.setTargeting = noopThis; + PassbackSlot.prototype.updateTargetingFromMap = noopThis; + function SizeMappingBuilder() {} // constructor + SizeMappingBuilder.prototype.addSize = noopThis; + SizeMappingBuilder.prototype.build = noopNull; + var getTargetingValue = function getTargetingValue(v) { + if (typeof v === 'string') { + return [v]; + } + try { + return Array.prototype.flat.call(v); + } catch (_unused) { + // do nothing + } + return []; + }; + var updateTargeting = function updateTargeting(targeting, map) { + if (typeof map === 'object') { + for (var key in map) { + if (Object.prototype.hasOwnProperty.call(map, key)) { + targeting.set(key, getTargetingValue(map[key])); + } + } + } + }; + var defineSlot = function defineSlot(adUnitPath, creatives, optDiv) { + if (slotsById.has(optDiv)) { + var _document$getElementB2; + (_document$getElementB2 = document.getElementById(optDiv)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.remove(); + return slotsById.get(optDiv); + } + var attributes = new Map(); + var targeting = new Map(); + var exclusions = new Set(); + var response = { + advertiserId: undefined, + campaignId: undefined, + creativeId: undefined, + creativeTemplateId: undefined, + lineItemId: undefined + }; + var sizes = [{ + getHeight: function getHeight() { + return 2; + }, + getWidth: function getWidth() { + return 2; + } + }]; + var num = (slotsPerPath.get(adUnitPath) || 0) + 1; + slotsPerPath.set(adUnitPath, num); + var id = "".concat(adUnitPath, "_").concat(num); + var clickUrl = ''; + var collapseEmptyDiv = null; + var services = new Set(); + var slot = { + addService(e) { + services.add(e); + return slot; + }, + clearCategoryExclusions: noopThis, + clearTargeting(k) { + if (k === undefined) { + targeting.clear(); + } else { + targeting.delete(k); + } + }, + defineSizeMapping(mapping) { + slotCreatives.set(optDiv, mapping); + return this; + }, + get: function get(k) { + return attributes.get(k); + }, + getAdUnitPath: function getAdUnitPath() { + return adUnitPath; + }, + getAttributeKeys: function getAttributeKeys() { + return Array.from(attributes.keys()); + }, + getCategoryExclusions: function getCategoryExclusions() { + return Array.from(exclusions); + }, + getClickUrl: function getClickUrl() { + return clickUrl; + }, + getCollapseEmptyDiv: function getCollapseEmptyDiv() { + return collapseEmptyDiv; + }, + getContentUrl: function getContentUrl() { + return ''; + }, + getDivStartsCollapsed: function getDivStartsCollapsed() { + return null; + }, + getDomId: function getDomId() { + return optDiv; + }, + getEscapedQemQueryId: function getEscapedQemQueryId() { + return ''; + }, + getFirstLook: function getFirstLook() { + return 0; + }, + getId: function getId() { + return id; + }, + getHtml: function getHtml() { + return ''; + }, + getName: function getName() { + return id; + }, + getOutOfPage: function getOutOfPage() { + return false; + }, + getResponseInformation: function getResponseInformation() { + return response; + }, + getServices: function getServices() { + return Array.from(services); + }, + getSizes: function getSizes() { + return sizes; + }, + getSlotElementId: function getSlotElementId() { + return optDiv; + }, + getSlotId: function getSlotId() { + return slot; + }, + getTargeting: function getTargeting(k) { + return targeting.get(k) || gTargeting.get(k) || []; + }, + getTargetingKeys: function getTargetingKeys() { + return Array.from(new Set(Array.of(...gTargeting.keys(), ...targeting.keys()))); + }, + getTargetingMap: function getTargetingMap() { + return Object.assign(Object.fromEntries(gTargeting.entries()), Object.fromEntries(targeting.entries())); + }, + set(k, v) { + attributes.set(k, v); + return slot; + }, + setCategoryExclusion(e) { + exclusions.add(e); + return slot; + }, + setClickUrl(u) { + clickUrl = u; + return slot; + }, + setCollapseEmptyDiv(v) { + collapseEmptyDiv = !!v; + return slot; + }, + setSafeFrameConfig: noopThis, + setTagForChildDirectedTreatment: noopThis, + setTargeting(k, v) { + targeting.set(k, getTargetingValue(v)); + return slot; + }, + toString: function toString() { + return id; + }, + updateTargetingFromMap(map) { + updateTargeting(targeting, map); + return slot; + } + }; + slots.set(adUnitPath, slot); + slotsById.set(optDiv, slot); + slotCreatives.set(optDiv, creatives); + return slot; + }; + var pubAdsService = { + addEventListener, + removeEventListener, + clear: noopFunc, + clearCategoryExclusions: noopThis, + clearTagForChildDirectedTreatment: noopThis, + clearTargeting(k) { + if (k === undefined) { + gTargeting.clear(); + } else { + gTargeting.delete(k); + } + }, + collapseEmptyDivs: noopFunc, + defineOutOfPagePassback() { + return new PassbackSlot(); + }, + definePassback() { + return new PassbackSlot(); + }, + disableInitialLoad: noopFunc, + display: noopFunc, + enableAsyncRendering: noopFunc, + enableLazyLoad: noopFunc, + enableSingleRequest: noopFunc, + enableSyncRendering: noopFunc, + enableVideoAds: noopFunc, + get: noopNull, + getAttributeKeys: noopArray, + getTargeting: noopArray, + getTargetingKeys: noopArray, + getSlots: noopArray, + isInitialLoadDisabled: trueFunc, + refresh: noopFunc, + set: noopThis, + setCategoryExclusion: noopThis, + setCentering: noopFunc, + setCookieOptions: noopThis, + setForceSafeFrame: noopThis, + setLocation: noopThis, + setPublisherProvidedId: noopThis, + setRequestNonPersonalizedAds: noopThis, + setSafeFrameConfig: noopThis, + setTagForChildDirectedTreatment: noopThis, + setTargeting: noopThis, + setVideoContent: noopThis, + updateCorrelator: noopFunc + }; + var _window = window, + _window$googletag = _window.googletag, + googletag = _window$googletag === void 0 ? {} : _window$googletag; + var _googletag$cmd = googletag.cmd, + cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd; + googletag.apiReady = true; + googletag.cmd = []; + googletag.cmd.push = function (a) { + try { + a(); + // eslint-disable-next-line no-empty + } catch (ex) {} + return 1; + }; + googletag.companionAds = function () { + return companionAdsService; + }; + googletag.content = function () { + return contentService; + }; + googletag.defineOutOfPageSlot = defineSlot; + googletag.defineSlot = defineSlot; + googletag.destroySlots = function () { + slots.clear(); + slotsById.clear(); + }; + googletag.disablePublisherConsole = noopFunc; + googletag.display = function (arg) { + var id; + if (arg !== null && arg !== void 0 && arg.getSlotElementId) { + id = arg.getSlotElementId(); + } else if (arg !== null && arg !== void 0 && arg.nodeType) { + id = arg.id; + } else { + id = String(arg); + } + displaySlot(slotsById.get(id)); + }; + googletag.enableServices = noopFunc; + googletag.getVersion = noopStr; + googletag.pubads = function () { + return pubAdsService; + }; + googletag.pubadsReady = true; + googletag.setAdIframeTitle = noopFunc; + googletag.sizeMapping = function () { + return new SizeMappingBuilder(); + }; + window.googletag = googletag; + while (cmd.length !== 0) { + googletag.cmd.push(cmd.shift()); + } + hit(source); + } + GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js']; + GoogleTagServicesGpt.injections = [hit, noopFunc, noopThis, noopNull, noopArray, noopStr, trueFunc]; -var $Error = Error; -var replace = uncurryThis(''.replace); + /** + * @redirect scorecardresearch-beacon + * + * @description + * Mocks Scorecard Research API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/scorecardresearch_beacon.js + * + * ### Examples + * + * ```adblock + * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon + * ``` + * + * @added v1.0.10. + */ + function ScoreCardResearchBeacon(source) { + window.COMSCORE = { + purge() { + // eslint-disable-next-line no-underscore-dangle + window._comscore = []; + }, + beacon() {} + }; + hit(source); + } + ScoreCardResearchBeacon.names = ['scorecardresearch-beacon', 'ubo-scorecardresearch_beacon.js', 'scorecardresearch_beacon.js']; + ScoreCardResearchBeacon.injections = [hit]; -var TEST = (function (arg) { return String($Error(arg).stack); })('zxcasd'); -// eslint-disable-next-line redos/no-vulnerable -- safe -var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; -var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); + /** + * @redirect metrika-yandex-tag + * + * @description + * Mocks Yandex Metrika API. + * https://yandex.ru/support/metrica/objects/method-reference.html + * + * ### Examples + * + * ```adblock + * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag + * ``` + * + * @added v1.0.10. + */ + function metrikaYandexTag(source) { + var asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var callback = options.callback; + var ctx = options.ctx; + if (typeof callback === 'function') { + callback = ctx !== undefined ? callback.bind(ctx) : callback; + setTimeout(function () { + return callback(); + }); + } + }; -module.exports = function (stack, dropEntries) { - if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) { - while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); - } return stack; -}; + /** + * https://yandex.ru/support/metrica/objects/addfileextension.html + */ + var addFileExtension = noopFunc; + /** + * https://yandex.ru/support/metrica/objects/extlink.html + */ + var extLink = asyncCallbackFromOptions; -/***/ }), + /** + * https://yandex.ru/support/metrica/objects/file.html + */ + var file = asyncCallbackFromOptions; -/***/ 9166: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * https://yandex.ru/support/metrica/objects/get-client-id.html + * + * @param {string} id + * @param {Function} cb + */ + var getClientID = function getClientID(id, cb) { + if (!cb) { + return; + } + setTimeout(cb(null)); + }; -var createNonEnumerableProperty = __webpack_require__(5762); -var clearErrorStack = __webpack_require__(5299); -var ERROR_STACK_INSTALLABLE = __webpack_require__(373); + /** + * https://yandex.ru/support/metrica/objects/hit.html + */ + var hitFunc = asyncCallbackFromOptions; -// non-standard V8 -var captureStackTrace = Error.captureStackTrace; + /** + * https://yandex.ru/support/metrica/objects/notbounce.html + */ + var notBounce = asyncCallbackFromOptions; -module.exports = function (error, C, stack, dropEntries) { - if (ERROR_STACK_INSTALLABLE) { - if (captureStackTrace) captureStackTrace(error, C); - else createNonEnumerableProperty(error, 'stack', clearErrorStack(stack, dropEntries)); - } -}; + /** + * https://yandex.ru/support/metrica/objects/params-method.html + */ + var params = noopFunc; + /** + * https://yandex.ru/support/metrica/objects/reachgoal.html + * + * @param {string} id + * @param {string} target + * @param {object} params + * @param {Function} callback + * @param {any} ctx + */ + var reachGoal = function reachGoal(id, target, params, callback, ctx) { + asyncCallbackFromOptions(null, null, { + callback, + ctx + }); + }; -/***/ }), + /** + * https://yandex.ru/support/metrica/objects/set-user-id.html + */ + var setUserID = noopFunc; -/***/ 373: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * https://yandex.ru/support/metrica/objects/user-params.html + */ + var userParams = noopFunc; -var fails = __webpack_require__(4229); -var createPropertyDescriptor = __webpack_require__(5358); - -module.exports = !fails(function () { - var error = Error('a'); - if (!('stack' in error)) return true; - // eslint-disable-next-line es/no-object-defineproperty -- safe - Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); - return error.stack !== 7; -}); - - -/***/ }), - -/***/ 3103: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(9859); -var getOwnPropertyDescriptor = (__webpack_require__(7933).f); -var createNonEnumerableProperty = __webpack_require__(5762); -var defineBuiltIn = __webpack_require__(4768); -var defineGlobalProperty = __webpack_require__(8400); -var copyConstructorProperties = __webpack_require__(7081); -var isForced = __webpack_require__(6541); - -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.dontCallGetSet - prevent calling a getter on target - options.name - the .name of the function if it does not match the key -*/ -module.exports = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var FORCED, target, key, targetProperty, sourceProperty, descriptor; - if (GLOBAL) { - target = global; - } else if (STATIC) { - target = global[TARGET] || defineGlobalProperty(TARGET, {}); - } else { - target = (global[TARGET] || {}).prototype; - } - if (target) for (key in source) { - sourceProperty = source[key]; - if (options.dontCallGetSet) { - descriptor = getOwnPropertyDescriptor(target, key); - targetProperty = descriptor && descriptor.value; - } else targetProperty = target[key]; - FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contained in target - if (!FORCED && targetProperty !== undefined) { - if (typeof sourceProperty == typeof targetProperty) continue; - copyConstructorProperties(sourceProperty, targetProperty); - } - // add a flag to not completely full polyfills - if (options.sham || (targetProperty && targetProperty.sham)) { - createNonEnumerableProperty(sourceProperty, 'sham', true); + // https://github.com/AdguardTeam/Scriptlets/issues/198 + var destruct = noopFunc; + var api = { + addFileExtension, + extLink, + file, + getClientID, + hit: hitFunc, + notBounce, + params, + reachGoal, + setUserID, + userParams, + destruct + }; + function ym(id, funcName) { + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + return api[funcName] && api[funcName](id, ...args); + } + function init(id) { + // yaCounter object should provide api + window["yaCounter".concat(id)] = api; + document.dispatchEvent(new Event("yacounter".concat(id, "inited"))); + } + if (typeof window.ym === 'undefined') { + window.ym = ym; + ym.a = []; + } else if (window.ym && window.ym.a) { + // Keep initial counters array intact + ym.a = window.ym.a; + window.ym = ym; + window.ym.a.forEach(function (params) { + var id = params[0]; + init(id); + }); + } + hit(source); } - defineBuiltIn(target, key, sourceProperty, options); - } -}; - - -/***/ }), - -/***/ 4229: -/***/ ((module) => { - -module.exports = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - + metrikaYandexTag.names = ['metrika-yandex-tag']; + metrikaYandexTag.injections = [hit, noopFunc]; -/***/ }), + /** + * @redirect metrika-yandex-watch + * + * @description + * Mocks the old Yandex Metrika API. + * https://yandex.ru/support/metrica/objects/_method-reference.html + * + * ### Examples + * + * ```adblock + * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch + * ``` + * + * @added v1.0.10. + */ + function metrikaYandexWatch(source) { + var cbName = 'yandex_metrika_callbacks'; -/***/ 3171: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * Gets callback and its context from options and call it in async way + * + * @param {object} options Yandex Metrika API options + */ + var asyncCallbackFromOptions = function asyncCallbackFromOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var callback = options.callback; + var ctx = options.ctx; + if (typeof callback === 'function') { + callback = ctx !== undefined ? callback.bind(ctx) : callback; + setTimeout(function () { + return callback(); + }); + } + }; + function Metrika() {} // constructor + Metrika.counters = noopArray; + // Methods without options + Metrika.prototype.addFileExtension = noopFunc; + Metrika.prototype.getClientID = noopFunc; + Metrika.prototype.setUserID = noopFunc; + Metrika.prototype.userParams = noopFunc; + Metrika.prototype.params = noopFunc; + Metrika.prototype.counters = noopArray; -var NATIVE_BIND = __webpack_require__(7188); + // Methods with options + // The order of arguments should be kept in according to API + Metrika.prototype.extLink = function (url, options) { + asyncCallbackFromOptions(options); + }; + Metrika.prototype.file = function (url, options) { + asyncCallbackFromOptions(options); + }; + Metrika.prototype.hit = function (url, options) { + asyncCallbackFromOptions(options); + }; + Metrika.prototype.reachGoal = function (target, params, cb, ctx) { + asyncCallbackFromOptions({ + callback: cb, + ctx + }); + }; + Metrika.prototype.notBounce = asyncCallbackFromOptions; + if (window.Ya) { + window.Ya.Metrika = Metrika; + } else { + window.Ya = { + Metrika + }; + } + if (window[cbName] && Array.isArray(window[cbName])) { + window[cbName].forEach(function (func) { + if (typeof func === 'function') { + func(); + } + }); + } + hit(source); + } + metrikaYandexWatch.names = ['metrika-yandex-watch']; + metrikaYandexWatch.injections = [hit, noopFunc, noopArray]; -var FunctionPrototype = Function.prototype; -var apply = FunctionPrototype.apply; -var call = FunctionPrototype.call; + /* eslint-disable func-names */ -// eslint-disable-next-line es/no-reflect -- safe -module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () { - return call.apply(apply, arguments); -}); + /** + * @redirect pardot-1.0 + * + * @description + * Mocks the pd.js file of Salesforce. + * https://pi.pardot.com/pd.js + * https://developer.salesforce.com/docs/marketing/pardot/overview + * + * ### Examples + * + * ```adblock + * ||pi.pardot.com/pd.js$script,redirect=pardot + * ||pacedg.com.au/pd.js$redirect=pardot + * ``` + * + * @added v1.6.55. + */ + function Pardot(source) { + window.piVersion = '1.0.2'; + window.piScriptNum = 0; + window.piScriptObj = []; + window.checkNamespace = noopFunc; + window.getPardotUrl = noopStr; + window.piGetParameter = noopNull; + window.piSetCookie = noopFunc; + window.piGetCookie = noopStr; + function piTracker() { + window.pi = { + tracker: { + visitor_id: '', + visitor_id_sign: '', + pi_opt_in: '', + campaign_id: '' + } + }; + window.piScriptNum += 1; + } + window.piResponse = noopFunc; + window.piTracker = piTracker; + piTracker(); + hit(source); + } + Pardot.names = ['pardot-1.0']; + Pardot.injections = [hit, noopFunc, noopStr, noopNull]; -/***/ }), + /** + * @redirect prevent-bab + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Mostly it is used as `scriptlet`. + * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab). + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab.js + * + * ### Examples + * + * ```adblock + * /blockadblock.$script,redirect=prevent-bab + * ``` + * + * @added v1.3.19. + */ + var preventBab$1 = preventBab$2; + preventBab$1.names = ['prevent-bab', + // list of prevent-bab redirect aliases + 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; -/***/ 7188: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * @redirect amazon-apstag + * + * @description + * Mocks Amazon's apstag.js + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/amazon_apstag.js + * + * ### Examples + * + * ```adblock + * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag + * ``` + * + * @added v1.2.3. + */ + function AmazonApstag(source) { + var apstagWrapper = { + fetchBids(a, b) { + if (typeof b === 'function') { + b([]); + } + }, + init: noopFunc, + setDisplayBids: noopFunc, + targetingKeys: noopFunc + }; + window.apstag = apstagWrapper; + hit(source); + } + AmazonApstag.names = ['amazon-apstag', 'ubo-amazon_apstag.js', 'amazon_apstag.js']; + AmazonApstag.injections = [hit, noopFunc]; -var fails = __webpack_require__(4229); + /* eslint-disable func-names */ -module.exports = !fails(function () { - // eslint-disable-next-line es/no-function-prototype-bind -- safe - var test = (function () { /* empty */ }).bind(); - // eslint-disable-next-line no-prototype-builtins -- safe - return typeof test != 'function' || test.hasOwnProperty('prototype'); -}); + /** + * @redirect matomo + * + * @description + * Mocks the piwik.js file of Matomo (formerly Piwik). + * + * ### Examples + * + * ```adblock + * ||example.org/piwik.js$script,redirect=matomo + * ``` + * + * @added v1.5.0. + */ + function Matomo(source) { + var Tracker = function Tracker() {}; + Tracker.prototype.setDoNotTrack = noopFunc; + Tracker.prototype.setDomains = noopFunc; + Tracker.prototype.setCustomDimension = noopFunc; + Tracker.prototype.trackPageView = noopFunc; + var AsyncTracker = function AsyncTracker() {}; + AsyncTracker.prototype.addListener = noopFunc; + var matomoWrapper = { + getTracker: Tracker, + getAsyncTracker: AsyncTracker + }; + window.Piwik = matomoWrapper; + hit(source); + } + Matomo.names = ['matomo']; + Matomo.injections = [hit, noopFunc]; -/***/ }), + /* eslint-disable func-names */ -/***/ 266: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * @redirect fingerprintjs2 + * + * @description + * Mocks FingerprintJS v2 + * https://github.com/fingerprintjs + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint2.js + * + * ### Examples + * + * ```adblock + * ||example.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2 + * ``` + * + * @added v1.5.0. + */ + function Fingerprintjs2(source) { + var browserId = ''; + for (var i = 0; i < 8; i += 1) { + browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); + } + var Fingerprint2 = function Fingerprint2() {}; + Fingerprint2.get = function (options, callback) { + if (!callback) { + callback = options; + } + setTimeout(function () { + if (callback) { + callback(browserId, []); + } + }, 1); + }; + Fingerprint2.prototype = { + get: Fingerprint2.get + }; + window.Fingerprint2 = Fingerprint2; + hit(source); + } + Fingerprintjs2.names = ['fingerprintjs2', + // redirect aliases are needed for conversion: + // prefixed for us + 'ubo-fingerprint2.js', + // original ubo name + 'fingerprint2.js']; + Fingerprintjs2.injections = [hit]; -var NATIVE_BIND = __webpack_require__(7188); + /* eslint-disable func-names */ -var call = Function.prototype.call; + /** + * @redirect fingerprintjs3 + * + * @description + * Mocks FingerprintJS v3 + * https://github.com/fingerprintjs + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint3.js + * + * ### Examples + * + * ```adblock + * ||example.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3 + * ``` + * + * @added v1.6.2. + */ + function Fingerprintjs3(source) { + var visitorId = function () { + var id = ''; + for (var i = 0; i < 8; i += 1) { + id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); + } + return id; + }(); + var FingerprintJS = function FingerprintJS() {}; + FingerprintJS.prototype = { + load() { + return Promise.resolve(new FingerprintJS()); + }, + get() { + return Promise.resolve({ + visitorId + }); + }, + hashComponents: noopStr + }; + window.FingerprintJS = new FingerprintJS(); + hit(source); + } + Fingerprintjs3.names = ['fingerprintjs3', + // redirect aliases are needed for conversion: + // prefixed for us + 'ubo-fingerprint3.js', + // original ubo name + 'fingerprint3.js']; + Fingerprintjs3.injections = [hit, noopStr]; -module.exports = NATIVE_BIND ? call.bind(call) : function () { - return call.apply(call, arguments); -}; + /* eslint-disable func-names */ + /** + * @redirect gemius + * + * @description + * Mocks Gemius Analytics. + * https://flowplayer.com/developers/plugins/gemius + * + * ### Examples + * + * ```adblock + * ||example.org/gplayer.js$script,redirect=gemius + * ``` + * + * @added v1.5.0. + */ + function Gemius(source) { + var GemiusPlayer = function GemiusPlayer() {}; + GemiusPlayer.prototype = { + setVideoObject: noopFunc, + newProgram: noopFunc, + programEvent: noopFunc, + newAd: noopFunc, + adEvent: noopFunc + }; + window.GemiusPlayer = GemiusPlayer; + hit(source); + } + Gemius.names = ['gemius']; + Gemius.injections = [hit, noopFunc]; -/***/ }), + /** + * @redirect ati-smarttag + * + * @description + * Mocks AT Internat SmartTag. + * https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/ + * + * ### Examples + * + * ```adblock + * ||example.com/assets/scripts/smarttag.js$script,redirect=ati-smarttag + * ``` + * + * @added v1.5.0. + */ + function ATInternetSmartTag(source) { + var setNoopFuncWrapper = { + set: noopFunc + }; + var sendNoopFuncWrapper = { + send: noopFunc + }; + var ecommerceWrapper = { + displayCart: { + products: setNoopFuncWrapper, + cart: setNoopFuncWrapper + }, + updateCart: { + cart: setNoopFuncWrapper + }, + displayProduct: { + products: setNoopFuncWrapper + }, + displayPageProduct: { + products: setNoopFuncWrapper + }, + addProduct: { + products: setNoopFuncWrapper + }, + removeProduct: { + products: setNoopFuncWrapper + } + }; -/***/ 1805: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // eslint-disable-next-line new-cap, func-names + var tag = function tag() {}; + tag.prototype = { + setConfig: noopFunc, + setParam: noopFunc, + dispatch: noopFunc, + customVars: setNoopFuncWrapper, + publisher: setNoopFuncWrapper, + order: setNoopFuncWrapper, + click: sendNoopFuncWrapper, + clickListener: sendNoopFuncWrapper, + internalSearch: { + set: noopFunc, + send: noopFunc + }, + ecommerce: ecommerceWrapper, + identifiedVisitor: { + unset: noopFunc + }, + page: { + set: noopFunc, + send: noopFunc + }, + selfPromotion: { + add: noopFunc, + send: noopFunc + }, + privacy: { + setVisitorMode: noopFunc, + getVisitorMode: noopFunc, + hit: noopFunc + }, + richMedia: { + add: noopFunc, + send: noopFunc, + remove: noopFunc, + removeAll: noopFunc + } + }; + var smartTagWrapper = { + Tracker: { + Tag: tag + } + }; + window.ATInternet = smartTagWrapper; + hit(source); + } + ATInternetSmartTag.names = ['ati-smarttag']; + ATInternetSmartTag.injections = [hit, noopFunc]; -var DESCRIPTORS = __webpack_require__(7400); -var hasOwn = __webpack_require__(8270); + /* eslint-disable consistent-return, no-eval */ -var FunctionPrototype = Function.prototype; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; - -var EXISTS = hasOwn(FunctionPrototype, 'name'); -// additional protection from minified / mangled / dropped function names -var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; -var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); - -module.exports = { - EXISTS: EXISTS, - PROPER: PROPER, - CONFIGURABLE: CONFIGURABLE -}; - - -/***/ }), - -/***/ 3411: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(5968); -var aCallable = __webpack_require__(7111); - -module.exports = function (object, key, method) { - try { - // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe - return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); - } catch (error) { /* empty */ } -}; - - -/***/ }), - -/***/ 5968: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var NATIVE_BIND = __webpack_require__(7188); - -var FunctionPrototype = Function.prototype; -var call = FunctionPrototype.call; -var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); - -module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { - return function () { - return call.apply(fn, arguments); - }; -}; - - -/***/ }), - -/***/ 1333: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(9859); -var isCallable = __webpack_require__(6733); - -var aFunction = function (argument) { - return isCallable(argument) ? argument : undefined; -}; - -module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; -}; - - -/***/ }), - -/***/ 5300: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var aCallable = __webpack_require__(7111); -var isNullOrUndefined = __webpack_require__(9650); - -// `GetMethod` abstract operation -// https://tc39.es/ecma262/#sec-getmethod -module.exports = function (V, P) { - var func = V[P]; - return isNullOrUndefined(func) ? undefined : aCallable(func); -}; - - -/***/ }), - -/***/ 9859: -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - -var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -module.exports = - // eslint-disable-next-line es/no-global-this -- safe - check(typeof globalThis == 'object' && globalThis) || - check(typeof window == 'object' && window) || - // eslint-disable-next-line no-restricted-globals -- safe - check(typeof self == 'object' && self) || - check(typeof __webpack_require__.g == 'object' && __webpack_require__.g) || - // eslint-disable-next-line no-new-func -- fallback - (function () { return this; })() || this || Function('return this')(); - - -/***/ }), - -/***/ 8270: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(5968); -var toObject = __webpack_require__(2991); - -var hasOwnProperty = uncurryThis({}.hasOwnProperty); - -// `HasOwnProperty` abstract operation -// https://tc39.es/ecma262/#sec-hasownproperty -// eslint-disable-next-line es/no-object-hasown -- safe -module.exports = Object.hasOwn || function hasOwn(it, key) { - return hasOwnProperty(toObject(it), key); -}; - - -/***/ }), - -/***/ 5977: -/***/ ((module) => { - -module.exports = {}; - - -/***/ }), - -/***/ 8385: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getBuiltIn = __webpack_require__(1333); - -module.exports = getBuiltIn('document', 'documentElement'); - - -/***/ }), - -/***/ 4394: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var DESCRIPTORS = __webpack_require__(7400); -var fails = __webpack_require__(4229); -var createElement = __webpack_require__(2635); - -// Thanks to IE8 for its funny defineProperty -module.exports = !DESCRIPTORS && !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- required for testing - return Object.defineProperty(createElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); - - -/***/ }), - -/***/ 9337: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(5968); -var fails = __webpack_require__(4229); -var classof = __webpack_require__(7079); - -var $Object = Object; -var split = uncurryThis(''.split); - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -module.exports = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins -- safe - return !$Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classof(it) == 'String' ? split(it, '') : $Object(it); -} : $Object; - - -/***/ }), - -/***/ 835: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isCallable = __webpack_require__(6733); -var isObject = __webpack_require__(5052); -var setPrototypeOf = __webpack_require__(6540); - -// makes subclassing work correct for wrapped built-ins -module.exports = function ($this, dummy, Wrapper) { - var NewTarget, NewTargetPrototype; - if ( - // it can work only with native `setPrototypeOf` - setPrototypeOf && - // we haven't completely correct pre-ES6 way for getting `new.target`, so use this - isCallable(NewTarget = dummy.constructor) && - NewTarget !== Wrapper && - isObject(NewTargetPrototype = NewTarget.prototype) && - NewTargetPrototype !== Wrapper.prototype - ) setPrototypeOf($this, NewTargetPrototype); - return $this; -}; - - -/***/ }), - -/***/ 8511: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(5968); -var isCallable = __webpack_require__(6733); -var store = __webpack_require__(5353); - -var functionToString = uncurryThis(Function.toString); - -// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper -if (!isCallable(store.inspectSource)) { - store.inspectSource = function (it) { - return functionToString(it); - }; -} - -module.exports = store.inspectSource; - - -/***/ }), - -/***/ 9679: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isObject = __webpack_require__(5052); -var createNonEnumerableProperty = __webpack_require__(5762); - -// `InstallErrorCause` abstract operation -// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause -module.exports = function (O, options) { - if (isObject(options) && 'cause' in options) { - createNonEnumerableProperty(O, 'cause', options.cause); - } -}; - - -/***/ }), - -/***/ 6407: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var NATIVE_WEAK_MAP = __webpack_require__(1180); -var global = __webpack_require__(9859); -var isObject = __webpack_require__(5052); -var createNonEnumerableProperty = __webpack_require__(5762); -var hasOwn = __webpack_require__(8270); -var shared = __webpack_require__(5353); -var sharedKey = __webpack_require__(4399); -var hiddenKeys = __webpack_require__(5977); - -var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; -var TypeError = global.TypeError; -var WeakMap = global.WeakMap; -var set, get, has; - -var enforce = function (it) { - return has(it) ? get(it) : set(it, {}); -}; - -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; - -if (NATIVE_WEAK_MAP || shared.state) { - var store = shared.state || (shared.state = new WeakMap()); - /* eslint-disable no-self-assign -- prototype methods protection */ - store.get = store.get; - store.has = store.has; - store.set = store.set; - /* eslint-enable no-self-assign -- prototype methods protection */ - set = function (it, metadata) { - if (store.has(it)) throw TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - store.set(it, metadata); - return metadata; - }; - get = function (it) { - return store.get(it) || {}; - }; - has = function (it) { - return store.has(it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - if (hasOwn(it, STATE)) throw TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return hasOwn(it, STATE) ? it[STATE] : {}; - }; - has = function (it) { - return hasOwn(it, STATE); - }; -} - -module.exports = { - set: set, - get: get, - has: has, - enforce: enforce, - getterFor: getterFor -}; - - -/***/ }), - -/***/ 3718: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /** + * @redirect prevent-bab2 + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Related UBO redirect: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab2.js + * + * See [redirect description](../wiki/about-redirects.md#prevent-bab2). + * + * ### Examples + * + * ```adblock + * /blockadblock.$script,redirect=prevent-bab2 + * ``` + * + * @added v1.5.0. + */ + function preventBab2(source) { + var script = document.currentScript; + if (script === null) { + return; + } + var url = script.src; + if (typeof url !== 'string') { + return; + } + var domainsStr = ['adclixx\\.net', 'adnetasia\\.com', 'adtrackers\\.net', 'bannertrack\\.net'].join('|'); + var matchStr = "^https?://[\\w-]+\\.(".concat(domainsStr, ")/."); + var domainsRegex = new RegExp(matchStr); + if (domainsRegex.test(url) === false) { + return; + } + window.nH7eXzOsG = 858; + hit(source); + } + preventBab2.names = ['prevent-bab2', + // aliases are needed for matching the related scriptlet converted into our syntax + 'nobab2.js']; + preventBab2.injections = [hit]; -var classof = __webpack_require__(7079); + /* eslint-disable func-names, no-underscore-dangle */ -// `IsArray` abstract operation -// https://tc39.es/ecma262/#sec-isarray -// eslint-disable-next-line es/no-array-isarray -- safe -module.exports = Array.isArray || function isArray(argument) { - return classof(argument) == 'Array'; -}; + /** + * @redirect google-ima3 + * + * @description + * Mocks the IMA SDK of Google. + * + * Related Mozilla shim: + * https://searchfox.org/mozilla-central/source/browser/extensions/webcompat/shims/google-ima.js + * + * ### Examples + * + * ```adblock + * ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima3 + * ``` + * + * @added v1.6.2. + */ + function GoogleIma3(source) { + var _window$google$ima; + var VERSION = '3.453.0'; + var ima = {}; + var AdDisplayContainer = function AdDisplayContainer() {}; + AdDisplayContainer.prototype.destroy = noopFunc; + AdDisplayContainer.prototype.initialize = noopFunc; + var ImaSdkSettings = function ImaSdkSettings() {}; + ImaSdkSettings.CompanionBackfillMode = { + ALWAYS: 'always', + ON_MASTER_AD: 'on_master_ad' + }; + ImaSdkSettings.VpaidMode = { + DISABLED: 0, + ENABLED: 1, + INSECURE: 2 + }; + ImaSdkSettings.prototype = { + c: true, + f: {}, + i: false, + l: '', + p: '', + r: 0, + t: '', + v: '', + getCompanionBackfill: noopFunc, + getDisableCustomPlaybackForIOS10Plus() { + return this.i; + }, + getDisabledFlashAds: function getDisabledFlashAds() { + return true; + }, + getFeatureFlags() { + return this.f; + }, + getLocale() { + return this.l; + }, + getNumRedirects() { + return this.r; + }, + getPlayerType() { + return this.t; + }, + getPlayerVersion() { + return this.v; + }, + getPpid() { + return this.p; + }, + getVpaidMode() { + return this.C; + }, + isCookiesEnabled() { + return this.c; + }, + isVpaidAdapter() { + return this.M; + }, + setCompanionBackfill: noopFunc, + setAutoPlayAdBreaks(a) { + this.K = a; + }, + setCookiesEnabled(c) { + this.c = !!c; + }, + setDisableCustomPlaybackForIOS10Plus(i) { + this.i = !!i; + }, + setDisableFlashAds: noopFunc, + setFeatureFlags(f) { + this.f = !!f; + }, + setIsVpaidAdapter(a) { + this.M = a; + }, + setLocale(l) { + this.l = !!l; + }, + setNumRedirects(r) { + this.r = !!r; + }, + setPageCorrelator(a) { + this.R = a; + }, + setPlayerType(t) { + this.t = !!t; + }, + setPlayerVersion(v) { + this.v = !!v; + }, + setPpid(p) { + this.p = !!p; + }, + setVpaidMode(a) { + this.C = a; + }, + setSessionId: noopFunc, + setStreamCorrelator: noopFunc, + setVpaidAllowed: noopFunc, + CompanionBackfillMode: { + ALWAYS: 'always', + ON_MASTER_AD: 'on_master_ad' + }, + VpaidMode: { + DISABLED: 0, + ENABLED: 1, + INSECURE: 2 + } + }; + var EventHandler = function EventHandler() { + this.listeners = new Map(); + this._dispatch = function (e) { + var listeners = this.listeners.get(e.type) || []; + // eslint-disable-next-line no-restricted-syntax + for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) { + var listener = _Array$from[_i]; + try { + listener(e); + } catch (r) { + logMessage(source, r); + } + } + }; + this.addEventListener = function (t, c) { + if (!this.listeners.has(t)) { + this.listeners.set(t, new Set()); + } + this.listeners.get(t).add(c); + }; + this.removeEventListener = function (t, c) { + var _this$listeners$get; + (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c); + }; + }; + var AdsManager = new EventHandler(); + /* eslint-disable no-use-before-define */ + AdsManager.volume = 1; + AdsManager.collapse = noopFunc; + AdsManager.configureAdsManager = noopFunc; + AdsManager.destroy = noopFunc; + AdsManager.discardAdBreak = noopFunc; + AdsManager.expand = noopFunc; + AdsManager.focus = noopFunc; + AdsManager.getAdSkippableState = function () { + return false; + }; + AdsManager.getCuePoints = function () { + return [0]; + }; + AdsManager.getCurrentAd = function () { + return currentAd; + }; + AdsManager.getCurrentAdCuePoints = function () { + return []; + }; + AdsManager.getRemainingTime = function () { + return 0; + }; + AdsManager.getVolume = function () { + return this.volume; + }; + AdsManager.init = noopFunc; + AdsManager.isCustomClickTrackingUsed = function () { + return false; + }; + AdsManager.isCustomPlaybackUsed = function () { + return false; + }; + AdsManager.pause = noopFunc; + AdsManager.requestNextAdBreak = noopFunc; + AdsManager.resize = noopFunc; + AdsManager.resume = noopFunc; + AdsManager.setVolume = function (v) { + this.volume = v; + }; + AdsManager.skip = noopFunc; + AdsManager.start = function () { + // eslint-disable-next-line no-restricted-syntax + for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) { + var type = _arr[_i2]; + try { + this._dispatch(new ima.AdEvent(type)); + } catch (e) { + logMessage(source, e); + } + } + }; + AdsManager.stop = noopFunc; + AdsManager.updateAdsRenderingSettings = noopFunc; + /* eslint-enable no-use-before-define */ -/***/ }), - -/***/ 6733: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var $documentAll = __webpack_require__(3777); - -var documentAll = $documentAll.all; - -// `IsCallable` abstract operation -// https://tc39.es/ecma262/#sec-iscallable -module.exports = $documentAll.IS_HTMLDDA ? function (argument) { - return typeof argument == 'function' || argument === documentAll; -} : function (argument) { - return typeof argument == 'function'; -}; - + var manager = Object.create(AdsManager); + var AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) { + this.type = type; + this.adsRequest = adsRequest; + this.userRequestContext = userRequestContext; + }; + AdsManagerLoadedEvent.prototype = { + getAdsManager: function getAdsManager() { + return manager; + }, + getUserRequestContext() { + if (this.userRequestContext) { + return this.userRequestContext; + } + return {}; + } + }; + AdsManagerLoadedEvent.Type = { + ADS_MANAGER_LOADED: 'adsManagerLoaded' + }; + var AdsLoader = EventHandler; + AdsLoader.prototype.settings = new ImaSdkSettings(); + AdsLoader.prototype.contentComplete = noopFunc; + AdsLoader.prototype.destroy = noopFunc; + AdsLoader.prototype.getSettings = function () { + return this.settings; + }; + AdsLoader.prototype.getVersion = function () { + return VERSION; + }; + AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) { + var _this = this; + requestAnimationFrame(function () { + var ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED; + var event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext); + _this._dispatch(event); + }); + var e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext); + requestAnimationFrame(function () { + _this._dispatch(new ima.AdErrorEvent(e)); + }); + }; + var AdsRenderingSettings = noopFunc; + var AdsRequest = function AdsRequest() {}; + AdsRequest.prototype = { + setAdWillAutoPlay: noopFunc, + setAdWillPlayMuted: noopFunc, + setContinuousPlayback: noopFunc + }; + var AdPodInfo = function AdPodInfo() {}; + AdPodInfo.prototype = { + getAdPosition: function getAdPosition() { + return 1; + }, + getIsBumper: function getIsBumper() { + return false; + }, + getMaxDuration: function getMaxDuration() { + return -1; + }, + getPodIndex: function getPodIndex() { + return 1; + }, + getTimeOffset: function getTimeOffset() { + return 0; + }, + getTotalAds: function getTotalAds() { + return 1; + } + }; + var Ad = function Ad() {}; + Ad.prototype = { + pi: new AdPodInfo(), + getAdId: function getAdId() { + return ''; + }, + getAdPodInfo() { + return this.pi; + }, + getAdSystem: function getAdSystem() { + return ''; + }, + getAdvertiserName: function getAdvertiserName() { + return ''; + }, + getApiFramework: function getApiFramework() { + return null; + }, + getCompanionAds: function getCompanionAds() { + return []; + }, + getContentType: function getContentType() { + return ''; + }, + getCreativeAdId: function getCreativeAdId() { + return ''; + }, + getDealId: function getDealId() { + return ''; + }, + getDescription: function getDescription() { + return ''; + }, + getDuration: function getDuration() { + return 8.5; + }, + getHeight: function getHeight() { + return 0; + }, + getMediaUrl: function getMediaUrl() { + return null; + }, + getMinSuggestedDuration: function getMinSuggestedDuration() { + return -2; + }, + getSkipTimeOffset: function getSkipTimeOffset() { + return -1; + }, + getSurveyUrl: function getSurveyUrl() { + return null; + }, + getTitle: function getTitle() { + return ''; + }, + getTraffickingParametersString: function getTraffickingParametersString() { + return ''; + }, + getUiElements: function getUiElements() { + return ['']; + }, + getUniversalAdIdRegistry: function getUniversalAdIdRegistry() { + return 'unknown'; + }, + getUniversalAdIds: function getUniversalAdIds() { + return ['']; + }, + getUniversalAdIdValue: function getUniversalAdIdValue() { + return 'unknown'; + }, + getVastMediaBitrate: function getVastMediaBitrate() { + return 0; + }, + getVastMediaHeight: function getVastMediaHeight() { + return 0; + }, + getVastMediaWidth: function getVastMediaWidth() { + return 0; + }, + getWidth: function getWidth() { + return 0; + }, + getWrapperAdIds: function getWrapperAdIds() { + return ['']; + }, + getWrapperAdSystems: function getWrapperAdSystems() { + return ['']; + }, + getWrapperCreativeIds: function getWrapperCreativeIds() { + return ['']; + }, + isLinear: function isLinear() { + return true; + }, + isSkippable() { + return true; + } + }; + var CompanionAd = function CompanionAd() {}; + CompanionAd.prototype = { + getAdSlotId: function getAdSlotId() { + return ''; + }, + getContent: function getContent() { + return ''; + }, + getContentType: function getContentType() { + return ''; + }, + getHeight: function getHeight() { + return 1; + }, + getWidth: function getWidth() { + return 1; + } + }; + var AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) { + this.errorCode = code; + this.message = message; + this.type = type; + this.adsRequest = adsRequest; + this.userRequestContext = userRequestContext; + this.getErrorCode = function () { + return this.errorCode; + }; + this.getInnerError = function () {}; + this.getMessage = function () { + return this.message; + }; + this.getType = function () { + return this.type; + }; + this.getVastErrorCode = function () { + return this.vastErrorCode; + }; + this.toString = function () { + return "AdError ".concat(this.errorCode, ": ").concat(this.message); + }; + }; + AdError.ErrorCode = {}; + AdError.Type = {}; + var isEngadget = function isEngadget() { + try { + // eslint-disable-next-line no-restricted-syntax + for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) { + var _ctx$getPlayer, _ctx$getPlayer$div; + var ctx = _Object$values[_i3]; + // eslint-disable-next-line no-restricted-properties + if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) { + return true; + } + } + } catch (e) {} // eslint-disable-line no-empty + return false; + }; + var currentAd = isEngadget() ? undefined : new Ad(); + var AdEvent = function AdEvent(type) { + this.type = type; + }; + AdEvent.prototype = { + getAd: function getAd() { + return currentAd; + }, + getAdData: function getAdData() {} + }; + AdEvent.Type = { + AD_BREAK_READY: 'adBreakReady', + AD_BUFFERING: 'adBuffering', + AD_CAN_PLAY: 'adCanPlay', + AD_METADATA: 'adMetadata', + AD_PROGRESS: 'adProgress', + ALL_ADS_COMPLETED: 'allAdsCompleted', + CLICK: 'click', + COMPLETE: 'complete', + CONTENT_PAUSE_REQUESTED: 'contentPauseRequested', + CONTENT_RESUME_REQUESTED: 'contentResumeRequested', + DURATION_CHANGE: 'durationChange', + EXPANDED_CHANGED: 'expandedChanged', + FIRST_QUARTILE: 'firstQuartile', + IMPRESSION: 'impression', + INTERACTION: 'interaction', + LINEAR_CHANGE: 'linearChange', + LINEAR_CHANGED: 'linearChanged', + LOADED: 'loaded', + LOG: 'log', + MIDPOINT: 'midpoint', + PAUSED: 'pause', + RESUMED: 'resume', + SKIPPABLE_STATE_CHANGED: 'skippableStateChanged', + SKIPPED: 'skip', + STARTED: 'start', + THIRD_QUARTILE: 'thirdQuartile', + USER_CLOSE: 'userClose', + VIDEO_CLICKED: 'videoClicked', + VIDEO_ICON_CLICKED: 'videoIconClicked', + VIEWABLE_IMPRESSION: 'viewable_impression', + VOLUME_CHANGED: 'volumeChange', + VOLUME_MUTED: 'mute' + }; + var AdErrorEvent = function AdErrorEvent(error) { + this.error = error; + this.type = 'adError'; + this.getError = function () { + return this.error; + }; + this.getUserRequestContext = function () { + var _this$error; + if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) { + return this.error.userRequestContext; + } + return {}; + }; + }; + AdErrorEvent.Type = { + AD_ERROR: 'adError' + }; + var CustomContentLoadedEvent = function CustomContentLoadedEvent() {}; + CustomContentLoadedEvent.Type = { + CUSTOM_CONTENT_LOADED: 'deprecated-event' + }; + var CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {}; + CompanionAdSelectionSettings.CreativeType = { + ALL: 'All', + FLASH: 'Flash', + IMAGE: 'Image' + }; + CompanionAdSelectionSettings.ResourceType = { + ALL: 'All', + HTML: 'Html', + IFRAME: 'IFrame', + STATIC: 'Static' + }; + CompanionAdSelectionSettings.SizeCriteria = { + IGNORE: 'IgnoreSize', + SELECT_EXACT_MATCH: 'SelectExactMatch', + SELECT_NEAR_MATCH: 'SelectNearMatch' + }; + var AdCuePoints = function AdCuePoints() {}; + AdCuePoints.prototype = { + getCuePoints: function getCuePoints() { + return []; + }, + getAdIdRegistry: function getAdIdRegistry() { + return ''; + }, + getAdIsValue: function getAdIsValue() { + return ''; + } + }; + var AdProgressData = noopFunc; + var UniversalAdIdInfo = function UniversalAdIdInfo() {}; + Object.assign(ima, { + AdCuePoints, + AdDisplayContainer, + AdError, + AdErrorEvent, + AdEvent, + AdPodInfo, + AdProgressData, + AdsLoader, + AdsManager: manager, + AdsManagerLoadedEvent, + AdsRenderingSettings, + AdsRequest, + CompanionAd, + CompanionAdSelectionSettings, + CustomContentLoadedEvent, + gptProxyInstance: {}, + ImaSdkSettings, + OmidAccessMode: { + DOMAIN: 'domain', + FULL: 'full', + LIMITED: 'limited' + }, + settings: new ImaSdkSettings(), + UiElements: { + AD_ATTRIBUTION: 'adAttribution', + COUNTDOWN: 'countdown' + }, + UniversalAdIdInfo, + VERSION, + ViewMode: { + FULLSCREEN: 'fullscreen', + NORMAL: 'normal' + } + }); + if (!window.google) { + window.google = {}; + } -/***/ }), + // Workaround for https://github.com/AdguardTeam/Scriptlets/issues/331 + // To avoid conflicts with the DAI SDK, we need to make sure that the + // google.ima.dai namespace is not overwritten. + // TODO: Later we should create a mock for the DAI SDK as well. + // See https://github.com/AdguardTeam/Scriptlets/issues/239 + if ((_window$google$ima = window.google.ima) !== null && _window$google$ima !== void 0 && _window$google$ima.dai) { + ima.dai = window.google.ima.dai; + } + window.google.ima = ima; + hit(source); + } + GoogleIma3.names = ['google-ima3', + // prefixed name + 'ubo-google-ima.js', + // original ubo name + 'google-ima.js']; + GoogleIma3.injections = [hit, noopFunc, logMessage]; -/***/ 6541: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /* eslint-disable func-names, no-underscore-dangle */ -var fails = __webpack_require__(4229); -var isCallable = __webpack_require__(6733); + /** + * @redirect didomi-loader + * + * @description + * Mocks Didomi's CMP loader script. + * https://developers.didomi.io/ + * + * ### Examples + * + * ```adblock + * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader + * ``` + * + * @added v1.6.2. + */ + function DidomiLoader(source) { + function UserConsentStatusForVendorSubscribe() {} + UserConsentStatusForVendorSubscribe.prototype.filter = function () { + return new UserConsentStatusForVendorSubscribe(); + }; + UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc; + function UserConsentStatusForVendor() {} + UserConsentStatusForVendor.prototype.first = function () { + return new UserConsentStatusForVendorSubscribe(); + }; + UserConsentStatusForVendor.prototype.filter = function () { + return new UserConsentStatusForVendorSubscribe(); + }; + UserConsentStatusForVendor.prototype.subscribe = noopFunc; + var DidomiWrapper = { + isConsentRequired: falseFunc, + getUserConsentStatusForPurpose: trueFunc, + getUserConsentStatus: trueFunc, + getUserStatus: noopFunc, + getRequiredPurposes: noopArray, + getUserConsentStatusForVendor: trueFunc, + Purposes: { + Cookies: 'cookies' + }, + notice: { + configure: noopFunc, + hide: noopFunc, + isVisible: falseFunc, + show: noopFunc, + showDataProcessing: trueFunc + }, + isUserConsentStatusPartial: falseFunc, + on() { + return { + actions: {}, + emitter: {}, + services: {}, + store: {} + }; + }, + shouldConsentBeCollected: falseFunc, + getUserConsentStatusForAll: noopFunc, + getObservableOnUserConsentStatusForVendor() { + return new UserConsentStatusForVendor(); + } + }; + window.Didomi = DidomiWrapper; + var didomiStateWrapper = { + didomiExperimentId: '', + didomiExperimentUserGroup: '', + didomiGDPRApplies: 1, + didomiIABConsent: '', + didomiPurposesConsent: '', + didomiPurposesConsentDenied: '', + didomiPurposesConsentUnknown: '', + didomiVendorsConsent: '', + didomiVendorsConsentDenied: '', + didomiVendorsConsentUnknown: '', + didomiVendorsRawConsent: '', + didomiVendorsRawConsentDenied: '', + didomiVendorsRawConsentUnknown: '' + }; + window.didomiState = didomiStateWrapper; + var tcData = { + eventStatus: 'tcloaded', + gdprApplies: false, + listenerId: noopFunc, + vendor: { + consents: [] + }, + purpose: { + consents: [] + } + }; -var replacement = /#|\.prototype\./; + // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api + var __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) { + if (typeof callback !== 'function' || command === 'removeEventListener') { + return; + } + callback(tcData, true); + }; + window.__tcfapi = __tcfapiWrapper; + var didomiEventListenersWrapper = { + stub: true, + push: noopFunc + }; + window.didomiEventListeners = didomiEventListenersWrapper; + var didomiOnReadyWrapper = { + stub: true, + push(arg) { + if (typeof arg !== 'function') { + return; + } + if (document.readyState !== 'complete') { + window.addEventListener('load', function () { + setTimeout(arg(window.Didomi)); + }); + } else { + setTimeout(arg(window.Didomi)); + } + } + }; + window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper; + if (Array.isArray(window.didomiOnReady)) { + window.didomiOnReady.forEach(function (arg) { + if (typeof arg === 'function') { + try { + setTimeout(arg(window.Didomi)); + } catch (e) { + /* empty */ + } + } + }); + } + hit(source); + } + DidomiLoader.names = ['didomi-loader']; + DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc]; -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : isCallable(detection) ? fails(detection) - : !!detection; -}; + /* eslint-disable func-names */ -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); -}; + /** + * @redirect prebid + * + * @description + * Mocks the prebid.js header bidding suit. + * https://docs.prebid.org/ + * + * ### Examples + * + * ```adblock + * ||example.org/bd/hb/prebid.js$script,redirect=prebid + * ``` + * + * @added v1.6.2. + */ -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; - -module.exports = isForced; - - -/***/ }), + function Prebid(source) { + var pushFunction = function pushFunction(arg) { + if (typeof arg === 'function') { + try { + arg.call(); + } catch (ex) { + /* empty */ + } + } + }; + var pbjsWrapper = { + addAdUnits() {}, + adServers: { + dfp: { + // https://docs.prebid.org/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html + // returns ad URL + buildVideoUrl: noopStr + } + }, + adUnits: [], + aliasBidder() {}, + cmd: [], + enableAnalytics() {}, + getHighestCpmBids: noopArray, + libLoaded: true, + que: [], + requestBids(arg) { + if (arg instanceof Object && arg.bidsBackHandler) { + try { + arg.bidsBackHandler.call(); // https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html + } catch (ex) { + /* empty */ + } + } + }, + removeAdUnit() {}, + setBidderConfig() {}, + setConfig() {}, + setTargetingForGPTAsync() {} + }; + pbjsWrapper.cmd.push = pushFunction; + pbjsWrapper.que.push = pushFunction; + window.pbjs = pbjsWrapper; + hit(source); + } + Prebid.names = ['prebid']; + Prebid.injections = [hit, noopFunc, noopStr, noopArray]; -/***/ 9650: -/***/ ((module) => { + /* eslint-disable func-names */ -// we can't use just `it == null` since of `document.all` special case -// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec -module.exports = function (it) { - return it === null || it === undefined; -}; + /** + * @redirect prebid-ads + * + * @description + * Sets predefined constants on a page: + * + * - `canRunAds`: `true` + * - `isAdBlockActive`: `false` + * + * ### Examples + * + * ```adblock + * ||example.org/assets/js/prebid-ads.js$script,redirect=prebid-ads + * ``` + * + * @added v1.6.2. + */ + function prebidAds(source) { + window.canRunAds = true; + window.isAdBlockActive = false; + hit(source); + } + prebidAds.names = ['prebid-ads', 'ubo-prebid-ads.js', 'prebid-ads.js']; + prebidAds.injections = [hit]; + /* eslint-disable func-names */ -/***/ }), + /** + * @redirect naver-wcslog + * + * @description + * Mocks wcslog.js of Naver Analytics. + * + * ### Examples + * + * ```adblock + * ||wcs.naver.net/wcslog.js$script,redirect=naver-wcslog + * ``` + * + * @added v1.6.2. + */ -/***/ 5052: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + function NaverWcslog(source) { + window.wcs_add = {}; + window.wcs_do = noopFunc; + window.wcs = { + inflow: noopFunc + }; + hit(source); + } + NaverWcslog.names = ['naver-wcslog']; + NaverWcslog.injections = [hit, noopFunc]; -var isCallable = __webpack_require__(6733); -var $documentAll = __webpack_require__(3777); + var redirectsList = /*#__PURE__*/Object.freeze({ + __proto__: null, + ATInternetSmartTag: ATInternetSmartTag, + AmazonApstag: AmazonApstag, + DidomiLoader: DidomiLoader, + Fingerprintjs2: Fingerprintjs2, + Fingerprintjs3: Fingerprintjs3, + Gemius: Gemius, + GoogleAnalytics: GoogleAnalytics, + GoogleAnalyticsGa: GoogleAnalyticsGa, + GoogleIma3: GoogleIma3, + GoogleSyndicationAdsByGoogle: GoogleSyndicationAdsByGoogle, + GoogleTagServicesGpt: GoogleTagServicesGpt, + Matomo: Matomo, + NaverWcslog: NaverWcslog, + Pardot: Pardot, + Prebid: Prebid, + ScoreCardResearchBeacon: ScoreCardResearchBeacon, + metrikaYandexTag: metrikaYandexTag, + metrikaYandexWatch: metrikaYandexWatch, + noeval: noeval$1, + prebidAds: prebidAds, + preventBab: preventBab$1, + preventBab2: preventBab2, + preventFab: preventFab$1, + preventPopadsNet: preventPopadsNet$1, + setPopadsDummy: setPopadsDummy$1 + }); -var documentAll = $documentAll.all; + function _typeof(obj) { + "@babel/helpers - typeof"; -module.exports = $documentAll.IS_HTMLDDA ? function (it) { - return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll; -} : function (it) { - return typeof it == 'object' ? it !== null : isCallable(it); -}; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); + } + function _toPrimitive(input, hint) { + if (_typeof(input) !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (_typeof(res) !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } -/***/ }), + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return _typeof(key) === "symbol" ? key : String(key); + } -/***/ 4231: -/***/ ((module) => { + function _defineProperty(obj, key, value) { + key = _toPropertyKey(key); + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } -module.exports = false; + function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; + } + var jsYaml$2 = {}; -/***/ }), + var loader$1 = {}; -/***/ 9395: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + var common$6 = {}; -var getBuiltIn = __webpack_require__(1333); -var isCallable = __webpack_require__(6733); -var isPrototypeOf = __webpack_require__(1321); -var USE_SYMBOL_AS_UID = __webpack_require__(6969); + function isNothing(subject) { + return typeof subject === 'undefined' || subject === null; + } + function isObject(subject) { + return typeof subject === 'object' && subject !== null; + } + function toArray(sequence) { + if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return []; + return [sequence]; + } + function extend(target, source) { + var index, length, key, sourceKeys; + if (source) { + sourceKeys = Object.keys(source); + for (index = 0, length = sourceKeys.length; index < length; index += 1) { + key = sourceKeys[index]; + target[key] = source[key]; + } + } + return target; + } + function repeat(string, count) { + var result = '', + cycle; + for (cycle = 0; cycle < count; cycle += 1) { + result += string; + } + return result; + } + function isNegativeZero(number) { + return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; + } + common$6.isNothing = isNothing; + common$6.isObject = isObject; + common$6.toArray = toArray; + common$6.repeat = repeat; + common$6.isNegativeZero = isNegativeZero; + common$6.extend = extend; -var $Object = Object; + function YAMLException$4(reason, mark) { + // Super constructor + Error.call(this); + this.name = 'YAMLException'; + this.reason = reason; + this.mark = mark; + this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); -module.exports = USE_SYMBOL_AS_UID ? function (it) { - return typeof it == 'symbol'; -} : function (it) { - var $Symbol = getBuiltIn('Symbol'); - return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); -}; + // Include stack trace in error object + if (Error.captureStackTrace) { + // Chrome and NodeJS + Error.captureStackTrace(this, this.constructor); + } else { + // FF, IE 10+ and Safari 6+. Fallback for others + this.stack = new Error().stack || ''; + } + } + // Inherit from Error + YAMLException$4.prototype = Object.create(Error.prototype); + YAMLException$4.prototype.constructor = YAMLException$4; + YAMLException$4.prototype.toString = function toString(compact) { + var result = this.name + ': '; + result += this.reason || '(unknown reason)'; + if (!compact && this.mark) { + result += ' ' + this.mark.toString(); + } + return result; + }; + var exception = YAMLException$4; -/***/ }), + var common$5 = common$6; + function Mark$1(name, buffer, position, line, column) { + this.name = name; + this.buffer = buffer; + this.position = position; + this.line = line; + this.column = column; + } + Mark$1.prototype.getSnippet = function getSnippet(indent, maxLength) { + var head, start, tail, end, snippet; + if (!this.buffer) return null; + indent = indent || 4; + maxLength = maxLength || 75; + head = ''; + start = this.position; + while (start > 0 && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(start - 1)) === -1) { + start -= 1; + if (this.position - start > maxLength / 2 - 1) { + head = ' ... '; + start += 5; + break; + } + } + tail = ''; + end = this.position; + while (end < this.buffer.length && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(end)) === -1) { + end += 1; + if (end - this.position > maxLength / 2 - 1) { + tail = ' ... '; + end -= 5; + break; + } + } + snippet = this.buffer.slice(start, end); + return common$5.repeat(' ', indent) + head + snippet + tail + '\n' + common$5.repeat(' ', indent + this.position - start + head.length) + '^'; + }; + Mark$1.prototype.toString = function toString(compact) { + var snippet, + where = ''; + if (this.name) { + where += 'in "' + this.name + '" '; + } + where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); + if (!compact) { + snippet = this.getSnippet(); + if (snippet) { + where += ':\n' + snippet; + } + } + return where; + }; + var mark = Mark$1; -/***/ 9646: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + var YAMLException$3 = exception; + var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases']; + var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping']; + function compileStyleAliases(map) { + var result = {}; + if (map !== null) { + Object.keys(map).forEach(function (style) { + map[style].forEach(function (alias) { + result[String(alias)] = style; + }); + }); + } + return result; + } + function Type$h(tag, options) { + options = options || {}; + Object.keys(options).forEach(function (name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new YAMLException$3('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + } + }); -var toLength = __webpack_require__(4237); + // TODO: Add tag format check. + this.tag = tag; + this.kind = options['kind'] || null; + this.resolve = options['resolve'] || function () { + return true; + }; + this.construct = options['construct'] || function (data) { + return data; + }; + this.instanceOf = options['instanceOf'] || null; + this.predicate = options['predicate'] || null; + this.represent = options['represent'] || null; + this.defaultStyle = options['defaultStyle'] || null; + this.styleAliases = compileStyleAliases(options['styleAliases'] || null); + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new YAMLException$3('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } + } + var type = Type$h; -// `LengthOfArrayLike` abstract operation -// https://tc39.es/ecma262/#sec-lengthofarraylike -module.exports = function (obj) { - return toLength(obj.length); -}; + /*eslint-disable max-len*/ + var common$4 = common$6; + var YAMLException$2 = exception; + var Type$g = type; + function compileList(schema, name, result) { + var exclude = []; + schema.include.forEach(function (includedSchema) { + result = compileList(includedSchema, name, result); + }); + schema[name].forEach(function (currentType) { + result.forEach(function (previousType, previousIndex) { + if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) { + exclude.push(previousIndex); + } + }); + result.push(currentType); + }); + return result.filter(function (type, index) { + return exclude.indexOf(index) === -1; + }); + } + function compileMap( /* lists... */ + ) { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {} + }, + index, + length; + function collectType(type) { + result[type.kind][type.tag] = result['fallback'][type.tag] = type; + } + for (index = 0, length = arguments.length; index < length; index += 1) { + arguments[index].forEach(collectType); + } + return result; + } + function Schema$5(definition) { + this.include = definition.include || []; + this.implicit = definition.implicit || []; + this.explicit = definition.explicit || []; + this.implicit.forEach(function (type) { + if (type.loadKind && type.loadKind !== 'scalar') { + throw new YAMLException$2('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); + } + }); + this.compiledImplicit = compileList(this, 'implicit', []); + this.compiledExplicit = compileList(this, 'explicit', []); + this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); + } + Schema$5.DEFAULT = null; + Schema$5.create = function createSchema() { + var schemas, types; + switch (arguments.length) { + case 1: + schemas = Schema$5.DEFAULT; + types = arguments[0]; + break; + case 2: + schemas = arguments[0]; + types = arguments[1]; + break; + default: + throw new YAMLException$2('Wrong number of arguments for Schema.create function'); + } + schemas = common$4.toArray(schemas); + types = common$4.toArray(types); + if (!schemas.every(function (schema) { + return schema instanceof Schema$5; + })) { + throw new YAMLException$2('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); + } + if (!types.every(function (type) { + return type instanceof Type$g; + })) { + throw new YAMLException$2('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + return new Schema$5({ + include: schemas, + explicit: types + }); + }; + var schema = Schema$5; -/***/ }), + var Type$f = type; + var str = new Type$f('tag:yaml.org,2002:str', { + kind: 'scalar', + construct: function construct(data) { + return data !== null ? data : ''; + } + }); -/***/ 6039: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + var Type$e = type; + var seq = new Type$e('tag:yaml.org,2002:seq', { + kind: 'sequence', + construct: function construct(data) { + return data !== null ? data : []; + } + }); -var uncurryThis = __webpack_require__(5968); -var fails = __webpack_require__(4229); -var isCallable = __webpack_require__(6733); -var hasOwn = __webpack_require__(8270); -var DESCRIPTORS = __webpack_require__(7400); -var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(1805).CONFIGURABLE); -var inspectSource = __webpack_require__(8511); -var InternalStateModule = __webpack_require__(6407); + var Type$d = type; + var map = new Type$d('tag:yaml.org,2002:map', { + kind: 'mapping', + construct: function construct(data) { + return data !== null ? data : {}; + } + }); -var enforceInternalState = InternalStateModule.enforce; -var getInternalState = InternalStateModule.get; -var $String = String; -// eslint-disable-next-line es/no-object-defineproperty -- safe -var defineProperty = Object.defineProperty; -var stringSlice = uncurryThis(''.slice); -var replace = uncurryThis(''.replace); -var join = uncurryThis([].join); + var Schema$4 = schema; + var failsafe = new Schema$4({ + explicit: [str, seq, map] + }); -var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { - return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; -}); + var Type$c = type; + function resolveYamlNull(data) { + if (data === null) return true; + var max = data.length; + return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'); + } + function constructYamlNull() { + return null; + } + function isNull(object) { + return object === null; + } + var _null = new Type$c('tag:yaml.org,2002:null', { + kind: 'scalar', + resolve: resolveYamlNull, + construct: constructYamlNull, + predicate: isNull, + represent: { + canonical: function canonical() { + return '~'; + }, + lowercase: function lowercase() { + return 'null'; + }, + uppercase: function uppercase() { + return 'NULL'; + }, + camelcase: function camelcase() { + return 'Null'; + } + }, + defaultStyle: 'lowercase' + }); -var TEMPLATE = String(String).split('String'); + var Type$b = type; + function resolveYamlBoolean(data) { + if (data === null) return false; + var max = data.length; + return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'); + } + function constructYamlBoolean(data) { + return data === 'true' || data === 'True' || data === 'TRUE'; + } + function isBoolean(object) { + return Object.prototype.toString.call(object) === '[object Boolean]'; + } + var bool = new Type$b('tag:yaml.org,2002:bool', { + kind: 'scalar', + resolve: resolveYamlBoolean, + construct: constructYamlBoolean, + predicate: isBoolean, + represent: { + lowercase: function lowercase(object) { + return object ? 'true' : 'false'; + }, + uppercase: function uppercase(object) { + return object ? 'TRUE' : 'FALSE'; + }, + camelcase: function camelcase(object) { + return object ? 'True' : 'False'; + } + }, + defaultStyle: 'lowercase' + }); -var makeBuiltIn = module.exports = function (value, name, options) { - if (stringSlice($String(name), 0, 7) === 'Symbol(') { - name = '[' + replace($String(name), /^Symbol\(([^)]*)\)/, '$1') + ']'; - } - if (options && options.getter) name = 'get ' + name; - if (options && options.setter) name = 'set ' + name; - if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { - if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); - else value.name = name; - } - if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { - defineProperty(value, 'length', { value: options.arity }); - } - try { - if (options && hasOwn(options, 'constructor') && options.constructor) { - if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); - // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable - } else if (value.prototype) value.prototype = undefined; - } catch (error) { /* empty */ } - var state = enforceInternalState(value); - if (!hasOwn(state, 'source')) { - state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); - } return value; -}; + var common$3 = common$6; + var Type$a = type; + function isHexCode(c) { + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */; + } -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -// eslint-disable-next-line no-extend-native -- required -Function.prototype.toString = makeBuiltIn(function toString() { - return isCallable(this) && getInternalState(this).source || inspectSource(this); -}, 'toString'); + function isOctCode(c) { + return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */; + } + function isDecCode(c) { + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */; + } -/***/ }), + function resolveYamlInteger(data) { + if (data === null) return false; + var max = data.length, + index = 0, + hasDigits = false, + ch; + if (!max) return false; + ch = data[index]; -/***/ 917: -/***/ ((module) => { + // sign + if (ch === '-' || ch === '+') { + ch = data[++index]; + } + if (ch === '0') { + // 0 + if (index + 1 === max) return true; + ch = data[++index]; -var ceil = Math.ceil; -var floor = Math.floor; + // base 2, base 8, base 16 -// `Math.trunc` method -// https://tc39.es/ecma262/#sec-math.trunc -// eslint-disable-next-line es/no-math-trunc -- safe -module.exports = Math.trunc || function trunc(x) { - var n = +x; - return (n > 0 ? floor : ceil)(n); -}; + if (ch === 'b') { + // base 2 + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch !== '0' && ch !== '1') return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + if (ch === 'x') { + // base 16 + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isHexCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } + // base 8 + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (!isOctCode(data.charCodeAt(index))) return false; + hasDigits = true; + } + return hasDigits && ch !== '_'; + } -/***/ }), + // base 10 (except 0) or base 60 -/***/ 635: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // value should not start with `_`; + if (ch === '_') return false; + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch === ':') break; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; + } -var toString = __webpack_require__(3326); + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; -module.exports = function (argument, $default) { - return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); -}; + // if !base60 - done; + if (ch !== ':') return true; + // base60 almost not used, no needs to optimize + return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); + } + function constructYamlInteger(data) { + var value = data, + sign = 1, + ch, + base, + digits = []; + if (value.indexOf('_') !== -1) { + value = value.replace(/_/g, ''); + } + ch = value[0]; + if (ch === '-' || ch === '+') { + if (ch === '-') sign = -1; + value = value.slice(1); + ch = value[0]; + } + if (value === '0') return 0; + if (ch === '0') { + if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); + if (value[1] === 'x') return sign * parseInt(value, 16); + return sign * parseInt(value, 8); + } + if (value.indexOf(':') !== -1) { + value.split(':').forEach(function (v) { + digits.unshift(parseInt(v, 10)); + }); + value = 0; + base = 1; + digits.forEach(function (d) { + value += d * base; + base *= 60; + }); + return sign * value; + } + return sign * parseInt(value, 10); + } + function isInteger(object) { + return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common$3.isNegativeZero(object); + } + var int = new Type$a('tag:yaml.org,2002:int', { + kind: 'scalar', + resolve: resolveYamlInteger, + construct: constructYamlInteger, + predicate: isInteger, + represent: { + binary: function binary(obj) { + return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); + }, + octal: function octal(obj) { + return obj >= 0 ? '0' + obj.toString(8) : '-0' + obj.toString(8).slice(1); + }, + decimal: function decimal(obj) { + return obj.toString(10); + }, + /* eslint-disable max-len */ + hexadecimal: function hexadecimal(obj) { + return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); + } + }, + defaultStyle: 'decimal', + styleAliases: { + binary: [2, 'bin'], + octal: [8, 'oct'], + decimal: [10, 'dec'], + hexadecimal: [16, 'hex'] + } + }); -/***/ }), + var common$2 = common$6; + var Type$9 = type; + var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 + // special case, seems not from spec + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // 20:59 + '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + + // .inf + '|[-+]?\\.(?:inf|Inf|INF)' + + // .nan + '|\\.(?:nan|NaN|NAN))$'); + function resolveYamlFloat(data) { + if (data === null) return false; + if (!YAML_FLOAT_PATTERN.test(data) || + // Quick hack to not allow integers end with `_` + // Probably should update regexp & check speed + data[data.length - 1] === '_') { + return false; + } + return true; + } + function constructYamlFloat(data) { + var value, sign, base, digits; + value = data.replace(/_/g, '').toLowerCase(); + sign = value[0] === '-' ? -1 : 1; + digits = []; + if ('+-'.indexOf(value[0]) >= 0) { + value = value.slice(1); + } + if (value === '.inf') { + return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; + } else if (value === '.nan') { + return NaN; + } else if (value.indexOf(':') >= 0) { + value.split(':').forEach(function (v) { + digits.unshift(parseFloat(v, 10)); + }); + value = 0.0; + base = 1; + digits.forEach(function (d) { + value += d * base; + base *= 60; + }); + return sign * value; + } + return sign * parseFloat(value, 10); + } + var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; + function representYamlFloat(object, style) { + var res; + if (isNaN(object)) { + switch (style) { + case 'lowercase': + return '.nan'; + case 'uppercase': + return '.NAN'; + case 'camelcase': + return '.NaN'; + } + } else if (Number.POSITIVE_INFINITY === object) { + switch (style) { + case 'lowercase': + return '.inf'; + case 'uppercase': + return '.INF'; + case 'camelcase': + return '.Inf'; + } + } else if (Number.NEGATIVE_INFINITY === object) { + switch (style) { + case 'lowercase': + return '-.inf'; + case 'uppercase': + return '-.INF'; + case 'camelcase': + return '-.Inf'; + } + } else if (common$2.isNegativeZero(object)) { + return '-0.0'; + } + res = object.toString(10); -/***/ 2391: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // JS stringifier can build scientific format without dots: 5e-100, + // while YAML requres dot: 5.e-100. Fix it with simple hack -/* global ActiveXObject -- old IE, WSH */ -var anObject = __webpack_require__(1176); -var definePropertiesModule = __webpack_require__(219); -var enumBugKeys = __webpack_require__(3837); -var hiddenKeys = __webpack_require__(5977); -var html = __webpack_require__(8385); -var documentCreateElement = __webpack_require__(2635); -var sharedKey = __webpack_require__(4399); + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; + } + function isFloat(object) { + return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common$2.isNegativeZero(object)); + } + var float = new Type$9('tag:yaml.org,2002:float', { + kind: 'scalar', + resolve: resolveYamlFloat, + construct: constructYamlFloat, + predicate: isFloat, + represent: representYamlFloat, + defaultStyle: 'lowercase' + }); -var GT = '>'; -var LT = '<'; -var PROTOTYPE = 'prototype'; -var SCRIPT = 'script'; -var IE_PROTO = sharedKey('IE_PROTO'); + var Schema$3 = schema; + var json = new Schema$3({ + include: [failsafe], + implicit: [_null, bool, int, float] + }); -var EmptyConstructor = function () { /* empty */ }; + var Schema$2 = schema; + var core = new Schema$2({ + include: [json] + }); -var scriptTag = function (content) { - return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; -}; + var Type$8 = type; + var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year + '-([0-9][0-9])' + + // [2] month + '-([0-9][0-9])$'); // [3] day -// Create object with fake `null` prototype: use ActiveX Object with cleared prototype -var NullProtoObjectViaActiveX = function (activeXDocument) { - activeXDocument.write(scriptTag('')); - activeXDocument.close(); - var temp = activeXDocument.parentWindow.Object; - activeXDocument = null; // avoid memory leak - return temp; -}; + var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year + '-([0-9][0-9]?)' + + // [2] month + '-([0-9][0-9]?)' + + // [3] day + '(?:[Tt]|[ \\t]+)' + + // ... + '([0-9][0-9]?)' + + // [4] hour + ':([0-9][0-9])' + + // [5] minute + ':([0-9][0-9])' + + // [6] second + '(?:\\.([0-9]*))?' + + // [7] fraction + '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + + // [8] tz [9] tz_sign [10] tz_hour + '(?::([0-9][0-9]))?))?$'); // [11] tz_minute -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var NullProtoObjectViaIFrame = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var JS = 'java' + SCRIPT + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - // https://github.com/zloirock/core-js/issues/475 - iframe.src = String(JS); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(scriptTag('document.F=Object')); - iframeDocument.close(); - return iframeDocument.F; -}; + function resolveYamlTimestamp(data) { + if (data === null) return false; + if (YAML_DATE_REGEXP.exec(data) !== null) return true; + if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; + return false; + } + function constructYamlTimestamp(data) { + var match, + year, + month, + day, + hour, + minute, + second, + fraction = 0, + delta = null, + tz_hour, + tz_minute, + date; + match = YAML_DATE_REGEXP.exec(data); + if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); + if (match === null) throw new Error('Date resolve error'); -// Check for document.domain and active x support -// No need to use active x approach when document.domain is not set -// see https://github.com/es-shims/es5-shim/issues/150 -// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 -// avoid IE GC bug -var activeXDocument; -var NullProtoObject = function () { - try { - activeXDocument = new ActiveXObject('htmlfile'); - } catch (error) { /* ignore */ } - NullProtoObject = typeof document != 'undefined' - ? document.domain && activeXDocument - ? NullProtoObjectViaActiveX(activeXDocument) // old IE - : NullProtoObjectViaIFrame() - : NullProtoObjectViaActiveX(activeXDocument); // WSH - var length = enumBugKeys.length; - while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; - return NullProtoObject(); -}; + // match: [1] year [2] month [3] day -hiddenKeys[IE_PROTO] = true; + year = +match[1]; + month = +match[2] - 1; // JS month starts with 0 + day = +match[3]; + if (!match[4]) { + // no hour + return new Date(Date.UTC(year, month, day)); + } -// `Object.create` method -// https://tc39.es/ecma262/#sec-object.create -// eslint-disable-next-line es/no-object-create -- safe -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - EmptyConstructor[PROTOTYPE] = anObject(O); - result = new EmptyConstructor(); - EmptyConstructor[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = NullProtoObject(); - return Properties === undefined ? result : definePropertiesModule.f(result, Properties); -}; + // match: [4] hour [5] minute [6] second [7] fraction + hour = +match[4]; + minute = +match[5]; + second = +match[6]; + if (match[7]) { + fraction = match[7].slice(0, 3); + while (fraction.length < 3) { + // milli-seconds + fraction += '0'; + } + fraction = +fraction; + } -/***/ }), + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute -/***/ 219: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + if (match[9]) { + tz_hour = +match[10]; + tz_minute = +(match[11] || 0); + delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds + if (match[9] === '-') delta = -delta; + } + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + if (delta) date.setTime(date.getTime() - delta); + return date; + } + function representYamlTimestamp(object /*, style*/) { + return object.toISOString(); + } + var timestamp = new Type$8('tag:yaml.org,2002:timestamp', { + kind: 'scalar', + resolve: resolveYamlTimestamp, + construct: constructYamlTimestamp, + instanceOf: Date, + represent: representYamlTimestamp + }); -var DESCRIPTORS = __webpack_require__(7400); -var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(7137); -var definePropertyModule = __webpack_require__(1787); -var anObject = __webpack_require__(1176); -var toIndexedObject = __webpack_require__(905); -var objectKeys = __webpack_require__(5632); + var Type$7 = type; + function resolveYamlMerge(data) { + return data === '<<' || data === null; + } + var merge = new Type$7('tag:yaml.org,2002:merge', { + kind: 'scalar', + resolve: resolveYamlMerge + }); -// `Object.defineProperties` method -// https://tc39.es/ecma262/#sec-object.defineproperties -// eslint-disable-next-line es/no-object-defineproperties -- safe -exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var props = toIndexedObject(Properties); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); - return O; -}; + function commonjsRequire(path) { + throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); + } + /*eslint-disable no-bitwise*/ -/***/ }), + var NodeBuffer; + try { + // A trick for browserified version, to not include `Buffer` shim + var _require$1 = commonjsRequire; + NodeBuffer = _require$1('buffer').Buffer; + } catch (__) {} + var Type$6 = type; -/***/ 1787: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + // [ 64, 65, 66 ] -> [ padding, CR, LF ] + var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; + function resolveYamlBinary(data) { + if (data === null) return false; + var code, + idx, + bitlen = 0, + max = data.length, + map = BASE64_MAP; -var DESCRIPTORS = __webpack_require__(7400); -var IE8_DOM_DEFINE = __webpack_require__(4394); -var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(7137); -var anObject = __webpack_require__(1176); -var toPropertyKey = __webpack_require__(9310); + // Convert one by one. + for (idx = 0; idx < max; idx++) { + code = map.indexOf(data.charAt(idx)); -var $TypeError = TypeError; -// eslint-disable-next-line es/no-object-defineproperty -- safe -var $defineProperty = Object.defineProperty; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -var ENUMERABLE = 'enumerable'; -var CONFIGURABLE = 'configurable'; -var WRITABLE = 'writable'; + // Skip CR/LF + if (code > 64) continue; -// `Object.defineProperty` method -// https://tc39.es/ecma262/#sec-object.defineproperty -exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { - anObject(O); - P = toPropertyKey(P); - anObject(Attributes); - if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { - var current = $getOwnPropertyDescriptor(O, P); - if (current && current[WRITABLE]) { - O[P] = Attributes.value; - Attributes = { - configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], - enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], - writable: false - }; + // Fail on illegal characters + if (code < 0) return false; + bitlen += 6; + } + + // If there are any bits left, source was corrupted + return bitlen % 8 === 0; } - } return $defineProperty(O, P, Attributes); -} : $defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPropertyKey(P); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return $defineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; + function constructYamlBinary(data) { + var idx, + tailbits, + input = data.replace(/[\r\n=]/g, ''), + // remove CR/LF & padding to simplify scan + max = input.length, + map = BASE64_MAP, + bits = 0, + result = []; + // Collect by 6*4 bits (3 bytes) -/***/ }), + for (idx = 0; idx < max; idx++) { + if (idx % 4 === 0 && idx) { + result.push(bits >> 16 & 0xFF); + result.push(bits >> 8 & 0xFF); + result.push(bits & 0xFF); + } + bits = bits << 6 | map.indexOf(input.charAt(idx)); + } -/***/ 7933: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + // Dump tail -var DESCRIPTORS = __webpack_require__(7400); -var call = __webpack_require__(266); -var propertyIsEnumerableModule = __webpack_require__(9195); -var createPropertyDescriptor = __webpack_require__(5358); -var toIndexedObject = __webpack_require__(905); -var toPropertyKey = __webpack_require__(9310); -var hasOwn = __webpack_require__(8270); -var IE8_DOM_DEFINE = __webpack_require__(4394); - -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor -exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPropertyKey(P); - if (IE8_DOM_DEFINE) try { - return $getOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); -}; - - -/***/ }), - -/***/ 8151: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var internalObjectKeys = __webpack_require__(140); -var enumBugKeys = __webpack_require__(3837); - -var hiddenKeys = enumBugKeys.concat('length', 'prototype'); - -// `Object.getOwnPropertyNames` method -// https://tc39.es/ecma262/#sec-object.getownpropertynames -// eslint-disable-next-line es/no-object-getownpropertynames -- safe -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return internalObjectKeys(O, hiddenKeys); -}; - - -/***/ }), - -/***/ 894: -/***/ ((__unused_webpack_module, exports) => { - -// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe -exports.f = Object.getOwnPropertySymbols; - - -/***/ }), - -/***/ 1321: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(5968); - -module.exports = uncurryThis({}.isPrototypeOf); - - -/***/ }), - -/***/ 140: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(5968); -var hasOwn = __webpack_require__(8270); -var toIndexedObject = __webpack_require__(905); -var indexOf = (__webpack_require__(9540).indexOf); -var hiddenKeys = __webpack_require__(5977); - -var push = uncurryThis([].push); - -module.exports = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); - // Don't enum bug & hidden keys - while (names.length > i) if (hasOwn(O, key = names[i++])) { - ~indexOf(result, key) || push(result, key); - } - return result; -}; + tailbits = max % 4 * 6; + if (tailbits === 0) { + result.push(bits >> 16 & 0xFF); + result.push(bits >> 8 & 0xFF); + result.push(bits & 0xFF); + } else if (tailbits === 18) { + result.push(bits >> 10 & 0xFF); + result.push(bits >> 2 & 0xFF); + } else if (tailbits === 12) { + result.push(bits >> 4 & 0xFF); + } + // Wrap into Buffer for NodeJS and leave Array for browser + if (NodeBuffer) { + // Support node 6.+ Buffer API when available + return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); + } + return result; + } + function representYamlBinary(object /*, style*/) { + var result = '', + bits = 0, + idx, + tail, + max = object.length, + map = BASE64_MAP; -/***/ }), + // Convert every three bytes to 4 ASCII characters. -/***/ 5632: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + for (idx = 0; idx < max; idx++) { + if (idx % 3 === 0 && idx) { + result += map[bits >> 18 & 0x3F]; + result += map[bits >> 12 & 0x3F]; + result += map[bits >> 6 & 0x3F]; + result += map[bits & 0x3F]; + } + bits = (bits << 8) + object[idx]; + } -var internalObjectKeys = __webpack_require__(140); -var enumBugKeys = __webpack_require__(3837); + // Dump tail -// `Object.keys` method -// https://tc39.es/ecma262/#sec-object.keys -// eslint-disable-next-line es/no-object-keys -- safe -module.exports = Object.keys || function keys(O) { - return internalObjectKeys(O, enumBugKeys); -}; + tail = max % 3; + if (tail === 0) { + result += map[bits >> 18 & 0x3F]; + result += map[bits >> 12 & 0x3F]; + result += map[bits >> 6 & 0x3F]; + result += map[bits & 0x3F]; + } else if (tail === 2) { + result += map[bits >> 10 & 0x3F]; + result += map[bits >> 4 & 0x3F]; + result += map[bits << 2 & 0x3F]; + result += map[64]; + } else if (tail === 1) { + result += map[bits >> 2 & 0x3F]; + result += map[bits << 4 & 0x3F]; + result += map[64]; + result += map[64]; + } + return result; + } + function isBinary(object) { + return NodeBuffer && NodeBuffer.isBuffer(object); + } + var binary = new Type$6('tag:yaml.org,2002:binary', { + kind: 'scalar', + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary + }); + var Type$5 = type; + var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; + var _toString$2 = Object.prototype.toString; + function resolveYamlOmap(data) { + if (data === null) return true; + var objectKeys = [], + index, + length, + pair, + pairKey, + pairHasKey, + object = data; + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + pairHasKey = false; + if (_toString$2.call(pair) !== '[object Object]') return false; + for (pairKey in pair) { + if (_hasOwnProperty$3.call(pair, pairKey)) { + if (!pairHasKey) pairHasKey = true;else return false; + } + } + if (!pairHasKey) return false; + if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false; + } + return true; + } + function constructYamlOmap(data) { + return data !== null ? data : []; + } + var omap = new Type$5('tag:yaml.org,2002:omap', { + kind: 'sequence', + resolve: resolveYamlOmap, + construct: constructYamlOmap + }); -/***/ }), + var Type$4 = type; + var _toString$1 = Object.prototype.toString; + function resolveYamlPairs(data) { + if (data === null) return true; + var index, + length, + pair, + keys, + result, + object = data; + result = new Array(object.length); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + if (_toString$1.call(pair) !== '[object Object]') return false; + keys = Object.keys(pair); + if (keys.length !== 1) return false; + result[index] = [keys[0], pair[keys[0]]]; + } + return true; + } + function constructYamlPairs(data) { + if (data === null) return []; + var index, + length, + pair, + keys, + result, + object = data; + result = new Array(object.length); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + keys = Object.keys(pair); + result[index] = [keys[0], pair[keys[0]]]; + } + return result; + } + var pairs = new Type$4('tag:yaml.org,2002:pairs', { + kind: 'sequence', + resolve: resolveYamlPairs, + construct: constructYamlPairs + }); -/***/ 9195: -/***/ ((__unused_webpack_module, exports) => { + var Type$3 = type; + var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; + function resolveYamlSet(data) { + if (data === null) return true; + var key, + object = data; + for (key in object) { + if (_hasOwnProperty$2.call(object, key)) { + if (object[key] !== null) return false; + } + } + return true; + } + function constructYamlSet(data) { + return data !== null ? data : {}; + } + var set = new Type$3('tag:yaml.org,2002:set', { + kind: 'mapping', + resolve: resolveYamlSet, + construct: constructYamlSet + }); -"use strict"; + var Schema$1 = schema; + var default_safe = new Schema$1({ + include: [core], + implicit: [timestamp, merge], + explicit: [binary, omap, pairs, set] + }); -var $propertyIsEnumerable = {}.propertyIsEnumerable; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + var Type$2 = type; + function resolveJavascriptUndefined() { + return true; + } + function constructJavascriptUndefined() { + /*eslint-disable no-undefined*/ + return undefined; + } + function representJavascriptUndefined() { + return ''; + } + function isUndefined(object) { + return typeof object === 'undefined'; + } + var _undefined = new Type$2('tag:yaml.org,2002:js/undefined', { + kind: 'scalar', + resolve: resolveJavascriptUndefined, + construct: constructJavascriptUndefined, + predicate: isUndefined, + represent: representJavascriptUndefined + }); -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + var Type$1 = type; + function resolveJavascriptRegExp(data) { + if (data === null) return false; + if (data.length === 0) return false; + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable -exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : $propertyIsEnumerable; + // if regexp starts with '/' it can have modifiers and must be properly closed + // `/foo/gim` - modifiers tail can be maximum 3 chars + if (regexp[0] === '/') { + if (tail) modifiers = tail[1]; + if (modifiers.length > 3) return false; + // if expression starts with /, is should be properly terminated + if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; + } + return true; + } + function constructJavascriptRegExp(data) { + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + // `/foo/gim` - tail can be maximum 4 chars + if (regexp[0] === '/') { + if (tail) modifiers = tail[1]; + regexp = regexp.slice(1, regexp.length - modifiers.length - 1); + } + return new RegExp(regexp, modifiers); + } + function representJavascriptRegExp(object /*, style*/) { + var result = '/' + object.source + '/'; + if (object.global) result += 'g'; + if (object.multiline) result += 'm'; + if (object.ignoreCase) result += 'i'; + return result; + } + function isRegExp(object) { + return Object.prototype.toString.call(object) === '[object RegExp]'; + } + var regexp = new Type$1('tag:yaml.org,2002:js/regexp', { + kind: 'scalar', + resolve: resolveJavascriptRegExp, + construct: constructJavascriptRegExp, + predicate: isRegExp, + represent: representJavascriptRegExp + }); -/***/ }), + var esprima; -/***/ 6540: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // Browserified version does not have esprima + // + // 1. For node.js just require module as deps + // 2. For browser try to require mudule via external AMD system. + // If not found - try to fallback to window.esprima. If not + // found too - then fail to parse. + // + try { + // workaround to exclude package from browserify list. + var _require = commonjsRequire; + esprima = _require('esprima'); + } catch (_) { + /* eslint-disable no-redeclare */ + /* global window */ + if (typeof window !== 'undefined') esprima = window.esprima; + } + var Type = type; + function resolveJavascriptFunction(data) { + if (data === null) return false; + try { + var source = '(' + data + ')', + ast = esprima.parse(source, { + range: true + }); + if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { + return false; + } + return true; + } catch (err) { + return false; + } + } + function constructJavascriptFunction(data) { + /*jslint evil:true*/ -/* eslint-disable no-proto -- safe */ -var uncurryThisAccessor = __webpack_require__(3411); -var anObject = __webpack_require__(1176); -var aPossiblePrototype = __webpack_require__(8505); + var source = '(' + data + ')', + ast = esprima.parse(source, { + range: true + }), + params = [], + body; + if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { + throw new Error('Failed to resolve function'); + } + ast.body[0].expression.params.forEach(function (param) { + params.push(param.name); + }); + body = ast.body[0].expression.body.range; -// `Object.setPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.setprototypeof -// Works with __proto__ only. Old v8 can't work with null proto objects. -// eslint-disable-next-line es/no-object-setprototypeof -- safe -module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); - setter(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter(O, proto); - else O.__proto__ = proto; - return O; - }; -}() : undefined); + // Esprima's ranges include the first '{' and the last '}' characters on + // function expressions. So cut them out. + if (ast.body[0].expression.body.type === 'BlockStatement') { + /*eslint-disable no-new-func*/ + return new Function(params, source.slice(body[0] + 1, body[1] - 1)); + } + // ES6 arrow functions can omit the BlockStatement. In that case, just return + // the body. + /*eslint-disable no-new-func*/ + return new Function(params, 'return ' + source.slice(body[0], body[1])); + } + function representJavascriptFunction(object /*, style*/) { + return object.toString(); + } + function isFunction(object) { + return Object.prototype.toString.call(object) === '[object Function]'; + } + var _function = new Type('tag:yaml.org,2002:js/function', { + kind: 'scalar', + resolve: resolveJavascriptFunction, + construct: constructJavascriptFunction, + predicate: isFunction, + represent: representJavascriptFunction + }); + var Schema = schema; + var default_full = Schema.DEFAULT = new Schema({ + include: [default_safe], + explicit: [_undefined, regexp, _function] + }); -/***/ }), + /*eslint-disable max-len,no-use-before-define*/ -/***/ 2914: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + var common$1 = common$6; + var YAMLException$1 = exception; + var Mark = mark; + var DEFAULT_SAFE_SCHEMA$1 = default_safe; + var DEFAULT_FULL_SCHEMA$1 = default_full; + var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; + var CONTEXT_FLOW_IN = 1; + var CONTEXT_FLOW_OUT = 2; + var CONTEXT_BLOCK_IN = 3; + var CONTEXT_BLOCK_OUT = 4; + var CHOMPING_CLIP = 1; + var CHOMPING_STRIP = 2; + var CHOMPING_KEEP = 3; + var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; + var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; + var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; + var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; + var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; + function _class(obj) { + return Object.prototype.toString.call(obj); + } + function is_EOL(c) { + return c === 0x0A /* LF */ || c === 0x0D /* CR */; + } -var call = __webpack_require__(266); -var isCallable = __webpack_require__(6733); -var isObject = __webpack_require__(5052); + function is_WHITE_SPACE(c) { + return c === 0x09 /* Tab */ || c === 0x20 /* Space */; + } -var $TypeError = TypeError; + function is_WS_OR_EOL(c) { + return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */; + } -// `OrdinaryToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-ordinarytoprimitive -module.exports = function (input, pref) { - var fn, val; - if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; - if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - throw $TypeError("Can't convert object to primitive value"); -}; + function is_FLOW_INDICATOR(c) { + return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */; + } + function fromHexCode(c) { + var lc; + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { + return c - 0x30; + } -/***/ }), + /*eslint-disable no-bitwise*/ + lc = c | 0x20; + if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) { + return lc - 0x61 + 10; + } + return -1; + } + function escapedHexLen(c) { + if (c === 0x78 /* x */) { + return 2; + } + if (c === 0x75 /* u */) { + return 4; + } + if (c === 0x55 /* U */) { + return 8; + } + return 0; + } + function fromDecimalCode(c) { + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { + return c - 0x30; + } + return -1; + } + function simpleEscapeSequence(c) { + /* eslint-disable indent */ + return c === 0x30 /* 0 */ ? '\x00' : c === 0x61 /* a */ ? '\x07' : c === 0x62 /* b */ ? '\x08' : c === 0x74 /* t */ ? '\x09' : c === 0x09 /* Tab */ ? '\x09' : c === 0x6E /* n */ ? '\x0A' : c === 0x76 /* v */ ? '\x0B' : c === 0x66 /* f */ ? '\x0C' : c === 0x72 /* r */ ? '\x0D' : c === 0x65 /* e */ ? '\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* " */ ? '\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \ */ ? '\x5C' : c === 0x4E /* N */ ? '\x85' : c === 0x5F /* _ */ ? '\xA0' : c === 0x4C /* L */ ? "\u2028" : c === 0x50 /* P */ ? "\u2029" : ''; + } + function charFromCodepoint(c) { + if (c <= 0xFFFF) { + return String.fromCharCode(c); + } + // Encode UTF-16 surrogate pair + // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF + return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00); + } + var simpleEscapeCheck = new Array(256); // integer, for fast access + var simpleEscapeMap = new Array(256); + for (var i = 0; i < 256; i++) { + simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; + simpleEscapeMap[i] = simpleEscapeSequence(i); + } + function State$1(input, options) { + this.input = input; + this.filename = options['filename'] || null; + this.schema = options['schema'] || DEFAULT_FULL_SCHEMA$1; + this.onWarning = options['onWarning'] || null; + this.legacy = options['legacy'] || false; + this.json = options['json'] || false; + this.listener = options['listener'] || null; + this.implicitTypes = this.schema.compiledImplicit; + this.typeMap = this.schema.compiledTypeMap; + this.length = input.length; + this.position = 0; + this.line = 0; + this.lineStart = 0; + this.lineIndent = 0; + this.documents = []; -/***/ 4826: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ + } -var getBuiltIn = __webpack_require__(1333); -var uncurryThis = __webpack_require__(5968); -var getOwnPropertyNamesModule = __webpack_require__(8151); -var getOwnPropertySymbolsModule = __webpack_require__(894); -var anObject = __webpack_require__(1176); - -var concat = uncurryThis([].concat); - -// all object keys, includes non-enumerable and symbols -module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { - var keys = getOwnPropertyNamesModule.f(anObject(it)); - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; -}; - - -/***/ }), - -/***/ 6060: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var defineProperty = (__webpack_require__(1787).f); - -module.exports = function (Target, Source, key) { - key in Target || defineProperty(Target, key, { - configurable: true, - get: function () { return Source[key]; }, - set: function (it) { Source[key] = it; } - }); -}; - - -/***/ }), - -/***/ 8885: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isNullOrUndefined = __webpack_require__(9650); - -var $TypeError = TypeError; - -// `RequireObjectCoercible` abstract operation -// https://tc39.es/ecma262/#sec-requireobjectcoercible -module.exports = function (it) { - if (isNullOrUndefined(it)) throw $TypeError("Can't call method on " + it); - return it; -}; - - -/***/ }), - -/***/ 4399: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var shared = __webpack_require__(3036); -var uid = __webpack_require__(1441); - -var keys = shared('keys'); - -module.exports = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; - - -/***/ }), - -/***/ 5353: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(9859); -var defineGlobalProperty = __webpack_require__(8400); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || defineGlobalProperty(SHARED, {}); - -module.exports = store; - - -/***/ }), - -/***/ 3036: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var IS_PURE = __webpack_require__(4231); -var store = __webpack_require__(5353); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.30.2', - mode: IS_PURE ? 'pure' : 'global', - copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)', - license: 'https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE', - source: 'https://github.com/zloirock/core-js' -}); - - -/***/ }), - -/***/ 4860: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* eslint-disable es/no-symbol -- required for testing */ -var V8_VERSION = __webpack_require__(6358); -var fails = __webpack_require__(4229); -var global = __webpack_require__(9859); - -var $String = global.String; - -// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing -module.exports = !!Object.getOwnPropertySymbols && !fails(function () { - var symbol = Symbol(); - // Chrome 38 Symbol has incorrect toString conversion - // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances - // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, - // of course, fail. - return !$String(symbol) || !(Object(symbol) instanceof Symbol) || - // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances - !Symbol.sham && V8_VERSION && V8_VERSION < 41; -}); - - -/***/ }), - -/***/ 3231: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toIntegerOrInfinity = __webpack_require__(3329); - -var max = Math.max; -var min = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). -module.exports = function (index, length) { - var integer = toIntegerOrInfinity(index); - return integer < 0 ? max(integer + length, 0) : min(integer, length); -}; - - -/***/ }), - -/***/ 905: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -// toObject with fallback for non-array-like ES3 strings -var IndexedObject = __webpack_require__(9337); -var requireObjectCoercible = __webpack_require__(8885); - -module.exports = function (it) { - return IndexedObject(requireObjectCoercible(it)); -}; - - -/***/ }), - -/***/ 3329: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var trunc = __webpack_require__(917); - -// `ToIntegerOrInfinity` abstract operation -// https://tc39.es/ecma262/#sec-tointegerorinfinity -module.exports = function (argument) { - var number = +argument; - // eslint-disable-next-line no-self-compare -- NaN check - return number !== number || number === 0 ? 0 : trunc(number); -}; - - -/***/ }), - -/***/ 4237: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toIntegerOrInfinity = __webpack_require__(3329); - -var min = Math.min; - -// `ToLength` abstract operation -// https://tc39.es/ecma262/#sec-tolength -module.exports = function (argument) { - return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; - - -/***/ }), - -/***/ 2991: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var requireObjectCoercible = __webpack_require__(8885); - -var $Object = Object; - -// `ToObject` abstract operation -// https://tc39.es/ecma262/#sec-toobject -module.exports = function (argument) { - return $Object(requireObjectCoercible(argument)); -}; - - -/***/ }), + function generateError(state, message) { + return new YAMLException$1(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); + } + function throwError(state, message) { + throw generateError(state, message); + } + function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); + } + } + var directiveHandlers = { + YAML: function handleYamlDirective(state, name, args) { + var match, major, minor; + if (state.version !== null) { + throwError(state, 'duplication of %YAML directive'); + } + if (args.length !== 1) { + throwError(state, 'YAML directive accepts exactly one argument'); + } + match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); + if (match === null) { + throwError(state, 'ill-formed argument of the YAML directive'); + } + major = parseInt(match[1], 10); + minor = parseInt(match[2], 10); + if (major !== 1) { + throwError(state, 'unacceptable YAML version of the document'); + } + state.version = args[0]; + state.checkLineBreaks = minor < 2; + if (minor !== 1 && minor !== 2) { + throwWarning(state, 'unsupported YAML version of the document'); + } + }, + TAG: function handleTagDirective(state, name, args) { + var handle, prefix; + if (args.length !== 2) { + throwError(state, 'TAG directive accepts exactly two arguments'); + } + handle = args[0]; + prefix = args[1]; + if (!PATTERN_TAG_HANDLE.test(handle)) { + throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); + } + if (_hasOwnProperty$1.call(state.tagMap, handle)) { + throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + } + if (!PATTERN_TAG_URI.test(prefix)) { + throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); + } + state.tagMap[handle] = prefix; + } + }; + function captureSegment(state, start, end, checkJson) { + var _position, _length, _character, _result; + if (start < end) { + _result = state.input.slice(start, end); + if (checkJson) { + for (_position = 0, _length = _result.length; _position < _length; _position += 1) { + _character = _result.charCodeAt(_position); + if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) { + throwError(state, 'expected valid JSON character'); + } + } + } else if (PATTERN_NON_PRINTABLE.test(_result)) { + throwError(state, 'the stream contains non-printable characters'); + } + state.result += _result; + } + } + function mergeMappings(state, destination, source, overridableKeys) { + var sourceKeys, key, index, quantity; + if (!common$1.isObject(source)) { + throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); + } + sourceKeys = Object.keys(source); + for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { + key = sourceKeys[index]; + if (!_hasOwnProperty$1.call(destination, key)) { + destination[key] = source[key]; + overridableKeys[key] = true; + } + } + } + function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { + var index, quantity; -/***/ 2066: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // The output is a plain object here, so keys can only be strings. + // We need to convert keyNode to a string, but doing so can hang the process + // (deeply nested arrays that explode exponentially using aliases). + if (Array.isArray(keyNode)) { + keyNode = Array.prototype.slice.call(keyNode); + for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { + if (Array.isArray(keyNode[index])) { + throwError(state, 'nested arrays are not supported inside keys'); + } + if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { + keyNode[index] = '[object Object]'; + } + } + } -var call = __webpack_require__(266); -var isObject = __webpack_require__(5052); -var isSymbol = __webpack_require__(9395); -var getMethod = __webpack_require__(5300); -var ordinaryToPrimitive = __webpack_require__(2914); -var wellKnownSymbol = __webpack_require__(95); + // Avoid code execution in load() via toString property + // (still use its own toString for arrays, timestamps, + // and whatever user schema extensions happen to have @@toStringTag) + if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { + keyNode = '[object Object]'; + } + keyNode = String(keyNode); + if (_result === null) { + _result = {}; + } + if (keyTag === 'tag:yaml.org,2002:merge') { + if (Array.isArray(valueNode)) { + for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { + mergeMappings(state, _result, valueNode[index], overridableKeys); + } + } else { + mergeMappings(state, _result, valueNode, overridableKeys); + } + } else { + if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) { + state.line = startLine || state.line; + state.position = startPos || state.position; + throwError(state, 'duplicated mapping key'); + } + _result[keyNode] = valueNode; + delete overridableKeys[keyNode]; + } + return _result; + } + function readLineBreak(state) { + var ch; + ch = state.input.charCodeAt(state.position); + if (ch === 0x0A /* LF */) { + state.position++; + } else if (ch === 0x0D /* CR */) { + state.position++; + if (state.input.charCodeAt(state.position) === 0x0A /* LF */) { + state.position++; + } + } else { + throwError(state, 'a line break is expected'); + } + state.line += 1; + state.lineStart = state.position; + } + function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, + ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (allowComments && ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0); + } + if (is_EOL(ch)) { + readLineBreak(state); + ch = state.input.charCodeAt(state.position); + lineBreaks++; + state.lineIndent = 0; + while (ch === 0x20 /* Space */) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + } else { + break; + } + } + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, 'deficient indentation'); + } + return lineBreaks; + } + function testDocumentSeparator(state) { + var _position = state.position, + ch; + ch = state.input.charCodeAt(_position); -var $TypeError = TypeError; -var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { + _position += 3; + ch = state.input.charCodeAt(_position); + if (ch === 0 || is_WS_OR_EOL(ch)) { + return true; + } + } + return false; + } + function writeFoldedLines(state, count) { + if (count === 1) { + state.result += ' '; + } else if (count > 1) { + state.result += common$1.repeat('\n', count - 1); + } + } + function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, + following, + captureStart, + captureEnd, + hasPendingContent, + _line, + _lineStart, + _lineIndent, + _kind = state.kind, + _result = state.result, + ch; + ch = state.input.charCodeAt(state.position); + if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* " */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) { + return false; + } + if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + return false; + } + } + state.kind = 'scalar'; + state.result = ''; + captureStart = captureEnd = state.position; + hasPendingContent = false; + while (ch !== 0) { + if (ch === 0x3A /* : */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + } else if (ch === 0x23 /* # */) { + preceding = state.input.charCodeAt(state.position - 1); + if (is_WS_OR_EOL(preceding)) { + break; + } + } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { + break; + } else if (is_EOL(ch)) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + if (state.lineIndent >= nodeIndent) { + hasPendingContent = true; + ch = state.input.charCodeAt(state.position); + continue; + } else { + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; + break; + } + } + if (hasPendingContent) { + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; + hasPendingContent = false; + } + if (!is_WHITE_SPACE(ch)) { + captureEnd = state.position + 1; + } + ch = state.input.charCodeAt(++state.position); + } + captureSegment(state, captureStart, captureEnd, false); + if (state.result) { + return true; + } + state.kind = _kind; + state.result = _result; + return false; + } + function readSingleQuotedScalar(state, nodeIndent) { + var ch, captureStart, captureEnd; + ch = state.input.charCodeAt(state.position); + if (ch !== 0x27 /* ' */) { + return false; + } + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x27 /* ' */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (ch === 0x27 /* ' */) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a single quoted scalar'); + } else { + state.position++; + captureEnd = state.position; + } + } + throwError(state, 'unexpected end of the stream within a single quoted scalar'); + } + function readDoubleQuotedScalar(state, nodeIndent) { + var captureStart, captureEnd, hexLength, hexResult, tmp, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 0x22 /* " */) { + return false; + } + state.kind = 'scalar'; + state.result = ''; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 0x22 /* " */) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + } else if (ch === 0x5C /* \ */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); -// `ToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-toprimitive -module.exports = function (input, pref) { - if (!isObject(input) || isSymbol(input)) return input; - var exoticToPrim = getMethod(input, TO_PRIMITIVE); - var result; - if (exoticToPrim) { - if (pref === undefined) pref = 'default'; - result = call(exoticToPrim, input, pref); - if (!isObject(result) || isSymbol(result)) return result; - throw $TypeError("Can't convert object to primitive value"); - } - if (pref === undefined) pref = 'number'; - return ordinaryToPrimitive(input, pref); -}; - - -/***/ }), - -/***/ 9310: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toPrimitive = __webpack_require__(2066); -var isSymbol = __webpack_require__(9395); - -// `ToPropertyKey` abstract operation -// https://tc39.es/ecma262/#sec-topropertykey -module.exports = function (argument) { - var key = toPrimitive(argument, 'string'); - return isSymbol(key) ? key : key + ''; -}; - - -/***/ }), - -/***/ 1601: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var wellKnownSymbol = __webpack_require__(95); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var test = {}; - -test[TO_STRING_TAG] = 'z'; - -module.exports = String(test) === '[object z]'; - - -/***/ }), - -/***/ 3326: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var classof = __webpack_require__(1589); - -var $String = String; - -module.exports = function (argument) { - if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); - return $String(argument); -}; - - -/***/ }), - -/***/ 9821: -/***/ ((module) => { - -var $String = String; - -module.exports = function (argument) { - try { - return $String(argument); - } catch (error) { - return 'Object'; - } -}; - - -/***/ }), + // TODO: rework to inline fn with no type cast? + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + } else { + throwError(state, 'expected hexadecimal character'); + } + } + state.result += charFromCodepoint(hexResult); + state.position++; + } else { + throwError(state, 'unknown escape sequence'); + } + captureStart = captureEnd = state.position; + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, 'unexpected end of the document within a double quoted scalar'); + } else { + state.position++; + captureEnd = state.position; + } + } + throwError(state, 'unexpected end of the stream within a double quoted scalar'); + } + function readFlowCollection(state, nodeIndent) { + var readNext = true, + _line, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = {}, + keyNode, + keyTag, + valueNode, + ch; + ch = state.input.charCodeAt(state.position); + if (ch === 0x5B /* [ */) { + terminator = 0x5D; /* ] */ + isMapping = false; + _result = []; + } else if (ch === 0x7B /* { */) { + terminator = 0x7D; /* } */ + isMapping = true; + _result = {}; + } else { + return false; + } + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(++state.position); + while (ch !== 0) { + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if (ch === terminator) { + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? 'mapping' : 'sequence'; + state.result = _result; + return true; + } else if (!readNext) { + throwError(state, 'missed comma between flow collection entries'); + } + keyTag = keyNode = valueNode = null; + isPair = isExplicitPair = false; + if (ch === 0x3F /* ? */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); + } + } + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } + if (isMapping) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); + } else { + _result.push(keyNode); + } + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if (ch === 0x2C /* , */) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { + readNext = false; + } + } + throwError(state, 'unexpected end of the stream within a flow collection'); + } + function readBlockScalar(state, nodeIndent) { + var captureStart, + folding, + chomping = CHOMPING_CLIP, + didReadContent = false, + detectedIndent = false, + textIndent = nodeIndent, + emptyLines = 0, + atMoreIndented = false, + tmp, + ch; + ch = state.input.charCodeAt(state.position); + if (ch === 0x7C /* | */) { + folding = false; + } else if (ch === 0x3E /* > */) { + folding = true; + } else { + return false; + } + state.kind = 'scalar'; + state.result = ''; + while (ch !== 0) { + ch = state.input.charCodeAt(++state.position); + if (ch === 0x2B /* + */ || ch === 0x2D /* - */) { + if (CHOMPING_CLIP === chomping) { + chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, 'repeat of a chomping mode identifier'); + } + } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (tmp === 0) { + throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); + } else if (!detectedIndent) { + textIndent = nodeIndent + tmp - 1; + detectedIndent = true; + } else { + throwError(state, 'repeat of an indentation width identifier'); + } + } else { + break; + } + } + if (is_WHITE_SPACE(ch)) { + do { + ch = state.input.charCodeAt(++state.position); + } while (is_WHITE_SPACE(ch)); + if (ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (!is_EOL(ch) && ch !== 0); + } + } + while (ch !== 0) { + readLineBreak(state); + state.lineIndent = 0; + ch = state.input.charCodeAt(state.position); + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; + } + if (is_EOL(ch)) { + emptyLines++; + continue; + } -/***/ 1441: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // End of the scalar. + if (state.lineIndent < textIndent) { + // Perform the chomping. + if (chomping === CHOMPING_KEEP) { + state.result += common$1.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } else if (chomping === CHOMPING_CLIP) { + if (didReadContent) { + // i.e. only if the scalar is not empty. + state.result += '\n'; + } + } -var uncurryThis = __webpack_require__(5968); + // Break this `while` cycle and go to the funciton's epilogue. + break; + } -var id = 0; -var postfix = Math.random(); -var toString = uncurryThis(1.0.toString); + // Folded style: use fancy rules to handle line breaks. + if (folding) { + // Lines starting with white space characters (more-indented lines) are not folded. + if (is_WHITE_SPACE(ch)) { + atMoreIndented = true; + // except for the first content line (cf. Example 8.1) + state.result += common$1.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); -module.exports = function (key) { - return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); -}; + // End of more-indented block. + } else if (atMoreIndented) { + atMoreIndented = false; + state.result += common$1.repeat('\n', emptyLines + 1); + // Just one line break - perceive as the same line. + } else if (emptyLines === 0) { + if (didReadContent) { + // i.e. only if we have already read some scalar content. + state.result += ' '; + } -/***/ }), + // Several line breaks - perceive as different lines. + } else { + state.result += common$1.repeat('\n', emptyLines); + } -/***/ 6969: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // Literal style: just add exact number of line breaks between content lines. + } else { + // Keep all line breaks except the header line break. + state.result += common$1.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + } + didReadContent = true; + detectedIndent = true; + emptyLines = 0; + captureStart = state.position; + while (!is_EOL(ch) && ch !== 0) { + ch = state.input.charCodeAt(++state.position); + } + captureSegment(state, captureStart, state.position, false); + } + return true; + } + function readBlockSequence(state, nodeIndent) { + var _line, + _tag = state.tag, + _anchor = state.anchor, + _result = [], + following, + detected = false, + ch; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + if (ch !== 0x2D /* - */) { + break; + } + following = state.input.charCodeAt(state.position + 1); + if (!is_WS_OR_EOL(following)) { + break; + } + detected = true; + state.position++; + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { + _result.push(null); + ch = state.input.charCodeAt(state.position); + continue; + } + } + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { + throwError(state, 'bad indentation of a sequence entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'sequence'; + state.result = _result; + return true; + } + return false; + } + function readBlockMapping(state, nodeIndent, flowIndent) { + var following, + allowCompact, + _line, + _pos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = {}, + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + following = state.input.charCodeAt(state.position + 1); + _line = state.line; // Save the current line. + _pos = state.position; -/* eslint-disable es/no-symbol -- required for testing */ -var NATIVE_SYMBOL = __webpack_require__(4860); + // + // Explicit notation case. There are two separate blocks: + // first for the key (denoted by "?") and second for the value (denoted by ":") + // + if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) { + if (ch === 0x3F /* ? */) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = true; + allowCompact = true; + } else if (atExplicitKey) { + // i.e. 0x3A/* : */ === character after the explicit key. + atExplicitKey = false; + allowCompact = true; + } else { + throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); + } + state.position += 1; + ch = following; -module.exports = NATIVE_SYMBOL - && !Symbol.sham - && typeof Symbol.iterator == 'symbol'; + // + // Implicit notation case. Flow-style node as the key first, then ":", and the value. + // + } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (ch === 0x3A /* : */) { + ch = state.input.charCodeAt(++state.position); + if (!is_WS_OR_EOL(ch)) { + throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); + } + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + } else if (detected) { + throwError(state, 'can not read an implicit mapping pair; a colon is missed'); + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + } else if (detected) { + throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; // Keep the result of `composeNode`. + } + } else { + break; // Reading is done. Go to the epilogue. + } + // + // Common reading code for both explicit and implicit notations. + // + if (state.line === _line || state.lineIndent > nodeIndent) { + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (atExplicitKey) { + keyNode = state.result; + } else { + valueNode = state.result; + } + } + if (!atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); + keyTag = keyNode = valueNode = null; + } + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + if (state.lineIndent > nodeIndent && ch !== 0) { + throwError(state, 'bad indentation of a mapping entry'); + } else if (state.lineIndent < nodeIndent) { + break; + } + } -/***/ }), + // + // Epilogue. + // -/***/ 7137: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // Special case: last mapping's node contains only the key in explicit notation. + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + } -var DESCRIPTORS = __webpack_require__(7400); -var fails = __webpack_require__(4229); + // Expose the resulting mapping. + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = 'mapping'; + state.result = _result; + } + return detected; + } + function readTagProperty(state) { + var _position, + isVerbatim = false, + isNamed = false, + tagHandle, + tagName, + ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 0x21 /* ! */) return false; + if (state.tag !== null) { + throwError(state, 'duplication of a tag property'); + } + ch = state.input.charCodeAt(++state.position); + if (ch === 0x3C /* < */) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + } else if (ch === 0x21 /* ! */) { + isNamed = true; + tagHandle = '!!'; + ch = state.input.charCodeAt(++state.position); + } else { + tagHandle = '!'; + } + _position = state.position; + if (isVerbatim) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && ch !== 0x3E /* > */); -// V8 ~ Chrome 36- -// https://bugs.chromium.org/p/v8/issues/detail?id=3334 -module.exports = DESCRIPTORS && fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- required for testing - return Object.defineProperty(function () { /* empty */ }, 'prototype', { - value: 42, - writable: false - }).prototype != 42; -}); - - -/***/ }), + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); + } else { + throwError(state, 'unexpected end of the stream within a verbatim tag'); + } + } else { + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + if (ch === 0x21 /* ! */) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, 'named tag handle cannot contain such characters'); + } + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, 'tag suffix cannot contain exclamation marks'); + } + } + ch = state.input.charCodeAt(++state.position); + } + tagName = state.input.slice(_position, state.position); + if (PATTERN_FLOW_INDICATORS.test(tagName)) { + throwError(state, 'tag suffix cannot contain flow indicator characters'); + } + } + if (tagName && !PATTERN_TAG_URI.test(tagName)) { + throwError(state, 'tag name cannot contain such characters: ' + tagName); + } + if (isVerbatim) { + state.tag = tagName; + } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; + } else if (tagHandle === '!') { + state.tag = '!' + tagName; + } else if (tagHandle === '!!') { + state.tag = 'tag:yaml.org,2002:' + tagName; + } else { + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); + } + return true; + } + function readAnchorProperty(state) { + var _position, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 0x26 /* & */) return false; + if (state.anchor !== null) { + throwError(state, 'duplication of an anchor property'); + } + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (state.position === _position) { + throwError(state, 'name of an anchor node must contain at least one character'); + } + state.anchor = state.input.slice(_position, state.position); + return true; + } + function readAlias(state) { + var _position, alias, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 0x2A /* * */) return false; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (state.position === _position) { + throwError(state, 'name of an alias node must contain at least one character'); + } + alias = state.input.slice(_position, state.position); + if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { + throwError(state, 'unidentified alias "' + alias + '"'); + } + state.result = state.anchorMap[alias]; + skipSeparationSpace(state, true, -1); + return true; + } + function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { + var allowBlockStyles, + allowBlockScalars, + allowBlockCollections, + indentStatus = 1, + // 1: this>parent, 0: this=parent, -1: this parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } + } + if (indentStatus === 1) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + allowBlockCollections = allowBlockStyles; + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } else { + allowBlockCollections = false; + } + } + } + if (allowBlockCollections) { + allowBlockCollections = atNewLine || allowCompact; + } + if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { + if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { + flowIndent = parentIndent; + } else { + flowIndent = parentIndent + 1; + } + blockIndent = state.position - state.lineStart; + if (indentStatus === 1) { + if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { + hasContent = true; + } else { + if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { + hasContent = true; + } else if (readAlias(state)) { + hasContent = true; + if (state.tag !== null || state.anchor !== null) { + throwError(state, 'alias node should not have any properties'); + } + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + hasContent = true; + if (state.tag === null) { + state.tag = '?'; + } + } + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else if (indentStatus === 0) { + // Special case: block sequences are allowed to have same indentation level as the parent. + // http://www.yaml.org/spec/1.2/spec.html#id2799784 + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); + } + } + if (state.tag !== null && state.tag !== '!') { + if (state.tag === '?') { + // Implicit resolving is not allowed for non-scalar types, and '?' + // non-specific tag is only automatically assigned to plain scalars. + // + // We only need to check kind conformity in case user explicitly assigns '?' + // tag, for example like this: "! [0]" + // + if (state.result !== null && state.kind !== 'scalar') { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); + } + for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { + type = state.implicitTypes[typeIndex]; + if (type.resolve(state.result)) { + // `state.result` updated in resolver if matched + state.result = type.construct(state.result); + state.tag = type.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + break; + } + } + } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) { + type = state.typeMap[state.kind || 'fallback'][state.tag]; + if (state.result !== null && type.kind !== state.kind) { + throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); + } + if (!type.resolve(state.result)) { + // `state.result` updated in resolver if matched + throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); + } else { + state.result = type.construct(state.result); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else { + throwError(state, 'unknown tag !<' + state.tag + '>'); + } + } + if (state.listener !== null) { + state.listener('close', state); + } + return state.tag !== null || state.anchor !== null || hasContent; + } + function readDocument(state) { + var documentStart = state.position, + _position, + directiveName, + directiveArgs, + hasDirectives = false, + ch; + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = {}; + state.anchorMap = {}; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if (state.lineIndent > 0 || ch !== 0x25 /* % */) { + break; + } + hasDirectives = true; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + directiveName = state.input.slice(_position, state.position); + directiveArgs = []; + if (directiveName.length < 1) { + throwError(state, 'directive name must not be less than one character in length'); + } + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && !is_EOL(ch)); + break; + } + if (is_EOL(ch)) break; + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + directiveArgs.push(state.input.slice(_position, state.position)); + } + if (ch !== 0) readLineBreak(state); + if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { + directiveHandlers[directiveName](state, directiveName, directiveArgs); + } else { + throwWarning(state, 'unknown document directive "' + directiveName + '"'); + } + } + skipSeparationSpace(state, true, -1); + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } else if (hasDirectives) { + throwError(state, 'directives end mark is expected'); + } + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, 'non-ASCII line breaks are interpreted as content'); + } + state.documents.push(state.result); + if (state.position === state.lineStart && testDocumentSeparator(state)) { + if (state.input.charCodeAt(state.position) === 0x2E /* . */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } + return; + } + if (state.position < state.length - 1) { + throwError(state, 'end of the stream or a document separator is expected'); + } else { + return; + } + } + function loadDocuments(input, options) { + input = String(input); + options = options || {}; + if (input.length !== 0) { + // Add tailing `\n` if not exists + if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) { + input += '\n'; + } -/***/ 1180: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // Strip BOM + if (input.charCodeAt(0) === 0xFEFF) { + input = input.slice(1); + } + } + var state = new State$1(input, options); + var nullpos = input.indexOf('\0'); + if (nullpos !== -1) { + state.position = nullpos; + throwError(state, 'null byte is not allowed in input'); + } -var global = __webpack_require__(9859); -var isCallable = __webpack_require__(6733); + // Use 0 as string terminator. That significantly simplifies bounds check. + state.input += '\0'; + while (state.input.charCodeAt(state.position) === 0x20 /* Space */) { + state.lineIndent += 1; + state.position += 1; + } + while (state.position < state.length - 1) { + readDocument(state); + } + return state.documents; + } + function loadAll(input, iterator, options) { + if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { + options = iterator; + iterator = null; + } + var documents = loadDocuments(input, options); + if (typeof iterator !== 'function') { + return documents; + } + for (var index = 0, length = documents.length; index < length; index += 1) { + iterator(documents[index]); + } + } + function load(input, options) { + var documents = loadDocuments(input, options); + if (documents.length === 0) { + /*eslint-disable no-undefined*/ + return undefined; + } else if (documents.length === 1) { + return documents[0]; + } + throw new YAMLException$1('expected a single document in the stream, but found more'); + } + function safeLoadAll(input, iterator, options) { + if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') { + options = iterator; + iterator = null; + } + return loadAll(input, iterator, common$1.extend({ + schema: DEFAULT_SAFE_SCHEMA$1 + }, options)); + } + function safeLoad(input, options) { + return load(input, common$1.extend({ + schema: DEFAULT_SAFE_SCHEMA$1 + }, options)); + } + loader$1.loadAll = loadAll; + loader$1.load = load; + loader$1.safeLoadAll = safeLoadAll; + loader$1.safeLoad = safeLoad; -var WeakMap = global.WeakMap; + var dumper$1 = {}; -module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + /*eslint-disable no-use-before-define*/ + var common = common$6; + var YAMLException = exception; + var DEFAULT_FULL_SCHEMA = default_full; + var DEFAULT_SAFE_SCHEMA = default_safe; + var _toString = Object.prototype.toString; + var _hasOwnProperty = Object.prototype.hasOwnProperty; + var CHAR_TAB = 0x09; /* Tab */ + var CHAR_LINE_FEED = 0x0A; /* LF */ + var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ + var CHAR_SPACE = 0x20; /* Space */ + var CHAR_EXCLAMATION = 0x21; /* ! */ + var CHAR_DOUBLE_QUOTE = 0x22; /* " */ + var CHAR_SHARP = 0x23; /* # */ + var CHAR_PERCENT = 0x25; /* % */ + var CHAR_AMPERSAND = 0x26; /* & */ + var CHAR_SINGLE_QUOTE = 0x27; /* ' */ + var CHAR_ASTERISK = 0x2A; /* * */ + var CHAR_COMMA = 0x2C; /* , */ + var CHAR_MINUS = 0x2D; /* - */ + var CHAR_COLON = 0x3A; /* : */ + var CHAR_EQUALS = 0x3D; /* = */ + var CHAR_GREATER_THAN = 0x3E; /* > */ + var CHAR_QUESTION = 0x3F; /* ? */ + var CHAR_COMMERCIAL_AT = 0x40; /* @ */ + var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ + var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ + var CHAR_GRAVE_ACCENT = 0x60; /* ` */ + var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ + var CHAR_VERTICAL_LINE = 0x7C; /* | */ + var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ -/***/ }), + var ESCAPE_SEQUENCES = {}; + ESCAPE_SEQUENCES[0x00] = '\\0'; + ESCAPE_SEQUENCES[0x07] = '\\a'; + ESCAPE_SEQUENCES[0x08] = '\\b'; + ESCAPE_SEQUENCES[0x09] = '\\t'; + ESCAPE_SEQUENCES[0x0A] = '\\n'; + ESCAPE_SEQUENCES[0x0B] = '\\v'; + ESCAPE_SEQUENCES[0x0C] = '\\f'; + ESCAPE_SEQUENCES[0x0D] = '\\r'; + ESCAPE_SEQUENCES[0x1B] = '\\e'; + ESCAPE_SEQUENCES[0x22] = '\\"'; + ESCAPE_SEQUENCES[0x5C] = '\\\\'; + ESCAPE_SEQUENCES[0x85] = '\\N'; + ESCAPE_SEQUENCES[0xA0] = '\\_'; + ESCAPE_SEQUENCES[0x2028] = '\\L'; + ESCAPE_SEQUENCES[0x2029] = '\\P'; + var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF']; + function compileStyleMap(schema, map) { + var result, keys, index, length, tag, style, type; + if (map === null) return {}; + result = {}; + keys = Object.keys(map); + for (index = 0, length = keys.length; index < length; index += 1) { + tag = keys[index]; + style = String(map[tag]); + if (tag.slice(0, 2) === '!!') { + tag = 'tag:yaml.org,2002:' + tag.slice(2); + } + type = schema.compiledTypeMap['fallback'][tag]; + if (type && _hasOwnProperty.call(type.styleAliases, style)) { + style = type.styleAliases[style]; + } + result[tag] = style; + } + return result; + } + function encodeHex(character) { + var string, handle, length; + string = character.toString(16).toUpperCase(); + if (character <= 0xFF) { + handle = 'x'; + length = 2; + } else if (character <= 0xFFFF) { + handle = 'u'; + length = 4; + } else if (character <= 0xFFFFFFFF) { + handle = 'U'; + length = 8; + } else { + throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF'); + } + return '\\' + handle + common.repeat('0', length - string.length) + string; + } + function State(options) { + this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; + this.indent = Math.max(1, options['indent'] || 2); + this.noArrayIndent = options['noArrayIndent'] || false; + this.skipInvalid = options['skipInvalid'] || false; + this.flowLevel = common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']; + this.styleMap = compileStyleMap(this.schema, options['styles'] || null); + this.sortKeys = options['sortKeys'] || false; + this.lineWidth = options['lineWidth'] || 80; + this.noRefs = options['noRefs'] || false; + this.noCompatMode = options['noCompatMode'] || false; + this.condenseFlow = options['condenseFlow'] || false; + this.implicitTypes = this.schema.compiledImplicit; + this.explicitTypes = this.schema.compiledExplicit; + this.tag = null; + this.result = ''; + this.duplicates = []; + this.usedDuplicates = null; + } -/***/ 95: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + // Indents every line in a string. Empty lines (\n only) are not indented. + function indentString(string, spaces) { + var ind = common.repeat(' ', spaces), + position = 0, + next = -1, + result = '', + line, + length = string.length; + while (position < length) { + next = string.indexOf('\n', position); + if (next === -1) { + line = string.slice(position); + position = length; + } else { + line = string.slice(position, next + 1); + position = next + 1; + } + if (line.length && line !== '\n') result += ind; + result += line; + } + return result; + } + function generateNextLine(state, level) { + return '\n' + common.repeat(' ', state.indent * level); + } + function testImplicitResolving(state, str) { + var index, length, type; + for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { + type = state.implicitTypes[index]; + if (type.resolve(str)) { + return true; + } + } + return false; + } -var global = __webpack_require__(9859); -var shared = __webpack_require__(3036); -var hasOwn = __webpack_require__(8270); -var uid = __webpack_require__(1441); -var NATIVE_SYMBOL = __webpack_require__(4860); -var USE_SYMBOL_AS_UID = __webpack_require__(6969); + // [33] s-white ::= s-space | s-tab + function isWhitespace(c) { + return c === CHAR_SPACE || c === CHAR_TAB; + } -var Symbol = global.Symbol; -var WellKnownSymbolsStore = shared('wks'); -var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + // Returns true if the character can be printed without escaping. + // From YAML 1.2: "any allowed characters known to be non-printable + // should also be escaped. [However,] This isn’t mandatory" + // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. + function isPrintable(c) { + return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF; + } -module.exports = function (name) { - if (!hasOwn(WellKnownSymbolsStore, name)) { - WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) - ? Symbol[name] - : createWellKnownSymbol('Symbol.' + name); - } return WellKnownSymbolsStore[name]; -}; - - -/***/ }), - -/***/ 3949: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var getBuiltIn = __webpack_require__(1333); -var hasOwn = __webpack_require__(8270); -var createNonEnumerableProperty = __webpack_require__(5762); -var isPrototypeOf = __webpack_require__(1321); -var setPrototypeOf = __webpack_require__(6540); -var copyConstructorProperties = __webpack_require__(7081); -var proxyAccessor = __webpack_require__(6060); -var inheritIfRequired = __webpack_require__(835); -var normalizeStringArgument = __webpack_require__(635); -var installErrorCause = __webpack_require__(9679); -var installErrorStack = __webpack_require__(9166); -var DESCRIPTORS = __webpack_require__(7400); -var IS_PURE = __webpack_require__(4231); - -module.exports = function (FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) { - var STACK_TRACE_LIMIT = 'stackTraceLimit'; - var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1; - var path = FULL_NAME.split('.'); - var ERROR_NAME = path[path.length - 1]; - var OriginalError = getBuiltIn.apply(null, path); - - if (!OriginalError) return; - - var OriginalErrorPrototype = OriginalError.prototype; - - // V8 9.3- bug https://bugs.chromium.org/p/v8/issues/detail?id=12006 - if (!IS_PURE && hasOwn(OriginalErrorPrototype, 'cause')) delete OriginalErrorPrototype.cause; - - if (!FORCED) return OriginalError; - - var BaseError = getBuiltIn('Error'); - - var WrappedError = wrapper(function (a, b) { - var message = normalizeStringArgument(IS_AGGREGATE_ERROR ? b : a, undefined); - var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError(); - if (message !== undefined) createNonEnumerableProperty(result, 'message', message); - installErrorStack(result, WrappedError, result.stack, 2); - if (this && isPrototypeOf(OriginalErrorPrototype, this)) inheritIfRequired(result, this, WrappedError); - if (arguments.length > OPTIONS_POSITION) installErrorCause(result, arguments[OPTIONS_POSITION]); - return result; - }); - - WrappedError.prototype = OriginalErrorPrototype; - - if (ERROR_NAME !== 'Error') { - if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError); - else copyConstructorProperties(WrappedError, BaseError, { name: true }); - } else if (DESCRIPTORS && STACK_TRACE_LIMIT in OriginalError) { - proxyAccessor(WrappedError, OriginalError, STACK_TRACE_LIMIT); - proxyAccessor(WrappedError, OriginalError, 'prepareStackTrace'); - } - - copyConstructorProperties(WrappedError, OriginalError); + // [34] ns-char ::= nb-char - s-white + // [27] nb-char ::= c-printable - b-char - c-byte-order-mark + // [26] b-char ::= b-line-feed | b-carriage-return + // [24] b-line-feed ::= #xA /* LF */ + // [25] b-carriage-return ::= #xD /* CR */ + // [3] c-byte-order-mark ::= #xFEFF + function isNsChar(c) { + return isPrintable(c) && !isWhitespace(c) + // byte-order-mark + && c !== 0xFEFF + // b-char + && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; + } - if (!IS_PURE) try { - // Safari 13- bug: WebAssembly errors does not have a proper `.name` - if (OriginalErrorPrototype.name !== ERROR_NAME) { - createNonEnumerableProperty(OriginalErrorPrototype, 'name', ERROR_NAME); + // Simplified test for values allowed after the first character in plain style. + function isPlainSafe(c, prev) { + // Uses a subset of nb-char - c-flow-indicator - ":" - "#" + // where nb-char ::= c-printable - b-char - c-byte-order-mark. + return isPrintable(c) && c !== 0xFEFF + // - c-flow-indicator + && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // - ":" - "#" + // /* An ns-char preceding */ "#" + && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev)); } - OriginalErrorPrototype.constructor = WrappedError; - } catch (error) { /* empty */ } - return WrappedError; -}; + // Simplified test for values allowed as the first character in plain style. + function isPlainSafeFirst(c) { + // Uses a subset of ns-char - c-indicator + // where ns-char = nb-char - s-white. + return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white + // - (c-indicator ::= + // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” + && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” + && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE + // | “%” | “@” | “`”) + && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; + } + // Determines whether block indentation indicator is required. + function needIndentIndicator(string) { + var leadingSpaceRe = /^\n* /; + return leadingSpaceRe.test(string); + } + var STYLE_PLAIN = 1, + STYLE_SINGLE = 2, + STYLE_LITERAL = 3, + STYLE_FOLDED = 4, + STYLE_DOUBLE = 5; -/***/ }), + // Determines which scalar styles are possible and returns the preferred style. + // lineWidth = -1 => no limit. + // Pre-conditions: str.length > 0. + // Post-conditions: + // STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. + // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). + // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). + function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) { + var i; + var char, prev_char; + var hasLineBreak = false; + var hasFoldableLine = false; // only checked if shouldTrackWidth + var shouldTrackWidth = lineWidth !== -1; + var previousLineBreak = -1; // count the first line correctly + var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1)); + if (singleLineOnly) { + // Case: no block styles. + // Check for disallowed characters to rule out plain and single. + for (i = 0; i < string.length; i++) { + char = string.charCodeAt(i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + prev_char = i > 0 ? string.charCodeAt(i - 1) : null; + plain = plain && isPlainSafe(char, prev_char); + } + } else { + // Case: block styles permitted. + for (i = 0; i < string.length; i++) { + char = string.charCodeAt(i); + if (char === CHAR_LINE_FEED) { + hasLineBreak = true; + // Check if any line can be folded. + if (shouldTrackWidth) { + hasFoldableLine = hasFoldableLine || + // Foldable line = too long, and not more-indented. + i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; + previousLineBreak = i; + } + } else if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + prev_char = i > 0 ? string.charCodeAt(i - 1) : null; + plain = plain && isPlainSafe(char, prev_char); + } + // in case the end is missing a \n + hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; + } + // Although every style can represent \n without escaping, prefer block styles + // for multiline, since they're more readable and they don't add empty lines. + // Also prefer folding a super-long line. + if (!hasLineBreak && !hasFoldableLine) { + // Strings interpretable as another type have to be quoted; + // e.g. the string 'true' vs. the boolean true. + return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE; + } + // Edge case: block indentation indicator can only have one digit. + if (indentPerLevel > 9 && needIndentIndicator(string)) { + return STYLE_DOUBLE; + } + // At this point we know block styles are valid. + // Prefer literal style unless we want to fold. + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; + } -/***/ 724: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + // Note: line breaking/folding is implemented for only the folded style. + // NB. We drop the last trailing newline (if any) of a returned block scalar + // since the dumper adds its own newline. This always works: + // • No ending newline => unaffected; already using strip "-" chomping. + // • Ending newline => removed then restored. + // Importantly, this keeps the "+" chomp indicator from gaining an extra line. + function writeScalar(state, string, level, iskey) { + state.dump = function () { + if (string.length === 0) { + return "''"; + } + if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { + return "'" + string + "'"; + } + var indent = state.indent * Math.max(1, level); // no 0-indent scalars + // As indentation gets deeper, let the width decrease monotonically + // to the lower bound min(state.lineWidth, 40). + // Note that this implies + // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. + // state.lineWidth > 40 + state.indent: width decreases until the lower bound. + // This behaves better than a constant minimum width which disallows narrower options, + // or an indent threshold which causes the width to suddenly increase. + var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); -"use strict"; + // Without knowing if keys are implicit/explicit, assume implicit for safety. + var singleLineOnly = iskey + // No block styles in flow mode. + || state.flowLevel > -1 && level >= state.flowLevel; + function testAmbiguity(string) { + return testImplicitResolving(state, string); + } + switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { + case STYLE_PLAIN: + return string; + case STYLE_SINGLE: + return "'" + string.replace(/'/g, "''") + "'"; + case STYLE_LITERAL: + return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent)); + case STYLE_FOLDED: + return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); + case STYLE_DOUBLE: + return '"' + escapeString(string) + '"'; + default: + throw new YAMLException('impossible error: invalid scalar style'); + } + }(); + } -var $ = __webpack_require__(3103); -var toObject = __webpack_require__(2991); -var lengthOfArrayLike = __webpack_require__(9646); -var toIntegerOrInfinity = __webpack_require__(3329); -var addToUnscopables = __webpack_require__(9736); + // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. + function blockHeader(string, indentPerLevel) { + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; -// `Array.prototype.at` method -// https://github.com/tc39/proposal-relative-indexing-method -$({ target: 'Array', proto: true }, { - at: function at(index) { - var O = toObject(this); - var len = lengthOfArrayLike(O); - var relativeIndex = toIntegerOrInfinity(index); - var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; - return (k < 0 || k >= len) ? undefined : O[k]; - } -}); + // note the special case: the string '\n' counts as a "trailing" empty line. + var clip = string[string.length - 1] === '\n'; + var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); + var chomp = keep ? '+' : clip ? '' : '-'; + return indentIndicator + chomp + '\n'; + } -addToUnscopables('at'); + // (See the note for writeScalar.) + function dropEndingNewline(string) { + return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; + } + // Note: a long line without a suitable break point will exceed the width limit. + // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. + function foldString(string, width) { + // In folded style, $k$ consecutive newlines output as $k+1$ newlines— + // unless they're before or after a more-indented line, or at the very + // beginning or end, in which case $k$ maps to $k$. + // Therefore, parse each chunk as newline(s) followed by a content line. + var lineRe = /(\n+)([^\n]*)/g; -/***/ }), + // first line (possibly an empty line) + var result = function () { + var nextLF = string.indexOf('\n'); + nextLF = nextLF !== -1 ? nextLF : string.length; + lineRe.lastIndex = nextLF; + return foldLine(string.slice(0, nextLF), width); + }(); + // If we haven't reached the first content line yet, don't add an extra \n. + var prevMoreIndented = string[0] === '\n' || string[0] === ' '; + var moreIndented; -/***/ 9529: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + // rest of the lines + var match; + while (match = lineRe.exec(string)) { + var prefix = match[1], + line = match[2]; + moreIndented = line[0] === ' '; + result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\n' : '') + foldLine(line, width); + prevMoreIndented = moreIndented; + } + return result; + } -"use strict"; + // Greedy line breaking. + // Picks the longest line under the limit each time, + // otherwise settles for the shortest line over the limit. + // NB. More-indented lines *cannot* be folded, as that would add an extra \n. + function foldLine(line, width) { + if (line === '' || line[0] === ' ') return line; -var $ = __webpack_require__(3103); -var $includes = (__webpack_require__(9540).includes); -var fails = __webpack_require__(4229); -var addToUnscopables = __webpack_require__(9736); + // Since a more-indented line adds a \n, breaks can't be followed by a space. + var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. + var match; + // start is an inclusive index. end, curr, and next are exclusive. + var start = 0, + end, + curr = 0, + next = 0; + var result = ''; -// FF99+ bug -var BROKEN_ON_SPARSE = fails(function () { - // eslint-disable-next-line es/no-array-prototype-includes -- detection - return !Array(1).includes(); -}); + // Invariants: 0 <= start <= length-1. + // 0 <= curr <= next <= max(0, length-2). curr - start <= width. + // Inside the loop: + // A match implies length >= 2, so curr and next are <= length-2. + while (match = breakRe.exec(line)) { + next = match.index; + // maintain invariant: curr - start <= width + if (next - start > width) { + end = curr > start ? curr : next; // derive end <= length-2 + result += '\n' + line.slice(start, end); + // skip the space that was output as \n + start = end + 1; // derive start <= length-1 + } -// `Array.prototype.includes` method -// https://tc39.es/ecma262/#sec-array.prototype.includes -$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, { - includes: function includes(el /* , fromIndex = 0 */) { - return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); - } -}); + curr = next; + } -// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('includes'); + // By the invariants, start <= length-1, so there is something left over. + // It is either the whole string or a part starting from non-whitespace. + result += '\n'; + // Insert a break if the remainder is too long and there is a break available. + if (line.length - start > width && curr > start) { + result += line.slice(start, curr) + '\n' + line.slice(curr + 1); + } else { + result += line.slice(start); + } + return result.slice(1); // drop extra \n joiner + } + // Escapes a double-quoted string. + function escapeString(string) { + var result = ''; + var char, nextChar; + var escapeSeq; + for (var i = 0; i < string.length; i++) { + char = string.charCodeAt(i); + // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). + if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) { + nextChar = string.charCodeAt(i + 1); + if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) { + // Combine the surrogate pair and store it escaped. + result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); + // Advance index one extra since we already used that char here. + i++; + continue; + } + } + escapeSeq = ESCAPE_SEQUENCES[char]; + result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char); + } + return result; + } + function writeFlowSequence(state, level, object) { + var _result = '', + _tag = state.tag, + index, + length; + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level, object[index], false, false)) { + if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : ''); + _result += state.dump; + } + } + state.tag = _tag; + state.dump = '[' + _result + ']'; + } + function writeBlockSequence(state, level, object, compact) { + var _result = '', + _tag = state.tag, + index, + length; + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level + 1, object[index], true, true)) { + if (!compact || index !== 0) { + _result += generateNextLine(state, level); + } + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + _result += '-'; + } else { + _result += '- '; + } + _result += state.dump; + } + } + state.tag = _tag; + state.dump = _result || '[]'; // Empty sequence if no valid values. + } -/***/ }), + function writeFlowMapping(state, level, object) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + pairBuffer; + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ''; + if (index !== 0) pairBuffer += ', '; + if (state.condenseFlow) pairBuffer += '"'; + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + if (!writeNode(state, level, objectKey, false, false)) { + continue; // Skip this pair because of invalid key; + } -/***/ 6728: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + if (state.dump.length > 1024) pairBuffer += '? '; + pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); + if (!writeNode(state, level, objectValue, false, false)) { + continue; // Skip this pair because of invalid value. + } -"use strict"; + pairBuffer += state.dump; -var $ = __webpack_require__(3103); -var toObject = __webpack_require__(2991); -var lengthOfArrayLike = __webpack_require__(9646); -var setArrayLength = __webpack_require__(6554); -var doesNotExceedSafeInteger = __webpack_require__(3064); -var fails = __webpack_require__(4229); + // Both key and value are valid. + _result += pairBuffer; + } + state.tag = _tag; + state.dump = '{' + _result + '}'; + } + function writeBlockMapping(state, level, object, compact) { + var _result = '', + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + explicitPair, + pairBuffer; -var INCORRECT_TO_LENGTH = fails(function () { - return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; -}); + // Allow sorting keys so that the output file is deterministic + if (state.sortKeys === true) { + // Default sorting + objectKeyList.sort(); + } else if (typeof state.sortKeys === 'function') { + // Custom sort function + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { + // Something is wrong + throw new YAMLException('sortKeys must be a boolean or a function'); + } + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ''; + if (!compact || index !== 0) { + pairBuffer += generateNextLine(state, level); + } + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + if (!writeNode(state, level + 1, objectKey, true, true, true)) { + continue; // Skip this pair because of invalid key. + } -// V8 and Safari <= 15.4, FF < 23 throws InternalError -// https://bugs.chromium.org/p/v8/issues/detail?id=12681 -var properErrorOnNonWritableLength = function () { - try { - // eslint-disable-next-line es/no-object-defineproperty -- safe - Object.defineProperty([], 'length', { writable: false }).push(); - } catch (error) { - return error instanceof TypeError; - } -}; + explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024; + if (explicitPair) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += '?'; + } else { + pairBuffer += '? '; + } + } + pairBuffer += state.dump; + if (explicitPair) { + pairBuffer += generateNextLine(state, level); + } + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { + continue; // Skip this pair because of invalid value. + } -var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += ':'; + } else { + pairBuffer += ': '; + } + pairBuffer += state.dump; -// `Array.prototype.push` method -// https://tc39.es/ecma262/#sec-array.prototype.push -$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { - // eslint-disable-next-line no-unused-vars -- required for `.length` - push: function push(item) { - var O = toObject(this); - var len = lengthOfArrayLike(O); - var argCount = arguments.length; - doesNotExceedSafeInteger(len + argCount); - for (var i = 0; i < argCount; i++) { - O[len] = arguments[i]; - len++; + // Both key and value are valid. + _result += pairBuffer; + } + state.tag = _tag; + state.dump = _result || '{}'; // Empty mapping if no valid pairs. } - setArrayLength(O, len); - return len; - } -}); - -/***/ }), - -/***/ 1372: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -/* eslint-disable no-unused-vars -- required for functions `.length` */ -var $ = __webpack_require__(3103); -var global = __webpack_require__(9859); -var apply = __webpack_require__(3171); -var wrapErrorConstructorWithCause = __webpack_require__(3949); - -var WEB_ASSEMBLY = 'WebAssembly'; -var WebAssembly = global[WEB_ASSEMBLY]; - -var FORCED = Error('e', { cause: 7 }).cause !== 7; - -var exportGlobalErrorCauseWrapper = function (ERROR_NAME, wrapper) { - var O = {}; - O[ERROR_NAME] = wrapErrorConstructorWithCause(ERROR_NAME, wrapper, FORCED); - $({ global: true, constructor: true, arity: 1, forced: FORCED }, O); -}; - -var exportWebAssemblyErrorCauseWrapper = function (ERROR_NAME, wrapper) { - if (WebAssembly && WebAssembly[ERROR_NAME]) { - var O = {}; - O[ERROR_NAME] = wrapErrorConstructorWithCause(WEB_ASSEMBLY + '.' + ERROR_NAME, wrapper, FORCED); - $({ target: WEB_ASSEMBLY, stat: true, constructor: true, arity: 1, forced: FORCED }, O); - } -}; - -// https://tc39.es/ecma262/#sec-nativeerror -// https://github.com/tc39/proposal-error-cause -exportGlobalErrorCauseWrapper('Error', function (init) { - return function Error(message) { return apply(init, this, arguments); }; -}); -exportGlobalErrorCauseWrapper('EvalError', function (init) { - return function EvalError(message) { return apply(init, this, arguments); }; -}); -exportGlobalErrorCauseWrapper('RangeError', function (init) { - return function RangeError(message) { return apply(init, this, arguments); }; -}); -exportGlobalErrorCauseWrapper('ReferenceError', function (init) { - return function ReferenceError(message) { return apply(init, this, arguments); }; -}); -exportGlobalErrorCauseWrapper('SyntaxError', function (init) { - return function SyntaxError(message) { return apply(init, this, arguments); }; -}); -exportGlobalErrorCauseWrapper('TypeError', function (init) { - return function TypeError(message) { return apply(init, this, arguments); }; -}); -exportGlobalErrorCauseWrapper('URIError', function (init) { - return function URIError(message) { return apply(init, this, arguments); }; -}); -exportWebAssemblyErrorCauseWrapper('CompileError', function (init) { - return function CompileError(message) { return apply(init, this, arguments); }; -}); -exportWebAssemblyErrorCauseWrapper('LinkError', function (init) { - return function LinkError(message) { return apply(init, this, arguments); }; -}); -exportWebAssemblyErrorCauseWrapper('RuntimeError', function (init) { - return function RuntimeError(message) { return apply(init, this, arguments); }; -}); - - -/***/ }), - -/***/ 6406: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(3103); -var uncurryThis = __webpack_require__(5968); -var requireObjectCoercible = __webpack_require__(8885); -var toIntegerOrInfinity = __webpack_require__(3329); -var toString = __webpack_require__(3326); -var fails = __webpack_require__(4229); - -var charAt = uncurryThis(''.charAt); - -var FORCED = fails(function () { - // eslint-disable-next-line es/no-array-string-prototype-at -- safe - return '𠮷'.at(-2) !== '\uD842'; -}); - -// `String.prototype.at` method -// https://github.com/tc39/proposal-relative-indexing-method -$({ target: 'String', proto: true, forced: FORCED }, { - at: function at(index) { - var S = toString(requireObjectCoercible(this)); - var len = S.length; - var relativeIndex = toIntegerOrInfinity(index); - var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; - return (k < 0 || k >= len) ? undefined : charAt(S, k); - } -}); - - -/***/ }), - -/***/ 1427: -/***/ (function(__unused_webpack_module, exports) { - -!function(g,c){ true?c(exports):0}(this,function(g){const c=Symbol("newer"),e=Symbol("older");class n{constructor(a,b){typeof a!=="number"&&(b=a,a=0),this.size=0,this.limit=a,this.oldest=this.newest=void 0,this._keymap=new Map(),b&&(this.assign(b),a<1&&(this.limit=this.size))}_markEntryAsUsed(a){if(a===this.newest)return;a[c]&&(a===this.oldest&&(this.oldest=a[c]),a[c][e]=a[e]),a[e]&&(a[e][c]=a[c]),a[c]=void 0,a[e]=this.newest,this.newest&&(this.newest[c]=a),this.newest=a}assign(a){let b,d=this.limit||Number.MAX_VALUE;this._keymap.clear();let m=a[Symbol.iterator]();for(let h=m.next();!h.done;h=m.next()){let f=new l(h.value[0],h.value[1]);this._keymap.set(f.key,f),b?(b[c]=f,f[e]=b):this.oldest=f,b=f;if(d--==0)throw new Error("overflow")}this.newest=b,this.size=this._keymap.size}get(a){var b=this._keymap.get(a);return b?(this._markEntryAsUsed(b),b.value):void 0}set(a,b){var d=this._keymap.get(a);return d?(d.value=b,this._markEntryAsUsed(d),this):(this._keymap.set(a,d=new l(a,b)),this.newest?(this.newest[c]=d,d[e]=this.newest):this.oldest=d,this.newest=d,++this.size,this.size>this.limit&&this.shift(),this)}shift(){var a=this.oldest;if(a)return this.oldest[c]?(this.oldest=this.oldest[c],this.oldest[e]=void 0):(this.oldest=void 0,this.newest=void 0),a[c]=a[e]=void 0,this._keymap.delete(a.key),--this.size,[a.key,a.value]}find(a){let b=this._keymap.get(a);return b?b.value:void 0}has(a){return this._keymap.has(a)}delete(a){var b=this._keymap.get(a);return b?(this._keymap.delete(b.key),b[c]&&b[e]?(b[e][c]=b[c],b[c][e]=b[e]):b[c]?(b[c][e]=void 0,this.oldest=b[c]):b[e]?(b[e][c]=void 0,this.newest=b[e]):this.oldest=this.newest=void 0,this.size--,b.value):void 0}clear(){this.oldest=this.newest=void 0,this.size=0,this._keymap.clear()}keys(){return new j(this.oldest)}values(){return new k(this.oldest)}entries(){return this}[Symbol.iterator](){return new i(this.oldest)}forEach(a,b){typeof b!=="object"&&(b=this);let d=this.oldest;for(;d;)a.call(b,d.value,d.key,this),d=d[c]}toJSON(){for(var a=new Array(this.size),b=0,d=this.oldest;d;)a[b++]={key:d.key,value:d.value},d=d[c];return a}toString(){for(var a="",b=this.oldest;b;)a+=String(b.key)+":"+b.value,b=b[c],b&&(a+=" < ");return a}}g.LRUMap=n;function l(a,b){this.key=a,this.value=b,this[c]=void 0,this[e]=void 0}function i(a){this.entry=a}i.prototype[Symbol.iterator]=function(){return this},i.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:[a.key,a.value]}):{done:!0,value:void 0}};function j(a){this.entry=a}j.prototype[Symbol.iterator]=function(){return this},j.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.key}):{done:!0,value:void 0}};function k(a){this.entry=a}k.prototype[Symbol.iterator]=function(){return this},k.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.value}):{done:!0,value:void 0}}}); -//# sourceMappingURL=lru.js.map - - -/***/ }), - -/***/ 2808: -/***/ ((module) => { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -// If obj.hasOwnProperty has been overridden, then calling -// obj.hasOwnProperty(prop) will break. -// See: https://github.com/joyent/node/issues/1707 -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -module.exports = function(qs, sep, eq, options) { - sep = sep || '&'; - eq = eq || '='; - var obj = {}; - - if (typeof qs !== 'string' || qs.length === 0) { - return obj; - } - - var regexp = /\+/g; - qs = qs.split(sep); - - var maxKeys = 1000; - if (options && typeof options.maxKeys === 'number') { - maxKeys = options.maxKeys; - } - - var len = qs.length; - // maxKeys <= 0 means that we should not limit keys count - if (maxKeys > 0 && len > maxKeys) { - len = maxKeys; - } - - for (var i = 0; i < len; ++i) { - var x = qs[i].replace(regexp, '%20'), - idx = x.indexOf(eq), - kstr, vstr, k, v; - - if (idx >= 0) { - kstr = x.substr(0, idx); - vstr = x.substr(idx + 1); - } else { - kstr = x; - vstr = ''; - } - - k = decodeURIComponent(kstr); - v = decodeURIComponent(vstr); - - if (!hasOwnProperty(obj, k)) { - obj[k] = v; - } else if (Array.isArray(obj[k])) { - obj[k].push(v); - } else { - obj[k] = [obj[k], v]; + function detectType(state, object, explicit) { + var _result, typeList, index, length, type, style; + typeList = explicit ? state.explicitTypes : state.implicitTypes; + for (index = 0, length = typeList.length; index < length; index += 1) { + type = typeList[index]; + if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) { + state.tag = explicit ? type.tag : '?'; + if (type.represent) { + style = state.styleMap[type.tag] || type.defaultStyle; + if (_toString.call(type.represent) === '[object Function]') { + _result = type.represent(object, style); + } else if (_hasOwnProperty.call(type.represent, style)) { + _result = type.represent[style](object, style); + } else { + throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); + } + state.dump = _result; + } + return true; + } + } + return false; } - } - - return obj; -}; - - -/***/ }), -/***/ 1368: -/***/ ((module) => { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var stringifyPrimitive = function(v) { - switch (typeof v) { - case 'string': - return v; - - case 'boolean': - return v ? 'true' : 'false'; - - case 'number': - return isFinite(v) ? v : ''; - - default: - return ''; - } -}; - -module.exports = function(obj, sep, eq, name) { - sep = sep || '&'; - eq = eq || '='; - if (obj === null) { - obj = undefined; - } - - if (typeof obj === 'object') { - return Object.keys(obj).map(function(k) { - var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; - if (Array.isArray(obj[k])) { - return obj[k].map(function(v) { - return ks + encodeURIComponent(stringifyPrimitive(v)); - }).join(sep); + // Serializes `object` and writes it to global `result`. + // Returns true on success, or false on invalid object. + // + function writeNode(state, level, object, block, compact, iskey) { + state.tag = null; + state.dump = object; + if (!detectType(state, object, false)) { + detectType(state, object, true); + } + var type = _toString.call(state.dump); + if (block) { + block = state.flowLevel < 0 || state.flowLevel > level; + } + var objectOrArray = type === '[object Object]' || type === '[object Array]', + duplicateIndex, + duplicate; + if (objectOrArray) { + duplicateIndex = state.duplicates.indexOf(object); + duplicate = duplicateIndex !== -1; + } + if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) { + compact = false; + } + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = '*ref_' + duplicateIndex; } else { - return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; + } + if (type === '[object Object]') { + if (block && Object.keys(state.dump).length !== 0) { + writeBlockMapping(state, level, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowMapping(state, level, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object Array]') { + var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level; + if (block && state.dump.length !== 0) { + writeBlockSequence(state, arrayLevel, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, arrayLevel, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object String]') { + if (state.tag !== '?') { + writeScalar(state, state.dump, level, iskey); + } + } else { + if (state.skipInvalid) return false; + throw new YAMLException('unacceptable kind of an object to dump ' + type); + } + if (state.tag !== null && state.tag !== '?') { + state.dump = '!<' + state.tag + '> ' + state.dump; + } } - }).join(sep); - - } - - if (!name) return ''; - return encodeURIComponent(stringifyPrimitive(name)) + eq + - encodeURIComponent(stringifyPrimitive(obj)); -}; + return true; + } + function getDuplicateReferences(object, state) { + var objects = [], + duplicatesIndexes = [], + index, + length; + inspectNode(object, objects, duplicatesIndexes); + for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { + state.duplicates.push(objects[duplicatesIndexes[index]]); + } + state.usedDuplicates = new Array(length); + } + function inspectNode(object, objects, duplicatesIndexes) { + var objectKeyList, index, length; + if (object !== null && typeof object === 'object') { + index = objects.indexOf(object); + if (index !== -1) { + if (duplicatesIndexes.indexOf(index) === -1) { + duplicatesIndexes.push(index); + } + } else { + objects.push(object); + if (Array.isArray(object)) { + for (index = 0, length = object.length; index < length; index += 1) { + inspectNode(object[index], objects, duplicatesIndexes); + } + } else { + objectKeyList = Object.keys(object); + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); + } + } + } + } + } + function dump(input, options) { + options = options || {}; + var state = new State(options); + if (!state.noRefs) getDuplicateReferences(input, state); + if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; + return ''; + } + function safeDump(input, options) { + return dump(input, common.extend({ + schema: DEFAULT_SAFE_SCHEMA + }, options)); + } + dumper$1.dump = dump; + dumper$1.safeDump = safeDump; + var loader = loader$1; + var dumper = dumper$1; + function deprecated(name) { + return function () { + throw new Error('Function ' + name + ' is deprecated and cannot be used.'); + }; + } + jsYaml$2.Type = type; + jsYaml$2.Schema = schema; + jsYaml$2.FAILSAFE_SCHEMA = failsafe; + jsYaml$2.JSON_SCHEMA = json; + jsYaml$2.CORE_SCHEMA = core; + jsYaml$2.DEFAULT_SAFE_SCHEMA = default_safe; + jsYaml$2.DEFAULT_FULL_SCHEMA = default_full; + jsYaml$2.load = loader.load; + jsYaml$2.loadAll = loader.loadAll; + jsYaml$2.safeLoad = loader.safeLoad; + jsYaml$2.safeLoadAll = loader.safeLoadAll; + jsYaml$2.dump = dumper.dump; + jsYaml$2.safeDump = dumper.safeDump; + jsYaml$2.YAMLException = exception; -/***/ }), + // Deprecated schema names from JS-YAML 2.0.x + jsYaml$2.MINIMAL_SCHEMA = failsafe; + jsYaml$2.SAFE_SCHEMA = default_safe; + jsYaml$2.DEFAULT_SCHEMA = default_full; -/***/ 6642: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + // Deprecated functions from JS-YAML 1.x.x + jsYaml$2.scan = deprecated('scan'); + jsYaml$2.parse = deprecated('parse'); + jsYaml$2.compose = deprecated('compose'); + jsYaml$2.addConstructor = deprecated('addConstructor'); -"use strict"; + var yaml = jsYaml$2; + var jsYaml = yaml; + var jsYaml$1 = /*@__PURE__*/getDefaultExportFromCjs(jsYaml); + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } -exports.decode = exports.parse = __webpack_require__(2808); -exports.encode = exports.stringify = __webpack_require__(1368); + /** + * Redirect - object used to redirect some requests + * e.g. + * { + * title: 1x1-transparent.gif + * comment: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever + * contentType: image/gif;base64 + * content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== + * } + * + * @typedef {object} Redirect + * @property {string} title resource name + * @property {string} comment resource description + * @property {string} content encoded resource content + * @property {string} contentType MIME type + * @property {boolean} [isBlocking] e.g click2load redirect + * @property {string} [sha] hash + */ + class Redirects { + /** + * Converts rawYaml into JS object with sources titles used as keys + * + * @param {string} rawYaml + * @returns {Object} - return object with titles in the keys and RedirectSources + * in the values + */ + constructor(rawYaml) { + try { + var arrOfRedirects = jsYaml$1.safeLoad(rawYaml); + this.redirects = arrOfRedirects.reduce(function (acc, redirect) { + return _objectSpread(_objectSpread({}, acc), {}, { + [redirect.title]: redirect + }); + }, {}); + } catch (e) { + // eslint-disable-next-line no-console + console.log("Was unable to load YAML into JS due to: ".concat(e.message)); + throw e; + } + } -/***/ }), + /** + * Returns redirect source object + * + * @param {string} title + * @returns {Redirect|undefined} Found redirect source object, or `undefined` if not found. + */ + getRedirect(title) { + var _this = this; + if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { + return this.redirects[title]; + } -/***/ 9639: -/***/ (function(module, exports, __webpack_require__) { - -/* module decorator */ module = __webpack_require__.nmd(module); -var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.3.2 by @mathias */ -;(function(root) { - - /** Detect free variables */ - var freeExports = true && exports && - !exports.nodeType && exports; - var freeModule = true && module && - !module.nodeType && module; - var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g; - if ( - freeGlobal.global === freeGlobal || - freeGlobal.window === freeGlobal || - freeGlobal.self === freeGlobal - ) { - root = freeGlobal; - } + // look title among aliases + var values = Object.keys(this.redirects).map(function (key) { + return _this.redirects[key]; + }); + return values.find(function (redirect) { + var aliases = redirect.aliases; + if (!aliases) { + return false; + } + return aliases.includes(title); + }); + } - /** - * The `punycode` object. - * @name punycode - * @type Object - */ - var punycode, - - /** Highest positive signed 32-bit float value */ - maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 - - /** Bootstring parameters */ - base = 36, - tMin = 1, - tMax = 26, - skew = 38, - damp = 700, - initialBias = 72, - initialN = 128, // 0x80 - delimiter = '-', // '\x2D' - - /** Regular expressions */ - regexPunycode = /^xn--/, - regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars - regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators - - /** Error messages */ - errors = { - 'overflow': 'Overflow: input needs wider integers to process', - 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', - 'invalid-input': 'Invalid input' - }, - - /** Convenience shortcuts */ - baseMinusTMin = base - tMin, - floor = Math.floor, - stringFromCharCode = String.fromCharCode, - - /** Temporary variable */ - key; - - /*--------------------------------------------------------------------------*/ - - /** - * A generic error utility function. - * @private - * @param {String} type The error type. - * @returns {Error} Throws a `RangeError` with the applicable error message. - */ - function error(type) { - throw RangeError(errors[type]); - } + /** + * Checks if redirect is blocking like click2load.html + * + * @param {string} title Title of the redirect. + * @returns {boolean} True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ + isBlocking(title) { + var redirect = this.redirects[title]; + if (redirect) { + return !!redirect.isBlocking; + } + return false; + } + } - /** - * A generic `Array#map` utility function. - * @private - * @param {Array} array The array to iterate over. - * @param {Function} callback The function that gets called for every array - * item. - * @returns {Array} A new array of values returned by the callback function. - */ - function map(array, fn) { - var length = array.length; - var result = []; - while (length--) { - result[length] = fn(array[length]); - } - return result; - } + var redirectsMap = { + "1x1-transparent.gif": "1x1-transparent.gif", + "1x1.gif": "1x1-transparent.gif", + "1x1-transparent-gif": "1x1-transparent.gif", + "2x2-transparent.png": "2x2-transparent.png", + "2x2.png": "2x2-transparent.png", + "2x2-transparent-png": "2x2-transparent.png", + "3x2-transparent.png": "3x2-transparent.png", + "3x2.png": "3x2-transparent.png", + "3x2-transparent-png": "3x2-transparent.png", + "32x32-transparent.png": "32x32-transparent.png", + "32x32.png": "32x32-transparent.png", + "32x32-transparent-png": "32x32-transparent.png", + noopframe: "noopframe.html", + "noop.html": "noopframe.html", + "blank-html": "noopframe.html", + noopcss: "noopcss.css", + "noop.css": "noopcss.css", + "blank-css": "noopcss.css", + noopjs: "noopjs.js", + "noop.js": "noopjs.js", + "blank-js": "noopjs.js", + noopjson: "noopjson.json", + nooptext: "nooptext.js", + "noop.txt": "nooptext.js", + "blank-text": "nooptext.js", + empty: "nooptext.js", + "noopvmap-1.0": "noopvmap01.xml", + "noop-vmap1.0.xml": "noopvmap01.xml", + "noopvast-2.0": "noopvast02.xml", + "noopvast-3.0": "noopvast03.xml", + "noopvast-4.0": "noopvast04.xml", + "noopmp3-0.1s": "noopmp3.mp3", + "blank-mp3": "noopmp3.mp3", + "noopmp4-1s": "noopmp4.mp4", + "noop-1s.mp4": "noopmp4.mp4", + "blank-mp4": "noopmp4.mp4", + "click2load.html": "click2load.html", + "ubo-click2load.html": "click2load.html", + "amazon-apstag": "amazon-apstag.js", + "ubo-amazon_apstag.js": "amazon-apstag.js", + "amazon_apstag.js": "amazon-apstag.js", + "ati-smarttag": "ati-smarttag.js", + "didomi-loader": "didomi-loader.js", + fingerprintjs2: "fingerprintjs2.js", + "ubo-fingerprint2.js": "fingerprintjs2.js", + "fingerprint2.js": "fingerprintjs2.js", + fingerprintjs3: "fingerprintjs3.js", + "ubo-fingerprint3.js": "fingerprintjs3.js", + "fingerprint3.js": "fingerprintjs3.js", + gemius: "gemius.js", + "google-analytics-ga": "google-analytics-ga.js", + "ubo-google-analytics_ga.js": "google-analytics-ga.js", + "google-analytics_ga.js": "google-analytics-ga.js", + "google-analytics": "google-analytics.js", + "ubo-google-analytics_analytics.js": "google-analytics.js", + "google-analytics_analytics.js": "google-analytics.js", + "googletagmanager-gtm": "google-analytics.js", + "ubo-googletagmanager_gtm.js": "google-analytics.js", + "googletagmanager_gtm.js": "google-analytics.js", + "google-ima3": "google-ima3.js", + "ubo-google-ima.js": "google-ima3.js", + "google-ima.js": "google-ima3.js", + "googlesyndication-adsbygoogle": "googlesyndication-adsbygoogle.js", + "ubo-googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", + "googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", + "googletagservices-gpt": "googletagservices-gpt.js", + "ubo-googletagservices_gpt.js": "googletagservices-gpt.js", + "googletagservices_gpt.js": "googletagservices-gpt.js", + matomo: "matomo.js", + "metrika-yandex-tag": "metrika-yandex-tag.js", + "metrika-yandex-watch": "metrika-yandex-watch.js", + "naver-wcslog": "naver-wcslog.js", + noeval: "noeval.js", + "noeval.js": "noeval.js", + "silent-noeval.js": "noeval.js", + "ubo-noeval.js": "noeval.js", + "ubo-silent-noeval.js": "noeval.js", + "ubo-noeval": "noeval.js", + "ubo-silent-noeval": "noeval.js", + "pardot-1.0": "pardot-1.0.js", + "prebid-ads": "prebid-ads.js", + "ubo-prebid-ads.js": "prebid-ads.js", + "prebid-ads.js": "prebid-ads.js", + prebid: "prebid.js", + "prevent-bab": "prevent-bab.js", + "nobab.js": "prevent-bab.js", + "ubo-nobab.js": "prevent-bab.js", + "bab-defuser.js": "prevent-bab.js", + "ubo-bab-defuser.js": "prevent-bab.js", + "ubo-nobab": "prevent-bab.js", + "ubo-bab-defuser": "prevent-bab.js", + "prevent-bab2": "prevent-bab2.js", + "nobab2.js": "prevent-bab2.js", + "prevent-fab-3.2.0": "prevent-fab-3.2.0.js", + "nofab.js": "prevent-fab-3.2.0.js", + "ubo-nofab.js": "prevent-fab-3.2.0.js", + "fuckadblock.js-3.2.0": "prevent-fab-3.2.0.js", + "ubo-fuckadblock.js-3.2.0": "prevent-fab-3.2.0.js", + "ubo-nofab": "prevent-fab-3.2.0.js", + "prevent-popads-net": "prevent-popads-net.js", + "popads.net.js": "prevent-popads-net.js", + "ubo-popads.net.js": "prevent-popads-net.js", + "ubo-popads.net": "prevent-popads-net.js", + "scorecardresearch-beacon": "scorecardresearch-beacon.js", + "ubo-scorecardresearch_beacon.js": "scorecardresearch-beacon.js", + "scorecardresearch_beacon.js": "scorecardresearch-beacon.js", + "set-popads-dummy": "set-popads-dummy.js", + "popads-dummy.js": "set-popads-dummy.js", + "ubo-popads-dummy.js": "set-popads-dummy.js", + "ubo-popads-dummy": "set-popads-dummy.js" + }; - /** - * A simple `Array#map`-like wrapper to work with domain name strings or email - * addresses. - * @private - * @param {String} domain The domain name or email address. - * @param {Function} callback The function that gets called for every - * character. - * @returns {Array} A new string of characters returned by the callback - * function. - */ - function mapDomain(string, fn) { - var parts = string.split('@'); - var result = ''; - if (parts.length > 1) { - // In email addresses, only the domain name should be punycoded. Leave - // the local part (i.e. everything up to `@`) intact. - result = parts[0] + '@'; - string = parts[1]; - } - // Avoid `split(regex)` for IE8 compatibility. See #17. - string = string.replace(regexSeparators, '\x2E'); - var labels = string.split('.'); - var encoded = map(labels, fn).join('.'); - return result + encoded; - } + /** + * Finds redirect resource by it's name + * + * @param {string} name - redirect name + * @returns {Function} + */ + var getRedirectByName = function getRedirectByName(name) { + var redirects = Object.keys(redirectsList).map(function (key) { + return redirectsList[key]; + }); + return redirects.find(function (r) { + return r.names && r.names.includes(name); + }); + }; - /** - * Creates an array containing the numeric code points of each Unicode - * character in the string. While JavaScript uses UCS-2 internally, - * this function will convert a pair of surrogate halves (each of which - * UCS-2 exposes as separate characters) into a single code point, - * matching UTF-16. - * @see `punycode.ucs2.encode` - * @see - * @memberOf punycode.ucs2 - * @name decode - * @param {String} string The Unicode input string (UCS-2). - * @returns {Array} The new array of code points. - */ - function ucs2decode(string) { - var output = [], - counter = 0, - length = string.length, - value, - extra; - while (counter < length) { - value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // high surrogate, and there is a next character - extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { // low surrogate - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // unmatched surrogate; only append this code unit, in case the next - // code unit is the high surrogate of a surrogate pair - output.push(value); - counter--; - } - } else { - output.push(value); - } - } - return output; - } + /** + * @typedef {object} Source - redirect properties + * @property {string} name redirect name + * @property {Array} args Arguments for redirect function + * @property {'extension'|'test'} [engine] - + * Defines the final form of redirect string presentation + * @property {boolean} [verbose] flag to enable printing to console debug information + */ - /** - * Creates a string based on an array of numeric code points. - * @see `punycode.ucs2.decode` - * @memberOf punycode.ucs2 - * @name encode - * @param {Array} codePoints The array of numeric code points. - * @returns {String} The new Unicode string (UCS-2). - */ - function ucs2encode(array) { - return map(array, function(value) { - var output = ''; - if (value > 0xFFFF) { - value -= 0x10000; - output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); - value = 0xDC00 | value & 0x3FF; - } - output += stringFromCharCode(value); - return output; - }).join(''); - } + /** + * Returns redirect code by param + * + * @param {Source} source + * @returns {string} redirect code + */ + var getRedirectCode = function getRedirectCode(source) { + var redirect = getRedirectByName(source.name); + var result = attachDependencies(redirect); + result = addCall(redirect, result); - /** - * Converts a basic code point into a digit/integer. - * @see `digitToBasic()` - * @private - * @param {Number} codePoint The basic numeric code point value. - * @returns {Number} The numeric value of a basic code point (for use in - * representing integers) in the range `0` to `base - 1`, or `base` if - * the code point does not represent a value. - */ - function basicToDigit(codePoint) { - if (codePoint - 48 < 10) { - return codePoint - 22; - } - if (codePoint - 65 < 26) { - return codePoint - 65; - } - if (codePoint - 97 < 26) { - return codePoint - 97; - } - return base; - } + // redirect code for different sources is checked in tests + // so it should be just a code without any source and props passed + result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true); + return result; + }; + var getRedirectFilename = function getRedirectFilename(name) { + return redirectsMap[name]; + }; + var redirects = { + Redirects, + getRedirectFilename, + getCode: getRedirectCode, + isAdgRedirectRule: validator.isAdgRedirectRule, + isValidAdgRedirectRule: validator.isValidAdgRedirectRule, + isAdgRedirectCompatibleWithUbo: validator.isAdgRedirectCompatibleWithUbo, + isUboRedirectCompatibleWithAdg: validator.isUboRedirectCompatibleWithAdg, + isAbpRedirectCompatibleWithAdg: validator.isAbpRedirectCompatibleWithAdg, + convertUboRedirectToAdg, + convertAbpRedirectToAdg, + convertRedirectToAdg, + convertRedirectNameToAdg, + convertAdgRedirectToUbo + }; - /** - * Converts a digit/integer into a basic code point. - * @see `basicToDigit()` - * @private - * @param {Number} digit The numeric value of a basic code point. - * @returns {Number} The basic code point whose value (when used for - * representing integers) is `digit`, which needs to be in the range - * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is - * used; else, the lowercase form is used. The behavior is undefined - * if `flag` is non-zero and `digit` has no uppercase form. - */ - function digitToBasic(digit, flag) { - // 0..25 map to ASCII a..z or A..Z - // 26..35 map to ASCII 0..9 - return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); - } - - /** - * Bias adaptation function as per section 3.4 of RFC 3492. - * http://tools.ietf.org/html/rfc3492#section-3.4 - * @private - */ - function adapt(delta, numPoints, firstTime) { - var k = 0; - delta = firstTime ? floor(delta / damp) : delta >> 1; - delta += floor(delta / numPoints); - for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { - delta = floor(delta / baseMinusTMin); - } - return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); - } - - /** - * Converts a Punycode string of ASCII-only symbols to a string of Unicode - * symbols. - * @memberOf punycode - * @param {String} input The Punycode string of ASCII-only symbols. - * @returns {String} The resulting string of Unicode symbols. - */ - function decode(input) { - // Don't use UCS-2 - var output = [], - inputLength = input.length, - out, - i = 0, - n = initialN, - bias = initialBias, - basic, - j, - index, - oldi, - w, - k, - digit, - t, - /** Cached calculation results */ - baseMinusT; - - // Handle the basic code points: let `basic` be the number of input code - // points before the last delimiter, or `0` if there is none, then copy - // the first basic code points to the output. - - basic = input.lastIndexOf(delimiter); - if (basic < 0) { - basic = 0; - } - - for (j = 0; j < basic; ++j) { - // if it's not a basic code point - if (input.charCodeAt(j) >= 0x80) { - error('not-basic'); - } - output.push(input.charCodeAt(j)); - } - - // Main decoding loop: start just after the last delimiter if any basic code - // points were copied; start at the beginning otherwise. - - for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { - - // `index` is the index of the next character to be consumed. - // Decode a generalized variable-length integer into `delta`, - // which gets added to `i`. The overflow checking is easier - // if we increase `i` as we go, then subtract off its starting - // value at the end to obtain `delta`. - for (oldi = i, w = 1, k = base; /* no condition */; k += base) { - - if (index >= inputLength) { - error('invalid-input'); - } - - digit = basicToDigit(input.charCodeAt(index++)); - - if (digit >= base || digit > floor((maxInt - i) / w)) { - error('overflow'); - } - - i += digit * w; - t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - - if (digit < t) { - break; - } - - baseMinusT = base - t; - if (w > floor(maxInt / baseMinusT)) { - error('overflow'); - } - - w *= baseMinusT; - - } - - out = output.length + 1; - bias = adapt(i - oldi, out, oldi == 0); - - // `i` was supposed to wrap around from `out` to `0`, - // incrementing `n` each time, so we'll fix that now: - if (floor(i / out) > maxInt - n) { - error('overflow'); - } - - n += floor(i / out); - i %= out; - - // Insert `n` at position `i` of the output - output.splice(i++, 0, n); - - } - - return ucs2encode(output); - } - - /** - * Converts a string of Unicode symbols (e.g. a domain name label) to a - * Punycode string of ASCII-only symbols. - * @memberOf punycode - * @param {String} input The string of Unicode symbols. - * @returns {String} The resulting Punycode string of ASCII-only symbols. - */ - function encode(input) { - var n, - delta, - handledCPCount, - basicLength, - bias, - j, - m, - q, - k, - t, - currentValue, - output = [], - /** `inputLength` will hold the number of code points in `input`. */ - inputLength, - /** Cached calculation results */ - handledCPCountPlusOne, - baseMinusT, - qMinusT; - - // Convert the input in UCS-2 to Unicode - input = ucs2decode(input); - - // Cache the length - inputLength = input.length; - - // Initialize the state - n = initialN; - delta = 0; - bias = initialBias; - - // Handle the basic code points - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue < 0x80) { - output.push(stringFromCharCode(currentValue)); - } - } - - handledCPCount = basicLength = output.length; - - // `handledCPCount` is the number of code points that have been handled; - // `basicLength` is the number of basic code points. - - // Finish the basic string - if it is not empty - with a delimiter - if (basicLength) { - output.push(delimiter); - } - - // Main encoding loop: - while (handledCPCount < inputLength) { - - // All non-basic code points < n have been handled already. Find the next - // larger one: - for (m = maxInt, j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue >= n && currentValue < m) { - m = currentValue; - } - } - - // Increase `delta` enough to advance the decoder's state to , - // but guard against overflow - handledCPCountPlusOne = handledCPCount + 1; - if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { - error('overflow'); - } - - delta += (m - n) * handledCPCountPlusOne; - n = m; - - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - - if (currentValue < n && ++delta > maxInt) { - error('overflow'); - } - - if (currentValue == n) { - // Represent delta as a generalized variable-length integer - for (q = delta, k = base; /* no condition */; k += base) { - t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - if (q < t) { - break; - } - qMinusT = q - t; - baseMinusT = base - t; - output.push( - stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) - ); - q = floor(qMinusT / baseMinusT); - } - - output.push(stringFromCharCode(digitToBasic(q, 0))); - bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); - delta = 0; - ++handledCPCount; - } - } - - ++delta; - ++n; - - } - return output.join(''); - } - - /** - * Converts a Punycode string representing a domain name or an email address - * to Unicode. Only the Punycoded parts of the input will be converted, i.e. - * it doesn't matter if you call it on a string that has already been - * converted to Unicode. - * @memberOf punycode - * @param {String} input The Punycoded domain name or email address to - * convert to Unicode. - * @returns {String} The Unicode representation of the given Punycode - * string. - */ - function toUnicode(input) { - return mapDomain(input, function(string) { - return regexPunycode.test(string) - ? decode(string.slice(4).toLowerCase()) - : string; - }); - } - - /** - * Converts a Unicode string representing a domain name or an email address to - * Punycode. Only the non-ASCII parts of the domain name will be converted, - * i.e. it doesn't matter if you call it with a domain that's already in - * ASCII. - * @memberOf punycode - * @param {String} input The domain name or email address to convert, as a - * Unicode string. - * @returns {String} The Punycode representation of the given domain name or - * email address. - */ - function toASCII(input) { - return mapDomain(input, function(string) { - return regexNonASCII.test(string) - ? 'xn--' + encode(string) - : string; - }); - } - - /*--------------------------------------------------------------------------*/ - - /** Define the public API */ - punycode = { - /** - * A string representing the current Punycode.js version number. - * @memberOf punycode - * @type String - */ - 'version': '1.3.2', - /** - * An object of methods to convert from JavaScript's internal character - * representation (UCS-2) to Unicode code points, and back. - * @see - * @memberOf punycode - * @type Object - */ - 'ucs2': { - 'decode': ucs2decode, - 'encode': ucs2encode - }, - 'decode': decode, - 'encode': encode, - 'toASCII': toASCII, - 'toUnicode': toUnicode - }; - - /** Expose `punycode` */ - // Some AMD build optimizers, like r.js, check for specific condition patterns - // like the following: - if ( - true - ) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { - return punycode; - }).call(exports, __webpack_require__, exports, module), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else {} - -}(this)); - - -/***/ }), - -/***/ 883: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; -var __webpack_unused_export__; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -var punycode = __webpack_require__(9639); -var util = __webpack_require__(5225); - -__webpack_unused_export__ = urlParse; -__webpack_unused_export__ = urlResolve; -__webpack_unused_export__ = urlResolveObject; -__webpack_unused_export__ = urlFormat; - -__webpack_unused_export__ = Url; - -function Url() { - this.protocol = null; - this.slashes = null; - this.auth = null; - this.host = null; - this.port = null; - this.hostname = null; - this.hash = null; - this.search = null; - this.query = null; - this.pathname = null; - this.path = null; - this.href = null; -} - -// Reference: RFC 3986, RFC 1808, RFC 2396 - -// define these here so at least they only have to be -// compiled once on the first module load. -var protocolPattern = /^([a-z0-9.+-]+:)/i, - portPattern = /:[0-9]*$/, - - // Special case for a simple path URL - simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, - - // RFC 2396: characters reserved for delimiting URLs. - // We actually just auto-escape these. - delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], - - // RFC 2396: characters not allowed for various reasons. - unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), - - // Allowed by RFCs, but cause of XSS attacks. Always escape these. - autoEscape = ['\''].concat(unwise), - // Characters that are never ever allowed in a hostname. - // Note that any invalid chars are also handled, but these - // are the ones that are *expected* to be seen, so we fast-path - // them. - nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), - hostEndingChars = ['/', '?', '#'], - hostnameMaxLen = 255, - hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, - hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, - // protocols that can allow "unsafe" and "unwise" chars. - unsafeProtocol = { - 'javascript': true, - 'javascript:': true - }, - // protocols that never have a hostname. - hostlessProtocol = { - 'javascript': true, - 'javascript:': true - }, - // protocols that always contain a // bit. - slashedProtocol = { - 'http': true, - 'https': true, - 'ftp': true, - 'gopher': true, - 'file': true, - 'http:': true, - 'https:': true, - 'ftp:': true, - 'gopher:': true, - 'file:': true - }, - querystring = __webpack_require__(6642); - -function urlParse(url, parseQueryString, slashesDenoteHost) { - if (url && util.isObject(url) && url instanceof Url) return url; - - var u = new Url; - u.parse(url, parseQueryString, slashesDenoteHost); - return u; -} - -Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { - if (!util.isString(url)) { - throw new TypeError("Parameter 'url' must be a string, not " + typeof url); - } - - // Copy chrome, IE, opera backslash-handling behavior. - // Back slashes before the query string get converted to forward slashes - // See: https://code.google.com/p/chromium/issues/detail?id=25916 - var queryIndex = url.indexOf('?'), - splitter = - (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', - uSplit = url.split(splitter), - slashRegex = /\\/g; - uSplit[0] = uSplit[0].replace(slashRegex, '/'); - url = uSplit.join(splitter); - - var rest = url; - - // trim before proceeding. - // This is to support parse stuff like " http://foo.com \n" - rest = rest.trim(); - - if (!slashesDenoteHost && url.split('#').length === 1) { - // Try fast path regexp - var simplePath = simplePathPattern.exec(rest); - if (simplePath) { - this.path = rest; - this.href = rest; - this.pathname = simplePath[1]; - if (simplePath[2]) { - this.search = simplePath[2]; - if (parseQueryString) { - this.query = querystring.parse(this.search.substr(1)); + function abortCurrentInlineScript(source, args) { + function abortCurrentInlineScript(source, property, search) { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var SRC_DATA_MARKER = "data:text/javascript;base64,"; + var getCurrentScript = function getCurrentScript() { + if ("currentScript" in document) { + return document.currentScript; + } + var scripts = document.getElementsByTagName("script"); + return scripts[scripts.length - 1]; + }; + var ourScript = getCurrentScript(); + var abort = function abort() { + var _scriptEl$src; + var scriptEl = getCurrentScript(); + if (!scriptEl) { + return; + } + var content = scriptEl.textContent; + try { + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; + content = textContentGetter.call(scriptEl); + } catch (e) {} + if (content.length === 0 && typeof scriptEl.src !== "undefined" && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) { + var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); + content = window.atob(encodedContent); + } + if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { + hit(source); + throw new ReferenceError(rid); + } + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (base instanceof Object === false && base === null) { + var props = property.split("."); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + logMessage(source, message); + return; + } + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + var currentValue = base[prop]; + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { + currentValue = base[prop]; + origDescriptor = undefined; + } + var descriptorWrapper = Object.assign(getDescriptorAddon(), { + currentValue: currentValue, + get() { + if (!this.isAbortingSuspended) { + this.isolateCallback(abort); + } + if (origDescriptor instanceof Object) { + return origDescriptor.get.call(base); + } + return this.currentValue; + }, + set(newValue) { + if (!this.isAbortingSuspended) { + this.isolateCallback(abort); + } + if (origDescriptor instanceof Object) { + origDescriptor.set.call(base, newValue); + } else { + this.currentValue = newValue; + } + } + }); + setPropertyAccess(base, prop, { + get() { + return descriptorWrapper.get.call(descriptorWrapper); + }, + set(newValue) { + descriptorWrapper.set.call(descriptorWrapper, newValue); + } + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function getDescriptorAddon() { + return { + isAbortingSuspended: false, + isolateCallback(cb) { + this.isAbortingSuspended = true; + try { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + var result = cb(...args); + this.isAbortingSuspended = false; + return result; + } catch (_unused) { + var rid = randomId(); + this.isAbortingSuspended = false; + throw new ReferenceError(rid); + } + } + }; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + abortCurrentInlineScript.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function abortOnPropertyRead(source, args) { + function abortOnPropertyRead(source, property) { + if (!property) { + return; + } + var rid = randomId(); + var abort = function abort() { + hit(source); + throw new ReferenceError(rid); + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + setPropertyAccess(base, prop, { + get: abort, + set: function set() {} + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + abortOnPropertyRead.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function abortOnPropertyWrite(source, args) { + function abortOnPropertyWrite(source, property) { + if (!property) { + return; + } + var rid = randomId(); + var abort = function abort() { + hit(source); + throw new ReferenceError(rid); + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + setPropertyAccess(base, prop, { + set: abort + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + abortOnPropertyWrite.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function abortOnStackTrace(source, args) { + function abortOnStackTrace(source, property, stack) { + if (!property || !stack) { + return; + } + var rid = randomId(); + var abort = function abort() { + hit(source); + throw new ReferenceError(rid); + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { + logMessage(source, "Invalid parameter: ".concat(stack)); + return; + } + var descriptorWrapper = Object.assign(getDescriptorAddon(), { + value: base[prop], + get() { + if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { + abort(); + } + return this.value; + }, + set(newValue) { + if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { + abort(); + } + this.value = newValue; + } + }); + setPropertyAccess(base, prop, { + get() { + return descriptorWrapper.get.call(descriptorWrapper); + }, + set(newValue) { + descriptorWrapper.set.call(descriptorWrapper, newValue); + } + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + } + function getDescriptorAddon() { + return { + isAbortingSuspended: false, + isolateCallback(cb) { + this.isAbortingSuspended = true; + try { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + var result = cb(...args); + this.isAbortingSuspended = false; + return result; + } catch (_unused) { + var rid = randomId(); + this.isAbortingSuspended = false; + throw new ReferenceError(rid); + } + } + }; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); + } + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + abortOnStackTrace.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function adjustSetInterval(source, args) { + function adjustSetInterval(source, matchCallback, matchDelay, boost) { + var nativeSetInterval = window.setInterval; + var matchRegexp = toRegExp(matchCallback); + var intervalWrapper = function intervalWrapper(callback, delay) { + if (!isValidCallback(callback)) { + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + logMessage(source, message); + } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { + delay *= getBoostMultiplier(boost); + hit(source); + } + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + return nativeSetInterval.apply(window, [callback, delay, ...args]); + }; + window.setInterval = intervalWrapper; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function isValidCallback(callback) { + return callback instanceof Function || typeof callback === "string"; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function getBoostMultiplier(boost) { + var DEFAULT_MULTIPLIER = .05; + var MIN_MULTIPLIER = .001; + var MAX_MULTIPLIER = 50; + var parsedBoost = parseFloat(boost); + var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; + if (boostMultiplier < MIN_MULTIPLIER) { + boostMultiplier = MIN_MULTIPLIER; + } + if (boostMultiplier > MAX_MULTIPLIER) { + boostMultiplier = MAX_MULTIPLIER; + } + return boostMultiplier; + } + function isDelayMatched(inputDelay, realDelay) { + return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function nativeIsFinite(num) { + var native = Number.isFinite || window.isFinite; + return native(num); + } + function getMatchDelay(delay) { + var DEFAULT_DELAY = 1e3; + var parsedDelay = parseInt(delay, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; + return delayMatch; + } + function shouldMatchAnyDelay(delay) { + return delay === "*"; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + adjustSetInterval.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function adjustSetTimeout(source, args) { + function adjustSetTimeout(source, matchCallback, matchDelay, boost) { + var nativeSetTimeout = window.setTimeout; + var matchRegexp = toRegExp(matchCallback); + var timeoutWrapper = function timeoutWrapper(callback, delay) { + if (!isValidCallback(callback)) { + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + logMessage(source, message); + } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { + delay *= getBoostMultiplier(boost); + hit(source); + } + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + return nativeSetTimeout.apply(window, [callback, delay, ...args]); + }; + window.setTimeout = timeoutWrapper; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function isValidCallback(callback) { + return callback instanceof Function || typeof callback === "string"; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function getBoostMultiplier(boost) { + var DEFAULT_MULTIPLIER = .05; + var MIN_MULTIPLIER = .001; + var MAX_MULTIPLIER = 50; + var parsedBoost = parseFloat(boost); + var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; + if (boostMultiplier < MIN_MULTIPLIER) { + boostMultiplier = MIN_MULTIPLIER; + } + if (boostMultiplier > MAX_MULTIPLIER) { + boostMultiplier = MAX_MULTIPLIER; + } + return boostMultiplier; + } + function isDelayMatched(inputDelay, realDelay) { + return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function nativeIsFinite(num) { + var native = Number.isFinite || window.isFinite; + return native(num); + } + function getMatchDelay(delay) { + var DEFAULT_DELAY = 1e3; + var parsedDelay = parseInt(delay, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; + return delayMatch; + } + function shouldMatchAnyDelay(delay) { + return delay === "*"; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + adjustSetTimeout.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function debugCurrentInlineScript(source, args) { + function debugCurrentInlineScript(source, property, search) { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var getCurrentScript = function getCurrentScript() { + if ("currentScript" in document) { + return document.currentScript; + } + var scripts = document.getElementsByTagName("script"); + return scripts[scripts.length - 1]; + }; + var ourScript = getCurrentScript(); + var abort = function abort() { + var scriptEl = getCurrentScript(); + if (!scriptEl) { + return; + } + var content = scriptEl.textContent; + try { + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; + content = textContentGetter.call(scriptEl); + } catch (e) {} + if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { + hit(source); + debugger; + } + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (base instanceof Object === false && base === null) { + var props = property.split("."); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + logMessage(message, source.verbose); + return; + } + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + var currentValue = base[prop]; + setPropertyAccess(base, prop, { + set: function set(value) { + abort(); + currentValue = value; + }, + get: function get() { + abort(); + return currentValue; + } + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + debugCurrentInlineScript.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function debugOnPropertyRead(source, args) { + function debugOnPropertyRead(source, property) { + if (!property) { + return; + } + var rid = randomId(); + var abort = function abort() { + hit(source); + debugger; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + setPropertyAccess(base, prop, { + get: abort, + set: noopFunc + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function noopFunc() {} + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + debugOnPropertyRead.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function debugOnPropertyWrite(source, args) { + function debugOnPropertyWrite(source, property) { + if (!property) { + return; + } + var rid = randomId(); + var abort = function abort() { + hit(source); + debugger; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + setPropertyAccess(base, prop, { + set: abort + }); + }; + setChainPropAccess(window, property); + window.onerror = createOnErrorHandler(rid).bind(); + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + debugOnPropertyWrite.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function dirString(source, args) { + function dirString(source, times) { + var _console = console, + dir = _console.dir; + function dirWrapper(object) { + if (typeof dir === "function") { + dir.call(this, object); + } + hit(source); + } + console.dir = dirWrapper; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + dirString.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function disableNewtabLinks(source, args) { + function disableNewtabLinks(source) { + document.addEventListener("click", function (ev) { + var target = ev.target; + while (target !== null) { + if (target.localName === "a" && target.hasAttribute("target")) { + ev.stopPropagation(); + ev.preventDefault(); + hit(source); + break; + } + target = target.parentNode; + } + }); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + disableNewtabLinks.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function evalDataPrune(source, args) { + function evalDataPrune(source, propsToRemove, requiredInitialProps, stack) { + if (!!stack && !matchStackTrace(stack, new Error().stack)) { + return; + } + var prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; + var evalWrapper = function evalWrapper(target, thisArg, args) { + var data = Reflect.apply(target, thisArg, args); + if (typeof data === "object") { + data = jsonPruner(source, data, prunePaths, requiredPaths); + } + return data; + }; + var evalHandler = { + apply: evalWrapper + }; + window.eval = new Proxy(window.eval, evalHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + } + function getWildcardPropertyInChain(base, chain) { + var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + var pos = chain.indexOf("."); + if (pos === -1) { + if (chain === "*" || chain === "[]") { + for (var key in base) { + if (Object.prototype.hasOwnProperty.call(base, key)) { + output.push({ + base: base, + prop: key + }); + } + } + } else { + output.push({ + base: base, + prop: chain + }); + } + return output; + } + var prop = chain.slice(0, pos); + var shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; + if (shouldLookThrough) { + var nextProp = chain.slice(pos + 1); + var baseKeys = Object.keys(base); + baseKeys.forEach(function (key) { + var item = base[key]; + getWildcardPropertyInChain(item, nextProp, lookThrough, output); + }); + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if (nextBase !== undefined) { + getWildcardPropertyInChain(nextBase, chain, lookThrough, output); + } + return output; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isPruningNeeded(source, root, prunePaths, requiredPaths) { + if (!root) { + return false; + } + var shouldProcess; + if (prunePaths.length === 0 && requiredPaths.length > 0) { + var rootString = JSON.stringify(root); + var matchRegex = toRegExp(requiredPaths.join("")); + var shouldLog = matchRegex.test(rootString); + if (shouldLog) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + shouldProcess = false; + return shouldProcess; + } + } + var wildcardSymbols = [".*.", "*.", ".*", ".[].", "[].", ".[]"]; + var _loop = function _loop() { + var requiredPath = requiredPaths[i]; + var lastNestedPropName = requiredPath.split(".").pop(); + var hasWildcard = wildcardSymbols.some(function (symbol) { + return requiredPath.includes(symbol); + }); + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + shouldProcess = !hasWildcard; + for (var j = 0; j < details.length; j += 1) { + var hasRequiredProp = typeof lastNestedPropName === "string" && details[j].base[lastNestedPropName] !== undefined; + if (hasWildcard) { + shouldProcess = hasRequiredProp || shouldProcess; + } else { + shouldProcess = hasRequiredProp && shouldProcess; + } + } + }; + for (var i = 0; i < requiredPaths.length; i += 1) { + _loop(); + } + return shouldProcess; + } + function jsonPruner(source, root, prunePaths, requiredPaths) { + if (prunePaths.length === 0 && requiredPaths.length === 0) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + return root; + } + try { + if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) { + return root; + } + prunePaths.forEach(function (path) { + var ownerObjArr = getWildcardPropertyInChain(root, path, true); + ownerObjArr.forEach(function (ownerObj) { + if (ownerObj !== undefined && ownerObj.base) { + delete ownerObj.base[ownerObj.prop]; + hit(source); + } + }); + }); + } catch (e) { + logMessage(source, e); + } + return root; + } + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); + } + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + evalDataPrune.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function forceWindowClose(source, args) { + function forceWindowClose(source) { + var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + if (typeof window.close !== "function") { + var message = "window.close() is not a function so 'close-window' scriptlet is unavailable"; + logMessage(source, message); + return; + } + var closeImmediately = function closeImmediately() { + try { + hit(source); + window.close(); + } catch (e) { + logMessage(source, e); + } + }; + var closeByExtension = function closeByExtension() { + var extCall = function extCall() { + dispatchEvent(new Event("adguard:scriptlet-close-window")); + }; + window.addEventListener("adguard:subscribed-to-close-window", extCall, { + once: true + }); + setTimeout(function () { + window.removeEventListener("adguard:subscribed-to-close-window", extCall, { + once: true + }); + }, 5e3); + }; + var shouldClose = function shouldClose() { + if (path === "") { + return true; + } + var pathRegexp = toRegExp(path); + var currentPath = "".concat(window.location.pathname).concat(window.location.search); + return pathRegexp.test(currentPath); + }; + if (shouldClose()) { + closeImmediately(); + if (navigator.userAgent.includes("Chrome")) { + closeByExtension(); + } + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + forceWindowClose.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function hideInShadowDom(source, args) { + function hideInShadowDom(source, selector, baseSelector) { + if (!Element.prototype.attachShadow) { + return; + } + var hideElement = function hideElement(targetElement) { + var DISPLAY_NONE_CSS = "display:none!important;"; + targetElement.style.cssText = DISPLAY_NONE_CSS; + }; + var hideHandler = function hideHandler() { + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + var _loop = function _loop() { + var isHidden = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; + targets.forEach(function (targetEl) { + hideElement(targetEl); + isHidden = true; + }); + if (isHidden) { + hit(source); + } + hostElements = innerHosts; + }; + while (hostElements.length !== 0) { + _loop(); + } + }; + hideHandler(); + observeDOMChanges(hideHandler, true); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); + } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + function callbackWrapper() { + disconnect(); + callback(); + connect(); + } + connect(); + } + function findHostElements(rootElement) { + var hosts = []; + if (rootElement) { + var domElems = rootElement.querySelectorAll("*"); + domElems.forEach(function (el) { + if (el.shadowRoot) { + hosts.push(el); + } + }); + } + return hosts; + } + function pierceShadowDom(selector, hostElements) { + var targets = []; + var innerHostsAcc = []; + hostElements.forEach(function (host) { + var simpleElems = host.querySelectorAll(selector); + targets = targets.concat([].slice.call(simpleElems)); + var shadowRootElem = host.shadowRoot; + var shadowChildren = shadowRootElem.querySelectorAll(selector); + targets = targets.concat([].slice.call(shadowChildren)); + innerHostsAcc.push(findHostElements(shadowRootElem)); + }); + var innerHosts = flatten(innerHostsAcc); + return { + targets: targets, + innerHosts: innerHosts + }; + } + function flatten(input) { + var stack = []; + input.forEach(function (el) { + return stack.push(el); + }); + var res = []; + while (stack.length) { + var next = stack.pop(); + if (Array.isArray(next)) { + next.forEach(function (el) { + return stack.push(el); + }); + } else { + res.push(next); + } + } + return res.reverse(); + } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + hideInShadowDom.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function injectCssInShadowDom(source, args) { + function injectCssInShadowDom(source, cssRule) { + var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + if (!Element.prototype.attachShadow || typeof Proxy === "undefined" || typeof Reflect === "undefined") { + return; + } + if (cssRule.match(/(url|image-set)\(.*\)/i)) { + logMessage(source, '"url()" function is not allowed for css rules'); + return; + } + var callback = function callback(shadowRoot) { + try { + var stylesheet = new CSSStyleSheet(); + try { + stylesheet.insertRule(cssRule); + } catch (e) { + logMessage(source, "Unable to apply the rule '".concat(cssRule, "' due to: \n'").concat(e.message, "'")); + return; + } + shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet]; + } catch (_unused) { + var styleTag = document.createElement("style"); + styleTag.innerText = cssRule; + shadowRoot.appendChild(styleTag); + } + hit(source); + }; + hijackAttachShadow(window, hostSelector, callback); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function hijackAttachShadow(context, hostSelector, callback) { + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var shadowRoot = Reflect.apply(target, thisArg, args); + if (thisArg && thisArg.matches(hostSelector || "*")) { + callback(shadowRoot); + } + return shadowRoot; + }; + var attachShadowHandler = { + apply: handlerWrapper + }; + context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + injectCssInShadowDom.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function jsonPrune(source, args) { + function jsonPrune(source, propsToRemove, requiredInitialProps, stack) { + if (!!stack && !matchStackTrace(stack, new Error().stack)) { + return; + } + var prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; + var nativeJSONParse = JSON.parse; + var jsonParseWrapper = function jsonParseWrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + var root = nativeJSONParse.apply(JSON, args); + return jsonPruner(source, root, prunePaths, requiredPaths); + }; + jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); + JSON.parse = jsonParseWrapper; + var nativeResponseJson = Response.prototype.json; + var responseJsonWrapper = function responseJsonWrapper() { + var promise = nativeResponseJson.apply(this); + return promise.then(function (obj) { + return jsonPruner(source, obj, prunePaths, requiredPaths); + }); + }; + if (typeof Response === "undefined") { + return; + } + Response.prototype.json = responseJsonWrapper; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + } + function getWildcardPropertyInChain(base, chain) { + var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + var pos = chain.indexOf("."); + if (pos === -1) { + if (chain === "*" || chain === "[]") { + for (var key in base) { + if (Object.prototype.hasOwnProperty.call(base, key)) { + output.push({ + base: base, + prop: key + }); + } + } + } else { + output.push({ + base: base, + prop: chain + }); + } + return output; + } + var prop = chain.slice(0, pos); + var shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; + if (shouldLookThrough) { + var nextProp = chain.slice(pos + 1); + var baseKeys = Object.keys(base); + baseKeys.forEach(function (key) { + var item = base[key]; + getWildcardPropertyInChain(item, nextProp, lookThrough, output); + }); + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if (nextBase !== undefined) { + getWildcardPropertyInChain(nextBase, chain, lookThrough, output); + } + return output; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function isPruningNeeded(source, root, prunePaths, requiredPaths) { + if (!root) { + return false; + } + var shouldProcess; + if (prunePaths.length === 0 && requiredPaths.length > 0) { + var rootString = JSON.stringify(root); + var matchRegex = toRegExp(requiredPaths.join("")); + var shouldLog = matchRegex.test(rootString); + if (shouldLog) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + shouldProcess = false; + return shouldProcess; + } + } + var wildcardSymbols = [".*.", "*.", ".*", ".[].", "[].", ".[]"]; + var _loop = function _loop() { + var requiredPath = requiredPaths[i]; + var lastNestedPropName = requiredPath.split(".").pop(); + var hasWildcard = wildcardSymbols.some(function (symbol) { + return requiredPath.includes(symbol); + }); + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + shouldProcess = !hasWildcard; + for (var j = 0; j < details.length; j += 1) { + var hasRequiredProp = typeof lastNestedPropName === "string" && details[j].base[lastNestedPropName] !== undefined; + if (hasWildcard) { + shouldProcess = hasRequiredProp || shouldProcess; + } else { + shouldProcess = hasRequiredProp && shouldProcess; + } + } + }; + for (var i = 0; i < requiredPaths.length; i += 1) { + _loop(); + } + return shouldProcess; + } + function jsonPruner(source, root, prunePaths, requiredPaths) { + if (prunePaths.length === 0 && requiredPaths.length === 0) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + return root; + } + try { + if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) { + return root; + } + prunePaths.forEach(function (path) { + var ownerObjArr = getWildcardPropertyInChain(root, path, true); + ownerObjArr.forEach(function (ownerObj) { + if (ownerObj !== undefined && ownerObj.base) { + delete ownerObj.base[ownerObj.prop]; + hit(source); + } + }); + }); + } catch (e) { + logMessage(source, e); + } + return root; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); + } + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + jsonPrune.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function log(source, args) { + function log() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + console.log(args); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + log.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function logAddEventListener(source, args) { + function logAddEventListener(source) { + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; + function addEventListenerWrapper(type, listener) { + var _this$constructor; + if (validateType(type) && validateListener(listener)) { + var message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); + logMessage(source, message, true); + hit(source); + } else { + var _message = "Invalid event type or listener passed to addEventListener:\n type: ".concat(convertTypeToString(type), "\n listener: ").concat(convertTypeToString(listener)); + logMessage(source, _message, true); + } + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + return nativeAddEventListener.apply(context, [type, listener, ...args]); + } + var descriptor = { + configurable: true, + set: function set() {}, + get: function get() { + return addEventListenerWrapper; + } + }; + Object.defineProperty(window.EventTarget.prototype, "addEventListener", descriptor); + Object.defineProperty(window, "addEventListener", descriptor); + Object.defineProperty(document, "addEventListener", descriptor); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function validateType(type) { + return typeof type !== "undefined"; + } + function validateListener(listener) { + return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && "handleEvent" in listener && typeof listener.handleEvent === "function"); + } + function listenerToString(listener) { + return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); + } + function convertTypeToString(value) { + var output; + if (typeof value === "undefined") { + output = "undefined"; + } else if (typeof value === "object") { + if (value === null) { + output = "null"; + } else { + output = objectToString(value); + } + } else { + output = value.toString(); + } + return output; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function objectToString(obj) { + if (!obj || typeof obj !== "object") { + return String(obj); + } + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + logAddEventListener.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function logEval(source, args) { + function logEval(source) { + var nativeEval = window.eval; + function evalWrapper(str) { + hit(source); + logMessage(source, 'eval("'.concat(str, '")'), true); + return nativeEval(str); + } + window.eval = evalWrapper; + var nativeFunction = window.Function; + function FunctionWrapper() { + hit(source); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + logMessage(source, "new Function(".concat(args.join(", "), ")"), true); + return nativeFunction.apply(this, [...args]); + } + FunctionWrapper.prototype = Object.create(nativeFunction.prototype); + FunctionWrapper.prototype.constructor = FunctionWrapper; + window.Function = FunctionWrapper; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + logEval.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function logOnStacktrace(source, args) { + function logOnStacktrace(source, property) { + if (!property) { + return; + } + var refineStackTrace = function refineStackTrace(stackString) { + var stackSteps = stackString.split("\n").slice(2).map(function (line) { + return line.replace(/ {4}at /, ""); + }); + var logInfoArray = stackSteps.map(function (line) { + var funcName; + var funcFullPath; + var reg = /\(([^\)]+)\)/; + var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; + if (line.match(reg)) { + funcName = line.split(" ").slice(0, -1).join(" "); + funcFullPath = line.match(reg)[1]; + } else if (line.match(regFirefox)) { + funcName = line.split("@").slice(0, -1).join(" "); + funcFullPath = line.match(regFirefox)[2]; + } else { + funcName = "function name is not available"; + funcFullPath = line; + } + return [funcName, funcFullPath]; + }); + var logInfoObject = {}; + logInfoArray.forEach(function (pair) { + logInfoObject[pair[0]] = pair[1]; + }); + return logInfoObject; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + if (chain) { + var setter = function setter(a) { + base = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + }; + Object.defineProperty(owner, prop, { + get: function get() { + return base; + }, + set: setter + }); + return; + } + var value = base[prop]; + setPropertyAccess(base, prop, { + get() { + hit(source); + logMessage(source, "Get ".concat(prop), true); + console.table(refineStackTrace(new Error().stack)); + return value; + }, + set(newValue) { + hit(source); + logMessage(source, "Set ".concat(prop), true); + console.table(refineStackTrace(new Error().stack)); + value = newValue; + } + }); + }; + setChainPropAccess(window, property); + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + logOnStacktrace.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function m3uPrune(source, args) { + function m3uPrune(source, propsToRemove) { + var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + return; + } + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var SEGMENT_MARKER = "#"; + var AD_MARKER = { + ASSET: "#EXT-X-ASSET:", + CUE: "#EXT-X-CUE:", + CUE_IN: "#EXT-X-CUE-IN", + DISCONTINUITY: "#EXT-X-DISCONTINUITY", + EXTINF: "#EXTINF", + EXTM3U: "#EXTM3U", + SCTE35: "#EXT-X-SCTE35:" + }; + var COMCAST_AD_MARKER = { + AD: "-AD-", + VAST: "-VAST-", + VMAP_AD: "-VMAP-AD-", + VMAP_AD_BREAK: "#EXT-X-VMAP-AD-BREAK:" + }; + var TAGS_ALLOWLIST = ["#EXT-X-TARGETDURATION", "#EXT-X-MEDIA-SEQUENCE", "#EXT-X-DISCONTINUITY-SEQUENCE", "#EXT-X-ENDLIST", "#EXT-X-PLAYLIST-TYPE", "#EXT-X-I-FRAMES-ONLY", "#EXT-X-MEDIA", "#EXT-X-STREAM-INF", "#EXT-X-I-FRAME-STREAM-INF", "#EXT-X-SESSION-DATA", "#EXT-X-SESSION-KEY", "#EXT-X-INDEPENDENT-SEGMENTS", "#EXT-X-START"]; + var isAllowedTag = function isAllowedTag(str) { + return TAGS_ALLOWLIST.some(function (el) { + return str.startsWith(el); + }); + }; + var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { + var array = lines.slice(); + var index = i; + if (array[index].includes(AD_MARKER.EXTINF)) { + array[index] = undefined; + index += 1; + if (array[index].includes(AD_MARKER.DISCONTINUITY)) { + array[index] = undefined; + index += 1; + var prunedExtinf = pruneExtinfFromVmapBlock(array, index); + array = prunedExtinf.array; + index = prunedExtinf.index; + } + } + return { + array: array, + index: index + }; + }; + var pruneVmapBlock = function pruneVmapBlock(lines) { + var array = lines.slice(); + for (var i = 0; i < array.length - 1; i += 1) { + if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) { + array[i] = undefined; + if (array[i + 1].includes(AD_MARKER.EXTINF)) { + i += 1; + var prunedExtinf = pruneExtinfFromVmapBlock(array, i); + array = prunedExtinf.array; + i = prunedExtinf.index - 1; + } + } + } + return array; + }; + var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { + if (!line.startsWith(AD_MARKER.CUE)) { + return line; + } + line = undefined; + index += 1; + if (array[index].startsWith(AD_MARKER.ASSET)) { + array[index] = undefined; + index += 1; + } + if (array[index].startsWith(AD_MARKER.SCTE35)) { + array[index] = undefined; + index += 1; + } + if (array[index].startsWith(AD_MARKER.CUE_IN)) { + array[index] = undefined; + index += 1; + } + if (array[index].startsWith(AD_MARKER.SCTE35)) { + array[index] = undefined; + } + return line; + }; + var removeM3ULineRegexp = toRegExp(propsToRemove); + var pruneInfBlock = function pruneInfBlock(line, index, array) { + if (!line.startsWith(AD_MARKER.EXTINF)) { + return line; + } + if (!removeM3ULineRegexp.test(array[index + 1])) { + return line; + } + if (!isAllowedTag(array[index])) { + array[index] = undefined; + } + index += 1; + if (!isAllowedTag(array[index])) { + array[index] = undefined; + } + index += 1; + if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) { + array[index] = undefined; + } + return line; + }; + var pruneSegments = function pruneSegments(lines) { + for (var i = 0; i < lines.length - 1; i += 1) { + var _lines$i; + if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) { + var segmentName = lines[i].substring(0, lines[i].indexOf(":")); + if (!segmentName) { + return lines; + } + lines[i] = undefined; + i += 1; + for (var j = i; j < lines.length; j += 1) { + if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) { + lines[j] = undefined; + } else { + i = j - 1; + break; + } + } + } + } + return lines; + }; + var isM3U = function isM3U(text) { + if (typeof text === "string") { + var trimmedText = text.trim(); + return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK); + } + return false; + }; + var isPruningNeeded = function isPruningNeeded(text, regexp) { + return isM3U(text) && regexp.test(text); + }; + var pruneM3U = function pruneM3U(text) { + var lines = text.split(/\n\r|\n|\r/); + if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) { + lines = pruneVmapBlock(lines); + return lines.filter(function (l) { + return !!l; + }).join("\n"); + } + lines = pruneSegments(lines); + return lines.map(function (line, index, array) { + if (typeof line === "undefined") { + return line; + } + line = pruneSpliceoutBlock(line, index, array); + if (typeof line !== "undefined") { + line = pruneInfBlock(line, index, array); + } + return line; + }).filter(function (l) { + return !!l; + }).join("\n"); + }; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; + } + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ["", "text"]; + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { + return Reflect.apply(target, thisArg, args); + } + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + if (typeof content !== "string") { + return; + } + if (!propsToRemove) { + if (isM3U(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); + } + } else { + shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); + } + var responseContent = shouldPruneResponse ? pruneM3U(response) : response; + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false + } + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + if (typeof fetchURL !== "string" || fetchURL.length === 0) { + return Reflect.apply(target, thisArg, args); + } + if (urlMatchRegexp.test(fetchURL)) { + var response = await nativeFetch(...args); + var clonedResponse = response.clone(); + var responseText = await response.text(); + if (!propsToRemove && isM3U(responseText)) { + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + logMessage(source, message); + return clonedResponse; + } + if (isPruningNeeded(responseText, removeM3ULineRegexp)) { + var prunedText = pruneM3U(responseText); + hit(source); + return new Response(prunedText, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }); + } + return clonedResponse; + } + return Reflect.apply(target, thisArg, args); + }; + var fetchHandler = { + apply: fetchWrapper + }; + window.fetch = new Proxy(window.fetch, fetchHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + m3uPrune.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function noTopics(source, args) { + function noTopics(source) { + var TOPICS_PROPERTY_NAME = "browsingTopics"; + if (Document instanceof Object === false) { + return; + } + if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { + return; + } + Document.prototype[TOPICS_PROPERTY_NAME] = function () { + return noopPromiseResolve("[]"); + }; + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function noopPromiseResolve() { + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; + if (typeof Response === "undefined") { + return; + } + var response = new Response(responseBody, { + status: 200, + statusText: "OK" + }); + Object.defineProperties(response, { + url: { + value: responseUrl + }, + type: { + value: responseType + } + }); + return Promise.resolve(response); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + noTopics.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function noeval(source, args) { + function noeval(source) { + window.eval = function evalWrapper(s) { + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); + }.bind(); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + noeval.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function nowebrtc(source, args) { + function nowebrtc(source) { + var propertyName = ""; + if (window.RTCPeerConnection) { + propertyName = "RTCPeerConnection"; + } else if (window.webkitRTCPeerConnection) { + propertyName = "webkitRTCPeerConnection"; + } + if (propertyName === "") { + return; + } + var rtcReplacement = function rtcReplacement(config) { + var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); + logMessage(source, message); + hit(source); + }; + rtcReplacement.prototype = { + close: noopFunc, + createDataChannel: noopFunc, + createOffer: noopFunc, + setRemoteDescription: noopFunc + }; + var rtc = window[propertyName]; + window[propertyName] = rtcReplacement; + if (rtc.prototype) { + rtc.prototype.createDataChannel = function (a, b) { + return { + close: noopFunc, + send: noopFunc + }; + }.bind(null); + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function noopFunc() {} + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function convertRtcConfigToString(config) { + var UNDEF_STR = "undefined"; + var str = UNDEF_STR; + if (config === null) { + str = "null"; + } else if (config instanceof Object) { + var SERVERS_PROP_NAME = "iceServers"; + var URLS_PROP_NAME = "urls"; + if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { + str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); + } + } + return str; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + nowebrtc.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventAddEventListener(source, args) { + function preventAddEventListener(source, typeSearch, listenerSearch) { + var typeSearchRegexp = toRegExp(typeSearch); + var listenerSearchRegexp = toRegExp(listenerSearch); + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; + function addEventListenerWrapper(type, listener) { + var _this$constructor; + var shouldPrevent = false; + if (validateType(type) && validateListener(listener)) { + shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); + } + if (shouldPrevent) { + hit(source); + return undefined; + } + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + return nativeAddEventListener.apply(context, [type, listener, ...args]); + } + var descriptor = { + configurable: true, + set: function set() {}, + get: function get() { + return addEventListenerWrapper; + } + }; + Object.defineProperty(window.EventTarget.prototype, "addEventListener", descriptor); + Object.defineProperty(window, "addEventListener", descriptor); + Object.defineProperty(document, "addEventListener", descriptor); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function validateType(type) { + return typeof type !== "undefined"; + } + function validateListener(listener) { + return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && "handleEvent" in listener && typeof listener.handleEvent === "function"); + } + function listenerToString(listener) { + return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventAddEventListener.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventAdfly(source, args) { + function preventAdfly(source) { + var isDigit = function isDigit(data) { + return /^\d$/.test(data); + }; + var handler = function handler(encodedURL) { + var evenChars = ""; + var oddChars = ""; + for (var i = 0; i < encodedURL.length; i += 1) { + if (i % 2 === 0) { + evenChars += encodedURL.charAt(i); + } else { + oddChars = encodedURL.charAt(i) + oddChars; + } + } + var data = (evenChars + oddChars).split(""); + for (var _i = 0; _i < data.length; _i += 1) { + if (isDigit(data[_i])) { + for (var ii = _i + 1; ii < data.length; ii += 1) { + if (isDigit(data[ii])) { + var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); + if (temp < 10) { + data[_i] = temp.toString(); + } + _i = ii; + break; + } + } + } + } + data = data.join(""); + var decodedURL = window.atob(data).slice(16, -16); + if (window.stop) { + window.stop(); + } + window.onbeforeunload = null; + window.location.href = decodedURL; + }; + var val; + var applyHandler = true; + var result = setPropertyAccess(window, "ysmm", { + configurable: false, + set: function set(value) { + if (applyHandler) { + applyHandler = false; + try { + if (typeof value === "string") { + handler(value); + } + } catch (err) {} + } + val = value; + }, + get: function get() { + return val; + } + }); + if (result) { + hit(source); + } else { + logMessage(source, "Failed to set up prevent-adfly scriptlet"); + } + } + function setPropertyAccess(object, property, descriptor) { + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + if (currentDescriptor && !currentDescriptor.configurable) { + return false; + } + Object.defineProperty(object, property, descriptor); + return true; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventAdfly.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventBab(source, args) { + function preventBab(source) { + var nativeSetTimeout = window.setTimeout; + var babRegex = /\.bab_elementid.$/; + var timeoutWrapper = function timeoutWrapper(callback) { + if (typeof callback !== "string" || !babRegex.test(callback)) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeSetTimeout.apply(window, [callback, ...args]); + } + hit(source); + }; + window.setTimeout = timeoutWrapper; + var signatures = [["blockadblock"], ["babasbm"], [/getItem\('babn'\)/], ["getElementById", "String.fromCharCode", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "charAt", "DOMContentLoaded", "AdBlock", "addEventListener", "doScroll", "fromCharCode", "<<2|r>>4", "sessionStorage", "clientWidth", "localStorage", "Math", "random"]]; + var check = function check(str) { + if (typeof str !== "string") { + return false; + } + for (var i = 0; i < signatures.length; i += 1) { + var tokens = signatures[i]; + var match = 0; + for (var j = 0; j < tokens.length; j += 1) { + var token = tokens[j]; + var found = token instanceof RegExp ? token.test(str) : str.includes(token); + if (found) { + match += 1; + } + } + if (match / tokens.length >= .8) { + return true; + } + } + return false; + }; + var nativeEval = window.eval; + var evalWrapper = function evalWrapper(str) { + if (!check(str)) { + return nativeEval(str); + } + hit(source); + var bodyEl = document.body; + if (bodyEl) { + bodyEl.style.removeProperty("visibility"); + } + var el = document.getElementById("babasbmsgx"); + if (el) { + el.parentNode.removeChild(el); + } + }; + window.eval = evalWrapper.bind(window); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventBab.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventElementSrcLoading(source, args) { + function preventElementSrcLoading(source, tagName, match) { + if (typeof Proxy === "undefined" || typeof Reflect === "undefined") { + return; + } + var srcMockData = { + script: "data:text/javascript;base64,KCk9Pnt9", + img: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", + iframe: "data:text/html;base64, PGRpdj48L2Rpdj4=", + link: "data:text/plain;base64," + }; + var instance; + if (tagName === "script") { + instance = HTMLScriptElement; + } else if (tagName === "img") { + instance = HTMLImageElement; + } else if (tagName === "iframe") { + instance = HTMLIFrameElement; + } else if (tagName === "link") { + instance = HTMLLinkElement; + } else { + return; + } + var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; + var policy; + if (hasTrustedTypes) { + policy = window.trustedTypes.createPolicy("AGPolicy", { + createScriptURL: function createScriptURL(arg) { + return arg; + } + }); + } + var SOURCE_PROPERTY_NAME = tagName === "link" ? "href" : "src"; + var ONERROR_PROPERTY_NAME = "onerror"; + var searchRegexp = toRegExp(match); + var setMatchedAttribute = function setMatchedAttribute(elem) { + return elem.setAttribute(source.name, "matched"); + }; + var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { + if (!args[0] || !args[1]) { + return Reflect.apply(target, thisArg, args); + } + var nodeName = thisArg.nodeName.toLowerCase(); + var attrName = args[0].toLowerCase(); + var attrValue = args[1]; + var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); + if (!isMatched) { + return Reflect.apply(target, thisArg, args); + } + hit(source); + setMatchedAttribute(thisArg); + return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); + }; + var setAttributeHandler = { + apply: setAttributeWrapper + }; + instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); + var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); + if (!origSrcDescriptor) { + return; + } + Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { + enumerable: true, + configurable: true, + get() { + return origSrcDescriptor.get.call(this); + }, + set(urlValue) { + var nodeName = this.nodeName.toLowerCase(); + var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); + if (!isMatched) { + origSrcDescriptor.set.call(this, urlValue); + return true; + } + if (policy && urlValue instanceof TrustedScriptURL) { + var trustedSrc = policy.createScriptURL(urlValue); + origSrcDescriptor.set.call(this, trustedSrc); + hit(source); + return; + } + setMatchedAttribute(this); + origSrcDescriptor.set.call(this, srcMockData[nodeName]); + hit(source); + } + }); + var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); + if (!origOnerrorDescriptor) { + return; + } + Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { + enumerable: true, + configurable: true, + get() { + return origOnerrorDescriptor.get.call(this); + }, + set(cb) { + var isMatched = this.getAttribute(source.name) === "matched"; + if (!isMatched) { + origOnerrorDescriptor.set.call(this, cb); + return true; + } + origOnerrorDescriptor.set.call(this, noopFunc); + return true; + } + }); + var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { + if (!args[0] || !args[1] || !thisArg) { + return Reflect.apply(target, thisArg, args); + } + var eventName = args[0]; + var isMatched = typeof thisArg.getAttribute === "function" && thisArg.getAttribute(source.name) === "matched" && eventName === "error"; + if (isMatched) { + return Reflect.apply(target, thisArg, [eventName, noopFunc]); + } + return Reflect.apply(target, thisArg, args); + }; + var addEventListenerHandler = { + apply: addEventListenerWrapper + }; + EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); + var preventInlineOnerror = function preventInlineOnerror(tagName, src) { + window.addEventListener("error", function (event) { + if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) { + return; + } + hit(source); + if (typeof event.target.onload === "function") { + event.target.onerror = event.target.onload; + return; + } + event.target.onerror = noopFunc; + }, true); + }; + preventInlineOnerror(tagName, searchRegexp); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function safeGetDescriptor(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + if (descriptor && descriptor.configurable) { + return descriptor; + } + return null; + } + function noopFunc() {} + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventElementSrcLoading.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventEvalIf(source, args) { + function preventEvalIf(source, search) { + var searchRegexp = toRegExp(search); + var nativeEval = window.eval; + window.eval = function (payload) { + if (!searchRegexp.test(payload.toString())) { + return nativeEval.call(window, payload); + } + hit(source); + return undefined; + }.bind(window); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventEvalIf.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventFab(source, args) { + function preventFab(source) { + hit(source); + var Fab = function Fab() {}; + Fab.prototype.check = noopFunc; + Fab.prototype.clearEvent = noopFunc; + Fab.prototype.emitEvent = noopFunc; + Fab.prototype.on = function (a, b) { + if (!a) { + b(); + } + return this; + }; + Fab.prototype.onDetected = noopThis; + Fab.prototype.onNotDetected = function (a) { + a(); + return this; + }; + Fab.prototype.setOption = noopFunc; + Fab.prototype.options = { + set: noopFunc, + get: noopFunc + }; + var fab = new Fab(); + var getSetFab = { + get() { + return Fab; + }, + set() {} + }; + var getsetfab = { + get() { + return fab; + }, + set() {} + }; + if (Object.prototype.hasOwnProperty.call(window, "FuckAdBlock")) { + window.FuckAdBlock = Fab; + } else { + Object.defineProperty(window, "FuckAdBlock", getSetFab); + } + if (Object.prototype.hasOwnProperty.call(window, "BlockAdBlock")) { + window.BlockAdBlock = Fab; + } else { + Object.defineProperty(window, "BlockAdBlock", getSetFab); + } + if (Object.prototype.hasOwnProperty.call(window, "SniffAdBlock")) { + window.SniffAdBlock = Fab; + } else { + Object.defineProperty(window, "SniffAdBlock", getSetFab); + } + if (Object.prototype.hasOwnProperty.call(window, "fuckAdBlock")) { + window.fuckAdBlock = fab; + } else { + Object.defineProperty(window, "fuckAdBlock", getsetfab); + } + if (Object.prototype.hasOwnProperty.call(window, "blockAdBlock")) { + window.blockAdBlock = fab; + } else { + Object.defineProperty(window, "blockAdBlock", getsetfab); + } + if (Object.prototype.hasOwnProperty.call(window, "sniffAdBlock")) { + window.sniffAdBlock = fab; + } else { + Object.defineProperty(window, "sniffAdBlock", getsetfab); + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function noopFunc() {} + function noopThis() { + return this; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventFab.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventFetch(source, args) { + function preventFetch(source, propsToMatch) { + var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "emptyObj"; + var responseType = arguments.length > 3 ? arguments[3] : undefined; + if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + return; + } + var strResponseBody; + if (responseBody === "" || responseBody === "emptyObj") { + strResponseBody = "{}"; + } else if (responseBody === "emptyArr") { + strResponseBody = "[]"; + } else { + logMessage(source, "Invalid responseBody parameter: '".concat(responseBody, "'")); + return; + } + var isResponseTypeSpecified = typeof responseType !== "undefined"; + var isResponseTypeSupported = function isResponseTypeSupported(responseType) { + var SUPPORTED_TYPES = ["default", "opaque"]; + return SUPPORTED_TYPES.includes(responseType); + }; + if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) { + logMessage(source, "Invalid responseType parameter: '".concat(responseType, "'")); + return; + } + var handlerWrapper = async function handlerWrapper(target, thisArg, args) { + var shouldPrevent = false; + var fetchData = getFetchData(args); + if (typeof propsToMatch === "undefined") { + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); + } + shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); + if (shouldPrevent) { + hit(source); + try { + var origResponse = await Reflect.apply(target, thisArg, args); + if (!origResponse.ok) { + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + } + return modifyResponse(origResponse, { + body: strResponseBody, + type: responseType + }); + } catch (ex) { + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + } + } + return Reflect.apply(target, thisArg, args); + }; + var fetchHandler = { + apply: handlerWrapper + }; + fetch = new Proxy(fetch, fetchHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function getFetchData(args) { + var fetchPropsObj = {}; + var fetchUrl; + var fetchInit; + if (args[0] instanceof Request) { + var requestData = getRequestData(args[0]); + fetchUrl = requestData.url; + fetchInit = requestData; + } else { + fetchUrl = args[0]; + fetchInit = args[1]; + } + fetchPropsObj.url = fetchUrl; + if (fetchInit instanceof Object) { + var props = Object.keys(fetchInit); + props.forEach(function (prop) { + fetchPropsObj[prop] = fetchInit[prop]; + }); + } + return fetchPropsObj; + } + function objectToString(obj) { + if (!obj || typeof obj !== "object") { + return String(obj); + } + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function noopPromiseResolve() { + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; + if (typeof Response === "undefined") { + return; + } + var response = new Response(responseBody, { + status: 200, + statusText: "OK" + }); + Object.defineProperties(response, { + url: { + value: responseUrl + }, + type: { + value: responseType + } + }); + return Promise.resolve(response); + } + function modifyResponse(origResponse) { + var _origResponse$headers; + var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + body: "{}" + }; + var headers = {}; + origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) { + headers[key] = value; + }); + var modifiedResponse = new Response(replacement.body, { + status: origResponse.status, + statusText: origResponse.statusText, + headers: headers + }); + Object.defineProperties(modifiedResponse, { + url: { + value: origResponse.url + }, + type: { + value: replacement.type || origResponse.type + } + }); + return modifiedResponse; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function getRequestData(request) { + var requestInitOptions = getRequestProps(); + var entries = requestInitOptions.map(function (key) { + var value = request[key]; + return [key, value]; + }); + return Object.fromEntries(entries); + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventFetch.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventPopadsNet(source, args) { + function preventPopadsNet(source) { + var rid = randomId(); + var throwError = function throwError() { + throw new ReferenceError(rid); + }; + delete window.PopAds; + delete window.popns; + Object.defineProperties(window, { + PopAds: { + set: throwError + }, + popns: { + set: throwError + } + }); + window.onerror = createOnErrorHandler(rid).bind(); + hit(source); + } + function createOnErrorHandler(rid) { + var nativeOnError = window.onerror; + return function onError(error) { + if (typeof error === "string" && error.includes(rid)) { + return true; + } + if (nativeOnError instanceof Function) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeOnError.apply(window, [error, ...args]); + } + return false; + }; + } + function randomId() { + return Math.random().toString(36).slice(2, 9); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventPopadsNet.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventRefresh(source, args) { + function preventRefresh(source, delaySec) { + var getMetaElements = function getMetaElements() { + var metaNodes = []; + try { + metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); + } catch (e) { + try { + metaNodes = document.querySelectorAll('meta[http-equiv="refresh"][content]'); + } catch (e) { + logMessage(source, e); + } + } + return Array.from(metaNodes); + }; + var getMetaContentDelay = function getMetaContentDelay(metaElements) { + var delays = metaElements.map(function (meta) { + var contentString = meta.getAttribute("content"); + if (contentString.length === 0) { + return null; + } + var contentDelay; + var limiterIndex = contentString.indexOf(";"); + if (limiterIndex !== -1) { + var delaySubstring = contentString.substring(0, limiterIndex); + contentDelay = getNumberFromString(delaySubstring); + } else { + contentDelay = getNumberFromString(contentString); + } + return contentDelay; + }).filter(function (delay) { + return delay !== null; + }); + if (!delays.length) { + return null; + } + var minDelay = delays.reduce(function (a, b) { + return Math.min(a, b); + }); + return minDelay; + }; + var stop = function stop() { + var metaElements = getMetaElements(); + if (metaElements.length === 0) { + return; + } + var secondsToRun = getNumberFromString(delaySec); + if (secondsToRun === null) { + secondsToRun = getMetaContentDelay(metaElements); + } + if (secondsToRun === null) { + return; + } + var delayMs = secondsToRun * 1e3; + setTimeout(function () { + window.stop(); + hit(source); + }, delayMs); + }; + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", stop, { + once: true + }); + } else { + stop(); + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function getNumberFromString(rawString) { + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return validDelay; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventRefresh.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventRequestAnimationFrame(source, args) { + function preventRequestAnimationFrame(source, match) { + var nativeRequestAnimationFrame = window.requestAnimationFrame; + var shouldLog = typeof match === "undefined"; + var _parseMatchArg = parseMatchArg(match), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; + var rafWrapper = function rafWrapper(callback) { + var shouldPrevent = false; + if (shouldLog) { + hit(source); + logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); + } else if (isValidCallback(callback) && isValidStrPattern(match)) { + shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; + } + if (shouldPrevent) { + hit(source); + return nativeRequestAnimationFrame(noopFunc); + } + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return nativeRequestAnimationFrame.apply(window, [callback, ...args]); + }; + window.requestAnimationFrame = rafWrapper; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function noopFunc() {} + function parseMatchArg(match) { + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); + return { + isInvertedMatch: isInvertedMatch, + matchRegexp: matchRegexp, + matchValue: matchValue + }; + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function isValidCallback(callback) { + return callback instanceof Function || typeof callback === "string"; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventRequestAnimationFrame.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventSetInterval(source, args) { + function preventSetInterval(source, matchCallback, matchDelay) { + var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; + if (shouldLog) { + hit(source); + logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); + } else { + shouldPrevent = isPreventionNeeded({ + callback: callback, + delay: delay, + matchCallback: matchCallback, + matchDelay: matchDelay + }); + } + if (shouldPrevent) { + hit(source); + args[0] = noopFunc; + } + return target.apply(thisArg, args); + }; + var setIntervalHandler = { + apply: handlerWrapper + }; + window.setInterval = new Proxy(window.setInterval, setIntervalHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function noopFunc() {} + function isPreventionNeeded(_ref) { + var callback = _ref.callback, + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; + if (!isValidCallback(callback)) { + return false; + } + if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { + return false; + } + var _parseMatchArg = parseMatchArg(matchCallback), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; + var _parseDelayArg = parseDelayArg(matchDelay), + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; + var parsedDelay = parseRawDelay(delay); + var shouldPrevent = false; + var callbackStr = String(callback); + if (delayMatch === null) { + shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; + } else if (!matchCallback) { + shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch; + } else { + shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch; + } + return shouldPrevent; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function parseMatchArg(match) { + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); + return { + isInvertedMatch: isInvertedMatch, + matchRegexp: matchRegexp, + matchValue: matchValue + }; + } + function parseDelayArg(delay) { + var INVERT_MARKER = "!"; + var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER); + var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; + var parsedDelay = parseInt(delayValue, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return { + isInvertedDelayMatch: isInvertedDelayMatch, + delayMatch: delayMatch + }; + } + function isValidCallback(callback) { + return callback instanceof Function || typeof callback === "string"; + } + function isValidMatchStr(match) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { + str = match.slice(1); + } + return isValidStrPattern(str); + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function nativeIsFinite(num) { + var native = Number.isFinite || window.isFinite; + return native(num); + } + function isValidMatchNumber(match) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { + str = match.slice(1); + } + var num = parseFloat(str); + return !nativeIsNaN(num) && nativeIsFinite(num); + } + function parseRawDelay(delay) { + var parsedDelay = Math.floor(parseInt(delay, 10)); + return typeof parsedDelay === "number" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventSetInterval.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventSetTimeout(source, args) { + function preventSetTimeout(source, matchCallback, matchDelay) { + var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; + if (shouldLog) { + hit(source); + logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); + } else { + shouldPrevent = isPreventionNeeded({ + callback: callback, + delay: delay, + matchCallback: matchCallback, + matchDelay: matchDelay + }); + } + if (shouldPrevent) { + hit(source); + args[0] = noopFunc; + } + return target.apply(thisArg, args); + }; + var setTimeoutHandler = { + apply: handlerWrapper + }; + window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function noopFunc() {} + function isPreventionNeeded(_ref) { + var callback = _ref.callback, + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; + if (!isValidCallback(callback)) { + return false; + } + if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { + return false; + } + var _parseMatchArg = parseMatchArg(matchCallback), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; + var _parseDelayArg = parseDelayArg(matchDelay), + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; + var parsedDelay = parseRawDelay(delay); + var shouldPrevent = false; + var callbackStr = String(callback); + if (delayMatch === null) { + shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; + } else if (!matchCallback) { + shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch; + } else { + shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch; + } + return shouldPrevent; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function parseMatchArg(match) { + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); + return { + isInvertedMatch: isInvertedMatch, + matchRegexp: matchRegexp, + matchValue: matchValue + }; + } + function parseDelayArg(delay) { + var INVERT_MARKER = "!"; + var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER); + var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; + var parsedDelay = parseInt(delayValue, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return { + isInvertedDelayMatch: isInvertedDelayMatch, + delayMatch: delayMatch + }; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function isValidCallback(callback) { + return callback instanceof Function || typeof callback === "string"; + } + function isValidMatchStr(match) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { + str = match.slice(1); + } + return isValidStrPattern(str); + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function nativeIsFinite(num) { + var native = Number.isFinite || window.isFinite; + return native(num); + } + function isValidMatchNumber(match) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { + str = match.slice(1); + } + var num = parseFloat(str); + return !nativeIsNaN(num) && nativeIsFinite(num); + } + function parseRawDelay(delay) { + var parsedDelay = Math.floor(parseInt(delay, 10)); + return typeof parsedDelay === "number" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventSetTimeout.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventWindowOpen(source, args) { + function preventWindowOpen(source) { + var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "*"; + var delay = arguments.length > 2 ? arguments[2] : undefined; + var replacement = arguments.length > 3 ? arguments[3] : undefined; + var nativeOpen = window.open; + var isNewSyntax = match !== "0" && match !== "1"; + var oldOpenWrapper = function oldOpenWrapper(str) { + match = Number(match) > 0; + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + if (!isValidStrPattern(delay)) { + logMessage(source, "Invalid parameter: ".concat(delay)); + return nativeOpen.apply(window, [str, ...args]); + } + var searchRegexp = toRegExp(delay); + if (match !== searchRegexp.test(str)) { + return nativeOpen.apply(window, [str, ...args]); + } + hit(source); + return handleOldReplacement(replacement); + }; + var newOpenWrapper = function newOpenWrapper(url) { + var shouldLog = replacement && replacement.includes("log"); + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + if (shouldLog) { + var argsStr = args && args.length > 0 ? ", ".concat(args.join(", ")) : ""; + var message = "".concat(url).concat(argsStr); + logMessage(source, message, true); + hit(source); + } + var shouldPrevent = false; + if (match === "*") { + shouldPrevent = true; + } else if (isValidMatchStr(match)) { + var _parseMatchArg = parseMatchArg(match), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; + shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; + } else { + logMessage(source, "Invalid parameter: ".concat(match)); + shouldPrevent = false; + } + if (shouldPrevent) { + var parsedDelay = parseInt(delay, 10); + var result; + if (nativeIsNaN(parsedDelay)) { + result = noopNull(); + } else { + var decoyArgs = { + replacement: replacement, + url: url, + delay: parsedDelay + }; + var decoy = createDecoy(decoyArgs); + var popup = decoy.contentWindow; + if (typeof popup === "object" && popup !== null) { + Object.defineProperty(popup, "closed", { + value: false + }); + Object.defineProperty(popup, "opener", { + value: window + }); + Object.defineProperty(popup, "frameElement", { + value: null + }); + } else { + var nativeGetter = decoy.contentWindow && decoy.contentWindow.get; + Object.defineProperty(decoy, "contentWindow", { + get: getPreventGetter(nativeGetter) + }); + popup = decoy.contentWindow; + } + result = popup; + } + hit(source); + return result; + } + return nativeOpen.apply(window, [url, ...args]); + }; + window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; + window.open.toString = nativeOpen.toString.bind(nativeOpen); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function isValidMatchStr(match) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { + str = match.slice(1); + } + return isValidStrPattern(str); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function parseMatchArg(match) { + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); + return { + isInvertedMatch: isInvertedMatch, + matchRegexp: matchRegexp, + matchValue: matchValue + }; + } + function handleOldReplacement(replacement) { + var result; + if (!replacement) { + result = noopFunc; + } else if (replacement === "trueFunc") { + result = trueFunc; + } else if (replacement.includes("=")) { + var isProp = replacement.startsWith("{") && replacement.endsWith("}"); + if (isProp) { + var propertyPart = replacement.slice(1, -1); + var propertyName = substringBefore(propertyPart, "="); + var propertyValue = substringAfter(propertyPart, "="); + if (propertyValue === "noopFunc") { + result = {}; + result[propertyName] = noopFunc; + } + } + } + return result; + } + function createDecoy(args) { + var UrlPropNameOf = function (UrlPropNameOf) { + UrlPropNameOf["Object"] = "data"; + UrlPropNameOf["Iframe"] = "src"; + return UrlPropNameOf; + }({}); + var replacement = args.replacement, + url = args.url, + delay = args.delay; + var tag; + if (replacement === "obj") { + tag = "object"; + } else { + tag = "iframe"; + } + var decoy = document.createElement(tag); + if (decoy instanceof HTMLObjectElement) { + decoy[UrlPropNameOf.Object] = url; + } else if (decoy instanceof HTMLIFrameElement) { + decoy[UrlPropNameOf.Iframe] = url; + } + decoy.style.setProperty("height", "1px", "important"); + decoy.style.setProperty("position", "fixed", "important"); + decoy.style.setProperty("top", "-1px", "important"); + decoy.style.setProperty("width", "1px", "important"); + document.body.appendChild(decoy); + setTimeout(function () { + return decoy.remove(); + }, delay * 1e3); + return decoy; + } + function getPreventGetter(nativeGetter) { + var preventGetter = function preventGetter(target, prop) { + if (prop && prop === "closed") { + return false; + } + if (typeof nativeGetter === "function") { + return noopFunc; + } + return prop && target[prop]; + }; + return preventGetter; + } + function noopNull() { + return null; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function noopFunc() {} + function trueFunc() { + return true; + } + function substringBefore(str, separator) { + if (!str || !separator) { + return str; + } + var index = str.indexOf(separator); + return index < 0 ? str : str.substring(0, index); + } + function substringAfter(str, separator) { + if (!str) { + return str; + } + var index = str.indexOf(separator); + return index < 0 ? "" : str.substring(index + separator.length); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventWindowOpen.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function preventXHR(source, args) { + function preventXHR(source, propsToMatch, customResponseText) { + if (typeof Proxy === "undefined") { + return; + } + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader; + var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders; + var xhrData; + var modifiedResponse = ""; + var modifiedResponseText = ""; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); + if (typeof propsToMatch === "undefined") { + logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); + hit(source); + } else if (matchRequestProps(source, propsToMatch, xhrData)) { + thisArg.shouldBePrevented = true; + thisArg.xhrData = xhrData; + } + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return Reflect.apply(target, thisArg, args); + } + if (thisArg.responseType === "blob") { + modifiedResponse = new Blob(); + } + if (thisArg.responseType === "arraybuffer") { + modifiedResponse = new ArrayBuffer(); + } + if (customResponseText) { + var randomText = generateRandomResponse(customResponseText); + if (randomText) { + modifiedResponseText = randomText; + } else { + logMessage(source, "Invalid randomize parameter: '".concat(customResponseText, "'")); + } + } + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + statusText = forgedRequest.statusText; + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + responseURL: { + value: responseURL || thisArg.xhrData.url, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: 200, + writable: false + }, + response: { + value: modifiedResponse, + writable: false + }, + responseText: { + value: modifiedResponseText, + writable: false + } + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + return undefined; + }; + var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return nativeGetResponseHeader.apply(thisArg, args); + } + if (!thisArg.collectedHeaders.length) { + return null; + } + var searchHeaderName = args[0].toLowerCase(); + var matchedHeader = thisArg.collectedHeaders.find(function (header) { + var headerName = header[0].toLowerCase(); + return headerName === searchHeaderName; + }); + return matchedHeader ? matchedHeader[1] : null; + }; + var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) { + if (!thisArg.shouldBePrevented) { + return nativeGetAllResponseHeaders.call(thisArg); + } + if (!thisArg.collectedHeaders.length) { + return ""; + } + var allHeadersStr = thisArg.collectedHeaders.map(function (header) { + var headerName = header[0]; + var headerValue = header[1]; + return "".concat(headerName.toLowerCase(), ": ").concat(headerValue); + }).join("\r\n"); + return allHeadersStr; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + var getHeaderHandler = { + apply: getHeaderWrapper + }; + var getAllHeadersHandler = { + apply: getAllHeadersWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler); + XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function objectToString(obj) { + if (!obj || typeof obj !== "object") { + return String(obj); + } + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } + function generateRandomResponse(customResponseText) { + var customResponse = customResponseText; + if (customResponse === "true") { + customResponse = Math.random().toString(36).slice(-10); + return customResponse; + } + customResponse = customResponse.replace("length:", ""); + var rangeRegex = /^\d+-\d+$/; + if (!rangeRegex.test(customResponse)) { + return null; + } + var rangeMin = getNumberFromString(customResponse.split("-")[0]); + var rangeMax = getNumberFromString(customResponse.split("-")[1]); + if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { + return null; + } + if (rangeMin > rangeMax) { + var temp = rangeMin; + rangeMin = rangeMax; + rangeMax = temp; + } + var LENGTH_RANGE_LIMIT = 500 * 1e3; + if (rangeMax > LENGTH_RANGE_LIMIT) { + return null; + } + var length = getRandomIntInclusive(rangeMin, rangeMax); + customResponse = getRandomStrByLength(length); + return customResponse; + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; } else { - this.query = this.search.substr(1); + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; + } + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function getNumberFromString(rawString) { + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return validDelay; + } + function nativeIsFinite(num) { + var native = Number.isFinite || window.isFinite; + return native(num); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function getRandomIntInclusive(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1) + min); + } + function getRandomStrByLength(length) { + var result = ""; + var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~"; + var charactersLength = characters.length; + for (var i = 0; i < length; i += 1) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + preventXHR.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function removeAttr(source, args) { + function removeAttr(source, attrs, selector) { + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; + if (!attrs) { + return; + } + attrs = attrs.split(/\s*\|\s*/); + if (!selector) { + selector = "[".concat(attrs.join("],["), "]"); + } + var rmattr = function rmattr() { + var nodes = []; + try { + nodes = [].slice.call(document.querySelectorAll(selector)); + } catch (e) { + logMessage(source, "Invalid selector arg: '".concat(selector, "'")); + } + var removed = false; + nodes.forEach(function (node) { + attrs.forEach(function (attr) { + node.removeAttribute(attr); + removed = true; + }); + }); + if (removed) { + hit(source); + } + }; + var flags = parseFlags(applying); + var run = function run() { + rmattr(); + if (!flags.hasFlag(flags.STAY)) { + return; + } + observeDOMChanges(rmattr, true); + }; + if (flags.hasFlag(flags.ASAP)) { + if (document.readyState === "loading") { + window.addEventListener("DOMContentLoaded", rmattr, { + once: true + }); + } else { + rmattr(); + } + } + if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { + window.addEventListener("load", run, { + once: true + }); + } else if (flags.hasFlag(flags.STAY)) { + if (!applying.includes(" ")) { + rmattr(); + } + observeDOMChanges(rmattr, true); + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); + } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + function callbackWrapper() { + disconnect(); + callback(); + connect(); + } + connect(); + } + function parseFlags(flags) { + var FLAGS_DIVIDER = " "; + var ASAP_FLAG = "asap"; + var COMPLETE_FLAG = "complete"; + var STAY_FLAG = "stay"; + var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; + var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { + return VALID_FLAGS.includes(f); + }); + return { + ASAP: ASAP_FLAG, + COMPLETE: COMPLETE_FLAG, + STAY: STAY_FLAG, + hasFlag(flag) { + return passedFlags.includes(flag); + } + }; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + removeAttr.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function removeClass(source, args) { + function removeClass(source, classNames, selector) { + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; + if (!classNames) { + return; + } + classNames = classNames.split(/\s*\|\s*/); + var selectors = []; + if (!selector) { + selectors = classNames.map(function (className) { + return ".".concat(className); + }); + } + var removeClassHandler = function removeClassHandler() { + var nodes = new Set(); + if (selector) { + var foundNodes = []; + try { + foundNodes = [].slice.call(document.querySelectorAll(selector)); + } catch (e) { + logMessage(source, "Invalid selector arg: '".concat(selector, "'")); + } + foundNodes.forEach(function (n) { + return nodes.add(n); + }); + } else if (selectors.length > 0) { + selectors.forEach(function (s) { + var elements = document.querySelectorAll(s); + for (var i = 0; i < elements.length; i += 1) { + var element = elements[i]; + nodes.add(element); + } + }); + } + var removed = false; + nodes.forEach(function (node) { + classNames.forEach(function (className) { + if (node.classList.contains(className)) { + node.classList.remove(className); + removed = true; + } + }); + }); + if (removed) { + hit(source); + } + }; + var CLASS_ATTR_NAME = ["class"]; + var flags = parseFlags(applying); + var run = function run() { + removeClassHandler(); + if (!flags.hasFlag(flags.STAY)) { + return; + } + observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); + }; + if (flags.hasFlag(flags.ASAP)) { + if (document.readyState === "loading") { + window.addEventListener("DOMContentLoaded", removeClassHandler, { + once: true + }); + } else { + removeClassHandler(); + } + } + if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { + window.addEventListener("load", run, { + once: true + }); + } else if (flags.hasFlag(flags.STAY)) { + if (!applying.includes(" ")) { + removeClassHandler(); + } + observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); + } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + function callbackWrapper() { + disconnect(); + callback(); + connect(); + } + connect(); + } + function parseFlags(flags) { + var FLAGS_DIVIDER = " "; + var ASAP_FLAG = "asap"; + var COMPLETE_FLAG = "complete"; + var STAY_FLAG = "stay"; + var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; + var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { + return VALID_FLAGS.includes(f); + }); + return { + ASAP: ASAP_FLAG, + COMPLETE: COMPLETE_FLAG, + STAY: STAY_FLAG, + hasFlag(flag) { + return passedFlags.includes(flag); + } + }; + } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + removeClass.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function removeCookie(source, args) { + function removeCookie(source, match) { + var matchRegexp = toRegExp(match); + var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { + var cookieSpec = "".concat(cookieName, "="); + var domain1 = "; domain=".concat(hostName); + var domain2 = "; domain=.".concat(hostName); + var path = "; path=/"; + var expiration = "; expires=Thu, 01 Jan 1970 00:00:00 GMT"; + document.cookie = cookieSpec + expiration; + document.cookie = cookieSpec + domain1 + expiration; + document.cookie = cookieSpec + domain2 + expiration; + document.cookie = cookieSpec + path + expiration; + document.cookie = cookieSpec + domain1 + path + expiration; + document.cookie = cookieSpec + domain2 + path + expiration; + hit(source); + }; + var rmCookie = function rmCookie() { + document.cookie.split(";").forEach(function (cookieStr) { + var pos = cookieStr.indexOf("="); + if (pos === -1) { + return; + } + var cookieName = cookieStr.slice(0, pos).trim(); + if (!matchRegexp.test(cookieName)) { + return; + } + var hostParts = document.location.hostname.split("."); + for (var i = 0; i <= hostParts.length - 1; i += 1) { + var hostName = hostParts.slice(i).join("."); + if (hostName) { + removeCookieFromHost(cookieName, hostName); + } + } + }); + }; + rmCookie(); + window.addEventListener("beforeunload", rmCookie); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - } else if (parseQueryString) { - this.search = ''; - this.query = {}; + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + removeCookie.apply(this, updatedArgs); + } catch (e) { + console.log(e); } - return this; - } - } - - var proto = protocolPattern.exec(rest); - if (proto) { - proto = proto[0]; - var lowerProto = proto.toLowerCase(); - this.protocol = lowerProto; - rest = rest.substr(proto.length); - } - - // figure out if it's got a host - // user@server is *always* interpreted as a hostname, and url - // resolution will treat //foo/bar as host=foo,path=bar because that's - // how the browser resolves relative URLs. - if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { - var slashes = rest.substr(0, 2) === '//'; - if (slashes && !(proto && hostlessProtocol[proto])) { - rest = rest.substr(2); - this.slashes = true; } - } - - if (!hostlessProtocol[proto] && - (slashes || (proto && !slashedProtocol[proto]))) { - - // there's a hostname. - // the first instance of /, ?, ;, or # ends the host. - // - // If there is an @ in the hostname, then non-host chars *are* allowed - // to the left of the last @ sign, unless some host-ending character - // comes *before* the @-sign. - // URLs are obnoxious. - // - // ex: - // http://a@b@c/ => user:a@b host:c - // http://a@b?@c => user:a host:c path:/?@c - - // v0.12 TODO(isaacs): This is not quite how Chrome does things. - // Review our test case against browsers more comprehensively. - - // find the first instance of any hostEndingChars - var hostEnd = -1; - for (var i = 0; i < hostEndingChars.length; i++) { - var hec = rest.indexOf(hostEndingChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) - hostEnd = hec; - } - - // at this point, either we have an explicit point where the - // auth portion cannot go past, or the last @ char is the decider. - var auth, atSign; - if (hostEnd === -1) { - // atSign can be anywhere. - atSign = rest.lastIndexOf('@'); - } else { - // atSign must be in auth portion. - // http://a@b/c@d => host:b auth:a path:/c@d - atSign = rest.lastIndexOf('@', hostEnd); - } - - // Now we have a portion which is definitely the auth. - // Pull that off. - if (atSign !== -1) { - auth = rest.slice(0, atSign); - rest = rest.slice(atSign + 1); - this.auth = decodeURIComponent(auth); - } - - // the host is the remaining to the left of the first non-host char - hostEnd = -1; - for (var i = 0; i < nonHostChars.length; i++) { - var hec = rest.indexOf(nonHostChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) - hostEnd = hec; - } - // if we still have not hit it, then the entire thing is a host. - if (hostEnd === -1) - hostEnd = rest.length; - - this.host = rest.slice(0, hostEnd); - rest = rest.slice(hostEnd); - - // pull out port. - this.parseHost(); - - // we've indicated that there is a hostname, - // so even if it's empty, it has to be present. - this.hostname = this.hostname || ''; - - // if hostname begins with [ and ends with ] - // assume that it's an IPv6 address. - var ipv6Hostname = this.hostname[0] === '[' && - this.hostname[this.hostname.length - 1] === ']'; - - // validate a little. - if (!ipv6Hostname) { - var hostparts = this.hostname.split(/\./); - for (var i = 0, l = hostparts.length; i < l; i++) { - var part = hostparts[i]; - if (!part) continue; - if (!part.match(hostnamePartPattern)) { - var newpart = ''; - for (var j = 0, k = part.length; j < k; j++) { - if (part.charCodeAt(j) > 127) { - // we replace non-ASCII char with a temporary placeholder - // we need this to make sure size of hostname is not - // broken by replacing non-ASCII by nothing - newpart += 'x'; - } else { - newpart += part[j]; + function removeInShadowDom(source, args) { + function removeInShadowDom(source, selector, baseSelector) { + if (!Element.prototype.attachShadow) { + return; + } + var removeElement = function removeElement(targetElement) { + targetElement.remove(); + }; + var removeHandler = function removeHandler() { + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + var _loop = function _loop() { + var isRemoved = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; + targets.forEach(function (targetEl) { + removeElement(targetEl); + isRemoved = true; + }); + if (isRemoved) { + hit(source); } + hostElements = innerHosts; + }; + while (hostElements.length !== 0) { + _loop(); } - // we test again with ASCII char only - if (!newpart.match(hostnamePartPattern)) { - var validParts = hostparts.slice(0, i); - var notHost = hostparts.slice(i + 1); - var bit = part.match(hostnamePartStart); - if (bit) { - validParts.push(bit[1]); - notHost.unshift(bit[2]); + }; + removeHandler(); + observeDOMChanges(removeHandler, true); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - if (notHost.length) { - rest = '/' + notHost.join('.') + rest; + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); + } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + function callbackWrapper() { + disconnect(); + callback(); + connect(); + } + connect(); + } + function findHostElements(rootElement) { + var hosts = []; + if (rootElement) { + var domElems = rootElement.querySelectorAll("*"); + domElems.forEach(function (el) { + if (el.shadowRoot) { + hosts.push(el); } - this.hostname = validParts.join('.'); - break; + }); + } + return hosts; + } + function pierceShadowDom(selector, hostElements) { + var targets = []; + var innerHostsAcc = []; + hostElements.forEach(function (host) { + var simpleElems = host.querySelectorAll(selector); + targets = targets.concat([].slice.call(simpleElems)); + var shadowRootElem = host.shadowRoot; + var shadowChildren = shadowRootElem.querySelectorAll(selector); + targets = targets.concat([].slice.call(shadowChildren)); + innerHostsAcc.push(findHostElements(shadowRootElem)); + }); + var innerHosts = flatten(innerHostsAcc); + return { + targets: targets, + innerHosts: innerHosts + }; + } + function flatten(input) { + var stack = []; + input.forEach(function (el) { + return stack.push(el); + }); + var res = []; + while (stack.length) { + var next = stack.pop(); + if (Array.isArray(next)) { + next.forEach(function (el) { + return stack.push(el); + }); + } else { + res.push(next); } } + return res.reverse(); } - } - - if (this.hostname.length > hostnameMaxLen) { - this.hostname = ''; - } else { - // hostnames are always lower case. - this.hostname = this.hostname.toLowerCase(); - } - - if (!ipv6Hostname) { - // IDNA Support: Returns a punycoded representation of "domain". - // It only converts parts of the domain name that - // have non-ASCII characters, i.e. it doesn't matter if - // you call it with a domain that already is ASCII-only. - this.hostname = punycode.toASCII(this.hostname); - } - - var p = this.port ? ':' + this.port : ''; - var h = this.hostname || ''; - this.host = h + p; - this.href += this.host; - - // strip [ and ] from the hostname - // the host field still retains them, though - if (ipv6Hostname) { - this.hostname = this.hostname.substr(1, this.hostname.length - 2); - if (rest[0] !== '/') { - rest = '/' + rest; + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; } - } - } - - // now rest is set to the post-host stuff. - // chop off any delim chars. - if (!unsafeProtocol[lowerProto]) { - - // First, make 100% sure that any "autoEscape" chars get - // escaped, even if encodeURIComponent doesn't think they - // need to be. - for (var i = 0, l = autoEscape.length; i < l; i++) { - var ae = autoEscape[i]; - if (rest.indexOf(ae) === -1) - continue; - var esc = encodeURIComponent(ae); - if (esc === ae) { - esc = escape(ae); + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + removeInShadowDom.apply(this, updatedArgs); + } catch (e) { + console.log(e); } - rest = rest.split(ae).join(esc); - } - } - - - // chop off from the tail first. - var hash = rest.indexOf('#'); - if (hash !== -1) { - // got a fragment string. - this.hash = rest.substr(hash); - rest = rest.slice(0, hash); - } - var qm = rest.indexOf('?'); - if (qm !== -1) { - this.search = rest.substr(qm); - this.query = rest.substr(qm + 1); - if (parseQueryString) { - this.query = querystring.parse(this.query); - } - rest = rest.slice(0, qm); - } else if (parseQueryString) { - // no query string, but parseQueryString still requested - this.search = ''; - this.query = {}; - } - if (rest) this.pathname = rest; - if (slashedProtocol[lowerProto] && - this.hostname && !this.pathname) { - this.pathname = '/'; - } - - //to support http.request - if (this.pathname || this.search) { - var p = this.pathname || ''; - var s = this.search || ''; - this.path = p + s; - } - - // finally, reconstruct the href based on what has been validated. - this.href = this.format(); - return this; -}; - -// format a parsed object into a url string -function urlFormat(obj) { - // ensure it's an object, and not a string url. - // If it's an obj, this is a no-op. - // this way, you can call url_format() on strings - // to clean up potentially wonky urls. - if (util.isString(obj)) obj = urlParse(obj); - if (!(obj instanceof Url)) return Url.prototype.format.call(obj); - return obj.format(); -} - -Url.prototype.format = function() { - var auth = this.auth || ''; - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ':'); - auth += '@'; - } - - var protocol = this.protocol || '', - pathname = this.pathname || '', - hash = this.hash || '', - host = false, - query = ''; - - if (this.host) { - host = auth + this.host; - } else if (this.hostname) { - host = auth + (this.hostname.indexOf(':') === -1 ? - this.hostname : - '[' + this.hostname + ']'); - if (this.port) { - host += ':' + this.port; - } - } - - if (this.query && - util.isObject(this.query) && - Object.keys(this.query).length) { - query = querystring.stringify(this.query); - } - - var search = this.search || (query && ('?' + query)) || ''; - - if (protocol && protocol.substr(-1) !== ':') protocol += ':'; - - // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. - // unless they had them to begin with. - if (this.slashes || - (!protocol || slashedProtocol[protocol]) && host !== false) { - host = '//' + (host || ''); - if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; - } else if (!host) { - host = ''; - } - - if (hash && hash.charAt(0) !== '#') hash = '#' + hash; - if (search && search.charAt(0) !== '?') search = '?' + search; - - pathname = pathname.replace(/[?#]/g, function(match) { - return encodeURIComponent(match); - }); - search = search.replace('#', '%23'); - - return protocol + host + pathname + search + hash; -}; - -function urlResolve(source, relative) { - return urlParse(source, false, true).resolve(relative); -} - -Url.prototype.resolve = function(relative) { - return this.resolveObject(urlParse(relative, false, true)).format(); -}; - -function urlResolveObject(source, relative) { - if (!source) return relative; - return urlParse(source, false, true).resolveObject(relative); -} - -Url.prototype.resolveObject = function(relative) { - if (util.isString(relative)) { - var rel = new Url(); - rel.parse(relative, false, true); - relative = rel; - } - - var result = new Url(); - var tkeys = Object.keys(this); - for (var tk = 0; tk < tkeys.length; tk++) { - var tkey = tkeys[tk]; - result[tkey] = this[tkey]; - } - - // hash is always overridden, no matter what. - // even href="" will remove it. - result.hash = relative.hash; - - // if the relative url is empty, then there's nothing left to do here. - if (relative.href === '') { - result.href = result.format(); - return result; - } - - // hrefs like //foo/bar always cut to the protocol. - if (relative.slashes && !relative.protocol) { - // take everything except the protocol from relative - var rkeys = Object.keys(relative); - for (var rk = 0; rk < rkeys.length; rk++) { - var rkey = rkeys[rk]; - if (rkey !== 'protocol') - result[rkey] = relative[rkey]; - } - - //urlParse appends trailing / to urls like http://www.example.com - if (slashedProtocol[result.protocol] && - result.hostname && !result.pathname) { - result.path = result.pathname = '/'; - } - - result.href = result.format(); - return result; - } - - if (relative.protocol && relative.protocol !== result.protocol) { - // if it's a known url protocol, then changing - // the protocol does weird things - // first, if it's not file:, then we MUST have a host, - // and if there was a path - // to begin with, then we MUST have a path. - // if it is file:, then the host is dropped, - // because that's known to be hostless. - // anything else is assumed to be absolute. - if (!slashedProtocol[relative.protocol]) { - var keys = Object.keys(relative); - for (var v = 0; v < keys.length; v++) { - var k = keys[v]; - result[k] = relative[k]; - } - result.href = result.format(); - return result; - } - - result.protocol = relative.protocol; - if (!relative.host && !hostlessProtocol[relative.protocol]) { - var relPath = (relative.pathname || '').split('/'); - while (relPath.length && !(relative.host = relPath.shift())); - if (!relative.host) relative.host = ''; - if (!relative.hostname) relative.hostname = ''; - if (relPath[0] !== '') relPath.unshift(''); - if (relPath.length < 2) relPath.unshift(''); - result.pathname = relPath.join('/'); - } else { - result.pathname = relative.pathname; - } - result.search = relative.search; - result.query = relative.query; - result.host = relative.host || ''; - result.auth = relative.auth; - result.hostname = relative.hostname || relative.host; - result.port = relative.port; - // to support http.request - if (result.pathname || result.search) { - var p = result.pathname || ''; - var s = result.search || ''; - result.path = p + s; - } - result.slashes = result.slashes || relative.slashes; - result.href = result.format(); - return result; - } - - var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), - isRelAbs = ( - relative.host || - relative.pathname && relative.pathname.charAt(0) === '/' - ), - mustEndAbs = (isRelAbs || isSourceAbs || - (result.host && relative.pathname)), - removeAllDots = mustEndAbs, - srcPath = result.pathname && result.pathname.split('/') || [], - relPath = relative.pathname && relative.pathname.split('/') || [], - psychotic = result.protocol && !slashedProtocol[result.protocol]; - - // if the url is a non-slashed url, then relative - // links like ../.. should be able - // to crawl up to the hostname, as well. This is strange. - // result.protocol has already been set by now. - // Later on, put the first path part into the host field. - if (psychotic) { - result.hostname = ''; - result.port = null; - if (result.host) { - if (srcPath[0] === '') srcPath[0] = result.host; - else srcPath.unshift(result.host); - } - result.host = ''; - if (relative.protocol) { - relative.hostname = null; - relative.port = null; - if (relative.host) { - if (relPath[0] === '') relPath[0] = relative.host; - else relPath.unshift(relative.host); - } - relative.host = null; - } - mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); - } - - if (isRelAbs) { - // it's absolute. - result.host = (relative.host || relative.host === '') ? - relative.host : result.host; - result.hostname = (relative.hostname || relative.hostname === '') ? - relative.hostname : result.hostname; - result.search = relative.search; - result.query = relative.query; - srcPath = relPath; - // fall through to the dot-handling below. - } else if (relPath.length) { - // it's relative - // throw away the existing file, and take the new path instead. - if (!srcPath) srcPath = []; - srcPath.pop(); - srcPath = srcPath.concat(relPath); - result.search = relative.search; - result.query = relative.query; - } else if (!util.isNullOrUndefined(relative.search)) { - // just pull out the search. - // like href='?foo'. - // Put this after the other two cases because it simplifies the booleans - if (psychotic) { - result.hostname = result.host = srcPath.shift(); - //occationaly the auth can get stuck only in host - //this especially happens in cases like - //url.resolveObject('mailto:local1@domain1', 'local2@domain2') - var authInHost = result.host && result.host.indexOf('@') > 0 ? - result.host.split('@') : false; - if (authInHost) { - result.auth = authInHost.shift(); - result.host = result.hostname = authInHost.shift(); - } - } - result.search = relative.search; - result.query = relative.query; - //to support http.request - if (!util.isNull(result.pathname) || !util.isNull(result.search)) { - result.path = (result.pathname ? result.pathname : '') + - (result.search ? result.search : ''); - } - result.href = result.format(); - return result; - } - - if (!srcPath.length) { - // no path at all. easy. - // we've already handled the other stuff above. - result.pathname = null; - //to support http.request - if (result.search) { - result.path = '/' + result.search; - } else { - result.path = null; - } - result.href = result.format(); - return result; - } - - // if a url ENDs in . or .., then it must get a trailing slash. - // however, if it ends in anything else non-slashy, - // then it must NOT get a trailing slash. - var last = srcPath.slice(-1)[0]; - var hasTrailingSlash = ( - (result.host || relative.host || srcPath.length > 1) && - (last === '.' || last === '..') || last === ''); - - // strip single dots, resolve double dots to parent dir - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = srcPath.length; i >= 0; i--) { - last = srcPath[i]; - if (last === '.') { - srcPath.splice(i, 1); - } else if (last === '..') { - srcPath.splice(i, 1); - up++; - } else if (up) { - srcPath.splice(i, 1); - up--; - } - } - - // if the path is allowed to go above the root, restore leading ..s - if (!mustEndAbs && !removeAllDots) { - for (; up--; up) { - srcPath.unshift('..'); - } - } - - if (mustEndAbs && srcPath[0] !== '' && - (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { - srcPath.unshift(''); - } - - if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { - srcPath.push(''); - } - - var isAbsolute = srcPath[0] === '' || - (srcPath[0] && srcPath[0].charAt(0) === '/'); - - // put the host back - if (psychotic) { - result.hostname = result.host = isAbsolute ? '' : - srcPath.length ? srcPath.shift() : ''; - //occationaly the auth can get stuck only in host - //this especially happens in cases like - //url.resolveObject('mailto:local1@domain1', 'local2@domain2') - var authInHost = result.host && result.host.indexOf('@') > 0 ? - result.host.split('@') : false; - if (authInHost) { - result.auth = authInHost.shift(); - result.host = result.hostname = authInHost.shift(); } - } - - mustEndAbs = mustEndAbs || (result.host && srcPath.length); - - if (mustEndAbs && !isAbsolute) { - srcPath.unshift(''); - } - - if (!srcPath.length) { - result.pathname = null; - result.path = null; - } else { - result.pathname = srcPath.join('/'); - } - - //to support request.http - if (!util.isNull(result.pathname) || !util.isNull(result.search)) { - result.path = (result.pathname ? result.pathname : '') + - (result.search ? result.search : ''); - } - result.auth = relative.auth || result.auth; - result.slashes = result.slashes || relative.slashes; - result.href = result.format(); - return result; -}; - -Url.prototype.parseHost = function() { - var host = this.host; - var port = portPattern.exec(host); - if (port) { - port = port[0]; - if (port !== ':') { - this.port = port.substr(1); + function removeNodeText(source, args) { + function removeNodeText(source, nodeName, textMatch) { + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch; + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + var ALL_TEXT_PATTERN = /^[\s\S]*$/; + var REPLACEMENT = ""; + replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT); + } + }); + }; + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); + } + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + function observeDocumentWithTimeout(callback, options) { + var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4; + var documentObserver = new MutationObserver(function (mutations, observer) { + observer.disconnect(); + callback(mutations, observer); + observer.observe(document.documentElement, options); + }); + documentObserver.observe(document.documentElement, options); + if (typeof timeout === "number") { + setTimeout(function () { + return documentObserver.disconnect(); + }, timeout); + } + } + function handleExistingNodes(selector, handler) { + var nodeList = document.querySelectorAll(selector); + var nodes = nodeListToArray(nodeList); + handler(nodes); + } + function handleMutations(mutations, handler) { + var addedNodes = getAddedNodes(mutations); + handler(addedNodes); + } + function replaceNodeText(source, node, pattern, replacement) { + var textContent = node.textContent; + if (textContent) { + node.textContent = textContent.replace(pattern, replacement); + hit(source); + } + } + function isTargetNode(node, nodeNameMatch, textContentMatch) { + var nodeName = node.nodeName, + textContent = node.textContent; + var nodeNameLowerCase = nodeName.toLowerCase(); + return textContent !== null && textContent !== "" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch)); + } + function parseNodeTextParams(nodeName, textMatch) { + var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var REGEXP_START_MARKER = "/"; + var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER)); + var selector = isStringNameMatch ? nodeName : "*"; + var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName); + var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch); + var patternMatch; + if (pattern) { + patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern); + } + return { + selector: selector, + nodeNameMatch: nodeNameMatch, + textContentMatch: textContentMatch, + patternMatch: patternMatch + }; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function nodeListToArray(nodeList) { + var nodes = []; + for (var i = 0; i < nodeList.length; i += 1) { + nodes.push(nodeList[i]); + } + return nodes; + } + function getAddedNodes(mutations) { + var nodes = []; + for (var i = 0; i < mutations.length; i += 1) { + var addedNodes = mutations[i].addedNodes; + for (var j = 0; j < addedNodes.length; j += 1) { + nodes.push(addedNodes[j]); + } + } + return nodes; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + removeNodeText.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - host = host.substr(0, host.length - port.length); - } - if (host) this.hostname = host; -}; - - -/***/ }), - -/***/ 5225: -/***/ ((module) => { - -"use strict"; - - -module.exports = { - isString: function(arg) { - return typeof(arg) === 'string'; - }, - isObject: function(arg) { - return typeof(arg) === 'object' && arg !== null; - }, - isNull: function(arg) { - return arg === null; - }, - isNullOrUndefined: function(arg) { - return arg == null; - } -}; - - -/***/ }), - -/***/ 2565: -/***/ (function(module, exports) { - -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) { - if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else { var mod; } -})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) { - /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */ - - /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ - - /* vim: set sts=2 sw=2 et tw=80: */ - - /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - "use strict"; - - if (!globalThis.chrome?.runtime?.id) { - throw new Error("This script should only be loaded in a browser extension."); - } - - if (typeof globalThis.browser === "undefined" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) { - const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; // Wrapping the bulk of this polyfill in a one-time-use function is a minor - // optimization for Firefox. Since Spidermonkey does not fully parse the - // contents of a function until the first time it's called, and since it will - // never actually need to be called, this allows the polyfill to be included - // in Firefox nearly for free. - - const wrapAPIs = extensionAPIs => { - // NOTE: apiMetadata is associated to the content of the api-metadata.json file - // at build time by replacing the following "include" with the content of the - // JSON file. - const apiMetadata = { - "alarms": { - "clear": { - "minArgs": 0, - "maxArgs": 1 - }, - "clearAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 + function setAttr(source, args) { + function setAttr(source, selector, attr) { + var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (!selector || !attr) { + return; + } + var allowedValues = ["true", "false"]; + if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) { + return; + } + var setAttr = function setAttr() { + var nodes = [].slice.call(document.querySelectorAll(selector)); + var set = false; + nodes.forEach(function (node) { + node.setAttribute(attr, value); + set = true; + }); + if (set) { + hit(source); } - }, - "bookmarks": { - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getChildren": { - "minArgs": 1, - "maxArgs": 1 - }, - "getRecent": { - "minArgs": 1, - "maxArgs": 1 - }, - "getSubTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTree": { - "minArgs": 0, - "maxArgs": 0 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 + }; + setAttr(); + observeDOMChanges(setAttr, true); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); + } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + function callbackWrapper() { + disconnect(); + callback(); + connect(); + } + connect(); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; } - }, - "browserAction": { - "disable": { - "minArgs": 0, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "enable": { - "minArgs": 0, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "getBadgeBackgroundColor": { - "minArgs": 1, - "maxArgs": 1 - }, - "getBadgeText": { - "minArgs": 1, - "maxArgs": 1 - }, - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "openPopup": { - "minArgs": 0, - "maxArgs": 0 - }, - "setBadgeBackgroundColor": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setBadgeText": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - }, - "setPopup": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setTitle": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true + if (wait) { + savedArgs = args; + return; } - }, - "browsingData": { - "remove": { - "minArgs": 2, - "maxArgs": 2 - }, - "removeCache": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeCookies": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeDownloads": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeFormData": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeHistory": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeLocalStorage": { - "minArgs": 1, - "maxArgs": 1 - }, - "removePasswords": { - "minArgs": 1, - "maxArgs": 1 - }, - "removePluginData": { - "minArgs": 1, - "maxArgs": 1 - }, - "settings": { - "minArgs": 0, - "maxArgs": 0 + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setAttr.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setConstant(source, args) { + function setConstant(source, property, value) { + var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ""; + var uboAliases = ["set-constant.js", "ubo-set-constant.js", "set.js", "ubo-set.js", "ubo-set-constant", "ubo-set"]; + if (uboAliases.includes(source.name)) { + if (stack.length !== 1 && !getNumberFromString(stack)) { + valueWrapper = stack; } - }, - "commands": { - "getAll": { - "minArgs": 0, - "maxArgs": 0 + stack = undefined; + } + if (!property || !matchStackTrace(stack, new Error().stack)) { + return; + } + var emptyArr = noopArray(); + var emptyObj = noopObject(); + var constantValue; + if (value === "undefined") { + constantValue = undefined; + } else if (value === "false") { + constantValue = false; + } else if (value === "true") { + constantValue = true; + } else if (value === "null") { + constantValue = null; + } else if (value === "emptyArr") { + constantValue = emptyArr; + } else if (value === "emptyObj") { + constantValue = emptyObj; + } else if (value === "noopFunc") { + constantValue = noopFunc; + } else if (value === "noopCallbackFunc") { + constantValue = noopCallbackFunc; + } else if (value === "trueFunc") { + constantValue = trueFunc; + } else if (value === "falseFunc") { + constantValue = falseFunc; + } else if (value === "throwFunc") { + constantValue = throwFunc; + } else if (value === "noopPromiseResolve") { + constantValue = noopPromiseResolve; + } else if (value === "noopPromiseReject") { + constantValue = noopPromiseReject; + } else if (/^\d+$/.test(value)) { + constantValue = parseFloat(value); + if (nativeIsNaN(constantValue)) { + return; } - }, - "contextMenus": { - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 + if (Math.abs(constantValue) > 32767) { + return; } - }, - "cookies": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAllCookieStores": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 + } else if (value === "-1") { + constantValue = -1; + } else if (value === "") { + constantValue = ""; + } else if (value === "yes") { + constantValue = "yes"; + } else if (value === "no") { + constantValue = "no"; + } else { + return; + } + var valueWrapperNames = ["asFunction", "asCallback", "asResolved", "asRejected"]; + if (valueWrapperNames.includes(valueWrapper)) { + var valueWrappersMap = { + asFunction(v) { + return function () { + return v; + }; + }, + asCallback(v) { + return function () { + return function () { + return v; + }; + }; + }, + asResolved(v) { + return Promise.resolve(v); + }, + asRejected(v) { + return Promise.reject(v); + } + }; + constantValue = valueWrappersMap[valueWrapper](constantValue); + } + var canceled = false; + var mustCancel = function mustCancel(value) { + if (canceled) { + return canceled; } - }, - "devtools": { - "inspectedWindow": { - "eval": { - "minArgs": 1, - "maxArgs": 2, - "singleCallbackArg": false + canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; + return canceled; + }; + var trapProp = function trapProp(base, prop, configurable, handler) { + if (!handler.init(base[prop])) { + return false; + } + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + if (origDescriptor instanceof Object) { + if (!origDescriptor.configurable) { + var message = "Property '".concat(prop, "' is not configurable"); + logMessage(source, message); + return false; } - }, - "panels": { - "create": { - "minArgs": 3, - "maxArgs": 3, - "singleCallbackArg": true + base[prop] = constantValue; + if (origDescriptor.set instanceof Function) { + prevSetter = origDescriptor.set; + } + } + Object.defineProperty(base, prop, { + configurable: configurable, + get() { + return handler.get(); }, - "elements": { - "createSidebarPane": { - "minArgs": 1, - "maxArgs": 1 + set(a) { + if (prevSetter !== undefined) { + prevSetter(a); + } + handler.set(a); + } + }); + return true; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + var inChainPropHandler = { + factValue: undefined, + init(a) { + this.factValue = a; + return true; + }, + get() { + return this.factValue; + }, + set(a) { + if (this.factValue === a) { + return; + } + this.factValue = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + } + }; + var endPropHandler = { + init(a) { + if (mustCancel(a)) { + return false; + } + return true; + }, + get() { + return constantValue; + }, + set(a) { + if (!mustCancel(a)) { + return; } + constantValue = a; + } + }; + if (!chain) { + var isTrapped = trapProp(base, prop, false, endPropHandler); + if (isTrapped) { + hit(source); } + return; } - }, - "downloads": { - "cancel": { - "minArgs": 1, - "maxArgs": 1 - }, - "download": { - "minArgs": 1, - "maxArgs": 1 - }, - "erase": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFileIcon": { - "minArgs": 1, - "maxArgs": 2 - }, - "open": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "pause": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeFile": { - "minArgs": 1, - "maxArgs": 1 - }, - "resume": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "show": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true + if (base !== undefined && base[prop] === null) { + trapProp(base, prop, true, inChainPropHandler); + return; } - }, - "extension": { - "isAllowedFileSchemeAccess": { - "minArgs": 0, - "maxArgs": 0 - }, - "isAllowedIncognitoAccess": { - "minArgs": 0, - "maxArgs": 0 + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + trapProp(base, prop, true, inChainPropHandler); } - }, - "history": { - "addUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "deleteRange": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "getVisits": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 + var propValue = owner[prop]; + if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { + setChainPropAccess(propValue, chain); } - }, - "i18n": { - "detectLanguage": { - "minArgs": 1, - "maxArgs": 1 + trapProp(base, prop, true, inChainPropHandler); + }; + setChainPropAccess(window, property); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function getNumberFromString(rawString) { + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return validDelay; + } + function noopArray() { + return []; + } + function noopObject() { + return {}; + } + function noopFunc() {} + function noopCallbackFunc() { + return noopFunc; + } + function trueFunc() { + return true; + } + function falseFunc() { + return false; + } + function throwFunc() { + throw new Error(); + } + function noopPromiseReject() { + return Promise.reject(); + } + function noopPromiseResolve() { + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; + if (typeof Response === "undefined") { + return; + } + var response = new Response(responseBody, { + status: 200, + statusText: "OK" + }); + Object.defineProperties(response, { + url: { + value: responseUrl }, - "getAcceptLanguages": { - "minArgs": 0, - "maxArgs": 0 + type: { + value: responseType + } + }); + return Promise.resolve(response); + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); + } + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; } - }, - "identity": { - "launchWebAuthFlow": { - "minArgs": 1, - "maxArgs": 1 + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; + } } - }, - "idle": { - "queryState": { - "minArgs": 1, - "maxArgs": 1 + } + return false; + } + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; } - }, - "management": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getSelf": { - "minArgs": 0, - "maxArgs": 0 - }, - "setEnabled": { - "minArgs": 2, - "maxArgs": 2 - }, - "uninstallSelf": { - "minArgs": 0, - "maxArgs": 1 + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; } - }, - "notifications": { - "clear": { - "minArgs": 1, - "maxArgs": 1 - }, - "create": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPermissionLevel": { - "minArgs": 0, - "maxArgs": 0 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; } - }, - "pageAction": { - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "hide": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - }, - "setPopup": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setTitle": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "show": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setConstant.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setCookie(source, args) { + function setCookie(source, name, value) { + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; + var validValue = getLimitedCookieValue(value); + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + return; + } + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; + } + hit(source); + document.cookie = cookieToSet; + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); } - }, - "permissions": { - "contains": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "request": { - "minArgs": 1, - "maxArgs": 1 + log("".concat(prefix, " trace start")); + if (trace) { + trace(); } - }, - "runtime": { - "getBackgroundPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPlatformInfo": { - "minArgs": 0, - "maxArgs": 0 - }, - "openOptionsPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "requestUpdateCheck": { - "minArgs": 0, - "maxArgs": 0 - }, - "sendMessage": { - "minArgs": 1, - "maxArgs": 3 - }, - "sendNativeMessage": { - "minArgs": 2, - "maxArgs": 2 - }, - "setUninstallURL": { - "minArgs": 1, - "maxArgs": 1 + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function getLimitedCookieValue(value) { + if (!value) { + return null; + } + var allowedCookieValues = new Set(["true", "false", "yes", "y", "no", "n", "ok", "accept", "reject", "allow", "deny"]); + var validValue; + if (allowedCookieValues.has(value.toLowerCase())) { + validValue = value; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + return null; } - }, - "sessions": { - "getDevices": { - "minArgs": 0, - "maxArgs": 1 - }, - "getRecentlyClosed": { - "minArgs": 0, - "maxArgs": 1 - }, - "restore": { - "minArgs": 0, - "maxArgs": 1 + if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { + return null; } - }, - "storage": { - "local": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "managed": { - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "sync": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 + } else { + return null; + } + return validValue; + } + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + return ""; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setCookie.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setCookieReload(source, args) { + function setCookieReload(source, name, value) { + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; + if (isCookieSetWithValue(document.cookie, name, value)) { + return; + } + var validValue = getLimitedCookieValue(value); + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(value, "'")); + return; + } + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; + } + document.cookie = cookieToSet; + hit(source); + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); } - }, - "tabs": { - "captureVisibleTab": { - "minArgs": 0, - "maxArgs": 2 - }, - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "detectLanguage": { - "minArgs": 0, - "maxArgs": 1 - }, - "discard": { - "minArgs": 0, - "maxArgs": 1 - }, - "duplicate": { - "minArgs": 1, - "maxArgs": 1 - }, - "executeScript": { - "minArgs": 1, - "maxArgs": 2 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 0 - }, - "getZoom": { - "minArgs": 0, - "maxArgs": 1 - }, - "getZoomSettings": { - "minArgs": 0, - "maxArgs": 1 - }, - "goBack": { - "minArgs": 0, - "maxArgs": 1 - }, - "goForward": { - "minArgs": 0, - "maxArgs": 1 - }, - "highlight": { - "minArgs": 1, - "maxArgs": 1 - }, - "insertCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "query": { - "minArgs": 1, - "maxArgs": 1 - }, - "reload": { - "minArgs": 0, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "sendMessage": { - "minArgs": 2, - "maxArgs": 3 - }, - "setZoom": { - "minArgs": 1, - "maxArgs": 2 - }, - "setZoomSettings": { - "minArgs": 1, - "maxArgs": 2 - }, - "update": { - "minArgs": 1, - "maxArgs": 2 + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function isCookieSetWithValue(cookieString, name, value) { + return cookieString.split(";").some(function (cookieStr) { + var pos = cookieStr.indexOf("="); + if (pos === -1) { + return false; } - }, - "topSites": { - "get": { - "minArgs": 0, - "maxArgs": 0 + var cookieName = cookieStr.slice(0, pos).trim(); + var cookieValue = cookieStr.slice(pos + 1).trim(); + return name === cookieName && value === cookieValue; + }); + } + function getLimitedCookieValue(value) { + if (!value) { + return null; + } + var allowedCookieValues = new Set(["true", "false", "yes", "y", "no", "n", "ok", "accept", "reject", "allow", "deny"]); + var validValue; + if (allowedCookieValues.has(value.toLowerCase())) { + validValue = value; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + return null; } - }, - "webNavigation": { - "getAllFrames": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFrame": { - "minArgs": 1, - "maxArgs": 1 + if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { + return null; } - }, - "webRequest": { - "handlerBehaviorChanged": { - "minArgs": 0, - "maxArgs": 0 + } else { + return null; + } + return validValue; + } + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + return ""; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setCookieReload.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setLocalStorageItem(source, args) { + function setLocalStorageItem(source, key, value) { + if (typeof key === "undefined") { + logMessage(source, "Item key should be specified."); + return; + } + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); + return; + } + var _window = window, + localStorage = _window.localStorage; + if (validValue === "$remove$") { + removeStorageItem(source, localStorage, key); + } else { + setStorageItem(source, localStorage, key, validValue); + } + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); } - }, - "windows": { - "create": { - "minArgs": 0, - "maxArgs": 1 - }, - "get": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 1 - }, - "getLastFocused": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 + log("".concat(prefix, " trace start")); + if (trace) { + trace(); } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - }; - - if (Object.keys(apiMetadata).length === 0) { - throw new Error("api-metadata.json has not been included in browser-polyfill"); } - /** - * A WeakMap subclass which creates and stores a value for any key which does - * not exist when accessed, but behaves exactly as an ordinary WeakMap - * otherwise. - * - * @param {function} createItem - * A function which will be called in order to create the value for any - * key which does not exist, the first time it is accessed. The - * function receives, as its only argument, the key being created. - */ - - - class DefaultWeakMap extends WeakMap { - constructor(createItem, items = undefined) { - super(items); - this.createItem = createItem; + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - - get(key) { - if (!this.has(key)) { - this.set(key, this.createItem(key)); - } - - return super.get(key); + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } - + nativeConsole("".concat(name, ": ").concat(message)); } - /** - * Returns true if the given object is an object with a `then` method, and can - * therefore be assumed to behave as a Promise. - * - * @param {*} value The value to test. - * @returns {boolean} True if the value is thenable. - */ - - - const isThenable = value => { - return value && typeof value === "object" && typeof value.then === "function"; - }; - /** - * Creates and returns a function which, when called, will resolve or reject - * the given promise based on how it is called: - * - * - If, when called, `chrome.runtime.lastError` contains a non-null object, - * the promise is rejected with that value. - * - If the function is called with exactly one argument, the promise is - * resolved to that value. - * - Otherwise, the promise is resolved to an array containing all of the - * function's arguments. - * - * @param {object} promise - * An object containing the resolution and rejection functions of a - * promise. - * @param {function} promise.resolve - * The promise's resolution function. - * @param {function} promise.reject - * The promise's rejection function. - * @param {object} metadata - * Metadata about the wrapped method which has created the callback. - * @param {boolean} metadata.singleCallbackArg - * Whether or not the promise is resolved with only the first - * argument of the callback, alternatively an array of all the - * callback arguments is resolved. By default, if the callback - * function is invoked with only a single argument, that will be - * resolved to the promise, while all arguments will be resolved as - * an array if multiple are given. - * - * @returns {function} - * The generated callback function. - */ - - - const makeCallback = (promise, metadata) => { - return (...callbackArgs) => { - if (extensionAPIs.runtime.lastError) { - promise.reject(new Error(extensionAPIs.runtime.lastError.message)); - } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) { - promise.resolve(callbackArgs[0]); - } else { - promise.resolve(callbackArgs); - } - }; - }; - - const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments"; - /** - * Creates a wrapper function for a method with the given name and metadata. - * - * @param {string} name - * The name of the method which is being wrapped. - * @param {object} metadata - * Metadata about the method being wrapped. - * @param {integer} metadata.minArgs - * The minimum number of arguments which must be passed to the - * function. If called with fewer than this number of arguments, the - * wrapper will raise an exception. - * @param {integer} metadata.maxArgs - * The maximum number of arguments which may be passed to the - * function. If called with more than this number of arguments, the - * wrapper will raise an exception. - * @param {boolean} metadata.singleCallbackArg - * Whether or not the promise is resolved with only the first - * argument of the callback, alternatively an array of all the - * callback arguments is resolved. By default, if the callback - * function is invoked with only a single argument, that will be - * resolved to the promise, while all arguments will be resolved as - * an array if multiple are given. - * - * @returns {function(object, ...*)} - * The generated wrapper function. - */ - - - const wrapAsyncFunction = (name, metadata) => { - return function asyncFunctionWrapper(target, ...args) { - if (args.length < metadata.minArgs) { - throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function setStorageItem(source, storage, key, value) { + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); + } + } + function removeStorageItem(source, storage, key) { + try { + storage.removeItem(key); + } catch (e) { + var message = "Unable to remove storage item due to: ".concat(e.message); + logMessage(source, message); + } + } + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); + } + var validValue; + if (value === "undefined") { + validValue = undefined; + } else if (value === "false") { + validValue = false; + } else if (value === "true") { + validValue = true; + } else if (value === "null") { + validValue = null; + } else if (value === "emptyArr") { + validValue = "[]"; + } else if (value === "emptyObj") { + validValue = "{}"; + } else if (value === "") { + validValue = ""; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + throw new Error("Invalid value"); } - - if (args.length > metadata.maxArgs) { - throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); + if (Math.abs(validValue) > 32767) { + throw new Error("Invalid value"); } - - return new Promise((resolve, reject) => { - if (metadata.fallbackToNoCallback) { - // This API method has currently no callback on Chrome, but it return a promise on Firefox, - // and so the polyfill will try to call it with a callback first, and it will fallback - // to not passing the callback if the first call fails. - try { - target[name](...args, makeCallback({ - resolve, - reject - }, metadata)); - } catch (cbError) { - console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError); - target[name](...args); // Update the API method metadata, so that the next API calls will not try to - // use the unsupported callback anymore. - - metadata.fallbackToNoCallback = false; - metadata.noCallback = true; - resolve(); - } - } else if (metadata.noCallback) { - target[name](...args); - resolve(); - } else { - target[name](...args, makeCallback({ - resolve, - reject - }, metadata)); + } else if (value === "yes") { + validValue = "yes"; + } else if (value === "no") { + validValue = "no"; + } else if (value === "$remove$") { + validValue = "$remove$"; + } else { + throw new Error("Invalid value"); + } + return validValue; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setLocalStorageItem.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setPopadsDummy(source, args) { + function setPopadsDummy(source) { + delete window.PopAds; + delete window.popns; + Object.defineProperties(window, { + PopAds: { + get: function get() { + hit(source); + return {}; } - }); - }; - }; - /** - * Wraps an existing method of the target object, so that calls to it are - * intercepted by the given wrapper function. The wrapper function receives, - * as its first argument, the original `target` object, followed by each of - * the arguments passed to the original method. - * - * @param {object} target - * The original target object that the wrapped method belongs to. - * @param {function} method - * The method being wrapped. This is used as the target of the Proxy - * object which is created to wrap the method. - * @param {function} wrapper - * The wrapper function which is called in place of a direct invocation - * of the wrapped method. - * - * @returns {Proxy} - * A Proxy object for the given method, which invokes the given wrapper - * method in its place. - */ - - - const wrapMethod = (target, method, wrapper) => { - return new Proxy(method, { - apply(targetMethod, thisObj, args) { - return wrapper.call(thisObj, target, ...args); - } - - }); - }; - - let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); - /** - * Wraps an object in a Proxy which intercepts and wraps certain methods - * based on the given `wrappers` and `metadata` objects. - * - * @param {object} target - * The target object to wrap. - * - * @param {object} [wrappers = {}] - * An object tree containing wrapper functions for special cases. Any - * function present in this object tree is called in place of the - * method in the same location in the `target` object tree. These - * wrapper methods are invoked as described in {@see wrapMethod}. - * - * @param {object} [metadata = {}] - * An object tree containing metadata used to automatically generate - * Promise-based wrapper functions for asynchronous. Any function in - * the `target` object tree which has a corresponding metadata object - * in the same location in the `metadata` tree is replaced with an - * automatically-generated wrapper function, as described in - * {@see wrapAsyncFunction} - * - * @returns {Proxy} - */ - - const wrapObject = (target, wrappers = {}, metadata = {}) => { - let cache = Object.create(null); - let handlers = { - has(proxyTarget, prop) { - return prop in target || prop in cache; }, - - get(proxyTarget, prop, receiver) { - if (prop in cache) { - return cache[prop]; - } - - if (!(prop in target)) { - return undefined; + popns: { + get: function get() { + hit(source); + return {}; } - - let value = target[prop]; - - if (typeof value === "function") { - // This is a method on the underlying object. Check if we need to do - // any wrapping. - if (typeof wrappers[prop] === "function") { - // We have a special-case wrapper for this method. - value = wrapMethod(target, target[prop], wrappers[prop]); - } else if (hasOwnProperty(metadata, prop)) { - // This is an async method that we have metadata for. Create a - // Promise wrapper for it. - let wrapper = wrapAsyncFunction(prop, metadata[prop]); - value = wrapMethod(target, target[prop], wrapper); - } else { - // This is a method that we don't know or care about. Return the - // original method, bound to the underlying object. - value = value.bind(target); - } - } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { - // This is an object that we need to do some wrapping for the children - // of. Create a sub-object wrapper for it with the appropriate child - // metadata. - value = wrapObject(value, wrappers[prop], metadata[prop]); - } else if (hasOwnProperty(metadata, "*")) { - // Wrap all properties in * namespace. - value = wrapObject(value, wrappers[prop], metadata["*"]); - } else { - // We don't need to do any wrapping for this property, - // so just forward all access to the underlying object. - Object.defineProperty(cache, prop, { - configurable: true, - enumerable: true, - - get() { - return target[prop]; - }, - - set(value) { - target[prop] = value; - } - - }); - return value; + } + }); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - - cache[prop] = value; - return value; - }, - - set(proxyTarget, prop, value, receiver) { - if (prop in cache) { - cache[prop] = value; - } else { - target[prop] = value; + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setPopadsDummy.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setSessionStorageItem(source, args) { + function setSessionStorageItem(source, key, value) { + if (typeof key === "undefined") { + logMessage(source, "Item key should be specified."); + return; + } + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); + return; + } + var _window = window, + sessionStorage = _window.sessionStorage; + if (validValue === "$remove$") { + removeStorageItem(source, sessionStorage, key); + } else { + setStorageItem(source, sessionStorage, key, validValue); + } + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - - return true; - }, - - defineProperty(proxyTarget, prop, desc) { - return Reflect.defineProperty(cache, prop, desc); - }, - - deleteProperty(proxyTarget, prop) { - return Reflect.deleteProperty(cache, prop); + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); } - - }; // Per contract of the Proxy API, the "get" proxy handler must return the - // original value of the target if that value is declared read-only and - // non-configurable. For this reason, we create an object with the - // prototype set to `target` instead of using `target` directly. - // Otherwise we cannot return a custom object for APIs that - // are declared read-only and non-configurable, such as `chrome.devtools`. - // - // The proxy handlers themselves will still use the original `target` - // instead of the `proxyTarget`, so that the methods and properties are - // dereferenced via the original targets. - - let proxyTarget = Object.create(target); - return new Proxy(proxyTarget, handlers); - }; - /** - * Creates a set of wrapper functions for an event object, which handles - * wrapping of listener functions that those messages are passed. - * - * A single wrapper is created for each listener function, and stored in a - * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener` - * retrieve the original wrapper, so that attempts to remove a - * previously-added listener work as expected. - * - * @param {DefaultWeakMap} wrapperMap - * A DefaultWeakMap object which will create the appropriate wrapper - * for a given listener function when one does not exist, and retrieve - * an existing one when it does. - * - * @returns {object} - */ - - - const wrapEvent = wrapperMap => ({ - addListener(target, listener, ...args) { - target.addListener(wrapperMap.get(listener), ...args); - }, - - hasListener(target, listener) { - return target.hasListener(wrapperMap.get(listener)); - }, - - removeListener(target, listener) { - target.removeListener(wrapperMap.get(listener)); + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - - }); - - const onRequestFinishedWrappers = new DefaultWeakMap(listener => { - if (typeof listener !== "function") { - return listener; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - /** - * Wraps an onRequestFinished listener function so that it will return a - * `getContent()` property which returns a `Promise` rather than using a - * callback API. - * - * @param {object} req - * The HAR entry object representing the network request. - */ - - - return function onRequestFinished(req) { - const wrappedReq = wrapObject(req, {} - /* wrappers */ - , { - getContent: { - minArgs: 0, - maxArgs: 0 - } - }); - listener(wrappedReq); - }; - }); - const onMessageWrappers = new DefaultWeakMap(listener => { - if (typeof listener !== "function") { - return listener; + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } - /** - * Wraps a message listener function so that it may send responses based on - * its return value, rather than by returning a sentinel value and calling a - * callback. If the listener function returns a Promise, the response is - * sent when the promise either resolves or rejects. - * - * @param {*} message - * The message sent by the other end of the channel. - * @param {object} sender - * Details about the sender of the message. - * @param {function(*)} sendResponse - * A callback which, when called with an arbitrary argument, sends - * that value as a response. - * @returns {boolean} - * True if the wrapped listener returned a Promise, which will later - * yield a response. False otherwise. - */ - - - return function onMessage(message, sender, sendResponse) { - let didCallSendResponse = false; - let wrappedSendResponse; - let sendResponsePromise = new Promise(resolve => { - wrappedSendResponse = function (response) { - didCallSendResponse = true; - resolve(response); - }; - }); - let result; - - try { - result = listener(message, sender, wrappedSendResponse); - } catch (err) { - result = Promise.reject(err); + nativeConsole("".concat(name, ": ").concat(message)); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function setStorageItem(source, storage, key, value) { + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); + } + } + function removeStorageItem(source, storage, key) { + try { + storage.removeItem(key); + } catch (e) { + var message = "Unable to remove storage item due to: ".concat(e.message); + logMessage(source, message); + } + } + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); + } + var validValue; + if (value === "undefined") { + validValue = undefined; + } else if (value === "false") { + validValue = false; + } else if (value === "true") { + validValue = true; + } else if (value === "null") { + validValue = null; + } else if (value === "emptyArr") { + validValue = "[]"; + } else if (value === "emptyObj") { + validValue = "{}"; + } else if (value === "") { + validValue = ""; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + throw new Error("Invalid value"); } - - const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called - // wrappedSendResponse synchronously, we can exit earlier - // because there will be no response sent from this listener. - - if (result !== true && !isResultThenable && !didCallSendResponse) { - return false; - } // A small helper to send the message if the promise resolves - // and an error if the promise rejects (a wrapped sendMessage has - // to translate the message into a resolved promise or a rejected - // promise). - - - const sendPromisedResult = promise => { - promise.then(msg => { - // send the message value. - sendResponse(msg); - }, error => { - // Send a JSON representation of the error if the rejected value - // is an instance of error, or the object itself otherwise. - let message; - - if (error && (error instanceof Error || typeof error.message === "string")) { - message = error.message; - } else { - message = "An unexpected error occurred"; - } - - sendResponse({ - __mozWebExtensionPolyfillReject__: true, - message - }); - }).catch(err => { - // Print an error on the console if unable to send the response. - console.error("Failed to send onMessage rejected reply", err); - }); - }; // If the listener returned a Promise, send the resolved value as a - // result, otherwise wait the promise related to the wrappedSendResponse - // callback to resolve and send it as a response. - - - if (isResultThenable) { - sendPromisedResult(result); - } else { - sendPromisedResult(sendResponsePromise); - } // Let Chrome know that the listener is replying. - - - return true; - }; - }); - - const wrappedSendMessageCallback = ({ - reject, - resolve - }, reply) => { - if (extensionAPIs.runtime.lastError) { - // Detect when none of the listeners replied to the sendMessage call and resolve - // the promise to undefined as in Firefox. - // See https://github.com/mozilla/webextension-polyfill/issues/130 - if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) { - resolve(); - } else { - reject(new Error(extensionAPIs.runtime.lastError.message)); + if (Math.abs(validValue) > 32767) { + throw new Error("Invalid value"); } - } else if (reply && reply.__mozWebExtensionPolyfillReject__) { - // Convert back the JSON representation of the error into - // an Error instance. - reject(new Error(reply.message)); + } else if (value === "yes") { + validValue = "yes"; + } else if (value === "no") { + validValue = "no"; + } else if (value === "$remove$") { + validValue = "$remove$"; } else { - resolve(reply); - } - }; - - const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => { - if (args.length < metadata.minArgs) { - throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); + throw new Error("Invalid value"); } - - if (args.length > metadata.maxArgs) { - throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); + return validValue; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setSessionStorageItem.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function trustedClickElement(source, args) { + function trustedClickElement(source, selectors) { + var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; + if (!selectors) { + return; } - - return new Promise((resolve, reject) => { - const wrappedCb = wrappedSendMessageCallback.bind(null, { - resolve, - reject + var OBSERVER_TIMEOUT_MS = 1e4; + var THROTTLE_DELAY_MS = 20; + var STATIC_CLICK_DELAY_MS = 150; + var COOKIE_MATCH_MARKER = "cookie:"; + var LOCAL_STORAGE_MATCH_MARKER = "localStorage:"; + var SELECTORS_DELIMITER = ","; + var COOKIE_STRING_DELIMITER = ";"; + var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; + var sleep = function sleep(delayMs) { + return new Promise(function (resolve) { + return setTimeout(resolve, delayMs); }); - args.push(wrappedCb); - apiNamespaceObj.sendMessage(...args); - }); - }; - - const staticWrappers = { - devtools: { - network: { - onRequestFinished: wrapEvent(onRequestFinishedWrappers) + }; + var parsedDelay; + if (delay) { + parsedDelay = parseInt(delay, 10); + var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; + if (!isValidDelay) { + var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); + logMessage(source, message); + return; } - }, - runtime: { - onMessage: wrapEvent(onMessageWrappers), - onMessageExternal: wrapEvent(onMessageWrappers), - sendMessage: wrappedSendMessage.bind(null, "sendMessage", { - minArgs: 1, - maxArgs: 3 - }) - }, - tabs: { - sendMessage: wrappedSendMessage.bind(null, "sendMessage", { - minArgs: 2, - maxArgs: 3 - }) } - }; - const settingMetadata = { - clear: { - minArgs: 1, - maxArgs: 1 - }, - get: { - minArgs: 1, - maxArgs: 1 - }, - set: { - minArgs: 1, - maxArgs: 1 + var canClick = !parsedDelay; + var cookieMatches = []; + var localStorageMatches = []; + var isInvertedMatchCookie = false; + var isInvertedMatchLocalStorage = false; + if (extraMatch) { + var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { + return matchStr.trim(); + }); + parsedExtraMatch.forEach(function (matchStr) { + if (matchStr.includes(COOKIE_MATCH_MARKER)) { + var _parseMatchArg = parseMatchArg(matchStr), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchValue = _parseMatchArg.matchValue; + isInvertedMatchCookie = isInvertedMatch; + var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ""); + cookieMatches.push(cookieMatch); + } + if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) { + var _parseMatchArg2 = parseMatchArg(matchStr), + _isInvertedMatch = _parseMatchArg2.isInvertedMatch, + _matchValue = _parseMatchArg2.matchValue; + isInvertedMatchLocalStorage = _isInvertedMatch; + var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ""); + localStorageMatches.push(localStorageMatch); + } + }); } - }; - apiMetadata.privacy = { - network: { - "*": settingMetadata - }, - services: { - "*": settingMetadata - }, - websites: { - "*": settingMetadata + if (cookieMatches.length > 0) { + var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); + var parsedCookies = parseCookieString(document.cookie); + var cookieKeys = Object.keys(parsedCookies); + if (cookieKeys.length === 0) { + return; + } + var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { + var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; + var keyMatch = toRegExp(key); + return cookieKeys.some(function (key) { + var keysMatched = keyMatch.test(key); + if (!keysMatched) { + return false; + } + if (!valueMatch) { + return true; + } + return valueMatch.test(parsedCookies[key]); + }); + }); + var shouldRun = cookiesMatched !== isInvertedMatchCookie; + if (!shouldRun) { + return; + } } - }; - return wrapObject(extensionAPIs, staticWrappers, apiMetadata); - }; // The build process adds a UMD wrapper around this file, which makes the - // `module` variable available. - - - module.exports = wrapAPIs(chrome); - } else { - module.exports = globalThis.browser; - } -}); -//# sourceMappingURL=browser-polyfill.js.map - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ loaded: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/node module decorator */ -/******/ (() => { -/******/ __webpack_require__.nmd = (module) => { -/******/ module.paths = []; -/******/ if (!module.children) module.children = []; -/******/ return module; -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -// ESM COMPAT FLAG -__webpack_require__.r(__webpack_exports__); - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - AdguardApi: () => (/* reexport */ AdguardApi) -}); - -// EXTERNAL MODULE: ../../node_modules/core-js/modules/es.error.cause.js -var es_error_cause = __webpack_require__(1372); -// EXTERNAL MODULE: ../../node_modules/core-js/modules/es.array.includes.js -var es_array_includes = __webpack_require__(9529); -// EXTERNAL MODULE: ../../node_modules/webextension-polyfill/dist/browser-polyfill.js -var browser_polyfill = __webpack_require__(2565); -var browser_polyfill_default = /*#__PURE__*/__webpack_require__.n(browser_polyfill); -;// CONCATENATED MODULE: ../tsurlfilter/dist/es/simple-regex-40f65170.js -/** - * Splits the string by the delimiter, ignoring escaped delimiters - * and without tokenizing. - * Works for plain strings that don't include string representation of - * complex entities, e.g $replace modifier values. - * - * @param string - string to split - * @param delimiter - delimiter - * @param escapeCharacter - escape character - * @param preserveEmptyTokens - if true, preserve empty parts - * @param shouldUnescape - if true, unescape characters - * @return array of string parts - */ -function splitByDelimiterWithEscapeCharacter(string, delimiter, escapeCharacter, preserveEmptyTokens, shouldUnescape) { - if (shouldUnescape === void 0) { shouldUnescape = true; } - if (!string) { - return []; - } - if (string.startsWith(delimiter)) { - // eslint-disable-next-line no-param-reassign - string = string.substring(1); - } - var words = []; - if (!string.includes(escapeCharacter)) { - words = string.split(delimiter); - if (!preserveEmptyTokens) { - words = words.filter(function (word) { return !!word; }); + if (localStorageMatches.length > 0) { + var localStorageMatched = localStorageMatches.every(function (str) { + var itemValue = window.localStorage.getItem(str); + return itemValue || itemValue === ""; + }); + var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; + if (!_shouldRun) { + return; + } } - return words; - } - var chars = []; - var makeWord = function () { - var word = chars.join(''); - words.push(word); - chars = []; - }; - for (var i = 0; i < string.length; i += 1) { - var char = string.charAt(i); - var isLastChar = i === (string.length - 1); - if (char === delimiter) { - var isEscapedChar = i > 0 && string[i - 1] === escapeCharacter; - if (isEscapedChar) { - if (shouldUnescape) { - chars.splice(chars.length - 1, 1); - } - chars.push(char); + var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { + return selector.trim(); + }); + var createElementObj = function createElementObj(element) { + return { + element: element || null, + clicked: false + }; + }; + var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); + var clickElementsBySequence = async function clickElementsBySequence() { + for (var i = 0; i < elementsSequence.length; i += 1) { + var elementObj = elementsSequence[i]; + if (i >= 1) { + await sleep(STATIC_CLICK_DELAY_MS); } - else { - makeWord(); + if (!elementObj.element) { + break; } - if (isLastChar) { - makeWord(); + if (!elementObj.clicked) { + elementObj.element.click(); + elementObj.clicked = true; + } + } + var allElementsClicked = elementsSequence.every(function (elementObj) { + return elementObj.clicked === true; + }); + if (allElementsClicked) { + hit(source); + } + }; + var handleElement = function handleElement(element, i) { + var elementObj = createElementObj(element); + elementsSequence[i] = elementObj; + if (canClick) { + clickElementsBySequence(); + } + }; + var findElements = function findElements(mutations, observer) { + var fulfilledSelectors = []; + selectorsSequence.forEach(function (selector, i) { + if (!selector) { + return; + } + var element = document.querySelector(selector); + if (!element) { + return; } + handleElement(element, i); + fulfilledSelectors.push(selector); + }); + selectorsSequence = selectorsSequence.map(function (selector) { + return fulfilledSelectors.includes(selector) ? null : selector; + }); + var allSelectorsFulfilled = selectorsSequence.every(function (selector) { + return selector === null; + }); + if (allSelectorsFulfilled) { + observer.disconnect(); + } + }; + var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); + observer.observe(document.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + if (parsedDelay) { + setTimeout(function () { + clickElementsBySequence(); + canClick = true; + }, parsedDelay); } - else if (isLastChar) { - chars.push(char); - makeWord(); + setTimeout(function () { + return observer.disconnect(); + }, OBSERVER_TIMEOUT_MS); + } + function hit(source) { + if (source.verbose !== true) { + return; } - else { - chars.push(char); + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - } - if (!preserveEmptyTokens) { - words = words.filter(function (word) { return !!word; }); - } - return words; -} -/** - * Checks if the specified string starts with a substr at the specified index. - * - * @param str - String to check - * @param startIndex - Index to start checking from - * @param substr - Substring to check - * @return boolean true if it does start - */ -function startsAtIndexWith(str, startIndex, substr) { - if (str.length - startIndex < substr.length) { - return false; - } - for (var i = 0; i < substr.length; i += 1) { - if (str.charAt(startIndex + i) !== substr.charAt(i)) { - return false; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); } - } - return true; -} -/** - * Checks if str has unquoted substr - * - * @param str - * @param substr - */ -function hasUnquotedSubstring(str, substr) { - var quotes = ['"', "'", '/']; - if (!str.includes(substr)) { - return false; - } - // eslint-disable-next-line @typescript-eslint/no-use-before-define - if (indexOfAny(str, quotes) === -1) { - return true; - } - var stack = []; - for (var i = 0; i < str.length; i += 1) { - var cursor = str[i]; - if (stack.length === 0) { - if (startsAtIndexWith(str, i, substr)) { - return true; - } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - if (quotes.indexOf(cursor) >= 0 - && (i === 0 || str[i - 1] !== '\\')) { - var last = stack.pop(); - if (!last) { - stack.push(cursor); - } - else if (last !== cursor) { - stack.push(last); - stack.push(cursor); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function parseCookieString(cookieString) { + var COOKIE_DELIMITER = "="; + var COOKIE_PAIRS_DELIMITER = ";"; + var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); + var cookieData = {}; + cookieChunks.forEach(function (singleCookie) { + var cookieKey; + var cookieValue = ""; + var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); + if (delimiterIndex === -1) { + cookieKey = singleCookie.trim(); + } else { + cookieKey = singleCookie.slice(0, delimiterIndex).trim(); + cookieValue = singleCookie.slice(delimiterIndex + 1); + } + cookieData[cookieKey] = cookieValue || null; + }); + return cookieData; + } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; } + }, delay); + }; + return wrapper; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - } - return false; -} -/** - * djb2 hash algorithm - * - * @param str string to get hash - * @param begin index from - * @param end index to - * @return {number} hash - */ -function fastHashBetween(str, begin, end) { - var hash = 5381; - for (var idx = begin; idx < end; idx += 1) { - hash = 33 * hash + str.charCodeAt(idx); - } - return hash; -} -/** - * djb2 hash algorithm - * - * @param str string to get hash - * @return {number} hash - */ -function fastHash(str) { - if (str === '') { - return 0; - } - var len = str.length; - return fastHashBetween(str, 0, len); -} -/** - * Look for any symbol from "chars" array starting at "start" index or from the start of the string - * - * @param str String to search - * @param chars Chars to search for - * @param start Start index (optional, inclusive) - * @return int Index of the element found or -1 if not - */ -function indexOfAny(str, chars, start) { - if (start === void 0) { start = 0; } - if (str.length <= start) { - return -1; - } - for (var i = start; i < str.length; i += 1) { - var c = str.charAt(i); - if (chars.indexOf(c) > -1) { - return i; + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } + nativeConsole("".concat(name, ": ").concat(message)); + } + function parseMatchArg(match) { + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); + return { + isInvertedMatch: isInvertedMatch, + matchRegexp: matchRegexp, + matchValue: matchValue + }; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedClickElement.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - return -1; -} -/** - * Replaces all occurences of find with replace in str - * - * @param str - * @param find - * @param replace - */ -function replaceAll(str, find, replace) { - if (!str) { - return str; - } - return str.split(find).join(replace); -} -/** - * Checks if arrays are equal - * - * @param left array - * @param right array - * @return {boolean} true on equality - */ -function stringArraysEquals(left, right) { - if (!left || !right) { - return !left && !right; - } - if (left.length !== right.length) { - return false; - } - for (var i = 0; i < left.length; i += 1) { - if (left[i] !== right[i]) { - return false; + function trustedReplaceFetchResponse(source, args) { + function trustedReplaceFetchResponse(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + return; } - } - return true; -} -/** - * Checks if arrays have an intersection - * - * @param left array - * @param right array - * @return {boolean} true on equality - */ -function stringArraysHaveIntersection(left, right) { - if (!left || !right) { - return true; - } - for (var i = 0; i < left.length; i += 1) { - if (right.includes(left[i])) { - return true; + if (pattern === "" && replacement !== "") { + logMessage(source, "Pattern argument should not be empty string"); + return; } - } - return false; -} - -/* eslint-disable prefer-regex-literals */ -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp -// should be escaped . * + ? ^ $ { } ( ) | [ ] / \ -// except of * | ^ -var specialCharacters = ['.', '+', '?', '$', '{', '}', '(', ')', '[', ']', '/', '\\']; -var reSpecialCharacters = new RegExp("[".concat(specialCharacters.join('\\'), "]"), 'g'); -var reSpecialCharactersFull = /[.*+?^${}()|[\]\\]/g; -var reEscapedSpecialCharactersFull = /\\[.*+?^${}()|[\]\\]/g; -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings -var escapeSequence = { - n: '\n', - r: '\r', - t: '\t', - b: '\b', - f: '\f', - v: '\v', -}; -/** - * Class with static helper methods for working with basic filtering rules patterns. - * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules - */ -var SimpleRegex = /** @class */ (function () { - function SimpleRegex() { - } - /** - * Extracts the shortcut from the rule's pattern. - * Shortcut is the longest substring of the pattern that does not contain - * any special characters. - * - * Please note, that the shortcut is always lower-case! - * - * @param pattern - network rule's pattern. - * @returns the shortcut or the empty string if we could not extract any. - */ - SimpleRegex.extractShortcut = function (pattern) { - if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) { - return this.extractRegexpShortcut(pattern); + var shouldLog = pattern === "" && replacement === ""; + var nativeFetch = fetch; + var shouldReplace = false; + var fetchData; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + fetchData = getFetchData(args); + if (shouldLog) { + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); + } + shouldReplace = matchRequestProps(source, propsToMatch, fetchData); + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; + var forgedResponse = new Response(textContent, { + status: status, + statusText: statusText, + headers: headers + }); + Object.defineProperties(forgedResponse, { + url: { + value: url + }, + type: { + value: type + }, + ok: { + value: ok + }, + bodyUsed: { + value: bodyUsed + }, + redirected: { + value: redirected + } + }); + return forgedResponse; + }; + return nativeFetch.apply(null, args).then(function (response) { + return response.text().then(function (bodyText) { + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); + hit(source); + return forgedResponse; + }).catch(function () { + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + }); + }).catch(function () { + return Reflect.apply(target, thisArg, args); + }); + }; + var fetchHandler = { + apply: handlerWrapper + }; + fetch = new Proxy(fetch, fetchHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; } - return this.extractBasicShortcut(pattern); - }; - /** - * Searches for the longest substring of the pattern that - * does not contain any special characters: *,^,|. - * - * @param pattern - network rule's pattern. - * @returns the shortcut or the empty string - */ - SimpleRegex.extractBasicShortcut = function (pattern) { - var longest = ''; - var parts = pattern.split(this.rePatternSpecialCharacters); - for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) { - var part = parts_1[_i]; - if (part.length > longest.length) { - longest = part; + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - return (longest || '').toLowerCase(); - }; - /** - * Searches for a shortcut inside of a regexp pattern. - * Shortcut in this case is a longest string with no REGEX special characters. - * Also, we discard complicated regexps right away. - * - * @param pattern - network rule's pattern (regexp). - * @returns the shortcut or the empty string - */ - SimpleRegex.extractRegexpShortcut = function (pattern) { - var reText = pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length); - if (reText.length === 0) { - // The rule is too short, doing nothing - return ''; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - if (reText.indexOf('?') >= 0) { - // Do not mess with complex expressions which use lookahead - // And with those using ? special character - // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/978 - return ''; + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } - var specialCharacter = '$$$'; - // Prepend specialCharacter for the following replace calls to work properly - reText = specialCharacter + reText; - // Strip all types of brackets - reText = reText.replace(/[^\\]\(.*[^\\]\)/, specialCharacter); - reText = reText.replace(/[^\\]\[.*[^\\]\]/, specialCharacter); - reText = reText.replace(/[^\\]\{.*[^\\]\}/, specialCharacter); - // Strip some special characters - reText = reText.replace(/[^\\]\\[a-zA-Z]/, specialCharacter); - // Replace \. with . - reText = reText.replace(/\\\./g, '.'); - // Split by special characters - // `.` is one of the special characters so our `specialCharacter` - // will be removed from the resulting array - var parts = reText.split(/[\\^$*+?()|[\]{}]/); - var longest = ''; - for (var i = 0; i < parts.length; i += 1) { - var part = parts[i]; - if (part.length > longest.length) { - longest = part; - } + nativeConsole("".concat(name, ": ").concat(message)); + } + function getFetchData(args) { + var fetchPropsObj = {}; + var fetchUrl; + var fetchInit; + if (args[0] instanceof Request) { + var requestData = getRequestData(args[0]); + fetchUrl = requestData.url; + fetchInit = requestData; + } else { + fetchUrl = args[0]; + fetchInit = args[1]; } - return longest.toLowerCase(); - }; - /** - * patternToRegexp is a helper method for creating regular expressions from the simple - * wildcard-based syntax which is used in basic filters: - * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules - * - * @param pattern - basic rule pattern - * @returns regular expression - */ - SimpleRegex.patternToRegexp = function (pattern) { - if (pattern === this.MASK_START_URL - || pattern === this.MASK_PIPE - || pattern === this.MASK_ANY_CHARACTER - || pattern === '') { - return this.REGEX_ANY_CHARACTER; + fetchPropsObj.url = fetchUrl; + if (fetchInit instanceof Object) { + var props = Object.keys(fetchInit); + props.forEach(function (prop) { + fetchPropsObj[prop] = fetchInit[prop]; + }); } - if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) { - // This is a regex rule, just remove the regex markers - return pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length); + return fetchPropsObj; + } + function objectToString(obj) { + if (!obj || typeof obj !== "object") { + return String(obj); } - // Escape special characters except of * | ^ - var regex = pattern.replace(reSpecialCharacters, '\\$&'); - // Now escape "|" characters but avoid escaping them in the special places - if (regex.startsWith(this.MASK_START_URL)) { - regex = regex.substring(0, this.MASK_START_URL.length) - + replaceAll(regex.substring(this.MASK_START_URL.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, "\\".concat(this.MASK_PIPE)) - + regex.substring(regex.length - this.MASK_PIPE.length); + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; } - else { - regex = regex.substring(0, this.MASK_PIPE.length) - + replaceAll(regex.substring(this.MASK_PIPE.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, "\\".concat(this.MASK_PIPE)) - + regex.substring(regex.length - this.MASK_PIPE.length); + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); } - // Replace special URL masks - regex = replaceAll(regex, this.MASK_ANY_CHARACTER, this.REGEX_ANY_CHARACTER); - regex = replaceAll(regex, this.MASK_SEPARATOR, this.REGEX_SEPARATOR); - // Replace start URL and pipes - if (regex.startsWith(this.MASK_START_URL)) { - regex = this.REGEX_START_URL + regex.substring(this.MASK_START_URL.length); + return isMatched; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); } - else if (regex.startsWith(this.MASK_PIPE)) { - regex = this.REGEX_START_STRING + regex.substring(this.MASK_PIPE.length); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - if (regex.endsWith(this.MASK_PIPE)) { - regex = regex.substring(0, regex.length - this.MASK_PIPE.length) + this.REGEX_END_STRING; + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); } - return regex; - }; - /** - * Creates RegExp object from string in '/reg_exp/gi' format - * - * @param str - */ - SimpleRegex.patternFromString = function (str) { - var parts = splitByDelimiterWithEscapeCharacter(str, '/', '\\', true); - var modifiers = (parts[1] || ''); - if (modifiers.indexOf('g') < 0) { - modifiers += 'g'; + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; } - return new RegExp(parts[0], modifiers); - }; - /** - * Escapes characters with special meaning inside a regular expression. - * - * @param str - * @param searchPattern - Pattern for detecting special characters. Optional. - */ - SimpleRegex.escapeRegexSpecials = function (str, searchPattern) { - if (searchPattern === void 0) { searchPattern = reSpecialCharactersFull; } - return str.replace(searchPattern, '\\$&'); - }; - /** - * Unescapes characters with special meaning inside a regular expression. - * - * @param str - * @param searchPattern - Pattern for detecting special characters. Optional. - */ - SimpleRegex.unescapeRegexSpecials = function (str, searchPattern) { - if (searchPattern === void 0) { searchPattern = reEscapedSpecialCharactersFull; } - return str.replace(searchPattern, function (match) { return match.substring(1); }); - }; - /** - * Check if pattern is Regex - */ - SimpleRegex.isRegexPattern = function (str) { - return str.startsWith('/') && str.endsWith('/'); - }; - /** - * Unescapes special characters in a string - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings - */ - SimpleRegex.unescapeSpecials = function (str) { - var keys = Object.keys(escapeSequence).join('|'); - var regex = new RegExp("\\\\(".concat(keys, ")"), 'g'); - return str.replace(regex, function (match, group) { - return escapeSequence[group]; + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function getRequestData(request) { + var requestInitOptions = getRequestProps(); + var entries = requestInitOptions.map(function (key) { + var value = request[key]; + return [key, value]; }); - }; - /** - * Matching the beginning of an address. With this character you don't - * have to specify a particular protocol and subdomain in address mask. - * It means, || stands for http://*., https://*., ws://*., wss://*. at once. - */ - SimpleRegex.MASK_START_URL = '||'; - /** - * REGEX_START_URL corresponds to MASK_START_URL - */ - SimpleRegex.REGEX_START_URL = '^(http|https|ws|wss)://([a-z0-9-_.]+\\.)?'; - /** - * A pointer to the beginning or the end of address. The value depends on the - * character placement in the mask. For example, a rule swf| corresponds - * to http://example.com/annoyingflash.swf , but not to http://example.com/swf/index.html. - * |http://example.org corresponds to http://example.org, - * but not to http://domain.com?url=http://example.org. - */ - SimpleRegex.MASK_PIPE = '|'; - /** - * REGEX_END_STRING corresponds to MASK_PIPE if it is in the end of a pattern. - */ - SimpleRegex.REGEX_END_STRING = '$'; - /** - * REGEX_START_STRING corresponds to MASK_PIPE if it is in the beginning of a pattern. - */ - SimpleRegex.REGEX_START_STRING = '^'; - /** - * Separator character mark. Separator character is any character, - * but a letter, a digit, or one of the following: _ - . - */ - SimpleRegex.MASK_SEPARATOR = '^'; - /** - * REGEX_SEPARATOR corresponds to MASK_SEPARATOR - */ - SimpleRegex.REGEX_SEPARATOR = '([^ a-zA-Z0-9.%_-]|$)'; - /** - * This is a wildcard character. It is used to represent "any set of characters". - * This can also be an empty string or a string of any length. - */ - SimpleRegex.MASK_ANY_CHARACTER = '*'; - /** - * Path separator - */ - SimpleRegex.MASK_BACKSLASH = '/'; - /** - * REGEX_ANY_CHARACTER corresponds to MASK_ANY_CHARACTER. - */ - SimpleRegex.REGEX_ANY_CHARACTER = '.*'; - /** - * Enclose regex in two backslashes to mark a regex rule: - * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#regular-expressions-support - */ - SimpleRegex.MASK_REGEX_RULE = '/'; - /** - * Regex for matching special characters in modifier regex pattern - */ - SimpleRegex.reModifierPatternSpecialCharacters = /[[\],\\]/g; - /** - * Regex for matching escaped special characters in modifier regex pattern - */ - SimpleRegex.reModifierPatternEscapedSpecialCharacters = /\\[[\],\\]/g; - /** - * If string starts with exclamation mark "!" we consider it as comment - */ - SimpleRegex.MASK_COMMENT = '!'; - /** - * Min length of rule shortcut - * This value has been picked as a result of performance experiments - */ - SimpleRegex.MIN_SHORTCUT_LENGTH = 3; - /** - * Min length of generic rule shortcut - */ - SimpleRegex.MIN_GENERIC_RULE_LENGTH = 4; - /** Regex with basic matching pattern special characters */ - SimpleRegex.rePatternSpecialCharacters = new RegExp('[*^|]'); - return SimpleRegex; -}()); - - - -;// CONCATENATED MODULE: ../tsurlfilter/dist/es/network-rule-options.js -var NETWORK_RULE_OPTIONS = { - THIRD_PARTY: 'third-party', - FIRST_PARTY: 'first-party', - MATCH_CASE: 'match-case', - IMPORTANT: 'important', - DOMAIN: 'domain', - DENYALLOW: 'denyallow', - ELEMHIDE: 'elemhide', - GENERICHIDE: 'generichide', - SPECIFICHIDE: 'specifichide', - GENERICBLOCK: 'genericblock', - JSINJECT: 'jsinject', - URLBLOCK: 'urlblock', - CONTENT: 'content', - DOCUMENT: 'document', - DOC: 'doc', - STEALTH: 'stealth', - POPUP: 'popup', - EMPTY: 'empty', - MP4: 'mp4', - SCRIPT: 'script', - STYLESHEET: 'stylesheet', - SUBDOCUMENT: 'subdocument', - OBJECT: 'object', - IMAGE: 'image', - XMLHTTPREQUEST: 'xmlhttprequest', - MEDIA: 'media', - FONT: 'font', - WEBSOCKET: 'websocket', - OTHER: 'other', - PING: 'ping', - BADFILTER: 'badfilter', - CSP: 'csp', - REPLACE: 'replace', - COOKIE: 'cookie', - REDIRECT: 'redirect', - REDIRECTRULE: 'redirect-rule', - REMOVEPARAM: 'removeparam', - REMOVEHEADER: 'removeheader', - JSONPRUNE: 'jsonprune', - HLS: 'hls', - APP: 'app', - NETWORK: 'network', - EXTENSION: 'extension', - NOOP: '_', - CLIENT: 'client', - DNSREWRITE: 'dnsrewrite', - DNSTYPE: 'dnstype', - CTAG: 'ctag', -}; -var OPTIONS_DELIMITER = '$'; -var MASK_ALLOWLIST = '@@'; -var NOT_MARK = '~'; -var ESCAPE_CHARACTER = '\\'; - - - -;// CONCATENATED MODULE: ../tsurlfilter/dist/es/request-type.js -/** - * RequestType is the request types enumeration. - * Important: the enumeration is marked as const to avoid side effects when - * importing it into an extension. - */ -var RequestType = { - /** main frame */ - Document: 1, - /** (iframe) $subdocument */ - SubDocument: 2, - /** (javascript, etc) $script */ - Script: 4, - /** (css) $stylesheet */ - Stylesheet: 8, - /** (flash, etc) $object */ - Object: 16, - /** (any image) $image */ - Image: 32, - /** (ajax/fetch) $xmlhttprequest */ - XmlHttpRequest: 64, - /** (video/music) $media */ - Media: 128, - /** (any custom font) $font */ - Font: 256, - /** (a websocket connection) $websocket */ - WebSocket: 512, - /** (navigator.sendBeacon()) $ping */ - Ping: 1024, - /** any other request type */ - Other: 2048, // 1 << 11 -}; - - - -;// CONCATENATED MODULE: ../tsurlfilter/dist/es/cosmetic-rule-marker.js -/** - * Enumeration with the cosmetic rules markers. - * - * All cosmetic rules have similar structure: - * ``` - * rule = [domains] "marker" content - * domains = [domain0, domain1[, ...[, domainN]]] - * ``` - * - * For instance, element hiding rules look like: - * `example.org##.banner` - * - * In this case: - * * `[domains]` is `example.org` (comma-separated list of domains) - * * `marker` is `##` (marker of element hiding rules) - * * `content` is `.banner` (CSS selector) - */ -var CosmeticRuleMarker; -(function (CosmeticRuleMarker) { - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-elemhide-rules */ - CosmeticRuleMarker["ElementHiding"] = "##"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#element-hiding-rules-exceptions */ - CosmeticRuleMarker["ElementHidingException"] = "#@#"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors */ - CosmeticRuleMarker["ElementHidingExtCSS"] = "#?#"; - /** Basically the same as {@link CosmeticRuleMarker.ElementHidingException} */ - CosmeticRuleMarker["ElementHidingExtCSSException"] = "#@?#"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules */ - CosmeticRuleMarker["Css"] = "#$#"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules-exceptions */ - CosmeticRuleMarker["CssException"] = "#@$#"; - /** - * CSS rules that use extended CSS selectors: - * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors - */ - CosmeticRuleMarker["CssExtCSS"] = "#$?#"; - /** Basically the same as {@link CosmeticRuleMarker.CssException} */ - CosmeticRuleMarker["CssExtCSSException"] = "#@$?#"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules */ - CosmeticRuleMarker["Js"] = "#%#"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules-exceptions-1 */ - CosmeticRuleMarker["JsException"] = "#@%#"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules */ - CosmeticRuleMarker["Html"] = "$$"; - /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules-exceptions-1 */ - CosmeticRuleMarker["HtmlException"] = "$@$"; -})(CosmeticRuleMarker || (CosmeticRuleMarker = {})); -/** - * findCosmeticRuleMarker looks for a cosmetic rule marker in the rule text - * and returns the start index of the marker and the marker found. - * If nothing found, it returns -1 and null. - * - * @privateRemarks - * - * The idea is to search for the rule marker as quickly as possible. - * If we were simply using `Array.includes` we had to call it a dozen of times (for every marker), - * and that'd have been much slower. - * - * @param ruleText - rule text to scan. - */ -function findCosmeticRuleMarker(ruleText) { - var maxIndex = ruleText.length - 1; - for (var i = 0; i < maxIndex; i += 1) { - var char = ruleText.charAt(i); - switch (char) { - case '#': - if (i + 4 <= maxIndex) { - if (ruleText.charAt(i + 1) === '@' - && ruleText.charAt(i + 2) === '$' - && ruleText.charAt(i + 3) === '?' - && ruleText.charAt(i + 4) === '#') { - return [i, CosmeticRuleMarker.CssExtCSSException]; - } - } - if (i + 3 <= maxIndex) { - if (ruleText.charAt(i + 1) === '@' - && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') { - return [i, CosmeticRuleMarker.ElementHidingExtCSSException]; - } - if (ruleText.charAt(i + 1) === '@' - && ruleText.charAt(i + 2) === '$' && ruleText.charAt(i + 3) === '#') { - return [i, CosmeticRuleMarker.CssException]; - } - if (ruleText.charAt(i + 1) === '@' - && ruleText.charAt(i + 2) === '%' && ruleText.charAt(i + 3) === '#') { - return [i, CosmeticRuleMarker.JsException]; - } - if (ruleText.charAt(i + 1) === '$' - && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') { - return [i, CosmeticRuleMarker.CssExtCSS]; - } - } - if (i + 2 <= maxIndex) { - if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '#') { - return [i, CosmeticRuleMarker.ElementHidingException]; - } - if (ruleText.charAt(i + 1) === '?' && ruleText.charAt(i + 2) === '#') { - return [i, CosmeticRuleMarker.ElementHidingExtCSS]; - } - if (ruleText.charAt(i + 1) === '%' && ruleText.charAt(i + 2) === '#') { - return [i, CosmeticRuleMarker.Js]; - } - if (ruleText.charAt(i + 1) === '$' && ruleText.charAt(i + 2) === '#') { - return [i, CosmeticRuleMarker.Css]; - } - } - if (i + 1 <= maxIndex) { - if (ruleText.charAt(i + 1) === '#') { - // Handling false positives while looking for cosmetic rules in host files. - // - // For instance, it could look like this: - // 127.0.0.1 localhost ## this is just a comment - if (i > 0 && ruleText.charAt(i - 1) === ' ') { - return [-1, null]; - } - return [i, CosmeticRuleMarker.ElementHiding]; - } - } - break; - case '$': - if (i + 2 <= maxIndex) { - if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '$') { - return [i, CosmeticRuleMarker.HtmlException]; - } - } - if (i + 1 <= maxIndex) { - if (ruleText.charAt(i + 1) === '$') { - return [i, CosmeticRuleMarker.Html]; - } - } - break; + return Object.fromEntries(entries); + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedReplaceFetchResponse.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function trustedReplaceNodeText(source, args) { + function trustedReplaceNodeText(source, nodeName, textMatch, pattern, replacement) { + var uboAliases = ["replace-node-text.js", "rpnt.js", "sed.js"]; + if (uboAliases.includes(source.name)) { + replacement = pattern; + pattern = textMatch; + for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) { + extraArgs[_key - 5] = arguments[_key]; + } + for (var i = 0; i < extraArgs.length; i += 1) { + var arg = extraArgs[i]; + if (arg === "condition") { + textMatch = extraArgs[i + 1]; + break; + } + } + } + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch, + patternMatch = _parseNodeTextParams.patternMatch; + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + replaceNodeText(source, node, patternMatch, replacement); + } + }); + }; + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); + } + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + function observeDocumentWithTimeout(callback, options) { + var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4; + var documentObserver = new MutationObserver(function (mutations, observer) { + observer.disconnect(); + callback(mutations, observer); + observer.observe(document.documentElement, options); + }); + documentObserver.observe(document.documentElement, options); + if (typeof timeout === "number") { + setTimeout(function () { + return documentObserver.disconnect(); + }, timeout); + } + } + function handleExistingNodes(selector, handler) { + var nodeList = document.querySelectorAll(selector); + var nodes = nodeListToArray(nodeList); + handler(nodes); + } + function handleMutations(mutations, handler) { + var addedNodes = getAddedNodes(mutations); + handler(addedNodes); + } + function replaceNodeText(source, node, pattern, replacement) { + var textContent = node.textContent; + if (textContent) { + node.textContent = textContent.replace(pattern, replacement); + hit(source); + } + } + function isTargetNode(node, nodeNameMatch, textContentMatch) { + var nodeName = node.nodeName, + textContent = node.textContent; + var nodeNameLowerCase = nodeName.toLowerCase(); + return textContent !== null && textContent !== "" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch)); + } + function parseNodeTextParams(nodeName, textMatch) { + var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var REGEXP_START_MARKER = "/"; + var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER)); + var selector = isStringNameMatch ? nodeName : "*"; + var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName); + var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch); + var patternMatch; + if (pattern) { + patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern); } - } - return [-1, null]; -} -/** - * Detects is the rule is extended css rule - * @param marker - string to check - */ -function isExtCssMarker(marker) { - var EXTENDED_CSS_MARKERS = [ - CosmeticRuleMarker.CssExtCSS, - CosmeticRuleMarker.CssExtCSSException, - CosmeticRuleMarker.ElementHidingExtCSS, - CosmeticRuleMarker.ElementHidingExtCSSException, - ]; - return EXTENDED_CSS_MARKERS.indexOf(marker) !== -1; -} -/** - * AdGuard scriptlet rule mask - */ -var ADG_SCRIPTLET_MASK = '//scriptlet'; - - - -;// CONCATENATED MODULE: ../tsurlfilter/dist/es/index.js - - - - - - - - - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + return { + selector: selector, + nodeNameMatch: nodeNameMatch, + textContentMatch: textContentMatch, + patternMatch: patternMatch + }; + } + function hit(source) { + if (source.verbose !== true) { + return; } - return t; - }; - return __assign.apply(this, arguments); -}; -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} -function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - } - return to.concat(ar || Array.prototype.slice.call(from)); -} - -/** - * Compatibility types are used to configure engine for better support of different libraries - * For example: - * extension doesn't support $app modifier. So if we set in configuration CompatibilityTypes.Extension, - * engine would ignore rules with $app modifier - */ -var CompatibilityTypes; -(function (CompatibilityTypes) { - CompatibilityTypes[CompatibilityTypes["Extension"] = 1] = "Extension"; - CompatibilityTypes[CompatibilityTypes["CoreLibs"] = 2] = "CoreLibs"; - CompatibilityTypes[CompatibilityTypes["Dns"] = 4] = "Dns"; -})(CompatibilityTypes || (CompatibilityTypes = {})); -/** - * Application configuration class - */ -var Configuration = /** @class */ (function () { - function Configuration(inputConfig) { - this.defaultConfig = { - engine: null, - version: null, - verbose: false, - compatibility: null, + } + function nodeListToArray(nodeList) { + var nodes = []; + for (var i = 0; i < nodeList.length; i += 1) { + nodes.push(nodeList[i]); + } + return nodes; + } + function getAddedNodes(mutations) { + var nodes = []; + for (var i = 0; i < mutations.length; i += 1) { + var addedNodes = mutations[i].addedNodes; + for (var j = 0; j < addedNodes.length; j += 1) { + nodes.push(addedNodes[j]); + } + } + return nodes; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } }; - /** - * {'extension'|'corelibs'} engine application type - */ - this.engine = null; - /** - * {string} version - */ - this.version = null; - /** - * {boolean} verbose flag - */ - this.verbose = false; - /** - * compatibility flag - */ - this.compatibility = CompatibilityTypes.Extension; - var config = __assign(__assign({}, this.defaultConfig), inputConfig); - this.engine = config.engine; - this.version = config.version; - this.verbose = config.verbose; - this.compatibility = config.compatibility; - } - return Configuration; -}()); -// eslint-disable-next-line import/no-mutable-exports -var config$2 = new Configuration(); -/** - * Checks config is compatible with input level - * @param compatibilityLevel - * @private - */ -function isCompatibleWith(compatibilityLevel) { - if (config$2.compatibility === null) { - return false; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedReplaceNodeText.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - return (config$2.compatibility & compatibilityLevel) === compatibilityLevel; -} -var setConfiguration = function (outerConfig) { - config$2 = new Configuration(outerConfig); -}; - -/** - * This class stores found cosmetic css rules content in the appropriate collections - * It is primarily used by the {@see CosmeticResult} - */ -var CosmeticStylesResult = /** @class */ (function () { - /** - * Constructor - */ - function CosmeticStylesResult() { - this.generic = []; - this.specific = []; - this.genericExtCss = []; - this.specificExtCss = []; + function trustedReplaceXhrResponse(source, args) { + function trustedReplaceXhrResponse(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (typeof Proxy === "undefined") { + return; + } + if (pattern === "" && replacement !== "") { + var message = "Pattern argument should not be empty string."; + logMessage(source, message); + return; + } + var shouldLog = pattern === "" && replacement === ""; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); + if (shouldLog) { + var _message = "xhr( ".concat(objectToString(xhrData), " )"); + logMessage(source, _message, true); + hit(source); + return Reflect.apply(target, thisArg, args); + } + if (matchRequestProps(source, propsToMatch, xhrData)) { + thisArg.shouldBePrevented = true; + } + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return Reflect.apply(target, thisArg, args); + } + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + if (typeof content !== "string") { + return; + } + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + response: { + value: modifiedContent, + writable: false + }, + responseText: { + value: modifiedContent, + writable: false + } + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function objectToString(obj) { + if (!obj || typeof obj !== "object") { + return String(obj); + } + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; + } + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedReplaceXhrResponse.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - /** - * Appends rule to the appropriate collection - * @param rule - */ - CosmeticStylesResult.prototype.append = function (rule) { - if (rule.isGeneric()) { - if (rule.isExtendedCss()) { - this.genericExtCss.push(rule); + function trustedSetConstant(source, args) { + function trustedSetConstant(source, property, value, stack) { + if (!property || !matchStackTrace(stack, new Error().stack)) { + return; + } + var constantValue; + try { + constantValue = inferValue(value); + } catch (e) { + logMessage(source, e); + return; + } + var canceled = false; + var mustCancel = function mustCancel(value) { + if (canceled) { + return canceled; + } + canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; + return canceled; + }; + var trapProp = function trapProp(base, prop, configurable, handler) { + if (!handler.init(base[prop])) { + return false; + } + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + if (origDescriptor instanceof Object) { + if (!origDescriptor.configurable) { + var message = "Property '".concat(prop, "' is not configurable"); + logMessage(source, message); + return false; + } + base[prop] = constantValue; + if (origDescriptor.set instanceof Function) { + prevSetter = origDescriptor.set; + } + } + Object.defineProperty(base, prop, { + configurable: configurable, + get() { + return handler.get(); + }, + set(a) { + if (prevSetter !== undefined) { + prevSetter(a); + } + handler.set(a); + } + }); + return true; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + var inChainPropHandler = { + factValue: undefined, + init(a) { + this.factValue = a; + return true; + }, + get() { + return this.factValue; + }, + set(a) { + if (this.factValue === a) { + return; + } + this.factValue = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + } + }; + var endPropHandler = { + init(a) { + if (mustCancel(a)) { + return false; + } + return true; + }, + get() { + return constantValue; + }, + set(a) { + if (!mustCancel(a)) { + return; + } + constantValue = a; + } + }; + if (!chain) { + var isTrapped = trapProp(base, prop, false, endPropHandler); + if (isTrapped) { + hit(source); } - else { - this.generic.push(rule); + return; + } + if (base !== undefined && base[prop] === null) { + trapProp(base, prop, true, inChainPropHandler); + return; + } + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + trapProp(base, prop, true, inChainPropHandler); + } + var propValue = owner[prop]; + if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { + setChainPropAccess(propValue, chain); + } + trapProp(base, prop, true, inChainPropHandler); + }; + setChainPropAccess(window, property); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - else if (rule.isExtendedCss()) { - this.specificExtCss.push(rule); + } + function inferValue(value) { + if (value === "undefined") { + return undefined; } - else { - this.specific.push(rule); + if (value === "false") { + return false; } - }; - return CosmeticStylesResult; -}()); - -/** - * This class stores found script rules content in the appropriate collections - * It is primarily used by the {@see CosmeticResult} - */ -var CosmeticScriptsResult = /** @class */ (function () { - /** - * Constructor - */ - function CosmeticScriptsResult() { - this.generic = []; - this.specific = []; - } - /** - * Appends rule to appropriate collection - * @param rule - */ - CosmeticScriptsResult.prototype.append = function (rule) { - if (rule.isGeneric()) { - this.generic.push(rule); + if (value === "true") { + return true; } - else { - this.specific.push(rule); + if (value === "null") { + return null; } - }; - /** - * Returns rules collected - */ - CosmeticScriptsResult.prototype.getRules = function () { - return __spreadArray(__spreadArray([], this.generic, true), this.specific, true); - }; - return CosmeticScriptsResult; -}()); - -/** - * This class stores found cosmetic html rules content in the appropriate collections - * It is primarily used by the {@see CosmeticResult} - */ -var CosmeticHtmlResult = /** @class */ (function () { - /** - * Constructor - */ - function CosmeticHtmlResult() { - this.generic = []; - this.specific = []; - } - /** - * Appends rule to the appropriate collection - * @param rule - */ - CosmeticHtmlResult.prototype.append = function (rule) { - if (rule.isGeneric()) { - this.generic.push(rule); + if (value === "NaN") { + return NaN; } - else { - this.specific.push(rule); + var MAX_ALLOWED_NUM = 32767; + var numVal = Number(value); + if (!nativeIsNaN(numVal)) { + if (Math.abs(numVal) > MAX_ALLOWED_NUM) { + throw new Error("number values bigger than 32767 are not allowed"); + } + return numVal; } - }; - /** - * Returns rules collected - */ - CosmeticHtmlResult.prototype.getRules = function () { - return __spreadArray(__spreadArray([], this.generic, true), this.specific, true); - }; - return CosmeticHtmlResult; -}()); - -/** - * Cosmetic result is the representation of rules - * It is primarily used by the {@see CosmeticEngine} - */ -var CosmeticResult = /** @class */ (function () { - /** - * Constructor - */ - function CosmeticResult() { - this.elementHiding = new CosmeticStylesResult(); - this.CSS = new CosmeticStylesResult(); - this.JS = new CosmeticScriptsResult(); - this.Html = new CosmeticHtmlResult(); - } - /** - * Script rules - */ - CosmeticResult.prototype.getScriptRules = function () { - return this.JS.getRules(); - }; - return CosmeticResult; -}()); - -/** - * CosmeticOption is the enumeration of various content script options. - * Depending on the set of enabled flags the content script will contain different set of settings. - */ -var CosmeticOption; -(function (CosmeticOption) { - /** - * if generic elemhide and CSS rules are enabled - * Could be disabled by a $generichide rule and $elemhide rule. - */ - CosmeticOption[CosmeticOption["CosmeticOptionGenericCSS"] = 2] = "CosmeticOptionGenericCSS"; - /** - * if specific elemhide and CSS rules are enabled - * Could be disabled by a $specifichide rule and $elemhide rule. - */ - CosmeticOption[CosmeticOption["CosmeticOptionSpecificCSS"] = 4] = "CosmeticOptionSpecificCSS"; - /** - * if JS rules and scriptlets are enabled - * Could be disabled by a $jsinject rule. - */ - CosmeticOption[CosmeticOption["CosmeticOptionJS"] = 8] = "CosmeticOptionJS"; - /** - * if Html filtering rules are enabled - * Could be disabled by a $content rule. - */ - CosmeticOption[CosmeticOption["CosmeticOptionHtml"] = 16] = "CosmeticOptionHtml"; - /** - * TODO: Add support for these flags - * They are useful when content script is injected into an iframe - * In this case we can check what flags were applied to the top-level frame - */ - CosmeticOption[CosmeticOption["CosmeticOptionSourceGenericCSS"] = 32] = "CosmeticOptionSourceGenericCSS"; - CosmeticOption[CosmeticOption["CosmeticOptionSourceCSS"] = 64] = "CosmeticOptionSourceCSS"; - CosmeticOption[CosmeticOption["CosmeticOptionSourceJS"] = 128] = "CosmeticOptionSourceJS"; - /** - * everything is enabled - */ - CosmeticOption[CosmeticOption["CosmeticOptionAll"] = 30] = "CosmeticOptionAll"; - /** - * everything is disabled - */ - CosmeticOption[CosmeticOption["CosmeticOptionNone"] = 0] = "CosmeticOptionNone"; -})(CosmeticOption || (CosmeticOption = {})); - -function shareSameDomainSuffix(hostname, vhost) { - if (hostname.endsWith(vhost)) { - return (hostname.length === vhost.length || - hostname[hostname.length - vhost.length - 1] === '.'); - } - return false; -} -function extractDomainWithSuffix(hostname, publicSuffix) { - const publicSuffixIndex = hostname.length - publicSuffix.length - 2; - const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex); - if (lastDotBeforeSuffixIndex === -1) { - return hostname; - } - return hostname.slice(lastDotBeforeSuffixIndex + 1); -} -function getDomain(suffix, hostname, options) { - if (options.validHosts !== null) { - const validHosts = options.validHosts; - for (let i = 0; i < validHosts.length; i += 1) { - const vhost = validHosts[i]; - if ( shareSameDomainSuffix(hostname, vhost) === true) { - return vhost; - } + var errorMessage = "'".concat(value, "' value type can't be inferred"); + try { + var parsableVal = JSON.parse(value); + if (parsableVal instanceof Object || typeof parsableVal === "string") { + return parsableVal; + } + } catch (e) { + errorMessage += ": ".concat(e); } - } - if (suffix.length === hostname.length) { - return null; - } - return extractDomainWithSuffix(hostname, suffix); -} - -function getDomainWithoutSuffix(domain, suffix) { - return domain.slice(0, -suffix.length - 1); -} - -function extractHostname(url, urlIsValidHostname) { - let start = 0; - let end = url.length; - let hasUpper = false; - if (urlIsValidHostname === false) { - if (url.startsWith('data:') === true) { - return null; + throw new TypeError(errorMessage); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - while (start < url.length && url.charCodeAt(start) <= 32) { - start += 1; + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } - while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { - end -= 1; + nativeConsole("".concat(name, ": ").concat(message)); + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; } - if (url.charCodeAt(start) === 47 && - url.charCodeAt(start + 1) === 47 ) { - start += 2; + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; } - else { - const indexOfProtocol = url.indexOf(':/', start); - if (indexOfProtocol !== -1) { - const protocolSize = indexOfProtocol - start; - const c0 = url.charCodeAt(start); - const c1 = url.charCodeAt(start + 1); - const c2 = url.charCodeAt(start + 2); - const c3 = url.charCodeAt(start + 3); - const c4 = url.charCodeAt(start + 4); - if (protocolSize === 5 && - c0 === 104 && - c1 === 116 && - c2 === 116 && - c3 === 112 && - c4 === 115 ) ; - else if (protocolSize === 4 && - c0 === 104 && - c1 === 116 && - c2 === 116 && - c3 === 112 ) ; - else if (protocolSize === 3 && - c0 === 119 && - c1 === 115 && - c2 === 115 ) ; - else if (protocolSize === 2 && - c0 === 119 && - c1 === 115 ) ; - else { - for (let i = start; i < indexOfProtocol; i += 1) { - const lowerCaseCode = url.charCodeAt(i) | 32; - if (((lowerCaseCode >= 97 && lowerCaseCode <= 122) || - (lowerCaseCode >= 48 && lowerCaseCode <= 57) || - lowerCaseCode === 46 || - lowerCaseCode === 45 || - lowerCaseCode === 43) === false - ) { - return null; - } - } - } - start = indexOfProtocol + 2; - while (url.charCodeAt(start) === 47 ) { - start += 1; - } - } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; } - let indexOfIdentifier = -1; - let indexOfClosingBracket = -1; - let indexOfPort = -1; - for (let i = start; i < end; i += 1) { - const code = url.charCodeAt(i); - if (code === 35 || - code === 47 || - code === 63 - ) { - end = i; - break; - } - else if (code === 64) { - indexOfIdentifier = i; + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); } - else if (code === 93) { - indexOfClosingBracket = i; + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; } - else if (code === 58) { - indexOfPort = i; + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; } - else if (code >= 65 && code <= 90) { - hasUpper = true; + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; } + } } - if (indexOfIdentifier !== -1 && - indexOfIdentifier > start && - indexOfIdentifier < end) { - start = indexOfIdentifier + 1; + return false; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedSetConstant.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function trustedSetCookie(source, args) { + function trustedSetCookie(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; + if (typeof name === "undefined") { + logMessage(source, "Cookie name should be specified"); + return; } - if (url.charCodeAt(start) === 91 ) { - if (indexOfClosingBracket !== -1) { - return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); + if (typeof value === "undefined") { + logMessage(source, "Cookie value should be specified"); + return; + } + var parsedValue = parseKeywordValue(value); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; + } + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + } + document.cookie = cookieToSet; + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - return null; + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { - end = indexOfPort; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - } - while (end > start + 1 && url.charCodeAt(end - 1) === 46 ) { - end -= 1; - } - const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; - if (hasUpper) { - return hostname.toLowerCase(); - } - return hostname; -} - -function isProbablyIpv4(hostname) { - if (hostname.length < 7) { - return false; - } - if (hostname.length > 15) { - return false; - } - let numberOfDots = 0; - for (let i = 0; i < hostname.length; i += 1) { - const code = hostname.charCodeAt(i); - if (code === 46 ) { - numberOfDots += 1; + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getTrustedCookieOffsetMs(offsetExpiresSec) { + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + if (Number.isNaN(parsedSec)) { + return null; + } + } + return parsedSec * MS_IN_SEC; + } + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); } - else if (code < 48 || code > 57 ) { - return false; + return parsedValue; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; } + return ""; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedSetCookie.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - return (numberOfDots === 3 && - hostname.charCodeAt(0) !== 46 && - hostname.charCodeAt(hostname.length - 1) !== 46 ); -} -function isProbablyIpv6(hostname) { - if (hostname.length < 3) { - return false; - } - let start = hostname[0] === '[' ? 1 : 0; - let end = hostname.length; - if (hostname[end - 1] === ']') { - end -= 1; - } - if (end - start > 39) { - return false; - } - let hasColon = false; - for (; start < end; start += 1) { - const code = hostname.charCodeAt(start); - if (code === 58 ) { - hasColon = true; + function trustedSetCookieReload(source, args) { + function trustedSetCookieReload(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; + if (typeof name === "undefined") { + logMessage(source, "Cookie name should be specified"); + return; } - else if (((code >= 48 && code <= 57) || - (code >= 97 && code <= 102) || - (code >= 65 && code <= 90)) === - false) { - return false; + if (typeof value === "undefined") { + logMessage(source, "Cookie value should be specified"); + return; } - } - return hasColon; -} -function isIp$1(hostname) { - return isProbablyIpv6(hostname) || isProbablyIpv4(hostname); -} - -function isValidAscii(code) { - return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127); -} -function isValidHostname (hostname) { - if (hostname.length > 255) { - return false; - } - if (hostname.length === 0) { - return false; - } - if ( isValidAscii(hostname.charCodeAt(0)) === false) { - return false; - } - let lastDotIndex = -1; - let lastCharCode = -1; - const len = hostname.length; - for (let i = 0; i < len; i += 1) { - const code = hostname.charCodeAt(i); - if (code === 46 ) { - if ( - i - lastDotIndex > 64 || - lastCharCode === 46 || - lastCharCode === 45 || - lastCharCode === 95) { - return false; - } - lastDotIndex = i; + if (isCookieSetWithValue(document.cookie, name, value)) { + return; } - else if (( isValidAscii(code) || code === 45 || code === 95) === - false) { - return false; + var parsedValue = parseKeywordValue(value); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; } - lastCharCode = code; - } - return ( - len - lastDotIndex - 1 <= 63 && - lastCharCode !== 45); -} - -function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) { - return { - allowIcannDomains, - allowPrivateDomains, - detectIp, - extractHostname, - mixedInputs, - validHosts, - validateHostname, - }; -} -const DEFAULT_OPTIONS = setDefaultsImpl({}); -function setDefaults(options) { - if (options === undefined) { - return DEFAULT_OPTIONS; - } - return setDefaultsImpl(options); -} - -function getSubdomain(hostname, domain) { - if (domain.length === hostname.length) { - return ''; - } - return hostname.slice(0, -domain.length - 1); -} - -function getEmptyResult() { - return { - domain: null, - domainWithoutSuffix: null, - hostname: null, - isIcann: null, - isIp: null, - isPrivate: null, - publicSuffix: null, - subdomain: null, - }; -} -function es_resetResult(result) { - result.domain = null; - result.domainWithoutSuffix = null; - result.hostname = null; - result.isIcann = null; - result.isIp = null; - result.isPrivate = null; - result.publicSuffix = null; - result.subdomain = null; -} -function es_parseImpl(url, step, suffixLookup, partialOptions, result) { - const options = setDefaults(partialOptions); - if (typeof url !== 'string') { - return result; - } - if (options.extractHostname === false) { - result.hostname = url; - } - else if (options.mixedInputs === true) { - result.hostname = extractHostname(url, isValidHostname(url)); - } - else { - result.hostname = extractHostname(url, false); - } - if (step === 0 || result.hostname === null) { - return result; - } - if (options.detectIp === true) { - result.isIp = isIp$1(result.hostname); - if (result.isIp === true) { - return result; + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; } - } - if (options.validateHostname === true && - options.extractHostname === true && - isValidHostname(result.hostname) === false) { - result.hostname = null; - return result; - } - suffixLookup(result.hostname, options, result); - if (step === 2 || result.publicSuffix === null) { - return result; - } - result.domain = getDomain(result.publicSuffix, result.hostname, options); - if (step === 3 || result.domain === null) { - return result; - } - result.subdomain = getSubdomain(result.hostname, result.domain); - if (step === 4 ) { - return result; - } - result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix); - return result; -} - -function fastPathLookup (hostname, options, out) { - if (options.allowPrivateDomains === false && hostname.length > 3) { - const last = hostname.length - 1; - const c3 = hostname.charCodeAt(last); - const c2 = hostname.charCodeAt(last - 1); - const c1 = hostname.charCodeAt(last - 2); - const c0 = hostname.charCodeAt(last - 3); - if (c3 === 109 && - c2 === 111 && - c1 === 99 && - c0 === 46 ) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'com'; - return true; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - else if (c3 === 103 && - c2 === 114 && - c1 === 111 && - c0 === 46 ) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'org'; - return true; + document.cookie = cookieToSet; + hit(source); + var cookieValueToCheck = parseCookieString(document.cookie)[name]; + if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) { + window.location.reload(); } - else if (c3 === 117 && - c2 === 100 && - c1 === 101 && - c0 === 46 ) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'edu'; - return true; + } + function hit(source) { + if (source.verbose !== true) { + return; } - else if (c3 === 118 && - c2 === 111 && - c1 === 103 && - c0 === 46 ) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'gov'; - return true; + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - else if (c3 === 116 && - c2 === 101 && - c1 === 110 && - c0 === 46 ) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'net'; - return true; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - else if (c3 === 101 && - c2 === 100 && - c1 === 46 ) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'de'; - return true; + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } - } - return false; -} - -const exceptions = (function () { - const _0 = { "$": 1, "succ": {} }, _1 = { "$": 0, "succ": { "city": _0 } }; - const exceptions = { "$": 0, "succ": { "ck": { "$": 0, "succ": { "www": _0 } }, "jp": { "$": 0, "succ": { "kawasaki": _1, "kitakyushu": _1, "kobe": _1, "nagoya": _1, "sapporo": _1, "sendai": _1, "yokohama": _1 } } } }; - return exceptions; -})(); -const rules = (function () { - const _2 = { "$": 1, "succ": {} }, _3 = { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "mil": _2, "org": _2 } }, _4 = { "$": 2, "succ": {} }, _5 = { "$": 1, "succ": { "blogspot": _4 } }, _6 = { "$": 1, "succ": { "gov": _2 } }, _7 = { "$": 0, "succ": { "*": _4 } }, _8 = { "$": 0, "succ": { "*": _2 } }, _9 = { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "gov": _2 } }, _10 = { "$": 1, "succ": { "co": _4 } }, _11 = { "$": 1, "succ": { "ng": _4 } }, _12 = { "$": 0, "succ": { "s3": _4 } }, _13 = { "$": 0, "succ": { "dualstack": _12 } }, _14 = { "$": 0, "succ": { "s3": _4, "dualstack": _12, "s3-website": _4 } }, _15 = { "$": 0, "succ": { "apps": _4 } }, _16 = { "$": 0, "succ": { "app": _4 } }, _17 = { "$": 0, "succ": { "j": _4 } }, _18 = { "$": 0, "succ": { "user": _4 } }, _19 = { "$": 1, "succ": { "ybo": _4 } }, _20 = { "$": 1, "succ": { "gov": _2, "blogspot": _4, "nym": _4 } }, _21 = { "$": 0, "succ": { "cust": _4 } }, _22 = { "$": 1, "succ": { "edu": _2, "biz": _2, "net": _2, "org": _2, "gov": _2, "info": _2, "com": _2 } }, _23 = { "$": 1, "succ": { "blogspot": _4, "nym": _4 } }, _24 = { "$": 1, "succ": { "for": _4 } }, _25 = { "$": 1, "succ": { "barsy": _4 } }, _26 = { "$": 0, "succ": { "forgot": _4 } }, _27 = { "$": 0, "succ": { "jelastic": _4 } }, _28 = { "$": 1, "succ": { "gs": _2 } }, _29 = { "$": 0, "succ": { "nes": _2 } }, _30 = { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _2 } }, _31 = { "$": 1, "succ": { "cc": _2, "lib": _2 } }; - const rules = { "$": 0, "succ": { "ac": _3, "ad": { "$": 1, "succ": { "nom": _2 } }, "ae": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "sch": _2, "ac": _2, "gov": _2, "mil": _2, "blogspot": _4, "nom": _4 } }, "aero": { "$": 1, "succ": { "accident-investigation": _2, "accident-prevention": _2, "aerobatic": _2, "aeroclub": _2, "aerodrome": _2, "agents": _2, "aircraft": _2, "airline": _2, "airport": _2, "air-surveillance": _2, "airtraffic": _2, "air-traffic-control": _2, "ambulance": _2, "amusement": _2, "association": _2, "author": _2, "ballooning": _2, "broker": _2, "caa": _2, "cargo": _2, "catering": _2, "certification": _2, "championship": _2, "charter": _2, "civilaviation": _2, "club": _2, "conference": _2, "consultant": _2, "consulting": _2, "control": _2, "council": _2, "crew": _2, "design": _2, "dgca": _2, "educator": _2, "emergency": _2, "engine": _2, "engineer": _2, "entertainment": _2, "equipment": _2, "exchange": _2, "express": _2, "federation": _2, "flight": _2, "fuel": _2, "gliding": _2, "government": _2, "groundhandling": _2, "group": _2, "hanggliding": _2, "homebuilt": _2, "insurance": _2, "journal": _2, "journalist": _2, "leasing": _2, "logistics": _2, "magazine": _2, "maintenance": _2, "media": _2, "microlight": _2, "modelling": _2, "navigation": _2, "parachuting": _2, "paragliding": _2, "passenger-association": _2, "pilot": _2, "press": _2, "production": _2, "recreation": _2, "repbody": _2, "res": _2, "research": _2, "rotorcraft": _2, "safety": _2, "scientist": _2, "services": _2, "show": _2, "skydiving": _2, "software": _2, "student": _2, "trader": _2, "trading": _2, "trainer": _2, "union": _2, "workinggroup": _2, "works": _2 } }, "af": { "$": 1, "succ": { "gov": _2, "com": _2, "org": _2, "net": _2, "edu": _2, "nom": _4 } }, "ag": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "co": _2, "nom": _2 } }, "ai": { "$": 1, "succ": { "off": _2, "com": _2, "net": _2, "org": _2, "uwu": _4, "nom": _4 } }, "al": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "blogspot": _4, "nom": _4 } }, "am": { "$": 1, "succ": { "co": _2, "com": _2, "commune": _2, "net": _2, "org": _2, "blogspot": _4, "neko": _4, "nyaa": _4 } }, "ao": { "$": 1, "succ": { "ed": _2, "gv": _2, "og": _2, "co": _2, "pb": _2, "it": _2 } }, "aq": _2, "ar": { "$": 1, "succ": { "com": _5, "edu": _2, "gob": _2, "gov": _2, "int": _2, "mil": _2, "musica": _2, "net": _2, "org": _2, "tur": _2 } }, "arpa": { "$": 1, "succ": { "e164": _2, "in-addr": _2, "ip6": _2, "iris": _2, "uri": _2, "urn": _2 } }, "as": _6, "asia": { "$": 1, "succ": { "cloudns": _4 } }, "at": { "$": 1, "succ": { "ac": { "$": 1, "succ": { "sth": _2 } }, "co": _5, "gv": _2, "or": _2, "funkfeuer": { "$": 0, "succ": { "wien": _4 } }, "futurecms": { "$": 0, "succ": { "*": _4, "ex": _7, "in": _7 } }, "futurehosting": _4, "futuremailing": _4, "ortsinfo": { "$": 0, "succ": { "ex": _7, "kunden": _7 } }, "biz": _4, "info": _4, "priv": _4, "12hp": _4, "2ix": _4, "4lima": _4, "lima-city": _4 } }, "au": { "$": 1, "succ": { "com": _5, "net": _2, "org": _2, "edu": { "$": 1, "succ": { "act": _2, "catholic": _2, "nsw": { "$": 1, "succ": { "schools": _2 } }, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "gov": { "$": 1, "succ": { "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "asn": _2, "id": _2, "info": _2, "conf": _2, "oz": _2, "act": _2, "nsw": _2, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "aw": { "$": 1, "succ": { "com": _2 } }, "ax": { "$": 1, "succ": { "be": _4, "cat": _4, "es": _4, "eu": _4, "gg": _4, "mc": _4, "us": _4, "xy": _4 } }, "az": { "$": 1, "succ": { "com": _2, "net": _2, "int": _2, "gov": _2, "org": _2, "edu": _2, "info": _2, "pp": _2, "mil": _2, "name": _2, "pro": _2, "biz": _2 } }, "ba": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "blogspot": _4 } }, "bb": { "$": 1, "succ": { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "store": _2, "tv": _2 } }, "bd": _8, "be": { "$": 1, "succ": { "ac": _2, "webhosting": _4, "blogspot": _4, "transurl": _7 } }, "bf": _6, "bg": { "$": 1, "succ": { "0": _2, "1": _2, "2": _2, "3": _2, "4": _2, "5": _2, "6": _2, "7": _2, "8": _2, "9": _2, "a": _2, "b": _2, "c": _2, "d": _2, "e": _2, "f": _2, "g": _2, "h": _2, "i": _2, "j": _2, "k": _2, "l": _2, "m": _2, "n": _2, "o": _2, "p": _2, "q": _2, "r": _2, "s": _2, "t": _2, "u": _2, "v": _2, "w": _2, "x": _2, "y": _2, "z": _2, "blogspot": _4, "barsy": _4 } }, "bh": _9, "bi": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "or": _2, "org": _2 } }, "biz": { "$": 1, "succ": { "cloudns": _4, "dyndns": _4, "for-better": _4, "for-more": _4, "for-some": _4, "for-the": _4, "selfip": _4, "webhop": _4, "bpl": _4, "orx": _4, "mmafan": _4, "myftp": _4, "no-ip": _4, "dscloud": _4 } }, "bj": { "$": 1, "succ": { "asso": _2, "barreau": _2, "gouv": _2, "blogspot": _4 } }, "bm": _9, "bn": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "co": _4 } }, "bo": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "int": _2, "org": _2, "net": _2, "mil": _2, "tv": _2, "web": _2, "academia": _2, "agro": _2, "arte": _2, "blog": _2, "bolivia": _2, "ciencia": _2, "cooperativa": _2, "democracia": _2, "deporte": _2, "ecologia": _2, "economia": _2, "empresa": _2, "indigena": _2, "industria": _2, "info": _2, "medicina": _2, "movimiento": _2, "musica": _2, "natural": _2, "nombre": _2, "noticias": _2, "patria": _2, "politica": _2, "profesional": _2, "plurinacional": _2, "pueblo": _2, "revista": _2, "salud": _2, "tecnologia": _2, "tksat": _2, "transporte": _2, "wiki": _2 } }, "br": { "$": 1, "succ": { "9guacu": _2, "abc": _2, "adm": _2, "adv": _2, "agr": _2, "aju": _2, "am": _2, "anani": _2, "aparecida": _2, "app": _2, "arq": _2, "art": _2, "ato": _2, "b": _2, "barueri": _2, "belem": _2, "bhz": _2, "bib": _2, "bio": _2, "blog": _2, "bmd": _2, "boavista": _2, "bsb": _2, "campinagrande": _2, "campinas": _2, "caxias": _2, "cim": _2, "cng": _2, "cnt": _2, "com": _5, "contagem": _2, "coop": _2, "coz": _2, "cri": _2, "cuiaba": _2, "curitiba": _2, "def": _2, "des": _2, "det": _2, "dev": _2, "ecn": _2, "eco": _2, "edu": _2, "emp": _2, "enf": _2, "eng": _2, "esp": _2, "etc": _2, "eti": _2, "far": _2, "feira": _2, "flog": _2, "floripa": _2, "fm": _2, "fnd": _2, "fortal": _2, "fot": _2, "foz": _2, "fst": _2, "g12": _2, "geo": _2, "ggf": _2, "goiania": _2, "gov": { "$": 1, "succ": { "ac": _2, "al": _2, "am": _2, "ap": _2, "ba": _2, "ce": _2, "df": _2, "es": _2, "go": _2, "ma": _2, "mg": _2, "ms": _2, "mt": _2, "pa": _2, "pb": _2, "pe": _2, "pi": _2, "pr": _2, "rj": _2, "rn": _2, "ro": _2, "rr": _2, "rs": _2, "sc": _2, "se": _2, "sp": _2, "to": _2 } }, "gru": _2, "imb": _2, "ind": _2, "inf": _2, "jab": _2, "jampa": _2, "jdf": _2, "joinville": _2, "jor": _2, "jus": _2, "leg": { "$": 1, "succ": { "ac": _4, "al": _4, "am": _4, "ap": _4, "ba": _4, "ce": _4, "df": _4, "es": _4, "go": _4, "ma": _4, "mg": _4, "ms": _4, "mt": _4, "pa": _4, "pb": _4, "pe": _4, "pi": _4, "pr": _4, "rj": _4, "rn": _4, "ro": _4, "rr": _4, "rs": _4, "sc": _4, "se": _4, "sp": _4, "to": _4 } }, "lel": _2, "log": _2, "londrina": _2, "macapa": _2, "maceio": _2, "manaus": _2, "maringa": _2, "mat": _2, "med": _2, "mil": _2, "morena": _2, "mp": _2, "mus": _2, "natal": _2, "net": _2, "niteroi": _2, "nom": _8, "not": _2, "ntr": _2, "odo": _2, "ong": _2, "org": _2, "osasco": _2, "palmas": _2, "poa": _2, "ppg": _2, "pro": _2, "psc": _2, "psi": _2, "pvh": _2, "qsl": _2, "radio": _2, "rec": _2, "recife": _2, "rep": _2, "ribeirao": _2, "rio": _2, "riobranco": _2, "riopreto": _2, "salvador": _2, "sampa": _2, "santamaria": _2, "santoandre": _2, "saobernardo": _2, "saogonca": _2, "seg": _2, "sjc": _2, "slg": _2, "slz": _2, "sorocaba": _2, "srv": _2, "taxi": _2, "tc": _2, "tec": _2, "teo": _2, "the": _2, "tmp": _2, "trd": _2, "tur": _2, "tv": _2, "udi": _2, "vet": _2, "vix": _2, "vlog": _2, "wiki": _2, "zlg": _2 } }, "bs": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "we": _4 } }, "bt": _9, "bv": _2, "bw": { "$": 1, "succ": { "co": _2, "org": _2 } }, "by": { "$": 1, "succ": { "gov": _2, "mil": _2, "com": _5, "of": _2, "nym": _4 } }, "bz": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "za": _4, "nom": _4, "nym": _4 } }, "ca": { "$": 1, "succ": { "ab": _2, "bc": _2, "mb": _2, "nb": _2, "nf": _2, "nl": _2, "ns": _2, "nt": _2, "nu": _2, "on": _2, "pe": _2, "qc": _2, "sk": _2, "yk": _2, "gc": _2, "barsy": _4, "awdev": _7, "co": _4, "blogspot": _4, "no-ip": _4 } }, "cat": _2, "cc": { "$": 1, "succ": { "cloudns": _4, "ftpaccess": _4, "game-server": _4, "myphotos": _4, "scrapping": _4, "twmail": _4, "csx": _4, "fantasyleague": _4 } }, "cd": _6, "cf": _5, "cg": _2, "ch": { "$": 1, "succ": { "square7": _4, "blogspot": _4, "linkyard-cloud": _4, "dnsking": _4, "gotdns": _4, "12hp": _4, "2ix": _4, "4lima": _4, "lima-city": _4 } }, "ci": { "$": 1, "succ": { "org": _2, "or": _2, "com": _2, "co": _2, "edu": _2, "ed": _2, "ac": _2, "net": _2, "go": _2, "asso": _2, "xn--aroport-bya": _2, "aéroport": _2, "int": _2, "presse": _2, "md": _2, "gouv": _2, "fin": _4, "nl": _4 } }, "ck": _8, "cl": { "$": 1, "succ": { "aprendemas": _2, "co": _2, "gob": _2, "gov": _2, "mil": _2, "blogspot": _4, "nom": _4 } }, "cm": { "$": 1, "succ": { "co": _2, "com": _2, "gov": _2, "net": _2 } }, "cn": { "$": 1, "succ": { "ac": _2, "com": { "$": 1, "succ": { "amazonaws": { "$": 0, "succ": { "compute": _7, "eb": { "$": 0, "succ": { "cn-north-1": _4, "cn-northwest-1": _4 } }, "elb": _7, "cn-north-1": _12 } } } }, "edu": _2, "gov": _2, "net": _2, "org": _2, "mil": _2, "xn--55qx5d": _2, "公司": _2, "xn--io0a7i": _2, "网络": _2, "xn--od0alg": _2, "網絡": _2, "ah": _2, "bj": _2, "cq": _2, "fj": _2, "gd": _2, "gs": _2, "gz": _2, "gx": _2, "ha": _2, "hb": _2, "he": _2, "hi": _2, "hl": _2, "hn": _2, "jl": _2, "js": _2, "jx": _2, "ln": _2, "nm": _2, "nx": _2, "qh": _2, "sc": _2, "sd": _2, "sh": _2, "sn": _2, "sx": _2, "tj": _2, "xj": _2, "xz": _2, "yn": _2, "zj": _2, "hk": _2, "mo": _2, "tw": _2, "instantcloud": _4 } }, "co": { "$": 1, "succ": { "arts": _2, "com": _5, "edu": _2, "firm": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "rec": _2, "web": _2, "carrd": _4, "crd": _4, "otap": _7, "leadpages": _4, "lpages": _4, "mypi": _4, "n4t": _4, "nodum": _4, "repl": _4 } }, "com": { "$": 1, "succ": { "adobeaemcloud": { "$": 2, "succ": { "dev": _7 } }, "kasserver": _4, "amazonaws": { "$": 0, "succ": { "compute": _7, "compute-1": _7, "us-east-1": { "$": 2, "succ": { "dualstack": _12 } }, "elb": _7, "s3": _4, "s3-ap-northeast-1": _4, "s3-ap-northeast-2": _4, "s3-ap-south-1": _4, "s3-ap-southeast-1": _4, "s3-ap-southeast-2": _4, "s3-ca-central-1": _4, "s3-eu-central-1": _4, "s3-eu-west-1": _4, "s3-eu-west-2": _4, "s3-eu-west-3": _4, "s3-external-1": _4, "s3-fips-us-gov-west-1": _4, "s3-sa-east-1": _4, "s3-us-gov-west-1": _4, "s3-us-east-2": _4, "s3-us-west-1": _4, "s3-us-west-2": _4, "ap-northeast-2": _14, "ap-south-1": _14, "ca-central-1": _14, "eu-central-1": _14, "eu-west-2": _14, "eu-west-3": _14, "us-east-2": _14, "ap-northeast-1": _13, "ap-southeast-1": _13, "ap-southeast-2": _13, "eu-west-1": _13, "sa-east-1": _13, "s3-website-us-east-1": _4, "s3-website-us-west-1": _4, "s3-website-us-west-2": _4, "s3-website-ap-northeast-1": _4, "s3-website-ap-southeast-1": _4, "s3-website-ap-southeast-2": _4, "s3-website-eu-west-1": _4, "s3-website-sa-east-1": _4 } }, "elasticbeanstalk": { "$": 2, "succ": { "ap-northeast-1": _4, "ap-northeast-2": _4, "ap-northeast-3": _4, "ap-south-1": _4, "ap-southeast-1": _4, "ap-southeast-2": _4, "ca-central-1": _4, "eu-central-1": _4, "eu-west-1": _4, "eu-west-2": _4, "eu-west-3": _4, "sa-east-1": _4, "us-east-1": _4, "us-east-2": _4, "us-gov-west-1": _4, "us-west-1": _4, "us-west-2": _4 } }, "on-aptible": _4, "myasustor": _4, "balena-devices": _4, "betainabox": _4, "bplaced": _4, "ar": _4, "br": _4, "cn": _4, "de": _4, "eu": _4, "gb": _4, "hu": _4, "jpn": _4, "kr": _4, "mex": _4, "no": _4, "qc": _4, "ru": _4, "sa": _4, "uk": _4, "us": _4, "uy": _4, "za": _4, "africa": _4, "gr": _4, "co": _4, "xenapponazure": _4, "jdevcloud": _4, "wpdevcloud": _4, "cloudcontrolled": _4, "cloudcontrolapp": _4, "trycloudflare": _4, "customer-oci": { "$": 0, "succ": { "*": _4, "oci": _7, "ocp": _7, "ocs": _7 } }, "dattolocal": _4, "dattorelay": _4, "dattoweb": _4, "mydatto": _4, "builtwithdark": _4, "drayddns": _4, "dreamhosters": _4, "mydrobo": _4, "dyndns-at-home": _4, "dyndns-at-work": _4, "dyndns-blog": _4, "dyndns-free": _4, "dyndns-home": _4, "dyndns-ip": _4, "dyndns-mail": _4, "dyndns-office": _4, "dyndns-pics": _4, "dyndns-remote": _4, "dyndns-server": _4, "dyndns-web": _4, "dyndns-wiki": _4, "dyndns-work": _4, "blogdns": _4, "cechire": _4, "dnsalias": _4, "dnsdojo": _4, "doesntexist": _4, "dontexist": _4, "doomdns": _4, "dyn-o-saur": _4, "dynalias": _4, "est-a-la-maison": _4, "est-a-la-masion": _4, "est-le-patron": _4, "est-mon-blogueur": _4, "from-ak": _4, "from-al": _4, "from-ar": _4, "from-ca": _4, "from-ct": _4, "from-dc": _4, "from-de": _4, "from-fl": _4, "from-ga": _4, "from-hi": _4, "from-ia": _4, "from-id": _4, "from-il": _4, "from-in": _4, "from-ks": _4, "from-ky": _4, "from-ma": _4, "from-md": _4, "from-mi": _4, "from-mn": _4, "from-mo": _4, "from-ms": _4, "from-mt": _4, "from-nc": _4, "from-nd": _4, "from-ne": _4, "from-nh": _4, "from-nj": _4, "from-nm": _4, "from-nv": _4, "from-oh": _4, "from-ok": _4, "from-or": _4, "from-pa": _4, "from-pr": _4, "from-ri": _4, "from-sc": _4, "from-sd": _4, "from-tn": _4, "from-tx": _4, "from-ut": _4, "from-va": _4, "from-vt": _4, "from-wa": _4, "from-wi": _4, "from-wv": _4, "from-wy": _4, "getmyip": _4, "gotdns": _4, "hobby-site": _4, "homelinux": _4, "homeunix": _4, "iamallama": _4, "is-a-anarchist": _4, "is-a-blogger": _4, "is-a-bookkeeper": _4, "is-a-bulls-fan": _4, "is-a-caterer": _4, "is-a-chef": _4, "is-a-conservative": _4, "is-a-cpa": _4, "is-a-cubicle-slave": _4, "is-a-democrat": _4, "is-a-designer": _4, "is-a-doctor": _4, "is-a-financialadvisor": _4, "is-a-geek": _4, "is-a-green": _4, "is-a-guru": _4, "is-a-hard-worker": _4, "is-a-hunter": _4, "is-a-landscaper": _4, "is-a-lawyer": _4, "is-a-liberal": _4, "is-a-libertarian": _4, "is-a-llama": _4, "is-a-musician": _4, "is-a-nascarfan": _4, "is-a-nurse": _4, "is-a-painter": _4, "is-a-personaltrainer": _4, "is-a-photographer": _4, "is-a-player": _4, "is-a-republican": _4, "is-a-rockstar": _4, "is-a-socialist": _4, "is-a-student": _4, "is-a-teacher": _4, "is-a-techie": _4, "is-a-therapist": _4, "is-an-accountant": _4, "is-an-actor": _4, "is-an-actress": _4, "is-an-anarchist": _4, "is-an-artist": _4, "is-an-engineer": _4, "is-an-entertainer": _4, "is-certified": _4, "is-gone": _4, "is-into-anime": _4, "is-into-cars": _4, "is-into-cartoons": _4, "is-into-games": _4, "is-leet": _4, "is-not-certified": _4, "is-slick": _4, "is-uberleet": _4, "is-with-theband": _4, "isa-geek": _4, "isa-hockeynut": _4, "issmarterthanyou": _4, "likes-pie": _4, "likescandy": _4, "neat-url": _4, "saves-the-whales": _4, "selfip": _4, "sells-for-less": _4, "sells-for-u": _4, "servebbs": _4, "simple-url": _4, "space-to-rent": _4, "teaches-yoga": _4, "writesthisblog": _4, "ddnsfree": _4, "ddnsgeek": _4, "giize": _4, "gleeze": _4, "kozow": _4, "loseyourip": _4, "ooguy": _4, "theworkpc": _4, "mytuleap": _4, "evennode": { "$": 0, "succ": { "eu-1": _4, "eu-2": _4, "eu-3": _4, "eu-4": _4, "us-1": _4, "us-2": _4, "us-3": _4, "us-4": _4 } }, "onfabrica": _4, "fbsbx": _15, "fastly-terrarium": _4, "fastvps-server": _4, "mydobiss": _4, "firebaseapp": _4, "freebox-os": _4, "freeboxos": _4, "gentapps": _4, "gentlentapis": _4, "githubusercontent": _4, "0emm": _7, "appspot": { "$": 2, "succ": { "r": _7 } }, "blogspot": _4, "codespot": _4, "googleapis": _4, "googlecode": _4, "pagespeedmobilizer": _4, "publishproxy": _4, "withgoogle": _4, "withyoutube": _4, "awsmppl": _4, "herokuapp": _4, "herokussl": _4, "myravendb": _4, "pixolino": _4, "dopaas": _4, "hidora": _4, "ik-server": { "$": 0, "succ": { "jcloud": _4 } }, "jelastic": { "$": 0, "succ": { "demo": _4 } }, "joyent": { "$": 0, "succ": { "cns": _7 } }, "lpusercontent": _4, "lmpm": _16, "linode": { "$": 0, "succ": { "members": _4, "nodebalancer": _7 } }, "linodeobjects": _7, "barsycenter": _4, "barsyonline": _4, "miniserver": _4, "meteorapp": { "$": 2, "succ": { "eu": _4 } }, "4u": _4, "nfshost": _4, "001www": _4, "ddnslive": _4, "myiphost": _4, "blogsyte": _4, "ciscofreak": _4, "damnserver": _4, "ditchyourip": _4, "dnsiskinky": _4, "dynns": _4, "geekgalaxy": _4, "health-carereform": _4, "homesecuritymac": _4, "homesecuritypc": _4, "myactivedirectory": _4, "mysecuritycamera": _4, "net-freaks": _4, "onthewifi": _4, "point2this": _4, "quicksytes": _4, "securitytactics": _4, "serveexchange": _4, "servehumour": _4, "servep2p": _4, "servesarcasm": _4, "stufftoread": _4, "unusualperson": _4, "workisboring": _4, "3utilities": _4, "ddnsking": _4, "myvnc": _4, "servebeer": _4, "servecounterstrike": _4, "serveftp": _4, "servegame": _4, "servehalflife": _4, "servehttp": _4, "serveirc": _4, "servemp3": _4, "servepics": _4, "servequake": _4, "observableusercontent": { "$": 0, "succ": { "static": _4 } }, "operaunite": _4, "skygearapp": _4, "outsystemscloud": _4, "ownprovider": _4, "pgfog": _4, "pagefrontapp": _4, "pagexl": _4, "gotpantheon": _4, "platter-app": _4, "pleskns": _4, "prgmr": { "$": 0, "succ": { "xen": _4 } }, "qualifioapp": _4, "qbuser": _4, "qa2": _4, "dev-myqnapcloud": _4, "alpha-myqnapcloud": _4, "myqnapcloud": _4, "quipelements": _7, "rackmaze": _4, "rhcloud": _4, "render": _16, "onrender": _4, "logoip": _4, "scrysec": _4, "firewall-gateway": _4, "myshopblocks": _4, "shopitsite": _4, "1kapp": _4, "appchizi": _4, "applinzi": _4, "sinaapp": _4, "vipsinaapp": _4, "bounty-full": { "$": 2, "succ": { "alpha": _4, "beta": _4 } }, "stackhero-network": _4, "playstation-cloud": _4, "stdlib": { "$": 0, "succ": { "api": _4 } }, "temp-dns": _4, "dsmynas": _4, "familyds": _4, "thingdustdata": _4, "bloxcms": _4, "townnews-staging": _4, "hk": _4, "wafflecell": _4, "remotewd": _4, "wiardweb": { "$": 0, "succ": { "pages": _4 } }, "xnbay": { "$": 2, "succ": { "u2": _4, "u2-local": _4 } }, "yolasite": _4, "wpenginepowered": _4, "impertrixcdn": _4, "impertrix": _4 } }, "coop": _2, "cr": { "$": 1, "succ": { "ac": _2, "co": _2, "ed": _2, "fi": _2, "go": _2, "or": _2, "sa": _2 } }, "cu": { "$": 1, "succ": { "com": _2, "edu": _2, "org": _2, "net": _2, "gov": _2, "inf": _2 } }, "cv": _5, "cw": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2 } }, "cx": { "$": 1, "succ": { "gov": _2, "ath": _4, "info": _4 } }, "cy": { "$": 1, "succ": { "ac": _2, "biz": _2, "com": { "$": 1, "succ": { "blogspot": _4, "scaleforce": _17 } }, "ekloges": _2, "gov": _2, "ltd": _2, "name": _2, "net": _2, "org": _2, "parliament": _2, "press": _2, "pro": _2, "tm": _2 } }, "cz": { "$": 1, "succ": { "co": _4, "realm": _4, "e4": _4, "blogspot": _4, "metacentrum": { "$": 0, "succ": { "cloud": _4, "custom": _4 } }, "muni": { "$": 0, "succ": { "cloud": { "$": 0, "succ": { "flt": _4, "usr": _4 } } } } } }, "de": { "$": 1, "succ": { "bplaced": _4, "square7": _4, "com": _4, "cosidns": { "$": 0, "succ": { "dyn": _4 } }, "dynamisches-dns": _4, "dnsupdater": _4, "internet-dns": _4, "l-o-g-i-n": _4, "dnshome": _4, "fuettertdasnetz": _4, "isteingeek": _4, "istmein": _4, "lebtimnetz": _4, "leitungsen": _4, "traeumtgerade": _4, "ddnss": { "$": 2, "succ": { "dyn": _4, "dyndns": _4 } }, "dyndns1": _4, "dyn-ip24": _4, "home-webserver": { "$": 2, "succ": { "dyn": _4 } }, "myhome-server": _4, "goip": _4, "blogspot": _4, "dyn-berlin": _4, "in-berlin": _4, "in-brb": _4, "in-butter": _4, "in-dsl": _4, "in-vpn": _4, "mein-iserv": _4, "schulserver": _4, "test-iserv": _4, "keymachine": _4, "git-repos": _4, "lcube-server": _4, "svn-repos": _4, "barsy": _4, "logoip": _4, "firewall-gateway": _4, "my-gateway": _4, "my-router": _4, "spdns": _4, "speedpartner": { "$": 0, "succ": { "customer": _4 } }, "taifun-dns": _4, "12hp": _4, "2ix": _4, "4lima": _4, "lima-city": _4, "dd-dns": _4, "dray-dns": _4, "draydns": _4, "dyn-vpn": _4, "dynvpn": _4, "mein-vigor": _4, "my-vigor": _4, "my-wan": _4, "syno-ds": _4, "synology-diskstation": _4, "synology-ds": _4, "uberspace": _7, "virtualuser": _4, "virtual-user": _4, "community-pro": _4, "diskussionsbereich": _4 } }, "dj": _2, "dk": { "$": 1, "succ": { "biz": _4, "co": _4, "firm": _4, "reg": _4, "store": _4, "blogspot": _4 } }, "dm": _9, "do": { "$": 1, "succ": { "art": _2, "com": _2, "edu": _2, "gob": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "sld": _2, "web": _2 } }, "dz": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "gov": _2, "edu": _2, "asso": _2, "pol": _2, "art": _2 } }, "ec": { "$": 1, "succ": { "com": _2, "info": _2, "net": _2, "fin": _2, "k12": _2, "med": _2, "pro": _2, "org": _2, "edu": _2, "gov": _2, "gob": _2, "mil": _2, "nym": _4 } }, "edu": { "$": 1, "succ": { "rit": { "$": 0, "succ": { "git-pages": _4 } } } }, "ee": { "$": 1, "succ": { "edu": _2, "gov": _2, "riik": _2, "lib": _2, "med": _2, "com": _5, "pri": _2, "aip": _2, "org": _2, "fie": _2 } }, "eg": { "$": 1, "succ": { "com": _5, "edu": _2, "eun": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sci": _2 } }, "er": _8, "es": { "$": 1, "succ": { "com": _5, "nom": _2, "org": _2, "gob": _2, "edu": _2 } }, "et": { "$": 1, "succ": { "com": _2, "gov": _2, "org": _2, "edu": _2, "biz": _2, "name": _2, "info": _2, "net": _2 } }, "eu": { "$": 1, "succ": { "mycd": _4, "cloudns": _4, "barsy": _4, "wellbeingzone": _4, "spdns": _4, "transurl": _7, "diskstation": _4 } }, "fi": { "$": 1, "succ": { "aland": _2, "dy": _4, "blogspot": _4, "xn--hkkinen-5wa": _4, "häkkinen": _4, "iki": _4 } }, "fj": { "$": 1, "succ": { "ac": _2, "biz": _2, "com": _2, "gov": _2, "info": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pro": _2 } }, "fk": _8, "fm": _2, "fo": _2, "fr": { "$": 1, "succ": { "asso": _2, "com": _2, "gouv": _2, "nom": _2, "prd": _2, "tm": _2, "aeroport": _2, "avocat": _2, "avoues": _2, "cci": _2, "chambagri": _2, "chirurgiens-dentistes": _2, "experts-comptables": _2, "geometre-expert": _2, "greta": _2, "huissier-justice": _2, "medecin": _2, "notaires": _2, "pharmacien": _2, "port": _2, "veterinaire": _2, "en-root": _4, "fbx-os": _4, "fbxos": _4, "freebox-os": _4, "freeboxos": _4, "blogspot": _4, "on-web": _4, "chirurgiens-dentistes-en-france": _4 } }, "ga": _2, "gb": _2, "gd": { "$": 1, "succ": { "nom": _4 } }, "ge": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "net": _2, "pvt": _2, "nom": _4 } }, "gf": _2, "gg": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "kaas": _4, "cya": _4, "panel": { "$": 2, "succ": { "daemon": _4 } } } }, "gh": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2 } }, "gi": { "$": 1, "succ": { "com": _2, "ltd": _2, "gov": _2, "mod": _2, "edu": _2, "org": _2 } }, "gl": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "net": _2, "org": _2, "biz": _4, "nom": _4, "xx": _4 } }, "gm": _2, "gn": { "$": 1, "succ": { "ac": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "net": _2 } }, "gov": _2, "gp": { "$": 1, "succ": { "com": _2, "net": _2, "mobi": _2, "edu": _2, "org": _2, "asso": _2, "app": _4 } }, "gq": _2, "gr": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "gov": _2, "blogspot": _4, "nym": _4 } }, "gs": _2, "gt": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "ind": _2, "mil": _2, "net": _2, "org": _2, "nom": _4, "blog": _4, "de": _4, "to": _4 } }, "gu": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "guam": _2, "info": _2, "net": _2, "org": _2, "web": _2 } }, "gw": _2, "gy": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "nym": _4, "be": _4 } }, "hk": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "idv": _2, "net": _2, "org": _2, "xn--55qx5d": _2, "公司": _2, "xn--wcvs22d": _2, "教育": _2, "xn--lcvr32d": _2, "敎育": _2, "xn--mxtq1m": _2, "政府": _2, "xn--gmqw5a": _2, "個人": _2, "xn--ciqpn": _2, "个人": _2, "xn--gmq050i": _2, "箇人": _2, "xn--zf0avx": _2, "網络": _2, "xn--io0a7i": _2, "网络": _2, "xn--mk0axi": _2, "组織": _2, "xn--od0alg": _2, "網絡": _2, "xn--od0aq3b": _2, "网絡": _2, "xn--tn0ag": _2, "组织": _2, "xn--uc0atv": _2, "組織": _2, "xn--uc0ay4a": _2, "組织": _2, "blogspot": _4, "nym": _4, "ltd": _4, "inc": _4 } }, "hm": _2, "hn": { "$": 1, "succ": { "com": _2, "edu": _2, "org": _2, "net": _2, "mil": _2, "gob": _2, "nom": _4, "cc": _4 } }, "hr": { "$": 1, "succ": { "iz": _2, "from": _2, "name": _2, "com": _2, "blogspot": _4, "free": _4 } }, "ht": { "$": 1, "succ": { "com": _2, "shop": _2, "firm": _2, "info": _2, "adult": _2, "net": _2, "pro": _2, "org": _2, "med": _2, "art": _2, "coop": _2, "pol": _2, "asso": _2, "edu": _2, "rel": _2, "gouv": _2, "perso": _2 } }, "hu": { "$": 1, "succ": { "2000": _2, "co": _2, "info": _2, "org": _2, "priv": _2, "sport": _2, "tm": _2, "agrar": _2, "bolt": _2, "casino": _2, "city": _2, "erotica": _2, "erotika": _2, "film": _2, "forum": _2, "games": _2, "hotel": _2, "ingatlan": _2, "jogasz": _2, "konyvelo": _2, "lakas": _2, "media": _2, "news": _2, "reklam": _2, "sex": _2, "shop": _2, "suli": _2, "szex": _2, "tozsde": _2, "utazas": _2, "video": _2, "blogspot": _4 } }, "id": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _5, "desa": _2, "go": _2, "mil": _2, "my": _2, "net": _2, "or": _2, "ponpes": _2, "sch": _2, "web": _2 } }, "ie": _20, "il": { "$": 1, "succ": { "ac": _2, "co": _5, "gov": _2, "idf": _2, "k12": _2, "muni": _2, "net": _2, "org": _2 } }, "im": { "$": 1, "succ": { "ac": _2, "co": { "$": 1, "succ": { "ltd": _2, "plc": _2 } }, "com": _2, "net": _2, "org": _2, "tt": _2, "tv": _2, "ro": _4, "nom": _4 } }, "in": { "$": 1, "succ": { "co": _2, "firm": _2, "net": _2, "org": _2, "gen": _2, "ind": _2, "nic": _2, "ac": _2, "edu": _2, "res": _2, "gov": _2, "mil": _2, "cloudns": _4, "blogspot": _4, "barsy": _4 } }, "info": { "$": 1, "succ": { "cloudns": _4, "dynamic-dns": _4, "dyndns": _4, "barrel-of-knowledge": _4, "barrell-of-knowledge": _4, "for-our": _4, "groks-the": _4, "groks-this": _4, "here-for-more": _4, "knowsitall": _4, "selfip": _4, "webhop": _4, "barsy": _4, "mayfirst": _4, "forumz": _4, "nsupdate": _4, "dvrcam": _4, "ilovecollege": _4, "no-ip": _4, "dnsupdate": _4, "v-info": _4 } }, "int": { "$": 1, "succ": { "eu": _2 } }, "io": { "$": 1, "succ": { "2038": _4, "com": _2, "apigee": _4, "b-data": _4, "backplaneapp": _4, "banzaicloud": { "$": 0, "succ": { "app": _4, "backyards": _7 } }, "boxfuse": _4, "browsersafetymark": _4, "bigv": { "$": 0, "succ": { "uk0": _4 } }, "cleverapps": _4, "dappnode": { "$": 0, "succ": { "dyndns": _4 } }, "dedyn": _4, "drud": _4, "definima": _4, "enonic": { "$": 2, "succ": { "customer": _4 } }, "shw": _4, "github": _4, "gitlab": _4, "lolipop": _4, "hasura-app": _4, "hostyhosting": _4, "moonscale": _7, "jele": _4, "loginline": _4, "barsy": _4, "azurecontainer": _7, "ngrok": _4, "nodeart": { "$": 0, "succ": { "stage": _4 } }, "nodum": _4, "nid": _4, "pantheonsite": _4, "dyn53": _4, "protonet": _4, "qcx": { "$": 2, "succ": { "sys": _7 } }, "vaporcloud": _4, "vbrplsbx": { "$": 0, "succ": { "g": _4 } }, "on-k3s": _7, "on-rio": _7, "readthedocs": _4, "resindevice": _4, "resinstaging": { "$": 0, "succ": { "devices": _4 } }, "hzc": _4, "sandcats": _4, "shiftedit": _4, "mo-siemens": _4, "lair": _15, "stolos": _7, "spacekit": _4, "utwente": _4, "applicationcloud": _4, "scapp": _4, "s5y": _7, "telebit": _4, "thingdust": { "$": 0, "succ": { "dev": _21, "disrec": _21, "prod": _21, "testing": _21 } }, "wedeploy": _4, "basicserver": _4, "virtualserver": _4 } }, "iq": _3, "ir": { "$": 1, "succ": { "ac": _2, "co": _2, "gov": _2, "id": _2, "net": _2, "org": _2, "sch": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2 } }, "is": { "$": 1, "succ": { "net": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "int": _2, "cupcake": _4, "blogspot": _4 } }, "it": { "$": 1, "succ": { "gov": _2, "edu": _2, "abr": _2, "abruzzo": _2, "aosta-valley": _2, "aostavalley": _2, "bas": _2, "basilicata": _2, "cal": _2, "calabria": _2, "cam": _2, "campania": _2, "emilia-romagna": _2, "emiliaromagna": _2, "emr": _2, "friuli-v-giulia": _2, "friuli-ve-giulia": _2, "friuli-vegiulia": _2, "friuli-venezia-giulia": _2, "friuli-veneziagiulia": _2, "friuli-vgiulia": _2, "friuliv-giulia": _2, "friulive-giulia": _2, "friulivegiulia": _2, "friulivenezia-giulia": _2, "friuliveneziagiulia": _2, "friulivgiulia": _2, "fvg": _2, "laz": _2, "lazio": _2, "lig": _2, "liguria": _2, "lom": _2, "lombardia": _2, "lombardy": _2, "lucania": _2, "mar": _2, "marche": _2, "mol": _2, "molise": _2, "piedmont": _2, "piemonte": _2, "pmn": _2, "pug": _2, "puglia": _2, "sar": _2, "sardegna": _2, "sardinia": _2, "sic": _2, "sicilia": _2, "sicily": _2, "taa": _2, "tos": _2, "toscana": _2, "trentin-sud-tirol": _2, "xn--trentin-sd-tirol-rzb": _2, "trentin-süd-tirol": _2, "trentin-sudtirol": _2, "xn--trentin-sdtirol-7vb": _2, "trentin-südtirol": _2, "trentin-sued-tirol": _2, "trentin-suedtirol": _2, "trentino-a-adige": _2, "trentino-aadige": _2, "trentino-alto-adige": _2, "trentino-altoadige": _2, "trentino-s-tirol": _2, "trentino-stirol": _2, "trentino-sud-tirol": _2, "xn--trentino-sd-tirol-c3b": _2, "trentino-süd-tirol": _2, "trentino-sudtirol": _2, "xn--trentino-sdtirol-szb": _2, "trentino-südtirol": _2, "trentino-sued-tirol": _2, "trentino-suedtirol": _2, "trentino": _2, "trentinoa-adige": _2, "trentinoaadige": _2, "trentinoalto-adige": _2, "trentinoaltoadige": _2, "trentinos-tirol": _2, "trentinostirol": _2, "trentinosud-tirol": _2, "xn--trentinosd-tirol-rzb": _2, "trentinosüd-tirol": _2, "trentinosudtirol": _2, "xn--trentinosdtirol-7vb": _2, "trentinosüdtirol": _2, "trentinosued-tirol": _2, "trentinosuedtirol": _2, "trentinsud-tirol": _2, "xn--trentinsd-tirol-6vb": _2, "trentinsüd-tirol": _2, "trentinsudtirol": _2, "xn--trentinsdtirol-nsb": _2, "trentinsüdtirol": _2, "trentinsued-tirol": _2, "trentinsuedtirol": _2, "tuscany": _2, "umb": _2, "umbria": _2, "val-d-aosta": _2, "val-daosta": _2, "vald-aosta": _2, "valdaosta": _2, "valle-aosta": _2, "valle-d-aosta": _2, "valle-daosta": _2, "valleaosta": _2, "valled-aosta": _2, "valledaosta": _2, "vallee-aoste": _2, "xn--valle-aoste-ebb": _2, "vallée-aoste": _2, "vallee-d-aoste": _2, "xn--valle-d-aoste-ehb": _2, "vallée-d-aoste": _2, "valleeaoste": _2, "xn--valleaoste-e7a": _2, "valléeaoste": _2, "valleedaoste": _2, "xn--valledaoste-ebb": _2, "valléedaoste": _2, "vao": _2, "vda": _2, "ven": _2, "veneto": _2, "ag": _2, "agrigento": _2, "al": _2, "alessandria": _2, "alto-adige": _2, "altoadige": _2, "an": _2, "ancona": _2, "andria-barletta-trani": _2, "andria-trani-barletta": _2, "andriabarlettatrani": _2, "andriatranibarletta": _2, "ao": _2, "aosta": _2, "aoste": _2, "ap": _2, "aq": _2, "aquila": _2, "ar": _2, "arezzo": _2, "ascoli-piceno": _2, "ascolipiceno": _2, "asti": _2, "at": _2, "av": _2, "avellino": _2, "ba": _2, "balsan-sudtirol": _2, "xn--balsan-sdtirol-nsb": _2, "balsan-südtirol": _2, "balsan-suedtirol": _2, "balsan": _2, "bari": _2, "barletta-trani-andria": _2, "barlettatraniandria": _2, "belluno": _2, "benevento": _2, "bergamo": _2, "bg": _2, "bi": _2, "biella": _2, "bl": _2, "bn": _2, "bo": _2, "bologna": _2, "bolzano-altoadige": _2, "bolzano": _2, "bozen-sudtirol": _2, "xn--bozen-sdtirol-2ob": _2, "bozen-südtirol": _2, "bozen-suedtirol": _2, "bozen": _2, "br": _2, "brescia": _2, "brindisi": _2, "bs": _2, "bt": _2, "bulsan-sudtirol": _2, "xn--bulsan-sdtirol-nsb": _2, "bulsan-südtirol": _2, "bulsan-suedtirol": _2, "bulsan": _2, "bz": _2, "ca": _2, "cagliari": _2, "caltanissetta": _2, "campidano-medio": _2, "campidanomedio": _2, "campobasso": _2, "carbonia-iglesias": _2, "carboniaiglesias": _2, "carrara-massa": _2, "carraramassa": _2, "caserta": _2, "catania": _2, "catanzaro": _2, "cb": _2, "ce": _2, "cesena-forli": _2, "xn--cesena-forl-mcb": _2, "cesena-forlì": _2, "cesenaforli": _2, "xn--cesenaforl-i8a": _2, "cesenaforlì": _2, "ch": _2, "chieti": _2, "ci": _2, "cl": _2, "cn": _2, "co": _2, "como": _2, "cosenza": _2, "cr": _2, "cremona": _2, "crotone": _2, "cs": _2, "ct": _2, "cuneo": _2, "cz": _2, "dell-ogliastra": _2, "dellogliastra": _2, "en": _2, "enna": _2, "fc": _2, "fe": _2, "fermo": _2, "ferrara": _2, "fg": _2, "fi": _2, "firenze": _2, "florence": _2, "fm": _2, "foggia": _2, "forli-cesena": _2, "xn--forl-cesena-fcb": _2, "forlì-cesena": _2, "forlicesena": _2, "xn--forlcesena-c8a": _2, "forlìcesena": _2, "fr": _2, "frosinone": _2, "ge": _2, "genoa": _2, "genova": _2, "go": _2, "gorizia": _2, "gr": _2, "grosseto": _2, "iglesias-carbonia": _2, "iglesiascarbonia": _2, "im": _2, "imperia": _2, "is": _2, "isernia": _2, "kr": _2, "la-spezia": _2, "laquila": _2, "laspezia": _2, "latina": _2, "lc": _2, "le": _2, "lecce": _2, "lecco": _2, "li": _2, "livorno": _2, "lo": _2, "lodi": _2, "lt": _2, "lu": _2, "lucca": _2, "macerata": _2, "mantova": _2, "massa-carrara": _2, "massacarrara": _2, "matera": _2, "mb": _2, "mc": _2, "me": _2, "medio-campidano": _2, "mediocampidano": _2, "messina": _2, "mi": _2, "milan": _2, "milano": _2, "mn": _2, "mo": _2, "modena": _2, "monza-brianza": _2, "monza-e-della-brianza": _2, "monza": _2, "monzabrianza": _2, "monzaebrianza": _2, "monzaedellabrianza": _2, "ms": _2, "mt": _2, "na": _2, "naples": _2, "napoli": _2, "no": _2, "novara": _2, "nu": _2, "nuoro": _2, "og": _2, "ogliastra": _2, "olbia-tempio": _2, "olbiatempio": _2, "or": _2, "oristano": _2, "ot": _2, "pa": _2, "padova": _2, "padua": _2, "palermo": _2, "parma": _2, "pavia": _2, "pc": _2, "pd": _2, "pe": _2, "perugia": _2, "pesaro-urbino": _2, "pesarourbino": _2, "pescara": _2, "pg": _2, "pi": _2, "piacenza": _2, "pisa": _2, "pistoia": _2, "pn": _2, "po": _2, "pordenone": _2, "potenza": _2, "pr": _2, "prato": _2, "pt": _2, "pu": _2, "pv": _2, "pz": _2, "ra": _2, "ragusa": _2, "ravenna": _2, "rc": _2, "re": _2, "reggio-calabria": _2, "reggio-emilia": _2, "reggiocalabria": _2, "reggioemilia": _2, "rg": _2, "ri": _2, "rieti": _2, "rimini": _2, "rm": _2, "rn": _2, "ro": _2, "roma": _2, "rome": _2, "rovigo": _2, "sa": _2, "salerno": _2, "sassari": _2, "savona": _2, "si": _2, "siena": _2, "siracusa": _2, "so": _2, "sondrio": _2, "sp": _2, "sr": _2, "ss": _2, "suedtirol": _2, "xn--sdtirol-n2a": _2, "südtirol": _2, "sv": _2, "ta": _2, "taranto": _2, "te": _2, "tempio-olbia": _2, "tempioolbia": _2, "teramo": _2, "terni": _2, "tn": _2, "to": _2, "torino": _2, "tp": _2, "tr": _2, "trani-andria-barletta": _2, "trani-barletta-andria": _2, "traniandriabarletta": _2, "tranibarlettaandria": _2, "trapani": _2, "trento": _2, "treviso": _2, "trieste": _2, "ts": _2, "turin": _2, "tv": _2, "ud": _2, "udine": _2, "urbino-pesaro": _2, "urbinopesaro": _2, "va": _2, "varese": _2, "vb": _2, "vc": _2, "ve": _2, "venezia": _2, "venice": _2, "verbania": _2, "vercelli": _2, "verona": _2, "vi": _2, "vibo-valentia": _2, "vibovalentia": _2, "vicenza": _2, "viterbo": _2, "vr": _2, "vs": _2, "vt": _2, "vv": _2, "blogspot": _4, "16-b": _4, "32-b": _4, "64-b": _4, "syncloud": _4 } }, "je": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2 } }, "jm": _8, "jo": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "edu": _2, "sch": _2, "gov": _2, "mil": _2, "name": _2 } }, "jobs": _2, "jp": { "$": 1, "succ": { "ac": _2, "ad": _2, "co": _2, "ed": _2, "go": _2, "gr": _2, "lg": _2, "ne": { "$": 1, "succ": { "aseinet": _18, "gehirn": _4 } }, "or": _2, "aichi": { "$": 1, "succ": { "aisai": _2, "ama": _2, "anjo": _2, "asuke": _2, "chiryu": _2, "chita": _2, "fuso": _2, "gamagori": _2, "handa": _2, "hazu": _2, "hekinan": _2, "higashiura": _2, "ichinomiya": _2, "inazawa": _2, "inuyama": _2, "isshiki": _2, "iwakura": _2, "kanie": _2, "kariya": _2, "kasugai": _2, "kira": _2, "kiyosu": _2, "komaki": _2, "konan": _2, "kota": _2, "mihama": _2, "miyoshi": _2, "nishio": _2, "nisshin": _2, "obu": _2, "oguchi": _2, "oharu": _2, "okazaki": _2, "owariasahi": _2, "seto": _2, "shikatsu": _2, "shinshiro": _2, "shitara": _2, "tahara": _2, "takahama": _2, "tobishima": _2, "toei": _2, "togo": _2, "tokai": _2, "tokoname": _2, "toyoake": _2, "toyohashi": _2, "toyokawa": _2, "toyone": _2, "toyota": _2, "tsushima": _2, "yatomi": _2 } }, "akita": { "$": 1, "succ": { "akita": _2, "daisen": _2, "fujisato": _2, "gojome": _2, "hachirogata": _2, "happou": _2, "higashinaruse": _2, "honjo": _2, "honjyo": _2, "ikawa": _2, "kamikoani": _2, "kamioka": _2, "katagami": _2, "kazuno": _2, "kitaakita": _2, "kosaka": _2, "kyowa": _2, "misato": _2, "mitane": _2, "moriyoshi": _2, "nikaho": _2, "noshiro": _2, "odate": _2, "oga": _2, "ogata": _2, "semboku": _2, "yokote": _2, "yurihonjo": _2 } }, "aomori": { "$": 1, "succ": { "aomori": _2, "gonohe": _2, "hachinohe": _2, "hashikami": _2, "hiranai": _2, "hirosaki": _2, "itayanagi": _2, "kuroishi": _2, "misawa": _2, "mutsu": _2, "nakadomari": _2, "noheji": _2, "oirase": _2, "owani": _2, "rokunohe": _2, "sannohe": _2, "shichinohe": _2, "shingo": _2, "takko": _2, "towada": _2, "tsugaru": _2, "tsuruta": _2 } }, "chiba": { "$": 1, "succ": { "abiko": _2, "asahi": _2, "chonan": _2, "chosei": _2, "choshi": _2, "chuo": _2, "funabashi": _2, "futtsu": _2, "hanamigawa": _2, "ichihara": _2, "ichikawa": _2, "ichinomiya": _2, "inzai": _2, "isumi": _2, "kamagaya": _2, "kamogawa": _2, "kashiwa": _2, "katori": _2, "katsuura": _2, "kimitsu": _2, "kisarazu": _2, "kozaki": _2, "kujukuri": _2, "kyonan": _2, "matsudo": _2, "midori": _2, "mihama": _2, "minamiboso": _2, "mobara": _2, "mutsuzawa": _2, "nagara": _2, "nagareyama": _2, "narashino": _2, "narita": _2, "noda": _2, "oamishirasato": _2, "omigawa": _2, "onjuku": _2, "otaki": _2, "sakae": _2, "sakura": _2, "shimofusa": _2, "shirako": _2, "shiroi": _2, "shisui": _2, "sodegaura": _2, "sosa": _2, "tako": _2, "tateyama": _2, "togane": _2, "tohnosho": _2, "tomisato": _2, "urayasu": _2, "yachimata": _2, "yachiyo": _2, "yokaichiba": _2, "yokoshibahikari": _2, "yotsukaido": _2 } }, "ehime": { "$": 1, "succ": { "ainan": _2, "honai": _2, "ikata": _2, "imabari": _2, "iyo": _2, "kamijima": _2, "kihoku": _2, "kumakogen": _2, "masaki": _2, "matsuno": _2, "matsuyama": _2, "namikata": _2, "niihama": _2, "ozu": _2, "saijo": _2, "seiyo": _2, "shikokuchuo": _2, "tobe": _2, "toon": _2, "uchiko": _2, "uwajima": _2, "yawatahama": _2 } }, "fukui": { "$": 1, "succ": { "echizen": _2, "eiheiji": _2, "fukui": _2, "ikeda": _2, "katsuyama": _2, "mihama": _2, "minamiechizen": _2, "obama": _2, "ohi": _2, "ono": _2, "sabae": _2, "sakai": _2, "takahama": _2, "tsuruga": _2, "wakasa": _2 } }, "fukuoka": { "$": 1, "succ": { "ashiya": _2, "buzen": _2, "chikugo": _2, "chikuho": _2, "chikujo": _2, "chikushino": _2, "chikuzen": _2, "chuo": _2, "dazaifu": _2, "fukuchi": _2, "hakata": _2, "higashi": _2, "hirokawa": _2, "hisayama": _2, "iizuka": _2, "inatsuki": _2, "kaho": _2, "kasuga": _2, "kasuya": _2, "kawara": _2, "keisen": _2, "koga": _2, "kurate": _2, "kurogi": _2, "kurume": _2, "minami": _2, "miyako": _2, "miyama": _2, "miyawaka": _2, "mizumaki": _2, "munakata": _2, "nakagawa": _2, "nakama": _2, "nishi": _2, "nogata": _2, "ogori": _2, "okagaki": _2, "okawa": _2, "oki": _2, "omuta": _2, "onga": _2, "onojo": _2, "oto": _2, "saigawa": _2, "sasaguri": _2, "shingu": _2, "shinyoshitomi": _2, "shonai": _2, "soeda": _2, "sue": _2, "tachiarai": _2, "tagawa": _2, "takata": _2, "toho": _2, "toyotsu": _2, "tsuiki": _2, "ukiha": _2, "umi": _2, "usui": _2, "yamada": _2, "yame": _2, "yanagawa": _2, "yukuhashi": _2 } }, "fukushima": { "$": 1, "succ": { "aizubange": _2, "aizumisato": _2, "aizuwakamatsu": _2, "asakawa": _2, "bandai": _2, "date": _2, "fukushima": _2, "furudono": _2, "futaba": _2, "hanawa": _2, "higashi": _2, "hirata": _2, "hirono": _2, "iitate": _2, "inawashiro": _2, "ishikawa": _2, "iwaki": _2, "izumizaki": _2, "kagamiishi": _2, "kaneyama": _2, "kawamata": _2, "kitakata": _2, "kitashiobara": _2, "koori": _2, "koriyama": _2, "kunimi": _2, "miharu": _2, "mishima": _2, "namie": _2, "nango": _2, "nishiaizu": _2, "nishigo": _2, "okuma": _2, "omotego": _2, "ono": _2, "otama": _2, "samegawa": _2, "shimogo": _2, "shirakawa": _2, "showa": _2, "soma": _2, "sukagawa": _2, "taishin": _2, "tamakawa": _2, "tanagura": _2, "tenei": _2, "yabuki": _2, "yamato": _2, "yamatsuri": _2, "yanaizu": _2, "yugawa": _2 } }, "gifu": { "$": 1, "succ": { "anpachi": _2, "ena": _2, "gifu": _2, "ginan": _2, "godo": _2, "gujo": _2, "hashima": _2, "hichiso": _2, "hida": _2, "higashishirakawa": _2, "ibigawa": _2, "ikeda": _2, "kakamigahara": _2, "kani": _2, "kasahara": _2, "kasamatsu": _2, "kawaue": _2, "kitagata": _2, "mino": _2, "minokamo": _2, "mitake": _2, "mizunami": _2, "motosu": _2, "nakatsugawa": _2, "ogaki": _2, "sakahogi": _2, "seki": _2, "sekigahara": _2, "shirakawa": _2, "tajimi": _2, "takayama": _2, "tarui": _2, "toki": _2, "tomika": _2, "wanouchi": _2, "yamagata": _2, "yaotsu": _2, "yoro": _2 } }, "gunma": { "$": 1, "succ": { "annaka": _2, "chiyoda": _2, "fujioka": _2, "higashiagatsuma": _2, "isesaki": _2, "itakura": _2, "kanna": _2, "kanra": _2, "katashina": _2, "kawaba": _2, "kiryu": _2, "kusatsu": _2, "maebashi": _2, "meiwa": _2, "midori": _2, "minakami": _2, "naganohara": _2, "nakanojo": _2, "nanmoku": _2, "numata": _2, "oizumi": _2, "ora": _2, "ota": _2, "shibukawa": _2, "shimonita": _2, "shinto": _2, "showa": _2, "takasaki": _2, "takayama": _2, "tamamura": _2, "tatebayashi": _2, "tomioka": _2, "tsukiyono": _2, "tsumagoi": _2, "ueno": _2, "yoshioka": _2 } }, "hiroshima": { "$": 1, "succ": { "asaminami": _2, "daiwa": _2, "etajima": _2, "fuchu": _2, "fukuyama": _2, "hatsukaichi": _2, "higashihiroshima": _2, "hongo": _2, "jinsekikogen": _2, "kaita": _2, "kui": _2, "kumano": _2, "kure": _2, "mihara": _2, "miyoshi": _2, "naka": _2, "onomichi": _2, "osakikamijima": _2, "otake": _2, "saka": _2, "sera": _2, "seranishi": _2, "shinichi": _2, "shobara": _2, "takehara": _2 } }, "hokkaido": { "$": 1, "succ": { "abashiri": _2, "abira": _2, "aibetsu": _2, "akabira": _2, "akkeshi": _2, "asahikawa": _2, "ashibetsu": _2, "ashoro": _2, "assabu": _2, "atsuma": _2, "bibai": _2, "biei": _2, "bifuka": _2, "bihoro": _2, "biratori": _2, "chippubetsu": _2, "chitose": _2, "date": _2, "ebetsu": _2, "embetsu": _2, "eniwa": _2, "erimo": _2, "esan": _2, "esashi": _2, "fukagawa": _2, "fukushima": _2, "furano": _2, "furubira": _2, "haboro": _2, "hakodate": _2, "hamatonbetsu": _2, "hidaka": _2, "higashikagura": _2, "higashikawa": _2, "hiroo": _2, "hokuryu": _2, "hokuto": _2, "honbetsu": _2, "horokanai": _2, "horonobe": _2, "ikeda": _2, "imakane": _2, "ishikari": _2, "iwamizawa": _2, "iwanai": _2, "kamifurano": _2, "kamikawa": _2, "kamishihoro": _2, "kamisunagawa": _2, "kamoenai": _2, "kayabe": _2, "kembuchi": _2, "kikonai": _2, "kimobetsu": _2, "kitahiroshima": _2, "kitami": _2, "kiyosato": _2, "koshimizu": _2, "kunneppu": _2, "kuriyama": _2, "kuromatsunai": _2, "kushiro": _2, "kutchan": _2, "kyowa": _2, "mashike": _2, "matsumae": _2, "mikasa": _2, "minamifurano": _2, "mombetsu": _2, "moseushi": _2, "mukawa": _2, "muroran": _2, "naie": _2, "nakagawa": _2, "nakasatsunai": _2, "nakatombetsu": _2, "nanae": _2, "nanporo": _2, "nayoro": _2, "nemuro": _2, "niikappu": _2, "niki": _2, "nishiokoppe": _2, "noboribetsu": _2, "numata": _2, "obihiro": _2, "obira": _2, "oketo": _2, "okoppe": _2, "otaru": _2, "otobe": _2, "otofuke": _2, "otoineppu": _2, "oumu": _2, "ozora": _2, "pippu": _2, "rankoshi": _2, "rebun": _2, "rikubetsu": _2, "rishiri": _2, "rishirifuji": _2, "saroma": _2, "sarufutsu": _2, "shakotan": _2, "shari": _2, "shibecha": _2, "shibetsu": _2, "shikabe": _2, "shikaoi": _2, "shimamaki": _2, "shimizu": _2, "shimokawa": _2, "shinshinotsu": _2, "shintoku": _2, "shiranuka": _2, "shiraoi": _2, "shiriuchi": _2, "sobetsu": _2, "sunagawa": _2, "taiki": _2, "takasu": _2, "takikawa": _2, "takinoue": _2, "teshikaga": _2, "tobetsu": _2, "tohma": _2, "tomakomai": _2, "tomari": _2, "toya": _2, "toyako": _2, "toyotomi": _2, "toyoura": _2, "tsubetsu": _2, "tsukigata": _2, "urakawa": _2, "urausu": _2, "uryu": _2, "utashinai": _2, "wakkanai": _2, "wassamu": _2, "yakumo": _2, "yoichi": _2 } }, "hyogo": { "$": 1, "succ": { "aioi": _2, "akashi": _2, "ako": _2, "amagasaki": _2, "aogaki": _2, "asago": _2, "ashiya": _2, "awaji": _2, "fukusaki": _2, "goshiki": _2, "harima": _2, "himeji": _2, "ichikawa": _2, "inagawa": _2, "itami": _2, "kakogawa": _2, "kamigori": _2, "kamikawa": _2, "kasai": _2, "kasuga": _2, "kawanishi": _2, "miki": _2, "minamiawaji": _2, "nishinomiya": _2, "nishiwaki": _2, "ono": _2, "sanda": _2, "sannan": _2, "sasayama": _2, "sayo": _2, "shingu": _2, "shinonsen": _2, "shiso": _2, "sumoto": _2, "taishi": _2, "taka": _2, "takarazuka": _2, "takasago": _2, "takino": _2, "tamba": _2, "tatsuno": _2, "toyooka": _2, "yabu": _2, "yashiro": _2, "yoka": _2, "yokawa": _2 } }, "ibaraki": { "$": 1, "succ": { "ami": _2, "asahi": _2, "bando": _2, "chikusei": _2, "daigo": _2, "fujishiro": _2, "hitachi": _2, "hitachinaka": _2, "hitachiomiya": _2, "hitachiota": _2, "ibaraki": _2, "ina": _2, "inashiki": _2, "itako": _2, "iwama": _2, "joso": _2, "kamisu": _2, "kasama": _2, "kashima": _2, "kasumigaura": _2, "koga": _2, "miho": _2, "mito": _2, "moriya": _2, "naka": _2, "namegata": _2, "oarai": _2, "ogawa": _2, "omitama": _2, "ryugasaki": _2, "sakai": _2, "sakuragawa": _2, "shimodate": _2, "shimotsuma": _2, "shirosato": _2, "sowa": _2, "suifu": _2, "takahagi": _2, "tamatsukuri": _2, "tokai": _2, "tomobe": _2, "tone": _2, "toride": _2, "tsuchiura": _2, "tsukuba": _2, "uchihara": _2, "ushiku": _2, "yachiyo": _2, "yamagata": _2, "yawara": _2, "yuki": _2 } }, "ishikawa": { "$": 1, "succ": { "anamizu": _2, "hakui": _2, "hakusan": _2, "kaga": _2, "kahoku": _2, "kanazawa": _2, "kawakita": _2, "komatsu": _2, "nakanoto": _2, "nanao": _2, "nomi": _2, "nonoichi": _2, "noto": _2, "shika": _2, "suzu": _2, "tsubata": _2, "tsurugi": _2, "uchinada": _2, "wajima": _2 } }, "iwate": { "$": 1, "succ": { "fudai": _2, "fujisawa": _2, "hanamaki": _2, "hiraizumi": _2, "hirono": _2, "ichinohe": _2, "ichinoseki": _2, "iwaizumi": _2, "iwate": _2, "joboji": _2, "kamaishi": _2, "kanegasaki": _2, "karumai": _2, "kawai": _2, "kitakami": _2, "kuji": _2, "kunohe": _2, "kuzumaki": _2, "miyako": _2, "mizusawa": _2, "morioka": _2, "ninohe": _2, "noda": _2, "ofunato": _2, "oshu": _2, "otsuchi": _2, "rikuzentakata": _2, "shiwa": _2, "shizukuishi": _2, "sumita": _2, "tanohata": _2, "tono": _2, "yahaba": _2, "yamada": _2 } }, "kagawa": { "$": 1, "succ": { "ayagawa": _2, "higashikagawa": _2, "kanonji": _2, "kotohira": _2, "manno": _2, "marugame": _2, "mitoyo": _2, "naoshima": _2, "sanuki": _2, "tadotsu": _2, "takamatsu": _2, "tonosho": _2, "uchinomi": _2, "utazu": _2, "zentsuji": _2 } }, "kagoshima": { "$": 1, "succ": { "akune": _2, "amami": _2, "hioki": _2, "isa": _2, "isen": _2, "izumi": _2, "kagoshima": _2, "kanoya": _2, "kawanabe": _2, "kinko": _2, "kouyama": _2, "makurazaki": _2, "matsumoto": _2, "minamitane": _2, "nakatane": _2, "nishinoomote": _2, "satsumasendai": _2, "soo": _2, "tarumizu": _2, "yusui": _2 } }, "kanagawa": { "$": 1, "succ": { "aikawa": _2, "atsugi": _2, "ayase": _2, "chigasaki": _2, "ebina": _2, "fujisawa": _2, "hadano": _2, "hakone": _2, "hiratsuka": _2, "isehara": _2, "kaisei": _2, "kamakura": _2, "kiyokawa": _2, "matsuda": _2, "minamiashigara": _2, "miura": _2, "nakai": _2, "ninomiya": _2, "odawara": _2, "oi": _2, "oiso": _2, "sagamihara": _2, "samukawa": _2, "tsukui": _2, "yamakita": _2, "yamato": _2, "yokosuka": _2, "yugawara": _2, "zama": _2, "zushi": _2 } }, "kochi": { "$": 1, "succ": { "aki": _2, "geisei": _2, "hidaka": _2, "higashitsuno": _2, "ino": _2, "kagami": _2, "kami": _2, "kitagawa": _2, "kochi": _2, "mihara": _2, "motoyama": _2, "muroto": _2, "nahari": _2, "nakamura": _2, "nankoku": _2, "nishitosa": _2, "niyodogawa": _2, "ochi": _2, "okawa": _2, "otoyo": _2, "otsuki": _2, "sakawa": _2, "sukumo": _2, "susaki": _2, "tosa": _2, "tosashimizu": _2, "toyo": _2, "tsuno": _2, "umaji": _2, "yasuda": _2, "yusuhara": _2 } }, "kumamoto": { "$": 1, "succ": { "amakusa": _2, "arao": _2, "aso": _2, "choyo": _2, "gyokuto": _2, "kamiamakusa": _2, "kikuchi": _2, "kumamoto": _2, "mashiki": _2, "mifune": _2, "minamata": _2, "minamioguni": _2, "nagasu": _2, "nishihara": _2, "oguni": _2, "ozu": _2, "sumoto": _2, "takamori": _2, "uki": _2, "uto": _2, "yamaga": _2, "yamato": _2, "yatsushiro": _2 } }, "kyoto": { "$": 1, "succ": { "ayabe": _2, "fukuchiyama": _2, "higashiyama": _2, "ide": _2, "ine": _2, "joyo": _2, "kameoka": _2, "kamo": _2, "kita": _2, "kizu": _2, "kumiyama": _2, "kyotamba": _2, "kyotanabe": _2, "kyotango": _2, "maizuru": _2, "minami": _2, "minamiyamashiro": _2, "miyazu": _2, "muko": _2, "nagaokakyo": _2, "nakagyo": _2, "nantan": _2, "oyamazaki": _2, "sakyo": _2, "seika": _2, "tanabe": _2, "uji": _2, "ujitawara": _2, "wazuka": _2, "yamashina": _2, "yawata": _2 } }, "mie": { "$": 1, "succ": { "asahi": _2, "inabe": _2, "ise": _2, "kameyama": _2, "kawagoe": _2, "kiho": _2, "kisosaki": _2, "kiwa": _2, "komono": _2, "kumano": _2, "kuwana": _2, "matsusaka": _2, "meiwa": _2, "mihama": _2, "minamiise": _2, "misugi": _2, "miyama": _2, "nabari": _2, "shima": _2, "suzuka": _2, "tado": _2, "taiki": _2, "taki": _2, "tamaki": _2, "toba": _2, "tsu": _2, "udono": _2, "ureshino": _2, "watarai": _2, "yokkaichi": _2 } }, "miyagi": { "$": 1, "succ": { "furukawa": _2, "higashimatsushima": _2, "ishinomaki": _2, "iwanuma": _2, "kakuda": _2, "kami": _2, "kawasaki": _2, "marumori": _2, "matsushima": _2, "minamisanriku": _2, "misato": _2, "murata": _2, "natori": _2, "ogawara": _2, "ohira": _2, "onagawa": _2, "osaki": _2, "rifu": _2, "semine": _2, "shibata": _2, "shichikashuku": _2, "shikama": _2, "shiogama": _2, "shiroishi": _2, "tagajo": _2, "taiwa": _2, "tome": _2, "tomiya": _2, "wakuya": _2, "watari": _2, "yamamoto": _2, "zao": _2 } }, "miyazaki": { "$": 1, "succ": { "aya": _2, "ebino": _2, "gokase": _2, "hyuga": _2, "kadogawa": _2, "kawaminami": _2, "kijo": _2, "kitagawa": _2, "kitakata": _2, "kitaura": _2, "kobayashi": _2, "kunitomi": _2, "kushima": _2, "mimata": _2, "miyakonojo": _2, "miyazaki": _2, "morotsuka": _2, "nichinan": _2, "nishimera": _2, "nobeoka": _2, "saito": _2, "shiiba": _2, "shintomi": _2, "takaharu": _2, "takanabe": _2, "takazaki": _2, "tsuno": _2 } }, "nagano": { "$": 1, "succ": { "achi": _2, "agematsu": _2, "anan": _2, "aoki": _2, "asahi": _2, "azumino": _2, "chikuhoku": _2, "chikuma": _2, "chino": _2, "fujimi": _2, "hakuba": _2, "hara": _2, "hiraya": _2, "iida": _2, "iijima": _2, "iiyama": _2, "iizuna": _2, "ikeda": _2, "ikusaka": _2, "ina": _2, "karuizawa": _2, "kawakami": _2, "kiso": _2, "kisofukushima": _2, "kitaaiki": _2, "komagane": _2, "komoro": _2, "matsukawa": _2, "matsumoto": _2, "miasa": _2, "minamiaiki": _2, "minamimaki": _2, "minamiminowa": _2, "minowa": _2, "miyada": _2, "miyota": _2, "mochizuki": _2, "nagano": _2, "nagawa": _2, "nagiso": _2, "nakagawa": _2, "nakano": _2, "nozawaonsen": _2, "obuse": _2, "ogawa": _2, "okaya": _2, "omachi": _2, "omi": _2, "ookuwa": _2, "ooshika": _2, "otaki": _2, "otari": _2, "sakae": _2, "sakaki": _2, "saku": _2, "sakuho": _2, "shimosuwa": _2, "shinanomachi": _2, "shiojiri": _2, "suwa": _2, "suzaka": _2, "takagi": _2, "takamori": _2, "takayama": _2, "tateshina": _2, "tatsuno": _2, "togakushi": _2, "togura": _2, "tomi": _2, "ueda": _2, "wada": _2, "yamagata": _2, "yamanouchi": _2, "yasaka": _2, "yasuoka": _2 } }, "nagasaki": { "$": 1, "succ": { "chijiwa": _2, "futsu": _2, "goto": _2, "hasami": _2, "hirado": _2, "iki": _2, "isahaya": _2, "kawatana": _2, "kuchinotsu": _2, "matsuura": _2, "nagasaki": _2, "obama": _2, "omura": _2, "oseto": _2, "saikai": _2, "sasebo": _2, "seihi": _2, "shimabara": _2, "shinkamigoto": _2, "togitsu": _2, "tsushima": _2, "unzen": _2 } }, "nara": { "$": 1, "succ": { "ando": _2, "gose": _2, "heguri": _2, "higashiyoshino": _2, "ikaruga": _2, "ikoma": _2, "kamikitayama": _2, "kanmaki": _2, "kashiba": _2, "kashihara": _2, "katsuragi": _2, "kawai": _2, "kawakami": _2, "kawanishi": _2, "koryo": _2, "kurotaki": _2, "mitsue": _2, "miyake": _2, "nara": _2, "nosegawa": _2, "oji": _2, "ouda": _2, "oyodo": _2, "sakurai": _2, "sango": _2, "shimoichi": _2, "shimokitayama": _2, "shinjo": _2, "soni": _2, "takatori": _2, "tawaramoto": _2, "tenkawa": _2, "tenri": _2, "uda": _2, "yamatokoriyama": _2, "yamatotakada": _2, "yamazoe": _2, "yoshino": _2 } }, "niigata": { "$": 1, "succ": { "aga": _2, "agano": _2, "gosen": _2, "itoigawa": _2, "izumozaki": _2, "joetsu": _2, "kamo": _2, "kariwa": _2, "kashiwazaki": _2, "minamiuonuma": _2, "mitsuke": _2, "muika": _2, "murakami": _2, "myoko": _2, "nagaoka": _2, "niigata": _2, "ojiya": _2, "omi": _2, "sado": _2, "sanjo": _2, "seiro": _2, "seirou": _2, "sekikawa": _2, "shibata": _2, "tagami": _2, "tainai": _2, "tochio": _2, "tokamachi": _2, "tsubame": _2, "tsunan": _2, "uonuma": _2, "yahiko": _2, "yoita": _2, "yuzawa": _2 } }, "oita": { "$": 1, "succ": { "beppu": _2, "bungoono": _2, "bungotakada": _2, "hasama": _2, "hiji": _2, "himeshima": _2, "hita": _2, "kamitsue": _2, "kokonoe": _2, "kuju": _2, "kunisaki": _2, "kusu": _2, "oita": _2, "saiki": _2, "taketa": _2, "tsukumi": _2, "usa": _2, "usuki": _2, "yufu": _2 } }, "okayama": { "$": 1, "succ": { "akaiwa": _2, "asakuchi": _2, "bizen": _2, "hayashima": _2, "ibara": _2, "kagamino": _2, "kasaoka": _2, "kibichuo": _2, "kumenan": _2, "kurashiki": _2, "maniwa": _2, "misaki": _2, "nagi": _2, "niimi": _2, "nishiawakura": _2, "okayama": _2, "satosho": _2, "setouchi": _2, "shinjo": _2, "shoo": _2, "soja": _2, "takahashi": _2, "tamano": _2, "tsuyama": _2, "wake": _2, "yakage": _2 } }, "okinawa": { "$": 1, "succ": { "aguni": _2, "ginowan": _2, "ginoza": _2, "gushikami": _2, "haebaru": _2, "higashi": _2, "hirara": _2, "iheya": _2, "ishigaki": _2, "ishikawa": _2, "itoman": _2, "izena": _2, "kadena": _2, "kin": _2, "kitadaito": _2, "kitanakagusuku": _2, "kumejima": _2, "kunigami": _2, "minamidaito": _2, "motobu": _2, "nago": _2, "naha": _2, "nakagusuku": _2, "nakijin": _2, "nanjo": _2, "nishihara": _2, "ogimi": _2, "okinawa": _2, "onna": _2, "shimoji": _2, "taketomi": _2, "tarama": _2, "tokashiki": _2, "tomigusuku": _2, "tonaki": _2, "urasoe": _2, "uruma": _2, "yaese": _2, "yomitan": _2, "yonabaru": _2, "yonaguni": _2, "zamami": _2 } }, "osaka": { "$": 1, "succ": { "abeno": _2, "chihayaakasaka": _2, "chuo": _2, "daito": _2, "fujiidera": _2, "habikino": _2, "hannan": _2, "higashiosaka": _2, "higashisumiyoshi": _2, "higashiyodogawa": _2, "hirakata": _2, "ibaraki": _2, "ikeda": _2, "izumi": _2, "izumiotsu": _2, "izumisano": _2, "kadoma": _2, "kaizuka": _2, "kanan": _2, "kashiwara": _2, "katano": _2, "kawachinagano": _2, "kishiwada": _2, "kita": _2, "kumatori": _2, "matsubara": _2, "minato": _2, "minoh": _2, "misaki": _2, "moriguchi": _2, "neyagawa": _2, "nishi": _2, "nose": _2, "osakasayama": _2, "sakai": _2, "sayama": _2, "sennan": _2, "settsu": _2, "shijonawate": _2, "shimamoto": _2, "suita": _2, "tadaoka": _2, "taishi": _2, "tajiri": _2, "takaishi": _2, "takatsuki": _2, "tondabayashi": _2, "toyonaka": _2, "toyono": _2, "yao": _2 } }, "saga": { "$": 1, "succ": { "ariake": _2, "arita": _2, "fukudomi": _2, "genkai": _2, "hamatama": _2, "hizen": _2, "imari": _2, "kamimine": _2, "kanzaki": _2, "karatsu": _2, "kashima": _2, "kitagata": _2, "kitahata": _2, "kiyama": _2, "kouhoku": _2, "kyuragi": _2, "nishiarita": _2, "ogi": _2, "omachi": _2, "ouchi": _2, "saga": _2, "shiroishi": _2, "taku": _2, "tara": _2, "tosu": _2, "yoshinogari": _2 } }, "saitama": { "$": 1, "succ": { "arakawa": _2, "asaka": _2, "chichibu": _2, "fujimi": _2, "fujimino": _2, "fukaya": _2, "hanno": _2, "hanyu": _2, "hasuda": _2, "hatogaya": _2, "hatoyama": _2, "hidaka": _2, "higashichichibu": _2, "higashimatsuyama": _2, "honjo": _2, "ina": _2, "iruma": _2, "iwatsuki": _2, "kamiizumi": _2, "kamikawa": _2, "kamisato": _2, "kasukabe": _2, "kawagoe": _2, "kawaguchi": _2, "kawajima": _2, "kazo": _2, "kitamoto": _2, "koshigaya": _2, "kounosu": _2, "kuki": _2, "kumagaya": _2, "matsubushi": _2, "minano": _2, "misato": _2, "miyashiro": _2, "miyoshi": _2, "moroyama": _2, "nagatoro": _2, "namegawa": _2, "niiza": _2, "ogano": _2, "ogawa": _2, "ogose": _2, "okegawa": _2, "omiya": _2, "otaki": _2, "ranzan": _2, "ryokami": _2, "saitama": _2, "sakado": _2, "satte": _2, "sayama": _2, "shiki": _2, "shiraoka": _2, "soka": _2, "sugito": _2, "toda": _2, "tokigawa": _2, "tokorozawa": _2, "tsurugashima": _2, "urawa": _2, "warabi": _2, "yashio": _2, "yokoze": _2, "yono": _2, "yorii": _2, "yoshida": _2, "yoshikawa": _2, "yoshimi": _2 } }, "shiga": { "$": 1, "succ": { "aisho": _2, "gamo": _2, "higashiomi": _2, "hikone": _2, "koka": _2, "konan": _2, "kosei": _2, "koto": _2, "kusatsu": _2, "maibara": _2, "moriyama": _2, "nagahama": _2, "nishiazai": _2, "notogawa": _2, "omihachiman": _2, "otsu": _2, "ritto": _2, "ryuoh": _2, "takashima": _2, "takatsuki": _2, "torahime": _2, "toyosato": _2, "yasu": _2 } }, "shimane": { "$": 1, "succ": { "akagi": _2, "ama": _2, "gotsu": _2, "hamada": _2, "higashiizumo": _2, "hikawa": _2, "hikimi": _2, "izumo": _2, "kakinoki": _2, "masuda": _2, "matsue": _2, "misato": _2, "nishinoshima": _2, "ohda": _2, "okinoshima": _2, "okuizumo": _2, "shimane": _2, "tamayu": _2, "tsuwano": _2, "unnan": _2, "yakumo": _2, "yasugi": _2, "yatsuka": _2 } }, "shizuoka": { "$": 1, "succ": { "arai": _2, "atami": _2, "fuji": _2, "fujieda": _2, "fujikawa": _2, "fujinomiya": _2, "fukuroi": _2, "gotemba": _2, "haibara": _2, "hamamatsu": _2, "higashiizu": _2, "ito": _2, "iwata": _2, "izu": _2, "izunokuni": _2, "kakegawa": _2, "kannami": _2, "kawanehon": _2, "kawazu": _2, "kikugawa": _2, "kosai": _2, "makinohara": _2, "matsuzaki": _2, "minamiizu": _2, "mishima": _2, "morimachi": _2, "nishiizu": _2, "numazu": _2, "omaezaki": _2, "shimada": _2, "shimizu": _2, "shimoda": _2, "shizuoka": _2, "susono": _2, "yaizu": _2, "yoshida": _2 } }, "tochigi": { "$": 1, "succ": { "ashikaga": _2, "bato": _2, "haga": _2, "ichikai": _2, "iwafune": _2, "kaminokawa": _2, "kanuma": _2, "karasuyama": _2, "kuroiso": _2, "mashiko": _2, "mibu": _2, "moka": _2, "motegi": _2, "nasu": _2, "nasushiobara": _2, "nikko": _2, "nishikata": _2, "nogi": _2, "ohira": _2, "ohtawara": _2, "oyama": _2, "sakura": _2, "sano": _2, "shimotsuke": _2, "shioya": _2, "takanezawa": _2, "tochigi": _2, "tsuga": _2, "ujiie": _2, "utsunomiya": _2, "yaita": _2 } }, "tokushima": { "$": 1, "succ": { "aizumi": _2, "anan": _2, "ichiba": _2, "itano": _2, "kainan": _2, "komatsushima": _2, "matsushige": _2, "mima": _2, "minami": _2, "miyoshi": _2, "mugi": _2, "nakagawa": _2, "naruto": _2, "sanagochi": _2, "shishikui": _2, "tokushima": _2, "wajiki": _2 } }, "tokyo": { "$": 1, "succ": { "adachi": _2, "akiruno": _2, "akishima": _2, "aogashima": _2, "arakawa": _2, "bunkyo": _2, "chiyoda": _2, "chofu": _2, "chuo": _2, "edogawa": _2, "fuchu": _2, "fussa": _2, "hachijo": _2, "hachioji": _2, "hamura": _2, "higashikurume": _2, "higashimurayama": _2, "higashiyamato": _2, "hino": _2, "hinode": _2, "hinohara": _2, "inagi": _2, "itabashi": _2, "katsushika": _2, "kita": _2, "kiyose": _2, "kodaira": _2, "koganei": _2, "kokubunji": _2, "komae": _2, "koto": _2, "kouzushima": _2, "kunitachi": _2, "machida": _2, "meguro": _2, "minato": _2, "mitaka": _2, "mizuho": _2, "musashimurayama": _2, "musashino": _2, "nakano": _2, "nerima": _2, "ogasawara": _2, "okutama": _2, "ome": _2, "oshima": _2, "ota": _2, "setagaya": _2, "shibuya": _2, "shinagawa": _2, "shinjuku": _2, "suginami": _2, "sumida": _2, "tachikawa": _2, "taito": _2, "tama": _2, "toshima": _2 } }, "tottori": { "$": 1, "succ": { "chizu": _2, "hino": _2, "kawahara": _2, "koge": _2, "kotoura": _2, "misasa": _2, "nanbu": _2, "nichinan": _2, "sakaiminato": _2, "tottori": _2, "wakasa": _2, "yazu": _2, "yonago": _2 } }, "toyama": { "$": 1, "succ": { "asahi": _2, "fuchu": _2, "fukumitsu": _2, "funahashi": _2, "himi": _2, "imizu": _2, "inami": _2, "johana": _2, "kamiichi": _2, "kurobe": _2, "nakaniikawa": _2, "namerikawa": _2, "nanto": _2, "nyuzen": _2, "oyabe": _2, "taira": _2, "takaoka": _2, "tateyama": _2, "toga": _2, "tonami": _2, "toyama": _2, "unazuki": _2, "uozu": _2, "yamada": _2 } }, "wakayama": { "$": 1, "succ": { "arida": _2, "aridagawa": _2, "gobo": _2, "hashimoto": _2, "hidaka": _2, "hirogawa": _2, "inami": _2, "iwade": _2, "kainan": _2, "kamitonda": _2, "katsuragi": _2, "kimino": _2, "kinokawa": _2, "kitayama": _2, "koya": _2, "koza": _2, "kozagawa": _2, "kudoyama": _2, "kushimoto": _2, "mihama": _2, "misato": _2, "nachikatsuura": _2, "shingu": _2, "shirahama": _2, "taiji": _2, "tanabe": _2, "wakayama": _2, "yuasa": _2, "yura": _2 } }, "yamagata": { "$": 1, "succ": { "asahi": _2, "funagata": _2, "higashine": _2, "iide": _2, "kahoku": _2, "kaminoyama": _2, "kaneyama": _2, "kawanishi": _2, "mamurogawa": _2, "mikawa": _2, "murayama": _2, "nagai": _2, "nakayama": _2, "nanyo": _2, "nishikawa": _2, "obanazawa": _2, "oe": _2, "oguni": _2, "ohkura": _2, "oishida": _2, "sagae": _2, "sakata": _2, "sakegawa": _2, "shinjo": _2, "shirataka": _2, "shonai": _2, "takahata": _2, "tendo": _2, "tozawa": _2, "tsuruoka": _2, "yamagata": _2, "yamanobe": _2, "yonezawa": _2, "yuza": _2 } }, "yamaguchi": { "$": 1, "succ": { "abu": _2, "hagi": _2, "hikari": _2, "hofu": _2, "iwakuni": _2, "kudamatsu": _2, "mitou": _2, "nagato": _2, "oshima": _2, "shimonoseki": _2, "shunan": _2, "tabuse": _2, "tokuyama": _2, "toyota": _2, "ube": _2, "yuu": _2 } }, "yamanashi": { "$": 1, "succ": { "chuo": _2, "doshi": _2, "fuefuki": _2, "fujikawa": _2, "fujikawaguchiko": _2, "fujiyoshida": _2, "hayakawa": _2, "hokuto": _2, "ichikawamisato": _2, "kai": _2, "kofu": _2, "koshu": _2, "kosuge": _2, "minami-alps": _2, "minobu": _2, "nakamichi": _2, "nanbu": _2, "narusawa": _2, "nirasaki": _2, "nishikatsura": _2, "oshino": _2, "otsuki": _2, "showa": _2, "tabayama": _2, "tsuru": _2, "uenohara": _2, "yamanakako": _2, "yamanashi": _2 } }, "xn--4pvxs": _2, "栃木": _2, "xn--vgu402c": _2, "愛知": _2, "xn--c3s14m": _2, "愛媛": _2, "xn--f6qx53a": _2, "兵庫": _2, "xn--8pvr4u": _2, "熊本": _2, "xn--uist22h": _2, "茨城": _2, "xn--djrs72d6uy": _2, "北海道": _2, "xn--mkru45i": _2, "千葉": _2, "xn--0trq7p7nn": _2, "和歌山": _2, "xn--8ltr62k": _2, "長崎": _2, "xn--2m4a15e": _2, "長野": _2, "xn--efvn9s": _2, "新潟": _2, "xn--32vp30h": _2, "青森": _2, "xn--4it797k": _2, "静岡": _2, "xn--1lqs71d": _2, "東京": _2, "xn--5rtp49c": _2, "石川": _2, "xn--5js045d": _2, "埼玉": _2, "xn--ehqz56n": _2, "三重": _2, "xn--1lqs03n": _2, "京都": _2, "xn--qqqt11m": _2, "佐賀": _2, "xn--kbrq7o": _2, "大分": _2, "xn--pssu33l": _2, "大阪": _2, "xn--ntsq17g": _2, "奈良": _2, "xn--uisz3g": _2, "宮城": _2, "xn--6btw5a": _2, "宮崎": _2, "xn--1ctwo": _2, "富山": _2, "xn--6orx2r": _2, "山口": _2, "xn--rht61e": _2, "山形": _2, "xn--rht27z": _2, "山梨": _2, "xn--djty4k": _2, "岩手": _2, "xn--nit225k": _2, "岐阜": _2, "xn--rht3d": _2, "岡山": _2, "xn--klty5x": _2, "島根": _2, "xn--kltx9a": _2, "広島": _2, "xn--kltp7d": _2, "徳島": _2, "xn--uuwu58a": _2, "沖縄": _2, "xn--zbx025d": _2, "滋賀": _2, "xn--ntso0iqx3a": _2, "神奈川": _2, "xn--elqq16h": _2, "福井": _2, "xn--4it168d": _2, "福岡": _2, "xn--klt787d": _2, "福島": _2, "xn--rny31h": _2, "秋田": _2, "xn--7t0a264c": _2, "群馬": _2, "xn--5rtq34k": _2, "香川": _2, "xn--k7yn95e": _2, "高知": _2, "xn--tor131o": _2, "鳥取": _2, "xn--d5qv7z876c": _2, "鹿児島": _2, "kawasaki": _8, "kitakyushu": _8, "kobe": _8, "nagoya": _8, "sapporo": _8, "sendai": _8, "yokohama": _8, "usercontent": _4, "blogspot": _4 } }, "ke": { "$": 1, "succ": { "ac": _2, "co": _5, "go": _2, "info": _2, "me": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2, "nom": _4 } }, "kg": { "$": 1, "succ": { "org": _2, "net": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "blog": _4, "io": _4, "jp": _4, "tv": _4, "uk": _4, "us": _4 } }, "kh": _8, "ki": _22, "km": { "$": 1, "succ": { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "ass": _2, "com": _2, "coop": _2, "asso": _2, "presse": _2, "medecin": _2, "notaires": _2, "pharmaciens": _2, "veterinaire": _2, "gouv": _2 } }, "kn": { "$": 1, "succ": { "net": _2, "org": _2, "edu": _2, "gov": _2 } }, "kp": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "rep": _2, "tra": _2 } }, "kr": { "$": 1, "succ": { "ac": _2, "co": _2, "es": _2, "go": _2, "hs": _2, "kg": _2, "mil": _2, "ms": _2, "ne": _2, "or": _2, "pe": _2, "re": _2, "sc": _2, "busan": _2, "chungbuk": _2, "chungnam": _2, "daegu": _2, "daejeon": _2, "gangwon": _2, "gwangju": _2, "gyeongbuk": _2, "gyeonggi": _2, "gyeongnam": _2, "incheon": _2, "jeju": _2, "jeonbuk": _2, "jeonnam": _2, "seoul": _2, "ulsan": _2, "blogspot": _4 } }, "kw": { "$": 1, "succ": { "com": _2, "edu": _2, "emb": _2, "gov": _2, "ind": _2, "net": _2, "org": _2 } }, "ky": _9, "kz": { "$": 1, "succ": { "org": _2, "edu": _2, "net": _2, "gov": _2, "mil": _2, "com": _2, "nym": _4 } }, "la": { "$": 1, "succ": { "int": _2, "net": _2, "info": _2, "edu": _2, "gov": _2, "per": _2, "com": _2, "org": _2, "bnr": _4, "c": _4, "nym": _4 } }, "lb": _9, "lc": { "$": 1, "succ": { "com": _2, "net": _2, "co": _2, "org": _2, "edu": _2, "gov": _2, "nym": _4, "oy": _4 } }, "li": { "$": 1, "succ": { "blogspot": _4, "caa": _4, "nom": _4, "nym": _4 } }, "lk": { "$": 1, "succ": { "gov": _2, "sch": _2, "net": _2, "int": _2, "com": _2, "org": _2, "edu": _2, "ngo": _2, "soc": _2, "web": _2, "ltd": _2, "assn": _2, "grp": _2, "hotel": _2, "ac": _2 } }, "lr": _9, "ls": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "sc": _2, "de": _4 } }, "lt": _20, "lu": _23, "lv": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "id": _2, "net": _2, "asn": _2, "conf": _2, "nom": _4 } }, "ly": { "$": 1, "succ": { "com": _2, "net": _2, "gov": _2, "plc": _2, "edu": _2, "sch": _2, "med": _2, "org": _2, "id": _2 } }, "ma": { "$": 1, "succ": { "co": _2, "net": _2, "gov": _2, "org": _2, "ac": _2, "press": _2 } }, "mc": { "$": 1, "succ": { "tm": _2, "asso": _2 } }, "md": { "$": 1, "succ": { "blogspot": _4, "at": _4, "de": _4, "jp": _4, "to": _4 } }, "me": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "edu": _2, "ac": _2, "gov": _2, "its": _2, "priv": _2, "c66": _4, "daplie": { "$": 2, "succ": { "localhost": _4 } }, "edgestack": _4, "couk": _4, "ukco": _4, "filegear": _4, "filegear-au": _4, "filegear-de": _4, "filegear-gb": _4, "filegear-ie": _4, "filegear-jp": _4, "filegear-sg": _4, "glitch": _4, "ravendb": _4, "barsy": _4, "nctu": _4, "soundcast": _4, "tcp4": _4, "brasilia": _4, "ddns": _4, "dnsfor": _4, "hopto": _4, "loginto": _4, "noip": _4, "webhop": _4, "nym": _4, "diskstation": _4, "dscloud": _4, "i234": _4, "myds": _4, "synology": _4, "wedeploy": _4, "yombo": _4, "nohost": _4 } }, "mg": { "$": 1, "succ": { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "com": _2, "co": _2 } }, "mh": _2, "mil": _2, "mk": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "edu": _2, "gov": _2, "inf": _2, "name": _2, "blogspot": _4, "nom": _4 } }, "ml": { "$": 1, "succ": { "com": _2, "edu": _2, "gouv": _2, "gov": _2, "net": _2, "org": _2, "presse": _2 } }, "mm": _8, "mn": { "$": 1, "succ": { "gov": _2, "edu": _2, "org": _2, "nyc": _4, "nym": _4 } }, "mo": _9, "mobi": { "$": 1, "succ": { "barsy": _4, "dscloud": _4 } }, "mp": _2, "mq": _2, "mr": { "$": 1, "succ": { "gov": _2, "blogspot": _4 } }, "ms": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "lab": _4 } }, "mt": { "$": 1, "succ": { "com": _5, "edu": _2, "net": _2, "org": _2 } }, "mu": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "ac": _2, "co": _2, "or": _2 } }, "museum": { "$": 1, "succ": { "academy": _2, "agriculture": _2, "air": _2, "airguard": _2, "alabama": _2, "alaska": _2, "amber": _2, "ambulance": _2, "american": _2, "americana": _2, "americanantiques": _2, "americanart": _2, "amsterdam": _2, "and": _2, "annefrank": _2, "anthro": _2, "anthropology": _2, "antiques": _2, "aquarium": _2, "arboretum": _2, "archaeological": _2, "archaeology": _2, "architecture": _2, "art": _2, "artanddesign": _2, "artcenter": _2, "artdeco": _2, "arteducation": _2, "artgallery": _2, "arts": _2, "artsandcrafts": _2, "asmatart": _2, "assassination": _2, "assisi": _2, "association": _2, "astronomy": _2, "atlanta": _2, "austin": _2, "australia": _2, "automotive": _2, "aviation": _2, "axis": _2, "badajoz": _2, "baghdad": _2, "bahn": _2, "bale": _2, "baltimore": _2, "barcelona": _2, "baseball": _2, "basel": _2, "baths": _2, "bauern": _2, "beauxarts": _2, "beeldengeluid": _2, "bellevue": _2, "bergbau": _2, "berkeley": _2, "berlin": _2, "bern": _2, "bible": _2, "bilbao": _2, "bill": _2, "birdart": _2, "birthplace": _2, "bonn": _2, "boston": _2, "botanical": _2, "botanicalgarden": _2, "botanicgarden": _2, "botany": _2, "brandywinevalley": _2, "brasil": _2, "bristol": _2, "british": _2, "britishcolumbia": _2, "broadcast": _2, "brunel": _2, "brussel": _2, "brussels": _2, "bruxelles": _2, "building": _2, "burghof": _2, "bus": _2, "bushey": _2, "cadaques": _2, "california": _2, "cambridge": _2, "can": _2, "canada": _2, "capebreton": _2, "carrier": _2, "cartoonart": _2, "casadelamoneda": _2, "castle": _2, "castres": _2, "celtic": _2, "center": _2, "chattanooga": _2, "cheltenham": _2, "chesapeakebay": _2, "chicago": _2, "children": _2, "childrens": _2, "childrensgarden": _2, "chiropractic": _2, "chocolate": _2, "christiansburg": _2, "cincinnati": _2, "cinema": _2, "circus": _2, "civilisation": _2, "civilization": _2, "civilwar": _2, "clinton": _2, "clock": _2, "coal": _2, "coastaldefence": _2, "cody": _2, "coldwar": _2, "collection": _2, "colonialwilliamsburg": _2, "coloradoplateau": _2, "columbia": _2, "columbus": _2, "communication": _2, "communications": _2, "community": _2, "computer": _2, "computerhistory": _2, "xn--comunicaes-v6a2o": _2, "comunicações": _2, "contemporary": _2, "contemporaryart": _2, "convent": _2, "copenhagen": _2, "corporation": _2, "xn--correios-e-telecomunicaes-ghc29a": _2, "correios-e-telecomunicações": _2, "corvette": _2, "costume": _2, "countryestate": _2, "county": _2, "crafts": _2, "cranbrook": _2, "creation": _2, "cultural": _2, "culturalcenter": _2, "culture": _2, "cyber": _2, "cymru": _2, "dali": _2, "dallas": _2, "database": _2, "ddr": _2, "decorativearts": _2, "delaware": _2, "delmenhorst": _2, "denmark": _2, "depot": _2, "design": _2, "detroit": _2, "dinosaur": _2, "discovery": _2, "dolls": _2, "donostia": _2, "durham": _2, "eastafrica": _2, "eastcoast": _2, "education": _2, "educational": _2, "egyptian": _2, "eisenbahn": _2, "elburg": _2, "elvendrell": _2, "embroidery": _2, "encyclopedic": _2, "england": _2, "entomology": _2, "environment": _2, "environmentalconservation": _2, "epilepsy": _2, "essex": _2, "estate": _2, "ethnology": _2, "exeter": _2, "exhibition": _2, "family": _2, "farm": _2, "farmequipment": _2, "farmers": _2, "farmstead": _2, "field": _2, "figueres": _2, "filatelia": _2, "film": _2, "fineart": _2, "finearts": _2, "finland": _2, "flanders": _2, "florida": _2, "force": _2, "fortmissoula": _2, "fortworth": _2, "foundation": _2, "francaise": _2, "frankfurt": _2, "franziskaner": _2, "freemasonry": _2, "freiburg": _2, "fribourg": _2, "frog": _2, "fundacio": _2, "furniture": _2, "gallery": _2, "garden": _2, "gateway": _2, "geelvinck": _2, "gemological": _2, "geology": _2, "georgia": _2, "giessen": _2, "glas": _2, "glass": _2, "gorge": _2, "grandrapids": _2, "graz": _2, "guernsey": _2, "halloffame": _2, "hamburg": _2, "handson": _2, "harvestcelebration": _2, "hawaii": _2, "health": _2, "heimatunduhren": _2, "hellas": _2, "helsinki": _2, "hembygdsforbund": _2, "heritage": _2, "histoire": _2, "historical": _2, "historicalsociety": _2, "historichouses": _2, "historisch": _2, "historisches": _2, "history": _2, "historyofscience": _2, "horology": _2, "house": _2, "humanities": _2, "illustration": _2, "imageandsound": _2, "indian": _2, "indiana": _2, "indianapolis": _2, "indianmarket": _2, "intelligence": _2, "interactive": _2, "iraq": _2, "iron": _2, "isleofman": _2, "jamison": _2, "jefferson": _2, "jerusalem": _2, "jewelry": _2, "jewish": _2, "jewishart": _2, "jfk": _2, "journalism": _2, "judaica": _2, "judygarland": _2, "juedisches": _2, "juif": _2, "karate": _2, "karikatur": _2, "kids": _2, "koebenhavn": _2, "koeln": _2, "kunst": _2, "kunstsammlung": _2, "kunstunddesign": _2, "labor": _2, "labour": _2, "lajolla": _2, "lancashire": _2, "landes": _2, "lans": _2, "xn--lns-qla": _2, "läns": _2, "larsson": _2, "lewismiller": _2, "lincoln": _2, "linz": _2, "living": _2, "livinghistory": _2, "localhistory": _2, "london": _2, "losangeles": _2, "louvre": _2, "loyalist": _2, "lucerne": _2, "luxembourg": _2, "luzern": _2, "mad": _2, "madrid": _2, "mallorca": _2, "manchester": _2, "mansion": _2, "mansions": _2, "manx": _2, "marburg": _2, "maritime": _2, "maritimo": _2, "maryland": _2, "marylhurst": _2, "media": _2, "medical": _2, "medizinhistorisches": _2, "meeres": _2, "memorial": _2, "mesaverde": _2, "michigan": _2, "midatlantic": _2, "military": _2, "mill": _2, "miners": _2, "mining": _2, "minnesota": _2, "missile": _2, "missoula": _2, "modern": _2, "moma": _2, "money": _2, "monmouth": _2, "monticello": _2, "montreal": _2, "moscow": _2, "motorcycle": _2, "muenchen": _2, "muenster": _2, "mulhouse": _2, "muncie": _2, "museet": _2, "museumcenter": _2, "museumvereniging": _2, "music": _2, "national": _2, "nationalfirearms": _2, "nationalheritage": _2, "nativeamerican": _2, "naturalhistory": _2, "naturalhistorymuseum": _2, "naturalsciences": _2, "nature": _2, "naturhistorisches": _2, "natuurwetenschappen": _2, "naumburg": _2, "naval": _2, "nebraska": _2, "neues": _2, "newhampshire": _2, "newjersey": _2, "newmexico": _2, "newport": _2, "newspaper": _2, "newyork": _2, "niepce": _2, "norfolk": _2, "north": _2, "nrw": _2, "nyc": _2, "nyny": _2, "oceanographic": _2, "oceanographique": _2, "omaha": _2, "online": _2, "ontario": _2, "openair": _2, "oregon": _2, "oregontrail": _2, "otago": _2, "oxford": _2, "pacific": _2, "paderborn": _2, "palace": _2, "paleo": _2, "palmsprings": _2, "panama": _2, "paris": _2, "pasadena": _2, "pharmacy": _2, "philadelphia": _2, "philadelphiaarea": _2, "philately": _2, "phoenix": _2, "photography": _2, "pilots": _2, "pittsburgh": _2, "planetarium": _2, "plantation": _2, "plants": _2, "plaza": _2, "portal": _2, "portland": _2, "portlligat": _2, "posts-and-telecommunications": _2, "preservation": _2, "presidio": _2, "press": _2, "project": _2, "public": _2, "pubol": _2, "quebec": _2, "railroad": _2, "railway": _2, "research": _2, "resistance": _2, "riodejaneiro": _2, "rochester": _2, "rockart": _2, "roma": _2, "russia": _2, "saintlouis": _2, "salem": _2, "salvadordali": _2, "salzburg": _2, "sandiego": _2, "sanfrancisco": _2, "santabarbara": _2, "santacruz": _2, "santafe": _2, "saskatchewan": _2, "satx": _2, "savannahga": _2, "schlesisches": _2, "schoenbrunn": _2, "schokoladen": _2, "school": _2, "schweiz": _2, "science": _2, "scienceandhistory": _2, "scienceandindustry": _2, "sciencecenter": _2, "sciencecenters": _2, "science-fiction": _2, "sciencehistory": _2, "sciences": _2, "sciencesnaturelles": _2, "scotland": _2, "seaport": _2, "settlement": _2, "settlers": _2, "shell": _2, "sherbrooke": _2, "sibenik": _2, "silk": _2, "ski": _2, "skole": _2, "society": _2, "sologne": _2, "soundandvision": _2, "southcarolina": _2, "southwest": _2, "space": _2, "spy": _2, "square": _2, "stadt": _2, "stalbans": _2, "starnberg": _2, "state": _2, "stateofdelaware": _2, "station": _2, "steam": _2, "steiermark": _2, "stjohn": _2, "stockholm": _2, "stpetersburg": _2, "stuttgart": _2, "suisse": _2, "surgeonshall": _2, "surrey": _2, "svizzera": _2, "sweden": _2, "sydney": _2, "tank": _2, "tcm": _2, "technology": _2, "telekommunikation": _2, "television": _2, "texas": _2, "textile": _2, "theater": _2, "time": _2, "timekeeping": _2, "topology": _2, "torino": _2, "touch": _2, "town": _2, "transport": _2, "tree": _2, "trolley": _2, "trust": _2, "trustee": _2, "uhren": _2, "ulm": _2, "undersea": _2, "university": _2, "usa": _2, "usantiques": _2, "usarts": _2, "uscountryestate": _2, "usculture": _2, "usdecorativearts": _2, "usgarden": _2, "ushistory": _2, "ushuaia": _2, "uslivinghistory": _2, "utah": _2, "uvic": _2, "valley": _2, "vantaa": _2, "versailles": _2, "viking": _2, "village": _2, "virginia": _2, "virtual": _2, "virtuel": _2, "vlaanderen": _2, "volkenkunde": _2, "wales": _2, "wallonie": _2, "war": _2, "washingtondc": _2, "watchandclock": _2, "watch-and-clock": _2, "western": _2, "westfalen": _2, "whaling": _2, "wildlife": _2, "williamsburg": _2, "windmill": _2, "workshop": _2, "york": _2, "yorkshire": _2, "yosemite": _2, "youth": _2, "zoological": _2, "zoology": _2, "xn--9dbhblg6di": _2, "ירושלים": _2, "xn--h1aegh": _2, "иком": _2 } }, "mv": { "$": 1, "succ": { "aero": _2, "biz": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "museum": _2, "name": _2, "net": _2, "org": _2, "pro": _2 } }, "mw": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "int": _2, "museum": _2, "net": _2, "org": _2 } }, "mx": { "$": 1, "succ": { "com": _2, "org": _2, "gob": _2, "edu": _2, "net": _2, "blogspot": _4, "nym": _4 } }, "my": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "mil": _2, "name": _2, "blogspot": _4 } }, "mz": { "$": 1, "succ": { "ac": _2, "adv": _2, "co": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "na": { "$": 1, "succ": { "info": _2, "pro": _2, "name": _2, "school": _2, "or": _2, "dr": _2, "us": _2, "mx": _2, "ca": _2, "in": _2, "cc": _2, "tv": _2, "ws": _2, "mobi": _2, "co": _2, "com": _2, "org": _2 } }, "name": { "$": 1, "succ": { "her": _26, "his": _26 } }, "nc": { "$": 1, "succ": { "asso": _2, "nom": _2 } }, "ne": _2, "net": { "$": 1, "succ": { "adobeaemcloud": _4, "alwaysdata": _4, "cloudfront": _4, "t3l3p0rt": _4, "myfritz": _4, "blackbaudcdn": _4, "boomla": _4, "bplaced": _4, "square7": _4, "gb": _4, "hu": _4, "jp": _4, "se": _4, "uk": _4, "in": _4, "clic2000": _4, "cloudaccess": _4, "cdn77-ssl": _4, "cdn77": { "$": 0, "succ": { "r": _4 } }, "cloudeity": _4, "feste-ip": _4, "knx-server": _4, "static-access": _4, "cryptonomic": _7, "dattolocal": _4, "mydatto": _4, "debian": _4, "bitbridge": _4, "at-band-camp": _4, "blogdns": _4, "broke-it": _4, "buyshouses": _4, "dnsalias": _4, "dnsdojo": _4, "does-it": _4, "dontexist": _4, "dynalias": _4, "dynathome": _4, "endofinternet": _4, "from-az": _4, "from-co": _4, "from-la": _4, "from-ny": _4, "gets-it": _4, "ham-radio-op": _4, "homeftp": _4, "homeip": _4, "homelinux": _4, "homeunix": _4, "in-the-band": _4, "is-a-chef": _4, "is-a-geek": _4, "isa-geek": _4, "kicks-ass": _4, "office-on-the": _4, "podzone": _4, "scrapper-site": _4, "selfip": _4, "sells-it": _4, "servebbs": _4, "serveftp": _4, "thruhere": _4, "webhop": _4, "definima": _4, "casacam": _4, "dynu": _4, "dynv6": _4, "twmail": _4, "ru": _4, "channelsdvr": { "$": 2, "succ": { "u": _4 } }, "fastlylb": { "$": 2, "succ": { "map": _4 } }, "fastly": { "$": 0, "succ": { "freetls": _4, "map": _4, "prod": { "$": 0, "succ": { "a": _4, "global": _4 } }, "ssl": { "$": 0, "succ": { "a": _4, "b": _4, "global": _4 } } } }, "edgeapp": _4, "flynnhosting": _4, "cloudfunctions": _4, "moonscale": _4, "in-dsl": _4, "in-vpn": _4, "ipifony": _4, "iobb": _4, "cloudjiffy": _4, "elastx": { "$": 0, "succ": { "jls-sto1": _4 } }, "saveincloud": _27, "kinghost": _4, "uni5": _4, "barsy": _4, "memset": _4, "azurewebsites": _4, "azure-mobile": _4, "cloudapp": _4, "dnsup": _4, "hicam": _4, "now-dns": _4, "ownip": _4, "vpndns": _4, "eating-organic": _4, "mydissent": _4, "myeffect": _4, "mymediapc": _4, "mypsx": _4, "mysecuritycamera": _4, "nhlfan": _4, "no-ip": _4, "pgafan": _4, "privatizehealthinsurance": _4, "bounceme": _4, "ddns": _4, "redirectme": _4, "serveblog": _4, "serveminecraft": _4, "sytes": _4, "cloudycluster": _4, "rackmaze": _4, "schokokeks": _4, "firewall-gateway": _4, "seidat": _4, "senseering": _4, "siteleaf": _4, "srcf": { "$": 0, "succ": { "soc": _4, "user": _4 } }, "dsmynas": _4, "familyds": _4, "community-pro": _4, "meinforum": _4, "yandexcloud": { "$": 2, "succ": { "storage": _4, "website": _4 } }, "za": _4 } }, "nf": { "$": 1, "succ": { "com": _2, "net": _2, "per": _2, "rec": _2, "web": _2, "arts": _2, "firm": _2, "info": _2, "other": _2, "store": _2 } }, "ng": { "$": 1, "succ": { "com": _5, "edu": _2, "gov": _2, "i": _2, "mil": _2, "mobi": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "col": _4, "firm": _4, "gen": _4, "ltd": _4, "ngo": _4 } }, "ni": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gob": _2, "in": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "web": _2 } }, "nl": { "$": 1, "succ": { "amsw": _4, "virtueeldomein": _4, "co": _4, "hosting-cluster": _4, "blogspot": _4, "khplay": _4, "transurl": _7, "cistron": _4, "demon": _4 } }, "no": { "$": 1, "succ": { "fhs": _2, "vgs": _2, "fylkesbibl": _2, "folkebibl": _2, "museum": _2, "idrett": _2, "priv": _2, "mil": _2, "stat": _2, "dep": _2, "kommune": _2, "herad": _2, "aa": _28, "ah": _28, "bu": _28, "fm": _28, "hl": _28, "hm": _28, "jan-mayen": _28, "mr": _28, "nl": _28, "nt": _28, "of": _28, "ol": _28, "oslo": _28, "rl": _28, "sf": _28, "st": _28, "svalbard": _28, "tm": _28, "tr": _28, "va": _28, "vf": _28, "akrehamn": _2, "xn--krehamn-dxa": _2, "åkrehamn": _2, "algard": _2, "xn--lgrd-poac": _2, "ålgård": _2, "arna": _2, "brumunddal": _2, "bryne": _2, "bronnoysund": _2, "xn--brnnysund-m8ac": _2, "brønnøysund": _2, "drobak": _2, "xn--drbak-wua": _2, "drøbak": _2, "egersund": _2, "fetsund": _2, "floro": _2, "xn--flor-jra": _2, "florø": _2, "fredrikstad": _2, "hokksund": _2, "honefoss": _2, "xn--hnefoss-q1a": _2, "hønefoss": _2, "jessheim": _2, "jorpeland": _2, "xn--jrpeland-54a": _2, "jørpeland": _2, "kirkenes": _2, "kopervik": _2, "krokstadelva": _2, "langevag": _2, "xn--langevg-jxa": _2, "langevåg": _2, "leirvik": _2, "mjondalen": _2, "xn--mjndalen-64a": _2, "mjøndalen": _2, "mo-i-rana": _2, "mosjoen": _2, "xn--mosjen-eya": _2, "mosjøen": _2, "nesoddtangen": _2, "orkanger": _2, "osoyro": _2, "xn--osyro-wua": _2, "osøyro": _2, "raholt": _2, "xn--rholt-mra": _2, "råholt": _2, "sandnessjoen": _2, "xn--sandnessjen-ogb": _2, "sandnessjøen": _2, "skedsmokorset": _2, "slattum": _2, "spjelkavik": _2, "stathelle": _2, "stavern": _2, "stjordalshalsen": _2, "xn--stjrdalshalsen-sqb": _2, "stjørdalshalsen": _2, "tananger": _2, "tranby": _2, "vossevangen": _2, "afjord": _2, "xn--fjord-lra": _2, "åfjord": _2, "agdenes": _2, "al": _2, "xn--l-1fa": _2, "ål": _2, "alesund": _2, "xn--lesund-hua": _2, "ålesund": _2, "alstahaug": _2, "alta": _2, "xn--lt-liac": _2, "áltá": _2, "alaheadju": _2, "xn--laheadju-7ya": _2, "álaheadju": _2, "alvdal": _2, "amli": _2, "xn--mli-tla": _2, "åmli": _2, "amot": _2, "xn--mot-tla": _2, "åmot": _2, "andebu": _2, "andoy": _2, "xn--andy-ira": _2, "andøy": _2, "andasuolo": _2, "ardal": _2, "xn--rdal-poa": _2, "årdal": _2, "aremark": _2, "arendal": _2, "xn--s-1fa": _2, "ås": _2, "aseral": _2, "xn--seral-lra": _2, "åseral": _2, "asker": _2, "askim": _2, "askvoll": _2, "askoy": _2, "xn--asky-ira": _2, "askøy": _2, "asnes": _2, "xn--snes-poa": _2, "åsnes": _2, "audnedaln": _2, "aukra": _2, "aure": _2, "aurland": _2, "aurskog-holand": _2, "xn--aurskog-hland-jnb": _2, "aurskog-høland": _2, "austevoll": _2, "austrheim": _2, "averoy": _2, "xn--avery-yua": _2, "averøy": _2, "balestrand": _2, "ballangen": _2, "balat": _2, "xn--blt-elab": _2, "bálát": _2, "balsfjord": _2, "bahccavuotna": _2, "xn--bhccavuotna-k7a": _2, "báhccavuotna": _2, "bamble": _2, "bardu": _2, "beardu": _2, "beiarn": _2, "bajddar": _2, "xn--bjddar-pta": _2, "bájddar": _2, "baidar": _2, "xn--bidr-5nac": _2, "báidár": _2, "berg": _2, "bergen": _2, "berlevag": _2, "xn--berlevg-jxa": _2, "berlevåg": _2, "bearalvahki": _2, "xn--bearalvhki-y4a": _2, "bearalváhki": _2, "bindal": _2, "birkenes": _2, "bjarkoy": _2, "xn--bjarky-fya": _2, "bjarkøy": _2, "bjerkreim": _2, "bjugn": _2, "bodo": _2, "xn--bod-2na": _2, "bodø": _2, "badaddja": _2, "xn--bdddj-mrabd": _2, "bådåddjå": _2, "budejju": _2, "bokn": _2, "bremanger": _2, "bronnoy": _2, "xn--brnny-wuac": _2, "brønnøy": _2, "bygland": _2, "bykle": _2, "barum": _2, "xn--brum-voa": _2, "bærum": _2, "telemark": { "$": 0, "succ": { "bo": _2, "xn--b-5ga": _2, "bø": _2 } }, "nordland": { "$": 0, "succ": { "bo": _2, "xn--b-5ga": _2, "bø": _2, "heroy": _2, "xn--hery-ira": _2, "herøy": _2 } }, "bievat": _2, "xn--bievt-0qa": _2, "bievát": _2, "bomlo": _2, "xn--bmlo-gra": _2, "bømlo": _2, "batsfjord": _2, "xn--btsfjord-9za": _2, "båtsfjord": _2, "bahcavuotna": _2, "xn--bhcavuotna-s4a": _2, "báhcavuotna": _2, "dovre": _2, "drammen": _2, "drangedal": _2, "dyroy": _2, "xn--dyry-ira": _2, "dyrøy": _2, "donna": _2, "xn--dnna-gra": _2, "dønna": _2, "eid": _2, "eidfjord": _2, "eidsberg": _2, "eidskog": _2, "eidsvoll": _2, "eigersund": _2, "elverum": _2, "enebakk": _2, "engerdal": _2, "etne": _2, "etnedal": _2, "evenes": _2, "evenassi": _2, "xn--eveni-0qa01ga": _2, "evenášši": _2, "evje-og-hornnes": _2, "farsund": _2, "fauske": _2, "fuossko": _2, "fuoisku": _2, "fedje": _2, "fet": _2, "finnoy": _2, "xn--finny-yua": _2, "finnøy": _2, "fitjar": _2, "fjaler": _2, "fjell": _2, "flakstad": _2, "flatanger": _2, "flekkefjord": _2, "flesberg": _2, "flora": _2, "fla": _2, "xn--fl-zia": _2, "flå": _2, "folldal": _2, "forsand": _2, "fosnes": _2, "frei": _2, "frogn": _2, "froland": _2, "frosta": _2, "frana": _2, "xn--frna-woa": _2, "fræna": _2, "froya": _2, "xn--frya-hra": _2, "frøya": _2, "fusa": _2, "fyresdal": _2, "forde": _2, "xn--frde-gra": _2, "førde": _2, "gamvik": _2, "gangaviika": _2, "xn--ggaviika-8ya47h": _2, "gáŋgaviika": _2, "gaular": _2, "gausdal": _2, "gildeskal": _2, "xn--gildeskl-g0a": _2, "gildeskål": _2, "giske": _2, "gjemnes": _2, "gjerdrum": _2, "gjerstad": _2, "gjesdal": _2, "gjovik": _2, "xn--gjvik-wua": _2, "gjøvik": _2, "gloppen": _2, "gol": _2, "gran": _2, "grane": _2, "granvin": _2, "gratangen": _2, "grimstad": _2, "grong": _2, "kraanghke": _2, "xn--kranghke-b0a": _2, "kråanghke": _2, "grue": _2, "gulen": _2, "hadsel": _2, "halden": _2, "halsa": _2, "hamar": _2, "hamaroy": _2, "habmer": _2, "xn--hbmer-xqa": _2, "hábmer": _2, "hapmir": _2, "xn--hpmir-xqa": _2, "hápmir": _2, "hammerfest": _2, "hammarfeasta": _2, "xn--hmmrfeasta-s4ac": _2, "hámmárfeasta": _2, "haram": _2, "hareid": _2, "harstad": _2, "hasvik": _2, "aknoluokta": _2, "xn--koluokta-7ya57h": _2, "ákŋoluokta": _2, "hattfjelldal": _2, "aarborte": _2, "haugesund": _2, "hemne": _2, "hemnes": _2, "hemsedal": _2, "more-og-romsdal": { "$": 0, "succ": { "heroy": _2, "sande": _2 } }, "xn--mre-og-romsdal-qqb": { "$": 0, "succ": { "xn--hery-ira": _2, "sande": _2 } }, "møre-og-romsdal": { "$": 0, "succ": { "herøy": _2, "sande": _2 } }, "hitra": _2, "hjartdal": _2, "hjelmeland": _2, "hobol": _2, "xn--hobl-ira": _2, "hobøl": _2, "hof": _2, "hol": _2, "hole": _2, "holmestrand": _2, "holtalen": _2, "xn--holtlen-hxa": _2, "holtålen": _2, "hornindal": _2, "horten": _2, "hurdal": _2, "hurum": _2, "hvaler": _2, "hyllestad": _2, "hagebostad": _2, "xn--hgebostad-g3a": _2, "hægebostad": _2, "hoyanger": _2, "xn--hyanger-q1a": _2, "høyanger": _2, "hoylandet": _2, "xn--hylandet-54a": _2, "høylandet": _2, "ha": _2, "xn--h-2fa": _2, "hå": _2, "ibestad": _2, "inderoy": _2, "xn--indery-fya": _2, "inderøy": _2, "iveland": _2, "jevnaker": _2, "jondal": _2, "jolster": _2, "xn--jlster-bya": _2, "jølster": _2, "karasjok": _2, "karasjohka": _2, "xn--krjohka-hwab49j": _2, "kárášjohka": _2, "karlsoy": _2, "galsa": _2, "xn--gls-elac": _2, "gálsá": _2, "karmoy": _2, "xn--karmy-yua": _2, "karmøy": _2, "kautokeino": _2, "guovdageaidnu": _2, "klepp": _2, "klabu": _2, "xn--klbu-woa": _2, "klæbu": _2, "kongsberg": _2, "kongsvinger": _2, "kragero": _2, "xn--krager-gya": _2, "kragerø": _2, "kristiansand": _2, "kristiansund": _2, "krodsherad": _2, "xn--krdsherad-m8a": _2, "krødsherad": _2, "kvalsund": _2, "rahkkeravju": _2, "xn--rhkkervju-01af": _2, "ráhkkerávju": _2, "kvam": _2, "kvinesdal": _2, "kvinnherad": _2, "kviteseid": _2, "kvitsoy": _2, "xn--kvitsy-fya": _2, "kvitsøy": _2, "kvafjord": _2, "xn--kvfjord-nxa": _2, "kvæfjord": _2, "giehtavuoatna": _2, "kvanangen": _2, "xn--kvnangen-k0a": _2, "kvænangen": _2, "navuotna": _2, "xn--nvuotna-hwa": _2, "návuotna": _2, "kafjord": _2, "xn--kfjord-iua": _2, "kåfjord": _2, "gaivuotna": _2, "xn--givuotna-8ya": _2, "gáivuotna": _2, "larvik": _2, "lavangen": _2, "lavagis": _2, "loabat": _2, "xn--loabt-0qa": _2, "loabát": _2, "lebesby": _2, "davvesiida": _2, "leikanger": _2, "leirfjord": _2, "leka": _2, "leksvik": _2, "lenvik": _2, "leangaviika": _2, "xn--leagaviika-52b": _2, "leaŋgaviika": _2, "lesja": _2, "levanger": _2, "lier": _2, "lierne": _2, "lillehammer": _2, "lillesand": _2, "lindesnes": _2, "lindas": _2, "xn--linds-pra": _2, "lindås": _2, "lom": _2, "loppa": _2, "lahppi": _2, "xn--lhppi-xqa": _2, "láhppi": _2, "lund": _2, "lunner": _2, "luroy": _2, "xn--lury-ira": _2, "lurøy": _2, "luster": _2, "lyngdal": _2, "lyngen": _2, "ivgu": _2, "lardal": _2, "lerdal": _2, "xn--lrdal-sra": _2, "lærdal": _2, "lodingen": _2, "xn--ldingen-q1a": _2, "lødingen": _2, "lorenskog": _2, "xn--lrenskog-54a": _2, "lørenskog": _2, "loten": _2, "xn--lten-gra": _2, "løten": _2, "malvik": _2, "masoy": _2, "xn--msy-ula0h": _2, "måsøy": _2, "muosat": _2, "xn--muost-0qa": _2, "muosát": _2, "mandal": _2, "marker": _2, "marnardal": _2, "masfjorden": _2, "meland": _2, "meldal": _2, "melhus": _2, "meloy": _2, "xn--mely-ira": _2, "meløy": _2, "meraker": _2, "xn--merker-kua": _2, "meråker": _2, "moareke": _2, "xn--moreke-jua": _2, "moåreke": _2, "midsund": _2, "midtre-gauldal": _2, "modalen": _2, "modum": _2, "molde": _2, "moskenes": _2, "moss": _2, "mosvik": _2, "malselv": _2, "xn--mlselv-iua": _2, "målselv": _2, "malatvuopmi": _2, "xn--mlatvuopmi-s4a": _2, "málatvuopmi": _2, "namdalseid": _2, "aejrie": _2, "namsos": _2, "namsskogan": _2, "naamesjevuemie": _2, "xn--nmesjevuemie-tcba": _2, "nååmesjevuemie": _2, "laakesvuemie": _2, "nannestad": _2, "narvik": _2, "narviika": _2, "naustdal": _2, "nedre-eiker": _2, "akershus": _29, "buskerud": _29, "nesna": _2, "nesodden": _2, "nesseby": _2, "unjarga": _2, "xn--unjrga-rta": _2, "unjárga": _2, "nesset": _2, "nissedal": _2, "nittedal": _2, "nord-aurdal": _2, "nord-fron": _2, "nord-odal": _2, "norddal": _2, "nordkapp": _2, "davvenjarga": _2, "xn--davvenjrga-y4a": _2, "davvenjárga": _2, "nordre-land": _2, "nordreisa": _2, "raisa": _2, "xn--risa-5na": _2, "ráisa": _2, "nore-og-uvdal": _2, "notodden": _2, "naroy": _2, "xn--nry-yla5g": _2, "nærøy": _2, "notteroy": _2, "xn--nttery-byae": _2, "nøtterøy": _2, "odda": _2, "oksnes": _2, "xn--ksnes-uua": _2, "øksnes": _2, "oppdal": _2, "oppegard": _2, "xn--oppegrd-ixa": _2, "oppegård": _2, "orkdal": _2, "orland": _2, "xn--rland-uua": _2, "ørland": _2, "orskog": _2, "xn--rskog-uua": _2, "ørskog": _2, "orsta": _2, "xn--rsta-fra": _2, "ørsta": _2, "hedmark": { "$": 0, "succ": { "os": _2, "valer": _2, "xn--vler-qoa": _2, "våler": _2 } }, "hordaland": { "$": 0, "succ": { "os": _2 } }, "osen": _2, "osteroy": _2, "xn--ostery-fya": _2, "osterøy": _2, "ostre-toten": _2, "xn--stre-toten-zcb": _2, "østre-toten": _2, "overhalla": _2, "ovre-eiker": _2, "xn--vre-eiker-k8a": _2, "øvre-eiker": _2, "oyer": _2, "xn--yer-zna": _2, "øyer": _2, "oygarden": _2, "xn--ygarden-p1a": _2, "øygarden": _2, "oystre-slidre": _2, "xn--ystre-slidre-ujb": _2, "øystre-slidre": _2, "porsanger": _2, "porsangu": _2, "xn--porsgu-sta26f": _2, "porsáŋgu": _2, "porsgrunn": _2, "radoy": _2, "xn--rady-ira": _2, "radøy": _2, "rakkestad": _2, "rana": _2, "ruovat": _2, "randaberg": _2, "rauma": _2, "rendalen": _2, "rennebu": _2, "rennesoy": _2, "xn--rennesy-v1a": _2, "rennesøy": _2, "rindal": _2, "ringebu": _2, "ringerike": _2, "ringsaker": _2, "rissa": _2, "risor": _2, "xn--risr-ira": _2, "risør": _2, "roan": _2, "rollag": _2, "rygge": _2, "ralingen": _2, "xn--rlingen-mxa": _2, "rælingen": _2, "rodoy": _2, "xn--rdy-0nab": _2, "rødøy": _2, "romskog": _2, "xn--rmskog-bya": _2, "rømskog": _2, "roros": _2, "xn--rros-gra": _2, "røros": _2, "rost": _2, "xn--rst-0na": _2, "røst": _2, "royken": _2, "xn--ryken-vua": _2, "røyken": _2, "royrvik": _2, "xn--ryrvik-bya": _2, "røyrvik": _2, "rade": _2, "xn--rde-ula": _2, "råde": _2, "salangen": _2, "siellak": _2, "saltdal": _2, "salat": _2, "xn--slt-elab": _2, "sálát": _2, "xn--slat-5na": _2, "sálat": _2, "samnanger": _2, "vestfold": { "$": 0, "succ": { "sande": _2 } }, "sandefjord": _2, "sandnes": _2, "sandoy": _2, "xn--sandy-yua": _2, "sandøy": _2, "sarpsborg": _2, "sauda": _2, "sauherad": _2, "sel": _2, "selbu": _2, "selje": _2, "seljord": _2, "sigdal": _2, "siljan": _2, "sirdal": _2, "skaun": _2, "skedsmo": _2, "ski": _2, "skien": _2, "skiptvet": _2, "skjervoy": _2, "xn--skjervy-v1a": _2, "skjervøy": _2, "skierva": _2, "xn--skierv-uta": _2, "skiervá": _2, "skjak": _2, "xn--skjk-soa": _2, "skjåk": _2, "skodje": _2, "skanland": _2, "xn--sknland-fxa": _2, "skånland": _2, "skanit": _2, "xn--sknit-yqa": _2, "skánit": _2, "smola": _2, "xn--smla-hra": _2, "smøla": _2, "snillfjord": _2, "snasa": _2, "xn--snsa-roa": _2, "snåsa": _2, "snoasa": _2, "snaase": _2, "xn--snase-nra": _2, "snåase": _2, "sogndal": _2, "sokndal": _2, "sola": _2, "solund": _2, "songdalen": _2, "sortland": _2, "spydeberg": _2, "stange": _2, "stavanger": _2, "steigen": _2, "steinkjer": _2, "stjordal": _2, "xn--stjrdal-s1a": _2, "stjørdal": _2, "stokke": _2, "stor-elvdal": _2, "stord": _2, "stordal": _2, "storfjord": _2, "omasvuotna": _2, "strand": _2, "stranda": _2, "stryn": _2, "sula": _2, "suldal": _2, "sund": _2, "sunndal": _2, "surnadal": _2, "sveio": _2, "svelvik": _2, "sykkylven": _2, "sogne": _2, "xn--sgne-gra": _2, "søgne": _2, "somna": _2, "xn--smna-gra": _2, "sømna": _2, "sondre-land": _2, "xn--sndre-land-0cb": _2, "søndre-land": _2, "sor-aurdal": _2, "xn--sr-aurdal-l8a": _2, "sør-aurdal": _2, "sor-fron": _2, "xn--sr-fron-q1a": _2, "sør-fron": _2, "sor-odal": _2, "xn--sr-odal-q1a": _2, "sør-odal": _2, "sor-varanger": _2, "xn--sr-varanger-ggb": _2, "sør-varanger": _2, "matta-varjjat": _2, "xn--mtta-vrjjat-k7af": _2, "mátta-várjjat": _2, "sorfold": _2, "xn--srfold-bya": _2, "sørfold": _2, "sorreisa": _2, "xn--srreisa-q1a": _2, "sørreisa": _2, "sorum": _2, "xn--srum-gra": _2, "sørum": _2, "tana": _2, "deatnu": _2, "time": _2, "tingvoll": _2, "tinn": _2, "tjeldsund": _2, "dielddanuorri": _2, "tjome": _2, "xn--tjme-hra": _2, "tjøme": _2, "tokke": _2, "tolga": _2, "torsken": _2, "tranoy": _2, "xn--trany-yua": _2, "tranøy": _2, "tromso": _2, "xn--troms-zua": _2, "tromsø": _2, "tromsa": _2, "romsa": _2, "trondheim": _2, "troandin": _2, "trysil": _2, "trana": _2, "xn--trna-woa": _2, "træna": _2, "trogstad": _2, "xn--trgstad-r1a": _2, "trøgstad": _2, "tvedestrand": _2, "tydal": _2, "tynset": _2, "tysfjord": _2, "divtasvuodna": _2, "divttasvuotna": _2, "tysnes": _2, "tysvar": _2, "xn--tysvr-vra": _2, "tysvær": _2, "tonsberg": _2, "xn--tnsberg-q1a": _2, "tønsberg": _2, "ullensaker": _2, "ullensvang": _2, "ulvik": _2, "utsira": _2, "vadso": _2, "xn--vads-jra": _2, "vadsø": _2, "cahcesuolo": _2, "xn--hcesuolo-7ya35b": _2, "čáhcesuolo": _2, "vaksdal": _2, "valle": _2, "vang": _2, "vanylven": _2, "vardo": _2, "xn--vard-jra": _2, "vardø": _2, "varggat": _2, "xn--vrggt-xqad": _2, "várggát": _2, "vefsn": _2, "vaapste": _2, "vega": _2, "vegarshei": _2, "xn--vegrshei-c0a": _2, "vegårshei": _2, "vennesla": _2, "verdal": _2, "verran": _2, "vestby": _2, "vestnes": _2, "vestre-slidre": _2, "vestre-toten": _2, "vestvagoy": _2, "xn--vestvgy-ixa6o": _2, "vestvågøy": _2, "vevelstad": _2, "vik": _2, "vikna": _2, "vindafjord": _2, "volda": _2, "voss": _2, "varoy": _2, "xn--vry-yla5g": _2, "værøy": _2, "vagan": _2, "xn--vgan-qoa": _2, "vågan": _2, "voagat": _2, "vagsoy": _2, "xn--vgsy-qoa0j": _2, "vågsøy": _2, "vaga": _2, "xn--vg-yiab": _2, "vågå": _2, "ostfold": { "$": 0, "succ": { "valer": _2 } }, "xn--stfold-9xa": { "$": 0, "succ": { "xn--vler-qoa": _2 } }, "østfold": { "$": 0, "succ": { "våler": _2 } }, "co": _4, "blogspot": _4 } }, "np": _8, "nr": _22, "nu": { "$": 1, "succ": { "merseine": _4, "mine": _4, "shacknet": _4, "nom": _4, "uwu": _4, "enterprisecloud": _4 } }, "nz": { "$": 1, "succ": { "ac": _2, "co": _5, "cri": _2, "geek": _2, "gen": _2, "govt": _2, "health": _2, "iwi": _2, "kiwi": _2, "maori": _2, "mil": _2, "xn--mori-qsa": _2, "māori": _2, "net": _2, "org": _2, "parliament": _2, "school": _2, "nym": _4 } }, "om": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "gov": _2, "med": _2, "museum": _2, "net": _2, "org": _2, "pro": _2 } }, "onion": _2, "org": { "$": 1, "succ": { "altervista": _4, "amune": { "$": 0, "succ": { "tele": _4 } }, "pimienta": _4, "poivron": _4, "potager": _4, "sweetpepper": _4, "ae": _4, "us": _4, "certmgr": _4, "cdn77": { "$": 0, "succ": { "c": _4, "rsc": _4 } }, "cdn77-secure": { "$": 0, "succ": { "origin": { "$": 0, "succ": { "ssl": _4 } } } }, "cloudns": _4, "duckdns": _4, "tunk": _4, "dyndns": { "$": 2, "succ": { "go": _4, "home": _4 } }, "blogdns": _4, "blogsite": _4, "boldlygoingnowhere": _4, "dnsalias": _4, "dnsdojo": _4, "doesntexist": _4, "dontexist": _4, "doomdns": _4, "dvrdns": _4, "dynalias": _4, "endofinternet": _4, "endoftheinternet": _4, "from-me": _4, "game-host": _4, "gotdns": _4, "hobby-site": _4, "homedns": _4, "homeftp": _4, "homelinux": _4, "homeunix": _4, "is-a-bruinsfan": _4, "is-a-candidate": _4, "is-a-celticsfan": _4, "is-a-chef": _4, "is-a-geek": _4, "is-a-knight": _4, "is-a-linux-user": _4, "is-a-patsfan": _4, "is-a-soxfan": _4, "is-found": _4, "is-lost": _4, "is-saved": _4, "is-very-bad": _4, "is-very-evil": _4, "is-very-good": _4, "is-very-nice": _4, "is-very-sweet": _4, "isa-geek": _4, "kicks-ass": _4, "misconfused": _4, "podzone": _4, "readmyblog": _4, "selfip": _4, "sellsyourhome": _4, "servebbs": _4, "serveftp": _4, "servegame": _4, "stuff-4-sale": _4, "webhop": _4, "ddnss": _4, "accesscam": _4, "camdvr": _4, "freeddns": _4, "mywire": _4, "webredirect": _4, "eu": { "$": 2, "succ": { "al": _4, "asso": _4, "at": _4, "au": _4, "be": _4, "bg": _4, "ca": _4, "cd": _4, "ch": _4, "cn": _4, "cy": _4, "cz": _4, "de": _4, "dk": _4, "edu": _4, "ee": _4, "es": _4, "fi": _4, "fr": _4, "gr": _4, "hr": _4, "hu": _4, "ie": _4, "il": _4, "in": _4, "int": _4, "is": _4, "it": _4, "jp": _4, "kr": _4, "lt": _4, "lu": _4, "lv": _4, "mc": _4, "me": _4, "mk": _4, "mt": _4, "my": _4, "net": _4, "ng": _4, "nl": _4, "no": _4, "nz": _4, "paris": _4, "pl": _4, "pt": _4, "q-a": _4, "ro": _4, "ru": _4, "se": _4, "si": _4, "sk": _4, "tr": _4, "uk": _4, "us": _4 } }, "twmail": _4, "fedorainfracloud": _4, "fedorapeople": _4, "fedoraproject": { "$": 0, "succ": { "cloud": _4, "os": _16, "stg": { "$": 0, "succ": { "os": _16 } } } }, "freedesktop": _4, "hepforge": _4, "in-dsl": _4, "in-vpn": _4, "js": _4, "uklugs": _4, "barsy": _4, "mayfirst": _4, "mozilla-iot": _4, "bmoattachments": _4, "dynserv": _4, "now-dns": _4, "cable-modem": _4, "collegefan": _4, "couchpotatofries": _4, "mlbfan": _4, "mysecuritycamera": _4, "nflfan": _4, "read-books": _4, "ufcfan": _4, "hopto": _4, "myftp": _4, "no-ip": _4, "zapto": _4, "pubtls": _4, "my-firewall": _4, "myfirewall": _4, "spdns": _4, "dsmynas": _4, "familyds": _4, "edugit": _4, "tuxfamily": _4, "diskstation": _4, "hk": _4, "wmflabs": _4, "toolforge": _4, "wmcloud": _4, "za": _4 } }, "pa": { "$": 1, "succ": { "ac": _2, "gob": _2, "com": _2, "org": _2, "sld": _2, "edu": _2, "net": _2, "ing": _2, "abo": _2, "med": _2, "nom": _2 } }, "pe": { "$": 1, "succ": { "edu": _2, "gob": _2, "nom": _2, "mil": _2, "org": _2, "com": _2, "net": _2, "blogspot": _4, "nym": _4 } }, "pf": { "$": 1, "succ": { "com": _2, "org": _2, "edu": _2 } }, "pg": _8, "ph": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "ngo": _2, "mil": _2, "i": _2 } }, "pk": { "$": 1, "succ": { "com": _2, "net": _2, "edu": _2, "org": _2, "fam": _2, "biz": _2, "web": _2, "gov": _2, "gob": _2, "gok": _2, "gon": _2, "gop": _2, "gos": _2, "info": _2 } }, "pl": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "aid": _2, "agro": _2, "atm": _2, "auto": _2, "biz": _2, "edu": _2, "gmina": _2, "gsm": _2, "info": _2, "mail": _2, "miasta": _2, "media": _2, "mil": _2, "nieruchomosci": _2, "nom": _2, "pc": _2, "powiat": _2, "priv": _2, "realestate": _2, "rel": _2, "sex": _2, "shop": _2, "sklep": _2, "sos": _2, "szkola": _2, "targi": _2, "tm": _2, "tourism": _2, "travel": _2, "turystyka": _2, "gov": { "$": 1, "succ": { "ap": _2, "ic": _2, "is": _2, "us": _2, "kmpsp": _2, "kppsp": _2, "kwpsp": _2, "psp": _2, "wskr": _2, "kwp": _2, "mw": _2, "ug": _2, "um": _2, "umig": _2, "ugim": _2, "upow": _2, "uw": _2, "starostwo": _2, "pa": _2, "po": _2, "psse": _2, "pup": _2, "rzgw": _2, "sa": _2, "so": _2, "sr": _2, "wsa": _2, "sko": _2, "uzs": _2, "wiih": _2, "winb": _2, "pinb": _2, "wios": _2, "witd": _2, "wzmiuw": _2, "piw": _2, "wiw": _2, "griw": _2, "wif": _2, "oum": _2, "sdn": _2, "zp": _2, "uppo": _2, "mup": _2, "wuoz": _2, "konsulat": _2, "oirm": _2 } }, "augustow": _2, "babia-gora": _2, "bedzin": _2, "beskidy": _2, "bialowieza": _2, "bialystok": _2, "bielawa": _2, "bieszczady": _2, "boleslawiec": _2, "bydgoszcz": _2, "bytom": _2, "cieszyn": _2, "czeladz": _2, "czest": _2, "dlugoleka": _2, "elblag": _2, "elk": _2, "glogow": _2, "gniezno": _2, "gorlice": _2, "grajewo": _2, "ilawa": _2, "jaworzno": _2, "jelenia-gora": _2, "jgora": _2, "kalisz": _2, "kazimierz-dolny": _2, "karpacz": _2, "kartuzy": _2, "kaszuby": _2, "katowice": _2, "kepno": _2, "ketrzyn": _2, "klodzko": _2, "kobierzyce": _2, "kolobrzeg": _2, "konin": _2, "konskowola": _2, "kutno": _2, "lapy": _2, "lebork": _2, "legnica": _2, "lezajsk": _2, "limanowa": _2, "lomza": _2, "lowicz": _2, "lubin": _2, "lukow": _2, "malbork": _2, "malopolska": _2, "mazowsze": _2, "mazury": _2, "mielec": _2, "mielno": _2, "mragowo": _2, "naklo": _2, "nowaruda": _2, "nysa": _2, "olawa": _2, "olecko": _2, "olkusz": _2, "olsztyn": _2, "opoczno": _2, "opole": _2, "ostroda": _2, "ostroleka": _2, "ostrowiec": _2, "ostrowwlkp": _2, "pila": _2, "pisz": _2, "podhale": _2, "podlasie": _2, "polkowice": _2, "pomorze": _2, "pomorskie": _2, "prochowice": _2, "pruszkow": _2, "przeworsk": _2, "pulawy": _2, "radom": _2, "rawa-maz": _2, "rybnik": _2, "rzeszow": _2, "sanok": _2, "sejny": _2, "slask": _2, "slupsk": _2, "sosnowiec": _2, "stalowa-wola": _2, "skoczow": _2, "starachowice": _2, "stargard": _2, "suwalki": _2, "swidnica": _2, "swiebodzin": _2, "swinoujscie": _2, "szczecin": _2, "szczytno": _2, "tarnobrzeg": _2, "tgory": _2, "turek": _2, "tychy": _2, "ustka": _2, "walbrzych": _2, "warmia": _2, "warszawa": _2, "waw": _2, "wegrow": _2, "wielun": _2, "wlocl": _2, "wloclawek": _2, "wodzislaw": _2, "wolomin": _2, "wroclaw": _2, "zachpomor": _2, "zagan": _2, "zarow": _2, "zgora": _2, "zgorzelec": _2, "beep": _4, "krasnik": _4, "leczna": _4, "lubartow": _4, "lublin": _4, "poniatowa": _4, "swidnik": _4, "co": _4, "art": _4, "gliwice": _4, "krakow": _4, "poznan": _4, "wroc": _4, "zakopane": _4, "gda": _4, "gdansk": _4, "gdynia": _4, "med": _4, "sopot": _4 } }, "pm": { "$": 1, "succ": { "own": _4 } }, "pn": { "$": 1, "succ": { "gov": _2, "co": _2, "org": _2, "edu": _2, "net": _2 } }, "post": _2, "pr": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "isla": _2, "pro": _2, "biz": _2, "info": _2, "name": _2, "est": _2, "prof": _2, "ac": _2 } }, "pro": { "$": 1, "succ": { "aaa": _2, "aca": _2, "acct": _2, "avocat": _2, "bar": _2, "cpa": _2, "eng": _2, "jur": _2, "law": _2, "med": _2, "recht": _2, "cloudns": _4, "dnstrace": { "$": 0, "succ": { "bci": _4 } }, "barsy": _4 } }, "ps": { "$": 1, "succ": { "edu": _2, "gov": _2, "sec": _2, "plo": _2, "com": _2, "org": _2, "net": _2 } }, "pt": { "$": 1, "succ": { "net": _2, "gov": _2, "org": _2, "edu": _2, "int": _2, "publ": _2, "com": _2, "nome": _2, "blogspot": _4, "nym": _4 } }, "pw": { "$": 1, "succ": { "co": _2, "ne": _2, "or": _2, "ed": _2, "go": _2, "belau": _2, "cloudns": _4, "x443": _4, "nom": _4 } }, "py": { "$": 1, "succ": { "com": _2, "coop": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "qa": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "blogspot": _4, "nom": _4 } }, "re": { "$": 1, "succ": { "asso": _2, "com": _2, "nom": _2, "blogspot": _4 } }, "ro": { "$": 1, "succ": { "arts": _2, "com": _2, "firm": _2, "info": _2, "nom": _2, "nt": _2, "org": _2, "rec": _2, "store": _2, "tm": _2, "www": _2, "shop": _4, "blogspot": _4, "nym": _4 } }, "rs": { "$": 1, "succ": { "ac": _2, "co": _2, "edu": _2, "gov": _2, "in": _2, "org": _2, "blogspot": _4, "ua": _4, "nom": _4, "ox": _4 } }, "ru": { "$": 1, "succ": { "ac": _4, "edu": _4, "gov": _4, "int": _4, "mil": _4, "test": _4, "adygeya": _4, "bashkiria": _4, "bir": _4, "cbg": _4, "com": _4, "dagestan": _4, "grozny": _4, "kalmykia": _4, "kustanai": _4, "marine": _4, "mordovia": _4, "msk": _4, "mytis": _4, "nalchik": _4, "nov": _4, "pyatigorsk": _4, "spb": _4, "vladikavkaz": _4, "vladimir": _4, "blogspot": _4, "regruhosting": _27, "myjino": { "$": 2, "succ": { "hosting": _7, "landing": _7, "spectrum": _7, "vps": _7 } }, "cldmail": { "$": 0, "succ": { "hb": _4 } }, "net": _4, "org": _4, "pp": _4, "ras": _4 } }, "rw": { "$": 1, "succ": { "ac": _2, "co": _2, "coop": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "sa": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "med": _2, "pub": _2, "edu": _2, "sch": _2 } }, "sb": _9, "sc": _9, "sd": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "med": _2, "tv": _2, "gov": _2, "info": _2 } }, "se": { "$": 1, "succ": { "a": _2, "ac": _2, "b": _2, "bd": _2, "brand": _2, "c": _2, "d": _2, "e": _2, "f": _2, "fh": _2, "fhsk": _2, "fhv": _2, "g": _2, "h": _2, "i": _2, "k": _2, "komforb": _2, "kommunalforbund": _2, "komvux": _2, "l": _2, "lanbib": _2, "m": _2, "n": _2, "naturbruksgymn": _2, "o": _2, "org": _2, "p": _2, "parti": _2, "pp": _2, "press": _2, "r": _2, "s": _2, "t": _2, "tm": _2, "u": _2, "w": _2, "x": _2, "y": _2, "z": _2, "com": _4, "blogspot": _4, "conf": _4 } }, "sg": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "per": _2, "blogspot": _4 } }, "sh": { "$": 1, "succ": { "com": _2, "net": _2, "gov": _2, "org": _2, "mil": _2, "hashbang": _4, "platform": { "$": 0, "succ": { "bc": _4, "ent": _4, "eu": _4, "us": _4 } }, "now": _4, "vxl": _4, "wedeploy": _4 } }, "si": { "$": 1, "succ": { "gitpage": _4, "blogspot": _4, "nom": _4 } }, "sj": _2, "sk": _23, "sl": _9, "sm": _2, "sn": { "$": 1, "succ": { "art": _2, "com": _2, "edu": _2, "gouv": _2, "org": _2, "perso": _2, "univ": _2, "blogspot": _4 } }, "so": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "sch": _4 } }, "sr": _2, "ss": { "$": 1, "succ": { "biz": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2 } }, "st": { "$": 1, "succ": { "co": _2, "com": _2, "consulado": _2, "edu": _2, "embaixada": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "principe": _2, "saotome": _2, "store": _2, "nom": _4, "noho": _4 } }, "su": { "$": 1, "succ": { "abkhazia": _4, "adygeya": _4, "aktyubinsk": _4, "arkhangelsk": _4, "armenia": _4, "ashgabad": _4, "azerbaijan": _4, "balashov": _4, "bashkiria": _4, "bryansk": _4, "bukhara": _4, "chimkent": _4, "dagestan": _4, "east-kazakhstan": _4, "exnet": _4, "georgia": _4, "grozny": _4, "ivanovo": _4, "jambyl": _4, "kalmykia": _4, "kaluga": _4, "karacol": _4, "karaganda": _4, "karelia": _4, "khakassia": _4, "krasnodar": _4, "kurgan": _4, "kustanai": _4, "lenug": _4, "mangyshlak": _4, "mordovia": _4, "msk": _4, "murmansk": _4, "nalchik": _4, "navoi": _4, "north-kazakhstan": _4, "nov": _4, "obninsk": _4, "penza": _4, "pokrovsk": _4, "sochi": _4, "spb": _4, "tashkent": _4, "termez": _4, "togliatti": _4, "troitsk": _4, "tselinograd": _4, "tula": _4, "tuva": _4, "vladikavkaz": _4, "vladimir": _4, "vologda": _4, "nym": _4 } }, "sv": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "org": _2, "red": _2 } }, "sx": { "$": 1, "succ": { "gov": _2, "nym": _4 } }, "sy": _3, "sz": { "$": 1, "succ": { "co": _2, "ac": _2, "org": _2 } }, "tc": { "$": 1, "succ": { "ch": _4, "me": _4, "we": _4 } }, "td": _5, "tel": _2, "tf": _2, "tg": _2, "th": { "$": 1, "succ": { "ac": _2, "co": _2, "go": _2, "in": _2, "mi": _2, "net": _2, "or": _2, "online": _4, "shop": _4 } }, "tj": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "go": _2, "gov": _2, "int": _2, "mil": _2, "name": _2, "net": _2, "nic": _2, "org": _2, "test": _2, "web": _2, "nom": _4 } }, "tk": _2, "tl": _6, "tm": { "$": 1, "succ": { "com": _2, "co": _2, "org": _2, "net": _2, "nom": _2, "gov": _2, "mil": _2, "edu": _2 } }, "tn": { "$": 1, "succ": { "com": _2, "ens": _2, "fin": _2, "gov": _2, "ind": _2, "intl": _2, "nat": _2, "net": _2, "org": _2, "info": _2, "perso": _2, "tourism": _2, "edunet": _2, "rnrt": _2, "rns": _2, "rnu": _2, "mincom": _2, "agrinet": _2, "defense": _2, "turen": _2 } }, "to": { "$": 1, "succ": { "611": _4, "com": _2, "gov": _2, "net": _2, "org": _2, "edu": _2, "mil": _2, "oya": _4, "vpnplus": _4, "quickconnect": { "$": 0, "succ": { "direct": _4 } }, "nyan": _4 } }, "tr": { "$": 1, "succ": { "av": _2, "bbs": _2, "bel": _2, "biz": _2, "com": _5, "dr": _2, "edu": _2, "gen": _2, "gov": _2, "info": _2, "mil": _2, "k12": _2, "kep": _2, "name": _2, "net": _2, "org": _2, "pol": _2, "tel": _2, "tsk": _2, "tv": _2, "web": _2, "nc": _6 } }, "tt": { "$": 1, "succ": { "co": _2, "com": _2, "org": _2, "net": _2, "biz": _2, "info": _2, "pro": _2, "int": _2, "coop": _2, "jobs": _2, "mobi": _2, "travel": _2, "museum": _2, "aero": _2, "name": _2, "gov": _2, "edu": _2 } }, "tv": { "$": 1, "succ": { "dyndns": _4, "better-than": _4, "on-the-web": _4, "worse-than": _4 } }, "tw": { "$": 1, "succ": { "edu": _2, "gov": _2, "mil": _2, "com": { "$": 1, "succ": { "mymailer": _4 } }, "net": _2, "org": _2, "idv": _2, "game": _2, "ebiz": _2, "club": _2, "xn--zf0ao64a": _2, "網路": _2, "xn--uc0atv": _2, "組織": _2, "xn--czrw28b": _2, "商業": _2, "url": _4, "blogspot": _4, "nym": _4 } }, "tz": { "$": 1, "succ": { "ac": _2, "co": _2, "go": _2, "hotel": _2, "info": _2, "me": _2, "mil": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2, "tv": _2 } }, "ua": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "in": _2, "net": _2, "org": _2, "cherkassy": _2, "cherkasy": _2, "chernigov": _2, "chernihiv": _2, "chernivtsi": _2, "chernovtsy": _2, "ck": _2, "cn": _2, "cr": _2, "crimea": _2, "cv": _2, "dn": _2, "dnepropetrovsk": _2, "dnipropetrovsk": _2, "donetsk": _2, "dp": _2, "if": _2, "ivano-frankivsk": _2, "kh": _2, "kharkiv": _2, "kharkov": _2, "kherson": _2, "khmelnitskiy": _2, "khmelnytskyi": _2, "kiev": _2, "kirovograd": _2, "km": _2, "kr": _2, "krym": _2, "ks": _2, "kv": _2, "kyiv": _2, "lg": _2, "lt": _2, "lugansk": _2, "lutsk": _2, "lv": _2, "lviv": _2, "mk": _2, "mykolaiv": _2, "nikolaev": _2, "od": _2, "odesa": _2, "odessa": _2, "pl": _2, "poltava": _2, "rivne": _2, "rovno": _2, "rv": _2, "sb": _2, "sebastopol": _2, "sevastopol": _2, "sm": _2, "sumy": _2, "te": _2, "ternopil": _2, "uz": _2, "uzhgorod": _2, "vinnica": _2, "vinnytsia": _2, "vn": _2, "volyn": _2, "yalta": _2, "zaporizhzhe": _2, "zaporizhzhia": _2, "zhitomir": _2, "zhytomyr": _2, "zp": _2, "zt": _2, "cc": _4, "inf": _4, "ltd": _4, "biz": _4, "co": _4, "pp": _4, "v": _4 } }, "ug": { "$": 1, "succ": { "co": _2, "or": _2, "ac": _2, "sc": _2, "go": _2, "ne": _2, "com": _2, "org": _2, "blogspot": _4, "nom": _4 } }, "uk": { "$": 1, "succ": { "ac": _2, "co": { "$": 1, "succ": { "bytemark": { "$": 0, "succ": { "dh": _4, "vm": _4 } }, "blogspot": _4, "layershift": _17, "barsy": _4, "barsyonline": _4, "nh-serv": _4, "no-ip": _4, "wellbeingzone": _4, "gwiddle": _4 } }, "gov": { "$": 1, "succ": { "service": _4, "homeoffice": _4 } }, "ltd": _2, "me": _2, "net": _2, "nhs": _2, "org": { "$": 1, "succ": { "glug": _4, "lug": _4, "lugs": _4 } }, "plc": _2, "police": _2, "sch": _8, "conn": _4, "copro": _4, "barsy": _4 } }, "us": { "$": 1, "succ": { "dni": _2, "fed": _2, "isa": _2, "kids": _2, "nsn": _2, "ak": _30, "al": _30, "ar": _30, "as": _30, "az": _30, "ca": _30, "co": _30, "ct": _30, "dc": _30, "de": { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _4 } }, "fl": _30, "ga": _30, "gu": _30, "hi": _31, "ia": _30, "id": _30, "il": _30, "in": _30, "ks": _30, "ky": _30, "la": _30, "ma": { "$": 1, "succ": { "k12": { "$": 1, "succ": { "pvt": _2, "chtr": _2, "paroch": _2 } }, "cc": _2, "lib": _2 } }, "md": _30, "me": _30, "mi": { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _2, "ann-arbor": _2, "cog": _2, "dst": _2, "eaton": _2, "gen": _2, "mus": _2, "tec": _2, "washtenaw": _2 } }, "mn": _30, "mo": _30, "ms": _30, "mt": _30, "nc": _30, "nd": _31, "ne": _30, "nh": _30, "nj": _30, "nm": _30, "nv": _30, "ny": _30, "oh": _30, "ok": _30, "or": _30, "pa": _30, "pr": _30, "ri": _31, "sc": _30, "sd": _31, "tn": _30, "tx": _30, "ut": _30, "vi": _30, "vt": _30, "va": _30, "wa": _30, "wi": _30, "wv": { "$": 1, "succ": { "cc": _2 } }, "wy": _30, "cloudns": _4, "drud": _4, "is-by": _4, "land-4-sale": _4, "stuff-4-sale": _4, "graphox": _4, "freeddns": _4, "golffan": _4, "noip": _4, "pointto": _4, "platterp": _4 } }, "uy": { "$": 1, "succ": { "com": _5, "edu": _2, "gub": _2, "mil": _2, "net": _2, "org": _2, "nom": _4 } }, "uz": { "$": 1, "succ": { "co": _2, "com": _2, "net": _2, "org": _2 } }, "va": _2, "vc": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "mil": _2, "edu": _2, "gv": { "$": 2, "succ": { "d": _4 } }, "0e": _4, "nom": _4 } }, "ve": { "$": 1, "succ": { "arts": _2, "co": _2, "com": _2, "e12": _2, "edu": _2, "firm": _2, "gob": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "org": _2, "rec": _2, "store": _2, "tec": _2, "web": _2 } }, "vg": { "$": 1, "succ": { "nom": _4, "at": _4 } }, "vi": { "$": 1, "succ": { "co": _2, "com": _2, "k12": _2, "net": _2, "org": _2 } }, "vn": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "int": _2, "ac": _2, "biz": _2, "info": _2, "name": _2, "pro": _2, "health": _2, "blogspot": _4 } }, "vu": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "blog": _4, "dev": _4, "me": _4, "cn": _4 } }, "wf": _2, "ws": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "advisor": _7, "cloud66": _4, "dyndns": _4, "mypets": _4 } }, "yt": _2, "xn--mgbaam7a8h": _2, "امارات": _2, "xn--y9a3aq": _2, "հայ": _2, "xn--54b7fta0cc": _2, "বাংলা": _2, "xn--90ae": _2, "бг": _2, "xn--90ais": _2, "бел": _2, "xn--fiqs8s": _2, "中国": _2, "xn--fiqz9s": _2, "中國": _2, "xn--lgbbat1ad8j": _2, "الجزائر": _2, "xn--wgbh1c": _2, "مصر": _2, "xn--e1a4c": _2, "ею": _2, "xn--qxa6a": _2, "ευ": _2, "xn--mgbah1a3hjkrd": _2, "موريتانيا": _2, "xn--node": _2, "გე": _2, "xn--qxam": _2, "ελ": _2, "xn--j6w193g": { "$": 1, "succ": { "xn--55qx5d": _2, "xn--wcvs22d": _2, "xn--mxtq1m": _2, "xn--gmqw5a": _2, "xn--od0alg": _2, "xn--uc0atv": _2 } }, "香港": { "$": 1, "succ": { "公司": _2, "教育": _2, "政府": _2, "個人": _2, "網絡": _2, "組織": _2 } }, "xn--2scrj9c": _2, "ಭಾರತ": _2, "xn--3hcrj9c": _2, "ଭାରତ": _2, "xn--45br5cyl": _2, "ভাৰত": _2, "xn--h2breg3eve": _2, "भारतम्": _2, "xn--h2brj9c8c": _2, "भारोत": _2, "xn--mgbgu82a": _2, "ڀارت": _2, "xn--rvc1e0am3e": _2, "ഭാരതം": _2, "xn--h2brj9c": _2, "भारत": _2, "xn--mgbbh1a": _2, "بارت": _2, "xn--mgbbh1a71e": _2, "بھارت": _2, "xn--fpcrj9c3d": _2, "భారత్": _2, "xn--gecrj9c": _2, "ભારત": _2, "xn--s9brj9c": _2, "ਭਾਰਤ": _2, "xn--45brj9c": _2, "ভারত": _2, "xn--xkc2dl3a5ee0h": _2, "இந்தியா": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2, "xn--mgbtx2b": _2, "عراق": _2, "xn--mgbayh7gpa": _2, "الاردن": _2, "xn--3e0b707e": _2, "한국": _2, "xn--80ao21a": _2, "қаз": _2, "xn--fzc2c9e2c": _2, "ලංකා": _2, "xn--xkc2al3hye2a": _2, "இலங்கை": _2, "xn--mgbc0a9azcg": _2, "المغرب": _2, "xn--d1alf": _2, "мкд": _2, "xn--l1acc": _2, "мон": _2, "xn--mix891f": _2, "澳門": _2, "xn--mix082f": _2, "澳门": _2, "xn--mgbx4cd0ab": _2, "مليسيا": _2, "xn--mgb9awbf": _2, "عمان": _2, "xn--mgbai9azgqp6j": _2, "پاکستان": _2, "xn--mgbai9a5eva00b": _2, "پاكستان": _2, "xn--ygbi2ammx": _2, "فلسطين": _2, "xn--90a3ac": { "$": 1, "succ": { "xn--o1ac": _2, "xn--c1avg": _2, "xn--90azh": _2, "xn--d1at": _2, "xn--o1ach": _2, "xn--80au": _2 } }, "срб": { "$": 1, "succ": { "пр": _2, "орг": _2, "обр": _2, "од": _2, "упр": _2, "ак": _2 } }, "xn--p1ai": _2, "рф": _2, "xn--wgbl6a": _2, "قطر": _2, "xn--mgberp4a5d4ar": _2, "السعودية": _2, "xn--mgberp4a5d4a87g": _2, "السعودیة": _2, "xn--mgbqly7c0a67fbc": _2, "السعودیۃ": _2, "xn--mgbqly7cvafr": _2, "السعوديه": _2, "xn--mgbpl2fh": _2, "سودان": _2, "xn--yfro4i67o": _2, "新加坡": _2, "xn--clchc0ea0b2g2a9gcd": _2, "சிங்கப்பூர்": _2, "xn--ogbpf8fl": _2, "سورية": _2, "xn--mgbtf8fl": _2, "سوريا": _2, "xn--o3cw4h": { "$": 1, "succ": { "xn--12c1fe0br": _2, "xn--12co0c3b4eva": _2, "xn--h3cuzk1di": _2, "xn--o3cyx2a": _2, "xn--m3ch0j3a": _2, "xn--12cfi8ixb8l": _2 } }, "ไทย": { "$": 1, "succ": { "ศึกษา": _2, "ธุรกิจ": _2, "รัฐบาล": _2, "ทหาร": _2, "เน็ต": _2, "องค์กร": _2 } }, "xn--pgbs0dh": _2, "تونس": _2, "xn--kpry57d": _2, "台灣": _2, "xn--kprw13d": _2, "台湾": _2, "xn--nnx388a": _2, "臺灣": _2, "xn--j1amh": _2, "укр": _2, "xn--mgb2ddes": _2, "اليمن": _2, "xxx": _2, "ye": _8, "za": { "$": 0, "succ": { "ac": _2, "agric": _2, "alt": _2, "co": _5, "edu": _2, "gov": _2, "grondar": _2, "law": _2, "mil": _2, "net": _2, "ngo": _2, "nic": _2, "nis": _2, "nom": _2, "org": _2, "school": _2, "tm": _2, "web": _2 } }, "zm": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "mil": _2, "net": _2, "org": _2, "sch": _2 } }, "zw": { "$": 1, "succ": { "ac": _2, "co": _2, "gov": _2, "mil": _2, "org": _2 } }, "aaa": _2, "aarp": _2, "abarth": _2, "abb": _2, "abbott": _2, "abbvie": _2, "abc": _2, "able": _2, "abogado": _2, "abudhabi": _2, "academy": { "$": 1, "succ": { "official": _4 } }, "accenture": _2, "accountant": _2, "accountants": _2, "aco": _2, "actor": _2, "adac": _2, "ads": _2, "adult": _2, "aeg": _2, "aetna": _2, "afamilycompany": _2, "afl": _2, "africa": _2, "agakhan": _2, "agency": _2, "aig": _2, "airbus": _2, "airforce": _2, "airtel": _2, "akdn": _2, "alfaromeo": _2, "alibaba": _2, "alipay": _2, "allfinanz": _2, "allstate": _2, "ally": _2, "alsace": _2, "alstom": _2, "amazon": _2, "americanexpress": _2, "americanfamily": _2, "amex": _2, "amfam": _2, "amica": _2, "amsterdam": _2, "analytics": _2, "android": _2, "anquan": _2, "anz": _2, "aol": _2, "apartments": _2, "app": { "$": 1, "succ": { "wnext": _4, "run": { "$": 2, "succ": { "a": _4 } }, "web": _4, "hasura": _4, "loginline": _4, "netlify": _4, "telebit": _4, "vercel": _4 } }, "apple": _2, "aquarelle": _2, "arab": _2, "aramco": _2, "archi": _2, "army": _2, "art": _2, "arte": _2, "asda": _2, "associates": _2, "athleta": _2, "attorney": _2, "auction": _2, "audi": _2, "audible": _2, "audio": _2, "auspost": _2, "author": _2, "auto": _2, "autos": _2, "avianca": _2, "aws": _2, "axa": _2, "azure": _2, "baby": _2, "baidu": _2, "banamex": _2, "bananarepublic": _2, "band": _2, "bank": _2, "bar": _2, "barcelona": _2, "barclaycard": _2, "barclays": _2, "barefoot": _2, "bargains": _2, "baseball": _2, "basketball": _2, "bauhaus": _2, "bayern": _2, "bbc": _2, "bbt": _2, "bbva": _2, "bcg": _2, "bcn": _2, "beats": _2, "beauty": _2, "beer": _2, "bentley": _2, "berlin": _2, "best": _2, "bestbuy": _2, "bet": _2, "bharti": _2, "bible": _2, "bid": _2, "bike": _2, "bing": _2, "bingo": _2, "bio": _2, "black": _2, "blackfriday": _2, "blockbuster": _2, "blog": _2, "bloomberg": _2, "blue": _2, "bms": _2, "bmw": _2, "bnpparibas": _2, "boats": _2, "boehringer": _2, "bofa": _2, "bom": _2, "bond": _2, "boo": _2, "book": _2, "booking": _2, "bosch": _2, "bostik": _2, "boston": _2, "bot": _2, "boutique": _2, "box": _2, "bradesco": _2, "bridgestone": _2, "broadway": _2, "broker": _2, "brother": _2, "brussels": _2, "budapest": _2, "bugatti": _2, "build": _2, "builders": _2, "business": _10, "buy": _2, "buzz": _2, "bzh": _2, "cab": _2, "cafe": _2, "cal": _2, "call": _2, "calvinklein": _2, "cam": _2, "camera": _2, "camp": _2, "cancerresearch": _2, "canon": _2, "capetown": _2, "capital": _2, "capitalone": _2, "car": _2, "caravan": _2, "cards": _2, "care": _2, "career": _2, "careers": _2, "cars": _2, "casa": { "$": 1, "succ": { "nabu": { "$": 0, "succ": { "ui": _4 } } } }, "case": _2, "caseih": _2, "cash": _2, "casino": _2, "catering": _2, "catholic": _2, "cba": _2, "cbn": _2, "cbre": _2, "cbs": _2, "ceb": _2, "center": _2, "ceo": _2, "cern": _2, "cfa": _2, "cfd": _2, "chanel": _2, "channel": _2, "charity": _2, "chase": _2, "chat": _2, "cheap": _2, "chintai": _2, "christmas": _2, "chrome": _2, "church": _2, "cipriani": _2, "circle": _2, "cisco": _2, "citadel": _2, "citi": _2, "citic": _2, "city": _11, "cityeats": _2, "claims": _2, "cleaning": _2, "click": _2, "clinic": _2, "clinique": _2, "clothing": _2, "cloud": { "$": 1, "succ": { "banzai": _7, "statics": _7, "jele": _4, "linkyard": _4, "magentosite": _7, "perspecta": _4, "vapor": _4, "on-rancher": _7, "sensiosite": _7, "trafficplex": _4, "urown": _4, "voorloper": _4 } }, "club": { "$": 1, "succ": { "cloudns": _4, "jele": _4, "barsy": _4, "pony": _4 } }, "clubmed": _2, "coach": _2, "codes": { "$": 1, "succ": { "owo": _7 } }, "coffee": _2, "college": _2, "cologne": _2, "comcast": _2, "commbank": _2, "community": { "$": 1, "succ": { "ravendb": _4, "myforum": _4 } }, "company": _2, "compare": _2, "computer": _2, "comsec": _2, "condos": _2, "construction": _2, "consulting": _2, "contact": _2, "contractors": _2, "cooking": _2, "cookingchannel": _2, "cool": { "$": 1, "succ": { "de": _4 } }, "corsica": _2, "country": _2, "coupon": _2, "coupons": _2, "courses": _2, "cpa": _2, "credit": _2, "creditcard": _2, "creditunion": _2, "cricket": _2, "crown": _2, "crs": _2, "cruise": _2, "cruises": _2, "csc": _2, "cuisinella": _2, "cymru": _2, "cyou": _2, "dabur": _2, "dad": _2, "dance": _2, "data": _2, "date": _2, "dating": _2, "datsun": _2, "day": _2, "dclk": _2, "dds": _2, "deal": _2, "dealer": _2, "deals": _2, "degree": _2, "delivery": _2, "dell": _2, "deloitte": _2, "delta": _2, "democrat": _2, "dental": _2, "dentist": _2, "desi": _2, "design": { "$": 1, "succ": { "bss": _4 } }, "dev": { "$": 1, "succ": { "lcl": _7, "stg": _7, "workers": _4, "curv": _4, "fly": _4, "iserv": _4, "loginline": _4, "platter-app": _4, "vercel": _4, "webhare": _7 } }, "dhl": _2, "diamonds": _2, "diet": _2, "digital": { "$": 1, "succ": { "cloudapps": { "$": 2, "succ": { "london": _4 } } } }, "direct": _2, "directory": _2, "discount": _2, "discover": _2, "dish": _2, "diy": _2, "dnp": _2, "docs": _2, "doctor": _2, "dog": _2, "domains": _2, "dot": _2, "download": _2, "drive": _2, "dtv": _2, "dubai": _2, "duck": _2, "dunlop": _2, "dupont": _2, "durban": _2, "dvag": _2, "dvr": _2, "earth": { "$": 1, "succ": { "dapps": { "$": 0, "succ": { "*": _4, "bzz": _7 } } } }, "eat": _2, "eco": _2, "edeka": _2, "education": _10, "email": _2, "emerck": _2, "energy": _2, "engineer": _2, "engineering": _2, "enterprises": _2, "epson": _2, "equipment": _2, "ericsson": _2, "erni": _2, "esq": _2, "estate": { "$": 1, "succ": { "compute": _7 } }, "etisalat": _2, "eurovision": _2, "eus": { "$": 1, "succ": { "party": _18 } }, "events": _10, "exchange": _2, "expert": _2, "exposed": _2, "express": _2, "extraspace": _2, "fage": _2, "fail": _2, "fairwinds": _2, "faith": _19, "family": _2, "fan": _2, "fans": _2, "farm": { "$": 1, "succ": { "storj": _4 } }, "farmers": _2, "fashion": { "$": 1, "succ": { "of": _4, "on": _4 } }, "fast": _2, "fedex": _2, "feedback": _2, "ferrari": _2, "ferrero": _2, "fiat": _2, "fidelity": _2, "fido": _2, "film": _2, "final": _2, "finance": _2, "financial": _10, "fire": _2, "firestone": _2, "firmdale": _2, "fish": _2, "fishing": _2, "fit": { "$": 1, "succ": { "ptplus": _4 } }, "fitness": _2, "flickr": _2, "flights": _2, "flir": _2, "florist": _2, "flowers": _2, "fly": _2, "foo": _2, "food": _2, "foodnetwork": _2, "football": { "$": 1, "succ": { "of": _4 } }, "ford": _2, "forex": _2, "forsale": _2, "forum": _2, "foundation": _2, "fox": _2, "free": _2, "fresenius": _2, "frl": _2, "frogans": _2, "frontdoor": _2, "frontier": _2, "ftr": _2, "fujitsu": _2, "fujixerox": _2, "fun": _2, "fund": _2, "furniture": _2, "futbol": _2, "fyi": _2, "gal": _2, "gallery": _2, "gallo": _2, "gallup": _2, "game": _2, "games": _2, "gap": _2, "garden": _2, "gay": _2, "gbiz": _2, "gdn": { "$": 1, "succ": { "cnpy": _4 } }, "gea": _2, "gent": _2, "genting": _2, "george": _2, "ggee": _2, "gift": _2, "gifts": _2, "gives": _2, "giving": _2, "glade": _2, "glass": _2, "gle": _2, "global": _2, "globo": _2, "gmail": _2, "gmbh": _2, "gmo": _2, "gmx": _2, "godaddy": _2, "gold": _2, "goldpoint": _2, "golf": _2, "goo": _2, "goodyear": _2, "goog": { "$": 1, "succ": { "cloud": _4 } }, "google": _2, "gop": _2, "got": _2, "grainger": _2, "graphics": _2, "gratis": _2, "green": _2, "gripe": _2, "grocery": _2, "group": { "$": 1, "succ": { "discourse": _4 } }, "guardian": _2, "gucci": _2, "guge": _2, "guide": _2, "guitars": _2, "guru": _2, "hair": _2, "hamburg": _2, "hangout": _2, "haus": _2, "hbo": _2, "hdfc": _2, "hdfcbank": _2, "health": _2, "healthcare": _2, "help": _2, "helsinki": _2, "here": _2, "hermes": _2, "hgtv": _2, "hiphop": _2, "hisamitsu": _2, "hitachi": _2, "hiv": _2, "hkt": _2, "hockey": _2, "holdings": _2, "holiday": _2, "homedepot": _2, "homegoods": _2, "homes": _2, "homesense": _2, "honda": _2, "horse": _2, "hospital": _2, "host": { "$": 1, "succ": { "cloudaccess": _4, "freesite": _4, "fastvps": _4, "myfast": _4, "jele": _4, "mircloud": _4, "pcloud": _4, "half": _4 } }, "hosting": { "$": 1, "succ": { "opencraft": _4 } }, "hot": _2, "hoteles": _2, "hotels": _2, "hotmail": _2, "house": _2, "how": _2, "hsbc": _2, "hughes": _2, "hyatt": _2, "hyundai": _2, "ibm": _2, "icbc": _2, "ice": _2, "icu": _2, "ieee": _2, "ifm": _2, "ikano": _2, "imamat": _2, "imdb": _2, "immo": _2, "immobilien": _2, "inc": _2, "industries": _2, "infiniti": _2, "ing": _2, "ink": _11, "institute": _2, "insurance": _2, "insure": _2, "intel": _2, "international": _2, "intuit": _2, "investments": _2, "ipiranga": _2, "irish": _2, "ismaili": _2, "ist": _2, "istanbul": _2, "itau": _2, "itv": _2, "iveco": _2, "jaguar": _2, "java": _2, "jcb": _2, "jcp": _2, "jeep": _2, "jetzt": _2, "jewelry": _2, "jio": _2, "jll": _2, "jmp": _2, "jnj": _2, "joburg": _2, "jot": _2, "joy": _2, "jpmorgan": _2, "jprs": _2, "juegos": _2, "juniper": _2, "kaufen": _2, "kddi": _2, "kerryhotels": _2, "kerrylogistics": _2, "kerryproperties": _2, "kfh": _2, "kia": _2, "kim": _2, "kinder": _2, "kindle": _2, "kitchen": _2, "kiwi": _2, "koeln": _2, "komatsu": _2, "kosher": _2, "kpmg": _2, "kpn": _2, "krd": { "$": 1, "succ": { "co": _4, "edu": _4 } }, "kred": _2, "kuokgroup": _2, "kyoto": _2, "lacaixa": _2, "lamborghini": _2, "lamer": _2, "lancaster": _2, "lancia": _2, "land": { "$": 1, "succ": { "static": { "$": 2, "succ": { "dev": _4, "sites": _4 } } } }, "landrover": _2, "lanxess": _2, "lasalle": _2, "lat": _2, "latino": _2, "latrobe": _2, "law": _2, "lawyer": _2, "lds": _2, "lease": _2, "leclerc": _2, "lefrak": _2, "legal": _2, "lego": _2, "lexus": _2, "lgbt": _2, "lidl": _2, "life": _2, "lifeinsurance": _2, "lifestyle": _2, "lighting": _2, "like": _2, "lilly": _2, "limited": _2, "limo": _2, "lincoln": _2, "linde": _2, "link": { "$": 1, "succ": { "cyon": _4, "mypep": _4, "dweb": _7 } }, "lipsy": _2, "live": _2, "living": _2, "lixil": _2, "llc": _2, "llp": _2, "loan": _2, "loans": _2, "locker": _2, "locus": _2, "loft": _2, "lol": _2, "london": { "$": 1, "succ": { "in": _4, "of": _4 } }, "lotte": _2, "lotto": _2, "love": _2, "lpl": _2, "lplfinancial": _2, "ltd": _2, "ltda": _2, "lundbeck": _2, "lupin": _2, "luxe": _2, "luxury": _2, "macys": _2, "madrid": _2, "maif": _2, "maison": _2, "makeup": _2, "man": _2, "management": { "$": 1, "succ": { "router": _4 } }, "mango": _2, "map": _2, "market": _2, "marketing": _2, "markets": _2, "marriott": _2, "marshalls": _2, "maserati": _2, "mattel": _2, "mba": _2, "mckinsey": _2, "med": _2, "media": _2, "meet": _2, "melbourne": _2, "meme": _2, "memorial": _2, "men": _24, "menu": _25, "merckmsd": _2, "metlife": _2, "miami": _2, "microsoft": _2, "mini": _2, "mint": _2, "mit": _2, "mitsubishi": _2, "mlb": _2, "mls": _2, "mma": _2, "mobile": _2, "moda": _2, "moe": _2, "moi": _2, "mom": { "$": 1, "succ": { "and": _4, "for": _4 } }, "monash": _2, "money": _2, "monster": _2, "mormon": _2, "mortgage": _2, "moscow": _2, "moto": _2, "motorcycles": _2, "mov": _2, "movie": _2, "msd": _2, "mtn": _2, "mtr": _2, "mutual": _2, "nab": _2, "nagoya": _2, "nationwide": _2, "natura": _2, "navy": _2, "nba": _2, "nec": _2, "netbank": _2, "netflix": _2, "network": { "$": 1, "succ": { "alces": _7, "co": _4, "arvo": _4, "azimuth": _4 } }, "neustar": _2, "new": _2, "newholland": _2, "news": _2, "next": _2, "nextdirect": _2, "nexus": _2, "nfl": _2, "ngo": _2, "nhk": _2, "nico": _2, "nike": _2, "nikon": _2, "ninja": _2, "nissan": _2, "nissay": _2, "nokia": _2, "northwesternmutual": _2, "norton": _2, "now": _2, "nowruz": _2, "nowtv": _2, "nra": _2, "nrw": _2, "ntt": _2, "nyc": _2, "obi": _2, "observer": _2, "off": _2, "office": _2, "okinawa": _2, "olayan": _2, "olayangroup": _2, "oldnavy": _2, "ollo": _2, "omega": _2, "one": { "$": 1, "succ": { "onred": { "$": 2, "succ": { "staging": _4 } }, "for": _4, "homelink": _4 } }, "ong": _2, "onl": _2, "online": _25, "onyourside": _2, "ooo": _2, "open": _2, "oracle": _2, "orange": _2, "organic": _2, "origins": _2, "osaka": _2, "otsuka": _2, "ott": _2, "ovh": { "$": 1, "succ": { "nerdpol": _4 } }, "page": { "$": 1, "succ": { "pdns": _4, "plesk": _4, "prvcy": _4 } }, "panasonic": _2, "paris": _2, "pars": _2, "partners": _2, "parts": _2, "party": _19, "passagens": _2, "pay": _2, "pccw": _2, "pet": _2, "pfizer": _2, "pharmacy": _2, "phd": _2, "philips": _2, "phone": _2, "photo": _2, "photography": _2, "photos": _2, "physio": _2, "pics": _2, "pictet": _2, "pictures": { "$": 1, "succ": { "1337": _4 } }, "pid": _2, "pin": _2, "ping": _2, "pink": _2, "pioneer": _2, "pizza": _2, "place": _10, "play": _2, "playstation": _2, "plumbing": _2, "plus": _2, "pnc": _2, "pohl": _2, "poker": _2, "politie": _2, "porn": { "$": 1, "succ": { "indie": _4 } }, "pramerica": _2, "praxi": _2, "press": _2, "prime": _2, "prod": _2, "productions": _2, "prof": _2, "progressive": _2, "promo": _2, "properties": _2, "property": _2, "protection": _2, "pru": _2, "prudential": _2, "pub": _25, "pwc": _2, "qpon": _2, "quebec": _2, "quest": _2, "qvc": _2, "racing": _2, "radio": _2, "raid": _2, "read": _2, "realestate": _2, "realtor": _2, "realty": _2, "recipes": _2, "red": _2, "redstone": _2, "redumbrella": _2, "rehab": _2, "reise": _2, "reisen": _2, "reit": _2, "reliance": _2, "ren": _2, "rent": _2, "rentals": _2, "repair": _2, "report": _2, "republican": _2, "rest": _2, "restaurant": _2, "review": _19, "reviews": _2, "rexroth": _2, "rich": _2, "richardli": _2, "ricoh": _2, "ril": _2, "rio": _2, "rip": { "$": 1, "succ": { "clan": _4 } }, "rmit": _2, "rocher": _2, "rocks": { "$": 1, "succ": { "myddns": _4, "lima-city": _4, "webspace": _4 } }, "rodeo": _2, "rogers": _2, "room": _2, "rsvp": _2, "rugby": _2, "ruhr": _2, "run": { "$": 1, "succ": { "hs": _4, "development": _4, "ravendb": _4, "repl": _4 } }, "rwe": _2, "ryukyu": _2, "saarland": _2, "safe": _2, "safety": _2, "sakura": _2, "sale": _24, "salon": _2, "samsclub": _2, "samsung": _2, "sandvik": _2, "sandvikcoromant": _2, "sanofi": _2, "sap": _2, "sarl": _2, "sas": _2, "save": _2, "saxo": _2, "sbi": _2, "sbs": _2, "sca": _2, "scb": _2, "schaeffler": _2, "schmidt": _2, "scholarships": _2, "school": _11, "schule": _2, "schwarz": _2, "science": _19, "scjohnson": _2, "scot": { "$": 1, "succ": { "gov": _4 } }, "search": _2, "seat": _2, "secure": _2, "security": _2, "seek": _2, "select": _2, "sener": _2, "services": { "$": 1, "succ": { "loginline": _4 } }, "ses": _2, "seven": _2, "sew": _2, "sex": _2, "sexy": _2, "sfr": _2, "shangrila": _2, "sharp": _2, "shaw": _2, "shell": _2, "shia": _2, "shiksha": _2, "shoes": _2, "shop": _25, "shopping": _2, "shouji": _2, "show": _2, "showtime": _2, "shriram": _2, "silk": _2, "sina": _2, "singles": _2, "site": { "$": 1, "succ": { "cloudera": _4, "cyon": _4, "fastvps": _4, "jele": _4, "lelux": _4, "loginline": _4, "barsy": _4, "opensocial": _4, "platformsh": _7, "byen": _4, "mintere": _4 } }, "ski": _2, "skin": _2, "sky": _2, "skype": _2, "sling": _2, "smart": _2, "smile": _2, "sncf": _2, "soccer": _2, "social": _2, "softbank": _2, "software": _2, "sohu": _2, "solar": _2, "solutions": _2, "song": _2, "sony": _2, "soy": _2, "spa": _2, "space": { "$": 1, "succ": { "myfast": _4, "linkitools": _4, "uber": _4, "xs4all": _4 } }, "sport": _2, "spot": _2, "spreadbetting": _2, "srl": _2, "stada": _2, "staples": _2, "star": _2, "statebank": _2, "statefarm": _2, "stc": _2, "stcgroup": _2, "stockholm": _2, "storage": _2, "store": { "$": 1, "succ": { "shopware": _4 } }, "stream": _2, "studio": _2, "study": _2, "style": _2, "sucks": _2, "supplies": _2, "supply": _2, "support": _25, "surf": _2, "surgery": _2, "suzuki": _2, "swatch": _2, "swiftcover": _2, "swiss": _2, "sydney": _2, "systems": { "$": 1, "succ": { "knightpoint": _4 } }, "tab": _2, "taipei": _2, "talk": _2, "taobao": _2, "target": _2, "tatamotors": _2, "tatar": _2, "tattoo": _2, "tax": _2, "taxi": _2, "tci": _2, "tdk": _2, "team": { "$": 1, "succ": { "discourse": _4, "jelastic": _4 } }, "tech": _2, "technology": _10, "temasek": _2, "tennis": _2, "teva": _2, "thd": _2, "theater": _2, "theatre": _2, "tiaa": _2, "tickets": _2, "tienda": _2, "tiffany": _2, "tips": _2, "tires": _2, "tirol": _2, "tjmaxx": _2, "tjx": _2, "tkmaxx": _2, "tmall": _2, "today": _2, "tokyo": _2, "tools": _2, "top": { "$": 1, "succ": { "now-dns": _4, "ntdll": _4 } }, "toray": _2, "toshiba": _2, "total": _2, "tours": _2, "town": _2, "toyota": _2, "toys": _2, "trade": _19, "trading": _2, "training": _2, "travel": _2, "travelchannel": _2, "travelers": _2, "travelersinsurance": _2, "trust": _2, "trv": _2, "tube": _2, "tui": _2, "tunes": _2, "tushu": _2, "tvs": _2, "ubank": _2, "ubs": _2, "unicom": _2, "university": _2, "uno": _2, "uol": _2, "ups": _2, "vacations": _2, "vana": _2, "vanguard": _2, "vegas": _2, "ventures": _2, "verisign": _2, "versicherung": _2, "vet": _2, "viajes": _2, "video": _2, "vig": _2, "viking": _2, "villas": _2, "vin": _2, "vip": _2, "virgin": _2, "visa": _2, "vision": _2, "viva": _2, "vivo": _2, "vlaanderen": _2, "vodka": _2, "volkswagen": _2, "volvo": _2, "vote": _2, "voting": _2, "voto": _2, "voyage": _2, "vuelos": _2, "wales": _2, "walmart": _2, "walter": _2, "wang": _2, "wanggou": _2, "watch": _2, "watches": _2, "weather": _2, "weatherchannel": _2, "webcam": _2, "weber": _2, "website": _2, "wed": _2, "wedding": _2, "weibo": _2, "weir": _2, "whoswho": _2, "wien": _2, "wiki": _2, "williamhill": _2, "win": _2, "windows": _2, "wine": _2, "winners": _2, "wme": _2, "wolterskluwer": _2, "woodside": _2, "work": { "$": 1, "succ": { "of": _4, "to": _4 } }, "works": _2, "world": _2, "wow": _2, "wtc": _2, "wtf": _2, "xbox": _2, "xerox": _2, "xfinity": _2, "xihuan": _2, "xin": _2, "xn--11b4c3d": _2, "कॉम": _2, "xn--1ck2e1b": _2, "セール": _2, "xn--1qqw23a": _2, "佛山": _2, "xn--30rr7y": _2, "慈善": _2, "xn--3bst00m": _2, "集团": _2, "xn--3ds443g": _2, "在线": _2, "xn--3oq18vl8pn36a": _2, "大众汽车": _2, "xn--3pxu8k": _2, "点看": _2, "xn--42c2d9a": _2, "คอม": _2, "xn--45q11c": _2, "八卦": _2, "xn--4gbrim": _2, "موقع": _2, "xn--55qw42g": _2, "公益": _2, "xn--55qx5d": _2, "公司": _2, "xn--5su34j936bgsg": _2, "香格里拉": _2, "xn--5tzm5g": _2, "网站": _2, "xn--6frz82g": _2, "移动": _2, "xn--6qq986b3xl": _2, "我爱你": _2, "xn--80adxhks": _2, "москва": _2, "xn--80aqecdr1a": _2, "католик": _2, "xn--80asehdb": _2, "онлайн": _2, "xn--80aswg": _2, "сайт": _2, "xn--8y0a063a": _2, "联通": _2, "xn--9dbq2a": _2, "קום": _2, "xn--9et52u": _2, "时尚": _2, "xn--9krt00a": _2, "微博": _2, "xn--b4w605ferd": _2, "淡马锡": _2, "xn--bck1b9a5dre4c": _2, "ファッション": _2, "xn--c1avg": _2, "орг": _2, "xn--c2br7g": _2, "नेट": _2, "xn--cck2b3b": _2, "ストア": _2, "xn--cckwcxetd": _2, "アマゾン": _2, "xn--cg4bki": _2, "삼성": _2, "xn--czr694b": _2, "商标": _2, "xn--czrs0t": _2, "商店": _2, "xn--czru2d": _2, "商城": _2, "xn--d1acj3b": _2, "дети": _2, "xn--eckvdtc9d": _2, "ポイント": _2, "xn--efvy88h": _2, "新闻": _2, "xn--fct429k": _2, "家電": _2, "xn--fhbei": _2, "كوم": _2, "xn--fiq228c5hs": _2, "中文网": _2, "xn--fiq64b": _2, "中信": _2, "xn--fjq720a": _2, "娱乐": _2, "xn--flw351e": _2, "谷歌": _2, "xn--fzys8d69uvgm": _2, "電訊盈科": _2, "xn--g2xx48c": _2, "购物": _2, "xn--gckr3f0f": _2, "クラウド": _2, "xn--gk3at1e": _2, "通販": _2, "xn--hxt814e": _2, "网店": _2, "xn--i1b6b1a6a2e": _2, "संगठन": _2, "xn--imr513n": _2, "餐厅": _2, "xn--io0a7i": _2, "网络": _2, "xn--j1aef": _2, "ком": _2, "xn--jlq480n2rg": _2, "亚马逊": _2, "xn--jlq61u9w7b": _2, "诺基亚": _2, "xn--jvr189m": _2, "食品": _2, "xn--kcrx77d1x4a": _2, "飞利浦": _2, "xn--kput3i": _2, "手机": _2, "xn--mgba3a3ejt": _2, "ارامكو": _2, "xn--mgba7c0bbn0a": _2, "العليان": _2, "xn--mgbaakc7dvf": _2, "اتصالات": _2, "xn--mgbab2bd": _2, "بازار": _2, "xn--mgbca7dzdo": _2, "ابوظبي": _2, "xn--mgbi4ecexp": _2, "كاثوليك": _2, "xn--mgbt3dhd": _2, "همراه": _2, "xn--mk1bu44c": _2, "닷컴": _2, "xn--mxtq1m": _2, "政府": _2, "xn--ngbc5azd": _2, "شبكة": _2, "xn--ngbe9e0a": _2, "بيتك": _2, "xn--ngbrx": _2, "عرب": _2, "xn--nqv7f": _2, "机构": _2, "xn--nqv7fs00ema": _2, "组织机构": _2, "xn--nyqy26a": _2, "健康": _2, "xn--otu796d": _2, "招聘": _2, "xn--p1acf": _2, "рус": _2, "xn--pssy2u": _2, "大拿": _2, "xn--q9jyb4c": _2, "みんな": _2, "xn--qcka1pmc": _2, "グーグル": _2, "xn--rhqv96g": _2, "世界": _2, "xn--rovu88b": _2, "書籍": _2, "xn--ses554g": _2, "网址": _2, "xn--t60b56a": _2, "닷넷": _2, "xn--tckwe": _2, "コム": _2, "xn--tiq49xqyj": _2, "天主教": _2, "xn--unup4y": _2, "游戏": _2, "xn--vermgensberater-ctb": _2, "vermögensberater": _2, "xn--vermgensberatung-pwb": _2, "vermögensberatung": _2, "xn--vhquv": _2, "企业": _2, "xn--vuq861b": _2, "信息": _2, "xn--w4r85el8fhu5dnra": _2, "嘉里大酒店": _2, "xn--w4rs40l": _2, "嘉里": _2, "xn--xhq521b": _2, "广东": _2, "xn--zfr164b": _2, "政务": _2, "xyz": { "$": 1, "succ": { "blogsite": _4, "fhapp": _4, "crafting": _4, "zapto": _4, "telebit": _7 } }, "yachts": _2, "yahoo": _2, "yamaxun": _2, "yandex": _2, "yodobashi": _2, "yoga": _2, "yokohama": _2, "you": _2, "youtube": _2, "yun": _2, "zappos": _2, "zara": _2, "zero": _2, "zip": _2, "zone": { "$": 1, "succ": { "cloud66": _4, "hs": _4, "triton": _7, "lima": _4 } }, "zuerich": _2 } }; - return rules; -})(); - -function lookupInTrie(parts, trie, index, allowedMask) { - let result = null; - let node = trie; - while (node !== undefined) { - if ((node.$ & allowedMask) !== 0) { - result = { - index: index + 1, - isIcann: node.$ === 1 , - isPrivate: node.$ === 2 , - }; + nativeConsole("".concat(name, ": ").concat(message)); + } + function isCookieSetWithValue(cookieString, name, value) { + return cookieString.split(";").some(function (cookieStr) { + var pos = cookieStr.indexOf("="); + if (pos === -1) { + return false; + } + var cookieName = cookieStr.slice(0, pos).trim(); + var cookieValue = cookieStr.slice(pos + 1).trim(); + return name === cookieName && value === cookieValue; + }); + } + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; } - if (index === -1) { - break; + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getTrustedCookieOffsetMs(offsetExpiresSec) { + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + if (Number.isNaN(parsedSec)) { + return null; + } } - const succ = node.succ; - node = succ && (succ[parts[index]] || succ['*']); - index -= 1; - } - return result; -} -function es_suffixLookup(hostname, options, out) { - if (fastPathLookup(hostname, options, out) === true) { - return; - } - const hostnameParts = hostname.split('.'); - const allowedMask = (options.allowPrivateDomains === true ? 2 : 0) | - (options.allowIcannDomains === true ? 1 : 0); - const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1, allowedMask); - if (exceptionMatch !== null) { - out.isIcann = exceptionMatch.isIcann; - out.isPrivate = exceptionMatch.isPrivate; - out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.'); - return; - } - const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1, allowedMask); - if (rulesMatch !== null) { - out.isIcann = rulesMatch.isIcann; - out.isPrivate = rulesMatch.isPrivate; - out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.'); - return; - } - out.isIcann = false; - out.isPrivate = false; - out.publicSuffix = hostnameParts[hostnameParts.length - 1]; -} - -const RESULT = getEmptyResult(); -function parse(url, options = {}) { - return es_parseImpl(url, 5 , es_suffixLookup, options, getEmptyResult()); -} -function getHostname(url, options = {}) { - es_resetResult(RESULT); - return es_parseImpl(url, 0 , es_suffixLookup, options, RESULT).hostname; -} -function getPublicSuffix(url, options = {}) { - es_resetResult(RESULT); - return es_parseImpl(url, 2 , es_suffixLookup, options, RESULT).publicSuffix; -} - -/** - * This is a helper class that is used specifically to work - * with domains restrictions. - * - * There are two options how you can add a domain restriction: - * * `$domain` modifier: https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier - * * domains list for the cosmetic rules - * - * The only difference between them is that in one case we use `|` as a separator, - * and in the other case - `,`. - * - * Examples: - * * `||example.org^$domain=example.com|~sub.example.com` -- network rule - * * `example.com,~sub.example.com##banner` -- cosmetic rule - */ -var DomainModifier = /** @class */ (function () { - /** - * Parses the `domains` string and initializes the object. - * - * @param domainsStr Domains string. - * @param separator Separator — `,` or `|`. - * - * @throws An error if the domains string is empty or invalid - */ - function DomainModifier(domainsStr, separator) { - if (!domainsStr) { - throw new SyntaxError('Modifier $domain cannot be empty'); + return parsedSec * MS_IN_SEC; + } + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); } - var permittedDomains = []; - var restrictedDomains = []; - var parts = domainsStr.toLowerCase().split(separator); - for (var i = 0; i < parts.length; i += 1) { - var domain = parts[i].trim(); - var restricted = false; - if (domain.startsWith('~')) { - restricted = true; - domain = domain.substring(1); - } - if (domain === '') { - throw new SyntaxError("Empty domain specified in \"".concat(domainsStr, "\"")); - } - if (restricted) { - restrictedDomains.push(domain); - } - else { - permittedDomains.push(domain); - } + return parsedValue; + } + function parseCookieString(cookieString) { + var COOKIE_DELIMITER = "="; + var COOKIE_PAIRS_DELIMITER = ";"; + var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); + var cookieData = {}; + cookieChunks.forEach(function (singleCookie) { + var cookieKey; + var cookieValue = ""; + var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); + if (delimiterIndex === -1) { + cookieKey = singleCookie.trim(); + } else { + cookieKey = singleCookie.slice(0, delimiterIndex).trim(); + cookieValue = singleCookie.slice(delimiterIndex + 1); + } + cookieData[cookieKey] = cookieValue || null; + }); + return cookieData; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; } - this.restrictedDomains = restrictedDomains.length > 0 ? restrictedDomains : null; - this.permittedDomains = permittedDomains.length > 0 ? permittedDomains : null; + return ""; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedSetCookieReload.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - /** - * isDomainOrSubdomainOfAny checks if `domain` is the same or a subdomain - * of any of `domains`. - * - * @param domain - domain to check - * @param domains - domains list to check against - */ - DomainModifier.isDomainOrSubdomainOfAny = function (domain, domains) { - for (var i = 0; i < domains.length; i += 1) { - var d = domains[i]; - if (DomainModifier.isWildcardDomain(d)) { - if (DomainModifier.matchAsWildcard(d, domain)) { - return true; - } - } - if (domain === d || (domain.endsWith(d) && domain.endsWith(".".concat(d)))) { - return true; - } + function trustedSetLocalStorageItem(source, args) { + function trustedSetLocalStorageItem(source, key, value) { + if (typeof key === "undefined") { + logMessage(source, "Item key should be specified"); + return; } - return false; - }; - /** - * Checks if domain ends with wildcard - * - * @param domain - */ - DomainModifier.isWildcardDomain = function (domain) { - return domain.endsWith('.*'); - }; - /** - * Checks if wildcard matches domain - * - * @param wildcard - * @param domainNameToCheck - */ - DomainModifier.matchAsWildcard = function (wildcard, domainNameToCheck) { - var wildcardedDomainToCheck = DomainModifier.genTldWildcard(domainNameToCheck); - if (wildcardedDomainToCheck) { - return wildcardedDomainToCheck === wildcard - || (wildcardedDomainToCheck.endsWith(wildcard) && wildcardedDomainToCheck.endsWith(".".concat(wildcard))); + if (typeof value === "undefined") { + logMessage(source, "Item value should be specified"); + return; } - return false; - }; - /** - * Generates from domain tld wildcard e.g. google.com -> google.* ; youtube.co.uk -> youtube.* - * - * @param {string} domainName - * @returns {string} string is empty if tld for provided domain name doesn't exists - */ - DomainModifier.genTldWildcard = function (domainName) { - var tld = getPublicSuffix(domainName); - if (tld) { - return "".concat(domainName.slice(0, domainName.indexOf(".".concat(tld))), ".*"); + var parsedValue = parseKeywordValue(value); + var _window = window, + localStorage = _window.localStorage; + setStorageItem(source, localStorage, key, parsedValue); + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; } - return ''; - }; - return DomainModifier; -}()); -/** - * Comma separator - */ -var COMMA_SEPARATOR = ','; -/** - * Pipe separator - */ -var PIPE_SEPARATOR = '|'; - -var _a, _b; -var isSpecialModifierToken = function (token) { return token.type === "specialModifier" /* TokenType.SpecialModifier */; }; -/** - * Array of special modifiers allow to check for modifier name more efficient - * by avoiding Object.values(SpecialModifier) calls in custom type-guard while - * allowing the usage of 'const enum' for SpecialModifier - */ -var SpecialModifiers = ["replace" /* SpecialModifier.Replace */, "removeparam" /* SpecialModifier.Removeparam */]; -var modifiersPatterns = (_a = {}, - _a["replace" /* SpecialModifier.Replace */] = ["regexp" /* Phase.Regexp */, "replacement" /* Phase.Replacement */, "flags" /* Phase.Flags */], - _a["removeparam" /* SpecialModifier.Removeparam */] = ["regexp" /* Phase.Regexp */, "flags" /* Phase.Flags */], - _a); -/** - * Extracts modifier's plain value - */ -var parsePlainValue = function (string, startIndex) { - var modifierValue = ''; - var modifierEndIndex = -1; - var chars = []; - for (var i = startIndex; i < string.length; i += 1) { - var c = string[i]; - var isLastChar = i === (string.length - 1); - var isUnescapedChar = i > 0 && !(string[i - 1] === "\\" /* SpecialCharacter.OptionEscape */); - if ((c === "," /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) { - if (isLastChar) { - chars.push(c); - } - modifierValue = chars.join(''); - modifierEndIndex = i; - break; + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - else { - chars.push(c); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function setStorageItem(source, storage, key, value) { + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); + } + } + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); } + return parsedValue; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedSetLocalStorageItem.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - return { - modifierValue: modifierValue, - modifierEndIndex: modifierEndIndex, - }; -}; -/** - * Extract modifier's regexp(-like) value - * - * @throws on invalid special modifier value - */ -var parseRegexpValue = function (string, startIndex, pattern) { - var currentPhase; - var nextPhase = (function () { - var i = 0; - return function () { - if (i < pattern.length) { - currentPhase = pattern[i]; - i += 1; - return; + function xmlPrune(source, args) { + function xmlPrune(source, propsToRemove) { + var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + return; + } + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var isXML = function isXML(text) { + if (typeof text === "string") { + var trimmedText = text.trim(); + if (trimmedText.startsWith("<") && trimmedText.endsWith(">")) { + return true; } - // Undefined phase indicates that there were more Regexp delimiters - // than pattern implies and that makes modifier value invalid - throw new Error('Invalid pattern for regexp modifier value.'); + } + return false; }; - })(); - var modifierValue = ''; - var modifierEndIndex = -1; - var chars = []; - for (var i = startIndex; i < string.length; i += 1) { - var c = string[i]; - var isLastChar = i === (string.length - 1); - var isUnescapedChar = i > 0 && !(string[i - 1] === "\\" /* SpecialCharacter.OptionEscape */); - if (c === "/" /* SpecialCharacter.RegexpDelimiter */ && isUnescapedChar) { - // Step into the next pattern phase - // currentPhase = phaseGenerator.next().value; - nextPhase(); - } - if ((c === "," /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) { - // Skip unescaped commas that are part of regexp - if (currentPhase === "regexp" /* Phase.Regexp */) { - chars.push(c); - continue; + var createXMLDocument = function createXMLDocument(text) { + var xmlParser = new DOMParser(); + var xmlDocument = xmlParser.parseFromString(text, "text/xml"); + return xmlDocument; + }; + var isPruningNeeded = function isPruningNeeded(response, propsToRemove) { + if (!isXML(response)) { + return false; + } + var docXML = createXMLDocument(response); + return !!docXML.querySelector(propsToRemove); + }; + var pruneXML = function pruneXML(text) { + if (!isXML(text)) { + shouldPruneResponse = false; + return text; + } + var xmlDoc = createXMLDocument(text); + var errorNode = xmlDoc.querySelector("parsererror"); + if (errorNode) { + return text; + } + if (optionalProp !== "" && xmlDoc.querySelector(optionalProp) === null) { + shouldPruneResponse = false; + return text; + } + var elems = xmlDoc.querySelectorAll(propsToRemove); + if (!elems.length) { + shouldPruneResponse = false; + return text; + } + elems.forEach(function (elem) { + elem.remove(); + }); + var serializer = new XMLSerializer(); + text = serializer.serializeToString(xmlDoc); + return text; + }; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; + } + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ["", "text"]; + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { + return Reflect.apply(target, thisArg, args); + } + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; } - if (isLastChar) { - chars.push(c); + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + if (typeof content !== "string") { + return; } - // Unescaped delimiter and/or last character indicates - // the end of the modifier value, if current phase is the last one - if (currentPhase === pattern[pattern.length - 1]) { - modifierValue = chars.join(''); - modifierEndIndex = i; - break; + if (!propsToRemove) { + if (isXML(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); + logMessage(source, createXMLDocument(response), true, false); + } + } else { + shouldPruneResponse = isPruningNeeded(response, propsToRemove); } - else { - throw new Error('Unexpected options delimiter or end of options string.'); + var responseContent = shouldPruneResponse ? pruneXML(response) : response; + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false + } + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + if (typeof fetchURL !== "string" || fetchURL.length === 0) { + return Reflect.apply(target, thisArg, args); + } + if (urlMatchRegexp.test(fetchURL)) { + var response = await nativeFetch(...args); + var clonedResponse = response.clone(); + var responseText = await response.text(); + shouldPruneResponse = isPruningNeeded(responseText, propsToRemove); + if (!shouldPruneResponse) { + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + logMessage(source, message); + logMessage(source, createXMLDocument(responseText), true, false); + return clonedResponse; } + var prunedText = pruneXML(responseText); + if (shouldPruneResponse) { + hit(source); + return new Response(prunedText, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }); + } + return clonedResponse; + } + return Reflect.apply(target, thisArg, args); + }; + var fetchHandler = { + apply: fetchWrapper + }; + window.fetch = new Proxy(window.fetch, fetchHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; } - else if (currentPhase === "regexp" /* Phase.Regexp */ - && (c === "," /* SpecialCharacter.OptionDelimiter */) - && !isUnescapedChar) { - /** - * Unescape ',' and '$' for regexp parts of pattern, - * as escapes are forced by modifiers syntax, - * e.g https://adguard.com/kb/ru/general/ad-filtering/create-own-filters/#replace-modifier - */ - chars.splice(chars.length - 1, 1); - chars.push(c); + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - else { - chars.push(c); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; } - } - return { - modifierValue: modifierValue, - modifierEndIndex: modifierEndIndex, - }; -}; -var modifierValueParsers = (_b = {}, - _b["regexp" /* ModifierValueType.Regexp */] = parseRegexpValue, - _b["plain" /* ModifierValueType.Plain */] = parsePlainValue, - _b); -/** - * Processes raw tokens by splitting token values by delimiter - * - * @param preprocessedTokens array of preprocessed tokens (of TokenType.SpecialModifier | TokenType.Raw type) - * @param delimiter - delimiter - * @param escapeCharacter - escape character - * @param unescape if true, remove escape characters from string - * @returns array of processed tokens - */ -var tokenize = function (preprocessedTokens, delimiter, escapeCharacter, unescape) { - // Split raw tokens - var nestedProcessedTokens = preprocessedTokens - .map(function (token) { - // Modifier tokens are already concrete tokens and are being passed down the pipeline here - if (isSpecialModifierToken(token)) { - return token; + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } - var tokenValue = token.value; - var tokens = []; - var chars = []; - var makeToken = function (type) { - tokens.push({ - type: type, - value: chars.join(''), - }); - chars = []; + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } }; - for (var i = 0; i < tokenValue.length; i += 1) { - var c = tokenValue[i]; - if (c === delimiter) { - var isEscaped = i > 0 && tokenValue[i - 1] === escapeCharacter; - if (isEscaped) { - if (unescape) { - chars.splice(chars.length - 1, 1); - } - chars.push(c); - } - else { - // Don't make token with '' value - // when raw token starts with a delimiter - if (chars.length !== 0) { - makeToken("string" /* TokenType.String */); - } - chars.push(c); - makeToken("delim" /* TokenType.Delimiter */); - } - } - else { - chars.push(c); - // Last character case - if (i === (tokenValue.length - 1)) { - makeToken("string" /* TokenType.String */); - } - } + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - return tokens; - }); - // Flatten the result - var processedTokens = []; - for (var i = 0; i < nestedProcessedTokens.length; i += 1) { - var currentVal = nestedProcessedTokens[i]; - if (Array.isArray(currentVal)) { - processedTokens.push.apply(processedTokens, currentVal); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; } - else { - processedTokens.push(currentVal); + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); } - } - return processedTokens; -}; -/** - * Converts arrays of tokens into array of their values - * - * @param tokens array of arbitrary tokens - * @returns array of tokens' values - */ -var makeWords = function (tokens) { - var words = []; - for (var i = 0; i < tokens.length; i += 1) { - var token = tokens[i]; - if (token.type !== "delim" /* TokenType.Delimiter */) { - words.push(token.value); + return isMatched; + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + xmlPrune.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - return words; -}; -/** - * Parses special modifier value - * - * @param modifierName name of modifier to be parsed - * @param string options string - * @returns object with Modifier token value and next index to keep iterating from - */ -function parseSpecialModifier(modifierName, string) { - var tokenValue = "".concat(modifierName).concat("=" /* SpecialCharacter.ModifierValueMarker */); - var modifierValueStartIndex = string.indexOf(tokenValue) + tokenValue.length; - // Define modifier value type - var valueType = string[modifierValueStartIndex] === "/" /* SpecialCharacter.RegexpDelimiter */ - ? "regexp" /* ModifierValueType.Regexp */ - : "plain" /* ModifierValueType.Plain */; - // Pick parser for specific type of modifier value - var parser = modifierValueParsers[valueType]; - // Get pattern of current modifier - var pattern = modifiersPatterns[modifierName]; - var _a = parser(string, modifierValueStartIndex, pattern), modifierValue = _a.modifierValue, modifierEndIndex = _a.modifierEndIndex; - if (modifierEndIndex === -1) { - throw new Error("Invalid $".concat(modifierName, " modifier value.")); - } - tokenValue += modifierValue; - var nextIndex = modifierEndIndex; - return { - tokenValue: tokenValue, - nextIndex: nextIndex, + var scriptletsMap = { + "abort-current-inline-script": abortCurrentInlineScript, + "abort-current-script.js": abortCurrentInlineScript, + "ubo-abort-current-script.js": abortCurrentInlineScript, + "acs.js": abortCurrentInlineScript, + "ubo-acs.js": abortCurrentInlineScript, + "ubo-abort-current-script": abortCurrentInlineScript, + "ubo-acs": abortCurrentInlineScript, + "abort-current-inline-script.js": abortCurrentInlineScript, + "ubo-abort-current-inline-script.js": abortCurrentInlineScript, + "acis.js": abortCurrentInlineScript, + "ubo-acis.js": abortCurrentInlineScript, + "ubo-abort-current-inline-script": abortCurrentInlineScript, + "ubo-acis": abortCurrentInlineScript, + "abp-abort-current-inline-script": abortCurrentInlineScript, + "abort-on-property-read": abortOnPropertyRead, + "abort-on-property-read.js": abortOnPropertyRead, + "ubo-abort-on-property-read.js": abortOnPropertyRead, + "aopr.js": abortOnPropertyRead, + "ubo-aopr.js": abortOnPropertyRead, + "ubo-abort-on-property-read": abortOnPropertyRead, + "ubo-aopr": abortOnPropertyRead, + "abp-abort-on-property-read": abortOnPropertyRead, + "abort-on-property-write": abortOnPropertyWrite, + "abort-on-property-write.js": abortOnPropertyWrite, + "ubo-abort-on-property-write.js": abortOnPropertyWrite, + "aopw.js": abortOnPropertyWrite, + "ubo-aopw.js": abortOnPropertyWrite, + "ubo-abort-on-property-write": abortOnPropertyWrite, + "ubo-aopw": abortOnPropertyWrite, + "abp-abort-on-property-write": abortOnPropertyWrite, + "abort-on-stack-trace": abortOnStackTrace, + "abort-on-stack-trace.js": abortOnStackTrace, + "ubo-abort-on-stack-trace.js": abortOnStackTrace, + "aost.js": abortOnStackTrace, + "ubo-aost.js": abortOnStackTrace, + "ubo-abort-on-stack-trace": abortOnStackTrace, + "ubo-aost": abortOnStackTrace, + "abp-abort-on-stack-trace": abortOnStackTrace, + "adjust-setInterval": adjustSetInterval, + "nano-setInterval-booster.js": adjustSetInterval, + "ubo-nano-setInterval-booster.js": adjustSetInterval, + "nano-sib.js": adjustSetInterval, + "ubo-nano-sib.js": adjustSetInterval, + "ubo-nano-setInterval-booster": adjustSetInterval, + "ubo-nano-sib": adjustSetInterval, + "adjust-setTimeout": adjustSetTimeout, + "nano-setTimeout-booster.js": adjustSetTimeout, + "ubo-nano-setTimeout-booster.js": adjustSetTimeout, + "nano-stb.js": adjustSetTimeout, + "ubo-nano-stb.js": adjustSetTimeout, + "ubo-nano-setTimeout-booster": adjustSetTimeout, + "ubo-nano-stb": adjustSetTimeout, + "debug-current-inline-script": debugCurrentInlineScript, + "debug-on-property-read": debugOnPropertyRead, + "debug-on-property-write": debugOnPropertyWrite, + "dir-string": dirString, + "disable-newtab-links": disableNewtabLinks, + "disable-newtab-links.js": disableNewtabLinks, + "ubo-disable-newtab-links.js": disableNewtabLinks, + "ubo-disable-newtab-links": disableNewtabLinks, + "evaldata-prune": evalDataPrune, + "evaldata-prune.js": evalDataPrune, + "ubo-evaldata-prune.js": evalDataPrune, + "ubo-evaldata-prune": evalDataPrune, + "close-window": forceWindowClose, + "window-close-if.js": forceWindowClose, + "ubo-window-close-if.js": forceWindowClose, + "ubo-window-close-if": forceWindowClose, + "hide-in-shadow-dom": hideInShadowDom, + "inject-css-in-shadow-dom": injectCssInShadowDom, + "json-prune": jsonPrune, + "json-prune.js": jsonPrune, + "ubo-json-prune.js": jsonPrune, + "ubo-json-prune": jsonPrune, + "abp-json-prune": jsonPrune, + log: log, + "log-addEventListener": logAddEventListener, + "addEventListener-logger.js": logAddEventListener, + "ubo-addEventListener-logger.js": logAddEventListener, + "aell.js": logAddEventListener, + "ubo-aell.js": logAddEventListener, + "ubo-addEventListener-logger": logAddEventListener, + "ubo-aell": logAddEventListener, + "log-eval": logEval, + "log-on-stack-trace": logOnStacktrace, + "m3u-prune": m3uPrune, + "m3u-prune.js": m3uPrune, + "ubo-m3u-prune.js": m3uPrune, + "ubo-m3u-prune": m3uPrune, + "no-topics": noTopics, + noeval: noeval, + "noeval.js": noeval, + "silent-noeval.js": noeval, + "ubo-noeval.js": noeval, + "ubo-silent-noeval.js": noeval, + "ubo-noeval": noeval, + "ubo-silent-noeval": noeval, + nowebrtc: nowebrtc, + "nowebrtc.js": nowebrtc, + "ubo-nowebrtc.js": nowebrtc, + "ubo-nowebrtc": nowebrtc, + "prevent-addEventListener": preventAddEventListener, + "addEventListener-defuser.js": preventAddEventListener, + "ubo-addEventListener-defuser.js": preventAddEventListener, + "aeld.js": preventAddEventListener, + "ubo-aeld.js": preventAddEventListener, + "ubo-addEventListener-defuser": preventAddEventListener, + "ubo-aeld": preventAddEventListener, + "prevent-adfly": preventAdfly, + "adfly-defuser.js": preventAdfly, + "ubo-adfly-defuser.js": preventAdfly, + "ubo-adfly-defuser": preventAdfly, + "prevent-bab": preventBab, + "prevent-element-src-loading": preventElementSrcLoading, + "prevent-eval-if": preventEvalIf, + "noeval-if.js": preventEvalIf, + "ubo-noeval-if.js": preventEvalIf, + "ubo-noeval-if": preventEvalIf, + "prevent-fab-3.2.0": preventFab, + "nofab.js": preventFab, + "ubo-nofab.js": preventFab, + "fuckadblock.js-3.2.0": preventFab, + "ubo-fuckadblock.js-3.2.0": preventFab, + "ubo-nofab": preventFab, + "prevent-fetch": preventFetch, + "no-fetch-if.js": preventFetch, + "ubo-no-fetch-if.js": preventFetch, + "ubo-no-fetch-if": preventFetch, + "prevent-popads-net": preventPopadsNet, + "popads.net.js": preventPopadsNet, + "ubo-popads.net.js": preventPopadsNet, + "ubo-popads.net": preventPopadsNet, + "prevent-refresh": preventRefresh, + "refresh-defuser.js": preventRefresh, + "refresh-defuser": preventRefresh, + "ubo-refresh-defuser.js": preventRefresh, + "ubo-refresh-defuser": preventRefresh, + "prevent-requestAnimationFrame": preventRequestAnimationFrame, + "no-requestAnimationFrame-if.js": preventRequestAnimationFrame, + "ubo-no-requestAnimationFrame-if.js": preventRequestAnimationFrame, + "norafif.js": preventRequestAnimationFrame, + "ubo-norafif.js": preventRequestAnimationFrame, + "ubo-no-requestAnimationFrame-if": preventRequestAnimationFrame, + "ubo-norafif": preventRequestAnimationFrame, + "prevent-setInterval": preventSetInterval, + "no-setInterval-if.js": preventSetInterval, + "ubo-no-setInterval-if.js": preventSetInterval, + "setInterval-defuser.js": preventSetInterval, + "ubo-setInterval-defuser.js": preventSetInterval, + "nosiif.js": preventSetInterval, + "ubo-nosiif.js": preventSetInterval, + "sid.js": preventSetInterval, + "ubo-sid.js": preventSetInterval, + "ubo-no-setInterval-if": preventSetInterval, + "ubo-setInterval-defuser": preventSetInterval, + "ubo-nosiif": preventSetInterval, + "ubo-sid": preventSetInterval, + "prevent-setTimeout": preventSetTimeout, + "no-setTimeout-if.js": preventSetTimeout, + "ubo-no-setTimeout-if.js": preventSetTimeout, + "nostif.js": preventSetTimeout, + "ubo-nostif.js": preventSetTimeout, + "ubo-no-setTimeout-if": preventSetTimeout, + "ubo-nostif": preventSetTimeout, + "setTimeout-defuser.js": preventSetTimeout, + "ubo-setTimeout-defuser.js": preventSetTimeout, + "ubo-setTimeout-defuser": preventSetTimeout, + "std.js": preventSetTimeout, + "ubo-std.js": preventSetTimeout, + "ubo-std": preventSetTimeout, + "prevent-window-open": preventWindowOpen, + "window.open-defuser.js": preventWindowOpen, + "ubo-window.open-defuser.js": preventWindowOpen, + "ubo-window.open-defuser": preventWindowOpen, + "nowoif.js": preventWindowOpen, + "ubo-nowoif.js": preventWindowOpen, + "ubo-nowoif": preventWindowOpen, + "prevent-xhr": preventXHR, + "no-xhr-if.js": preventXHR, + "ubo-no-xhr-if.js": preventXHR, + "ubo-no-xhr-if": preventXHR, + "remove-attr": removeAttr, + "remove-attr.js": removeAttr, + "ubo-remove-attr.js": removeAttr, + "ra.js": removeAttr, + "ubo-ra.js": removeAttr, + "ubo-remove-attr": removeAttr, + "ubo-ra": removeAttr, + "remove-class": removeClass, + "remove-class.js": removeClass, + "ubo-remove-class.js": removeClass, + "rc.js": removeClass, + "ubo-rc.js": removeClass, + "ubo-remove-class": removeClass, + "ubo-rc": removeClass, + "remove-cookie": removeCookie, + "cookie-remover.js": removeCookie, + "ubo-cookie-remover.js": removeCookie, + "ubo-cookie-remover": removeCookie, + "remove-in-shadow-dom": removeInShadowDom, + "remove-node-text": removeNodeText, + "remove-node-text.js": removeNodeText, + "ubo-remove-node-text.js": removeNodeText, + "rmnt.js": removeNodeText, + "ubo-rmnt.js": removeNodeText, + "ubo-remove-node-text": removeNodeText, + "ubo-rmnt": removeNodeText, + "set-attr": setAttr, + "set-constant": setConstant, + "set-constant.js": setConstant, + "ubo-set-constant.js": setConstant, + "set.js": setConstant, + "ubo-set.js": setConstant, + "ubo-set-constant": setConstant, + "ubo-set": setConstant, + "abp-override-property-read": setConstant, + "set-cookie": setCookie, + "set-cookie-reload": setCookieReload, + "set-local-storage-item": setLocalStorageItem, + "set-popads-dummy": setPopadsDummy, + "popads-dummy.js": setPopadsDummy, + "ubo-popads-dummy.js": setPopadsDummy, + "ubo-popads-dummy": setPopadsDummy, + "set-session-storage-item": setSessionStorageItem, + "trusted-click-element": trustedClickElement, + "trusted-replace-fetch-response": trustedReplaceFetchResponse, + "trusted-replace-node-text": trustedReplaceNodeText, + "trusted-replace-xhr-response": trustedReplaceXhrResponse, + "trusted-set-constant": trustedSetConstant, + "trusted-set-cookie": trustedSetCookie, + "trusted-set-cookie-reload": trustedSetCookieReload, + "trusted-set-local-storage-item": trustedSetLocalStorageItem, + "xml-prune": xmlPrune, + "xml-prune.js": xmlPrune, + "ubo-xml-prune.js": xmlPrune, + "ubo-xml-prune": xmlPrune }; -} -/** - * Converts options string into array of Raw and Modifier tokens - * - * @param string options string - * @returns array of preprocessed tokens - */ -function splitBySpecialModifierTokens(string) { - var tokens = []; - var chars = []; - var makeToken = function (tokenType, tokenValue) { - tokens.push({ - type: tokenType, - value: tokenValue, - }); - chars = []; + var getScriptletFunction = function getScriptletFunction(name) { + return scriptletsMap[name]; }; - for (var i = 0; i < string.length; i += 1) { - var c = string[i]; - var isUnescapedChar = i > 0 && !(string[i - 1] === "\\" /* SpecialCharacter.OptionEscape */); - if (c === "=" /* SpecialCharacter.ModifierValueMarker */ && isUnescapedChar) { - // Parse current chars array to get modifier name - // Assume that modifier name is everything after last ',' and before current '=' - var charsStr = chars.join(''); - var lastCommaIndex = charsStr.lastIndexOf("," /* SpecialCharacter.OptionDelimiter */, i); - // Assertion is used to avoid type-guard for SpecialModifier, making it faster, - // and reduce call stack size - var modifierName = charsStr.substring(lastCommaIndex + 1); - // Check if this is modifier that requires custom parsing logic - if (!SpecialModifiers.includes(modifierName)) { - chars.push(c); - // Last character case - if (i === (string.length - 1)) { - makeToken("raw" /* TokenType.Raw */, charsStr); - } - continue; - } - // Remove modifier name from char stack, - // make token from whats left and empty chars - makeToken("raw" /* TokenType.Raw */, charsStr.substring(0, charsStr.lastIndexOf(modifierName))); - // Extract predefined token value and next iteration index - // Token value includes both name, separator('=') and value of modifier - var _a = parseSpecialModifier(modifierName, string), tokenValue = _a.tokenValue, nextIndex = _a.nextIndex; - makeToken("specialModifier" /* TokenType.SpecialModifier */, tokenValue); - i = nextIndex; - } - else { - chars.push(c); - // Last character case - if (i === (string.length - 1)) { - makeToken("raw" /* TokenType.Raw */, chars.join('')); - } - } - } - return tokens; -} -/** - * Splits options string into array of modifier=value pairs - * - * @param string - string to split - * @param unescape - if true, remove escape characters from string - * @return array of string parts - * @throws on invalid special modifier value - */ -function parseOptionsString(string, unescape) { - if (unescape === void 0) { unescape = true; } - if (!string) { - return []; - } - if (string.startsWith("," /* SpecialCharacter.OptionDelimiter */)) { - // eslint-disable-next-line no-param-reassign - string = string.substring(1); - } - /** - * Extract modifier tokens for modifiers that require custom parsing - * https://github.com/AdguardTeam/tsurlfilter/issues/79 - */ - var preprocessedTokens = splitBySpecialModifierTokens(string); - /** - * Split raw tokens by delimiter - */ - var tokens = tokenize(preprocessedTokens, "," /* SpecialCharacter.OptionDelimiter */, "\\" /* SpecialCharacter.OptionEscape */, unescape); + /** - * Join tokens into words + * @typedef {object} Source Scriptlet properties. + * @property {string} name Scriptlet name. + * @property {Array} args Arguments for scriptlet function. + * @property {'extension'|'corelibs'|'test'} engine Defines the final form of scriptlet string presentation. + * @property {string} [version] Extension version. + * @property {boolean} [verbose] Flag to enable debug information printing to console. + * @property {string} [ruleText] Source rule text, needed for debug purposes. + * @property {string} [domainName] Domain name where scriptlet is applied, needed for debug purposes. */ - return makeWords(tokens); -} -/** - * Replace modifier class - */ -var ReplaceModifier = /** @class */ (function () { /** - * Constructor + * Returns scriptlet code by `source`. * - * @param value + * @param {Source} source Scriptlet properties. + * + * @returns {string|null} Scriptlet code. + * @throws An error on unknown scriptlet name. */ - function ReplaceModifier(value) { - var parsed = ReplaceModifier.parseReplaceOption(value); - this.replaceOption = parsed.optionText; - this.replaceApply = parsed.apply; + function getScriptletCode(source) { + if (!validator.isValidScriptletName(source.name)) { + return null; + } + var scriptletFunction = getScriptletFunction(source.name); + // In case isValidScriptletName check will pass invalid scriptlet name, + // for example when there is a bad alias + if (typeof scriptletFunction !== 'function') { + throw new Error("Error: cannot invoke scriptlet with name: '".concat(source.name, "'")); + } + var scriptletFunctionString = scriptletFunction.toString(); + var result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString); + return result; } + /** + * Scriptlets variable * - * @param option - */ - ReplaceModifier.parseReplaceOption = function (option) { - if (!option) { - return { - apply: function (x) { return x; }, - optionText: '', - }; - } - var parts = splitByDelimiterWithEscapeCharacter(option, '/', '\\', true); - var modifiers = (parts[2] || ''); - if (modifiers.indexOf('g') < 0) { - modifiers += 'g'; - } - var pattern = new RegExp(parts[0], modifiers); - // unescape replacement alias - var replacement = parts[1].replace(/\\\$/g, '$'); - replacement = SimpleRegex.unescapeSpecials(replacement); - var apply = function (input) { return input.replace(pattern, replacement); }; - return { - apply: apply, - optionText: option, - }; - }; - /** - * Replace content + * @returns {object} object with methods: + * `invoke` method receives one argument with `Source` type + * `validate` method receives one argument with `String` type */ - ReplaceModifier.prototype.getValue = function () { - return this.replaceOption; - }; + var scriptletsObject = function () { + return { + invoke: getScriptletCode, + getScriptletFunction, + isValidScriptletName: validator.isValidScriptletName, + isValidScriptletRule, + isAdgScriptletRule: validator.isAdgScriptletRule, + isUboScriptletRule: validator.isUboScriptletRule, + isAbpSnippetRule: validator.isAbpSnippetRule, + convertUboToAdg: convertUboScriptletToAdg, + convertAbpToAdg: convertAbpSnippetToAdg, + convertScriptletToAdg, + convertAdgToUbo: convertAdgScriptletToUbo, + redirects + }; + }(); + /** - * Replace apply function + * Add module exports to be used as node package */ - ReplaceModifier.prototype.getApplyFunc = function () { - return this.replaceApply; - }; - return ReplaceModifier; -}()); + module.exports = scriptletsObject; + +})); /** - * Csp modifier class + * ------------------------------------------- + * | | + * | If you want to add your own scriptlet | + * | please put your code below | + * | | + * ------------------------------------------- */ -var CspModifier = /** @class */ (function () { - /** - * Constructor - * - * @param value - * @param isAllowlist - */ - function CspModifier(value, isAllowlist) { - this.cspDirective = value; - this.isAllowlist = isAllowlist; - this.validateCspDirective(); + + +/***/ }), + +/***/ 5426: +/***/ ((module) => { + +"use strict"; + + +const word = '[a-fA-F\\d:]'; +const b = options => options && options.includeBoundaries ? + `(?:(?<=\\s|^)(?=${word})|(?<=${word})(?=\\s|$))` : + ''; + +const v4 = '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}'; + +const v6seg = '[a-fA-F\\d]{1,4}'; +const v6 = ` +(?: +(?:${v6seg}:){7}(?:${v6seg}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8 +(?:${v6seg}:){6}(?:${v4}|:${v6seg}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4 +(?:${v6seg}:){5}(?::${v4}|(?::${v6seg}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4 +(?:${v6seg}:){4}(?:(?::${v6seg}){0,1}:${v4}|(?::${v6seg}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4 +(?:${v6seg}:){3}(?:(?::${v6seg}){0,2}:${v4}|(?::${v6seg}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4 +(?:${v6seg}:){2}(?:(?::${v6seg}){0,3}:${v4}|(?::${v6seg}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4 +(?:${v6seg}:){1}(?:(?::${v6seg}){0,4}:${v4}|(?::${v6seg}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4 +(?::(?:(?::${v6seg}){0,5}:${v4}|(?::${v6seg}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4 +)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1 +`.replace(/\s*\/\/.*$/gm, '').replace(/\n/g, '').trim(); + +// Pre-compile only the exact regexes because adding a global flag make regexes stateful +const v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`); +const v4exact = new RegExp(`^${v4}$`); +const v6exact = new RegExp(`^${v6}$`); + +const ip = options => options && options.exact ? + v46Exact : + new RegExp(`(?:${b(options)}${v4}${b(options)})|(?:${b(options)}${v6}${b(options)})`, 'g'); + +ip.v4 = options => options && options.exact ? v4exact : new RegExp(`${b(options)}${v4}${b(options)}`, 'g'); +ip.v6 = options => options && options.exact ? v6exact : new RegExp(`${b(options)}${v6}${b(options)}`, 'g'); + +module.exports = ip; + + +/***/ }), + +/***/ 6597: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +const {v4, v6} = __webpack_require__(2065); + +const re4 = v4({exact: true}); +const re6 = v6({exact: true}); + +module.exports = str => re4.test(str) ? 4 : (re6.test(str) ? 6 : 0); +module.exports.v4 = str => re4.test(str); +module.exports.v6 = str => re6.test(str); + + +/***/ }), + +/***/ 2065: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +const ipRegex = __webpack_require__(5426); + +const defaultOpts = {exact: false}; + +const v4str = `${ipRegex.v4().source}\\/(3[0-2]|[12]?[0-9])`; +const v6str = `${ipRegex.v6().source}\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])`; + +// can not precompile the non-exact regexes because global flag makes the regex object stateful +// which would require the user to reset .lastIndex on subsequent calls +const v4exact = new RegExp(`^${v4str}$`); +const v6exact = new RegExp(`^${v6str}$`); +const v46exact = new RegExp(`(?:^${v4str}$)|(?:^${v6str}$)`); + +module.exports = ({exact} = defaultOpts) => exact ? v46exact : new RegExp(`(?:${v4str})|(?:${v6str})`, "g"); +module.exports.v4 = ({exact} = defaultOpts) => exact ? v4exact : new RegExp(v4str, "g"); +module.exports.v6 = ({exact} = defaultOpts) => exact ? v6exact : new RegExp(v6str, "g"); + + +/***/ }), + +/***/ 3133: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +const ipRegex = __webpack_require__(5426); + +const isIp = string => ipRegex({exact: true}).test(string); +isIp.v4 = string => ipRegex.v4({exact: true}).test(string); +isIp.v6 = string => ipRegex.v6({exact: true}).test(string); +isIp.version = string => isIp(string) ? (isIp.v4(string) ? 4 : 6) : undefined; + +module.exports = isIp; + + +/***/ }), + +/***/ 5214: +/***/ ((module) => { + +"use strict"; + + +const defaultAlphabetIndexMap = []; + +function isNumberCode(code) { + return code >= 48/* '0' */ && code <= 57/* '9' */; +} + +function naturalCompare(a, b, opts) { + if (typeof a !== 'string') { + throw new TypeError(`The first argument must be a string. Received type '${typeof a}'`); + } + if (typeof b !== 'string') { + throw new TypeError(`The second argument must be a string. Received type '${typeof b}'`); + } + + const lengthA = a.length; + const lengthB = b.length; + let indexA = 0; + let indexB = 0; + let alphabetIndexMap = defaultAlphabetIndexMap; + let firstDifferenceInLeadingZeros = 0; + + if (opts) { + if (opts.caseInsensitive) { + a = a.toLowerCase(); + b = b.toLowerCase(); } - /** - * Csp directive - */ - CspModifier.prototype.getValue = function () { - return this.cspDirective; - }; - /** - * Validates CSP rule - */ - CspModifier.prototype.validateCspDirective = function () { - /** - * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685 - * CSP directive may be empty in case of allowlist rule, - * it means to disable all $csp rules matching the allowlist rule - */ - if (!this.isAllowlist && !this.cspDirective) { - throw new Error('Invalid $CSP rule: CSP directive must not be empty'); - } - if (this.cspDirective) { - /** - * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685#issue-228287090 - * Forbids report-to and report-uri directives - */ - var cspDirective = this.cspDirective.toLowerCase(); - if (cspDirective.indexOf('report-') >= 0) { - throw new Error("Forbidden CSP directive: ".concat(cspDirective)); - } - } - }; - return CspModifier; -}()); -/** - * Cookie modifier class - * - * Learn more about it here: - * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/961 - */ -var CookieModifier = /** @class */ (function () { - /** - * Constructor - * - * @param value - */ - function CookieModifier(value) { - // Save the source text of the option modifier - this.optionValue = value || ''; - this.regex = null; - this.cookieName = null; - this.sameSite = null; - this.maxAge = null; - // Parse cookie name/regex - var parts = this.optionValue.split(/;/); - if (parts.length < 1) { - throw new Error("Cannot parse ".concat(this.optionValue)); - } - var cookieName = parts[0]; - if (cookieName.startsWith('/') && cookieName.endsWith('/')) { - var pattern = cookieName.substring(1, cookieName.length - 1); - // Save regex to be used further for matching cookies - this.regex = new RegExp(pattern); - } - else { - // Match by cookie name - this.cookieName = cookieName; - } - // Parse other cookie options - if (parts.length > 1) { - for (var i = 1; i < parts.length; i += 1) { - var nameValue = parts[i].split('='); - var optionName = nameValue[0]; - var optionValue = nameValue[1]; - if (optionName === CookieModifier.MAX_AGE) { - this.maxAge = parseInt(optionValue, 10); - } - else if (optionName === CookieModifier.SAME_SITE) { - this.sameSite = optionValue; - } - else { - throw new Error("Unknown $cookie option: ".concat(optionName)); - } - } + if (opts.alphabet) { + alphabetIndexMap = buildAlphabetIndexMap(opts.alphabet); + } + } + + while (indexA < lengthA && indexB < lengthB) { + let charCodeA = a.charCodeAt(indexA); + let charCodeB = b.charCodeAt(indexB); + + if (isNumberCode(charCodeA)) { + if (!isNumberCode(charCodeB)) { + return charCodeA - charCodeB; + } + + let numStartA = indexA; + let numStartB = indexB; + + while (charCodeA === 48/* '0' */ && ++numStartA < lengthA) { + charCodeA = a.charCodeAt(numStartA); + } + while (charCodeB === 48/* '0' */ && ++numStartB < lengthB) { + charCodeB = b.charCodeAt(numStartB); + } + + if (numStartA !== numStartB && firstDifferenceInLeadingZeros === 0) { + firstDifferenceInLeadingZeros = numStartA - numStartB; + } + + let numEndA = numStartA; + let numEndB = numStartB; + + while (numEndA < lengthA && isNumberCode(a.charCodeAt(numEndA))) { + ++numEndA; + } + while (numEndB < lengthB && isNumberCode(b.charCodeAt(numEndB))) { + ++numEndB; + } + + let difference = numEndA - numStartA - numEndB + numStartB; // numA length - numB length + if (difference !== 0) { + return difference; + } + + while (numStartA < numEndA) { + difference = a.charCodeAt(numStartA++) - b.charCodeAt(numStartB++); + if (difference !== 0) { + return difference; } + } + + indexA = numEndA; + indexB = numEndB; + continue; } - /** - * Modifier value - */ - CookieModifier.prototype.getValue = function () { - return this.optionValue; - }; - /** - * First cookie name - */ - CookieModifier.prototype.getCookieName = function () { - return this.cookieName; - }; - /** - * Max age cookie value - */ - CookieModifier.prototype.getMaxAge = function () { - return this.maxAge; - }; - /** - * Same site cookie value - */ - CookieModifier.prototype.getSameSite = function () { - return this.sameSite; - }; - /** - * Checks if cookie with the specified name matches this option - * - * @param {string} name Cookie name - * @return {boolean} true if it does - */ - CookieModifier.prototype.matches = function (name) { - if (!name) { - return false; - } - if (this.regex) { - return this.regex.test(name); - } - if (this.cookieName) { - return this.cookieName === name; - } - // Empty regex and cookieName means that we must match all cookies - return true; - }; - /** - * Checks if cookie rule has an empty $cookie option - * - * @return {boolean} True if $cookie option is empty - */ - CookieModifier.prototype.isEmpty = function () { - return !this.regex && !this.cookieName; - }; - /** - * Cookie name maxAge - */ - CookieModifier.MAX_AGE = 'maxAge'; - /** - * Cookie name sameSite - */ - CookieModifier.SAME_SITE = 'sameSite'; - return CookieModifier; -}()); -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; + if (charCodeA !== charCodeB) { + if ( + charCodeA < alphabetIndexMap.length && + charCodeB < alphabetIndexMap.length && + alphabetIndexMap[charCodeA] !== -1 && + alphabetIndexMap[charCodeB] !== -1 + ) { + return alphabetIndexMap[charCodeA] - alphabetIndexMap[charCodeB]; + } -function getAugmentedNamespace(n) { - var f = n.default; - if (typeof f == "function") { - var a = function () { - return f.apply(this, arguments); - }; - a.prototype = f.prototype; - } else a = {}; - Object.defineProperty(a, '__esModule', {value: true}); - Object.keys(n).forEach(function (k) { - var d = Object.getOwnPropertyDescriptor(n, k); - Object.defineProperty(a, k, d.get ? d : { - enumerable: true, - get: function () { - return n[k]; - } - }); - }); - return a; + return charCodeA - charCodeB; + } + + ++indexA; + ++indexB; + } + + if (indexA < lengthA) { // `b` is a substring of `a` + return 1; + } + + if (indexB < lengthB) { // `a` is a substring of `b` + return -1; + } + + return firstDifferenceInLeadingZeros; +} + +const alphabetIndexMapCache = {}; + +function buildAlphabetIndexMap(alphabet) { + const existingMap = alphabetIndexMapCache[alphabet]; + if (existingMap !== undefined) { + return existingMap; + } + + const indexMap = []; + const maxCharCode = alphabet.split('').reduce((maxCode, char) => { + return Math.max(maxCode, char.charCodeAt(0)); + }, 0); + + for (let i = 0; i <= maxCharCode; i++) { + indexMap.push(-1); + } + + for (let i = 0; i < alphabet.length; i++) { + indexMap[alphabet.charCodeAt(i)] = i; + } + + alphabetIndexMapCache[alphabet] = indexMap; + + return indexMap; } -var scriptlets_umd = {exports: {}}; +module.exports = naturalCompare; + + +/***/ }), + +/***/ 6145: +/***/ ((module, exports, __webpack_require__) => { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__; +/** + * AdGuard Scriptlets + * Version 1.9.62 + */ (function (factory) { - factory(); + true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : + __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : + 0; })((function () { + /** + * Concat dependencies to scriptlet code + * + * @param scriptlet scriptlet or redirect function + * @returns string view of scriptlet with attached dependencies + */ function attachDependencies(scriptlet) { - const _scriptlet$injections = scriptlet.injections, + var _scriptlet$injections = scriptlet.injections, injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections; return injections.reduce(function (accum, dep) { return "".concat(accum, "\n").concat(dep.toString()); }, scriptlet.toString()); } + + /** + * Add scriptlet call to existing code + * + * @param scriptlet scriptlet func + * @param code scriptlet's string representation + * @returns wrapped scriptlet call + */ function addCall(scriptlet, code) { return "".concat(code, "\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n ").concat(scriptlet.name, ".apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }"); } + + /** + * Wrap function into IIFE (Immediately invoked function expression) + * + * @example + * const source = { + * args: ["aaa", "bbb"], + * name: 'noeval', + * }; + * const code = "function noeval(source, args) { alert(source); } noeval.apply(this, args);" + * const result = wrapInIIFE(source, code); + * + * // result + * `(function(source, args) { + * function noeval(source) { alert(source); } + * noeval.apply(this, args); + * )({"args": ["aaa", "bbb"], "name":"noeval"}, ["aaa", "bbb"])` + * @param source - object with scriptlet properties + * @param code - scriptlet source code with dependencies + * @param redirect if function is redirect + * @returns full scriptlet code + */ function passSourceAndProps(source, code) { - let redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (source.hit) { - source.hit = source.hit.toString(); - } - const sourceString = JSON.stringify(source); - const argsString = source.args ? "[".concat(source.args.map(JSON.stringify), "]") : undefined; - const params = argsString ? "".concat(sourceString, ", ").concat(argsString) : sourceString; + var redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var sourceString = JSON.stringify(source); + var argsString = source.args ? "[".concat(source.args.map(function (arg) { + return JSON.stringify(arg); + }), "]") : undefined; + var params = argsString ? "".concat(sourceString, ", ").concat(argsString) : sourceString; if (redirect) { return "(function(source, args){\n".concat(code, "\n})(").concat(params, ");"); } return "(".concat(code, ")(").concat(params, ");"); } + + /** + * Wrap code in no name function + * + * @param code which must be wrapped + * @returns wrapped code + */ function wrapInNonameFunc(code) { return "function(source, args){\n".concat(code, "\n}"); } - const getObjectEntries = function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - }; - const getObjectFromEntries = function getObjectFromEntries(entries) { - const output = entries.reduce(function (acc, el) { - const key = el[0]; - const value = el[1]; - acc[key] = value; - return acc; - }, {}); - return output; - }; - const isEmptyObject = function isEmptyObject(obj) { + + /** + * Checks whether the obj is an empty object + * + * @param obj arbitrary object + * @returns if object is empty + */ + var isEmptyObject = function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; }; - const safeGetDescriptor = function safeGetDescriptor(obj, prop) { - const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + + /** + * Safely retrieve property descriptor + * + * @param obj target object + * @param prop target property + * @returns descriptor or null if it's not available or non-configurable + */ + var safeGetDescriptor = function safeGetDescriptor(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); if (descriptor && descriptor.configurable) { return descriptor; } return null; }; + + /** + * Set getter and setter to property if it's configurable + * + * @param object target object with property + * @param property property name + * @param descriptor contains getter and setter functions + * @returns is operation successful + */ function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } Object.defineProperty(object, property, descriptor); return true; } - const nativeIsNaN = function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + + /** + * Determines whether the passed value is NaN + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN + * + * @param num arbitrary value + * @returns if provided value is NaN + */ + var nativeIsNaN = function nativeIsNaN(num) { + // eslint-disable-next-line no-restricted-properties + var native = Number.isNaN || window.isNaN; return native(num); }; - const nativeIsFinite = function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; + /** + * Determines whether the passed value is a finite number + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite + * + * @param num arbitrary value + * @returns if provided value is finite + */ + var nativeIsFinite = function nativeIsFinite(num) { + // eslint-disable-next-line no-restricted-properties + var native = Number.isFinite || window.isFinite; return native(num); }; - const getNumberFromString = function getNumberFromString(rawString) { - const parsedDelay = parseInt(rawString, 10); - const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + + /** + * Parses string for a number, if possible, otherwise returns null. + * + * @param rawString arbitrary string + * @returns number or null if string not parsable + */ + var getNumberFromString = function getNumberFromString(rawString) { + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; }; + + /** + * Generate a random integer between two values, inclusive + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive + * + * @param min range minimum + * @param max range maximum + * @returns random number + */ function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1) + min); } - const replaceAll = function replaceAll(input, substr, newSubstr) { + + /** + * A literal string or regexp pattern wrapped in forward slashes. + * For example, 'simpleStr' or '/adblock|_0x/'. + */ + + /** + * String.prototype.replaceAll polyfill + * + * @param input input string + * @param substr to look for + * @param newSubstr replacement + * @returns result string + */ + var replaceAll = function replaceAll(input, substr, newSubstr) { return input.split(substr).join(newSubstr); }; - const escapeRegExp = function escapeRegExp(str) { + + /** + * Escapes special chars in string + * + * @param str raw string + * @returns string with escaped special characters + */ + var escapeRegExp = function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; - const toRegExp = function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - const DEFAULT_VALUE = '.?'; - const FORWARD_SLASH = '/'; + + /** + * Converts string to the regexp, + * if string contains valid regexp flags it will be converted to regexp with flags + * TODO think about nested dependencies, but be careful with dependency loops + * + * @param input literal string or regexp pattern; defaults to '' (empty string) + * @returns regular expression; defaults to /.?/ + */ + var toRegExp = function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var DEFAULT_VALUE = '.?'; + var FORWARD_SLASH = '/'; if (input === '') { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + + /** + * Checks whether the string is a valid regexp flag + * + * @param flag string + * @returns True if regexp flag is valid, otherwise false. + */ + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + // eslint-disable-next-line no-new + new RegExp('', flag); + return true; + } catch (ex) { + return false; + } + }; + + /** + * Checks whether the text string contains valid regexp flags, + * and returns `flagsStr` if valid, otherwise empty string. + * + * @param regExpStr string + * @param flagsStr string + * @returns `flagsStr` if it is valid, otherwise empty string. + */ + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) + // Not a correct regex if ends with '\\/' + && !regExpStr.endsWith('\\/') && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ''; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input + // remove quotes' escapes for cases where scriptlet rule argument has own escaped quotes + // e.g #%#//scriptlet('prevent-setTimeout', '.css(\'display\',\'block\');') + .replace(/\\'/g, '\'').replace(/\\"/g, '"') + // escape special characters for following RegExp construction + .replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return new RegExp(escaped); }; - const isValidStrPattern = function isValidStrPattern(input) { - const FORWARD_SLASH = '/'; - let str = escapeRegExp(input); + + /** + * Checks whether the input string can be converted to regexp + * + * @param input literal string or regexp pattern + * @returns if input can be converted to regexp + */ + var isValidStrPattern = function isValidStrPattern(input) { + var FORWARD_SLASH = '/'; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -32617,111 +32308,192 @@ var scriptlets_umd = {exports: {}}; } return isValid; }; - const getBeforeRegExp = function getBeforeRegExp(str, rx) { - const index = str.search(rx); + + /** + * Get string before regexp first match + * + * @param str input string + * @param rx find pattern + * @returns result string + */ + var getBeforeRegExp = function getBeforeRegExp(str, rx) { + var index = str.search(rx); return str.substring(0, index); }; - const startsWith$1 = function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - }; - const endsWith = function endsWith(str, ending) { - return !!str && str.lastIndexOf(ending) === str.length - ending.length; - }; - const substringAfter$1 = function substringAfter(str, separator) { + var substringAfter$1 = function substringAfter(str, separator) { if (!str) { return str; } - const index = str.indexOf(separator); + var index = str.indexOf(separator); return index < 0 ? '' : str.substring(index + separator.length); }; - const substringBefore = function substringBefore(str, separator) { + var substringBefore = function substringBefore(str, separator) { if (!str || !separator) { return str; } - const index = str.indexOf(separator); + var index = str.indexOf(separator); return index < 0 ? str : str.substring(0, index); }; - const wrapInSingleQuotes = function wrapInSingleQuotes(str) { + + /** + * Wrap str in single quotes and replaces single quotes to double one + * + * @param str input string + * @returns string with swapped quotes + */ + var wrapInSingleQuotes = function wrapInSingleQuotes(str) { if (str[0] === '\'' && str[str.length - 1] === '\'' || str[0] === '"' && str[str.length - 1] === '"') { str = str.substring(1, str.length - 1); } + // eslint-disable-next-line no-useless-escape str = str.replace(/\'/g, '"'); return "'".concat(str, "'"); }; - const getStringInBraces = function getStringInBraces(str) { - const firstIndex = str.indexOf('('); - const lastIndex = str.lastIndexOf(')'); + + /** + * Returns substring enclosed in the widest braces + * + * @param str input string + * @returns substring + */ + var getStringInBraces = function getStringInBraces(str) { + var firstIndex = str.indexOf('('); + var lastIndex = str.lastIndexOf(')'); return str.substring(firstIndex + 1, lastIndex); }; - const convertRtcConfigToString = function convertRtcConfigToString(config) { - const UNDEF_STR = 'undefined'; - let str = UNDEF_STR; + + /** + * Prepares RTCPeerConnection config as string for proper logging + * + * @param config RTC config + * @returns stringified config + */ + var convertRtcConfigToString = function convertRtcConfigToString(config) { + var UNDEF_STR = 'undefined'; + var str = UNDEF_STR; if (config === null) { str = 'null'; } else if (config instanceof Object) { - const SERVERS_PROP_NAME = 'iceServers'; - const URLS_PROP_NAME = 'urls'; - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { + var SERVERS_PROP_NAME = 'iceServers'; + var URLS_PROP_NAME = 'urls'; + /* + const exampleConfig = { + 'iceServers': [ + 'urls': ['stun:35.66.206.188:443'], + ], + }; + */ + if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); } } return str; }; - const isValidMatchStr = function isValidMatchStr(match) { - const INVERT_MARKER = '!'; - let str = match; - if (startsWith$1(match, INVERT_MARKER)) { + + /** + * Checks whether the match input string can be converted to regexp, + * used for match inputs with possible negation + * + * @param match literal string or regexp pattern + * @returns true if input can be converted to regexp + */ + var isValidMatchStr = function isValidMatchStr(match) { + var INVERT_MARKER = '!'; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { str = match.slice(1); } return isValidStrPattern(str); }; - const isValidMatchNumber = function isValidMatchNumber(match) { - const INVERT_MARKER = '!'; - let str = match; - if (startsWith$1(match, INVERT_MARKER)) { + + /** + * Validates the match input number, + * used for match inputs with possible negation + * + * @param match string of match number + * @returns if match number is valid + */ + var isValidMatchNumber = function isValidMatchNumber(match) { + var INVERT_MARKER = '!'; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { str = match.slice(1); } - const num = parseFloat(str); + var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); }; - const parseMatchArg = function parseMatchArg(match) { - const INVERT_MARKER = '!'; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); + + /** + * Parses match arg with possible negation for no matching. + * Needed for prevent-setTimeout, prevent-setInterval, + * prevent-requestAnimationFrame and prevent-window-open + * + * @param match matching arg + * @returns data prepared for matching + */ + var parseMatchArg = function parseMatchArg(match) { + var INVERT_MARKER = '!'; + // In case if "match" is "undefined" return "false" + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); return { isInvertedMatch, matchRegexp, matchValue }; }; - const parseDelayArg = function parseDelayArg(delay) { - const INVERT_MARKER = '!'; - const isInvertedDelayMatch = startsWith$1(delay, INVERT_MARKER); - let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; - delayValue = parseInt(delayValue, 10); - const delayMatch = nativeIsNaN(delayValue) ? null : delayValue; + + /** + * Parses delay arg with possible negation for no matching. + * Needed for prevent-setTimeout and prevent-setInterval + * + * @param delay scriptlet's delay arg + * @returns parsed delay data + */ + var parseDelayArg = function parseDelayArg(delay) { + var INVERT_MARKER = '!'; + var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER); + var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; + var parsedDelay = parseInt(delayValue, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay; return { isInvertedDelayMatch, delayMatch }; }; - const objectToString = function objectToString(obj) { + + /** + * Converts object to string for logging + * + * @param obj data object + * @returns object's string representation + */ + var objectToString = function objectToString(obj) { + // In case if the type of passed obj is different than Object + // https://github.com/AdguardTeam/Scriptlets/issues/282 if (!obj || typeof obj !== 'object') { return String(obj); } - return isEmptyObject(obj) ? '{}' : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; + return isEmptyObject(obj) ? '{}' : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } return "".concat(key, ":\"").concat(recordValueStr, "\""); }).join(' '); }; - const convertTypeToString = function convertTypeToString(value) { - let output; + + /** + * Converts types into a string + * + * @param value input value type + * @returns type's string representation + */ + var convertTypeToString = function convertTypeToString(value) { + var output; if (typeof value === 'undefined') { output = 'undefined'; } else if (typeof value === 'object') { @@ -32735,44 +32507,72 @@ var scriptlets_umd = {exports: {}}; } return output; }; + + /** + * Generate a random string, a length of the string is provided as an argument + * + * @param length output's length + * @returns random string + */ function getRandomStrByLength(length) { - let result = ''; - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~'; - const charactersLength = characters.length; - for (let i = 0; i < length; i += 1) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~'; + var charactersLength = characters.length; + for (var i = 0; i < length; i += 1) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } + + /** + * Generate a random string + * + * @param customResponseText response text to include in output + * @returns random string or null if passed argument is invalid + */ function generateRandomResponse(customResponseText) { - let customResponse = customResponseText; + var customResponse = customResponseText; if (customResponse === 'true') { + // Generate random alphanumeric string of 10 symbols customResponse = Math.random().toString(36).slice(-10); return customResponse; } customResponse = customResponse.replace('length:', ''); - const rangeRegex = /^\d+-\d+$/; + var rangeRegex = /^\d+-\d+$/; + // Return empty string if range is invalid if (!rangeRegex.test(customResponse)) { return null; } - let rangeMin = getNumberFromString(customResponse.split('-')[0]); - let rangeMax = getNumberFromString(customResponse.split('-')[1]); + var rangeMin = getNumberFromString(customResponse.split('-')[0]); + var rangeMax = getNumberFromString(customResponse.split('-')[1]); if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { return null; } + + // If rangeMin > rangeMax, swap variables if (rangeMin > rangeMax) { - const temp = rangeMin; + var temp = rangeMin; rangeMin = rangeMax; rangeMax = temp; } - const LENGTH_RANGE_LIMIT = 500 * 1000; + var LENGTH_RANGE_LIMIT = 500 * 1000; if (rangeMax > LENGTH_RANGE_LIMIT) { return null; } - const length = getRandomIntInclusive(rangeMin, rangeMax); + var length = getRandomIntInclusive(rangeMin, rangeMax); customResponse = getRandomStrByLength(length); return customResponse; } + + /** + * Infers value from string argument + * Inferring goes from more specific to more ambiguous options + * Arrays, objects and strings are parsed via JSON.parse + * + * @param value arbitrary string + * @returns converted value + * @throws an error on unexpected input + */ function inferValue(value) { if (value === 'undefined') { return undefined; @@ -32789,17 +32589,23 @@ var scriptlets_umd = {exports: {}}; if (value === 'NaN') { return NaN; } - const MAX_ALLOWED_NUM = 32767; - const numVal = Number(value); + + // Number class constructor works 2 times faster than JSON.parse + // and wont interpret mixed inputs like '123asd' as parseFloat would + var MAX_ALLOWED_NUM = 32767; + var numVal = Number(value); if (!nativeIsNaN(numVal)) { if (Math.abs(numVal) > MAX_ALLOWED_NUM) { throw new Error('number values bigger than 32767 are not allowed'); } return numVal; } - let errorMessage = "'".concat(value, "' value type can't be inferred"); + var errorMessage = "'".concat(value, "' value type can't be inferred"); try { - const parsableVal = JSON.parse(value); + // Parse strings, arrays and objects represented as JSON strings + // '[1,2,3,"string"]' > [1, 2, 3, 'string'] + // '"arbitrary string"' > 'arbitrary string' + var parsableVal = JSON.parse(value); if (parsableVal instanceof Object || typeof parsableVal === 'string') { return parsableVal; } @@ -32808,26 +32614,50 @@ var scriptlets_umd = {exports: {}}; } throw new TypeError(errorMessage); } + + /** + * Transition names + */ + + /** + * Iterate over iterable argument and evaluate current state with transitions + * + * @param iterable rule or list or rules + * @param transitions helper object with transition functions + * @param init first transition name + * @param args arguments which should be passed to transition functions + * @returns state + */ function iterateWithTransitions(iterable, transitions, init, args) { - let state = init || Object.keys(transitions)[0]; - for (let i = 0; i < iterable.length; i += 1) { + var state = init || Object.keys(transitions)[0]; + for (var i = 0; i < iterable.length; i += 1) { state = transitions[state](iterable, i, args); } return state; } - const ADG_SCRIPTLET_MASK = '#//scriptlet'; - const wordSaver = function wordSaver() { - let str = ''; - const strings = []; - const saveSymb = function saveSymb(s) { + + /** + * AdGuard scriptlet rule mask + */ + var ADG_SCRIPTLET_MASK = '#//scriptlet'; + + /** + * Helper to accumulate an array of strings char by char + * + * @returns object with helper methods + */ + var wordSaver = function wordSaver() { + var str = ''; + var strings = []; + var saveSymb = function saveSymb(s) { str += s; return str; }; - const saveStr = function saveStr() { + var saveStr = function saveStr() { strings.push(str); str = ''; }; - const getAll = function getAll() { + var getAll = function getAll() { return [...strings]; }; return { @@ -32836,42 +32666,56 @@ var scriptlets_umd = {exports: {}}; getAll }; }; - const substringAfter = function substringAfter(str, separator) { + var substringAfter = function substringAfter(str, separator) { if (!str) { return str; } - const index = str.indexOf(separator); + var index = str.indexOf(separator); return index < 0 ? '' : str.substring(index + separator.length); }; - const parseRule = function parseRule(ruleText) { + + /** + * Parses scriptlet rule and validates its syntax. + * + * @param ruleText Rule string + * + * @returns Parsed rule data. + * @throws An error on invalid rule syntax. + */ + var parseRule = function parseRule(ruleText) { ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK); - const TRANSITION = { - OPENED: 'opened', - PARAM: 'param', - CLOSED: 'closed' - }; - const opened = function opened(rule, index, _ref) { - let sep = _ref.sep; - const char = rule[index]; - let transition; + /** + * Transition function: the current index position in start, end or between params + * + * @param rule rule string + * @param index index + * @param Object helper object that contains prop symb with current separator char + * @param Object.sep contains prop `symb` with current separator char + * @throws throws if given rule is not a scriptlet + * @returns transition + */ + var opened = function opened(rule, index, _ref) { + var sep = _ref.sep; + var char = rule[index]; + var transition; switch (char) { case ' ': case '(': case ',': { - transition = TRANSITION.OPENED; + transition = "opened"; break; } case '\'': case '"': { sep.symb = char; - transition = TRANSITION.PARAM; + transition = "param"; break; } case ')': { - transition = index === rule.length - 1 ? TRANSITION.CLOSED : TRANSITION.OPENED; + transition = index === rule.length - 1 ? "closed" : "opened"; break; } default: @@ -32881,80 +32725,141 @@ var scriptlets_umd = {exports: {}}; } return transition; }; - const param = function param(rule, index, _ref2) { - let saver = _ref2.saver, + + /** + * Transition function: the current index position inside param + * + * @param rule rule string + * @param index index + * @param Object helper object + * @param Object.sep contains prop `symb` with current separator char + * @param Object.saver helper which allow to save strings by car by cha + * @returns transition + */ + var param = function param(rule, index, _ref2) { + var saver = _ref2.saver, sep = _ref2.sep; - const char = rule[index]; + var char = rule[index]; switch (char) { case '\'': case '"': { - const preIndex = index - 1; - const before = rule[preIndex]; + var preIndex = index - 1; + var before = rule[preIndex]; if (char === sep.symb && before !== '\\') { sep.symb = null; saver.saveStr(); - return TRANSITION.OPENED; + return "opened"; } } + // eslint-disable-next-line no-fallthrough default: { saver.saveSymb(char); - return TRANSITION.PARAM; + return "param"; } } }; - const transitions = { - [TRANSITION.OPENED]: opened, - [TRANSITION.PARAM]: param, - [TRANSITION.CLOSED]: function () {} + var transitions = { + ["opened"]: opened, + ["param"]: param, + ["closed"]: function () {} }; - const sep = { + var sep = { symb: null }; - const saver = wordSaver(); - const state = iterateWithTransitions(ruleText, transitions, TRANSITION.OPENED, { + var saver = wordSaver(); + var state = iterateWithTransitions(ruleText, transitions, "opened", { sep, saver }); - if (state !== 'closed') { + if (state !== "closed") { throw new Error("Invalid scriptlet rule ".concat(ruleText)); } - const args = saver.getAll(); + var args = saver.getAll(); return { name: args[0], args: args.slice(1) }; }; - const validateType = function validateType(type) { + + /** + * Validates event type + * + * @param type event type + * @returns true if type is valid + */ + var validateType = function validateType(type) { + // https://github.com/AdguardTeam/Scriptlets/issues/125 return typeof type !== 'undefined'; }; - const validateListener = function validateListener(listener) { + + /** + * Validates event listener + * + * @param listener event listener + * @returns true if listener callback is valid + */ + var validateListener = function validateListener(listener) { + // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object' - && listener !== null && typeof listener.handleEvent === 'function'); + // https://github.com/AdguardTeam/Scriptlets/issues/76 + && listener !== null && 'handleEvent' in listener && typeof listener.handleEvent === 'function'); }; - const listenerToString = function listenerToString(listener) { + + /** + * Serialize valid event listener + * https://developer.mozilla.org/en-US/docs/Web/API/EventListener + * + * @param listener valid listener + * @returns listener string + */ + var listenerToString = function listenerToString(listener) { return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString(); }; - const shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) { + + var shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) { return delay === '*'; }; - const getMatchDelay = function getMatchDelay(delay) { - const DEFAULT_DELAY = 1000; - const parsedDelay = parseInt(delay, 10); - const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY + + /** + * Handles input delay value + * + * @param delay matchDelay argument of adjust-* scriptlets + * @returns proper number delay value + */ + var getMatchDelay = function getMatchDelay(delay) { + var DEFAULT_DELAY = 1000; + var parsedDelay = parseInt(delay, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY // default scriptlet value : parsedDelay; return delayMatch; }; - const isDelayMatched = function isDelayMatched(inputDelay, realDelay) { + + /** + * Checks delay match condition + * + * @param inputDelay matchDelay argument of adjust-* scriptlets + * @param realDelay delay argument of setTimeout/setInterval + * @returns if given delays match + */ + var isDelayMatched = function isDelayMatched(inputDelay, realDelay) { return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); }; - const getBoostMultiplier = function getBoostMultiplier(boost) { - const DEFAULT_MULTIPLIER = 0.05; - const MIN_MULTIPLIER = 0.001; - const MAX_MULTIPLIER = 50; - const parsedBoost = parseFloat(boost); - let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER + + /** + * Handles input boost value + * + * @param boost boost argument of adjust-* scriptlets + * @returns proper number boost multiplier value + */ + var getBoostMultiplier = function getBoostMultiplier(boost) { + var DEFAULT_MULTIPLIER = 0.05; + // https://github.com/AdguardTeam/Scriptlets/issues/262 + var MIN_MULTIPLIER = 0.001; + var MAX_MULTIPLIER = 50; + var parsedBoost = parseFloat(boost); + var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value : parsedBoost; if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; @@ -32964,15 +32869,26 @@ var scriptlets_umd = {exports: {}}; } return boostMultiplier; }; - const flatten = function flatten(input) { - const stack = []; + + /** + * Some browsers do not support Array.prototype.flat() + * for example, Opera 42 which is used for browserstack tests + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat + * + * @param input arbitrary array + * @returns flattened array + */ + var flatten = function flatten(input) { + var stack = []; input.forEach(function (el) { return stack.push(el); }); - const res = []; + var res = []; while (stack.length) { - const next = stack.pop(); + // pop value from stack + var next = stack.pop(); if (Array.isArray(next)) { + // push back array items, won't modify the original input next.forEach(function (el) { return stack.push(el); }); @@ -32980,48 +32896,95 @@ var scriptlets_umd = {exports: {}}; res.push(next); } } + // reverse to restore input order return res.reverse(); }; - const isExisting = function isExisting(item) { + + /** + * Predicate method to check if the array item exists + * + * @param item arbitrary + * @returns if item is truthy or not + */ + var isExisting = function isExisting(item) { return !!item; }; - const isValidCookiePath = function isValidCookiePath(rawPath) { + + /** + * Converts NodeList to array + * + * @param {NodeList} nodeList arbitrary NodeList + * @returns {Node[Array]} array of nodes + */ + var nodeListToArray = function nodeListToArray(nodeList) { + var nodes = []; + for (var i = 0; i < nodeList.length; i += 1) { + nodes.push(nodeList[i]); + } + return nodes; + }; + + /** + * Checks whether the input path is supported + * + * @param rawPath input path + * @returns if cookie path is valid + */ + var isValidCookiePath = function isValidCookiePath(rawPath) { return rawPath === '/' || rawPath === 'none'; }; - const getCookiePath = function getCookiePath(rawPath) { + + /** + * Returns 'path=/' if rawPath is '/' + * or empty string '' for other cases, `rawPath === 'none'` included + * + * @param rawPath path argument of *set-cookie-* scriptlets + * @returns cookie path + */ + var getCookiePath = function getCookiePath(rawPath) { if (rawPath === '/') { return 'path=/'; } + // otherwise do not set path as invalid + // the same for pathArg === 'none' return ''; }; - const concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + + /** + * Combines input cookie name, value, and path into string. + * + * @param rawName name argument of *set-cookie-* scriptlets + * @param rawValue value argument of *set-cookie-* scriptlets + * @param rawPath path argument of *set-cookie-* scriptlets + * @param shouldEncode if cookie's name and value should be encoded + * @returns string OR `null` if name or value is invalid + */ + var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ';'; + // semicolon will cause the cookie to break + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); }; - const getLimitedCookieValue = function getLimitedCookieValue(value) { + + /** + * Gets supported cookie value + * + * @param value input cookie value + * @returns valid cookie string if ok OR null if not + */ + var getLimitedCookieValue = function getLimitedCookieValue(value) { if (!value) { return null; } - let validValue; - if (value === 'true') { - validValue = 'true'; - } else if (value === 'True') { - validValue = 'True'; - } else if (value === 'false') { - validValue = 'false'; - } else if (value === 'False') { - validValue = 'False'; - } else if (value === 'yes') { - validValue = 'yes'; - } else if (value === 'Yes') { - validValue = 'Yes'; - } else if (value === 'Y') { - validValue = 'Y'; - } else if (value === 'no') { - validValue = 'no'; - } else if (value === 'ok') { - validValue = 'ok'; - } else if (value === 'OK') { - validValue = 'OK'; + var allowedCookieValues = new Set(['true', 'false', 'yes', 'y', 'no', 'n', 'ok', 'accept', 'reject', 'allow', 'deny']); + var validValue; + if (allowedCookieValues.has(value.toLowerCase())) { + validValue = value; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); if (nativeIsNaN(validValue)) { @@ -33035,97 +32998,207 @@ var scriptlets_umd = {exports: {}}; } return validValue; }; - const parseCookieString = function parseCookieString(cookieString) { - const COOKIE_DELIMITER = '='; - const COOKIE_PAIRS_DELIMITER = ';'; - const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); - const cookieData = {}; + + /** + * Object to represent document.cookie-like string + */ + + /** + * Parses cookie string into object + * + * @param cookieString string that conforms to document.cookie format + * @returns key:value object that corresponds with incoming cookies keys and values + */ + var parseCookieString = function parseCookieString(cookieString) { + var COOKIE_DELIMITER = '='; + var COOKIE_PAIRS_DELIMITER = ';'; + + // Get raw cookies + var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); + var cookieData = {}; cookieChunks.forEach(function (singleCookie) { - let cookieKey; - let cookieValue; - const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); + var cookieKey; + var cookieValue = ''; + var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); if (delimiterIndex === -1) { cookieKey = singleCookie.trim(); } else { cookieKey = singleCookie.slice(0, delimiterIndex).trim(); cookieValue = singleCookie.slice(delimiterIndex + 1); } + // Save cookie key=value data with null instead of empty ('') values cookieData[cookieKey] = cookieValue || null; }); return cookieData; }; - const isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) { + + /** + * Check if cookie with specified name and value is present in a cookie string + * + * @param cookieString 'document.cookie'-like string + * @param name name argument of *set-cookie-* scriptlets + * @param value value argument of *set-cookie-* scriptlets + * @returns if cookie is already set + */ + var isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) { return cookieString.split(';').some(function (cookieStr) { - const pos = cookieStr.indexOf('='); + var pos = cookieStr.indexOf('='); if (pos === -1) { return false; } - const cookieName = cookieStr.slice(0, pos).trim(); - const cookieValue = cookieStr.slice(pos + 1).trim(); + var cookieName = cookieStr.slice(0, pos).trim(); + var cookieValue = cookieStr.slice(pos + 1).trim(); return name === cookieName && value === cookieValue; }); }; - const getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { - const ONE_YEAR_EXPIRATION_KEYWORD = '1year'; - const ONE_DAY_EXPIRATION_KEYWORD = '1day'; - const MS_IN_SEC = 1000; - const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - const SECONDS_IN_DAY = 24 * 60 * 60; - let parsedSec; + + /** + * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid + * + * @param offsetExpiresSec input offset param in seconds + * @returns number is milliseconds OR null + */ + var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { + var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; + var ONE_DAY_EXPIRATION_KEYWORD = '1day'; + var MS_IN_SEC = 1000; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; + // Set predefined expire value if corresponding keyword was passed if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_YEAR; } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_DAY; } else { parsedSec = Number.parseInt(offsetExpiresSec, 10); + // If offsetExpiresSec has been parsed to NaN - do not set cookie at all if (Number.isNaN(parsedSec)) { return null; } } return parsedSec * MS_IN_SEC; }; - const noopFunc = function noopFunc() {}; - const noopCallbackFunc = function noopCallbackFunc() { + + /** + * Noop function + */ + var noopFunc = function noopFunc() {}; + + /** + * Function returns noopFunc + * + * @returns noopFunc + */ + var noopCallbackFunc = function noopCallbackFunc() { return noopFunc; }; - const noopNull = function noopNull() { + + /** + * Function returns null + * + * @returns null + */ + var noopNull = function noopNull() { return null; }; - const trueFunc = function trueFunc() { + + /** + * Function returns true + * + * @returns true + */ + var trueFunc = function trueFunc() { return true; }; - const falseFunc = function falseFunc() { + + /** + * Function returns false + * + * @returns false + */ + var falseFunc = function falseFunc() { return false; }; + + /** + * Function returns this + * + * @returns this object + */ function noopThis() { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore return this; } - const noopStr = function noopStr() { + + /** + * Function returns empty string + * + * @returns empty string + */ + var noopStr = function noopStr() { return ''; }; - const noopArray = function noopArray() { + + /** + * Function returns empty array + * + * @returns empty array + */ + var noopArray = function noopArray() { return []; }; - const noopObject = function noopObject() { + + /** + * Function returns empty object + * + * @returns empty object + */ + var noopObject = function noopObject() { return {}; }; - const throwFunc = function throwFunc() { + + /** + * Function throws an error + * + * @throws + */ + var throwFunc = function throwFunc() { throw new Error(); }; - const noopPromiseReject = function noopPromiseReject() { + + /** + * Function returns Promise.reject() + * + * @returns rejected Promise + */ + var noopPromiseReject = function noopPromiseReject() { return Promise.reject(); }; - const noopPromiseResolve = function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}'; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default'; + + /** + * Returns Promise object that is resolved with specified props + * + * @param responseBody value to set as responseBody + * @param responseUrl value to set as responseUrl + * @param responseType value to set as responseType + * @returns resolved Promise or undefined if Response interface is not available + */ + var noopPromiseResolve = function noopPromiseResolve() { + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}'; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default'; if (typeof Response === 'undefined') { return; } - const response = new Response(responseBody, { + var response = new Response(responseBody, { status: 200, statusText: 'OK' }); + + // Mock response' url & type to avoid adb checks + // https://github.com/AdguardTeam/Scriptlets/issues/216 Object.defineProperties(response, { url: { value: responseUrl @@ -33134,41 +33207,63 @@ var scriptlets_umd = {exports: {}}; value: responseType } }); + + // eslint-disable-next-line consistent-return return Promise.resolve(response); }; - const shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = 'inlineScript'; - const INJECTED_SCRIPT_STRING = 'injectedScript'; - const INJECTED_SCRIPT_MARKER = ''; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; + + /** + * Determines if type of script is inline or injected + * and when it's one of them then return true, otherwise false + * https://github.com/AdguardTeam/Scriptlets/issues/201 + * + * @param stackMatch input stack value to match + * @param stackTrace script error stack trace + * @returns if stacks match + */ + var shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = 'inlineScript'; + var INJECTED_SCRIPT_STRING = 'injectedScript'; + var INJECTED_SCRIPT_MARKER = ''; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); }; if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { return false; } - let documentURL = window.location.href; - const pos = documentURL.indexOf('#'); + var documentURL = window.location.href; + var pos = documentURL.indexOf('#'); + // Remove URL hash + // in Chrome, URL in stackTrace doesn't contain hash + // so, it's necessary to remove it, otherwise location.href + // will not match with location from stackTrace if (pos !== -1) { documentURL = documentURL.slice(0, pos); } - const stackSteps = stackTrace.split('\n').slice(2).map(function (line) { + var stackSteps = stackTrace.split('\n').slice(2).map(function (line) { return line.trim(); }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + var stackLines = stackSteps.map(function (line) { + var stack; + // Get stack trace URL + // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20 + // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16) + // so, first group "(.*?@)" is required for Firefox, second group contains URL + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith$1(stackURL, '(')) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith('(')) { stackURL = stackURL.slice(1); } - if (startsWith$1(stackURL, INJECTED_SCRIPT_MARKER)) { + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith$1(stackFunction, 'at')) { + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith('at')) { stackFunction = stackFunction.slice(2).trim(); } stack = "".concat(stackFunction, " ").concat(stackURL).trim(); @@ -33181,72 +33276,148 @@ var scriptlets_umd = {exports: {}}; return stack; }); if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { + for (var index = 0; index < stackLines.length; index += 1) { if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { return true; } - if (isInjectedScript(stackMatch) && startsWith$1(stackLines[index], INJECTED_SCRIPT_STRING)) { + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { return true; } } } return false; }; - const findHostElements = function findHostElements(rootElement) { - const hosts = []; - const domElems = rootElement.querySelectorAll('*'); - domElems.forEach(function (el) { - if (el.shadowRoot) { - hosts.push(el); - } - }); + + /** + * Finds shadow-dom host (elements with shadowRoot property) in DOM of rootElement. + * + * @param rootElement shadow dom root + * @returns shadow-dom hosts + */ + var findHostElements = function findHostElements(rootElement) { + var hosts = []; + if (rootElement) { + // Element.querySelectorAll() returns list of elements + // which are defined in DOM of Element. + // Meanwhile, inner DOM of the element with shadowRoot property + // is absolutely another DOM and which can not be reached by querySelectorAll('*') + var domElems = rootElement.querySelectorAll('*'); + domElems.forEach(function (el) { + if (el.shadowRoot) { + hosts.push(el); + } + }); + } return hosts; }; - const pierceShadowDom = function pierceShadowDom(selector, hostElements) { - let targets = []; - const innerHostsAcc = []; + + /** + * A collection of nodes. + * + * @external NodeList + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/NodeList NodeList} + */ + + /** + * Pierces open shadow-dom in order to find: + * - elements by 'selector' matching + * - inner shadow-dom hosts + * + * @param selector DOM elements selector + * @param hostElements shadow-dom hosts + * @returns object with found elements and shadow-dom hosts + */ + var pierceShadowDom = function pierceShadowDom(selector, hostElements) { + var targets = []; + var innerHostsAcc = []; + + // it's possible to get a few hostElements found by baseSelector on the page hostElements.forEach(function (host) { - const simpleElems = host.querySelectorAll(selector); + // check presence of selector element inside base element if it's not in shadow-dom + var simpleElems = host.querySelectorAll(selector); targets = targets.concat([].slice.call(simpleElems)); - const shadowRootElem = host.shadowRoot; - const shadowChildren = shadowRootElem.querySelectorAll(selector); + var shadowRootElem = host.shadowRoot; + var shadowChildren = shadowRootElem.querySelectorAll(selector); targets = targets.concat([].slice.call(shadowChildren)); + + // find inner shadow-dom hosts inside processing shadow-dom innerHostsAcc.push(findHostElements(shadowRootElem)); }); - const innerHosts = flatten(innerHostsAcc); + + // if there were more than one host element, + // innerHostsAcc is an array of arrays and should be flatten + var innerHosts = flatten(innerHostsAcc); return { targets, innerHosts }; }; - const isValidCallback = function isValidCallback(callback) { + + /** + * Checks whether the passed arg is proper callback + * + * @param callback arbitrary callback + * @returns if callback is valid + */ + var isValidCallback = function isValidCallback(callback) { return callback instanceof Function + // passing string as 'code' arg is not recommended + // but it is possible and not restricted + // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters || typeof callback === 'string'; }; - const parseRawDelay = function parseRawDelay(delay) { - const parsedDelay = Math.floor(parseInt(delay, 10)); + + /** + * Parses delay argument of setTimeout / setInterval methods into + * rounded down number for number/string values or passes on for other types. + * Needed for prevent-setTimeout and prevent-setInterval + * + * @param delay native method delay arg + * @returns number as parsed delay or any input type if `delay` is not parsable + */ + var parseRawDelay = function parseRawDelay(delay) { + var parsedDelay = Math.floor(parseInt(delay, 10)); return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; }; - const isPreventionNeeded = function isPreventionNeeded(_ref) { - let callback = _ref.callback, + /** + * Checks whether 'callback' and 'delay' are matching + * by given parameters 'matchCallback' and 'matchDelay'. + * Used for prevent-setTimeout and prevent-setInterval. + * + * @param preventData set of data to determine if scriptlet should match + * @param preventData.callback method's callback arg + * @param preventData.delay method's delay arg + * @param preventData.matchCallback scriptlets's callback arg + * @param preventData.matchDelay scriptlets's delay arg + * @returns if scriptlet should match + */ + var isPreventionNeeded = function isPreventionNeeded(_ref) { + var callback = _ref.callback, delay = _ref.delay, matchCallback = _ref.matchCallback, matchDelay = _ref.matchDelay; + // if callback is has not valid type + // scriptlet can not prevent it + // so no need for more checking and do not call hit() later if (!isValidCallback(callback)) { return false; } if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - const _parseMatchArg = parseMatchArg(matchCallback), + var _parseMatchArg = parseMatchArg(matchCallback), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchRegexp = _parseMatchArg.matchRegexp; - const _parseDelayArg = parseDelayArg(matchDelay), + var _parseDelayArg = parseDelayArg(matchDelay), isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, delayMatch = _parseDelayArg.delayMatch; - const parsedDelay = parseRawDelay(delay); - let shouldPrevent = false; - const callbackStr = String(callback); + + // Parse delay for decimal, string and non-number values + // https://github.com/AdguardTeam/Scriptlets/issues/247 + var parsedDelay = parseRawDelay(delay); + var shouldPrevent = false; + // https://github.com/AdguardTeam/Scriptlets/issues/105 + var callbackStr = String(callback); if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -33256,18 +33427,23 @@ var scriptlets_umd = {exports: {}}; } return shouldPrevent; }; - const handleOldReplacement = function handleOldReplacement(replacement) { - let result; + + var handleOldReplacement = function handleOldReplacement(replacement) { + var result; + // defaults to return noopFunc instead of window.open if (!replacement) { result = noopFunc; } else if (replacement === 'trueFunc') { result = trueFunc; - } else if (replacement.indexOf('=') > -1) { - const isProp = startsWith$1(replacement, '{') && endsWith(replacement, '}'); + } else if (replacement.includes('=')) { + // We should return noopFunc instead of window.open + // but with some property if website checks it (examples 5, 6) + // https://github.com/AdguardTeam/Scriptlets/issues/71 + var isProp = replacement.startsWith('{') && replacement.endsWith('}'); if (isProp) { - const propertyPart = replacement.slice(1, -1); - const propertyName = substringBefore(propertyPart, '='); - const propertyValue = substringAfter$1(propertyPart, '='); + var propertyPart = replacement.slice(1, -1); + var propertyName = substringBefore(propertyPart, '='); + var propertyValue = substringAfter$1(propertyPart, '='); if (propertyValue === 'noopFunc') { result = {}; result[propertyName] = noopFunc; @@ -33276,25 +33452,33 @@ var scriptlets_umd = {exports: {}}; } return result; }; - const createDecoy = function createDecoy(args) { - const OBJECT_TAG_NAME = 'object'; - const OBJECT_URL_PROP_NAME = 'data'; - const IFRAME_TAG_NAME = 'iframe'; - const IFRAME_URL_PROP_NAME = 'src'; - const replacement = args.replacement, + /** + * Creates a decoy HTML element with a specified URL and delay before removal + * + * @param args an object with `replacement`, `url`, and `delay` properties + * @returns the decoy element that was created and added to the document body + */ + var createDecoy = function createDecoy(args) { + var UrlPropNameOf = /*#__PURE__*/function (UrlPropNameOf) { + UrlPropNameOf["Object"] = "data"; + UrlPropNameOf["Iframe"] = "src"; + return UrlPropNameOf; + }({}); + var replacement = args.replacement, url = args.url, delay = args.delay; - let tag; - let urlProp; + var tag; if (replacement === 'obj') { - tag = OBJECT_TAG_NAME; - urlProp = OBJECT_URL_PROP_NAME; + tag = "object"; } else { - tag = IFRAME_TAG_NAME; - urlProp = IFRAME_URL_PROP_NAME; + tag = "iframe"; + } + var decoy = document.createElement(tag); + if (decoy instanceof HTMLObjectElement) { + decoy[UrlPropNameOf.Object] = url; + } else if (decoy instanceof HTMLIFrameElement) { + decoy[UrlPropNameOf.Iframe] = url; } - const decoy = document.createElement(tag); - decoy[urlProp] = url; decoy.style.setProperty('height', '1px', 'important'); decoy.style.setProperty('position', 'fixed', 'important'); decoy.style.setProperty('top', '-1px', 'important'); @@ -33305,8 +33489,8 @@ var scriptlets_umd = {exports: {}}; }, delay * 1000); return decoy; }; - const getPreventGetter = function getPreventGetter(nativeGetter) { - const preventGetter = function preventGetter(target, prop) { + var getPreventGetter = function getPreventGetter(nativeGetter) { + var preventGetter = function preventGetter(target, prop) { if (prop && prop === 'closed') { return false; } @@ -33317,41 +33501,387 @@ var scriptlets_umd = {exports: {}}; }; return preventGetter; }; - const getNativeRegexpTest = function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, 'test').value; + + /* eslint-disable no-console, no-underscore-dangle */ + + /** + * Hit used only for debug purposes now + * + * @param source scriptlet properties + * use LOG_MARKER = 'log: ' at the start of a message + * for logging scriptlets + */ + var hit = function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ''; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = '#%#//'; + var UBO_SCRIPTLET_MARKER = '##+js'; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + // delete all domains from ruleText and leave just rule part + var rulePart = source.ruleText.slice(ruleStartIndex); + // prepare applied scriptlet rule for specific domain + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) { + // try catch for Edge 15 + // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/ + // console.log throws an error + } + + // This is necessary for unit-tests only! + if (typeof window.__debug === 'function') { + window.__debug(source); + } + }; + + /** + * Check if the property exists in the base object (recursively). + * Similar to getPropertyInChain but upgraded for json-prune: + * handle wildcard properties and does not define nonexistent base property as 'undefined' + * + * @param base object that owns chain + * @param chain chain of owner properties + * @param lookThrough should the method look through it's props in order to find wildcard + * @param output result acc + * @returns list of ChainInfo objects + */ + function getWildcardPropertyInChain(base, chain) { + var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + var pos = chain.indexOf('.'); + if (pos === -1) { + // for paths like 'a.b.*' every final nested prop should be processed + if (chain === '*' || chain === '[]') { + // eslint-disable-next-line no-restricted-syntax + for (var key in base) { + // to process each key in base except inherited ones + if (Object.prototype.hasOwnProperty.call(base, key)) { + output.push({ + base, + prop: key + }); + } + } + } else { + output.push({ + base, + prop: chain + }); + } + return output; + } + var prop = chain.slice(0, pos); + var shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object; + if (shouldLookThrough) { + var nextProp = chain.slice(pos + 1); + var baseKeys = Object.keys(base); + + // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'), + // each one of base keys should be considered as a potential chain prop in final path + baseKeys.forEach(function (key) { + var item = base[key]; + getWildcardPropertyInChain(item, nextProp, lookThrough, output); + }); + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if (nextBase !== undefined) { + getWildcardPropertyInChain(nextBase, chain, lookThrough, output); + } + return output; + } + + /** + * Conditionally logs message to console. + * Convention is to log messages by source.verbose if such log + * is not a part of scriptlet's functionality, eg on invalid input, + * and use 'forced' argument otherwise. + * + * @param source required, scriptlet properties + * @param message required, message to log + * @param forced to log message unconditionally + * @param convertMessageToString to convert message to string + */ + var logMessage = function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + + // eslint-disable-next-line no-console + var nativeConsole = console.log; + if (!convertMessageToString) { + // Template literals convert object to string, + // so 'message' should not be passed to template literals + // as it will not be logged correctly + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + }; + + /** + * Checks if prunning is required + * + * @param source required, scriptlet properties + * @param root object which should be pruned or logged + * @param prunePaths array with string of space-separated property chains to remove + * @param requiredPaths array with string of space-separated propertiy chains + * which must be all present for the pruning to occur + * @returns true if prunning is required + */ + function isPruningNeeded(source, root, prunePaths, requiredPaths) { + if (!root) { + return false; + } + var shouldProcess; + + // Only log hostname and matched JSON payload if only second argument is present + if (prunePaths.length === 0 && requiredPaths.length > 0) { + var rootString = JSON.stringify(root); + var matchRegex = toRegExp(requiredPaths.join('')); + var shouldLog = matchRegex.test(rootString); + if (shouldLog) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === 'object') { + logMessage(source, root, true, false); + } + shouldProcess = false; + return shouldProcess; + } + } + var wildcardSymbols = ['.*.', '*.', '.*', '.[].', '[].', '.[]']; + var _loop = function _loop() { + var requiredPath = requiredPaths[i]; + var lastNestedPropName = requiredPath.split('.').pop(); + var hasWildcard = wildcardSymbols.some(function (symbol) { + return requiredPath.includes(symbol); + }); + + // if the path has wildcard, getPropertyInChain should 'look through' chain props + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + + // start value of 'shouldProcess' due to checking below + shouldProcess = !hasWildcard; + for (var j = 0; j < details.length; j += 1) { + var hasRequiredProp = typeof lastNestedPropName === 'string' && details[j].base[lastNestedPropName] !== undefined; + if (hasWildcard) { + // if there is a wildcard, + // at least one (||) of props chain should be present in object + shouldProcess = hasRequiredProp || shouldProcess; + } else { + // otherwise each one (&&) of them should be there + shouldProcess = hasRequiredProp && shouldProcess; + } + } + }; + for (var i = 0; i < requiredPaths.length; i += 1) { + _loop(); + } + return shouldProcess; + } + + /** + * Prunes properties of 'root' object + * + * @param source required, scriptlet properties + * @param root object which should be pruned or logged + * @param prunePaths array with string of space-separated properties to remove + * @param requiredPaths array with string of space-separated properties + * which must be all present for the pruning to occur + * @returns pruned root + */ + var jsonPruner = function jsonPruner(source, root, prunePaths, requiredPaths) { + if (prunePaths.length === 0 && requiredPaths.length === 0) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === 'object') { + logMessage(source, root, true, false); + } + return root; + } + try { + if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) { + return root; + } + + // if pruning is needed, we check every input pathToRemove + // and delete it if root has it + prunePaths.forEach(function (path) { + var ownerObjArr = getWildcardPropertyInChain(root, path, true); + ownerObjArr.forEach(function (ownerObj) { + if (ownerObj !== undefined && ownerObj.base) { + delete ownerObj.base[ownerObj.prop]; + hit(source); + } + }); + }); + } catch (e) { + logMessage(source, e); + } + return root; + }; + + /** + * Returns the native `RegExp.prototype.test` method if it exists. + * + * @returns The native `RegExp.prototype.test` method. + * @throws If `RegExp.prototype.test` is not a function. + */ + var getNativeRegexpTest = function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'test'); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === 'function') { + return nativeRegexTest; + } + throw new Error('RegExp.prototype.test is not a function'); + }; + + /** + * Modifies original response with the given replacement data. + * + * @param origResponse Original response. + * @param replacement Replacement data for response with possible keys: + * - `body`: optional, string, default to '{}'; + * - `type`: optional, string, original response type is used if not specified. + * + * @returns Modified response. + */ + var modifyResponse = function modifyResponse(origResponse) { + var _origResponse$headers; + var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + body: '{}' + }; + var headers = {}; + origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) { + headers[key] = value; + }); + var modifiedResponse = new Response(replacement.body, { + status: origResponse.status, + statusText: origResponse.statusText, + headers + }); + + // Mock response url and type to avoid adblocker detection + // https://github.com/AdguardTeam/Scriptlets/issues/216 + Object.defineProperties(modifiedResponse, { + url: { + value: origResponse.url + }, + type: { + value: replacement.type || origResponse.type + } + }); + return modifiedResponse; }; - const getRequestProps = function getRequestProps() { - return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal']; + + /** + * Aggregates fetch and XMLHttpRequest.open arguments + * to operate on arbitrary request data objects + */ + + /** + * Object which is populated with request data from scriptlet arguments + */ + + /** + * Derivative of ParsedMatchProps with its values being + * converted to RegExp + */ + + /** + * Fetch and xhr.open options that are valid props + * to match for (trusted-)prevent-(fetch|xhr) scriptlets + * + * This type is being derived from getRequestProps return type + * as enums would be lost at build time disregarding 'const' + */ + + /** + * Returns array of request props that are supported by fetch/xhr scriptlets. + * Includes common 'url' and 'method' props and all other fetch-specific props + * + * @returns list of request props + */ + var getRequestProps = function getRequestProps() { + return ['url', 'method', 'headers', 'body', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal', 'mode']; }; - const getRequestData = function getRequestData(request) { - const requestInitOptions = getRequestProps(); - const entries = requestInitOptions.map(function (key) { - const value = request[key]; + + /** + * Collects Request options to object + * + * @param request Request instance to collect properties from + * @returns data object + */ + var getRequestData = function getRequestData(request) { + var requestInitOptions = getRequestProps(); + var entries = requestInitOptions.map(function (key) { + // if request has no such option, value will be undefined + var value = request[key]; return [key, value]; }); - return getObjectFromEntries(entries); + return Object.fromEntries(entries); }; - const getFetchData = function getFetchData(args) { - const fetchPropsObj = {}; - let fetchUrl; - let fetchInit; + + /** + * Collects fetch args to object + * + * @param args fetch args + * @returns data object + */ + var getFetchData = function getFetchData(args) { + var fetchPropsObj = {}; + var fetchUrl; + var fetchInit; if (args[0] instanceof Request) { - const requestData = getRequestData(args[0]); + // if Request passed to fetch, it will be in array + var requestData = getRequestData(args[0]); fetchUrl = requestData.url; fetchInit = requestData; } else { - fetchUrl = args[0]; - fetchInit = args[1]; + fetchUrl = args[0]; // eslint-disable-line prefer-destructuring + fetchInit = args[1]; // eslint-disable-line prefer-destructuring } + fetchPropsObj.url = fetchUrl; if (fetchInit instanceof Object) { - Object.keys(fetchInit).forEach(function (prop) { + var props = Object.keys(fetchInit); + props.forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } return fetchPropsObj; }; - const getXhrData = function getXhrData(method, url, async, user, password) { + + /** + * Collect xhr.open arguments to object + * + * @param method request method + * @param url request url + * @param async request async prop + * @param user request user prop + * @param password request password prop + * @returns aggregated request data + */ + var getXhrData = function getXhrData(method, url, async, user, password) { return { method, url, @@ -33360,75 +33890,112 @@ var scriptlets_umd = {exports: {}}; password }; }; - const parseMatchProps = function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = ' '; - const PAIRS_MARKER = ':'; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); + + /** + * Parse propsToMatch input string into object; + * used for prevent-fetch and prevent-xhr + * + * @param propsToMatchStr string of space-separated request properties to match + * @returns object where 'key' is prop name and 'value' is prop value + */ + var parseMatchProps = function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = ' '; + var PAIRS_MARKER = ':'; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); propsObj[key] = value; } else { + // Escape multiple colons in prop + // i.e regex value and/or url with protocol specified, with or without 'url:' match prop + // https://github.com/AdguardTeam/Scriptlets/issues/216#issuecomment-1178591463 propsObj.url = prop; } }); return propsObj; }; - const validateParsedData = function validateParsedData(data) { + + /** + * Validates parsed data values + * + * @param data request data + * @returns if data is valid + */ + var isValidParsedData = function isValidParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); }; - const getMatchPropsData = function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { + + /** + * Converts valid parsed data to data obj for further matching + * + * @param data parsed request data + * @returns data obj ready for matching + */ + var getMatchPropsData = function getMatchPropsData(data) { + var matchData = {}; + // Assertion is required, as Object.keys always returns string[] + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { matchData[key] = toRegExp(data[key]); }); return matchData; }; - const logMessage = function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = '#%#//scriptlet'; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + + /** + * Sets item to a specified storage, if storage isn't full. + * + * @param source scriptlet's configuration + * @param storage storage instance to set item into + * @param key storage key + * @param value staroge value + */ + var setStorageItem = function setStorageItem(source, storage, key, value) { + // setItem() may throw an exception if the storage is full. + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); } - nativeConsole(messageStr); }; - const setStorageItem = function setStorageItem(source, storage, key, value) { + + /** + * Removes the key/value pair with the given `key` from the `storage`. + * If unable to remove, logs the reason to console in debug mode. + * + * @param source scriptlet's configuration + * @param storage storage instance from which item has to be removed + * @param key storage key + */ + var removeStorageItem = function removeStorageItem(source, storage, key) { try { - storage.setItem(key, value); + storage.removeItem(key); } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); + var message = "Unable to remove storage item due to: ".concat(e.message); logMessage(source, message); } }; - const getLimitedStorageItemValue = function getLimitedStorageItemValue(value) { + + /** + * Gets supported storage item value + * + * @param value input item value + * @returns valid item value if ok OR null if not + */ + var getLimitedStorageItemValue = function getLimitedStorageItemValue(value) { if (typeof value !== 'string') { throw new Error('Invalid value'); } - let validValue; + var validValue; if (value === 'undefined') { validValue = undefined; } else if (value === 'false') { @@ -33455,68 +34022,119 @@ var scriptlets_umd = {exports: {}}; validValue = 'yes'; } else if (value === 'no') { validValue = 'no'; + } else if (value === '$remove$') { + validValue = '$remove$'; } else { throw new Error('Invalid value'); } return validValue; }; + + /** + * Generates function which silents global errors on page generated by scriptlet + * If error doesn't belong to our error we transfer it to the native onError handler + * + * @param rid - unique identifier of scriptlet + * @returns window.onerror handler + */ function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + // eslint-disable-next-line consistent-return + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === 'string' && error.indexOf(rid) !== -1) { + if (typeof error === 'string' && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; } + + /** + * Generate random seven symbols id + * + * @returns randomized id + */ function randomId() { return Math.random().toString(36).slice(2, 9); } + + /** + * Prevents infinite loops when trapping props that could be used by scriptlet's own helpers + * Example: window.RegExp, that is used by matchStackTrace > toRegExp + * + * https://github.com/AdguardTeam/Scriptlets/issues/251 + * https://github.com/AdguardTeam/Scriptlets/issues/226 + * https://github.com/AdguardTeam/Scriptlets/issues/232 + * + * @returns descriptor addon + */ function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback(cb) { this.isAbortingSuspended = true; + // try...catch is required in case there are more than one inline scripts + // which should be aborted, + // so after the first successful abortion, `cb(...args);` will throw error, + // and we should not stop on that and continue to abort other scripts try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - const result = cb(...args); + var result = cb(...args); this.isAbortingSuspended = false; return result; } catch (_unused) { - const rid = randomId(); + var rid = randomId(); this.isAbortingSuspended = false; + // It's necessary to throw error + // otherwise script will be not aborted throw new ReferenceError(rid); } } }; } + + /** + * Check if the property exists in the base object (recursively) + * + * If property doesn't exist in base object, + * defines this property as 'undefined' + * and returns base, property name and remaining part of property chain + * + * @param base object that owns chain + * @param chain chain of owner properties + * @returns chain info object + */ function getPropertyInChain(base, chain) { - const pos = chain.indexOf('.'); + var pos = chain.indexOf('.'); if (pos === -1) { return { base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); + + // https://github.com/AdguardTeam/Scriptlets/issues/128 if (base === null) { + // if base is null, return 'null' as base. + // it's needed for triggering the reason logging while debugging return { base, prop, chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { + // for empty objects in chain return { base, prop, @@ -33542,113 +34160,75 @@ var scriptlets_umd = {exports: {}}; chain }; } - function getWildcardPropertyInChain(base, chain) { - let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - const pos = chain.indexOf('.'); - if (pos === -1) { - if (chain === '*' || chain === '[]') { - for (const key in base) { - if (Object.prototype.hasOwnProperty.call(base, key)) { - output.push({ - base, - prop: key - }); - } - } - } else { - output.push({ - base, - prop: chain - }); - } - return output; - } - const prop = chain.slice(0, pos); - const shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object; - if (shouldLookThrough) { - const nextProp = chain.slice(pos + 1); - const baseKeys = Object.keys(base); - baseKeys.forEach(function (key) { - const item = base[key]; - getWildcardPropertyInChain(item, nextProp, lookThrough, output); - }); - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if (nextBase !== undefined) { - getWildcardPropertyInChain(nextBase, chain, lookThrough, output); - } - return output; - } - const hit = function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ''; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = '#%#//'; - const UBO_SCRIPTLET_MARKER = '##+js'; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) { - } - if (typeof window.__debug === 'function') { - window.__debug(source); - } - }; - const matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) { + + /** + * Checks if given propsToMatch string matches with given request data + * This is used by prevent-xhr, prevent-fetch, trusted-replace-xhr-response + * and trusted-replace-fetch-response scriptlets + * + * @param source scriptlet properties + * @param propsToMatch string of space-separated request properties to match + * @param requestData object with standard properties of fetch/xhr like url, method etc + * @returns if request properties match + */ + var matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === '' || propsToMatch === '*') { return true; } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + // prevent only if all props match + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === 'string' && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); }); } return isMatched; }; - const matchStackTrace = function matchStackTrace(stackMatch, stackTrace) { + + /** + * Checks if the stackTrace contains stackRegexp + * https://github.com/AdguardTeam/Scriptlets/issues/82 + * + * @param stackMatch - input stack value to match + * @param stackTrace - script error stack trace + * @returns if the stackTrace contains stackRegexp + */ + var matchStackTrace = function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === '') { return true; } if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split('\n').slice(2) + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split('\n').slice(2) // get rid of our own functions in the stack trace .map(function (line) { return line.trim(); - }) + }) // trim the lines .join('\n'); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); }; - const throttle = function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { + + /** + * Returns a wrapper, passing the call to 'method' at maximum once per 'delay' milliseconds. + * Those calls that fall into the "cooldown" period, are ignored + * + * @param cb callback + * @param delay - milliseconds + * @returns throttled callback + */ + var throttle = function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } @@ -33661,6 +34241,8 @@ var scriptlets_umd = {exports: {}}; setTimeout(function () { wait = false; if (savedArgs) { + // "savedArgs" might contains few arguments, so it's necessary to use spread operator + // https://github.com/AdguardTeam/Scriptlets/issues/284#issuecomment-1419464354 wrapper(...savedArgs); savedArgs = null; } @@ -33668,12 +34250,27 @@ var scriptlets_umd = {exports: {}}; }; return wrapper; }; - const observeDOMChanges = function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { + + /** + * DOM tree changes observer. Used for 'remove-attr' and 'remove-class' scriptlets + * + * @param callback function to call on each mutation + * @param observeAttrs if observer should observe attributes changes + * @param attrsToObserve list of attributes to observe + */ + var observeDOMChanges = function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + /** + * 'delay' in milliseconds for 'throttle' method + */ + var THROTTLE_DELAY_MS = 20; + /** + * Used for remove-class + */ + // eslint-disable-next-line @typescript-eslint/no-use-before-define + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { childList: true, @@ -33689,9 +34286,14 @@ var scriptlets_umd = {exports: {}}; }); } }; - const disconnect = function disconnect() { + var disconnect = function disconnect() { observer.disconnect(); }; + + /** + * Callback wrapper to prevent loops + * when callback tinkers with attributes + */ function callbackWrapper() { disconnect(); callback(); @@ -33699,203 +34301,493 @@ var scriptlets_umd = {exports: {}}; } connect(); }; - const parseFlags = function parseFlags(flags) { - const FLAGS_DIVIDER = ' '; - const ASAP_FLAG = 'asap'; - const COMPLETE_FLAG = 'complete'; - const STAY_FLAG = 'stay'; - const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; - const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { - return VALID_FLAGS.indexOf(f) !== -1; + + /** + * Returns the list of added nodes from the list of mutations + * + * @param mutations list of mutations + * @returns list of added nodes + */ + var getAddedNodes = function getAddedNodes(mutations) { + var nodes = []; + for (var i = 0; i < mutations.length; i += 1) { + var addedNodes = mutations[i].addedNodes; + for (var j = 0; j < addedNodes.length; j += 1) { + nodes.push(addedNodes[j]); + } + } + return nodes; + }; + + /** + * Creates and runs a MutationObserver on the document element with optional + * throttling and disconnect timeout. + * + * @param {Function} callback MutationObserver callback + * @param {object} options MutationObserver options + * @param timeout Disconnect timeout in ms + */ + var observeDocumentWithTimeout = function observeDocumentWithTimeout(callback, options) { + var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10000; + var documentObserver = new MutationObserver(function (mutations, observer) { + observer.disconnect(); + callback(mutations, observer); + observer.observe(document.documentElement, options); + }); + documentObserver.observe(document.documentElement, options); + if (typeof timeout === 'number') { + setTimeout(function () { + return documentObserver.disconnect(); + }, timeout); + } + }; + + /** + * Behaviour flags string parser + * + * @param flags required, 'applying' argument string + * @returns object with parsed flags + */ + var parseFlags = function parseFlags(flags) { + var FLAGS_DIVIDER = ' '; + var ASAP_FLAG = 'asap'; + var COMPLETE_FLAG = 'complete'; + var STAY_FLAG = 'stay'; + var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; + var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { + return VALID_FLAGS.includes(f); }); return { ASAP: ASAP_FLAG, COMPLETE: COMPLETE_FLAG, STAY: STAY_FLAG, hasFlag(flag) { - return passedFlags.indexOf(flag) !== -1; + return passedFlags.includes(flag); } }; }; - const parseKeywordValue = function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = '$now$'; - const CURRENT_DATE_KEYWORD = '$currentDate$'; - let parsedValue = rawValue; + + /** + * Modifies passed keyword value according to its purpose. + * Returns initial value if it's not a keyword. + * + * Supported keywords: + * - '$now$' - returns current time in ms, e.g 1667915146503 + * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * + * @param rawValue keyword + * @returns parsed value + */ + var parseKeywordValue = function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = '$now$'; + var CURRENT_DATE_KEYWORD = '$currentDate$'; + var parsedValue = rawValue; if (rawValue === NOW_VALUE_KEYWORD) { + // Set to current time in ms, e.g 1667915146503 parsedValue = Date.now().toString(); } else if (rawValue === CURRENT_DATE_KEYWORD) { + // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' parsedValue = Date(); } return parsedValue; }; - const hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) { - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const shadowRoot = Reflect.apply(target, thisArg, args); + + /** + * Makes arbitrary operations on shadow root element, + * to be passed as callback to hijackAttachShadow + */ + + /** + * Overrides attachShadow method of Element API on a given context + * to pass retrieved shadowRoots to callback + * + * @param context e.g global window object or contentWindow of an iframe + * @param hostSelector selector to determine if callback should be called on current shadow subtree + * @param callback callback to call on shadow root + */ + var hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) { + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var shadowRoot = Reflect.apply(target, thisArg, args); if (thisArg && thisArg.matches(hostSelector || '*')) { callback(shadowRoot); } return shadowRoot; }; - const attachShadowHandler = { + var attachShadowHandler = { apply: handlerWrapper }; context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler); }; + + /** + * Grabs existing nodes and passes them to a given handler. + * + * @param selector CSS selector to find nodes by + * @param handler handler to pass nodes to + */ + var handleExistingNodes = function handleExistingNodes(selector, handler) { + var nodeList = document.querySelectorAll(selector); + var nodes = nodeListToArray(nodeList); + handler(nodes); + }; + + /** + * Extracts added nodes from mutations and passes them to a given handler. + * + * @param mutations mutations to find eligible nodes in + * @param handler handler to pass eligible nodes to + */ + var handleMutations = function handleMutations(mutations, handler) { + var addedNodes = getAddedNodes(mutations); + handler(addedNodes); + }; + + /** + * Checks if given node's text content should be replaced + * + * @param node node to check + * @param nodeNameMatch regexp or string to match node name + * @param textContentMatch regexp or string to match node's text content + * @returns true if node's text content should be replaced + */ + var isTargetNode = function isTargetNode(node, nodeNameMatch, textContentMatch) { + var nodeName = node.nodeName, + textContent = node.textContent; + var nodeNameLowerCase = nodeName.toLowerCase(); + return textContent !== null && textContent !== '' && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch)); + }; + + /** + * Replaces given node's text content with a given replacement. + * + * @param source source of the scriptlet + * @param node node to replace text content in + * @param pattern pattern to match text content + * @param replacement replacement for matched text content + */ + var replaceNodeText = function replaceNodeText(source, node, pattern, replacement) { + var textContent = node.textContent; + if (textContent) { + node.textContent = textContent.replace(pattern, replacement); + hit(source); + } + }; + + /** + * Modifies arguments for trusted-replace-node-text and remove-node-text scriptlets + * + * @param nodeName string or stringified regexp to match node name + * @param textMatch string or stringified regexp to match node's text content + * @param pattern string or stringified regexp to match replace pattern + * @returns derivative params + */ + var parseNodeTextParams = function parseNodeTextParams(nodeName, textMatch) { + var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var REGEXP_START_MARKER = '/'; + var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER)); + var selector = isStringNameMatch ? nodeName : '*'; + var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName); + var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch); + var patternMatch; + if (pattern) { + patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern); + } + return { + selector, + nodeNameMatch, + textContentMatch, + patternMatch + }; + }; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-click-element + * + * @description + * Clicks selected elements in a strict sequence, ordered by selectors passed, + * and waiting for them to render in the DOM first. + * Deactivates after all elements have been clicked or by 10s timeout. + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('trusted-click-element', selectors[, extraMatch[, delay]]) + * ``` + * + * - `selectors` — required, string with query selectors delimited by comma + * - `extraMatch` — optional, extra condition to check on a page; allows to match `cookie` and `localStorage`; + * can be set as `name:key[=value]` where `value` is optional. + * If `cookie`/`localStorage` starts with `!` then the element will only be clicked + * if specified cookie/localStorage item does not exist. + * Multiple conditions are allowed inside one `extraMatch` but they should be delimited by comma + * and each of them should match the syntax. Possible `name`s: + * - `cookie` — test string or regex against cookies on a page + * - `localStorage` — check if localStorage item is present + * - `delay` — optional, time in ms to delay scriptlet execution, defaults to instant execution. + * + * ### Examples + * + * 1. Click single element by selector + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]') + * ``` + * + * 1. Delay click execution by 500ms + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '', '500') + * ``` + * + * 1. Click multiple elements by selector with a delay + * + * + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name="check"], input[type="submit"][value="akkoord"]', '', '500') + * ``` + * + * 1. Match cookies by keys using regex and string + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'cookie:userConsentCommunity, cookie:/cmpconsent|cmp/') + * ``` + * + * 1. Match by cookie key=value pairs using regex and string + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'cookie:userConsentCommunity=true, cookie:/cmpconsent|cmp/=/[a-z]{1,5}/') + * ``` + * + * 1. Match by localStorage item 'promo' key + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', 'localStorage:promo') + * ``` + * + * 1. Click multiple elements with delay and matching by both cookie string and localStorage item + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], input[type="submit"][value="akkoord"]', 'cookie:cmpconsent, localStorage:promo', '250') + * ``` + * + * + * + * 1. Click element only if cookie with name `cmpconsent` does not exist + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '!cookie:cmpconsent') + * ``` + * + * 1. Click element only if specified cookie string and localStorage item does not exist + * + * ```adblock + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '!cookie:consent, !localStorage:promo') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ function trustedClickElement$1(source, selectors) { - let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; + var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; if (!selectors) { return; } - const OBSERVER_TIMEOUT_MS = 10000; - const THROTTLE_DELAY_MS = 20; - const STATIC_CLICK_DELAY_MS = 150; - const COOKIE_MATCH_MARKER = 'cookie:'; - const LOCAL_STORAGE_MATCH_MARKER = 'localStorage:'; - const SELECTORS_DELIMITER = ','; - const COOKIE_STRING_DELIMITER = ';'; - const EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; - const sleep = function sleep(delayMs) { + var OBSERVER_TIMEOUT_MS = 10000; + var THROTTLE_DELAY_MS = 20; + var STATIC_CLICK_DELAY_MS = 150; + var COOKIE_MATCH_MARKER = 'cookie:'; + var LOCAL_STORAGE_MATCH_MARKER = 'localStorage:'; + var SELECTORS_DELIMITER = ','; + var COOKIE_STRING_DELIMITER = ';'; + // Regex to split match pairs by commas, avoiding the ones included in regexes + var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; + var sleep = function sleep(delayMs) { return new Promise(function (resolve) { return setTimeout(resolve, delayMs); }); }; - let parsedDelay; + var parsedDelay; if (delay) { parsedDelay = parseInt(delay, 10); - const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; + var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; if (!isValidDelay) { - const message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); + // eslint-disable-next-line max-len + var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); logMessage(source, message); return; } } - let canClick = !parsedDelay; - const cookieMatches = []; - const localStorageMatches = []; - let isInvertedMatchCookie = false; - let isInvertedMatchLocalStorage = false; + var canClick = !parsedDelay; + var cookieMatches = []; + var localStorageMatches = []; + var isInvertedMatchCookie = false; + var isInvertedMatchLocalStorage = false; if (extraMatch) { - const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { + // Get all match marker:value pairs from argument + var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { return matchStr.trim(); }); + + // Filter match pairs by marker parsedExtraMatch.forEach(function (matchStr) { - if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) { - const _parseMatchArg = parseMatchArg(matchStr), + if (matchStr.includes(COOKIE_MATCH_MARKER)) { + var _parseMatchArg = parseMatchArg(matchStr), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchValue = _parseMatchArg.matchValue; isInvertedMatchCookie = isInvertedMatch; - const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ''); + var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ''); cookieMatches.push(cookieMatch); } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { - const _parseMatchArg2 = parseMatchArg(matchStr), - isInvertedMatch = _parseMatchArg2.isInvertedMatch, - matchValue = _parseMatchArg2.matchValue; - isInvertedMatchLocalStorage = isInvertedMatch; - const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ''); + if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) { + var _parseMatchArg2 = parseMatchArg(matchStr), + _isInvertedMatch = _parseMatchArg2.isInvertedMatch, + _matchValue = _parseMatchArg2.matchValue; + isInvertedMatchLocalStorage = _isInvertedMatch; + var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ''); localStorageMatches.push(localStorageMatch); } }); } if (cookieMatches.length > 0) { - const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); - const parsedCookies = parseCookieString(document.cookie); - const cookieKeys = Object.keys(parsedCookies); + var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); + var parsedCookies = parseCookieString(document.cookie); + var cookieKeys = Object.keys(parsedCookies); if (cookieKeys.length === 0) { return; } - const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { - const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; - const keyMatch = toRegExp(key); + var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { + // Avoid getting /.?/ result from toRegExp on undefined + // as cookie may be set without value, + // on which cookie parsing will return cookieKey:undefined pair + var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; + var keyMatch = toRegExp(key); return cookieKeys.some(function (key) { - const keysMatched = keyMatch.test(key); + var keysMatched = keyMatch.test(key); if (!keysMatched) { return false; } + + // Key matching is enough if cookie value match is not specified if (!valueMatch) { return true; } return valueMatch.test(parsedCookies[key]); }); }); - const shouldRun = cookiesMatched !== isInvertedMatchCookie; + var shouldRun = cookiesMatched !== isInvertedMatchCookie; if (!shouldRun) { return; } } if (localStorageMatches.length > 0) { - const localStorageMatched = localStorageMatches.every(function (str) { - const itemValue = window.localStorage.getItem(str); + var localStorageMatched = localStorageMatches.every(function (str) { + var itemValue = window.localStorage.getItem(str); return itemValue || itemValue === ''; }); - const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; - if (!shouldRun) { + var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; + if (!_shouldRun) { return; } } - let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { + + /** + * Create selectors array and swap selectors to null on finding it's element + * + * Selectors / nulls should not be (re)moved from array to: + * - keep track of selectors order + * - always know on what index corresponding element should be put + * - prevent selectors from being queried multiple times + */ + var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { return selector.trim(); }); - const createElementObj = function createElementObj(element) { + var createElementObj = function createElementObj(element) { return { element: element || null, clicked: false }; }; - const elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); - const clickElementsBySequence = async function clickElementsBySequence() { - for (let i = 0; i < elementsSequence.length; i += 1) { - const elementObj = elementsSequence[i]; + var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); + + /** + * Go through elementsSequence from left to right, clicking on found elements + * + * Element should not be clicked if it is already clicked, + * or a previous element is not found or clicked yet + */ + var clickElementsBySequence = async function clickElementsBySequence() { + for (var i = 0; i < elementsSequence.length; i += 1) { + var elementObj = elementsSequence[i]; + // Add a delay between clicks to every element except the first one + // https://github.com/AdguardTeam/Scriptlets/issues/284 if (i >= 1) { await sleep(STATIC_CLICK_DELAY_MS); } + // Stop clicking if that pos element is not found yet if (!elementObj.element) { break; } + // Skip already clicked elements if (!elementObj.clicked) { elementObj.element.click(); elementObj.clicked = true; } } - const allElementsClicked = elementsSequence.every(function (elementObj) { + var allElementsClicked = elementsSequence.every(function (elementObj) { return elementObj.clicked === true; }); if (allElementsClicked) { + // At this stage observer is already disconnected hit(source); } }; - const handleElement = function handleElement(element, i) { - const elementObj = createElementObj(element); + var handleElement = function handleElement(element, i) { + var elementObj = createElementObj(element); elementsSequence[i] = elementObj; if (canClick) { clickElementsBySequence(); } }; - const findElements = function findElements(mutations, observer) { - const fulfilledSelectors = []; + + /** + * Query all selectors from queue on each mutation + * Each selector is swapped to null in selectorsSequence on founding corresponding element + * + * We start looking for elements before possible delay is over, to avoid cases + * when delay is getting off after the last mutation took place. + * + */ + var findElements = function findElements(mutations, observer) { + var fulfilledSelectors = []; selectorsSequence.forEach(function (selector, i) { if (!selector) { return; } - const element = document.querySelector(selector); + var element = document.querySelector(selector); if (!element) { return; } handleElement(element, i); fulfilledSelectors.push(selector); }); + + // selectorsSequence should be modified after the loop to not break loop indexation selectorsSequence = selectorsSequence.map(function (selector) { - return fulfilledSelectors.indexOf(selector) === -1 ? selector : null; + return fulfilledSelectors.includes(selector) ? null : selector; }); - const allSelectorsFulfilled = selectorsSequence.every(function (selector) { + + // Disconnect observer after finding all elements + var allSelectorsFulfilled = selectorsSequence.every(function (selector) { return selector === null; }); if (allSelectorsFulfilled) { observer.disconnect(); } }; - const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); + var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); observer.observe(document.documentElement, { attributes: true, childList: true, @@ -33903,6 +34795,7 @@ var scriptlets_umd = {exports: {}}; }); if (parsedDelay) { setTimeout(function () { + // Click previously collected elements clickElementsBySequence(); canClick = true; }, parsedDelay); @@ -33912,24 +34805,61 @@ var scriptlets_umd = {exports: {}}; }, OBSERVER_TIMEOUT_MS); } trustedClickElement$1.names = ['trusted-click-element' + // trusted scriptlets support no aliases ]; + trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage, parseMatchArg]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-on-property-read + * + * @description + * Aborts a script when it attempts to **read** the specified property. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-readjs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-read.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('abort-on-property-read', property) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window` + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to access `window.alert` + * example.org#%#//scriptlet('abort-on-property-read', 'alert') + * + * ! Aborts script when it tries to access `navigator.language` + * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function abortOnPropertyRead$1(source, property) { if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -33952,24 +34882,58 @@ var scriptlets_umd = {exports: {}}; window.onerror = createOnErrorHandler(rid).bind(); } abortOnPropertyRead$1.names = ['abort-on-property-read', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read']; abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-on-property-write + * + * @description + * Aborts a script when it attempts to **write** the specified property. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-writejs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-write.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('abort-on-property-write', property) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). + * The property must be attached to `window` + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to set `window.adblock` value + * example.org#%#//scriptlet('abort-on-property-write', 'adblock') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function abortOnPropertyWrite$1(source, property) { if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -33991,16 +34955,156 @@ var scriptlets_umd = {exports: {}}; window.onerror = createOnErrorHandler(rid).bind(); } abortOnPropertyWrite$1.names = ['abort-on-property-write', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write']; abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-setTimeout + * + * @description + * Prevents a `setTimeout` call if: + * + * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`; + * otherwise mismatched calls should be defused. + * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-settimeout-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-setTimeout'[, matchCallback[, matchDelay]]) + * ``` + * + * > Call with no arguments will log all setTimeout calls (`log-setTimeout` superseding), + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * - `matchCallback` — optional, string or regular expression; + * invalid regular expression will be skipped and all callbacks will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * If not set, prevents all `setTimeout` calls due to specified `matchDelay`. + * - `matchDelay` — optional, must be an integer. + * If starts with `!`, scriptlet will not match the delay but all other will be defused. + * If do not start with `!`, the delay passed to the `setTimeout` call will be matched. + * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. + * + * > If `prevent-setTimeout` log looks like `setTimeout(undefined, 1000)`, + * > it means that no callback was passed to setTimeout() and that's not scriptlet issue + * > and obviously it can not be matched by `matchCallback`. + * + * ### Examples + * + * 1. Prevents `setTimeout` calls if the callback matches `/\.test/` regardless of the delay + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', '/\.test/') + * ``` + * + * For instance, the following call will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "value"; + * }, 100); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback does not contain `value` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', '!value') + * ``` + * + * For instance, only the first of the following calls will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "test -- prevented"; + * }, 300); + * setTimeout(function () { + * window.test = "value -- executed"; + * }, 400); + * setTimeout(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback contains `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', 'value', '!300') + * ``` + * + * For instance, only the first of the following calls will not be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "value 1 -- executed"; + * }, 300); + * setTimeout(function () { + * window.test = "value 2 -- prevented"; + * }, 400); + * setTimeout(function () { + * window.test = "value 3 -- prevented"; + * }, 500); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback does not contain `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', '!value', '!300') + * ``` + * + * For instance, only the second of the following calls will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "test -- executed"; + * }, 300); + * setTimeout(function () { + * window.test = "test -- prevented"; + * }, 400); + * setTimeout(function () { + * window.test = "value -- executed"; + * }, 400); + * setTimeout(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setTimeout` calls if the callback contains `value` and delay is a decimal + * + * ```adblock + * example.org#%#//scriptlet('prevent-setTimeout', 'value', '300') + * ``` + * + * For instance, the following calls will be prevented: + * + * ```javascript + * setTimeout(function () { + * window.test = "value"; + * }, 300); + * setTimeout(function () { + * window.test = "value"; + * }, 300 + Math.random()); + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function preventSetTimeout$1(source, matchCallback, matchDelay) { - const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; + // logs setTimeouts to console if no arguments have been specified + var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; if (shouldLog) { hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -34016,26 +35120,172 @@ var scriptlets_umd = {exports: {}}; } return target.apply(thisArg, args); }; - const setTimeoutHandler = { + var setTimeoutHandler = { apply: handlerWrapper }; window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler); } preventSetTimeout$1.names = ['prevent-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-setTimeout-if.js', + // new implementation of setTimeout-defuser.js 'ubo-no-setTimeout-if.js', 'nostif.js', + // new short name of no-setTimeout-if 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif', + // old scriptlet names which should be supported as well. + // should be removed eventually. + // do not remove until other filter lists maintainers use them 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std']; preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, - parseMatchArg, parseDelayArg, toRegExp, startsWith$1, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay]; + // following helpers should be injected as helpers above use them + parseMatchArg, parseDelayArg, toRegExp, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-setInterval + * + * @description + * Prevents a `setInterval` call if: + * + * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`; + * otherwise mismatched calls should be defused. + * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-setinterval-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-setInterval'[, matchCallback[, matchDelay]]) + * ``` + * + * > Call with no arguments will log all setInterval calls (`log-setInterval` superseding), + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * - `matchCallback` — optional, string or regular expression; + * invalid regular expression will be skipped and all callbacks will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * If not set, prevents all `setInterval` calls due to specified `matchDelay`. + * - `matchDelay` — optional, must be an integer. + * If starts with `!`, scriptlet will not match the delay but all other will be defused. + * If do not start with `!`, the delay passed to the `setInterval` call will be matched. + * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. + * + * > If `prevent-setInterval` log looks like `setInterval(undefined, 1000)`, + * > it means that no callback was passed to setInterval() and that's not scriptlet issue + * > and obviously it can not be matched by `matchCallback`. + * + * ### Examples + * + * 1. Prevents `setInterval` calls if the callback matches `/\.test/` regardless of the delay + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', '/\.test/') + * ``` + * + * For instance, the following call will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "value"; + * }, 100); + * ``` + * + * 1. Prevents `setInterval` calls if the callback does not contain `value` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', '!value') + * ``` + * + * For instance, only the first of the following calls will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "test -- prevented"; + * }, 300); + * setInterval(function () { + * window.test = "value -- executed"; + * }, 400); + * setInterval(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setInterval` calls if the callback contains `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', 'value', '!300') + * ``` + * + * For instance, only the first of the following calls will not be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "value 1 -- executed"; + * }, 300); + * setInterval(function () { + * window.test = "value 2 -- prevented"; + * }, 400); + * setInterval(function () { + * window.test = "value 3 -- prevented"; + * }, 500); + * ``` + * + * 1. Prevents `setInterval` calls if the callback does not contain `value` and the delay is not set to `300` + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', '!value', '!300') + * ``` + * + * For instance, only the second of the following calls will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "test -- executed"; + * }, 300); + * setInterval(function () { + * window.test = "test -- prevented"; + * }, 400); + * setInterval(function () { + * window.test = "value -- executed"; + * }, 400); + * setInterval(function () { + * window.value = "test -- executed"; + * }, 500); + * ``` + * + * 1. Prevents `setInterval` calls if the callback contains `value` and delay is a decimal number + * + * ```adblock + * example.org#%#//scriptlet('prevent-setInterval', 'value', '300') + * ``` + * + * For instance, the following calls will be prevented: + * + * ```javascript + * setInterval(function () { + * window.test = "value"; + * }, 300); + * setInterval(function () { + * window.test = "value"; + * }, 300 + Math.random()); + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function preventSetInterval$1(source, matchCallback, matchDelay) { - const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; + // logs setIntervals to console if no arguments have been specified + var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; if (shouldLog) { hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -34051,27 +35301,115 @@ var scriptlets_umd = {exports: {}}; } return target.apply(thisArg, args); }; - const setIntervalHandler = { + var setIntervalHandler = { apply: handlerWrapper }; window.setInterval = new Proxy(window.setInterval, setIntervalHandler); } preventSetInterval$1.names = ['prevent-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-setInterval-if.js', + // new implementation of setInterval-defuser.js 'ubo-no-setInterval-if.js', 'setInterval-defuser.js', + // old name should be supported as well 'ubo-setInterval-defuser.js', 'nosiif.js', + // new short name of no-setInterval-if 'ubo-nosiif.js', 'sid.js', + // old short scriptlet name 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid']; preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, - toRegExp, startsWith$1, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay]; + // following helpers should be injected as helpers above use them + toRegExp, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-window-open + * + * @description + * Prevents `window.open` calls when URL either matches or not matches the specified string/regexp. + * Using it without parameters prevents all `window.open` calls. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#windowopen-defuserjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-window-open'[, match[, delay[, replacement]]]) + * ``` + * + * - `match` — optional, string or regular expression. + * If not set or regular expression is invalid, all window.open calls will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * - `delay` — optional, number of seconds. If not set, scriptlet will return `null`, + * otherwise valid sham window object as injected `iframe` will be returned + * for accessing its methods (blur(), focus() etc.) and will be removed after the delay. + * - `replacement` — optional, string; one of the predefined constants: + * - `obj` — for returning an object instead of default iframe; + * for cases when the page requires a valid `window` instance to be returned + * - `log` — for logging window.open calls; not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Prevent all `window.open` calls + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open') + * ``` + * + * 1. Prevent `window.open` for all URLs containing `example` + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', 'example') + * ``` + * + * 1. Prevent `window.open` for all URLs matching RegExp `/example\./` + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', '/example\./') + * ``` + * + * 1. Prevent `window.open` for all URLs **NOT** containing `example` + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', '!example') + * ``` + * + * ### Old syntax of prevent-window-open parameters + * + * - `match` — optional, defaults to "matching", any positive number or nothing for "matching", + * 0 or empty string for "not matching" + * - `search` — optional, string or regexp for matching the URL passed to `window.open` call; + * defaults to search all `window.open` call + * - `replacement` — optional, string to return prop value or property instead of window.open; + * defaults to return noopFunc. + * + * ### Examples of old syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-window-open', '1', '/example\./') + * example.org#%#//scriptlet('prevent-window-open', '0', 'example') + * example.org#%#//scriptlet('prevent-window-open', '', '', 'trueFunc') + * example.org#%#//scriptlet('prevent-window-open', '1', '', '{propName=noopFunc}') + * ``` + * + * > For better compatibility with uBO, old syntax is not recommended to use. + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function preventWindowOpen$1(source) { - let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*'; - let delay = arguments.length > 2 ? arguments[2] : undefined; - let replacement = arguments.length > 3 ? arguments[3] : undefined; - const nativeOpen = window.open; - const isNewSyntax = match !== '0' && match !== '1'; - const oldOpenWrapper = function oldOpenWrapper(str) { + var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*'; + var delay = arguments.length > 2 ? arguments[2] : undefined; + var replacement = arguments.length > 3 ? arguments[3] : undefined; + // default match value is needed for preventing all window.open calls + // if scriptlet runs without args + var nativeOpen = window.open; + var isNewSyntax = match !== '0' && match !== '1'; + var oldOpenWrapper = function oldOpenWrapper(str) { match = Number(match) > 0; + // 'delay' was 'search' prop for matching in old syntax for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } @@ -34079,29 +35417,29 @@ var scriptlets_umd = {exports: {}}; logMessage(source, "Invalid parameter: ".concat(delay)); return nativeOpen.apply(window, [str, ...args]); } - const searchRegexp = toRegExp(delay); + var searchRegexp = toRegExp(delay); if (match !== searchRegexp.test(str)) { return nativeOpen.apply(window, [str, ...args]); } hit(source); return handleOldReplacement(replacement); }; - const newOpenWrapper = function newOpenWrapper(url) { - const shouldLog = replacement && replacement.indexOf('log') > -1; + var newOpenWrapper = function newOpenWrapper(url) { + var shouldLog = replacement && replacement.includes('log'); for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } if (shouldLog) { - const argsStr = args && args.length > 0 ? ", ".concat(args.join(', ')) : ''; - const message = "".concat(url).concat(argsStr); + var argsStr = args && args.length > 0 ? ", ".concat(args.join(', ')) : ''; + var message = "".concat(url).concat(argsStr); logMessage(source, message, true); hit(source); } - let shouldPrevent = false; + var shouldPrevent = false; if (match === '*') { shouldPrevent = true; } else if (isValidMatchStr(match)) { - const _parseMatchArg = parseMatchArg(match), + var _parseMatchArg = parseMatchArg(match), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchRegexp = _parseMatchArg.matchRegexp; shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; @@ -34110,18 +35448,18 @@ var scriptlets_umd = {exports: {}}; shouldPrevent = false; } if (shouldPrevent) { - const parsedDelay = parseInt(delay, 10); - let result; + var parsedDelay = parseInt(delay, 10); + var result; if (nativeIsNaN(parsedDelay)) { result = noopNull(); } else { - const decoyArgs = { + var decoyArgs = { replacement, url, delay: parsedDelay }; - const decoy = createDecoy(decoyArgs); - let popup = decoy.contentWindow; + var decoy = createDecoy(decoyArgs); + var popup = decoy.contentWindow; if (typeof popup === 'object' && popup !== null) { Object.defineProperty(popup, 'closed', { value: false @@ -34133,7 +35471,7 @@ var scriptlets_umd = {exports: {}}; value: null }); } else { - const nativeGetter = decoy.contentWindow && decoy.contentWindow.get; + var nativeGetter = decoy.contentWindow && decoy.contentWindow.get; Object.defineProperty(decoy, 'contentWindow', { get: getPreventGetter(nativeGetter) }); @@ -34147,35 +35485,121 @@ var scriptlets_umd = {exports: {}}; return nativeOpen.apply(window, [url, ...args]); }; window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; + + // Protect window.open from native code check window.open.toString = nativeOpen.toString.bind(nativeOpen); } preventWindowOpen$1.names = ['prevent-window-open', + // aliases are needed for matching the related scriptlet converted into our syntax 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif']; - preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith$1, endsWith, substringBefore, substringAfter$1]; + preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, substringBefore, substringAfter$1]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-current-inline-script + * + * @description + * Aborts an inline script when it attempts to **read** or **write to** the specified property + * AND when the contents of the ` + * ``` + * + * 1. Aborts inline scripts which are trying to access `window.alert` and match regexp `/Hello.+world/` + * + * ```adblock + * example.org#%#//scriptlet('abort-current-inline-script', 'alert', '/Hello.+world/') + * ``` + * + * For instance, the following scripts will be aborted: + * + * ```html + * + * ``` + * + * ```html + * + * ``` + * + * And this script will not be aborted: + * + * ```html + * + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function abortCurrentInlineScript$1(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const SRC_DATA_MARKER = 'data:text/javascript;base64,'; - const getCurrentScript = function getCurrentScript() { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var SRC_DATA_MARKER = 'data:text/javascript;base64,'; + var getCurrentScript = function getCurrentScript() { if ('currentScript' in document) { return document.currentScript; } - const scripts = document.getElementsByTagName('script'); + var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); + var ourScript = getCurrentScript(); + var abort = function abort() { + var _scriptEl$src; + var scriptEl = getCurrentScript(); if (!scriptEl) { return; } - let content = scriptEl.textContent; + var content = scriptEl.textContent; + + // We are using Node.prototype.textContent property descriptor + // to get the real script content + // even when document.currentScript.textContent is replaced. + // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; content = textContentGetter.call(scriptEl); - } catch (e) {} - if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith$1(scriptEl.src, SRC_DATA_MARKER)) { - const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); + } catch (e) {} // eslint-disable-line no-empty + + // https://github.com/AdguardTeam/Scriptlets/issues/130 + if (content.length === 0 && typeof scriptEl.src !== 'undefined' && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) { + var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); content = window.atob(encodedContent); } if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { @@ -34183,21 +35607,27 @@ var scriptlets_umd = {exports: {}}; throw new ReferenceError(rid); } }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; + + // The scriptlet might be executed before the chain property has been created + // (for instance, document.body before the HTML body was loaded). + // In this case we're checking whether the base element exists or not + // and if not, we simply exit without overriding anything. + // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 if (base instanceof Object === false && base === null) { - const props = property.split('.'); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + var props = property.split('.'); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); logMessage(source, message); return; } if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -34211,13 +35641,13 @@ var scriptlets_umd = {exports: {}}; }); return; } - let currentValue = base[prop]; - let origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var currentValue = base[prop]; + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { currentValue = base[prop]; origDescriptor = undefined; } - const descriptorWrapper = Object.assign(getDescriptorAddon(), { + var descriptorWrapper = Object.assign(getDescriptorAddon(), { currentValue, get() { if (!this.isAbortingSuspended) { @@ -34240,6 +35670,7 @@ var scriptlets_umd = {exports: {}}; } }); setPropertyAccess(base, prop, { + // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values get() { return descriptorWrapper.get.call(descriptorWrapper); }, @@ -34252,17 +35683,141 @@ var scriptlets_umd = {exports: {}}; window.onerror = createOnErrorHandler(rid).bind(); } abortCurrentInlineScript$1.names = ['abort-current-inline-script', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js', + // "ubo"-aliases with no "js"-ending 'ubo-abort-current-script', 'ubo-acs', + // obsolete but supported aliases 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script']; - abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith$1, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; - function setConstant$1(source, property, value, stack) { + abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-constant + * + * @description + * Creates a constant property and assigns it one of the values from the predefined list. + * + * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type. + * + * > If empty object is present in chain it will be trapped until chain leftovers appear. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#set-constantjs- + * + * Related ABP snippet: + * https://github.com/adblockplus/adblockpluscore/blob/adblockpluschrome-3.9.4/lib/content/snippets.js#L1361 + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-constant', property, value[, stack]) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`. + * - `value` — required. Possible values: + * - positive decimal integer `<= 32767` + * - one of the predefined constants: + * - `undefined` + * - `false` + * - `true` + * - `null` + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `noopFunc` — function with empty body + * - `noopCallbackFunc` — function returning noopFunc + * - `trueFunc` — function returning true + * - `falseFunc` — function returning false + * - `throwFunc` — function throwing an error + * - `noopPromiseResolve` — function returning Promise object that is resolved with an empty response + * - `noopPromiseReject` — function returning Promise.reject() + * - `''` — empty string + * - `-1` — number value `-1` + * - `yes` + * - `no` + * - `stack` — string or regular expression that must match the current function call stack trace, + * defaults to matching every call; if regular expression is invalid, it will be skipped + * - `valueWrapper` – optional, string to modify a value to be set. Possible wrappers: + * - `asFunction` – function returning value + * - `asCallback` – function returning callback, that would return value + * - `asResolved` – Promise that would resolve with value + * - `asRejected` – Promise that would reject with value + * + * ### Examples + * + * ```adblock + * ! Any access to `window.first` will return `false` + * example.org#%#//scriptlet('set-constant', 'first', 'false') + * + * ✔ window.first === false + * ``` + * + * ```adblock + * ! Any call to `window.second()` will return `true` + * example.org#%#//scriptlet('set-constant', 'second', 'trueFunc') + * + * ✔ window.second() === true + * ✔ window.second.toString() === "function trueFunc() {return true;}" + * ``` + * + * ```adblock + * ! Any call to `document.third()` will return `true` if the method is related to `checking.js` + * example.org#%#//scriptlet('set-constant', 'document.third', 'trueFunc', 'checking.js') + * + * ✔ document.third() === true // if the condition described above is met + * ``` + * + * ```adblock + * ! Any call to `document.fourth()` will return `yes` + * example.org#%#//scriptlet('set-constant', 'document.fourth', 'yes', '', 'asFunction') + * + * ✔ document.fourth() === 'yes' + * ``` + * + * ```adblock + * ! Any call to `document.fifth()` will return `yes` + * example.org#%#//scriptlet('set-constant', 'document.fifth', '42', '', 'asRejected') + * + * ✔ document.fifth.catch((reason) => reason === 42) // promise rejects with specified number + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ + function setConstant$1(source, property, value) { + var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; + var uboAliases = ['set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set']; + + /** + * UBO set-constant analog has it's own args sequence: + * (property, value, defer | wrapper) + * 'defer' – a stringified number, which defines execution time, or + * 'wrapper' - string which defines value wrapper name + * + * joysound.com##+js(set, document.body.oncopy, null, 3) + * kompetent.de##+js(set, Object.keys, 42, asFunction) + */ + if (uboAliases.includes(source.name)) { + /** + * Check that third argument was intended as 'valueWrapper' argument, + * by excluding 'defer' single digits case, and move it to 'valueWrapper' + */ + if (stack.length !== 1 && !getNumberFromString(stack)) { + valueWrapper = stack; + } + /** + * ubo doesn't support 'stack', while adg doesn't support 'defer' + * that goes in the same spot, so we discard it + */ + stack = undefined; + } if (!property || !matchStackTrace(stack, new Error().stack)) { return; } - const emptyArr = noopArray(); - const emptyObj = noopObject(); - let constantValue; + var emptyArr = noopArray(); + var emptyObj = noopObject(); + var constantValue; if (value === 'undefined') { constantValue = undefined; } else if (value === 'false') { @@ -34308,23 +35863,62 @@ var scriptlets_umd = {exports: {}}; } else { return; } - let canceled = false; - const mustCancel = function mustCancel(value) { + var valueWrapperNames = ['asFunction', 'asCallback', 'asResolved', 'asRejected']; + if (valueWrapperNames.includes(valueWrapper)) { + var valueWrappersMap = { + asFunction(v) { + return function () { + return v; + }; + }, + asCallback(v) { + return function () { + return function () { + return v; + }; + }; + }, + asResolved(v) { + return Promise.resolve(v); + }, + asRejected(v) { + return Promise.reject(v); + } + }; + constantValue = valueWrappersMap[valueWrapper](constantValue); + } + var canceled = false; + var mustCancel = function mustCancel(value) { if (canceled) { return canceled; } canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; return canceled; }; - const trapProp = function trapProp(base, prop, configurable, handler) { + + /** + * Safely sets property on a given object + * + * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} base arbitrary reachable object + * @param {string} prop property name + * @param {boolean} configurable if set property should be configurable + * @param {object} handler custom property descriptor object + * @returns {boolean} true if prop was trapped successfully + */ + var trapProp = function trapProp(base, prop, configurable, handler) { if (!handler.init(base[prop])) { return false; } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + // This is required to prevent scriptlets overwrite each over if (origDescriptor instanceof Object) { + // This check is required to avoid defining non-configurable props if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); + var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } @@ -34347,12 +35941,27 @@ var scriptlets_umd = {exports: {}}; }); return true; }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, + + /** + * Traverses given chain to set constant value to its end prop + * Chains that yet include non-object values (e.g null) are valid and will be + * traversed when appropriate chain member is set by an external script + * + * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} owner object that owns chain + * @param {string} property chain of owner properties + */ + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; - const inChainPropHandler = { + + // Handler method init is used to keep track of factual value + // and apply mustCancel() check only on end prop + var inChainPropHandler = { factValue: undefined, init(a) { this.factValue = a; @@ -34362,6 +35971,7 @@ var scriptlets_umd = {exports: {}}; return this.factValue; }, set(a) { + // Prevent breakage due to loop assignments like win.obj = win.obj if (this.factValue === a) { return; } @@ -34371,7 +35981,7 @@ var scriptlets_umd = {exports: {}}; } } }; - const endPropHandler = { + var endPropHandler = { init(a) { if (mustCancel(a)) { return false; @@ -34388,40 +35998,100 @@ var scriptlets_umd = {exports: {}}; constantValue = a; } }; + + // End prop case if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); + var isTrapped = trapProp(base, prop, false, endPropHandler); if (isTrapped) { hit(source); } return; } + + // Null prop in chain if (base !== undefined && base[prop] === null) { trapProp(base, prop, true, inChainPropHandler); return; } + + // Empty object prop in chain if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { trapProp(base, prop, true, inChainPropHandler); } - const propValue = owner[prop]; + + // Defined prop in chain + var propValue = owner[prop]; if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { setChainPropAccess(propValue, chain); } + + // Undefined prop in chain trapProp(base, prop, true, inChainPropHandler); }; setChainPropAccess(window, property); } setConstant$1.names = ['set-constant', + // aliases are needed for matching the related scriptlet converted into our syntax 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read']; - setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest, - shouldAbortInlineOrInjectedScript]; + setConstant$1.injections = [hit, logMessage, getNumberFromString, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, matchStackTrace, nativeIsNaN, isEmptyObject, + // following helpers should be imported and injected + // because they are used by helpers above + shouldAbortInlineOrInjectedScript, getNativeRegexpTest, setPropertyAccess, toRegExp]; + + /* eslint-disable max-len */ + /** + * @scriptlet remove-cookie + * + * @description + * Removes current page cookies by passed string matching with name. For current domain and subdomains. + * Runs on load and before unload. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#cookie-removerjs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/cookie-remover.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-cookie'[, match]) + * ``` + * + * - `match` — optional, string or regex matching the cookie name. + * If not specified all accessible cookies will be removed. + * + * ### Examples + * + * 1. Removes all cookies + * + * ```adblock + * example.org#%#//scriptlet('remove-cookie') + * ``` + * + * 1. Removes cookies which name contains `example` string + * + * ```adblock + * example.org#%#//scriptlet('remove-cookie', 'example') + * ``` + * + * For instance this cookie will be removed: + * + * ```javascript + * document.cookie = '__example=randomValue'; + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function removeCookie$1(source, match) { - const matchRegexp = toRegExp(match); - const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { - const cookieSpec = "".concat(cookieName, "="); - const domain1 = "; domain=".concat(hostName); - const domain2 = "; domain=.".concat(hostName); - const path = '; path=/'; - const expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT'; + var matchRegexp = toRegExp(match); + var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { + var cookieSpec = "".concat(cookieName, "="); + var domain1 = "; domain=".concat(hostName); + var domain2 = "; domain=.".concat(hostName); + var path = '; path=/'; + var expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT'; document.cookie = cookieSpec + expiration; document.cookie = cookieSpec + domain1 + expiration; document.cookie = cookieSpec + domain2 + expiration; @@ -34430,19 +36100,19 @@ var scriptlets_umd = {exports: {}}; document.cookie = cookieSpec + domain2 + path + expiration; hit(source); }; - const rmCookie = function rmCookie() { + var rmCookie = function rmCookie() { document.cookie.split(';').forEach(function (cookieStr) { - const pos = cookieStr.indexOf('='); + var pos = cookieStr.indexOf('='); if (pos === -1) { return; } - const cookieName = cookieStr.slice(0, pos).trim(); + var cookieName = cookieStr.slice(0, pos).trim(); if (!matchRegexp.test(cookieName)) { return; } - const hostParts = document.location.hostname.split('.'); - for (let i = 0; i <= hostParts.length - 1; i += 1) { - const hostName = hostParts.slice(i).join('.'); + var hostParts = document.location.hostname.split('.'); + for (var i = 0; i <= hostParts.length - 1; i += 1) { + var hostName = hostParts.slice(i).join('.'); if (hostName) { removeCookieFromHost(cookieName, hostName); } @@ -34453,15 +36123,63 @@ var scriptlets_umd = {exports: {}}; window.addEventListener('beforeunload', rmCookie); } removeCookie$1.names = ['remove-cookie', + // aliases are needed for matching the related scriptlet converted into our syntax 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover']; removeCookie$1.injections = [toRegExp, hit]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-addEventListener + * + * @description + * Prevents adding event listeners for the specified events and callbacks. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-defuserjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-addEventListener'[, typeSearch[, listenerSearch]]) + * ``` + * + * - `typeSearch` — optional, string or regular expression matching the type (event name); + * defaults to match all types; invalid regular expression will cause exit and rule will not work + * - `listenerSearch` — optional, string or regular expression matching the listener function body; + * defaults to match all listeners; invalid regular expression will cause exit and rule will not work + * + * ### Examples + * + * 1. Prevent all `click` listeners + * + * ```adblock + * example.org#%#//scriptlet('prevent-addEventListener', 'click') + * ``` + * + * 1. Prevent 'click' listeners with the callback body containing `searchString` + * + * ```adblock + * example.org#%#//scriptlet('prevent-addEventListener', 'click', 'searchString') + * ``` + * + * For instance, this listener will not be called: + * + * ```javascript + * el.addEventListener('click', () => { + * window.test = 'searchString'; + * }); + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function preventAddEventListener$1(source, typeSearch, listenerSearch) { - const typeSearchRegexp = toRegExp(typeSearch); - const listenerSearchRegexp = toRegExp(listenerSearch); - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; + var typeSearchRegexp = toRegExp(typeSearch); + var listenerSearchRegexp = toRegExp(listenerSearch); + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { var _this$constructor; - let shouldPrevent = false; + var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); } @@ -34469,7 +36187,10 @@ var scriptlets_umd = {exports: {}}; hit(source); return undefined; } - let context = this; + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { context = window; } @@ -34478,24 +36199,50 @@ var scriptlets_umd = {exports: {}}; } return nativeAddEventListener.apply(context, [type, listener, ...args]); } - const descriptor = { + var descriptor = { configurable: true, set: function set() {}, get: function get() { return addEventListenerWrapper; } }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 + // https://github.com/AdguardTeam/Scriptlets/issues/143 Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); Object.defineProperty(window, 'addEventListener', descriptor); Object.defineProperty(document, 'addEventListener', descriptor); } preventAddEventListener$1.names = ['prevent-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld']; preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString]; + + /* eslint-disable consistent-return, no-eval */ + + /** + * @scriptlet prevent-bab + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#bab-defuserjs- + * + * It also can be used as `$redirect` sometimes. + * See [redirect description](../wiki/about-redirects.md#prevent-bab). + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-bab') + * ``` + * + * @added v1.0.4. + */ function preventBab$2(source) { - const nativeSetTimeout = window.setTimeout; - const babRegex = /\.bab_elementid.$/; - const timeoutWrapper = function timeoutWrapper(callback) { + var nativeSetTimeout = window.setTimeout; + var babRegex = /\.bab_elementid.$/; + var timeoutWrapper = function timeoutWrapper(callback) { if (typeof callback !== 'string' || !babRegex.test(callback)) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; @@ -34505,17 +36252,17 @@ var scriptlets_umd = {exports: {}}; hit(source); }; window.setTimeout = timeoutWrapper; - const signatures = [['blockadblock'], ['babasbm'], [/getItem\('babn'\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']]; - const check = function check(str) { + var signatures = [['blockadblock'], ['babasbm'], [/getItem\('babn'\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']]; + var check = function check(str) { if (typeof str !== 'string') { return false; } - for (let i = 0; i < signatures.length; i += 1) { - const tokens = signatures[i]; - let match = 0; - for (let j = 0; j < tokens.length; j += 1) { - const token = tokens[j]; - const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; + for (var i = 0; i < signatures.length; i += 1) { + var tokens = signatures[i]; + var match = 0; + for (var j = 0; j < tokens.length; j += 1) { + var token = tokens[j]; + var found = token instanceof RegExp ? token.test(str) : str.includes(token); if (found) { match += 1; } @@ -34526,17 +36273,17 @@ var scriptlets_umd = {exports: {}}; } return false; }; - const nativeEval = window.eval; - const evalWrapper = function evalWrapper(str) { + var nativeEval = window.eval; + var evalWrapper = function evalWrapper(str) { if (!check(str)) { return nativeEval(str); } hit(source); - const bodyEl = document.body; + var bodyEl = document.body; if (bodyEl) { bodyEl.style.removeProperty('visibility'); } - const el = document.getElementById('babasbmsgx'); + var el = document.getElementById('babasbmsgx'); if (el) { el.parentNode.removeChild(el); } @@ -34544,10 +36291,35 @@ var scriptlets_umd = {exports: {}}; window.eval = evalWrapper.bind(window); } preventBab$2.names = ['prevent-bab' + // there is no aliases for this scriptlet ]; + preventBab$2.injections = [hit]; + + /* eslint-disable no-unused-vars, no-extra-bind, func-names */ + + /* eslint-disable max-len */ + /** + * @scriptlet nowebrtc + * + * @description + * Disables WebRTC by overriding `RTCPeerConnection`. + * The overridden function will log every attempt to create a new connection. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#nowebrtcjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('nowebrtc') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function nowebrtc$1(source) { - let propertyName = ''; + var propertyName = ''; if (window.RTCPeerConnection) { propertyName = 'RTCPeerConnection'; } else if (window.webkitRTCPeerConnection) { @@ -34556,8 +36328,9 @@ var scriptlets_umd = {exports: {}}; if (propertyName === '') { return; } - const rtcReplacement = function rtcReplacement(config) { - const message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); + var rtcReplacement = function rtcReplacement(config) { + // eslint-disable-next-line max-len + var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); logMessage(source, message); hit(source); }; @@ -34567,7 +36340,7 @@ var scriptlets_umd = {exports: {}}; createOffer: noopFunc, setRemoteDescription: noopFunc }; - const rtc = window[propertyName]; + var rtc = window[propertyName]; window[propertyName] = rtcReplacement; if (rtc.prototype) { rtc.prototype.createDataChannel = function (a, b) { @@ -34579,20 +36352,44 @@ var scriptlets_umd = {exports: {}}; } } nowebrtc$1.names = ['nowebrtc', + // aliases are needed for matching the related scriptlet converted into our syntax 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc']; nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString]; + + /** + * @scriptlet log-addEventListener + * + * @description + * Logs all addEventListener calls to the console. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-loggerjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('log-addEventListener') + * ``` + * + * @added v1.0.4. + */ function logAddEventListener$1(source) { - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { var _this$constructor; if (validateType(type) && validateListener(listener)) { - const message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); + var message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); logMessage(source, message, true); hit(source); + } else { + // logging while debugging + var _message = "Invalid event type or listener passed to addEventListener:\n type: ".concat(convertTypeToString(type), "\n listener: ").concat(convertTypeToString(listener)); + logMessage(source, _message, true); } - const message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); - logMessage(source, message, true); - let context = this; + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { context = window; } @@ -34601,29 +36398,52 @@ var scriptlets_umd = {exports: {}}; } return nativeAddEventListener.apply(context, [type, listener, ...args]); } - const descriptor = { + var descriptor = { configurable: true, set: function set() {}, get: function get() { return addEventListenerWrapper; } }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 + // https://github.com/AdguardTeam/Scriptlets/issues/143 Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); Object.defineProperty(window, 'addEventListener', descriptor); Object.defineProperty(document, 'addEventListener', descriptor); } logAddEventListener$1.names = ['log-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell']; - logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject, getObjectEntries]; + logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject]; + + /* eslint-disable no-eval */ + + /** + * @scriptlet log-eval + * + * @description + * Logs all `eval()` or `new Function()` calls to the console. + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('log-eval') + * ``` + * + * @added v1.0.4. + */ function logEval$1(source) { - const nativeEval = window.eval; + // wrap eval function + var nativeEval = window.eval; function evalWrapper(str) { hit(source); logMessage(source, "eval(\"".concat(str, "\")"), true); return nativeEval(str); } window.eval = evalWrapper; - const nativeFunction = window.Function; + + // wrap new Function + var nativeFunction = window.Function; function FunctionWrapper() { hit(source); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { @@ -34638,13 +36458,54 @@ var scriptlets_umd = {exports: {}}; } logEval$1.names = ['log-eval']; logEval$1.injections = [hit, logMessage]; + + /** + * @scriptlet log + * + * @description + * A simple scriptlet which only purpose is to print arguments to console. + * This scriptlet can be helpful for debugging and troubleshooting other scriptlets. + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('log', 'arg1', 'arg2') + * ``` + * + * @added v1.0.4. + */ function log$1() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - console.log(args); + console.log(args); // eslint-disable-line no-console } + log$1.names = ['log']; + + /* eslint-disable no-eval, no-extra-bind */ + + /** + * @scriptlet noeval + * + * @description + * Prevents page to use eval. + * Notifies about attempts in the console + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#noevaljs- + * + * It also can be used as `$redirect` rules sometimes. + * See [redirect description](../wiki/about-redirects.md#noeval). + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('noeval') + * ``` + * + * @added v1.0.4. + */ function noeval$1(source) { window.eval = function evalWrapper(s) { hit(source); @@ -34652,11 +36513,44 @@ var scriptlets_umd = {exports: {}}; }.bind(); } noeval$1.names = ['noeval', + // aliases are needed for matching the related scriptlet converted into our syntax 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval']; noeval$1.injections = [hit, logMessage]; + + /* eslint-disable no-eval, no-extra-bind, func-names */ + + + /** + * @scriptlet prevent-eval-if + * + * @description + * Prevents page to use eval matching payload. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#noeval-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-eval-if'[, search]) + * ``` + * + * - `search` — optional, string or regular expression matching the stringified eval payload; + * defaults to match all stringified eval payloads; + * invalid regular expression will cause exit and rule will not work + * + * ### Examples + * + * ```adblock + * ! Prevents eval if it matches 'test' + * example.org#%#//scriptlet('prevent-eval-if', 'test') + * ``` + * + * @added v1.0.4. + */ function preventEvalIf$1(source, search) { - const searchRegexp = toRegExp(search); - const nativeEval = window.eval; + var searchRegexp = toRegExp(search); + var nativeEval = window.eval; window.eval = function (payload) { if (!searchRegexp.test(payload.toString())) { return nativeEval.call(window, payload); @@ -34666,11 +36560,34 @@ var scriptlets_umd = {exports: {}}; }.bind(window); } preventEvalIf$1.names = ['prevent-eval-if', + // aliases are needed for matching the related scriptlet converted into our syntax 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if']; preventEvalIf$1.injections = [toRegExp, hit]; + + /* eslint-disable func-names, no-multi-assign */ + + /** + * @scriptlet prevent-fab-3.2.0 + * + * @description + * Prevents execution of the FAB script v3.2.0. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#fuckadblockjs-320- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-fab-3.2.0') + * ``` + * + * @added v1.0.4. + */ function preventFab$1(source) { hit(source); - const Fab = function Fab() {}; + + // redefines Fab function for adblock detection + var Fab = function Fab() {}; Fab.prototype.check = noopFunc; Fab.prototype.clearEvent = noopFunc; Fab.prototype.emitEvent = noopFunc; @@ -34690,22 +36607,25 @@ var scriptlets_umd = {exports: {}}; set: noopFunc, get: noopFunc }; - const fab = new Fab(); - const getSetFab = { + var fab = new Fab(); + var getSetFab = { get() { return Fab; }, set() {} }; - const getsetfab = { + var getsetfab = { get() { return fab; }, set() {} }; + + // redefined Fab data properties which if 'FuckAdBlock' variable exists if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) { window.FuckAdBlock = Fab; } else { + // or redefined Fab accessor properties Object.defineProperty(window, 'FuckAdBlock', getSetFab); } if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) { @@ -34735,8 +36655,29 @@ var scriptlets_umd = {exports: {}}; } } preventFab$1.names = ['prevent-fab-3.2.0', + // aliases are needed for matching the related scriptlet converted into our syntax 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab']; preventFab$1.injections = [hit, noopFunc, noopThis]; + + /* eslint-disable func-names, no-multi-assign */ + + /** + * @scriptlet set-popads-dummy + * + * @description + * Sets static properties PopAds and popns. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#popads-dummyjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('set-popads-dummy') + * ``` + * + * @added v1.0.4. + */ function setPopadsDummy$1(source) { delete window.PopAds; delete window.popns; @@ -34756,11 +36697,30 @@ var scriptlets_umd = {exports: {}}; }); } setPopadsDummy$1.names = ['set-popads-dummy', + // aliases are needed for matching the related scriptlet converted into our syntax 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy']; setPopadsDummy$1.injections = [hit]; + + /** + * @scriptlet prevent-popads-net + * + * @description + * Aborts on property write (PopAds, popns), throws reference error with random id. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#popadsnetjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-popads-net') + * ``` + * + * @added v1.0.4. + */ function preventPopadsNet$1(source) { - const rid = randomId(); - const throwError = function throwError() { + var rid = randomId(); + var throwError = function throwError() { throw new ReferenceError(rid); }; delete window.PopAds; @@ -34777,48 +36737,71 @@ var scriptlets_umd = {exports: {}}; hit(source); } preventPopadsNet$1.names = ['prevent-popads-net', + // aliases are needed for matching the related scriptlet converted into our syntax 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net']; preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit]; + + /* eslint-disable func-names */ + + /** + * @scriptlet prevent-adfly + * + * @description + * Prevents anti-adblock scripts on adfly short links. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#adfly-defuserjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('prevent-adfly') + * ``` + * + * @added v1.0.4. + */ function preventAdfly$1(source) { - const isDigit = function isDigit(data) { + var isDigit = function isDigit(data) { return /^\d$/.test(data); }; - const handler = function handler(encodedURL) { - let evenChars = ''; - let oddChars = ''; - for (let i = 0; i < encodedURL.length; i += 1) { + var handler = function handler(encodedURL) { + var evenChars = ''; + var oddChars = ''; + for (var i = 0; i < encodedURL.length; i += 1) { if (i % 2 === 0) { evenChars += encodedURL.charAt(i); } else { oddChars = encodedURL.charAt(i) + oddChars; } } - let data = (evenChars + oddChars).split(''); - for (let i = 0; i < data.length; i += 1) { - if (isDigit(data[i])) { - for (let ii = i + 1; ii < data.length; ii += 1) { + var data = (evenChars + oddChars).split(''); + for (var _i = 0; _i < data.length; _i += 1) { + if (isDigit(data[_i])) { + for (var ii = _i + 1; ii < data.length; ii += 1) { if (isDigit(data[ii])) { - const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10); + // eslint-disable-next-line no-bitwise + var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); if (temp < 10) { - data[i] = temp.toString(); + data[_i] = temp.toString(); } - i = ii; + _i = ii; break; } } } } data = data.join(''); - const decodedURL = window.atob(data).slice(16, -16); + var decodedURL = window.atob(data).slice(16, -16); if (window.stop) { window.stop(); } window.onbeforeunload = null; window.location.href = decodedURL; }; - let val; - let applyHandler = true; - const result = setPropertyAccess(window, 'ysmm', { + var val; + // Do not apply handler more than one time + var applyHandler = true; + var result = setPropertyAccess(window, 'ysmm', { configurable: false, set: function set(value) { if (applyHandler) { @@ -34827,8 +36810,9 @@ var scriptlets_umd = {exports: {}}; if (typeof value === 'string') { handler(value); } - } catch (err) {} + } catch (err) {} // eslint-disable-line no-empty } + val = value; }, get: function get() { @@ -34842,24 +36826,50 @@ var scriptlets_umd = {exports: {}}; } } preventAdfly$1.names = ['prevent-adfly', + // aliases are needed for matching the related scriptlet converted into our syntax 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser']; preventAdfly$1.injections = [setPropertyAccess, hit, logMessage]; + + /* eslint-disable max-len */ + /** + * @scriptlet debug-on-property-read + * + * @description + * This scriptlet is basically the same as [abort-on-property-read](#abort-on-property-read), + * but instead of aborting it starts the debugger. + * + * > It is not allowed for prod versions of filter lists. + * + * ### Examples + * + * ```adblock + * ! Debug script if it tries to access `window.alert` + * example.org#%#//scriptlet('debug-on-property-read', 'alert') + * + * ! or `window.open` + * example.org#%#//scriptlet('debug-on-property-read', 'open') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function debugOnPropertyRead$1(source, property) { if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); - debugger; + debugger; // eslint-disable-line no-debugger }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -34883,22 +36893,44 @@ var scriptlets_umd = {exports: {}}; } debugOnPropertyRead$1.names = ['debug-on-property-read']; debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet debug-on-property-write + * + * @description + * This scriptlet is basically the same as [abort-on-property-write](#abort-on-property-write), + * but instead of aborting it starts the debugger. + * + * > It is not allowed for prod versions of filter lists. + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to write in property `window.test` + * example.org#%#//scriptlet('debug-on-property-write', 'test') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function debugOnPropertyWrite$1(source, property) { if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); - debugger; + debugger; // eslint-disable-line no-debugger }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -34921,47 +36953,81 @@ var scriptlets_umd = {exports: {}}; } debugOnPropertyWrite$1.names = ['debug-on-property-write']; debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet debug-current-inline-script + * + * @description + * This scriptlet is basically the same as [abort-current-inline-script](#abort-current-inline-script), + * but instead of aborting it starts the debugger. + * + * > It is not allowed for prod versions of filter lists. + * + * ### Examples + * + * ```adblock + * ! Aborts script when it tries to access `window.alert` + * example.org#%#//scriptlet('debug-current-inline-script', 'alert') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function debugCurrentInlineScript$1(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const getCurrentScript = function getCurrentScript() { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var getCurrentScript = function getCurrentScript() { if ('currentScript' in document) { return document.currentScript; } - const scripts = document.getElementsByTagName('script'); + var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); + var ourScript = getCurrentScript(); + var abort = function abort() { + var scriptEl = getCurrentScript(); if (!scriptEl) { return; } - let content = scriptEl.textContent; + var content = scriptEl.textContent; + + // We are using Node.prototype.textContent property descriptor + // to get the real script content + // even when document.currentScript.textContent is replaced. + // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; content = textContentGetter.call(scriptEl); - } catch (e) {} + } catch (e) {} // eslint-disable-line no-empty + if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); - debugger; + debugger; // eslint-disable-line no-debugger } }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; + + // The scriptlet might be executed before the chain property has been created + // (for instance, document.body before the HTML body was loaded). + // In this case we're checking whether the base element exists or not + // and if not, we simply exit without overriding anything. + // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 if (base instanceof Object === false && base === null) { - const props = property.split('.'); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + var props = property.split('.'); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); logMessage(message, source.verbose); return; } if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -34975,7 +37041,7 @@ var scriptlets_umd = {exports: {}}; }); return; } - let currentValue = base[prop]; + var currentValue = base[prop]; setPropertyAccess(base, prop, { set: function set(value) { abort(); @@ -34992,8 +37058,78 @@ var scriptlets_umd = {exports: {}}; } debugCurrentInlineScript$1.names = ['debug-current-inline-script']; debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet remove-attr + * + * @description + * Removes the specified attributes from DOM nodes. This scriptlet runs once when the page loads + * and after that periodically in order to DOM tree changes by default, + * or as specified by applying argument. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-attrjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-attr', attrs[, selector, applying]) + * ``` + * + * - `attrs` — required, attribute or list of attributes joined by '|' + * - `selector` — optional, CSS selector, specifies DOM nodes from which the attributes will be removed + * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, + * defaults to 'asap stay'; possible flags: + * - `asap` — runs as fast as possible **once** + * - `complete` — runs **once** after the whole page has been loaded + * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes + * + * ### Examples + * + * 1. Removes by attribute + * + * ```adblock + * example.org#%#//scriptlet('remove-attr', 'example|test') + * ``` + * + * ```html + * + *
Some text
+ * + * + *
Some text
+ * ``` + * + * 1. Removes with specified selector + * + * ```adblock + * example.org#%#//scriptlet('remove-attr', 'example', 'div[class="inner"]') + * ``` + * + * ```html + * + *
+ *
Some text
+ *
+ * + * + *
+ *
Some text
+ *
+ * ``` + * + * 1. Using flags + * + * ```adblock + * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function removeAttr$1(source, attrs, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; if (!attrs) { return; } @@ -35001,14 +37137,14 @@ var scriptlets_umd = {exports: {}}; if (!selector) { selector = "[".concat(attrs.join('],['), "]"); } - const rmattr = function rmattr() { - let nodes = []; + var rmattr = function rmattr() { + var nodes = []; try { nodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - let removed = false; + var removed = false; nodes.forEach(function (node) { attrs.forEach(function (attr) { node.removeAttribute(attr); @@ -35019,15 +37155,19 @@ var scriptlets_umd = {exports: {}}; hit(source); } }; - const flags = parseFlags(applying); - const run = function run() { + var flags = parseFlags(applying); + var run = function run() { rmattr(); if (!flags.hasFlag(flags.STAY)) { return; } + // 'true' for observing attributes observeDOMChanges(rmattr, true); }; if (flags.hasFlag(flags.ASAP)) { + // https://github.com/AdguardTeam/Scriptlets/issues/245 + // Call rmattr on DOM content loaded + // to ensure that target node is present on the page if (document.readyState === 'loading') { window.addEventListener('DOMContentLoaded', rmattr, { once: true @@ -35041,28 +37181,118 @@ var scriptlets_umd = {exports: {}}; once: true }); } else if (flags.hasFlag(flags.STAY)) { - if (!applying.indexOf(' ') !== -1) { + // Only call rmattr for single 'stay' flag + if (!applying.includes(' ')) { rmattr(); } + // 'true' for observing attributes observeDOMChanges(rmattr, true); } } removeAttr$1.names = ['remove-attr', + // aliases are needed for matching the related scriptlet converted into our syntax 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra']; removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage, + // following helpers should be imported and injected + // because they are used by helpers above throttle]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-attr + * + * @description + * Sets the specified attribute on the specified elements. This scriptlet runs once when the page loads + * and after that and after that on DOM tree changes. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-attr', selector, attr[, value]) + * ``` + * + * - `selector` — required, CSS selector, specifies DOM nodes to set attributes on + * - `attr` — required, attribute to be set + * - `value` — the value to assign to the attribute, defaults to ''. Possible values: + * - `''` — empty string + * - positive decimal integer `<= 32767` + * - `true` / `false` in any case variation + * + * ### Examples + * + * 1. Set attribute by selector + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', '0') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * 1. Set attribute without value + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * 1. Set attribute value to `TRUE` + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'TRUE') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * 1. Set attribute value to `fAlse` + * + * ```adblock + * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'fAlse') + * ``` + * + * ```html + * + * Some text + * + * + * Some text + * ``` + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ function setAttr$1(source, selector, attr) { - let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; if (!selector || !attr) { return; } - const allowedValues = ['true', 'false']; + var allowedValues = ['true', 'false']; + + // Drop strings that cant be parsed into number, negative numbers and numbers below 32767 if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) { return; } - const setAttr = function setAttr() { - const nodes = [].slice.call(document.querySelectorAll(selector)); - let set = false; + var setAttr = function setAttr() { + var nodes = [].slice.call(document.querySelectorAll(selector)); + var set = false; nodes.forEach(function (node) { node.setAttribute(attr, value); set = true; @@ -35076,23 +37306,100 @@ var scriptlets_umd = {exports: {}}; } setAttr$1.names = ['set-attr']; setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN, + // following helpers should be imported and injected + // because they are used by helpers above throttle]; + + /* eslint-disable max-len */ + /** + * @scriptlet remove-class + * + * @description + * Removes the specified classes from DOM nodes. This scriptlet runs once after the page loads + * and after that periodically in order to DOM tree changes. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-classjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-class', classes[, selector, applying]) + * ``` + * + * - `classes` — required, class or list of classes separated by '|' + * - `selector` — optional, CSS selector, specifies DOM nodes from which the classes will be removed. + * If there is no `selector`, each class of `classes` independently will be removed from all nodes which has one + * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, + * defaults to 'asap stay'; possible flags: + * - `asap` — runs as fast as possible **once** + * - `complete` — runs **once** after the whole page has been loaded + * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes + * + * ### Examples + * + * 1. Removes by classes + * + * ```adblock + * example.org#%#//scriptlet('remove-class', 'example|test') + * ``` + * + * ```html + * + *
Some text
+ *
Some text
+ *
Some text
+ * + * + *
Some text
+ *
Some text
+ *
Some text
+ * ``` + * + * 1. Removes with specified selector + * + * ```adblock + * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]') + * ``` + * + * ```html + * + *
+ *
Some text
+ *
+ * + * + *
+ *
Some text
+ *
+ * ``` + * + * 1. Using flags + * + * ```adblock + * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]', 'asap complete') + * ``` + * + * @added v1.1.1. + */ + /* eslint-enable max-len */ + function removeClass$1(source, classNames, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; if (!classNames) { return; } classNames = classNames.split(/\s*\|\s*/); - let selectors = []; + var selectors = []; if (!selector) { selectors = classNames.map(function (className) { return ".".concat(className); }); } - const removeClassHandler = function removeClassHandler() { - const nodes = new Set(); + var removeClassHandler = function removeClassHandler() { + var nodes = new Set(); if (selector) { - let foundNodes = []; + var foundNodes = []; try { foundNodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { @@ -35103,14 +37410,14 @@ var scriptlets_umd = {exports: {}}; }); } else if (selectors.length > 0) { selectors.forEach(function (s) { - const elements = document.querySelectorAll(s); - for (let i = 0; i < elements.length; i += 1) { - const element = elements[i]; + var elements = document.querySelectorAll(s); + for (var i = 0; i < elements.length; i += 1) { + var element = elements[i]; nodes.add(element); } }); } - let removed = false; + var removed = false; nodes.forEach(function (node) { classNames.forEach(function (className) { if (node.classList.contains(className)) { @@ -35123,16 +37430,21 @@ var scriptlets_umd = {exports: {}}; hit(source); } }; - const CLASS_ATTR_NAME = ['class']; - const flags = parseFlags(applying); - const run = function run() { + var CLASS_ATTR_NAME = ['class']; + var flags = parseFlags(applying); + var run = function run() { removeClassHandler(); if (!flags.hasFlag(flags.STAY)) { return; } + // 'true' for observing attributes + // 'class' for observing only classes observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); }; if (flags.hasFlag(flags.ASAP)) { + // https://github.com/AdguardTeam/Scriptlets/issues/245 + // Call removeClassHandler on DOM content loaded + // to ensure that target node is present on the page if (document.readyState === 'loading') { window.addEventListener('DOMContentLoaded', removeClassHandler, { once: true @@ -35146,19 +37458,41 @@ var scriptlets_umd = {exports: {}}; once: true }); } else if (flags.hasFlag(flags.STAY)) { - if (!applying.indexOf(' ') !== -1) { + // Only call removeClassHandler for single 'stay' flag + if (!applying.includes(' ')) { removeClassHandler(); } observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); } } removeClass$1.names = ['remove-class', + // aliases are needed for matching the related scriptlet converted into our syntax 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc']; removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags, + // following helpers should be imported and injected + // because they are used by helpers above throttle]; + + /** + * @scriptlet disable-newtab-links + * + * @description + * Prevents opening new tabs and windows if there is `target` attribute in element. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#disable-newtab-linksjs- + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('disable-newtab-links') + * ``` + * + * @added v1.0.4. + */ function disableNewtabLinks$1(source) { document.addEventListener('click', function (ev) { - let target = ev.target; + var target = ev.target; while (target !== null) { if (target.localName === 'a' && target.hasAttribute('target')) { ev.stopPropagation(); @@ -35171,14 +37505,87 @@ var scriptlets_umd = {exports: {}}; }); } disableNewtabLinks$1.names = ['disable-newtab-links', + // aliases are needed for matching the related scriptlet converted into our syntax 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links']; disableNewtabLinks$1.injections = [hit]; + + /* eslint-disable max-len */ + /** + * @scriptlet adjust-setInterval + * + * @description + * Adjusts delay for specified setInterval() callbacks. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-setinterval-boosterjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('adjust-setInterval'[, matchCallback [, matchDelay[, boost]]]) + * ``` + * + * - `matchCallback` — optional, string or regular expression for stringified callback matching; + * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work + * - `matchDelay` — optional, defaults to 1000, matching setInterval delay; decimal integer OR '*' for any delay + * - `boost` — optional, default to 0.05, float, + * capped at 1000 times for up and 50 for down (0.001...50), setInterval delay multiplier + * + * ### Examples + * + * 1. Adjust all setInterval() x20 times where delay equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval') + * ``` + * + * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', 'example') + * ``` + * + * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 400ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', 'example', '400') + * ``` + * + * 1. Slow down setInterval() x2 times where callback matched with `example` and delay equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', 'example', '', '2') + * ``` + * + * 1. Adjust all setInterval() x50 times where delay equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.02') + * ``` + * + * 1. Adjust all setInterval() x1000 times where delay equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.001') + * ``` + * + * 1. Adjust all setInterval() x50 times where delay is randomized + * + * ```adblock + * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function adjustSetInterval$1(source, matchCallback, matchDelay, boost) { - const nativeSetInterval = window.setInterval; - const matchRegexp = toRegExp(matchCallback); - const intervalWrapper = function intervalWrapper(callback, delay) { + var nativeSetInterval = window.setInterval; + var matchRegexp = toRegExp(matchCallback); + var intervalWrapper = function intervalWrapper(callback, delay) { + // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + // eslint-disable-next-line max-len + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); @@ -35192,15 +37599,89 @@ var scriptlets_umd = {exports: {}}; window.setInterval = intervalWrapper; } adjustSetInterval$1.names = ['adjust-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib']; adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet adjust-setTimeout + * + * @description + * Adjusts delay for specified setTimeout() callbacks. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-settimeout-boosterjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('adjust-setTimeout'[, matchCallback [, matchDelay[, boost]]]) + * ``` + * + * - `matchCallback` — optional, string or regular expression for stringified callback matching; + * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work + * - `matchDelay` — optional, defaults to 1000, matching setTimeout delay; decimal integer OR '*' for any delay + * - `boost` — optional, default to 0.05, float, + * capped at 1000 times for up and 50 for down (0.001...50), setTimeout delay multiplier + * + * ### Examples + * + * 1. Adjust all setTimeout() x20 times where timeout equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout') + * ``` + * + * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'example') + * ``` + * + * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 400ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'example', '400') + * ``` + * + * 1. Slow down setTimeout() x2 times where callback matched with `example` and timeout equal 1000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'example', '', '2') + * ``` + * + * 1. Adjust all setTimeout() x50 times where timeout equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.02') + * ``` + * + * 1. Adjust all setTimeout() x1000 times where timeout equal 2000ms + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.001') + * ``` + * + * 1. Adjust all setTimeout() x20 times where callback matched with `test` and timeout is randomized + * + * ```adblock + * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) { - const nativeSetTimeout = window.setTimeout; - const matchRegexp = toRegExp(matchCallback); - const timeoutWrapper = function timeoutWrapper(callback, delay) { + var nativeSetTimeout = window.setTimeout; + var matchRegexp = toRegExp(matchCallback); + var timeoutWrapper = function timeoutWrapper(callback, delay) { + // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + // eslint-disable-next-line max-len + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); @@ -35214,11 +37695,43 @@ var scriptlets_umd = {exports: {}}; window.setTimeout = timeoutWrapper; } adjustSetTimeout$1.names = ['adjust-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb']; adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; + + /* eslint-disable max-len */ + /** + * @scriptlet dir-string + * + * @description + * Wraps the `console.dir` API to call the `toString` method of the argument. + * There are several adblock circumvention systems that detect browser devtools + * and hide themselves. Therefore, if we force them to think + * that devtools are open (using this scriptlet), + * it will automatically disable the adblock circumvention script. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('dir-string'[, times]) + * ``` + * + * - `times` — optional, the number of times to call the `toString` method of the argument to `console.dir` + * + * ### Examples + * + * ```adblock + * ! Run 2 times + * example.org#%#//scriptlet('dir-string', '2') + * ``` + * + * @added v1.0.4. + */ + /* eslint-enable max-len */ function dirString$1(source, times) { - const _console = console, + var _console = console, dir = _console.dir; function dirWrapper(object) { if (typeof dir === 'function') { @@ -35226,110 +37739,231 @@ var scriptlets_umd = {exports: {}}; } hit(source); } + // eslint-disable-next-line no-console console.dir = dirWrapper; } - dirString$1.names = ['dir-string', 'abp-dir-string']; + dirString$1.names = ['dir-string']; dirString$1.injections = [hit]; - function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) { - if (!!stack && !matchStackTrace(stack, new Error().stack)) { - return; - } - const prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; - const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { - if (!root) { - return false; - } - let shouldProcess; - if (prunePaths.length === 0 && requiredPaths.length > 0) { - const rootString = JSON.stringify(root); - const matchRegex = toRegExp(requiredPaths.join('')); - const shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === 'object') { - logMessage(source, root, true, false); - } - shouldProcess = false; - return shouldProcess; - } - } - for (let i = 0; i < requiredPaths.length; i += 1) { - const requiredPath = requiredPaths[i]; - const lastNestedPropName = requiredPath.split('.').pop(); - const hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1; - const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); - shouldProcess = !hasWildcard; - for (let i = 0; i < details.length; i += 1) { - if (hasWildcard) { - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess; - } else { - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess; - } - } - } - return shouldProcess; + + /* eslint-disable max-len */ + /** + * @scriptlet json-prune + * + * @description + * Removes specified properties from the result of calling JSON.parse and returns the caller. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#json-prunejs- + * + * Related ABP source: + * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/json-prune.js + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('json-prune'[, propsToRemove [, obligatoryProps [, stack]]]) + * ``` + * + * - `propsToRemove` — optional, string of space-separated properties to remove + * - `obligatoryProps` — optional, string of space-separated properties + * which must be all present for the pruning to occur + * - `stack` — optional, string or regular expression that must match the current function call stack trace; + * if regular expression is invalid it will be skipped + * + * > Note please that you can use wildcard `*` for chain property name, + * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`. + * + * ### Examples + * + * 1. Removes property `example` from the results of JSON.parse call + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'example') + * ``` + * + * For instance, the following call will return `{ one: 1}` + * + * ```html + * JSON.parse('{"one":1,"example":true}') + * ``` + * + * 1. If there are no specified properties in the result of JSON.parse call, pruning will NOT occur + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'one', 'obligatoryProp') + * ``` + * + * For instance, the following call will return `{ one: 1, two: 2}` + * + * ```html + * JSON.parse('{"one":1,"two":2}') + * ``` + * + * 1. A property in a list of properties can be a chain of properties + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'a.b', 'ads.url.first') + * ``` + * + * 1. Removes property `content.ad` from the results of JSON.parse call if its error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'content.ad', '', 'test.js') + * ``` + * + * 1. A property in a list of properties can be a chain of properties with wildcard in it + * + * ```adblock + * example.org#%#//scriptlet('json-prune', 'content.*.media.src', 'content.*.media.ad') + * ``` + * + * 1. Call with no arguments will log the current hostname and json payload at the console + * + * ```adblock + * example.org#%#//scriptlet('json-prune') + * ``` + * + * 1. Call with only second argument will log the current hostname and matched json payload at the console + * + * ```adblock + * example.org#%#//scriptlet('json-prune', '', '"id":"117458"') + * ``` + * + * @added v1.1.0. + */ + /* eslint-enable max-len */ + function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) { + if (!!stack && !matchStackTrace(stack, new Error().stack)) { + return; } - const jsonPruner = function jsonPruner(root) { - if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === 'object') { - logMessage(source, root, true, false); - } - return root; - } - try { - if (isPruningNeeded(root) === false) { - return root; - } - prunePaths.forEach(function (path) { - const ownerObjArr = getWildcardPropertyInChain(root, path, true); - ownerObjArr.forEach(function (ownerObj) { - if (ownerObj !== undefined && ownerObj.base) { - delete ownerObj.base[ownerObj.prop]; - hit(source); - } - }); - }); - } catch (e) { - logMessage(source, e); - } - return root; - }; - const nativeJSONParse = JSON.parse; - const jsonParseWrapper = function jsonParseWrapper() { + var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; + var nativeJSONParse = JSON.parse; + var jsonParseWrapper = function jsonParseWrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - const root = nativeJSONParse.apply(JSON, args); - return jsonPruner(root); + // dealing with stringified json in args, which should be parsed. + // so we call nativeJSONParse as JSON.parse which is bound to JSON object + var root = nativeJSONParse.apply(JSON, args); + return jsonPruner(source, root, prunePaths, requiredPaths); }; + + // JSON.parse mocking jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); JSON.parse = jsonParseWrapper; - const nativeResponseJson = Response.prototype.json; - const responseJsonWrapper = function responseJsonWrapper() { - const promise = nativeResponseJson.apply(this); + var nativeResponseJson = Response.prototype.json; + // eslint-disable-next-line func-names + var responseJsonWrapper = function responseJsonWrapper() { + var promise = nativeResponseJson.apply(this); return promise.then(function (obj) { - return jsonPruner(obj); + return jsonPruner(source, obj, prunePaths, requiredPaths); }); }; + + // do nothing if browser does not support Response (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/Response if (typeof Response === 'undefined') { return; } Response.prototype.json = responseJsonWrapper; } jsonPrune$1.names = ['json-prune', + // aliases are needed for matching the related scriptlet converted into our syntax 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune']; - jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, + jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, isPruningNeeded, jsonPruner, + // following helpers are needed for helpers above toRegExp, getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-requestAnimationFrame + * + * @description + * Prevents a `requestAnimationFrame` call + * if the text of the callback is matching the specified search string which does not start with `!`; + * otherwise mismatched calls should be defused. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-requestanimationframe-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-requestAnimationFrame'[, search]) + * ``` + * + * - `search` — optional, string or regular expression; + * invalid regular expression will be skipped and all callbacks will be matched. + * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused. + * If do not start with `!`, the stringified callback will be matched. + * + * > Call with no argument will log all requestAnimationFrame calls, + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Prevents `requestAnimationFrame` calls if the callback matches `/\.test/` + * + * ```adblock + * example.org#%#//scriptlet('prevent-requestAnimationFrame', '/\.test/') + * ``` + * + * For instance, the following call will be prevented: + * + * ```javascript + * var times = 0; + * requestAnimationFrame(function change() { + * window.test = 'new value'; + * if (times < 2) { + * times += 1; + * requestAnimationFrame(change); + * } + * }); + * ``` + * + * 1. Prevents `requestAnimationFrame` calls if **does not match** 'check' + * + * ```adblock + * example.org#%#//scriptlet('prevent-requestAnimationFrame', '!check') + * ``` + * + * For instance, only the first call will be prevented: + * + * ```javascript + * var timesFirst = 0; + * requestAnimationFrame(function changeFirst() { + * window.check = 'should not be prevented'; + * if (timesFirst < 2) { + * timesFirst += 1; + * requestAnimationFrame(changeFirst); + * } + * }); + * + * var timesSecond = 0; + * requestAnimationFrame(function changeSecond() { + * window.second = 'should be prevented'; + * if (timesSecond < 2) { + * timesSecond += 1; + * requestAnimationFrame(changeSecond); + * } + * }); + * ``` + * + * @added v1.1.15. + */ + /* eslint-enable max-len */ + function preventRequestAnimationFrame$1(source, match) { - const nativeRequestAnimationFrame = window.requestAnimationFrame; - const shouldLog = typeof match === 'undefined'; - const _parseMatchArg = parseMatchArg(match), + var nativeRequestAnimationFrame = window.requestAnimationFrame; + + // logs requestAnimationFrame to console if no arguments have been specified + var shouldLog = typeof match === 'undefined'; + var _parseMatchArg = parseMatchArg(match), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchRegexp = _parseMatchArg.matchRegexp; - const rafWrapper = function rafWrapper(callback) { - let shouldPrevent = false; + var rafWrapper = function rafWrapper(callback) { + var shouldPrevent = false; if (shouldLog) { hit(source); logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); @@ -35348,12 +37982,59 @@ var scriptlets_umd = {exports: {}}; window.requestAnimationFrame = rafWrapper; } preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif']; preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage, - escapeRegExp, toRegExp, startsWith$1]; + // following helpers should be injected as helpers above use them + escapeRegExp, toRegExp]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-cookie + * + * @description + * Sets a cookie with the specified name, value, and path. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-cookie', name, value[, path]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value; possible values: + * - number `>= 0 && <= 15` + * - one of the predefined constants in any case variation: + * - `true` + * - `false` + * - `yes` / `y` + * - `no` / `n` + * - `ok` + * - `accept`/ `reject` + * - `allow` / `deny` + * - `path` — optional, cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet encodes cookie names and values, + * > e.g value `"{ test: 'value'}"` becomes `%7B%20test%3A%20'value'%7D`. + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-cookie', 'CookieConsent', '1') + * + * example.org#%#//scriptlet('set-cookie', 'gdpr-settings-cookie', 'true') + * + * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none') + * ``` + * + * @added v1.2.3. + */ + /* eslint-enable max-len */ function setCookie$1(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - const validValue = getLimitedCookieValue(value); + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; + var validValue = getLimitedCookieValue(value); if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; @@ -35362,8 +38043,9 @@ var scriptlets_umd = {exports: {}}; logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); + var cookieToSet = concatCookieNameValuePath(name, validValue, path); if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); return; } hit(source); @@ -35371,12 +38053,57 @@ var scriptlets_umd = {exports: {}}; } setCookie$1.names = ['set-cookie']; setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; + + /** + * @scriptlet set-cookie-reload + * + * @description + * Sets a cookie with the specified name and value, and path, + * and reloads the current page after the cookie setting. + * If reloading option is not needed, use [set-cookie](#set-cookie) scriptlet. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('set-cookie-reload', name, value[, path]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value; possible values: + * - number `>= 0 && <= 15` + * - one of the predefined constants in any case variation: + * - `true` + * - `false` + * - `yes` / `y` + * - `no` / `n` + * - `ok` + * - `accept`/ `reject` + * - `allow` / `deny` + * - `path` — optional, cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet encodes cookie names and values, + * > e.g value `"{ test: 'value'}"` becomes `%7B%20test%3A%20'value'%7D`. + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-cookie-reload', 'checking', 'ok') + * + * example.org#%#//scriptlet('set-cookie-reload', 'gdpr-settings-cookie', '1') + * + * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none') + * ``` + * + * @added v1.3.14. + */ function setCookieReload$1(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; if (isCookieSetWithValue(document.cookie, name, value)) { return; } - const validValue = getLimitedCookieValue(value); + var validValue = getLimitedCookieValue(value); if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; @@ -35385,31 +38112,76 @@ var scriptlets_umd = {exports: {}}; logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); + var cookieToSet = concatCookieNameValuePath(name, validValue, path); if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); return; } document.cookie = cookieToSet; hit(source); + + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } } setCookieReload$1.names = ['set-cookie-reload']; setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; + + /** + * @scriptlet hide-in-shadow-dom + * + * @description + * Hides elements inside open shadow DOM elements. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('hide-in-shadow-dom', selector[, baseSelector]) + * ``` + * + * - `selector` — required, CSS selector of element in shadow-dom to hide + * - `baseSelector` — optional, selector of specific page DOM element, + * narrows down the part of the page DOM where shadow-dom host supposed to be, + * defaults to document.documentElement + * + * > `baseSelector` should match element of the page DOM, but not of shadow DOM. + * + * ### Examples + * + * ```adblock + * ! hides menu bar + * example.com#%#//scriptlet('hide-in-shadow-dom', '.storyAd', '#app') + * + * ! hides floating element + * example.com#%#//scriptlet('hide-in-shadow-dom', '.contact-fab') + * ``` + * + * @added v1.3.0. + */ function hideInShadowDom$1(source, selector, baseSelector) { + // do nothing if browser does not support ShadowRoot + // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot if (!Element.prototype.attachShadow) { return; } - const hideElement = function hideElement(targetElement) { - const DISPLAY_NONE_CSS = 'display:none!important;'; + var hideElement = function hideElement(targetElement) { + var DISPLAY_NONE_CSS = 'display:none!important;'; targetElement.style.cssText = DISPLAY_NONE_CSS; }; - const hideHandler = function hideHandler() { - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { - let isHidden = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), + + /** + * Handles shadow-dom piercing and hiding of found elements + */ + var hideHandler = function hideHandler() { + // start value of shadow-dom hosts for the page dom + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + + // if there is shadow-dom host, they should be explored + var _loop = function _loop() { + var isHidden = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), targets = _pierceShadowDom.targets, innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { @@ -35419,7 +38191,13 @@ var scriptlets_umd = {exports: {}}; if (isHidden) { hit(source); } + + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration hostElements = innerHosts; + }; + while (hostElements.length !== 0) { + _loop(); } }; hideHandler(); @@ -35427,19 +38205,62 @@ var scriptlets_umd = {exports: {}}; } hideInShadowDom$1.names = ['hide-in-shadow-dom']; hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected + // because they are used by helpers above flatten, throttle]; + + /** + * @scriptlet remove-in-shadow-dom + * + * @description + * Removes elements inside open shadow DOM elements. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('remove-in-shadow-dom', selector[, baseSelector]) + * ``` + * + * - `selector` — required, CSS selector of element in shadow-dom to remove + * - `baseSelector` — optional, selector of specific page DOM element, + * narrows down the part of the page DOM where shadow-dom host supposed to be, + * defaults to document.documentElement + * + * > `baseSelector` should match element of the page DOM, but not of shadow DOM. + * + * ### Examples + * + * ```adblock + * ! removes menu bar + * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'iron-pages', 'vt-virustotal-app') + * + * ! removes floating element + * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab') + * ``` + * + * @added v1.3.14. + */ function removeInShadowDom$1(source, selector, baseSelector) { + // do nothing if browser does not support ShadowRoot + // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot if (!Element.prototype.attachShadow) { return; } - const removeElement = function removeElement(targetElement) { + var removeElement = function removeElement(targetElement) { targetElement.remove(); }; - const removeHandler = function removeHandler() { - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { - let isRemoved = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), + + /** + * Handles shadow-dom piercing and removing of found elements + */ + var removeHandler = function removeHandler() { + // start value of shadow-dom hosts for the page dom + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + + // if there is shadow-dom host, they should be explored + var _loop = function _loop() { + var isRemoved = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), targets = _pierceShadowDom.targets, innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { @@ -35449,7 +38270,13 @@ var scriptlets_umd = {exports: {}}; if (isRemoved) { hit(source); } + + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration hostElements = innerHosts; + }; + while (hostElements.length !== 0) { + _loop(); } }; removeHandler(); @@ -35457,28 +38284,131 @@ var scriptlets_umd = {exports: {}}; } removeInShadowDom$1.names = ['remove-in-shadow-dom']; removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected + // because they are used by helpers above flatten, throttle]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-fetch + * + * @description + * Prevents `fetch` calls if **all** given parameters match. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-fetch-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-fetch'[, propsToMatch[, responseBody[, responseType]]]) + * ``` + * + * - `propsToMatch` — optional, string of space-separated properties to match; possible props: + * - string or regular expression for matching the URL passed to fetch call; + * empty string, wildcard `*` or invalid regular expression will match all fetch calls + * - colon-separated pairs `name:value` where + * + * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters) + * - `value` is string or regular expression for matching the value of the option passed to fetch call; + * invalid regular expression will cause any value matching + * - `responseBody` — optional, string for defining response body value, + * defaults to `emptyObj`. Possible values: + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `responseType` — optional, string for defining response type, + * original response type is used if not specified. Possible values: + * - `default` + * - `opaque` + * + * > Usage with no arguments will log fetch calls to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Log all fetch calls + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch') + * ``` + * + * 1. Prevent all fetch calls + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '*') + * ! or + * example.org#%#//scriptlet('prevent-fetch', '') + * ``` + * + * 1. Prevent fetch call for specific url + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '/url\\.part/') + * ``` + * + * 1. Prevent fetch call for specific request method + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', 'method:HEAD') + * ``` + * + * 1. Prevent fetch call for specific url and request method + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/') + * ``` + * + * 1. Prevent fetch call and specify response body value + * + * ```adblock + * ! Specify response body for fetch call to a specific url + * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/', 'emptyArr') + * + * ! Specify response body for all fetch calls + * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr') + * ``` + * + * 1. Prevent all fetch calls and specify response type value + * + * ```adblock + * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque') + * ``` + * + * @added v1.3.18. + */ + /* eslint-enable max-len */ function preventFetch$1(source, propsToMatch) { - let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj'; - let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default'; + var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj'; + var responseType = arguments.length > 3 ? arguments[3] : undefined; + // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; } - let strResponseBody; + var strResponseBody; if (responseBody === '' || responseBody === 'emptyObj') { strResponseBody = '{}'; } else if (responseBody === 'emptyArr') { strResponseBody = '[]'; } else { + logMessage(source, "Invalid responseBody parameter: '".concat(responseBody, "'")); return; } - if (!(responseType === 'default' || responseType === 'opaque')) { - logMessage(source, "Invalid parameter: ".concat(responseType)); + var isResponseTypeSpecified = typeof responseType !== 'undefined'; + var isResponseTypeSupported = function isResponseTypeSupported(responseType) { + var SUPPORTED_TYPES = ['default', 'opaque']; + return SUPPORTED_TYPES.includes(responseType); + }; + // Skip disallowed response types, + // specified responseType has limited list of possible values + if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) { + logMessage(source, "Invalid responseType parameter: '".concat(responseType, "'")); return; } - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - let shouldPrevent = false; - const fetchData = getFetchData(args); + var handlerWrapper = async function handlerWrapper(target, thisArg, args) { + var shouldPrevent = false; + var fetchData = getFetchData(args); if (typeof propsToMatch === 'undefined') { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); @@ -35487,72 +38417,251 @@ var scriptlets_umd = {exports: {}}; shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); if (shouldPrevent) { hit(source); - return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + try { + var origResponse = await Reflect.apply(target, thisArg, args); + // In the case of apps, the blocked request has status 500 + // and no error is thrown, so it's necessary to check response.ok + // https://github.com/AdguardTeam/Scriptlets/issues/334 + if (!origResponse.ok) { + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + } + return modifyResponse(origResponse, { + body: strResponseBody, + type: responseType + }); + } catch (ex) { + // https://github.com/AdguardTeam/Scriptlets/issues/334 + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + } } return Reflect.apply(target, thisArg, args); }; - const fetchHandler = { + var fetchHandler = { apply: handlerWrapper }; - fetch = new Proxy(fetch, fetchHandler); + fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } + preventFetch$1.names = ['prevent-fetch', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if']; - preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; + preventFetch$1.injections = [hit, getFetchData, objectToString, matchRequestProps, logMessage, noopPromiseResolve, modifyResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-local-storage-item + * + * @description + * Adds specified key and its value to localStorage object, or updates the value of the key if it already exists. + * Scriptlet won't set item if storage is full. + * + * To remove item from localStorage use `$remove$` as a value. + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('set-local-storage-item', 'key', 'value') + * ``` + * + * - `key` — required, key name to be set. + * - `value` — required, key value; possible values: + * - positive decimal integer `<= 32767` + * - one of the predefined constants: + * - `undefined` + * - `false` + * - `true` + * - `null` + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `''` — empty string + * - `yes` + * - `no` + * - `$remove$` — remove specific item from localStorage + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-local-storage-item', 'player.live.current.mute', 'false') + * + * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1') + * + * ! Removes the item with key 'foo' from local storage + * example.org#%#//scriptlet('set-local-storage-item', 'foo', '$remove$') + * ``` + * + * @added v1.4.3. + */ + /* eslint-enable max-len */ + function setLocalStorageItem$1(source, key, value) { if (typeof key === 'undefined') { logMessage(source, 'Item key should be specified.'); return; } - let validValue; + var validValue; try { validValue = getLimitedStorageItemValue(value); } catch (_unused) { logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - const _window = window, + var _window = window, localStorage = _window.localStorage; - setStorageItem(source, localStorage, key, validValue); + if (validValue === '$remove$') { + removeStorageItem(source, localStorage, key); + } else { + setStorageItem(source, localStorage, key, validValue); + } hit(source); } setLocalStorageItem$1.names = ['set-local-storage-item']; - setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; + setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue]; + + /* eslint-disable max-len */ + /** + * @scriptlet set-session-storage-item + * + * @description + * Adds specified key and its value to sessionStorage object, or updates the value of the key if it already exists. + * Scriptlet won't set item if storage is full. + * + * To remove item from sessionStorage use `$remove$` as a value. + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('set-session-storage-item', 'key', 'value') + * ``` + * + * - `key` — required, key name to be set. + * - `value` — required, key value; possible values: + * - positive decimal integer `<= 32767` + * - one of the predefined constants: + * - `undefined` + * - `false` + * - `true` + * - `null` + * - `emptyObj` — empty object + * - `emptyArr` — empty array + * - `''` — empty string + * - `yes` + * - `no` + * - `$remove$` — remove specific item from sessionStorage + * + * ### Examples + * + * ```adblock + * example.org#%#//scriptlet('set-session-storage-item', 'player.live.current.mute', 'false') + * + * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1') + * + * ! Removes the item with key 'foo' from session storage + * example.org#%#//scriptlet('set-session-storage-item', 'foo', '$remove$') + * ``` + * + * @added v1.4.3. + */ + /* eslint-enable max-len */ + function setSessionStorageItem$1(source, key, value) { if (typeof key === 'undefined') { logMessage(source, 'Item key should be specified.'); return; } - let validValue; + var validValue; try { validValue = getLimitedStorageItemValue(value); } catch (_unused) { logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - const _window = window, + var _window = window, sessionStorage = _window.sessionStorage; - setStorageItem(source, sessionStorage, key, validValue); + if (validValue === '$remove$') { + removeStorageItem(source, sessionStorage, key); + } else { + setStorageItem(source, sessionStorage, key, validValue); + } hit(source); } setSessionStorageItem$1.names = ['set-session-storage-item']; - setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; + setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue]; + + /* eslint-disable max-len */ + /** + * @scriptlet abort-on-stack-trace + * + * @description + * Aborts a script when it attempts to utilize (read or write to) the specified property + * and it's error stack trace contains given value. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock-for-firefox-legacy/commit/7099186ae54e70b588d5e99554a05d783cabc8ff + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('abort-on-stack-trace', property, stack) + * ``` + * + * - `property` — required, path to a property. The property must be attached to window. + * - `stack` — required, string that must match the current function call stack trace. + * - values to abort inline or injected script, accordingly: + * - `inlineScript` + * - `injectedScript` + * + * ### Examples + * + * 1. Aborts script when it tries to access `window.Ya` and it's error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'test.js') + * ``` + * + * 1. Aborts script when it tries to access `window.Ya.videoAd` and it's error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya.videoAd', 'test.js') + * ``` + * + * 1. Aborts script when stack trace matches with any of these parameters + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexFuncName') + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexScriptName') + * ``` + * + * 1. Aborts script when it tries to access `window.Ya` and it's an inline script + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'inlineScript') + * ``` + * + * 1. Aborts script when it tries to access `window.Ya` and it's an injected script + * + * ```adblock + * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript') + * ``` + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ function abortOnStackTrace$1(source, property, stack) { if (!property || !stack) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -35570,7 +38679,9 @@ var scriptlets_umd = {exports: {}}; logMessage(source, "Invalid parameter: ".concat(stack)); return; } - const descriptorWrapper = Object.assign(getDescriptorAddon(), { + + // Prevent infinite loops when trapping prop used by helpers in getter/setter + var descriptorWrapper = Object.assign(getDescriptorAddon(), { value: base[prop], get() { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { @@ -35586,6 +38697,7 @@ var scriptlets_umd = {exports: {}}; } }); setPropertyAccess(base, prop, { + // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values get() { return descriptorWrapper.get.call(descriptorWrapper); }, @@ -35598,46 +38710,80 @@ var scriptlets_umd = {exports: {}}; window.onerror = createOnErrorHandler(rid).bind(); } abortOnStackTrace$1.names = ['abort-on-stack-trace', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace']; - abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith$1, shouldAbortInlineOrInjectedScript]; + abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; + + /* eslint-disable max-len */ + /** + * @scriptlet log-on-stack-trace + * + * @description + * This scriptlet is basically the same as [abort-on-stack-trace](#abort-on-stack-trace), + * but instead of aborting it logs: + * + * - function and source script names pairs that access the given property + * - was that get or set attempt + * - script being injected or inline + * + * ### Syntax + * + * ```text + * example.com#%#//scriptlet('log-on-stack-trace', 'property') + * ``` + * + * - `property` — required, path to a property. The property must be attached to window. + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ function logOnStacktrace$1(source, property) { if (!property) { return; } - const refineStackTrace = function refineStackTrace(stackString) { - const stackSteps = stackString.split('\n').slice(2).map(function (line) { + var refineStackTrace = function refineStackTrace(stackString) { + // Split stack trace string by lines and remove first two elements ('Error' and getter call) + // Remove ' at ' at the start of each string + var stackSteps = stackString.split('\n').slice(2).map(function (line) { return line.replace(/ {4}at /, ''); }); - const logInfoArray = stackSteps.map(function (line) { - let funcName; - let funcFullPath; - const reg = /\(([^\)]+)\)/; - const regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; + // Trim each line extracting funcName : fullPath pair + var logInfoArray = stackSteps.map(function (line) { + var funcName; + var funcFullPath; + /* eslint-disable-next-line no-useless-escape */ + var reg = /\(([^\)]+)\)/; + var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; if (line.match(reg)) { funcName = line.split(' ').slice(0, -1).join(' '); + /* eslint-disable-next-line prefer-destructuring */ funcFullPath = line.match(reg)[1]; } else if (line.match(regFirefox)) { funcName = line.split('@').slice(0, -1).join(' '); + /* eslint-disable-next-line prefer-destructuring */ funcFullPath = line.match(regFirefox)[2]; } else { + // For when func name is not available funcName = 'function name is not available'; funcFullPath = line; } return [funcName, funcFullPath]; }); - const logInfoObject = {}; + // Convert array into object for better display using console.table + var logInfoObject = {}; logInfoArray.forEach(function (pair) { + /* eslint-disable-next-line prefer-destructuring */ logInfoObject[pair[0]] = pair[1]; }); return logInfoObject; }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -35651,7 +38797,8 @@ var scriptlets_umd = {exports: {}}; }); return; } - let value = base[prop]; + var value = base[prop]; + /* eslint-disable no-console */ setPropertyAccess(base, prop, { get() { hit(source); @@ -35666,120 +38813,366 @@ var scriptlets_umd = {exports: {}}; value = newValue; } }); + /* eslint-enable no-console */ }; + setChainPropAccess(window, property); } logOnStacktrace$1.names = ['log-on-stack-trace']; logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-xhr + * + * @description + * Prevents `xhr` calls if **all** given parameters match. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-xhr-ifjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-xhr'[, propsToMatch[, randomize]]) + * ``` + * + * - `propsToMatch` — optional, string of space-separated properties to match; possible props: + * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call; + * empty string or wildcard `*` for all `XMLHttpRequest.open()` calls match + * - colon-separated pairs `name:value` where + * - `name` is XMLHttpRequest object property name + * - `value` is string or regular expression for matching the value of the option + * passed to `XMLHttpRequest.open()` call + * - `randomize` — defaults to `false` for empty responseText, + * optional argument to randomize responseText of matched XMLHttpRequest's response; possible values: + * - `true` to randomize responseText, random alphanumeric string of 10 symbols + * - colon-separated pair `name:value` string value to customize responseText data where + * - `name` — only `length` supported for now + * - `value` — range on numbers, for example `100-300`, limited to 500000 characters + * + * > Usage with no arguments will log XMLHttpRequest objects to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Log all XMLHttpRequests + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr') + * ``` + * + * 1. Prevent all XMLHttpRequests + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', '*') + * example.org#%#//scriptlet('prevent-xhr', '') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org') + * ``` + * + * 1. Prevent XMLHttpRequests for specific request method + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'method:HEAD') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url and specified request methods + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org method:/HEAD|GET/') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url and randomize it's response text + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'true') + * ``` + * + * 1. Prevent XMLHttpRequests for specific url and randomize it's response text with range + * + * ```adblock + * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300') + * ``` + * + * @added v1.5.0. + */ + /* eslint-enable max-len */ function preventXHR$1(source, propsToMatch, customResponseText) { + // do nothing if browser does not support Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof Proxy === 'undefined') { return; } - let response = ''; - let responseText = ''; - let responseUrl; - const openWrapper = function openWrapper(target, thisArg, args) { - const xhrData = { - method: args[0], - url: args[1] - }; - responseUrl = xhrData.url; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader; + var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders; + var xhrData; + var modifiedResponse = ''; + var modifiedResponseText = ''; + var openWrapper = function openWrapper(target, thisArg, args) { + // Get original request properties + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); if (typeof propsToMatch === 'undefined') { + // Log if no propsToMatch given logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); hit(source); } else if (matchRequestProps(source, propsToMatch, xhrData)) { thisArg.shouldBePrevented = true; + // Add xhrData to thisArg to keep original values in case of multiple requests + // https://github.com/AdguardTeam/Scriptlets/issues/347 + thisArg.xhrData = xhrData; + } + + // Trap setRequestHeader of target xhr object to mimic request headers later; + // needed for getResponseHeader() and getAllResponseHeaders() methods + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + // setRequestHeader() can only be called on xhr.open(), + // so we can safely proxy it here + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } return Reflect.apply(target, thisArg, args); }; - const sendWrapper = function sendWrapper(target, thisArg, args) { + var sendWrapper = function sendWrapper(target, thisArg, args) { if (!thisArg.shouldBePrevented) { return Reflect.apply(target, thisArg, args); } if (thisArg.responseType === 'blob') { - response = new Blob(); + modifiedResponse = new Blob(); } if (thisArg.responseType === 'arraybuffer') { - response = new ArrayBuffer(); + modifiedResponse = new ArrayBuffer(); } if (customResponseText) { - const randomText = generateRandomResponse(customResponseText); + var randomText = generateRandomResponse(customResponseText); if (randomText) { - responseText = randomText; + modifiedResponseText = randomText; } else { - logMessage(source, "Invalid range: ".concat(customResponseText)); + logMessage(source, "Invalid randomize parameter: '".concat(customResponseText, "'")); } } - Object.defineProperties(thisArg, { - readyState: { - value: 4, - writable: false - }, - response: { - value: response, - writable: false - }, - responseText: { - value: responseText, - writable: false - }, - responseURL: { - value: responseUrl, - writable: false - }, - responseXML: { - value: '', - writable: false - }, - status: { - value: 200, - writable: false - }, - statusText: { - value: 'OK', - writable: false + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; } + var readyState = forgedRequest.readyState, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + statusText = forgedRequest.statusText; + + // Mock response object + Object.defineProperties(thisArg, { + // original values + readyState: { + value: readyState, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + // If the request is blocked, responseURL is an empty string + responseURL: { + value: responseURL || thisArg.xhrData.url, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + // modified values + status: { + value: 200, + writable: false + }, + response: { + value: modifiedResponse, + writable: false + }, + responseText: { + value: modifiedResponseText, + writable: false + } + }); + + // Mock events + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); }); - setTimeout(function () { - const stateEvent = new Event('readystatechange'); - thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event('load'); - thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event('loadend'); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); + nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } return undefined; }; - const openHandler = { + + /** + * Mock XMLHttpRequest.prototype.getHeaderHandler() to avoid adblocker detection. + * + * @param {Function} target XMLHttpRequest.prototype.getHeaderHandler(). + * @param {XMLHttpRequest} thisArg The request. + * @param {string[]} args Header name is passed as first argument. + * + * @returns {string|null} Header value or null if header is not set. + */ + var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return nativeGetResponseHeader.apply(thisArg, args); + } + if (!thisArg.collectedHeaders.length) { + return null; + } + // The search for the header name is case-insensitive + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getResponseHeader + var searchHeaderName = args[0].toLowerCase(); + var matchedHeader = thisArg.collectedHeaders.find(function (header) { + var headerName = header[0].toLowerCase(); + return headerName === searchHeaderName; + }); + return matchedHeader ? matchedHeader[1] : null; + }; + + /** + * Mock XMLHttpRequest.prototype.getAllResponseHeaders() to avoid adblocker detection. + * + * @param {Function} target XMLHttpRequest.prototype.getAllResponseHeaders(). + * @param {XMLHttpRequest} thisArg The request. + * + * @returns {string} All headers as a string. For no headers an empty string is returned. + */ + var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) { + if (!thisArg.shouldBePrevented) { + return nativeGetAllResponseHeaders.call(thisArg); + } + if (!thisArg.collectedHeaders.length) { + return ''; + } + var allHeadersStr = thisArg.collectedHeaders.map(function (header) { + /** + * TODO: array destructuring may be used here + * after the typescript implementation and bundling refactoring + * as now there is an error: slicedToArray is not defined + */ + var headerName = header[0]; + var headerValue = header[1]; + // In modern browsers, the header names are returned in all lower case, as per the latest spec. + // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders + return "".concat(headerName.toLowerCase(), ": ").concat(headerValue); + }).join('\r\n'); + return allHeadersStr; + }; + var openHandler = { apply: openWrapper }; - const sendHandler = { + var sendHandler = { apply: sendWrapper }; + var getHeaderHandler = { + apply: getHeaderWrapper + }; + var getAllHeadersHandler = { + apply: getAllHeadersWrapper + }; XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler); + XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler); } preventXHR$1.names = ['prevent-xhr', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if']; - preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; + preventXHR$1.injections = [hit, objectToString, generateRandomResponse, matchRequestProps, getXhrData, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, isValidParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; + + /** + * @scriptlet close-window + * + * @description + * Closes the browser tab immediately. + * + * > `window.close()` usage is restricted in the Chrome browser. + * > In this case tab will only be closed when using AdGuard Browser extension. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('close-window'[, path]) + * ``` + * + * - `path` — optional, string or regular expression + * matching the current location's path: `window.location.pathname` + `window.location.search`. + * Defaults to execute on every page. + * + * ### Examples + * + * ```adblock + * ! closes any example.org tab + * example.org#%#//scriptlet('close-window') + * + * ! closes specific example.org tab + * example.org#%#//scriptlet('close-window', '/example-page.html') + * ``` + * + * @added v1.5.0. + */ function forceWindowClose$1(source) { - let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036 if (typeof window.close !== 'function') { - const message = 'window.close() is not a function so \'close-window\' scriptlet is unavailable'; + var message = 'window.close() is not a function so \'close-window\' scriptlet is unavailable'; logMessage(source, message); return; } - const closeImmediately = function closeImmediately() { + var closeImmediately = function closeImmediately() { try { hit(source); window.close(); } catch (e) { + // log the error if window closing is impossible + // https://developer.mozilla.org/en-US/docs/Web/API/Window/close logMessage(source, e); } }; - const closeByExtension = function closeByExtension() { - const extCall = function extCall() { + var closeByExtension = function closeByExtension() { + var extCall = function extCall() { dispatchEvent(new Event('adguard:scriptlet-close-window')); }; window.addEventListener('adguard:subscribed-to-close-window', extCall, { @@ -35791,29 +39184,67 @@ var scriptlets_umd = {exports: {}}; }); }, 5000); }; - const shouldClose = function shouldClose() { + var shouldClose = function shouldClose() { if (path === '') { return true; } - const pathRegexp = toRegExp(path); - const currentPath = "".concat(window.location.pathname).concat(window.location.search); + var pathRegexp = toRegExp(path); + var currentPath = "".concat(window.location.pathname).concat(window.location.search); return pathRegexp.test(currentPath); }; if (shouldClose()) { closeImmediately(); - if (navigator.userAgent.indexOf('Chrome') > -1) { + if (navigator.userAgent.includes('Chrome')) { closeByExtension(); } } } forceWindowClose$1.names = ['close-window', 'window-close-if.js', 'ubo-window-close-if.js', 'ubo-window-close-if']; forceWindowClose$1.injections = [hit, toRegExp, logMessage]; + + /* eslint-disable max-len */ + /** + * @scriptlet prevent-refresh + * + * @description + * Prevents reloading of a document through a meta "refresh" tag. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#refresh-defuserjs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-refresh'[, delay]) + * ``` + * + * - `delay` — optional, number of seconds for delay that indicates when scriptlet should run. + * If not set, source tag value will be applied. + * + * ### Examples + * + * 1. Prevent reloading of a document through a meta "refresh" tag + * + * ```adblock + * example.org#%#//scriptlet('prevent-refresh') + * ``` + * + * 1. Prevent reloading of a document with delay + * + * ```adblock + * example.com#%#//scriptlet('prevent-refresh', 3) + * ``` + * + * @added v1.6.2. + */ + /* eslint-enable max-len */ function preventRefresh$1(source, delaySec) { - const getMetaElements = function getMetaElements() { - let metaNodes = []; + var getMetaElements = function getMetaElements() { + var metaNodes = []; try { metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); } catch (e) { + // 'i' attribute flag is problematic in Edge 15 try { metaNodes = document.querySelectorAll('meta[http-equiv="refresh"][content]'); } catch (e) { @@ -35822,16 +39253,17 @@ var scriptlets_umd = {exports: {}}; } return Array.from(metaNodes); }; - const getMetaContentDelay = function getMetaContentDelay(metaElements) { - const delays = metaElements.map(function (meta) { - const contentString = meta.getAttribute('content'); + var getMetaContentDelay = function getMetaContentDelay(metaElements) { + var delays = metaElements.map(function (meta) { + var contentString = meta.getAttribute('content'); if (contentString.length === 0) { return null; } - let contentDelay; - const limiterIndex = contentString.indexOf(';'); + var contentDelay; + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv + var limiterIndex = contentString.indexOf(';'); if (limiterIndex !== -1) { - const delaySubstring = contentString.substring(0, limiterIndex); + var delaySubstring = contentString.substring(0, limiterIndex); contentDelay = getNumberFromString(delaySubstring); } else { contentDelay = getNumberFromString(contentString); @@ -35840,27 +39272,33 @@ var scriptlets_umd = {exports: {}}; }).filter(function (delay) { return delay !== null; }); + // Check if "delays" array is empty, may happens when meta's content is invalid + // and reduce() method cannot be used with empty arrays without initial value if (!delays.length) { return null; } - const minDelay = delays.reduce(function (a, b) { + // Get smallest delay of all metas on the page + var minDelay = delays.reduce(function (a, b) { return Math.min(a, b); }); + // eslint-disable-next-line consistent-return return minDelay; }; - const stop = function stop() { - const metaElements = getMetaElements(); + var stop = function stop() { + var metaElements = getMetaElements(); if (metaElements.length === 0) { return; } - let secondsToRun = getNumberFromString(delaySec); + var secondsToRun = getNumberFromString(delaySec); + // Check if argument is provided if (secondsToRun === null) { secondsToRun = getMetaContentDelay(metaElements); } + // Check if meta tag has delay if (secondsToRun === null) { return; } - const delayMs = secondsToRun * 1000; + var delayMs = secondsToRun * 1000; setTimeout(function () { window.stop(); hit(source); @@ -35875,63 +39313,123 @@ var scriptlets_umd = {exports: {}}; } } preventRefresh$1.names = ['prevent-refresh', + // Aliases are needed for matching the related scriptlet converted into our syntax + // These are used by UBO rules syntax + // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets 'refresh-defuser.js', 'refresh-defuser', + // Prefix 'ubo-' is required to run converted rules 'ubo-refresh-defuser.js', 'ubo-refresh-defuser']; preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN]; + + /* eslint-disable max-len, consistent-return */ + /** + * @scriptlet prevent-element-src-loading + * + * @description + * Prevents target element source loading without triggering 'onerror' listeners and not breaking 'onload' ones. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('prevent-element-src-loading', tagName, match) + * ``` + * + * - `tagName` — required, case-insensitive target element tagName + * which `src` property resource loading will be silently prevented; possible values: + * - `script` + * - `img` + * - `iframe` + * - `link` + * - `match` — required, string or regular expression for matching the element's URL; + * + * ### Examples + * + * 1. Prevent script source loading + * + * ```adblock + * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle') + * ``` + * + * @added v1.6.2. + */ + /* eslint-enable max-len */ function preventElementSrcLoading$1(source, tagName, match) { + // do nothing if browser does not support Proxy or Reflect if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { return; } - const srcMockData = { + var srcMockData = { + // "KCk9Pnt9" = "()=>{}" script: 'data:text/javascript;base64,KCk9Pnt9', + // Empty 1x1 image img: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==', - iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=' + // Empty h1 tag + iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=', + // Empty data + link: 'data:text/plain;base64,' }; - let instance; + var instance; if (tagName === 'script') { instance = HTMLScriptElement; } else if (tagName === 'img') { instance = HTMLImageElement; } else if (tagName === 'iframe') { instance = HTMLIFrameElement; + } else if (tagName === 'link') { + instance = HTMLLinkElement; } else { return; } - const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; - let policy; + + // For websites that use Trusted Types + // https://w3c.github.io/webappsec-trusted-types/dist/spec/ + var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; + var policy; if (hasTrustedTypes) { + // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can + // allow our policy if the server has restricted the creation of a trusted-types policy with + // the directive 'Content-Security-Policy: trusted-types ;`. + // If such a header is presented in the server response, corelibs adds permission to create + // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. + // See AG-18204 for details. policy = window.trustedTypes.createPolicy('AGPolicy', { createScriptURL: function createScriptURL(arg) { return arg; } }); } - const SOURCE_PROPERTY_NAME = 'src'; - const ONERROR_PROPERTY_NAME = 'onerror'; - const searchRegexp = toRegExp(match); - const setMatchedAttribute = function setMatchedAttribute(elem) { + var SOURCE_PROPERTY_NAME = tagName === 'link' ? 'href' : 'src'; + var ONERROR_PROPERTY_NAME = 'onerror'; + var searchRegexp = toRegExp(match); + + // This will be needed to silent error events on matched element, + // as url wont be available + var setMatchedAttribute = function setMatchedAttribute(elem) { return elem.setAttribute(source.name, 'matched'); }; - const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { + var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { + // Check if arguments are present if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - const nodeName = thisArg.nodeName.toLowerCase(); - const attrName = args[0].toLowerCase(); - const attrValue = args[1]; - const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); + var nodeName = thisArg.nodeName.toLowerCase(); + var attrName = args[0].toLowerCase(); + var attrValue = args[1]; + var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); if (!isMatched) { return Reflect.apply(target, thisArg, args); } hit(source); setMatchedAttribute(thisArg); + // Forward the URI that corresponds with element's MIME type return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); }; - const setAttributeHandler = { + var setAttributeHandler = { apply: setAttributeWrapper }; + // eslint-disable-next-line max-len instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); - const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); + var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); if (!origSrcDescriptor) { return; } @@ -35942,14 +39440,16 @@ var scriptlets_umd = {exports: {}}; return origSrcDescriptor.get.call(this); }, set(urlValue) { - const nodeName = this.nodeName.toLowerCase(); - const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); + var nodeName = this.nodeName.toLowerCase(); + var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); if (!isMatched) { origSrcDescriptor.set.call(this, urlValue); return true; } + + // eslint-disable-next-line no-undef if (policy && urlValue instanceof TrustedScriptURL) { - const trustedSrc = policy.createScriptURL(urlValue); + var trustedSrc = policy.createScriptURL(urlValue); origSrcDescriptor.set.call(this, trustedSrc); hit(source); return; @@ -35959,7 +39459,10 @@ var scriptlets_umd = {exports: {}}; hit(source); } }); - const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); + + // https://github.com/AdguardTeam/Scriptlets/issues/228 + // Prevent error event being triggered by other sources + var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); if (!origOnerrorDescriptor) { return; } @@ -35970,7 +39473,7 @@ var scriptlets_umd = {exports: {}}; return origOnerrorDescriptor.get.call(this); }, set(cb) { - const isMatched = this.getAttribute(source.name) === 'matched'; + var isMatched = this.getAttribute(source.name) === 'matched'; if (!isMatched) { origOnerrorDescriptor.set.call(this, cb); return true; @@ -35979,32 +39482,67 @@ var scriptlets_umd = {exports: {}}; return true; } }); - const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { + var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { + // Check if arguments are present if (!args[0] || !args[1] || !thisArg) { return Reflect.apply(target, thisArg, args); } - const eventName = args[0]; - const isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; + var eventName = args[0]; + var isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } return Reflect.apply(target, thisArg, args); }; - const addEventListenerHandler = { + var addEventListenerHandler = { apply: addEventListenerWrapper }; + // eslint-disable-next-line max-len EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); + var preventInlineOnerror = function preventInlineOnerror(tagName, src) { + window.addEventListener('error', function (event) { + if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) { + return; + } + hit(source); + if (typeof event.target.onload === 'function') { + event.target.onerror = event.target.onload; + return; + } + event.target.onerror = noopFunc; + }, true); + }; + preventInlineOnerror(tagName, searchRegexp); } preventElementSrcLoading$1.names = ['prevent-element-src-loading']; preventElementSrcLoading$1.injections = [hit, toRegExp, safeGetDescriptor, noopFunc]; + + /** + * @scriptlet no-topics + * + * @description + * Prevents using the Topics API. + * https://developer.chrome.com/docs/privacy-sandbox/topics/ + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('no-topics') + * ``` + * + * @added v1.6.18. + */ function noTopics$1(source) { - const TOPICS_PROPERTY_NAME = 'browsingTopics'; + var TOPICS_PROPERTY_NAME = 'browsingTopics'; if (Document instanceof Object === false) { return; } if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { return; } + + // document.browsingTopics() is async function so it's better to return noopPromiseResolve() + // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works Document.prototype[TOPICS_PROPERTY_NAME] = function () { return noopPromiseResolve('[]'); }; @@ -36012,105 +39550,483 @@ var scriptlets_umd = {exports: {}}; } noTopics$1.names = ['no-topics']; noTopics$1.injections = [hit, noopPromiseResolve]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-replace-xhr-response + * + * @description + * Replaces response content of `xhr` requests if **all** given parameters match. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]]) + * ``` + * + * - `pattern` — optional, argument for matching contents of responseText that should be replaced. + * If set, `replacement` is required. Possible values: + * - `*` to match all text content + * - non-empty string + * - regular expression + * - `replacement` — optional, should be set if `pattern` is set. String to replace matched content with. + * Empty string to remove content. + * - `propsToMatch` — optional, string of space-separated properties to match for extra condition; possible props: + * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call; + * - colon-separated pairs `name:value` where + * - `name` — string or regular expression for matching XMLHttpRequest property name + * - `value` — string or regular expression for matching the value of the option + * passed to `XMLHttpRequest.open()` call + * + * > Usage with no arguments will log XMLHttpRequest objects to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Log all XMLHttpRequests + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response') + * ``` + * + * 1. Replace text content of XMLHttpRequests with specific url + * + * + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org') + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') + * ``` + * + * + * + * 1. Remove all text content of XMLHttpRequests with specific request method + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET') + * ``` + * + * 1. Replace text content of XMLHttpRequests matching by URL regex and request methods + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') + * ``` + * + * 1. Remove all text content of all XMLHttpRequests for example.com + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ function trustedReplaceXhrResponse$1(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + // do nothing if browser does not support Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof Proxy === 'undefined') { return; } + + // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { - const message = 'Pattern argument should not be empty string.'; + var message = 'Pattern argument should not be empty string.'; logMessage(source, message); return; } - const shouldLog = pattern === '' && replacement === ''; - const nativeOpen = window.XMLHttpRequest.prototype.open; - const nativeSend = window.XMLHttpRequest.prototype.send; - let xhrData; - const openWrapper = function openWrapper(target, thisArg, args) { + var shouldLog = pattern === '' && replacement === ''; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread xhrData = getXhrData.apply(null, args); if (shouldLog) { - const message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, message, true); + // Log if no propsToMatch given + var _message = "xhr( ".concat(objectToString(xhrData), " )"); + logMessage(source, _message, true); hit(source); return Reflect.apply(target, thisArg, args); } if (matchRequestProps(source, propsToMatch, xhrData)) { thisArg.shouldBePrevented = true; } + + // Trap setRequestHeader of target xhr object to mimic request headers later if (thisArg.shouldBePrevented) { thisArg.collectedHeaders = []; - const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers thisArg.collectedHeaders.push(args); return Reflect.apply(target, thisArg, args); }; - const setRequestHeaderHandler = { + var setRequestHeaderHandler = { apply: setRequestHeaderWrapper }; + + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } return Reflect.apply(target, thisArg, args); }; - const sendWrapper = function sendWrapper(target, thisArg, args) { + var sendWrapper = function sendWrapper(target, thisArg, args) { if (!thisArg.shouldBePrevented) { return Reflect.apply(target, thisArg, args); } - const forgedRequest = new XMLHttpRequest(); + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + + // Extract content from response + var content = responseText || response; + if (typeof content !== 'string') { + return; + } + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); + + // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied + Object.defineProperties(thisArg, { + // original values + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + // modified values + response: { + value: modifiedContent, + writable: false + }, + responseText: { + value: modifiedContent, + writable: false + } + }); + + // Mock events + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + } + trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' + // trusted scriptlets support no aliases + ]; + + trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet xml-prune + * + * @description + * Removes an element from the specified XML. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#xml-prunejs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('xml-prune'[, propsToMatch[, optionalProp[, urlToMatch]]]) + * ``` + * + * - `propsToMatch` — optional, selector of elements which will be removed from XML + * - `optionalProp` — optional, selector of elements that must occur in XML document + * - `urlToMatch` — optional, string or regular expression for matching the request's URL + * + * > Usage with no arguments will log response payload and URL to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Remove `Period` tag whose `id` contains `-ad-` from all requests + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]') + * ``` + * + * 1. Remove `Period` tag whose `id` contains `-ad-`, only if XML contains `SegmentTemplate` + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]', 'SegmentTemplate') + * ``` + * + * 1. Remove `Period` tag whose `id` contains `-ad-`, only if request's URL contains `.mpd` + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', 'Period[id*="-ad-"]', '', '.mpd') + * ``` + * + * 1. Call with no arguments will log response payload and URL at the console + * + * ```adblock + * example.org#%#//scriptlet('xml-prune') + * ``` + * + * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL + * + * ```adblock + * example.org#%#//scriptlet('xml-prune', '', '', '.mpd') + * ``` + * + * @added 1.7.3. + */ + /* eslint-enable max-len */ + + function xmlPrune$1(source, propsToRemove) { + var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect + if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { + return; + } + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var isXML = function isXML(text) { + // It's necessary to check the type of 'text' + // because 'text' is obtained from the xhr/fetch response, + // so it could also be Blob/ArrayBuffer/Object or another type + if (typeof text === 'string') { + // Check if "text" starts with "<" and check if it ends with ">" + // If so, then it might be an XML file and should be pruned or logged + var trimmedText = text.trim(); + if (trimmedText.startsWith('<') && trimmedText.endsWith('>')) { + return true; + } + } + return false; + }; + var createXMLDocument = function createXMLDocument(text) { + var xmlParser = new DOMParser(); + var xmlDocument = xmlParser.parseFromString(text, 'text/xml'); + return xmlDocument; + }; + var isPruningNeeded = function isPruningNeeded(response, propsToRemove) { + if (!isXML(response)) { + return false; + } + var docXML = createXMLDocument(response); + return !!docXML.querySelector(propsToRemove); + }; + var pruneXML = function pruneXML(text) { + if (!isXML(text)) { + shouldPruneResponse = false; + return text; + } + var xmlDoc = createXMLDocument(text); + var errorNode = xmlDoc.querySelector('parsererror'); + if (errorNode) { + return text; + } + if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) { + shouldPruneResponse = false; + return text; + } + var elems = xmlDoc.querySelectorAll(propsToRemove); + if (!elems.length) { + shouldPruneResponse = false; + return text; + } + elems.forEach(function (elem) { + elem.remove(); + }); + var serializer = new XMLSerializer(); + text = serializer.serializeToString(xmlDoc); + return text; + }; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; + } + + // Trap setRequestHeader of target xhr object to mimic request headers later + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ['', 'text']; + // Do nothing if request do not match + // or response type is not a string + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { + return Reflect.apply(target, thisArg, args); + } + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); forgedRequest.addEventListener('readystatechange', function () { if (forgedRequest.readyState !== 4) { return; } - const readyState = forgedRequest.readyState, + var readyState = forgedRequest.readyState, response = forgedRequest.response, responseText = forgedRequest.responseText, responseURL = forgedRequest.responseURL, responseXML = forgedRequest.responseXML, status = forgedRequest.status, statusText = forgedRequest.statusText; - const content = responseText || response; + + // Extract content from response + var content = responseText || response; if (typeof content !== 'string') { return; } - const patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); - const modifiedContent = content.replace(patternRegexp, replacement); + if (!propsToRemove) { + if (isXML(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); + logMessage(source, createXMLDocument(response), true, false); + } + } else { + shouldPruneResponse = isPruningNeeded(response, propsToRemove); + } + var responseContent = shouldPruneResponse ? pruneXML(response) : response; + // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied Object.defineProperties(thisArg, { + // original values readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent + value: readyState, + writable: false }, responseURL: { - value: responseURL + value: responseURL, + writable: false }, responseXML: { - value: responseXML + value: responseXML, + writable: false }, status: { - value: status + value: status, + writable: false }, statusText: { - value: statusText + value: statusText, + writable: false + }, + // modified values + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false } }); + + // Mock events setTimeout(function () { - const stateEvent = new Event('readystatechange'); + var stateEvent = new Event('readystatechange'); thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event('load'); + var loadEvent = new Event('load'); thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event('loadend'); + var loadEndEvent = new Event('loadend'); thisArg.dispatchEvent(loadEndEvent); }, 1); hit(source); }); nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects thisArg.collectedHeaders.forEach(function (header) { - const name = header[0]; - const value = header[1]; + var name = header[0]; + var value = header[1]; forgedRequest.setRequestHeader(name, value); }); thisArg.collectedHeaders = []; @@ -36121,157 +40037,123 @@ var scriptlets_umd = {exports: {}}; } return undefined; }; - const openHandler = { + var openHandler = { apply: openWrapper }; - const sendHandler = { + var sendHandler = { apply: sendWrapper }; XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); - } - trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' - ]; - trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; - function xmlPrune$1(source, propsToRemove) { - var _this = this; - let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { - return; - } - let shouldPruneResponse = true; - if (!propsToRemove) { - shouldPruneResponse = false; - } - const urlMatchRegexp = toRegExp(urlToMatch); - const isXML = function isXML(text) { - if (typeof text === 'string') { - const trimedText = text.trim(); - if (trimedText.startsWith('<') && trimedText.endsWith('>')) { - return true; - } - } - return false; - }; - const createXMLDocument = function createXMLDocument(text) { - const xmlParser = new DOMParser(); - const xmlDocument = xmlParser.parseFromString(text, 'text/xml'); - return xmlDocument; - }; - const pruneXML = function pruneXML(text) { - if (!isXML(text)) { - shouldPruneResponse = false; - return text; - } - const xmlDoc = createXMLDocument(text); - const errorNode = xmlDoc.querySelector('parsererror'); - if (errorNode) { - return text; - } - if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) { - shouldPruneResponse = false; - return text; - } - const elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { - shouldPruneResponse = false; - return text; - } - elems.forEach(function (elem) { - elem.remove(); - }); - const serializer = new XMLSerializer(); - text = serializer.serializeToString(xmlDoc); - return text; - }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== 'string' || xhrURL.length === 0) { - return Reflect.apply(target, thisArg, args); - } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener('readystatechange', function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener('readystatechange', pruneResponse); - if (!shouldPruneResponse) { - if (isXML(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - logMessage(source, createXMLDocument(response), true, false); - } - } else { - const prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { - Object.defineProperty(thisArg, 'response', { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, 'responseText', { - value: prunedResponseContent - }); - hit(source); - } - shouldPruneResponse = true; - } - } - }); - } - return Reflect.apply(target, thisArg, args); - }; - const xhrHandler = { - apply: xhrWrapper - }; - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; if (typeof fetchURL !== 'string' || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); } if (urlMatchRegexp.test(fetchURL)) { - return nativeFetch.apply(_this, args).then(function (response) { - return response.text().then(function (text) { - if (!shouldPruneResponse) { - if (isXML(text)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text); - logMessage(source, message); - logMessage(source, createXMLDocument(text), true, false); - } - return Reflect.apply(target, thisArg, args); - } - const prunedText = pruneXML(text); - if (shouldPruneResponse) { - hit(source); - return new Response(prunedText, { - status: response.status, - statusText: response.statusText, - headers: response.headers - }); - } - shouldPruneResponse = true; - return Reflect.apply(target, thisArg, args); + var response = await nativeFetch(...args); + // It's required to fix issue with - Request with body": Failed to execute 'fetch' on 'Window': + // Cannot construct a Request with a Request object that has already been used. + // For example, it occurs on youtube when scriptlet is used without arguments + var clonedResponse = response.clone(); + var responseText = await response.text(); + shouldPruneResponse = isPruningNeeded(responseText, propsToRemove); + if (!shouldPruneResponse) { + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + logMessage(source, message); + logMessage(source, createXMLDocument(responseText), true, false); + return clonedResponse; + } + var prunedText = pruneXML(responseText); + if (shouldPruneResponse) { + hit(source); + return new Response(prunedText, { + status: response.status, + statusText: response.statusText, + headers: response.headers }); - }); + } + return clonedResponse; } return Reflect.apply(target, thisArg, args); }; - const fetchHandler = { + var fetchHandler = { apply: fetchWrapper }; window.fetch = new Proxy(window.fetch, fetchHandler); } xmlPrune$1.names = ['xml-prune', + // aliases are needed for matching the related scriptlet converted into our syntax 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune']; - xmlPrune$1.injections = [hit, logMessage, toRegExp]; - function m3uPrune$1(source, propsToRemove, urlToMatch) { + xmlPrune$1.injections = [hit, logMessage, toRegExp, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @scriptlet m3u-prune + * + * @description + * Removes content from the specified M3U file. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/wiki/Resources-Library#m3u-prunejs- + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch]]) + * ``` + * + * - `propsToRemove` — optional, string or regular expression + * to match the URL line (segment) which will be removed alongside with its tags + * - `urlToMatch` — optional, string or regular expression for matching the request's URL + * + * > Usage with no arguments will log response payload and URL to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * ### Examples + * + * 1. Removes a tag which contains `example.com/video/`, from all requests + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune', 'example.com/video/') + * ``` + * + * 1. Removes a line which contains `example.com/video/`, only if request's URL contains `.m3u8` + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune', 'example.com/video/', '.m3u8') + * ``` + * + * 1. Call with no arguments will log response payload and URL at the console + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune') + * ``` + * + * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL + * + * ```adblock + * example.org#%#//scriptlet('m3u-prune', '', '.m3u8') + * ``` + * + * @added v1.9.1. + */ + /* eslint-enable max-len */ + + function m3uPrune$1(source, propsToRemove) { + var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; } - let shouldPruneResponse = false; - const urlMatchRegexp = toRegExp(urlToMatch); - const SEGMENT_MARKER = '#'; - const AD_MARKER = { + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var SEGMENT_MARKER = '#'; + var AD_MARKER = { ASSET: '#EXT-X-ASSET:', CUE: '#EXT-X-CUE:', CUE_IN: '#EXT-X-CUE-IN', @@ -36280,28 +40162,39 @@ var scriptlets_umd = {exports: {}}; EXTM3U: '#EXTM3U', SCTE35: '#EXT-X-SCTE35:' }; - const COMCAST_AD_MARKER = { + var COMCAST_AD_MARKER = { AD: '-AD-', VAST: '-VAST-', VMAP_AD: '-VMAP-AD-', VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:' }; - const TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START']; - const isAllowedTag = function isAllowedTag(str) { + + // List of tags which should not be removed + var TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START']; + var isAllowedTag = function isAllowedTag(str) { return TAGS_ALLOWLIST.some(function (el) { return str.startsWith(el); }); }; - const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { - let array = lines.slice(); - let index = i; + + /** + * Sets an item in array to undefined, if it contains one of the + * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY + * + * @param {Array} lines + * @param {number} i + * @returns {object} { array, index } + */ + var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { + var array = lines.slice(); + var index = i; if (array[index].includes(AD_MARKER.EXTINF)) { array[index] = undefined; index += 1; if (array[index].includes(AD_MARKER.DISCONTINUITY)) { array[index] = undefined; index += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, index); + var prunedExtinf = pruneExtinfFromVmapBlock(array, index); array = prunedExtinf.array; index = prunedExtinf.index; } @@ -36311,22 +40204,43 @@ var scriptlets_umd = {exports: {}}; index }; }; - const pruneVmapBlock = function pruneVmapBlock(lines) { - let array = lines.slice(); - for (let i = 0; i < array.length - 1; i += 1) { + + /** + * Sets an item in array to undefined, if it contains one of the + * COMCAST_AD_MARKER: COMCAST_AD_MARKER.VMAP_AD, COMCAST_AD_MARKER.VAST, COMCAST_AD_MARKER.AD + * + * @param {Array} lines + * @returns {Array} + */ + var pruneVmapBlock = function pruneVmapBlock(lines) { + var array = lines.slice(); + for (var i = 0; i < array.length - 1; i += 1) { if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) { array[i] = undefined; if (array[i + 1].includes(AD_MARKER.EXTINF)) { i += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, i); + var prunedExtinf = pruneExtinfFromVmapBlock(array, i); array = prunedExtinf.array; + // It's necessary to subtract 1 from "i", + // otherwise one line will be skipped i = prunedExtinf.index - 1; } } } return array; }; - const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { + + /** + * Sets an item in array to undefined, if it contains one of the + * AD_MARKER: AD_MARKER.CUE, AD_MARKER.ASSET, AD_MARKER.SCTE35, AD_MARKER.CUE_IN + * + * @param {string} line + * @param {number} index + * @param {Array} array + * @returns {string|undefined} + */ + + var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { if (!line.startsWith(AD_MARKER.CUE)) { return line; } @@ -36349,8 +40263,19 @@ var scriptlets_umd = {exports: {}}; } return line; }; - const removeM3ULineRegexp = toRegExp(propsToRemove); - const pruneInfBlock = function pruneInfBlock(line, index, array) { + var removeM3ULineRegexp = toRegExp(propsToRemove); + + /** + * Sets an item in array to undefined, if it contains removeM3ULineRegexp and one of the + * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY + * + * @param {string} line + * @param {number} index + * @param {Array} array + * @returns {string|undefined} + */ + + var pruneInfBlock = function pruneInfBlock(line, index, array) { if (!line.startsWith(AD_MARKER.EXTINF)) { return line; } @@ -36370,17 +40295,24 @@ var scriptlets_umd = {exports: {}}; } return line; }; - const pruneSegments = function pruneSegments(lines) { - for (let i = 0; i < lines.length - 1; i += 1) { + + /** + * Removes block of segments (if it contains removeM3ULineRegexp) until another segment occurs + * + * @param {Array} lines + * @returns {Array} + */ + var pruneSegments = function pruneSegments(lines) { + for (var i = 0; i < lines.length - 1; i += 1) { var _lines$i; if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) { - const segmentName = lines[i].substring(0, lines[i].indexOf(':')); + var segmentName = lines[i].substring(0, lines[i].indexOf(':')); if (!segmentName) { return lines; } lines[i] = undefined; i += 1; - for (let j = i; j < lines.length; j += 1) { + for (var j = i; j < lines.length; j += 1) { if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) { lines[j] = undefined; } else { @@ -36392,18 +40324,43 @@ var scriptlets_umd = {exports: {}}; } return lines; }; - const isM3U = function isM3U(text) { + + /** + * Determines if text contains "#EXTM3U" or "VMAP_AD_BREAK" + * + * @param {*} text + * @returns {boolean} + */ + var isM3U = function isM3U(text) { if (typeof text === 'string') { - const trimmedText = text.trim(); + // Check if "text" starts with "#EXTM3U" or with "VMAP_AD_BREAK" + // If so, then it might be an M3U file and should be pruned or logged + var trimmedText = text.trim(); return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK); } return false; }; - const isPruningNeeded = function isPruningNeeded(text, regexp) { + + /** + * Determines if pruning is needed + * + * @param {string} text + * @param {RegExp} regexp + * @returns {boolean} + */ + var isPruningNeeded = function isPruningNeeded(text, regexp) { return isM3U(text) && regexp.test(text); }; - const pruneM3U = function pruneM3U(text) { - let lines = text.split(/\n\r|\n|\r/); + + /** + * Prunes lines which contain removeM3ULineRegexp and specific AD_MARKER + * + * @param {string} text + * @returns {string} + */ + // TODO: make it compatible with $hls modifier + var pruneM3U = function pruneM3U(text) { + var lines = text.split(/\n\r|\n|\r/); if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) { lines = pruneVmapBlock(lines); return lines.filter(function (l) { @@ -36424,59 +40381,166 @@ var scriptlets_umd = {exports: {}}; return !!l; }).join('\n'); }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== 'string' || xhrURL.length === 0) { + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; + } + + // Trap setRequestHeader of target xhr object to mimic request headers later + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ['', 'text']; + // Do nothing if request do not match + // or response type is not a string + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener('readystatechange', function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener('readystatechange', pruneResponse); - if (!propsToRemove) { - if (isM3U(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - } - } else { - shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); - } - if (shouldPruneResponse) { - const prunedResponseContent = pruneM3U(response); - Object.defineProperty(thisArg, 'response', { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, 'responseText', { - value: prunedResponseContent - }); - hit(source); - } + + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + + // Extract content from response + var content = responseText || response; + if (typeof content !== 'string') { + return; + } + if (!propsToRemove) { + if (isM3U(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); + } + } else { + shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); + } + var responseContent = shouldPruneResponse ? pruneM3U(response) : response; + // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied + Object.defineProperties(thisArg, { + // original values + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + // modified values + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false } }); + + // Mock events + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } - return Reflect.apply(target, thisArg, args); + return undefined; + }; + var openHandler = { + apply: openWrapper }; - const xhrHandler = { - apply: xhrWrapper + var sendHandler = { + apply: sendWrapper }; - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = async function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; if (typeof fetchURL !== 'string' || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); } if (urlMatchRegexp.test(fetchURL)) { - const response = await nativeFetch(...args); - const responseText = await response.text(); + var response = await nativeFetch(...args); + // It's required to fix issue with - Request with body": Failed to execute 'fetch' on 'Window': + // Cannot construct a Request with a Request object that has already been used. + // For example, it occurs on youtube when scriptlet is used without arguments + var clonedResponse = response.clone(); + var responseText = await response.text(); + // If "propsToRemove" is not defined, then response should be logged only if (!propsToRemove && isM3U(responseText)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); logMessage(source, message); - return Reflect.apply(target, thisArg, args); + return clonedResponse; } if (isPruningNeeded(responseText, removeM3ULineRegexp)) { - const prunedText = pruneM3U(responseText); + var prunedText = pruneM3U(responseText); hit(source); return new Response(prunedText, { status: response.status, @@ -36484,21 +40548,93 @@ var scriptlets_umd = {exports: {}}; headers: response.headers }); } - return Reflect.apply(target, thisArg, args); + return clonedResponse; } return Reflect.apply(target, thisArg, args); }; - const fetchHandler = { + var fetchHandler = { apply: fetchWrapper }; window.fetch = new Proxy(window.fetch, fetchHandler); } m3uPrune$1.names = ['m3u-prune', + // aliases are needed for matching the related scriptlet converted into our syntax 'm3u-prune.js', 'ubo-m3u-prune.js', 'ubo-m3u-prune']; - m3uPrune$1.injections = [hit, toRegExp, logMessage]; + m3uPrune$1.injections = [hit, toRegExp, logMessage, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-cookie + * + * @description + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value. Possible values: + * - arbitrary value + * - empty string for no value + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; + * defaults to no offset. Possible values: + * - positive integer in seconds + * - `1year` keyword for setting expiration date to one year + * - `1day` keyword for setting expiration date to one day + * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet does not encode cookie names and values. + * > As a result, if a cookie's name or value includes `;`, + * > the scriptlet will not set the cookie since this may cause the cookie to break. + * + * ### Examples + * + * 1. Set cookie + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept') + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '1-accept_1') + * ``` + * + * 1. Set cookie with `new Date().getTime()` value + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$') + * ``` + * + * 1. Set cookie which will expire in 3 days + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '259200') + * ``` + * + * 1. Set cookie which will expire in one year + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year') + * ``` + * + * 1. Set cookie with no path + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ + function trustedSetCookie$1(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified'); return; @@ -36507,33 +40643,108 @@ var scriptlets_umd = {exports: {}}; logMessage(source, 'Cookie value should be specified'); return; } - const parsedValue = parseKeywordValue(value); + var parsedValue = parseKeywordValue(value); if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); return; } if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); if (!parsedOffsetMs) { logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); return; } - const expires = Date.now() + parsedOffsetMs; + var expires = Date.now() + parsedOffsetMs; cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } document.cookie = cookieToSet; hit(source); } trustedSetCookie$1.names = ['trusted-set-cookie' + // trusted scriptlets support no aliases ]; + trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-cookie-reload + * + * @description + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. + * Also reloads the current page after the cookie setting. + * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie). + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]]) + * ``` + * + * - `name` — required, cookie name to be set + * - `value` — required, cookie value. Possible values: + * - arbitrary value + * - empty string for no value + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; + * defaults to no offset. Possible values: + * - positive integer in seconds + * - `1year` keyword for setting expiration date to one year + * - `1day` keyword for setting expiration date to one day + * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * > Note that the scriptlet does not encode cookie names and values. + * > As a result, if a cookie's name or value includes `;`, + * > the scriptlet will not set the cookie since this may cause the cookie to break. + * + * ### Examples + * + * 1. Set cookie and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept') + * ``` + * + * 1. Set cookie with `new Date().getTime()` value and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$') + * ``` + * + * 1. Set cookie which will expire in 3 days and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200') + * ``` + * + * 1. Set cookie which will expire in one year and reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year') + * ``` + * + * 1. Set cookie with no 'expire' and no path, reload the page after it + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') + * ``` + * + * @added v1.7.10. + */ + /* eslint-enable max-len */ + function trustedSetCookieReload$1(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified'); return; @@ -36542,54 +40753,153 @@ var scriptlets_umd = {exports: {}}; logMessage(source, 'Cookie value should be specified'); return; } + + // Prevent infinite reloads if cookie was already set or blocked by the browser + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { return; } - const parsedValue = parseKeywordValue(value); + var parsedValue = parseKeywordValue(value); if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); if (!cookieToSet) { + logMessage(source, 'Invalid cookie name or value'); return; } if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); if (!parsedOffsetMs) { logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); return; } - const expires = Date.now() + parsedOffsetMs; + var expires = Date.now() + parsedOffsetMs; cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } document.cookie = cookieToSet; hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { + + // Get cookie value, it's required for checking purpose + // in case if $now$ or $currentDate$ value is used + // https://github.com/AdguardTeam/Scriptlets/issues/291 + var cookieValueToCheck = parseCookieString(document.cookie)[name]; + + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 + if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) { window.location.reload(); } } trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' + // trusted scriptlets support no aliases ]; - trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; + + trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, parseCookieString, getCookiePath]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-replace-fetch-response + * + * @description + * Replaces response text content of `fetch` requests if **all** given parameters match. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-replace-fetch-response'[, pattern, replacement[, propsToMatch]]) + * ``` + * + * - `pattern` — optional, argument for matching contents of responseText that should be replaced. + * If set, `replacement` is required. Possible values: + * - `*` to match all text content + * - non-empty string + * - regular expression + * - `replacement` — optional, should be set if `pattern` is set. String to replace the response text content + * matched by `pattern`. Empty string to remove content. Defaults to empty string. + * - `propsToMatch` — optional, string of space-separated properties to match; possible props: + * - string or regular expression for matching the URL passed to fetch call; + * empty string, wildcard `*` or invalid regular expression will match all fetch calls + * - colon-separated pairs `name:value` where + * + * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters) + * - `value` is string or regular expression for matching the value of the option passed to fetch call; + * invalid regular expression will cause any value matching + * + * > Usage with no arguments will log fetch calls to browser console; + * > it may be useful for debugging but it is not allowed for prod versions of filter lists. + * + * > Scriptlet does nothing if response body can't be converted to text. + * + * ### Examples + * + * 1. Log all fetch calls + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response') + * ``` + * + * 1. Replace response text content of fetch requests with specific url + * + * + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', 'adb_detect:true', 'adb_detect:false', 'example.org') + * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') + * ``` + * + * + * + * 1. Remove all text content of fetch responses with specific request method + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'method:GET') + * ``` + * + * 1. Replace response text content of fetch requests matching by URL regex and request methods + * + * + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') + * ``` + * + * + * + * 1. Remove text content of all fetch responses for example.com + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ function trustedReplaceFetchResponse$1(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; } + + // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { logMessage(source, 'Pattern argument should not be empty string'); return; } - const shouldLog = pattern === '' && replacement === ''; - const nativeFetch = fetch; - let shouldReplace = false; - let fetchData; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { + var shouldLog = pattern === '' && replacement === ''; + var nativeFetch = fetch; + var shouldReplace = false; + var fetchData; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { fetchData = getFetchData(args); if (shouldLog) { + // log if no propsToMatch given logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); @@ -36598,8 +40908,17 @@ var scriptlets_umd = {exports: {}}; if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } - const forgeResponse = function forgeResponse(response, textContent) { - const bodyUsed = response.bodyUsed, + + /** + * Create new Response object using original response' properties + * and given text as body content + * + * @param {Response} response original response to copy properties from + * @param {string} textContent text to set as body content + * @returns {Response} + */ + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, headers = response.headers, ok = response.ok, redirected = response.redirected, @@ -36607,11 +40926,13 @@ var scriptlets_umd = {exports: {}}; statusText = response.statusText, type = response.type, url = response.url; - const forgedResponse = new Response(textContent, { + var forgedResponse = new Response(textContent, { status, statusText, headers }); + + // Manually set properties which can't be set by Response constructor Object.defineProperties(forgedResponse, { url: { value: url @@ -36631,16 +40952,19 @@ var scriptlets_umd = {exports: {}}; }); return forgedResponse; }; + + // eslint-disable-next-line prefer-spread return nativeFetch.apply(null, args).then(function (response) { return response.text().then(function (bodyText) { - const patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); - const modifiedTextContent = bodyText.replace(patternRegexp, replacement); - const forgedResponse = forgeResponse(response, modifiedTextContent); + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); hit(source); return forgedResponse; }).catch(function () { - const fetchDataStr = objectToString(fetchData); - const message = "Response body can't be converted to text: ".concat(fetchDataStr); + // log if response body can't be converted to a string + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); logMessage(source, message); return Reflect.apply(target, thisArg, args); }); @@ -36648,13 +40972,75 @@ var scriptlets_umd = {exports: {}}; return Reflect.apply(target, thisArg, args); }); }; - const fetchHandler = { + var fetchHandler = { apply: handlerWrapper }; - fetch = new Proxy(fetch, fetchHandler); + fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } - trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response']; - trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; + + trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response' + // trusted scriptlets support no aliases + ]; + + trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-local-storage-item + * + * @description + * Adds item with arbitrary key and value to localStorage object, or updates the value of the key if it already exists. + * Scriptlet won't set item if storage is full. + * + * ### Syntax + * + * ```adblock + * example.com#%#//scriptlet('trusted-set-local-storage-item', 'key', 'value') + * ``` + * + * - `key` — required, key name to be set. + * - `value` — required, key value; possible values: + * - arbitrary value + * - `$now$` keyword for setting current time in ms, corresponds to `Date.now()` and `(new Date).getTime()` calls + * - `$currentDate$` keyword for setting string representation of the current date and time, + * corresponds to `Date()` and `(new Date).toString()` calls + * + * ### Examples + * + * 1. Set local storage item + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.mute', 'false') + * + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'COOKIE_CONSENTS', '{"preferences":3,"flag":false}') + * + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '[16364,88364]') + * + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '{"providers":[123,456],"consent":"all"}') + * ``` + * + * 1. Set item with current time since unix epoch in ms + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$now$') + * ``` + * + * 1. Set item with current date, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$currentDate$') + * ``` + * + * 1. Set item without value + * + * ```adblock + * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '') + * ``` + * + * @added v1.7.3. + */ + /* eslint-enable max-len */ + function trustedSetLocalStorageItem$1(source, key, value) { if (typeof key === 'undefined') { logMessage(source, 'Item key should be specified'); @@ -36664,43 +41050,126 @@ var scriptlets_umd = {exports: {}}; logMessage(source, 'Item value should be specified'); return; } - const parsedValue = parseKeywordValue(value); - const _window = window, + var parsedValue = parseKeywordValue(value); + var _window = window, localStorage = _window.localStorage; setStorageItem(source, localStorage, key, parsedValue); hit(source); } trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item' + // trusted scriptlets support no aliases ]; + trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-set-constant + * + * @description + * Creates a constant property and assigns it a specified value. + * + * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type. + * + * > If empty object is present in chain it will be trapped until chain leftovers appear. + * + * > Use [set-constant](./about-scriptlets.md#set-constant) to set predefined values and functions. + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('trusted-set-constant', property, value[, stack]) + * ``` + * + * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`. + * - `value` — required, an arbitrary value to be set; value type is being inferred from the argument, + * e.g '500' will be set as number; to set string type value wrap argument into another pair of quotes: `'"500"'`; + * - `stack` — optional, string or regular expression that must match the current function call stack trace; + * if regular expression is invalid it will be skipped + * + * ### Examples + * + * 1. Set property values of different types + * + * ```adblock + * ! Set string value wrapping argument into another pair of quotes + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '"null"') + * + * ✔ window.click_r === 'null' + * ✔ typeof window.click_r === 'string' + * + * ! Set inferred null value + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', 'null') + * + * ✔ window.click_r === null + * ✔ typeof window.click_r === 'object' + * + * ! Set number type value + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '48') + * + * ✔ window.click_r === 48 + * ✔ typeof window.click_r === 'number' + * + * ! Set array or object as property value, argument should be a JSON string + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '[1,"string"]') + * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '{"aaa":123,"bbb":{"ccc":"string"}}') + * ``` + * + * 1. Use script stack matching to set value + * + * ```adblock + * ! `document.first` will return `1` if the method is related to `checking.js` + * example.org#%#//scriptlet('trusted-set-constant', 'document.first', '1', 'checking.js') + * + * ✔ document.first === 1 // if the condition described above is met + * ``` + * + * @added v1.8.2. + */ + /* eslint-enable max-len */ function trustedSetConstant$1(source, property, value, stack) { if (!property || !matchStackTrace(stack, new Error().stack)) { return; } - let constantValue; + var constantValue; try { constantValue = inferValue(value); } catch (e) { logMessage(source, e); return; } - let canceled = false; - const mustCancel = function mustCancel(value) { + var canceled = false; + var mustCancel = function mustCancel(value) { if (canceled) { return canceled; } canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; return canceled; }; - const trapProp = function trapProp(base, prop, configurable, handler) { + + /** + * Safely sets property on a given object + * + * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} base arbitrary reachable object + * @param {string} prop property name + * @param {boolean} configurable if set property should be configurable + * @param {object} handler custom property descriptor object + * @returns {boolean} true if prop was trapped successfully + */ + var trapProp = function trapProp(base, prop, configurable, handler) { if (!handler.init(base[prop])) { return false; } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + // This is required to prevent scriptlets overwrite each over if (origDescriptor instanceof Object) { + // This check is required to avoid defining non-configurable props if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); + var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } @@ -36723,12 +41192,27 @@ var scriptlets_umd = {exports: {}}; }); return true; }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, + + /** + * Traverses given chain to set constant value to its end prop + * Chains that yet include non-object values (e.g null) are valid and will be + * traversed when appropriate chain member is set by an external script + * + * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as + * reorganizing this to common helpers will most definitely complicate debugging + * + * @param {object} owner object that owns chain + * @param {string} property chain of owner properties + */ + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; - const inChainPropHandler = { + + // Handler method init is used to keep track of factual value + // and apply mustCancel() check only on end prop + var inChainPropHandler = { factValue: undefined, init(a) { this.factValue = a; @@ -36738,6 +41222,7 @@ var scriptlets_umd = {exports: {}}; return this.factValue; }, set(a) { + // Prevent breakage due to loop assignments like win.obj = win.obj if (this.factValue === a) { return; } @@ -36747,7 +41232,7 @@ var scriptlets_umd = {exports: {}}; } } }; - const endPropHandler = { + var endPropHandler = { init(a) { if (mustCancel(a)) { return false; @@ -36764,44 +41249,102 @@ var scriptlets_umd = {exports: {}}; constantValue = a; } }; + + // End prop case if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); + var isTrapped = trapProp(base, prop, false, endPropHandler); if (isTrapped) { hit(source); } return; } + + // Null prop in chain if (base !== undefined && base[prop] === null) { trapProp(base, prop, true, inChainPropHandler); return; } + + // Empty object prop in chain if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { trapProp(base, prop, true, inChainPropHandler); } - const propValue = owner[prop]; + + // Defined prop in chain + var propValue = owner[prop]; if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { setChainPropAccess(propValue, chain); } + + // Undefined prop in chain trapProp(base, prop, true, inChainPropHandler); }; setChainPropAccess(window, property); } trustedSetConstant$1.names = ['trusted-set-constant' + // trusted scriptlets support no aliases ]; + trustedSetConstant$1.injections = [hit, inferValue, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest, + // following helpers should be imported and injected + // because they are used by helpers above shouldAbortInlineOrInjectedScript]; + + /* eslint-disable max-len */ + /** + * @scriptlet inject-css-in-shadow-dom + * + * @description + * Injects CSS rule into selected Shadow DOM subtrees on a page + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('inject-css-in-shadow-dom', cssRule[, hostSelector]) + * ``` + * + * - `cssRule` — required, string representing a single css rule + * - `hostSelector` — optional, string, selector to match shadow host elements. + * CSS rule will be only applied to shadow roots inside these elements. + * Defaults to injecting css rule into all available roots. + * + * ### Examples + * + * 1. Apply style to all shadow dom subtrees + * + * ```adblock + * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#advertisement { display: none !important; }') + * ``` + * + * 1. Apply style to a specific shadow dom subtree + * + * ```adblock + * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#content { margin-top: 0 !important; }', '#banner') + * ``` + * + * @added v1.8.2. + */ + /* eslint-enable max-len */ + function injectCssInShadowDom$1(source, cssRule) { - let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + // do nothing if browser does not support ShadowRoot, Proxy or Reflect + // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot if (!Element.prototype.attachShadow || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { return; } + + // Prevent url() and image-set() styles from being applied if (cssRule.match(/(url|image-set)\(.*\)/i)) { logMessage(source, '"url()" function is not allowed for css rules'); return; } - const callback = function callback(shadowRoot) { + var callback = function callback(shadowRoot) { try { - const stylesheet = new CSSStyleSheet(); + // adoptedStyleSheets and CSSStyleSheet constructor are not yet supported by Safari + // https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptedStyleSheets + // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet + var stylesheet = new CSSStyleSheet(); try { stylesheet.insertRule(cssRule); } catch (e) { @@ -36810,7 +41353,7 @@ var scriptlets_umd = {exports: {}}; } shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet]; } catch (_unused) { - const styleTag = document.createElement('style'); + var styleTag = document.createElement('style'); styleTag.innerText = cssRule; shadowRoot.appendChild(styleTag); } @@ -36820,66 +41363,429 @@ var scriptlets_umd = {exports: {}}; } injectCssInShadowDom$1.names = ['inject-css-in-shadow-dom']; injectCssInShadowDom$1.injections = [hit, logMessage, hijackAttachShadow]; - var scriptletList = Object.freeze({ + + /* eslint-disable max-len */ + /** + * @scriptlet remove-node-text + * + * @description + * Removes text from DOM nodes. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/commit/2bb446797a12086f2eebc0c8635b671b8b90c477 + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('remove-node-text', nodeName, condition) + * ``` + * + * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed. + * Must target lowercased node names, e.g `div` instead of `DIV`. + * - `textMatch` — required, string or RegExp to match against node's text content. + * If matched, the whole text will be removed. Case sensitive. + * + * ### Examples + * + * 1. Remove node's text content: + * + * ```adblock + * example.org#%#//scriptlet('remove-node-text', 'div', 'some text') + * ``` + * + * ```html + * + *
some text
+ * some text + * + * + *
+ * some text + * ``` + * + * 2. Remove node's text content, matching both node name and condition by RegExp: + * + * ```adblock + * example.org#%#//scriptlet('remove-node-text', '/[a-z]*[0-9]/', '/text/') + * ``` + * + * ```html + * + * some text + * some text + * + * + * + * some text + * ``` + * + * @added v1.9.37. + */ + /* eslint-enable max-len */ + function removeNodeText$1(source, nodeName, textMatch) { + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch; + + /** + * Handles nodes by removing text content of matched nodes + * + * Note: instead of drilling down all the arguments for both replace-node-text + * and trusted-replace-node-text scriptlets, only the handler is being passed + * + * @param {Node[]} nodes nodes to handle + * @returns {void} + */ + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + var ALL_TEXT_PATTERN = /^[\s\S]*$/; + var REPLACEMENT = ''; + replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT); + } + }); + }; + + // Apply dedicated handler to already rendered nodes... + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); + } + + // and newly added nodes + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + removeNodeText$1.names = ['remove-node-text', + // aliases are needed for matching the related scriptlet converted into our syntax + 'remove-node-text.js', 'ubo-remove-node-text.js', 'rmnt.js', 'ubo-rmnt.js', 'ubo-remove-node-text', 'ubo-rmnt']; + removeNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams, + // following helpers should be imported and injected + // because they are used by helpers above + hit, nodeListToArray, getAddedNodes, toRegExp]; + + /* eslint-disable max-len */ + /** + * @trustedScriptlet trusted-replace-node-text + * + * @description + * Replaces text in text content of matched DOM nodes. + * + * ### Syntax + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-node-text', nodeName, textMatch, pattern, replacement) + * ``` + * + * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed. + * Must target lowercased node names, e.g `div` instead of `DIV`. + * - `textMatch` — required, string or RegExp to match against node's text content. + * If matched, the whole text will be removed. Case sensitive. + * - `pattern` — required, string or regexp for matching contents of `node.textContent` that should be replaced. + * - `replacement` — required, string to replace text content matched by `pattern`. + * + * ### Examples + * + * 1. Replace node's text content: + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-node-text', 'div', 'some', 'text', 'other text') + * ``` + * + * ```html + * + *
some text
+ *
text
+ * some text + * + * + *
some other text
+ *
text
+ * some text + * ``` + * + * 2. Replace node's text content, matching both node name, text and pattern by RegExp: + * + * ```adblock + * example.org#%#//scriptlet('trusted-replace-node-text', '/[a-z]*[0-9]/', '/s\dme/', '/t\dxt/', 'other text') + * ``` + * + * ```html + * + * s0me t3xt // this node is going to be matched by both node name and text + * text // this node won't be matched by text content nor text content + * some text + * + * + * s0me other text // text content has changed + * text + * some text + * ``` + * + * @added v1.9.37. + */ + /* eslint-enable max-len */ + function trustedReplaceNodeText$1(source, nodeName, textMatch, pattern, replacement) { + var uboAliases = ['replace-node-text.js', 'rpnt.js', 'sed.js']; + + /** + * UBO replaceNodeText scriptlet has different signature: + * function replaceNodeText(nodeName, pattern, replacement, ...extraArgs) {...} + * + * with extra params being passed as ['paramname', paramvalue] + */ + if (uboAliases.includes(source.name)) { + replacement = pattern; + pattern = textMatch; + // eslint-disable-next-line prefer-destructuring, prefer-rest-params + for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) { + extraArgs[_key - 5] = arguments[_key]; + } + for (var i = 0; i < extraArgs.length; i += 1) { + var arg = extraArgs[i]; + if (arg === 'condition') { + textMatch = extraArgs[i + 1]; + break; + } + } + } + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch, + patternMatch = _parseNodeTextParams.patternMatch; + + /** + * Handles nodes by removing text content of matched nodes + * + * Note: instead of drilling down all the arguments for both replace-node-text + * and trusted-replace-node-text scriptlets, only the handler is being passed + * + * @param {Node[]} nodes nodes to handle + * @returns {void} + */ + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + replaceNodeText(source, node, patternMatch, replacement); + } + }); + }; + + // Apply dedicated handler to already rendered nodes... + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); + } + + // and newly added nodes + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + trustedReplaceNodeText$1.names = ['trusted-replace-node-text' + // trusted scriptlets support no aliases + ]; + + trustedReplaceNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams, + // following helpers should be imported and injected + // because they are used by helpers above + hit, nodeListToArray, getAddedNodes, toRegExp]; + + /* eslint-disable max-len */ + /** + * @scriptlet evaldata-prune + * + * @description + * Removes specified properties from the result of calling eval (if payloads contains `Object`) and returns to the caller. + * + * Related UBO scriptlet: + * https://github.com/gorhill/uBlock/commit/c8de9041917b61035171e454df886706f27fc4f3 + * + * ### Syntax + * + * ```text + * example.org#%#//scriptlet('evaldata-prune'[, propsToRemove [, obligatoryProps [, stack]]]) + * ``` + * + * - `propsToRemove` — optional, string of space-separated properties to remove + * - `obligatoryProps` — optional, string of space-separated properties + * which must be all present for the pruning to occur + * - `stack` — optional, string or regular expression that must match the current function call stack trace; + * if regular expression is invalid it will be skipped + * + * > Note please that you can use wildcard `*` for chain property name, + * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`. + * + * ### Examples + * + * 1. Removes property `example` from the payload of the eval call + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'example') + * ``` + * + * For instance, the following call will return `{ one: 1}` + * + * ```html + * eval({ one: 1, example: true }) + * ``` + * + * 2. If there are no specified properties in the payload of eval call, pruning will NOT occur + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'one', 'obligatoryProp') + * ``` + * + * For instance, the following call will return `{ one: 1, two: 2}` + * + * ```html + * JSON.parse('{"one":1,"two":2}') + * ``` + * + * 3. A property in a list of properties can be a chain of properties + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'a.b', 'ads.url.first') + * ``` + * + * 4. Removes property `content.ad` from the payload of eval call if its error stack trace contains `test.js` + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'content.ad', '', 'test.js') + * ``` + * + * 5. A property in a list of properties can be a chain of properties with wildcard in it + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', 'content.*.media.src', 'content.*.media.ad') + * ``` + * + * 6. Call with no arguments will log the current hostname and object payload at the console + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune') + * ``` + * + * 7. Call with only second argument will log the current hostname and matched object payload at the console + * + * ```adblock + * example.org#%#//scriptlet('evaldata-prune', '', '"id":"117458"') + * ``` + * + * @added v1.9.37. + */ + /* eslint-enable max-len */ + function evalDataPrune$1(source, propsToRemove, requiredInitialProps, stack) { + if (!!stack && !matchStackTrace(stack, new Error().stack)) { + return; + } + var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; + var evalWrapper = function evalWrapper(target, thisArg, args) { + var data = Reflect.apply(target, thisArg, args); + if (typeof data === 'object') { + data = jsonPruner(source, data, prunePaths, requiredPaths); + } + return data; + }; + var evalHandler = { + apply: evalWrapper + }; + // eslint-disable-next-line no-eval + window.eval = new Proxy(window.eval, evalHandler); + } + evalDataPrune$1.names = ['evaldata-prune', + // aliases are needed for matching the related scriptlet converted into our syntax + 'evaldata-prune.js', 'ubo-evaldata-prune.js', 'ubo-evaldata-prune']; + evalDataPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, toRegExp, isPruningNeeded, jsonPruner, + // following helpers are needed for helpers above + getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; + + /** + * This file must export all scriptlets which should be accessible + */ + + var scriptletList = /*#__PURE__*/Object.freeze({ __proto__: null, - trustedClickElement: trustedClickElement$1, + abortCurrentInlineScript: abortCurrentInlineScript$1, abortOnPropertyRead: abortOnPropertyRead$1, abortOnPropertyWrite: abortOnPropertyWrite$1, - preventSetTimeout: preventSetTimeout$1, - preventSetInterval: preventSetInterval$1, - preventWindowOpen: preventWindowOpen$1, - abortCurrentInlineScript: abortCurrentInlineScript$1, - setConstant: setConstant$1, - removeCookie: removeCookie$1, - preventAddEventListener: preventAddEventListener$1, - preventBab: preventBab$2, - nowebrtc: nowebrtc$1, + abortOnStackTrace: abortOnStackTrace$1, + adjustSetInterval: adjustSetInterval$1, + adjustSetTimeout: adjustSetTimeout$1, + debugCurrentInlineScript: debugCurrentInlineScript$1, + debugOnPropertyRead: debugOnPropertyRead$1, + debugOnPropertyWrite: debugOnPropertyWrite$1, + dirString: dirString$1, + disableNewtabLinks: disableNewtabLinks$1, + evalDataPrune: evalDataPrune$1, + forceWindowClose: forceWindowClose$1, + hideInShadowDom: hideInShadowDom$1, + injectCssInShadowDom: injectCssInShadowDom$1, + jsonPrune: jsonPrune$1, + log: log$1, logAddEventListener: logAddEventListener$1, logEval: logEval$1, - log: log$1, + logOnStacktrace: logOnStacktrace$1, + m3uPrune: m3uPrune$1, + noTopics: noTopics$1, noeval: noeval$1, + nowebrtc: nowebrtc$1, + preventAddEventListener: preventAddEventListener$1, + preventAdfly: preventAdfly$1, + preventBab: preventBab$2, + preventElementSrcLoading: preventElementSrcLoading$1, preventEvalIf: preventEvalIf$1, preventFab: preventFab$1, - setPopadsDummy: setPopadsDummy$1, + preventFetch: preventFetch$1, preventPopadsNet: preventPopadsNet$1, - preventAdfly: preventAdfly$1, - debugOnPropertyRead: debugOnPropertyRead$1, - debugOnPropertyWrite: debugOnPropertyWrite$1, - debugCurrentInlineScript: debugCurrentInlineScript$1, + preventRefresh: preventRefresh$1, + preventRequestAnimationFrame: preventRequestAnimationFrame$1, + preventSetInterval: preventSetInterval$1, + preventSetTimeout: preventSetTimeout$1, + preventWindowOpen: preventWindowOpen$1, + preventXHR: preventXHR$1, removeAttr: removeAttr$1, - setAttr: setAttr$1, removeClass: removeClass$1, - disableNewtabLinks: disableNewtabLinks$1, - adjustSetInterval: adjustSetInterval$1, - adjustSetTimeout: adjustSetTimeout$1, - dirString: dirString$1, - jsonPrune: jsonPrune$1, - preventRequestAnimationFrame: preventRequestAnimationFrame$1, + removeCookie: removeCookie$1, + removeInShadowDom: removeInShadowDom$1, + removeNodeText: removeNodeText$1, + setAttr: setAttr$1, + setConstant: setConstant$1, setCookie: setCookie$1, setCookieReload: setCookieReload$1, - hideInShadowDom: hideInShadowDom$1, - removeInShadowDom: removeInShadowDom$1, - preventFetch: preventFetch$1, setLocalStorageItem: setLocalStorageItem$1, + setPopadsDummy: setPopadsDummy$1, setSessionStorageItem: setSessionStorageItem$1, - abortOnStackTrace: abortOnStackTrace$1, - logOnStacktrace: logOnStacktrace$1, - preventXHR: preventXHR$1, - forceWindowClose: forceWindowClose$1, - preventRefresh: preventRefresh$1, - preventElementSrcLoading: preventElementSrcLoading$1, - noTopics: noTopics$1, + trustedClickElement: trustedClickElement$1, + trustedReplaceFetchResponse: trustedReplaceFetchResponse$1, + trustedReplaceNodeText: trustedReplaceNodeText$1, trustedReplaceXhrResponse: trustedReplaceXhrResponse$1, - xmlPrune: xmlPrune$1, - m3uPrune: m3uPrune$1, + trustedSetConstant: trustedSetConstant$1, trustedSetCookie: trustedSetCookie$1, trustedSetCookieReload: trustedSetCookieReload$1, - trustedReplaceFetchResponse: trustedReplaceFetchResponse$1, trustedSetLocalStorageItem: trustedSetLocalStorageItem$1, - trustedSetConstant: trustedSetConstant$1, - injectCssInShadowDom: injectCssInShadowDom$1 + xmlPrune: xmlPrune$1 }); - const redirects$1 = [{ + + /** + * Store of ADG redirects names and their analogs. + * As it is not a compatibility table, no need to keep in redirects array third-party redirects. + * + * Needed only for conversion purposes. + * e.g. googletagmanager-gtm is removed and should be removed from compatibility table as well + * but now it works as alias for google-analytics so it should stay valid for compiler + */ + var redirects$1 = [{ adg: '1x1-transparent.gif', ubo: '1x1.gif', abp: '1x1-transparent-gif' @@ -36921,12 +41827,15 @@ var scriptlets_umd = {exports: {}}; adg: 'googlesyndication-adsbygoogle', ubo: 'googlesyndication_adsbygoogle.js' }, { + // https://github.com/AdguardTeam/Scriptlets/issues/162 adg: 'googlesyndication-adsbygoogle', ubo: 'googlesyndication.com/adsbygoogle.js' }, { + // https://github.com/AdguardTeam/Scriptlets/issues/127 adg: 'googletagmanager-gtm', ubo: 'google-analytics_ga.js' }, { + // https://github.com/AdguardTeam/Scriptlets/issues/260 adg: 'googletagmanager-gtm', ubo: 'googletagmanager_gtm.js' }, { @@ -36997,6 +41906,7 @@ var scriptlets_umd = {exports: {}}; adg: 'prevent-fab-3.2.0', ubo: 'nofab.js' }, { + // AG-15917 adg: 'prevent-fab-3.2.0', ubo: 'fuckadblock.js-3.2.0' }, { @@ -37015,70 +41925,168 @@ var scriptlets_umd = {exports: {}}; adg: 'prebid-ads', ubo: 'prebid-ads.js' }]; - const JS_RULE_MARKER = '#%#'; - const COMMENT_MARKER = '!'; - const isComment = function isComment(rule) { - return startsWith$1(rule, COMMENT_MARKER); - }; - const UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\s*\+js/; - const UBO_SCRIPTLET_MASK_1 = '##+js'; - const UBO_SCRIPTLET_MASK_2 = '##script:inject'; - const UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js'; - const UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject'; - const ABP_SCRIPTLET_MASK = '#$#'; - const ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#'; - const ADG_CSS_MASK_REG = /#@?\$#.+?\s*\{.*\}\s*$/g; - const isAdgScriptletRule = function isAdgScriptletRule(rule) { - return !isComment(rule) && rule.indexOf(ADG_SCRIPTLET_MASK) > -1; - }; - const isUboScriptletRule = function isUboScriptletRule(rule) { - return (rule.indexOf(UBO_SCRIPTLET_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_MASK_2) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_2) > -1) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule); - }; - const isAbpSnippetRule = function isAbpSnippetRule(rule) { - return (rule.indexOf(ABP_SCRIPTLET_MASK) > -1 || rule.indexOf(ABP_SCRIPTLET_EXCEPTION_MASK) > -1) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule); - }; - const getScriptletsObjList = function getScriptletsObjList() { + + var JS_RULE_MARKER = '#%#'; + var COMMENT_MARKER = '!'; + + /** + * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false) + * + * @param rule rule text + * @returns if rule text is comment + */ + var isComment = function isComment(rule) { + return rule.startsWith(COMMENT_MARKER); + }; + + /* ************************************************************************ + * + * Scriptlets + * + ************************************************************************** */ + + /** + * uBlock scriptlet rule mask + */ + var UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\s*\+js/; + var UBO_SCRIPTLET_MASK_1 = '##+js'; + var UBO_SCRIPTLET_MASK_2 = '##script:inject'; + var UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js'; + var UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject'; + + /** + * AdBlock Plus snippet rule mask + */ + var ABP_SCRIPTLET_MASK = '#$#'; + var ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#'; + + /** + * AdGuard CSS rule mask + */ + var ADG_CSS_MASK_REG = /#@?\$#.+?\s*\{.*\}\s*$/g; + + /** + * Checks if the `rule` is AdGuard scriptlet rule + * + * @param rule - rule text + * @returns true if given rule is adg rule + */ + var isAdgScriptletRule = function isAdgScriptletRule(rule) { + return !isComment(rule) && rule.includes(ADG_SCRIPTLET_MASK); + }; + + /** + * Checks if the `rule` is uBO scriptlet rule + * + * @param rule rule text + * @returns true if given rule is ubo rule + */ + var isUboScriptletRule = function isUboScriptletRule(rule) { + return (rule.includes(UBO_SCRIPTLET_MASK_1) || rule.includes(UBO_SCRIPTLET_MASK_2) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_1) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_2)) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule); + }; + + /** + * Checks if the `rule` is AdBlock Plus snippet + * + * @param rule rule text + * @returns true if given rule is abp rule + */ + var isAbpSnippetRule = function isAbpSnippetRule(rule) { + return (rule.includes(ABP_SCRIPTLET_MASK) || rule.includes(ABP_SCRIPTLET_EXCEPTION_MASK)) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule); + }; + + /** + * Returns array of scriptlet objects. + * Needed for scriptlet name validation which will check aliases names. + * + * @returns Array of all scriptlet objects. + */ + var getScriptletsObjList = function getScriptletsObjList() { return Object.values(scriptletList); }; - const getScriptletByName = function getScriptletByName(name, scriptlets) { + + /** + * Finds scriptlet by the `name`. + * + * @param name Scriptlet name. + * @param scriptlets Array of all scriptlet objects. + * @returns {Function} Scriptlet function. + */ + var getScriptletByName = function getScriptletByName(name, scriptlets) { if (!scriptlets) { scriptlets = getScriptletsObjList(); } return scriptlets.find(function (s) { return s.names - && (s.names.indexOf(name) > -1 - || !endsWith(name, '.js') && s.names.indexOf("".concat(name, ".js")) > -1); + // full match name checking + && (s.names.includes(name) + // or check ubo alias name without '.js' at the end + || !name.endsWith('.js') && s.names.includes("".concat(name, ".js"))); }); }; - const scriptletObjects = getScriptletsObjList(); - const isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) { + var scriptletObjects = getScriptletsObjList(); + + /** + * Checks whether the scriptlet `name` is valid by checking the scriptlet list object. + * + * @param name Scriptlet name. + * @returns True if scriptlet name is valid. + */ + var isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) { if (!name) { return false; } - const scriptlet = getScriptletByName(name, scriptletObjects); - if (!scriptlet) { - return false; - } - return true; + return !!getScriptletByName(name, scriptletObjects); }; - const scriptletNameValidationCache = new Map(); - const isValidScriptletName = function isValidScriptletName(name) { + + /** + * Cache for better performance of scriptlet name validation. + */ + var scriptletNameValidationCache = new Map(); + + /** + * Checks whether the `name` is valid scriptlet name. + * Uses cache for better performance. + * + * @param name Scriptlet name. + * @returns true if scriptlet name is a valid one. + */ + var isValidScriptletName = function isValidScriptletName(name) { if (!name) { return false; } + // if there is no cached validation value if (!scriptletNameValidationCache.has(name)) { - const isValid = isValidScriptletNameNotCached(name); + // we should calculate it first + var isValid = isValidScriptletNameNotCached(name); + // and save it to the cache then scriptletNameValidationCache.set(name, isValid); return isValid; } + // otherwise return cached validation result return scriptletNameValidationCache.get(name); }; - const ADG_UBO_REDIRECT_MARKER = 'redirect='; - const ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule='; - const ABP_REDIRECT_MARKER = 'rewrite=abp-resource:'; - const EMPTY_REDIRECT_MARKER = 'empty'; - const VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other']; - const ABSENT_SOURCE_TYPE_REPLACEMENT = [{ + + /* ************************************************************************ + * + * Redirects + * + ************************************************************************** */ + + /** + * Redirect resources markers + */ + var ADG_UBO_REDIRECT_MARKER = 'redirect='; + var ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule='; + var ABP_REDIRECT_MARKER = 'rewrite=abp-resource:'; + var EMPTY_REDIRECT_MARKER = 'empty'; + var VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other']; + + /** + * Source types for redirect rules if there is no one of them. + * Used for ADG -> UBO conversion. + */ + var ABSENT_SOURCE_TYPE_REPLACEMENT = [{ NAME: 'nooptext', TYPES: VALID_SOURCE_TYPES }, { @@ -37109,75 +42117,133 @@ var scriptlets_umd = {exports: {}}; NAME: 'googletagservices-gpt', TYPES: ['script'] }]; - const validAdgRedirects = redirects$1.filter(function (el) { - return el.adg; + var validAdgRedirects = redirects$1.filter(function (el) { + return !!el.adg; }); - const uboToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { - return el.ubo; + + /** + * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names + * It's used for UBO -> ADG converting + */ + var uboToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) { + return !!el.ubo; }).map(function (el) { return [el.ubo, el.adg]; })); - const abpToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { - return el.abp; + + /** + * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names + * It's used for ABP -> ADG converting + */ + var abpToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) { + return !!el.abp; }).map(function (el) { return [el.abp, el.adg]; })); - const adgToUboCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { + + /** + * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names + * It's used for ADG -> UBO converting + */ + var adgToUboCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) { return el.ubo; }).map(function (el) { return [el.adg, el.ubo]; })); - const validAdgCompatibility = getObjectFromEntries(validAdgRedirects.map(function (el) { + + /** + * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names + * 'adgToUboCompatibility' is still needed for ADG -> UBO converting + */ + var validAdgCompatibility = Object.fromEntries(validAdgRedirects.map(function (el) { return [el.adg, 'valid adg redirect']; })); - const REDIRECT_RULE_TYPES = { - VALID_ADG: { + var REDIRECT_RULE_TYPES = { + ["VALID_ADG"]: { redirectMarker: ADG_UBO_REDIRECT_MARKER, - redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER, - compatibility: validAdgCompatibility + compatibility: validAdgCompatibility, + redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER }, - ADG: { + ["ADG"]: { redirectMarker: ADG_UBO_REDIRECT_MARKER, - redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER, - compatibility: adgToUboCompatibility + compatibility: adgToUboCompatibility, + redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER }, - UBO: { + ["UBO"]: { redirectMarker: ADG_UBO_REDIRECT_MARKER, - redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER, - compatibility: uboToAdgCompatibility + compatibility: uboToAdgCompatibility, + redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER }, - ABP: { + ["ABP"]: { redirectMarker: ABP_REDIRECT_MARKER, compatibility: abpToAdgCompatibility } }; - const parseModifiers = function parseModifiers(rule) { + + /** + * Parses redirect rule modifiers + * + * @param rule rule text + * @returns list of rule modifiers + */ + var parseModifiers = function parseModifiers(rule) { return substringAfter$1(rule, '$').split(','); }; - const getRedirectName = function getRedirectName(rule, marker) { - const ruleModifiers = parseModifiers(rule); - const redirectNamePart = ruleModifiers.find(function (el) { + + /** + * Gets redirect resource name + * + * @param rule rule text + * @param marker - specific Adg/Ubo or Abp redirect resources marker + * @returns - redirect resource name + */ + var getRedirectName = function getRedirectName(rule, marker) { + var ruleModifiers = parseModifiers(rule); + var redirectNamePart = ruleModifiers.find(function (el) { return el.includes(marker); }); - return substringAfter$1(redirectNamePart, marker); + return redirectNamePart ? substringAfter$1(redirectNamePart, marker) : null; }; - const isAdgRedirectRule = function isAdgRedirectRule(rule) { - const MARKER_IN_BASE_PART_MASK = '/((?!\\$|\\,).{1})redirect((-rule)?)=(.{0,}?)\\$(popup)?/'; - return !isComment(rule) && (rule.includes(REDIRECT_RULE_TYPES.ADG.redirectMarker) || rule.includes(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker)) + + /** + * Checks if the `rule` is AdGuard redirect rule. + * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier. + * + * @param rule - rule text + * @returns true if given rule is adg redirect + */ + var isAdgRedirectRule = function isAdgRedirectRule(rule) { + var MARKER_IN_BASE_PART_MASK = '/((?!\\$|\\,).{1})redirect((-rule)?)=(.{0,}?)\\$(popup)?/'; + var _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES["ADG"], + redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, + redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker; + return !isComment(rule) && (rule.includes(redirectMarker) || typeof redirectRuleMarker === 'string' && rule.includes(redirectRuleMarker)) + // some js rules may have 'redirect=' in it, so we should get rid of them && !rule.includes(JS_RULE_MARKER) + // get rid of rules like '_redirect=*://look.$popup' && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule); }; - const isRedirectRuleByType = function isRedirectRuleByType(rule, type) { - const _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[type], - redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, - redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker, - compatibility = _REDIRECT_RULE_TYPES$.compatibility; + + /** + * Checks if the `rule` satisfies the `type` + * + * @param rule - rule text + * @param type - type of a redirect rule + * @returns if the `rule` satisfies the `type` + */ + var isRedirectRuleByType = function isRedirectRuleByType(rule, type) { + var _REDIRECT_RULE_TYPES$2 = REDIRECT_RULE_TYPES[type], + redirectMarker = _REDIRECT_RULE_TYPES$2.redirectMarker, + redirectRuleMarker = _REDIRECT_RULE_TYPES$2.redirectRuleMarker, + compatibility = _REDIRECT_RULE_TYPES$2.compatibility; if (rule && !isComment(rule)) { - let marker; - let markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1; + var marker; + // check if there is a $redirect-rule modifier in rule + var markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1; if (markerIndex > -1) { marker = redirectRuleMarker; } else { + // check if there $redirect modifier in rule markerIndex = rule.indexOf(redirectMarker); if (markerIndex > -1) { marker = redirectMarker; @@ -37185,7 +42251,10 @@ var scriptlets_umd = {exports: {}}; return false; } } - const redirectName = getRedirectName(rule, marker); + if (!marker) { + return false; + } + var redirectName = getRedirectName(rule, marker); if (!redirectName) { return false; } @@ -37195,31 +42264,78 @@ var scriptlets_umd = {exports: {}}; } return false; }; - const isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) { - return isRedirectRuleByType(rule, 'VALID_ADG'); + + /** + * Checks if the `rule` is **valid** AdGuard redirect resource rule + * + * @param rule - rule text + * @returns true if given rule is valid adg redirect + */ + var isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) { + return isRedirectRuleByType(rule, "VALID_ADG"); }; - const isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) { - return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, 'ADG'); + + /** + * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion + * + * @param rule - AdGuard rule text + * @returns - true if the rule can be converted to Ubo + */ + var isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) { + return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, "ADG"); }; - const isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) { - return isRedirectRuleByType(rule, 'UBO'); + + /** + * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion + * + * @param rule - Ubo rule text + * @returns - true if the rule can be converted to AdGuard + */ + var isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) { + return isRedirectRuleByType(rule, "UBO"); }; - const isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) { - return isRedirectRuleByType(rule, 'ABP'); + + /** + * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion + * + * @param rule - Abp rule text + * @returns - true if the rule can be converted to AdGuard + */ + var isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) { + return isRedirectRuleByType(rule, "ABP"); }; - const hasValidContentType = function hasValidContentType(rule) { - const ruleModifiers = parseModifiers(rule); - const sourceTypes = ruleModifiers.filter(function (el) { + + /** + * Checks if the rule has specified content type before Adg -> Ubo conversion. + * + * Used ONLY for Adg -> Ubo conversion + * because Ubo redirect rules must contain content type, but Adg and Abp must not. + * + * Also source type can not be added automatically because of such valid rules: + * ! Abp: + * $rewrite=abp-resource:blank-js,xmlhttprequest + * ! Adg: + * $script,redirect=noopvast-2.0 + * $xmlhttprequest,redirect=noopvast-2.0 + * + * @param rule rule text + * @returns if the rule has specified content type before conversion + */ + var hasValidContentType = function hasValidContentType(rule) { + var ruleModifiers = parseModifiers(rule); + // rule can have more than one source type modifier + var sourceTypes = ruleModifiers.filter(function (el) { return VALID_SOURCE_TYPES.includes(el); }); - const isSourceTypeSpecified = sourceTypes.length > 0; - const isEmptyRedirect = ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER)); + var isSourceTypeSpecified = sourceTypes.length > 0; + var isEmptyRedirect = ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes("".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER)); if (isEmptyRedirect) { + // no source type for 'empty' is allowed return true; } return isSourceTypeSpecified; }; - const validator = { + var validator = { UBO_SCRIPTLET_MASK_REG, ABP_SCRIPTLET_MASK, ABP_SCRIPTLET_EXCEPTION_MASK, @@ -37241,135 +42357,212 @@ var scriptlets_umd = {exports: {}}; getRedirectName, hasValidContentType }; + function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - var arrayWithHoles = _arrayWithHoles; + function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - var iterableToArray = _iterableToArray; + function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } - var arrayLikeToArray = _arrayLikeToArray; + function _unsupportedIterableToArray(o, minLen) { if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); + if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - var unsupportedIterableToArray = _unsupportedIterableToArray; + function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - var nonIterableRest = _nonIterableRest; + function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); - } - var toArray$1 = _toArray; - const ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; - const ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; - const ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})'; - const UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; - const UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})'; - const UBO_ALIAS_NAME_MARKER = 'ubo-'; - const UBO_SCRIPTLET_JS_ENDING = '.js'; - const UBO_XHR_TYPE = 'xhr'; - const ADG_XHR_TYPE = 'xmlhttprequest'; - const ADG_SET_CONSTANT_NAME = 'set-constant'; - const ADG_SET_CONSTANT_EMPTY_STRING = ''; - const ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr'; - const ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj'; - const UBO_SET_CONSTANT_EMPTY_STRING = '\'\''; - const UBO_SET_CONSTANT_EMPTY_ARRAY = '[]'; - const UBO_SET_CONSTANT_EMPTY_OBJECT = '{}'; - const ADG_PREVENT_FETCH_NAME = 'prevent-fetch'; - const ADG_PREVENT_FETCH_EMPTY_STRING = ''; - const ADG_PREVENT_FETCH_WILDCARD = '*'; - const UBO_NO_FETCH_IF_WILDCARD = '/^/'; - const ESCAPED_COMMA_SEPARATOR = '\\,'; - const COMMA_SEPARATOR = ','; - const REMOVE_ATTR_METHOD = 'removeAttr'; - const REMOVE_CLASS_METHOD = 'removeClass'; - const REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names; - const REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names; - const ADG_REMOVE_ATTR_NAME = REMOVE_ATTR_ALIASES[0]; - const ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0]; - const REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; - const getSentences = function getSentences(str) { - const reg = /'.*?'|".*?"|\S+/g; - return str.match(reg); - }; - const replacePlaceholders = function replacePlaceholders(str, data) { + return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); + } + + /** + * AdGuard scriptlet rule + */ + var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; + // eslint-disable-next-line no-template-curly-in-string + var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; + // eslint-disable-next-line no-template-curly-in-string + var ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})'; + + /** + * uBlock scriptlet rule mask + */ + // eslint-disable-next-line no-template-curly-in-string + var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; + // eslint-disable-next-line no-template-curly-in-string + var UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})'; + var UBO_ALIAS_NAME_MARKER = 'ubo-'; + var UBO_SCRIPTLET_JS_ENDING = '.js'; + + // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr + var UBO_XHR_TYPE = 'xhr'; + var ADG_XHR_TYPE = 'xmlhttprequest'; + var ADG_SET_CONSTANT_NAME = 'set-constant'; + var ADG_SET_CONSTANT_EMPTY_STRING = ''; + var ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr'; + var ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj'; + var UBO_SET_CONSTANT_EMPTY_STRING = '\'\''; + var UBO_SET_CONSTANT_EMPTY_ARRAY = '[]'; + var UBO_SET_CONSTANT_EMPTY_OBJECT = '{}'; + var ADG_PREVENT_FETCH_NAME = 'prevent-fetch'; + var ADG_PREVENT_FETCH_EMPTY_STRING = ''; + var ADG_PREVENT_FETCH_WILDCARD = '*'; + var UBO_NO_FETCH_IF_WILDCARD = '/^/'; + var ESCAPED_COMMA_SEPARATOR = '\\,'; + var COMMA_SEPARATOR = ','; + var REMOVE_ATTR_METHOD = 'removeAttr'; + var REMOVE_CLASS_METHOD = 'removeClass'; + var REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names; + var REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names; + var REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; + var ABP_RESOURCE_MARKER = 'abp-resource:'; + + /** + * Possible rule origins. + */ + var Origin = /*#__PURE__*/function (Origin) { + Origin["Ubo"] = "ubo"; + Origin["Abp"] = "abp"; + Origin["AdgValid"] = "adgValid"; + Origin["AdgInvalid"] = "adgInvalid"; + return Origin; + }(Origin || {}); + /** + * Array of origin names in the order they must be checked for rule conversion. + */ + var originNames = [Origin.Ubo, Origin.Abp, Origin.AdgValid, Origin.AdgInvalid]; + + /** + * Returns array of strings separated by space which is not in quotes + * + * @param str arbitrary string + * @returns result array + * @throws + */ + var getAbpSnippetArguments = function getAbpSnippetArguments(str) { + var reg = /'.*?'|".*?"|\S+/g; + var sentences = str.match(reg); + if (!sentences) { + throw new Error('Invalid ABP snippet args.'); + } + return sentences; + }; + + /** + * Replaces string with data by placeholders + * + * @param str string with placeholders + * @param data where keys are placeholders names + * @returns string filled with data + */ + var replacePlaceholders = function replacePlaceholders(str, data) { return Object.keys(data).reduce(function (acc, key) { - const reg = new RegExp("\\$\\{".concat(key, "\\}"), 'g'); + var reg = new RegExp("\\$\\{".concat(key, "\\}"), 'g'); acc = acc.replace(reg, data[key]); return acc; }, str); }; - const splitArgs = function splitArgs(str) { - const args = []; - let prevArgStart = 0; - for (let i = 0; i < str.length; i += 1) { + var splitArgs = function splitArgs(str) { + var args = []; + var prevArgStart = 0; + for (var i = 0; i < str.length; i += 1) { + // do not split args by escaped comma + // https://github.com/AdguardTeam/Scriptlets/issues/133 if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\') { args.push(str.slice(prevArgStart, i).trim()); prevArgStart = i + 1; } } + // collect arg after last comma args.push(str.slice(prevArgStart, str.length).trim()); return args; }; - const validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) { - const _parsedArgs = toArray$1(parsedArgs), + + /** + * Validates remove-attr/class scriptlet args + * + * @param parsedArgs scriptlet arguments + * @returns valid args OR error for invalid selector + */ + var validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) { + var _parsedArgs = _toArray(parsedArgs), name = _parsedArgs[0], value = _parsedArgs[1], restArgs = _parsedArgs.slice(2); + // no extra checking if there are only scriptlet name and value + // https://github.com/AdguardTeam/Scriptlets/issues/235 if (restArgs.length === 0) { return [name, value]; } - const lastArg = restArgs.pop(); - let applying; + + // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should: + // 1. check if last arg is 'applying' parameter + // 2. join 'selector' into one arg + // 3. combine all args + // https://github.com/AdguardTeam/Scriptlets/issues/133 + var lastArg = restArgs.pop(); // https://github.com/microsoft/TypeScript/issues/30406 + var applying; + // check the last parsed arg for matching possible 'applying' vale if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) { - return lastArg.indexOf(el) > -1; + return lastArg.includes(el); })) { applying = lastArg; } else { restArgs.push(lastArg); } - const selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR); + var selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR); if (selector.length > 0 && typeof document !== 'undefined') { + // empty selector is valid for these scriptlets as it applies to all elements, + // all other selectors should be validated + // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html') document.querySelectorAll(selector); } - const validArgs = applying ? [name, value, selector, applying] : [name, value, selector]; + var validArgs = applying ? [name, value, selector, applying] : [name, value, selector]; return validArgs; }; - const convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) { - const domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG); - const mask = rule.match(validator.UBO_SCRIPTLET_MASK_REG)[0]; - let template; - if (mask.indexOf('@') > -1) { + + /** + * Converts string of UBO scriptlet rule to AdGuard scriptlet rule + * + * @param rule UBO scriptlet rule + * @returns array with one AdGuard scriptlet rule + */ + var convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) { + var domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG); + var matchResult = rule.match(validator.UBO_SCRIPTLET_MASK_REG); + var mask = Array.isArray(matchResult) ? matchResult[0] : null; + var template; + if (mask !== null && mask !== void 0 && mask.includes('@')) { template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; } else { template = ADGUARD_SCRIPTLET_TEMPLATE; } - const argsStr = getStringInBraces(rule); - let parsedArgs = splitArgs(argsStr); - const scriptletName = parsedArgs[0].indexOf(UBO_SCRIPTLET_JS_ENDING) > -1 ? "ubo-".concat(parsedArgs[0]) : "ubo-".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING); - if (REMOVE_ATTR_ALIASES.indexOf(scriptletName) > -1 || REMOVE_CLASS_ALIASES.indexOf(scriptletName) > -1) { + var argsStr = getStringInBraces(rule); + var parsedArgs = splitArgs(argsStr); + var scriptletName = parsedArgs[0].includes(UBO_SCRIPTLET_JS_ENDING) ? "ubo-".concat(parsedArgs[0]) : "ubo-".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING); + if (REMOVE_ATTR_ALIASES.includes(scriptletName) || REMOVE_CLASS_ALIASES.includes(scriptletName)) { parsedArgs = validateRemoveAttrClassArgs(parsedArgs); } - const args = parsedArgs.map(function (arg, index) { - let outputArg = arg; + var args = parsedArgs.map(function (arg, index) { + var outputArg = arg; if (index === 0) { outputArg = scriptletName; } + // for example: example.org##+js(abort-current-inline-script, $, popup) if (arg === '$') { outputArg = '$$'; } @@ -37377,21 +42570,32 @@ var scriptlets_umd = {exports: {}}; }).map(function (arg) { return wrapInSingleQuotes(arg); }).join("".concat(COMMA_SEPARATOR, " ")); - const adgRule = replacePlaceholders(template, { + var adgRule = replacePlaceholders(template, { domains, args }); return [adgRule]; }; - const convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) { - const SEMICOLON_DIVIDER = /;(?=(?:(?:[^"]*"){2})*[^"]*$)/g; - const mask = rule.indexOf(validator.ABP_SCRIPTLET_MASK) > -1 ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK; - const template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; - const domains = substringBefore(rule, mask); - const args = substringAfter$1(rule, mask); + + /** + * Convert string of ABP snippet rule to AdGuard scriptlet rule + * + * @param rule ABP snippet rule + * @returns array of AdGuard scriptlet rules, one or few items depends on Abp-rule + */ + var convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) { + var SEMICOLON_DIVIDER = /;(?=(?:(?:[^"]*"){2})*[^"]*$)/g; + var mask = rule.includes(validator.ABP_SCRIPTLET_MASK) ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK; + var template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; + var domains = substringBefore(rule, mask); + var args = substringAfter$1(rule, mask); + + /* eslint-disable @typescript-eslint/no-shadow */ return args.split(SEMICOLON_DIVIDER) + // abp-rule may have `;` at the end which makes last array item irrelevant + // https://github.com/AdguardTeam/Scriptlets/issues/236 .filter(isExisting).map(function (args) { - return getSentences(args).map(function (arg, index) { + return getAbpSnippetArguments(args).map(function (arg, index) { return index === 0 ? "abp-".concat(arg) : arg; }).map(function (arg) { return wrapInSingleQuotes(arg); @@ -37402,95 +42606,181 @@ var scriptlets_umd = {exports: {}}; args }); }); + /* eslint-enable @typescript-eslint/no-shadow */ }; - const isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) { + + /** + * Validates ADG scriptlet rule syntax. + * + * IMPORTANT! The method is not very fast as it parses the rule and checks its syntax. + * + * @param adgRuleText Single ADG scriptlet rule. + * + * @returns False if ADG scriptlet rule syntax is not valid + * or `adgRuleText` is not an ADG scriptlet rule. + */ + var isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) { if (!adgRuleText) { return false; } if (!validator.isAdgScriptletRule(adgRuleText)) { return false; } - let parsedRule; + // isAdgScriptletRule() does not check the rule syntax + var parsedRule; try { + // parseRule() ensures that the rule syntax is valid + // and it will throw an error if it is not parsedRule = parseRule(adgRuleText); return validator.isValidScriptletName(parsedRule.name); } catch (e) { return false; } }; - const convertScriptletToAdg = function convertScriptletToAdg(rule) { - let result; - if (validator.isUboScriptletRule(rule)) { - result = convertUboScriptletToAdg(rule); - } else if (validator.isAbpSnippetRule(rule)) { - result = convertAbpSnippetToAdg(rule); - } else if (validator.isAdgScriptletRule(rule)) { - if (isValidAdgScriptletRuleSyntax(rule)) { - result = [rule]; - } else { - console.log("Invalid AdGuard scriptlet rule: ".concat(rule)); - result = []; - } - } else if (validator.isComment(rule)) { - result = [rule]; + + /** + * Functions to validate if a given string corresponds to a scriptlet rule of a particular origin. + */ + var OriginValidator = { + [Origin.Ubo]: validator.isUboScriptletRule, + [Origin.Abp]: validator.isAbpSnippetRule, + [Origin.AdgValid]: isValidAdgScriptletRuleSyntax, + [Origin.AdgInvalid]: function (r) { + return validator.isAdgScriptletRule(r) && !isValidAdgScriptletRuleSyntax(r); } - return result; }; - const convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) { - let res; + + // Functions to convert a given scriptlet rule from a mapped origin to an AdGuard rule + var Converter = { + [Origin.Ubo]: convertUboScriptletToAdg, + [Origin.Abp]: convertAbpSnippetToAdg, + [Origin.AdgValid]: function (r) { + return [r]; + }, + [Origin.AdgInvalid]: function (r) { + // eslint-disable-next-line no-console + console.log("Invalid AdGuard scriptlet rule: ".concat(r)); + return []; + } + }; + + /** + * Returns rule origin name in a meaningful order. + * + * @param rule The rule string to check. + * @returns Rule origin name or undefined if the rule has no valid origin. + */ + var getRuleOrigin = function getRuleOrigin(rule) { + return originNames.find(function (originName) { + return OriginValidator[originName](rule); + }); + }; + + /** + * Converts any scriptlet rule into AdGuard syntax rule. + * Comments and non-scriptlet rules are returned without changes. + * + * @param rule Rule. + * + * @returns Array of AdGuard scriptlet rules: one array item for ADG and UBO or few items for ABP. + * For the ADG `rule` validates its syntax, and returns an empty array if it is invalid. + */ + var convertScriptletToAdg = function convertScriptletToAdg(rule) { + if (validator.isComment(rule)) { + return [rule]; + } + + // Determine rule's origin + var originName = getRuleOrigin(rule); + + // if the origin is unknown, return rule unchanged + // as it is a non-scriptlet rule + if (!originName) { + return [rule]; + } + + // Call converter of given origin + return Converter[originName](rule); + }; + + /** + * Converts AdGuard scriptlet rule to UBO syntax. + * + * @param rule AdGuard scriptlet rule + * @returns UBO scriptlet rule + * or undefined if `rule` is not valid AdGuard scriptlet rule. + */ + var convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) { + var res; if (validator.isAdgScriptletRule(rule)) { - const _parseRule = parseRule(rule), + var _parseRule = parseRule(rule), parsedName = _parseRule.name, parsedParams = _parseRule.args; - let preparedParams; + var preparedParams; if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/AdguardTeam/FiltersCompiler/issues/102 && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; } else if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/uBlockOrigin/uBlock-issues/issues/2411 && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY]; } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT]; } else if (parsedName === ADG_PREVENT_FETCH_NAME + // https://github.com/AdguardTeam/Scriptlets/issues/109 && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) { preparedParams = [UBO_NO_FETCH_IF_WILDCARD]; - } else if ((parsedName === ADG_REMOVE_ATTR_NAME || parsedName === ADG_REMOVE_CLASS_NAME) && parsedParams[1] && parsedParams[1].indexOf(COMMA_SEPARATOR) > -1) { - preparedParams = [parsedParams[0], replaceAll(parsedParams[1], COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR)]; } else { preparedParams = parsedParams; } - const adgScriptletObject = Object.keys(scriptletList).map(function (el) { - return scriptletList[el]; - }).map(function (s) { - const _s$names = toArray$1(s.names), - name = _s$names[0], - aliases = _s$names.slice(1); + if (preparedParams && preparedParams.length > 0) { + // escape all commas in params + // https://github.com/AdguardTeam/FiltersCompiler/issues/185 + preparedParams = preparedParams.map(function (param) { + if (param.includes(COMMA_SEPARATOR)) { + return replaceAll(param, COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR); + } + return param; + }); + } + + // object of name and aliases for the Adg-scriptlet + var scriptletNames = Object.keys(scriptletList); + var adgScriptletObject = scriptletNames.map(function (name) { + return scriptletList[name]; + }).map(function (scriptlet) { + var _scriptlet$names = _toArray(scriptlet.names), + name = _scriptlet$names[0], + aliases = _scriptlet$names.slice(1); return { name, aliases }; }).find(function (el) { - return el.name === parsedName || el.aliases.indexOf(parsedName) >= 0; + return el.name === parsedName || el.aliases.includes(parsedName); }); - const aliases = adgScriptletObject.aliases; + var aliases = adgScriptletObject.aliases; if (aliases.length > 0) { - const uboAlias = adgScriptletObject.aliases - .find(function (alias) { + var uboAlias = adgScriptletObject.aliases.find(function (alias) { return alias.includes(UBO_ALIAS_NAME_MARKER); }); if (uboAlias) { - const mask = rule.match(ADGUARD_SCRIPTLET_MASK_REG)[0]; - let template; - if (mask.indexOf('@') > -1) { + var matchResult = rule.match(ADGUARD_SCRIPTLET_MASK_REG); + var mask = Array.isArray(matchResult) ? matchResult[0] : null; + var template; + if (mask !== null && mask !== void 0 && mask.includes('@')) { template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE; } else { template = UBO_SCRIPTLET_TEMPLATE; } - const domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG); - const uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') + var domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG); + var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') + // '.js' in the Ubo scriptlet name can be omitted + // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets .replace(UBO_SCRIPTLET_JS_ENDING, ''); - const args = preparedParams.length > 0 ? "".concat(uboName, ", ").concat(preparedParams.join("".concat(COMMA_SEPARATOR, " "))) : uboName; - const uboRule = replacePlaceholders(template, { + var args = preparedParams.length > 0 ? "".concat(uboName, ", ").concat(preparedParams.join("".concat(COMMA_SEPARATOR, " "))) : uboName; + var uboRule = replacePlaceholders(template, { domains, args }); @@ -37500,64 +42790,115 @@ var scriptlets_umd = {exports: {}}; } return res; }; - const getAdgScriptletName = function getAdgScriptletName(rule) { - let buffer = substringAfter$1(rule, "".concat(ADG_SCRIPTLET_MASK, "(")); + + /** + * Returns scriptlet name from `rule`. + * + * @param rule AdGuard syntax scriptlet rule. + * @returns Scriptlet name or null. + */ + var getAdgScriptletName = function getAdgScriptletName(rule) { + // get substring after '#//scriptlet(' + var buffer = substringAfter$1(rule, "".concat(ADG_SCRIPTLET_MASK, "(")); if (!buffer) { return null; } - const nameQuote = buffer[0]; + // get the quote used for the first scriptlet parameter which is a name + var nameQuote = buffer[0]; + // delete the quote from the buffer buffer = buffer.slice(1); if (!buffer) { return null; } - const name = substringBefore(buffer, nameQuote); + // get a supposed scriptlet name + var name = substringBefore(buffer, nameQuote); return name === buffer ? null : name; }; - const isValidScriptletRule = function isValidScriptletRule(ruleText) { + + /** + * 1. For ADG scriptlet checks whether the scriptlet syntax and name are valid. + * 2. For UBO and ABP scriptlet first checks their compatibility with ADG + * by converting them into ADG syntax, and after that checks the name. + * + * ADG or UBO rules are "single-scriptlet", but ABP rule may contain more than one snippet + * so if at least one of them is not valid — whole `ruleText` rule is not valid too. + * + * @param ruleText Any scriptlet rule — ADG or UBO or ABP. + * + * @returns True if scriptlet name is valid in rule. + */ + var isValidScriptletRule = function isValidScriptletRule(ruleText) { if (!ruleText) { return false; } - const rulesArray = convertScriptletToAdg(ruleText); + + // `ruleText` with ABP syntax may contain more than one snippet in one rule + var rulesArray = convertScriptletToAdg(ruleText); + + // for ADG rule with invalid syntax convertScriptletToAdg() will return empty array if (rulesArray.length === 0) { return false; } - const isValid = rulesArray.every(function (rule) { - const name = getAdgScriptletName(rule); - return validator.isValidScriptletName(name); + + // checking if each of parsed scriptlets is valid + // if at least one of them is not valid - whole `ruleText` is not valid too + var isValid = rulesArray.every(function (rule) { + var name = getAdgScriptletName(rule); + return name && validator.isValidScriptletName(name); }); return isValid; }; - const getMarkerData = function getMarkerData(modifiers, redirectsData, rule) { - let marker; - let index = modifiers.findIndex(function (m) { - return m.indexOf(redirectsData.redirectRuleMarker) > -1; - }); - if (index > -1) { - marker = redirectsData.redirectRuleMarker; - } else { + + /** + * Gets index and redirect resource marker from UBO/ADG modifiers array + * + * @param modifiers rule modifiers + * @param redirectsData validator.REDIRECT_RULE_TYPES.(UBO|ADG) + * @param rule rule string + * @returns merker data object + */ + var getMarkerData = function getMarkerData(modifiers, redirectsData, rule) { + var redirectRuleMarker = redirectsData.redirectRuleMarker, + redirectMarker = redirectsData.redirectMarker; + var index; + if (redirectRuleMarker) { index = modifiers.findIndex(function (m) { - return m.indexOf(redirectsData.redirectMarker) > -1; + return m.includes(redirectRuleMarker); }); if (index > -1) { - marker = redirectsData.redirectMarker; - } else { - throw new Error("No redirect resource modifier found in rule: ".concat(rule)); + return { + index, + marker: redirectRuleMarker + }; } } - return { - index, - marker - }; + index = modifiers.findIndex(function (m) { + return m.includes(redirectMarker); + }); + if (index > -1) { + return { + index, + marker: redirectMarker + }; + } + throw new Error("No redirect resource modifier found in rule: ".concat(rule)); }; - const convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) { - const firstPartOfRule = substringBefore(rule, '$'); - const uboModifiers = validator.parseModifiers(rule); - const uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule); - const adgModifiers = uboModifiers.map(function (modifier, index) { + + /** + * Converts Ubo redirect rule to Adg one + * + * @param rule ubo redirect rule + * @returns converted adg rule + */ + var convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) { + var firstPartOfRule = substringBefore(rule, '$'); + var uboModifiers = validator.parseModifiers(rule); + var uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule); + var adgModifiers = uboModifiers.map(function (modifier, index) { if (index === uboMarkerData.index) { - const uboName = substringAfter$1(modifier, uboMarkerData.marker); - const adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName]; - const adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker; + var uboName = substringAfter$1(modifier, uboMarkerData.marker); + var adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName]; + var adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker; return "".concat(adgMarker).concat(adgName); } if (modifier === UBO_XHR_TYPE) { @@ -37567,21 +42908,35 @@ var scriptlets_umd = {exports: {}}; }).join(COMMA_SEPARATOR); return "".concat(firstPartOfRule, "$").concat(adgModifiers); }; - const convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) { - const firstPartOfRule = substringBefore(rule, '$'); - const abpModifiers = validator.parseModifiers(rule); - const adgModifiers = abpModifiers.map(function (modifier) { - if (modifier.indexOf(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker) > -1) { - const abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker); - const adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName]; + + /** + * Converts Abp redirect rule to Adg one + * + * @param rule abp redirect rule + * @returns converted adg rule + */ + var convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) { + var firstPartOfRule = substringBefore(rule, '$'); + var abpModifiers = validator.parseModifiers(rule); + var adgModifiers = abpModifiers.map(function (modifier) { + if (modifier.includes(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker)) { + var abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker); + var adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName]; return "".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName); } return modifier; }).join(COMMA_SEPARATOR); return "".concat(firstPartOfRule, "$").concat(adgModifiers); }; - const convertRedirectToAdg = function convertRedirectToAdg(rule) { - let result; + + /** + * Converts redirect rule to AdGuard one + * + * @param {string} rule redirect rule + * @returns converted adg rule + */ + var convertRedirectToAdg = function convertRedirectToAdg(rule) { + var result; if (validator.isUboRedirectCompatibleWithAdg(rule)) { result = convertUboRedirectToAdg(rule); } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) { @@ -37591,62 +42946,138 @@ var scriptlets_umd = {exports: {}}; } return result; }; - const convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) { + + /** + * Converts Adg redirect rule to Ubo one + * 1. Checks if there is Ubo analog for Adg rule + * 2. Parses the rule and checks if there are any source type modifiers which are required by Ubo + * and if there are no one we add it manually to the end. + * Source types are chosen according to redirect name + * e.g. ||ad.com^$redirect=,important ->> ||ad.com^$redirect=,important,script + * 3. Replaces Adg redirect name by Ubo analog + * + * @param rule adg rule + * @returns converted ubo rule + * @throws on incompatible rule + */ + var convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) { if (!validator.isAdgRedirectCompatibleWithUbo(rule)) { throw new Error("Unable to convert for uBO - unsupported redirect in rule: ".concat(rule)); } - const basePart = substringBefore(rule, '$'); - const adgModifiers = validator.parseModifiers(rule); - const adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule); - const adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length); + var basePart = substringBefore(rule, '$'); + var adgModifiers = validator.parseModifiers(rule); + var adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule); + var adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length); if (!validator.hasValidContentType(rule)) { - const sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) { + // add missed source types as content type modifiers + var sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) { return el.NAME === adgRedirectName; }); if (typeof sourceTypesData === 'undefined') { + // eslint-disable-next-line max-len throw new Error("Unable to convert for uBO - no types to add for specific redirect in rule: ".concat(rule)); } - const additionModifiers = sourceTypesData.TYPES; + var additionModifiers = sourceTypesData.TYPES; adgModifiers.push(...additionModifiers); } - const uboModifiers = adgModifiers.map(function (el, index) { + var uboModifiers = adgModifiers.map(function (el, index) { if (index === adgMarkerData.index) { - const uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; - const uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName]; + var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; + // eslint-disable-next-line max-len + var uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName]; return "".concat(uboMarker).concat(uboRedirectName); } return el; }).join(COMMA_SEPARATOR); return "".concat(basePart, "$").concat(uboModifiers); }; + + /** + * Converts a redirect name to ADG compatible one, if possible + * + * @param name Redirect name to convert + * @returns Converted ADG compatible redirect name or `undefined` if the redirect isn't supported + */ + var convertRedirectNameToAdg = function convertRedirectNameToAdg(name) { + var nameToCheck = name.trim(); + + // Check if the redirect is already ADG compatible + if (validator.REDIRECT_RULE_TYPES.ADG.compatibility[nameToCheck]) { + return nameToCheck; + } + + // Convert uBO redirects to ADG + if (validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck]) { + return validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck]; + } + + // Convert ABP redirects to ADG + // AGTree parses '$rewrite=abp-resource:blank-js' as 'rewrite' modifier with + // 'abp-resource:blank-js' value. So at this point we have to check if the + // redirect name starts with 'abp-resource:' and remove it if it does. + if (nameToCheck.startsWith(ABP_RESOURCE_MARKER)) { + nameToCheck = nameToCheck.slice(ABP_RESOURCE_MARKER.length).trim(); + } + + // This also returns `undefined` if the redirect isn't supported + return validator.REDIRECT_RULE_TYPES.ABP.compatibility[nameToCheck]; + }; + + /** + * @redirect google-analytics + * + * @description + * Mocks Google's Analytics and Tag Manager APIs. + * Covers functionality of + * the [obsolete googletagmanager-gtm redirect](https://github.com/AdguardTeam/Scriptlets/issues/127). + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_analytics.js + * + * ### Examples + * + * ```adblock + * ||google-analytics.com/analytics.js$script,redirect=google-analytics + * ||googletagmanager.com/gtm.js$script,redirect=google-analytics + * ``` + * + * @added v1.0.10. + */ function GoogleAnalytics(source) { - const Tracker = function Tracker() {}; - const proto = Tracker.prototype; + // eslint-disable-next-line func-names + var Tracker = function Tracker() {}; // constructor + var proto = Tracker.prototype; proto.get = noopFunc; proto.set = noopFunc; proto.send = noopFunc; - const googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; + var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; + // a -- fake arg for 'ga.length < 1' antiadblock checking + // eslint-disable-next-line no-unused-vars function ga(a) { - const len = arguments.length; + var len = arguments.length; if (len === 0) { return; } - const lastArg = arguments[len - 1]; - let replacer; + // eslint-disable-next-line prefer-rest-params + var lastArg = arguments[len - 1]; + var replacer; if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') { replacer = lastArg.hitCallback; } else if (typeof lastArg === 'function') { + // https://github.com/AdguardTeam/Scriptlets/issues/98 replacer = function replacer() { lastArg(ga.create()); }; } try { setTimeout(replacer, 1); + // eslint-disable-next-line no-empty } catch (ex) {} } ga.create = function () { return new Tracker(); }; + // https://github.com/AdguardTeam/Scriptlets/issues/134 ga.getByName = function () { return new Tracker(); }; @@ -37656,16 +43087,23 @@ var scriptlets_umd = {exports: {}}; ga.remove = noopFunc; ga.loaded = true; window[googleAnalyticsName] = ga; - const _window = window, + var _window = window, dataLayer = _window.dataLayer, - google_optimize = _window.google_optimize; + google_optimize = _window.google_optimize; // eslint-disable-line camelcase if (dataLayer instanceof Object === false) { return; } if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') { dataLayer.hide.end(); } - const handleCallback = function handleCallback(dataObj, funcName) { + + /** + * checks data object and delays callback + * + * @param {object|Array} dataObj gtag payload + * @param {string} funcName callback prop name + */ + var handleCallback = function handleCallback(dataObj, funcName) { if (dataObj && typeof dataObj[funcName] === 'function') { setTimeout(dataObj[funcName]); } @@ -37674,9 +43112,11 @@ var scriptlets_umd = {exports: {}}; dataLayer.push = function (data) { if (data instanceof Object) { handleCallback(data, 'eventCallback'); - for (const key in data) { + // eslint-disable-next-line no-restricted-syntax, guard-for-in + for (var key in data) { handleCallback(data[key], 'event_callback'); } + // eslint-disable-next-line no-prototype-builtins if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) { [].push.call(window.dataLayer, data); } @@ -37689,8 +43129,11 @@ var scriptlets_umd = {exports: {}}; return noopFunc; }; } + + // https://github.com/AdguardTeam/Scriptlets/issues/81 + // eslint-disable-next-line camelcase if (google_optimize instanceof Object && typeof google_optimize.get === 'function') { - const googleOptimizeWrapper = { + var googleOptimizeWrapper = { get: noopFunc }; window.google_optimize = googleOptimizeWrapper; @@ -37698,9 +43141,31 @@ var scriptlets_umd = {exports: {}}; hit(source); } GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js', + // https://github.com/AdguardTeam/Scriptlets/issues/127 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js']; GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray]; + + /* eslint-disable no-underscore-dangle */ + + /** + * @redirect google-analytics-ga + * + * @description + * Mocks old Google Analytics API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_ga.js + * + * ### Examples + * + * ```adblock + * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga + * ``` + * + * @added v1.0.10. + */ function GoogleAnalyticsGa(source) { + // Gaq constructor function Gaq() {} Gaq.prototype.Na = noopFunc; Gaq.prototype.O = noopFunc; @@ -37718,30 +43183,39 @@ var scriptlets_umd = {exports: {}}; if (Array.isArray(data) === false) { return; } + // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link + // https://github.com/uBlockOrigin/uBlock-issues/issues/1807 if (typeof data[0] === 'string' && /(^|\.)_link$/.test(data[0]) && typeof data[1] === 'string') { window.location.assign(data[1]); } + // https://github.com/gorhill/uBlock/issues/2162 if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') { data[2](); } }; - const gaq = new Gaq(); - const asyncTrackers = window._gaq || []; + var gaq = new Gaq(); + var asyncTrackers = window._gaq || []; if (Array.isArray(asyncTrackers)) { while (asyncTrackers[0]) { gaq.push(asyncTrackers.shift()); } } + // eslint-disable-next-line no-multi-assign window._gaq = gaq.qf = gaq; + + // Gat constructor function Gat() {} - const api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode']; - const tracker = api.reduce(function (res, funcName) { + + // Mock tracker api + var api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode']; + var tracker = api.reduce(function (res, funcName) { res[funcName] = noopFunc; return res; }, {}); tracker._getLinkerUrl = function (a) { return a; }; + // https://github.com/AdguardTeam/Scriptlets/issues/154 tracker._link = function (url) { if (typeof url !== 'string') { return; @@ -37770,61 +43244,95 @@ var scriptlets_umd = {exports: {}}; Gat.prototype.oa = noopFunc; Gat.prototype.pa = noopFunc; Gat.prototype.u = noopFunc; - const gat = new Gat(); + var gat = new Gat(); window._gat = gat; hit(source); } GoogleAnalyticsGa.names = ['google-analytics-ga', 'ubo-google-analytics_ga.js', 'google-analytics_ga.js']; GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage]; + + /* eslint-disable max-len */ + /** + * @redirect googlesyndication-adsbygoogle + * + * @description + * Mocks Google AdSense API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googlesyndication_adsbygoogle.js + * + * ### Examples + * + * ```adblock + * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle + * ``` + * + * @added v1.0.10. + */ + /* eslint-enable max-len */ function GoogleSyndicationAdsByGoogle(source) { window.adsbygoogle = { + // https://github.com/AdguardTeam/Scriptlets/issues/113 + // length: 0, loaded: true, + // https://github.com/AdguardTeam/Scriptlets/issues/184 push(arg) { if (typeof this.length === 'undefined') { this.length = 0; this.length += 1; } if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') { + // eslint-disable-next-line no-restricted-syntax for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) { - const key = _Object$keys[_i]; + var key = _Object$keys[_i]; if (typeof arg[key] === 'function') { try { + // https://github.com/AdguardTeam/Scriptlets/issues/252 + // argument "{}" is needed to fix issue with undefined argument arg[key].call(this, {}); } catch (_unused) { + /* empty */ } } } } } }; - const adElems = document.querySelectorAll('.adsbygoogle'); - const css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;'; - const statusAttrName = 'data-adsbygoogle-status'; - const ASWIFT_IFRAME_MARKER = 'aswift_'; - const GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_'; - let executed = false; - for (let i = 0; i < adElems.length; i += 1) { - const adElemChildNodes = adElems[i].childNodes; - const childNodesQuantity = adElemChildNodes.length; - let areIframesDefined = false; + var adElems = document.querySelectorAll('.adsbygoogle'); + var css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;'; + var statusAttrName = 'data-adsbygoogle-status'; + var ASWIFT_IFRAME_MARKER = 'aswift_'; + var GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_'; + var executed = false; + for (var i = 0; i < adElems.length; i += 1) { + var adElemChildNodes = adElems[i].childNodes; + var childNodesQuantity = adElemChildNodes.length; + // childNodes of .adsbygoogle can be defined if scriptlet was executed before + // so we should check that childNodes are exactly defined by us + // TODO: remake after scriptlets context developing in 1.3 + var areIframesDefined = false; if (childNodesQuantity > 0) { + // it should be only 2 child iframes if scriptlet was executed areIframesDefined = childNodesQuantity === 2 - && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1 - && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.indexOf(GOOGLE_ADS_IFRAME_MARKER) > -1; + // the first of child nodes should be aswift iframe + && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.includes(ASWIFT_IFRAME_MARKER) + // the second of child nodes should be google_ads iframe + && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.includes(GOOGLE_ADS_IFRAME_MARKER); } if (!areIframesDefined) { + // here we do the job if scriptlet has not been executed earlier adElems[i].setAttribute(statusAttrName, 'done'); - const aswiftIframe = document.createElement('iframe'); + var aswiftIframe = document.createElement('iframe'); aswiftIframe.id = "".concat(ASWIFT_IFRAME_MARKER).concat(i); aswiftIframe.style = css; adElems[i].appendChild(aswiftIframe); - const innerAswiftIframe = document.createElement('iframe'); + var innerAswiftIframe = document.createElement('iframe'); aswiftIframe.contentWindow.document.body.appendChild(innerAswiftIframe); - const googleadsIframe = document.createElement('iframe'); + var googleadsIframe = document.createElement('iframe'); googleadsIframe.id = "".concat(GOOGLE_ADS_IFRAME_MARKER).concat(i); googleadsIframe.style = css; adElems[i].appendChild(googleadsIframe); - const innerGoogleadsIframe = document.createElement('iframe'); + var innerGoogleadsIframe = document.createElement('iframe'); googleadsIframe.contentWindow.document.body.appendChild(innerGoogleadsIframe); executed = true; } @@ -37835,61 +43343,53 @@ var scriptlets_umd = {exports: {}}; } GoogleSyndicationAdsByGoogle.names = ['googlesyndication-adsbygoogle', 'ubo-googlesyndication_adsbygoogle.js', 'googlesyndication_adsbygoogle.js']; GoogleSyndicationAdsByGoogle.injections = [hit]; - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - return _arr; - } - var iterableToArrayLimit = _iterableToArrayLimit; - function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); - } - var slicedToArray = _slicedToArray; + + /* eslint-disable func-names */ + + /** + * @redirect googletagservices-gpt + * + * @description + * Mocks Google Publisher Tag API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googletagservices_gpt.js + * + * ### Examples + * + * ```adblock + * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt + * ``` + * + * @added v1.0.10. + */ function GoogleTagServicesGpt(source) { - const slots = new Map(); - const slotsById = new Map(); - const slotsPerPath = new Map(); - const slotCreatives = new Map(); - const eventCallbacks = new Map(); - const gTargeting = new Map(); - const addEventListener = function addEventListener(name, listener) { + var slots = new Map(); + var slotsById = new Map(); + var slotsPerPath = new Map(); + var slotCreatives = new Map(); + var eventCallbacks = new Map(); + var gTargeting = new Map(); + var addEventListener = function addEventListener(name, listener) { if (!eventCallbacks.has(name)) { eventCallbacks.set(name, new Set()); } eventCallbacks.get(name).add(listener); return this; }; - const removeEventListener = function removeEventListener(name, listener) { + var removeEventListener = function removeEventListener(name, listener) { if (eventCallbacks.has(name)) { return eventCallbacks.get(name).delete(listener); } return false; }; - const fireSlotEvent = function fireSlotEvent(name, slot) { + var fireSlotEvent = function fireSlotEvent(name, slot) { return new Promise(function (resolve) { requestAnimationFrame(function () { - const size = [0, 0]; - const callbacksSet = eventCallbacks.get(name) || []; - const callbackArray = Array.from(callbacksSet); - for (let i = 0; i < callbackArray.length; i += 1) { + var size = [0, 0]; + var callbacksSet = eventCallbacks.get(name) || []; + var callbackArray = Array.from(callbacksSet); + for (var i = 0; i < callbackArray.length; i += 1) { callbackArray[i]({ isEmpty: true, size, @@ -37900,39 +43400,40 @@ var scriptlets_umd = {exports: {}}; }); }); }; - const emptySlotElement = function emptySlotElement(slot) { - const node = document.getElementById(slot.getSlotElementId()); + var emptySlotElement = function emptySlotElement(slot) { + var node = document.getElementById(slot.getSlotElementId()); while (node !== null && node !== void 0 && node.lastChild) { node.lastChild.remove(); } }; - const recreateIframeForSlot = function recreateIframeForSlot(slot) { + var recreateIframeForSlot = function recreateIframeForSlot(slot) { var _document$getElementB; - const eid = "google_ads_iframe_".concat(slot.getId()); + var eid = "google_ads_iframe_".concat(slot.getId()); (_document$getElementB = document.getElementById(eid)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove(); - const node = document.getElementById(slot.getSlotElementId()); + var node = document.getElementById(slot.getSlotElementId()); if (node) { - const f = document.createElement('iframe'); + var f = document.createElement('iframe'); f.id = eid; f.srcdoc = ''; f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0'; f.setAttribute('width', 0); f.setAttribute('height', 0); + // https://github.com/AdguardTeam/Scriptlets/issues/259 f.setAttribute('data-load-complete', true); f.setAttribute('data-google-container-id', true); - f.setAttribute('sandbox', true); + f.setAttribute('sandbox', ''); node.appendChild(f); } }; - const displaySlot = function displaySlot(slot) { + var displaySlot = function displaySlot(slot) { if (!slot) { return; } - const id = slot.getSlotElementId(); + var id = slot.getSlotElementId(); if (!document.getElementById(id)) { return; } - const parent = document.getElementById(id); + var parent = document.getElementById(id); if (parent) { parent.appendChild(document.createElement('div')); } @@ -37944,19 +43445,20 @@ var scriptlets_umd = {exports: {}}; fireSlotEvent('slotOnload', slot); fireSlotEvent('impressionViewable', slot); }; - const companionAdsService = { + var companionAdsService = { addEventListener, removeEventListener, enableSyncLoading: noopFunc, setRefreshUnfilledSlots: noopFunc, getSlots: noopArray }; - const contentService = { + var contentService = { addEventListener, removeEventListener, setContent: noopFunc }; - function PassbackSlot() {} + function PassbackSlot() {} // constructor + PassbackSlot.prototype.display = noopFunc; PassbackSlot.prototype.get = noopNull; PassbackSlot.prototype.set = noopThis; @@ -37964,47 +43466,46 @@ var scriptlets_umd = {exports: {}}; PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis; PassbackSlot.prototype.setTargeting = noopThis; PassbackSlot.prototype.updateTargetingFromMap = noopThis; - function SizeMappingBuilder() {} + function SizeMappingBuilder() {} // constructor SizeMappingBuilder.prototype.addSize = noopThis; SizeMappingBuilder.prototype.build = noopNull; - const getTargetingValue = function getTargetingValue(v) { + var getTargetingValue = function getTargetingValue(v) { if (typeof v === 'string') { return [v]; } try { - return [Array.prototype.flat.call(v)[0]]; + return Array.prototype.flat.call(v); } catch (_unused) { + // do nothing } return []; }; - const updateTargeting = function updateTargeting(targeting, map) { + var updateTargeting = function updateTargeting(targeting, map) { if (typeof map === 'object') { - const entries = Object.entries(map || {}); - for (var _i = 0, _entries = entries; _i < _entries.length; _i++) { - const _entries$_i = slicedToArray(_entries[_i], 2), - k = _entries$_i[0], - v = _entries$_i[1]; - targeting.set(k, getTargetingValue(v)); + for (var key in map) { + if (Object.prototype.hasOwnProperty.call(map, key)) { + targeting.set(key, getTargetingValue(map[key])); + } } } }; - const defineSlot = function defineSlot(adUnitPath, creatives, optDiv) { + var defineSlot = function defineSlot(adUnitPath, creatives, optDiv) { if (slotsById.has(optDiv)) { var _document$getElementB2; (_document$getElementB2 = document.getElementById(optDiv)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.remove(); return slotsById.get(optDiv); } - const attributes = new Map(); - const targeting = new Map(); - const exclusions = new Set(); - const response = { + var attributes = new Map(); + var targeting = new Map(); + var exclusions = new Set(); + var response = { advertiserId: undefined, campaignId: undefined, creativeId: undefined, creativeTemplateId: undefined, lineItemId: undefined }; - const sizes = [{ + var sizes = [{ getHeight: function getHeight() { return 2; }, @@ -38012,13 +43513,13 @@ var scriptlets_umd = {exports: {}}; return 2; } }]; - const num = (slotsPerPath.get(adUnitPath) || 0) + 1; + var num = (slotsPerPath.get(adUnitPath) || 0) + 1; slotsPerPath.set(adUnitPath, num); - const id = "".concat(adUnitPath, "_").concat(num); - let clickUrl = ''; - let collapseEmptyDiv = null; - const services = new Set(); - const slot = { + var id = "".concat(adUnitPath, "_").concat(num); + var clickUrl = ''; + var collapseEmptyDiv = null; + var services = new Set(); + var slot = { addService(e) { services.add(e); return slot; @@ -38139,7 +43640,7 @@ var scriptlets_umd = {exports: {}}; slotCreatives.set(optDiv, creatives); return slot; }; - const pubAdsService = { + var pubAdsService = { addEventListener, removeEventListener, clear: noopFunc, @@ -38187,16 +43688,17 @@ var scriptlets_umd = {exports: {}}; setVideoContent: noopThis, updateCorrelator: noopFunc }; - const _window = window, + var _window = window, _window$googletag = _window.googletag, googletag = _window$googletag === void 0 ? {} : _window$googletag; - const _googletag$cmd = googletag.cmd, + var _googletag$cmd = googletag.cmd, cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd; googletag.apiReady = true; googletag.cmd = []; googletag.cmd.push = function (a) { try { a(); + // eslint-disable-next-line no-empty } catch (ex) {} return 1; }; @@ -38214,7 +43716,7 @@ var scriptlets_umd = {exports: {}}; }; googletag.disablePublisherConsole = noopFunc; googletag.display = function (arg) { - let id; + var id; if (arg !== null && arg !== void 0 && arg.getSlotElementId) { id = arg.getSlotElementId(); } else if (arg !== null && arg !== void 0 && arg.nodeType) { @@ -38242,9 +43744,28 @@ var scriptlets_umd = {exports: {}}; } GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js']; GoogleTagServicesGpt.injections = [hit, noopFunc, noopThis, noopNull, noopArray, noopStr, trueFunc]; + + /** + * @redirect scorecardresearch-beacon + * + * @description + * Mocks Scorecard Research API. + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/scorecardresearch_beacon.js + * + * ### Examples + * + * ```adblock + * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon + * ``` + * + * @added v1.0.10. + */ function ScoreCardResearchBeacon(source) { window.COMSCORE = { purge() { + // eslint-disable-next-line no-underscore-dangle window._comscore = []; }, beacon() {} @@ -38253,11 +43774,27 @@ var scriptlets_umd = {exports: {}}; } ScoreCardResearchBeacon.names = ['scorecardresearch-beacon', 'ubo-scorecardresearch_beacon.js', 'scorecardresearch_beacon.js']; ScoreCardResearchBeacon.injections = [hit]; + + /** + * @redirect metrika-yandex-tag + * + * @description + * Mocks Yandex Metrika API. + * https://yandex.ru/support/metrica/objects/method-reference.html + * + * ### Examples + * + * ```adblock + * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag + * ``` + * + * @added v1.0.10. + */ function metrikaYandexTag(source) { - const asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) { - let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - let callback = options.callback; - const ctx = options.ctx; + var asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var callback = options.callback; + var ctx = options.ctx; if (typeof callback === 'function') { callback = ctx !== undefined ? callback.bind(ctx) : callback; setTimeout(function () { @@ -38265,28 +43802,79 @@ var scriptlets_umd = {exports: {}}; }); } }; - const addFileExtension = noopFunc; - const extLink = asyncCallbackFromOptions; - const file = asyncCallbackFromOptions; - const getClientID = function getClientID(id, cb) { + + /** + * https://yandex.ru/support/metrica/objects/addfileextension.html + */ + var addFileExtension = noopFunc; + + /** + * https://yandex.ru/support/metrica/objects/extlink.html + */ + var extLink = asyncCallbackFromOptions; + + /** + * https://yandex.ru/support/metrica/objects/file.html + */ + var file = asyncCallbackFromOptions; + + /** + * https://yandex.ru/support/metrica/objects/get-client-id.html + * + * @param {string} id + * @param {Function} cb + */ + var getClientID = function getClientID(id, cb) { if (!cb) { return; } setTimeout(cb(null)); }; - const hitFunc = asyncCallbackFromOptions; - const notBounce = asyncCallbackFromOptions; - const params = noopFunc; - const reachGoal = function reachGoal(id, target, params, callback, ctx) { + + /** + * https://yandex.ru/support/metrica/objects/hit.html + */ + var hitFunc = asyncCallbackFromOptions; + + /** + * https://yandex.ru/support/metrica/objects/notbounce.html + */ + var notBounce = asyncCallbackFromOptions; + + /** + * https://yandex.ru/support/metrica/objects/params-method.html + */ + var params = noopFunc; + + /** + * https://yandex.ru/support/metrica/objects/reachgoal.html + * + * @param {string} id + * @param {string} target + * @param {object} params + * @param {Function} callback + * @param {any} ctx + */ + var reachGoal = function reachGoal(id, target, params, callback, ctx) { asyncCallbackFromOptions(null, null, { callback, ctx }); }; - const setUserID = noopFunc; - const userParams = noopFunc; - const destruct = noopFunc; - const api = { + + /** + * https://yandex.ru/support/metrica/objects/set-user-id.html + */ + var setUserID = noopFunc; + + /** + * https://yandex.ru/support/metrica/objects/user-params.html + */ + var userParams = noopFunc; + + // https://github.com/AdguardTeam/Scriptlets/issues/198 + var destruct = noopFunc; + var api = { addFileExtension, extLink, file, @@ -38306,6 +43894,7 @@ var scriptlets_umd = {exports: {}}; return api[funcName] && api[funcName](id, ...args); } function init(id) { + // yaCounter object should provide api window["yaCounter".concat(id)] = api; document.dispatchEvent(new Event("yacounter".concat(id, "inited"))); } @@ -38313,10 +43902,11 @@ var scriptlets_umd = {exports: {}}; window.ym = ym; ym.a = []; } else if (window.ym && window.ym.a) { + // Keep initial counters array intact ym.a = window.ym.a; window.ym = ym; window.ym.a.forEach(function (params) { - const id = params[0]; + var id = params[0]; init(id); }); } @@ -38324,12 +43914,34 @@ var scriptlets_umd = {exports: {}}; } metrikaYandexTag.names = ['metrika-yandex-tag']; metrikaYandexTag.injections = [hit, noopFunc]; + + /** + * @redirect metrika-yandex-watch + * + * @description + * Mocks the old Yandex Metrika API. + * https://yandex.ru/support/metrica/objects/_method-reference.html + * + * ### Examples + * + * ```adblock + * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch + * ``` + * + * @added v1.0.10. + */ function metrikaYandexWatch(source) { - const cbName = 'yandex_metrika_callbacks'; - const asyncCallbackFromOptions = function asyncCallbackFromOptions() { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let callback = options.callback; - const ctx = options.ctx; + var cbName = 'yandex_metrika_callbacks'; + + /** + * Gets callback and its context from options and call it in async way + * + * @param {object} options Yandex Metrika API options + */ + var asyncCallbackFromOptions = function asyncCallbackFromOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var callback = options.callback; + var ctx = options.ctx; if (typeof callback === 'function') { callback = ctx !== undefined ? callback.bind(ctx) : callback; setTimeout(function () { @@ -38337,14 +43949,18 @@ var scriptlets_umd = {exports: {}}; }); } }; - function Metrika() {} + function Metrika() {} // constructor Metrika.counters = noopArray; + // Methods without options Metrika.prototype.addFileExtension = noopFunc; Metrika.prototype.getClientID = noopFunc; Metrika.prototype.setUserID = noopFunc; Metrika.prototype.userParams = noopFunc; Metrika.prototype.params = noopFunc; Metrika.prototype.counters = noopArray; + + // Methods with options + // The order of arguments should be kept in according to API Metrika.prototype.extLink = function (url, options) { asyncCallbackFromOptions(options); }; @@ -38379,6 +43995,27 @@ var scriptlets_umd = {exports: {}}; } metrikaYandexWatch.names = ['metrika-yandex-watch']; metrikaYandexWatch.injections = [hit, noopFunc, noopArray]; + + /* eslint-disable func-names */ + + /** + * @redirect pardot-1.0 + * + * @description + * Mocks the pd.js file of Salesforce. + * https://pi.pardot.com/pd.js + * https://developer.salesforce.com/docs/marketing/pardot/overview + * + * ### Examples + * + * ```adblock + * ||pi.pardot.com/pd.js$script,redirect=pardot + * ||pacedg.com.au/pd.js$redirect=pardot + * ``` + * + * @added v1.6.55. + */ + function Pardot(source) { window.piVersion = '1.0.2'; window.piScriptNum = 0; @@ -38406,11 +44043,51 @@ var scriptlets_umd = {exports: {}}; } Pardot.names = ['pardot-1.0']; Pardot.injections = [hit, noopFunc, noopStr, noopNull]; - const preventBab$1 = preventBab$2; + + /** + * @redirect prevent-bab + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Mostly it is used as `scriptlet`. + * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab). + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab.js + * + * ### Examples + * + * ```adblock + * /blockadblock.$script,redirect=prevent-bab + * ``` + * + * @added v1.3.19. + */ + var preventBab$1 = preventBab$2; preventBab$1.names = ['prevent-bab', + // list of prevent-bab redirect aliases 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; + + /** + * @redirect amazon-apstag + * + * @description + * Mocks Amazon's apstag.js + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/amazon_apstag.js + * + * ### Examples + * + * ```adblock + * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag + * ``` + * + * @added v1.2.3. + */ function AmazonApstag(source) { - const apstagWrapper = { + var apstagWrapper = { fetchBids(a, b) { if (typeof b === 'function') { b([]); @@ -38425,15 +44102,33 @@ var scriptlets_umd = {exports: {}}; } AmazonApstag.names = ['amazon-apstag', 'ubo-amazon_apstag.js', 'amazon_apstag.js']; AmazonApstag.injections = [hit, noopFunc]; + + /* eslint-disable func-names */ + + /** + * @redirect matomo + * + * @description + * Mocks the piwik.js file of Matomo (formerly Piwik). + * + * ### Examples + * + * ```adblock + * ||example.org/piwik.js$script,redirect=matomo + * ``` + * + * @added v1.5.0. + */ + function Matomo(source) { - const Tracker = function Tracker() {}; + var Tracker = function Tracker() {}; Tracker.prototype.setDoNotTrack = noopFunc; Tracker.prototype.setDomains = noopFunc; Tracker.prototype.setCustomDimension = noopFunc; Tracker.prototype.trackPageView = noopFunc; - const AsyncTracker = function AsyncTracker() {}; + var AsyncTracker = function AsyncTracker() {}; AsyncTracker.prototype.addListener = noopFunc; - const matomoWrapper = { + var matomoWrapper = { getTracker: Tracker, getAsyncTracker: AsyncTracker }; @@ -38442,12 +44137,33 @@ var scriptlets_umd = {exports: {}}; } Matomo.names = ['matomo']; Matomo.injections = [hit, noopFunc]; + + /* eslint-disable func-names */ + + /** + * @redirect fingerprintjs2 + * + * @description + * Mocks FingerprintJS v2 + * https://github.com/fingerprintjs + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint2.js + * + * ### Examples + * + * ```adblock + * ||example.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2 + * ``` + * + * @added v1.5.0. + */ function Fingerprintjs2(source) { - let browserId = ''; - for (let i = 0; i < 8; i += 1) { + var browserId = ''; + for (var i = 0; i < 8; i += 1) { browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); } - const Fingerprint2 = function Fingerprint2() {}; + var Fingerprint2 = function Fingerprint2() {}; Fingerprint2.get = function (options, callback) { if (!callback) { callback = options; @@ -38465,18 +44181,42 @@ var scriptlets_umd = {exports: {}}; hit(source); } Fingerprintjs2.names = ['fingerprintjs2', + // redirect aliases are needed for conversion: + // prefixed for us 'ubo-fingerprint2.js', + // original ubo name 'fingerprint2.js']; Fingerprintjs2.injections = [hit]; + + /* eslint-disable func-names */ + + /** + * @redirect fingerprintjs3 + * + * @description + * Mocks FingerprintJS v3 + * https://github.com/fingerprintjs + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint3.js + * + * ### Examples + * + * ```adblock + * ||example.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3 + * ``` + * + * @added v1.6.2. + */ function Fingerprintjs3(source) { - const visitorId = function () { - let id = ''; - for (let i = 0; i < 8; i += 1) { + var visitorId = function () { + var id = ''; + for (var i = 0; i < 8; i += 1) { id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); } return id; }(); - const FingerprintJS = function FingerprintJS() {}; + var FingerprintJS = function FingerprintJS() {}; FingerprintJS.prototype = { load() { return Promise.resolve(new FingerprintJS()); @@ -38492,11 +44232,32 @@ var scriptlets_umd = {exports: {}}; hit(source); } Fingerprintjs3.names = ['fingerprintjs3', + // redirect aliases are needed for conversion: + // prefixed for us 'ubo-fingerprint3.js', + // original ubo name 'fingerprint3.js']; Fingerprintjs3.injections = [hit, noopStr]; + + /* eslint-disable func-names */ + + /** + * @redirect gemius + * + * @description + * Mocks Gemius Analytics. + * https://flowplayer.com/developers/plugins/gemius + * + * ### Examples + * + * ```adblock + * ||example.org/gplayer.js$script,redirect=gemius + * ``` + * + * @added v1.5.0. + */ function Gemius(source) { - const GemiusPlayer = function GemiusPlayer() {}; + var GemiusPlayer = function GemiusPlayer() {}; GemiusPlayer.prototype = { setVideoObject: noopFunc, newProgram: noopFunc, @@ -38509,14 +44270,30 @@ var scriptlets_umd = {exports: {}}; } Gemius.names = ['gemius']; Gemius.injections = [hit, noopFunc]; + + /** + * @redirect ati-smarttag + * + * @description + * Mocks AT Internat SmartTag. + * https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/ + * + * ### Examples + * + * ```adblock + * ||example.com/assets/scripts/smarttag.js$script,redirect=ati-smarttag + * ``` + * + * @added v1.5.0. + */ function ATInternetSmartTag(source) { - const setNoopFuncWrapper = { + var setNoopFuncWrapper = { set: noopFunc }; - const sendNoopFuncWrapper = { + var sendNoopFuncWrapper = { send: noopFunc }; - const ecommerceWrapper = { + var ecommerceWrapper = { displayCart: { products: setNoopFuncWrapper, cart: setNoopFuncWrapper @@ -38537,7 +44314,9 @@ var scriptlets_umd = {exports: {}}; products: setNoopFuncWrapper } }; - const tag = function tag() {}; + + // eslint-disable-next-line new-cap, func-names + var tag = function tag() {}; tag.prototype = { setConfig: noopFunc, setParam: noopFunc, @@ -38575,7 +44354,7 @@ var scriptlets_umd = {exports: {}}; removeAll: noopFunc } }; - const smartTagWrapper = { + var smartTagWrapper = { Tracker: { Tag: tag } @@ -38585,18 +44364,40 @@ var scriptlets_umd = {exports: {}}; } ATInternetSmartTag.names = ['ati-smarttag']; ATInternetSmartTag.injections = [hit, noopFunc]; + + /* eslint-disable consistent-return, no-eval */ + + /** + * @redirect prevent-bab2 + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Related UBO redirect: + * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab2.js + * + * See [redirect description](../wiki/about-redirects.md#prevent-bab2). + * + * ### Examples + * + * ```adblock + * /blockadblock.$script,redirect=prevent-bab2 + * ``` + * + * @added v1.5.0. + */ function preventBab2(source) { - const script = document.currentScript; + var script = document.currentScript; if (script === null) { return; } - const url = script.src; + var url = script.src; if (typeof url !== 'string') { return; } - const domainsStr = ['adclixx\\.net', 'adnetasia\\.com', 'adtrackers\\.net', 'bannertrack\\.net'].join('|'); - const matchStr = "^https?://[\\w-]+\\.(".concat(domainsStr, ")/."); - const domainsRegex = new RegExp(matchStr); + var domainsStr = ['adclixx\\.net', 'adnetasia\\.com', 'adtrackers\\.net', 'bannertrack\\.net'].join('|'); + var matchStr = "^https?://[\\w-]+\\.(".concat(domainsStr, ")/."); + var domainsRegex = new RegExp(matchStr); if (domainsRegex.test(url) === false) { return; } @@ -38604,15 +44405,38 @@ var scriptlets_umd = {exports: {}}; hit(source); } preventBab2.names = ['prevent-bab2', + // aliases are needed for matching the related scriptlet converted into our syntax 'nobab2.js']; preventBab2.injections = [hit]; + + /* eslint-disable func-names, no-underscore-dangle */ + + /** + * @redirect google-ima3 + * + * @description + * Mocks the IMA SDK of Google. + * + * Related Mozilla shim: + * https://searchfox.org/mozilla-central/source/browser/extensions/webcompat/shims/google-ima.js + * + * ### Examples + * + * ```adblock + * ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima3 + * ``` + * + * @added v1.6.2. + */ + function GoogleIma3(source) { - const VERSION = '3.453.0'; - const ima = {}; - const AdDisplayContainer = function AdDisplayContainer() {}; + var _window$google$ima; + var VERSION = '3.453.0'; + var ima = {}; + var AdDisplayContainer = function AdDisplayContainer() {}; AdDisplayContainer.prototype.destroy = noopFunc; AdDisplayContainer.prototype.initialize = noopFunc; - const ImaSdkSettings = function ImaSdkSettings() {}; + var ImaSdkSettings = function ImaSdkSettings() {}; ImaSdkSettings.CompanionBackfillMode = { ALWAYS: 'always', ON_MASTER_AD: 'on_master_ad' @@ -38716,12 +44540,13 @@ var scriptlets_umd = {exports: {}}; INSECURE: 2 } }; - const EventHandler = function EventHandler() { + var EventHandler = function EventHandler() { this.listeners = new Map(); this._dispatch = function (e) { - const listeners = this.listeners.get(e.type) || []; + var listeners = this.listeners.get(e.type) || []; + // eslint-disable-next-line no-restricted-syntax for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) { - const listener = _Array$from[_i]; + var listener = _Array$from[_i]; try { listener(e); } catch (r) { @@ -38740,7 +44565,8 @@ var scriptlets_umd = {exports: {}}; (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c); }; }; - const AdsManager = new EventHandler(); + var AdsManager = new EventHandler(); + /* eslint-disable no-use-before-define */ AdsManager.volume = 1; AdsManager.collapse = noopFunc; AdsManager.configureAdsManager = noopFunc; @@ -38782,8 +44608,9 @@ var scriptlets_umd = {exports: {}}; }; AdsManager.skip = noopFunc; AdsManager.start = function () { + // eslint-disable-next-line no-restricted-syntax for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) { - const type = _arr[_i2]; + var type = _arr[_i2]; try { this._dispatch(new ima.AdEvent(type)); } catch (e) { @@ -38793,8 +44620,10 @@ var scriptlets_umd = {exports: {}}; }; AdsManager.stop = noopFunc; AdsManager.updateAdsRenderingSettings = noopFunc; - const manager = Object.create(AdsManager); - const AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) { + /* eslint-enable no-use-before-define */ + + var manager = Object.create(AdsManager); + var AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) { this.type = type; this.adsRequest = adsRequest; this.userRequestContext = userRequestContext; @@ -38813,7 +44642,7 @@ var scriptlets_umd = {exports: {}}; AdsManagerLoadedEvent.Type = { ADS_MANAGER_LOADED: 'adsManagerLoaded' }; - const AdsLoader = EventHandler; + var AdsLoader = EventHandler; AdsLoader.prototype.settings = new ImaSdkSettings(); AdsLoader.prototype.contentComplete = noopFunc; AdsLoader.prototype.destroy = noopFunc; @@ -38826,23 +44655,23 @@ var scriptlets_umd = {exports: {}}; AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) { var _this = this; requestAnimationFrame(function () { - const ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED; - const event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext); + var ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED; + var event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext); _this._dispatch(event); }); - const e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext); + var e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext); requestAnimationFrame(function () { _this._dispatch(new ima.AdErrorEvent(e)); }); }; - const AdsRenderingSettings = noopFunc; - const AdsRequest = function AdsRequest() {}; + var AdsRenderingSettings = noopFunc; + var AdsRequest = function AdsRequest() {}; AdsRequest.prototype = { setAdWillAutoPlay: noopFunc, setAdWillPlayMuted: noopFunc, setContinuousPlayback: noopFunc }; - const AdPodInfo = function AdPodInfo() {}; + var AdPodInfo = function AdPodInfo() {}; AdPodInfo.prototype = { getAdPosition: function getAdPosition() { return 1; @@ -38863,7 +44692,7 @@ var scriptlets_umd = {exports: {}}; return 1; } }; - const Ad = function Ad() {}; + var Ad = function Ad() {}; Ad.prototype = { pi: new AdPodInfo(), getAdId: function getAdId() { @@ -38960,7 +44789,7 @@ var scriptlets_umd = {exports: {}}; return true; } }; - const CompanionAd = function CompanionAd() {}; + var CompanionAd = function CompanionAd() {}; CompanionAd.prototype = { getAdSlotId: function getAdSlotId() { return ''; @@ -38978,7 +44807,7 @@ var scriptlets_umd = {exports: {}}; return 1; } }; - const AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) { + var AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) { this.errorCode = code; this.message = message; this.type = type; @@ -39003,20 +44832,22 @@ var scriptlets_umd = {exports: {}}; }; AdError.ErrorCode = {}; AdError.Type = {}; - const isEngadget = function isEngadget() { + var isEngadget = function isEngadget() { try { + // eslint-disable-next-line no-restricted-syntax for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) { var _ctx$getPlayer, _ctx$getPlayer$div; - const ctx = _Object$values[_i3]; + var ctx = _Object$values[_i3]; + // eslint-disable-next-line no-restricted-properties if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) { return true; } } - } catch (e) {} + } catch (e) {} // eslint-disable-line no-empty return false; }; - const currentAd = isEngadget() ? undefined : new Ad(); - const AdEvent = function AdEvent(type) { + var currentAd = isEngadget() ? undefined : new Ad(); + var AdEvent = function AdEvent(type) { this.type = type; }; AdEvent.prototype = { @@ -39059,7 +44890,7 @@ var scriptlets_umd = {exports: {}}; VOLUME_CHANGED: 'volumeChange', VOLUME_MUTED: 'mute' }; - const AdErrorEvent = function AdErrorEvent(error) { + var AdErrorEvent = function AdErrorEvent(error) { this.error = error; this.type = 'adError'; this.getError = function () { @@ -39076,11 +44907,11 @@ var scriptlets_umd = {exports: {}}; AdErrorEvent.Type = { AD_ERROR: 'adError' }; - const CustomContentLoadedEvent = function CustomContentLoadedEvent() {}; + var CustomContentLoadedEvent = function CustomContentLoadedEvent() {}; CustomContentLoadedEvent.Type = { CUSTOM_CONTENT_LOADED: 'deprecated-event' }; - const CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {}; + var CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {}; CompanionAdSelectionSettings.CreativeType = { ALL: 'All', FLASH: 'Flash', @@ -39097,7 +44928,7 @@ var scriptlets_umd = {exports: {}}; SELECT_EXACT_MATCH: 'SelectExactMatch', SELECT_NEAR_MATCH: 'SelectNearMatch' }; - const AdCuePoints = function AdCuePoints() {}; + var AdCuePoints = function AdCuePoints() {}; AdCuePoints.prototype = { getCuePoints: function getCuePoints() { return []; @@ -39109,8 +44940,8 @@ var scriptlets_umd = {exports: {}}; return ''; } }; - const AdProgressData = noopFunc; - const UniversalAdIdInfo = function UniversalAdIdInfo() {}; + var AdProgressData = noopFunc; + var UniversalAdIdInfo = function UniversalAdIdInfo() {}; Object.assign(ima, { AdCuePoints, AdDisplayContainer, @@ -39149,13 +44980,42 @@ var scriptlets_umd = {exports: {}}; if (!window.google) { window.google = {}; } + + // Workaround for https://github.com/AdguardTeam/Scriptlets/issues/331 + // To avoid conflicts with the DAI SDK, we need to make sure that the + // google.ima.dai namespace is not overwritten. + // TODO: Later we should create a mock for the DAI SDK as well. + // See https://github.com/AdguardTeam/Scriptlets/issues/239 + if ((_window$google$ima = window.google.ima) !== null && _window$google$ima !== void 0 && _window$google$ima.dai) { + ima.dai = window.google.ima.dai; + } window.google.ima = ima; hit(source); } GoogleIma3.names = ['google-ima3', + // prefixed name 'ubo-google-ima.js', + // original ubo name 'google-ima.js']; GoogleIma3.injections = [hit, noopFunc, logMessage]; + + /* eslint-disable func-names, no-underscore-dangle */ + + /** + * @redirect didomi-loader + * + * @description + * Mocks Didomi's CMP loader script. + * https://developers.didomi.io/ + * + * ### Examples + * + * ```adblock + * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader + * ``` + * + * @added v1.6.2. + */ function DidomiLoader(source) { function UserConsentStatusForVendorSubscribe() {} UserConsentStatusForVendorSubscribe.prototype.filter = function () { @@ -39170,7 +45030,7 @@ var scriptlets_umd = {exports: {}}; return new UserConsentStatusForVendorSubscribe(); }; UserConsentStatusForVendor.prototype.subscribe = noopFunc; - const DidomiWrapper = { + var DidomiWrapper = { isConsentRequired: falseFunc, getUserConsentStatusForPurpose: trueFunc, getUserConsentStatus: trueFunc, @@ -39203,7 +45063,7 @@ var scriptlets_umd = {exports: {}}; } }; window.Didomi = DidomiWrapper; - const didomiStateWrapper = { + var didomiStateWrapper = { didomiExperimentId: '', didomiExperimentUserGroup: '', didomiGDPRApplies: 1, @@ -39219,7 +45079,7 @@ var scriptlets_umd = {exports: {}}; didomiVendorsRawConsentUnknown: '' }; window.didomiState = didomiStateWrapper; - const tcData = { + var tcData = { eventStatus: 'tcloaded', gdprApplies: false, listenerId: noopFunc, @@ -39230,19 +45090,21 @@ var scriptlets_umd = {exports: {}}; consents: [] } }; - const __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) { + + // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api + var __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) { if (typeof callback !== 'function' || command === 'removeEventListener') { return; } callback(tcData, true); }; window.__tcfapi = __tcfapiWrapper; - const didomiEventListenersWrapper = { + var didomiEventListenersWrapper = { stub: true, push: noopFunc }; window.didomiEventListeners = didomiEventListenersWrapper; - const didomiOnReadyWrapper = { + var didomiOnReadyWrapper = { stub: true, push(arg) { if (typeof arg !== 'function') { @@ -39264,6 +45126,7 @@ var scriptlets_umd = {exports: {}}; try { setTimeout(arg(window.Didomi)); } catch (e) { + /* empty */ } } }); @@ -39272,19 +45135,41 @@ var scriptlets_umd = {exports: {}}; } DidomiLoader.names = ['didomi-loader']; DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc]; + + /* eslint-disable func-names */ + + /** + * @redirect prebid + * + * @description + * Mocks the prebid.js header bidding suit. + * https://docs.prebid.org/ + * + * ### Examples + * + * ```adblock + * ||example.org/bd/hb/prebid.js$script,redirect=prebid + * ``` + * + * @added v1.6.2. + */ + function Prebid(source) { - const pushFunction = function pushFunction(arg) { + var pushFunction = function pushFunction(arg) { if (typeof arg === 'function') { try { arg.call(); } catch (ex) { + /* empty */ } } }; - const pbjsWrapper = { + var pbjsWrapper = { addAdUnits() {}, adServers: { dfp: { + // https://docs.prebid.org/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html + // returns ad URL buildVideoUrl: noopStr } }, @@ -39298,8 +45183,9 @@ var scriptlets_umd = {exports: {}}; requestBids(arg) { if (arg instanceof Object && arg.bidsBackHandler) { try { - arg.bidsBackHandler.call(); + arg.bidsBackHandler.call(); // https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html } catch (ex) { + /* empty */ } } }, @@ -39315,6 +45201,26 @@ var scriptlets_umd = {exports: {}}; } Prebid.names = ['prebid']; Prebid.injections = [hit, noopFunc, noopStr, noopArray]; + + /* eslint-disable func-names */ + + /** + * @redirect prebid-ads + * + * @description + * Sets predefined constants on a page: + * + * - `canRunAds`: `true` + * - `isAdBlockActive`: `false` + * + * ### Examples + * + * ```adblock + * ||example.org/assets/js/prebid-ads.js$script,redirect=prebid-ads + * ``` + * + * @added v1.6.2. + */ function prebidAds(source) { window.canRunAds = true; window.isAdBlockActive = false; @@ -39322,6 +45228,24 @@ var scriptlets_umd = {exports: {}}; } prebidAds.names = ['prebid-ads', 'ubo-prebid-ads.js', 'prebid-ads.js']; prebidAds.injections = [hit]; + + /* eslint-disable func-names */ + + /** + * @redirect naver-wcslog + * + * @description + * Mocks wcslog.js of Naver Analytics. + * + * ### Examples + * + * ```adblock + * ||wcs.naver.net/wcslog.js$script,redirect=naver-wcslog + * ``` + * + * @added v1.6.2. + */ + function NaverWcslog(source) { window.wcs_add = {}; window.wcs_do = noopFunc; @@ -39332,35 +45256,64 @@ var scriptlets_umd = {exports: {}}; } NaverWcslog.names = ['naver-wcslog']; NaverWcslog.injections = [hit, noopFunc]; - var redirectsList = Object.freeze({ + + var redirectsList = /*#__PURE__*/Object.freeze({ __proto__: null, - noeval: noeval$1, + ATInternetSmartTag: ATInternetSmartTag, + AmazonApstag: AmazonApstag, + DidomiLoader: DidomiLoader, + Fingerprintjs2: Fingerprintjs2, + Fingerprintjs3: Fingerprintjs3, + Gemius: Gemius, GoogleAnalytics: GoogleAnalytics, GoogleAnalyticsGa: GoogleAnalyticsGa, + GoogleIma3: GoogleIma3, GoogleSyndicationAdsByGoogle: GoogleSyndicationAdsByGoogle, GoogleTagServicesGpt: GoogleTagServicesGpt, + Matomo: Matomo, + NaverWcslog: NaverWcslog, + Pardot: Pardot, + Prebid: Prebid, ScoreCardResearchBeacon: ScoreCardResearchBeacon, metrikaYandexTag: metrikaYandexTag, metrikaYandexWatch: metrikaYandexWatch, - Pardot: Pardot, - preventFab: preventFab$1, + noeval: noeval$1, + prebidAds: prebidAds, preventBab: preventBab$1, - setPopadsDummy: setPopadsDummy$1, - preventPopadsNet: preventPopadsNet$1, - AmazonApstag: AmazonApstag, - Matomo: Matomo, - Fingerprintjs2: Fingerprintjs2, - Fingerprintjs3: Fingerprintjs3, - Gemius: Gemius, - ATInternetSmartTag: ATInternetSmartTag, preventBab2: preventBab2, - GoogleIma3: GoogleIma3, - DidomiLoader: DidomiLoader, - Prebid: Prebid, - prebidAds: prebidAds, - NaverWcslog: NaverWcslog + preventFab: preventFab$1, + preventPopadsNet: preventPopadsNet$1, + setPopadsDummy: setPopadsDummy$1 }); + + function _typeof(obj) { + "@babel/helpers - typeof"; + + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); + } + + function _toPrimitive(input, hint) { + if (_typeof(input) !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (_typeof(res) !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return _typeof(key) === "symbol" ? key : String(key); + } + function _defineProperty(obj, key, value) { + key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, @@ -39373,7 +45326,17 @@ var scriptlets_umd = {exports: {}}; } return obj; } - var defineProperty = _defineProperty; + + function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; + } + + var jsYaml$2 = {}; + + var loader$1 = {}; + + var common$6 = {}; + function isNothing(subject) { return typeof subject === 'undefined' || subject === null; } @@ -39406,35 +45369,35 @@ var scriptlets_umd = {exports: {}}; function isNegativeZero(number) { return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; } - var isNothing_1 = isNothing; - var isObject_1 = isObject; - var toArray_1 = toArray; - var repeat_1 = repeat; - var isNegativeZero_1 = isNegativeZero; - var extend_1 = extend; - var common = { - isNothing: isNothing_1, - isObject: isObject_1, - toArray: toArray_1, - repeat: repeat_1, - isNegativeZero: isNegativeZero_1, - extend: extend_1 - }; - function YAMLException$1(reason, mark) { + common$6.isNothing = isNothing; + common$6.isObject = isObject; + common$6.toArray = toArray; + common$6.repeat = repeat; + common$6.isNegativeZero = isNegativeZero; + common$6.extend = extend; + + function YAMLException$4(reason, mark) { + // Super constructor Error.call(this); this.name = 'YAMLException'; this.reason = reason; this.mark = mark; this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); + + // Include stack trace in error object if (Error.captureStackTrace) { + // Chrome and NodeJS Error.captureStackTrace(this, this.constructor); } else { + // FF, IE 10+ and Safari 6+. Fallback for others this.stack = new Error().stack || ''; } } - YAMLException$1.prototype = Object.create(Error.prototype); - YAMLException$1.prototype.constructor = YAMLException$1; - YAMLException$1.prototype.toString = function toString(compact) { + + // Inherit from Error + YAMLException$4.prototype = Object.create(Error.prototype); + YAMLException$4.prototype.constructor = YAMLException$4; + YAMLException$4.prototype.toString = function toString(compact) { var result = this.name + ': '; result += this.reason || '(unknown reason)'; if (!compact && this.mark) { @@ -39442,15 +45405,17 @@ var scriptlets_umd = {exports: {}}; } return result; }; - var exception = YAMLException$1; - function Mark(name, buffer, position, line, column) { + var exception = YAMLException$4; + + var common$5 = common$6; + function Mark$1(name, buffer, position, line, column) { this.name = name; this.buffer = buffer; this.position = position; this.line = line; this.column = column; } - Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { + Mark$1.prototype.getSnippet = function getSnippet(indent, maxLength) { var head, start, tail, end, snippet; if (!this.buffer) return null; indent = indent || 4; @@ -39476,9 +45441,9 @@ var scriptlets_umd = {exports: {}}; } } snippet = this.buffer.slice(start, end); - return common.repeat(' ', indent) + head + snippet + tail + '\n' + common.repeat(' ', indent + this.position - start + head.length) + '^'; + return common$5.repeat(' ', indent) + head + snippet + tail + '\n' + common$5.repeat(' ', indent + this.position - start + head.length) + '^'; }; - Mark.prototype.toString = function toString(compact) { + Mark$1.prototype.toString = function toString(compact) { var snippet, where = ''; if (this.name) { @@ -39493,7 +45458,9 @@ var scriptlets_umd = {exports: {}}; } return where; }; - var mark = Mark; + var mark = Mark$1; + + var YAMLException$3 = exception; var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases']; var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping']; function compileStyleAliases(map) { @@ -39507,13 +45474,15 @@ var scriptlets_umd = {exports: {}}; } return result; } - function Type$1(tag, options) { + function Type$h(tag, options) { options = options || {}; Object.keys(options).forEach(function (name) { if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { - throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + throw new YAMLException$3('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); } }); + + // TODO: Add tag format check. this.tag = tag; this.kind = options['kind'] || null; this.resolve = options['resolve'] || function () { @@ -39528,10 +45497,16 @@ var scriptlets_umd = {exports: {}}; this.defaultStyle = options['defaultStyle'] || null; this.styleAliases = compileStyleAliases(options['styleAliases'] || null); if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { - throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + throw new YAMLException$3('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); } } - var type = Type$1; + var type = Type$h; + + /*eslint-disable max-len*/ + + var common$4 = common$6; + var YAMLException$2 = exception; + var Type$g = type; function compileList(schema, name, result) { var exclude = []; schema.include.forEach(function (includedSchema) { @@ -39549,7 +45524,7 @@ var scriptlets_umd = {exports: {}}; return exclude.indexOf(index) === -1; }); } - function compileMap( + function compileMap( /* lists... */ ) { var result = { scalar: {}, @@ -39567,25 +45542,25 @@ var scriptlets_umd = {exports: {}}; } return result; } - function Schema$1(definition) { + function Schema$5(definition) { this.include = definition.include || []; this.implicit = definition.implicit || []; this.explicit = definition.explicit || []; this.implicit.forEach(function (type) { if (type.loadKind && type.loadKind !== 'scalar') { - throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); + throw new YAMLException$2('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); } }); this.compiledImplicit = compileList(this, 'implicit', []); this.compiledExplicit = compileList(this, 'explicit', []); this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); } - Schema$1.DEFAULT = null; - Schema$1.create = function createSchema() { + Schema$5.DEFAULT = null; + Schema$5.create = function createSchema() { var schemas, types; switch (arguments.length) { case 1: - schemas = Schema$1.DEFAULT; + schemas = Schema$5.DEFAULT; types = arguments[0]; break; case 2: @@ -39593,47 +45568,57 @@ var scriptlets_umd = {exports: {}}; types = arguments[1]; break; default: - throw new exception('Wrong number of arguments for Schema.create function'); + throw new YAMLException$2('Wrong number of arguments for Schema.create function'); } - schemas = common.toArray(schemas); - types = common.toArray(types); + schemas = common$4.toArray(schemas); + types = common$4.toArray(types); if (!schemas.every(function (schema) { - return schema instanceof Schema$1; + return schema instanceof Schema$5; })) { - throw new exception('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); + throw new YAMLException$2('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); } - if (!types.every(function (type$1) { - return type$1 instanceof type; + if (!types.every(function (type) { + return type instanceof Type$g; })) { - throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + throw new YAMLException$2('Specified list of YAML types (or a single Type object) contains a non-Type object.'); } - return new Schema$1({ + return new Schema$5({ include: schemas, explicit: types }); }; - var schema = Schema$1; - var str = new type('tag:yaml.org,2002:str', { + var schema = Schema$5; + + var Type$f = type; + var str = new Type$f('tag:yaml.org,2002:str', { kind: 'scalar', construct: function construct(data) { return data !== null ? data : ''; } }); - var seq = new type('tag:yaml.org,2002:seq', { + + var Type$e = type; + var seq = new Type$e('tag:yaml.org,2002:seq', { kind: 'sequence', construct: function construct(data) { return data !== null ? data : []; } }); - var map = new type('tag:yaml.org,2002:map', { + + var Type$d = type; + var map = new Type$d('tag:yaml.org,2002:map', { kind: 'mapping', construct: function construct(data) { return data !== null ? data : {}; } }); - var failsafe = new schema({ + + var Schema$4 = schema; + var failsafe = new Schema$4({ explicit: [str, seq, map] }); + + var Type$c = type; function resolveYamlNull(data) { if (data === null) return true; var max = data.length; @@ -39645,7 +45630,7 @@ var scriptlets_umd = {exports: {}}; function isNull(object) { return object === null; } - var _null = new type('tag:yaml.org,2002:null', { + var _null = new Type$c('tag:yaml.org,2002:null', { kind: 'scalar', resolve: resolveYamlNull, construct: constructYamlNull, @@ -39666,6 +45651,8 @@ var scriptlets_umd = {exports: {}}; }, defaultStyle: 'lowercase' }); + + var Type$b = type; function resolveYamlBoolean(data) { if (data === null) return false; var max = data.length; @@ -39677,7 +45664,7 @@ var scriptlets_umd = {exports: {}}; function isBoolean(object) { return Object.prototype.toString.call(object) === '[object Boolean]'; } - var bool = new type('tag:yaml.org,2002:bool', { + var bool = new Type$b('tag:yaml.org,2002:bool', { kind: 'scalar', resolve: resolveYamlBoolean, construct: constructYamlBoolean, @@ -39695,15 +45682,21 @@ var scriptlets_umd = {exports: {}}; }, defaultStyle: 'lowercase' }); + + var common$3 = common$6; + var Type$a = type; function isHexCode(c) { - return 0x30 <= c && c <= 0x39 || 0x41 <= c && c <= 0x46 || 0x61 <= c && c <= 0x66 ; + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */; } + function isOctCode(c) { - return 0x30 <= c && c <= 0x37 ; + return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */; } + function isDecCode(c) { - return 0x30 <= c && c <= 0x39 ; + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */; } + function resolveYamlInteger(data) { if (data === null) return false; var max = data.length, @@ -39712,13 +45705,20 @@ var scriptlets_umd = {exports: {}}; ch; if (!max) return false; ch = data[index]; + + // sign if (ch === '-' || ch === '+') { ch = data[++index]; } if (ch === '0') { + // 0 if (index + 1 === max) return true; ch = data[++index]; + + // base 2, base 8, base 16 + if (ch === 'b') { + // base 2 index++; for (; index < max; index++) { ch = data[index]; @@ -39729,6 +45729,7 @@ var scriptlets_umd = {exports: {}}; return hasDigits && ch !== '_'; } if (ch === 'x') { + // base 16 index++; for (; index < max; index++) { ch = data[index]; @@ -39738,6 +45739,8 @@ var scriptlets_umd = {exports: {}}; } return hasDigits && ch !== '_'; } + + // base 8 for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; @@ -39746,6 +45749,10 @@ var scriptlets_umd = {exports: {}}; } return hasDigits && ch !== '_'; } + + // base 10 (except 0) or base 60 + + // value should not start with `_`; if (ch === '_') return false; for (; index < max; index++) { ch = data[index]; @@ -39756,8 +45763,14 @@ var scriptlets_umd = {exports: {}}; } hasDigits = true; } + + // Should have digits and should not end with `_` if (!hasDigits || ch === '_') return false; + + // if !base60 - done; if (ch !== ':') return true; + + // base60 almost not used, no needs to optimize return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); } function constructYamlInteger(data) { @@ -39796,9 +45809,9 @@ var scriptlets_umd = {exports: {}}; return sign * parseInt(value, 10); } function isInteger(object) { - return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common.isNegativeZero(object); + return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common$3.isNegativeZero(object); } - var int = new type('tag:yaml.org,2002:int', { + var int = new Type$a('tag:yaml.org,2002:int', { kind: 'scalar', resolve: resolveYamlInteger, construct: constructYamlInteger, @@ -39813,6 +45826,7 @@ var scriptlets_umd = {exports: {}}; decimal: function decimal(obj) { return obj.toString(10); }, + /* eslint-disable max-len */ hexadecimal: function hexadecimal(obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); } @@ -39825,15 +45839,26 @@ var scriptlets_umd = {exports: {}}; hexadecimal: [16, 'hex'] } }); + + var common$2 = common$6; + var Type$9 = type; var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 + // special case, seems not from spec '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // 20:59 '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + + // .inf '|[-+]?\\.(?:inf|Inf|INF)' + + // .nan '|\\.(?:nan|NaN|NAN))$'); function resolveYamlFloat(data) { if (data === null) return false; if (!YAML_FLOAT_PATTERN.test(data) || + // Quick hack to not allow integers end with `_` + // Probably should update regexp & check speed data[data.length - 1] === '_') { return false; } @@ -39895,16 +45920,20 @@ var scriptlets_umd = {exports: {}}; case 'camelcase': return '-.Inf'; } - } else if (common.isNegativeZero(object)) { + } else if (common$2.isNegativeZero(object)) { return '-0.0'; } res = object.toString(10); + + // JS stringifier can build scientific format without dots: 5e-100, + // while YAML requres dot: 5.e-100. Fix it with simple hack + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; } function isFloat(object) { - return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common.isNegativeZero(object)); + return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common$2.isNegativeZero(object)); } - var float = new type('tag:yaml.org,2002:float', { + var float = new Type$9('tag:yaml.org,2002:float', { kind: 'scalar', resolve: resolveYamlFloat, construct: constructYamlFloat, @@ -39912,26 +45941,45 @@ var scriptlets_umd = {exports: {}}; represent: representYamlFloat, defaultStyle: 'lowercase' }); - var json = new schema({ + + var Schema$3 = schema; + var json = new Schema$3({ include: [failsafe], implicit: [_null, bool, int, float] }); - var core = new schema({ + + var Schema$2 = schema; + var core = new Schema$2({ include: [json] }); + + var Type$8 = type; var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year '-([0-9][0-9])' + - '-([0-9][0-9])$'); + // [2] month + '-([0-9][0-9])$'); // [3] day + var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year '-([0-9][0-9]?)' + + // [2] month '-([0-9][0-9]?)' + + // [3] day '(?:[Tt]|[ \\t]+)' + + // ... '([0-9][0-9]?)' + + // [4] hour ':([0-9][0-9])' + + // [5] minute ':([0-9][0-9])' + + // [6] second '(?:\\.([0-9]*))?' + + // [7] fraction '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + - '(?::([0-9][0-9]))?))?$'); + // [8] tz [9] tz_sign [10] tz_hour + '(?::([0-9][0-9]))?))?$'); // [11] tz_minute + function resolveYamlTimestamp(data) { if (data === null) return false; if (YAML_DATE_REGEXP.exec(data) !== null) return true; @@ -39954,57 +46002,78 @@ var scriptlets_umd = {exports: {}}; match = YAML_DATE_REGEXP.exec(data); if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); if (match === null) throw new Error('Date resolve error'); + + // match: [1] year [2] month [3] day + year = +match[1]; - month = +match[2] - 1; + month = +match[2] - 1; // JS month starts with 0 day = +match[3]; if (!match[4]) { + // no hour return new Date(Date.UTC(year, month, day)); } + + // match: [4] hour [5] minute [6] second [7] fraction + hour = +match[4]; minute = +match[5]; second = +match[6]; if (match[7]) { fraction = match[7].slice(0, 3); while (fraction.length < 3) { + // milli-seconds fraction += '0'; } fraction = +fraction; } + + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute + if (match[9]) { tz_hour = +match[10]; tz_minute = +(match[11] || 0); - delta = (tz_hour * 60 + tz_minute) * 60000; + delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds if (match[9] === '-') delta = -delta; } date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); if (delta) date.setTime(date.getTime() - delta); return date; } - function representYamlTimestamp(object ) { + function representYamlTimestamp(object /*, style*/) { return object.toISOString(); } - var timestamp = new type('tag:yaml.org,2002:timestamp', { + var timestamp = new Type$8('tag:yaml.org,2002:timestamp', { kind: 'scalar', resolve: resolveYamlTimestamp, construct: constructYamlTimestamp, instanceOf: Date, represent: representYamlTimestamp }); + + var Type$7 = type; function resolveYamlMerge(data) { return data === '<<' || data === null; } - var merge = new type('tag:yaml.org,2002:merge', { + var merge = new Type$7('tag:yaml.org,2002:merge', { kind: 'scalar', resolve: resolveYamlMerge }); - function commonjsRequire (target) { - throw new Error('Could not dynamically require "' + target + '". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.'); + + function commonjsRequire(path) { + throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); } + + /*eslint-disable no-bitwise*/ + var NodeBuffer; try { + // A trick for browserified version, to not include `Buffer` shim var _require$1 = commonjsRequire; NodeBuffer = _require$1('buffer').Buffer; } catch (__) {} + var Type$6 = type; + + // [ 64, 65, 66 ] -> [ padding, CR, LF ] var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; function resolveYamlBinary(data) { if (data === null) return false; @@ -40013,22 +46082,34 @@ var scriptlets_umd = {exports: {}}; bitlen = 0, max = data.length, map = BASE64_MAP; + + // Convert one by one. for (idx = 0; idx < max; idx++) { code = map.indexOf(data.charAt(idx)); + + // Skip CR/LF if (code > 64) continue; + + // Fail on illegal characters if (code < 0) return false; bitlen += 6; } + + // If there are any bits left, source was corrupted return bitlen % 8 === 0; } function constructYamlBinary(data) { var idx, tailbits, input = data.replace(/[\r\n=]/g, ''), + // remove CR/LF & padding to simplify scan max = input.length, map = BASE64_MAP, bits = 0, result = []; + + // Collect by 6*4 bits (3 bytes) + for (idx = 0; idx < max; idx++) { if (idx % 4 === 0 && idx) { result.push(bits >> 16 & 0xFF); @@ -40037,6 +46118,9 @@ var scriptlets_umd = {exports: {}}; } bits = bits << 6 | map.indexOf(input.charAt(idx)); } + + // Dump tail + tailbits = max % 4 * 6; if (tailbits === 0) { result.push(bits >> 16 & 0xFF); @@ -40048,18 +46132,24 @@ var scriptlets_umd = {exports: {}}; } else if (tailbits === 12) { result.push(bits >> 4 & 0xFF); } + + // Wrap into Buffer for NodeJS and leave Array for browser if (NodeBuffer) { + // Support node 6.+ Buffer API when available return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); } return result; } - function representYamlBinary(object ) { + function representYamlBinary(object /*, style*/) { var result = '', bits = 0, idx, tail, max = object.length, map = BASE64_MAP; + + // Convert every three bytes to 4 ASCII characters. + for (idx = 0; idx < max; idx++) { if (idx % 3 === 0 && idx) { result += map[bits >> 18 & 0x3F]; @@ -40069,6 +46159,9 @@ var scriptlets_umd = {exports: {}}; } bits = (bits << 8) + object[idx]; } + + // Dump tail + tail = max % 3; if (tail === 0) { result += map[bits >> 18 & 0x3F]; @@ -40091,13 +46184,15 @@ var scriptlets_umd = {exports: {}}; function isBinary(object) { return NodeBuffer && NodeBuffer.isBuffer(object); } - var binary = new type('tag:yaml.org,2002:binary', { + var binary = new Type$6('tag:yaml.org,2002:binary', { kind: 'scalar', resolve: resolveYamlBinary, construct: constructYamlBinary, predicate: isBinary, represent: representYamlBinary }); + + var Type$5 = type; var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; var _toString$2 = Object.prototype.toString; function resolveYamlOmap(data) { @@ -40126,11 +46221,13 @@ var scriptlets_umd = {exports: {}}; function constructYamlOmap(data) { return data !== null ? data : []; } - var omap = new type('tag:yaml.org,2002:omap', { + var omap = new Type$5('tag:yaml.org,2002:omap', { kind: 'sequence', resolve: resolveYamlOmap, construct: constructYamlOmap }); + + var Type$4 = type; var _toString$1 = Object.prototype.toString; function resolveYamlPairs(data) { if (data === null) return true; @@ -40166,11 +46263,13 @@ var scriptlets_umd = {exports: {}}; } return result; } - var pairs = new type('tag:yaml.org,2002:pairs', { + var pairs = new Type$4('tag:yaml.org,2002:pairs', { kind: 'sequence', resolve: resolveYamlPairs, construct: constructYamlPairs }); + + var Type$3 = type; var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; function resolveYamlSet(data) { if (data === null) return true; @@ -40186,20 +46285,25 @@ var scriptlets_umd = {exports: {}}; function constructYamlSet(data) { return data !== null ? data : {}; } - var set = new type('tag:yaml.org,2002:set', { + var set = new Type$3('tag:yaml.org,2002:set', { kind: 'mapping', resolve: resolveYamlSet, construct: constructYamlSet }); - var default_safe = new schema({ + + var Schema$1 = schema; + var default_safe = new Schema$1({ include: [core], implicit: [timestamp, merge], explicit: [binary, omap, pairs, set] }); + + var Type$2 = type; function resolveJavascriptUndefined() { return true; } function constructJavascriptUndefined() { + /*eslint-disable no-undefined*/ return undefined; } function representJavascriptUndefined() { @@ -40208,22 +46312,28 @@ var scriptlets_umd = {exports: {}}; function isUndefined(object) { return typeof object === 'undefined'; } - var _undefined = new type('tag:yaml.org,2002:js/undefined', { + var _undefined = new Type$2('tag:yaml.org,2002:js/undefined', { kind: 'scalar', resolve: resolveJavascriptUndefined, construct: constructJavascriptUndefined, predicate: isUndefined, represent: representJavascriptUndefined }); + + var Type$1 = type; function resolveJavascriptRegExp(data) { if (data === null) return false; if (data.length === 0) return false; var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = ''; + + // if regexp starts with '/' it can have modifiers and must be properly closed + // `/foo/gim` - modifiers tail can be maximum 3 chars if (regexp[0] === '/') { if (tail) modifiers = tail[1]; if (modifiers.length > 3) return false; + // if expression starts with /, is should be properly terminated if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; } return true; @@ -40232,13 +46342,15 @@ var scriptlets_umd = {exports: {}}; var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = ''; + + // `/foo/gim` - tail can be maximum 4 chars if (regexp[0] === '/') { if (tail) modifiers = tail[1]; regexp = regexp.slice(1, regexp.length - modifiers.length - 1); } return new RegExp(regexp, modifiers); } - function representJavascriptRegExp(object ) { + function representJavascriptRegExp(object /*, style*/) { var result = '/' + object.source + '/'; if (object.global) result += 'g'; if (object.multiline) result += 'm'; @@ -40248,20 +46360,33 @@ var scriptlets_umd = {exports: {}}; function isRegExp(object) { return Object.prototype.toString.call(object) === '[object RegExp]'; } - var regexp = new type('tag:yaml.org,2002:js/regexp', { + var regexp = new Type$1('tag:yaml.org,2002:js/regexp', { kind: 'scalar', resolve: resolveJavascriptRegExp, construct: constructJavascriptRegExp, predicate: isRegExp, represent: representJavascriptRegExp }); + var esprima; + + // Browserified version does not have esprima + // + // 1. For node.js just require module as deps + // 2. For browser try to require mudule via external AMD system. + // If not found - try to fallback to window.esprima. If not + // found too - then fail to parse. + // try { + // workaround to exclude package from browserify list. var _require = commonjsRequire; esprima = _require('esprima'); } catch (_) { + /* eslint-disable no-redeclare */ + /* global window */ if (typeof window !== 'undefined') esprima = window.esprima; } + var Type = type; function resolveJavascriptFunction(data) { if (data === null) return false; try { @@ -40278,6 +46403,8 @@ var scriptlets_umd = {exports: {}}; } } function constructJavascriptFunction(data) { + /*jslint evil:true*/ + var source = '(' + data + ')', ast = esprima.parse(source, { range: true @@ -40291,28 +46418,45 @@ var scriptlets_umd = {exports: {}}; params.push(param.name); }); body = ast.body[0].expression.body.range; + + // Esprima's ranges include the first '{' and the last '}' characters on + // function expressions. So cut them out. if (ast.body[0].expression.body.type === 'BlockStatement') { + /*eslint-disable no-new-func*/ return new Function(params, source.slice(body[0] + 1, body[1] - 1)); } + // ES6 arrow functions can omit the BlockStatement. In that case, just return + // the body. + /*eslint-disable no-new-func*/ return new Function(params, 'return ' + source.slice(body[0], body[1])); } - function representJavascriptFunction(object ) { + function representJavascriptFunction(object /*, style*/) { return object.toString(); } function isFunction(object) { return Object.prototype.toString.call(object) === '[object Function]'; } - var _function = new type('tag:yaml.org,2002:js/function', { + var _function = new Type('tag:yaml.org,2002:js/function', { kind: 'scalar', resolve: resolveJavascriptFunction, construct: constructJavascriptFunction, predicate: isFunction, represent: representJavascriptFunction }); - var default_full = schema.DEFAULT = new schema({ + + var Schema = schema; + var default_full = Schema.DEFAULT = new Schema({ include: [default_safe], explicit: [_undefined, regexp, _function] }); + + /*eslint-disable max-len,no-use-before-define*/ + + var common$1 = common$6; + var YAMLException$1 = exception; + var Mark = mark; + var DEFAULT_SAFE_SCHEMA$1 = default_safe; + var DEFAULT_FULL_SCHEMA$1 = default_full; var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; var CONTEXT_FLOW_IN = 1; var CONTEXT_FLOW_OUT = 2; @@ -40330,56 +46474,65 @@ var scriptlets_umd = {exports: {}}; return Object.prototype.toString.call(obj); } function is_EOL(c) { - return c === 0x0A || c === 0x0D ; + return c === 0x0A /* LF */ || c === 0x0D /* CR */; } + function is_WHITE_SPACE(c) { - return c === 0x09 || c === 0x20 ; + return c === 0x09 /* Tab */ || c === 0x20 /* Space */; } + function is_WS_OR_EOL(c) { - return c === 0x09 || c === 0x20 || c === 0x0A || c === 0x0D ; + return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */; } + function is_FLOW_INDICATOR(c) { - return c === 0x2C || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D ; + return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */; } + function fromHexCode(c) { var lc; - if (0x30 <= c && c <= 0x39 ) { + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { return c - 0x30; } + + /*eslint-disable no-bitwise*/ lc = c | 0x20; - if (0x61 <= lc && lc <= 0x66 ) { + if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) { return lc - 0x61 + 10; } return -1; } function escapedHexLen(c) { - if (c === 0x78 ) { + if (c === 0x78 /* x */) { return 2; } - if (c === 0x75 ) { + if (c === 0x75 /* u */) { return 4; } - if (c === 0x55 ) { + if (c === 0x55 /* U */) { return 8; } return 0; } function fromDecimalCode(c) { - if (0x30 <= c && c <= 0x39 ) { + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { return c - 0x30; } return -1; } function simpleEscapeSequence(c) { - return c === 0x30 ? '\x00' : c === 0x61 ? '\x07' : c === 0x62 ? '\x08' : c === 0x74 ? '\x09' : c === 0x09 ? '\x09' : c === 0x6E ? '\x0A' : c === 0x76 ? '\x0B' : c === 0x66 ? '\x0C' : c === 0x72 ? '\x0D' : c === 0x65 ? '\x1B' : c === 0x20 ? ' ' : c === 0x22 ? '\x22' : c === 0x2F ? '/' : c === 0x5C ? '\x5C' : c === 0x4E ? '\x85' : c === 0x5F ? '\xA0' : c === 0x4C ? "\u2028" : c === 0x50 ? "\u2029" : ''; + /* eslint-disable indent */ + return c === 0x30 /* 0 */ ? '\x00' : c === 0x61 /* a */ ? '\x07' : c === 0x62 /* b */ ? '\x08' : c === 0x74 /* t */ ? '\x09' : c === 0x09 /* Tab */ ? '\x09' : c === 0x6E /* n */ ? '\x0A' : c === 0x76 /* v */ ? '\x0B' : c === 0x66 /* f */ ? '\x0C' : c === 0x72 /* r */ ? '\x0D' : c === 0x65 /* e */ ? '\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* " */ ? '\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \ */ ? '\x5C' : c === 0x4E /* N */ ? '\x85' : c === 0x5F /* _ */ ? '\xA0' : c === 0x4C /* L */ ? "\u2028" : c === 0x50 /* P */ ? "\u2029" : ''; } function charFromCodepoint(c) { if (c <= 0xFFFF) { return String.fromCharCode(c); } + // Encode UTF-16 surrogate pair + // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00); } - var simpleEscapeCheck = new Array(256); + var simpleEscapeCheck = new Array(256); // integer, for fast access var simpleEscapeMap = new Array(256); for (var i = 0; i < 256; i++) { simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; @@ -40388,7 +46541,7 @@ var scriptlets_umd = {exports: {}}; function State$1(input, options) { this.input = input; this.filename = options['filename'] || null; - this.schema = options['schema'] || default_full; + this.schema = options['schema'] || DEFAULT_FULL_SCHEMA$1; this.onWarning = options['onWarning'] || null; this.legacy = options['legacy'] || false; this.json = options['json'] || false; @@ -40401,9 +46554,20 @@ var scriptlets_umd = {exports: {}}; this.lineStart = 0; this.lineIndent = 0; this.documents = []; + + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ } + function generateError(state, message) { - return new exception(message, new mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); + return new YAMLException$1(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); } function throwError(state, message) { throw generateError(state, message); @@ -40475,7 +46639,7 @@ var scriptlets_umd = {exports: {}}; } function mergeMappings(state, destination, source, overridableKeys) { var sourceKeys, key, index, quantity; - if (!common.isObject(source)) { + if (!common$1.isObject(source)) { throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); } sourceKeys = Object.keys(source); @@ -40489,6 +46653,10 @@ var scriptlets_umd = {exports: {}}; } function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { var index, quantity; + + // The output is a plain object here, so keys can only be strings. + // We need to convert keyNode to a string, but doing so can hang the process + // (deeply nested arrays that explode exponentially using aliases). if (Array.isArray(keyNode)) { keyNode = Array.prototype.slice.call(keyNode); for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { @@ -40500,6 +46668,10 @@ var scriptlets_umd = {exports: {}}; } } } + + // Avoid code execution in load() via toString property + // (still use its own toString for arrays, timestamps, + // and whatever user schema extensions happen to have @@toStringTag) if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { keyNode = '[object Object]'; } @@ -40529,11 +46701,11 @@ var scriptlets_umd = {exports: {}}; function readLineBreak(state) { var ch; ch = state.input.charCodeAt(state.position); - if (ch === 0x0A ) { + if (ch === 0x0A /* LF */) { state.position++; - } else if (ch === 0x0D ) { + } else if (ch === 0x0D /* CR */) { state.position++; - if (state.input.charCodeAt(state.position) === 0x0A ) { + if (state.input.charCodeAt(state.position) === 0x0A /* LF */) { state.position++; } } else { @@ -40549,17 +46721,17 @@ var scriptlets_umd = {exports: {}}; while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - if (allowComments && ch === 0x23 ) { + if (allowComments && ch === 0x23 /* # */) { do { ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A && ch !== 0x0D && ch !== 0); + } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0); } if (is_EOL(ch)) { readLineBreak(state); ch = state.input.charCodeAt(state.position); lineBreaks++; state.lineIndent = 0; - while (ch === 0x20 ) { + while (ch === 0x20 /* Space */) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } @@ -40576,7 +46748,10 @@ var scriptlets_umd = {exports: {}}; var _position = state.position, ch; ch = state.input.charCodeAt(_position); - if ((ch === 0x2D || ch === 0x2E ) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { + + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { _position += 3; ch = state.input.charCodeAt(_position); if (ch === 0 || is_WS_OR_EOL(ch)) { @@ -40589,7 +46764,7 @@ var scriptlets_umd = {exports: {}}; if (count === 1) { state.result += ' '; } else if (count > 1) { - state.result += common.repeat('\n', count - 1); + state.result += common$1.repeat('\n', count - 1); } } function readPlainScalar(state, nodeIndent, withinFlowCollection) { @@ -40605,10 +46780,10 @@ var scriptlets_umd = {exports: {}}; _result = state.result, ch; ch = state.input.charCodeAt(state.position); - if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 || ch === 0x26 || ch === 0x2A || ch === 0x21 || ch === 0x7C || ch === 0x3E || ch === 0x27 || ch === 0x22 || ch === 0x25 || ch === 0x40 || ch === 0x60 ) { + if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* " */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) { return false; } - if (ch === 0x3F || ch === 0x2D ) { + if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) { following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { return false; @@ -40619,12 +46794,12 @@ var scriptlets_umd = {exports: {}}; captureStart = captureEnd = state.position; hasPendingContent = false; while (ch !== 0) { - if (ch === 0x3A ) { + if (ch === 0x3A /* : */) { following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { break; } - } else if (ch === 0x23 ) { + } else if (ch === 0x23 /* # */) { preceding = state.input.charCodeAt(state.position - 1); if (is_WS_OR_EOL(preceding)) { break; @@ -40670,7 +46845,7 @@ var scriptlets_umd = {exports: {}}; function readSingleQuotedScalar(state, nodeIndent) { var ch, captureStart, captureEnd; ch = state.input.charCodeAt(state.position); - if (ch !== 0x27 ) { + if (ch !== 0x27 /* ' */) { return false; } state.kind = 'scalar'; @@ -40678,10 +46853,10 @@ var scriptlets_umd = {exports: {}}; state.position++; captureStart = captureEnd = state.position; while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x27 ) { + if (ch === 0x27 /* ' */) { captureSegment(state, captureStart, state.position, true); ch = state.input.charCodeAt(++state.position); - if (ch === 0x27 ) { + if (ch === 0x27 /* ' */) { captureStart = state.position; state.position++; captureEnd = state.position; @@ -40704,7 +46879,7 @@ var scriptlets_umd = {exports: {}}; function readDoubleQuotedScalar(state, nodeIndent) { var captureStart, captureEnd, hexLength, hexResult, tmp, ch; ch = state.input.charCodeAt(state.position); - if (ch !== 0x22 ) { + if (ch !== 0x22 /* " */) { return false; } state.kind = 'scalar'; @@ -40712,15 +46887,17 @@ var scriptlets_umd = {exports: {}}; state.position++; captureStart = captureEnd = state.position; while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x22 ) { + if (ch === 0x22 /* " */) { captureSegment(state, captureStart, state.position, true); state.position++; return true; - } else if (ch === 0x5C ) { + } else if (ch === 0x5C /* \ */) { captureSegment(state, captureStart, state.position, true); ch = state.input.charCodeAt(++state.position); if (is_EOL(ch)) { skipSeparationSpace(state, false, nodeIndent); + + // TODO: rework to inline fn with no type cast? } else if (ch < 256 && simpleEscapeCheck[ch]) { state.result += simpleEscapeMap[ch]; state.position++; @@ -40771,12 +46948,12 @@ var scriptlets_umd = {exports: {}}; valueNode, ch; ch = state.input.charCodeAt(state.position); - if (ch === 0x5B ) { - terminator = 0x5D; + if (ch === 0x5B /* [ */) { + terminator = 0x5D; /* ] */ isMapping = false; _result = []; - } else if (ch === 0x7B ) { - terminator = 0x7D; + } else if (ch === 0x7B /* { */) { + terminator = 0x7D; /* } */ isMapping = true; _result = {}; } else { @@ -40801,7 +46978,7 @@ var scriptlets_umd = {exports: {}}; } keyTag = keyNode = valueNode = null; isPair = isExplicitPair = false; - if (ch === 0x3F ) { + if (ch === 0x3F /* ? */) { following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following)) { isPair = isExplicitPair = true; @@ -40815,7 +46992,7 @@ var scriptlets_umd = {exports: {}}; keyNode = state.result; skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - if ((isExplicitPair || state.line === _line) && ch === 0x3A ) { + if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) { isPair = true; ch = state.input.charCodeAt(++state.position); skipSeparationSpace(state, true, nodeIndent); @@ -40831,7 +47008,7 @@ var scriptlets_umd = {exports: {}}; } skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - if (ch === 0x2C ) { + if (ch === 0x2C /* , */) { readNext = true; ch = state.input.charCodeAt(++state.position); } else { @@ -40852,9 +47029,9 @@ var scriptlets_umd = {exports: {}}; tmp, ch; ch = state.input.charCodeAt(state.position); - if (ch === 0x7C ) { + if (ch === 0x7C /* | */) { folding = false; - } else if (ch === 0x3E ) { + } else if (ch === 0x3E /* > */) { folding = true; } else { return false; @@ -40863,9 +47040,9 @@ var scriptlets_umd = {exports: {}}; state.result = ''; while (ch !== 0) { ch = state.input.charCodeAt(++state.position); - if (ch === 0x2B || ch === 0x2D ) { + if (ch === 0x2B /* + */ || ch === 0x2D /* - */) { if (CHOMPING_CLIP === chomping) { - chomping = ch === 0x2B ? CHOMPING_KEEP : CHOMPING_STRIP; + chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP; } else { throwError(state, 'repeat of a chomping mode identifier'); } @@ -40886,7 +47063,7 @@ var scriptlets_umd = {exports: {}}; do { ch = state.input.charCodeAt(++state.position); } while (is_WHITE_SPACE(ch)); - if (ch === 0x23 ) { + if (ch === 0x23 /* # */) { do { ch = state.input.charCodeAt(++state.position); } while (!is_EOL(ch) && ch !== 0); @@ -40896,7 +47073,7 @@ var scriptlets_umd = {exports: {}}; readLineBreak(state); state.lineIndent = 0; ch = state.input.charCodeAt(state.position); - while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 ) { + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } @@ -40907,32 +47084,52 @@ var scriptlets_umd = {exports: {}}; emptyLines++; continue; } + + // End of the scalar. if (state.lineIndent < textIndent) { + // Perform the chomping. if (chomping === CHOMPING_KEEP) { - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + state.result += common$1.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); } else if (chomping === CHOMPING_CLIP) { if (didReadContent) { + // i.e. only if the scalar is not empty. state.result += '\n'; } } + + // Break this `while` cycle and go to the funciton's epilogue. break; } + + // Folded style: use fancy rules to handle line breaks. if (folding) { + // Lines starting with white space characters (more-indented lines) are not folded. if (is_WHITE_SPACE(ch)) { atMoreIndented = true; - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + // except for the first content line (cf. Example 8.1) + state.result += common$1.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + + // End of more-indented block. } else if (atMoreIndented) { atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); + state.result += common$1.repeat('\n', emptyLines + 1); + + // Just one line break - perceive as the same line. } else if (emptyLines === 0) { if (didReadContent) { + // i.e. only if we have already read some scalar content. state.result += ' '; } + + // Several line breaks - perceive as different lines. } else { - state.result += common.repeat('\n', emptyLines); + state.result += common$1.repeat('\n', emptyLines); } + + // Literal style: just add exact number of line breaks between content lines. } else { - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); + // Keep all line breaks except the header line break. + state.result += common$1.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); } didReadContent = true; detectedIndent = true; @@ -40958,7 +47155,7 @@ var scriptlets_umd = {exports: {}}; } ch = state.input.charCodeAt(state.position); while (ch !== 0) { - if (ch !== 0x2D ) { + if (ch !== 0x2D /* - */) { break; } following = state.input.charCodeAt(state.position + 1); @@ -41015,10 +47212,15 @@ var scriptlets_umd = {exports: {}}; ch = state.input.charCodeAt(state.position); while (ch !== 0) { following = state.input.charCodeAt(state.position + 1); - _line = state.line; + _line = state.line; // Save the current line. _pos = state.position; - if ((ch === 0x3F || ch === 0x3A ) && is_WS_OR_EOL(following)) { - if (ch === 0x3F ) { + + // + // Explicit notation case. There are two separate blocks: + // first for the key (denoted by "?") and second for the value (denoted by ":") + // + if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) { + if (ch === 0x3F /* ? */) { if (atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); keyTag = keyNode = valueNode = null; @@ -41027,6 +47229,7 @@ var scriptlets_umd = {exports: {}}; atExplicitKey = true; allowCompact = true; } else if (atExplicitKey) { + // i.e. 0x3A/* : */ === character after the explicit key. atExplicitKey = false; allowCompact = true; } else { @@ -41034,13 +47237,17 @@ var scriptlets_umd = {exports: {}}; } state.position += 1; ch = following; + + // + // Implicit notation case. Flow-style node as the key first, then ":", and the value. + // } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { if (state.line === _line) { ch = state.input.charCodeAt(state.position); while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - if (ch === 0x3A ) { + if (ch === 0x3A /* : */) { ch = state.input.charCodeAt(++state.position); if (!is_WS_OR_EOL(ch)) { throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); @@ -41059,18 +47266,22 @@ var scriptlets_umd = {exports: {}}; } else { state.tag = _tag; state.anchor = _anchor; - return true; + return true; // Keep the result of `composeNode`. } } else if (detected) { throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); } else { state.tag = _tag; state.anchor = _anchor; - return true; + return true; // Keep the result of `composeNode`. } } else { - break; + break; // Reading is done. Go to the epilogue. } + + // + // Common reading code for both explicit and implicit notations. + // if (state.line === _line || state.lineIndent > nodeIndent) { if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { if (atExplicitKey) { @@ -41092,9 +47303,17 @@ var scriptlets_umd = {exports: {}}; break; } } + + // + // Epilogue. + // + + // Special case: last mapping's node contains only the key in explicit notation. if (atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); } + + // Expose the resulting mapping. if (detected) { state.tag = _tag; state.anchor = _anchor; @@ -41111,15 +47330,15 @@ var scriptlets_umd = {exports: {}}; tagName, ch; ch = state.input.charCodeAt(state.position); - if (ch !== 0x21 ) return false; + if (ch !== 0x21 /* ! */) return false; if (state.tag !== null) { throwError(state, 'duplication of a tag property'); } ch = state.input.charCodeAt(++state.position); - if (ch === 0x3C ) { + if (ch === 0x3C /* < */) { isVerbatim = true; ch = state.input.charCodeAt(++state.position); - } else if (ch === 0x21 ) { + } else if (ch === 0x21 /* ! */) { isNamed = true; tagHandle = '!!'; ch = state.input.charCodeAt(++state.position); @@ -41130,7 +47349,8 @@ var scriptlets_umd = {exports: {}}; if (isVerbatim) { do { ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && ch !== 0x3E ); + } while (ch !== 0 && ch !== 0x3E /* > */); + if (state.position < state.length) { tagName = state.input.slice(_position, state.position); ch = state.input.charCodeAt(++state.position); @@ -41139,7 +47359,7 @@ var scriptlets_umd = {exports: {}}; } } else { while (ch !== 0 && !is_WS_OR_EOL(ch)) { - if (ch === 0x21 ) { + if (ch === 0x21 /* ! */) { if (!isNamed) { tagHandle = state.input.slice(_position - 1, state.position + 1); if (!PATTERN_TAG_HANDLE.test(tagHandle)) { @@ -41177,7 +47397,7 @@ var scriptlets_umd = {exports: {}}; function readAnchorProperty(state) { var _position, ch; ch = state.input.charCodeAt(state.position); - if (ch !== 0x26 ) return false; + if (ch !== 0x26 /* & */) return false; if (state.anchor !== null) { throwError(state, 'duplication of an anchor property'); } @@ -41195,7 +47415,7 @@ var scriptlets_umd = {exports: {}}; function readAlias(state) { var _position, alias, ch; ch = state.input.charCodeAt(state.position); - if (ch !== 0x2A ) return false; + if (ch !== 0x2A /* * */) return false; ch = state.input.charCodeAt(++state.position); _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { @@ -41217,6 +47437,7 @@ var scriptlets_umd = {exports: {}}; allowBlockScalars, allowBlockCollections, indentStatus = 1, + // 1: this>parent, 0: this=parent, -1: this [0]" + // if (state.result !== null && state.kind !== 'scalar') { throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); } for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { type = state.implicitTypes[typeIndex]; if (type.resolve(state.result)) { + // `state.result` updated in resolver if matched state.result = type.construct(state.result); state.tag = type.tag; if (state.anchor !== null) { @@ -41318,6 +47548,7 @@ var scriptlets_umd = {exports: {}}; throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); } if (!type.resolve(state.result)) { + // `state.result` updated in resolver if matched throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); } else { state.result = type.construct(state.result); @@ -41348,7 +47579,7 @@ var scriptlets_umd = {exports: {}}; while ((ch = state.input.charCodeAt(state.position)) !== 0) { skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); - if (state.lineIndent > 0 || ch !== 0x25 ) { + if (state.lineIndent > 0 || ch !== 0x25 /* % */) { break; } hasDirectives = true; @@ -41366,7 +47597,7 @@ var scriptlets_umd = {exports: {}}; while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - if (ch === 0x23 ) { + if (ch === 0x23 /* # */) { do { ch = state.input.charCodeAt(++state.position); } while (ch !== 0 && !is_EOL(ch)); @@ -41387,7 +47618,7 @@ var scriptlets_umd = {exports: {}}; } } skipSeparationSpace(state, true, -1); - if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D && state.input.charCodeAt(state.position + 1) === 0x2D && state.input.charCodeAt(state.position + 2) === 0x2D ) { + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) { state.position += 3; skipSeparationSpace(state, true, -1); } else if (hasDirectives) { @@ -41400,7 +47631,7 @@ var scriptlets_umd = {exports: {}}; } state.documents.push(state.result); if (state.position === state.lineStart && testDocumentSeparator(state)) { - if (state.input.charCodeAt(state.position) === 0x2E ) { + if (state.input.charCodeAt(state.position) === 0x2E /* . */) { state.position += 3; skipSeparationSpace(state, true, -1); } @@ -41416,9 +47647,12 @@ var scriptlets_umd = {exports: {}}; input = String(input); options = options || {}; if (input.length !== 0) { - if (input.charCodeAt(input.length - 1) !== 0x0A && input.charCodeAt(input.length - 1) !== 0x0D ) { + // Add tailing `\n` if not exists + if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) { input += '\n'; } + + // Strip BOM if (input.charCodeAt(0) === 0xFEFF) { input = input.slice(1); } @@ -41429,8 +47663,10 @@ var scriptlets_umd = {exports: {}}; state.position = nullpos; throwError(state, 'null byte is not allowed in input'); } + + // Use 0 as string terminator. That significantly simplifies bounds check. state.input += '\0'; - while (state.input.charCodeAt(state.position) === 0x20 ) { + while (state.input.charCodeAt(state.position) === 0x20 /* Space */) { state.lineIndent += 1; state.position += 1; } @@ -41439,7 +47675,7 @@ var scriptlets_umd = {exports: {}}; } return state.documents; } - function loadAll$1(input, iterator, options) { + function loadAll(input, iterator, options) { if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { options = iterator; iterator = null; @@ -41452,65 +47688,70 @@ var scriptlets_umd = {exports: {}}; iterator(documents[index]); } } - function load$1(input, options) { + function load(input, options) { var documents = loadDocuments(input, options); if (documents.length === 0) { + /*eslint-disable no-undefined*/ return undefined; } else if (documents.length === 1) { return documents[0]; } - throw new exception('expected a single document in the stream, but found more'); + throw new YAMLException$1('expected a single document in the stream, but found more'); } - function safeLoadAll$1(input, iterator, options) { + function safeLoadAll(input, iterator, options) { if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') { options = iterator; iterator = null; } - return loadAll$1(input, iterator, common.extend({ - schema: default_safe + return loadAll(input, iterator, common$1.extend({ + schema: DEFAULT_SAFE_SCHEMA$1 }, options)); } - function safeLoad$1(input, options) { - return load$1(input, common.extend({ - schema: default_safe + function safeLoad(input, options) { + return load(input, common$1.extend({ + schema: DEFAULT_SAFE_SCHEMA$1 }, options)); } - var loadAll_1 = loadAll$1; - var load_1 = load$1; - var safeLoadAll_1 = safeLoadAll$1; - var safeLoad_1 = safeLoad$1; - var loader = { - loadAll: loadAll_1, - load: load_1, - safeLoadAll: safeLoadAll_1, - safeLoad: safeLoad_1 - }; + loader$1.loadAll = loadAll; + loader$1.load = load; + loader$1.safeLoadAll = safeLoadAll; + loader$1.safeLoad = safeLoad; + + var dumper$1 = {}; + + /*eslint-disable no-use-before-define*/ + + var common = common$6; + var YAMLException = exception; + var DEFAULT_FULL_SCHEMA = default_full; + var DEFAULT_SAFE_SCHEMA = default_safe; var _toString = Object.prototype.toString; var _hasOwnProperty = Object.prototype.hasOwnProperty; - var CHAR_TAB = 0x09; - var CHAR_LINE_FEED = 0x0A; - var CHAR_CARRIAGE_RETURN = 0x0D; - var CHAR_SPACE = 0x20; - var CHAR_EXCLAMATION = 0x21; - var CHAR_DOUBLE_QUOTE = 0x22; - var CHAR_SHARP = 0x23; - var CHAR_PERCENT = 0x25; - var CHAR_AMPERSAND = 0x26; - var CHAR_SINGLE_QUOTE = 0x27; - var CHAR_ASTERISK = 0x2A; - var CHAR_COMMA = 0x2C; - var CHAR_MINUS = 0x2D; - var CHAR_COLON = 0x3A; - var CHAR_EQUALS = 0x3D; - var CHAR_GREATER_THAN = 0x3E; - var CHAR_QUESTION = 0x3F; - var CHAR_COMMERCIAL_AT = 0x40; - var CHAR_LEFT_SQUARE_BRACKET = 0x5B; - var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; - var CHAR_GRAVE_ACCENT = 0x60; - var CHAR_LEFT_CURLY_BRACKET = 0x7B; - var CHAR_VERTICAL_LINE = 0x7C; - var CHAR_RIGHT_CURLY_BRACKET = 0x7D; + var CHAR_TAB = 0x09; /* Tab */ + var CHAR_LINE_FEED = 0x0A; /* LF */ + var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ + var CHAR_SPACE = 0x20; /* Space */ + var CHAR_EXCLAMATION = 0x21; /* ! */ + var CHAR_DOUBLE_QUOTE = 0x22; /* " */ + var CHAR_SHARP = 0x23; /* # */ + var CHAR_PERCENT = 0x25; /* % */ + var CHAR_AMPERSAND = 0x26; /* & */ + var CHAR_SINGLE_QUOTE = 0x27; /* ' */ + var CHAR_ASTERISK = 0x2A; /* * */ + var CHAR_COMMA = 0x2C; /* , */ + var CHAR_MINUS = 0x2D; /* - */ + var CHAR_COLON = 0x3A; /* : */ + var CHAR_EQUALS = 0x3D; /* = */ + var CHAR_GREATER_THAN = 0x3E; /* > */ + var CHAR_QUESTION = 0x3F; /* ? */ + var CHAR_COMMERCIAL_AT = 0x40; /* @ */ + var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ + var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ + var CHAR_GRAVE_ACCENT = 0x60; /* ` */ + var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ + var CHAR_VERTICAL_LINE = 0x7C; /* | */ + var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ + var ESCAPE_SEQUENCES = {}; ESCAPE_SEQUENCES[0x00] = '\\0'; ESCAPE_SEQUENCES[0x07] = '\\a'; @@ -41560,12 +47801,12 @@ var scriptlets_umd = {exports: {}}; handle = 'U'; length = 8; } else { - throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); + throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF'); } return '\\' + handle + common.repeat('0', length - string.length) + string; } function State(options) { - this.schema = options['schema'] || default_full; + this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; this.indent = Math.max(1, options['indent'] || 2); this.noArrayIndent = options['noArrayIndent'] || false; this.skipInvalid = options['skipInvalid'] || false; @@ -41583,6 +47824,8 @@ var scriptlets_umd = {exports: {}}; this.duplicates = []; this.usedDuplicates = null; } + + // Indents every line in a string. Empty lines (\n only) are not indented. function indentString(string, spaces) { var ind = common.repeat(' ', spaces), position = 0, @@ -41617,28 +47860,61 @@ var scriptlets_umd = {exports: {}}; } return false; } + + // [33] s-white ::= s-space | s-tab function isWhitespace(c) { return c === CHAR_SPACE || c === CHAR_TAB; } + + // Returns true if the character can be printed without escaping. + // From YAML 1.2: "any allowed characters known to be non-printable + // should also be escaped. [However,] This isn’t mandatory" + // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. function isPrintable(c) { - return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF || 0x10000 <= c && c <= 0x10FFFF; + return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF; } + + // [34] ns-char ::= nb-char - s-white + // [27] nb-char ::= c-printable - b-char - c-byte-order-mark + // [26] b-char ::= b-line-feed | b-carriage-return + // [24] b-line-feed ::= #xA /* LF */ + // [25] b-carriage-return ::= #xD /* CR */ + // [3] c-byte-order-mark ::= #xFEFF function isNsChar(c) { return isPrintable(c) && !isWhitespace(c) + // byte-order-mark && c !== 0xFEFF + // b-char && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; } + + // Simplified test for values allowed after the first character in plain style. function isPlainSafe(c, prev) { + // Uses a subset of nb-char - c-flow-indicator - ":" - "#" + // where nb-char ::= c-printable - b-char - c-byte-order-mark. return isPrintable(c) && c !== 0xFEFF + // - c-flow-indicator && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // - ":" - "#" + // /* An ns-char preceding */ "#" && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev)); } + + // Simplified test for values allowed as the first character in plain style. function isPlainSafeFirst(c) { - return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) + // Uses a subset of ns-char - c-indicator + // where ns-char = nb-char - s-white. + return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white + // - (c-indicator ::= + // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE + // | “%” | “@” | “`”) && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; } + + // Determines whether block indentation indicator is required. function needIndentIndicator(string) { var leadingSpaceRe = /^\n* /; return leadingSpaceRe.test(string); @@ -41648,15 +47924,25 @@ var scriptlets_umd = {exports: {}}; STYLE_LITERAL = 3, STYLE_FOLDED = 4, STYLE_DOUBLE = 5; + + // Determines which scalar styles are possible and returns the preferred style. + // lineWidth = -1 => no limit. + // Pre-conditions: str.length > 0. + // Post-conditions: + // STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. + // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). + // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) { var i; var char, prev_char; var hasLineBreak = false; - var hasFoldableLine = false; + var hasFoldableLine = false; // only checked if shouldTrackWidth var shouldTrackWidth = lineWidth !== -1; - var previousLineBreak = -1; + var previousLineBreak = -1; // count the first line correctly var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1)); if (singleLineOnly) { + // Case: no block styles. + // Check for disallowed characters to rule out plain and single. for (i = 0; i < string.length; i++) { char = string.charCodeAt(i); if (!isPrintable(char)) { @@ -41666,12 +47952,15 @@ var scriptlets_umd = {exports: {}}; plain = plain && isPlainSafe(char, prev_char); } } else { + // Case: block styles permitted. for (i = 0; i < string.length; i++) { char = string.charCodeAt(i); if (char === CHAR_LINE_FEED) { hasLineBreak = true; + // Check if any line can be folded. if (shouldTrackWidth) { hasFoldableLine = hasFoldableLine || + // Foldable line = too long, and not more-indented. i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; previousLineBreak = i; } @@ -41681,16 +47970,32 @@ var scriptlets_umd = {exports: {}}; prev_char = i > 0 ? string.charCodeAt(i - 1) : null; plain = plain && isPlainSafe(char, prev_char); } + // in case the end is missing a \n hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; } + // Although every style can represent \n without escaping, prefer block styles + // for multiline, since they're more readable and they don't add empty lines. + // Also prefer folding a super-long line. if (!hasLineBreak && !hasFoldableLine) { + // Strings interpretable as another type have to be quoted; + // e.g. the string 'true' vs. the boolean true. return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE; } + // Edge case: block indentation indicator can only have one digit. if (indentPerLevel > 9 && needIndentIndicator(string)) { return STYLE_DOUBLE; } + // At this point we know block styles are valid. + // Prefer literal style unless we want to fold. return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; } + + // Note: line breaking/folding is implemented for only the folded style. + // NB. We drop the last trailing newline (if any) of a returned block scalar + // since the dumper adds its own newline. This always works: + // • No ending newline => unaffected; already using strip "-" chomping. + // • Ending newline => removed then restored. + // Importantly, this keeps the "+" chomp indicator from gaining an extra line. function writeScalar(state, string, level, iskey) { state.dump = function () { if (string.length === 0) { @@ -41699,9 +48004,19 @@ var scriptlets_umd = {exports: {}}; if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { return "'" + string + "'"; } - var indent = state.indent * Math.max(1, level); + var indent = state.indent * Math.max(1, level); // no 0-indent scalars + // As indentation gets deeper, let the width decrease monotonically + // to the lower bound min(state.lineWidth, 40). + // Note that this implies + // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. + // state.lineWidth > 40 + state.indent: width decreases until the lower bound. + // This behaves better than a constant minimum width which disallows narrower options, + // or an indent threshold which causes the width to suddenly increase. var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + + // Without knowing if keys are implicit/explicit, assume implicit for safety. var singleLineOnly = iskey + // No block styles in flow mode. || state.flowLevel > -1 && level >= state.flowLevel; function testAmbiguity(string) { return testImplicitResolving(state, string); @@ -41718,30 +48033,48 @@ var scriptlets_umd = {exports: {}}; case STYLE_DOUBLE: return '"' + escapeString(string) + '"'; default: - throw new exception('impossible error: invalid scalar style'); + throw new YAMLException('impossible error: invalid scalar style'); } }(); } + + // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. function blockHeader(string, indentPerLevel) { var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; + + // note the special case: the string '\n' counts as a "trailing" empty line. var clip = string[string.length - 1] === '\n'; var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); var chomp = keep ? '+' : clip ? '' : '-'; return indentIndicator + chomp + '\n'; } + + // (See the note for writeScalar.) function dropEndingNewline(string) { return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; } + + // Note: a long line without a suitable break point will exceed the width limit. + // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. function foldString(string, width) { + // In folded style, $k$ consecutive newlines output as $k+1$ newlines— + // unless they're before or after a more-indented line, or at the very + // beginning or end, in which case $k$ maps to $k$. + // Therefore, parse each chunk as newline(s) followed by a content line. var lineRe = /(\n+)([^\n]*)/g; + + // first line (possibly an empty line) var result = function () { var nextLF = string.indexOf('\n'); nextLF = nextLF !== -1 ? nextLF : string.length; lineRe.lastIndex = nextLF; return foldLine(string.slice(0, nextLF), width); }(); + // If we haven't reached the first content line yet, don't add an extra \n. var prevMoreIndented = string[0] === '\n' || string[0] === ' '; var moreIndented; + + // rest of the lines var match; while (match = lineRe.exec(string)) { var prefix = match[1], @@ -41752,42 +48085,67 @@ var scriptlets_umd = {exports: {}}; } return result; } + + // Greedy line breaking. + // Picks the longest line under the limit each time, + // otherwise settles for the shortest line over the limit. + // NB. More-indented lines *cannot* be folded, as that would add an extra \n. function foldLine(line, width) { if (line === '' || line[0] === ' ') return line; - var breakRe = / [^ ]/g; + + // Since a more-indented line adds a \n, breaks can't be followed by a space. + var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. var match; + // start is an inclusive index. end, curr, and next are exclusive. var start = 0, end, curr = 0, next = 0; var result = ''; + + // Invariants: 0 <= start <= length-1. + // 0 <= curr <= next <= max(0, length-2). curr - start <= width. + // Inside the loop: + // A match implies length >= 2, so curr and next are <= length-2. while (match = breakRe.exec(line)) { next = match.index; + // maintain invariant: curr - start <= width if (next - start > width) { - end = curr > start ? curr : next; + end = curr > start ? curr : next; // derive end <= length-2 result += '\n' + line.slice(start, end); - start = end + 1; + // skip the space that was output as \n + start = end + 1; // derive start <= length-1 } + curr = next; } + + // By the invariants, start <= length-1, so there is something left over. + // It is either the whole string or a part starting from non-whitespace. result += '\n'; + // Insert a break if the remainder is too long and there is a break available. if (line.length - start > width && curr > start) { result += line.slice(start, curr) + '\n' + line.slice(curr + 1); } else { result += line.slice(start); } - return result.slice(1); + return result.slice(1); // drop extra \n joiner } + + // Escapes a double-quoted string. function escapeString(string) { var result = ''; var char, nextChar; var escapeSeq; for (var i = 0; i < string.length; i++) { char = string.charCodeAt(i); - if (char >= 0xD800 && char <= 0xDBFF ) { + // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). + if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) { nextChar = string.charCodeAt(i + 1); - if (nextChar >= 0xDC00 && nextChar <= 0xDFFF ) { + if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) { + // Combine the surrogate pair and store it escaped. result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); + // Advance index one extra since we already used that char here. i++; continue; } @@ -41803,6 +48161,7 @@ var scriptlets_umd = {exports: {}}; index, length; for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. if (writeNode(state, level, object[index], false, false)) { if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : ''); _result += state.dump; @@ -41817,6 +48176,7 @@ var scriptlets_umd = {exports: {}}; index, length; for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. if (writeNode(state, level + 1, object[index], true, true)) { if (!compact || index !== 0) { _result += generateNextLine(state, level); @@ -41830,8 +48190,9 @@ var scriptlets_umd = {exports: {}}; } } state.tag = _tag; - state.dump = _result || '[]'; + state.dump = _result || '[]'; // Empty sequence if no valid values. } + function writeFlowMapping(state, level, object) { var _result = '', _tag = state.tag, @@ -41848,14 +48209,18 @@ var scriptlets_umd = {exports: {}}; objectKey = objectKeyList[index]; objectValue = object[objectKey]; if (!writeNode(state, level, objectKey, false, false)) { - continue; + continue; // Skip this pair because of invalid key; } + if (state.dump.length > 1024) pairBuffer += '? '; pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); if (!writeNode(state, level, objectValue, false, false)) { - continue; + continue; // Skip this pair because of invalid value. } + pairBuffer += state.dump; + + // Both key and value are valid. _result += pairBuffer; } state.tag = _tag; @@ -41871,12 +48236,17 @@ var scriptlets_umd = {exports: {}}; objectValue, explicitPair, pairBuffer; + + // Allow sorting keys so that the output file is deterministic if (state.sortKeys === true) { + // Default sorting objectKeyList.sort(); } else if (typeof state.sortKeys === 'function') { + // Custom sort function objectKeyList.sort(state.sortKeys); } else if (state.sortKeys) { - throw new exception('sortKeys must be a boolean or a function'); + // Something is wrong + throw new YAMLException('sortKeys must be a boolean or a function'); } for (index = 0, length = objectKeyList.length; index < length; index += 1) { pairBuffer = ''; @@ -41886,8 +48256,9 @@ var scriptlets_umd = {exports: {}}; objectKey = objectKeyList[index]; objectValue = object[objectKey]; if (!writeNode(state, level + 1, objectKey, true, true, true)) { - continue; + continue; // Skip this pair because of invalid key. } + explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024; if (explicitPair) { if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { @@ -41901,19 +48272,23 @@ var scriptlets_umd = {exports: {}}; pairBuffer += generateNextLine(state, level); } if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { - continue; + continue; // Skip this pair because of invalid value. } + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += ':'; } else { pairBuffer += ': '; } pairBuffer += state.dump; + + // Both key and value are valid. _result += pairBuffer; } state.tag = _tag; - state.dump = _result || '{}'; + state.dump = _result || '{}'; // Empty mapping if no valid pairs. } + function detectType(state, object, explicit) { var _result, typeList, index, length, type, style; typeList = explicit ? state.explicitTypes : state.implicitTypes; @@ -41928,7 +48303,7 @@ var scriptlets_umd = {exports: {}}; } else if (_hasOwnProperty.call(type.represent, style)) { _result = type.represent[style](object, style); } else { - throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); + throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); } state.dump = _result; } @@ -41937,6 +48312,10 @@ var scriptlets_umd = {exports: {}}; } return false; } + + // Serializes `object` and writes it to global `result`. + // Returns true on success, or false on invalid object. + // function writeNode(state, level, object, block, compact, iskey) { state.tag = null; state.dump = object; @@ -41994,7 +48373,7 @@ var scriptlets_umd = {exports: {}}; } } else { if (state.skipInvalid) return false; - throw new exception('unacceptable kind of an object to dump ' + type); + throw new YAMLException('unacceptable kind of an object to dump ' + type); } if (state.tag !== null && state.tag !== '?') { state.dump = '!<' + state.tag + '> ' + state.dump; @@ -42036,115 +48415,145 @@ var scriptlets_umd = {exports: {}}; } } } - function dump$1(input, options) { + function dump(input, options) { options = options || {}; var state = new State(options); if (!state.noRefs) getDuplicateReferences(input, state); if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; return ''; } - function safeDump$1(input, options) { - return dump$1(input, common.extend({ - schema: default_safe + function safeDump(input, options) { + return dump(input, common.extend({ + schema: DEFAULT_SAFE_SCHEMA }, options)); } - var dump_1 = dump$1; - var safeDump_1 = safeDump$1; - var dumper = { - dump: dump_1, - safeDump: safeDump_1 - }; + dumper$1.dump = dump; + dumper$1.safeDump = safeDump; + + var loader = loader$1; + var dumper = dumper$1; function deprecated(name) { return function () { throw new Error('Function ' + name + ' is deprecated and cannot be used.'); }; } - var Type = type; - var Schema = schema; - var FAILSAFE_SCHEMA = failsafe; - var JSON_SCHEMA = json; - var CORE_SCHEMA = core; - var DEFAULT_SAFE_SCHEMA = default_safe; - var DEFAULT_FULL_SCHEMA = default_full; - var load = loader.load; - var loadAll = loader.loadAll; - var safeLoad = loader.safeLoad; - var safeLoadAll = loader.safeLoadAll; - var dump = dumper.dump; - var safeDump = dumper.safeDump; - var YAMLException = exception; - var MINIMAL_SCHEMA = failsafe; - var SAFE_SCHEMA = default_safe; - var DEFAULT_SCHEMA = default_full; - var scan = deprecated('scan'); - var parse = deprecated('parse'); - var compose = deprecated('compose'); - var addConstructor = deprecated('addConstructor'); - var jsYaml$1 = { - Type: Type, - Schema: Schema, - FAILSAFE_SCHEMA: FAILSAFE_SCHEMA, - JSON_SCHEMA: JSON_SCHEMA, - CORE_SCHEMA: CORE_SCHEMA, - DEFAULT_SAFE_SCHEMA: DEFAULT_SAFE_SCHEMA, - DEFAULT_FULL_SCHEMA: DEFAULT_FULL_SCHEMA, - load: load, - loadAll: loadAll, - safeLoad: safeLoad, - safeLoadAll: safeLoadAll, - dump: dump, - safeDump: safeDump, - YAMLException: YAMLException, - MINIMAL_SCHEMA: MINIMAL_SCHEMA, - SAFE_SCHEMA: SAFE_SCHEMA, - DEFAULT_SCHEMA: DEFAULT_SCHEMA, - scan: scan, - parse: parse, - compose: compose, - addConstructor: addConstructor - }; - var jsYaml = jsYaml$1; + jsYaml$2.Type = type; + jsYaml$2.Schema = schema; + jsYaml$2.FAILSAFE_SCHEMA = failsafe; + jsYaml$2.JSON_SCHEMA = json; + jsYaml$2.CORE_SCHEMA = core; + jsYaml$2.DEFAULT_SAFE_SCHEMA = default_safe; + jsYaml$2.DEFAULT_FULL_SCHEMA = default_full; + jsYaml$2.load = loader.load; + jsYaml$2.loadAll = loader.loadAll; + jsYaml$2.safeLoad = loader.safeLoad; + jsYaml$2.safeLoadAll = loader.safeLoadAll; + jsYaml$2.dump = dumper.dump; + jsYaml$2.safeDump = dumper.safeDump; + jsYaml$2.YAMLException = exception; + + // Deprecated schema names from JS-YAML 2.0.x + jsYaml$2.MINIMAL_SCHEMA = failsafe; + jsYaml$2.SAFE_SCHEMA = default_safe; + jsYaml$2.DEFAULT_SCHEMA = default_full; + + // Deprecated functions from JS-YAML 1.x.x + jsYaml$2.scan = deprecated('scan'); + jsYaml$2.parse = deprecated('parse'); + jsYaml$2.compose = deprecated('compose'); + jsYaml$2.addConstructor = deprecated('addConstructor'); + + var yaml = jsYaml$2; + var jsYaml = yaml; + var jsYaml$1 = /*@__PURE__*/getDefaultExportFromCjs(jsYaml); + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + + /** + * Redirect - object used to redirect some requests + * e.g. + * { + * title: 1x1-transparent.gif + * comment: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever + * contentType: image/gif;base64 + * content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== + * } + * + * @typedef {object} Redirect + * @property {string} title resource name + * @property {string} comment resource description + * @property {string} content encoded resource content + * @property {string} contentType MIME type + * @property {boolean} [isBlocking] e.g click2load redirect + * @property {string} [sha] hash + */ + class Redirects { + /** + * Converts rawYaml into JS object with sources titles used as keys + * + * @param {string} rawYaml + * @returns {Object} - return object with titles in the keys and RedirectSources + * in the values + */ constructor(rawYaml) { try { - const arrOfRedirects = jsYaml.safeLoad(rawYaml); + var arrOfRedirects = jsYaml$1.safeLoad(rawYaml); this.redirects = arrOfRedirects.reduce(function (acc, redirect) { return _objectSpread(_objectSpread({}, acc), {}, { [redirect.title]: redirect }); }, {}); } catch (e) { + // eslint-disable-next-line no-console console.log("Was unable to load YAML into JS due to: ".concat(e.message)); throw e; } } + + /** + * Returns redirect source object + * + * @param {string} title + * @returns {Redirect|undefined} Found redirect source object, or `undefined` if not found. + */ getRedirect(title) { var _this = this; if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { return this.redirects[title]; } - const values = Object.keys(this.redirects).map(function (key) { + + // look title among aliases + var values = Object.keys(this.redirects).map(function (key) { return _this.redirects[key]; }); return values.find(function (redirect) { - const aliases = redirect.aliases; + var aliases = redirect.aliases; if (!aliases) { return false; } - return aliases.indexOf(title) > -1; + return aliases.includes(title); }); } + + /** + * Checks if redirect is blocking like click2load.html + * + * @param {string} title Title of the redirect. + * @returns {boolean} True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ isBlocking(title) { - const redirect = this.redirects[title]; + var redirect = this.redirects[title]; if (redirect) { return !!redirect.isBlocking; } return false; } } - const redirectsMap = { + + var redirectsMap = { "1x1-transparent.gif": "1x1-transparent.gif", "1x1.gif": "1x1-transparent.gif", "1x1-transparent-gif": "1x1-transparent.gif", @@ -42256,25 +48665,51 @@ var scriptlets_umd = {exports: {}}; "ubo-popads-dummy.js": "set-popads-dummy.js", "ubo-popads-dummy": "set-popads-dummy.js" }; - const getRedirectByName = function getRedirectByName(name) { - const redirects = Object.keys(redirectsList).map(function (key) { + + /** + * Finds redirect resource by it's name + * + * @param {string} name - redirect name + * @returns {Function} + */ + var getRedirectByName = function getRedirectByName(name) { + var redirects = Object.keys(redirectsList).map(function (key) { return redirectsList[key]; }); return redirects.find(function (r) { - return r.names && r.names.indexOf(name) > -1; + return r.names && r.names.includes(name); }); }; - const getRedirectCode = function getRedirectCode(source) { - const redirect = getRedirectByName(source.name); - let result = attachDependencies(redirect); + + /** + * @typedef {object} Source - redirect properties + * @property {string} name redirect name + * @property {Array} args Arguments for redirect function + * @property {'extension'|'test'} [engine] - + * Defines the final form of redirect string presentation + * @property {boolean} [verbose] flag to enable printing to console debug information + */ + + /** + * Returns redirect code by param + * + * @param {Source} source + * @returns {string} redirect code + */ + var getRedirectCode = function getRedirectCode(source) { + var redirect = getRedirectByName(source.name); + var result = attachDependencies(redirect); result = addCall(redirect, result); + + // redirect code for different sources is checked in tests + // so it should be just a code without any source and props passed result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true); return result; }; - const getRedirectFilename = function getRedirectFilename(name) { + var getRedirectFilename = function getRedirectFilename(name) { return redirectsMap[name]; }; - const redirects = { + var redirects = { Redirects, getRedirectFilename, getCode: getRedirectCode, @@ -42286,33 +48721,36 @@ var scriptlets_umd = {exports: {}}; convertUboRedirectToAdg, convertAbpRedirectToAdg, convertRedirectToAdg, + convertRedirectNameToAdg, convertAdgRedirectToUbo }; + function abortCurrentInlineScript(source, args) { function abortCurrentInlineScript(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const SRC_DATA_MARKER = "data:text/javascript;base64,"; - const getCurrentScript = function getCurrentScript() { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var SRC_DATA_MARKER = "data:text/javascript;base64,"; + var getCurrentScript = function getCurrentScript() { if ("currentScript" in document) { return document.currentScript; } - const scripts = document.getElementsByTagName("script"); + var scripts = document.getElementsByTagName("script"); return scripts[scripts.length - 1]; }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); + var ourScript = getCurrentScript(); + var abort = function abort() { + var _scriptEl$src; + var scriptEl = getCurrentScript(); if (!scriptEl) { return; } - let content = scriptEl.textContent; + var content = scriptEl.textContent; try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; content = textContentGetter.call(scriptEl); } catch (e) {} - if (content.length === 0 && typeof scriptEl.src !== "undefined" && startsWith(scriptEl.src, SRC_DATA_MARKER)) { - const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); + if (content.length === 0 && typeof scriptEl.src !== "undefined" && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) { + var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); content = window.atob(encodedContent); } if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { @@ -42320,21 +48758,21 @@ var scriptlets_umd = {exports: {}}; throw new ReferenceError(rid); } }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (base instanceof Object === false && base === null) { - const props = property.split("."); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + var props = property.split("."); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); logMessage(source, message); return; } if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -42348,13 +48786,13 @@ var scriptlets_umd = {exports: {}}; }); return; } - let currentValue = base[prop]; - let origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var currentValue = base[prop]; + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { currentValue = base[prop]; origDescriptor = undefined; } - const descriptorWrapper = Object.assign(getDescriptorAddon(), { + var descriptorWrapper = Object.assign(getDescriptorAddon(), { currentValue: currentValue, get() { if (!this.isAbortingSuspended) { @@ -42392,7 +48830,7 @@ var scriptlets_umd = {exports: {}}; return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -42400,14 +48838,14 @@ var scriptlets_umd = {exports: {}}; return true; } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -42415,7 +48853,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -42444,32 +48882,51 @@ var scriptlets_umd = {exports: {}}; }; } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -42479,19 +48936,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -42505,29 +48962,19 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; @@ -42541,18 +48988,18 @@ var scriptlets_umd = {exports: {}}; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - const result = cb(...args); + var result = cb(...args); this.isAbortingSuspended = false; return result; } catch (_unused) { - const rid = randomId(); + var rid = randomId(); this.isAbortingSuspended = false; throw new ReferenceError(rid); } } }; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { abortCurrentInlineScript.apply(this, updatedArgs); } catch (e) { @@ -42564,18 +49011,18 @@ var scriptlets_umd = {exports: {}}; if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -42601,7 +49048,7 @@ var scriptlets_umd = {exports: {}}; return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -42609,14 +49056,14 @@ var scriptlets_umd = {exports: {}}; return true; } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -42624,7 +49071,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -42653,16 +49100,16 @@ var scriptlets_umd = {exports: {}}; }; } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -42672,19 +49119,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -42700,7 +49147,7 @@ var scriptlets_umd = {exports: {}}; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { abortOnPropertyRead.apply(this, updatedArgs); } catch (e) { @@ -42712,18 +49159,18 @@ var scriptlets_umd = {exports: {}}; if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -42748,7 +49195,7 @@ var scriptlets_umd = {exports: {}}; return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -42756,14 +49203,14 @@ var scriptlets_umd = {exports: {}}; return true; } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -42771,7 +49218,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -42800,16 +49247,16 @@ var scriptlets_umd = {exports: {}}; }; } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -42819,19 +49266,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -42847,7 +49294,7 @@ var scriptlets_umd = {exports: {}}; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { abortOnPropertyWrite.apply(this, updatedArgs); } catch (e) { @@ -42859,18 +49306,18 @@ var scriptlets_umd = {exports: {}}; if (!property || !stack) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -42888,7 +49335,7 @@ var scriptlets_umd = {exports: {}}; logMessage(source, "Invalid parameter: ".concat(stack)); return; } - const descriptorWrapper = Object.assign(getDescriptorAddon(), { + var descriptorWrapper = Object.assign(getDescriptorAddon(), { value: base[prop], get() { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { @@ -42919,7 +49366,7 @@ var scriptlets_umd = {exports: {}}; return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -42927,14 +49374,14 @@ var scriptlets_umd = {exports: {}}; return true; } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -42942,7 +49389,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -42971,16 +49418,16 @@ var scriptlets_umd = {exports: {}}; }; } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -42990,19 +49437,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -43016,12 +49463,12 @@ var scriptlets_umd = {exports: {}}; } } function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -43040,8 +49487,8 @@ var scriptlets_umd = {exports: {}}; if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); @@ -43055,11 +49502,11 @@ var scriptlets_umd = {exports: {}}; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - const result = cb(...args); + var result = cb(...args); this.isAbortingSuspended = false; return result; } catch (_unused) { - const rid = randomId(); + var rid = randomId(); this.isAbortingSuspended = false; throw new ReferenceError(rid); } @@ -43067,85 +49514,101 @@ var scriptlets_umd = {exports: {}}; }; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; - } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); } function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); }; if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { return false; } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); if (pos !== -1) { documentURL = documentURL.slice(0, pos); } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { stackURL = stackURL.slice(1); } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { stackFunction = stackFunction.slice(2).trim(); } stack = "".concat(stackFunction, " ").concat(stackURL).trim(); @@ -43158,18 +49621,18 @@ var scriptlets_umd = {exports: {}}; return stack; }); if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { + for (var index = 0; index < stackLines.length; index += 1) { if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { return true; } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { return true; } } } return false; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { abortOnStackTrace.apply(this, updatedArgs); } catch (e) { @@ -43178,11 +49641,11 @@ var scriptlets_umd = {exports: {}}; } function adjustSetInterval(source, args) { function adjustSetInterval(source, matchCallback, matchDelay, boost) { - const nativeSetInterval = window.setInterval; - const matchRegexp = toRegExp(matchCallback); - const intervalWrapper = function intervalWrapper(callback, delay) { + var nativeSetInterval = window.setInterval; + var matchRegexp = toRegExp(matchCallback); + var intervalWrapper = function intervalWrapper(callback, delay) { if (!isValidCallback(callback)) { - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); @@ -43200,19 +49663,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -43229,24 +49692,46 @@ var scriptlets_umd = {exports: {}}; return callback instanceof Function || typeof callback === "string"; } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function getBoostMultiplier(boost) { - const DEFAULT_MULTIPLIER = .05; - const MIN_MULTIPLIER = .001; - const MAX_MULTIPLIER = 50; - const parsedBoost = parseFloat(boost); - let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; + var DEFAULT_MULTIPLIER = .05; + var MIN_MULTIPLIER = .001; + var MAX_MULTIPLIER = 50; + var parsedBoost = parseFloat(boost); + var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } @@ -43259,48 +49744,38 @@ var scriptlets_umd = {exports: {}}; return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; + var native = Number.isFinite || window.isFinite; return native(num); } function getMatchDelay(delay) { - const DEFAULT_DELAY = 1e3; - const parsedDelay = parseInt(delay, 10); - const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; + var DEFAULT_DELAY = 1e3; + var parsedDelay = parseInt(delay, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; return delayMatch; } function shouldMatchAnyDelay(delay) { return delay === "*"; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { adjustSetInterval.apply(this, updatedArgs); } catch (e) { @@ -43309,11 +49784,11 @@ var scriptlets_umd = {exports: {}}; } function adjustSetTimeout(source, args) { function adjustSetTimeout(source, matchCallback, matchDelay, boost) { - const nativeSetTimeout = window.setTimeout; - const matchRegexp = toRegExp(matchCallback); - const timeoutWrapper = function timeoutWrapper(callback, delay) { + var nativeSetTimeout = window.setTimeout; + var matchRegexp = toRegExp(matchCallback); + var timeoutWrapper = function timeoutWrapper(callback, delay) { if (!isValidCallback(callback)) { - const message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); + var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'"); logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); @@ -43331,19 +49806,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -43360,24 +49835,46 @@ var scriptlets_umd = {exports: {}}; return callback instanceof Function || typeof callback === "string"; } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function getBoostMultiplier(boost) { - const DEFAULT_MULTIPLIER = .05; - const MIN_MULTIPLIER = .001; - const MAX_MULTIPLIER = 50; - const parsedBoost = parseFloat(boost); - let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; + var DEFAULT_MULTIPLIER = .05; + var MIN_MULTIPLIER = .001; + var MAX_MULTIPLIER = 50; + var parsedBoost = parseFloat(boost); + var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } @@ -43390,48 +49887,38 @@ var scriptlets_umd = {exports: {}}; return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; + var native = Number.isFinite || window.isFinite; return native(num); } function getMatchDelay(delay) { - const DEFAULT_DELAY = 1e3; - const parsedDelay = parseInt(delay, 10); - const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; + var DEFAULT_DELAY = 1e3; + var parsedDelay = parseInt(delay, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; return delayMatch; } function shouldMatchAnyDelay(delay) { return delay === "*"; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { adjustSetTimeout.apply(this, updatedArgs); } catch (e) { @@ -43440,24 +49927,24 @@ var scriptlets_umd = {exports: {}}; } function debugCurrentInlineScript(source, args) { function debugCurrentInlineScript(source, property, search) { - const searchRegexp = toRegExp(search); - const rid = randomId(); - const getCurrentScript = function getCurrentScript() { + var searchRegexp = toRegExp(search); + var rid = randomId(); + var getCurrentScript = function getCurrentScript() { if ("currentScript" in document) { return document.currentScript; } - const scripts = document.getElementsByTagName("script"); + var scripts = document.getElementsByTagName("script"); return scripts[scripts.length - 1]; }; - const ourScript = getCurrentScript(); - const abort = function abort() { - const scriptEl = getCurrentScript(); + var ourScript = getCurrentScript(); + var abort = function abort() { + var scriptEl = getCurrentScript(); if (!scriptEl) { return; } - let content = scriptEl.textContent; + var content = scriptEl.textContent; try { - const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; + var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; content = textContentGetter.call(scriptEl); } catch (e) {} if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { @@ -43465,21 +49952,21 @@ var scriptlets_umd = {exports: {}}; debugger; } }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (base instanceof Object === false && base === null) { - const props = property.split("."); - const propIndex = props.indexOf(prop); - const baseName = props[propIndex - 1]; - const message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); + var props = property.split("."); + var propIndex = props.indexOf(prop); + var baseName = props[propIndex - 1]; + var message = "The scriptlet had been executed before the ".concat(baseName, " was loaded."); logMessage(message, source.verbose); return; } if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -43493,7 +49980,7 @@ var scriptlets_umd = {exports: {}}; }); return; } - let currentValue = base[prop]; + var currentValue = base[prop]; setPropertyAccess(base, prop, { set: function set(value) { abort(); @@ -43512,7 +49999,7 @@ var scriptlets_umd = {exports: {}}; return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -43520,14 +50007,14 @@ var scriptlets_umd = {exports: {}}; return true; } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -43535,7 +50022,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -43564,29 +50051,51 @@ var scriptlets_umd = {exports: {}}; }; } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -43596,19 +50105,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -43622,34 +50131,24 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { debugCurrentInlineScript.apply(this, updatedArgs); } catch (e) { @@ -43661,18 +50160,18 @@ var scriptlets_umd = {exports: {}}; if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); debugger; }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -43698,7 +50197,7 @@ var scriptlets_umd = {exports: {}}; return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -43706,14 +50205,14 @@ var scriptlets_umd = {exports: {}}; return true; } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -43721,7 +50220,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -43750,16 +50249,16 @@ var scriptlets_umd = {exports: {}}; }; } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -43769,19 +50268,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -43798,7 +50297,7 @@ var scriptlets_umd = {exports: {}}; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { debugOnPropertyRead.apply(this, updatedArgs); } catch (e) { @@ -43810,18 +50309,18 @@ var scriptlets_umd = {exports: {}}; if (!property) { return; } - const rid = randomId(); - const abort = function abort() { + var rid = randomId(); + var abort = function abort() { hit(source); debugger; }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -43846,7 +50345,7 @@ var scriptlets_umd = {exports: {}}; return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -43854,14 +50353,14 @@ var scriptlets_umd = {exports: {}}; return true; } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -43869,7 +50368,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -43898,16 +50397,16 @@ var scriptlets_umd = {exports: {}}; }; } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -43917,19 +50416,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -43945,7 +50444,7 @@ var scriptlets_umd = {exports: {}}; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { debugOnPropertyWrite.apply(this, updatedArgs); } catch (e) { @@ -43954,7 +50453,7 @@ var scriptlets_umd = {exports: {}}; } function dirString(source, args) { function dirString(source, times) { - const _console = console, + var _console = console, dir = _console.dir; function dirWrapper(object) { if (typeof dir === "function") { @@ -43969,19 +50468,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -43994,7 +50493,7 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { dirString.apply(this, updatedArgs); } catch (e) { @@ -44004,7 +50503,7 @@ var scriptlets_umd = {exports: {}}; function disableNewtabLinks(source, args) { function disableNewtabLinks(source) { document.addEventListener("click", function (ev) { - let target = ev.target; + var target = ev.target; while (target !== null) { if (target.localName === "a" && target.hasAttribute("target")) { ev.stopPropagation(); @@ -44021,19 +50520,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -44046,22 +50545,313 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { disableNewtabLinks.apply(this, updatedArgs); } catch (e) { console.log(e); } } + function evalDataPrune(source, args) { + function evalDataPrune(source, propsToRemove, requiredInitialProps, stack) { + if (!!stack && !matchStackTrace(stack, new Error().stack)) { + return; + } + var prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; + var evalWrapper = function evalWrapper(target, thisArg, args) { + var data = Reflect.apply(target, thisArg, args); + if (typeof data === "object") { + data = jsonPruner(source, data, prunePaths, requiredPaths); + } + return data; + }; + var evalHandler = { + apply: evalWrapper + }; + window.eval = new Proxy(window.eval, evalHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + } + function getWildcardPropertyInChain(base, chain) { + var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + var pos = chain.indexOf("."); + if (pos === -1) { + if (chain === "*" || chain === "[]") { + for (var key in base) { + if (Object.prototype.hasOwnProperty.call(base, key)) { + output.push({ + base: base, + prop: key + }); + } + } + } else { + output.push({ + base: base, + prop: chain + }); + } + return output; + } + var prop = chain.slice(0, pos); + var shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; + if (shouldLookThrough) { + var nextProp = chain.slice(pos + 1); + var baseKeys = Object.keys(base); + baseKeys.forEach(function (key) { + var item = base[key]; + getWildcardPropertyInChain(item, nextProp, lookThrough, output); + }); + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if (nextBase !== undefined) { + getWildcardPropertyInChain(nextBase, chain, lookThrough, output); + } + return output; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isPruningNeeded(source, root, prunePaths, requiredPaths) { + if (!root) { + return false; + } + var shouldProcess; + if (prunePaths.length === 0 && requiredPaths.length > 0) { + var rootString = JSON.stringify(root); + var matchRegex = toRegExp(requiredPaths.join("")); + var shouldLog = matchRegex.test(rootString); + if (shouldLog) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + shouldProcess = false; + return shouldProcess; + } + } + var wildcardSymbols = [".*.", "*.", ".*", ".[].", "[].", ".[]"]; + var _loop = function _loop() { + var requiredPath = requiredPaths[i]; + var lastNestedPropName = requiredPath.split(".").pop(); + var hasWildcard = wildcardSymbols.some(function (symbol) { + return requiredPath.includes(symbol); + }); + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + shouldProcess = !hasWildcard; + for (var j = 0; j < details.length; j += 1) { + var hasRequiredProp = typeof lastNestedPropName === "string" && details[j].base[lastNestedPropName] !== undefined; + if (hasWildcard) { + shouldProcess = hasRequiredProp || shouldProcess; + } else { + shouldProcess = hasRequiredProp && shouldProcess; + } + } + }; + for (var i = 0; i < requiredPaths.length; i += 1) { + _loop(); + } + return shouldProcess; + } + function jsonPruner(source, root, prunePaths, requiredPaths) { + if (prunePaths.length === 0 && requiredPaths.length === 0) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + return root; + } + try { + if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) { + return root; + } + prunePaths.forEach(function (path) { + var ownerObjArr = getWildcardPropertyInChain(root, path, true); + ownerObjArr.forEach(function (ownerObj) { + if (ownerObj !== undefined && ownerObj.base) { + delete ownerObj.base[ownerObj.prop]; + hit(source); + } + }); + }); + } catch (e) { + logMessage(source, e); + } + return root; + } + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); + } + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + evalDataPrune.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } function forceWindowClose(source, args) { function forceWindowClose(source) { - let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; if (typeof window.close !== "function") { - const message = "window.close() is not a function so 'close-window' scriptlet is unavailable"; + var message = "window.close() is not a function so 'close-window' scriptlet is unavailable"; logMessage(source, message); return; } - const closeImmediately = function closeImmediately() { + var closeImmediately = function closeImmediately() { try { hit(source); window.close(); @@ -44069,8 +50859,8 @@ var scriptlets_umd = {exports: {}}; logMessage(source, e); } }; - const closeByExtension = function closeByExtension() { - const extCall = function extCall() { + var closeByExtension = function closeByExtension() { + var extCall = function extCall() { dispatchEvent(new Event("adguard:scriptlet-close-window")); }; window.addEventListener("adguard:subscribed-to-close-window", extCall, { @@ -44082,17 +50872,17 @@ var scriptlets_umd = {exports: {}}; }); }, 5e3); }; - const shouldClose = function shouldClose() { + var shouldClose = function shouldClose() { if (path === "") { return true; } - const pathRegexp = toRegExp(path); - const currentPath = "".concat(window.location.pathname).concat(window.location.search); + var pathRegexp = toRegExp(path); + var currentPath = "".concat(window.location.pathname).concat(window.location.search); return pathRegexp.test(currentPath); }; if (shouldClose()) { closeImmediately(); - if (navigator.userAgent.indexOf("Chrome") > -1) { + if (navigator.userAgent.includes("Chrome")) { closeByExtension(); } } @@ -44102,19 +50892,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -44128,44 +50918,56 @@ var scriptlets_umd = {exports: {}}; } } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { forceWindowClose.apply(this, updatedArgs); } catch (e) { @@ -44177,15 +50979,15 @@ var scriptlets_umd = {exports: {}}; if (!Element.prototype.attachShadow) { return; } - const hideElement = function hideElement(targetElement) { - const DISPLAY_NONE_CSS = "display:none!important;"; + var hideElement = function hideElement(targetElement) { + var DISPLAY_NONE_CSS = "display:none!important;"; targetElement.style.cssText = DISPLAY_NONE_CSS; }; - const hideHandler = function hideHandler() { - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { - let isHidden = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), + var hideHandler = function hideHandler() { + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + var _loop = function _loop() { + var isHidden = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), targets = _pierceShadowDom.targets, innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { @@ -44196,6 +50998,9 @@ var scriptlets_umd = {exports: {}}; hit(source); } hostElements = innerHosts; + }; + while (hostElements.length !== 0) { + _loop(); } }; hideHandler(); @@ -44206,19 +51011,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -44232,11 +51037,11 @@ var scriptlets_umd = {exports: {}}; } } function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { childList: true, @@ -44252,7 +51057,7 @@ var scriptlets_umd = {exports: {}}; }); } }; - const disconnect = function disconnect() { + var disconnect = function disconnect() { observer.disconnect(); }; function callbackWrapper() { @@ -44263,40 +51068,42 @@ var scriptlets_umd = {exports: {}}; connect(); } function findHostElements(rootElement) { - const hosts = []; - const domElems = rootElement.querySelectorAll("*"); - domElems.forEach(function (el) { - if (el.shadowRoot) { - hosts.push(el); - } - }); + var hosts = []; + if (rootElement) { + var domElems = rootElement.querySelectorAll("*"); + domElems.forEach(function (el) { + if (el.shadowRoot) { + hosts.push(el); + } + }); + } return hosts; } function pierceShadowDom(selector, hostElements) { - let targets = []; - const innerHostsAcc = []; + var targets = []; + var innerHostsAcc = []; hostElements.forEach(function (host) { - const simpleElems = host.querySelectorAll(selector); + var simpleElems = host.querySelectorAll(selector); targets = targets.concat([].slice.call(simpleElems)); - const shadowRootElem = host.shadowRoot; - const shadowChildren = shadowRootElem.querySelectorAll(selector); + var shadowRootElem = host.shadowRoot; + var shadowChildren = shadowRootElem.querySelectorAll(selector); targets = targets.concat([].slice.call(shadowChildren)); innerHostsAcc.push(findHostElements(shadowRootElem)); }); - const innerHosts = flatten(innerHostsAcc); + var innerHosts = flatten(innerHostsAcc); return { targets: targets, innerHosts: innerHosts }; } function flatten(input) { - const stack = []; + var stack = []; input.forEach(function (el) { return stack.push(el); }); - const res = []; + var res = []; while (stack.length) { - const next = stack.pop(); + var next = stack.pop(); if (Array.isArray(next)) { next.forEach(function (el) { return stack.push(el); @@ -44308,9 +51115,9 @@ var scriptlets_umd = {exports: {}}; return res.reverse(); } function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } @@ -44330,7 +51137,7 @@ var scriptlets_umd = {exports: {}}; }; return wrapper; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { hideInShadowDom.apply(this, updatedArgs); } catch (e) { @@ -44339,7 +51146,7 @@ var scriptlets_umd = {exports: {}}; } function injectCssInShadowDom(source, args) { function injectCssInShadowDom(source, cssRule) { - let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; if (!Element.prototype.attachShadow || typeof Proxy === "undefined" || typeof Reflect === "undefined") { return; } @@ -44347,9 +51154,9 @@ var scriptlets_umd = {exports: {}}; logMessage(source, '"url()" function is not allowed for css rules'); return; } - const callback = function callback(shadowRoot) { + var callback = function callback(shadowRoot) { try { - const stylesheet = new CSSStyleSheet(); + var stylesheet = new CSSStyleSheet(); try { stylesheet.insertRule(cssRule); } catch (e) { @@ -44358,7 +51165,7 @@ var scriptlets_umd = {exports: {}}; } shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet]; } catch (_unused) { - const styleTag = document.createElement("style"); + var styleTag = document.createElement("style"); styleTag.innerText = cssRule; shadowRoot.appendChild(styleTag); } @@ -44371,19 +51178,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -44397,44 +51204,34 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function hijackAttachShadow(context, hostSelector, callback) { - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const shadowRoot = Reflect.apply(target, thisArg, args); + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var shadowRoot = Reflect.apply(target, thisArg, args); if (thisArg && thisArg.matches(hostSelector || "*")) { callback(shadowRoot); } return shadowRoot; }; - const attachShadowHandler = { + var attachShadowHandler = { apply: handlerWrapper }; context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { injectCssInShadowDom.apply(this, updatedArgs); } catch (e) { @@ -44446,83 +51243,23 @@ var scriptlets_umd = {exports: {}}; if (!!stack && !matchStackTrace(stack, new Error().stack)) { return; } - const prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; - const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { - if (!root) { - return false; - } - let shouldProcess; - if (prunePaths.length === 0 && requiredPaths.length > 0) { - const rootString = JSON.stringify(root); - const matchRegex = toRegExp(requiredPaths.join("")); - const shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === "object") { - logMessage(source, root, true, false); - } - shouldProcess = false; - return shouldProcess; - } - } - for (let i = 0; i < requiredPaths.length; i += 1) { - const requiredPath = requiredPaths[i]; - const lastNestedPropName = requiredPath.split(".").pop(); - const hasWildcard = requiredPath.indexOf(".*.") > -1 || requiredPath.indexOf("*.") > -1 || requiredPath.indexOf(".*") > -1 || requiredPath.indexOf(".[].") > -1 || requiredPath.indexOf("[].") > -1 || requiredPath.indexOf(".[]") > -1; - const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); - shouldProcess = !hasWildcard; - for (let i = 0; i < details.length; i += 1) { - if (hasWildcard) { - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess; - } else { - shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess; - } - } - } - return shouldProcess; - } - const jsonPruner = function jsonPruner(root) { - if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); - if (root && typeof root === "object") { - logMessage(source, root, true, false); - } - return root; - } - try { - if (isPruningNeeded(root) === false) { - return root; - } - prunePaths.forEach(function (path) { - const ownerObjArr = getWildcardPropertyInChain(root, path, true); - ownerObjArr.forEach(function (ownerObj) { - if (ownerObj !== undefined && ownerObj.base) { - delete ownerObj.base[ownerObj.prop]; - hit(source); - } - }); - }); - } catch (e) { - logMessage(source, e); - } - return root; - }; - const nativeJSONParse = JSON.parse; - const jsonParseWrapper = function jsonParseWrapper() { + var prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; + var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; + var nativeJSONParse = JSON.parse; + var jsonParseWrapper = function jsonParseWrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - const root = nativeJSONParse.apply(JSON, args); - return jsonPruner(root); + var root = nativeJSONParse.apply(JSON, args); + return jsonPruner(source, root, prunePaths, requiredPaths); }; jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); JSON.parse = jsonParseWrapper; - const nativeResponseJson = Response.prototype.json; - const responseJsonWrapper = function responseJsonWrapper() { - const promise = nativeResponseJson.apply(this); + var nativeResponseJson = Response.prototype.json; + var responseJsonWrapper = function responseJsonWrapper() { + var promise = nativeResponseJson.apply(this); return promise.then(function (obj) { - return jsonPruner(obj); + return jsonPruner(source, obj, prunePaths, requiredPaths); }); }; if (typeof Response === "undefined") { @@ -44535,19 +51272,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -44567,19 +51304,19 @@ var scriptlets_umd = {exports: {}}; if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } function getWildcardPropertyInChain(base, chain) { - let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - const pos = chain.indexOf("."); + var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + var pos = chain.indexOf("."); if (pos === -1) { if (chain === "*" || chain === "[]") { - for (const key in base) { + for (var key in base) { if (Object.prototype.hasOwnProperty.call(base, key)) { output.push({ base: base, @@ -44595,17 +51332,17 @@ var scriptlets_umd = {exports: {}}; } return output; } - const prop = chain.slice(0, pos); - const shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; + var prop = chain.slice(0, pos); + var shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; if (shouldLookThrough) { - const nextProp = chain.slice(pos + 1); - const baseKeys = Object.keys(base); + var nextProp = chain.slice(pos + 1); + var baseKeys = Object.keys(base); baseKeys.forEach(function (key) { - const item = base[key]; + var item = base[key]; getWildcardPropertyInChain(item, nextProp, lookThrough, output); }); } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if (nextBase !== undefined) { getWildcardPropertyInChain(nextBase, chain, lookThrough, output); @@ -44613,79 +51350,165 @@ var scriptlets_umd = {exports: {}}; return output; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + nativeConsole("".concat(name, ": ").concat(message)); + } + function isPruningNeeded(source, root, prunePaths, requiredPaths) { + if (!root) { + return false; + } + var shouldProcess; + if (prunePaths.length === 0 && requiredPaths.length > 0) { + var rootString = JSON.stringify(root); + var matchRegex = toRegExp(requiredPaths.join("")); + var shouldLog = matchRegex.test(rootString); + if (shouldLog) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + shouldProcess = false; + return shouldProcess; } } - nativeConsole(messageStr); + var wildcardSymbols = [".*.", "*.", ".*", ".[].", "[].", ".[]"]; + var _loop = function _loop() { + var requiredPath = requiredPaths[i]; + var lastNestedPropName = requiredPath.split(".").pop(); + var hasWildcard = wildcardSymbols.some(function (symbol) { + return requiredPath.includes(symbol); + }); + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + shouldProcess = !hasWildcard; + for (var j = 0; j < details.length; j += 1) { + var hasRequiredProp = typeof lastNestedPropName === "string" && details[j].base[lastNestedPropName] !== undefined; + if (hasWildcard) { + shouldProcess = hasRequiredProp || shouldProcess; + } else { + shouldProcess = hasRequiredProp && shouldProcess; + } + } + }; + for (var i = 0; i < requiredPaths.length; i += 1) { + _loop(); + } + return shouldProcess; + } + function jsonPruner(source, root, prunePaths, requiredPaths) { + if (prunePaths.length === 0 && requiredPaths.length === 0) { + logMessage(source, "".concat(window.location.hostname, "\n").concat(JSON.stringify(root, null, 2)), true); + if (root && typeof root === "object") { + logMessage(source, root, true, false); + } + return root; + } + try { + if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) { + return root; + } + prunePaths.forEach(function (path) { + var ownerObjArr = getWildcardPropertyInChain(root, path, true); + ownerObjArr.forEach(function (ownerObj) { + if (ownerObj !== undefined && ownerObj.base) { + delete ownerObj.base[ownerObj.prop]; + hit(source); + } + }); + }); + } catch (e) { + logMessage(source, e); + } + return root; } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); } function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); }; if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { return false; } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); if (pos !== -1) { documentURL = documentURL.slice(0, pos); } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { stackURL = stackURL.slice(1); } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { stackFunction = stackFunction.slice(2).trim(); } stack = "".concat(stackFunction, " ").concat(stackURL).trim(); @@ -44698,18 +51521,18 @@ var scriptlets_umd = {exports: {}}; return stack; }); if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { + for (var index = 0; index < stackLines.length; index += 1) { if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { return true; } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { return true; } } } return false; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { jsonPrune.apply(this, updatedArgs); } catch (e) { @@ -44723,7 +51546,7 @@ var scriptlets_umd = {exports: {}}; } console.log(args); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { log.apply(this, updatedArgs); } catch (e) { @@ -44732,17 +51555,18 @@ var scriptlets_umd = {exports: {}}; } function logAddEventListener(source, args) { function logAddEventListener(source) { - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { var _this$constructor; if (validateType(type) && validateListener(listener)) { - const message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); + var message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); logMessage(source, message, true); hit(source); + } else { + var _message = "Invalid event type or listener passed to addEventListener:\n type: ".concat(convertTypeToString(type), "\n listener: ").concat(convertTypeToString(listener)); + logMessage(source, _message, true); } - const message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); - logMessage(source, message, true); - let context = this; + var context = this; if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { context = window; } @@ -44751,7 +51575,7 @@ var scriptlets_umd = {exports: {}}; } return nativeAddEventListener.apply(context, [type, listener, ...args]); } - const descriptor = { + var descriptor = { configurable: true, set: function set() {}, get: function get() { @@ -44767,19 +51591,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -44796,13 +51620,13 @@ var scriptlets_umd = {exports: {}}; return typeof type !== "undefined"; } function validateListener(listener) { - return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); + return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && "handleEvent" in listener && typeof listener.handleEvent === "function"); } function listenerToString(listener) { return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); } function convertTypeToString(value) { - let output; + var output; if (typeof value === "undefined") { output = "undefined"; } else if (typeof value === "object") { @@ -44817,38 +51641,28 @@ var scriptlets_umd = {exports: {}}; return output; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function objectToString(obj) { if (!obj || typeof obj !== "object") { return String(obj); } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } @@ -44858,15 +51672,7 @@ var scriptlets_umd = {exports: {}}; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { logAddEventListener.apply(this, updatedArgs); } catch (e) { @@ -44875,14 +51681,14 @@ var scriptlets_umd = {exports: {}}; } function logEval(source, args) { function logEval(source) { - const nativeEval = window.eval; + var nativeEval = window.eval; function evalWrapper(str) { hit(source); logMessage(source, 'eval("'.concat(str, '")'), true); return nativeEval(str); } window.eval = evalWrapper; - const nativeFunction = window.Function; + var nativeFunction = window.Function; function FunctionWrapper() { hit(source); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { @@ -44900,19 +51706,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -44926,31 +51732,21 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { logEval.apply(this, updatedArgs); } catch (e) { @@ -44962,15 +51758,15 @@ var scriptlets_umd = {exports: {}}; if (!property) { return; } - const refineStackTrace = function refineStackTrace(stackString) { - const stackSteps = stackString.split("\n").slice(2).map(function (line) { + var refineStackTrace = function refineStackTrace(stackString) { + var stackSteps = stackString.split("\n").slice(2).map(function (line) { return line.replace(/ {4}at /, ""); }); - const logInfoArray = stackSteps.map(function (line) { - let funcName; - let funcFullPath; - const reg = /\(([^\)]+)\)/; - const regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; + var logInfoArray = stackSteps.map(function (line) { + var funcName; + var funcFullPath; + var reg = /\(([^\)]+)\)/; + var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; if (line.match(reg)) { funcName = line.split(" ").slice(0, -1).join(" "); funcFullPath = line.match(reg)[1]; @@ -44983,19 +51779,19 @@ var scriptlets_umd = {exports: {}}; } return [funcName, funcFullPath]; }); - const logInfoObject = {}; + var logInfoObject = {}; logInfoArray.forEach(function (pair) { logInfoObject[pair[0]] = pair[1]; }); return logInfoObject; }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - let base = chainInfo.base; - const prop = chainInfo.prop, + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, chain = chainInfo.chain; if (chain) { - const setter = function setter(a) { + var setter = function setter(a) { base = a; if (a instanceof Object) { setChainPropAccess(a, chain); @@ -45009,7 +51805,7 @@ var scriptlets_umd = {exports: {}}; }); return; } - let value = base[prop]; + var value = base[prop]; setPropertyAccess(base, prop, { get() { hit(source); @@ -45028,14 +51824,14 @@ var scriptlets_umd = {exports: {}}; setChainPropAccess(window, property); } function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); + var pos = chain.indexOf("."); if (pos === -1) { return { base: base, prop: chain }; } - const prop = chain.slice(0, pos); + var prop = chain.slice(0, pos); if (base === null) { return { base: base, @@ -45043,7 +51839,7 @@ var scriptlets_umd = {exports: {}}; chain: chain }; } - const nextBase = base[prop]; + var nextBase = base[prop]; chain = chain.slice(pos + 1); if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { @@ -45072,7 +51868,7 @@ var scriptlets_umd = {exports: {}}; }; } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -45084,19 +51880,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -45110,34 +51906,24 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { logOnStacktrace.apply(this, updatedArgs); } catch (e) { @@ -45145,14 +51931,15 @@ var scriptlets_umd = {exports: {}}; } } function m3uPrune(source, args) { - function m3uPrune(source, propsToRemove, urlToMatch) { + function m3uPrune(source, propsToRemove) { + var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - let shouldPruneResponse = false; - const urlMatchRegexp = toRegExp(urlToMatch); - const SEGMENT_MARKER = "#"; - const AD_MARKER = { + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var SEGMENT_MARKER = "#"; + var AD_MARKER = { ASSET: "#EXT-X-ASSET:", CUE: "#EXT-X-CUE:", CUE_IN: "#EXT-X-CUE-IN", @@ -45161,28 +51948,28 @@ var scriptlets_umd = {exports: {}}; EXTM3U: "#EXTM3U", SCTE35: "#EXT-X-SCTE35:" }; - const COMCAST_AD_MARKER = { + var COMCAST_AD_MARKER = { AD: "-AD-", VAST: "-VAST-", VMAP_AD: "-VMAP-AD-", VMAP_AD_BREAK: "#EXT-X-VMAP-AD-BREAK:" }; - const TAGS_ALLOWLIST = ["#EXT-X-TARGETDURATION", "#EXT-X-MEDIA-SEQUENCE", "#EXT-X-DISCONTINUITY-SEQUENCE", "#EXT-X-ENDLIST", "#EXT-X-PLAYLIST-TYPE", "#EXT-X-I-FRAMES-ONLY", "#EXT-X-MEDIA", "#EXT-X-STREAM-INF", "#EXT-X-I-FRAME-STREAM-INF", "#EXT-X-SESSION-DATA", "#EXT-X-SESSION-KEY", "#EXT-X-INDEPENDENT-SEGMENTS", "#EXT-X-START"]; - const isAllowedTag = function isAllowedTag(str) { + var TAGS_ALLOWLIST = ["#EXT-X-TARGETDURATION", "#EXT-X-MEDIA-SEQUENCE", "#EXT-X-DISCONTINUITY-SEQUENCE", "#EXT-X-ENDLIST", "#EXT-X-PLAYLIST-TYPE", "#EXT-X-I-FRAMES-ONLY", "#EXT-X-MEDIA", "#EXT-X-STREAM-INF", "#EXT-X-I-FRAME-STREAM-INF", "#EXT-X-SESSION-DATA", "#EXT-X-SESSION-KEY", "#EXT-X-INDEPENDENT-SEGMENTS", "#EXT-X-START"]; + var isAllowedTag = function isAllowedTag(str) { return TAGS_ALLOWLIST.some(function (el) { return str.startsWith(el); }); }; - const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { - let array = lines.slice(); - let index = i; + var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) { + var array = lines.slice(); + var index = i; if (array[index].includes(AD_MARKER.EXTINF)) { array[index] = undefined; index += 1; if (array[index].includes(AD_MARKER.DISCONTINUITY)) { array[index] = undefined; index += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, index); + var prunedExtinf = pruneExtinfFromVmapBlock(array, index); array = prunedExtinf.array; index = prunedExtinf.index; } @@ -45192,14 +51979,14 @@ var scriptlets_umd = {exports: {}}; index: index }; }; - const pruneVmapBlock = function pruneVmapBlock(lines) { - let array = lines.slice(); - for (let i = 0; i < array.length - 1; i += 1) { + var pruneVmapBlock = function pruneVmapBlock(lines) { + var array = lines.slice(); + for (var i = 0; i < array.length - 1; i += 1) { if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) { array[i] = undefined; if (array[i + 1].includes(AD_MARKER.EXTINF)) { i += 1; - const prunedExtinf = pruneExtinfFromVmapBlock(array, i); + var prunedExtinf = pruneExtinfFromVmapBlock(array, i); array = prunedExtinf.array; i = prunedExtinf.index - 1; } @@ -45207,7 +51994,7 @@ var scriptlets_umd = {exports: {}}; } return array; }; - const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { + var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) { if (!line.startsWith(AD_MARKER.CUE)) { return line; } @@ -45230,8 +52017,8 @@ var scriptlets_umd = {exports: {}}; } return line; }; - const removeM3ULineRegexp = toRegExp(propsToRemove); - const pruneInfBlock = function pruneInfBlock(line, index, array) { + var removeM3ULineRegexp = toRegExp(propsToRemove); + var pruneInfBlock = function pruneInfBlock(line, index, array) { if (!line.startsWith(AD_MARKER.EXTINF)) { return line; } @@ -45251,17 +52038,17 @@ var scriptlets_umd = {exports: {}}; } return line; }; - const pruneSegments = function pruneSegments(lines) { - for (let i = 0; i < lines.length - 1; i += 1) { + var pruneSegments = function pruneSegments(lines) { + for (var i = 0; i < lines.length - 1; i += 1) { var _lines$i; if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) { - const segmentName = lines[i].substring(0, lines[i].indexOf(":")); + var segmentName = lines[i].substring(0, lines[i].indexOf(":")); if (!segmentName) { return lines; } lines[i] = undefined; i += 1; - for (let j = i; j < lines.length; j += 1) { + for (var j = i; j < lines.length; j += 1) { if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) { lines[j] = undefined; } else { @@ -45273,18 +52060,18 @@ var scriptlets_umd = {exports: {}}; } return lines; }; - const isM3U = function isM3U(text) { + var isM3U = function isM3U(text) { if (typeof text === "string") { - const trimmedText = text.trim(); + var trimmedText = text.trim(); return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK); } return false; }; - const isPruningNeeded = function isPruningNeeded(text, regexp) { + var isPruningNeeded = function isPruningNeeded(text, regexp) { return isM3U(text) && regexp.test(text); }; - const pruneM3U = function pruneM3U(text) { - let lines = text.split(/\n\r|\n|\r/); + var pruneM3U = function pruneM3U(text) { + var lines = text.split(/\n\r|\n|\r/); if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) { lines = pruneVmapBlock(lines); return lines.filter(function (l) { @@ -45305,59 +52092,136 @@ var scriptlets_umd = {exports: {}}; return !!l; }).join("\n"); }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== "string" || xhrURL.length === 0) { + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; + } + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ["", "text"]; + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener("readystatechange", function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener("readystatechange", pruneResponse); - if (!propsToRemove) { - if (isM3U(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - } - } else { - shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); - } - if (shouldPruneResponse) { - const prunedResponseContent = pruneM3U(response); - Object.defineProperty(thisArg, "response", { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, "responseText", { - value: prunedResponseContent - }); - hit(source); - } + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + if (typeof content !== "string") { + return; + } + if (!propsToRemove) { + if (isM3U(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); + } + } else { + shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); + } + var responseContent = shouldPruneResponse ? pruneM3U(response) : response; + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false } }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } - return Reflect.apply(target, thisArg, args); + return undefined; }; - const xhrHandler = { - apply: xhrWrapper + var openHandler = { + apply: openWrapper }; - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = async function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; if (typeof fetchURL !== "string" || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); } if (urlMatchRegexp.test(fetchURL)) { - const response = await nativeFetch(...args); - const responseText = await response.text(); + var response = await nativeFetch(...args); + var clonedResponse = response.clone(); + var responseText = await response.text(); if (!propsToRemove && isM3U(responseText)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); logMessage(source, message); - return Reflect.apply(target, thisArg, args); + return clonedResponse; } if (isPruningNeeded(responseText, removeM3ULineRegexp)) { - const prunedText = pruneM3U(responseText); + var prunedText = pruneM3U(responseText); hit(source); return new Response(prunedText, { status: response.status, @@ -45365,11 +52229,11 @@ var scriptlets_umd = {exports: {}}; headers: response.headers }); } - return Reflect.apply(target, thisArg, args); + return clonedResponse; } return Reflect.apply(target, thisArg, args); }; - const fetchHandler = { + var fetchHandler = { apply: fetchWrapper }; window.fetch = new Proxy(window.fetch, fetchHandler); @@ -45379,19 +52243,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -45405,44 +52269,139 @@ var scriptlets_umd = {exports: {}}; } } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + nativeConsole("".concat(name, ": ").concat(message)); + } + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; } + }); + return propsObj; + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); } - nativeConsole(messageStr); + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { m3uPrune.apply(this, updatedArgs); } catch (e) { @@ -45451,7 +52410,7 @@ var scriptlets_umd = {exports: {}}; } function noTopics(source, args) { function noTopics(source) { - const TOPICS_PROPERTY_NAME = "browsingTopics"; + var TOPICS_PROPERTY_NAME = "browsingTopics"; if (Document instanceof Object === false) { return; } @@ -45468,19 +52427,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -45494,13 +52453,13 @@ var scriptlets_umd = {exports: {}}; } } function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; if (typeof Response === "undefined") { return; } - const response = new Response(responseBody, { + var response = new Response(responseBody, { status: 200, statusText: "OK" }); @@ -45514,7 +52473,7 @@ var scriptlets_umd = {exports: {}}; }); return Promise.resolve(response); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { noTopics.apply(this, updatedArgs); } catch (e) { @@ -45533,19 +52492,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -45559,31 +52518,21 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { noeval.apply(this, updatedArgs); } catch (e) { @@ -45592,7 +52541,7 @@ var scriptlets_umd = {exports: {}}; } function nowebrtc(source, args) { function nowebrtc(source) { - let propertyName = ""; + var propertyName = ""; if (window.RTCPeerConnection) { propertyName = "RTCPeerConnection"; } else if (window.webkitRTCPeerConnection) { @@ -45601,8 +52550,8 @@ var scriptlets_umd = {exports: {}}; if (propertyName === "") { return; } - const rtcReplacement = function rtcReplacement(config) { - const message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); + var rtcReplacement = function rtcReplacement(config) { + var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); logMessage(source, message); hit(source); }; @@ -45612,7 +52561,7 @@ var scriptlets_umd = {exports: {}}; createOffer: noopFunc, setRemoteDescription: noopFunc }; - const rtc = window[propertyName]; + var rtc = window[propertyName]; window[propertyName] = rtcReplacement; if (rtc.prototype) { rtc.prototype.createDataChannel = function (a, b) { @@ -45628,19 +52577,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -45655,45 +52604,35 @@ var scriptlets_umd = {exports: {}}; } function noopFunc() {} function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function convertRtcConfigToString(config) { - const UNDEF_STR = "undefined"; - let str = UNDEF_STR; + var UNDEF_STR = "undefined"; + var str = UNDEF_STR; if (config === null) { str = "null"; } else if (config instanceof Object) { - const SERVERS_PROP_NAME = "iceServers"; - const URLS_PROP_NAME = "urls"; - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { + var SERVERS_PROP_NAME = "iceServers"; + var URLS_PROP_NAME = "urls"; + if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); } } return str; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { nowebrtc.apply(this, updatedArgs); } catch (e) { @@ -45702,12 +52641,12 @@ var scriptlets_umd = {exports: {}}; } function preventAddEventListener(source, args) { function preventAddEventListener(source, typeSearch, listenerSearch) { - const typeSearchRegexp = toRegExp(typeSearch); - const listenerSearchRegexp = toRegExp(listenerSearch); - const nativeAddEventListener = window.EventTarget.prototype.addEventListener; + var typeSearchRegexp = toRegExp(typeSearch); + var listenerSearchRegexp = toRegExp(listenerSearch); + var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { var _this$constructor; - let shouldPrevent = false; + var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); } @@ -45715,7 +52654,7 @@ var scriptlets_umd = {exports: {}}; hit(source); return undefined; } - let context = this; + var context = this; if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { context = window; } @@ -45724,7 +52663,7 @@ var scriptlets_umd = {exports: {}}; } return nativeAddEventListener.apply(context, [type, listener, ...args]); } - const descriptor = { + var descriptor = { configurable: true, set: function set() {}, get: function get() { @@ -45740,19 +52679,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -45766,28 +52705,50 @@ var scriptlets_umd = {exports: {}}; } } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function validateType(type) { return typeof type !== "undefined"; } function validateListener(listener) { - return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); + return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && "handleEvent" in listener && typeof listener.handleEvent === "function"); } function listenerToString(listener) { return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventAddEventListener.apply(this, updatedArgs); } catch (e) { @@ -45796,45 +52757,45 @@ var scriptlets_umd = {exports: {}}; } function preventAdfly(source, args) { function preventAdfly(source) { - const isDigit = function isDigit(data) { + var isDigit = function isDigit(data) { return /^\d$/.test(data); }; - const handler = function handler(encodedURL) { - let evenChars = ""; - let oddChars = ""; - for (let i = 0; i < encodedURL.length; i += 1) { + var handler = function handler(encodedURL) { + var evenChars = ""; + var oddChars = ""; + for (var i = 0; i < encodedURL.length; i += 1) { if (i % 2 === 0) { evenChars += encodedURL.charAt(i); } else { oddChars = encodedURL.charAt(i) + oddChars; } } - let data = (evenChars + oddChars).split(""); - for (let i = 0; i < data.length; i += 1) { - if (isDigit(data[i])) { - for (let ii = i + 1; ii < data.length; ii += 1) { + var data = (evenChars + oddChars).split(""); + for (var _i = 0; _i < data.length; _i += 1) { + if (isDigit(data[_i])) { + for (var ii = _i + 1; ii < data.length; ii += 1) { if (isDigit(data[ii])) { - const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10); + var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); if (temp < 10) { - data[i] = temp.toString(); + data[_i] = temp.toString(); } - i = ii; + _i = ii; break; } } } } data = data.join(""); - const decodedURL = window.atob(data).slice(16, -16); + var decodedURL = window.atob(data).slice(16, -16); if (window.stop) { window.stop(); } window.onbeforeunload = null; window.location.href = decodedURL; }; - let val; - let applyHandler = true; - const result = setPropertyAccess(window, "ysmm", { + var val; + var applyHandler = true; + var result = setPropertyAccess(window, "ysmm", { configurable: false, set: function set(value) { if (applyHandler) { @@ -45858,7 +52819,7 @@ var scriptlets_umd = {exports: {}}; } } function setPropertyAccess(object, property, descriptor) { - const currentDescriptor = Object.getOwnPropertyDescriptor(object, property); + var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); if (currentDescriptor && !currentDescriptor.configurable) { return false; } @@ -45870,19 +52831,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -45896,31 +52857,21 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventAdfly.apply(this, updatedArgs); } catch (e) { @@ -45929,9 +52880,9 @@ var scriptlets_umd = {exports: {}}; } function preventBab(source, args) { function preventBab(source) { - const nativeSetTimeout = window.setTimeout; - const babRegex = /\.bab_elementid.$/; - const timeoutWrapper = function timeoutWrapper(callback) { + var nativeSetTimeout = window.setTimeout; + var babRegex = /\.bab_elementid.$/; + var timeoutWrapper = function timeoutWrapper(callback) { if (typeof callback !== "string" || !babRegex.test(callback)) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; @@ -45941,17 +52892,17 @@ var scriptlets_umd = {exports: {}}; hit(source); }; window.setTimeout = timeoutWrapper; - const signatures = [["blockadblock"], ["babasbm"], [/getItem\('babn'\)/], ["getElementById", "String.fromCharCode", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "charAt", "DOMContentLoaded", "AdBlock", "addEventListener", "doScroll", "fromCharCode", "<<2|r>>4", "sessionStorage", "clientWidth", "localStorage", "Math", "random"]]; - const check = function check(str) { + var signatures = [["blockadblock"], ["babasbm"], [/getItem\('babn'\)/], ["getElementById", "String.fromCharCode", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "charAt", "DOMContentLoaded", "AdBlock", "addEventListener", "doScroll", "fromCharCode", "<<2|r>>4", "sessionStorage", "clientWidth", "localStorage", "Math", "random"]]; + var check = function check(str) { if (typeof str !== "string") { return false; } - for (let i = 0; i < signatures.length; i += 1) { - const tokens = signatures[i]; - let match = 0; - for (let j = 0; j < tokens.length; j += 1) { - const token = tokens[j]; - const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; + for (var i = 0; i < signatures.length; i += 1) { + var tokens = signatures[i]; + var match = 0; + for (var j = 0; j < tokens.length; j += 1) { + var token = tokens[j]; + var found = token instanceof RegExp ? token.test(str) : str.includes(token); if (found) { match += 1; } @@ -45962,17 +52913,17 @@ var scriptlets_umd = {exports: {}}; } return false; }; - const nativeEval = window.eval; - const evalWrapper = function evalWrapper(str) { + var nativeEval = window.eval; + var evalWrapper = function evalWrapper(str) { if (!check(str)) { return nativeEval(str); } hit(source); - const bodyEl = document.body; + var bodyEl = document.body; if (bodyEl) { bodyEl.style.removeProperty("visibility"); } - const el = document.getElementById("babasbmsgx"); + var el = document.getElementById("babasbmsgx"); if (el) { el.parentNode.removeChild(el); } @@ -45984,19 +52935,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46009,7 +52960,7 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventBab.apply(this, updatedArgs); } catch (e) { @@ -46021,23 +52972,26 @@ var scriptlets_umd = {exports: {}}; if (typeof Proxy === "undefined" || typeof Reflect === "undefined") { return; } - const srcMockData = { + var srcMockData = { script: "data:text/javascript;base64,KCk9Pnt9", img: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", - iframe: "data:text/html;base64, PGRpdj48L2Rpdj4=" + iframe: "data:text/html;base64, PGRpdj48L2Rpdj4=", + link: "data:text/plain;base64," }; - let instance; + var instance; if (tagName === "script") { instance = HTMLScriptElement; } else if (tagName === "img") { instance = HTMLImageElement; } else if (tagName === "iframe") { instance = HTMLIFrameElement; + } else if (tagName === "link") { + instance = HTMLLinkElement; } else { return; } - const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; - let policy; + var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; + var policy; if (hasTrustedTypes) { policy = window.trustedTypes.createPolicy("AGPolicy", { createScriptURL: function createScriptURL(arg) { @@ -46045,20 +52999,20 @@ var scriptlets_umd = {exports: {}}; } }); } - const SOURCE_PROPERTY_NAME = "src"; - const ONERROR_PROPERTY_NAME = "onerror"; - const searchRegexp = toRegExp(match); - const setMatchedAttribute = function setMatchedAttribute(elem) { + var SOURCE_PROPERTY_NAME = tagName === "link" ? "href" : "src"; + var ONERROR_PROPERTY_NAME = "onerror"; + var searchRegexp = toRegExp(match); + var setMatchedAttribute = function setMatchedAttribute(elem) { return elem.setAttribute(source.name, "matched"); }; - const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { + var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - const nodeName = thisArg.nodeName.toLowerCase(); - const attrName = args[0].toLowerCase(); - const attrValue = args[1]; - const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); + var nodeName = thisArg.nodeName.toLowerCase(); + var attrName = args[0].toLowerCase(); + var attrValue = args[1]; + var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); if (!isMatched) { return Reflect.apply(target, thisArg, args); } @@ -46066,11 +53020,11 @@ var scriptlets_umd = {exports: {}}; setMatchedAttribute(thisArg); return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); }; - const setAttributeHandler = { + var setAttributeHandler = { apply: setAttributeWrapper }; instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); - const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); + var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); if (!origSrcDescriptor) { return; } @@ -46081,14 +53035,14 @@ var scriptlets_umd = {exports: {}}; return origSrcDescriptor.get.call(this); }, set(urlValue) { - const nodeName = this.nodeName.toLowerCase(); - const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); + var nodeName = this.nodeName.toLowerCase(); + var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); if (!isMatched) { origSrcDescriptor.set.call(this, urlValue); return true; } if (policy && urlValue instanceof TrustedScriptURL) { - const trustedSrc = policy.createScriptURL(urlValue); + var trustedSrc = policy.createScriptURL(urlValue); origSrcDescriptor.set.call(this, trustedSrc); hit(source); return; @@ -46098,7 +53052,7 @@ var scriptlets_umd = {exports: {}}; hit(source); } }); - const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); + var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); if (!origOnerrorDescriptor) { return; } @@ -46109,7 +53063,7 @@ var scriptlets_umd = {exports: {}}; return origOnerrorDescriptor.get.call(this); }, set(cb) { - const isMatched = this.getAttribute(source.name) === "matched"; + var isMatched = this.getAttribute(source.name) === "matched"; if (!isMatched) { origOnerrorDescriptor.set.call(this, cb); return true; @@ -46118,40 +53072,54 @@ var scriptlets_umd = {exports: {}}; return true; } }); - const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { + var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { if (!args[0] || !args[1] || !thisArg) { return Reflect.apply(target, thisArg, args); } - const eventName = args[0]; - const isMatched = typeof thisArg.getAttribute === "function" && thisArg.getAttribute(source.name) === "matched" && eventName === "error"; + var eventName = args[0]; + var isMatched = typeof thisArg.getAttribute === "function" && thisArg.getAttribute(source.name) === "matched" && eventName === "error"; if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } return Reflect.apply(target, thisArg, args); }; - const addEventListenerHandler = { + var addEventListenerHandler = { apply: addEventListenerWrapper }; EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); + var preventInlineOnerror = function preventInlineOnerror(tagName, src) { + window.addEventListener("error", function (event) { + if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) { + return; + } + hit(source); + if (typeof event.target.onload === "function") { + event.target.onerror = event.target.onload; + return; + } + event.target.onerror = noopFunc; + }, true); + }; + preventInlineOnerror(tagName, searchRegexp); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46165,27 +53133,49 @@ var scriptlets_umd = {exports: {}}; } } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function safeGetDescriptor(obj, prop) { - const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); if (descriptor && descriptor.configurable) { return descriptor; } return null; } function noopFunc() {} - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventElementSrcLoading.apply(this, updatedArgs); } catch (e) { @@ -46194,8 +53184,8 @@ var scriptlets_umd = {exports: {}}; } function preventEvalIf(source, args) { function preventEvalIf(source, search) { - const searchRegexp = toRegExp(search); - const nativeEval = window.eval; + var searchRegexp = toRegExp(search); + var nativeEval = window.eval; window.eval = function (payload) { if (!searchRegexp.test(payload.toString())) { return nativeEval.call(window, payload); @@ -46205,16 +53195,38 @@ var scriptlets_umd = {exports: {}}; }.bind(window); } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function hit(source) { @@ -46222,19 +53234,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46247,7 +53259,7 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventEvalIf.apply(this, updatedArgs); } catch (e) { @@ -46257,7 +53269,7 @@ var scriptlets_umd = {exports: {}}; function preventFab(source, args) { function preventFab(source) { hit(source); - const Fab = function Fab() {}; + var Fab = function Fab() {}; Fab.prototype.check = noopFunc; Fab.prototype.clearEvent = noopFunc; Fab.prototype.emitEvent = noopFunc; @@ -46277,14 +53289,14 @@ var scriptlets_umd = {exports: {}}; set: noopFunc, get: noopFunc }; - const fab = new Fab(); - const getSetFab = { + var fab = new Fab(); + var getSetFab = { get() { return Fab; }, set() {} }; - const getsetfab = { + var getsetfab = { get() { return fab; }, @@ -46326,19 +53338,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46355,7 +53367,7 @@ var scriptlets_umd = {exports: {}}; function noopThis() { return this; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventFab.apply(this, updatedArgs); } catch (e) { @@ -46364,26 +53376,32 @@ var scriptlets_umd = {exports: {}}; } function preventFetch(source, args) { function preventFetch(source, propsToMatch) { - let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "emptyObj"; - let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "default"; + var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "emptyObj"; + var responseType = arguments.length > 3 ? arguments[3] : undefined; if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - let strResponseBody; + var strResponseBody; if (responseBody === "" || responseBody === "emptyObj") { strResponseBody = "{}"; } else if (responseBody === "emptyArr") { strResponseBody = "[]"; } else { + logMessage(source, "Invalid responseBody parameter: '".concat(responseBody, "'")); return; } - if (!(responseType === "default" || responseType === "opaque")) { - logMessage(source, "Invalid parameter: ".concat(responseType)); + var isResponseTypeSpecified = typeof responseType !== "undefined"; + var isResponseTypeSupported = function isResponseTypeSupported(responseType) { + var SUPPORTED_TYPES = ["default", "opaque"]; + return SUPPORTED_TYPES.includes(responseType); + }; + if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) { + logMessage(source, "Invalid responseType parameter: '".concat(responseType, "'")); return; } - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - let shouldPrevent = false; - const fetchData = getFetchData(args); + var handlerWrapper = async function handlerWrapper(target, thisArg, args) { + var shouldPrevent = false; + var fetchData = getFetchData(args); if (typeof propsToMatch === "undefined") { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); @@ -46392,11 +53410,22 @@ var scriptlets_umd = {exports: {}}; shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); if (shouldPrevent) { hit(source); - return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + try { + var origResponse = await Reflect.apply(target, thisArg, args); + if (!origResponse.ok) { + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + } + return modifyResponse(origResponse, { + body: strResponseBody, + type: responseType + }); + } catch (ex) { + return noopPromiseResolve(strResponseBody, fetchData.url, responseType); + } } return Reflect.apply(target, thisArg, args); }; - const fetchHandler = { + var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); @@ -46406,19 +53435,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46432,11 +53461,11 @@ var scriptlets_umd = {exports: {}}; } } function getFetchData(args) { - const fetchPropsObj = {}; - let fetchUrl; - let fetchInit; + var fetchPropsObj = {}; + var fetchUrl; + var fetchInit; if (args[0] instanceof Request) { - const requestData = getRequestData(args[0]); + var requestData = getRequestData(args[0]); fetchUrl = requestData.url; fetchInit = requestData; } else { @@ -46445,7 +53474,8 @@ var scriptlets_umd = {exports: {}}; } fetchPropsObj.url = fetchUrl; if (fetchInit instanceof Object) { - Object.keys(fetchInit).forEach(function (prop) { + var props = Object.keys(fetchInit); + props.forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } @@ -46455,100 +53485,138 @@ var scriptlets_umd = {exports: {}}; if (!obj || typeof obj !== "object") { return String(obj); } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { - return; - } - const response = new Response(responseBody, { - status: 200, - statusText: "OK" - }); - Object.defineProperties(response, { - url: { - value: responseUrl - }, - type: { - value: responseType - } - }); - return Promise.resolve(response); - } function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); }); } return isMatched; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } + nativeConsole("".concat(name, ": ").concat(message)); + } + function noopPromiseResolve() { + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; + if (typeof Response === "undefined") { + return; } - nativeConsole(messageStr); + var response = new Response(responseBody, { + status: 200, + statusText: "OK" + }); + Object.defineProperties(response, { + url: { + value: responseUrl + }, + type: { + value: responseType + } + }); + return Promise.resolve(response); + } + function modifyResponse(origResponse) { + var _origResponse$headers; + var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + body: "{}" + }; + var headers = {}; + origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) { + headers[key] = value; + }); + var modifiedResponse = new Response(replacement.body, { + status: origResponse.status, + statusText: origResponse.statusText, + headers: headers + }); + Object.defineProperties(modifiedResponse, { + url: { + value: origResponse.url + }, + type: { + value: replacement.type || origResponse.type + } + }); + return modifiedResponse; } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -46564,45 +53632,29 @@ var scriptlets_umd = {exports: {}}; return Object.keys(obj).length === 0 && !obj.prototype; } function getRequestData(request) { - const requestInitOptions = getRequestProps(); - const entries = requestInitOptions.map(function (key) { - const value = request[key]; + var requestInitOptions = getRequestProps(); + var entries = requestInitOptions.map(function (key) { + var value = request[key]; return [key, value]; }); - return getObjectFromEntries(entries); + return Object.fromEntries(entries); } function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - } - function getObjectFromEntries(entries) { - const output = entries.reduce(function (acc, el) { - const key = el[0]; - const value = el[1]; - acc[key] = value; - return acc; - }, {}); - return output; + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; } function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); propsObj[key] = value; } else { propsObj.url = prop; @@ -46610,19 +53662,20 @@ var scriptlets_umd = {exports: {}}; }); return propsObj; } - function validateParsedData(data) { + function isValidParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { matchData[key] = toRegExp(data[key]); }); return matchData; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventFetch.apply(this, updatedArgs); } catch (e) { @@ -46631,8 +53684,8 @@ var scriptlets_umd = {exports: {}}; } function preventPopadsNet(source, args) { function preventPopadsNet(source) { - const rid = randomId(); - const throwError = function throwError() { + var rid = randomId(); + var throwError = function throwError() { throw new ReferenceError(rid); }; delete window.PopAds; @@ -46649,16 +53702,16 @@ var scriptlets_umd = {exports: {}}; hit(source); } function createOnErrorHandler(rid) { - const nativeOnError = window.onerror; + var nativeOnError = window.onerror; return function onError(error) { - if (typeof error === "string" && error.indexOf(rid) !== -1) { + if (typeof error === "string" && error.includes(rid)) { return true; } if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error, ...args]); + return nativeOnError.apply(window, [error, ...args]); } return false; }; @@ -46671,19 +53724,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46696,7 +53749,7 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventPopadsNet.apply(this, updatedArgs); } catch (e) { @@ -46705,8 +53758,8 @@ var scriptlets_umd = {exports: {}}; } function preventRefresh(source, args) { function preventRefresh(source, delaySec) { - const getMetaElements = function getMetaElements() { - let metaNodes = []; + var getMetaElements = function getMetaElements() { + var metaNodes = []; try { metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); } catch (e) { @@ -46718,16 +53771,16 @@ var scriptlets_umd = {exports: {}}; } return Array.from(metaNodes); }; - const getMetaContentDelay = function getMetaContentDelay(metaElements) { - const delays = metaElements.map(function (meta) { - const contentString = meta.getAttribute("content"); + var getMetaContentDelay = function getMetaContentDelay(metaElements) { + var delays = metaElements.map(function (meta) { + var contentString = meta.getAttribute("content"); if (contentString.length === 0) { return null; } - let contentDelay; - const limiterIndex = contentString.indexOf(";"); + var contentDelay; + var limiterIndex = contentString.indexOf(";"); if (limiterIndex !== -1) { - const delaySubstring = contentString.substring(0, limiterIndex); + var delaySubstring = contentString.substring(0, limiterIndex); contentDelay = getNumberFromString(delaySubstring); } else { contentDelay = getNumberFromString(contentString); @@ -46739,24 +53792,24 @@ var scriptlets_umd = {exports: {}}; if (!delays.length) { return null; } - const minDelay = delays.reduce(function (a, b) { + var minDelay = delays.reduce(function (a, b) { return Math.min(a, b); }); return minDelay; }; - const stop = function stop() { - const metaElements = getMetaElements(); + var stop = function stop() { + var metaElements = getMetaElements(); if (metaElements.length === 0) { return; } - let secondsToRun = getNumberFromString(delaySec); + var secondsToRun = getNumberFromString(delaySec); if (secondsToRun === null) { secondsToRun = getMetaContentDelay(metaElements); } if (secondsToRun === null) { return; } - const delayMs = secondsToRun * 1e3; + var delayMs = secondsToRun * 1e3; setTimeout(function () { window.stop(); hit(source); @@ -46775,19 +53828,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46801,40 +53854,30 @@ var scriptlets_umd = {exports: {}}; } } function getNumberFromString(rawString) { - const parsedDelay = parseInt(rawString, 10); - const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventRefresh.apply(this, updatedArgs); } catch (e) { @@ -46843,13 +53886,13 @@ var scriptlets_umd = {exports: {}}; } function preventRequestAnimationFrame(source, args) { function preventRequestAnimationFrame(source, match) { - const nativeRequestAnimationFrame = window.requestAnimationFrame; - const shouldLog = typeof match === "undefined"; - const _parseMatchArg = parseMatchArg(match), + var nativeRequestAnimationFrame = window.requestAnimationFrame; + var shouldLog = typeof match === "undefined"; + var _parseMatchArg = parseMatchArg(match), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchRegexp = _parseMatchArg.matchRegexp; - const rafWrapper = function rafWrapper(callback) { - let shouldPrevent = false; + var rafWrapper = function rafWrapper(callback) { + var shouldPrevent = false; if (shouldLog) { hit(source); logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); @@ -46872,19 +53915,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -46899,10 +53942,10 @@ var scriptlets_umd = {exports: {}}; } function noopFunc() {} function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); return { isInvertedMatch: isInvertedMatch, matchRegexp: matchRegexp, @@ -46910,12 +53953,12 @@ var scriptlets_umd = {exports: {}}; }; } function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -46928,47 +53971,59 @@ var scriptlets_umd = {exports: {}}; return callback instanceof Function || typeof callback === "string"; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventRequestAnimationFrame.apply(this, updatedArgs); } catch (e) { @@ -46977,11 +54032,11 @@ var scriptlets_umd = {exports: {}}; } function preventSetInterval(source, args) { function preventSetInterval(source, matchCallback, matchDelay) { - const shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; + var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; if (shouldLog) { hit(source); logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -46999,7 +54054,7 @@ var scriptlets_umd = {exports: {}}; } return target.apply(thisArg, args); }; - const setIntervalHandler = { + var setIntervalHandler = { apply: handlerWrapper }; window.setInterval = new Proxy(window.setInterval, setIntervalHandler); @@ -47009,19 +54064,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -47036,7 +54091,7 @@ var scriptlets_umd = {exports: {}}; } function noopFunc() {} function isPreventionNeeded(_ref) { - let callback = _ref.callback, + var callback = _ref.callback, delay = _ref.delay, matchCallback = _ref.matchCallback, matchDelay = _ref.matchDelay; @@ -47046,15 +54101,15 @@ var scriptlets_umd = {exports: {}}; if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - const _parseMatchArg = parseMatchArg(matchCallback), + var _parseMatchArg = parseMatchArg(matchCallback), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchRegexp = _parseMatchArg.matchRegexp; - const _parseDelayArg = parseDelayArg(matchDelay), + var _parseDelayArg = parseDelayArg(matchDelay), isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, delayMatch = _parseDelayArg.delayMatch; - const parsedDelay = parseRawDelay(delay); - let shouldPrevent = false; - const callbackStr = String(callback); + var parsedDelay = parseRawDelay(delay); + var shouldPrevent = false; + var callbackStr = String(callback); if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -47065,55 +54120,64 @@ var scriptlets_umd = {exports: {}}; return shouldPrevent; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); return { isInvertedMatch: isInvertedMatch, matchRegexp: matchRegexp, @@ -47121,11 +54185,11 @@ var scriptlets_umd = {exports: {}}; }; } function parseDelayArg(delay) { - const INVERT_MARKER = "!"; - const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); - let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; - delayValue = parseInt(delayValue, 10); - const delayMatch = nativeIsNaN(delayValue) ? null : delayValue; + var INVERT_MARKER = "!"; + var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER); + var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; + var parsedDelay = parseInt(delayValue, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay; return { isInvertedDelayMatch: isInvertedDelayMatch, delayMatch: delayMatch @@ -47135,20 +54199,20 @@ var scriptlets_umd = {exports: {}}; return callback instanceof Function || typeof callback === "string"; } function isValidMatchStr(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { str = match.slice(1); } return isValidStrPattern(str); } function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -47161,23 +54225,23 @@ var scriptlets_umd = {exports: {}}; return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; + var native = Number.isFinite || window.isFinite; return native(num); } function isValidMatchNumber(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { str = match.slice(1); } - const num = parseFloat(str); + var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); } function parseRawDelay(delay) { - const parsedDelay = Math.floor(parseInt(delay, 10)); + var parsedDelay = Math.floor(parseInt(delay, 10)); return typeof parsedDelay === "number" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventSetInterval.apply(this, updatedArgs); } catch (e) { @@ -47186,11 +54250,11 @@ var scriptlets_umd = {exports: {}}; } function preventSetTimeout(source, args) { function preventSetTimeout(source, matchCallback, matchDelay) { - const shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - const callback = args[0]; - const delay = args[1]; - let shouldPrevent = false; + var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + var callback = args[0]; + var delay = args[1]; + var shouldPrevent = false; if (shouldLog) { hit(source); logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -47208,7 +54272,7 @@ var scriptlets_umd = {exports: {}}; } return target.apply(thisArg, args); }; - const setTimeoutHandler = { + var setTimeoutHandler = { apply: handlerWrapper }; window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler); @@ -47218,19 +54282,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -47245,7 +54309,7 @@ var scriptlets_umd = {exports: {}}; } function noopFunc() {} function isPreventionNeeded(_ref) { - let callback = _ref.callback, + var callback = _ref.callback, delay = _ref.delay, matchCallback = _ref.matchCallback, matchDelay = _ref.matchDelay; @@ -47255,15 +54319,15 @@ var scriptlets_umd = {exports: {}}; if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - const _parseMatchArg = parseMatchArg(matchCallback), + var _parseMatchArg = parseMatchArg(matchCallback), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchRegexp = _parseMatchArg.matchRegexp; - const _parseDelayArg = parseDelayArg(matchDelay), + var _parseDelayArg = parseDelayArg(matchDelay), isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, delayMatch = _parseDelayArg.delayMatch; - const parsedDelay = parseRawDelay(delay); - let shouldPrevent = false; - const callbackStr = String(callback); + var parsedDelay = parseRawDelay(delay); + var shouldPrevent = false; + var callbackStr = String(callback); if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -47274,35 +54338,25 @@ var scriptlets_umd = {exports: {}}; return shouldPrevent; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); return { isInvertedMatch: isInvertedMatch, matchRegexp: matchRegexp, @@ -47310,43 +54364,62 @@ var scriptlets_umd = {exports: {}}; }; } function parseDelayArg(delay) { - const INVERT_MARKER = "!"; - const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); - let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; - delayValue = parseInt(delayValue, 10); - const delayMatch = nativeIsNaN(delayValue) ? null : delayValue; + var INVERT_MARKER = "!"; + var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER); + var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; + var parsedDelay = parseInt(delayValue, 10); + var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay; return { isInvertedDelayMatch: isInvertedDelayMatch, delayMatch: delayMatch }; } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } function isValidMatchStr(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { str = match.slice(1); } return isValidStrPattern(str); @@ -47355,12 +54428,12 @@ var scriptlets_umd = {exports: {}}; return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -47370,23 +54443,23 @@ var scriptlets_umd = {exports: {}}; return isValid; } function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; + var native = Number.isFinite || window.isFinite; return native(num); } function isValidMatchNumber(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { str = match.slice(1); } - const num = parseFloat(str); + var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); } function parseRawDelay(delay) { - const parsedDelay = Math.floor(parseInt(delay, 10)); + var parsedDelay = Math.floor(parseInt(delay, 10)); return typeof parsedDelay === "number" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventSetTimeout.apply(this, updatedArgs); } catch (e) { @@ -47395,12 +54468,12 @@ var scriptlets_umd = {exports: {}}; } function preventWindowOpen(source, args) { function preventWindowOpen(source) { - let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "*"; - let delay = arguments.length > 2 ? arguments[2] : undefined; - let replacement = arguments.length > 3 ? arguments[3] : undefined; - const nativeOpen = window.open; - const isNewSyntax = match !== "0" && match !== "1"; - const oldOpenWrapper = function oldOpenWrapper(str) { + var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "*"; + var delay = arguments.length > 2 ? arguments[2] : undefined; + var replacement = arguments.length > 3 ? arguments[3] : undefined; + var nativeOpen = window.open; + var isNewSyntax = match !== "0" && match !== "1"; + var oldOpenWrapper = function oldOpenWrapper(str) { match = Number(match) > 0; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; @@ -47409,29 +54482,29 @@ var scriptlets_umd = {exports: {}}; logMessage(source, "Invalid parameter: ".concat(delay)); return nativeOpen.apply(window, [str, ...args]); } - const searchRegexp = toRegExp(delay); + var searchRegexp = toRegExp(delay); if (match !== searchRegexp.test(str)) { return nativeOpen.apply(window, [str, ...args]); } hit(source); return handleOldReplacement(replacement); }; - const newOpenWrapper = function newOpenWrapper(url) { - const shouldLog = replacement && replacement.indexOf("log") > -1; + var newOpenWrapper = function newOpenWrapper(url) { + var shouldLog = replacement && replacement.includes("log"); for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } if (shouldLog) { - const argsStr = args && args.length > 0 ? ", ".concat(args.join(", ")) : ""; - const message = "".concat(url).concat(argsStr); + var argsStr = args && args.length > 0 ? ", ".concat(args.join(", ")) : ""; + var message = "".concat(url).concat(argsStr); logMessage(source, message, true); hit(source); } - let shouldPrevent = false; + var shouldPrevent = false; if (match === "*") { shouldPrevent = true; } else if (isValidMatchStr(match)) { - const _parseMatchArg = parseMatchArg(match), + var _parseMatchArg = parseMatchArg(match), isInvertedMatch = _parseMatchArg.isInvertedMatch, matchRegexp = _parseMatchArg.matchRegexp; shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; @@ -47440,18 +54513,18 @@ var scriptlets_umd = {exports: {}}; shouldPrevent = false; } if (shouldPrevent) { - const parsedDelay = parseInt(delay, 10); - let result; + var parsedDelay = parseInt(delay, 10); + var result; if (nativeIsNaN(parsedDelay)) { result = noopNull(); } else { - const decoyArgs = { + var decoyArgs = { replacement: replacement, url: url, delay: parsedDelay }; - const decoy = createDecoy(decoyArgs); - let popup = decoy.contentWindow; + var decoy = createDecoy(decoyArgs); + var popup = decoy.contentWindow; if (typeof popup === "object" && popup !== null) { Object.defineProperty(popup, "closed", { value: false @@ -47463,7 +54536,7 @@ var scriptlets_umd = {exports: {}}; value: null }); } else { - const nativeGetter = decoy.contentWindow && decoy.contentWindow.get; + var nativeGetter = decoy.contentWindow && decoy.contentWindow.get; Object.defineProperty(decoy, "contentWindow", { get: getPreventGetter(nativeGetter) }); @@ -47484,19 +54557,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -47510,12 +54583,12 @@ var scriptlets_umd = {exports: {}}; } } function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -47528,35 +54601,57 @@ var scriptlets_umd = {exports: {}}; return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isValidMatchStr(match) { - const INVERT_MARKER = "!"; - let str = match; - if (startsWith(match, INVERT_MARKER)) { + var INVERT_MARKER = "!"; + var str = match; + if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) { str = match.slice(1); } return isValidStrPattern(str); } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); return { isInvertedMatch: isInvertedMatch, matchRegexp: matchRegexp, @@ -47564,17 +54659,17 @@ var scriptlets_umd = {exports: {}}; }; } function handleOldReplacement(replacement) { - let result; + var result; if (!replacement) { result = noopFunc; } else if (replacement === "trueFunc") { result = trueFunc; - } else if (replacement.indexOf("=") > -1) { - const isProp = startsWith(replacement, "{") && endsWith(replacement, "}"); + } else if (replacement.includes("=")) { + var isProp = replacement.startsWith("{") && replacement.endsWith("}"); if (isProp) { - const propertyPart = replacement.slice(1, -1); - const propertyName = substringBefore(propertyPart, "="); - const propertyValue = substringAfter(propertyPart, "="); + var propertyPart = replacement.slice(1, -1); + var propertyName = substringBefore(propertyPart, "="); + var propertyValue = substringAfter(propertyPart, "="); if (propertyValue === "noopFunc") { result = {}; result[propertyName] = noopFunc; @@ -47584,24 +54679,26 @@ var scriptlets_umd = {exports: {}}; return result; } function createDecoy(args) { - const OBJECT_TAG_NAME = "object"; - const OBJECT_URL_PROP_NAME = "data"; - const IFRAME_TAG_NAME = "iframe"; - const IFRAME_URL_PROP_NAME = "src"; - const replacement = args.replacement, + var UrlPropNameOf = function (UrlPropNameOf) { + UrlPropNameOf["Object"] = "data"; + UrlPropNameOf["Iframe"] = "src"; + return UrlPropNameOf; + }({}); + var replacement = args.replacement, url = args.url, delay = args.delay; - let tag; - let urlProp; + var tag; if (replacement === "obj") { - tag = OBJECT_TAG_NAME; - urlProp = OBJECT_URL_PROP_NAME; + tag = "object"; } else { - tag = IFRAME_TAG_NAME; - urlProp = IFRAME_URL_PROP_NAME; + tag = "iframe"; + } + var decoy = document.createElement(tag); + if (decoy instanceof HTMLObjectElement) { + decoy[UrlPropNameOf.Object] = url; + } else if (decoy instanceof HTMLIFrameElement) { + decoy[UrlPropNameOf.Iframe] = url; } - const decoy = document.createElement(tag); - decoy[urlProp] = url; decoy.style.setProperty("height", "1px", "important"); decoy.style.setProperty("position", "fixed", "important"); decoy.style.setProperty("top", "-1px", "important"); @@ -47613,7 +54710,7 @@ var scriptlets_umd = {exports: {}}; return decoy; } function getPreventGetter(nativeGetter) { - const preventGetter = function preventGetter(target, prop) { + var preventGetter = function preventGetter(target, prop) { if (prop && prop === "closed") { return false; } @@ -47628,55 +54725,39 @@ var scriptlets_umd = {exports: {}}; return null; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function noopFunc() {} function trueFunc() { return true; } - function startsWith(str, prefix) { - return !!str && str.indexOf(prefix) === 0; - } - function endsWith(str, ending) { - return !!str && str.lastIndexOf(ending) === str.length - ending.length; - } function substringBefore(str, separator) { if (!str || !separator) { return str; } - const index = str.indexOf(separator); + var index = str.indexOf(separator); return index < 0 ? str : str.substring(0, index); } function substringAfter(str, separator) { if (!str) { return str; } - const index = str.indexOf(separator); + var index = str.indexOf(separator); return index < 0 ? "" : str.substring(index + separator.length); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventWindowOpen.apply(this, updatedArgs); } catch (e) { @@ -47688,109 +54769,178 @@ var scriptlets_umd = {exports: {}}; if (typeof Proxy === "undefined") { return; } - let response = ""; - let responseText = ""; - let responseUrl; - const openWrapper = function openWrapper(target, thisArg, args) { - const xhrData = { - method: args[0], - url: args[1] - }; - responseUrl = xhrData.url; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader; + var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders; + var xhrData; + var modifiedResponse = ""; + var modifiedResponseText = ""; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); if (typeof propsToMatch === "undefined") { logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); hit(source); } else if (matchRequestProps(source, propsToMatch, xhrData)) { thisArg.shouldBePrevented = true; + thisArg.xhrData = xhrData; + } + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } return Reflect.apply(target, thisArg, args); }; - const sendWrapper = function sendWrapper(target, thisArg, args) { + var sendWrapper = function sendWrapper(target, thisArg, args) { if (!thisArg.shouldBePrevented) { return Reflect.apply(target, thisArg, args); } if (thisArg.responseType === "blob") { - response = new Blob(); + modifiedResponse = new Blob(); } if (thisArg.responseType === "arraybuffer") { - response = new ArrayBuffer(); + modifiedResponse = new ArrayBuffer(); } if (customResponseText) { - const randomText = generateRandomResponse(customResponseText); + var randomText = generateRandomResponse(customResponseText); if (randomText) { - responseText = randomText; + modifiedResponseText = randomText; } else { - logMessage(source, "Invalid range: ".concat(customResponseText)); + logMessage(source, "Invalid randomize parameter: '".concat(customResponseText, "'")); } } - Object.defineProperties(thisArg, { - readyState: { - value: 4, - writable: false - }, - response: { - value: response, - writable: false - }, - responseText: { - value: responseText, - writable: false - }, - responseURL: { - value: responseUrl, - writable: false - }, - responseXML: { - value: "", - writable: false - }, - status: { - value: 200, - writable: false - }, - statusText: { - value: "OK", - writable: false + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; } + var readyState = forgedRequest.readyState, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + statusText = forgedRequest.statusText; + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + responseURL: { + value: responseURL || thisArg.xhrData.url, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: 200, + writable: false + }, + response: { + value: modifiedResponse, + writable: false + }, + responseText: { + value: modifiedResponseText, + writable: false + } + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); }); - setTimeout(function () { - const stateEvent = new Event("readystatechange"); - thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event("load"); - thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event("loadend"); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); + nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } return undefined; }; - const openHandler = { + var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { + return nativeGetResponseHeader.apply(thisArg, args); + } + if (!thisArg.collectedHeaders.length) { + return null; + } + var searchHeaderName = args[0].toLowerCase(); + var matchedHeader = thisArg.collectedHeaders.find(function (header) { + var headerName = header[0].toLowerCase(); + return headerName === searchHeaderName; + }); + return matchedHeader ? matchedHeader[1] : null; + }; + var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) { + if (!thisArg.shouldBePrevented) { + return nativeGetAllResponseHeaders.call(thisArg); + } + if (!thisArg.collectedHeaders.length) { + return ""; + } + var allHeadersStr = thisArg.collectedHeaders.map(function (header) { + var headerName = header[0]; + var headerValue = header[1]; + return "".concat(headerName.toLowerCase(), ": ").concat(headerValue); + }).join("\r\n"); + return allHeadersStr; + }; + var openHandler = { apply: openWrapper }; - const sendHandler = { + var sendHandler = { apply: sendWrapper }; + var getHeaderHandler = { + apply: getHeaderWrapper + }; + var getAllHeadersHandler = { + apply: getAllHeadersWrapper + }; XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler); + XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -47803,112 +54953,135 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } function objectToString(obj) { if (!obj || typeof obj !== "object") { return String(obj); } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === "" || propsToMatch === "*") { - return true; - } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; - } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); - } - return isMatched; - } function generateRandomResponse(customResponseText) { - let customResponse = customResponseText; + var customResponse = customResponseText; if (customResponse === "true") { customResponse = Math.random().toString(36).slice(-10); return customResponse; } customResponse = customResponse.replace("length:", ""); - const rangeRegex = /^\d+-\d+$/; + var rangeRegex = /^\d+-\d+$/; if (!rangeRegex.test(customResponse)) { return null; } - let rangeMin = getNumberFromString(customResponse.split("-")[0]); - let rangeMax = getNumberFromString(customResponse.split("-")[1]); + var rangeMin = getNumberFromString(customResponse.split("-")[0]); + var rangeMax = getNumberFromString(customResponse.split("-")[1]); if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { return null; } if (rangeMin > rangeMax) { - const temp = rangeMin; + var temp = rangeMin; rangeMin = rangeMax; rangeMax = temp; } - const LENGTH_RANGE_LIMIT = 500 * 1e3; + var LENGTH_RANGE_LIMIT = 500 * 1e3; if (rangeMax > LENGTH_RANGE_LIMIT) { return null; } - const length = getRandomIntInclusive(rangeMin, rangeMax); + var length = getRandomIntInclusive(rangeMin, rangeMax); customResponse = getRandomStrByLength(length); return customResponse; } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; + } + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - let isValid; + var isValid; try { isValid = new RegExp(str); isValid = true; @@ -47923,39 +55096,32 @@ var scriptlets_umd = {exports: {}}; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && !obj.prototype; } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - } function getNumberFromString(rawString) { - const parsedDelay = parseInt(rawString, 10); - const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; } function nativeIsFinite(num) { - const native = Number.isFinite || window.isFinite; + var native = Number.isFinite || window.isFinite; return native(num); } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); propsObj[key] = value; } else { propsObj.url = prop; @@ -47963,20 +55129,21 @@ var scriptlets_umd = {exports: {}}; }); return propsObj; } - function validateParsedData(data) { + function isValidParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { matchData[key] = toRegExp(data[key]); }); return matchData; } function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; } function getRandomIntInclusive(min, max) { min = Math.ceil(min); @@ -47984,15 +55151,15 @@ var scriptlets_umd = {exports: {}}; return Math.floor(Math.random() * (max - min + 1) + min); } function getRandomStrByLength(length) { - let result = ""; - const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~"; - const charactersLength = characters.length; - for (let i = 0; i < length; i += 1) { + var result = ""; + var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~"; + var charactersLength = characters.length; + for (var i = 0; i < length; i += 1) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { preventXHR.apply(this, updatedArgs); } catch (e) { @@ -48001,7 +55168,7 @@ var scriptlets_umd = {exports: {}}; } function removeAttr(source, args) { function removeAttr(source, attrs, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; if (!attrs) { return; } @@ -48009,14 +55176,14 @@ var scriptlets_umd = {exports: {}}; if (!selector) { selector = "[".concat(attrs.join("],["), "]"); } - const rmattr = function rmattr() { - let nodes = []; + var rmattr = function rmattr() { + var nodes = []; try { nodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - let removed = false; + var removed = false; nodes.forEach(function (node) { attrs.forEach(function (attr) { node.removeAttribute(attr); @@ -48027,8 +55194,8 @@ var scriptlets_umd = {exports: {}}; hit(source); } }; - const flags = parseFlags(applying); - const run = function run() { + var flags = parseFlags(applying); + var run = function run() { rmattr(); if (!flags.hasFlag(flags.STAY)) { return; @@ -48049,7 +55216,7 @@ var scriptlets_umd = {exports: {}}; once: true }); } else if (flags.hasFlag(flags.STAY)) { - if (!applying.indexOf(" ") !== -1) { + if (!applying.includes(" ")) { rmattr(); } observeDOMChanges(rmattr, true); @@ -48060,19 +55227,19 @@ var scriptlets_umd = {exports: {}}; return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -48086,11 +55253,11 @@ var scriptlets_umd = {exports: {}}; } } function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { childList: true, @@ -48106,7 +55273,7 @@ var scriptlets_umd = {exports: {}}; }); } }; - const disconnect = function disconnect() { + var disconnect = function disconnect() { observer.disconnect(); }; function callbackWrapper() { @@ -48117,52 +55284,42 @@ var scriptlets_umd = {exports: {}}; connect(); } function parseFlags(flags) { - const FLAGS_DIVIDER = " "; - const ASAP_FLAG = "asap"; - const COMPLETE_FLAG = "complete"; - const STAY_FLAG = "stay"; - const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; - const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { - return VALID_FLAGS.indexOf(f) !== -1; + var FLAGS_DIVIDER = " "; + var ASAP_FLAG = "asap"; + var COMPLETE_FLAG = "complete"; + var STAY_FLAG = "stay"; + var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; + var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { + return VALID_FLAGS.includes(f); }); return { ASAP: ASAP_FLAG, COMPLETE: COMPLETE_FLAG, STAY: STAY_FLAG, hasFlag(flag) { - return passedFlags.indexOf(flag) !== -1; + return passedFlags.includes(flag); } }; } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } @@ -48182,7 +55339,7 @@ var scriptlets_umd = {exports: {}}; }; return wrapper; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { removeAttr.apply(this, updatedArgs); } catch (e) { @@ -48191,21 +55348,21 @@ var scriptlets_umd = {exports: {}}; } function removeClass(source, args) { function removeClass(source, classNames, selector) { - let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; + var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; if (!classNames) { return; } classNames = classNames.split(/\s*\|\s*/); - let selectors = []; + var selectors = []; if (!selector) { selectors = classNames.map(function (className) { return ".".concat(className); }); } - const removeClassHandler = function removeClassHandler() { - const nodes = new Set(); + var removeClassHandler = function removeClassHandler() { + var nodes = new Set(); if (selector) { - let foundNodes = []; + var foundNodes = []; try { foundNodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { @@ -48216,14 +55373,14 @@ var scriptlets_umd = {exports: {}}; }); } else if (selectors.length > 0) { selectors.forEach(function (s) { - const elements = document.querySelectorAll(s); - for (let i = 0; i < elements.length; i += 1) { - const element = elements[i]; + var elements = document.querySelectorAll(s); + for (var i = 0; i < elements.length; i += 1) { + var element = elements[i]; nodes.add(element); } }); } - let removed = false; + var removed = false; nodes.forEach(function (node) { classNames.forEach(function (className) { if (node.classList.contains(className)) { @@ -48236,9 +55393,9 @@ var scriptlets_umd = {exports: {}}; hit(source); } }; - const CLASS_ATTR_NAME = ["class"]; - const flags = parseFlags(applying); - const run = function run() { + var CLASS_ATTR_NAME = ["class"]; + var flags = parseFlags(applying); + var run = function run() { removeClassHandler(); if (!flags.hasFlag(flags.STAY)) { return; @@ -48252,448 +55409,37 @@ var scriptlets_umd = {exports: {}}; }); } else { removeClassHandler(); - } - } - if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { - window.addEventListener("load", run, { - once: true - }); - } else if (flags.hasFlag(flags.STAY)) { - if (!applying.indexOf(" ") !== -1) { - removeClassHandler(); - } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); - } - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); - } - }; - const disconnect = function disconnect() { - observer.disconnect(); - }; - function callbackWrapper() { - disconnect(); - callback(); - connect(); - } - connect(); - } - function parseFlags(flags) { - const FLAGS_DIVIDER = " "; - const ASAP_FLAG = "asap"; - const COMPLETE_FLAG = "complete"; - const STAY_FLAG = "stay"; - const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; - const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { - return VALID_FLAGS.indexOf(f) !== -1; - }); - return { - ASAP: ASAP_FLAG, - COMPLETE: COMPLETE_FLAG, - STAY: STAY_FLAG, - hasFlag(flag) { - return passedFlags.indexOf(flag) !== -1; - } - }; - } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - removeClass.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function removeCookie(source, args) { - function removeCookie(source, match) { - const matchRegexp = toRegExp(match); - const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { - const cookieSpec = "".concat(cookieName, "="); - const domain1 = "; domain=".concat(hostName); - const domain2 = "; domain=.".concat(hostName); - const path = "; path=/"; - const expiration = "; expires=Thu, 01 Jan 1970 00:00:00 GMT"; - document.cookie = cookieSpec + expiration; - document.cookie = cookieSpec + domain1 + expiration; - document.cookie = cookieSpec + domain2 + expiration; - document.cookie = cookieSpec + path + expiration; - document.cookie = cookieSpec + domain1 + path + expiration; - document.cookie = cookieSpec + domain2 + path + expiration; - hit(source); - }; - const rmCookie = function rmCookie() { - document.cookie.split(";").forEach(function (cookieStr) { - const pos = cookieStr.indexOf("="); - if (pos === -1) { - return; - } - const cookieName = cookieStr.slice(0, pos).trim(); - if (!matchRegexp.test(cookieName)) { - return; - } - const hostParts = document.location.hostname.split("."); - for (let i = 0; i <= hostParts.length - 1; i += 1) { - const hostName = hostParts.slice(i).join("."); - if (hostName) { - removeCookieFromHost(cookieName, hostName); - } - } - }); - }; - rmCookie(); - window.addEventListener("beforeunload", rmCookie); - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - removeCookie.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function removeInShadowDom(source, args) { - function removeInShadowDom(source, selector, baseSelector) { - if (!Element.prototype.attachShadow) { - return; - } - const removeElement = function removeElement(targetElement) { - targetElement.remove(); - }; - const removeHandler = function removeHandler() { - let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { - let isRemoved = false; - const _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - targets.forEach(function (targetEl) { - removeElement(targetEl); - isRemoved = true; - }); - if (isRemoved) { - hit(source); - } - hostElements = innerHosts; - } - }; - removeHandler(); - observeDOMChanges(removeHandler, true); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); - } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); - } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { - if (attrsToObserve.length > 0) { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs, - attributeFilter: attrsToObserve - }); - } else { - observer.observe(document.documentElement, { - childList: true, - subtree: true, - attributes: observeAttrs - }); - } - }; - const disconnect = function disconnect() { - observer.disconnect(); - }; - function callbackWrapper() { - disconnect(); - callback(); - connect(); - } - connect(); - } - function findHostElements(rootElement) { - const hosts = []; - const domElems = rootElement.querySelectorAll("*"); - domElems.forEach(function (el) { - if (el.shadowRoot) { - hosts.push(el); - } - }); - return hosts; - } - function pierceShadowDom(selector, hostElements) { - let targets = []; - const innerHostsAcc = []; - hostElements.forEach(function (host) { - const simpleElems = host.querySelectorAll(selector); - targets = targets.concat([].slice.call(simpleElems)); - const shadowRootElem = host.shadowRoot; - const shadowChildren = shadowRootElem.querySelectorAll(selector); - targets = targets.concat([].slice.call(shadowChildren)); - innerHostsAcc.push(findHostElements(shadowRootElem)); - }); - const innerHosts = flatten(innerHostsAcc); - return { - targets: targets, - innerHosts: innerHosts - }; - } - function flatten(input) { - const stack = []; - input.forEach(function (el) { - return stack.push(el); - }); - const res = []; - while (stack.length) { - const next = stack.pop(); - if (Array.isArray(next)) { - next.forEach(function (el) { - return stack.push(el); - }); - } else { - res.push(next); - } - } - return res.reverse(); - } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - removeInShadowDom.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function setAttr(source, args) { - function setAttr(source, selector, attr) { - let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (!selector || !attr) { - return; - } - const allowedValues = ["true", "false"]; - if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) { - return; + } } - const setAttr = function setAttr() { - const nodes = [].slice.call(document.querySelectorAll(selector)); - let set = false; - nodes.forEach(function (node) { - node.setAttribute(attr, value); - set = true; + if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { + window.addEventListener("load", run, { + once: true }); - if (set) { - hit(source); + } else if (flags.hasFlag(flags.STAY)) { + if (!applying.includes(" ")) { + removeClassHandler(); } - }; - setAttr(); - observeDOMChanges(setAttr, true); + observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); + } } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -48706,12 +55452,27 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } function observeDOMChanges(callback) { - let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - const THROTTLE_DELAY_MS = 20; - const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - const connect = function connect() { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { childList: true, @@ -48727,7 +55488,7 @@ var scriptlets_umd = {exports: {}}; }); } }; - const disconnect = function disconnect() { + var disconnect = function disconnect() { observer.disconnect(); }; function callbackWrapper() { @@ -48737,14 +55498,28 @@ var scriptlets_umd = {exports: {}}; } connect(); } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); + function parseFlags(flags) { + var FLAGS_DIVIDER = " "; + var ASAP_FLAG = "asap"; + var COMPLETE_FLAG = "complete"; + var STAY_FLAG = "stay"; + var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG]; + var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) { + return VALID_FLAGS.includes(f); + }); + return { + ASAP: ASAP_FLAG, + COMPLETE: COMPLETE_FLAG, + STAY: STAY_FLAG, + hasFlag(flag) { + return passedFlags.includes(flag); + } + }; } function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } @@ -48764,186 +55539,105 @@ var scriptlets_umd = {exports: {}}; }; return wrapper; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - setAttr.apply(this, updatedArgs); + removeClass.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setConstant(source, args) { - function setConstant(source, property, value, stack) { - if (!property || !matchStackTrace(stack, new Error().stack)) { - return; - } - const emptyArr = noopArray(); - const emptyObj = noopObject(); - let constantValue; - if (value === "undefined") { - constantValue = undefined; - } else if (value === "false") { - constantValue = false; - } else if (value === "true") { - constantValue = true; - } else if (value === "null") { - constantValue = null; - } else if (value === "emptyArr") { - constantValue = emptyArr; - } else if (value === "emptyObj") { - constantValue = emptyObj; - } else if (value === "noopFunc") { - constantValue = noopFunc; - } else if (value === "noopCallbackFunc") { - constantValue = noopCallbackFunc; - } else if (value === "trueFunc") { - constantValue = trueFunc; - } else if (value === "falseFunc") { - constantValue = falseFunc; - } else if (value === "throwFunc") { - constantValue = throwFunc; - } else if (value === "noopPromiseResolve") { - constantValue = noopPromiseResolve; - } else if (value === "noopPromiseReject") { - constantValue = noopPromiseReject; - } else if (/^\d+$/.test(value)) { - constantValue = parseFloat(value); - if (nativeIsNaN(constantValue)) { - return; - } - if (Math.abs(constantValue) > 32767) { - return; - } - } else if (value === "-1") { - constantValue = -1; - } else if (value === "") { - constantValue = ""; - } else if (value === "yes") { - constantValue = "yes"; - } else if (value === "no") { - constantValue = "no"; - } else { - return; - } - let canceled = false; - const mustCancel = function mustCancel(value) { - if (canceled) { - return canceled; - } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; - return canceled; + function removeCookie(source, args) { + function removeCookie(source, match) { + var matchRegexp = toRegExp(match); + var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { + var cookieSpec = "".concat(cookieName, "="); + var domain1 = "; domain=".concat(hostName); + var domain2 = "; domain=.".concat(hostName); + var path = "; path=/"; + var expiration = "; expires=Thu, 01 Jan 1970 00:00:00 GMT"; + document.cookie = cookieSpec + expiration; + document.cookie = cookieSpec + domain1 + expiration; + document.cookie = cookieSpec + domain2 + expiration; + document.cookie = cookieSpec + path + expiration; + document.cookie = cookieSpec + domain1 + path + expiration; + document.cookie = cookieSpec + domain2 + path + expiration; + hit(source); }; - const trapProp = function trapProp(base, prop, configurable, handler) { - if (!handler.init(base[prop])) { - return false; - } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; - if (origDescriptor instanceof Object) { - if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); - logMessage(source, message); - return false; + var rmCookie = function rmCookie() { + document.cookie.split(";").forEach(function (cookieStr) { + var pos = cookieStr.indexOf("="); + if (pos === -1) { + return; } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { - prevSetter = origDescriptor.set; + var cookieName = cookieStr.slice(0, pos).trim(); + if (!matchRegexp.test(cookieName)) { + return; } - } - Object.defineProperty(base, prop, { - configurable: configurable, - get() { - return handler.get(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); + var hostParts = document.location.hostname.split("."); + for (var i = 0; i <= hostParts.length - 1; i += 1) { + var hostName = hostParts.slice(i).join("."); + if (hostName) { + removeCookieFromHost(cookieName, hostName); } - handler.set(a); } }); - return true; }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - const inChainPropHandler = { - factValue: undefined, - init(a) { - this.factValue = a; - return true; - }, - get() { - return this.factValue; - }, - set(a) { - if (this.factValue === a) { - return; - } - this.factValue = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - } - }; - const endPropHandler = { - init(a) { - if (mustCancel(a)) { - return false; - } - return true; - }, - get() { - return constantValue; - }, - set(a) { - if (!mustCancel(a)) { - return; - } - constantValue = a; - } - }; - if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { - hit(source); - } - return; - } - if (base !== undefined && base[prop] === null) { - trapProp(base, prop, true, inChainPropHandler); - return; + rmCookie(); + window.addEventListener("beforeunload", rmCookie); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; } - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - trapProp(base, prop, true, inChainPropHandler); + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; } - const propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { - setChainPropAccess(propValue, chain); + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; } - trapProp(base, prop, true, inChainPropHandler); + return ""; }; - setChainPropAccess(window, property); + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -48956,254 +55650,62 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function noopArray() { - return []; - } - function noopObject() { - return {}; - } - function noopFunc() {} - function noopCallbackFunc() { - return noopFunc; - } - function trueFunc() { - return true; - } - function falseFunc() { - return false; - } - function throwFunc() { - throw new Error(); - } - function noopPromiseReject() { - return Promise.reject(); - } - function noopPromiseResolve() { - let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; - let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { - return; - } - const response = new Response(responseBody, { - status: 200, - statusText: "OK" - }); - Object.defineProperties(response, { - url: { - value: responseUrl - }, - type: { - value: responseType - } - }); - return Promise.resolve(response); - } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function matchStackTrace(stackMatch, stackTrace) { - if (!stackMatch || stackMatch === "") { - return true; - } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { - return true; - } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }).join("\n"); - return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; - } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; - }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; - }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { - return false; - } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); - if (pos !== -1) { - documentURL = documentURL.slice(0, pos); - } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { - stackURL = stackURL.slice(1); - } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { - stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { - stackFunction = stackFunction.slice(2).trim(); - } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); - } else { - stack = stackURL; - } - } else { - stack = line; - } - return stack; - }); - if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { - if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { - return true; - } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { - return true; - } - } - } - return false; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - setConstant.apply(this, updatedArgs); + removeCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setCookie(source, args) { - function setCookie(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - const validValue = getLimitedCookieValue(value); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); - return; - } - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { + function removeInShadowDom(source, args) { + function removeInShadowDom(source, selector, baseSelector) { + if (!Element.prototype.attachShadow) { return; } - hit(source); - document.cookie = cookieToSet; + var removeElement = function removeElement(targetElement) { + targetElement.remove(); + }; + var removeHandler = function removeHandler() { + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + var _loop = function _loop() { + var isRemoved = false; + var _pierceShadowDom = pierceShadowDom(selector, hostElements), + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; + targets.forEach(function (targetEl) { + removeElement(targetEl); + isRemoved = true; + }); + if (isRemoved) { + hit(source); + } + hostElements = innerHosts; + }; + while (hostElements.length !== 0) { + _loop(); + } + }; + removeHandler(); + observeDOMChanges(removeHandler, true); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -49216,135 +55718,212 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + function callbackWrapper() { + disconnect(); + callback(); + connect(); } - nativeConsole(messageStr); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); + connect(); } - function getLimitedCookieValue(value) { - if (!value) { - return null; - } - let validValue; - if (value === "true") { - validValue = "true"; - } else if (value === "True") { - validValue = "True"; - } else if (value === "false") { - validValue = "false"; - } else if (value === "False") { - validValue = "False"; - } else if (value === "yes") { - validValue = "yes"; - } else if (value === "Yes") { - validValue = "Yes"; - } else if (value === "Y") { - validValue = "Y"; - } else if (value === "no") { - validValue = "no"; - } else if (value === "ok") { - validValue = "ok"; - } else if (value === "OK") { - validValue = "OK"; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - return null; - } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - return null; - } - } else { - return null; + function findHostElements(rootElement) { + var hosts = []; + if (rootElement) { + var domElems = rootElement.querySelectorAll("*"); + domElems.forEach(function (el) { + if (el.shadowRoot) { + hosts.push(el); + } + }); } - return validValue; - } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + return hosts; } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; + function pierceShadowDom(selector, hostElements) { + var targets = []; + var innerHostsAcc = []; + hostElements.forEach(function (host) { + var simpleElems = host.querySelectorAll(selector); + targets = targets.concat([].slice.call(simpleElems)); + var shadowRootElem = host.shadowRoot; + var shadowChildren = shadowRootElem.querySelectorAll(selector); + targets = targets.concat([].slice.call(shadowChildren)); + innerHostsAcc.push(findHostElements(shadowRootElem)); + }); + var innerHosts = flatten(innerHostsAcc); + return { + targets: targets, + innerHosts: innerHosts + }; } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; + function flatten(input) { + var stack = []; + input.forEach(function (el) { + return stack.push(el); + }); + var res = []; + while (stack.length) { + var next = stack.pop(); + if (Array.isArray(next)) { + next.forEach(function (el) { + return stack.push(el); + }); + } else { + res.push(next); + } } - return ""; + return res.reverse(); + } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - setCookie.apply(this, updatedArgs); + removeInShadowDom.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setCookieReload(source, args) { - function setCookieReload(source, name, value) { - let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(document.cookie, name, value)) { - return; - } - const validValue = getLimitedCookieValue(value); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); - return; - } - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; + function removeNodeText(source, args) { + function removeNodeText(source, nodeName, textMatch) { + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch; + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + var ALL_TEXT_PATTERN = /^[\s\S]*$/; + var REPLACEMENT = ""; + replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT); + } + }); + }; + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); } - const cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { - return; + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + function observeDocumentWithTimeout(callback, options) { + var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4; + var documentObserver = new MutationObserver(function (mutations, observer) { + observer.disconnect(); + callback(mutations, observer); + observer.observe(document.documentElement, options); + }); + documentObserver.observe(document.documentElement, options); + if (typeof timeout === "number") { + setTimeout(function () { + return documentObserver.disconnect(); + }, timeout); } - document.cookie = cookieToSet; - hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); + } + function handleExistingNodes(selector, handler) { + var nodeList = document.querySelectorAll(selector); + var nodes = nodeListToArray(nodeList); + handler(nodes); + } + function handleMutations(mutations, handler) { + var addedNodes = getAddedNodes(mutations); + handler(addedNodes); + } + function replaceNodeText(source, node, pattern, replacement) { + var textContent = node.textContent; + if (textContent) { + node.textContent = textContent.replace(pattern, replacement); + hit(source); + } + } + function isTargetNode(node, nodeNameMatch, textContentMatch) { + var nodeName = node.nodeName, + textContent = node.textContent; + var nodeNameLowerCase = nodeName.toLowerCase(); + return textContent !== null && textContent !== "" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch)); + } + function parseNodeTextParams(nodeName, textMatch) { + var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var REGEXP_START_MARKER = "/"; + var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER)); + var selector = isStringNameMatch ? nodeName : "*"; + var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName); + var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch); + var patternMatch; + if (pattern) { + patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern); } + return { + selector: selector, + nodeNameMatch: nodeNameMatch, + textContentMatch: textContentMatch, + patternMatch: patternMatch + }; } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -49357,139 +55936,107 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; + function nodeListToArray(nodeList) { + var nodes = []; + for (var i = 0; i < nodeList.length; i += 1) { + nodes.push(nodeList[i]); } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + return nodes; + } + function getAddedNodes(mutations) { + var nodes = []; + for (var i = 0; i < mutations.length; i += 1) { + var addedNodes = mutations[i].addedNodes; + for (var j = 0; j < addedNodes.length; j += 1) { + nodes.push(addedNodes[j]); } } - nativeConsole(messageStr); + return nodes; } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function isCookieSetWithValue(cookieString, name, value) { - return cookieString.split(";").some(function (cookieStr) { - const pos = cookieStr.indexOf("="); - if (pos === -1) { + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { return false; } - const cookieName = cookieStr.slice(0, pos).trim(); - const cookieValue = cookieStr.slice(pos + 1).trim(); - return name === cookieName && value === cookieValue; - }); - } - function getLimitedCookieValue(value) { - if (!value) { - return null; - } - let validValue; - if (value === "true") { - validValue = "true"; - } else if (value === "True") { - validValue = "True"; - } else if (value === "false") { - validValue = "false"; - } else if (value === "False") { - validValue = "False"; - } else if (value === "yes") { - validValue = "yes"; - } else if (value === "Yes") { - validValue = "Yes"; - } else if (value === "Y") { - validValue = "Y"; - } else if (value === "no") { - validValue = "no"; - } else if (value === "ok") { - validValue = "ok"; - } else if (value === "OK") { - validValue = "OK"; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - return null; + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - return null; + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; } - } else { - return null; - } - return validValue; - } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); - } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; - } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - return ""; + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - setCookieReload.apply(this, updatedArgs); + removeNodeText.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setLocalStorageItem(source, args) { - function setLocalStorageItem(source, key, value) { - if (typeof key === "undefined") { - logMessage(source, "Item key should be specified."); + function setAttr(source, args) { + function setAttr(source, selector, attr) { + var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (!selector || !attr) { return; } - let validValue; - try { - validValue = getLimitedStorageItemValue(value); - } catch (_unused) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); + var allowedValues = ["true", "false"]; + if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) { return; } - const _window = window, - localStorage = _window.localStorage; - setStorageItem(source, localStorage, key, validValue); - hit(source); + var setAttr = function setAttr() { + var nodes = [].slice.call(document.querySelectorAll(selector)); + var set = false; + nodes.forEach(function (node) { + node.setAttribute(attr, value); + set = true; + }); + if (set) { + hit(source); + } + }; + setAttr(); + observeDOMChanges(setAttr, true); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -49502,178 +56049,277 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; - } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + function observeDOMChanges(callback) { + var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + var THROTTLE_DELAY_MS = 20; + var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); + var connect = function connect() { + if (attrsToObserve.length > 0) { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs, + attributeFilter: attrsToObserve + }); + } else { + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: observeAttrs + }); } + }; + var disconnect = function disconnect() { + observer.disconnect(); + }; + function callbackWrapper() { + disconnect(); + callback(); + connect(); } - nativeConsole(messageStr); + connect(); } function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; + var native = Number.isNaN || window.isNaN; return native(num); } - function setStorageItem(source, storage, key, value) { - try { - storage.setItem(key, value); - } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); - logMessage(source, message); - } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; } - function getLimitedStorageItemValue(value) { - if (typeof value !== "string") { - throw new Error("Invalid value"); + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setAttr.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setConstant(source, args) { + function setConstant(source, property, value) { + var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ""; + var uboAliases = ["set-constant.js", "ubo-set-constant.js", "set.js", "ubo-set.js", "ubo-set-constant", "ubo-set"]; + if (uboAliases.includes(source.name)) { + if (stack.length !== 1 && !getNumberFromString(stack)) { + valueWrapper = stack; + } + stack = undefined; + } + if (!property || !matchStackTrace(stack, new Error().stack)) { + return; } - let validValue; + var emptyArr = noopArray(); + var emptyObj = noopObject(); + var constantValue; if (value === "undefined") { - validValue = undefined; + constantValue = undefined; } else if (value === "false") { - validValue = false; + constantValue = false; } else if (value === "true") { - validValue = true; + constantValue = true; } else if (value === "null") { - validValue = null; + constantValue = null; } else if (value === "emptyArr") { - validValue = "[]"; + constantValue = emptyArr; } else if (value === "emptyObj") { - validValue = "{}"; - } else if (value === "") { - validValue = ""; + constantValue = emptyObj; + } else if (value === "noopFunc") { + constantValue = noopFunc; + } else if (value === "noopCallbackFunc") { + constantValue = noopCallbackFunc; + } else if (value === "trueFunc") { + constantValue = trueFunc; + } else if (value === "falseFunc") { + constantValue = falseFunc; + } else if (value === "throwFunc") { + constantValue = throwFunc; + } else if (value === "noopPromiseResolve") { + constantValue = noopPromiseResolve; + } else if (value === "noopPromiseReject") { + constantValue = noopPromiseReject; } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - throw new Error("Invalid value"); + constantValue = parseFloat(value); + if (nativeIsNaN(constantValue)) { + return; } - if (Math.abs(validValue) > 32767) { - throw new Error("Invalid value"); + if (Math.abs(constantValue) > 32767) { + return; } + } else if (value === "-1") { + constantValue = -1; + } else if (value === "") { + constantValue = ""; } else if (value === "yes") { - validValue = "yes"; + constantValue = "yes"; } else if (value === "no") { - validValue = "no"; + constantValue = "no"; } else { - throw new Error("Invalid value"); + return; } - return validValue; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setLocalStorageItem.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function setPopadsDummy(source, args) { - function setPopadsDummy(source) { - delete window.PopAds; - delete window.popns; - Object.defineProperties(window, { - PopAds: { - get: function get() { - hit(source); - return {}; + var valueWrapperNames = ["asFunction", "asCallback", "asResolved", "asRejected"]; + if (valueWrapperNames.includes(valueWrapper)) { + var valueWrappersMap = { + asFunction(v) { + return function () { + return v; + }; + }, + asCallback(v) { + return function () { + return function () { + return v; + }; + }; + }, + asResolved(v) { + return Promise.resolve(v); + }, + asRejected(v) { + return Promise.reject(v); } - }, - popns: { - get: function get() { - hit(source); - return {}; + }; + constantValue = valueWrappersMap[valueWrapper](constantValue); + } + var canceled = false; + var mustCancel = function mustCancel(value) { + if (canceled) { + return canceled; + } + canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; + return canceled; + }; + var trapProp = function trapProp(base, prop, configurable, handler) { + if (!handler.init(base[prop])) { + return false; + } + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + if (origDescriptor instanceof Object) { + if (!origDescriptor.configurable) { + var message = "Property '".concat(prop, "' is not configurable"); + logMessage(source, message); + return false; + } + base[prop] = constantValue; + if (origDescriptor.set instanceof Function) { + prevSetter = origDescriptor.set; } } - }); - } - function hit(source) { - if (source.verbose !== true) { - return; - } - try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; - if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { - ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + Object.defineProperty(base, prop, { + configurable: configurable, + get() { + return handler.get(); + }, + set(a) { + if (prevSetter !== undefined) { + prevSetter(a); + } + handler.set(a); } - const rulePart = source.ruleText.slice(ruleStartIndex); - prefix = "".concat(source.domainName).concat(rulePart); + }); + return true; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + var inChainPropHandler = { + factValue: undefined, + init(a) { + this.factValue = a; + return true; + }, + get() { + return this.factValue; + }, + set(a) { + if (this.factValue === a) { + return; + } + this.factValue = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + } + }; + var endPropHandler = { + init(a) { + if (mustCancel(a)) { + return false; + } + return true; + }, + get() { + return constantValue; + }, + set(a) { + if (!mustCancel(a)) { + return; + } + constantValue = a; + } + }; + if (!chain) { + var isTrapped = trapProp(base, prop, false, endPropHandler); + if (isTrapped) { + hit(source); + } + return; } - log("".concat(prefix, " trace start")); - if (trace) { - trace(); + if (base !== undefined && base[prop] === null) { + trapProp(base, prop, true, inChainPropHandler); + return; } - log("".concat(prefix, " trace end")); - } catch (e) {} - if (typeof window.__debug === "function") { - window.__debug(source); - } - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setPopadsDummy.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function setSessionStorageItem(source, args) { - function setSessionStorageItem(source, key, value) { - if (typeof key === "undefined") { - logMessage(source, "Item key should be specified."); - return; - } - let validValue; - try { - validValue = getLimitedStorageItemValue(value); - } catch (_unused) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return; - } - const _window = window, - sessionStorage = _window.sessionStorage; - setStorageItem(source, sessionStorage, key, validValue); - hit(source); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + trapProp(base, prop, true, inChainPropHandler); + } + var propValue = owner[prop]; + if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { + setChainPropAccess(propValue, chain); + } + trapProp(base, prop, true, inChainPropHandler); + }; + setChainPropAccess(window, property); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -49687,274 +56333,278 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); + function getNumberFromString(rawString) { + var parsedDelay = parseInt(rawString, 10); + var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; + return validDelay; } - function setStorageItem(source, storage, key, value) { - try { - storage.setItem(key, value); - } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); - logMessage(source, message); - } + function noopArray() { + return []; } - function getLimitedStorageItemValue(value) { - if (typeof value !== "string") { - throw new Error("Invalid value"); + function noopObject() { + return {}; + } + function noopFunc() {} + function noopCallbackFunc() { + return noopFunc; + } + function trueFunc() { + return true; + } + function falseFunc() { + return false; + } + function throwFunc() { + throw new Error(); + } + function noopPromiseReject() { + return Promise.reject(); + } + function noopPromiseResolve() { + var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; + var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; + if (typeof Response === "undefined") { + return; } - let validValue; - if (value === "undefined") { - validValue = undefined; - } else if (value === "false") { - validValue = false; - } else if (value === "true") { - validValue = true; - } else if (value === "null") { - validValue = null; - } else if (value === "emptyArr") { - validValue = "[]"; - } else if (value === "emptyObj") { - validValue = "{}"; - } else if (value === "") { - validValue = ""; - } else if (/^\d+$/.test(value)) { - validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - throw new Error("Invalid value"); - } - if (Math.abs(validValue) > 32767) { - throw new Error("Invalid value"); + var response = new Response(responseBody, { + status: 200, + statusText: "OK" + }); + Object.defineProperties(response, { + url: { + value: responseUrl + }, + type: { + value: responseType } - } else if (value === "yes") { - validValue = "yes"; - } else if (value === "no") { - validValue = "no"; - } else { - throw new Error("Invalid value"); - } - return validValue; + }); + return Promise.resolve(response); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - setSessionStorageItem.apply(this, updatedArgs); - } catch (e) { - console.log(e); + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; } - } - function trustedClickElement(source, args) { - function trustedClickElement(source, selectors) { - let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; - if (!selectors) { - return; + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; } - const OBSERVER_TIMEOUT_MS = 1e4; - const THROTTLE_DELAY_MS = 20; - const STATIC_CLICK_DELAY_MS = 150; - const COOKIE_MATCH_MARKER = "cookie:"; - const LOCAL_STORAGE_MATCH_MARKER = "localStorage:"; - const SELECTORS_DELIMITER = ","; - const COOKIE_STRING_DELIMITER = ";"; - const EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; - const sleep = function sleep(delayMs) { - return new Promise(function (resolve) { - return setTimeout(resolve, delayMs); - }); + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); }; - let parsedDelay; - if (delay) { - parsedDelay = parseInt(delay, 10); - const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; - if (!isValidDelay) { - const message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); - logMessage(source, message); - return; - } + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; } - let canClick = !parsedDelay; - const cookieMatches = []; - const localStorageMatches = []; - let isInvertedMatchCookie = false; - let isInvertedMatchLocalStorage = false; - if (extraMatch) { - const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { - return matchStr.trim(); - }); - parsedExtraMatch.forEach(function (matchStr) { - if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) { - const _parseMatchArg = parseMatchArg(matchStr), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchValue = _parseMatchArg.matchValue; - isInvertedMatchCookie = isInvertedMatch; - const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ""); - cookieMatches.push(cookieMatch); - } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { - const _parseMatchArg2 = parseMatchArg(matchStr), - isInvertedMatch = _parseMatchArg2.isInvertedMatch, - matchValue = _parseMatchArg2.matchValue; - isInvertedMatchLocalStorage = isInvertedMatch; - const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ""); - localStorageMatches.push(localStorageMatch); - } - }); + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); } - if (cookieMatches.length > 0) { - const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); - const parsedCookies = parseCookieString(document.cookie); - const cookieKeys = Object.keys(parsedCookies); - if (cookieKeys.length === 0) { - return; - } - const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { - const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; - const keyMatch = toRegExp(key); - return cookieKeys.some(function (key) { - const keysMatched = keyMatch.test(key); - if (!keysMatched) { - return false; - } - if (!valueMatch) { - return true; + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); + } + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); } - return valueMatch.test(parsedCookies[key]); - }); - }); - const shouldRun = cookiesMatched !== isInvertedMatchCookie; - if (!shouldRun) { - return; - } - } - if (localStorageMatches.length > 0) { - const localStorageMatched = localStorageMatches.every(function (str) { - const itemValue = window.localStorage.getItem(str); - return itemValue || itemValue === ""; - }); - const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; - if (!shouldRun) { - return; + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; } - } - let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { - return selector.trim(); + return stack; }); - const createElementObj = function createElementObj(element) { - return { - element: element || null, - clicked: false - }; - }; - const elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); - const clickElementsBySequence = async function clickElementsBySequence() { - for (let i = 0; i < elementsSequence.length; i += 1) { - const elementObj = elementsSequence[i]; - if (i >= 1) { - await sleep(STATIC_CLICK_DELAY_MS); - } - if (!elementObj.element) { - break; + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; } - if (!elementObj.clicked) { - elementObj.element.click(); - elementObj.clicked = true; + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; } } - const allElementsClicked = elementsSequence.every(function (elementObj) { - return elementObj.clicked === true; - }); - if (allElementsClicked) { - hit(source); + } + return false; + } + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; + } + throw new Error("RegExp.prototype.test is not a function"); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; } - }; - const handleElement = function handleElement(element, i) { - const elementObj = createElementObj(element); - elementsSequence[i] = elementObj; - if (canClick) { - clickElementsBySequence(); + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; } }; - const findElements = function findElements(mutations, observer) { - const fulfilledSelectors = []; - selectorsSequence.forEach(function (selector, i) { - if (!selector) { - return; - } - const element = document.querySelector(selector); - if (!element) { - return; - } - handleElement(element, i); - fulfilledSelectors.push(selector); - }); - selectorsSequence = selectorsSequence.map(function (selector) { - return fulfilledSelectors.indexOf(selector) === -1 ? selector : null; - }); - const allSelectorsFulfilled = selectorsSequence.every(function (selector) { - return selector === null; - }); - if (allSelectorsFulfilled) { - observer.disconnect(); + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; } + return ""; }; - const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); - observer.observe(document.documentElement, { - attributes: true, - childList: true, - subtree: true - }); - if (parsedDelay) { - setTimeout(function () { - clickElementsBySequence(); - canClick = true; - }, parsedDelay); + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - setTimeout(function () { - return observer.disconnect(); - }, OBSERVER_TIMEOUT_MS); + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setConstant.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setCookie(source, args) { + function setCookie(source, name, value) { + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; + var validValue = getLimitedCookieValue(value); + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + return; + } + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; + } + hit(source); + document.cookie = cookieToSet; } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -49967,204 +56617,116 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function parseCookieString(cookieString) { - const COOKIE_DELIMITER = "="; - const COOKIE_PAIRS_DELIMITER = ";"; - const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); - const cookieData = {}; - cookieChunks.forEach(function (singleCookie) { - let cookieKey; - let cookieValue; - const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); - if (delimiterIndex === -1) { - cookieKey = singleCookie.trim(); - } else { - cookieKey = singleCookie.slice(0, delimiterIndex).trim(); - cookieValue = singleCookie.slice(delimiterIndex + 1); - } - cookieData[cookieKey] = cookieValue || null; - }); - return cookieData; - } - function throttle(cb, delay) { - let wait = false; - let savedArgs; - const wrapper = function wrapper() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - if (wait) { - savedArgs = args; - return; - } - cb(...args); - wait = true; - setTimeout(function () { - wait = false; - if (savedArgs) { - wrapper(...savedArgs); - savedArgs = null; - } - }, delay); - }; - return wrapper; - } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + nativeConsole("".concat(name, ": ").concat(message)); + } + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function getLimitedCookieValue(value) { + if (!value) { + return null; + } + var allowedCookieValues = new Set(["true", "false", "yes", "y", "no", "n", "ok", "accept", "reject", "allow", "deny"]); + var validValue; + if (allowedCookieValues.has(value.toLowerCase())) { + validValue = value; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + return null; } + if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { + return null; + } + } else { + return null; } - nativeConsole(messageStr); + return validValue; } - function parseMatchArg(match) { - const INVERT_MARKER = "!"; - const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false; - const matchValue = isInvertedMatch ? match.slice(1) : match; - const matchRegexp = toRegExp(matchValue); - return { - isInvertedMatch: isInvertedMatch, - matchRegexp: matchRegexp, - matchValue: matchValue - }; + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + return ""; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - trustedClickElement.apply(this, updatedArgs); + setCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedReplaceFetchResponse(source, args) { - function trustedReplaceFetchResponse(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + function setCookieReload(source, args) { + function setCookieReload(source, name, value) { + var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; + if (isCookieSetWithValue(document.cookie, name, value)) { return; } - if (pattern === "" && replacement !== "") { - logMessage(source, "Pattern argument should not be empty string"); + var validValue = getLimitedCookieValue(value); + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; } - const shouldLog = pattern === "" && replacement === ""; - const nativeFetch = fetch; - let shouldReplace = false; - let fetchData; - const handlerWrapper = function handlerWrapper(target, thisArg, args) { - fetchData = getFetchData(args); - if (shouldLog) { - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - if (!shouldReplace) { - return Reflect.apply(target, thisArg, args); - } - const forgeResponse = function forgeResponse(response, textContent) { - const bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; - const forgedResponse = new Response(textContent, { - status: status, - statusText: statusText, - headers: headers - }); - Object.defineProperties(forgedResponse, { - url: { - value: url - }, - type: { - value: type - }, - ok: { - value: ok - }, - bodyUsed: { - value: bodyUsed - }, - redirected: { - value: redirected - } - }); - return forgedResponse; - }; - return nativeFetch.apply(null, args).then(function (response) { - return response.text().then(function (bodyText) { - const patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); - const modifiedTextContent = bodyText.replace(patternRegexp, replacement); - const forgedResponse = forgeResponse(response, modifiedTextContent); - hit(source); - return forgedResponse; - }).catch(function () { - const fetchDataStr = objectToString(fetchData); - const message = "Response body can't be converted to text: ".concat(fetchDataStr); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - }); - }).catch(function () { - return Reflect.apply(target, thisArg, args); - }); - }; - const fetchHandler = { - apply: handlerWrapper - }; - fetch = new Proxy(fetch, fetchHandler); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; + } + document.cookie = cookieToSet; + hit(source); + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); + } } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -50178,319 +56740,122 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function getFetchData(args) { - const fetchPropsObj = {}; - let fetchUrl; - let fetchInit; - if (args[0] instanceof Request) { - const requestData = getRequestData(args[0]); - fetchUrl = requestData.url; - fetchInit = requestData; - } else { - fetchUrl = args[0]; - fetchInit = args[1]; - } - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { - Object.keys(fetchInit).forEach(function (prop) { - fetchPropsObj[prop] = fetchInit[prop]; - }); - } - return fetchPropsObj; - } - function objectToString(obj) { - if (!obj || typeof obj !== "object") { - return String(obj); - } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); - } - return "".concat(key, ':"').concat(recordValueStr, '"'); - }).join(" "); - } - function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === "" || propsToMatch === "*") { - return true; - } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; - } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); - } - return isMatched; - } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); - } - let isValid; - try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; - } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + nativeConsole("".concat(name, ": ").concat(message)); } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getRequestData(request) { - const requestInitOptions = getRequestProps(); - const entries = requestInitOptions.map(function (key) { - const value = request[key]; - return [key, value]; - }); - return getObjectFromEntries(entries); - } - function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; - } - function getObjectFromEntries(entries) { - const output = entries.reduce(function (acc, el) { - const key = el[0]; - const value = el[1]; - acc[key] = value; - return acc; - }, {}); - return output; + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); } - function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); - props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); - propsObj[key] = value; - } else { - propsObj.url = prop; + function isCookieSetWithValue(cookieString, name, value) { + return cookieString.split(";").some(function (cookieStr) { + var pos = cookieStr.indexOf("="); + if (pos === -1) { + return false; } + var cookieName = cookieStr.slice(0, pos).trim(); + var cookieValue = cookieStr.slice(pos + 1).trim(); + return name === cookieName && value === cookieValue; }); - return propsObj; - } - function validateParsedData(data) { - return Object.values(data).every(function (value) { - return isValidStrPattern(value); - }); - } - function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { - matchData[key] = toRegExp(data[key]); - }); - return matchData; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedReplaceFetchResponse.apply(this, updatedArgs); - } catch (e) { - console.log(e); } - } - function trustedReplaceXhrResponse(source, args) { - function trustedReplaceXhrResponse(source) { - let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof Proxy === "undefined") { - return; - } - if (pattern === "" && replacement !== "") { - const message = "Pattern argument should not be empty string."; - logMessage(source, message); - return; + function getLimitedCookieValue(value) { + if (!value) { + return null; } - const shouldLog = pattern === "" && replacement === ""; - const nativeOpen = window.XMLHttpRequest.prototype.open; - const nativeSend = window.XMLHttpRequest.prototype.send; - let xhrData; - const openWrapper = function openWrapper(target, thisArg, args) { - xhrData = getXhrData.apply(null, args); - if (shouldLog) { - const message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, message, true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - if (matchRequestProps(source, propsToMatch, xhrData)) { - thisArg.shouldBePrevented = true; - } - if (thisArg.shouldBePrevented) { - thisArg.collectedHeaders = []; - const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { - thisArg.collectedHeaders.push(args); - return Reflect.apply(target, thisArg, args); - }; - const setRequestHeaderHandler = { - apply: setRequestHeaderWrapper - }; - thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); - } - return Reflect.apply(target, thisArg, args); - }; - const sendWrapper = function sendWrapper(target, thisArg, args) { - if (!thisArg.shouldBePrevented) { - return Reflect.apply(target, thisArg, args); - } - const forgedRequest = new XMLHttpRequest(); - forgedRequest.addEventListener("readystatechange", function () { - if (forgedRequest.readyState !== 4) { - return; - } - const readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; - const content = responseText || response; - if (typeof content !== "string") { - return; - } - const patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); - const modifiedContent = content.replace(patternRegexp, replacement); - Object.defineProperties(thisArg, { - readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent - }, - responseURL: { - value: responseURL - }, - responseXML: { - value: responseXML - }, - status: { - value: status - }, - statusText: { - value: statusText - } - }); - setTimeout(function () { - const stateEvent = new Event("readystatechange"); - thisArg.dispatchEvent(stateEvent); - const loadEvent = new Event("load"); - thisArg.dispatchEvent(loadEvent); - const loadEndEvent = new Event("loadend"); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); - thisArg.collectedHeaders.forEach(function (header) { - const name = header[0]; - const value = header[1]; - forgedRequest.setRequestHeader(name, value); - }); - thisArg.collectedHeaders = []; - try { - nativeSend.call(forgedRequest, args); - } catch (_unused) { - return Reflect.apply(target, thisArg, args); + var allowedCookieValues = new Set(["true", "false", "yes", "y", "no", "n", "ok", "accept", "reject", "allow", "deny"]); + var validValue; + if (allowedCookieValues.has(value.toLowerCase())) { + validValue = value; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + return null; } - return undefined; - }; - const openHandler = { - apply: openWrapper - }; - const sendHandler = { - apply: sendWrapper - }; - XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); - XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { + return null; + } + } else { + return null; + } + return validValue; + } + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + return ""; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setCookieReload.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + function setLocalStorageItem(source, args) { + function setLocalStorageItem(source, key, value) { + if (typeof key === "undefined") { + logMessage(source, "Item key should be specified."); + return; + } + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); + return; + } + var _window = window, + localStorage = _window.localStorage; + if (validValue === "$remove$") { + removeStorageItem(source, localStorage, key); + } else { + setStorageItem(source, localStorage, key, validValue); + } + hit(source); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -50504,286 +56869,181 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); - } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); + } + function setStorageItem(source, storage, key, value) { + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); } - function objectToString(obj) { - if (!obj || typeof obj !== "object") { - return String(obj); + function removeStorageItem(source, storage, key) { + try { + storage.removeItem(key); + } catch (e) { + var message = "Unable to remove storage item due to: ".concat(e.message); + logMessage(source, message); } - return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { - const key = pair[0]; - const value = pair[1]; - let recordValueStr = value; - if (value instanceof Object) { - recordValueStr = "{ ".concat(objectToString(value), " }"); - } - return "".concat(key, ':"').concat(recordValueStr, '"'); - }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { - if (propsToMatch === "" || propsToMatch === "*") { - return true; + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); } - let isMatched; - const parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { - logMessage(source, "Invalid parameter: ".concat(propsToMatch)); - isMatched = false; + var validValue; + if (value === "undefined") { + validValue = undefined; + } else if (value === "false") { + validValue = false; + } else if (value === "true") { + validValue = true; + } else if (value === "null") { + validValue = null; + } else if (value === "emptyArr") { + validValue = "[]"; + } else if (value === "emptyObj") { + validValue = "{}"; + } else if (value === "") { + validValue = ""; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + throw new Error("Invalid value"); + } + if (Math.abs(validValue) > 32767) { + throw new Error("Invalid value"); + } + } else if (value === "yes") { + validValue = "yes"; + } else if (value === "no") { + validValue = "no"; + } else if (value === "$remove$") { + validValue = "$remove$"; } else { - const matchData = getMatchPropsData(parsedData); - isMatched = Object.keys(matchData).every(function (matchKey) { - const matchValue = matchData[matchKey]; - return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); - }); + throw new Error("Invalid value"); } - return isMatched; - } - function getXhrData(method, url, async, user, password) { - return { - method: method, - url: url, - async: async, - user: user, - password: password - }; - } - function getMatchPropsData(data) { - const matchData = {}; - Object.keys(data).forEach(function (key) { - matchData[key] = toRegExp(data[key]); - }); - return matchData; - } - function getRequestProps() { - return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + return validValue; } - function validateParsedData(data) { - return Object.values(data).every(function (value) { - return isValidStrPattern(value); - }); + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setLocalStorageItem.apply(this, updatedArgs); + } catch (e) { + console.log(e); } - function parseMatchProps(propsToMatchStr) { - const PROPS_DIVIDER = " "; - const PAIRS_MARKER = ":"; - const LEGAL_MATCH_PROPS = getRequestProps(); - const propsObj = {}; - const props = propsToMatchStr.split(PROPS_DIVIDER); - props.forEach(function (prop) { - const dividerInd = prop.indexOf(PAIRS_MARKER); - const key = prop.slice(0, dividerInd); - const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { - const value = prop.slice(dividerInd + 1); - propsObj[key] = value; - } else { - propsObj.url = prop; + } + function setPopadsDummy(source, args) { + function setPopadsDummy(source) { + delete window.PopAds; + delete window.popns; + Object.defineProperties(window, { + PopAds: { + get: function get() { + hit(source); + return {}; + } + }, + popns: { + get: function get() { + hit(source); + return {}; + } } }); - return propsObj; } - function isValidStrPattern(input) { - const FORWARD_SLASH = "/"; - let str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - str = input.slice(1, -1); + function hit(source) { + if (source.verbose !== true) { + return; } - let isValid; try { - isValid = new RegExp(str); - isValid = true; - } catch (e) { - isValid = false; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - return isValid; - } - function escapeRegExp(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; - } - function getObjectEntries(object) { - const keys = Object.keys(object); - const entries = []; - keys.forEach(function (key) { - return entries.push([key, object[key]]); - }); - return entries; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - trustedReplaceXhrResponse.apply(this, updatedArgs); + setPopadsDummy.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetConstant(source, args) { - function trustedSetConstant(source, property, value, stack) { - if (!property || !matchStackTrace(stack, new Error().stack)) { + function setSessionStorageItem(source, args) { + function setSessionStorageItem(source, key, value) { + if (typeof key === "undefined") { + logMessage(source, "Item key should be specified."); return; } - let constantValue; + var validValue; try { - constantValue = inferValue(value); - } catch (e) { - logMessage(source, e); + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - let canceled = false; - const mustCancel = function mustCancel(value) { - if (canceled) { - return canceled; - } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; - return canceled; - }; - const trapProp = function trapProp(base, prop, configurable, handler) { - if (!handler.init(base[prop])) { - return false; - } - const origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - let prevSetter; - if (origDescriptor instanceof Object) { - if (!origDescriptor.configurable) { - const message = "Property '".concat(prop, "' is not configurable"); - logMessage(source, message); - return false; - } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { - prevSetter = origDescriptor.set; - } - } - Object.defineProperty(base, prop, { - configurable: configurable, - get() { - return handler.get(); - }, - set(a) { - if (prevSetter !== undefined) { - prevSetter(a); - } - handler.set(a); - } - }); - return true; - }; - const setChainPropAccess = function setChainPropAccess(owner, property) { - const chainInfo = getPropertyInChain(owner, property); - const base = chainInfo.base; - const prop = chainInfo.prop, - chain = chainInfo.chain; - const inChainPropHandler = { - factValue: undefined, - init(a) { - this.factValue = a; - return true; - }, - get() { - return this.factValue; - }, - set(a) { - if (this.factValue === a) { - return; - } - this.factValue = a; - if (a instanceof Object) { - setChainPropAccess(a, chain); - } - } - }; - const endPropHandler = { - init(a) { - if (mustCancel(a)) { - return false; - } - return true; - }, - get() { - return constantValue; - }, - set(a) { - if (!mustCancel(a)) { - return; - } - constantValue = a; - } - }; - if (!chain) { - const isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { - hit(source); - } - return; - } - if (base !== undefined && base[prop] === null) { - trapProp(base, prop, true, inChainPropHandler); - return; - } - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - trapProp(base, prop, true, inChainPropHandler); - } - const propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { - setChainPropAccess(propValue, chain); - } - trapProp(base, prop, true, inChainPropHandler); - }; - setChainPropAccess(window, property); + var _window = window, + sessionStorage = _window.sessionStorage; + if (validValue === "$remove$") { + removeStorageItem(source, sessionStorage, key); + } else { + setStorageItem(source, sessionStorage, key, validValue); + } + hit(source); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -50796,260 +57056,275 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function inferValue(value) { - if (value === "undefined") { - return undefined; - } - if (value === "false") { - return false; - } - if (value === "true") { - return true; - } - if (value === "null") { - return null; - } - if (value === "NaN") { - return NaN; - } - const MAX_ALLOWED_NUM = 32767; - const numVal = Number(value); - if (!nativeIsNaN(numVal)) { - if (Math.abs(numVal) > MAX_ALLOWED_NUM) { - throw new Error("number values bigger than 32767 are not allowed"); - } - return numVal; - } - let errorMessage = "'".concat(value, "' value type can't be inferred"); - try { - const parsableVal = JSON.parse(value); - if (parsableVal instanceof Object || typeof parsableVal === "string") { - return parsableVal; - } - } catch (e) { - errorMessage += ": ".concat(e); - } - throw new TypeError(errorMessage); - } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } - function getPropertyInChain(base, chain) { - const pos = chain.indexOf("."); - if (pos === -1) { - return { - base: base, - prop: chain - }; - } - const prop = chain.slice(0, pos); - if (base === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - const nextBase = base[prop]; - chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase === null) { - return { - base: base, - prop: prop, - chain: chain - }; - } - if (nextBase !== undefined) { - return getPropertyInChain(nextBase, chain); - } - Object.defineProperty(base, prop, { - configurable: true - }); - return { - base: base, - prop: prop, - chain: chain - }; + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); } - function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; - if (input === "") { - return new RegExp(DEFAULT_VALUE); + function setStorageItem(source, storage, key, value) { + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); + } + function removeStorageItem(source, storage, key) { + try { + storage.removeItem(key); + } catch (e) { + var message = "Unable to remove storage item due to: ".concat(e.message); + logMessage(source, message); } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); } - function matchStackTrace(stackMatch, stackTrace) { - if (!stackMatch || stackMatch === "") { - return true; + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { - return true; + var validValue; + if (value === "undefined") { + validValue = undefined; + } else if (value === "false") { + validValue = false; + } else if (value === "true") { + validValue = true; + } else if (value === "null") { + validValue = null; + } else if (value === "emptyArr") { + validValue = "[]"; + } else if (value === "emptyObj") { + validValue = "{}"; + } else if (value === "") { + validValue = ""; + } else if (/^\d+$/.test(value)) { + validValue = parseFloat(value); + if (nativeIsNaN(validValue)) { + throw new Error("Invalid value"); + } + if (Math.abs(validValue) > 32767) { + throw new Error("Invalid value"); + } + } else if (value === "yes") { + validValue = "yes"; + } else if (value === "no") { + validValue = "no"; + } else if (value === "$remove$") { + validValue = "$remove$"; + } else { + throw new Error("Invalid value"); } - const stackRegexp = toRegExp(stackMatch); - const refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); - }).join("\n"); - return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); - } - function nativeIsNaN(num) { - const native = Number.isNaN || window.isNaN; - return native(num); - } - function isEmptyObject(obj) { - return Object.keys(obj).length === 0 && !obj.prototype; + return validValue; } - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + setSessionStorageItem.apply(this, updatedArgs); + } catch (e) { + console.log(e); } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { - const INLINE_SCRIPT_STRING = "inlineScript"; - const INJECTED_SCRIPT_STRING = "injectedScript"; - const INJECTED_SCRIPT_MARKER = ""; - const isInlineScript = function isInlineScript(stackMatch) { - return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; - }; - const isInjectedScript = function isInjectedScript(stackMatch) { - return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + } + function trustedClickElement(source, args) { + function trustedClickElement(source, selectors) { + var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; + if (!selectors) { + return; + } + var OBSERVER_TIMEOUT_MS = 1e4; + var THROTTLE_DELAY_MS = 20; + var STATIC_CLICK_DELAY_MS = 150; + var COOKIE_MATCH_MARKER = "cookie:"; + var LOCAL_STORAGE_MATCH_MARKER = "localStorage:"; + var SELECTORS_DELIMITER = ","; + var COOKIE_STRING_DELIMITER = ";"; + var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=!?cookie:|!?localStorage:)/; + var sleep = function sleep(delayMs) { + return new Promise(function (resolve) { + return setTimeout(resolve, delayMs); + }); }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { - return false; + var parsedDelay; + if (delay) { + parsedDelay = parseInt(delay, 10); + var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; + if (!isValidDelay) { + var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); + logMessage(source, message); + return; + } } - let documentURL = window.location.href; - const pos = documentURL.indexOf("#"); - if (pos !== -1) { - documentURL = documentURL.slice(0, pos); + var canClick = !parsedDelay; + var cookieMatches = []; + var localStorageMatches = []; + var isInvertedMatchCookie = false; + var isInvertedMatchLocalStorage = false; + if (extraMatch) { + var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { + return matchStr.trim(); + }); + parsedExtraMatch.forEach(function (matchStr) { + if (matchStr.includes(COOKIE_MATCH_MARKER)) { + var _parseMatchArg = parseMatchArg(matchStr), + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchValue = _parseMatchArg.matchValue; + isInvertedMatchCookie = isInvertedMatch; + var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, ""); + cookieMatches.push(cookieMatch); + } + if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) { + var _parseMatchArg2 = parseMatchArg(matchStr), + _isInvertedMatch = _parseMatchArg2.isInvertedMatch, + _matchValue = _parseMatchArg2.matchValue; + isInvertedMatchLocalStorage = _isInvertedMatch; + var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, ""); + localStorageMatches.push(localStorageMatch); + } + }); } - const stackSteps = stackTrace.split("\n").slice(2).map(function (line) { - return line.trim(); + if (cookieMatches.length > 0) { + var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); + var parsedCookies = parseCookieString(document.cookie); + var cookieKeys = Object.keys(parsedCookies); + if (cookieKeys.length === 0) { + return; + } + var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { + var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; + var keyMatch = toRegExp(key); + return cookieKeys.some(function (key) { + var keysMatched = keyMatch.test(key); + if (!keysMatched) { + return false; + } + if (!valueMatch) { + return true; + } + return valueMatch.test(parsedCookies[key]); + }); + }); + var shouldRun = cookiesMatched !== isInvertedMatchCookie; + if (!shouldRun) { + return; + } + } + if (localStorageMatches.length > 0) { + var localStorageMatched = localStorageMatches.every(function (str) { + var itemValue = window.localStorage.getItem(str); + return itemValue || itemValue === ""; + }); + var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage; + if (!_shouldRun) { + return; + } + } + var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { + return selector.trim(); }); - const stackLines = stackSteps.map(function (line) { - let stack; - const getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { - let stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { - stackURL = stackURL.slice(1); + var createElementObj = function createElementObj(element) { + return { + element: element || null, + clicked: false + }; + }; + var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); + var clickElementsBySequence = async function clickElementsBySequence() { + for (var i = 0; i < elementsSequence.length; i += 1) { + var elementObj = elementsSequence[i]; + if (i >= 1) { + await sleep(STATIC_CLICK_DELAY_MS); } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { - stackURL = INJECTED_SCRIPT_STRING; - let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { - stackFunction = stackFunction.slice(2).trim(); - } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); - } else { - stack = stackURL; + if (!elementObj.element) { + break; + } + if (!elementObj.clicked) { + elementObj.element.click(); + elementObj.clicked = true; } - } else { - stack = line; } - return stack; - }); - if (stackLines) { - for (let index = 0; index < stackLines.length; index += 1) { - if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { - return true; + var allElementsClicked = elementsSequence.every(function (elementObj) { + return elementObj.clicked === true; + }); + if (allElementsClicked) { + hit(source); + } + }; + var handleElement = function handleElement(element, i) { + var elementObj = createElementObj(element); + elementsSequence[i] = elementObj; + if (canClick) { + clickElementsBySequence(); + } + }; + var findElements = function findElements(mutations, observer) { + var fulfilledSelectors = []; + selectorsSequence.forEach(function (selector, i) { + if (!selector) { + return; } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { - return true; + var element = document.querySelector(selector); + if (!element) { + return; } + handleElement(element, i); + fulfilledSelectors.push(selector); + }); + selectorsSequence = selectorsSequence.map(function (selector) { + return fulfilledSelectors.includes(selector) ? null : selector; + }); + var allSelectorsFulfilled = selectorsSequence.every(function (selector) { + return selector === null; + }); + if (allSelectorsFulfilled) { + observer.disconnect(); } + }; + var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); + observer.observe(document.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + if (parsedDelay) { + setTimeout(function () { + clickElementsBySequence(); + canClick = true; + }, parsedDelay); } - return false; - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - trustedSetConstant.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - function trustedSetCookie(source, args) { - function trustedSetCookie(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { - logMessage(source, "Cookie name should be specified"); - return; - } - if (typeof value === "undefined") { - logMessage(source, "Cookie value should be specified"); - return; - } - const parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); - return; - } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { - return; - } - if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; - } - const expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); - } - document.cookie = cookieToSet; - hit(source); + setTimeout(function () { + return observer.disconnect(); + }, OBSERVER_TIMEOUT_MS); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -51062,137 +57337,216 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function parseCookieString(cookieString) { + var COOKIE_DELIMITER = "="; + var COOKIE_PAIRS_DELIMITER = ";"; + var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); + var cookieData = {}; + cookieChunks.forEach(function (singleCookie) { + var cookieKey; + var cookieValue = ""; + var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); + if (delimiterIndex === -1) { + cookieKey = singleCookie.trim(); + } else { + cookieKey = singleCookie.slice(0, delimiterIndex).trim(); + cookieValue = singleCookie.slice(delimiterIndex + 1); + } + cookieData[cookieKey] = cookieValue || null; + }); + return cookieData; + } + function throttle(cb, delay) { + var wait = false; + var savedArgs; + var wrapper = function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (wait) { + savedArgs = args; + return; + } + cb(...args); + wait = true; + setTimeout(function () { + wait = false; + if (savedArgs) { + wrapper(...savedArgs); + savedArgs = null; + } + }, delay); + }; + return wrapper; + } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); - } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); - } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; - } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - const ONE_YEAR_EXPIRATION_KEYWORD = "1year"; - const ONE_DAY_EXPIRATION_KEYWORD = "1day"; - const MS_IN_SEC = 1e3; - const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - const SECONDS_IN_DAY = 24 * 60 * 60; - let parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_DAY; - } else { - parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { - return null; - } - } - return parsedSec * MS_IN_SEC; - } - function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = "$now$"; - const CURRENT_DATE_KEYWORD = "$currentDate$"; - let parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { - parsedValue = Date.now().toString(); - } else if (rawValue === CURRENT_DATE_KEYWORD) { - parsedValue = Date(); - } - return parsedValue; + nativeConsole("".concat(name, ": ").concat(message)); } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; - } - return ""; + function parseMatchArg(match) { + var INVERT_MARKER = "!"; + var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false; + var matchValue = isInvertedMatch ? match.slice(1) : match; + var matchRegexp = toRegExp(matchValue); + return { + isInvertedMatch: isInvertedMatch, + matchRegexp: matchRegexp, + matchValue: matchValue + }; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - trustedSetCookie.apply(this, updatedArgs); + trustedClickElement.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetCookieReload(source, args) { - function trustedSetCookieReload(source, name, value) { - let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { - logMessage(source, "Cookie name should be specified"); - return; - } - if (typeof value === "undefined") { - logMessage(source, "Cookie value should be specified"); - return; - } - if (isCookieSetWithValue(document.cookie, name, value)) { - return; - } - const parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { - logMessage(source, "Invalid cookie path: '".concat(path, "'")); + function trustedReplaceFetchResponse(source, args) { + function trustedReplaceFetchResponse(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { + if (pattern === "" && replacement !== "") { + logMessage(source, "Pattern argument should not be empty string"); return; } - if (offsetExpiresSec) { - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + var shouldLog = pattern === "" && replacement === ""; + var nativeFetch = fetch; + var shouldReplace = false; + var fetchData; + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + fetchData = getFetchData(args); + if (shouldLog) { + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); } - const expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); - } - document.cookie = cookieToSet; - hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + shouldReplace = matchRequestProps(source, propsToMatch, fetchData); + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; + var forgedResponse = new Response(textContent, { + status: status, + statusText: statusText, + headers: headers + }); + Object.defineProperties(forgedResponse, { + url: { + value: url + }, + type: { + value: type + }, + ok: { + value: ok + }, + bodyUsed: { + value: bodyUsed + }, + redirected: { + value: redirected + } + }); + return forgedResponse; + }; + return nativeFetch.apply(null, args).then(function (response) { + return response.text().then(function (bodyText) { + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); + hit(source); + return forgedResponse; + }).catch(function () { + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + }); + }).catch(function () { + return Reflect.apply(target, thisArg, args); + }); + }; + var fetchHandler = { + apply: handlerWrapper + }; + fetch = new Proxy(fetch, fetchHandler); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -51206,124 +57560,294 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + nativeConsole("".concat(name, ": ").concat(message)); + } + function getFetchData(args) { + var fetchPropsObj = {}; + var fetchUrl; + var fetchInit; + if (args[0] instanceof Request) { + var requestData = getRequestData(args[0]); + fetchUrl = requestData.url; + fetchInit = requestData; + } else { + fetchUrl = args[0]; + fetchInit = args[1]; + } + fetchPropsObj.url = fetchUrl; + if (fetchInit instanceof Object) { + var props = Object.keys(fetchInit); + props.forEach(function (prop) { + fetchPropsObj[prop] = fetchInit[prop]; + }); + } + return fetchPropsObj; + } + function objectToString(obj) { + if (!obj || typeof obj !== "object") { + return String(obj); + } + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); } - nativeConsole(messageStr); + return isMatched; } - function isCookieSetWithValue(cookieString, name, value) { - return cookieString.split(";").some(function (cookieStr) { - const pos = cookieStr.indexOf("="); - if (pos === -1) { + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { return false; } - const cookieName = cookieStr.slice(0, pos).trim(); - const cookieValue = cookieStr.slice(pos + 1).trim(); - return name === cookieName && value === cookieValue; - }); + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; + } + return isValid; } - function isValidCookiePath(rawPath) { - return rawPath === "/" || rawPath === "none"; + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - const ONE_YEAR_EXPIRATION_KEYWORD = "1year"; - const ONE_DAY_EXPIRATION_KEYWORD = "1day"; - const MS_IN_SEC = 1e3; - const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - const SECONDS_IN_DAY = 24 * 60 * 60; - let parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedSec = SECONDS_IN_DAY; - } else { - parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { - return null; + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + function getRequestData(request) { + var requestInitOptions = getRequestProps(); + var entries = requestInitOptions.map(function (key) { + var value = request[key]; + return [key, value]; + }); + return Object.fromEntries(entries); + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; } - } - return parsedSec * MS_IN_SEC; + }); + return propsObj; } - function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = "$now$"; - const CURRENT_DATE_KEYWORD = "$currentDate$"; - let parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { - parsedValue = Date.now().toString(); - } else if (rawValue === CURRENT_DATE_KEYWORD) { - parsedValue = Date(); - } - return parsedValue; + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); } - function getCookiePath(rawPath) { - if (rawPath === "/") { - return "path=/"; - } - return ""; + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - trustedSetCookieReload.apply(this, updatedArgs); + trustedReplaceFetchResponse.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetLocalStorageItem(source, args) { - function trustedSetLocalStorageItem(source, key, value) { - if (typeof key === "undefined") { - logMessage(source, "Item key should be specified"); - return; + function trustedReplaceNodeText(source, args) { + function trustedReplaceNodeText(source, nodeName, textMatch, pattern, replacement) { + var uboAliases = ["replace-node-text.js", "rpnt.js", "sed.js"]; + if (uboAliases.includes(source.name)) { + replacement = pattern; + pattern = textMatch; + for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) { + extraArgs[_key - 5] = arguments[_key]; + } + for (var i = 0; i < extraArgs.length; i += 1) { + var arg = extraArgs[i]; + if (arg === "condition") { + textMatch = extraArgs[i + 1]; + break; + } + } } - if (typeof value === "undefined") { - logMessage(source, "Item value should be specified"); - return; + var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern), + selector = _parseNodeTextParams.selector, + nodeNameMatch = _parseNodeTextParams.nodeNameMatch, + textContentMatch = _parseNodeTextParams.textContentMatch, + patternMatch = _parseNodeTextParams.patternMatch; + var handleNodes = function handleNodes(nodes) { + return nodes.forEach(function (node) { + var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch); + if (shouldReplace) { + replaceNodeText(source, node, patternMatch, replacement); + } + }); + }; + if (document.documentElement) { + handleExistingNodes(selector, handleNodes); } - const parsedValue = parseKeywordValue(value); - const _window = window, - localStorage = _window.localStorage; - setStorageItem(source, localStorage, key, parsedValue); - hit(source); + observeDocumentWithTimeout(function (mutations) { + return handleMutations(mutations, handleNodes); + }, { + childList: true, + subtree: true + }); + } + function observeDocumentWithTimeout(callback, options) { + var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4; + var documentObserver = new MutationObserver(function (mutations, observer) { + observer.disconnect(); + callback(mutations, observer); + observer.observe(document.documentElement, options); + }); + documentObserver.observe(document.documentElement, options); + if (typeof timeout === "number") { + setTimeout(function () { + return documentObserver.disconnect(); + }, timeout); + } + } + function handleExistingNodes(selector, handler) { + var nodeList = document.querySelectorAll(selector); + var nodes = nodeListToArray(nodeList); + handler(nodes); + } + function handleMutations(mutations, handler) { + var addedNodes = getAddedNodes(mutations); + handler(addedNodes); + } + function replaceNodeText(source, node, pattern, replacement) { + var textContent = node.textContent; + if (textContent) { + node.textContent = textContent.replace(pattern, replacement); + hit(source); + } + } + function isTargetNode(node, nodeNameMatch, textContentMatch) { + var nodeName = node.nodeName, + textContent = node.textContent; + var nodeNameLowerCase = nodeName.toLowerCase(); + return textContent !== null && textContent !== "" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch)); + } + function parseNodeTextParams(nodeName, textMatch) { + var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + var REGEXP_START_MARKER = "/"; + var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER)); + var selector = isStringNameMatch ? nodeName : "*"; + var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName); + var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch); + var patternMatch; + if (pattern) { + patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern); + } + return { + selector: selector, + nodeNameMatch: nodeNameMatch, + textContentMatch: textContentMatch, + patternMatch: patternMatch + }; } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -51336,204 +57860,209 @@ var scriptlets_umd = {exports: {}}; window.__debug(source); } } - function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, - verbose = source.verbose; - if (!forced && !verbose) { - return; + function nodeListToArray(nodeList) { + var nodes = []; + for (var i = 0; i < nodeList.length; i += 1) { + nodes.push(nodeList[i]); } - const nativeConsole = console.log; - if (!convertMessageToString) { - nativeConsole("".concat(name, ":"), message); - return; - } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); + return nodes; + } + function getAddedNodes(mutations) { + var nodes = []; + for (var i = 0; i < mutations.length; i += 1) { + var addedNodes = mutations[i].addedNodes; + for (var j = 0; j < addedNodes.length; j += 1) { + nodes.push(addedNodes[j]); } } - nativeConsole(messageStr); + return nodes; } - function setStorageItem(source, storage, key, value) { - try { - storage.setItem(key, value); - } catch (e) { - const message = "Unable to set sessionStorage item due to: ".concat(e.message); - logMessage(source, message); + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); } - } - function parseKeywordValue(rawValue) { - const NOW_VALUE_KEYWORD = "$now$"; - const CURRENT_DATE_KEYWORD = "$currentDate$"; - let parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { - parsedValue = Date.now().toString(); - } else if (rawValue === CURRENT_DATE_KEYWORD) { - parsedValue = Date(); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - return parsedValue; + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - trustedSetLocalStorageItem.apply(this, updatedArgs); + trustedReplaceNodeText.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function xmlPrune(source, args) { - function xmlPrune(source, propsToRemove) { - var _this = this; - let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + function trustedReplaceXhrResponse(source, args) { + function trustedReplaceXhrResponse(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (typeof Proxy === "undefined") { return; } - let shouldPruneResponse = true; - if (!propsToRemove) { - shouldPruneResponse = false; + if (pattern === "" && replacement !== "") { + var message = "Pattern argument should not be empty string."; + logMessage(source, message); + return; } - const urlMatchRegexp = toRegExp(urlToMatch); - const isXML = function isXML(text) { - if (typeof text === "string") { - const trimedText = text.trim(); - if (trimedText.startsWith("<") && trimedText.endsWith(">")) { - return true; - } - } - return false; - }; - const createXMLDocument = function createXMLDocument(text) { - const xmlParser = new DOMParser(); - const xmlDocument = xmlParser.parseFromString(text, "text/xml"); - return xmlDocument; - }; - const pruneXML = function pruneXML(text) { - if (!isXML(text)) { - shouldPruneResponse = false; - return text; - } - const xmlDoc = createXMLDocument(text); - const errorNode = xmlDoc.querySelector("parsererror"); - if (errorNode) { - return text; + var shouldLog = pattern === "" && replacement === ""; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); + if (shouldLog) { + var _message = "xhr( ".concat(objectToString(xhrData), " )"); + logMessage(source, _message, true); + hit(source); + return Reflect.apply(target, thisArg, args); } - if (optionalProp !== "" && xmlDoc.querySelector(optionalProp) === null) { - shouldPruneResponse = false; - return text; + if (matchRequestProps(source, propsToMatch, xhrData)) { + thisArg.shouldBePrevented = true; } - const elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { - shouldPruneResponse = false; - return text; + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - elems.forEach(function (elem) { - elem.remove(); - }); - const serializer = new XMLSerializer(); - text = serializer.serializeToString(xmlDoc); - return text; + return Reflect.apply(target, thisArg, args); }; - const xhrWrapper = function xhrWrapper(target, thisArg, args) { - const xhrURL = args[1]; - if (typeof xhrURL !== "string" || xhrURL.length === 0) { + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!thisArg.shouldBePrevented) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(xhrURL)) { - thisArg.addEventListener("readystatechange", function pruneResponse() { - if (thisArg.readyState === 4) { - const response = thisArg.response; - thisArg.removeEventListener("readystatechange", pruneResponse); - if (!shouldPruneResponse) { - if (isXML(response)) { - const message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); - logMessage(source, message); - logMessage(source, createXMLDocument(response), true, false); - } - } else { - const prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { - Object.defineProperty(thisArg, "response", { - value: prunedResponseContent - }); - Object.defineProperty(thisArg, "responseText", { - value: prunedResponseContent - }); - hit(source); - } - shouldPruneResponse = true; - } + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + if (typeof content !== "string") { + return; + } + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + response: { + value: modifiedContent, + writable: false + }, + responseText: { + value: modifiedContent, + writable: false } }); - } - return Reflect.apply(target, thisArg, args); - }; - const xhrHandler = { - apply: xhrWrapper - }; - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); - const nativeFetch = window.fetch; - const fetchWrapper = function fetchWrapper(target, thisArg, args) { - const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; - if (typeof fetchURL !== "string" || fetchURL.length === 0) { + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(fetchURL)) { - return nativeFetch.apply(_this, args).then(function (response) { - return response.text().then(function (text) { - if (!shouldPruneResponse) { - if (isXML(text)) { - const message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text); - logMessage(source, message); - logMessage(source, createXMLDocument(text), true, false); - } - return Reflect.apply(target, thisArg, args); - } - const prunedText = pruneXML(text); - if (shouldPruneResponse) { - hit(source); - return new Response(prunedText, { - status: response.status, - statusText: response.statusText, - headers: response.headers - }); - } - shouldPruneResponse = true; - return Reflect.apply(target, thisArg, args); - }); - }); - } - return Reflect.apply(target, thisArg, args); + return undefined; }; - const fetchHandler = { - apply: fetchWrapper + var openHandler = { + apply: openWrapper }; - window.fetch = new Proxy(window.fetch, fetchHandler); + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } function hit(source) { if (source.verbose !== true) { return; } try { - const log = console.log.bind(console); - const trace = console.trace.bind(console); - let prefix = source.ruleText || ""; + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; if (source.domainName) { - const AG_SCRIPTLET_MARKER = "#%#//"; - const UBO_SCRIPTLET_MARKER = "##+js"; - let ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); - } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - const rulePart = source.ruleText.slice(ruleStartIndex); + var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } log("".concat(prefix, " trace start")); @@ -51547,10392 +58076,6630 @@ var scriptlets_umd = {exports: {}}; } } function logMessage(source, message) { - let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - const name = source.name, - ruleText = source.ruleText, + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, verbose = source.verbose; if (!forced && !verbose) { return; } - const nativeConsole = console.log; + var nativeConsole = console.log; if (!convertMessageToString) { nativeConsole("".concat(name, ":"), message); return; } - let messageStr = "".concat(name, ": ").concat(message); - if (ruleText) { - const RULE_MARKER = "#%#//scriptlet"; - const markerIdx = ruleText.indexOf(RULE_MARKER); - if (markerIdx > -1) { - const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); - messageStr += "; cannot apply rule: ".concat(ruleWithoutDomains); - } - } - nativeConsole(messageStr); + nativeConsole("".concat(name, ": ").concat(message)); } function toRegExp() { - let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; - const DEFAULT_VALUE = ".?"; - const FORWARD_SLASH = "/"; + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { - return new RegExp(input.slice(1, -1)); - } - const escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - const updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { - xmlPrune.apply(this, updatedArgs); - } catch (e) { - console.log(e); - } - } - const scriptletsMap = { - "abort-current-inline-script": abortCurrentInlineScript, - "abort-current-script.js": abortCurrentInlineScript, - "ubo-abort-current-script.js": abortCurrentInlineScript, - "acs.js": abortCurrentInlineScript, - "ubo-acs.js": abortCurrentInlineScript, - "ubo-abort-current-script": abortCurrentInlineScript, - "ubo-acs": abortCurrentInlineScript, - "abort-current-inline-script.js": abortCurrentInlineScript, - "ubo-abort-current-inline-script.js": abortCurrentInlineScript, - "acis.js": abortCurrentInlineScript, - "ubo-acis.js": abortCurrentInlineScript, - "ubo-abort-current-inline-script": abortCurrentInlineScript, - "ubo-acis": abortCurrentInlineScript, - "abp-abort-current-inline-script": abortCurrentInlineScript, - "abort-on-property-read": abortOnPropertyRead, - "abort-on-property-read.js": abortOnPropertyRead, - "ubo-abort-on-property-read.js": abortOnPropertyRead, - "aopr.js": abortOnPropertyRead, - "ubo-aopr.js": abortOnPropertyRead, - "ubo-abort-on-property-read": abortOnPropertyRead, - "ubo-aopr": abortOnPropertyRead, - "abp-abort-on-property-read": abortOnPropertyRead, - "abort-on-property-write": abortOnPropertyWrite, - "abort-on-property-write.js": abortOnPropertyWrite, - "ubo-abort-on-property-write.js": abortOnPropertyWrite, - "aopw.js": abortOnPropertyWrite, - "ubo-aopw.js": abortOnPropertyWrite, - "ubo-abort-on-property-write": abortOnPropertyWrite, - "ubo-aopw": abortOnPropertyWrite, - "abp-abort-on-property-write": abortOnPropertyWrite, - "abort-on-stack-trace": abortOnStackTrace, - "abort-on-stack-trace.js": abortOnStackTrace, - "ubo-abort-on-stack-trace.js": abortOnStackTrace, - "aost.js": abortOnStackTrace, - "ubo-aost.js": abortOnStackTrace, - "ubo-abort-on-stack-trace": abortOnStackTrace, - "ubo-aost": abortOnStackTrace, - "abp-abort-on-stack-trace": abortOnStackTrace, - "adjust-setInterval": adjustSetInterval, - "nano-setInterval-booster.js": adjustSetInterval, - "ubo-nano-setInterval-booster.js": adjustSetInterval, - "nano-sib.js": adjustSetInterval, - "ubo-nano-sib.js": adjustSetInterval, - "ubo-nano-setInterval-booster": adjustSetInterval, - "ubo-nano-sib": adjustSetInterval, - "adjust-setTimeout": adjustSetTimeout, - "nano-setTimeout-booster.js": adjustSetTimeout, - "ubo-nano-setTimeout-booster.js": adjustSetTimeout, - "nano-stb.js": adjustSetTimeout, - "ubo-nano-stb.js": adjustSetTimeout, - "ubo-nano-setTimeout-booster": adjustSetTimeout, - "ubo-nano-stb": adjustSetTimeout, - "debug-current-inline-script": debugCurrentInlineScript, - "debug-on-property-read": debugOnPropertyRead, - "debug-on-property-write": debugOnPropertyWrite, - "dir-string": dirString, - "abp-dir-string": dirString, - "disable-newtab-links": disableNewtabLinks, - "disable-newtab-links.js": disableNewtabLinks, - "ubo-disable-newtab-links.js": disableNewtabLinks, - "ubo-disable-newtab-links": disableNewtabLinks, - "close-window": forceWindowClose, - "window-close-if.js": forceWindowClose, - "ubo-window-close-if.js": forceWindowClose, - "ubo-window-close-if": forceWindowClose, - "hide-in-shadow-dom": hideInShadowDom, - "inject-css-in-shadow-dom": injectCssInShadowDom, - "json-prune": jsonPrune, - "json-prune.js": jsonPrune, - "ubo-json-prune.js": jsonPrune, - "ubo-json-prune": jsonPrune, - "abp-json-prune": jsonPrune, - log: log, - "log-addEventListener": logAddEventListener, - "addEventListener-logger.js": logAddEventListener, - "ubo-addEventListener-logger.js": logAddEventListener, - "aell.js": logAddEventListener, - "ubo-aell.js": logAddEventListener, - "ubo-addEventListener-logger": logAddEventListener, - "ubo-aell": logAddEventListener, - "log-eval": logEval, - "log-on-stack-trace": logOnStacktrace, - "m3u-prune": m3uPrune, - "m3u-prune.js": m3uPrune, - "ubo-m3u-prune.js": m3uPrune, - "ubo-m3u-prune": m3uPrune, - "no-topics": noTopics, - noeval: noeval, - "noeval.js": noeval, - "silent-noeval.js": noeval, - "ubo-noeval.js": noeval, - "ubo-silent-noeval.js": noeval, - "ubo-noeval": noeval, - "ubo-silent-noeval": noeval, - nowebrtc: nowebrtc, - "nowebrtc.js": nowebrtc, - "ubo-nowebrtc.js": nowebrtc, - "ubo-nowebrtc": nowebrtc, - "prevent-addEventListener": preventAddEventListener, - "addEventListener-defuser.js": preventAddEventListener, - "ubo-addEventListener-defuser.js": preventAddEventListener, - "aeld.js": preventAddEventListener, - "ubo-aeld.js": preventAddEventListener, - "ubo-addEventListener-defuser": preventAddEventListener, - "ubo-aeld": preventAddEventListener, - "prevent-adfly": preventAdfly, - "adfly-defuser.js": preventAdfly, - "ubo-adfly-defuser.js": preventAdfly, - "ubo-adfly-defuser": preventAdfly, - "prevent-bab": preventBab, - "prevent-element-src-loading": preventElementSrcLoading, - "prevent-eval-if": preventEvalIf, - "noeval-if.js": preventEvalIf, - "ubo-noeval-if.js": preventEvalIf, - "ubo-noeval-if": preventEvalIf, - "prevent-fab-3.2.0": preventFab, - "nofab.js": preventFab, - "ubo-nofab.js": preventFab, - "fuckadblock.js-3.2.0": preventFab, - "ubo-fuckadblock.js-3.2.0": preventFab, - "ubo-nofab": preventFab, - "prevent-fetch": preventFetch, - "no-fetch-if.js": preventFetch, - "ubo-no-fetch-if.js": preventFetch, - "ubo-no-fetch-if": preventFetch, - "prevent-popads-net": preventPopadsNet, - "popads.net.js": preventPopadsNet, - "ubo-popads.net.js": preventPopadsNet, - "ubo-popads.net": preventPopadsNet, - "prevent-refresh": preventRefresh, - "refresh-defuser.js": preventRefresh, - "refresh-defuser": preventRefresh, - "ubo-refresh-defuser.js": preventRefresh, - "ubo-refresh-defuser": preventRefresh, - "prevent-requestAnimationFrame": preventRequestAnimationFrame, - "no-requestAnimationFrame-if.js": preventRequestAnimationFrame, - "ubo-no-requestAnimationFrame-if.js": preventRequestAnimationFrame, - "norafif.js": preventRequestAnimationFrame, - "ubo-norafif.js": preventRequestAnimationFrame, - "ubo-no-requestAnimationFrame-if": preventRequestAnimationFrame, - "ubo-norafif": preventRequestAnimationFrame, - "prevent-setInterval": preventSetInterval, - "no-setInterval-if.js": preventSetInterval, - "ubo-no-setInterval-if.js": preventSetInterval, - "setInterval-defuser.js": preventSetInterval, - "ubo-setInterval-defuser.js": preventSetInterval, - "nosiif.js": preventSetInterval, - "ubo-nosiif.js": preventSetInterval, - "sid.js": preventSetInterval, - "ubo-sid.js": preventSetInterval, - "ubo-no-setInterval-if": preventSetInterval, - "ubo-setInterval-defuser": preventSetInterval, - "ubo-nosiif": preventSetInterval, - "ubo-sid": preventSetInterval, - "prevent-setTimeout": preventSetTimeout, - "no-setTimeout-if.js": preventSetTimeout, - "ubo-no-setTimeout-if.js": preventSetTimeout, - "nostif.js": preventSetTimeout, - "ubo-nostif.js": preventSetTimeout, - "ubo-no-setTimeout-if": preventSetTimeout, - "ubo-nostif": preventSetTimeout, - "setTimeout-defuser.js": preventSetTimeout, - "ubo-setTimeout-defuser.js": preventSetTimeout, - "ubo-setTimeout-defuser": preventSetTimeout, - "std.js": preventSetTimeout, - "ubo-std.js": preventSetTimeout, - "ubo-std": preventSetTimeout, - "prevent-window-open": preventWindowOpen, - "window.open-defuser.js": preventWindowOpen, - "ubo-window.open-defuser.js": preventWindowOpen, - "ubo-window.open-defuser": preventWindowOpen, - "nowoif.js": preventWindowOpen, - "ubo-nowoif.js": preventWindowOpen, - "ubo-nowoif": preventWindowOpen, - "prevent-xhr": preventXHR, - "no-xhr-if.js": preventXHR, - "ubo-no-xhr-if.js": preventXHR, - "ubo-no-xhr-if": preventXHR, - "remove-attr": removeAttr, - "remove-attr.js": removeAttr, - "ubo-remove-attr.js": removeAttr, - "ra.js": removeAttr, - "ubo-ra.js": removeAttr, - "ubo-remove-attr": removeAttr, - "ubo-ra": removeAttr, - "remove-class": removeClass, - "remove-class.js": removeClass, - "ubo-remove-class.js": removeClass, - "rc.js": removeClass, - "ubo-rc.js": removeClass, - "ubo-remove-class": removeClass, - "ubo-rc": removeClass, - "remove-cookie": removeCookie, - "cookie-remover.js": removeCookie, - "ubo-cookie-remover.js": removeCookie, - "ubo-cookie-remover": removeCookie, - "remove-in-shadow-dom": removeInShadowDom, - "set-attr": setAttr, - "set-constant": setConstant, - "set-constant.js": setConstant, - "ubo-set-constant.js": setConstant, - "set.js": setConstant, - "ubo-set.js": setConstant, - "ubo-set-constant": setConstant, - "ubo-set": setConstant, - "abp-override-property-read": setConstant, - "set-cookie": setCookie, - "set-cookie-reload": setCookieReload, - "set-local-storage-item": setLocalStorageItem, - "set-popads-dummy": setPopadsDummy, - "popads-dummy.js": setPopadsDummy, - "ubo-popads-dummy.js": setPopadsDummy, - "ubo-popads-dummy": setPopadsDummy, - "set-session-storage-item": setSessionStorageItem, - "trusted-click-element": trustedClickElement, - "trusted-replace-fetch-response": trustedReplaceFetchResponse, - "trusted-replace-xhr-response": trustedReplaceXhrResponse, - "trusted-set-constant": trustedSetConstant, - "trusted-set-cookie": trustedSetCookie, - "trusted-set-cookie-reload": trustedSetCookieReload, - "trusted-set-local-storage-item": trustedSetLocalStorageItem, - "xml-prune": xmlPrune, - "xml-prune.js": xmlPrune, - "ubo-xml-prune.js": xmlPrune, - "ubo-xml-prune": xmlPrune - }; - var getScriptletFunction = function getScriptletFunction(name) { - return scriptletsMap[name]; - }; - function getScriptletCode(source) { - if (!validator.isValidScriptletName(source.name)) { - return null; - } - const scriptletFunction = getScriptletFunction(source.name); - if (typeof scriptletFunction !== 'function') { - throw new Error("Error: cannot invoke scriptlet with name: '".concat(source.name, "'")); - } - const scriptletFunctionString = scriptletFunction.toString(); - const result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString); - return result; - } - const scriptletsObject = function () { - return { - invoke: getScriptletCode, - getScriptletFunction, - isValidScriptletName: validator.isValidScriptletName, - isValidScriptletRule, - isAdgScriptletRule: validator.isAdgScriptletRule, - isUboScriptletRule: validator.isUboScriptletRule, - isAbpSnippetRule: validator.isAbpSnippetRule, - convertUboToAdg: convertUboScriptletToAdg, - convertAbpToAdg: convertAbpSnippetToAdg, - convertScriptletToAdg, - convertAdgToUbo: convertAdgScriptletToUbo, - redirects - }; - }(); - scriptlets_umd.exports = scriptletsObject; -})); - -/** - * Redirect modifier class - */ -var RedirectModifier = /** @class */ (function () { - /** - * Constructor - * - * @param value - * @param ruleText - * @param isAllowlist - * @param isRedirectingOnlyBlocked is redirect-rule modifier - */ - function RedirectModifier(value, ruleText, isAllowlist, isRedirectingOnlyBlocked) { - if (isRedirectingOnlyBlocked === void 0) { isRedirectingOnlyBlocked = false; } - /** - * Is redirecting only blocked requests - * See $redirect-rule options - */ - this.isRedirectingOnlyBlocked = false; - RedirectModifier.validate(ruleText, value, isAllowlist); - this.redirectTitle = value; - this.isRedirectingOnlyBlocked = isRedirectingOnlyBlocked; - } - /** - * Redirect title - */ - RedirectModifier.prototype.getValue = function () { - return this.redirectTitle; - }; - /** - * Validates redirect rule - * - * @param ruleText - * @param redirectTitle - * @param isAllowlist - */ - RedirectModifier.validate = function (ruleText, redirectTitle, isAllowlist) { - if (isAllowlist && !redirectTitle) { - return; - } - if (!redirectTitle) { - throw new SyntaxError('Invalid $redirect rule, redirect value must not be empty'); - } - var redirects = scriptlets_umd.exports.redirects; - var ruleTextToValidate = ruleText.replace(NETWORK_RULE_OPTIONS.REDIRECTRULE, NETWORK_RULE_OPTIONS.REDIRECT); - if (!redirects.isAdgRedirectRule(ruleTextToValidate) || !redirects.isValidAdgRedirectRule(ruleTextToValidate)) { - throw new SyntaxError('$redirect modifier is invalid'); - } - }; - return RedirectModifier; -}()); - -/** - * Splits url into parts - * - * @param url - */ -function splitUrl(url) { - var strippedUrl = url; - var hash = ''; - var hashIndex = url.indexOf('#'); - if (hashIndex >= 0) { - hash = url.slice(hashIndex); - strippedUrl = url.slice(0, hashIndex); - } - var query = ''; - var queryIndex = url.indexOf('?'); - if (queryIndex >= 0) { - query = strippedUrl.slice(queryIndex + 1); - strippedUrl = strippedUrl.slice(0, queryIndex); - } - return { - path: strippedUrl, - query: query, - hash: hash, - }; -} -/** - * Normalizes url query parameters - * - * @param query - */ -function normalizeQuery(query) { - // Cleanup empty params (p0=0&=2&=3) - var result = query - .split('&') - .filter(function (x) { return x && !x.startsWith('='); }) - .join('&'); - // If we've collapsed the URL to the point where there's an '&' against the '?' - // then we need to get rid of that. - while (result.charAt(0) === '&') { - result = result.substr(1); - } - return result; -} -/** - * Removes query params from url by regexp - * - * @param url - * @param regExp - * @param invert remove every parameter in url except the ones matched regexp - */ -function cleanUrlParamByRegExp(url, regExp, invert) { - if (invert === void 0) { invert = false; } - var searchIndex = url.indexOf('?'); - // If no params, nothing to modify - if (searchIndex === -1) { - return url; - } - var split = splitUrl(url); - var modifiedQuery; - if (invert) { - modifiedQuery = split.query - .split('&') - .filter(function (x) { return x; }) - .filter(function (x) { return x && x.match(regExp); }) - .join('&'); - } - else { - modifiedQuery = split.query - .split('&') - .filter(function (x) { - var test = x.includes('=') ? x : "".concat(x, "="); - return !test.match(regExp); - }) - .join('&'); - } - // Do not normalize if regexp is not applied - if (modifiedQuery === split.query) { - return url; - } - modifiedQuery = normalizeQuery(modifiedQuery); - var result = split.path; - if (modifiedQuery) { - result += "?".concat(modifiedQuery); - } - return result + split.hash; -} -var DOMAIN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$/; -/** - * Check if the string could be a domain name - * - * @param text - */ -var isDomainName = function (text) { - if (text.indexOf('.') < 0 || text.endsWith('.')) { - return false; - } - return DOMAIN_REGEX.test(text); -}; -/** - * Extract relative part from hierarchical structured URL - * @param url - */ -var getRelativeUrl = function (url) { - var i = url.indexOf('/', url.indexOf('://') + 3); - return i !== -1 ? url.substr(i) : null; -}; - -/** - * Query parameters filtering modifier class - * Works with '$removeparam' modifier - */ -var RemoveParamModifier = /** @class */ (function () { - /** - * Constructor - * - * @param value - */ - function RemoveParamModifier(value) { - /** - * Is modifier valid for MV3 or not - */ - this.mv3Valid = true; - this.value = value; - var rawValue = value; - // TODO: Seems like negation not using in valueRegExp - if (value.startsWith('~')) { - rawValue = value.substring(1); - this.mv3Valid = false; - } - if (rawValue.startsWith('/')) { - this.valueRegExp = SimpleRegex.patternFromString(rawValue); - this.mv3Valid = false; - } - else { - if (rawValue.includes('|')) { - throw new Error('Unsupported option in $removeparam: multiple values are not allowed'); - } - this.valueRegExp = new RegExp("((^|&)(".concat(SimpleRegex.escapeRegexSpecials(rawValue), ")=[^&#]*)"), 'g'); + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); } - } - /** - * Modifier value - */ - RemoveParamModifier.prototype.getValue = function () { - return this.value; - }; - /** - * Is modifier valid for MV3 or not - */ - RemoveParamModifier.prototype.getMV3Validity = function () { - return this.mv3Valid; - }; - /** - * Removes query parameters from url - * - * @param url - */ - RemoveParamModifier.prototype.removeParameters = function (url) { - var sepIndex = url.indexOf('?'); - if (sepIndex < 0) { - return url; + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function objectToString(obj) { + if (!obj || typeof obj !== "object") { + return String(obj); } - if (!this.value) { - return url.substring(0, sepIndex); + return isEmptyObject(obj) ? "{}" : Object.entries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; } - if (sepIndex === url.length - 1) { - return url; + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); } - if (this.value.startsWith('~')) { - return cleanUrlParamByRegExp(url, this.valueRegExp, true); + return isMatched; + } + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; + } + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); } - return cleanUrlParamByRegExp(url, this.valueRegExp); - }; - return RemoveParamModifier; -}()); - -/** - * Headers filtering modifier class. - * Rules with $removeheader modifier are intended to remove headers from HTTP requests and responses. - */ -var RemoveHeaderModifier = /** @class */ (function () { - /** - * Constructor - * - * @param value - * @param isAllowlist - */ - function RemoveHeaderModifier(value, isAllowlist) { - this.value = value.toLowerCase(); - if (!isAllowlist && !this.value) { - throw new SyntaxError('Invalid $removeheader rule, removeheader value must not be empty'); + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; } - this.isRequestModifier = this.value.startsWith(RemoveHeaderModifier.REQUEST_PREFIX); - var headerName = this.isRequestModifier - ? this.value.substring(RemoveHeaderModifier.REQUEST_PREFIX.length) : this.value; - this.applicableHeaderName = RemoveHeaderModifier.isAllowedHeader(headerName) ? headerName : null; + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedReplaceXhrResponse.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - /** - * Modifier value - */ - RemoveHeaderModifier.prototype.getValue = function () { - return this.value; - }; - /** - * Returns effective header name to be removed - * - * @param isRequestHeaders - */ - RemoveHeaderModifier.prototype.getApplicableHeaderName = function (isRequestHeaders) { - if (!this.applicableHeaderName) { - return null; - } - if (isRequestHeaders !== this.isRequestModifier) { - return null; + function trustedSetConstant(source, args) { + function trustedSetConstant(source, property, value, stack) { + if (!property || !matchStackTrace(stack, new Error().stack)) { + return; } - return this.applicableHeaderName; - }; - /** - * Some headers are forbidden to remove - * - * @param headerName - */ - RemoveHeaderModifier.isAllowedHeader = function (headerName) { - return !this.FORBIDDEN_HEADERS.includes(headerName); - }; - /** - * List of forbidden headers - */ - RemoveHeaderModifier.FORBIDDEN_HEADERS = [ - 'access-control-allow-origin', - 'access-control-allow-credentials', - 'access-control-allow-headers', - 'access-control-allow-methods', - 'access-control-expose-headers', - 'access-control-max-age', - 'access-control-request-headers', - 'access-control-request-method', - 'origin', - 'timing-allow-origin', - 'allow', - 'cross-origin-embedder-policy', - 'cross-origin-opener-policy', - 'cross-origin-resource-policy', - 'content-security-policy', - 'content-security-policy-report-only', - 'expect-ct', - 'feature-policy', - 'origin-isolation', - 'strict-transport-security', - 'upgrade-insecure-requests', - 'x-content-type-options', - 'x-download-options', - 'x-frame-options', - 'x-permitted-cross-domain-policies', - 'x-powered-by', - 'x-xss-protection', - 'public-key-pins', - 'public-key-pins-report-only', - 'sec-websocket-key', - 'sec-websocket-extensions', - 'sec-websocket-accept', - 'sec-websocket-protocol', - 'sec-websocket-version', - 'p3p', - 'sec-fetch-mode', - 'sec-fetch-dest', - 'sec-fetch-site', - 'sec-fetch-user', - 'referrer-policy', - 'content-type', - 'content-length', - 'accept', - 'accept-encoding', - 'host', - 'connection', - 'transfer-encoding', - 'upgrade', - ]; - /** - * Request prefix - */ - RemoveHeaderModifier.REQUEST_PREFIX = 'request:'; - return RemoveHeaderModifier; -}()); - -var ErrorStatusCodes; -(function (ErrorStatusCodes) { - ErrorStatusCodes[ErrorStatusCodes["ComplexRegex"] = 1001] = "ComplexRegex"; - ErrorStatusCodes[ErrorStatusCodes["RuleLimit"] = 1002] = "RuleLimit"; - ErrorStatusCodes[ErrorStatusCodes["RegexpRuleLimit"] = 1003] = "RegexpRuleLimit"; - ErrorStatusCodes[ErrorStatusCodes["RemoveparamRegexpIsNotSupported"] = 1004] = "RemoveparamRegexpIsNotSupported"; - ErrorStatusCodes[ErrorStatusCodes["RemoveparamInversionIsNotSupported"] = 1005] = "RemoveparamInversionIsNotSupported"; -})(ErrorStatusCodes || (ErrorStatusCodes = {})); -var SEPARATOR = '|'; - -/** - * This is a helper class that is used specifically to work with app restrictions. - * - * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app - * - * Examples: - * ||baddomain.com^$app=org.example.app - * ||baddomain.com^$app=org.example.app1|org.example.app2 - */ -var AppModifier = /** @class */ (function () { - /** - * Parses the `apps` string - * - * @param apps - apps string - * - * @throws an error if the app string is empty or invalid - */ - function AppModifier(apps) { - if (!apps) { - throw new SyntaxError('$app modifier cannot be empty'); + var constantValue; + try { + constantValue = inferValue(value); + } catch (e) { + logMessage(source, e); + return; } - var permittedApps = []; - var restrictedApps = []; - var parts = apps.split(SEPARATOR); - for (var i = 0; i < parts.length; i += 1) { - var app = parts[i]; - var restricted = false; - if (app.startsWith('~')) { - restricted = true; - app = app.substring(1).trim(); + var canceled = false; + var mustCancel = function mustCancel(value) { + if (canceled) { + return canceled; + } + canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; + return canceled; + }; + var trapProp = function trapProp(base, prop, configurable, handler) { + if (!handler.init(base[prop])) { + return false; + } + var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); + var prevSetter; + if (origDescriptor instanceof Object) { + if (!origDescriptor.configurable) { + var message = "Property '".concat(prop, "' is not configurable"); + logMessage(source, message); + return false; } - if (app === '') { - throw new SyntaxError("Empty app specified in \"".concat(apps, "\"")); + base[prop] = constantValue; + if (origDescriptor.set instanceof Function) { + prevSetter = origDescriptor.set; } - if (restricted) { - restrictedApps.push(app); + } + Object.defineProperty(base, prop, { + configurable: configurable, + get() { + return handler.get(); + }, + set(a) { + if (prevSetter !== undefined) { + prevSetter(a); + } + handler.set(a); } - else { - permittedApps.push(app); + }); + return true; + }; + var setChainPropAccess = function setChainPropAccess(owner, property) { + var chainInfo = getPropertyInChain(owner, property); + var base = chainInfo.base; + var prop = chainInfo.prop, + chain = chainInfo.chain; + var inChainPropHandler = { + factValue: undefined, + init(a) { + this.factValue = a; + return true; + }, + get() { + return this.factValue; + }, + set(a) { + if (this.factValue === a) { + return; + } + this.factValue = a; + if (a instanceof Object) { + setChainPropAccess(a, chain); + } + } + }; + var endPropHandler = { + init(a) { + if (mustCancel(a)) { + return false; + } + return true; + }, + get() { + return constantValue; + }, + set(a) { + if (!mustCancel(a)) { + return; + } + constantValue = a; + } + }; + if (!chain) { + var isTrapped = trapProp(base, prop, false, endPropHandler); + if (isTrapped) { + hit(source); } + return; + } + if (base !== undefined && base[prop] === null) { + trapProp(base, prop, true, inChainPropHandler); + return; + } + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + trapProp(base, prop, true, inChainPropHandler); + } + var propValue = owner[prop]; + if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { + setChainPropAccess(propValue, chain); + } + trapProp(base, prop, true, inChainPropHandler); + }; + setChainPropAccess(window, property); + } + function hit(source) { + if (source.verbose !== true) { + return; } - this.restrictedApps = restrictedApps.length > 0 ? restrictedApps : null; - this.permittedApps = permittedApps.length > 0 ? permittedApps : null; - } - return AppModifier; -}()); - -/** - * Checks if error has message. - * - * @param error Error object. - * @returns If param is error. - */ -function isErrorWithMessage(error) { - return (typeof error === 'object' - && error !== null - && 'message' in error - && typeof error.message === 'string'); -} -/** - * Converts error to the error with message. - * - * @param maybeError Possible error. - * @returns Error with message. - */ -function toErrorWithMessage(maybeError) { - if (isErrorWithMessage(maybeError)) { - return maybeError; - } - try { - return new Error(JSON.stringify(maybeError)); - } - catch (_a) { - // fallback in case there's an error stringifying the maybeError - // like with circular references for example. - return new Error(String(maybeError)); - } -} -/** - * Converts error object to error with message. This method might be helpful to handle thrown errors. - * - * @param error Error object. - * - * @returns Message of the error. - */ -function getErrorMessage(error) { - return toErrorWithMessage(error).message; -} - -var isCidr = {exports: {}}; - -var cidrRegex = {exports: {}}; - -const word = '[a-fA-F\\d:]'; -const b = options => options && options.includeBoundaries ? - `(?:(?<=\\s|^)(?=${word})|(?<=${word})(?=\\s|$))` : - ''; -const v4$1 = '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}'; -const v6seg = '[a-fA-F\\d]{1,4}'; -const v6$1 = ` -(?: -(?:${v6seg}:){7}(?:${v6seg}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8 -(?:${v6seg}:){6}(?:${v4$1}|:${v6seg}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4 -(?:${v6seg}:){5}(?::${v4$1}|(?::${v6seg}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4 -(?:${v6seg}:){4}(?:(?::${v6seg}){0,1}:${v4$1}|(?::${v6seg}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4 -(?:${v6seg}:){3}(?:(?::${v6seg}){0,2}:${v4$1}|(?::${v6seg}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4 -(?:${v6seg}:){2}(?:(?::${v6seg}){0,3}:${v4$1}|(?::${v6seg}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4 -(?:${v6seg}:){1}(?:(?::${v6seg}){0,4}:${v4$1}|(?::${v6seg}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4 -(?::(?:(?::${v6seg}){0,5}:${v4$1}|(?::${v6seg}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4 -)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1 -`.replace(/\s*\/\/.*$/gm, '').replace(/\n/g, '').trim(); -const v46Exact = new RegExp(`(?:^${v4$1}$)|(?:^${v6$1}$)`); -const v4exact$1 = new RegExp(`^${v4$1}$`); -const v6exact$1 = new RegExp(`^${v6$1}$`); -const ip = options => options && options.exact ? - v46Exact : - new RegExp(`(?:${b(options)}${v4$1}${b(options)})|(?:${b(options)}${v6$1}${b(options)})`, 'g'); -ip.v4 = options => options && options.exact ? v4exact$1 : new RegExp(`${b(options)}${v4$1}${b(options)}`, 'g'); -ip.v6 = options => options && options.exact ? v6exact$1 : new RegExp(`${b(options)}${v6$1}${b(options)}`, 'g'); -var ipRegex$2 = ip; - -const ipRegex$1 = ipRegex$2; -const defaultOpts = {exact: false}; -const v4str = `${ipRegex$1.v4().source}\\/(3[0-2]|[12]?[0-9])`; -const v6str = `${ipRegex$1.v6().source}\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])`; -const v4exact = new RegExp(`^${v4str}$`); -const v6exact = new RegExp(`^${v6str}$`); -const v46exact = new RegExp(`(?:^${v4str}$)|(?:^${v6str}$)`); -cidrRegex.exports = ({exact} = defaultOpts) => exact ? v46exact : new RegExp(`(?:${v4str})|(?:${v6str})`, "g"); -cidrRegex.exports.v4 = ({exact} = defaultOpts) => exact ? v4exact : new RegExp(v4str, "g"); -cidrRegex.exports.v6 = ({exact} = defaultOpts) => exact ? v6exact : new RegExp(v6str, "g"); - -const {v4, v6} = cidrRegex.exports; -const re4 = v4({exact: true}); -const re6 = v6({exact: true}); -isCidr.exports = str => re4.test(str) ? 4 : (re6.test(str) ? 6 : 0); -isCidr.exports.v4 = str => re4.test(str); -isCidr.exports.v6 = str => re6.test(str); - -const ipRegex = ipRegex$2; -const isIp = string => ipRegex({exact: true}).test(string); -isIp.v4 = string => ipRegex.v4({exact: true}).test(string); -isIp.v6 = string => ipRegex.v6({exact: true}).test(string); -isIp.version = string => isIp(string) ? (isIp.v4(string) ? 4 : 6) : undefined; -var isIp_1 = isIp; - -var Netmask_1; -(function() { - var Netmask, atob, chr, chr0, chrA, chra, ip2long, long2ip; - long2ip = function(long) { - var a, b, c, d; - a = (long & (0xff << 24)) >>> 24; - b = (long & (0xff << 16)) >>> 16; - c = (long & (0xff << 8)) >>> 8; - d = long & 0xff; - return [a, b, c, d].join('.'); - }; - ip2long = function(ip) { - var b, c, i, j, n, ref; - b = []; - for (i = j = 0; j <= 3; i = ++j) { - if (ip.length === 0) { - break; - } - if (i > 0) { - if (ip[0] !== '.') { - throw new Error('Invalid IP'); - } - ip = ip.substring(1); - } - ref = atob(ip), n = ref[0], c = ref[1]; - ip = ip.substring(c); - b.push(n); - } - if (ip.length !== 0) { - throw new Error('Invalid IP'); - } - switch (b.length) { - case 1: - if (b[0] > 0xFFFFFFFF) { - throw new Error('Invalid IP'); - } - return b[0] >>> 0; - case 2: - if (b[0] > 0xFF || b[1] > 0xFFFFFF) { - throw new Error('Invalid IP'); - } - return (b[0] << 24 | b[1]) >>> 0; - case 3: - if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFFFF) { - throw new Error('Invalid IP'); - } - return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0; - case 4: - if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFF || b[3] > 0xFF) { - throw new Error('Invalid IP'); - } - return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0; - default: - throw new Error('Invalid IP'); - } - }; - chr = function(b) { - return b.charCodeAt(0); - }; - chr0 = chr('0'); - chra = chr('a'); - chrA = chr('A'); - atob = function(s) { - var base, dmax, i, n, start; - n = 0; - base = 10; - dmax = '9'; - i = 0; - if (s.length > 1 && s[i] === '0') { - if (s[i + 1] === 'x' || s[i + 1] === 'X') { - i += 2; - base = 16; - } else if ('0' <= s[i + 1] && s[i + 1] <= '9') { - i++; - base = 8; - dmax = '7'; - } - } - start = i; - while (i < s.length) { - if ('0' <= s[i] && s[i] <= dmax) { - n = (n * base + (chr(s[i]) - chr0)) >>> 0; - } else if (base === 16) { - if ('a' <= s[i] && s[i] <= 'f') { - n = (n * base + (10 + chr(s[i]) - chra)) >>> 0; - } else if ('A' <= s[i] && s[i] <= 'F') { - n = (n * base + (10 + chr(s[i]) - chrA)) >>> 0; - } else { - break; + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } + } + function inferValue(value) { + if (value === "undefined") { + return undefined; + } + if (value === "false") { + return false; + } + if (value === "true") { + return true; + } + if (value === "null") { + return null; + } + if (value === "NaN") { + return NaN; + } + var MAX_ALLOWED_NUM = 32767; + var numVal = Number(value); + if (!nativeIsNaN(numVal)) { + if (Math.abs(numVal) > MAX_ALLOWED_NUM) { + throw new Error("number values bigger than 32767 are not allowed"); + } + return numVal; + } + var errorMessage = "'".concat(value, "' value type can't be inferred"); + try { + var parsableVal = JSON.parse(value); + if (parsableVal instanceof Object || typeof parsableVal === "string") { + return parsableVal; + } + } catch (e) { + errorMessage += ": ".concat(e); + } + throw new TypeError(errorMessage); + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function getPropertyInChain(base, chain) { + var pos = chain.indexOf("."); + if (pos === -1) { + return { + base: base, + prop: chain + }; + } + var prop = chain.slice(0, pos); + if (base === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + var nextBase = base[prop]; + chain = chain.slice(pos + 1); + if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { + return { + base: base, + prop: prop, + chain: chain + }; } - } else { - break; + if (nextBase === null) { + return { + base: base, + prop: prop, + chain: chain + }; + } + if (nextBase !== undefined) { + return getPropertyInChain(nextBase, chain); + } + Object.defineProperty(base, prop, { + configurable: true + }); + return { + base: base, + prop: prop, + chain: chain + }; } - if (n > 0xFFFFFFFF) { - throw new Error('too large'); + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); } - i++; - } - if (i === start) { - throw new Error('empty octet'); - } - return [n, i]; - }; - Netmask = (function() { - function Netmask(net, mask) { - var i, j, ref; - if (typeof net !== 'string') { - throw new Error("Missing `net' parameter"); + function matchStackTrace(stackMatch, stackTrace) { + if (!stackMatch || stackMatch === "") { + return true; + } + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { + return true; + } + var stackRegexp = toRegExp(stackMatch); + var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }).join("\n"); + return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } - if (!mask) { - ref = net.split('/', 2), net = ref[0], mask = ref[1]; + function nativeIsNaN(num) { + var native = Number.isNaN || window.isNaN; + return native(num); } - if (!mask) { - mask = 32; + function isEmptyObject(obj) { + return Object.keys(obj).length === 0 && !obj.prototype; } - if (typeof mask === 'string' && mask.indexOf('.') > -1) { - try { - this.maskLong = ip2long(mask); - } catch (error1) { - throw new Error("Invalid mask: " + mask); + function getNativeRegexpTest() { + var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "test"); + var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value; + if (descriptor && typeof descriptor.value === "function") { + return nativeRegexTest; } - for (i = j = 32; j >= 0; i = --j) { - if (this.maskLong === (0xffffffff << (32 - i)) >>> 0) { - this.bitmask = i; - break; - } + throw new Error("RegExp.prototype.test is not a function"); + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(match) { + return match.includes(INLINE_SCRIPT_STRING); + }; + var isInjectedScript = function isInjectedScript(match) { + return match.includes(INJECTED_SCRIPT_STRING); + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; } - } else if (mask || mask === 0) { - this.bitmask = parseInt(mask, 10); - this.maskLong = 0; - if (this.bitmask > 0) { - this.maskLong = (0xffffffff << (32 - this.bitmask)) >>> 0; + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); } - } else { - throw new Error("Invalid mask: empty"); + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var _stackURL, _stackURL2; + var stackURL = getStackTraceURL[2]; + if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith("(")) { + stackURL = stackURL.slice(1); + } + if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) { + var _stackFunction; + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith("at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - this.netLong = (ip2long(net) & this.maskLong) >>> 0; - } catch (error1) { - throw new Error("Invalid net address: " + net); - } - if (!(this.bitmask <= 32)) { - throw new Error("Invalid mask for ip4: " + mask); - } - this.size = Math.pow(2, 32 - this.bitmask); - this.base = long2ip(this.netLong); - this.mask = long2ip(this.maskLong); - this.hostmask = long2ip(~this.maskLong); - this.first = this.bitmask <= 30 ? long2ip(this.netLong + 1) : this.base; - this.last = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 2) : long2ip(this.netLong + this.size - 1); - this.broadcast = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 1) : void 0; - } - Netmask.prototype.contains = function(ip) { - if (typeof ip === 'string' && (ip.indexOf('/') > 0 || ip.split('.').length !== 4)) { - ip = new Netmask(ip); - } - if (ip instanceof Netmask) { - return this.contains(ip.base) && this.contains(ip.broadcast || ip.last); - } else { - return (ip2long(ip) & this.maskLong) >>> 0 === (this.netLong & this.maskLong) >>> 0; - } - }; - Netmask.prototype.next = function(count) { - if (count == null) { - count = 1; - } - return new Netmask(long2ip(this.netLong + (this.size * count)), this.mask); - }; - Netmask.prototype.forEach = function(fn) { - var index, lastLong, long; - long = ip2long(this.first); - lastLong = ip2long(this.last); - index = 0; - while (long <= lastLong) { - fn(long2ip(long), long, index); - index++; - long++; - } - }; - Netmask.prototype.toString = function() { - return this.base + "/" + this.bitmask; - }; - return Netmask; - })(); - Netmask_1 = Netmask; -}).call(commonjsGlobal); - -var global$2 = (typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : - typeof self !== "undefined" ? self : - typeof window !== "undefined" ? window : {}); - -var lookup$1 = []; -var revLookup$1 = []; -var Arr$1 = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; -var inited$1 = false; -function init$1 () { - inited$1 = true; - var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - for (var i = 0, len = code.length; i < len; ++i) { - lookup$1[i] = code[i]; - revLookup$1[code.charCodeAt(i)] = i; - } - revLookup$1['-'.charCodeAt(0)] = 62; - revLookup$1['_'.charCodeAt(0)] = 63; -} -function toByteArray$1 (b64) { - if (!inited$1) { - init$1(); - } - var i, j, l, tmp, placeHolders, arr; - var len = b64.length; - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; - arr = new Arr$1(len * 3 / 4 - placeHolders); - l = placeHolders > 0 ? len - 4 : len; - var L = 0; - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup$1[b64.charCodeAt(i)] << 18) | (revLookup$1[b64.charCodeAt(i + 1)] << 12) | (revLookup$1[b64.charCodeAt(i + 2)] << 6) | revLookup$1[b64.charCodeAt(i + 3)]; - arr[L++] = (tmp >> 16) & 0xFF; - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - if (placeHolders === 2) { - tmp = (revLookup$1[b64.charCodeAt(i)] << 2) | (revLookup$1[b64.charCodeAt(i + 1)] >> 4); - arr[L++] = tmp & 0xFF; - } else if (placeHolders === 1) { - tmp = (revLookup$1[b64.charCodeAt(i)] << 10) | (revLookup$1[b64.charCodeAt(i + 1)] << 4) | (revLookup$1[b64.charCodeAt(i + 2)] >> 2); - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - return arr -} -function tripletToBase64$1 (num) { - return lookup$1[num >> 18 & 0x3F] + lookup$1[num >> 12 & 0x3F] + lookup$1[num >> 6 & 0x3F] + lookup$1[num & 0x3F] -} -function encodeChunk$1 (uint8, start, end) { - var tmp; - var output = []; - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); - output.push(tripletToBase64$1(tmp)); - } - return output.join('') -} -function fromByteArray$1 (uint8) { - if (!inited$1) { - init$1(); - } - var tmp; - var len = uint8.length; - var extraBytes = len % 3; - var output = ''; - var parts = []; - var maxChunkLength = 16383; - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk$1(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); - } - if (extraBytes === 1) { - tmp = uint8[len - 1]; - output += lookup$1[tmp >> 2]; - output += lookup$1[(tmp << 4) & 0x3F]; - output += '=='; - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); - output += lookup$1[tmp >> 10]; - output += lookup$1[(tmp >> 4) & 0x3F]; - output += lookup$1[(tmp << 2) & 0x3F]; - output += '='; - } - parts.push(output); - return parts.join('') -} - -function read$1 (buffer, offset, isLE, mLen, nBytes) { - var e, m; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var nBits = -7; - var i = isLE ? (nBytes - 1) : 0; - var d = isLE ? -1 : 1; - var s = buffer[offset + i]; - i += d; - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} -function write$1 (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); - var i = isLE ? 0 : (nBytes - 1); - var d = isLE ? 1 : -1; - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - value = Math.abs(value); - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - buffer[offset + i - d] |= s * 128; -} - -var toString$1 = {}.toString; -var isArray$3 = Array.isArray || function (arr) { - return toString$1.call(arr) == '[object Array]'; -}; - -var INSPECT_MAX_BYTES$1 = 50; -Buffer$1.TYPED_ARRAY_SUPPORT = global$2.TYPED_ARRAY_SUPPORT !== undefined - ? global$2.TYPED_ARRAY_SUPPORT - : true; -kMaxLength$1(); -function kMaxLength$1 () { - return Buffer$1.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} -function createBuffer$1 (that, length) { - if (kMaxLength$1() < length) { - throw new RangeError('Invalid typed array length') - } - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - that = new Uint8Array(length); - that.__proto__ = Buffer$1.prototype; - } else { - if (that === null) { - that = new Buffer$1(length); - } - that.length = length; - } - return that -} -function Buffer$1 (arg, encodingOrOffset, length) { - if (!Buffer$1.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer$1)) { - return new Buffer$1(arg, encodingOrOffset, length) - } - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' - ) - } - return allocUnsafe$1(this, arg) - } - return from$1(this, arg, encodingOrOffset, length) -} -Buffer$1.poolSize = 8192; -Buffer$1._augment = function (arr) { - arr.__proto__ = Buffer$1.prototype; - return arr -}; -function from$1 (that, value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer$1(that, value, encodingOrOffset, length) - } - if (typeof value === 'string') { - return fromString$1(that, value, encodingOrOffset) - } - return fromObject$1(that, value) -} -Buffer$1.from = function (value, encodingOrOffset, length) { - return from$1(null, value, encodingOrOffset, length) -}; -if (Buffer$1.TYPED_ARRAY_SUPPORT) { - Buffer$1.prototype.__proto__ = Uint8Array.prototype; - Buffer$1.__proto__ = Uint8Array; - if (typeof Symbol !== 'undefined' && Symbol.species && - Buffer$1[Symbol.species] === Buffer$1) ; -} -function assertSize$1 (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be a number') - } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') - } -} -function alloc$1 (that, size, fill, encoding) { - assertSize$1(size); - if (size <= 0) { - return createBuffer$1(that, size) - } - if (fill !== undefined) { - return typeof encoding === 'string' - ? createBuffer$1(that, size).fill(fill, encoding) - : createBuffer$1(that, size).fill(fill) - } - return createBuffer$1(that, size) -} -Buffer$1.alloc = function (size, fill, encoding) { - return alloc$1(null, size, fill, encoding) -}; -function allocUnsafe$1 (that, size) { - assertSize$1(size); - that = createBuffer$1(that, size < 0 ? 0 : checked$1(size) | 0); - if (!Buffer$1.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0; - } - } - return that -} -Buffer$1.allocUnsafe = function (size) { - return allocUnsafe$1(null, size) -}; -Buffer$1.allocUnsafeSlow = function (size) { - return allocUnsafe$1(null, size) -}; -function fromString$1 (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8'; - } - if (!Buffer$1.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - var length = byteLength$1(string, encoding) | 0; - that = createBuffer$1(that, length); - var actual = that.write(string, encoding); - if (actual !== length) { - that = that.slice(0, actual); - } - return that -} -function fromArrayLike$1 (that, array) { - var length = array.length < 0 ? 0 : checked$1(array.length) | 0; - that = createBuffer$1(that, length); - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255; - } - return that -} -function fromArrayBuffer$1 (that, array, byteOffset, length) { - array.byteLength; - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('\'offset\' is out of bounds') - } - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('\'length\' is out of bounds') - } - if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array); - } else if (length === undefined) { - array = new Uint8Array(array, byteOffset); - } else { - array = new Uint8Array(array, byteOffset, length); - } - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - that = array; - that.__proto__ = Buffer$1.prototype; - } else { - that = fromArrayLike$1(that, array); - } - return that -} -function fromObject$1 (that, obj) { - if (internalIsBuffer$1(obj)) { - var len = checked$1(obj.length) | 0; - that = createBuffer$1(that, len); - if (that.length === 0) { - return that - } - obj.copy(that, 0, 0, len); - return that - } - if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan$1(obj.length)) { - return createBuffer$1(that, 0) + trustedSetConstant.apply(this, updatedArgs); + } catch (e) { + console.log(e); } - return fromArrayLike$1(that, obj) - } - if (obj.type === 'Buffer' && isArray$3(obj.data)) { - return fromArrayLike$1(that, obj.data) - } - } - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') -} -function checked$1 (length) { - if (length >= kMaxLength$1()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength$1().toString(16) + ' bytes') - } - return length | 0 -} -Buffer$1.isBuffer = isBuffer$2; -function internalIsBuffer$1 (b) { - return !!(b != null && b._isBuffer) -} -Buffer$1.compare = function compare (a, b) { - if (!internalIsBuffer$1(a) || !internalIsBuffer$1(b)) { - throw new TypeError('Arguments must be Buffers') - } - if (a === b) return 0 - var x = a.length; - var y = b.length; - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break - } - } - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; -Buffer$1.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -}; -Buffer$1.concat = function concat (list, length) { - if (!isArray$3(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - if (list.length === 0) { - return Buffer$1.alloc(0) - } - var i; - if (length === undefined) { - length = 0; - for (i = 0; i < list.length; ++i) { - length += list[i].length; - } - } - var buffer = Buffer$1.allocUnsafe(length); - var pos = 0; - for (i = 0; i < list.length; ++i) { - var buf = list[i]; - if (!internalIsBuffer$1(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos); - pos += buf.length; - } - return buffer -}; -function byteLength$1 (string, encoding) { - if (internalIsBuffer$1(string)) { - return string.length - } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - string = '' + string; - } - var len = string.length; - if (len === 0) return 0 - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - case undefined: - return utf8ToBytes$1(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes$1(string).length - default: - if (loweredCase) return utf8ToBytes$1(string).length - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -} -Buffer$1.byteLength = byteLength$1; -function slowToString$1 (encoding, start, end) { - var loweredCase = false; - if (start === undefined || start < 0) { - start = 0; - } - if (start > this.length) { - return '' - } - if (end === undefined || end > this.length) { - end = this.length; - } - if (end <= 0) { - return '' - } - end >>>= 0; - start >>>= 0; - if (end <= start) { - return '' - } - if (!encoding) encoding = 'utf8'; - while (true) { - switch (encoding) { - case 'hex': - return hexSlice$1(this, start, end) - case 'utf8': - case 'utf-8': - return utf8Slice$1(this, start, end) - case 'ascii': - return asciiSlice$1(this, start, end) - case 'latin1': - case 'binary': - return latin1Slice$1(this, start, end) - case 'base64': - return base64Slice$1(this, start, end) - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice$1(this, start, end) - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase(); - loweredCase = true; - } - } -} -Buffer$1.prototype._isBuffer = true; -function swap$1 (b, n, m) { - var i = b[n]; - b[n] = b[m]; - b[m] = i; -} -Buffer$1.prototype.swap16 = function swap16 () { - var len = this.length; - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap$1(this, i, i + 1); - } - return this -}; -Buffer$1.prototype.swap32 = function swap32 () { - var len = this.length; - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap$1(this, i, i + 3); - swap$1(this, i + 1, i + 2); - } - return this -}; -Buffer$1.prototype.swap64 = function swap64 () { - var len = this.length; - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap$1(this, i, i + 7); - swap$1(this, i + 1, i + 6); - swap$1(this, i + 2, i + 5); - swap$1(this, i + 3, i + 4); - } - return this -}; -Buffer$1.prototype.toString = function toString () { - var length = this.length | 0; - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice$1(this, 0, length) - return slowToString$1.apply(this, arguments) -}; -Buffer$1.prototype.equals = function equals (b) { - if (!internalIsBuffer$1(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer$1.compare(this, b) === 0 -}; -Buffer$1.prototype.inspect = function inspect () { - var str = ''; - var max = INSPECT_MAX_BYTES$1; - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); - if (this.length > max) str += ' ... '; - } - return '' -}; -Buffer$1.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (!internalIsBuffer$1(target)) { - throw new TypeError('Argument must be a Buffer') - } - if (start === undefined) { - start = 0; - } - if (end === undefined) { - end = target ? target.length : 0; - } - if (thisStart === undefined) { - thisStart = 0; - } - if (thisEnd === undefined) { - thisEnd = this.length; - } - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - start >>>= 0; - end >>>= 0; - thisStart >>>= 0; - thisEnd >>>= 0; - if (this === target) return 0 - var x = thisEnd - thisStart; - var y = end - start; - var len = Math.min(x, y); - var thisCopy = this.slice(thisStart, thisEnd); - var targetCopy = target.slice(start, end); - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i]; - y = targetCopy[i]; - break } - } - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; -function bidirectionalIndexOf$1 (buffer, val, byteOffset, encoding, dir) { - if (buffer.length === 0) return -1 - if (typeof byteOffset === 'string') { - encoding = byteOffset; - byteOffset = 0; - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff; - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000; - } - byteOffset = +byteOffset; - if (isNaN(byteOffset)) { - byteOffset = dir ? 0 : (buffer.length - 1); - } - if (byteOffset < 0) byteOffset = buffer.length + byteOffset; - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1; - } else if (byteOffset < 0) { - if (dir) byteOffset = 0; - else return -1 - } - if (typeof val === 'string') { - val = Buffer$1.from(val, encoding); - } - if (internalIsBuffer$1(val)) { - if (val.length === 0) { - return -1 - } - return arrayIndexOf$1(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF; - if (Buffer$1.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + function trustedSetCookie(source, args) { + function trustedSetCookie(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; + if (typeof name === "undefined") { + logMessage(source, "Cookie name should be specified"); + return; + } + if (typeof value === "undefined") { + logMessage(source, "Cookie value should be specified"); + return; + } + var parsedValue = parseKeywordValue(value); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; + } + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + } + document.cookie = cookieToSet; + hit(source); } - } - return arrayIndexOf$1(buffer, [ val ], byteOffset, encoding, dir) - } - throw new TypeError('val must be string, number or Buffer') -} -function arrayIndexOf$1 (arr, val, byteOffset, encoding, dir) { - var indexSize = 1; - var arrLength = arr.length; - var valLength = val.length; - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase(); - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2; - arrLength /= 2; - valLength /= 2; - byteOffset /= 2; - } - } - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - var i; - if (dir) { - var foundIndex = -1; - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i; - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex; - foundIndex = -1; + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; - for (i = byteOffset; i >= 0; i--) { - var found = true; - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false; - break + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; } + nativeConsole("".concat(name, ": ").concat(message)); } - if (found) return i - } - } - return -1 -} -Buffer$1.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -}; -Buffer$1.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf$1(this, val, byteOffset, encoding, true) -}; -Buffer$1.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf$1(this, val, byteOffset, encoding, false) -}; -function hexWrite$1 (buf, string, offset, length) { - offset = Number(offset) || 0; - var remaining = buf.length - offset; - if (!length) { - length = remaining; - } else { - length = Number(length); - if (length > remaining) { - length = remaining; - } - } - var strLen = string.length; - if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') - if (length > strLen / 2) { - length = strLen / 2; - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16); - if (isNaN(parsed)) return i - buf[offset + i] = parsed; - } - return i -} -function utf8Write$1 (buf, string, offset, length) { - return blitBuffer$1(utf8ToBytes$1(string, buf.length - offset), buf, offset, length) -} -function asciiWrite$1 (buf, string, offset, length) { - return blitBuffer$1(asciiToBytes$1(string), buf, offset, length) -} -function latin1Write$1 (buf, string, offset, length) { - return asciiWrite$1(buf, string, offset, length) -} -function base64Write$1 (buf, string, offset, length) { - return blitBuffer$1(base64ToBytes$1(string), buf, offset, length) -} -function ucs2Write$1 (buf, string, offset, length) { - return blitBuffer$1(utf16leToBytes$1(string, buf.length - offset), buf, offset, length) -} -Buffer$1.prototype.write = function write (string, offset, length, encoding) { - if (offset === undefined) { - encoding = 'utf8'; - length = this.length; - offset = 0; - } else if (length === undefined && typeof offset === 'string') { - encoding = offset; - length = this.length; - offset = 0; - } else if (isFinite(offset)) { - offset = offset | 0; - if (isFinite(length)) { - length = length | 0; - if (encoding === undefined) encoding = 'utf8'; - } else { - encoding = length; - length = undefined; - } - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - var remaining = this.length - offset; - if (length === undefined || length > remaining) length = remaining; - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } - if (!encoding) encoding = 'utf8'; - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite$1(this, string, offset, length) - case 'utf8': - case 'utf-8': - return utf8Write$1(this, string, offset, length) - case 'ascii': - return asciiWrite$1(this, string, offset, length) - case 'latin1': - case 'binary': - return latin1Write$1(this, string, offset, length) - case 'base64': - return base64Write$1(this, string, offset, length) - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write$1(this, string, offset, length) - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -}; -Buffer$1.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -}; -function base64Slice$1 (buf, start, end) { - if (start === 0 && end === buf.length) { - return fromByteArray$1(buf) - } else { - return fromByteArray$1(buf.slice(start, end)) - } -} -function utf8Slice$1 (buf, start, end) { - end = Math.min(buf.length, end); - var res = []; - var i = start; - while (i < end) { - var firstByte = buf[i]; - var codePoint = null; - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1; - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint; - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte; + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getTrustedCookieOffsetMs(offsetExpiresSec) { + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + if (Number.isNaN(parsedSec)) { + return null; } - break - case 2: - secondByte = buf[i + 1]; - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint; - } - } - break - case 3: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint; - } - } - break - case 4: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - fourthByte = buf[i + 3]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint; - } - } - } - } - if (codePoint === null) { - codePoint = 0xFFFD; - bytesPerSequence = 1; - } else if (codePoint > 0xFFFF) { - codePoint -= 0x10000; - res.push(codePoint >>> 10 & 0x3FF | 0xD800); - codePoint = 0xDC00 | codePoint & 0x3FF; - } - res.push(codePoint); - i += bytesPerSequence; - } - return decodeCodePointsArray$1(res) -} -var MAX_ARGUMENTS_LENGTH$1 = 0x1000; -function decodeCodePointsArray$1 (codePoints) { - var len = codePoints.length; - if (len <= MAX_ARGUMENTS_LENGTH$1) { - return String.fromCharCode.apply(String, codePoints) - } - var res = ''; - var i = 0; - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH$1) - ); - } - return res -} -function asciiSlice$1 (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F); - } - return ret -} -function latin1Slice$1 (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]); - } - return ret -} -function hexSlice$1 (buf, start, end) { - var len = buf.length; - if (!start || start < 0) start = 0; - if (!end || end < 0 || end > len) end = len; - var out = ''; - for (var i = start; i < end; ++i) { - out += toHex$1(buf[i]); - } - return out -} -function utf16leSlice$1 (buf, start, end) { - var bytes = buf.slice(start, end); - var res = ''; - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); - } - return res -} -Buffer$1.prototype.slice = function slice (start, end) { - var len = this.length; - start = ~~start; - end = end === undefined ? len : ~~end; - if (start < 0) { - start += len; - if (start < 0) start = 0; - } else if (start > len) { - start = len; - } - if (end < 0) { - end += len; - if (end < 0) end = 0; - } else if (end > len) { - end = len; - } - if (end < start) end = start; - var newBuf; - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end); - newBuf.__proto__ = Buffer$1.prototype; - } else { - var sliceLen = end - start; - newBuf = new Buffer$1(sliceLen, undefined); - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start]; - } - } - return newBuf -}; -function checkOffset$1 (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} -Buffer$1.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset$1(offset, byteLength, this.length); - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - return val -}; -Buffer$1.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - checkOffset$1(offset, byteLength, this.length); - } - var val = this[offset + --byteLength]; - var mul = 1; - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul; - } - return val -}; -Buffer$1.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 1, this.length); - return this[offset] -}; -Buffer$1.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 2, this.length); - return this[offset] | (this[offset + 1] << 8) -}; -Buffer$1.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 2, this.length); - return (this[offset] << 8) | this[offset + 1] -}; -Buffer$1.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 4, this.length); - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -}; -Buffer$1.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 4, this.length); - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -}; -Buffer$1.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset$1(offset, byteLength, this.length); - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - mul *= 0x80; - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - return val -}; -Buffer$1.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset$1(offset, byteLength, this.length); - var i = byteLength; - var mul = 1; - var val = this[offset + --i]; - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul; - } - mul *= 0x80; - if (val >= mul) val -= Math.pow(2, 8 * byteLength); - return val -}; -Buffer$1.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 1, this.length); - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -}; -Buffer$1.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 2, this.length); - var val = this[offset] | (this[offset + 1] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; -Buffer$1.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 2, this.length); - var val = this[offset + 1] | (this[offset] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; -Buffer$1.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 4, this.length); - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -}; -Buffer$1.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 4, this.length); - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -}; -Buffer$1.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 4, this.length); - return read$1(this, offset, true, 23, 4) -}; -Buffer$1.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 4, this.length); - return read$1(this, offset, false, 23, 4) -}; -Buffer$1.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 8, this.length); - return read$1(this, offset, true, 52, 8) -}; -Buffer$1.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset$1(offset, 8, this.length); - return read$1(this, offset, false, 52, 8) -}; -function checkInt$1 (buf, value, offset, ext, max, min) { - if (!internalIsBuffer$1(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} -Buffer$1.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt$1(this, value, offset, byteLength, maxBytes, 0); - } - var mul = 1; - var i = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - return offset + byteLength -}; -Buffer$1.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt$1(this, value, offset, byteLength, maxBytes, 0); - } - var i = byteLength - 1; - var mul = 1; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - return offset + byteLength -}; -Buffer$1.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 1, 0xff, 0); - if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - this[offset] = (value & 0xff); - return offset + 1 -}; -function objectWriteUInt16$1 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8; - } -} -Buffer$1.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0); - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16$1(this, value, offset, true); - } - return offset + 2 -}; -Buffer$1.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0); - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16$1(this, value, offset, false); - } - return offset + 2 -}; -function objectWriteUInt32$1 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; - } -} -Buffer$1.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0); - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24); - this[offset + 2] = (value >>> 16); - this[offset + 1] = (value >>> 8); - this[offset] = (value & 0xff); - } else { - objectWriteUInt32$1(this, value, offset, true); - } - return offset + 4 -}; -Buffer$1.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0); - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32$1(this, value, offset, false); - } - return offset + 4 -}; -Buffer$1.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - checkInt$1(this, value, offset, byteLength, limit - 1, -limit); - } - var i = 0; - var mul = 1; - var sub = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - return offset + byteLength -}; -Buffer$1.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - checkInt$1(this, value, offset, byteLength, limit - 1, -limit); - } - var i = byteLength - 1; - var mul = 1; - var sub = 0; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - return offset + byteLength -}; -Buffer$1.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 1, 0x7f, -0x80); - if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - if (value < 0) value = 0xff + value + 1; - this[offset] = (value & 0xff); - return offset + 1 -}; -Buffer$1.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000); - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16$1(this, value, offset, true); - } - return offset + 2 -}; -Buffer$1.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000); - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16$1(this, value, offset, false); - } - return offset + 2 -}; -Buffer$1.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000); - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - this[offset + 2] = (value >>> 16); - this[offset + 3] = (value >>> 24); - } else { - objectWriteUInt32$1(this, value, offset, true); - } - return offset + 4 -}; -Buffer$1.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000); - if (value < 0) value = 0xffffffff + value + 1; - if (Buffer$1.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32$1(this, value, offset, false); - } - return offset + 4 -}; -function checkIEEE754$1 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} -function writeFloat$1 (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754$1(buf, value, offset, 4); - } - write$1(buf, value, offset, littleEndian, 23, 4); - return offset + 4 -} -Buffer$1.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat$1(this, value, offset, true, noAssert) -}; -Buffer$1.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat$1(this, value, offset, false, noAssert) -}; -function writeDouble$1 (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754$1(buf, value, offset, 8); - } - write$1(buf, value, offset, littleEndian, 52, 8); - return offset + 8 -} -Buffer$1.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble$1(this, value, offset, true, noAssert) -}; -Buffer$1.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble$1(this, value, offset, false, noAssert) -}; -Buffer$1.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0; - if (!end && end !== 0) end = this.length; - if (targetStart >= target.length) targetStart = target.length; - if (!targetStart) targetStart = 0; - if (end > 0 && end < start) end = start; - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - if (end > this.length) end = this.length; - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start; - } - var len = end - start; - var i; - if (this === target && start < targetStart && targetStart < end) { - for (i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start]; - } - } else if (len < 1000 || !Buffer$1.TYPED_ARRAY_SUPPORT) { - for (i = 0; i < len; ++i) { - target[i + targetStart] = this[i + start]; - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, start + len), - targetStart - ); - } - return len -}; -Buffer$1.prototype.fill = function fill (val, start, end, encoding) { - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start; - start = 0; - end = this.length; - } else if (typeof end === 'string') { - encoding = end; - end = this.length; - } - if (val.length === 1) { - var code = val.charCodeAt(0); - if (code < 256) { - val = code; - } - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer$1.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - } else if (typeof val === 'number') { - val = val & 255; - } - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - if (end <= start) { - return this - } - start = start >>> 0; - end = end === undefined ? this.length : end >>> 0; - if (!val) val = 0; - var i; - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val; - } - } else { - var bytes = internalIsBuffer$1(val) - ? val - : utf8ToBytes$1(new Buffer$1(val, encoding).toString()); - var len = bytes.length; - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len]; - } - } - return this -}; -var INVALID_BASE64_RE$1 = /[^+\/0-9A-Za-z-_]/g; -function base64clean$1 (str) { - str = stringtrim$1(str).replace(INVALID_BASE64_RE$1, ''); - if (str.length < 2) return '' - while (str.length % 4 !== 0) { - str = str + '='; - } - return str -} -function stringtrim$1 (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} -function toHex$1 (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} -function utf8ToBytes$1 (string, units) { - units = units || Infinity; - var codePoint; - var length = string.length; - var leadSurrogate = null; - var bytes = []; - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i); - if (codePoint > 0xD7FF && codePoint < 0xE000) { - if (!leadSurrogate) { - if (codePoint > 0xDBFF) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } else if (i + 1 === length) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } - leadSurrogate = codePoint; - continue - } - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - leadSurrogate = codePoint; - continue - } - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; - } else if (leadSurrogate) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - } - leadSurrogate = null; - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint); - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else { - throw new Error('Invalid code point') - } - } - return bytes -} -function asciiToBytes$1 (str) { - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - byteArray.push(str.charCodeAt(i) & 0xFF); - } - return byteArray -} -function utf16leToBytes$1 (str, units) { - var c, hi, lo; - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - c = str.charCodeAt(i); - hi = c >> 8; - lo = c % 256; - byteArray.push(lo); - byteArray.push(hi); - } - return byteArray -} -function base64ToBytes$1 (str) { - return toByteArray$1(base64clean$1(str)) -} -function blitBuffer$1 (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i]; - } - return i -} -function isnan$1 (val) { - return val !== val -} -function isBuffer$2(obj) { - return obj != null && (!!obj._isBuffer || isFastBuffer$1(obj) || isSlowBuffer$1(obj)) -} -function isFastBuffer$1 (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} -function isSlowBuffer$1 (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer$1(obj.slice(0, 0)) -} - -function defaultSetTimout$1() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout$1 () { - throw new Error('clearTimeout has not been defined'); -} -var cachedSetTimeout$1 = defaultSetTimout$1; -var cachedClearTimeout$1 = defaultClearTimeout$1; -if (typeof global$2.setTimeout === 'function') { - cachedSetTimeout$1 = setTimeout; -} -if (typeof global$2.clearTimeout === 'function') { - cachedClearTimeout$1 = clearTimeout; -} -function runTimeout$1(fun) { - if (cachedSetTimeout$1 === setTimeout) { - return setTimeout(fun, 0); - } - if ((cachedSetTimeout$1 === defaultSetTimout$1 || !cachedSetTimeout$1) && setTimeout) { - cachedSetTimeout$1 = setTimeout; - return setTimeout(fun, 0); + } + return parsedSec * MS_IN_SEC; + } + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); + } + return parsedValue; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + return ""; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedSetCookie.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } - try { - return cachedSetTimeout$1(fun, 0); - } catch(e){ + function trustedSetCookieReload(source, args) { + function trustedSetCookieReload(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; + if (typeof name === "undefined") { + logMessage(source, "Cookie name should be specified"); + return; + } + if (typeof value === "undefined") { + logMessage(source, "Cookie value should be specified"); + return; + } + if (isCookieSetWithValue(document.cookie, name, value)) { + return; + } + var parsedValue = parseKeywordValue(value); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false); + if (!cookieToSet) { + logMessage(source, "Invalid cookie name or value"); + return; + } + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + } + document.cookie = cookieToSet; + hit(source); + var cookieValueToCheck = parseCookieString(document.cookie)[name]; + if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) { + window.location.reload(); + } + } + function hit(source) { + if (source.verbose !== true) { + return; + } try { - return cachedSetTimeout$1.call(null, fun, 0); - } catch(e){ - return cachedSetTimeout$1.call(this, fun, 0); + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function isCookieSetWithValue(cookieString, name, value) { + return cookieString.split(";").some(function (cookieStr) { + var pos = cookieStr.indexOf("="); + if (pos === -1) { + return false; + } + var cookieName = cookieStr.slice(0, pos).trim(); + var cookieValue = cookieStr.slice(pos + 1).trim(); + return name === cookieName && value === cookieValue; + }); + } + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var COOKIE_BREAKER = ";"; + if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || "".concat(rawValue).includes(COOKIE_BREAKER))) { + return null; + } + var name = shouldEncode ? encodeURIComponent(rawName) : rawName; + var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue; + return "".concat(name, "=").concat(value, "; ").concat(getCookiePath(rawPath), ";"); + } + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + function getTrustedCookieOffsetMs(offsetExpiresSec) { + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + if (Number.isNaN(parsedSec)) { + return null; + } + } + return parsedSec * MS_IN_SEC; + } + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); + } + return parsedValue; + } + function parseCookieString(cookieString) { + var COOKIE_DELIMITER = "="; + var COOKIE_PAIRS_DELIMITER = ";"; + var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); + var cookieData = {}; + cookieChunks.forEach(function (singleCookie) { + var cookieKey; + var cookieValue = ""; + var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); + if (delimiterIndex === -1) { + cookieKey = singleCookie.trim(); + } else { + cookieKey = singleCookie.slice(0, delimiterIndex).trim(); + cookieValue = singleCookie.slice(delimiterIndex + 1); + } + cookieData[cookieKey] = cookieValue || null; + }); + return cookieData; + } + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + return ""; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedSetCookieReload.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } -} -function runClearTimeout$1(marker) { - if (cachedClearTimeout$1 === clearTimeout) { - return clearTimeout(marker); - } - if ((cachedClearTimeout$1 === defaultClearTimeout$1 || !cachedClearTimeout$1) && clearTimeout) { - cachedClearTimeout$1 = clearTimeout; - return clearTimeout(marker); - } - try { - return cachedClearTimeout$1(marker); - } catch (e){ + function trustedSetLocalStorageItem(source, args) { + function trustedSetLocalStorageItem(source, key, value) { + if (typeof key === "undefined") { + logMessage(source, "Item key should be specified"); + return; + } + if (typeof value === "undefined") { + logMessage(source, "Item value should be specified"); + return; + } + var parsedValue = parseKeywordValue(value); + var _window = window, + localStorage = _window.localStorage; + setStorageItem(source, localStorage, key, parsedValue); + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; + } try { - return cachedClearTimeout$1.call(null, marker); - } catch (e){ - return cachedClearTimeout$1.call(this, marker); + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } + } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function setStorageItem(source, storage, key, value) { + try { + storage.setItem(key, value); + } catch (e) { + var message = "Unable to set sessionStorage item due to: ".concat(e.message); + logMessage(source, message); + } + } + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); + } + return parsedValue; + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + trustedSetLocalStorageItem.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } } -} -var queue$1 = []; -var draining$1 = false; -var currentQueue$1; -var queueIndex$1 = -1; -function cleanUpNextTick$1() { - if (!draining$1 || !currentQueue$1) { - return; - } - draining$1 = false; - if (currentQueue$1.length) { - queue$1 = currentQueue$1.concat(queue$1); - } else { - queueIndex$1 = -1; - } - if (queue$1.length) { - drainQueue$1(); - } -} -function drainQueue$1() { - if (draining$1) { - return; - } - var timeout = runTimeout$1(cleanUpNextTick$1); - draining$1 = true; - var len = queue$1.length; - while(len) { - currentQueue$1 = queue$1; - queue$1 = []; - while (++queueIndex$1 < len) { - if (currentQueue$1) { - currentQueue$1[queueIndex$1].run(); + function xmlPrune(source, args) { + function xmlPrune(source, propsToRemove) { + var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { + return; + } + var shouldPruneResponse = false; + var urlMatchRegexp = toRegExp(urlToMatch); + var isXML = function isXML(text) { + if (typeof text === "string") { + var trimmedText = text.trim(); + if (trimmedText.startsWith("<") && trimmedText.endsWith(">")) { + return true; + } + } + return false; + }; + var createXMLDocument = function createXMLDocument(text) { + var xmlParser = new DOMParser(); + var xmlDocument = xmlParser.parseFromString(text, "text/xml"); + return xmlDocument; + }; + var isPruningNeeded = function isPruningNeeded(response, propsToRemove) { + if (!isXML(response)) { + return false; + } + var docXML = createXMLDocument(response); + return !!docXML.querySelector(propsToRemove); + }; + var pruneXML = function pruneXML(text) { + if (!isXML(text)) { + shouldPruneResponse = false; + return text; + } + var xmlDoc = createXMLDocument(text); + var errorNode = xmlDoc.querySelector("parsererror"); + if (errorNode) { + return text; + } + if (optionalProp !== "" && xmlDoc.querySelector(optionalProp) === null) { + shouldPruneResponse = false; + return text; + } + var elems = xmlDoc.querySelectorAll(propsToRemove); + if (!elems.length) { + shouldPruneResponse = false; + return text; + } + elems.forEach(function (elem) { + elem.remove(); + }); + var serializer = new XMLSerializer(); + text = serializer.serializeToString(xmlDoc); + return text; + }; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var xhrData; + var openWrapper = function openWrapper(target, thisArg, args) { + xhrData = getXhrData.apply(null, args); + if (matchRequestProps(source, urlToMatch, xhrData)) { + thisArg.shouldBePruned = true; + } + if (thisArg.shouldBePruned) { + thisArg.collectedHeaders = []; + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + thisArg.collectedHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); + } + return Reflect.apply(target, thisArg, args); + }; + var sendWrapper = function sendWrapper(target, thisArg, args) { + var allowedResponseTypeValues = ["", "text"]; + if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) { + return Reflect.apply(target, thisArg, args); + } + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + if (typeof content !== "string") { + return; + } + if (!propsToRemove) { + if (isXML(response)) { + var message = "XMLHttpRequest.open() URL: ".concat(responseURL, "\nresponse: ").concat(response); + logMessage(source, message); + logMessage(source, createXMLDocument(response), true, false); + } + } else { + shouldPruneResponse = isPruningNeeded(response, propsToRemove); + } + var responseContent = shouldPruneResponse ? pruneXML(response) : response; + Object.defineProperties(thisArg, { + readyState: { + value: readyState, + writable: false + }, + responseURL: { + value: responseURL, + writable: false + }, + responseXML: { + value: responseXML, + writable: false + }, + status: { + value: status, + writable: false + }, + statusText: { + value: statusText, + writable: false + }, + response: { + value: responseContent, + writable: false + }, + responseText: { + value: responseContent, + writable: false + } + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + thisArg.collectedHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + thisArg.collectedHeaders = []; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + return undefined; + }; + var openHandler = { + apply: openWrapper + }; + var sendHandler = { + apply: sendWrapper + }; + XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); + XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); + var nativeFetch = window.fetch; + var fetchWrapper = async function fetchWrapper(target, thisArg, args) { + var fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + if (typeof fetchURL !== "string" || fetchURL.length === 0) { + return Reflect.apply(target, thisArg, args); + } + if (urlMatchRegexp.test(fetchURL)) { + var response = await nativeFetch(...args); + var clonedResponse = response.clone(); + var responseText = await response.text(); + shouldPruneResponse = isPruningNeeded(responseText, propsToRemove); + if (!shouldPruneResponse) { + var message = "fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(responseText); + logMessage(source, message); + logMessage(source, createXMLDocument(responseText), true, false); + return clonedResponse; + } + var prunedText = pruneXML(responseText); + if (shouldPruneResponse) { + hit(source); + return new Response(prunedText, { + status: response.status, + statusText: response.statusText, + headers: response.headers + }); } + return clonedResponse; + } + return Reflect.apply(target, thisArg, args); + }; + var fetchHandler = { + apply: fetchWrapper + }; + window.fetch = new Proxy(window.fetch, fetchHandler); + } + function hit(source) { + if (source.verbose !== true) { + return; } - queueIndex$1 = -1; - len = queue$1.length; - } - currentQueue$1 = null; - draining$1 = false; - runClearTimeout$1(timeout); -} -function nextTick$1(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); } - } - queue$1.push(new Item$1(fun, args)); - if (queue$1.length === 1 && !draining$1) { - runTimeout$1(drainQueue$1); - } -} -function Item$1(fun, array) { - this.fun = fun; - this.array = array; -} -Item$1.prototype.run = function () { - this.fun.apply(null, this.array); -}; -var title$1 = 'browser'; -var platform$1 = 'browser'; -var browser$2 = true; -var env$1 = {}; -var argv$1 = []; -var version$1 = ''; -var versions$1 = {}; -var release$1 = {}; -var config$1 = {}; -function noop$2() {} -var on$1 = noop$2; -var addListener$1 = noop$2; -var once$1 = noop$2; -var off$1 = noop$2; -var removeListener$1 = noop$2; -var removeAllListeners$1 = noop$2; -var emit$1 = noop$2; -function binding$1(name) { - throw new Error('process.binding is not supported'); -} -function cwd$1 () { return '/' } -function chdir$1 (dir) { - throw new Error('process.chdir is not supported'); -}function umask$1() { return 0; } -var performance$1 = global$2.performance || {}; -var performanceNow$1 = - performance$1.now || - performance$1.mozNow || - performance$1.msNow || - performance$1.oNow || - performance$1.webkitNow || - function(){ return (new Date()).getTime() }; -function hrtime$1(previousTimestamp){ - var clocktime = performanceNow$1.call(performance$1)*1e-3; - var seconds = Math.floor(clocktime); - var nanoseconds = Math.floor((clocktime%1)*1e9); - if (previousTimestamp) { - seconds = seconds - previousTimestamp[0]; - nanoseconds = nanoseconds - previousTimestamp[1]; - if (nanoseconds<0) { - seconds--; - nanoseconds += 1e9; - } - } - return [seconds,nanoseconds] -} -var startTime$1 = new Date(); -function uptime$1() { - var currentTime = new Date(); - var dif = currentTime - startTime$1; - return dif / 1000; -} -var process = { - nextTick: nextTick$1, - title: title$1, - browser: browser$2, - env: env$1, - argv: argv$1, - version: version$1, - versions: versions$1, - on: on$1, - addListener: addListener$1, - once: once$1, - off: off$1, - removeListener: removeListener$1, - removeAllListeners: removeAllListeners$1, - emit: emit$1, - binding: binding$1, - cwd: cwd$1, - chdir: chdir$1, - umask: umask$1, - hrtime: hrtime$1, - platform: platform$1, - release: release$1, - config: config$1, - uptime: uptime$1 -}; - -var global$1 = (typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : - typeof self !== "undefined" ? self : - typeof window !== "undefined" ? window : {}); - -var lookup = []; -var revLookup = []; -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; -var inited = false; -function init () { - inited = true; - var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i]; - revLookup[code.charCodeAt(i)] = i; - } - - revLookup['-'.charCodeAt(0)] = 62; - revLookup['_'.charCodeAt(0)] = 63; -} - -function toByteArray (b64) { - if (!inited) { - init(); - } - var i, j, l, tmp, placeHolders, arr; - var len = b64.length; - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(len * 3 / 4 - placeHolders); - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len; - - var L = 0; - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; - arr[L++] = (tmp >> 16) & 0xFF; - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); - arr[L++] = tmp & 0xFF; - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); - arr[L++] = (tmp >> 8) & 0xFF; - arr[L++] = tmp & 0xFF; - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp; - var output = []; - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); - output.push(tripletToBase64(tmp)); - } - return output.join('') -} - -function fromByteArray (uint8) { - if (!inited) { - init(); - } - var tmp; - var len = uint8.length; - var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes - var output = ''; - var parts = []; - var maxChunkLength = 16383; // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1]; - output += lookup[tmp >> 2]; - output += lookup[(tmp << 4) & 0x3F]; - output += '=='; - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); - output += lookup[tmp >> 10]; - output += lookup[(tmp >> 4) & 0x3F]; - output += lookup[(tmp << 2) & 0x3F]; - output += '='; - } - - parts.push(output); - - return parts.join('') -} - -function read (buffer, offset, isLE, mLen, nBytes) { - var e, m; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var nBits = -7; - var i = isLE ? (nBytes - 1) : 0; - var d = isLE ? -1 : 1; - var s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -function write (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); - var i = isLE ? 0 : (nBytes - 1); - var d = isLE ? 1 : -1; - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128; -} - -var es_toString = {}.toString; - -var isArray$2 = Array.isArray || function (arr) { - return es_toString.call(arr) == '[object Array]'; -}; - -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -var INSPECT_MAX_BYTES = 50; - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined - ? global$1.TYPED_ARRAY_SUPPORT - : true; - -/* - * Export kMaxLength after typed array support is determined. - */ -kMaxLength(); - -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { - throw new RangeError('Invalid typed array length') - } - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = new Uint8Array(length); - that.__proto__ = Buffer.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - if (that === null) { - that = new Buffer(length); - } - that.length = length; - } - - return that -} - -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - -function Buffer (arg, encodingOrOffset, length) { - if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { - return new Buffer(arg, encodingOrOffset, length) - } - - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' - ) - } - return allocUnsafe(this, arg) - } - return from(this, arg, encodingOrOffset, length) -} - -Buffer.poolSize = 8192; // not used by this implementation - -// TODO: Legacy, not needed anymore. Remove in next major version. -Buffer._augment = function (arr) { - arr.__proto__ = Buffer.prototype; - return arr -}; - -function from (that, value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) - } - - if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) - } - - return fromObject(that, value) -} - -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer.from = function (value, encodingOrOffset, length) { - return from(null, value, encodingOrOffset, length) -}; - -if (Buffer.TYPED_ARRAY_SUPPORT) { - Buffer.prototype.__proto__ = Uint8Array.prototype; - Buffer.__proto__ = Uint8Array; -} - -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be a number') - } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') - } -} - -function alloc (that, size, fill, encoding) { - assertSize(size); - if (size <= 0) { - return createBuffer(that, size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(that, size).fill(fill, encoding) - : createBuffer(that, size).fill(fill) - } - return createBuffer(that, size) -} - -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer.alloc = function (size, fill, encoding) { - return alloc(null, size, fill, encoding) -}; - -function allocUnsafe (that, size) { - assertSize(size); - that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0; - } - } - return that -} - -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer.allocUnsafe = function (size) { - return allocUnsafe(null, size) -}; -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(null, size) -}; - -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8'; - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - - var length = byteLength(string, encoding) | 0; - that = createBuffer(that, length); - - var actual = that.write(string, encoding); - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - that = that.slice(0, actual); - } - - return that -} - -function fromArrayLike (that, array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0; - that = createBuffer(that, length); - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255; - } - return that -} - -function fromArrayBuffer (that, array, byteOffset, length) { - array.byteLength; // this throws if `array` is not a valid ArrayBuffer - - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('\'offset\' is out of bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('\'length\' is out of bounds') - } - - if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array); - } else if (length === undefined) { - array = new Uint8Array(array, byteOffset); - } else { - array = new Uint8Array(array, byteOffset, length); - } - - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = array; - that.__proto__ = Buffer.prototype; - } else { - // Fallback: Return an object instance of the Buffer class - that = fromArrayLike(that, array); - } - return that -} - -function fromObject (that, obj) { - if (internalIsBuffer(obj)) { - var len = checked(obj.length) | 0; - that = createBuffer(that, len); - - if (that.length === 0) { - return that - } - - obj.copy(that, 0, 0, len); - return that - } - - if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan(obj.length)) { - return createBuffer(that, 0) } - return fromArrayLike(that, obj) - } - - if (obj.type === 'Buffer' && isArray$2(obj.data)) { - return fromArrayLike(that, obj.data) - } - } - - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') -} - -function checked (length) { - // Note: cannot use `length < kMaxLength()` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 -} -Buffer.isBuffer = isBuffer$1; -function internalIsBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function compare (a, b) { - if (!internalIsBuffer(a) || !internalIsBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -}; - -Buffer.concat = function concat (list, length) { - if (!isArray$2(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer.alloc(0) - } - - var i; - if (length === undefined) { - length = 0; - for (i = 0; i < list.length; ++i) { - length += list[i].length; - } - } - - var buffer = Buffer.allocUnsafe(length); - var pos = 0; - for (i = 0; i < list.length; ++i) { - var buf = list[i]; - if (!internalIsBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos); - pos += buf.length; - } - return buffer -}; - -function byteLength (string, encoding) { - if (internalIsBuffer(string)) { - return string.length - } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - string = '' + string; - } - - var len = string.length; - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - case undefined: - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -} -Buffer.byteLength = byteLength; - -function slowToString (encoding, start, end) { - var loweredCase = false; - - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. - - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0; - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length; - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0; - start >>>= 0; - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8'; - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase(); - loweredCase = true; - } - } -} - -// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect -// Buffer instances. -Buffer.prototype._isBuffer = true; - -function swap (b, n, m) { - var i = b[n]; - b[n] = b[m]; - b[m] = i; -} - -Buffer.prototype.swap16 = function swap16 () { - var len = this.length; - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1); - } - return this -}; - -Buffer.prototype.swap32 = function swap32 () { - var len = this.length; - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3); - swap(this, i + 1, i + 2); - } - return this -}; - -Buffer.prototype.swap64 = function swap64 () { - var len = this.length; - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7); - swap(this, i + 1, i + 6); - swap(this, i + 2, i + 5); - swap(this, i + 3, i + 4); - } - return this -}; - -Buffer.prototype.toString = function toString () { - var length = this.length | 0; - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -}; - -Buffer.prototype.equals = function equals (b) { - if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -}; - -Buffer.prototype.inspect = function inspect () { - var str = ''; - var max = INSPECT_MAX_BYTES; - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); - if (this.length > max) str += ' ... '; - } - return '' -}; - -Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (!internalIsBuffer(target)) { - throw new TypeError('Argument must be a Buffer') - } - - if (start === undefined) { - start = 0; - } - if (end === undefined) { - end = target ? target.length : 0; - } - if (thisStart === undefined) { - thisStart = 0; - } - if (thisEnd === undefined) { - thisEnd = this.length; - } - - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0; - end >>>= 0; - thisStart >>>= 0; - thisEnd >>>= 0; - - if (this === target) return 0 - - var x = thisEnd - thisStart; - var y = end - start; - var len = Math.min(x, y); - - var thisCopy = this.slice(thisStart, thisEnd); - var targetCopy = target.slice(start, end); - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i]; - y = targetCopy[i]; - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -}; - -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset; - byteOffset = 0; - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff; - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000; - } - byteOffset = +byteOffset; // Coerce to Number. - if (isNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1); - } - - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset; - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1; - } else if (byteOffset < 0) { - if (dir) byteOffset = 0; - else return -1 - } - - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding); - } - - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (internalIsBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF; // Search for a byte value [0-255] - if (Buffer.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var name = source.name, + verbose = source.verbose; + if (!forced && !verbose) { + return; + } + var nativeConsole = console.log; + if (!convertMessageToString) { + nativeConsole("".concat(name, ":"), message); + return; + } + nativeConsole("".concat(name, ": ").concat(message)); + } + function toRegExp() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; + var DEFAULT_VALUE = ".?"; + var FORWARD_SLASH = "/"; + if (input === "") { + return new RegExp(DEFAULT_VALUE); + } + var delimiterIndex = input.lastIndexOf(FORWARD_SLASH); + var flagsPart = input.substring(delimiterIndex + 1); + var regExpPart = input.substring(0, delimiterIndex + 1); + var isValidRegExpFlag = function isValidRegExpFlag(flag) { + if (!flag) { + return false; + } + try { + new RegExp("", flag); + return true; + } catch (ex) { + return false; + } + }; + var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) { + if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith("\\/") && isValidRegExpFlag(flagsStr)) { + return flagsStr; + } + return ""; + }; + var flags = getRegExpFlags(regExpPart, flagsPart); + if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) { + var regExpInput = flags ? regExpPart : input; + return new RegExp(regExpInput.slice(1, -1), flags); + } + var escaped = input.replace(/\\'/g, "'").replace(/\\"/g, '"').replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); } - } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - - throw new TypeError('val must be string, number or Buffer') -} - -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1; - var arrLength = arr.length; - var valLength = val.length; - - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase(); - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 + function getXhrData(method, url, async, user, password) { + return { + method: method, + url: url, + async: async, + user: user, + password: password + }; } - indexSize = 2; - arrLength /= 2; - valLength /= 2; - byteOffset /= 2; - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i; - if (dir) { - var foundIndex = -1; - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i; - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex; - foundIndex = -1; + function matchRequestProps(source, propsToMatch, requestData) { + if (propsToMatch === "" || propsToMatch === "*") { + return true; + } + var isMatched; + var parsedData = parseMatchProps(propsToMatch); + if (!isValidParsedData(parsedData)) { + logMessage(source, "Invalid parameter: ".concat(propsToMatch)); + isMatched = false; + } else { + var matchData = getMatchPropsData(parsedData); + var matchKeys = Object.keys(matchData); + isMatched = matchKeys.every(function (matchKey) { + var matchValue = matchData[matchKey]; + var dataValue = requestData[matchKey]; + return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === "string" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue)); + }); + } + return isMatched; } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; - for (i = byteOffset; i >= 0; i--) { - var found = true; - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false; - break + function getMatchPropsData(data) { + var matchData = {}; + var dataKeys = Object.keys(data); + dataKeys.forEach(function (key) { + matchData[key] = toRegExp(data[key]); + }); + return matchData; + } + function getRequestProps() { + return ["url", "method", "headers", "body", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal", "mode"]; + } + function isValidParsedData(data) { + return Object.values(data).every(function (value) { + return isValidStrPattern(value); + }); + } + function parseMatchProps(propsToMatchStr) { + var PROPS_DIVIDER = " "; + var PAIRS_MARKER = ":"; + var isRequestProp = function isRequestProp(prop) { + return getRequestProps().includes(prop); + }; + var propsObj = {}; + var props = propsToMatchStr.split(PROPS_DIVIDER); + props.forEach(function (prop) { + var dividerInd = prop.indexOf(PAIRS_MARKER); + var key = prop.slice(0, dividerInd); + if (isRequestProp(key)) { + var value = prop.slice(dividerInd + 1); + propsObj[key] = value; + } else { + propsObj.url = prop; + } + }); + return propsObj; + } + function isValidStrPattern(input) { + var FORWARD_SLASH = "/"; + var str = escapeRegExp(input); + if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { + str = input.slice(1, -1); + } + var isValid; + try { + isValid = new RegExp(str); + isValid = true; + } catch (e) { + isValid = false; } + return isValid; + } + function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + try { + xmlPrune.apply(this, updatedArgs); + } catch (e) { + console.log(e); } - if (found) return i } - } - - return -1 -} - -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -}; - -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) -}; + var scriptletsMap = { + "abort-current-inline-script": abortCurrentInlineScript, + "abort-current-script.js": abortCurrentInlineScript, + "ubo-abort-current-script.js": abortCurrentInlineScript, + "acs.js": abortCurrentInlineScript, + "ubo-acs.js": abortCurrentInlineScript, + "ubo-abort-current-script": abortCurrentInlineScript, + "ubo-acs": abortCurrentInlineScript, + "abort-current-inline-script.js": abortCurrentInlineScript, + "ubo-abort-current-inline-script.js": abortCurrentInlineScript, + "acis.js": abortCurrentInlineScript, + "ubo-acis.js": abortCurrentInlineScript, + "ubo-abort-current-inline-script": abortCurrentInlineScript, + "ubo-acis": abortCurrentInlineScript, + "abp-abort-current-inline-script": abortCurrentInlineScript, + "abort-on-property-read": abortOnPropertyRead, + "abort-on-property-read.js": abortOnPropertyRead, + "ubo-abort-on-property-read.js": abortOnPropertyRead, + "aopr.js": abortOnPropertyRead, + "ubo-aopr.js": abortOnPropertyRead, + "ubo-abort-on-property-read": abortOnPropertyRead, + "ubo-aopr": abortOnPropertyRead, + "abp-abort-on-property-read": abortOnPropertyRead, + "abort-on-property-write": abortOnPropertyWrite, + "abort-on-property-write.js": abortOnPropertyWrite, + "ubo-abort-on-property-write.js": abortOnPropertyWrite, + "aopw.js": abortOnPropertyWrite, + "ubo-aopw.js": abortOnPropertyWrite, + "ubo-abort-on-property-write": abortOnPropertyWrite, + "ubo-aopw": abortOnPropertyWrite, + "abp-abort-on-property-write": abortOnPropertyWrite, + "abort-on-stack-trace": abortOnStackTrace, + "abort-on-stack-trace.js": abortOnStackTrace, + "ubo-abort-on-stack-trace.js": abortOnStackTrace, + "aost.js": abortOnStackTrace, + "ubo-aost.js": abortOnStackTrace, + "ubo-abort-on-stack-trace": abortOnStackTrace, + "ubo-aost": abortOnStackTrace, + "abp-abort-on-stack-trace": abortOnStackTrace, + "adjust-setInterval": adjustSetInterval, + "nano-setInterval-booster.js": adjustSetInterval, + "ubo-nano-setInterval-booster.js": adjustSetInterval, + "nano-sib.js": adjustSetInterval, + "ubo-nano-sib.js": adjustSetInterval, + "ubo-nano-setInterval-booster": adjustSetInterval, + "ubo-nano-sib": adjustSetInterval, + "adjust-setTimeout": adjustSetTimeout, + "nano-setTimeout-booster.js": adjustSetTimeout, + "ubo-nano-setTimeout-booster.js": adjustSetTimeout, + "nano-stb.js": adjustSetTimeout, + "ubo-nano-stb.js": adjustSetTimeout, + "ubo-nano-setTimeout-booster": adjustSetTimeout, + "ubo-nano-stb": adjustSetTimeout, + "debug-current-inline-script": debugCurrentInlineScript, + "debug-on-property-read": debugOnPropertyRead, + "debug-on-property-write": debugOnPropertyWrite, + "dir-string": dirString, + "disable-newtab-links": disableNewtabLinks, + "disable-newtab-links.js": disableNewtabLinks, + "ubo-disable-newtab-links.js": disableNewtabLinks, + "ubo-disable-newtab-links": disableNewtabLinks, + "evaldata-prune": evalDataPrune, + "evaldata-prune.js": evalDataPrune, + "ubo-evaldata-prune.js": evalDataPrune, + "ubo-evaldata-prune": evalDataPrune, + "close-window": forceWindowClose, + "window-close-if.js": forceWindowClose, + "ubo-window-close-if.js": forceWindowClose, + "ubo-window-close-if": forceWindowClose, + "hide-in-shadow-dom": hideInShadowDom, + "inject-css-in-shadow-dom": injectCssInShadowDom, + "json-prune": jsonPrune, + "json-prune.js": jsonPrune, + "ubo-json-prune.js": jsonPrune, + "ubo-json-prune": jsonPrune, + "abp-json-prune": jsonPrune, + log: log, + "log-addEventListener": logAddEventListener, + "addEventListener-logger.js": logAddEventListener, + "ubo-addEventListener-logger.js": logAddEventListener, + "aell.js": logAddEventListener, + "ubo-aell.js": logAddEventListener, + "ubo-addEventListener-logger": logAddEventListener, + "ubo-aell": logAddEventListener, + "log-eval": logEval, + "log-on-stack-trace": logOnStacktrace, + "m3u-prune": m3uPrune, + "m3u-prune.js": m3uPrune, + "ubo-m3u-prune.js": m3uPrune, + "ubo-m3u-prune": m3uPrune, + "no-topics": noTopics, + noeval: noeval, + "noeval.js": noeval, + "silent-noeval.js": noeval, + "ubo-noeval.js": noeval, + "ubo-silent-noeval.js": noeval, + "ubo-noeval": noeval, + "ubo-silent-noeval": noeval, + nowebrtc: nowebrtc, + "nowebrtc.js": nowebrtc, + "ubo-nowebrtc.js": nowebrtc, + "ubo-nowebrtc": nowebrtc, + "prevent-addEventListener": preventAddEventListener, + "addEventListener-defuser.js": preventAddEventListener, + "ubo-addEventListener-defuser.js": preventAddEventListener, + "aeld.js": preventAddEventListener, + "ubo-aeld.js": preventAddEventListener, + "ubo-addEventListener-defuser": preventAddEventListener, + "ubo-aeld": preventAddEventListener, + "prevent-adfly": preventAdfly, + "adfly-defuser.js": preventAdfly, + "ubo-adfly-defuser.js": preventAdfly, + "ubo-adfly-defuser": preventAdfly, + "prevent-bab": preventBab, + "prevent-element-src-loading": preventElementSrcLoading, + "prevent-eval-if": preventEvalIf, + "noeval-if.js": preventEvalIf, + "ubo-noeval-if.js": preventEvalIf, + "ubo-noeval-if": preventEvalIf, + "prevent-fab-3.2.0": preventFab, + "nofab.js": preventFab, + "ubo-nofab.js": preventFab, + "fuckadblock.js-3.2.0": preventFab, + "ubo-fuckadblock.js-3.2.0": preventFab, + "ubo-nofab": preventFab, + "prevent-fetch": preventFetch, + "no-fetch-if.js": preventFetch, + "ubo-no-fetch-if.js": preventFetch, + "ubo-no-fetch-if": preventFetch, + "prevent-popads-net": preventPopadsNet, + "popads.net.js": preventPopadsNet, + "ubo-popads.net.js": preventPopadsNet, + "ubo-popads.net": preventPopadsNet, + "prevent-refresh": preventRefresh, + "refresh-defuser.js": preventRefresh, + "refresh-defuser": preventRefresh, + "ubo-refresh-defuser.js": preventRefresh, + "ubo-refresh-defuser": preventRefresh, + "prevent-requestAnimationFrame": preventRequestAnimationFrame, + "no-requestAnimationFrame-if.js": preventRequestAnimationFrame, + "ubo-no-requestAnimationFrame-if.js": preventRequestAnimationFrame, + "norafif.js": preventRequestAnimationFrame, + "ubo-norafif.js": preventRequestAnimationFrame, + "ubo-no-requestAnimationFrame-if": preventRequestAnimationFrame, + "ubo-norafif": preventRequestAnimationFrame, + "prevent-setInterval": preventSetInterval, + "no-setInterval-if.js": preventSetInterval, + "ubo-no-setInterval-if.js": preventSetInterval, + "setInterval-defuser.js": preventSetInterval, + "ubo-setInterval-defuser.js": preventSetInterval, + "nosiif.js": preventSetInterval, + "ubo-nosiif.js": preventSetInterval, + "sid.js": preventSetInterval, + "ubo-sid.js": preventSetInterval, + "ubo-no-setInterval-if": preventSetInterval, + "ubo-setInterval-defuser": preventSetInterval, + "ubo-nosiif": preventSetInterval, + "ubo-sid": preventSetInterval, + "prevent-setTimeout": preventSetTimeout, + "no-setTimeout-if.js": preventSetTimeout, + "ubo-no-setTimeout-if.js": preventSetTimeout, + "nostif.js": preventSetTimeout, + "ubo-nostif.js": preventSetTimeout, + "ubo-no-setTimeout-if": preventSetTimeout, + "ubo-nostif": preventSetTimeout, + "setTimeout-defuser.js": preventSetTimeout, + "ubo-setTimeout-defuser.js": preventSetTimeout, + "ubo-setTimeout-defuser": preventSetTimeout, + "std.js": preventSetTimeout, + "ubo-std.js": preventSetTimeout, + "ubo-std": preventSetTimeout, + "prevent-window-open": preventWindowOpen, + "window.open-defuser.js": preventWindowOpen, + "ubo-window.open-defuser.js": preventWindowOpen, + "ubo-window.open-defuser": preventWindowOpen, + "nowoif.js": preventWindowOpen, + "ubo-nowoif.js": preventWindowOpen, + "ubo-nowoif": preventWindowOpen, + "prevent-xhr": preventXHR, + "no-xhr-if.js": preventXHR, + "ubo-no-xhr-if.js": preventXHR, + "ubo-no-xhr-if": preventXHR, + "remove-attr": removeAttr, + "remove-attr.js": removeAttr, + "ubo-remove-attr.js": removeAttr, + "ra.js": removeAttr, + "ubo-ra.js": removeAttr, + "ubo-remove-attr": removeAttr, + "ubo-ra": removeAttr, + "remove-class": removeClass, + "remove-class.js": removeClass, + "ubo-remove-class.js": removeClass, + "rc.js": removeClass, + "ubo-rc.js": removeClass, + "ubo-remove-class": removeClass, + "ubo-rc": removeClass, + "remove-cookie": removeCookie, + "cookie-remover.js": removeCookie, + "ubo-cookie-remover.js": removeCookie, + "ubo-cookie-remover": removeCookie, + "remove-in-shadow-dom": removeInShadowDom, + "remove-node-text": removeNodeText, + "remove-node-text.js": removeNodeText, + "ubo-remove-node-text.js": removeNodeText, + "rmnt.js": removeNodeText, + "ubo-rmnt.js": removeNodeText, + "ubo-remove-node-text": removeNodeText, + "ubo-rmnt": removeNodeText, + "set-attr": setAttr, + "set-constant": setConstant, + "set-constant.js": setConstant, + "ubo-set-constant.js": setConstant, + "set.js": setConstant, + "ubo-set.js": setConstant, + "ubo-set-constant": setConstant, + "ubo-set": setConstant, + "abp-override-property-read": setConstant, + "set-cookie": setCookie, + "set-cookie-reload": setCookieReload, + "set-local-storage-item": setLocalStorageItem, + "set-popads-dummy": setPopadsDummy, + "popads-dummy.js": setPopadsDummy, + "ubo-popads-dummy.js": setPopadsDummy, + "ubo-popads-dummy": setPopadsDummy, + "set-session-storage-item": setSessionStorageItem, + "trusted-click-element": trustedClickElement, + "trusted-replace-fetch-response": trustedReplaceFetchResponse, + "trusted-replace-node-text": trustedReplaceNodeText, + "trusted-replace-xhr-response": trustedReplaceXhrResponse, + "trusted-set-constant": trustedSetConstant, + "trusted-set-cookie": trustedSetCookie, + "trusted-set-cookie-reload": trustedSetCookieReload, + "trusted-set-local-storage-item": trustedSetLocalStorageItem, + "xml-prune": xmlPrune, + "xml-prune.js": xmlPrune, + "ubo-xml-prune.js": xmlPrune, + "ubo-xml-prune": xmlPrune + }; + var getScriptletFunction = function getScriptletFunction(name) { + return scriptletsMap[name]; + }; -Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) -}; + /** + * @typedef {object} Source Scriptlet properties. + * @property {string} name Scriptlet name. + * @property {Array} args Arguments for scriptlet function. + * @property {'extension'|'corelibs'|'test'} engine Defines the final form of scriptlet string presentation. + * @property {string} [version] Extension version. + * @property {boolean} [verbose] Flag to enable debug information printing to console. + * @property {string} [ruleText] Source rule text, needed for debug purposes. + * @property {string} [domainName] Domain name where scriptlet is applied, needed for debug purposes. + */ -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0; - var remaining = buf.length - offset; - if (!length) { - length = remaining; - } else { - length = Number(length); - if (length > remaining) { - length = remaining; + /** + * Returns scriptlet code by `source`. + * + * @param {Source} source Scriptlet properties. + * + * @returns {string|null} Scriptlet code. + * @throws An error on unknown scriptlet name. + */ + function getScriptletCode(source) { + if (!validator.isValidScriptletName(source.name)) { + return null; + } + var scriptletFunction = getScriptletFunction(source.name); + // In case isValidScriptletName check will pass invalid scriptlet name, + // for example when there is a bad alias + if (typeof scriptletFunction !== 'function') { + throw new Error("Error: cannot invoke scriptlet with name: '".concat(source.name, "'")); + } + var scriptletFunctionString = scriptletFunction.toString(); + var result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString); + return result; } - } - - // must be an even number of digits - var strLen = string.length; - if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') - if (length > strLen / 2) { - length = strLen / 2; - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16); - if (isNaN(parsed)) return i - buf[offset + i] = parsed; - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} + /** + * Scriptlets variable + * + * @returns {object} object with methods: + * `invoke` method receives one argument with `Source` type + * `validate` method receives one argument with `String` type + */ + var scriptletsObject = function () { + return { + invoke: getScriptletCode, + getScriptletFunction, + isValidScriptletName: validator.isValidScriptletName, + isValidScriptletRule, + isAdgScriptletRule: validator.isAdgScriptletRule, + isUboScriptletRule: validator.isUboScriptletRule, + isAbpSnippetRule: validator.isAbpSnippetRule, + convertUboToAdg: convertUboScriptletToAdg, + convertAbpToAdg: convertAbpSnippetToAdg, + convertScriptletToAdg, + convertAdgToUbo: convertAdgScriptletToUbo, + redirects + }; + }(); -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} + /** + * Add module exports to be used as node package + */ + module.exports = scriptletsObject; -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} +})); -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} +/** + * ------------------------------------------- + * | | + * | If you want to add your own scriptlet | + * | please put your code below | + * | | + * ------------------------------------------- + */ -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8'; - length = this.length; - offset = 0; - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset; - length = this.length; - offset = 0; - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0; - if (isFinite(length)) { - length = length | 0; - if (encoding === undefined) encoding = 'utf8'; - } else { - encoding = length; - length = undefined; - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - var remaining = this.length - offset; - if (length === undefined || length > remaining) length = remaining; +/***/ }), - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } +/***/ 3563: +/***/ (function(module) { - if (!encoding) encoding = 'utf8'; +!function(e,t){ true?module.exports=t():0}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=90)}({17:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n=r(18),i=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},e.getAndroidVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),a=Math.max(i,s),o=0,u=e.map([t,r],(function(t){var r=a-e.getVersionPrecision(t),n=t+new Array(r+1).join(".0");return e.map(n.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(n&&(o=a-Math.min(i,s)),a-=1;a>=o;){if(u[0][a]>u[1][a])return 1;if(u[0][a]===u[1][a]){if(a===o)return 0;a-=1}else if(u[0][a]1?i-1:0),a=1;a0){var a=Object.keys(r),u=o.default.find(a,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=o.default.find(a,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(s>0){var l=Object.keys(i),h=o.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(i[h])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=o.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if("string"==typeof i)return">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(n=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(o.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\/(\d+(\.?_?\d+)+)/i,a=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(e){var t={name:"Opera Touch"},r=i.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=i.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},r=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},r=i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=i.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},r=i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=a,e.exports=t.default},93:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/Roku\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return{name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=i.default.getWindowsVersionName(t);return{name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:s.OS_MAP.iOS},r=i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return{name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||i.default.getFirstMatch(/\bbb(\d+)/i,e);return{name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return{name:s.OS_MAP.PlayStation4,version:t}}}];t.default=a,e.exports=t.default},94:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:s.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:s.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return"android"===e.getOSName(!0)&&t>=3},describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}}];t.default=a,e.exports=t.default},95:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return{name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return{name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=a,e.exports=t.default}})})); - var loweredCase = false; - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) +/***/ }), - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) +/***/ 6317: +/***/ (function(__unused_webpack_module, exports) { - case 'ascii': - return asciiWrite(this, string, offset, length) +!function(g,c){ true?c(exports):0}(this,function(g){const c=Symbol("newer"),e=Symbol("older");class n{constructor(a,b){typeof a!=="number"&&(b=a,a=0),this.size=0,this.limit=a,this.oldest=this.newest=void 0,this._keymap=new Map(),b&&(this.assign(b),a<1&&(this.limit=this.size))}_markEntryAsUsed(a){if(a===this.newest)return;a[c]&&(a===this.oldest&&(this.oldest=a[c]),a[c][e]=a[e]),a[e]&&(a[e][c]=a[c]),a[c]=void 0,a[e]=this.newest,this.newest&&(this.newest[c]=a),this.newest=a}assign(a){let b,d=this.limit||Number.MAX_VALUE;this._keymap.clear();let m=a[Symbol.iterator]();for(let h=m.next();!h.done;h=m.next()){let f=new l(h.value[0],h.value[1]);this._keymap.set(f.key,f),b?(b[c]=f,f[e]=b):this.oldest=f,b=f;if(d--==0)throw new Error("overflow")}this.newest=b,this.size=this._keymap.size}get(a){var b=this._keymap.get(a);return b?(this._markEntryAsUsed(b),b.value):void 0}set(a,b){var d=this._keymap.get(a);return d?(d.value=b,this._markEntryAsUsed(d),this):(this._keymap.set(a,d=new l(a,b)),this.newest?(this.newest[c]=d,d[e]=this.newest):this.oldest=d,this.newest=d,++this.size,this.size>this.limit&&this.shift(),this)}shift(){var a=this.oldest;if(a)return this.oldest[c]?(this.oldest=this.oldest[c],this.oldest[e]=void 0):(this.oldest=void 0,this.newest=void 0),a[c]=a[e]=void 0,this._keymap.delete(a.key),--this.size,[a.key,a.value]}find(a){let b=this._keymap.get(a);return b?b.value:void 0}has(a){return this._keymap.has(a)}delete(a){var b=this._keymap.get(a);return b?(this._keymap.delete(b.key),b[c]&&b[e]?(b[e][c]=b[c],b[c][e]=b[e]):b[c]?(b[c][e]=void 0,this.oldest=b[c]):b[e]?(b[e][c]=void 0,this.newest=b[e]):this.oldest=this.newest=void 0,this.size--,b.value):void 0}clear(){this.oldest=this.newest=void 0,this.size=0,this._keymap.clear()}keys(){return new j(this.oldest)}values(){return new k(this.oldest)}entries(){return this}[Symbol.iterator](){return new i(this.oldest)}forEach(a,b){typeof b!=="object"&&(b=this);let d=this.oldest;for(;d;)a.call(b,d.value,d.key,this),d=d[c]}toJSON(){for(var a=new Array(this.size),b=0,d=this.oldest;d;)a[b++]={key:d.key,value:d.value},d=d[c];return a}toString(){for(var a="",b=this.oldest;b;)a+=String(b.key)+":"+b.value,b=b[c],b&&(a+=" < ");return a}}g.LRUMap=n;function l(a,b){this.key=a,this.value=b,this[c]=void 0,this[e]=void 0}function i(a){this.entry=a}i.prototype[Symbol.iterator]=function(){return this},i.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:[a.key,a.value]}):{done:!0,value:void 0}};function j(a){this.entry=a}j.prototype[Symbol.iterator]=function(){return this},j.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.key}):{done:!0,value:void 0}};function k(a){this.entry=a}k.prototype[Symbol.iterator]=function(){return this},k.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.value}):{done:!0,value:void 0}}}); +//# sourceMappingURL=lru.js.map - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) +/***/ }), - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) +/***/ 554: +/***/ (function(module, exports) { - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase(); - loweredCase = true; - } - } -}; +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { var mod; } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) { + /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */ -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -}; + /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return fromByteArray(buf) - } else { - return fromByteArray(buf.slice(start, end)) - } -} + /* vim: set sts=2 sw=2 et tw=80: */ -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end); - var res = []; + /* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + "use strict"; - var i = start; - while (i < end) { - var firstByte = buf[i]; - var codePoint = null; - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1; + if (!globalThis.chrome?.runtime?.id) { + throw new Error("This script should only be loaded in a browser extension."); + } - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint; + if (typeof globalThis.browser === "undefined" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) { + const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; // Wrapping the bulk of this polyfill in a one-time-use function is a minor + // optimization for Firefox. Since Spidermonkey does not fully parse the + // contents of a function until the first time it's called, and since it will + // never actually need to be called, this allows the polyfill to be included + // in Firefox nearly for free. - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte; + const wrapAPIs = extensionAPIs => { + // NOTE: apiMetadata is associated to the content of the api-metadata.json file + // at build time by replacing the following "include" with the content of the + // JSON file. + const apiMetadata = { + "alarms": { + "clear": { + "minArgs": 0, + "maxArgs": 1 + }, + "clearAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "bookmarks": { + "create": { + "minArgs": 1, + "maxArgs": 1 + }, + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getChildren": { + "minArgs": 1, + "maxArgs": 1 + }, + "getRecent": { + "minArgs": 1, + "maxArgs": 1 + }, + "getSubTree": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTree": { + "minArgs": 0, + "maxArgs": 0 + }, + "move": { + "minArgs": 2, + "maxArgs": 2 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeTree": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + }, + "browserAction": { + "disable": { + "minArgs": 0, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "enable": { + "minArgs": 0, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "getBadgeBackgroundColor": { + "minArgs": 1, + "maxArgs": 1 + }, + "getBadgeText": { + "minArgs": 1, + "maxArgs": 1 + }, + "getPopup": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTitle": { + "minArgs": 1, + "maxArgs": 1 + }, + "openPopup": { + "minArgs": 0, + "maxArgs": 0 + }, + "setBadgeBackgroundColor": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setBadgeText": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setIcon": { + "minArgs": 1, + "maxArgs": 1 + }, + "setPopup": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setTitle": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + } + }, + "browsingData": { + "remove": { + "minArgs": 2, + "maxArgs": 2 + }, + "removeCache": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeCookies": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeDownloads": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeFormData": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeHistory": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeLocalStorage": { + "minArgs": 1, + "maxArgs": 1 + }, + "removePasswords": { + "minArgs": 1, + "maxArgs": 1 + }, + "removePluginData": { + "minArgs": 1, + "maxArgs": 1 + }, + "settings": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "commands": { + "getAll": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "contextMenus": { + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + }, + "cookies": { + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAllCookieStores": { + "minArgs": 0, + "maxArgs": 0 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "devtools": { + "inspectedWindow": { + "eval": { + "minArgs": 1, + "maxArgs": 2, + "singleCallbackArg": false + } + }, + "panels": { + "create": { + "minArgs": 3, + "maxArgs": 3, + "singleCallbackArg": true + }, + "elements": { + "createSidebarPane": { + "minArgs": 1, + "maxArgs": 1 + } + } + } + }, + "downloads": { + "cancel": { + "minArgs": 1, + "maxArgs": 1 + }, + "download": { + "minArgs": 1, + "maxArgs": 1 + }, + "erase": { + "minArgs": 1, + "maxArgs": 1 + }, + "getFileIcon": { + "minArgs": 1, + "maxArgs": 2 + }, + "open": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "pause": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeFile": { + "minArgs": 1, + "maxArgs": 1 + }, + "resume": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + }, + "show": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + } + }, + "extension": { + "isAllowedFileSchemeAccess": { + "minArgs": 0, + "maxArgs": 0 + }, + "isAllowedIncognitoAccess": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "history": { + "addUrl": { + "minArgs": 1, + "maxArgs": 1 + }, + "deleteAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "deleteRange": { + "minArgs": 1, + "maxArgs": 1 + }, + "deleteUrl": { + "minArgs": 1, + "maxArgs": 1 + }, + "getVisits": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "i18n": { + "detectLanguage": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAcceptLanguages": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "identity": { + "launchWebAuthFlow": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "idle": { + "queryState": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "management": { + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "getSelf": { + "minArgs": 0, + "maxArgs": 0 + }, + "setEnabled": { + "minArgs": 2, + "maxArgs": 2 + }, + "uninstallSelf": { + "minArgs": 0, + "maxArgs": 1 + } + }, + "notifications": { + "clear": { + "minArgs": 1, + "maxArgs": 1 + }, + "create": { + "minArgs": 1, + "maxArgs": 2 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "getPermissionLevel": { + "minArgs": 0, + "maxArgs": 0 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + }, + "pageAction": { + "getPopup": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTitle": { + "minArgs": 1, + "maxArgs": 1 + }, + "hide": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setIcon": { + "minArgs": 1, + "maxArgs": 1 + }, + "setPopup": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setTitle": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "show": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + } + }, + "permissions": { + "contains": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "request": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "runtime": { + "getBackgroundPage": { + "minArgs": 0, + "maxArgs": 0 + }, + "getPlatformInfo": { + "minArgs": 0, + "maxArgs": 0 + }, + "openOptionsPage": { + "minArgs": 0, + "maxArgs": 0 + }, + "requestUpdateCheck": { + "minArgs": 0, + "maxArgs": 0 + }, + "sendMessage": { + "minArgs": 1, + "maxArgs": 3 + }, + "sendNativeMessage": { + "minArgs": 2, + "maxArgs": 2 + }, + "setUninstallURL": { + "minArgs": 1, + "maxArgs": 1 } - break - case 2: - secondByte = buf[i + 1]; - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint; - } + }, + "sessions": { + "getDevices": { + "minArgs": 0, + "maxArgs": 1 + }, + "getRecentlyClosed": { + "minArgs": 0, + "maxArgs": 1 + }, + "restore": { + "minArgs": 0, + "maxArgs": 1 } - break - case 3: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint; + }, + "storage": { + "local": { + "clear": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 } - } - break - case 4: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - fourthByte = buf[i + 3]; - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint; + }, + "managed": { + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + } + }, + "sync": { + "clear": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 } } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD; - bytesPerSequence = 1; - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000; - res.push(codePoint >>> 10 & 0x3FF | 0xD800); - codePoint = 0xDC00 | codePoint & 0x3FF; - } - - res.push(codePoint); - i += bytesPerSequence; - } - - return decodeCodePointsArray(res) -} - -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000; - -function decodeCodePointsArray (codePoints) { - var len = codePoints.length; - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = ''; - var i = 0; - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ); - } - return res -} - -function asciiSlice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F); - } - return ret -} - -function latin1Slice (buf, start, end) { - var ret = ''; - end = Math.min(buf.length, end); - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]); - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length; - - if (!start || start < 0) start = 0; - if (!end || end < 0 || end > len) end = len; - - var out = ''; - for (var i = start; i < end; ++i) { - out += toHex(buf[i]); - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end); - var res = ''; - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length; - start = ~~start; - end = end === undefined ? len : ~~end; - - if (start < 0) { - start += len; - if (start < 0) start = 0; - } else if (start > len) { - start = len; - } - - if (end < 0) { - end += len; - if (end < 0) end = 0; - } else if (end > len) { - end = len; - } + }, + "tabs": { + "captureVisibleTab": { + "minArgs": 0, + "maxArgs": 2 + }, + "create": { + "minArgs": 1, + "maxArgs": 1 + }, + "detectLanguage": { + "minArgs": 0, + "maxArgs": 1 + }, + "discard": { + "minArgs": 0, + "maxArgs": 1 + }, + "duplicate": { + "minArgs": 1, + "maxArgs": 1 + }, + "executeScript": { + "minArgs": 1, + "maxArgs": 2 + }, + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getCurrent": { + "minArgs": 0, + "maxArgs": 0 + }, + "getZoom": { + "minArgs": 0, + "maxArgs": 1 + }, + "getZoomSettings": { + "minArgs": 0, + "maxArgs": 1 + }, + "goBack": { + "minArgs": 0, + "maxArgs": 1 + }, + "goForward": { + "minArgs": 0, + "maxArgs": 1 + }, + "highlight": { + "minArgs": 1, + "maxArgs": 1 + }, + "insertCSS": { + "minArgs": 1, + "maxArgs": 2 + }, + "move": { + "minArgs": 2, + "maxArgs": 2 + }, + "query": { + "minArgs": 1, + "maxArgs": 1 + }, + "reload": { + "minArgs": 0, + "maxArgs": 2 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeCSS": { + "minArgs": 1, + "maxArgs": 2 + }, + "sendMessage": { + "minArgs": 2, + "maxArgs": 3 + }, + "setZoom": { + "minArgs": 1, + "maxArgs": 2 + }, + "setZoomSettings": { + "minArgs": 1, + "maxArgs": 2 + }, + "update": { + "minArgs": 1, + "maxArgs": 2 + } + }, + "topSites": { + "get": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "webNavigation": { + "getAllFrames": { + "minArgs": 1, + "maxArgs": 1 + }, + "getFrame": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "webRequest": { + "handlerBehaviorChanged": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "windows": { + "create": { + "minArgs": 0, + "maxArgs": 1 + }, + "get": { + "minArgs": 1, + "maxArgs": 2 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 1 + }, + "getCurrent": { + "minArgs": 0, + "maxArgs": 1 + }, + "getLastFocused": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + } + }; - if (end < start) end = start; + if (Object.keys(apiMetadata).length === 0) { + throw new Error("api-metadata.json has not been included in browser-polyfill"); + } + /** + * A WeakMap subclass which creates and stores a value for any key which does + * not exist when accessed, but behaves exactly as an ordinary WeakMap + * otherwise. + * + * @param {function} createItem + * A function which will be called in order to create the value for any + * key which does not exist, the first time it is accessed. The + * function receives, as its only argument, the key being created. + */ - var newBuf; - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end); - newBuf.__proto__ = Buffer.prototype; - } else { - var sliceLen = end - start; - newBuf = new Buffer(sliceLen, undefined); - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start]; - } - } - return newBuf -}; + class DefaultWeakMap extends WeakMap { + constructor(createItem, items = undefined) { + super(items); + this.createItem = createItem; + } -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} + get(key) { + if (!this.has(key)) { + this.set(key, this.createItem(key)); + } -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); + return super.get(key); + } - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } + } + /** + * Returns true if the given object is an object with a `then` method, and can + * therefore be assumed to behave as a Promise. + * + * @param {*} value The value to test. + * @returns {boolean} True if the value is thenable. + */ - return val -}; -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - checkOffset(offset, byteLength, this.length); - } + const isThenable = value => { + return value && typeof value === "object" && typeof value.then === "function"; + }; + /** + * Creates and returns a function which, when called, will resolve or reject + * the given promise based on how it is called: + * + * - If, when called, `chrome.runtime.lastError` contains a non-null object, + * the promise is rejected with that value. + * - If the function is called with exactly one argument, the promise is + * resolved to that value. + * - Otherwise, the promise is resolved to an array containing all of the + * function's arguments. + * + * @param {object} promise + * An object containing the resolution and rejection functions of a + * promise. + * @param {function} promise.resolve + * The promise's resolution function. + * @param {function} promise.reject + * The promise's rejection function. + * @param {object} metadata + * Metadata about the wrapped method which has created the callback. + * @param {boolean} metadata.singleCallbackArg + * Whether or not the promise is resolved with only the first + * argument of the callback, alternatively an array of all the + * callback arguments is resolved. By default, if the callback + * function is invoked with only a single argument, that will be + * resolved to the promise, while all arguments will be resolved as + * an array if multiple are given. + * + * @returns {function} + * The generated callback function. + */ - var val = this[offset + --byteLength]; - var mul = 1; - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul; - } - return val -}; + const makeCallback = (promise, metadata) => { + return (...callbackArgs) => { + if (extensionAPIs.runtime.lastError) { + promise.reject(new Error(extensionAPIs.runtime.lastError.message)); + } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) { + promise.resolve(callbackArgs[0]); + } else { + promise.resolve(callbackArgs); + } + }; + }; -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - return this[offset] -}; + const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments"; + /** + * Creates a wrapper function for a method with the given name and metadata. + * + * @param {string} name + * The name of the method which is being wrapped. + * @param {object} metadata + * Metadata about the method being wrapped. + * @param {integer} metadata.minArgs + * The minimum number of arguments which must be passed to the + * function. If called with fewer than this number of arguments, the + * wrapper will raise an exception. + * @param {integer} metadata.maxArgs + * The maximum number of arguments which may be passed to the + * function. If called with more than this number of arguments, the + * wrapper will raise an exception. + * @param {boolean} metadata.singleCallbackArg + * Whether or not the promise is resolved with only the first + * argument of the callback, alternatively an array of all the + * callback arguments is resolved. By default, if the callback + * function is invoked with only a single argument, that will be + * resolved to the promise, while all arguments will be resolved as + * an array if multiple are given. + * + * @returns {function(object, ...*)} + * The generated wrapper function. + */ -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return this[offset] | (this[offset + 1] << 8) -}; -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - return (this[offset] << 8) | this[offset + 1] -}; + const wrapAsyncFunction = (name, metadata) => { + return function asyncFunctionWrapper(target, ...args) { + if (args.length < metadata.minArgs) { + throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); + } -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); + if (args.length > metadata.maxArgs) { + throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); + } - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -}; + return new Promise((resolve, reject) => { + if (metadata.fallbackToNoCallback) { + // This API method has currently no callback on Chrome, but it return a promise on Firefox, + // and so the polyfill will try to call it with a callback first, and it will fallback + // to not passing the callback if the first call fails. + try { + target[name](...args, makeCallback({ + resolve, + reject + }, metadata)); + } catch (cbError) { + console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError); + target[name](...args); // Update the API method metadata, so that the next API calls will not try to + // use the unsupported callback anymore. -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); + metadata.fallbackToNoCallback = false; + metadata.noCallback = true; + resolve(); + } + } else if (metadata.noCallback) { + target[name](...args); + resolve(); + } else { + target[name](...args, makeCallback({ + resolve, + reject + }, metadata)); + } + }); + }; + }; + /** + * Wraps an existing method of the target object, so that calls to it are + * intercepted by the given wrapper function. The wrapper function receives, + * as its first argument, the original `target` object, followed by each of + * the arguments passed to the original method. + * + * @param {object} target + * The original target object that the wrapped method belongs to. + * @param {function} method + * The method being wrapped. This is used as the target of the Proxy + * object which is created to wrap the method. + * @param {function} wrapper + * The wrapper function which is called in place of a direct invocation + * of the wrapped method. + * + * @returns {Proxy} + * A Proxy object for the given method, which invokes the given wrapper + * method in its place. + */ - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -}; -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); + const wrapMethod = (target, method, wrapper) => { + return new Proxy(method, { + apply(targetMethod, thisObj, args) { + return wrapper.call(thisObj, target, ...args); + } - var val = this[offset]; - var mul = 1; - var i = 0; - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul; - } - mul *= 0x80; + }); + }; - if (val >= mul) val -= Math.pow(2, 8 * byteLength); + let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); + /** + * Wraps an object in a Proxy which intercepts and wraps certain methods + * based on the given `wrappers` and `metadata` objects. + * + * @param {object} target + * The target object to wrap. + * + * @param {object} [wrappers = {}] + * An object tree containing wrapper functions for special cases. Any + * function present in this object tree is called in place of the + * method in the same location in the `target` object tree. These + * wrapper methods are invoked as described in {@see wrapMethod}. + * + * @param {object} [metadata = {}] + * An object tree containing metadata used to automatically generate + * Promise-based wrapper functions for asynchronous. Any function in + * the `target` object tree which has a corresponding metadata object + * in the same location in the `metadata` tree is replaced with an + * automatically-generated wrapper function, as described in + * {@see wrapAsyncFunction} + * + * @returns {Proxy} + */ - return val -}; + const wrapObject = (target, wrappers = {}, metadata = {}) => { + let cache = Object.create(null); + let handlers = { + has(proxyTarget, prop) { + return prop in target || prop in cache; + }, -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) checkOffset(offset, byteLength, this.length); + get(proxyTarget, prop, receiver) { + if (prop in cache) { + return cache[prop]; + } - var i = byteLength; - var mul = 1; - var val = this[offset + --i]; - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul; - } - mul *= 0x80; + if (!(prop in target)) { + return undefined; + } - if (val >= mul) val -= Math.pow(2, 8 * byteLength); + let value = target[prop]; - return val -}; + if (typeof value === "function") { + // This is a method on the underlying object. Check if we need to do + // any wrapping. + if (typeof wrappers[prop] === "function") { + // We have a special-case wrapper for this method. + value = wrapMethod(target, target[prop], wrappers[prop]); + } else if (hasOwnProperty(metadata, prop)) { + // This is an async method that we have metadata for. Create a + // Promise wrapper for it. + let wrapper = wrapAsyncFunction(prop, metadata[prop]); + value = wrapMethod(target, target[prop], wrapper); + } else { + // This is a method that we don't know or care about. Return the + // original method, bound to the underlying object. + value = value.bind(target); + } + } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { + // This is an object that we need to do some wrapping for the children + // of. Create a sub-object wrapper for it with the appropriate child + // metadata. + value = wrapObject(value, wrappers[prop], metadata[prop]); + } else if (hasOwnProperty(metadata, "*")) { + // Wrap all properties in * namespace. + value = wrapObject(value, wrappers[prop], metadata["*"]); + } else { + // We don't need to do any wrapping for this property, + // so just forward all access to the underlying object. + Object.defineProperty(cache, prop, { + configurable: true, + enumerable: true, -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length); - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -}; + get() { + return target[prop]; + }, -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset] | (this[offset + 1] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; + set(value) { + target[prop] = value; + } -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length); - var val = this[offset + 1] | (this[offset] << 8); - return (val & 0x8000) ? val | 0xFFFF0000 : val -}; + }); + return value; + } -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); + cache[prop] = value; + return value; + }, - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -}; + set(proxyTarget, prop, value, receiver) { + if (prop in cache) { + cache[prop] = value; + } else { + target[prop] = value; + } -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); + return true; + }, - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -}; + defineProperty(proxyTarget, prop, desc) { + return Reflect.defineProperty(cache, prop, desc); + }, -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, true, 23, 4) -}; + deleteProperty(proxyTarget, prop) { + return Reflect.deleteProperty(cache, prop); + } -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length); - return read(this, offset, false, 23, 4) -}; + }; // Per contract of the Proxy API, the "get" proxy handler must return the + // original value of the target if that value is declared read-only and + // non-configurable. For this reason, we create an object with the + // prototype set to `target` instead of using `target` directly. + // Otherwise we cannot return a custom object for APIs that + // are declared read-only and non-configurable, such as `chrome.devtools`. + // + // The proxy handlers themselves will still use the original `target` + // instead of the `proxyTarget`, so that the methods and properties are + // dereferenced via the original targets. -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, true, 52, 8) -}; + let proxyTarget = Object.create(target); + return new Proxy(proxyTarget, handlers); + }; + /** + * Creates a set of wrapper functions for an event object, which handles + * wrapping of listener functions that those messages are passed. + * + * A single wrapper is created for each listener function, and stored in a + * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener` + * retrieve the original wrapper, so that attempts to remove a + * previously-added listener work as expected. + * + * @param {DefaultWeakMap} wrapperMap + * A DefaultWeakMap object which will create the appropriate wrapper + * for a given listener function when one does not exist, and retrieve + * an existing one when it does. + * + * @returns {object} + */ -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length); - return read(this, offset, false, 52, 8) -}; -function checkInt (buf, value, offset, ext, max, min) { - if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} + const wrapEvent = wrapperMap => ({ + addListener(target, listener, ...args) { + target.addListener(wrapperMap.get(listener), ...args); + }, -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } + hasListener(target, listener) { + return target.hasListener(wrapperMap.get(listener)); + }, - var mul = 1; - var i = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } + removeListener(target, listener) { + target.removeListener(wrapperMap.get(listener)); + } - return offset + byteLength -}; + }); -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - byteLength = byteLength | 0; - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1; - checkInt(this, value, offset, byteLength, maxBytes, 0); - } + const onRequestFinishedWrappers = new DefaultWeakMap(listener => { + if (typeof listener !== "function") { + return listener; + } + /** + * Wraps an onRequestFinished listener function so that it will return a + * `getContent()` property which returns a `Promise` rather than using a + * callback API. + * + * @param {object} req + * The HAR entry object representing the network request. + */ - var i = byteLength - 1; - var mul = 1; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF; - } - return offset + byteLength -}; + return function onRequestFinished(req) { + const wrappedReq = wrapObject(req, {} + /* wrappers */ + , { + getContent: { + minArgs: 0, + maxArgs: 0 + } + }); + listener(wrappedReq); + }; + }); + const onMessageWrappers = new DefaultWeakMap(listener => { + if (typeof listener !== "function") { + return listener; + } + /** + * Wraps a message listener function so that it may send responses based on + * its return value, rather than by returning a sentinel value and calling a + * callback. If the listener function returns a Promise, the response is + * sent when the promise either resolves or rejects. + * + * @param {*} message + * The message sent by the other end of the channel. + * @param {object} sender + * Details about the sender of the message. + * @param {function(*)} sendResponse + * A callback which, when called with an arbitrary argument, sends + * that value as a response. + * @returns {boolean} + * True if the wrapped listener returned a Promise, which will later + * yield a response. False otherwise. + */ -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - this[offset] = (value & 0xff); - return offset + 1 -}; -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8; - } -} + return function onMessage(message, sender, sendResponse) { + let didCallSendResponse = false; + let wrappedSendResponse; + let sendResponsePromise = new Promise(resolve => { + wrappedSendResponse = function (response) { + didCallSendResponse = true; + resolve(response); + }; + }); + let result; -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 -}; + try { + result = listener(message, sender, wrappedSendResponse); + } catch (err) { + result = Promise.reject(err); + } -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 -}; + const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called + // wrappedSendResponse synchronously, we can exit earlier + // because there will be no response sent from this listener. -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1; - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; - } -} + if (result !== true && !isResultThenable && !didCallSendResponse) { + return false; + } // A small helper to send the message if the promise resolves + // and an error if the promise rejects (a wrapped sendMessage has + // to translate the message into a resolved promise or a rejected + // promise). -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24); - this[offset + 2] = (value >>> 16); - this[offset + 1] = (value >>> 8); - this[offset] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 -}; -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); - } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 -}; + const sendPromisedResult = promise => { + promise.then(msg => { + // send the message value. + sendResponse(msg); + }, error => { + // Send a JSON representation of the error if the rejected value + // is an instance of error, or the object itself otherwise. + let message; -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); + if (error && (error instanceof Error || typeof error.message === "string")) { + message = error.message; + } else { + message = "An unexpected error occurred"; + } - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } + sendResponse({ + __mozWebExtensionPolyfillReject__: true, + message + }); + }).catch(err => { + // Print an error on the console if unable to send the response. + console.error("Failed to send onMessage rejected reply", err); + }); + }; // If the listener returned a Promise, send the resolved value as a + // result, otherwise wait the promise related to the wrappedSendResponse + // callback to resolve and send it as a response. - var i = 0; - var mul = 1; - var sub = 0; - this[offset] = value & 0xFF; - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } - return offset + byteLength -}; + if (isResultThenable) { + sendPromisedResult(result); + } else { + sendPromisedResult(sendResponsePromise); + } // Let Chrome know that the listener is replying. -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1); - checkInt(this, value, offset, byteLength, limit - 1, -limit); - } + return true; + }; + }); - var i = byteLength - 1; - var mul = 1; - var sub = 0; - this[offset + i] = value & 0xFF; - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1; - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; - } + const wrappedSendMessageCallback = ({ + reject, + resolve + }, reply) => { + if (extensionAPIs.runtime.lastError) { + // Detect when none of the listeners replied to the sendMessage call and resolve + // the promise to undefined as in Firefox. + // See https://github.com/mozilla/webextension-polyfill/issues/130 + if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) { + resolve(); + } else { + reject(new Error(extensionAPIs.runtime.lastError.message)); + } + } else if (reply && reply.__mozWebExtensionPolyfillReject__) { + // Convert back the JSON representation of the error into + // an Error instance. + reject(new Error(reply.message)); + } else { + resolve(reply); + } + }; - return offset + byteLength -}; + const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => { + if (args.length < metadata.minArgs) { + throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); + } -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); - if (value < 0) value = 0xff + value + 1; - this[offset] = (value & 0xff); - return offset + 1 -}; + if (args.length > metadata.maxArgs) { + throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); + } -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - } else { - objectWriteUInt16(this, value, offset, true); - } - return offset + 2 -}; + return new Promise((resolve, reject) => { + const wrappedCb = wrappedSendMessageCallback.bind(null, { + resolve, + reject + }); + args.push(wrappedCb); + apiNamespaceObj.sendMessage(...args); + }); + }; -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8); - this[offset + 1] = (value & 0xff); - } else { - objectWriteUInt16(this, value, offset, false); - } - return offset + 2 -}; + const staticWrappers = { + devtools: { + network: { + onRequestFinished: wrapEvent(onRequestFinishedWrappers) + } + }, + runtime: { + onMessage: wrapEvent(onMessageWrappers), + onMessageExternal: wrapEvent(onMessageWrappers), + sendMessage: wrappedSendMessage.bind(null, "sendMessage", { + minArgs: 1, + maxArgs: 3 + }) + }, + tabs: { + sendMessage: wrappedSendMessage.bind(null, "sendMessage", { + minArgs: 2, + maxArgs: 3 + }) + } + }; + const settingMetadata = { + clear: { + minArgs: 1, + maxArgs: 1 + }, + get: { + minArgs: 1, + maxArgs: 1 + }, + set: { + minArgs: 1, + maxArgs: 1 + } + }; + apiMetadata.privacy = { + network: { + "*": settingMetadata + }, + services: { + "*": settingMetadata + }, + websites: { + "*": settingMetadata + } + }; + return wrapObject(extensionAPIs, staticWrappers, apiMetadata); + }; // The build process adds a UMD wrapper around this file, which makes the + // `module` variable available. -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff); - this[offset + 1] = (value >>> 8); - this[offset + 2] = (value >>> 16); - this[offset + 3] = (value >>> 24); - } else { - objectWriteUInt32(this, value, offset, true); - } - return offset + 4 -}; -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value; - offset = offset | 0; - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); - if (value < 0) value = 0xffffffff + value + 1; - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24); - this[offset + 1] = (value >>> 16); - this[offset + 2] = (value >>> 8); - this[offset + 3] = (value & 0xff); + module.exports = wrapAPIs(chrome); } else { - objectWriteUInt32(this, value, offset, false); - } - return offset + 4 -}; - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4); + module.exports = globalThis.browser; } - write(buf, value, offset, littleEndian, 23, 4); - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -}; +}); +//# sourceMappingURL=browser-polyfill.js.map -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -}; -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8); - } - write(buf, value, offset, littleEndian, 52, 8); - return offset + 8 -} +/***/ }), -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -}; +/***/ 7545: +/***/ (() => { -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -}; +/* (ignored) */ -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0; - if (!end && end !== 0) end = this.length; - if (targetStart >= target.length) targetStart = target.length; - if (!targetStart) targetStart = 0; - if (end > 0 && end < start) end = start; - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') +/***/ }) - // Are we oob? - if (end > this.length) end = this.length; - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start; - } +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); - var len = end - start; - var i; +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + AdguardApi: () => (/* reexport */ AdguardApi) +}); - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start]; +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.error.cause.js +var es_error_cause = __webpack_require__(1703); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.includes.js +var es_array_includes = __webpack_require__(6699); +// EXTERNAL MODULE: ./node_modules/webextension-polyfill/dist/browser-polyfill.js +var browser_polyfill = __webpack_require__(3150); +var browser_polyfill_default = /*#__PURE__*/__webpack_require__.n(browser_polyfill); +;// CONCATENATED MODULE: ../tsurlfilter/dist/es/simple-regex-40f65170.js +/** + * Splits the string by the delimiter, ignoring escaped delimiters + * and without tokenizing. + * Works for plain strings that don't include string representation of + * complex entities, e.g $replace modifier values. + * + * @param string - string to split + * @param delimiter - delimiter + * @param escapeCharacter - escape character + * @param preserveEmptyTokens - if true, preserve empty parts + * @param shouldUnescape - if true, unescape characters + * @return array of string parts + */ +function splitByDelimiterWithEscapeCharacter(string, delimiter, escapeCharacter, preserveEmptyTokens, shouldUnescape) { + if (shouldUnescape === void 0) { shouldUnescape = true; } + if (!string) { + return []; } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; ++i) { - target[i + targetStart] = this[i + start]; + if (string.startsWith(delimiter)) { + // eslint-disable-next-line no-param-reassign + string = string.substring(1); } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, start + len), - targetStart - ); - } - - return len -}; - -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start; - start = 0; - end = this.length; - } else if (typeof end === 'string') { - encoding = end; - end = this.length; - } - if (val.length === 1) { - var code = val.charCodeAt(0); - if (code < 256) { - val = code; - } - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - } else if (typeof val === 'number') { - val = val & 255; - } - - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { - return this - } - - start = start >>> 0; - end = end === undefined ? this.length : end >>> 0; - - if (!val) val = 0; - - var i; - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val; + var words = []; + if (!string.includes(escapeCharacter)) { + words = string.split(delimiter); + if (!preserveEmptyTokens) { + words = words.filter(function (word) { return !!word; }); + } + return words; + } + var chars = []; + var makeWord = function () { + var word = chars.join(''); + words.push(word); + chars = []; + }; + for (var i = 0; i < string.length; i += 1) { + var char = string.charAt(i); + var isLastChar = i === (string.length - 1); + if (char === delimiter) { + var isEscapedChar = i > 0 && string[i - 1] === escapeCharacter; + if (isEscapedChar) { + if (shouldUnescape) { + chars.splice(chars.length - 1, 1); + } + chars.push(char); + } + else { + makeWord(); + } + if (isLastChar) { + makeWord(); + } + } + else if (isLastChar) { + chars.push(char); + makeWord(); + } + else { + chars.push(char); + } + } + if (!preserveEmptyTokens) { + words = words.filter(function (word) { return !!word; }); + } + return words; +} +/** + * Checks if the specified string starts with a substr at the specified index. + * + * @param str - String to check + * @param startIndex - Index to start checking from + * @param substr - Substring to check + * @return boolean true if it does start + */ +function startsAtIndexWith(str, startIndex, substr) { + if (str.length - startIndex < substr.length) { + return false; } - } else { - var bytes = internalIsBuffer(val) - ? val - : utf8ToBytes(new Buffer(val, encoding).toString()); - var len = bytes.length; - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len]; + for (var i = 0; i < substr.length; i += 1) { + if (str.charAt(startIndex + i) !== substr.charAt(i)) { + return false; + } } - } - - return this -}; - -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g; - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, ''); - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '='; - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) + return true; } - -function utf8ToBytes (string, units) { - units = units || Infinity; - var codePoint; - var length = string.length; - var leadSurrogate = null; - var bytes = []; - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i); - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - continue - } - - // valid lead - leadSurrogate = codePoint; - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - leadSurrogate = codePoint; - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); - } - - leadSurrogate = null; - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint); - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ); - } else { - throw new Error('Invalid code point') +/** + * Checks if str has unquoted substr + * + * @param str + * @param substr + */ +function hasUnquotedSubstring(str, substr) { + var quotes = ['"', "'", '/']; + if (!str.includes(substr)) { + return false; } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF); - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo; - var byteArray = []; - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i); - hi = c >> 8; - lo = c % 256; - byteArray.push(lo); - byteArray.push(hi); - } - - return byteArray -} - - -function base64ToBytes (str) { - return toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i]; - } - return i -} - -function isnan (val) { - return val !== val // eslint-disable-line no-self-compare -} - - -// the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -function isBuffer$1(obj) { - return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj)) -} - -function isFastBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} - -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0)) + // eslint-disable-next-line @typescript-eslint/no-use-before-define + if (indexOfAny(str, quotes) === -1) { + return true; + } + var stack = []; + for (var i = 0; i < str.length; i += 1) { + var cursor = str[i]; + if (stack.length === 0) { + if (startsAtIndexWith(str, i, substr)) { + return true; + } + } + if (quotes.indexOf(cursor) >= 0 + && (i === 0 || str[i - 1] !== '\\')) { + var last = stack.pop(); + if (!last) { + stack.push(cursor); + } + else if (last !== cursor) { + stack.push(last); + stack.push(cursor); + } + } + } + return false; } - -// shim for using process in browser -// based off https://github.com/defunctzombie/node-process/blob/master/browser.js - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); +/** + * djb2 hash algorithm + * + * @param str string to get hash + * @param begin index from + * @param end index to + * @return {number} hash + */ +function fastHashBetween(str, begin, end) { + var hash = 5381; + for (var idx = begin; idx < end; idx += 1) { + hash = 33 * hash + str.charCodeAt(idx); + } + return hash; } -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); +/** + * djb2 hash algorithm + * + * @param str string to get hash + * @return {number} hash + */ +function fastHash(str) { + if (str === '') { + return 0; + } + var len = str.length; + return fastHashBetween(str, 0, len); } -var cachedSetTimeout = defaultSetTimout; -var cachedClearTimeout = defaultClearTimeout; -if (typeof global$1.setTimeout === 'function') { - cachedSetTimeout = setTimeout; +/** + * Look for any symbol from "chars" array starting at "start" index or from the start of the string + * + * @param str String to search + * @param chars Chars to search for + * @param start Start index (optional, inclusive) + * @return int Index of the element found or -1 if not + */ +function indexOfAny(str, chars, start) { + if (start === void 0) { start = 0; } + if (str.length <= start) { + return -1; + } + for (var i = start; i < str.length; i += 1) { + var c = str.charAt(i); + if (chars.indexOf(c) > -1) { + return i; + } + } + return -1; } -if (typeof global$1.clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; +/** + * Replaces all occurences of find with replace in str + * + * @param str + * @param find + * @param replace + */ +function replaceAll(str, find, replace) { + if (!str) { + return str; + } + return str.split(find).join(replace); } - -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); +/** + * Checks if arrays are equal + * + * @param left array + * @param right array + * @return {boolean} true on equality + */ +function stringArraysEquals(left, right) { + if (!left || !right) { + return !left && !right; } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); + if (left.length !== right.length) { + return false; } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); + for (var i = 0; i < left.length; i += 1) { + if (left[i] !== right[i]) { + return false; } } - - + return true; } -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); +/** + * Checks if arrays have an intersection + * + * @param left array + * @param right array + * @return {boolean} true on equality + */ +function stringArraysHaveIntersection(left, right) { + if (!left || !right) { + return true; } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); + for (var i = 0; i < left.length; i += 1) { + if (right.includes(left[i])) { + return true; } } + return false; +} +/* eslint-disable prefer-regex-literals */ +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp +// should be escaped . * + ? ^ $ { } ( ) | [ ] / \ +// except of * | ^ +var specialCharacters = ['.', '+', '?', '$', '{', '}', '(', ')', '[', ']', '/', '\\']; +var reSpecialCharacters = new RegExp("[".concat(specialCharacters.join('\\'), "]"), 'g'); +var reSpecialCharactersFull = /[.*+?^${}()|[\]\\]/g; +var reEscapedSpecialCharactersFull = /\\[.*+?^${}()|[\]\\]/g; +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings +var escapeSequence = { + n: '\n', + r: '\r', + t: '\t', + b: '\b', + f: '\f', + v: '\v', +}; +/** + * Class with static helper methods for working with basic filtering rules patterns. + * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules + */ +var SimpleRegex = /** @class */ (function () { + function SimpleRegex() { + } + /** + * Extracts the shortcut from the rule's pattern. + * Shortcut is the longest substring of the pattern that does not contain + * any special characters. + * + * Please note, that the shortcut is always lower-case! + * + * @param pattern - network rule's pattern. + * @returns the shortcut or the empty string if we could not extract any. + */ + SimpleRegex.extractShortcut = function (pattern) { + if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) { + return this.extractRegexpShortcut(pattern); + } + return this.extractBasicShortcut(pattern); + }; + /** + * Searches for the longest substring of the pattern that + * does not contain any special characters: *,^,|. + * + * @param pattern - network rule's pattern. + * @returns the shortcut or the empty string + */ + SimpleRegex.extractBasicShortcut = function (pattern) { + var longest = ''; + var parts = pattern.split(this.rePatternSpecialCharacters); + for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) { + var part = parts_1[_i]; + if (part.length > longest.length) { + longest = part; + } + } + return (longest || '').toLowerCase(); + }; + /** + * Searches for a shortcut inside of a regexp pattern. + * Shortcut in this case is a longest string with no REGEX special characters. + * Also, we discard complicated regexps right away. + * + * @param pattern - network rule's pattern (regexp). + * @returns the shortcut or the empty string + */ + SimpleRegex.extractRegexpShortcut = function (pattern) { + var reText = pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length); + if (reText.length === 0) { + // The rule is too short, doing nothing + return ''; + } + if (reText.indexOf('?') >= 0) { + // Do not mess with complex expressions which use lookahead + // And with those using ? special character + // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/978 + return ''; + } + var specialCharacter = '$$$'; + // Prepend specialCharacter for the following replace calls to work properly + reText = specialCharacter + reText; + // Strip all types of brackets + reText = reText.replace(/[^\\]\(.*[^\\]\)/, specialCharacter); + reText = reText.replace(/[^\\]\[.*[^\\]\]/, specialCharacter); + reText = reText.replace(/[^\\]\{.*[^\\]\}/, specialCharacter); + // Strip some special characters + reText = reText.replace(/[^\\]\\[a-zA-Z]/, specialCharacter); + // Replace \. with . + reText = reText.replace(/\\\./g, '.'); + // Split by special characters + // `.` is one of the special characters so our `specialCharacter` + // will be removed from the resulting array + var parts = reText.split(/[\\^$*+?()|[\]{}]/); + var longest = ''; + for (var i = 0; i < parts.length; i += 1) { + var part = parts[i]; + if (part.length > longest.length) { + longest = part; + } + } + return longest.toLowerCase(); + }; + /** + * patternToRegexp is a helper method for creating regular expressions from the simple + * wildcard-based syntax which is used in basic filters: + * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules + * + * @param pattern - basic rule pattern + * @returns regular expression + */ + SimpleRegex.patternToRegexp = function (pattern) { + if (pattern === this.MASK_START_URL + || pattern === this.MASK_PIPE + || pattern === this.MASK_ANY_CHARACTER + || pattern === '') { + return this.REGEX_ANY_CHARACTER; + } + if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) { + // This is a regex rule, just remove the regex markers + return pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length); + } + // Escape special characters except of * | ^ + var regex = pattern.replace(reSpecialCharacters, '\\$&'); + // Now escape "|" characters but avoid escaping them in the special places + if (regex.startsWith(this.MASK_START_URL)) { + regex = regex.substring(0, this.MASK_START_URL.length) + + replaceAll(regex.substring(this.MASK_START_URL.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, "\\".concat(this.MASK_PIPE)) + + regex.substring(regex.length - this.MASK_PIPE.length); + } + else { + regex = regex.substring(0, this.MASK_PIPE.length) + + replaceAll(regex.substring(this.MASK_PIPE.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, "\\".concat(this.MASK_PIPE)) + + regex.substring(regex.length - this.MASK_PIPE.length); + } + // Replace special URL masks + regex = replaceAll(regex, this.MASK_ANY_CHARACTER, this.REGEX_ANY_CHARACTER); + regex = replaceAll(regex, this.MASK_SEPARATOR, this.REGEX_SEPARATOR); + // Replace start URL and pipes + if (regex.startsWith(this.MASK_START_URL)) { + regex = this.REGEX_START_URL + regex.substring(this.MASK_START_URL.length); + } + else if (regex.startsWith(this.MASK_PIPE)) { + regex = this.REGEX_START_STRING + regex.substring(this.MASK_PIPE.length); + } + if (regex.endsWith(this.MASK_PIPE)) { + regex = regex.substring(0, regex.length - this.MASK_PIPE.length) + this.REGEX_END_STRING; + } + return regex; + }; + /** + * Creates RegExp object from string in '/reg_exp/gi' format + * + * @param str + */ + SimpleRegex.patternFromString = function (str) { + var parts = splitByDelimiterWithEscapeCharacter(str, '/', '\\', true); + var modifiers = (parts[1] || ''); + if (modifiers.indexOf('g') < 0) { + modifiers += 'g'; + } + return new RegExp(parts[0], modifiers); + }; + /** + * Escapes characters with special meaning inside a regular expression. + * + * @param str + * @param searchPattern - Pattern for detecting special characters. Optional. + */ + SimpleRegex.escapeRegexSpecials = function (str, searchPattern) { + if (searchPattern === void 0) { searchPattern = reSpecialCharactersFull; } + return str.replace(searchPattern, '\\$&'); + }; + /** + * Unescapes characters with special meaning inside a regular expression. + * + * @param str + * @param searchPattern - Pattern for detecting special characters. Optional. + */ + SimpleRegex.unescapeRegexSpecials = function (str, searchPattern) { + if (searchPattern === void 0) { searchPattern = reEscapedSpecialCharactersFull; } + return str.replace(searchPattern, function (match) { return match.substring(1); }); + }; + /** + * Check if pattern is Regex + */ + SimpleRegex.isRegexPattern = function (str) { + return str.startsWith('/') && str.endsWith('/'); + }; + /** + * Unescapes special characters in a string + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings + */ + SimpleRegex.unescapeSpecials = function (str) { + var keys = Object.keys(escapeSequence).join('|'); + var regex = new RegExp("\\\\(".concat(keys, ")"), 'g'); + return str.replace(regex, function (match, group) { + return escapeSequence[group]; + }); + }; + /** + * Matching the beginning of an address. With this character you don't + * have to specify a particular protocol and subdomain in address mask. + * It means, || stands for http://*., https://*., ws://*., wss://*. at once. + */ + SimpleRegex.MASK_START_URL = '||'; + /** + * REGEX_START_URL corresponds to MASK_START_URL + */ + SimpleRegex.REGEX_START_URL = '^(http|https|ws|wss)://([a-z0-9-_.]+\\.)?'; + /** + * A pointer to the beginning or the end of address. The value depends on the + * character placement in the mask. For example, a rule swf| corresponds + * to http://example.com/annoyingflash.swf , but not to http://example.com/swf/index.html. + * |http://example.org corresponds to http://example.org, + * but not to http://domain.com?url=http://example.org. + */ + SimpleRegex.MASK_PIPE = '|'; + /** + * REGEX_END_STRING corresponds to MASK_PIPE if it is in the end of a pattern. + */ + SimpleRegex.REGEX_END_STRING = '$'; + /** + * REGEX_START_STRING corresponds to MASK_PIPE if it is in the beginning of a pattern. + */ + SimpleRegex.REGEX_START_STRING = '^'; + /** + * Separator character mark. Separator character is any character, + * but a letter, a digit, or one of the following: _ - . + */ + SimpleRegex.MASK_SEPARATOR = '^'; + /** + * REGEX_SEPARATOR corresponds to MASK_SEPARATOR + */ + SimpleRegex.REGEX_SEPARATOR = '([^ a-zA-Z0-9.%_-]|$)'; + /** + * This is a wildcard character. It is used to represent "any set of characters". + * This can also be an empty string or a string of any length. + */ + SimpleRegex.MASK_ANY_CHARACTER = '*'; + /** + * Path separator + */ + SimpleRegex.MASK_BACKSLASH = '/'; + /** + * REGEX_ANY_CHARACTER corresponds to MASK_ANY_CHARACTER. + */ + SimpleRegex.REGEX_ANY_CHARACTER = '.*'; + /** + * Enclose regex in two backslashes to mark a regex rule: + * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#regular-expressions-support + */ + SimpleRegex.MASK_REGEX_RULE = '/'; + /** + * Regex for matching special characters in modifier regex pattern + */ + SimpleRegex.reModifierPatternSpecialCharacters = /[[\],\\]/g; + /** + * Regex for matching escaped special characters in modifier regex pattern + */ + SimpleRegex.reModifierPatternEscapedSpecialCharacters = /\\[[\],\\]/g; + /** + * If string starts with exclamation mark "!" we consider it as comment + */ + SimpleRegex.MASK_COMMENT = '!'; + /** + * Min length of rule shortcut + * This value has been picked as a result of performance experiments + */ + SimpleRegex.MIN_SHORTCUT_LENGTH = 3; + /** + * Min length of generic rule shortcut + */ + SimpleRegex.MIN_GENERIC_RULE_LENGTH = 4; + /** Regex with basic matching pattern special characters */ + SimpleRegex.rePatternSpecialCharacters = new RegExp('[*^|]'); + return SimpleRegex; +}()); -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/domain.js +/** + * Check if `vhost` is a valid suffix of `hostname` (top-domain) + * + * It means that `vhost` needs to be a suffix of `hostname` and we then need to + * make sure that: either they are equal, or the character preceding `vhost` in + * `hostname` is a '.' (it should not be a partial label). + * + * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok + * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok + * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok + */ +function shareSameDomainSuffix(hostname, vhost) { + if (hostname.endsWith(vhost)) { + return (hostname.length === vhost.length || + hostname[hostname.length - vhost.length - 1] === '.'); } + return false; } - -function drainQueue() { - if (draining) { - return; +/** + * Given a hostname and its public suffix, extract the general domain. + */ +function extractDomainWithSuffix(hostname, publicSuffix) { + // Locate the index of the last '.' in the part of the `hostname` preceding + // the public suffix. + // + // examples: + // 1. not.evil.co.uk => evil.co.uk + // ^ ^ + // | | start of public suffix + // | index of the last dot + // + // 2. example.co.uk => example.co.uk + // ^ ^ + // | | start of public suffix + // | + // | (-1) no dot found before the public suffix + const publicSuffixIndex = hostname.length - publicSuffix.length - 2; + const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex); + // No '.' found, then `hostname` is the general domain (no sub-domain) + if (lastDotBeforeSuffixIndex === -1) { + return hostname; } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); + // Extract the part between the last '.' + return hostname.slice(lastDotBeforeSuffixIndex + 1); +} +/** + * Detects the domain based on rules and upon and a host string + */ +function getDomain(suffix, hostname, options) { + // Check if `hostname` ends with a member of `validHosts`. + if (options.validHosts !== null) { + const validHosts = options.validHosts; + for (let i = 0; i < validHosts.length; i += 1) { + const vhost = validHosts[i]; + if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost) === true) { + return vhost; } } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} -function nextTick(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); } -} -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -var title = 'browser'; -var platform = 'browser'; -var es_browser = true; -var env = {}; -var argv = []; -var version = ''; // empty string to avoid regexp issues -var versions = {}; -var release = {}; -var config = {}; - -function noop$1() {} - -var on = noop$1; -var addListener = noop$1; -var once = noop$1; -var off = noop$1; -var removeListener = noop$1; -var removeAllListeners = noop$1; -var emit = noop$1; - -function binding(name) { - throw new Error('process.binding is not supported'); -} - -function cwd () { return '/' } -function chdir (dir) { - throw new Error('process.chdir is not supported'); -}function umask() { return 0; } - -// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js -var performance = global$1.performance || {}; -var performanceNow = - performance.now || - performance.mozNow || - performance.msNow || - performance.oNow || - performance.webkitNow || - function(){ return (new Date()).getTime() }; - -// generate timestamp or delta -// see http://nodejs.org/api/process.html#process_process_hrtime -function hrtime(previousTimestamp){ - var clocktime = performanceNow.call(performance)*1e-3; - var seconds = Math.floor(clocktime); - var nanoseconds = Math.floor((clocktime%1)*1e9); - if (previousTimestamp) { - seconds = seconds - previousTimestamp[0]; - nanoseconds = nanoseconds - previousTimestamp[1]; - if (nanoseconds<0) { - seconds--; - nanoseconds += 1e9; + // If `hostname` is a valid public suffix, then there is no domain to return. + // Since we already know that `getPublicSuffix` returns a suffix of `hostname` + // there is no need to perform a string comparison and we only compare the + // size. + if (suffix.length === hostname.length) { + return null; } - } - return [seconds,nanoseconds] -} - -var startTime = new Date(); -function uptime() { - var currentTime = new Date(); - var dif = currentTime - startTime; - return dif / 1000; + // To extract the general domain, we start by identifying the public suffix + // (if any), then consider the domain to be the public suffix with one added + // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix: + // `co.uk`, then we take one more level: `evil`, giving the final result: + // `evil.co.uk`). + return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix); } - -var browser$1 = { - nextTick: nextTick, - title: title, - browser: es_browser, - env: env, - argv: argv, - version: version, - versions: versions, - on: on, - addListener: addListener, - once: once, - off: off, - removeListener: removeListener, - removeAllListeners: removeAllListeners, - emit: emit, - binding: binding, - cwd: cwd, - chdir: chdir, - umask: umask, - hrtime: hrtime, - platform: platform, - release: release, - config: config, - uptime: uptime -}; - -var inherits; -if (typeof Object.create === 'function'){ - inherits = function inherits(ctor, superCtor) { - // implementation from standard node.js 'util' module - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - inherits = function inherits(ctor, superCtor) { - ctor.super_ = superCtor; - var TempCtor = function () {}; - TempCtor.prototype = superCtor.prototype; - ctor.prototype = new TempCtor(); - ctor.prototype.constructor = ctor; - }; +//# sourceMappingURL=domain.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/domain-without-suffix.js +/** + * Return the part of domain without suffix. + * + * Example: for domain 'foo.com', the result would be 'foo'. + */ +function getDomainWithoutSuffix(domain, suffix) { + // Note: here `domain` and `suffix` cannot have the same length because in + // this case we set `domain` to `null` instead. It is thus safe to assume + // that `suffix` is shorter than `domain`. + return domain.slice(0, -suffix.length - 1); } -var inherits$1 = inherits; - -var formatRegExp = /%[sdj%]/g; -function format(f) { - if (!isString$1(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect$1(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; +//# sourceMappingURL=domain-without-suffix.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/extract-hostname.js +/** + * @param url - URL we want to extract a hostname from. + * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname. + */ +function extractHostname(url, urlIsValidHostname) { + let start = 0; + let end = url.length; + let hasUpper = false; + // If url is not already a valid hostname, then try to extract hostname. + if (urlIsValidHostname === false) { + // Special handling of data URLs + if (url.startsWith('data:') === true) { + return null; + } + // Trim leading spaces + while (start < url.length && url.charCodeAt(start) <= 32) { + start += 1; + } + // Trim trailing spaces + while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { + end -= 1; + } + // Skip scheme. + if (url.charCodeAt(start) === 47 /* '/' */ && + url.charCodeAt(start + 1) === 47 /* '/' */) { + start += 2; + } + else { + const indexOfProtocol = url.indexOf(':/', start); + if (indexOfProtocol !== -1) { + // Implement fast-path for common protocols. We expect most protocols + // should be one of these 4 and thus we will not need to perform the + // more expansive validity check most of the time. + const protocolSize = indexOfProtocol - start; + const c0 = url.charCodeAt(start); + const c1 = url.charCodeAt(start + 1); + const c2 = url.charCodeAt(start + 2); + const c3 = url.charCodeAt(start + 3); + const c4 = url.charCodeAt(start + 4); + if (protocolSize === 5 && + c0 === 104 /* 'h' */ && + c1 === 116 /* 't' */ && + c2 === 116 /* 't' */ && + c3 === 112 /* 'p' */ && + c4 === 115 /* 's' */) { + // https + } + else if (protocolSize === 4 && + c0 === 104 /* 'h' */ && + c1 === 116 /* 't' */ && + c2 === 116 /* 't' */ && + c3 === 112 /* 'p' */) { + // http + } + else if (protocolSize === 3 && + c0 === 119 /* 'w' */ && + c1 === 115 /* 's' */ && + c2 === 115 /* 's' */) { + // wss + } + else if (protocolSize === 2 && + c0 === 119 /* 'w' */ && + c1 === 115 /* 's' */) { + // ws + } + else { + // Check that scheme is valid + for (let i = start; i < indexOfProtocol; i += 1) { + const lowerCaseCode = url.charCodeAt(i) | 32; + if (((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z] + (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9] + lowerCaseCode === 46 || // '.' + lowerCaseCode === 45 || // '-' + lowerCaseCode === 43) === false // '+' + ) { + return null; + } + } + } + // Skip 0, 1 or more '/' after ':/' + start = indexOfProtocol + 2; + while (url.charCodeAt(start) === 47 /* '/' */) { + start += 1; + } + } + } + // Detect first occurrence of '/', '?' or '#'. We also keep track of the + // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of + // (respectively), identifier, ipv6 or port. + let indexOfIdentifier = -1; + let indexOfClosingBracket = -1; + let indexOfPort = -1; + for (let i = start; i < end; i += 1) { + const code = url.charCodeAt(i); + if (code === 35 || // '#' + code === 47 || // '/' + code === 63 // '?' + ) { + end = i; + break; + } + else if (code === 64) { + // '@' + indexOfIdentifier = i; + } + else if (code === 93) { + // ']' + indexOfClosingBracket = i; + } + else if (code === 58) { + // ':' + indexOfPort = i; + } + else if (code >= 65 && code <= 90) { + hasUpper = true; + } + } + // Detect identifier: '@' + if (indexOfIdentifier !== -1 && + indexOfIdentifier > start && + indexOfIdentifier < end) { + start = indexOfIdentifier + 1; + } + // Handle ipv6 addresses + if (url.charCodeAt(start) === 91 /* '[' */) { + if (indexOfClosingBracket !== -1) { + return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); + } + return null; + } + else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { + // Detect port: ':' + end = indexOfPort; } - default: - return x; } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull$1(x) || !isObject$1(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect$1(x); + // Trim trailing dots + while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) { + end -= 1; } - } - return str; -} - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -function deprecate(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined$1(global$1.process)) { - return function() { - return deprecate(fn, msg).apply(this, arguments); - }; - } - - if (browser$1.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (browser$1.throwDeprecation) { - throw new Error(msg); - } else if (browser$1.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; + const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; + if (hasUpper) { + return hostname.toLowerCase(); } - return fn.apply(this, arguments); - } - - return deprecated; + return hostname; } - -var debugs = {}; -var debugEnviron; -function debuglog(set) { - if (isUndefined$1(debugEnviron)) - debugEnviron = browser$1.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = 0; - debugs[set] = function() { - var msg = format.apply(null, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; +//# sourceMappingURL=extract-hostname.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/is-ip.js +/** + * Check if a hostname is an IP. You should be aware that this only works + * because `hostname` is already garanteed to be a valid hostname! + */ +function isProbablyIpv4(hostname) { + // Cannot be shorted than 1.1.1.1 + if (hostname.length < 7) { + return false; } - } - return debugs[set]; + // Cannot be longer than: 255.255.255.255 + if (hostname.length > 15) { + return false; + } + let numberOfDots = 0; + for (let i = 0; i < hostname.length; i += 1) { + const code = hostname.charCodeAt(i); + if (code === 46 /* '.' */) { + numberOfDots += 1; + } + else if (code < 48 /* '0' */ || code > 57 /* '9' */) { + return false; + } + } + return (numberOfDots === 3 && + hostname.charCodeAt(0) !== 46 /* '.' */ && + hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */); } - /** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. + * Similar to isProbablyIpv4. */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect$1(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean$1(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - _extend(ctx, opts); - } - // set default options - if (isUndefined$1(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined$1(ctx.depth)) ctx.depth = 2; - if (isUndefined$1(ctx.colors)) ctx.colors = false; - if (isUndefined$1(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect$1.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect$1.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect$1.styles[styleType]; - - if (style) { - return '\u001b[' + inspect$1.colors[style][0] + 'm' + str + - '\u001b[' + inspect$1.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction$1(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== inspect$1 && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString$1(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError$1(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction$1(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp$1(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +function isProbablyIpv6(hostname) { + if (hostname.length < 3) { + return false; } - if (isDate$1(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); + let start = hostname[0] === '[' ? 1 : 0; + let end = hostname.length; + if (hostname[end - 1] === ']') { + end -= 1; } - if (isError$1(value)) { - return formatError(value); + // We only consider the maximum size of a normal IPV6. Note that this will + // fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case + // and a proper validation library should be used for these. + if (end - start > 39) { + return false; } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray$1(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction$1(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp$1(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate$1(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError$1(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp$1(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); + let hasColon = false; + for (; start < end; start += 1) { + const code = hostname.charCodeAt(start); + if (code === 58 /* ':' */) { + hasColon = true; + } + else if (((code >= 48 && code <= 57) || // 0-9 + (code >= 97 && code <= 102) || // a-f + (code >= 65 && code <= 90)) === // A-F + false) { + return false; + } } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); + return hasColon; } - - -function formatPrimitive(ctx, value) { - if (isUndefined$1(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString$1(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber$1(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean$1(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull$1(value)) - return ctx.stylize('null', 'null'); +/** + * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4). + * This *will not* work on any string. We need `hostname` to be a valid + * hostname. + */ +function isIp(hostname) { + return isProbablyIpv6(hostname) || isProbablyIpv4(hostname); } - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; +//# sourceMappingURL=is-ip.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/is-valid.js +/** + * Implements fast shallow verification of hostnames. This does not perform a + * struct check on the content of labels (classes of Unicode characters, etc.) + * but instead check that the structure is valid (number of labels, length of + * labels, etc.). + * + * If you need stricter validation, consider using an external library. + */ +function isValidAscii(code) { + return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127); } - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (es_hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); +/** + * Check if a hostname string is valid. It's usually a preliminary check before + * trying to use getDomain or anything else. + * + * Beware: it does not check if the TLD exists. + */ +/* harmony default export */ function is_valid(hostname) { + if (hostname.length > 255) { + return false; } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); + if (hostname.length === 0) { + return false; } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); + if ( /*@__INLINE__*/isValidAscii(hostname.charCodeAt(0)) === false) { + return false; } - } - if (!es_hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull$1(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); + // Validate hostname according to RFC + let lastDotIndex = -1; + let lastCharCode = -1; + const len = hostname.length; + for (let i = 0; i < len; i += 1) { + const code = hostname.charCodeAt(i); + if (code === 46 /* '.' */) { + if ( + // Check that previous label is < 63 bytes long (64 = 63 + '.') + i - lastDotIndex > 64 || + // Check that previous character was not already a '.' + lastCharCode === 46 || + // Check that the previous label does not end with a '-' (dash) + lastCharCode === 45 || + // Check that the previous label does not end with a '_' (underscore) + lastCharCode === 95) { + return false; + } + lastDotIndex = i; } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined$1(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var length = output.reduce(function(prev, cur) { - if (cur.indexOf('\n') >= 0) ; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray$1(ar) { - return Array.isArray(ar); -} - -function isBoolean$1(arg) { - return typeof arg === 'boolean'; -} - -function isNull$1(arg) { - return arg === null; -} - -function isNullOrUndefined$1(arg) { - return arg == null; -} - -function isNumber$1(arg) { - return typeof arg === 'number'; -} - -function isString$1(arg) { - return typeof arg === 'string'; -} - -function isSymbol$1(arg) { - return typeof arg === 'symbol'; -} - -function isUndefined$1(arg) { - return arg === void 0; -} - -function isRegExp$1(re) { - return isObject$1(re) && objectToString$1(re) === '[object RegExp]'; -} - -function isObject$1(arg) { - return typeof arg === 'object' && arg !== null; -} - -function isDate$1(d) { - return isObject$1(d) && objectToString$1(d) === '[object Date]'; -} - -function isError$1(e) { - return isObject$1(e) && - (objectToString$1(e) === '[object Error]' || e instanceof Error); -} - -function isFunction$1(arg) { - return typeof arg === 'function'; -} - -function isPrimitive$1(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} - -function isBuffer(maybeBuf) { - return Buffer.isBuffer(maybeBuf); -} - -function objectToString$1(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -function log() { - console.log('%s - %s', timestamp(), format.apply(null, arguments)); -} - -function _extend(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject$1(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -} -function es_hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -var _polyfillNode_util = { - inherits: inherits$1, - _extend: _extend, - log: log, - isBuffer: isBuffer, - isPrimitive: isPrimitive$1, - isFunction: isFunction$1, - isError: isError$1, - isDate: isDate$1, - isObject: isObject$1, - isRegExp: isRegExp$1, - isUndefined: isUndefined$1, - isSymbol: isSymbol$1, - isString: isString$1, - isNumber: isNumber$1, - isNullOrUndefined: isNullOrUndefined$1, - isNull: isNull$1, - isBoolean: isBoolean$1, - isArray: isArray$1, - inspect: inspect$1, - deprecate: deprecate, - format: format, - debuglog: debuglog -}; - -var _polyfillNode_util$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - format: format, - deprecate: deprecate, - debuglog: debuglog, - inspect: inspect$1, - isArray: isArray$1, - isBoolean: isBoolean$1, - isNull: isNull$1, - isNullOrUndefined: isNullOrUndefined$1, - isNumber: isNumber$1, - isString: isString$1, - isSymbol: isSymbol$1, - isUndefined: isUndefined$1, - isRegExp: isRegExp$1, - isObject: isObject$1, - isDate: isDate$1, - isError: isError$1, - isFunction: isFunction$1, - isPrimitive: isPrimitive$1, - isBuffer: isBuffer, - log: log, - inherits: inherits$1, - _extend: _extend, - 'default': _polyfillNode_util -}); - -function compare(a, b) { - if (a === b) { - return 0; - } - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break; + else if (( /*@__INLINE__*/isValidAscii(code) || code === 45 || code === 95) === + false) { + // Check if there is a forbidden character in the label + return false; + } + lastCharCode = code; } - } - - if (x < y) { - return -1; - } - if (y < x) { - return 1; - } - return 0; -} -var hasOwn = Object.prototype.hasOwnProperty; - -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - if (hasOwn.call(obj, key)) keys.push(key); - } - return keys; -}; -var pSlice = Array.prototype.slice; -var _functionsHaveNames; -function functionsHaveNames() { - if (typeof _functionsHaveNames !== 'undefined') { - return _functionsHaveNames; - } - return _functionsHaveNames = (function () { - return function foo() {}.name === 'foo'; - }()); -} -function pToString (obj) { - return Object.prototype.toString.call(obj); -} -function isView(arrbuf) { - if (isBuffer$1(arrbuf)) { - return false; - } - if (typeof global$1.ArrayBuffer !== 'function') { - return false; - } - if (typeof ArrayBuffer.isView === 'function') { - return ArrayBuffer.isView(arrbuf); - } - if (!arrbuf) { - return false; - } - if (arrbuf instanceof DataView) { - return true; - } - if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { - return true; - } - return false; + return ( + // Check that last label is shorter than 63 chars + len - lastDotIndex - 1 <= 63 && + // Check that the last character is an allowed trailing label character. + // Since we already checked that the char is a valid hostname character, + // we only need to check that it's different from '-'. + lastCharCode !== 45); } -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -function assert$2(value, message) { - if (!value) fail(value, true, message, '==', ok); +//# sourceMappingURL=is-valid.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/options.js +function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) { + return { + allowIcannDomains, + allowPrivateDomains, + detectIp, + extractHostname, + mixedInputs, + validHosts, + validateHostname, + }; } - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({ message: message, -// actual: actual, -// expected: expected }) - -var regex = /\s*function\s+([^\(\s]*)\s*/; -// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js -function getName(func) { - if (!isFunction$1(func)) { - return; - } - if (functionsHaveNames()) { - return func.name; - } - var str = func.toString(); - var match = str.match(regex); - return match && match[1]; +const DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({}); +function setDefaults(options) { + if (options === undefined) { + return DEFAULT_OPTIONS; + } + return /*@__INLINE__*/ setDefaultsImpl(options); } -assert$2.AssertionError = AssertionError; -function AssertionError(options) { - this.name = 'AssertionError'; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - if (options.message) { - this.message = options.message; - this.generatedMessage = false; - } else { - this.message = getMessage(this); - this.generatedMessage = true; - } - var stackStartFunction = options.stackStartFunction || fail; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } else { - // non v8 browsers so we can have a stacktrace - var err = new Error(); - if (err.stack) { - var out = err.stack; - - // try to strip useless frames - var fn_name = getName(stackStartFunction); - var idx = out.indexOf('\n' + fn_name); - if (idx >= 0) { - // once we have located the function frame - // we need to strip out everything before it (and its line) - var next_line = out.indexOf('\n', idx + 1); - out = out.substring(next_line + 1); - } - - this.stack = out; +//# sourceMappingURL=options.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/subdomain.js +/** + * Returns the subdomain of a hostname string + */ +function getSubdomain(hostname, domain) { + // If `hostname` and `domain` are the same, then there is no sub-domain + if (domain.length === hostname.length) { + return ''; } - } + return hostname.slice(0, -domain.length - 1); } +//# sourceMappingURL=subdomain.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/factory.js +/** + * Implement a factory allowing to plug different implementations of suffix + * lookup (e.g.: using a trie or the packed hashes datastructures). This is used + * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints. + */ -// assert.AssertionError instanceof Error -inherits$1(AssertionError, Error); - -function truncate(s, n) { - if (typeof s === 'string') { - return s.length < n ? s : s.slice(0, n); - } else { - return s; - } -} -function inspect(something) { - if (functionsHaveNames() || !isFunction$1(something)) { - return inspect$1(something); - } - var rawname = getName(something); - var name = rawname ? ': ' + rawname : ''; - return '[Function' + name + ']'; -} -function getMessage(self) { - return truncate(inspect(self.actual), 128) + ' ' + - self.operator + ' ' + - truncate(inspect(self.expected), 128); -} -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} -// EXTENSION! allows for well behaved errors defined elsewhere. -assert$2.fail = fail; -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, !!guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. -function ok(value, message) { - if (!value) fail(value, true, message, '==', ok); -} -assert$2.ok = ok; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); -assert$2.equal = equal; -function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, '==', equal); -} -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); -assert$2.notEqual = notEqual; -function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, '!=', notEqual); - } -} -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); -assert$2.deepEqual = deepEqual$1; -function deepEqual$1(actual, expected, message) { - if (!_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'deepEqual', deepEqual$1); - } +function getEmptyResult() { + return { + domain: null, + domainWithoutSuffix: null, + hostname: null, + isIcann: null, + isIp: null, + isPrivate: null, + publicSuffix: null, + subdomain: null, + }; } -assert$2.deepStrictEqual = deepStrictEqual; -function deepStrictEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'deepStrictEqual', deepStrictEqual); - } +function factory_resetResult(result) { + result.domain = null; + result.domainWithoutSuffix = null; + result.hostname = null; + result.isIcann = null; + result.isIp = null; + result.isPrivate = null; + result.publicSuffix = null; + result.subdomain = null; } - -function _deepEqual(actual, expected, strict, memos) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if (isBuffer$1(actual) && isBuffer$1(expected)) { - return compare(actual, expected) === 0; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (isDate$1(actual) && isDate$1(expected)) { - return actual.getTime() === expected.getTime(); - - // 7.3 If the expected value is a RegExp object, the actual value is - // equivalent if it is also a RegExp object with the same source and - // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). - } else if (isRegExp$1(actual) && isRegExp$1(expected)) { - return actual.source === expected.source && - actual.global === expected.global && - actual.multiline === expected.multiline && - actual.lastIndex === expected.lastIndex && - actual.ignoreCase === expected.ignoreCase; - - // 7.4. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if ((actual === null || typeof actual !== 'object') && - (expected === null || typeof expected !== 'object')) { - return strict ? actual === expected : actual == expected; - - // If both values are instances of typed arrays, wrap their underlying - // ArrayBuffers in a Buffer each to increase performance - // This optimization requires the arrays to have the same type as checked by - // Object.prototype.toString (aka pToString). Never perform binary - // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their - // bit patterns are not identical. - } else if (isView(actual) && isView(expected) && - pToString(actual) === pToString(expected) && - !(actual instanceof Float32Array || - actual instanceof Float64Array)) { - return compare(new Uint8Array(actual.buffer), - new Uint8Array(expected.buffer)) === 0; - - // 7.5 For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else if (isBuffer$1(actual) !== isBuffer$1(expected)) { - return false; - } else { - memos = memos || {actual: [], expected: []}; - - var actualIndex = memos.actual.indexOf(actual); - if (actualIndex !== -1) { - if (actualIndex === memos.expected.indexOf(expected)) { - return true; - } +function factory_parseImpl(url, step, suffixLookup, partialOptions, result) { + const options = /*@__INLINE__*/ setDefaults(partialOptions); + // Very fast approximate check to make sure `url` is a string. This is needed + // because the library will not necessarily be used in a typed setup and + // values of arbitrary types might be given as argument. + if (typeof url !== 'string') { + return result; } - - memos.actual.push(actual); - memos.expected.push(expected); - - return objEquiv(actual, expected, strict, memos); - } -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b, strict, actualVisitedObjects) { - if (a === null || a === undefined || b === null || b === undefined) - return false; - // if one is a primitive, the other must be same - if (isPrimitive$1(a) || isPrimitive$1(b)) - return a === b; - if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) - return false; - var aIsArgs = isArguments(a); - var bIsArgs = isArguments(b); - if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) - return false; - if (aIsArgs) { - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b, strict); - } - var ka = objectKeys(a); - var kb = objectKeys(b); - var key, i; - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length !== kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] !== kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); -assert$2.notDeepEqual = notDeepEqual; -function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'notDeepEqual', notDeepEqual); - } -} - -assert$2.notDeepStrictEqual = notDeepStrictEqual; -function notDeepStrictEqual(actual, expected, message) { - if (_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); - } -} - - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); -assert$2.strictEqual = strictEqual; -function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, '===', strictEqual); - } -} - -// 10. The strict non-equality assertion tests for strict inequality, as -// determined by !==. assert.notStrictEqual(actual, expected, message_opt); -assert$2.notStrictEqual = notStrictEqual; -function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, '!==', notStrictEqual); - } + // Extract hostname from `url` only if needed. This can be made optional + // using `options.extractHostname`. This option will typically be used + // whenever we are sure the inputs to `parse` are already hostnames and not + // arbitrary URLs. + // + // `mixedInput` allows to specify if we expect a mix of URLs and hostnames + // as input. If only hostnames are expected then `extractHostname` can be + // set to `false` to speed-up parsing. If only URLs are expected then + // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint + // and will not change the behavior of the library. + if (options.extractHostname === false) { + result.hostname = url; + } + else if (options.mixedInputs === true) { + result.hostname = extractHostname(url, is_valid(url)); + } + else { + result.hostname = extractHostname(url, false); + } + if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) { + return result; + } + // Check if `hostname` is a valid ip address + if (options.detectIp === true) { + result.isIp = isIp(result.hostname); + if (result.isIp === true) { + return result; + } + } + // Perform optional hostname validation. If hostname is not valid, no need to + // go further as there will be no valid domain or sub-domain. + if (options.validateHostname === true && + options.extractHostname === true && + is_valid(result.hostname) === false) { + result.hostname = null; + return result; + } + // Extract public suffix + suffixLookup(result.hostname, options, result); + if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) { + return result; + } + // Extract domain + result.domain = getDomain(result.publicSuffix, result.hostname, options); + if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) { + return result; + } + // Extract subdomain + result.subdomain = getSubdomain(result.hostname, result.domain); + if (step === 4 /* FLAG.SUB_DOMAIN */) { + return result; + } + // Extract domain without suffix + result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix); + return result; } - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (Object.prototype.toString.call(expected) == '[object RegExp]') { - return expected.test(actual); - } - - try { - if (actual instanceof expected) { - return true; +//# sourceMappingURL=factory.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/src/lookup/fast-path.js +/* harmony default export */ function fast_path(hostname, options, out) { + // Fast path for very popular suffixes; this allows to by-pass lookup + // completely as well as any extra allocation or string manipulation. + if (options.allowPrivateDomains === false && hostname.length > 3) { + const last = hostname.length - 1; + const c3 = hostname.charCodeAt(last); + const c2 = hostname.charCodeAt(last - 1); + const c1 = hostname.charCodeAt(last - 2); + const c0 = hostname.charCodeAt(last - 3); + if (c3 === 109 /* 'm' */ && + c2 === 111 /* 'o' */ && + c1 === 99 /* 'c' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'com'; + return true; + } + else if (c3 === 103 /* 'g' */ && + c2 === 114 /* 'r' */ && + c1 === 111 /* 'o' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'org'; + return true; + } + else if (c3 === 117 /* 'u' */ && + c2 === 100 /* 'd' */ && + c1 === 101 /* 'e' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'edu'; + return true; + } + else if (c3 === 118 /* 'v' */ && + c2 === 111 /* 'o' */ && + c1 === 103 /* 'g' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'gov'; + return true; + } + else if (c3 === 116 /* 't' */ && + c2 === 101 /* 'e' */ && + c1 === 110 /* 'n' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'net'; + return true; + } + else if (c3 === 101 /* 'e' */ && + c2 === 100 /* 'd' */ && + c1 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'de'; + return true; + } } - } catch (e) { - // Ignore. The instanceof check doesn't work for arrow functions. - } - - if (Error.isPrototypeOf(expected)) { return false; - } - - return expected.call({}, actual) === true; -} - -function _tryBlock(block) { - var error; - try { - block(); - } catch (e) { - error = e; - } - return error; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof block !== 'function') { - throw new TypeError('"block" argument must be a function'); - } - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - actual = _tryBlock(block); - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail(actual, expected, 'Missing expected exception' + message); - } - - var userProvidedMessage = typeof message === 'string'; - var isUnwantedException = !shouldThrow && isError$1(actual); - var isUnexpectedException = !shouldThrow && actual && !expected; - - if ((isUnwantedException && - userProvidedMessage && - expectedException(actual, expected)) || - isUnexpectedException) { - fail(actual, expected, 'Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); -assert$2.throws = es_throws; -function es_throws(block, /*optional*/error, /*optional*/message) { - _throws(true, block, error, message); -} - -// EXTENSION! This is annoying to write outside this module. -assert$2.doesNotThrow = doesNotThrow; -function doesNotThrow(block, /*optional*/error, /*optional*/message) { - _throws(false, block, error, message); -} - -assert$2.ifError = ifError; -function ifError(err) { - if (err) throw err; } +//# sourceMappingURL=fast-path.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts-core/dist/es6/index.js -var _polyfillNode_assert = /*#__PURE__*/Object.freeze({ - __proto__: null, - 'default': assert$2, - AssertionError: AssertionError, - fail: fail, - ok: ok, - assert: ok, - equal: equal, - notEqual: notEqual, - deepEqual: deepEqual$1, - deepStrictEqual: deepStrictEqual, - notDeepEqual: notDeepEqual, - notDeepStrictEqual: notDeepStrictEqual, - strictEqual: strictEqual, - notStrictEqual: notStrictEqual, - throws: es_throws, - doesNotThrow: doesNotThrow, - ifError: ifError -}); -var require$$0 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_assert); -var domain; +//# sourceMappingURL=index.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts/dist/es6/src/data/trie.js +const exceptions = (function () { + const _0 = { "$": 1, "succ": {} }, _1 = { "$": 0, "succ": { "city": _0 } }; + const exceptions = { "$": 0, "succ": { "ck": { "$": 0, "succ": { "www": _0 } }, "jp": { "$": 0, "succ": { "kawasaki": _1, "kitakyushu": _1, "kobe": _1, "nagoya": _1, "sapporo": _1, "sendai": _1, "yokohama": _1 } } } }; + ; + return exceptions; +})(); +const rules = (function () { + const _2 = { "$": 1, "succ": {} }, _3 = { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "mil": _2, "org": _2 } }, _4 = { "$": 2, "succ": {} }, _5 = { "$": 1, "succ": { "blogspot": _4 } }, _6 = { "$": 1, "succ": { "gov": _2 } }, _7 = { "$": 0, "succ": { "*": _4 } }, _8 = { "$": 0, "succ": { "*": _2 } }, _9 = { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "gov": _2 } }, _10 = { "$": 1, "succ": { "co": _4 } }, _11 = { "$": 1, "succ": { "ng": _4 } }, _12 = { "$": 0, "succ": { "s3": _4 } }, _13 = { "$": 0, "succ": { "dualstack": _12 } }, _14 = { "$": 0, "succ": { "s3": _4, "dualstack": _12, "s3-website": _4 } }, _15 = { "$": 0, "succ": { "apps": _4 } }, _16 = { "$": 0, "succ": { "app": _4 } }, _17 = { "$": 0, "succ": { "j": _4 } }, _18 = { "$": 0, "succ": { "user": _4 } }, _19 = { "$": 1, "succ": { "ybo": _4 } }, _20 = { "$": 1, "succ": { "gov": _2, "blogspot": _4, "nym": _4 } }, _21 = { "$": 0, "succ": { "cust": _4 } }, _22 = { "$": 1, "succ": { "edu": _2, "biz": _2, "net": _2, "org": _2, "gov": _2, "info": _2, "com": _2 } }, _23 = { "$": 1, "succ": { "blogspot": _4, "nym": _4 } }, _24 = { "$": 1, "succ": { "for": _4 } }, _25 = { "$": 1, "succ": { "barsy": _4 } }, _26 = { "$": 0, "succ": { "forgot": _4 } }, _27 = { "$": 0, "succ": { "jelastic": _4 } }, _28 = { "$": 1, "succ": { "gs": _2 } }, _29 = { "$": 0, "succ": { "nes": _2 } }, _30 = { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _2 } }, _31 = { "$": 1, "succ": { "cc": _2, "lib": _2 } }; + const rules = { "$": 0, "succ": { "ac": _3, "ad": { "$": 1, "succ": { "nom": _2 } }, "ae": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "sch": _2, "ac": _2, "gov": _2, "mil": _2, "blogspot": _4, "nom": _4 } }, "aero": { "$": 1, "succ": { "accident-investigation": _2, "accident-prevention": _2, "aerobatic": _2, "aeroclub": _2, "aerodrome": _2, "agents": _2, "aircraft": _2, "airline": _2, "airport": _2, "air-surveillance": _2, "airtraffic": _2, "air-traffic-control": _2, "ambulance": _2, "amusement": _2, "association": _2, "author": _2, "ballooning": _2, "broker": _2, "caa": _2, "cargo": _2, "catering": _2, "certification": _2, "championship": _2, "charter": _2, "civilaviation": _2, "club": _2, "conference": _2, "consultant": _2, "consulting": _2, "control": _2, "council": _2, "crew": _2, "design": _2, "dgca": _2, "educator": _2, "emergency": _2, "engine": _2, "engineer": _2, "entertainment": _2, "equipment": _2, "exchange": _2, "express": _2, "federation": _2, "flight": _2, "fuel": _2, "gliding": _2, "government": _2, "groundhandling": _2, "group": _2, "hanggliding": _2, "homebuilt": _2, "insurance": _2, "journal": _2, "journalist": _2, "leasing": _2, "logistics": _2, "magazine": _2, "maintenance": _2, "media": _2, "microlight": _2, "modelling": _2, "navigation": _2, "parachuting": _2, "paragliding": _2, "passenger-association": _2, "pilot": _2, "press": _2, "production": _2, "recreation": _2, "repbody": _2, "res": _2, "research": _2, "rotorcraft": _2, "safety": _2, "scientist": _2, "services": _2, "show": _2, "skydiving": _2, "software": _2, "student": _2, "trader": _2, "trading": _2, "trainer": _2, "union": _2, "workinggroup": _2, "works": _2 } }, "af": { "$": 1, "succ": { "gov": _2, "com": _2, "org": _2, "net": _2, "edu": _2, "nom": _4 } }, "ag": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "co": _2, "nom": _2 } }, "ai": { "$": 1, "succ": { "off": _2, "com": _2, "net": _2, "org": _2, "uwu": _4, "nom": _4 } }, "al": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "blogspot": _4, "nom": _4 } }, "am": { "$": 1, "succ": { "co": _2, "com": _2, "commune": _2, "net": _2, "org": _2, "blogspot": _4, "neko": _4, "nyaa": _4 } }, "ao": { "$": 1, "succ": { "ed": _2, "gv": _2, "og": _2, "co": _2, "pb": _2, "it": _2 } }, "aq": _2, "ar": { "$": 1, "succ": { "com": _5, "edu": _2, "gob": _2, "gov": _2, "int": _2, "mil": _2, "musica": _2, "net": _2, "org": _2, "tur": _2 } }, "arpa": { "$": 1, "succ": { "e164": _2, "in-addr": _2, "ip6": _2, "iris": _2, "uri": _2, "urn": _2 } }, "as": _6, "asia": { "$": 1, "succ": { "cloudns": _4 } }, "at": { "$": 1, "succ": { "ac": { "$": 1, "succ": { "sth": _2 } }, "co": _5, "gv": _2, "or": _2, "funkfeuer": { "$": 0, "succ": { "wien": _4 } }, "futurecms": { "$": 0, "succ": { "*": _4, "ex": _7, "in": _7 } }, "futurehosting": _4, "futuremailing": _4, "ortsinfo": { "$": 0, "succ": { "ex": _7, "kunden": _7 } }, "biz": _4, "info": _4, "priv": _4, "12hp": _4, "2ix": _4, "4lima": _4, "lima-city": _4 } }, "au": { "$": 1, "succ": { "com": _5, "net": _2, "org": _2, "edu": { "$": 1, "succ": { "act": _2, "catholic": _2, "nsw": { "$": 1, "succ": { "schools": _2 } }, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "gov": { "$": 1, "succ": { "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "asn": _2, "id": _2, "info": _2, "conf": _2, "oz": _2, "act": _2, "nsw": _2, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "aw": { "$": 1, "succ": { "com": _2 } }, "ax": { "$": 1, "succ": { "be": _4, "cat": _4, "es": _4, "eu": _4, "gg": _4, "mc": _4, "us": _4, "xy": _4 } }, "az": { "$": 1, "succ": { "com": _2, "net": _2, "int": _2, "gov": _2, "org": _2, "edu": _2, "info": _2, "pp": _2, "mil": _2, "name": _2, "pro": _2, "biz": _2 } }, "ba": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "blogspot": _4 } }, "bb": { "$": 1, "succ": { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "store": _2, "tv": _2 } }, "bd": _8, "be": { "$": 1, "succ": { "ac": _2, "webhosting": _4, "blogspot": _4, "transurl": _7 } }, "bf": _6, "bg": { "$": 1, "succ": { "0": _2, "1": _2, "2": _2, "3": _2, "4": _2, "5": _2, "6": _2, "7": _2, "8": _2, "9": _2, "a": _2, "b": _2, "c": _2, "d": _2, "e": _2, "f": _2, "g": _2, "h": _2, "i": _2, "j": _2, "k": _2, "l": _2, "m": _2, "n": _2, "o": _2, "p": _2, "q": _2, "r": _2, "s": _2, "t": _2, "u": _2, "v": _2, "w": _2, "x": _2, "y": _2, "z": _2, "blogspot": _4, "barsy": _4 } }, "bh": _9, "bi": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "or": _2, "org": _2 } }, "biz": { "$": 1, "succ": { "cloudns": _4, "dyndns": _4, "for-better": _4, "for-more": _4, "for-some": _4, "for-the": _4, "selfip": _4, "webhop": _4, "bpl": _4, "orx": _4, "mmafan": _4, "myftp": _4, "no-ip": _4, "dscloud": _4 } }, "bj": { "$": 1, "succ": { "asso": _2, "barreau": _2, "gouv": _2, "blogspot": _4 } }, "bm": _9, "bn": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "co": _4 } }, "bo": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "int": _2, "org": _2, "net": _2, "mil": _2, "tv": _2, "web": _2, "academia": _2, "agro": _2, "arte": _2, "blog": _2, "bolivia": _2, "ciencia": _2, "cooperativa": _2, "democracia": _2, "deporte": _2, "ecologia": _2, "economia": _2, "empresa": _2, "indigena": _2, "industria": _2, "info": _2, "medicina": _2, "movimiento": _2, "musica": _2, "natural": _2, "nombre": _2, "noticias": _2, "patria": _2, "politica": _2, "profesional": _2, "plurinacional": _2, "pueblo": _2, "revista": _2, "salud": _2, "tecnologia": _2, "tksat": _2, "transporte": _2, "wiki": _2 } }, "br": { "$": 1, "succ": { "9guacu": _2, "abc": _2, "adm": _2, "adv": _2, "agr": _2, "aju": _2, "am": _2, "anani": _2, "aparecida": _2, "app": _2, "arq": _2, "art": _2, "ato": _2, "b": _2, "barueri": _2, "belem": _2, "bhz": _2, "bib": _2, "bio": _2, "blog": _2, "bmd": _2, "boavista": _2, "bsb": _2, "campinagrande": _2, "campinas": _2, "caxias": _2, "cim": _2, "cng": _2, "cnt": _2, "com": _5, "contagem": _2, "coop": _2, "coz": _2, "cri": _2, "cuiaba": _2, "curitiba": _2, "def": _2, "des": _2, "det": _2, "dev": _2, "ecn": _2, "eco": _2, "edu": _2, "emp": _2, "enf": _2, "eng": _2, "esp": _2, "etc": _2, "eti": _2, "far": _2, "feira": _2, "flog": _2, "floripa": _2, "fm": _2, "fnd": _2, "fortal": _2, "fot": _2, "foz": _2, "fst": _2, "g12": _2, "geo": _2, "ggf": _2, "goiania": _2, "gov": { "$": 1, "succ": { "ac": _2, "al": _2, "am": _2, "ap": _2, "ba": _2, "ce": _2, "df": _2, "es": _2, "go": _2, "ma": _2, "mg": _2, "ms": _2, "mt": _2, "pa": _2, "pb": _2, "pe": _2, "pi": _2, "pr": _2, "rj": _2, "rn": _2, "ro": _2, "rr": _2, "rs": _2, "sc": _2, "se": _2, "sp": _2, "to": _2 } }, "gru": _2, "imb": _2, "ind": _2, "inf": _2, "jab": _2, "jampa": _2, "jdf": _2, "joinville": _2, "jor": _2, "jus": _2, "leg": { "$": 1, "succ": { "ac": _4, "al": _4, "am": _4, "ap": _4, "ba": _4, "ce": _4, "df": _4, "es": _4, "go": _4, "ma": _4, "mg": _4, "ms": _4, "mt": _4, "pa": _4, "pb": _4, "pe": _4, "pi": _4, "pr": _4, "rj": _4, "rn": _4, "ro": _4, "rr": _4, "rs": _4, "sc": _4, "se": _4, "sp": _4, "to": _4 } }, "lel": _2, "log": _2, "londrina": _2, "macapa": _2, "maceio": _2, "manaus": _2, "maringa": _2, "mat": _2, "med": _2, "mil": _2, "morena": _2, "mp": _2, "mus": _2, "natal": _2, "net": _2, "niteroi": _2, "nom": _8, "not": _2, "ntr": _2, "odo": _2, "ong": _2, "org": _2, "osasco": _2, "palmas": _2, "poa": _2, "ppg": _2, "pro": _2, "psc": _2, "psi": _2, "pvh": _2, "qsl": _2, "radio": _2, "rec": _2, "recife": _2, "rep": _2, "ribeirao": _2, "rio": _2, "riobranco": _2, "riopreto": _2, "salvador": _2, "sampa": _2, "santamaria": _2, "santoandre": _2, "saobernardo": _2, "saogonca": _2, "seg": _2, "sjc": _2, "slg": _2, "slz": _2, "sorocaba": _2, "srv": _2, "taxi": _2, "tc": _2, "tec": _2, "teo": _2, "the": _2, "tmp": _2, "trd": _2, "tur": _2, "tv": _2, "udi": _2, "vet": _2, "vix": _2, "vlog": _2, "wiki": _2, "zlg": _2 } }, "bs": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "we": _4 } }, "bt": _9, "bv": _2, "bw": { "$": 1, "succ": { "co": _2, "org": _2 } }, "by": { "$": 1, "succ": { "gov": _2, "mil": _2, "com": _5, "of": _2, "nym": _4 } }, "bz": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "za": _4, "nom": _4, "nym": _4 } }, "ca": { "$": 1, "succ": { "ab": _2, "bc": _2, "mb": _2, "nb": _2, "nf": _2, "nl": _2, "ns": _2, "nt": _2, "nu": _2, "on": _2, "pe": _2, "qc": _2, "sk": _2, "yk": _2, "gc": _2, "barsy": _4, "awdev": _7, "co": _4, "blogspot": _4, "no-ip": _4 } }, "cat": _2, "cc": { "$": 1, "succ": { "cloudns": _4, "ftpaccess": _4, "game-server": _4, "myphotos": _4, "scrapping": _4, "twmail": _4, "csx": _4, "fantasyleague": _4 } }, "cd": _6, "cf": _5, "cg": _2, "ch": { "$": 1, "succ": { "square7": _4, "blogspot": _4, "linkyard-cloud": _4, "dnsking": _4, "gotdns": _4, "12hp": _4, "2ix": _4, "4lima": _4, "lima-city": _4 } }, "ci": { "$": 1, "succ": { "org": _2, "or": _2, "com": _2, "co": _2, "edu": _2, "ed": _2, "ac": _2, "net": _2, "go": _2, "asso": _2, "xn--aroport-bya": _2, "aéroport": _2, "int": _2, "presse": _2, "md": _2, "gouv": _2, "fin": _4, "nl": _4 } }, "ck": _8, "cl": { "$": 1, "succ": { "aprendemas": _2, "co": _2, "gob": _2, "gov": _2, "mil": _2, "blogspot": _4, "nom": _4 } }, "cm": { "$": 1, "succ": { "co": _2, "com": _2, "gov": _2, "net": _2 } }, "cn": { "$": 1, "succ": { "ac": _2, "com": { "$": 1, "succ": { "amazonaws": { "$": 0, "succ": { "compute": _7, "eb": { "$": 0, "succ": { "cn-north-1": _4, "cn-northwest-1": _4 } }, "elb": _7, "cn-north-1": _12 } } } }, "edu": _2, "gov": _2, "net": _2, "org": _2, "mil": _2, "xn--55qx5d": _2, "公司": _2, "xn--io0a7i": _2, "网络": _2, "xn--od0alg": _2, "網絡": _2, "ah": _2, "bj": _2, "cq": _2, "fj": _2, "gd": _2, "gs": _2, "gz": _2, "gx": _2, "ha": _2, "hb": _2, "he": _2, "hi": _2, "hl": _2, "hn": _2, "jl": _2, "js": _2, "jx": _2, "ln": _2, "nm": _2, "nx": _2, "qh": _2, "sc": _2, "sd": _2, "sh": _2, "sn": _2, "sx": _2, "tj": _2, "xj": _2, "xz": _2, "yn": _2, "zj": _2, "hk": _2, "mo": _2, "tw": _2, "instantcloud": _4 } }, "co": { "$": 1, "succ": { "arts": _2, "com": _5, "edu": _2, "firm": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "rec": _2, "web": _2, "carrd": _4, "crd": _4, "otap": _7, "leadpages": _4, "lpages": _4, "mypi": _4, "n4t": _4, "nodum": _4, "repl": _4 } }, "com": { "$": 1, "succ": { "adobeaemcloud": { "$": 2, "succ": { "dev": _7 } }, "kasserver": _4, "amazonaws": { "$": 0, "succ": { "compute": _7, "compute-1": _7, "us-east-1": { "$": 2, "succ": { "dualstack": _12 } }, "elb": _7, "s3": _4, "s3-ap-northeast-1": _4, "s3-ap-northeast-2": _4, "s3-ap-south-1": _4, "s3-ap-southeast-1": _4, "s3-ap-southeast-2": _4, "s3-ca-central-1": _4, "s3-eu-central-1": _4, "s3-eu-west-1": _4, "s3-eu-west-2": _4, "s3-eu-west-3": _4, "s3-external-1": _4, "s3-fips-us-gov-west-1": _4, "s3-sa-east-1": _4, "s3-us-gov-west-1": _4, "s3-us-east-2": _4, "s3-us-west-1": _4, "s3-us-west-2": _4, "ap-northeast-2": _14, "ap-south-1": _14, "ca-central-1": _14, "eu-central-1": _14, "eu-west-2": _14, "eu-west-3": _14, "us-east-2": _14, "ap-northeast-1": _13, "ap-southeast-1": _13, "ap-southeast-2": _13, "eu-west-1": _13, "sa-east-1": _13, "s3-website-us-east-1": _4, "s3-website-us-west-1": _4, "s3-website-us-west-2": _4, "s3-website-ap-northeast-1": _4, "s3-website-ap-southeast-1": _4, "s3-website-ap-southeast-2": _4, "s3-website-eu-west-1": _4, "s3-website-sa-east-1": _4 } }, "elasticbeanstalk": { "$": 2, "succ": { "ap-northeast-1": _4, "ap-northeast-2": _4, "ap-northeast-3": _4, "ap-south-1": _4, "ap-southeast-1": _4, "ap-southeast-2": _4, "ca-central-1": _4, "eu-central-1": _4, "eu-west-1": _4, "eu-west-2": _4, "eu-west-3": _4, "sa-east-1": _4, "us-east-1": _4, "us-east-2": _4, "us-gov-west-1": _4, "us-west-1": _4, "us-west-2": _4 } }, "on-aptible": _4, "myasustor": _4, "balena-devices": _4, "betainabox": _4, "bplaced": _4, "ar": _4, "br": _4, "cn": _4, "de": _4, "eu": _4, "gb": _4, "hu": _4, "jpn": _4, "kr": _4, "mex": _4, "no": _4, "qc": _4, "ru": _4, "sa": _4, "uk": _4, "us": _4, "uy": _4, "za": _4, "africa": _4, "gr": _4, "co": _4, "xenapponazure": _4, "jdevcloud": _4, "wpdevcloud": _4, "cloudcontrolled": _4, "cloudcontrolapp": _4, "trycloudflare": _4, "customer-oci": { "$": 0, "succ": { "*": _4, "oci": _7, "ocp": _7, "ocs": _7 } }, "dattolocal": _4, "dattorelay": _4, "dattoweb": _4, "mydatto": _4, "builtwithdark": _4, "drayddns": _4, "dreamhosters": _4, "mydrobo": _4, "dyndns-at-home": _4, "dyndns-at-work": _4, "dyndns-blog": _4, "dyndns-free": _4, "dyndns-home": _4, "dyndns-ip": _4, "dyndns-mail": _4, "dyndns-office": _4, "dyndns-pics": _4, "dyndns-remote": _4, "dyndns-server": _4, "dyndns-web": _4, "dyndns-wiki": _4, "dyndns-work": _4, "blogdns": _4, "cechire": _4, "dnsalias": _4, "dnsdojo": _4, "doesntexist": _4, "dontexist": _4, "doomdns": _4, "dyn-o-saur": _4, "dynalias": _4, "est-a-la-maison": _4, "est-a-la-masion": _4, "est-le-patron": _4, "est-mon-blogueur": _4, "from-ak": _4, "from-al": _4, "from-ar": _4, "from-ca": _4, "from-ct": _4, "from-dc": _4, "from-de": _4, "from-fl": _4, "from-ga": _4, "from-hi": _4, "from-ia": _4, "from-id": _4, "from-il": _4, "from-in": _4, "from-ks": _4, "from-ky": _4, "from-ma": _4, "from-md": _4, "from-mi": _4, "from-mn": _4, "from-mo": _4, "from-ms": _4, "from-mt": _4, "from-nc": _4, "from-nd": _4, "from-ne": _4, "from-nh": _4, "from-nj": _4, "from-nm": _4, "from-nv": _4, "from-oh": _4, "from-ok": _4, "from-or": _4, "from-pa": _4, "from-pr": _4, "from-ri": _4, "from-sc": _4, "from-sd": _4, "from-tn": _4, "from-tx": _4, "from-ut": _4, "from-va": _4, "from-vt": _4, "from-wa": _4, "from-wi": _4, "from-wv": _4, "from-wy": _4, "getmyip": _4, "gotdns": _4, "hobby-site": _4, "homelinux": _4, "homeunix": _4, "iamallama": _4, "is-a-anarchist": _4, "is-a-blogger": _4, "is-a-bookkeeper": _4, "is-a-bulls-fan": _4, "is-a-caterer": _4, "is-a-chef": _4, "is-a-conservative": _4, "is-a-cpa": _4, "is-a-cubicle-slave": _4, "is-a-democrat": _4, "is-a-designer": _4, "is-a-doctor": _4, "is-a-financialadvisor": _4, "is-a-geek": _4, "is-a-green": _4, "is-a-guru": _4, "is-a-hard-worker": _4, "is-a-hunter": _4, "is-a-landscaper": _4, "is-a-lawyer": _4, "is-a-liberal": _4, "is-a-libertarian": _4, "is-a-llama": _4, "is-a-musician": _4, "is-a-nascarfan": _4, "is-a-nurse": _4, "is-a-painter": _4, "is-a-personaltrainer": _4, "is-a-photographer": _4, "is-a-player": _4, "is-a-republican": _4, "is-a-rockstar": _4, "is-a-socialist": _4, "is-a-student": _4, "is-a-teacher": _4, "is-a-techie": _4, "is-a-therapist": _4, "is-an-accountant": _4, "is-an-actor": _4, "is-an-actress": _4, "is-an-anarchist": _4, "is-an-artist": _4, "is-an-engineer": _4, "is-an-entertainer": _4, "is-certified": _4, "is-gone": _4, "is-into-anime": _4, "is-into-cars": _4, "is-into-cartoons": _4, "is-into-games": _4, "is-leet": _4, "is-not-certified": _4, "is-slick": _4, "is-uberleet": _4, "is-with-theband": _4, "isa-geek": _4, "isa-hockeynut": _4, "issmarterthanyou": _4, "likes-pie": _4, "likescandy": _4, "neat-url": _4, "saves-the-whales": _4, "selfip": _4, "sells-for-less": _4, "sells-for-u": _4, "servebbs": _4, "simple-url": _4, "space-to-rent": _4, "teaches-yoga": _4, "writesthisblog": _4, "ddnsfree": _4, "ddnsgeek": _4, "giize": _4, "gleeze": _4, "kozow": _4, "loseyourip": _4, "ooguy": _4, "theworkpc": _4, "mytuleap": _4, "evennode": { "$": 0, "succ": { "eu-1": _4, "eu-2": _4, "eu-3": _4, "eu-4": _4, "us-1": _4, "us-2": _4, "us-3": _4, "us-4": _4 } }, "onfabrica": _4, "fbsbx": _15, "fastly-terrarium": _4, "fastvps-server": _4, "mydobiss": _4, "firebaseapp": _4, "freebox-os": _4, "freeboxos": _4, "gentapps": _4, "gentlentapis": _4, "githubusercontent": _4, "0emm": _7, "appspot": { "$": 2, "succ": { "r": _7 } }, "blogspot": _4, "codespot": _4, "googleapis": _4, "googlecode": _4, "pagespeedmobilizer": _4, "publishproxy": _4, "withgoogle": _4, "withyoutube": _4, "awsmppl": _4, "herokuapp": _4, "herokussl": _4, "myravendb": _4, "pixolino": _4, "dopaas": _4, "hidora": _4, "ik-server": { "$": 0, "succ": { "jcloud": _4 } }, "jelastic": { "$": 0, "succ": { "demo": _4 } }, "joyent": { "$": 0, "succ": { "cns": _7 } }, "lpusercontent": _4, "lmpm": _16, "linode": { "$": 0, "succ": { "members": _4, "nodebalancer": _7 } }, "linodeobjects": _7, "barsycenter": _4, "barsyonline": _4, "miniserver": _4, "meteorapp": { "$": 2, "succ": { "eu": _4 } }, "4u": _4, "nfshost": _4, "001www": _4, "ddnslive": _4, "myiphost": _4, "blogsyte": _4, "ciscofreak": _4, "damnserver": _4, "ditchyourip": _4, "dnsiskinky": _4, "dynns": _4, "geekgalaxy": _4, "health-carereform": _4, "homesecuritymac": _4, "homesecuritypc": _4, "myactivedirectory": _4, "mysecuritycamera": _4, "net-freaks": _4, "onthewifi": _4, "point2this": _4, "quicksytes": _4, "securitytactics": _4, "serveexchange": _4, "servehumour": _4, "servep2p": _4, "servesarcasm": _4, "stufftoread": _4, "unusualperson": _4, "workisboring": _4, "3utilities": _4, "ddnsking": _4, "myvnc": _4, "servebeer": _4, "servecounterstrike": _4, "serveftp": _4, "servegame": _4, "servehalflife": _4, "servehttp": _4, "serveirc": _4, "servemp3": _4, "servepics": _4, "servequake": _4, "observableusercontent": { "$": 0, "succ": { "static": _4 } }, "operaunite": _4, "skygearapp": _4, "outsystemscloud": _4, "ownprovider": _4, "pgfog": _4, "pagefrontapp": _4, "pagexl": _4, "gotpantheon": _4, "platter-app": _4, "pleskns": _4, "prgmr": { "$": 0, "succ": { "xen": _4 } }, "qualifioapp": _4, "qbuser": _4, "qa2": _4, "dev-myqnapcloud": _4, "alpha-myqnapcloud": _4, "myqnapcloud": _4, "quipelements": _7, "rackmaze": _4, "rhcloud": _4, "render": _16, "onrender": _4, "logoip": _4, "scrysec": _4, "firewall-gateway": _4, "myshopblocks": _4, "shopitsite": _4, "1kapp": _4, "appchizi": _4, "applinzi": _4, "sinaapp": _4, "vipsinaapp": _4, "bounty-full": { "$": 2, "succ": { "alpha": _4, "beta": _4 } }, "stackhero-network": _4, "playstation-cloud": _4, "stdlib": { "$": 0, "succ": { "api": _4 } }, "temp-dns": _4, "dsmynas": _4, "familyds": _4, "thingdustdata": _4, "bloxcms": _4, "townnews-staging": _4, "hk": _4, "wafflecell": _4, "remotewd": _4, "wiardweb": { "$": 0, "succ": { "pages": _4 } }, "xnbay": { "$": 2, "succ": { "u2": _4, "u2-local": _4 } }, "yolasite": _4, "wpenginepowered": _4, "impertrixcdn": _4, "impertrix": _4 } }, "coop": _2, "cr": { "$": 1, "succ": { "ac": _2, "co": _2, "ed": _2, "fi": _2, "go": _2, "or": _2, "sa": _2 } }, "cu": { "$": 1, "succ": { "com": _2, "edu": _2, "org": _2, "net": _2, "gov": _2, "inf": _2 } }, "cv": _5, "cw": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2 } }, "cx": { "$": 1, "succ": { "gov": _2, "ath": _4, "info": _4 } }, "cy": { "$": 1, "succ": { "ac": _2, "biz": _2, "com": { "$": 1, "succ": { "blogspot": _4, "scaleforce": _17 } }, "ekloges": _2, "gov": _2, "ltd": _2, "name": _2, "net": _2, "org": _2, "parliament": _2, "press": _2, "pro": _2, "tm": _2 } }, "cz": { "$": 1, "succ": { "co": _4, "realm": _4, "e4": _4, "blogspot": _4, "metacentrum": { "$": 0, "succ": { "cloud": _4, "custom": _4 } }, "muni": { "$": 0, "succ": { "cloud": { "$": 0, "succ": { "flt": _4, "usr": _4 } } } } } }, "de": { "$": 1, "succ": { "bplaced": _4, "square7": _4, "com": _4, "cosidns": { "$": 0, "succ": { "dyn": _4 } }, "dynamisches-dns": _4, "dnsupdater": _4, "internet-dns": _4, "l-o-g-i-n": _4, "dnshome": _4, "fuettertdasnetz": _4, "isteingeek": _4, "istmein": _4, "lebtimnetz": _4, "leitungsen": _4, "traeumtgerade": _4, "ddnss": { "$": 2, "succ": { "dyn": _4, "dyndns": _4 } }, "dyndns1": _4, "dyn-ip24": _4, "home-webserver": { "$": 2, "succ": { "dyn": _4 } }, "myhome-server": _4, "goip": _4, "blogspot": _4, "dyn-berlin": _4, "in-berlin": _4, "in-brb": _4, "in-butter": _4, "in-dsl": _4, "in-vpn": _4, "mein-iserv": _4, "schulserver": _4, "test-iserv": _4, "keymachine": _4, "git-repos": _4, "lcube-server": _4, "svn-repos": _4, "barsy": _4, "logoip": _4, "firewall-gateway": _4, "my-gateway": _4, "my-router": _4, "spdns": _4, "speedpartner": { "$": 0, "succ": { "customer": _4 } }, "taifun-dns": _4, "12hp": _4, "2ix": _4, "4lima": _4, "lima-city": _4, "dd-dns": _4, "dray-dns": _4, "draydns": _4, "dyn-vpn": _4, "dynvpn": _4, "mein-vigor": _4, "my-vigor": _4, "my-wan": _4, "syno-ds": _4, "synology-diskstation": _4, "synology-ds": _4, "uberspace": _7, "virtualuser": _4, "virtual-user": _4, "community-pro": _4, "diskussionsbereich": _4 } }, "dj": _2, "dk": { "$": 1, "succ": { "biz": _4, "co": _4, "firm": _4, "reg": _4, "store": _4, "blogspot": _4 } }, "dm": _9, "do": { "$": 1, "succ": { "art": _2, "com": _2, "edu": _2, "gob": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "sld": _2, "web": _2 } }, "dz": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "gov": _2, "edu": _2, "asso": _2, "pol": _2, "art": _2 } }, "ec": { "$": 1, "succ": { "com": _2, "info": _2, "net": _2, "fin": _2, "k12": _2, "med": _2, "pro": _2, "org": _2, "edu": _2, "gov": _2, "gob": _2, "mil": _2, "nym": _4 } }, "edu": { "$": 1, "succ": { "rit": { "$": 0, "succ": { "git-pages": _4 } } } }, "ee": { "$": 1, "succ": { "edu": _2, "gov": _2, "riik": _2, "lib": _2, "med": _2, "com": _5, "pri": _2, "aip": _2, "org": _2, "fie": _2 } }, "eg": { "$": 1, "succ": { "com": _5, "edu": _2, "eun": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sci": _2 } }, "er": _8, "es": { "$": 1, "succ": { "com": _5, "nom": _2, "org": _2, "gob": _2, "edu": _2 } }, "et": { "$": 1, "succ": { "com": _2, "gov": _2, "org": _2, "edu": _2, "biz": _2, "name": _2, "info": _2, "net": _2 } }, "eu": { "$": 1, "succ": { "mycd": _4, "cloudns": _4, "barsy": _4, "wellbeingzone": _4, "spdns": _4, "transurl": _7, "diskstation": _4 } }, "fi": { "$": 1, "succ": { "aland": _2, "dy": _4, "blogspot": _4, "xn--hkkinen-5wa": _4, "häkkinen": _4, "iki": _4 } }, "fj": { "$": 1, "succ": { "ac": _2, "biz": _2, "com": _2, "gov": _2, "info": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pro": _2 } }, "fk": _8, "fm": _2, "fo": _2, "fr": { "$": 1, "succ": { "asso": _2, "com": _2, "gouv": _2, "nom": _2, "prd": _2, "tm": _2, "aeroport": _2, "avocat": _2, "avoues": _2, "cci": _2, "chambagri": _2, "chirurgiens-dentistes": _2, "experts-comptables": _2, "geometre-expert": _2, "greta": _2, "huissier-justice": _2, "medecin": _2, "notaires": _2, "pharmacien": _2, "port": _2, "veterinaire": _2, "en-root": _4, "fbx-os": _4, "fbxos": _4, "freebox-os": _4, "freeboxos": _4, "blogspot": _4, "on-web": _4, "chirurgiens-dentistes-en-france": _4 } }, "ga": _2, "gb": _2, "gd": { "$": 1, "succ": { "nom": _4 } }, "ge": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "net": _2, "pvt": _2, "nom": _4 } }, "gf": _2, "gg": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "kaas": _4, "cya": _4, "panel": { "$": 2, "succ": { "daemon": _4 } } } }, "gh": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2 } }, "gi": { "$": 1, "succ": { "com": _2, "ltd": _2, "gov": _2, "mod": _2, "edu": _2, "org": _2 } }, "gl": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "net": _2, "org": _2, "biz": _4, "nom": _4, "xx": _4 } }, "gm": _2, "gn": { "$": 1, "succ": { "ac": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "net": _2 } }, "gov": _2, "gp": { "$": 1, "succ": { "com": _2, "net": _2, "mobi": _2, "edu": _2, "org": _2, "asso": _2, "app": _4 } }, "gq": _2, "gr": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "gov": _2, "blogspot": _4, "nym": _4 } }, "gs": _2, "gt": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "ind": _2, "mil": _2, "net": _2, "org": _2, "nom": _4, "blog": _4, "de": _4, "to": _4 } }, "gu": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "guam": _2, "info": _2, "net": _2, "org": _2, "web": _2 } }, "gw": _2, "gy": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "nym": _4, "be": _4 } }, "hk": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "idv": _2, "net": _2, "org": _2, "xn--55qx5d": _2, "公司": _2, "xn--wcvs22d": _2, "教育": _2, "xn--lcvr32d": _2, "敎育": _2, "xn--mxtq1m": _2, "政府": _2, "xn--gmqw5a": _2, "個人": _2, "xn--ciqpn": _2, "个人": _2, "xn--gmq050i": _2, "箇人": _2, "xn--zf0avx": _2, "網络": _2, "xn--io0a7i": _2, "网络": _2, "xn--mk0axi": _2, "组織": _2, "xn--od0alg": _2, "網絡": _2, "xn--od0aq3b": _2, "网絡": _2, "xn--tn0ag": _2, "组织": _2, "xn--uc0atv": _2, "組織": _2, "xn--uc0ay4a": _2, "組织": _2, "blogspot": _4, "nym": _4, "ltd": _4, "inc": _4 } }, "hm": _2, "hn": { "$": 1, "succ": { "com": _2, "edu": _2, "org": _2, "net": _2, "mil": _2, "gob": _2, "nom": _4, "cc": _4 } }, "hr": { "$": 1, "succ": { "iz": _2, "from": _2, "name": _2, "com": _2, "blogspot": _4, "free": _4 } }, "ht": { "$": 1, "succ": { "com": _2, "shop": _2, "firm": _2, "info": _2, "adult": _2, "net": _2, "pro": _2, "org": _2, "med": _2, "art": _2, "coop": _2, "pol": _2, "asso": _2, "edu": _2, "rel": _2, "gouv": _2, "perso": _2 } }, "hu": { "$": 1, "succ": { "2000": _2, "co": _2, "info": _2, "org": _2, "priv": _2, "sport": _2, "tm": _2, "agrar": _2, "bolt": _2, "casino": _2, "city": _2, "erotica": _2, "erotika": _2, "film": _2, "forum": _2, "games": _2, "hotel": _2, "ingatlan": _2, "jogasz": _2, "konyvelo": _2, "lakas": _2, "media": _2, "news": _2, "reklam": _2, "sex": _2, "shop": _2, "suli": _2, "szex": _2, "tozsde": _2, "utazas": _2, "video": _2, "blogspot": _4 } }, "id": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _5, "desa": _2, "go": _2, "mil": _2, "my": _2, "net": _2, "or": _2, "ponpes": _2, "sch": _2, "web": _2 } }, "ie": _20, "il": { "$": 1, "succ": { "ac": _2, "co": _5, "gov": _2, "idf": _2, "k12": _2, "muni": _2, "net": _2, "org": _2 } }, "im": { "$": 1, "succ": { "ac": _2, "co": { "$": 1, "succ": { "ltd": _2, "plc": _2 } }, "com": _2, "net": _2, "org": _2, "tt": _2, "tv": _2, "ro": _4, "nom": _4 } }, "in": { "$": 1, "succ": { "co": _2, "firm": _2, "net": _2, "org": _2, "gen": _2, "ind": _2, "nic": _2, "ac": _2, "edu": _2, "res": _2, "gov": _2, "mil": _2, "cloudns": _4, "blogspot": _4, "barsy": _4 } }, "info": { "$": 1, "succ": { "cloudns": _4, "dynamic-dns": _4, "dyndns": _4, "barrel-of-knowledge": _4, "barrell-of-knowledge": _4, "for-our": _4, "groks-the": _4, "groks-this": _4, "here-for-more": _4, "knowsitall": _4, "selfip": _4, "webhop": _4, "barsy": _4, "mayfirst": _4, "forumz": _4, "nsupdate": _4, "dvrcam": _4, "ilovecollege": _4, "no-ip": _4, "dnsupdate": _4, "v-info": _4 } }, "int": { "$": 1, "succ": { "eu": _2 } }, "io": { "$": 1, "succ": { "2038": _4, "com": _2, "apigee": _4, "b-data": _4, "backplaneapp": _4, "banzaicloud": { "$": 0, "succ": { "app": _4, "backyards": _7 } }, "boxfuse": _4, "browsersafetymark": _4, "bigv": { "$": 0, "succ": { "uk0": _4 } }, "cleverapps": _4, "dappnode": { "$": 0, "succ": { "dyndns": _4 } }, "dedyn": _4, "drud": _4, "definima": _4, "enonic": { "$": 2, "succ": { "customer": _4 } }, "shw": _4, "github": _4, "gitlab": _4, "lolipop": _4, "hasura-app": _4, "hostyhosting": _4, "moonscale": _7, "jele": _4, "loginline": _4, "barsy": _4, "azurecontainer": _7, "ngrok": _4, "nodeart": { "$": 0, "succ": { "stage": _4 } }, "nodum": _4, "nid": _4, "pantheonsite": _4, "dyn53": _4, "protonet": _4, "qcx": { "$": 2, "succ": { "sys": _7 } }, "vaporcloud": _4, "vbrplsbx": { "$": 0, "succ": { "g": _4 } }, "on-k3s": _7, "on-rio": _7, "readthedocs": _4, "resindevice": _4, "resinstaging": { "$": 0, "succ": { "devices": _4 } }, "hzc": _4, "sandcats": _4, "shiftedit": _4, "mo-siemens": _4, "lair": _15, "stolos": _7, "spacekit": _4, "utwente": _4, "applicationcloud": _4, "scapp": _4, "s5y": _7, "telebit": _4, "thingdust": { "$": 0, "succ": { "dev": _21, "disrec": _21, "prod": _21, "testing": _21 } }, "wedeploy": _4, "basicserver": _4, "virtualserver": _4 } }, "iq": _3, "ir": { "$": 1, "succ": { "ac": _2, "co": _2, "gov": _2, "id": _2, "net": _2, "org": _2, "sch": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2 } }, "is": { "$": 1, "succ": { "net": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "int": _2, "cupcake": _4, "blogspot": _4 } }, "it": { "$": 1, "succ": { "gov": _2, "edu": _2, "abr": _2, "abruzzo": _2, "aosta-valley": _2, "aostavalley": _2, "bas": _2, "basilicata": _2, "cal": _2, "calabria": _2, "cam": _2, "campania": _2, "emilia-romagna": _2, "emiliaromagna": _2, "emr": _2, "friuli-v-giulia": _2, "friuli-ve-giulia": _2, "friuli-vegiulia": _2, "friuli-venezia-giulia": _2, "friuli-veneziagiulia": _2, "friuli-vgiulia": _2, "friuliv-giulia": _2, "friulive-giulia": _2, "friulivegiulia": _2, "friulivenezia-giulia": _2, "friuliveneziagiulia": _2, "friulivgiulia": _2, "fvg": _2, "laz": _2, "lazio": _2, "lig": _2, "liguria": _2, "lom": _2, "lombardia": _2, "lombardy": _2, "lucania": _2, "mar": _2, "marche": _2, "mol": _2, "molise": _2, "piedmont": _2, "piemonte": _2, "pmn": _2, "pug": _2, "puglia": _2, "sar": _2, "sardegna": _2, "sardinia": _2, "sic": _2, "sicilia": _2, "sicily": _2, "taa": _2, "tos": _2, "toscana": _2, "trentin-sud-tirol": _2, "xn--trentin-sd-tirol-rzb": _2, "trentin-süd-tirol": _2, "trentin-sudtirol": _2, "xn--trentin-sdtirol-7vb": _2, "trentin-südtirol": _2, "trentin-sued-tirol": _2, "trentin-suedtirol": _2, "trentino-a-adige": _2, "trentino-aadige": _2, "trentino-alto-adige": _2, "trentino-altoadige": _2, "trentino-s-tirol": _2, "trentino-stirol": _2, "trentino-sud-tirol": _2, "xn--trentino-sd-tirol-c3b": _2, "trentino-süd-tirol": _2, "trentino-sudtirol": _2, "xn--trentino-sdtirol-szb": _2, "trentino-südtirol": _2, "trentino-sued-tirol": _2, "trentino-suedtirol": _2, "trentino": _2, "trentinoa-adige": _2, "trentinoaadige": _2, "trentinoalto-adige": _2, "trentinoaltoadige": _2, "trentinos-tirol": _2, "trentinostirol": _2, "trentinosud-tirol": _2, "xn--trentinosd-tirol-rzb": _2, "trentinosüd-tirol": _2, "trentinosudtirol": _2, "xn--trentinosdtirol-7vb": _2, "trentinosüdtirol": _2, "trentinosued-tirol": _2, "trentinosuedtirol": _2, "trentinsud-tirol": _2, "xn--trentinsd-tirol-6vb": _2, "trentinsüd-tirol": _2, "trentinsudtirol": _2, "xn--trentinsdtirol-nsb": _2, "trentinsüdtirol": _2, "trentinsued-tirol": _2, "trentinsuedtirol": _2, "tuscany": _2, "umb": _2, "umbria": _2, "val-d-aosta": _2, "val-daosta": _2, "vald-aosta": _2, "valdaosta": _2, "valle-aosta": _2, "valle-d-aosta": _2, "valle-daosta": _2, "valleaosta": _2, "valled-aosta": _2, "valledaosta": _2, "vallee-aoste": _2, "xn--valle-aoste-ebb": _2, "vallée-aoste": _2, "vallee-d-aoste": _2, "xn--valle-d-aoste-ehb": _2, "vallée-d-aoste": _2, "valleeaoste": _2, "xn--valleaoste-e7a": _2, "valléeaoste": _2, "valleedaoste": _2, "xn--valledaoste-ebb": _2, "valléedaoste": _2, "vao": _2, "vda": _2, "ven": _2, "veneto": _2, "ag": _2, "agrigento": _2, "al": _2, "alessandria": _2, "alto-adige": _2, "altoadige": _2, "an": _2, "ancona": _2, "andria-barletta-trani": _2, "andria-trani-barletta": _2, "andriabarlettatrani": _2, "andriatranibarletta": _2, "ao": _2, "aosta": _2, "aoste": _2, "ap": _2, "aq": _2, "aquila": _2, "ar": _2, "arezzo": _2, "ascoli-piceno": _2, "ascolipiceno": _2, "asti": _2, "at": _2, "av": _2, "avellino": _2, "ba": _2, "balsan-sudtirol": _2, "xn--balsan-sdtirol-nsb": _2, "balsan-südtirol": _2, "balsan-suedtirol": _2, "balsan": _2, "bari": _2, "barletta-trani-andria": _2, "barlettatraniandria": _2, "belluno": _2, "benevento": _2, "bergamo": _2, "bg": _2, "bi": _2, "biella": _2, "bl": _2, "bn": _2, "bo": _2, "bologna": _2, "bolzano-altoadige": _2, "bolzano": _2, "bozen-sudtirol": _2, "xn--bozen-sdtirol-2ob": _2, "bozen-südtirol": _2, "bozen-suedtirol": _2, "bozen": _2, "br": _2, "brescia": _2, "brindisi": _2, "bs": _2, "bt": _2, "bulsan-sudtirol": _2, "xn--bulsan-sdtirol-nsb": _2, "bulsan-südtirol": _2, "bulsan-suedtirol": _2, "bulsan": _2, "bz": _2, "ca": _2, "cagliari": _2, "caltanissetta": _2, "campidano-medio": _2, "campidanomedio": _2, "campobasso": _2, "carbonia-iglesias": _2, "carboniaiglesias": _2, "carrara-massa": _2, "carraramassa": _2, "caserta": _2, "catania": _2, "catanzaro": _2, "cb": _2, "ce": _2, "cesena-forli": _2, "xn--cesena-forl-mcb": _2, "cesena-forlì": _2, "cesenaforli": _2, "xn--cesenaforl-i8a": _2, "cesenaforlì": _2, "ch": _2, "chieti": _2, "ci": _2, "cl": _2, "cn": _2, "co": _2, "como": _2, "cosenza": _2, "cr": _2, "cremona": _2, "crotone": _2, "cs": _2, "ct": _2, "cuneo": _2, "cz": _2, "dell-ogliastra": _2, "dellogliastra": _2, "en": _2, "enna": _2, "fc": _2, "fe": _2, "fermo": _2, "ferrara": _2, "fg": _2, "fi": _2, "firenze": _2, "florence": _2, "fm": _2, "foggia": _2, "forli-cesena": _2, "xn--forl-cesena-fcb": _2, "forlì-cesena": _2, "forlicesena": _2, "xn--forlcesena-c8a": _2, "forlìcesena": _2, "fr": _2, "frosinone": _2, "ge": _2, "genoa": _2, "genova": _2, "go": _2, "gorizia": _2, "gr": _2, "grosseto": _2, "iglesias-carbonia": _2, "iglesiascarbonia": _2, "im": _2, "imperia": _2, "is": _2, "isernia": _2, "kr": _2, "la-spezia": _2, "laquila": _2, "laspezia": _2, "latina": _2, "lc": _2, "le": _2, "lecce": _2, "lecco": _2, "li": _2, "livorno": _2, "lo": _2, "lodi": _2, "lt": _2, "lu": _2, "lucca": _2, "macerata": _2, "mantova": _2, "massa-carrara": _2, "massacarrara": _2, "matera": _2, "mb": _2, "mc": _2, "me": _2, "medio-campidano": _2, "mediocampidano": _2, "messina": _2, "mi": _2, "milan": _2, "milano": _2, "mn": _2, "mo": _2, "modena": _2, "monza-brianza": _2, "monza-e-della-brianza": _2, "monza": _2, "monzabrianza": _2, "monzaebrianza": _2, "monzaedellabrianza": _2, "ms": _2, "mt": _2, "na": _2, "naples": _2, "napoli": _2, "no": _2, "novara": _2, "nu": _2, "nuoro": _2, "og": _2, "ogliastra": _2, "olbia-tempio": _2, "olbiatempio": _2, "or": _2, "oristano": _2, "ot": _2, "pa": _2, "padova": _2, "padua": _2, "palermo": _2, "parma": _2, "pavia": _2, "pc": _2, "pd": _2, "pe": _2, "perugia": _2, "pesaro-urbino": _2, "pesarourbino": _2, "pescara": _2, "pg": _2, "pi": _2, "piacenza": _2, "pisa": _2, "pistoia": _2, "pn": _2, "po": _2, "pordenone": _2, "potenza": _2, "pr": _2, "prato": _2, "pt": _2, "pu": _2, "pv": _2, "pz": _2, "ra": _2, "ragusa": _2, "ravenna": _2, "rc": _2, "re": _2, "reggio-calabria": _2, "reggio-emilia": _2, "reggiocalabria": _2, "reggioemilia": _2, "rg": _2, "ri": _2, "rieti": _2, "rimini": _2, "rm": _2, "rn": _2, "ro": _2, "roma": _2, "rome": _2, "rovigo": _2, "sa": _2, "salerno": _2, "sassari": _2, "savona": _2, "si": _2, "siena": _2, "siracusa": _2, "so": _2, "sondrio": _2, "sp": _2, "sr": _2, "ss": _2, "suedtirol": _2, "xn--sdtirol-n2a": _2, "südtirol": _2, "sv": _2, "ta": _2, "taranto": _2, "te": _2, "tempio-olbia": _2, "tempioolbia": _2, "teramo": _2, "terni": _2, "tn": _2, "to": _2, "torino": _2, "tp": _2, "tr": _2, "trani-andria-barletta": _2, "trani-barletta-andria": _2, "traniandriabarletta": _2, "tranibarlettaandria": _2, "trapani": _2, "trento": _2, "treviso": _2, "trieste": _2, "ts": _2, "turin": _2, "tv": _2, "ud": _2, "udine": _2, "urbino-pesaro": _2, "urbinopesaro": _2, "va": _2, "varese": _2, "vb": _2, "vc": _2, "ve": _2, "venezia": _2, "venice": _2, "verbania": _2, "vercelli": _2, "verona": _2, "vi": _2, "vibo-valentia": _2, "vibovalentia": _2, "vicenza": _2, "viterbo": _2, "vr": _2, "vs": _2, "vt": _2, "vv": _2, "blogspot": _4, "16-b": _4, "32-b": _4, "64-b": _4, "syncloud": _4 } }, "je": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2 } }, "jm": _8, "jo": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "edu": _2, "sch": _2, "gov": _2, "mil": _2, "name": _2 } }, "jobs": _2, "jp": { "$": 1, "succ": { "ac": _2, "ad": _2, "co": _2, "ed": _2, "go": _2, "gr": _2, "lg": _2, "ne": { "$": 1, "succ": { "aseinet": _18, "gehirn": _4 } }, "or": _2, "aichi": { "$": 1, "succ": { "aisai": _2, "ama": _2, "anjo": _2, "asuke": _2, "chiryu": _2, "chita": _2, "fuso": _2, "gamagori": _2, "handa": _2, "hazu": _2, "hekinan": _2, "higashiura": _2, "ichinomiya": _2, "inazawa": _2, "inuyama": _2, "isshiki": _2, "iwakura": _2, "kanie": _2, "kariya": _2, "kasugai": _2, "kira": _2, "kiyosu": _2, "komaki": _2, "konan": _2, "kota": _2, "mihama": _2, "miyoshi": _2, "nishio": _2, "nisshin": _2, "obu": _2, "oguchi": _2, "oharu": _2, "okazaki": _2, "owariasahi": _2, "seto": _2, "shikatsu": _2, "shinshiro": _2, "shitara": _2, "tahara": _2, "takahama": _2, "tobishima": _2, "toei": _2, "togo": _2, "tokai": _2, "tokoname": _2, "toyoake": _2, "toyohashi": _2, "toyokawa": _2, "toyone": _2, "toyota": _2, "tsushima": _2, "yatomi": _2 } }, "akita": { "$": 1, "succ": { "akita": _2, "daisen": _2, "fujisato": _2, "gojome": _2, "hachirogata": _2, "happou": _2, "higashinaruse": _2, "honjo": _2, "honjyo": _2, "ikawa": _2, "kamikoani": _2, "kamioka": _2, "katagami": _2, "kazuno": _2, "kitaakita": _2, "kosaka": _2, "kyowa": _2, "misato": _2, "mitane": _2, "moriyoshi": _2, "nikaho": _2, "noshiro": _2, "odate": _2, "oga": _2, "ogata": _2, "semboku": _2, "yokote": _2, "yurihonjo": _2 } }, "aomori": { "$": 1, "succ": { "aomori": _2, "gonohe": _2, "hachinohe": _2, "hashikami": _2, "hiranai": _2, "hirosaki": _2, "itayanagi": _2, "kuroishi": _2, "misawa": _2, "mutsu": _2, "nakadomari": _2, "noheji": _2, "oirase": _2, "owani": _2, "rokunohe": _2, "sannohe": _2, "shichinohe": _2, "shingo": _2, "takko": _2, "towada": _2, "tsugaru": _2, "tsuruta": _2 } }, "chiba": { "$": 1, "succ": { "abiko": _2, "asahi": _2, "chonan": _2, "chosei": _2, "choshi": _2, "chuo": _2, "funabashi": _2, "futtsu": _2, "hanamigawa": _2, "ichihara": _2, "ichikawa": _2, "ichinomiya": _2, "inzai": _2, "isumi": _2, "kamagaya": _2, "kamogawa": _2, "kashiwa": _2, "katori": _2, "katsuura": _2, "kimitsu": _2, "kisarazu": _2, "kozaki": _2, "kujukuri": _2, "kyonan": _2, "matsudo": _2, "midori": _2, "mihama": _2, "minamiboso": _2, "mobara": _2, "mutsuzawa": _2, "nagara": _2, "nagareyama": _2, "narashino": _2, "narita": _2, "noda": _2, "oamishirasato": _2, "omigawa": _2, "onjuku": _2, "otaki": _2, "sakae": _2, "sakura": _2, "shimofusa": _2, "shirako": _2, "shiroi": _2, "shisui": _2, "sodegaura": _2, "sosa": _2, "tako": _2, "tateyama": _2, "togane": _2, "tohnosho": _2, "tomisato": _2, "urayasu": _2, "yachimata": _2, "yachiyo": _2, "yokaichiba": _2, "yokoshibahikari": _2, "yotsukaido": _2 } }, "ehime": { "$": 1, "succ": { "ainan": _2, "honai": _2, "ikata": _2, "imabari": _2, "iyo": _2, "kamijima": _2, "kihoku": _2, "kumakogen": _2, "masaki": _2, "matsuno": _2, "matsuyama": _2, "namikata": _2, "niihama": _2, "ozu": _2, "saijo": _2, "seiyo": _2, "shikokuchuo": _2, "tobe": _2, "toon": _2, "uchiko": _2, "uwajima": _2, "yawatahama": _2 } }, "fukui": { "$": 1, "succ": { "echizen": _2, "eiheiji": _2, "fukui": _2, "ikeda": _2, "katsuyama": _2, "mihama": _2, "minamiechizen": _2, "obama": _2, "ohi": _2, "ono": _2, "sabae": _2, "sakai": _2, "takahama": _2, "tsuruga": _2, "wakasa": _2 } }, "fukuoka": { "$": 1, "succ": { "ashiya": _2, "buzen": _2, "chikugo": _2, "chikuho": _2, "chikujo": _2, "chikushino": _2, "chikuzen": _2, "chuo": _2, "dazaifu": _2, "fukuchi": _2, "hakata": _2, "higashi": _2, "hirokawa": _2, "hisayama": _2, "iizuka": _2, "inatsuki": _2, "kaho": _2, "kasuga": _2, "kasuya": _2, "kawara": _2, "keisen": _2, "koga": _2, "kurate": _2, "kurogi": _2, "kurume": _2, "minami": _2, "miyako": _2, "miyama": _2, "miyawaka": _2, "mizumaki": _2, "munakata": _2, "nakagawa": _2, "nakama": _2, "nishi": _2, "nogata": _2, "ogori": _2, "okagaki": _2, "okawa": _2, "oki": _2, "omuta": _2, "onga": _2, "onojo": _2, "oto": _2, "saigawa": _2, "sasaguri": _2, "shingu": _2, "shinyoshitomi": _2, "shonai": _2, "soeda": _2, "sue": _2, "tachiarai": _2, "tagawa": _2, "takata": _2, "toho": _2, "toyotsu": _2, "tsuiki": _2, "ukiha": _2, "umi": _2, "usui": _2, "yamada": _2, "yame": _2, "yanagawa": _2, "yukuhashi": _2 } }, "fukushima": { "$": 1, "succ": { "aizubange": _2, "aizumisato": _2, "aizuwakamatsu": _2, "asakawa": _2, "bandai": _2, "date": _2, "fukushima": _2, "furudono": _2, "futaba": _2, "hanawa": _2, "higashi": _2, "hirata": _2, "hirono": _2, "iitate": _2, "inawashiro": _2, "ishikawa": _2, "iwaki": _2, "izumizaki": _2, "kagamiishi": _2, "kaneyama": _2, "kawamata": _2, "kitakata": _2, "kitashiobara": _2, "koori": _2, "koriyama": _2, "kunimi": _2, "miharu": _2, "mishima": _2, "namie": _2, "nango": _2, "nishiaizu": _2, "nishigo": _2, "okuma": _2, "omotego": _2, "ono": _2, "otama": _2, "samegawa": _2, "shimogo": _2, "shirakawa": _2, "showa": _2, "soma": _2, "sukagawa": _2, "taishin": _2, "tamakawa": _2, "tanagura": _2, "tenei": _2, "yabuki": _2, "yamato": _2, "yamatsuri": _2, "yanaizu": _2, "yugawa": _2 } }, "gifu": { "$": 1, "succ": { "anpachi": _2, "ena": _2, "gifu": _2, "ginan": _2, "godo": _2, "gujo": _2, "hashima": _2, "hichiso": _2, "hida": _2, "higashishirakawa": _2, "ibigawa": _2, "ikeda": _2, "kakamigahara": _2, "kani": _2, "kasahara": _2, "kasamatsu": _2, "kawaue": _2, "kitagata": _2, "mino": _2, "minokamo": _2, "mitake": _2, "mizunami": _2, "motosu": _2, "nakatsugawa": _2, "ogaki": _2, "sakahogi": _2, "seki": _2, "sekigahara": _2, "shirakawa": _2, "tajimi": _2, "takayama": _2, "tarui": _2, "toki": _2, "tomika": _2, "wanouchi": _2, "yamagata": _2, "yaotsu": _2, "yoro": _2 } }, "gunma": { "$": 1, "succ": { "annaka": _2, "chiyoda": _2, "fujioka": _2, "higashiagatsuma": _2, "isesaki": _2, "itakura": _2, "kanna": _2, "kanra": _2, "katashina": _2, "kawaba": _2, "kiryu": _2, "kusatsu": _2, "maebashi": _2, "meiwa": _2, "midori": _2, "minakami": _2, "naganohara": _2, "nakanojo": _2, "nanmoku": _2, "numata": _2, "oizumi": _2, "ora": _2, "ota": _2, "shibukawa": _2, "shimonita": _2, "shinto": _2, "showa": _2, "takasaki": _2, "takayama": _2, "tamamura": _2, "tatebayashi": _2, "tomioka": _2, "tsukiyono": _2, "tsumagoi": _2, "ueno": _2, "yoshioka": _2 } }, "hiroshima": { "$": 1, "succ": { "asaminami": _2, "daiwa": _2, "etajima": _2, "fuchu": _2, "fukuyama": _2, "hatsukaichi": _2, "higashihiroshima": _2, "hongo": _2, "jinsekikogen": _2, "kaita": _2, "kui": _2, "kumano": _2, "kure": _2, "mihara": _2, "miyoshi": _2, "naka": _2, "onomichi": _2, "osakikamijima": _2, "otake": _2, "saka": _2, "sera": _2, "seranishi": _2, "shinichi": _2, "shobara": _2, "takehara": _2 } }, "hokkaido": { "$": 1, "succ": { "abashiri": _2, "abira": _2, "aibetsu": _2, "akabira": _2, "akkeshi": _2, "asahikawa": _2, "ashibetsu": _2, "ashoro": _2, "assabu": _2, "atsuma": _2, "bibai": _2, "biei": _2, "bifuka": _2, "bihoro": _2, "biratori": _2, "chippubetsu": _2, "chitose": _2, "date": _2, "ebetsu": _2, "embetsu": _2, "eniwa": _2, "erimo": _2, "esan": _2, "esashi": _2, "fukagawa": _2, "fukushima": _2, "furano": _2, "furubira": _2, "haboro": _2, "hakodate": _2, "hamatonbetsu": _2, "hidaka": _2, "higashikagura": _2, "higashikawa": _2, "hiroo": _2, "hokuryu": _2, "hokuto": _2, "honbetsu": _2, "horokanai": _2, "horonobe": _2, "ikeda": _2, "imakane": _2, "ishikari": _2, "iwamizawa": _2, "iwanai": _2, "kamifurano": _2, "kamikawa": _2, "kamishihoro": _2, "kamisunagawa": _2, "kamoenai": _2, "kayabe": _2, "kembuchi": _2, "kikonai": _2, "kimobetsu": _2, "kitahiroshima": _2, "kitami": _2, "kiyosato": _2, "koshimizu": _2, "kunneppu": _2, "kuriyama": _2, "kuromatsunai": _2, "kushiro": _2, "kutchan": _2, "kyowa": _2, "mashike": _2, "matsumae": _2, "mikasa": _2, "minamifurano": _2, "mombetsu": _2, "moseushi": _2, "mukawa": _2, "muroran": _2, "naie": _2, "nakagawa": _2, "nakasatsunai": _2, "nakatombetsu": _2, "nanae": _2, "nanporo": _2, "nayoro": _2, "nemuro": _2, "niikappu": _2, "niki": _2, "nishiokoppe": _2, "noboribetsu": _2, "numata": _2, "obihiro": _2, "obira": _2, "oketo": _2, "okoppe": _2, "otaru": _2, "otobe": _2, "otofuke": _2, "otoineppu": _2, "oumu": _2, "ozora": _2, "pippu": _2, "rankoshi": _2, "rebun": _2, "rikubetsu": _2, "rishiri": _2, "rishirifuji": _2, "saroma": _2, "sarufutsu": _2, "shakotan": _2, "shari": _2, "shibecha": _2, "shibetsu": _2, "shikabe": _2, "shikaoi": _2, "shimamaki": _2, "shimizu": _2, "shimokawa": _2, "shinshinotsu": _2, "shintoku": _2, "shiranuka": _2, "shiraoi": _2, "shiriuchi": _2, "sobetsu": _2, "sunagawa": _2, "taiki": _2, "takasu": _2, "takikawa": _2, "takinoue": _2, "teshikaga": _2, "tobetsu": _2, "tohma": _2, "tomakomai": _2, "tomari": _2, "toya": _2, "toyako": _2, "toyotomi": _2, "toyoura": _2, "tsubetsu": _2, "tsukigata": _2, "urakawa": _2, "urausu": _2, "uryu": _2, "utashinai": _2, "wakkanai": _2, "wassamu": _2, "yakumo": _2, "yoichi": _2 } }, "hyogo": { "$": 1, "succ": { "aioi": _2, "akashi": _2, "ako": _2, "amagasaki": _2, "aogaki": _2, "asago": _2, "ashiya": _2, "awaji": _2, "fukusaki": _2, "goshiki": _2, "harima": _2, "himeji": _2, "ichikawa": _2, "inagawa": _2, "itami": _2, "kakogawa": _2, "kamigori": _2, "kamikawa": _2, "kasai": _2, "kasuga": _2, "kawanishi": _2, "miki": _2, "minamiawaji": _2, "nishinomiya": _2, "nishiwaki": _2, "ono": _2, "sanda": _2, "sannan": _2, "sasayama": _2, "sayo": _2, "shingu": _2, "shinonsen": _2, "shiso": _2, "sumoto": _2, "taishi": _2, "taka": _2, "takarazuka": _2, "takasago": _2, "takino": _2, "tamba": _2, "tatsuno": _2, "toyooka": _2, "yabu": _2, "yashiro": _2, "yoka": _2, "yokawa": _2 } }, "ibaraki": { "$": 1, "succ": { "ami": _2, "asahi": _2, "bando": _2, "chikusei": _2, "daigo": _2, "fujishiro": _2, "hitachi": _2, "hitachinaka": _2, "hitachiomiya": _2, "hitachiota": _2, "ibaraki": _2, "ina": _2, "inashiki": _2, "itako": _2, "iwama": _2, "joso": _2, "kamisu": _2, "kasama": _2, "kashima": _2, "kasumigaura": _2, "koga": _2, "miho": _2, "mito": _2, "moriya": _2, "naka": _2, "namegata": _2, "oarai": _2, "ogawa": _2, "omitama": _2, "ryugasaki": _2, "sakai": _2, "sakuragawa": _2, "shimodate": _2, "shimotsuma": _2, "shirosato": _2, "sowa": _2, "suifu": _2, "takahagi": _2, "tamatsukuri": _2, "tokai": _2, "tomobe": _2, "tone": _2, "toride": _2, "tsuchiura": _2, "tsukuba": _2, "uchihara": _2, "ushiku": _2, "yachiyo": _2, "yamagata": _2, "yawara": _2, "yuki": _2 } }, "ishikawa": { "$": 1, "succ": { "anamizu": _2, "hakui": _2, "hakusan": _2, "kaga": _2, "kahoku": _2, "kanazawa": _2, "kawakita": _2, "komatsu": _2, "nakanoto": _2, "nanao": _2, "nomi": _2, "nonoichi": _2, "noto": _2, "shika": _2, "suzu": _2, "tsubata": _2, "tsurugi": _2, "uchinada": _2, "wajima": _2 } }, "iwate": { "$": 1, "succ": { "fudai": _2, "fujisawa": _2, "hanamaki": _2, "hiraizumi": _2, "hirono": _2, "ichinohe": _2, "ichinoseki": _2, "iwaizumi": _2, "iwate": _2, "joboji": _2, "kamaishi": _2, "kanegasaki": _2, "karumai": _2, "kawai": _2, "kitakami": _2, "kuji": _2, "kunohe": _2, "kuzumaki": _2, "miyako": _2, "mizusawa": _2, "morioka": _2, "ninohe": _2, "noda": _2, "ofunato": _2, "oshu": _2, "otsuchi": _2, "rikuzentakata": _2, "shiwa": _2, "shizukuishi": _2, "sumita": _2, "tanohata": _2, "tono": _2, "yahaba": _2, "yamada": _2 } }, "kagawa": { "$": 1, "succ": { "ayagawa": _2, "higashikagawa": _2, "kanonji": _2, "kotohira": _2, "manno": _2, "marugame": _2, "mitoyo": _2, "naoshima": _2, "sanuki": _2, "tadotsu": _2, "takamatsu": _2, "tonosho": _2, "uchinomi": _2, "utazu": _2, "zentsuji": _2 } }, "kagoshima": { "$": 1, "succ": { "akune": _2, "amami": _2, "hioki": _2, "isa": _2, "isen": _2, "izumi": _2, "kagoshima": _2, "kanoya": _2, "kawanabe": _2, "kinko": _2, "kouyama": _2, "makurazaki": _2, "matsumoto": _2, "minamitane": _2, "nakatane": _2, "nishinoomote": _2, "satsumasendai": _2, "soo": _2, "tarumizu": _2, "yusui": _2 } }, "kanagawa": { "$": 1, "succ": { "aikawa": _2, "atsugi": _2, "ayase": _2, "chigasaki": _2, "ebina": _2, "fujisawa": _2, "hadano": _2, "hakone": _2, "hiratsuka": _2, "isehara": _2, "kaisei": _2, "kamakura": _2, "kiyokawa": _2, "matsuda": _2, "minamiashigara": _2, "miura": _2, "nakai": _2, "ninomiya": _2, "odawara": _2, "oi": _2, "oiso": _2, "sagamihara": _2, "samukawa": _2, "tsukui": _2, "yamakita": _2, "yamato": _2, "yokosuka": _2, "yugawara": _2, "zama": _2, "zushi": _2 } }, "kochi": { "$": 1, "succ": { "aki": _2, "geisei": _2, "hidaka": _2, "higashitsuno": _2, "ino": _2, "kagami": _2, "kami": _2, "kitagawa": _2, "kochi": _2, "mihara": _2, "motoyama": _2, "muroto": _2, "nahari": _2, "nakamura": _2, "nankoku": _2, "nishitosa": _2, "niyodogawa": _2, "ochi": _2, "okawa": _2, "otoyo": _2, "otsuki": _2, "sakawa": _2, "sukumo": _2, "susaki": _2, "tosa": _2, "tosashimizu": _2, "toyo": _2, "tsuno": _2, "umaji": _2, "yasuda": _2, "yusuhara": _2 } }, "kumamoto": { "$": 1, "succ": { "amakusa": _2, "arao": _2, "aso": _2, "choyo": _2, "gyokuto": _2, "kamiamakusa": _2, "kikuchi": _2, "kumamoto": _2, "mashiki": _2, "mifune": _2, "minamata": _2, "minamioguni": _2, "nagasu": _2, "nishihara": _2, "oguni": _2, "ozu": _2, "sumoto": _2, "takamori": _2, "uki": _2, "uto": _2, "yamaga": _2, "yamato": _2, "yatsushiro": _2 } }, "kyoto": { "$": 1, "succ": { "ayabe": _2, "fukuchiyama": _2, "higashiyama": _2, "ide": _2, "ine": _2, "joyo": _2, "kameoka": _2, "kamo": _2, "kita": _2, "kizu": _2, "kumiyama": _2, "kyotamba": _2, "kyotanabe": _2, "kyotango": _2, "maizuru": _2, "minami": _2, "minamiyamashiro": _2, "miyazu": _2, "muko": _2, "nagaokakyo": _2, "nakagyo": _2, "nantan": _2, "oyamazaki": _2, "sakyo": _2, "seika": _2, "tanabe": _2, "uji": _2, "ujitawara": _2, "wazuka": _2, "yamashina": _2, "yawata": _2 } }, "mie": { "$": 1, "succ": { "asahi": _2, "inabe": _2, "ise": _2, "kameyama": _2, "kawagoe": _2, "kiho": _2, "kisosaki": _2, "kiwa": _2, "komono": _2, "kumano": _2, "kuwana": _2, "matsusaka": _2, "meiwa": _2, "mihama": _2, "minamiise": _2, "misugi": _2, "miyama": _2, "nabari": _2, "shima": _2, "suzuka": _2, "tado": _2, "taiki": _2, "taki": _2, "tamaki": _2, "toba": _2, "tsu": _2, "udono": _2, "ureshino": _2, "watarai": _2, "yokkaichi": _2 } }, "miyagi": { "$": 1, "succ": { "furukawa": _2, "higashimatsushima": _2, "ishinomaki": _2, "iwanuma": _2, "kakuda": _2, "kami": _2, "kawasaki": _2, "marumori": _2, "matsushima": _2, "minamisanriku": _2, "misato": _2, "murata": _2, "natori": _2, "ogawara": _2, "ohira": _2, "onagawa": _2, "osaki": _2, "rifu": _2, "semine": _2, "shibata": _2, "shichikashuku": _2, "shikama": _2, "shiogama": _2, "shiroishi": _2, "tagajo": _2, "taiwa": _2, "tome": _2, "tomiya": _2, "wakuya": _2, "watari": _2, "yamamoto": _2, "zao": _2 } }, "miyazaki": { "$": 1, "succ": { "aya": _2, "ebino": _2, "gokase": _2, "hyuga": _2, "kadogawa": _2, "kawaminami": _2, "kijo": _2, "kitagawa": _2, "kitakata": _2, "kitaura": _2, "kobayashi": _2, "kunitomi": _2, "kushima": _2, "mimata": _2, "miyakonojo": _2, "miyazaki": _2, "morotsuka": _2, "nichinan": _2, "nishimera": _2, "nobeoka": _2, "saito": _2, "shiiba": _2, "shintomi": _2, "takaharu": _2, "takanabe": _2, "takazaki": _2, "tsuno": _2 } }, "nagano": { "$": 1, "succ": { "achi": _2, "agematsu": _2, "anan": _2, "aoki": _2, "asahi": _2, "azumino": _2, "chikuhoku": _2, "chikuma": _2, "chino": _2, "fujimi": _2, "hakuba": _2, "hara": _2, "hiraya": _2, "iida": _2, "iijima": _2, "iiyama": _2, "iizuna": _2, "ikeda": _2, "ikusaka": _2, "ina": _2, "karuizawa": _2, "kawakami": _2, "kiso": _2, "kisofukushima": _2, "kitaaiki": _2, "komagane": _2, "komoro": _2, "matsukawa": _2, "matsumoto": _2, "miasa": _2, "minamiaiki": _2, "minamimaki": _2, "minamiminowa": _2, "minowa": _2, "miyada": _2, "miyota": _2, "mochizuki": _2, "nagano": _2, "nagawa": _2, "nagiso": _2, "nakagawa": _2, "nakano": _2, "nozawaonsen": _2, "obuse": _2, "ogawa": _2, "okaya": _2, "omachi": _2, "omi": _2, "ookuwa": _2, "ooshika": _2, "otaki": _2, "otari": _2, "sakae": _2, "sakaki": _2, "saku": _2, "sakuho": _2, "shimosuwa": _2, "shinanomachi": _2, "shiojiri": _2, "suwa": _2, "suzaka": _2, "takagi": _2, "takamori": _2, "takayama": _2, "tateshina": _2, "tatsuno": _2, "togakushi": _2, "togura": _2, "tomi": _2, "ueda": _2, "wada": _2, "yamagata": _2, "yamanouchi": _2, "yasaka": _2, "yasuoka": _2 } }, "nagasaki": { "$": 1, "succ": { "chijiwa": _2, "futsu": _2, "goto": _2, "hasami": _2, "hirado": _2, "iki": _2, "isahaya": _2, "kawatana": _2, "kuchinotsu": _2, "matsuura": _2, "nagasaki": _2, "obama": _2, "omura": _2, "oseto": _2, "saikai": _2, "sasebo": _2, "seihi": _2, "shimabara": _2, "shinkamigoto": _2, "togitsu": _2, "tsushima": _2, "unzen": _2 } }, "nara": { "$": 1, "succ": { "ando": _2, "gose": _2, "heguri": _2, "higashiyoshino": _2, "ikaruga": _2, "ikoma": _2, "kamikitayama": _2, "kanmaki": _2, "kashiba": _2, "kashihara": _2, "katsuragi": _2, "kawai": _2, "kawakami": _2, "kawanishi": _2, "koryo": _2, "kurotaki": _2, "mitsue": _2, "miyake": _2, "nara": _2, "nosegawa": _2, "oji": _2, "ouda": _2, "oyodo": _2, "sakurai": _2, "sango": _2, "shimoichi": _2, "shimokitayama": _2, "shinjo": _2, "soni": _2, "takatori": _2, "tawaramoto": _2, "tenkawa": _2, "tenri": _2, "uda": _2, "yamatokoriyama": _2, "yamatotakada": _2, "yamazoe": _2, "yoshino": _2 } }, "niigata": { "$": 1, "succ": { "aga": _2, "agano": _2, "gosen": _2, "itoigawa": _2, "izumozaki": _2, "joetsu": _2, "kamo": _2, "kariwa": _2, "kashiwazaki": _2, "minamiuonuma": _2, "mitsuke": _2, "muika": _2, "murakami": _2, "myoko": _2, "nagaoka": _2, "niigata": _2, "ojiya": _2, "omi": _2, "sado": _2, "sanjo": _2, "seiro": _2, "seirou": _2, "sekikawa": _2, "shibata": _2, "tagami": _2, "tainai": _2, "tochio": _2, "tokamachi": _2, "tsubame": _2, "tsunan": _2, "uonuma": _2, "yahiko": _2, "yoita": _2, "yuzawa": _2 } }, "oita": { "$": 1, "succ": { "beppu": _2, "bungoono": _2, "bungotakada": _2, "hasama": _2, "hiji": _2, "himeshima": _2, "hita": _2, "kamitsue": _2, "kokonoe": _2, "kuju": _2, "kunisaki": _2, "kusu": _2, "oita": _2, "saiki": _2, "taketa": _2, "tsukumi": _2, "usa": _2, "usuki": _2, "yufu": _2 } }, "okayama": { "$": 1, "succ": { "akaiwa": _2, "asakuchi": _2, "bizen": _2, "hayashima": _2, "ibara": _2, "kagamino": _2, "kasaoka": _2, "kibichuo": _2, "kumenan": _2, "kurashiki": _2, "maniwa": _2, "misaki": _2, "nagi": _2, "niimi": _2, "nishiawakura": _2, "okayama": _2, "satosho": _2, "setouchi": _2, "shinjo": _2, "shoo": _2, "soja": _2, "takahashi": _2, "tamano": _2, "tsuyama": _2, "wake": _2, "yakage": _2 } }, "okinawa": { "$": 1, "succ": { "aguni": _2, "ginowan": _2, "ginoza": _2, "gushikami": _2, "haebaru": _2, "higashi": _2, "hirara": _2, "iheya": _2, "ishigaki": _2, "ishikawa": _2, "itoman": _2, "izena": _2, "kadena": _2, "kin": _2, "kitadaito": _2, "kitanakagusuku": _2, "kumejima": _2, "kunigami": _2, "minamidaito": _2, "motobu": _2, "nago": _2, "naha": _2, "nakagusuku": _2, "nakijin": _2, "nanjo": _2, "nishihara": _2, "ogimi": _2, "okinawa": _2, "onna": _2, "shimoji": _2, "taketomi": _2, "tarama": _2, "tokashiki": _2, "tomigusuku": _2, "tonaki": _2, "urasoe": _2, "uruma": _2, "yaese": _2, "yomitan": _2, "yonabaru": _2, "yonaguni": _2, "zamami": _2 } }, "osaka": { "$": 1, "succ": { "abeno": _2, "chihayaakasaka": _2, "chuo": _2, "daito": _2, "fujiidera": _2, "habikino": _2, "hannan": _2, "higashiosaka": _2, "higashisumiyoshi": _2, "higashiyodogawa": _2, "hirakata": _2, "ibaraki": _2, "ikeda": _2, "izumi": _2, "izumiotsu": _2, "izumisano": _2, "kadoma": _2, "kaizuka": _2, "kanan": _2, "kashiwara": _2, "katano": _2, "kawachinagano": _2, "kishiwada": _2, "kita": _2, "kumatori": _2, "matsubara": _2, "minato": _2, "minoh": _2, "misaki": _2, "moriguchi": _2, "neyagawa": _2, "nishi": _2, "nose": _2, "osakasayama": _2, "sakai": _2, "sayama": _2, "sennan": _2, "settsu": _2, "shijonawate": _2, "shimamoto": _2, "suita": _2, "tadaoka": _2, "taishi": _2, "tajiri": _2, "takaishi": _2, "takatsuki": _2, "tondabayashi": _2, "toyonaka": _2, "toyono": _2, "yao": _2 } }, "saga": { "$": 1, "succ": { "ariake": _2, "arita": _2, "fukudomi": _2, "genkai": _2, "hamatama": _2, "hizen": _2, "imari": _2, "kamimine": _2, "kanzaki": _2, "karatsu": _2, "kashima": _2, "kitagata": _2, "kitahata": _2, "kiyama": _2, "kouhoku": _2, "kyuragi": _2, "nishiarita": _2, "ogi": _2, "omachi": _2, "ouchi": _2, "saga": _2, "shiroishi": _2, "taku": _2, "tara": _2, "tosu": _2, "yoshinogari": _2 } }, "saitama": { "$": 1, "succ": { "arakawa": _2, "asaka": _2, "chichibu": _2, "fujimi": _2, "fujimino": _2, "fukaya": _2, "hanno": _2, "hanyu": _2, "hasuda": _2, "hatogaya": _2, "hatoyama": _2, "hidaka": _2, "higashichichibu": _2, "higashimatsuyama": _2, "honjo": _2, "ina": _2, "iruma": _2, "iwatsuki": _2, "kamiizumi": _2, "kamikawa": _2, "kamisato": _2, "kasukabe": _2, "kawagoe": _2, "kawaguchi": _2, "kawajima": _2, "kazo": _2, "kitamoto": _2, "koshigaya": _2, "kounosu": _2, "kuki": _2, "kumagaya": _2, "matsubushi": _2, "minano": _2, "misato": _2, "miyashiro": _2, "miyoshi": _2, "moroyama": _2, "nagatoro": _2, "namegawa": _2, "niiza": _2, "ogano": _2, "ogawa": _2, "ogose": _2, "okegawa": _2, "omiya": _2, "otaki": _2, "ranzan": _2, "ryokami": _2, "saitama": _2, "sakado": _2, "satte": _2, "sayama": _2, "shiki": _2, "shiraoka": _2, "soka": _2, "sugito": _2, "toda": _2, "tokigawa": _2, "tokorozawa": _2, "tsurugashima": _2, "urawa": _2, "warabi": _2, "yashio": _2, "yokoze": _2, "yono": _2, "yorii": _2, "yoshida": _2, "yoshikawa": _2, "yoshimi": _2 } }, "shiga": { "$": 1, "succ": { "aisho": _2, "gamo": _2, "higashiomi": _2, "hikone": _2, "koka": _2, "konan": _2, "kosei": _2, "koto": _2, "kusatsu": _2, "maibara": _2, "moriyama": _2, "nagahama": _2, "nishiazai": _2, "notogawa": _2, "omihachiman": _2, "otsu": _2, "ritto": _2, "ryuoh": _2, "takashima": _2, "takatsuki": _2, "torahime": _2, "toyosato": _2, "yasu": _2 } }, "shimane": { "$": 1, "succ": { "akagi": _2, "ama": _2, "gotsu": _2, "hamada": _2, "higashiizumo": _2, "hikawa": _2, "hikimi": _2, "izumo": _2, "kakinoki": _2, "masuda": _2, "matsue": _2, "misato": _2, "nishinoshima": _2, "ohda": _2, "okinoshima": _2, "okuizumo": _2, "shimane": _2, "tamayu": _2, "tsuwano": _2, "unnan": _2, "yakumo": _2, "yasugi": _2, "yatsuka": _2 } }, "shizuoka": { "$": 1, "succ": { "arai": _2, "atami": _2, "fuji": _2, "fujieda": _2, "fujikawa": _2, "fujinomiya": _2, "fukuroi": _2, "gotemba": _2, "haibara": _2, "hamamatsu": _2, "higashiizu": _2, "ito": _2, "iwata": _2, "izu": _2, "izunokuni": _2, "kakegawa": _2, "kannami": _2, "kawanehon": _2, "kawazu": _2, "kikugawa": _2, "kosai": _2, "makinohara": _2, "matsuzaki": _2, "minamiizu": _2, "mishima": _2, "morimachi": _2, "nishiizu": _2, "numazu": _2, "omaezaki": _2, "shimada": _2, "shimizu": _2, "shimoda": _2, "shizuoka": _2, "susono": _2, "yaizu": _2, "yoshida": _2 } }, "tochigi": { "$": 1, "succ": { "ashikaga": _2, "bato": _2, "haga": _2, "ichikai": _2, "iwafune": _2, "kaminokawa": _2, "kanuma": _2, "karasuyama": _2, "kuroiso": _2, "mashiko": _2, "mibu": _2, "moka": _2, "motegi": _2, "nasu": _2, "nasushiobara": _2, "nikko": _2, "nishikata": _2, "nogi": _2, "ohira": _2, "ohtawara": _2, "oyama": _2, "sakura": _2, "sano": _2, "shimotsuke": _2, "shioya": _2, "takanezawa": _2, "tochigi": _2, "tsuga": _2, "ujiie": _2, "utsunomiya": _2, "yaita": _2 } }, "tokushima": { "$": 1, "succ": { "aizumi": _2, "anan": _2, "ichiba": _2, "itano": _2, "kainan": _2, "komatsushima": _2, "matsushige": _2, "mima": _2, "minami": _2, "miyoshi": _2, "mugi": _2, "nakagawa": _2, "naruto": _2, "sanagochi": _2, "shishikui": _2, "tokushima": _2, "wajiki": _2 } }, "tokyo": { "$": 1, "succ": { "adachi": _2, "akiruno": _2, "akishima": _2, "aogashima": _2, "arakawa": _2, "bunkyo": _2, "chiyoda": _2, "chofu": _2, "chuo": _2, "edogawa": _2, "fuchu": _2, "fussa": _2, "hachijo": _2, "hachioji": _2, "hamura": _2, "higashikurume": _2, "higashimurayama": _2, "higashiyamato": _2, "hino": _2, "hinode": _2, "hinohara": _2, "inagi": _2, "itabashi": _2, "katsushika": _2, "kita": _2, "kiyose": _2, "kodaira": _2, "koganei": _2, "kokubunji": _2, "komae": _2, "koto": _2, "kouzushima": _2, "kunitachi": _2, "machida": _2, "meguro": _2, "minato": _2, "mitaka": _2, "mizuho": _2, "musashimurayama": _2, "musashino": _2, "nakano": _2, "nerima": _2, "ogasawara": _2, "okutama": _2, "ome": _2, "oshima": _2, "ota": _2, "setagaya": _2, "shibuya": _2, "shinagawa": _2, "shinjuku": _2, "suginami": _2, "sumida": _2, "tachikawa": _2, "taito": _2, "tama": _2, "toshima": _2 } }, "tottori": { "$": 1, "succ": { "chizu": _2, "hino": _2, "kawahara": _2, "koge": _2, "kotoura": _2, "misasa": _2, "nanbu": _2, "nichinan": _2, "sakaiminato": _2, "tottori": _2, "wakasa": _2, "yazu": _2, "yonago": _2 } }, "toyama": { "$": 1, "succ": { "asahi": _2, "fuchu": _2, "fukumitsu": _2, "funahashi": _2, "himi": _2, "imizu": _2, "inami": _2, "johana": _2, "kamiichi": _2, "kurobe": _2, "nakaniikawa": _2, "namerikawa": _2, "nanto": _2, "nyuzen": _2, "oyabe": _2, "taira": _2, "takaoka": _2, "tateyama": _2, "toga": _2, "tonami": _2, "toyama": _2, "unazuki": _2, "uozu": _2, "yamada": _2 } }, "wakayama": { "$": 1, "succ": { "arida": _2, "aridagawa": _2, "gobo": _2, "hashimoto": _2, "hidaka": _2, "hirogawa": _2, "inami": _2, "iwade": _2, "kainan": _2, "kamitonda": _2, "katsuragi": _2, "kimino": _2, "kinokawa": _2, "kitayama": _2, "koya": _2, "koza": _2, "kozagawa": _2, "kudoyama": _2, "kushimoto": _2, "mihama": _2, "misato": _2, "nachikatsuura": _2, "shingu": _2, "shirahama": _2, "taiji": _2, "tanabe": _2, "wakayama": _2, "yuasa": _2, "yura": _2 } }, "yamagata": { "$": 1, "succ": { "asahi": _2, "funagata": _2, "higashine": _2, "iide": _2, "kahoku": _2, "kaminoyama": _2, "kaneyama": _2, "kawanishi": _2, "mamurogawa": _2, "mikawa": _2, "murayama": _2, "nagai": _2, "nakayama": _2, "nanyo": _2, "nishikawa": _2, "obanazawa": _2, "oe": _2, "oguni": _2, "ohkura": _2, "oishida": _2, "sagae": _2, "sakata": _2, "sakegawa": _2, "shinjo": _2, "shirataka": _2, "shonai": _2, "takahata": _2, "tendo": _2, "tozawa": _2, "tsuruoka": _2, "yamagata": _2, "yamanobe": _2, "yonezawa": _2, "yuza": _2 } }, "yamaguchi": { "$": 1, "succ": { "abu": _2, "hagi": _2, "hikari": _2, "hofu": _2, "iwakuni": _2, "kudamatsu": _2, "mitou": _2, "nagato": _2, "oshima": _2, "shimonoseki": _2, "shunan": _2, "tabuse": _2, "tokuyama": _2, "toyota": _2, "ube": _2, "yuu": _2 } }, "yamanashi": { "$": 1, "succ": { "chuo": _2, "doshi": _2, "fuefuki": _2, "fujikawa": _2, "fujikawaguchiko": _2, "fujiyoshida": _2, "hayakawa": _2, "hokuto": _2, "ichikawamisato": _2, "kai": _2, "kofu": _2, "koshu": _2, "kosuge": _2, "minami-alps": _2, "minobu": _2, "nakamichi": _2, "nanbu": _2, "narusawa": _2, "nirasaki": _2, "nishikatsura": _2, "oshino": _2, "otsuki": _2, "showa": _2, "tabayama": _2, "tsuru": _2, "uenohara": _2, "yamanakako": _2, "yamanashi": _2 } }, "xn--4pvxs": _2, "栃木": _2, "xn--vgu402c": _2, "愛知": _2, "xn--c3s14m": _2, "愛媛": _2, "xn--f6qx53a": _2, "兵庫": _2, "xn--8pvr4u": _2, "熊本": _2, "xn--uist22h": _2, "茨城": _2, "xn--djrs72d6uy": _2, "北海道": _2, "xn--mkru45i": _2, "千葉": _2, "xn--0trq7p7nn": _2, "和歌山": _2, "xn--8ltr62k": _2, "長崎": _2, "xn--2m4a15e": _2, "長野": _2, "xn--efvn9s": _2, "新潟": _2, "xn--32vp30h": _2, "青森": _2, "xn--4it797k": _2, "静岡": _2, "xn--1lqs71d": _2, "東京": _2, "xn--5rtp49c": _2, "石川": _2, "xn--5js045d": _2, "埼玉": _2, "xn--ehqz56n": _2, "三重": _2, "xn--1lqs03n": _2, "京都": _2, "xn--qqqt11m": _2, "佐賀": _2, "xn--kbrq7o": _2, "大分": _2, "xn--pssu33l": _2, "大阪": _2, "xn--ntsq17g": _2, "奈良": _2, "xn--uisz3g": _2, "宮城": _2, "xn--6btw5a": _2, "宮崎": _2, "xn--1ctwo": _2, "富山": _2, "xn--6orx2r": _2, "山口": _2, "xn--rht61e": _2, "山形": _2, "xn--rht27z": _2, "山梨": _2, "xn--djty4k": _2, "岩手": _2, "xn--nit225k": _2, "岐阜": _2, "xn--rht3d": _2, "岡山": _2, "xn--klty5x": _2, "島根": _2, "xn--kltx9a": _2, "広島": _2, "xn--kltp7d": _2, "徳島": _2, "xn--uuwu58a": _2, "沖縄": _2, "xn--zbx025d": _2, "滋賀": _2, "xn--ntso0iqx3a": _2, "神奈川": _2, "xn--elqq16h": _2, "福井": _2, "xn--4it168d": _2, "福岡": _2, "xn--klt787d": _2, "福島": _2, "xn--rny31h": _2, "秋田": _2, "xn--7t0a264c": _2, "群馬": _2, "xn--5rtq34k": _2, "香川": _2, "xn--k7yn95e": _2, "高知": _2, "xn--tor131o": _2, "鳥取": _2, "xn--d5qv7z876c": _2, "鹿児島": _2, "kawasaki": _8, "kitakyushu": _8, "kobe": _8, "nagoya": _8, "sapporo": _8, "sendai": _8, "yokohama": _8, "usercontent": _4, "blogspot": _4 } }, "ke": { "$": 1, "succ": { "ac": _2, "co": _5, "go": _2, "info": _2, "me": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2, "nom": _4 } }, "kg": { "$": 1, "succ": { "org": _2, "net": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "blog": _4, "io": _4, "jp": _4, "tv": _4, "uk": _4, "us": _4 } }, "kh": _8, "ki": _22, "km": { "$": 1, "succ": { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "ass": _2, "com": _2, "coop": _2, "asso": _2, "presse": _2, "medecin": _2, "notaires": _2, "pharmaciens": _2, "veterinaire": _2, "gouv": _2 } }, "kn": { "$": 1, "succ": { "net": _2, "org": _2, "edu": _2, "gov": _2 } }, "kp": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "rep": _2, "tra": _2 } }, "kr": { "$": 1, "succ": { "ac": _2, "co": _2, "es": _2, "go": _2, "hs": _2, "kg": _2, "mil": _2, "ms": _2, "ne": _2, "or": _2, "pe": _2, "re": _2, "sc": _2, "busan": _2, "chungbuk": _2, "chungnam": _2, "daegu": _2, "daejeon": _2, "gangwon": _2, "gwangju": _2, "gyeongbuk": _2, "gyeonggi": _2, "gyeongnam": _2, "incheon": _2, "jeju": _2, "jeonbuk": _2, "jeonnam": _2, "seoul": _2, "ulsan": _2, "blogspot": _4 } }, "kw": { "$": 1, "succ": { "com": _2, "edu": _2, "emb": _2, "gov": _2, "ind": _2, "net": _2, "org": _2 } }, "ky": _9, "kz": { "$": 1, "succ": { "org": _2, "edu": _2, "net": _2, "gov": _2, "mil": _2, "com": _2, "nym": _4 } }, "la": { "$": 1, "succ": { "int": _2, "net": _2, "info": _2, "edu": _2, "gov": _2, "per": _2, "com": _2, "org": _2, "bnr": _4, "c": _4, "nym": _4 } }, "lb": _9, "lc": { "$": 1, "succ": { "com": _2, "net": _2, "co": _2, "org": _2, "edu": _2, "gov": _2, "nym": _4, "oy": _4 } }, "li": { "$": 1, "succ": { "blogspot": _4, "caa": _4, "nom": _4, "nym": _4 } }, "lk": { "$": 1, "succ": { "gov": _2, "sch": _2, "net": _2, "int": _2, "com": _2, "org": _2, "edu": _2, "ngo": _2, "soc": _2, "web": _2, "ltd": _2, "assn": _2, "grp": _2, "hotel": _2, "ac": _2 } }, "lr": _9, "ls": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "sc": _2, "de": _4 } }, "lt": _20, "lu": _23, "lv": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "id": _2, "net": _2, "asn": _2, "conf": _2, "nom": _4 } }, "ly": { "$": 1, "succ": { "com": _2, "net": _2, "gov": _2, "plc": _2, "edu": _2, "sch": _2, "med": _2, "org": _2, "id": _2 } }, "ma": { "$": 1, "succ": { "co": _2, "net": _2, "gov": _2, "org": _2, "ac": _2, "press": _2 } }, "mc": { "$": 1, "succ": { "tm": _2, "asso": _2 } }, "md": { "$": 1, "succ": { "blogspot": _4, "at": _4, "de": _4, "jp": _4, "to": _4 } }, "me": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "edu": _2, "ac": _2, "gov": _2, "its": _2, "priv": _2, "c66": _4, "daplie": { "$": 2, "succ": { "localhost": _4 } }, "edgestack": _4, "couk": _4, "ukco": _4, "filegear": _4, "filegear-au": _4, "filegear-de": _4, "filegear-gb": _4, "filegear-ie": _4, "filegear-jp": _4, "filegear-sg": _4, "glitch": _4, "ravendb": _4, "barsy": _4, "nctu": _4, "soundcast": _4, "tcp4": _4, "brasilia": _4, "ddns": _4, "dnsfor": _4, "hopto": _4, "loginto": _4, "noip": _4, "webhop": _4, "nym": _4, "diskstation": _4, "dscloud": _4, "i234": _4, "myds": _4, "synology": _4, "wedeploy": _4, "yombo": _4, "nohost": _4 } }, "mg": { "$": 1, "succ": { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "com": _2, "co": _2 } }, "mh": _2, "mil": _2, "mk": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "edu": _2, "gov": _2, "inf": _2, "name": _2, "blogspot": _4, "nom": _4 } }, "ml": { "$": 1, "succ": { "com": _2, "edu": _2, "gouv": _2, "gov": _2, "net": _2, "org": _2, "presse": _2 } }, "mm": _8, "mn": { "$": 1, "succ": { "gov": _2, "edu": _2, "org": _2, "nyc": _4, "nym": _4 } }, "mo": _9, "mobi": { "$": 1, "succ": { "barsy": _4, "dscloud": _4 } }, "mp": _2, "mq": _2, "mr": { "$": 1, "succ": { "gov": _2, "blogspot": _4 } }, "ms": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "lab": _4 } }, "mt": { "$": 1, "succ": { "com": _5, "edu": _2, "net": _2, "org": _2 } }, "mu": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "ac": _2, "co": _2, "or": _2 } }, "museum": { "$": 1, "succ": { "academy": _2, "agriculture": _2, "air": _2, "airguard": _2, "alabama": _2, "alaska": _2, "amber": _2, "ambulance": _2, "american": _2, "americana": _2, "americanantiques": _2, "americanart": _2, "amsterdam": _2, "and": _2, "annefrank": _2, "anthro": _2, "anthropology": _2, "antiques": _2, "aquarium": _2, "arboretum": _2, "archaeological": _2, "archaeology": _2, "architecture": _2, "art": _2, "artanddesign": _2, "artcenter": _2, "artdeco": _2, "arteducation": _2, "artgallery": _2, "arts": _2, "artsandcrafts": _2, "asmatart": _2, "assassination": _2, "assisi": _2, "association": _2, "astronomy": _2, "atlanta": _2, "austin": _2, "australia": _2, "automotive": _2, "aviation": _2, "axis": _2, "badajoz": _2, "baghdad": _2, "bahn": _2, "bale": _2, "baltimore": _2, "barcelona": _2, "baseball": _2, "basel": _2, "baths": _2, "bauern": _2, "beauxarts": _2, "beeldengeluid": _2, "bellevue": _2, "bergbau": _2, "berkeley": _2, "berlin": _2, "bern": _2, "bible": _2, "bilbao": _2, "bill": _2, "birdart": _2, "birthplace": _2, "bonn": _2, "boston": _2, "botanical": _2, "botanicalgarden": _2, "botanicgarden": _2, "botany": _2, "brandywinevalley": _2, "brasil": _2, "bristol": _2, "british": _2, "britishcolumbia": _2, "broadcast": _2, "brunel": _2, "brussel": _2, "brussels": _2, "bruxelles": _2, "building": _2, "burghof": _2, "bus": _2, "bushey": _2, "cadaques": _2, "california": _2, "cambridge": _2, "can": _2, "canada": _2, "capebreton": _2, "carrier": _2, "cartoonart": _2, "casadelamoneda": _2, "castle": _2, "castres": _2, "celtic": _2, "center": _2, "chattanooga": _2, "cheltenham": _2, "chesapeakebay": _2, "chicago": _2, "children": _2, "childrens": _2, "childrensgarden": _2, "chiropractic": _2, "chocolate": _2, "christiansburg": _2, "cincinnati": _2, "cinema": _2, "circus": _2, "civilisation": _2, "civilization": _2, "civilwar": _2, "clinton": _2, "clock": _2, "coal": _2, "coastaldefence": _2, "cody": _2, "coldwar": _2, "collection": _2, "colonialwilliamsburg": _2, "coloradoplateau": _2, "columbia": _2, "columbus": _2, "communication": _2, "communications": _2, "community": _2, "computer": _2, "computerhistory": _2, "xn--comunicaes-v6a2o": _2, "comunicações": _2, "contemporary": _2, "contemporaryart": _2, "convent": _2, "copenhagen": _2, "corporation": _2, "xn--correios-e-telecomunicaes-ghc29a": _2, "correios-e-telecomunicações": _2, "corvette": _2, "costume": _2, "countryestate": _2, "county": _2, "crafts": _2, "cranbrook": _2, "creation": _2, "cultural": _2, "culturalcenter": _2, "culture": _2, "cyber": _2, "cymru": _2, "dali": _2, "dallas": _2, "database": _2, "ddr": _2, "decorativearts": _2, "delaware": _2, "delmenhorst": _2, "denmark": _2, "depot": _2, "design": _2, "detroit": _2, "dinosaur": _2, "discovery": _2, "dolls": _2, "donostia": _2, "durham": _2, "eastafrica": _2, "eastcoast": _2, "education": _2, "educational": _2, "egyptian": _2, "eisenbahn": _2, "elburg": _2, "elvendrell": _2, "embroidery": _2, "encyclopedic": _2, "england": _2, "entomology": _2, "environment": _2, "environmentalconservation": _2, "epilepsy": _2, "essex": _2, "estate": _2, "ethnology": _2, "exeter": _2, "exhibition": _2, "family": _2, "farm": _2, "farmequipment": _2, "farmers": _2, "farmstead": _2, "field": _2, "figueres": _2, "filatelia": _2, "film": _2, "fineart": _2, "finearts": _2, "finland": _2, "flanders": _2, "florida": _2, "force": _2, "fortmissoula": _2, "fortworth": _2, "foundation": _2, "francaise": _2, "frankfurt": _2, "franziskaner": _2, "freemasonry": _2, "freiburg": _2, "fribourg": _2, "frog": _2, "fundacio": _2, "furniture": _2, "gallery": _2, "garden": _2, "gateway": _2, "geelvinck": _2, "gemological": _2, "geology": _2, "georgia": _2, "giessen": _2, "glas": _2, "glass": _2, "gorge": _2, "grandrapids": _2, "graz": _2, "guernsey": _2, "halloffame": _2, "hamburg": _2, "handson": _2, "harvestcelebration": _2, "hawaii": _2, "health": _2, "heimatunduhren": _2, "hellas": _2, "helsinki": _2, "hembygdsforbund": _2, "heritage": _2, "histoire": _2, "historical": _2, "historicalsociety": _2, "historichouses": _2, "historisch": _2, "historisches": _2, "history": _2, "historyofscience": _2, "horology": _2, "house": _2, "humanities": _2, "illustration": _2, "imageandsound": _2, "indian": _2, "indiana": _2, "indianapolis": _2, "indianmarket": _2, "intelligence": _2, "interactive": _2, "iraq": _2, "iron": _2, "isleofman": _2, "jamison": _2, "jefferson": _2, "jerusalem": _2, "jewelry": _2, "jewish": _2, "jewishart": _2, "jfk": _2, "journalism": _2, "judaica": _2, "judygarland": _2, "juedisches": _2, "juif": _2, "karate": _2, "karikatur": _2, "kids": _2, "koebenhavn": _2, "koeln": _2, "kunst": _2, "kunstsammlung": _2, "kunstunddesign": _2, "labor": _2, "labour": _2, "lajolla": _2, "lancashire": _2, "landes": _2, "lans": _2, "xn--lns-qla": _2, "läns": _2, "larsson": _2, "lewismiller": _2, "lincoln": _2, "linz": _2, "living": _2, "livinghistory": _2, "localhistory": _2, "london": _2, "losangeles": _2, "louvre": _2, "loyalist": _2, "lucerne": _2, "luxembourg": _2, "luzern": _2, "mad": _2, "madrid": _2, "mallorca": _2, "manchester": _2, "mansion": _2, "mansions": _2, "manx": _2, "marburg": _2, "maritime": _2, "maritimo": _2, "maryland": _2, "marylhurst": _2, "media": _2, "medical": _2, "medizinhistorisches": _2, "meeres": _2, "memorial": _2, "mesaverde": _2, "michigan": _2, "midatlantic": _2, "military": _2, "mill": _2, "miners": _2, "mining": _2, "minnesota": _2, "missile": _2, "missoula": _2, "modern": _2, "moma": _2, "money": _2, "monmouth": _2, "monticello": _2, "montreal": _2, "moscow": _2, "motorcycle": _2, "muenchen": _2, "muenster": _2, "mulhouse": _2, "muncie": _2, "museet": _2, "museumcenter": _2, "museumvereniging": _2, "music": _2, "national": _2, "nationalfirearms": _2, "nationalheritage": _2, "nativeamerican": _2, "naturalhistory": _2, "naturalhistorymuseum": _2, "naturalsciences": _2, "nature": _2, "naturhistorisches": _2, "natuurwetenschappen": _2, "naumburg": _2, "naval": _2, "nebraska": _2, "neues": _2, "newhampshire": _2, "newjersey": _2, "newmexico": _2, "newport": _2, "newspaper": _2, "newyork": _2, "niepce": _2, "norfolk": _2, "north": _2, "nrw": _2, "nyc": _2, "nyny": _2, "oceanographic": _2, "oceanographique": _2, "omaha": _2, "online": _2, "ontario": _2, "openair": _2, "oregon": _2, "oregontrail": _2, "otago": _2, "oxford": _2, "pacific": _2, "paderborn": _2, "palace": _2, "paleo": _2, "palmsprings": _2, "panama": _2, "paris": _2, "pasadena": _2, "pharmacy": _2, "philadelphia": _2, "philadelphiaarea": _2, "philately": _2, "phoenix": _2, "photography": _2, "pilots": _2, "pittsburgh": _2, "planetarium": _2, "plantation": _2, "plants": _2, "plaza": _2, "portal": _2, "portland": _2, "portlligat": _2, "posts-and-telecommunications": _2, "preservation": _2, "presidio": _2, "press": _2, "project": _2, "public": _2, "pubol": _2, "quebec": _2, "railroad": _2, "railway": _2, "research": _2, "resistance": _2, "riodejaneiro": _2, "rochester": _2, "rockart": _2, "roma": _2, "russia": _2, "saintlouis": _2, "salem": _2, "salvadordali": _2, "salzburg": _2, "sandiego": _2, "sanfrancisco": _2, "santabarbara": _2, "santacruz": _2, "santafe": _2, "saskatchewan": _2, "satx": _2, "savannahga": _2, "schlesisches": _2, "schoenbrunn": _2, "schokoladen": _2, "school": _2, "schweiz": _2, "science": _2, "scienceandhistory": _2, "scienceandindustry": _2, "sciencecenter": _2, "sciencecenters": _2, "science-fiction": _2, "sciencehistory": _2, "sciences": _2, "sciencesnaturelles": _2, "scotland": _2, "seaport": _2, "settlement": _2, "settlers": _2, "shell": _2, "sherbrooke": _2, "sibenik": _2, "silk": _2, "ski": _2, "skole": _2, "society": _2, "sologne": _2, "soundandvision": _2, "southcarolina": _2, "southwest": _2, "space": _2, "spy": _2, "square": _2, "stadt": _2, "stalbans": _2, "starnberg": _2, "state": _2, "stateofdelaware": _2, "station": _2, "steam": _2, "steiermark": _2, "stjohn": _2, "stockholm": _2, "stpetersburg": _2, "stuttgart": _2, "suisse": _2, "surgeonshall": _2, "surrey": _2, "svizzera": _2, "sweden": _2, "sydney": _2, "tank": _2, "tcm": _2, "technology": _2, "telekommunikation": _2, "television": _2, "texas": _2, "textile": _2, "theater": _2, "time": _2, "timekeeping": _2, "topology": _2, "torino": _2, "touch": _2, "town": _2, "transport": _2, "tree": _2, "trolley": _2, "trust": _2, "trustee": _2, "uhren": _2, "ulm": _2, "undersea": _2, "university": _2, "usa": _2, "usantiques": _2, "usarts": _2, "uscountryestate": _2, "usculture": _2, "usdecorativearts": _2, "usgarden": _2, "ushistory": _2, "ushuaia": _2, "uslivinghistory": _2, "utah": _2, "uvic": _2, "valley": _2, "vantaa": _2, "versailles": _2, "viking": _2, "village": _2, "virginia": _2, "virtual": _2, "virtuel": _2, "vlaanderen": _2, "volkenkunde": _2, "wales": _2, "wallonie": _2, "war": _2, "washingtondc": _2, "watchandclock": _2, "watch-and-clock": _2, "western": _2, "westfalen": _2, "whaling": _2, "wildlife": _2, "williamsburg": _2, "windmill": _2, "workshop": _2, "york": _2, "yorkshire": _2, "yosemite": _2, "youth": _2, "zoological": _2, "zoology": _2, "xn--9dbhblg6di": _2, "ירושלים": _2, "xn--h1aegh": _2, "иком": _2 } }, "mv": { "$": 1, "succ": { "aero": _2, "biz": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "museum": _2, "name": _2, "net": _2, "org": _2, "pro": _2 } }, "mw": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "int": _2, "museum": _2, "net": _2, "org": _2 } }, "mx": { "$": 1, "succ": { "com": _2, "org": _2, "gob": _2, "edu": _2, "net": _2, "blogspot": _4, "nym": _4 } }, "my": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "mil": _2, "name": _2, "blogspot": _4 } }, "mz": { "$": 1, "succ": { "ac": _2, "adv": _2, "co": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "na": { "$": 1, "succ": { "info": _2, "pro": _2, "name": _2, "school": _2, "or": _2, "dr": _2, "us": _2, "mx": _2, "ca": _2, "in": _2, "cc": _2, "tv": _2, "ws": _2, "mobi": _2, "co": _2, "com": _2, "org": _2 } }, "name": { "$": 1, "succ": { "her": _26, "his": _26 } }, "nc": { "$": 1, "succ": { "asso": _2, "nom": _2 } }, "ne": _2, "net": { "$": 1, "succ": { "adobeaemcloud": _4, "alwaysdata": _4, "cloudfront": _4, "t3l3p0rt": _4, "myfritz": _4, "blackbaudcdn": _4, "boomla": _4, "bplaced": _4, "square7": _4, "gb": _4, "hu": _4, "jp": _4, "se": _4, "uk": _4, "in": _4, "clic2000": _4, "cloudaccess": _4, "cdn77-ssl": _4, "cdn77": { "$": 0, "succ": { "r": _4 } }, "cloudeity": _4, "feste-ip": _4, "knx-server": _4, "static-access": _4, "cryptonomic": _7, "dattolocal": _4, "mydatto": _4, "debian": _4, "bitbridge": _4, "at-band-camp": _4, "blogdns": _4, "broke-it": _4, "buyshouses": _4, "dnsalias": _4, "dnsdojo": _4, "does-it": _4, "dontexist": _4, "dynalias": _4, "dynathome": _4, "endofinternet": _4, "from-az": _4, "from-co": _4, "from-la": _4, "from-ny": _4, "gets-it": _4, "ham-radio-op": _4, "homeftp": _4, "homeip": _4, "homelinux": _4, "homeunix": _4, "in-the-band": _4, "is-a-chef": _4, "is-a-geek": _4, "isa-geek": _4, "kicks-ass": _4, "office-on-the": _4, "podzone": _4, "scrapper-site": _4, "selfip": _4, "sells-it": _4, "servebbs": _4, "serveftp": _4, "thruhere": _4, "webhop": _4, "definima": _4, "casacam": _4, "dynu": _4, "dynv6": _4, "twmail": _4, "ru": _4, "channelsdvr": { "$": 2, "succ": { "u": _4 } }, "fastlylb": { "$": 2, "succ": { "map": _4 } }, "fastly": { "$": 0, "succ": { "freetls": _4, "map": _4, "prod": { "$": 0, "succ": { "a": _4, "global": _4 } }, "ssl": { "$": 0, "succ": { "a": _4, "b": _4, "global": _4 } } } }, "edgeapp": _4, "flynnhosting": _4, "cloudfunctions": _4, "moonscale": _4, "in-dsl": _4, "in-vpn": _4, "ipifony": _4, "iobb": _4, "cloudjiffy": _4, "elastx": { "$": 0, "succ": { "jls-sto1": _4 } }, "saveincloud": _27, "kinghost": _4, "uni5": _4, "barsy": _4, "memset": _4, "azurewebsites": _4, "azure-mobile": _4, "cloudapp": _4, "dnsup": _4, "hicam": _4, "now-dns": _4, "ownip": _4, "vpndns": _4, "eating-organic": _4, "mydissent": _4, "myeffect": _4, "mymediapc": _4, "mypsx": _4, "mysecuritycamera": _4, "nhlfan": _4, "no-ip": _4, "pgafan": _4, "privatizehealthinsurance": _4, "bounceme": _4, "ddns": _4, "redirectme": _4, "serveblog": _4, "serveminecraft": _4, "sytes": _4, "cloudycluster": _4, "rackmaze": _4, "schokokeks": _4, "firewall-gateway": _4, "seidat": _4, "senseering": _4, "siteleaf": _4, "srcf": { "$": 0, "succ": { "soc": _4, "user": _4 } }, "dsmynas": _4, "familyds": _4, "community-pro": _4, "meinforum": _4, "yandexcloud": { "$": 2, "succ": { "storage": _4, "website": _4 } }, "za": _4 } }, "nf": { "$": 1, "succ": { "com": _2, "net": _2, "per": _2, "rec": _2, "web": _2, "arts": _2, "firm": _2, "info": _2, "other": _2, "store": _2 } }, "ng": { "$": 1, "succ": { "com": _5, "edu": _2, "gov": _2, "i": _2, "mil": _2, "mobi": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "col": _4, "firm": _4, "gen": _4, "ltd": _4, "ngo": _4 } }, "ni": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gob": _2, "in": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "web": _2 } }, "nl": { "$": 1, "succ": { "amsw": _4, "virtueeldomein": _4, "co": _4, "hosting-cluster": _4, "blogspot": _4, "khplay": _4, "transurl": _7, "cistron": _4, "demon": _4 } }, "no": { "$": 1, "succ": { "fhs": _2, "vgs": _2, "fylkesbibl": _2, "folkebibl": _2, "museum": _2, "idrett": _2, "priv": _2, "mil": _2, "stat": _2, "dep": _2, "kommune": _2, "herad": _2, "aa": _28, "ah": _28, "bu": _28, "fm": _28, "hl": _28, "hm": _28, "jan-mayen": _28, "mr": _28, "nl": _28, "nt": _28, "of": _28, "ol": _28, "oslo": _28, "rl": _28, "sf": _28, "st": _28, "svalbard": _28, "tm": _28, "tr": _28, "va": _28, "vf": _28, "akrehamn": _2, "xn--krehamn-dxa": _2, "åkrehamn": _2, "algard": _2, "xn--lgrd-poac": _2, "ålgård": _2, "arna": _2, "brumunddal": _2, "bryne": _2, "bronnoysund": _2, "xn--brnnysund-m8ac": _2, "brønnøysund": _2, "drobak": _2, "xn--drbak-wua": _2, "drøbak": _2, "egersund": _2, "fetsund": _2, "floro": _2, "xn--flor-jra": _2, "florø": _2, "fredrikstad": _2, "hokksund": _2, "honefoss": _2, "xn--hnefoss-q1a": _2, "hønefoss": _2, "jessheim": _2, "jorpeland": _2, "xn--jrpeland-54a": _2, "jørpeland": _2, "kirkenes": _2, "kopervik": _2, "krokstadelva": _2, "langevag": _2, "xn--langevg-jxa": _2, "langevåg": _2, "leirvik": _2, "mjondalen": _2, "xn--mjndalen-64a": _2, "mjøndalen": _2, "mo-i-rana": _2, "mosjoen": _2, "xn--mosjen-eya": _2, "mosjøen": _2, "nesoddtangen": _2, "orkanger": _2, "osoyro": _2, "xn--osyro-wua": _2, "osøyro": _2, "raholt": _2, "xn--rholt-mra": _2, "råholt": _2, "sandnessjoen": _2, "xn--sandnessjen-ogb": _2, "sandnessjøen": _2, "skedsmokorset": _2, "slattum": _2, "spjelkavik": _2, "stathelle": _2, "stavern": _2, "stjordalshalsen": _2, "xn--stjrdalshalsen-sqb": _2, "stjørdalshalsen": _2, "tananger": _2, "tranby": _2, "vossevangen": _2, "afjord": _2, "xn--fjord-lra": _2, "åfjord": _2, "agdenes": _2, "al": _2, "xn--l-1fa": _2, "ål": _2, "alesund": _2, "xn--lesund-hua": _2, "ålesund": _2, "alstahaug": _2, "alta": _2, "xn--lt-liac": _2, "áltá": _2, "alaheadju": _2, "xn--laheadju-7ya": _2, "álaheadju": _2, "alvdal": _2, "amli": _2, "xn--mli-tla": _2, "åmli": _2, "amot": _2, "xn--mot-tla": _2, "åmot": _2, "andebu": _2, "andoy": _2, "xn--andy-ira": _2, "andøy": _2, "andasuolo": _2, "ardal": _2, "xn--rdal-poa": _2, "årdal": _2, "aremark": _2, "arendal": _2, "xn--s-1fa": _2, "ås": _2, "aseral": _2, "xn--seral-lra": _2, "åseral": _2, "asker": _2, "askim": _2, "askvoll": _2, "askoy": _2, "xn--asky-ira": _2, "askøy": _2, "asnes": _2, "xn--snes-poa": _2, "åsnes": _2, "audnedaln": _2, "aukra": _2, "aure": _2, "aurland": _2, "aurskog-holand": _2, "xn--aurskog-hland-jnb": _2, "aurskog-høland": _2, "austevoll": _2, "austrheim": _2, "averoy": _2, "xn--avery-yua": _2, "averøy": _2, "balestrand": _2, "ballangen": _2, "balat": _2, "xn--blt-elab": _2, "bálát": _2, "balsfjord": _2, "bahccavuotna": _2, "xn--bhccavuotna-k7a": _2, "báhccavuotna": _2, "bamble": _2, "bardu": _2, "beardu": _2, "beiarn": _2, "bajddar": _2, "xn--bjddar-pta": _2, "bájddar": _2, "baidar": _2, "xn--bidr-5nac": _2, "báidár": _2, "berg": _2, "bergen": _2, "berlevag": _2, "xn--berlevg-jxa": _2, "berlevåg": _2, "bearalvahki": _2, "xn--bearalvhki-y4a": _2, "bearalváhki": _2, "bindal": _2, "birkenes": _2, "bjarkoy": _2, "xn--bjarky-fya": _2, "bjarkøy": _2, "bjerkreim": _2, "bjugn": _2, "bodo": _2, "xn--bod-2na": _2, "bodø": _2, "badaddja": _2, "xn--bdddj-mrabd": _2, "bådåddjå": _2, "budejju": _2, "bokn": _2, "bremanger": _2, "bronnoy": _2, "xn--brnny-wuac": _2, "brønnøy": _2, "bygland": _2, "bykle": _2, "barum": _2, "xn--brum-voa": _2, "bærum": _2, "telemark": { "$": 0, "succ": { "bo": _2, "xn--b-5ga": _2, "bø": _2 } }, "nordland": { "$": 0, "succ": { "bo": _2, "xn--b-5ga": _2, "bø": _2, "heroy": _2, "xn--hery-ira": _2, "herøy": _2 } }, "bievat": _2, "xn--bievt-0qa": _2, "bievát": _2, "bomlo": _2, "xn--bmlo-gra": _2, "bømlo": _2, "batsfjord": _2, "xn--btsfjord-9za": _2, "båtsfjord": _2, "bahcavuotna": _2, "xn--bhcavuotna-s4a": _2, "báhcavuotna": _2, "dovre": _2, "drammen": _2, "drangedal": _2, "dyroy": _2, "xn--dyry-ira": _2, "dyrøy": _2, "donna": _2, "xn--dnna-gra": _2, "dønna": _2, "eid": _2, "eidfjord": _2, "eidsberg": _2, "eidskog": _2, "eidsvoll": _2, "eigersund": _2, "elverum": _2, "enebakk": _2, "engerdal": _2, "etne": _2, "etnedal": _2, "evenes": _2, "evenassi": _2, "xn--eveni-0qa01ga": _2, "evenášši": _2, "evje-og-hornnes": _2, "farsund": _2, "fauske": _2, "fuossko": _2, "fuoisku": _2, "fedje": _2, "fet": _2, "finnoy": _2, "xn--finny-yua": _2, "finnøy": _2, "fitjar": _2, "fjaler": _2, "fjell": _2, "flakstad": _2, "flatanger": _2, "flekkefjord": _2, "flesberg": _2, "flora": _2, "fla": _2, "xn--fl-zia": _2, "flå": _2, "folldal": _2, "forsand": _2, "fosnes": _2, "frei": _2, "frogn": _2, "froland": _2, "frosta": _2, "frana": _2, "xn--frna-woa": _2, "fræna": _2, "froya": _2, "xn--frya-hra": _2, "frøya": _2, "fusa": _2, "fyresdal": _2, "forde": _2, "xn--frde-gra": _2, "førde": _2, "gamvik": _2, "gangaviika": _2, "xn--ggaviika-8ya47h": _2, "gáŋgaviika": _2, "gaular": _2, "gausdal": _2, "gildeskal": _2, "xn--gildeskl-g0a": _2, "gildeskål": _2, "giske": _2, "gjemnes": _2, "gjerdrum": _2, "gjerstad": _2, "gjesdal": _2, "gjovik": _2, "xn--gjvik-wua": _2, "gjøvik": _2, "gloppen": _2, "gol": _2, "gran": _2, "grane": _2, "granvin": _2, "gratangen": _2, "grimstad": _2, "grong": _2, "kraanghke": _2, "xn--kranghke-b0a": _2, "kråanghke": _2, "grue": _2, "gulen": _2, "hadsel": _2, "halden": _2, "halsa": _2, "hamar": _2, "hamaroy": _2, "habmer": _2, "xn--hbmer-xqa": _2, "hábmer": _2, "hapmir": _2, "xn--hpmir-xqa": _2, "hápmir": _2, "hammerfest": _2, "hammarfeasta": _2, "xn--hmmrfeasta-s4ac": _2, "hámmárfeasta": _2, "haram": _2, "hareid": _2, "harstad": _2, "hasvik": _2, "aknoluokta": _2, "xn--koluokta-7ya57h": _2, "ákŋoluokta": _2, "hattfjelldal": _2, "aarborte": _2, "haugesund": _2, "hemne": _2, "hemnes": _2, "hemsedal": _2, "more-og-romsdal": { "$": 0, "succ": { "heroy": _2, "sande": _2 } }, "xn--mre-og-romsdal-qqb": { "$": 0, "succ": { "xn--hery-ira": _2, "sande": _2 } }, "møre-og-romsdal": { "$": 0, "succ": { "herøy": _2, "sande": _2 } }, "hitra": _2, "hjartdal": _2, "hjelmeland": _2, "hobol": _2, "xn--hobl-ira": _2, "hobøl": _2, "hof": _2, "hol": _2, "hole": _2, "holmestrand": _2, "holtalen": _2, "xn--holtlen-hxa": _2, "holtålen": _2, "hornindal": _2, "horten": _2, "hurdal": _2, "hurum": _2, "hvaler": _2, "hyllestad": _2, "hagebostad": _2, "xn--hgebostad-g3a": _2, "hægebostad": _2, "hoyanger": _2, "xn--hyanger-q1a": _2, "høyanger": _2, "hoylandet": _2, "xn--hylandet-54a": _2, "høylandet": _2, "ha": _2, "xn--h-2fa": _2, "hå": _2, "ibestad": _2, "inderoy": _2, "xn--indery-fya": _2, "inderøy": _2, "iveland": _2, "jevnaker": _2, "jondal": _2, "jolster": _2, "xn--jlster-bya": _2, "jølster": _2, "karasjok": _2, "karasjohka": _2, "xn--krjohka-hwab49j": _2, "kárášjohka": _2, "karlsoy": _2, "galsa": _2, "xn--gls-elac": _2, "gálsá": _2, "karmoy": _2, "xn--karmy-yua": _2, "karmøy": _2, "kautokeino": _2, "guovdageaidnu": _2, "klepp": _2, "klabu": _2, "xn--klbu-woa": _2, "klæbu": _2, "kongsberg": _2, "kongsvinger": _2, "kragero": _2, "xn--krager-gya": _2, "kragerø": _2, "kristiansand": _2, "kristiansund": _2, "krodsherad": _2, "xn--krdsherad-m8a": _2, "krødsherad": _2, "kvalsund": _2, "rahkkeravju": _2, "xn--rhkkervju-01af": _2, "ráhkkerávju": _2, "kvam": _2, "kvinesdal": _2, "kvinnherad": _2, "kviteseid": _2, "kvitsoy": _2, "xn--kvitsy-fya": _2, "kvitsøy": _2, "kvafjord": _2, "xn--kvfjord-nxa": _2, "kvæfjord": _2, "giehtavuoatna": _2, "kvanangen": _2, "xn--kvnangen-k0a": _2, "kvænangen": _2, "navuotna": _2, "xn--nvuotna-hwa": _2, "návuotna": _2, "kafjord": _2, "xn--kfjord-iua": _2, "kåfjord": _2, "gaivuotna": _2, "xn--givuotna-8ya": _2, "gáivuotna": _2, "larvik": _2, "lavangen": _2, "lavagis": _2, "loabat": _2, "xn--loabt-0qa": _2, "loabát": _2, "lebesby": _2, "davvesiida": _2, "leikanger": _2, "leirfjord": _2, "leka": _2, "leksvik": _2, "lenvik": _2, "leangaviika": _2, "xn--leagaviika-52b": _2, "leaŋgaviika": _2, "lesja": _2, "levanger": _2, "lier": _2, "lierne": _2, "lillehammer": _2, "lillesand": _2, "lindesnes": _2, "lindas": _2, "xn--linds-pra": _2, "lindås": _2, "lom": _2, "loppa": _2, "lahppi": _2, "xn--lhppi-xqa": _2, "láhppi": _2, "lund": _2, "lunner": _2, "luroy": _2, "xn--lury-ira": _2, "lurøy": _2, "luster": _2, "lyngdal": _2, "lyngen": _2, "ivgu": _2, "lardal": _2, "lerdal": _2, "xn--lrdal-sra": _2, "lærdal": _2, "lodingen": _2, "xn--ldingen-q1a": _2, "lødingen": _2, "lorenskog": _2, "xn--lrenskog-54a": _2, "lørenskog": _2, "loten": _2, "xn--lten-gra": _2, "løten": _2, "malvik": _2, "masoy": _2, "xn--msy-ula0h": _2, "måsøy": _2, "muosat": _2, "xn--muost-0qa": _2, "muosát": _2, "mandal": _2, "marker": _2, "marnardal": _2, "masfjorden": _2, "meland": _2, "meldal": _2, "melhus": _2, "meloy": _2, "xn--mely-ira": _2, "meløy": _2, "meraker": _2, "xn--merker-kua": _2, "meråker": _2, "moareke": _2, "xn--moreke-jua": _2, "moåreke": _2, "midsund": _2, "midtre-gauldal": _2, "modalen": _2, "modum": _2, "molde": _2, "moskenes": _2, "moss": _2, "mosvik": _2, "malselv": _2, "xn--mlselv-iua": _2, "målselv": _2, "malatvuopmi": _2, "xn--mlatvuopmi-s4a": _2, "málatvuopmi": _2, "namdalseid": _2, "aejrie": _2, "namsos": _2, "namsskogan": _2, "naamesjevuemie": _2, "xn--nmesjevuemie-tcba": _2, "nååmesjevuemie": _2, "laakesvuemie": _2, "nannestad": _2, "narvik": _2, "narviika": _2, "naustdal": _2, "nedre-eiker": _2, "akershus": _29, "buskerud": _29, "nesna": _2, "nesodden": _2, "nesseby": _2, "unjarga": _2, "xn--unjrga-rta": _2, "unjárga": _2, "nesset": _2, "nissedal": _2, "nittedal": _2, "nord-aurdal": _2, "nord-fron": _2, "nord-odal": _2, "norddal": _2, "nordkapp": _2, "davvenjarga": _2, "xn--davvenjrga-y4a": _2, "davvenjárga": _2, "nordre-land": _2, "nordreisa": _2, "raisa": _2, "xn--risa-5na": _2, "ráisa": _2, "nore-og-uvdal": _2, "notodden": _2, "naroy": _2, "xn--nry-yla5g": _2, "nærøy": _2, "notteroy": _2, "xn--nttery-byae": _2, "nøtterøy": _2, "odda": _2, "oksnes": _2, "xn--ksnes-uua": _2, "øksnes": _2, "oppdal": _2, "oppegard": _2, "xn--oppegrd-ixa": _2, "oppegård": _2, "orkdal": _2, "orland": _2, "xn--rland-uua": _2, "ørland": _2, "orskog": _2, "xn--rskog-uua": _2, "ørskog": _2, "orsta": _2, "xn--rsta-fra": _2, "ørsta": _2, "hedmark": { "$": 0, "succ": { "os": _2, "valer": _2, "xn--vler-qoa": _2, "våler": _2 } }, "hordaland": { "$": 0, "succ": { "os": _2 } }, "osen": _2, "osteroy": _2, "xn--ostery-fya": _2, "osterøy": _2, "ostre-toten": _2, "xn--stre-toten-zcb": _2, "østre-toten": _2, "overhalla": _2, "ovre-eiker": _2, "xn--vre-eiker-k8a": _2, "øvre-eiker": _2, "oyer": _2, "xn--yer-zna": _2, "øyer": _2, "oygarden": _2, "xn--ygarden-p1a": _2, "øygarden": _2, "oystre-slidre": _2, "xn--ystre-slidre-ujb": _2, "øystre-slidre": _2, "porsanger": _2, "porsangu": _2, "xn--porsgu-sta26f": _2, "porsáŋgu": _2, "porsgrunn": _2, "radoy": _2, "xn--rady-ira": _2, "radøy": _2, "rakkestad": _2, "rana": _2, "ruovat": _2, "randaberg": _2, "rauma": _2, "rendalen": _2, "rennebu": _2, "rennesoy": _2, "xn--rennesy-v1a": _2, "rennesøy": _2, "rindal": _2, "ringebu": _2, "ringerike": _2, "ringsaker": _2, "rissa": _2, "risor": _2, "xn--risr-ira": _2, "risør": _2, "roan": _2, "rollag": _2, "rygge": _2, "ralingen": _2, "xn--rlingen-mxa": _2, "rælingen": _2, "rodoy": _2, "xn--rdy-0nab": _2, "rødøy": _2, "romskog": _2, "xn--rmskog-bya": _2, "rømskog": _2, "roros": _2, "xn--rros-gra": _2, "røros": _2, "rost": _2, "xn--rst-0na": _2, "røst": _2, "royken": _2, "xn--ryken-vua": _2, "røyken": _2, "royrvik": _2, "xn--ryrvik-bya": _2, "røyrvik": _2, "rade": _2, "xn--rde-ula": _2, "råde": _2, "salangen": _2, "siellak": _2, "saltdal": _2, "salat": _2, "xn--slt-elab": _2, "sálát": _2, "xn--slat-5na": _2, "sálat": _2, "samnanger": _2, "vestfold": { "$": 0, "succ": { "sande": _2 } }, "sandefjord": _2, "sandnes": _2, "sandoy": _2, "xn--sandy-yua": _2, "sandøy": _2, "sarpsborg": _2, "sauda": _2, "sauherad": _2, "sel": _2, "selbu": _2, "selje": _2, "seljord": _2, "sigdal": _2, "siljan": _2, "sirdal": _2, "skaun": _2, "skedsmo": _2, "ski": _2, "skien": _2, "skiptvet": _2, "skjervoy": _2, "xn--skjervy-v1a": _2, "skjervøy": _2, "skierva": _2, "xn--skierv-uta": _2, "skiervá": _2, "skjak": _2, "xn--skjk-soa": _2, "skjåk": _2, "skodje": _2, "skanland": _2, "xn--sknland-fxa": _2, "skånland": _2, "skanit": _2, "xn--sknit-yqa": _2, "skánit": _2, "smola": _2, "xn--smla-hra": _2, "smøla": _2, "snillfjord": _2, "snasa": _2, "xn--snsa-roa": _2, "snåsa": _2, "snoasa": _2, "snaase": _2, "xn--snase-nra": _2, "snåase": _2, "sogndal": _2, "sokndal": _2, "sola": _2, "solund": _2, "songdalen": _2, "sortland": _2, "spydeberg": _2, "stange": _2, "stavanger": _2, "steigen": _2, "steinkjer": _2, "stjordal": _2, "xn--stjrdal-s1a": _2, "stjørdal": _2, "stokke": _2, "stor-elvdal": _2, "stord": _2, "stordal": _2, "storfjord": _2, "omasvuotna": _2, "strand": _2, "stranda": _2, "stryn": _2, "sula": _2, "suldal": _2, "sund": _2, "sunndal": _2, "surnadal": _2, "sveio": _2, "svelvik": _2, "sykkylven": _2, "sogne": _2, "xn--sgne-gra": _2, "søgne": _2, "somna": _2, "xn--smna-gra": _2, "sømna": _2, "sondre-land": _2, "xn--sndre-land-0cb": _2, "søndre-land": _2, "sor-aurdal": _2, "xn--sr-aurdal-l8a": _2, "sør-aurdal": _2, "sor-fron": _2, "xn--sr-fron-q1a": _2, "sør-fron": _2, "sor-odal": _2, "xn--sr-odal-q1a": _2, "sør-odal": _2, "sor-varanger": _2, "xn--sr-varanger-ggb": _2, "sør-varanger": _2, "matta-varjjat": _2, "xn--mtta-vrjjat-k7af": _2, "mátta-várjjat": _2, "sorfold": _2, "xn--srfold-bya": _2, "sørfold": _2, "sorreisa": _2, "xn--srreisa-q1a": _2, "sørreisa": _2, "sorum": _2, "xn--srum-gra": _2, "sørum": _2, "tana": _2, "deatnu": _2, "time": _2, "tingvoll": _2, "tinn": _2, "tjeldsund": _2, "dielddanuorri": _2, "tjome": _2, "xn--tjme-hra": _2, "tjøme": _2, "tokke": _2, "tolga": _2, "torsken": _2, "tranoy": _2, "xn--trany-yua": _2, "tranøy": _2, "tromso": _2, "xn--troms-zua": _2, "tromsø": _2, "tromsa": _2, "romsa": _2, "trondheim": _2, "troandin": _2, "trysil": _2, "trana": _2, "xn--trna-woa": _2, "træna": _2, "trogstad": _2, "xn--trgstad-r1a": _2, "trøgstad": _2, "tvedestrand": _2, "tydal": _2, "tynset": _2, "tysfjord": _2, "divtasvuodna": _2, "divttasvuotna": _2, "tysnes": _2, "tysvar": _2, "xn--tysvr-vra": _2, "tysvær": _2, "tonsberg": _2, "xn--tnsberg-q1a": _2, "tønsberg": _2, "ullensaker": _2, "ullensvang": _2, "ulvik": _2, "utsira": _2, "vadso": _2, "xn--vads-jra": _2, "vadsø": _2, "cahcesuolo": _2, "xn--hcesuolo-7ya35b": _2, "čáhcesuolo": _2, "vaksdal": _2, "valle": _2, "vang": _2, "vanylven": _2, "vardo": _2, "xn--vard-jra": _2, "vardø": _2, "varggat": _2, "xn--vrggt-xqad": _2, "várggát": _2, "vefsn": _2, "vaapste": _2, "vega": _2, "vegarshei": _2, "xn--vegrshei-c0a": _2, "vegårshei": _2, "vennesla": _2, "verdal": _2, "verran": _2, "vestby": _2, "vestnes": _2, "vestre-slidre": _2, "vestre-toten": _2, "vestvagoy": _2, "xn--vestvgy-ixa6o": _2, "vestvågøy": _2, "vevelstad": _2, "vik": _2, "vikna": _2, "vindafjord": _2, "volda": _2, "voss": _2, "varoy": _2, "xn--vry-yla5g": _2, "værøy": _2, "vagan": _2, "xn--vgan-qoa": _2, "vågan": _2, "voagat": _2, "vagsoy": _2, "xn--vgsy-qoa0j": _2, "vågsøy": _2, "vaga": _2, "xn--vg-yiab": _2, "vågå": _2, "ostfold": { "$": 0, "succ": { "valer": _2 } }, "xn--stfold-9xa": { "$": 0, "succ": { "xn--vler-qoa": _2 } }, "østfold": { "$": 0, "succ": { "våler": _2 } }, "co": _4, "blogspot": _4 } }, "np": _8, "nr": _22, "nu": { "$": 1, "succ": { "merseine": _4, "mine": _4, "shacknet": _4, "nom": _4, "uwu": _4, "enterprisecloud": _4 } }, "nz": { "$": 1, "succ": { "ac": _2, "co": _5, "cri": _2, "geek": _2, "gen": _2, "govt": _2, "health": _2, "iwi": _2, "kiwi": _2, "maori": _2, "mil": _2, "xn--mori-qsa": _2, "māori": _2, "net": _2, "org": _2, "parliament": _2, "school": _2, "nym": _4 } }, "om": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "gov": _2, "med": _2, "museum": _2, "net": _2, "org": _2, "pro": _2 } }, "onion": _2, "org": { "$": 1, "succ": { "altervista": _4, "amune": { "$": 0, "succ": { "tele": _4 } }, "pimienta": _4, "poivron": _4, "potager": _4, "sweetpepper": _4, "ae": _4, "us": _4, "certmgr": _4, "cdn77": { "$": 0, "succ": { "c": _4, "rsc": _4 } }, "cdn77-secure": { "$": 0, "succ": { "origin": { "$": 0, "succ": { "ssl": _4 } } } }, "cloudns": _4, "duckdns": _4, "tunk": _4, "dyndns": { "$": 2, "succ": { "go": _4, "home": _4 } }, "blogdns": _4, "blogsite": _4, "boldlygoingnowhere": _4, "dnsalias": _4, "dnsdojo": _4, "doesntexist": _4, "dontexist": _4, "doomdns": _4, "dvrdns": _4, "dynalias": _4, "endofinternet": _4, "endoftheinternet": _4, "from-me": _4, "game-host": _4, "gotdns": _4, "hobby-site": _4, "homedns": _4, "homeftp": _4, "homelinux": _4, "homeunix": _4, "is-a-bruinsfan": _4, "is-a-candidate": _4, "is-a-celticsfan": _4, "is-a-chef": _4, "is-a-geek": _4, "is-a-knight": _4, "is-a-linux-user": _4, "is-a-patsfan": _4, "is-a-soxfan": _4, "is-found": _4, "is-lost": _4, "is-saved": _4, "is-very-bad": _4, "is-very-evil": _4, "is-very-good": _4, "is-very-nice": _4, "is-very-sweet": _4, "isa-geek": _4, "kicks-ass": _4, "misconfused": _4, "podzone": _4, "readmyblog": _4, "selfip": _4, "sellsyourhome": _4, "servebbs": _4, "serveftp": _4, "servegame": _4, "stuff-4-sale": _4, "webhop": _4, "ddnss": _4, "accesscam": _4, "camdvr": _4, "freeddns": _4, "mywire": _4, "webredirect": _4, "eu": { "$": 2, "succ": { "al": _4, "asso": _4, "at": _4, "au": _4, "be": _4, "bg": _4, "ca": _4, "cd": _4, "ch": _4, "cn": _4, "cy": _4, "cz": _4, "de": _4, "dk": _4, "edu": _4, "ee": _4, "es": _4, "fi": _4, "fr": _4, "gr": _4, "hr": _4, "hu": _4, "ie": _4, "il": _4, "in": _4, "int": _4, "is": _4, "it": _4, "jp": _4, "kr": _4, "lt": _4, "lu": _4, "lv": _4, "mc": _4, "me": _4, "mk": _4, "mt": _4, "my": _4, "net": _4, "ng": _4, "nl": _4, "no": _4, "nz": _4, "paris": _4, "pl": _4, "pt": _4, "q-a": _4, "ro": _4, "ru": _4, "se": _4, "si": _4, "sk": _4, "tr": _4, "uk": _4, "us": _4 } }, "twmail": _4, "fedorainfracloud": _4, "fedorapeople": _4, "fedoraproject": { "$": 0, "succ": { "cloud": _4, "os": _16, "stg": { "$": 0, "succ": { "os": _16 } } } }, "freedesktop": _4, "hepforge": _4, "in-dsl": _4, "in-vpn": _4, "js": _4, "uklugs": _4, "barsy": _4, "mayfirst": _4, "mozilla-iot": _4, "bmoattachments": _4, "dynserv": _4, "now-dns": _4, "cable-modem": _4, "collegefan": _4, "couchpotatofries": _4, "mlbfan": _4, "mysecuritycamera": _4, "nflfan": _4, "read-books": _4, "ufcfan": _4, "hopto": _4, "myftp": _4, "no-ip": _4, "zapto": _4, "pubtls": _4, "my-firewall": _4, "myfirewall": _4, "spdns": _4, "dsmynas": _4, "familyds": _4, "edugit": _4, "tuxfamily": _4, "diskstation": _4, "hk": _4, "wmflabs": _4, "toolforge": _4, "wmcloud": _4, "za": _4 } }, "pa": { "$": 1, "succ": { "ac": _2, "gob": _2, "com": _2, "org": _2, "sld": _2, "edu": _2, "net": _2, "ing": _2, "abo": _2, "med": _2, "nom": _2 } }, "pe": { "$": 1, "succ": { "edu": _2, "gob": _2, "nom": _2, "mil": _2, "org": _2, "com": _2, "net": _2, "blogspot": _4, "nym": _4 } }, "pf": { "$": 1, "succ": { "com": _2, "org": _2, "edu": _2 } }, "pg": _8, "ph": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "ngo": _2, "mil": _2, "i": _2 } }, "pk": { "$": 1, "succ": { "com": _2, "net": _2, "edu": _2, "org": _2, "fam": _2, "biz": _2, "web": _2, "gov": _2, "gob": _2, "gok": _2, "gon": _2, "gop": _2, "gos": _2, "info": _2 } }, "pl": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "aid": _2, "agro": _2, "atm": _2, "auto": _2, "biz": _2, "edu": _2, "gmina": _2, "gsm": _2, "info": _2, "mail": _2, "miasta": _2, "media": _2, "mil": _2, "nieruchomosci": _2, "nom": _2, "pc": _2, "powiat": _2, "priv": _2, "realestate": _2, "rel": _2, "sex": _2, "shop": _2, "sklep": _2, "sos": _2, "szkola": _2, "targi": _2, "tm": _2, "tourism": _2, "travel": _2, "turystyka": _2, "gov": { "$": 1, "succ": { "ap": _2, "ic": _2, "is": _2, "us": _2, "kmpsp": _2, "kppsp": _2, "kwpsp": _2, "psp": _2, "wskr": _2, "kwp": _2, "mw": _2, "ug": _2, "um": _2, "umig": _2, "ugim": _2, "upow": _2, "uw": _2, "starostwo": _2, "pa": _2, "po": _2, "psse": _2, "pup": _2, "rzgw": _2, "sa": _2, "so": _2, "sr": _2, "wsa": _2, "sko": _2, "uzs": _2, "wiih": _2, "winb": _2, "pinb": _2, "wios": _2, "witd": _2, "wzmiuw": _2, "piw": _2, "wiw": _2, "griw": _2, "wif": _2, "oum": _2, "sdn": _2, "zp": _2, "uppo": _2, "mup": _2, "wuoz": _2, "konsulat": _2, "oirm": _2 } }, "augustow": _2, "babia-gora": _2, "bedzin": _2, "beskidy": _2, "bialowieza": _2, "bialystok": _2, "bielawa": _2, "bieszczady": _2, "boleslawiec": _2, "bydgoszcz": _2, "bytom": _2, "cieszyn": _2, "czeladz": _2, "czest": _2, "dlugoleka": _2, "elblag": _2, "elk": _2, "glogow": _2, "gniezno": _2, "gorlice": _2, "grajewo": _2, "ilawa": _2, "jaworzno": _2, "jelenia-gora": _2, "jgora": _2, "kalisz": _2, "kazimierz-dolny": _2, "karpacz": _2, "kartuzy": _2, "kaszuby": _2, "katowice": _2, "kepno": _2, "ketrzyn": _2, "klodzko": _2, "kobierzyce": _2, "kolobrzeg": _2, "konin": _2, "konskowola": _2, "kutno": _2, "lapy": _2, "lebork": _2, "legnica": _2, "lezajsk": _2, "limanowa": _2, "lomza": _2, "lowicz": _2, "lubin": _2, "lukow": _2, "malbork": _2, "malopolska": _2, "mazowsze": _2, "mazury": _2, "mielec": _2, "mielno": _2, "mragowo": _2, "naklo": _2, "nowaruda": _2, "nysa": _2, "olawa": _2, "olecko": _2, "olkusz": _2, "olsztyn": _2, "opoczno": _2, "opole": _2, "ostroda": _2, "ostroleka": _2, "ostrowiec": _2, "ostrowwlkp": _2, "pila": _2, "pisz": _2, "podhale": _2, "podlasie": _2, "polkowice": _2, "pomorze": _2, "pomorskie": _2, "prochowice": _2, "pruszkow": _2, "przeworsk": _2, "pulawy": _2, "radom": _2, "rawa-maz": _2, "rybnik": _2, "rzeszow": _2, "sanok": _2, "sejny": _2, "slask": _2, "slupsk": _2, "sosnowiec": _2, "stalowa-wola": _2, "skoczow": _2, "starachowice": _2, "stargard": _2, "suwalki": _2, "swidnica": _2, "swiebodzin": _2, "swinoujscie": _2, "szczecin": _2, "szczytno": _2, "tarnobrzeg": _2, "tgory": _2, "turek": _2, "tychy": _2, "ustka": _2, "walbrzych": _2, "warmia": _2, "warszawa": _2, "waw": _2, "wegrow": _2, "wielun": _2, "wlocl": _2, "wloclawek": _2, "wodzislaw": _2, "wolomin": _2, "wroclaw": _2, "zachpomor": _2, "zagan": _2, "zarow": _2, "zgora": _2, "zgorzelec": _2, "beep": _4, "krasnik": _4, "leczna": _4, "lubartow": _4, "lublin": _4, "poniatowa": _4, "swidnik": _4, "co": _4, "art": _4, "gliwice": _4, "krakow": _4, "poznan": _4, "wroc": _4, "zakopane": _4, "gda": _4, "gdansk": _4, "gdynia": _4, "med": _4, "sopot": _4 } }, "pm": { "$": 1, "succ": { "own": _4 } }, "pn": { "$": 1, "succ": { "gov": _2, "co": _2, "org": _2, "edu": _2, "net": _2 } }, "post": _2, "pr": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "isla": _2, "pro": _2, "biz": _2, "info": _2, "name": _2, "est": _2, "prof": _2, "ac": _2 } }, "pro": { "$": 1, "succ": { "aaa": _2, "aca": _2, "acct": _2, "avocat": _2, "bar": _2, "cpa": _2, "eng": _2, "jur": _2, "law": _2, "med": _2, "recht": _2, "cloudns": _4, "dnstrace": { "$": 0, "succ": { "bci": _4 } }, "barsy": _4 } }, "ps": { "$": 1, "succ": { "edu": _2, "gov": _2, "sec": _2, "plo": _2, "com": _2, "org": _2, "net": _2 } }, "pt": { "$": 1, "succ": { "net": _2, "gov": _2, "org": _2, "edu": _2, "int": _2, "publ": _2, "com": _2, "nome": _2, "blogspot": _4, "nym": _4 } }, "pw": { "$": 1, "succ": { "co": _2, "ne": _2, "or": _2, "ed": _2, "go": _2, "belau": _2, "cloudns": _4, "x443": _4, "nom": _4 } }, "py": { "$": 1, "succ": { "com": _2, "coop": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "qa": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "blogspot": _4, "nom": _4 } }, "re": { "$": 1, "succ": { "asso": _2, "com": _2, "nom": _2, "blogspot": _4 } }, "ro": { "$": 1, "succ": { "arts": _2, "com": _2, "firm": _2, "info": _2, "nom": _2, "nt": _2, "org": _2, "rec": _2, "store": _2, "tm": _2, "www": _2, "shop": _4, "blogspot": _4, "nym": _4 } }, "rs": { "$": 1, "succ": { "ac": _2, "co": _2, "edu": _2, "gov": _2, "in": _2, "org": _2, "blogspot": _4, "ua": _4, "nom": _4, "ox": _4 } }, "ru": { "$": 1, "succ": { "ac": _4, "edu": _4, "gov": _4, "int": _4, "mil": _4, "test": _4, "adygeya": _4, "bashkiria": _4, "bir": _4, "cbg": _4, "com": _4, "dagestan": _4, "grozny": _4, "kalmykia": _4, "kustanai": _4, "marine": _4, "mordovia": _4, "msk": _4, "mytis": _4, "nalchik": _4, "nov": _4, "pyatigorsk": _4, "spb": _4, "vladikavkaz": _4, "vladimir": _4, "blogspot": _4, "regruhosting": _27, "myjino": { "$": 2, "succ": { "hosting": _7, "landing": _7, "spectrum": _7, "vps": _7 } }, "cldmail": { "$": 0, "succ": { "hb": _4 } }, "net": _4, "org": _4, "pp": _4, "ras": _4 } }, "rw": { "$": 1, "succ": { "ac": _2, "co": _2, "coop": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "sa": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "med": _2, "pub": _2, "edu": _2, "sch": _2 } }, "sb": _9, "sc": _9, "sd": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "med": _2, "tv": _2, "gov": _2, "info": _2 } }, "se": { "$": 1, "succ": { "a": _2, "ac": _2, "b": _2, "bd": _2, "brand": _2, "c": _2, "d": _2, "e": _2, "f": _2, "fh": _2, "fhsk": _2, "fhv": _2, "g": _2, "h": _2, "i": _2, "k": _2, "komforb": _2, "kommunalforbund": _2, "komvux": _2, "l": _2, "lanbib": _2, "m": _2, "n": _2, "naturbruksgymn": _2, "o": _2, "org": _2, "p": _2, "parti": _2, "pp": _2, "press": _2, "r": _2, "s": _2, "t": _2, "tm": _2, "u": _2, "w": _2, "x": _2, "y": _2, "z": _2, "com": _4, "blogspot": _4, "conf": _4 } }, "sg": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "per": _2, "blogspot": _4 } }, "sh": { "$": 1, "succ": { "com": _2, "net": _2, "gov": _2, "org": _2, "mil": _2, "hashbang": _4, "platform": { "$": 0, "succ": { "bc": _4, "ent": _4, "eu": _4, "us": _4 } }, "now": _4, "vxl": _4, "wedeploy": _4 } }, "si": { "$": 1, "succ": { "gitpage": _4, "blogspot": _4, "nom": _4 } }, "sj": _2, "sk": _23, "sl": _9, "sm": _2, "sn": { "$": 1, "succ": { "art": _2, "com": _2, "edu": _2, "gouv": _2, "org": _2, "perso": _2, "univ": _2, "blogspot": _4 } }, "so": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "sch": _4 } }, "sr": _2, "ss": { "$": 1, "succ": { "biz": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2 } }, "st": { "$": 1, "succ": { "co": _2, "com": _2, "consulado": _2, "edu": _2, "embaixada": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "principe": _2, "saotome": _2, "store": _2, "nom": _4, "noho": _4 } }, "su": { "$": 1, "succ": { "abkhazia": _4, "adygeya": _4, "aktyubinsk": _4, "arkhangelsk": _4, "armenia": _4, "ashgabad": _4, "azerbaijan": _4, "balashov": _4, "bashkiria": _4, "bryansk": _4, "bukhara": _4, "chimkent": _4, "dagestan": _4, "east-kazakhstan": _4, "exnet": _4, "georgia": _4, "grozny": _4, "ivanovo": _4, "jambyl": _4, "kalmykia": _4, "kaluga": _4, "karacol": _4, "karaganda": _4, "karelia": _4, "khakassia": _4, "krasnodar": _4, "kurgan": _4, "kustanai": _4, "lenug": _4, "mangyshlak": _4, "mordovia": _4, "msk": _4, "murmansk": _4, "nalchik": _4, "navoi": _4, "north-kazakhstan": _4, "nov": _4, "obninsk": _4, "penza": _4, "pokrovsk": _4, "sochi": _4, "spb": _4, "tashkent": _4, "termez": _4, "togliatti": _4, "troitsk": _4, "tselinograd": _4, "tula": _4, "tuva": _4, "vladikavkaz": _4, "vladimir": _4, "vologda": _4, "nym": _4 } }, "sv": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "org": _2, "red": _2 } }, "sx": { "$": 1, "succ": { "gov": _2, "nym": _4 } }, "sy": _3, "sz": { "$": 1, "succ": { "co": _2, "ac": _2, "org": _2 } }, "tc": { "$": 1, "succ": { "ch": _4, "me": _4, "we": _4 } }, "td": _5, "tel": _2, "tf": _2, "tg": _2, "th": { "$": 1, "succ": { "ac": _2, "co": _2, "go": _2, "in": _2, "mi": _2, "net": _2, "or": _2, "online": _4, "shop": _4 } }, "tj": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "go": _2, "gov": _2, "int": _2, "mil": _2, "name": _2, "net": _2, "nic": _2, "org": _2, "test": _2, "web": _2, "nom": _4 } }, "tk": _2, "tl": _6, "tm": { "$": 1, "succ": { "com": _2, "co": _2, "org": _2, "net": _2, "nom": _2, "gov": _2, "mil": _2, "edu": _2 } }, "tn": { "$": 1, "succ": { "com": _2, "ens": _2, "fin": _2, "gov": _2, "ind": _2, "intl": _2, "nat": _2, "net": _2, "org": _2, "info": _2, "perso": _2, "tourism": _2, "edunet": _2, "rnrt": _2, "rns": _2, "rnu": _2, "mincom": _2, "agrinet": _2, "defense": _2, "turen": _2 } }, "to": { "$": 1, "succ": { "611": _4, "com": _2, "gov": _2, "net": _2, "org": _2, "edu": _2, "mil": _2, "oya": _4, "vpnplus": _4, "quickconnect": { "$": 0, "succ": { "direct": _4 } }, "nyan": _4 } }, "tr": { "$": 1, "succ": { "av": _2, "bbs": _2, "bel": _2, "biz": _2, "com": _5, "dr": _2, "edu": _2, "gen": _2, "gov": _2, "info": _2, "mil": _2, "k12": _2, "kep": _2, "name": _2, "net": _2, "org": _2, "pol": _2, "tel": _2, "tsk": _2, "tv": _2, "web": _2, "nc": _6 } }, "tt": { "$": 1, "succ": { "co": _2, "com": _2, "org": _2, "net": _2, "biz": _2, "info": _2, "pro": _2, "int": _2, "coop": _2, "jobs": _2, "mobi": _2, "travel": _2, "museum": _2, "aero": _2, "name": _2, "gov": _2, "edu": _2 } }, "tv": { "$": 1, "succ": { "dyndns": _4, "better-than": _4, "on-the-web": _4, "worse-than": _4 } }, "tw": { "$": 1, "succ": { "edu": _2, "gov": _2, "mil": _2, "com": { "$": 1, "succ": { "mymailer": _4 } }, "net": _2, "org": _2, "idv": _2, "game": _2, "ebiz": _2, "club": _2, "xn--zf0ao64a": _2, "網路": _2, "xn--uc0atv": _2, "組織": _2, "xn--czrw28b": _2, "商業": _2, "url": _4, "blogspot": _4, "nym": _4 } }, "tz": { "$": 1, "succ": { "ac": _2, "co": _2, "go": _2, "hotel": _2, "info": _2, "me": _2, "mil": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2, "tv": _2 } }, "ua": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "in": _2, "net": _2, "org": _2, "cherkassy": _2, "cherkasy": _2, "chernigov": _2, "chernihiv": _2, "chernivtsi": _2, "chernovtsy": _2, "ck": _2, "cn": _2, "cr": _2, "crimea": _2, "cv": _2, "dn": _2, "dnepropetrovsk": _2, "dnipropetrovsk": _2, "donetsk": _2, "dp": _2, "if": _2, "ivano-frankivsk": _2, "kh": _2, "kharkiv": _2, "kharkov": _2, "kherson": _2, "khmelnitskiy": _2, "khmelnytskyi": _2, "kiev": _2, "kirovograd": _2, "km": _2, "kr": _2, "krym": _2, "ks": _2, "kv": _2, "kyiv": _2, "lg": _2, "lt": _2, "lugansk": _2, "lutsk": _2, "lv": _2, "lviv": _2, "mk": _2, "mykolaiv": _2, "nikolaev": _2, "od": _2, "odesa": _2, "odessa": _2, "pl": _2, "poltava": _2, "rivne": _2, "rovno": _2, "rv": _2, "sb": _2, "sebastopol": _2, "sevastopol": _2, "sm": _2, "sumy": _2, "te": _2, "ternopil": _2, "uz": _2, "uzhgorod": _2, "vinnica": _2, "vinnytsia": _2, "vn": _2, "volyn": _2, "yalta": _2, "zaporizhzhe": _2, "zaporizhzhia": _2, "zhitomir": _2, "zhytomyr": _2, "zp": _2, "zt": _2, "cc": _4, "inf": _4, "ltd": _4, "biz": _4, "co": _4, "pp": _4, "v": _4 } }, "ug": { "$": 1, "succ": { "co": _2, "or": _2, "ac": _2, "sc": _2, "go": _2, "ne": _2, "com": _2, "org": _2, "blogspot": _4, "nom": _4 } }, "uk": { "$": 1, "succ": { "ac": _2, "co": { "$": 1, "succ": { "bytemark": { "$": 0, "succ": { "dh": _4, "vm": _4 } }, "blogspot": _4, "layershift": _17, "barsy": _4, "barsyonline": _4, "nh-serv": _4, "no-ip": _4, "wellbeingzone": _4, "gwiddle": _4 } }, "gov": { "$": 1, "succ": { "service": _4, "homeoffice": _4 } }, "ltd": _2, "me": _2, "net": _2, "nhs": _2, "org": { "$": 1, "succ": { "glug": _4, "lug": _4, "lugs": _4 } }, "plc": _2, "police": _2, "sch": _8, "conn": _4, "copro": _4, "barsy": _4 } }, "us": { "$": 1, "succ": { "dni": _2, "fed": _2, "isa": _2, "kids": _2, "nsn": _2, "ak": _30, "al": _30, "ar": _30, "as": _30, "az": _30, "ca": _30, "co": _30, "ct": _30, "dc": _30, "de": { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _4 } }, "fl": _30, "ga": _30, "gu": _30, "hi": _31, "ia": _30, "id": _30, "il": _30, "in": _30, "ks": _30, "ky": _30, "la": _30, "ma": { "$": 1, "succ": { "k12": { "$": 1, "succ": { "pvt": _2, "chtr": _2, "paroch": _2 } }, "cc": _2, "lib": _2 } }, "md": _30, "me": _30, "mi": { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _2, "ann-arbor": _2, "cog": _2, "dst": _2, "eaton": _2, "gen": _2, "mus": _2, "tec": _2, "washtenaw": _2 } }, "mn": _30, "mo": _30, "ms": _30, "mt": _30, "nc": _30, "nd": _31, "ne": _30, "nh": _30, "nj": _30, "nm": _30, "nv": _30, "ny": _30, "oh": _30, "ok": _30, "or": _30, "pa": _30, "pr": _30, "ri": _31, "sc": _30, "sd": _31, "tn": _30, "tx": _30, "ut": _30, "vi": _30, "vt": _30, "va": _30, "wa": _30, "wi": _30, "wv": { "$": 1, "succ": { "cc": _2 } }, "wy": _30, "cloudns": _4, "drud": _4, "is-by": _4, "land-4-sale": _4, "stuff-4-sale": _4, "graphox": _4, "freeddns": _4, "golffan": _4, "noip": _4, "pointto": _4, "platterp": _4 } }, "uy": { "$": 1, "succ": { "com": _5, "edu": _2, "gub": _2, "mil": _2, "net": _2, "org": _2, "nom": _4 } }, "uz": { "$": 1, "succ": { "co": _2, "com": _2, "net": _2, "org": _2 } }, "va": _2, "vc": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "mil": _2, "edu": _2, "gv": { "$": 2, "succ": { "d": _4 } }, "0e": _4, "nom": _4 } }, "ve": { "$": 1, "succ": { "arts": _2, "co": _2, "com": _2, "e12": _2, "edu": _2, "firm": _2, "gob": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "org": _2, "rec": _2, "store": _2, "tec": _2, "web": _2 } }, "vg": { "$": 1, "succ": { "nom": _4, "at": _4 } }, "vi": { "$": 1, "succ": { "co": _2, "com": _2, "k12": _2, "net": _2, "org": _2 } }, "vn": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "int": _2, "ac": _2, "biz": _2, "info": _2, "name": _2, "pro": _2, "health": _2, "blogspot": _4 } }, "vu": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "blog": _4, "dev": _4, "me": _4, "cn": _4 } }, "wf": _2, "ws": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "advisor": _7, "cloud66": _4, "dyndns": _4, "mypets": _4 } }, "yt": _2, "xn--mgbaam7a8h": _2, "امارات": _2, "xn--y9a3aq": _2, "հայ": _2, "xn--54b7fta0cc": _2, "বাংলা": _2, "xn--90ae": _2, "бг": _2, "xn--90ais": _2, "бел": _2, "xn--fiqs8s": _2, "中国": _2, "xn--fiqz9s": _2, "中國": _2, "xn--lgbbat1ad8j": _2, "الجزائر": _2, "xn--wgbh1c": _2, "مصر": _2, "xn--e1a4c": _2, "ею": _2, "xn--qxa6a": _2, "ευ": _2, "xn--mgbah1a3hjkrd": _2, "موريتانيا": _2, "xn--node": _2, "გე": _2, "xn--qxam": _2, "ελ": _2, "xn--j6w193g": { "$": 1, "succ": { "xn--55qx5d": _2, "xn--wcvs22d": _2, "xn--mxtq1m": _2, "xn--gmqw5a": _2, "xn--od0alg": _2, "xn--uc0atv": _2 } }, "香港": { "$": 1, "succ": { "公司": _2, "教育": _2, "政府": _2, "個人": _2, "網絡": _2, "組織": _2 } }, "xn--2scrj9c": _2, "ಭಾರತ": _2, "xn--3hcrj9c": _2, "ଭାରତ": _2, "xn--45br5cyl": _2, "ভাৰত": _2, "xn--h2breg3eve": _2, "भारतम्": _2, "xn--h2brj9c8c": _2, "भारोत": _2, "xn--mgbgu82a": _2, "ڀارت": _2, "xn--rvc1e0am3e": _2, "ഭാരതം": _2, "xn--h2brj9c": _2, "भारत": _2, "xn--mgbbh1a": _2, "بارت": _2, "xn--mgbbh1a71e": _2, "بھارت": _2, "xn--fpcrj9c3d": _2, "భారత్": _2, "xn--gecrj9c": _2, "ભારત": _2, "xn--s9brj9c": _2, "ਭਾਰਤ": _2, "xn--45brj9c": _2, "ভারত": _2, "xn--xkc2dl3a5ee0h": _2, "இந்தியா": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2, "xn--mgbtx2b": _2, "عراق": _2, "xn--mgbayh7gpa": _2, "الاردن": _2, "xn--3e0b707e": _2, "한국": _2, "xn--80ao21a": _2, "қаз": _2, "xn--fzc2c9e2c": _2, "ලංකා": _2, "xn--xkc2al3hye2a": _2, "இலங்கை": _2, "xn--mgbc0a9azcg": _2, "المغرب": _2, "xn--d1alf": _2, "мкд": _2, "xn--l1acc": _2, "мон": _2, "xn--mix891f": _2, "澳門": _2, "xn--mix082f": _2, "澳门": _2, "xn--mgbx4cd0ab": _2, "مليسيا": _2, "xn--mgb9awbf": _2, "عمان": _2, "xn--mgbai9azgqp6j": _2, "پاکستان": _2, "xn--mgbai9a5eva00b": _2, "پاكستان": _2, "xn--ygbi2ammx": _2, "فلسطين": _2, "xn--90a3ac": { "$": 1, "succ": { "xn--o1ac": _2, "xn--c1avg": _2, "xn--90azh": _2, "xn--d1at": _2, "xn--o1ach": _2, "xn--80au": _2 } }, "срб": { "$": 1, "succ": { "пр": _2, "орг": _2, "обр": _2, "од": _2, "упр": _2, "ак": _2 } }, "xn--p1ai": _2, "рф": _2, "xn--wgbl6a": _2, "قطر": _2, "xn--mgberp4a5d4ar": _2, "السعودية": _2, "xn--mgberp4a5d4a87g": _2, "السعودیة": _2, "xn--mgbqly7c0a67fbc": _2, "السعودیۃ": _2, "xn--mgbqly7cvafr": _2, "السعوديه": _2, "xn--mgbpl2fh": _2, "سودان": _2, "xn--yfro4i67o": _2, "新加坡": _2, "xn--clchc0ea0b2g2a9gcd": _2, "சிங்கப்பூர்": _2, "xn--ogbpf8fl": _2, "سورية": _2, "xn--mgbtf8fl": _2, "سوريا": _2, "xn--o3cw4h": { "$": 1, "succ": { "xn--12c1fe0br": _2, "xn--12co0c3b4eva": _2, "xn--h3cuzk1di": _2, "xn--o3cyx2a": _2, "xn--m3ch0j3a": _2, "xn--12cfi8ixb8l": _2 } }, "ไทย": { "$": 1, "succ": { "ศึกษา": _2, "ธุรกิจ": _2, "รัฐบาล": _2, "ทหาร": _2, "เน็ต": _2, "องค์กร": _2 } }, "xn--pgbs0dh": _2, "تونس": _2, "xn--kpry57d": _2, "台灣": _2, "xn--kprw13d": _2, "台湾": _2, "xn--nnx388a": _2, "臺灣": _2, "xn--j1amh": _2, "укр": _2, "xn--mgb2ddes": _2, "اليمن": _2, "xxx": _2, "ye": _8, "za": { "$": 0, "succ": { "ac": _2, "agric": _2, "alt": _2, "co": _5, "edu": _2, "gov": _2, "grondar": _2, "law": _2, "mil": _2, "net": _2, "ngo": _2, "nic": _2, "nis": _2, "nom": _2, "org": _2, "school": _2, "tm": _2, "web": _2 } }, "zm": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "mil": _2, "net": _2, "org": _2, "sch": _2 } }, "zw": { "$": 1, "succ": { "ac": _2, "co": _2, "gov": _2, "mil": _2, "org": _2 } }, "aaa": _2, "aarp": _2, "abarth": _2, "abb": _2, "abbott": _2, "abbvie": _2, "abc": _2, "able": _2, "abogado": _2, "abudhabi": _2, "academy": { "$": 1, "succ": { "official": _4 } }, "accenture": _2, "accountant": _2, "accountants": _2, "aco": _2, "actor": _2, "adac": _2, "ads": _2, "adult": _2, "aeg": _2, "aetna": _2, "afamilycompany": _2, "afl": _2, "africa": _2, "agakhan": _2, "agency": _2, "aig": _2, "airbus": _2, "airforce": _2, "airtel": _2, "akdn": _2, "alfaromeo": _2, "alibaba": _2, "alipay": _2, "allfinanz": _2, "allstate": _2, "ally": _2, "alsace": _2, "alstom": _2, "amazon": _2, "americanexpress": _2, "americanfamily": _2, "amex": _2, "amfam": _2, "amica": _2, "amsterdam": _2, "analytics": _2, "android": _2, "anquan": _2, "anz": _2, "aol": _2, "apartments": _2, "app": { "$": 1, "succ": { "wnext": _4, "run": { "$": 2, "succ": { "a": _4 } }, "web": _4, "hasura": _4, "loginline": _4, "netlify": _4, "telebit": _4, "vercel": _4 } }, "apple": _2, "aquarelle": _2, "arab": _2, "aramco": _2, "archi": _2, "army": _2, "art": _2, "arte": _2, "asda": _2, "associates": _2, "athleta": _2, "attorney": _2, "auction": _2, "audi": _2, "audible": _2, "audio": _2, "auspost": _2, "author": _2, "auto": _2, "autos": _2, "avianca": _2, "aws": _2, "axa": _2, "azure": _2, "baby": _2, "baidu": _2, "banamex": _2, "bananarepublic": _2, "band": _2, "bank": _2, "bar": _2, "barcelona": _2, "barclaycard": _2, "barclays": _2, "barefoot": _2, "bargains": _2, "baseball": _2, "basketball": _2, "bauhaus": _2, "bayern": _2, "bbc": _2, "bbt": _2, "bbva": _2, "bcg": _2, "bcn": _2, "beats": _2, "beauty": _2, "beer": _2, "bentley": _2, "berlin": _2, "best": _2, "bestbuy": _2, "bet": _2, "bharti": _2, "bible": _2, "bid": _2, "bike": _2, "bing": _2, "bingo": _2, "bio": _2, "black": _2, "blackfriday": _2, "blockbuster": _2, "blog": _2, "bloomberg": _2, "blue": _2, "bms": _2, "bmw": _2, "bnpparibas": _2, "boats": _2, "boehringer": _2, "bofa": _2, "bom": _2, "bond": _2, "boo": _2, "book": _2, "booking": _2, "bosch": _2, "bostik": _2, "boston": _2, "bot": _2, "boutique": _2, "box": _2, "bradesco": _2, "bridgestone": _2, "broadway": _2, "broker": _2, "brother": _2, "brussels": _2, "budapest": _2, "bugatti": _2, "build": _2, "builders": _2, "business": _10, "buy": _2, "buzz": _2, "bzh": _2, "cab": _2, "cafe": _2, "cal": _2, "call": _2, "calvinklein": _2, "cam": _2, "camera": _2, "camp": _2, "cancerresearch": _2, "canon": _2, "capetown": _2, "capital": _2, "capitalone": _2, "car": _2, "caravan": _2, "cards": _2, "care": _2, "career": _2, "careers": _2, "cars": _2, "casa": { "$": 1, "succ": { "nabu": { "$": 0, "succ": { "ui": _4 } } } }, "case": _2, "caseih": _2, "cash": _2, "casino": _2, "catering": _2, "catholic": _2, "cba": _2, "cbn": _2, "cbre": _2, "cbs": _2, "ceb": _2, "center": _2, "ceo": _2, "cern": _2, "cfa": _2, "cfd": _2, "chanel": _2, "channel": _2, "charity": _2, "chase": _2, "chat": _2, "cheap": _2, "chintai": _2, "christmas": _2, "chrome": _2, "church": _2, "cipriani": _2, "circle": _2, "cisco": _2, "citadel": _2, "citi": _2, "citic": _2, "city": _11, "cityeats": _2, "claims": _2, "cleaning": _2, "click": _2, "clinic": _2, "clinique": _2, "clothing": _2, "cloud": { "$": 1, "succ": { "banzai": _7, "statics": _7, "jele": _4, "linkyard": _4, "magentosite": _7, "perspecta": _4, "vapor": _4, "on-rancher": _7, "sensiosite": _7, "trafficplex": _4, "urown": _4, "voorloper": _4 } }, "club": { "$": 1, "succ": { "cloudns": _4, "jele": _4, "barsy": _4, "pony": _4 } }, "clubmed": _2, "coach": _2, "codes": { "$": 1, "succ": { "owo": _7 } }, "coffee": _2, "college": _2, "cologne": _2, "comcast": _2, "commbank": _2, "community": { "$": 1, "succ": { "ravendb": _4, "myforum": _4 } }, "company": _2, "compare": _2, "computer": _2, "comsec": _2, "condos": _2, "construction": _2, "consulting": _2, "contact": _2, "contractors": _2, "cooking": _2, "cookingchannel": _2, "cool": { "$": 1, "succ": { "de": _4 } }, "corsica": _2, "country": _2, "coupon": _2, "coupons": _2, "courses": _2, "cpa": _2, "credit": _2, "creditcard": _2, "creditunion": _2, "cricket": _2, "crown": _2, "crs": _2, "cruise": _2, "cruises": _2, "csc": _2, "cuisinella": _2, "cymru": _2, "cyou": _2, "dabur": _2, "dad": _2, "dance": _2, "data": _2, "date": _2, "dating": _2, "datsun": _2, "day": _2, "dclk": _2, "dds": _2, "deal": _2, "dealer": _2, "deals": _2, "degree": _2, "delivery": _2, "dell": _2, "deloitte": _2, "delta": _2, "democrat": _2, "dental": _2, "dentist": _2, "desi": _2, "design": { "$": 1, "succ": { "bss": _4 } }, "dev": { "$": 1, "succ": { "lcl": _7, "stg": _7, "workers": _4, "curv": _4, "fly": _4, "iserv": _4, "loginline": _4, "platter-app": _4, "vercel": _4, "webhare": _7 } }, "dhl": _2, "diamonds": _2, "diet": _2, "digital": { "$": 1, "succ": { "cloudapps": { "$": 2, "succ": { "london": _4 } } } }, "direct": _2, "directory": _2, "discount": _2, "discover": _2, "dish": _2, "diy": _2, "dnp": _2, "docs": _2, "doctor": _2, "dog": _2, "domains": _2, "dot": _2, "download": _2, "drive": _2, "dtv": _2, "dubai": _2, "duck": _2, "dunlop": _2, "dupont": _2, "durban": _2, "dvag": _2, "dvr": _2, "earth": { "$": 1, "succ": { "dapps": { "$": 0, "succ": { "*": _4, "bzz": _7 } } } }, "eat": _2, "eco": _2, "edeka": _2, "education": _10, "email": _2, "emerck": _2, "energy": _2, "engineer": _2, "engineering": _2, "enterprises": _2, "epson": _2, "equipment": _2, "ericsson": _2, "erni": _2, "esq": _2, "estate": { "$": 1, "succ": { "compute": _7 } }, "etisalat": _2, "eurovision": _2, "eus": { "$": 1, "succ": { "party": _18 } }, "events": _10, "exchange": _2, "expert": _2, "exposed": _2, "express": _2, "extraspace": _2, "fage": _2, "fail": _2, "fairwinds": _2, "faith": _19, "family": _2, "fan": _2, "fans": _2, "farm": { "$": 1, "succ": { "storj": _4 } }, "farmers": _2, "fashion": { "$": 1, "succ": { "of": _4, "on": _4 } }, "fast": _2, "fedex": _2, "feedback": _2, "ferrari": _2, "ferrero": _2, "fiat": _2, "fidelity": _2, "fido": _2, "film": _2, "final": _2, "finance": _2, "financial": _10, "fire": _2, "firestone": _2, "firmdale": _2, "fish": _2, "fishing": _2, "fit": { "$": 1, "succ": { "ptplus": _4 } }, "fitness": _2, "flickr": _2, "flights": _2, "flir": _2, "florist": _2, "flowers": _2, "fly": _2, "foo": _2, "food": _2, "foodnetwork": _2, "football": { "$": 1, "succ": { "of": _4 } }, "ford": _2, "forex": _2, "forsale": _2, "forum": _2, "foundation": _2, "fox": _2, "free": _2, "fresenius": _2, "frl": _2, "frogans": _2, "frontdoor": _2, "frontier": _2, "ftr": _2, "fujitsu": _2, "fujixerox": _2, "fun": _2, "fund": _2, "furniture": _2, "futbol": _2, "fyi": _2, "gal": _2, "gallery": _2, "gallo": _2, "gallup": _2, "game": _2, "games": _2, "gap": _2, "garden": _2, "gay": _2, "gbiz": _2, "gdn": { "$": 1, "succ": { "cnpy": _4 } }, "gea": _2, "gent": _2, "genting": _2, "george": _2, "ggee": _2, "gift": _2, "gifts": _2, "gives": _2, "giving": _2, "glade": _2, "glass": _2, "gle": _2, "global": _2, "globo": _2, "gmail": _2, "gmbh": _2, "gmo": _2, "gmx": _2, "godaddy": _2, "gold": _2, "goldpoint": _2, "golf": _2, "goo": _2, "goodyear": _2, "goog": { "$": 1, "succ": { "cloud": _4 } }, "google": _2, "gop": _2, "got": _2, "grainger": _2, "graphics": _2, "gratis": _2, "green": _2, "gripe": _2, "grocery": _2, "group": { "$": 1, "succ": { "discourse": _4 } }, "guardian": _2, "gucci": _2, "guge": _2, "guide": _2, "guitars": _2, "guru": _2, "hair": _2, "hamburg": _2, "hangout": _2, "haus": _2, "hbo": _2, "hdfc": _2, "hdfcbank": _2, "health": _2, "healthcare": _2, "help": _2, "helsinki": _2, "here": _2, "hermes": _2, "hgtv": _2, "hiphop": _2, "hisamitsu": _2, "hitachi": _2, "hiv": _2, "hkt": _2, "hockey": _2, "holdings": _2, "holiday": _2, "homedepot": _2, "homegoods": _2, "homes": _2, "homesense": _2, "honda": _2, "horse": _2, "hospital": _2, "host": { "$": 1, "succ": { "cloudaccess": _4, "freesite": _4, "fastvps": _4, "myfast": _4, "jele": _4, "mircloud": _4, "pcloud": _4, "half": _4 } }, "hosting": { "$": 1, "succ": { "opencraft": _4 } }, "hot": _2, "hoteles": _2, "hotels": _2, "hotmail": _2, "house": _2, "how": _2, "hsbc": _2, "hughes": _2, "hyatt": _2, "hyundai": _2, "ibm": _2, "icbc": _2, "ice": _2, "icu": _2, "ieee": _2, "ifm": _2, "ikano": _2, "imamat": _2, "imdb": _2, "immo": _2, "immobilien": _2, "inc": _2, "industries": _2, "infiniti": _2, "ing": _2, "ink": _11, "institute": _2, "insurance": _2, "insure": _2, "intel": _2, "international": _2, "intuit": _2, "investments": _2, "ipiranga": _2, "irish": _2, "ismaili": _2, "ist": _2, "istanbul": _2, "itau": _2, "itv": _2, "iveco": _2, "jaguar": _2, "java": _2, "jcb": _2, "jcp": _2, "jeep": _2, "jetzt": _2, "jewelry": _2, "jio": _2, "jll": _2, "jmp": _2, "jnj": _2, "joburg": _2, "jot": _2, "joy": _2, "jpmorgan": _2, "jprs": _2, "juegos": _2, "juniper": _2, "kaufen": _2, "kddi": _2, "kerryhotels": _2, "kerrylogistics": _2, "kerryproperties": _2, "kfh": _2, "kia": _2, "kim": _2, "kinder": _2, "kindle": _2, "kitchen": _2, "kiwi": _2, "koeln": _2, "komatsu": _2, "kosher": _2, "kpmg": _2, "kpn": _2, "krd": { "$": 1, "succ": { "co": _4, "edu": _4 } }, "kred": _2, "kuokgroup": _2, "kyoto": _2, "lacaixa": _2, "lamborghini": _2, "lamer": _2, "lancaster": _2, "lancia": _2, "land": { "$": 1, "succ": { "static": { "$": 2, "succ": { "dev": _4, "sites": _4 } } } }, "landrover": _2, "lanxess": _2, "lasalle": _2, "lat": _2, "latino": _2, "latrobe": _2, "law": _2, "lawyer": _2, "lds": _2, "lease": _2, "leclerc": _2, "lefrak": _2, "legal": _2, "lego": _2, "lexus": _2, "lgbt": _2, "lidl": _2, "life": _2, "lifeinsurance": _2, "lifestyle": _2, "lighting": _2, "like": _2, "lilly": _2, "limited": _2, "limo": _2, "lincoln": _2, "linde": _2, "link": { "$": 1, "succ": { "cyon": _4, "mypep": _4, "dweb": _7 } }, "lipsy": _2, "live": _2, "living": _2, "lixil": _2, "llc": _2, "llp": _2, "loan": _2, "loans": _2, "locker": _2, "locus": _2, "loft": _2, "lol": _2, "london": { "$": 1, "succ": { "in": _4, "of": _4 } }, "lotte": _2, "lotto": _2, "love": _2, "lpl": _2, "lplfinancial": _2, "ltd": _2, "ltda": _2, "lundbeck": _2, "lupin": _2, "luxe": _2, "luxury": _2, "macys": _2, "madrid": _2, "maif": _2, "maison": _2, "makeup": _2, "man": _2, "management": { "$": 1, "succ": { "router": _4 } }, "mango": _2, "map": _2, "market": _2, "marketing": _2, "markets": _2, "marriott": _2, "marshalls": _2, "maserati": _2, "mattel": _2, "mba": _2, "mckinsey": _2, "med": _2, "media": _2, "meet": _2, "melbourne": _2, "meme": _2, "memorial": _2, "men": _24, "menu": _25, "merckmsd": _2, "metlife": _2, "miami": _2, "microsoft": _2, "mini": _2, "mint": _2, "mit": _2, "mitsubishi": _2, "mlb": _2, "mls": _2, "mma": _2, "mobile": _2, "moda": _2, "moe": _2, "moi": _2, "mom": { "$": 1, "succ": { "and": _4, "for": _4 } }, "monash": _2, "money": _2, "monster": _2, "mormon": _2, "mortgage": _2, "moscow": _2, "moto": _2, "motorcycles": _2, "mov": _2, "movie": _2, "msd": _2, "mtn": _2, "mtr": _2, "mutual": _2, "nab": _2, "nagoya": _2, "nationwide": _2, "natura": _2, "navy": _2, "nba": _2, "nec": _2, "netbank": _2, "netflix": _2, "network": { "$": 1, "succ": { "alces": _7, "co": _4, "arvo": _4, "azimuth": _4 } }, "neustar": _2, "new": _2, "newholland": _2, "news": _2, "next": _2, "nextdirect": _2, "nexus": _2, "nfl": _2, "ngo": _2, "nhk": _2, "nico": _2, "nike": _2, "nikon": _2, "ninja": _2, "nissan": _2, "nissay": _2, "nokia": _2, "northwesternmutual": _2, "norton": _2, "now": _2, "nowruz": _2, "nowtv": _2, "nra": _2, "nrw": _2, "ntt": _2, "nyc": _2, "obi": _2, "observer": _2, "off": _2, "office": _2, "okinawa": _2, "olayan": _2, "olayangroup": _2, "oldnavy": _2, "ollo": _2, "omega": _2, "one": { "$": 1, "succ": { "onred": { "$": 2, "succ": { "staging": _4 } }, "for": _4, "homelink": _4 } }, "ong": _2, "onl": _2, "online": _25, "onyourside": _2, "ooo": _2, "open": _2, "oracle": _2, "orange": _2, "organic": _2, "origins": _2, "osaka": _2, "otsuka": _2, "ott": _2, "ovh": { "$": 1, "succ": { "nerdpol": _4 } }, "page": { "$": 1, "succ": { "pdns": _4, "plesk": _4, "prvcy": _4 } }, "panasonic": _2, "paris": _2, "pars": _2, "partners": _2, "parts": _2, "party": _19, "passagens": _2, "pay": _2, "pccw": _2, "pet": _2, "pfizer": _2, "pharmacy": _2, "phd": _2, "philips": _2, "phone": _2, "photo": _2, "photography": _2, "photos": _2, "physio": _2, "pics": _2, "pictet": _2, "pictures": { "$": 1, "succ": { "1337": _4 } }, "pid": _2, "pin": _2, "ping": _2, "pink": _2, "pioneer": _2, "pizza": _2, "place": _10, "play": _2, "playstation": _2, "plumbing": _2, "plus": _2, "pnc": _2, "pohl": _2, "poker": _2, "politie": _2, "porn": { "$": 1, "succ": { "indie": _4 } }, "pramerica": _2, "praxi": _2, "press": _2, "prime": _2, "prod": _2, "productions": _2, "prof": _2, "progressive": _2, "promo": _2, "properties": _2, "property": _2, "protection": _2, "pru": _2, "prudential": _2, "pub": _25, "pwc": _2, "qpon": _2, "quebec": _2, "quest": _2, "qvc": _2, "racing": _2, "radio": _2, "raid": _2, "read": _2, "realestate": _2, "realtor": _2, "realty": _2, "recipes": _2, "red": _2, "redstone": _2, "redumbrella": _2, "rehab": _2, "reise": _2, "reisen": _2, "reit": _2, "reliance": _2, "ren": _2, "rent": _2, "rentals": _2, "repair": _2, "report": _2, "republican": _2, "rest": _2, "restaurant": _2, "review": _19, "reviews": _2, "rexroth": _2, "rich": _2, "richardli": _2, "ricoh": _2, "ril": _2, "rio": _2, "rip": { "$": 1, "succ": { "clan": _4 } }, "rmit": _2, "rocher": _2, "rocks": { "$": 1, "succ": { "myddns": _4, "lima-city": _4, "webspace": _4 } }, "rodeo": _2, "rogers": _2, "room": _2, "rsvp": _2, "rugby": _2, "ruhr": _2, "run": { "$": 1, "succ": { "hs": _4, "development": _4, "ravendb": _4, "repl": _4 } }, "rwe": _2, "ryukyu": _2, "saarland": _2, "safe": _2, "safety": _2, "sakura": _2, "sale": _24, "salon": _2, "samsclub": _2, "samsung": _2, "sandvik": _2, "sandvikcoromant": _2, "sanofi": _2, "sap": _2, "sarl": _2, "sas": _2, "save": _2, "saxo": _2, "sbi": _2, "sbs": _2, "sca": _2, "scb": _2, "schaeffler": _2, "schmidt": _2, "scholarships": _2, "school": _11, "schule": _2, "schwarz": _2, "science": _19, "scjohnson": _2, "scot": { "$": 1, "succ": { "gov": _4 } }, "search": _2, "seat": _2, "secure": _2, "security": _2, "seek": _2, "select": _2, "sener": _2, "services": { "$": 1, "succ": { "loginline": _4 } }, "ses": _2, "seven": _2, "sew": _2, "sex": _2, "sexy": _2, "sfr": _2, "shangrila": _2, "sharp": _2, "shaw": _2, "shell": _2, "shia": _2, "shiksha": _2, "shoes": _2, "shop": _25, "shopping": _2, "shouji": _2, "show": _2, "showtime": _2, "shriram": _2, "silk": _2, "sina": _2, "singles": _2, "site": { "$": 1, "succ": { "cloudera": _4, "cyon": _4, "fastvps": _4, "jele": _4, "lelux": _4, "loginline": _4, "barsy": _4, "opensocial": _4, "platformsh": _7, "byen": _4, "mintere": _4 } }, "ski": _2, "skin": _2, "sky": _2, "skype": _2, "sling": _2, "smart": _2, "smile": _2, "sncf": _2, "soccer": _2, "social": _2, "softbank": _2, "software": _2, "sohu": _2, "solar": _2, "solutions": _2, "song": _2, "sony": _2, "soy": _2, "spa": _2, "space": { "$": 1, "succ": { "myfast": _4, "linkitools": _4, "uber": _4, "xs4all": _4 } }, "sport": _2, "spot": _2, "spreadbetting": _2, "srl": _2, "stada": _2, "staples": _2, "star": _2, "statebank": _2, "statefarm": _2, "stc": _2, "stcgroup": _2, "stockholm": _2, "storage": _2, "store": { "$": 1, "succ": { "shopware": _4 } }, "stream": _2, "studio": _2, "study": _2, "style": _2, "sucks": _2, "supplies": _2, "supply": _2, "support": _25, "surf": _2, "surgery": _2, "suzuki": _2, "swatch": _2, "swiftcover": _2, "swiss": _2, "sydney": _2, "systems": { "$": 1, "succ": { "knightpoint": _4 } }, "tab": _2, "taipei": _2, "talk": _2, "taobao": _2, "target": _2, "tatamotors": _2, "tatar": _2, "tattoo": _2, "tax": _2, "taxi": _2, "tci": _2, "tdk": _2, "team": { "$": 1, "succ": { "discourse": _4, "jelastic": _4 } }, "tech": _2, "technology": _10, "temasek": _2, "tennis": _2, "teva": _2, "thd": _2, "theater": _2, "theatre": _2, "tiaa": _2, "tickets": _2, "tienda": _2, "tiffany": _2, "tips": _2, "tires": _2, "tirol": _2, "tjmaxx": _2, "tjx": _2, "tkmaxx": _2, "tmall": _2, "today": _2, "tokyo": _2, "tools": _2, "top": { "$": 1, "succ": { "now-dns": _4, "ntdll": _4 } }, "toray": _2, "toshiba": _2, "total": _2, "tours": _2, "town": _2, "toyota": _2, "toys": _2, "trade": _19, "trading": _2, "training": _2, "travel": _2, "travelchannel": _2, "travelers": _2, "travelersinsurance": _2, "trust": _2, "trv": _2, "tube": _2, "tui": _2, "tunes": _2, "tushu": _2, "tvs": _2, "ubank": _2, "ubs": _2, "unicom": _2, "university": _2, "uno": _2, "uol": _2, "ups": _2, "vacations": _2, "vana": _2, "vanguard": _2, "vegas": _2, "ventures": _2, "verisign": _2, "versicherung": _2, "vet": _2, "viajes": _2, "video": _2, "vig": _2, "viking": _2, "villas": _2, "vin": _2, "vip": _2, "virgin": _2, "visa": _2, "vision": _2, "viva": _2, "vivo": _2, "vlaanderen": _2, "vodka": _2, "volkswagen": _2, "volvo": _2, "vote": _2, "voting": _2, "voto": _2, "voyage": _2, "vuelos": _2, "wales": _2, "walmart": _2, "walter": _2, "wang": _2, "wanggou": _2, "watch": _2, "watches": _2, "weather": _2, "weatherchannel": _2, "webcam": _2, "weber": _2, "website": _2, "wed": _2, "wedding": _2, "weibo": _2, "weir": _2, "whoswho": _2, "wien": _2, "wiki": _2, "williamhill": _2, "win": _2, "windows": _2, "wine": _2, "winners": _2, "wme": _2, "wolterskluwer": _2, "woodside": _2, "work": { "$": 1, "succ": { "of": _4, "to": _4 } }, "works": _2, "world": _2, "wow": _2, "wtc": _2, "wtf": _2, "xbox": _2, "xerox": _2, "xfinity": _2, "xihuan": _2, "xin": _2, "xn--11b4c3d": _2, "कॉम": _2, "xn--1ck2e1b": _2, "セール": _2, "xn--1qqw23a": _2, "佛山": _2, "xn--30rr7y": _2, "慈善": _2, "xn--3bst00m": _2, "集团": _2, "xn--3ds443g": _2, "在线": _2, "xn--3oq18vl8pn36a": _2, "大众汽车": _2, "xn--3pxu8k": _2, "点看": _2, "xn--42c2d9a": _2, "คอม": _2, "xn--45q11c": _2, "八卦": _2, "xn--4gbrim": _2, "موقع": _2, "xn--55qw42g": _2, "公益": _2, "xn--55qx5d": _2, "公司": _2, "xn--5su34j936bgsg": _2, "香格里拉": _2, "xn--5tzm5g": _2, "网站": _2, "xn--6frz82g": _2, "移动": _2, "xn--6qq986b3xl": _2, "我爱你": _2, "xn--80adxhks": _2, "москва": _2, "xn--80aqecdr1a": _2, "католик": _2, "xn--80asehdb": _2, "онлайн": _2, "xn--80aswg": _2, "сайт": _2, "xn--8y0a063a": _2, "联通": _2, "xn--9dbq2a": _2, "קום": _2, "xn--9et52u": _2, "时尚": _2, "xn--9krt00a": _2, "微博": _2, "xn--b4w605ferd": _2, "淡马锡": _2, "xn--bck1b9a5dre4c": _2, "ファッション": _2, "xn--c1avg": _2, "орг": _2, "xn--c2br7g": _2, "नेट": _2, "xn--cck2b3b": _2, "ストア": _2, "xn--cckwcxetd": _2, "アマゾン": _2, "xn--cg4bki": _2, "삼성": _2, "xn--czr694b": _2, "商标": _2, "xn--czrs0t": _2, "商店": _2, "xn--czru2d": _2, "商城": _2, "xn--d1acj3b": _2, "дети": _2, "xn--eckvdtc9d": _2, "ポイント": _2, "xn--efvy88h": _2, "新闻": _2, "xn--fct429k": _2, "家電": _2, "xn--fhbei": _2, "كوم": _2, "xn--fiq228c5hs": _2, "中文网": _2, "xn--fiq64b": _2, "中信": _2, "xn--fjq720a": _2, "娱乐": _2, "xn--flw351e": _2, "谷歌": _2, "xn--fzys8d69uvgm": _2, "電訊盈科": _2, "xn--g2xx48c": _2, "购物": _2, "xn--gckr3f0f": _2, "クラウド": _2, "xn--gk3at1e": _2, "通販": _2, "xn--hxt814e": _2, "网店": _2, "xn--i1b6b1a6a2e": _2, "संगठन": _2, "xn--imr513n": _2, "餐厅": _2, "xn--io0a7i": _2, "网络": _2, "xn--j1aef": _2, "ком": _2, "xn--jlq480n2rg": _2, "亚马逊": _2, "xn--jlq61u9w7b": _2, "诺基亚": _2, "xn--jvr189m": _2, "食品": _2, "xn--kcrx77d1x4a": _2, "飞利浦": _2, "xn--kput3i": _2, "手机": _2, "xn--mgba3a3ejt": _2, "ارامكو": _2, "xn--mgba7c0bbn0a": _2, "العليان": _2, "xn--mgbaakc7dvf": _2, "اتصالات": _2, "xn--mgbab2bd": _2, "بازار": _2, "xn--mgbca7dzdo": _2, "ابوظبي": _2, "xn--mgbi4ecexp": _2, "كاثوليك": _2, "xn--mgbt3dhd": _2, "همراه": _2, "xn--mk1bu44c": _2, "닷컴": _2, "xn--mxtq1m": _2, "政府": _2, "xn--ngbc5azd": _2, "شبكة": _2, "xn--ngbe9e0a": _2, "بيتك": _2, "xn--ngbrx": _2, "عرب": _2, "xn--nqv7f": _2, "机构": _2, "xn--nqv7fs00ema": _2, "组织机构": _2, "xn--nyqy26a": _2, "健康": _2, "xn--otu796d": _2, "招聘": _2, "xn--p1acf": _2, "рус": _2, "xn--pssy2u": _2, "大拿": _2, "xn--q9jyb4c": _2, "みんな": _2, "xn--qcka1pmc": _2, "グーグル": _2, "xn--rhqv96g": _2, "世界": _2, "xn--rovu88b": _2, "書籍": _2, "xn--ses554g": _2, "网址": _2, "xn--t60b56a": _2, "닷넷": _2, "xn--tckwe": _2, "コム": _2, "xn--tiq49xqyj": _2, "天主教": _2, "xn--unup4y": _2, "游戏": _2, "xn--vermgensberater-ctb": _2, "vermögensberater": _2, "xn--vermgensberatung-pwb": _2, "vermögensberatung": _2, "xn--vhquv": _2, "企业": _2, "xn--vuq861b": _2, "信息": _2, "xn--w4r85el8fhu5dnra": _2, "嘉里大酒店": _2, "xn--w4rs40l": _2, "嘉里": _2, "xn--xhq521b": _2, "广东": _2, "xn--zfr164b": _2, "政务": _2, "xyz": { "$": 1, "succ": { "blogsite": _4, "fhapp": _4, "crafting": _4, "zapto": _4, "telebit": _7 } }, "yachts": _2, "yahoo": _2, "yamaxun": _2, "yandex": _2, "yodobashi": _2, "yoga": _2, "yokohama": _2, "you": _2, "youtube": _2, "yun": _2, "zappos": _2, "zara": _2, "zero": _2, "zip": _2, "zone": { "$": 1, "succ": { "cloud66": _4, "hs": _4, "triton": _7, "lima": _4 } }, "zuerich": _2 } }; + ; + return rules; +})(); +//# sourceMappingURL=trie.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts/dist/es6/src/suffix-trie.js -// This constructor is used to store event handlers. Instantiating this is -// faster than explicitly calling `Object.create(null)` to get a "clean" empty -// object (tested with v8 v4.9). -function EventHandlers() {} -EventHandlers.prototype = Object.create(null); -function EventEmitter() { - EventEmitter.init.call(this); +/** + * Lookup parts of domain in Trie + */ +function lookupInTrie(parts, trie, index, allowedMask) { + let result = null; + let node = trie; + while (node !== undefined) { + // We have a match! + if ((node.$ & allowedMask) !== 0) { + result = { + index: index + 1, + isIcann: node.$ === 1 /* ICANN */, + isPrivate: node.$ === 2 /* PRIVATE */, + }; + } + // No more `parts` to look for + if (index === -1) { + break; + } + const succ = node.succ; + node = succ && (succ[parts[index]] || succ['*']); + index -= 1; + } + return result; } - -// nodejs oddity -// require('events') === require('events').EventEmitter -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.usingDomains = false; - -EventEmitter.prototype.domain = undefined; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; - -EventEmitter.init = function() { - this.domain = null; - if (EventEmitter.usingDomains) { - // if there is an active domain, then attach to it. - if (domain.active ) ; - } - - if (!this._events || this._events === Object.getPrototypeOf(this)._events) { - this._events = new EventHandlers(); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || isNaN(n)) - throw new TypeError('"n" argument must be a positive number'); - this._maxListeners = n; - return this; -}; - -function $getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; +/** + * Check if `hostname` has a valid public suffix in `trie`. + */ +function suffix_trie_suffixLookup(hostname, options, out) { + if (fast_path(hostname, options, out) === true) { + return; + } + const hostnameParts = hostname.split('.'); + const allowedMask = (options.allowPrivateDomains === true ? 2 /* PRIVATE */ : 0) | + (options.allowIcannDomains === true ? 1 /* ICANN */ : 0); + // Look for exceptions + const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1, allowedMask); + if (exceptionMatch !== null) { + out.isIcann = exceptionMatch.isIcann; + out.isPrivate = exceptionMatch.isPrivate; + out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.'); + return; + } + // Look for a match in rules + const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1, allowedMask); + if (rulesMatch !== null) { + out.isIcann = rulesMatch.isIcann; + out.isPrivate = rulesMatch.isPrivate; + out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.'); + return; + } + // No match found... + // Prevailing rule is '*' so we consider the top-level domain to be the + // public suffix of `hostname` (e.g.: 'example.org' => 'org'). + out.isIcann = false; + out.isPrivate = false; + out.publicSuffix = hostnameParts[hostnameParts.length - 1]; } +//# sourceMappingURL=suffix-trie.js.map +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/tldts/dist/es6/index.js -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return $getMaxListeners(this); -}; -// These standalone emit* functions are used to optimize calling of event -// handlers for fast cases because emit() itself often has a variable number of -// arguments and can be deoptimized because of that. These functions always have -// the same number of arguments and thus do not get deoptimized, so the code -// inside them can execute faster. -function emitNone(handler, isFn, self) { - if (isFn) - handler.call(self); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self); - } -} -function emitOne(handler, isFn, self, arg1) { - if (isFn) - handler.call(self, arg1); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1); - } +// For all methods but 'parse', it does not make sense to allocate an object +// every single time to only return the value of a specific attribute. To avoid +// this un-necessary allocation, we use a global object which is re-used. +const RESULT = getEmptyResult(); +function parse(url, options = {}) { + return factory_parseImpl(url, 5 /* ALL */, suffix_trie_suffixLookup, options, getEmptyResult()); } -function emitTwo(handler, isFn, self, arg1, arg2) { - if (isFn) - handler.call(self, arg1, arg2); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2); - } +function getHostname(url, options = {}) { + factory_resetResult(RESULT); + return factory_parseImpl(url, 0 /* HOSTNAME */, suffix_trie_suffixLookup, options, RESULT).hostname; } -function emitThree(handler, isFn, self, arg1, arg2, arg3) { - if (isFn) - handler.call(self, arg1, arg2, arg3); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].call(self, arg1, arg2, arg3); - } +function getPublicSuffix(url, options = {}) { + factory_resetResult(RESULT); + return factory_parseImpl(url, 2 /* PUBLIC_SUFFIX */, suffix_trie_suffixLookup, options, RESULT).publicSuffix; } - -function emitMany(handler, isFn, self, args) { - if (isFn) - handler.apply(self, args); - else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - listeners[i].apply(self, args); - } +function es6_getDomain(url, options = {}) { + resetResult(RESULT); + return parseImpl(url, 3 /* DOMAIN */, suffixLookup, options, RESULT).domain; } - -EventEmitter.prototype.emit = function emit(type) { - var er, handler, len, args, i, events, domain; - var doError = (type === 'error'); - - events = this._events; - if (events) - doError = (doError && events.error == null); - else if (!doError) - return false; - - domain = this.domain; - - // If there is no 'error' event listener then throw. - if (doError) { - er = arguments[1]; - if (domain) { - if (!er) - er = new Error('Uncaught, unspecified "error" event'); - er.domainEmitter = this; - er.domain = domain; - er.domainThrown = false; - domain.emit('error', er); - } else if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); - err.context = er; - throw err; - } - return false; - } - - handler = events[type]; - - if (!handler) - return false; - - var isFn = typeof handler === 'function'; - len = arguments.length; - switch (len) { - // fast cases - case 1: - emitNone(handler, isFn, this); - break; - case 2: - emitOne(handler, isFn, this, arguments[1]); - break; - case 3: - emitTwo(handler, isFn, this, arguments[1], arguments[2]); - break; - case 4: - emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); - break; - // slower - default: - args = new Array(len - 1); - for (i = 1; i < len; i++) - args[i - 1] = arguments[i]; - emitMany(handler, isFn, this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - - events = target._events; - if (!events) { - events = target._events = new EventHandlers(); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (!existing) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = prepend ? [listener, existing] : - [existing, listener]; - } else { - // If we've already got an array, just append. - if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - } - - // Check for listener leak - if (!existing.warned) { - m = $getMaxListeners(target); - if (m && m > 0 && existing.length > m) { - existing.warned = true; - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + type + ' listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - emitWarning(w); - } - } - } - - return target; +function es6_getSubdomain(url, options = {}) { + resetResult(RESULT); + return parseImpl(url, 4 /* SUB_DOMAIN */, suffixLookup, options, RESULT).subdomain; } -function emitWarning(e) { - typeof console.warn === 'function' ? console.warn(e) : console.log(e); +function es6_getDomainWithoutSuffix(url, options = {}) { + resetResult(RESULT); + return parseImpl(url, 5 /* ALL */, suffixLookup, options, RESULT).domainWithoutSuffix; } -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); +//# sourceMappingURL=index.js.map +// EXTERNAL MODULE: ../tsurlfilter/node_modules/@adguard/scriptlets/dist/umd/scriptlets.umd.js +var scriptlets_umd = __webpack_require__(3636); +var scriptlets_umd_default = /*#__PURE__*/__webpack_require__.n(scriptlets_umd); +;// CONCATENATED MODULE: ../tsurlfilter/dist/es/network-rule-options.js +var NETWORK_RULE_OPTIONS = { + THIRD_PARTY: 'third-party', + FIRST_PARTY: 'first-party', + MATCH_CASE: 'match-case', + IMPORTANT: 'important', + DOMAIN: 'domain', + DENYALLOW: 'denyallow', + ELEMHIDE: 'elemhide', + GENERICHIDE: 'generichide', + SPECIFICHIDE: 'specifichide', + GENERICBLOCK: 'genericblock', + JSINJECT: 'jsinject', + URLBLOCK: 'urlblock', + CONTENT: 'content', + DOCUMENT: 'document', + DOC: 'doc', + STEALTH: 'stealth', + POPUP: 'popup', + EMPTY: 'empty', + MP4: 'mp4', + SCRIPT: 'script', + STYLESHEET: 'stylesheet', + SUBDOCUMENT: 'subdocument', + OBJECT: 'object', + IMAGE: 'image', + XMLHTTPREQUEST: 'xmlhttprequest', + MEDIA: 'media', + FONT: 'font', + WEBSOCKET: 'websocket', + OTHER: 'other', + PING: 'ping', + BADFILTER: 'badfilter', + CSP: 'csp', + REPLACE: 'replace', + COOKIE: 'cookie', + REDIRECT: 'redirect', + REDIRECTRULE: 'redirect-rule', + REMOVEPARAM: 'removeparam', + REMOVEHEADER: 'removeheader', + JSONPRUNE: 'jsonprune', + HLS: 'hls', + APP: 'app', + NETWORK: 'network', + EXTENSION: 'extension', + NOOP: '_', + CLIENT: 'client', + DNSREWRITE: 'dnsrewrite', + DNSTYPE: 'dnstype', + CTAG: 'ctag', + METHOD: 'method', + TO: 'to', + ALL: 'all', }; +var OPTIONS_DELIMITER = '$'; +var MASK_ALLOWLIST = '@@'; +var NOT_MARK = '~'; +var ESCAPE_CHARACTER = '\\'; -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; -function _onceWrap(target, type, listener) { - var fired = false; - function g() { - target.removeListener(type, g); - if (!fired) { - fired = true; - listener.apply(target, arguments); - } - } - g.listener = listener; - return g; -} -EventEmitter.prototype.once = function once(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.on(type, _onceWrap(this, type, listener)); - return this; +;// CONCATENATED MODULE: ../tsurlfilter/dist/es/request-type.js +/** + * RequestType is the request types enumeration. + * Important: the enumeration is marked as const to avoid side effects when + * importing it into an extension. + */ +var RequestType = { + /** No value is set. Syntax sugar to simplify code. */ + NotSet: 0, + /** main frame */ + Document: 1, + /** (iframe) $subdocument */ + SubDocument: 2, + /** (javascript, etc) $script */ + Script: 4, + /** (css) $stylesheet */ + Stylesheet: 8, + /** (flash, etc) $object */ + Object: 16, + /** (any image) $image */ + Image: 32, + /** (ajax/fetch) $xmlhttprequest */ + XmlHttpRequest: 64, + /** (video/music) $media */ + Media: 128, + /** (any custom font) $font */ + Font: 256, + /** (a websocket connection) $websocket */ + WebSocket: 512, + /** (navigator.sendBeacon()) $ping */ + Ping: 1024, + /** any other request type */ + Other: 2048, // 1 << 11 }; -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - if (typeof listener !== 'function') - throw new TypeError('"listener" argument must be a function'); - events = this._events; - if (!events) - return this; - - list = events[type]; - if (!list) - return this; - - if (list === listener || (list.listener && list.listener === listener)) { - if (--this._eventsCount === 0) - this._events = new EventHandlers(); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list[0] = undefined; - if (--this._eventsCount === 0) { - this._events = new EventHandlers(); - return this; - } else { - delete events[type]; - } - } else { - spliceOne(list, position); - } - if (events.removeListener) - this.emit('removeListener', type, originalListener || listener); - } +// EXTERNAL MODULE: ../tsurlfilter/node_modules/is-cidr/index.js +var is_cidr = __webpack_require__(6597); +var is_cidr_default = /*#__PURE__*/__webpack_require__.n(is_cidr); +// EXTERNAL MODULE: ../tsurlfilter/node_modules/is-ip/index.js +var is_ip = __webpack_require__(3133); +var is_ip_default = /*#__PURE__*/__webpack_require__.n(is_ip); +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/cidr-tools/node_modules/ip-regex/index.js +const word = '[a-fA-F\\d:]'; - return this; - }; - -// Alias for removeListener added in NodeJS 10.0 -// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener -EventEmitter.prototype.off = function(type, listener){ - return this.removeListener(type, listener); -}; +const boundry = options => options && options.includeBoundaries + ? `(?:(?<=\\s|^)(?=${word})|(?<=${word})(?=\\s|$))` + : ''; -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events; +const v4 = '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}'; - events = this._events; - if (!events) - return this; +const v6segment = '[a-fA-F\\d]{1,4}'; - // not listening for removeListener, no need to emit - if (!events.removeListener) { - if (arguments.length === 0) { - this._events = new EventHandlers(); - this._eventsCount = 0; - } else if (events[type]) { - if (--this._eventsCount === 0) - this._events = new EventHandlers(); - else - delete events[type]; - } - return this; - } +const v6 = ` +(?: +(?:${v6segment}:){7}(?:${v6segment}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8 +(?:${v6segment}:){6}(?:${v4}|:${v6segment}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4 +(?:${v6segment}:){5}(?::${v4}|(?::${v6segment}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4 +(?:${v6segment}:){4}(?:(?::${v6segment}){0,1}:${v4}|(?::${v6segment}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4 +(?:${v6segment}:){3}(?:(?::${v6segment}){0,2}:${v4}|(?::${v6segment}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4 +(?:${v6segment}:){2}(?:(?::${v6segment}){0,3}:${v4}|(?::${v6segment}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4 +(?:${v6segment}:){1}(?:(?::${v6segment}){0,4}:${v4}|(?::${v6segment}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4 +(?::(?:(?::${v6segment}){0,5}:${v4}|(?::${v6segment}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4 +)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1 +`.replace(/\s*\/\/.*$/gm, '').replace(/\n/g, '').trim(); - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - for (var i = 0, key; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = new EventHandlers(); - this._eventsCount = 0; - return this; - } +// Pre-compile only the exact regexes because adding a global flag make regexes stateful +const v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`); +const v4exact = new RegExp(`^${v4}$`); +const v6exact = new RegExp(`^${v6}$`); - listeners = events[type]; +const ipRegex = options => options && options.exact + ? v46Exact + : new RegExp(`(?:${boundry(options)}${v4}${boundry(options)})|(?:${boundry(options)}${v6}${boundry(options)})`, 'g'); - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - do { - this.removeListener(type, listeners[listeners.length - 1]); - } while (listeners[0]); - } +ipRegex.v4 = options => options && options.exact ? v4exact : new RegExp(`${boundry(options)}${v4}${boundry(options)}`, 'g'); +ipRegex.v6 = options => options && options.exact ? v6exact : new RegExp(`${boundry(options)}${v6}${boundry(options)}`, 'g'); - return this; - }; +/* harmony default export */ const ip_regex = (ipRegex); -EventEmitter.prototype.listeners = function listeners(type) { - var evlistener; - var ret; - var events = this._events; - - if (!events) - ret = []; - else { - evlistener = events[type]; - if (!evlistener) - ret = []; - else if (typeof evlistener === 'function') - ret = [evlistener.listener || evlistener]; - else - ret = unwrapListeners(evlistener); - } +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/cidr-regex/node_modules/ip-regex/index.js +const ip_regex_word = '[a-fA-F\\d:]'; - return ret; -}; +const ip_regex_boundry = options => options && options.includeBoundaries + ? `(?:(?<=\\s|^)(?=${ip_regex_word})|(?<=${ip_regex_word})(?=\\s|$))` + : ''; -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount$1.call(emitter, type); - } -}; +const ip_regex_v4 = '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}'; -EventEmitter.prototype.listenerCount = listenerCount$1; -function listenerCount$1(type) { - var events = this._events; +const ip_regex_v6segment = '[a-fA-F\\d]{1,4}'; - if (events) { - var evlistener = events[type]; +const ip_regex_v6 = ` +(?: +(?:${ip_regex_v6segment}:){7}(?:${ip_regex_v6segment}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8 +(?:${ip_regex_v6segment}:){6}(?:${ip_regex_v4}|:${ip_regex_v6segment}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4 +(?:${ip_regex_v6segment}:){5}(?::${ip_regex_v4}|(?::${ip_regex_v6segment}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4 +(?:${ip_regex_v6segment}:){4}(?:(?::${ip_regex_v6segment}){0,1}:${ip_regex_v4}|(?::${ip_regex_v6segment}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4 +(?:${ip_regex_v6segment}:){3}(?:(?::${ip_regex_v6segment}){0,2}:${ip_regex_v4}|(?::${ip_regex_v6segment}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4 +(?:${ip_regex_v6segment}:){2}(?:(?::${ip_regex_v6segment}){0,3}:${ip_regex_v4}|(?::${ip_regex_v6segment}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4 +(?:${ip_regex_v6segment}:){1}(?:(?::${ip_regex_v6segment}){0,4}:${ip_regex_v4}|(?::${ip_regex_v6segment}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4 +(?::(?:(?::${ip_regex_v6segment}){0,5}:${ip_regex_v4}|(?::${ip_regex_v6segment}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4 +)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1 +`.replace(/\s*\/\/.*$/gm, '').replace(/\n/g, '').trim(); - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener) { - return evlistener.length; - } - } +// Pre-compile only the exact regexes because adding a global flag make regexes stateful +const ip_regex_v46Exact = new RegExp(`(?:^${ip_regex_v4}$)|(?:^${ip_regex_v6}$)`); +const ip_regex_v4exact = new RegExp(`^${ip_regex_v4}$`); +const ip_regex_v6exact = new RegExp(`^${ip_regex_v6}$`); - return 0; -} +const ip_regex_ipRegex = options => options && options.exact + ? ip_regex_v46Exact + : new RegExp(`(?:${ip_regex_boundry(options)}${ip_regex_v4}${ip_regex_boundry(options)})|(?:${ip_regex_boundry(options)}${ip_regex_v6}${ip_regex_boundry(options)})`, 'g'); -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; -}; +ip_regex_ipRegex.v4 = options => options && options.exact ? ip_regex_v4exact : new RegExp(`${ip_regex_boundry(options)}${ip_regex_v4}${ip_regex_boundry(options)}`, 'g'); +ip_regex_ipRegex.v6 = options => options && options.exact ? ip_regex_v6exact : new RegExp(`${ip_regex_boundry(options)}${ip_regex_v6}${ip_regex_boundry(options)}`, 'g'); -// About 1.5x faster than the two-arg version of Array#splice(). -function spliceOne(list, index) { - for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) - list[i] = list[k]; - list.pop(); -} +/* harmony default export */ const node_modules_ip_regex = (ip_regex_ipRegex); -function arrayClone(arr, i) { - var copy = new Array(i); - while (i--) - copy[i] = arr[i]; - return copy; -} +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/cidr-regex/index.js -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} -function BufferList() { - this.head = null; - this.tail = null; - this.length = 0; -} +const defaultOpts = {exact: false}; +const v4str = `${node_modules_ip_regex.v4().source}\\/(3[0-2]|[12]?[0-9])`; +const v6str = `${node_modules_ip_regex.v6().source}\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])`; -BufferList.prototype.push = function (v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; -}; +// pre-compile only the exact regexes as global flag makes regex objects stateful +const cidr_regex_v4exact = new RegExp(`^${v4str}$`); +const cidr_regex_v6exact = new RegExp(`^${v6str}$`); +const v46exact = new RegExp(`(?:^${v4str}$)|(?:^${v6str}$)`); -BufferList.prototype.unshift = function (v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; -}; +const cidrRegex = ({exact} = defaultOpts) => exact ? v46exact : new RegExp(`(?:${v4str})|(?:${v6str})`, "g"); +const cidr_regex_v4 = cidrRegex.v4 = ({exact} = defaultOpts) => exact ? cidr_regex_v4exact : new RegExp(v4str, "g"); +const cidr_regex_v6 = cidrRegex.v6 = ({exact} = defaultOpts) => exact ? cidr_regex_v6exact : new RegExp(v6str, "g"); +/* harmony default export */ const cidr_regex = (cidrRegex); -BufferList.prototype.shift = function () { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; -}; +// EXTERNAL MODULE: ../tsurlfilter/node_modules/string-natural-compare/natural-compare.js +var natural_compare = __webpack_require__(5214); +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/ip-bigint/index.js +const max4 = 2n ** 32n - 1n; +const max6 = 2n ** 128n - 1n; -BufferList.prototype.clear = function () { - this.head = this.tail = null; - this.length = 0; -}; +function parseIp(ip) { + const version = ip.includes(":") ? 6 : ip.includes(".") ? 4 : 0; + if (!version) throw new Error(`Invalid IP address: ${ip}`); -BufferList.prototype.join = function (s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; -}; + let number = 0n; + let exp = 0n; + const res = Object.create(null); -BufferList.prototype.concat = function (n) { - if (this.length === 0) return Buffer.alloc(0); - if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - p.data.copy(ret, i); - i += p.data.length; - p = p.next; - } - return ret; -}; + if (version === 4) { + for (const n of ip.split(".").map(BigInt).reverse()) { + number += n * (2n ** exp); + exp += 8n; + } + } else { + if (ip.includes(".")) { + res.ipv4mapped = true; + ip = ip.split(":").map(part => { + if (part.includes(".")) { + const digits = part.split(".").map(str => Number(str).toString(16).padStart(2, "0")); + return `${digits[0]}${digits[1]}:${digits[2]}${digits[3]}`; + } else { + return part; + } + }).join(":"); + } -// Copyright Joyent, Inc. and other Node contributors. -var isBufferEncoding = Buffer.isEncoding - || function(encoding) { - switch (encoding && encoding.toLowerCase()) { - case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; - default: return false; - } - }; + if (ip.includes("%")) { + let scopeid; + [, ip, scopeid] = /(.+)%(.+)/.exec(ip); + res.scopeid = scopeid; + } + const parts = ip.split(":"); + const index = parts.indexOf(""); -function assertEncoding(encoding) { - if (encoding && !isBufferEncoding(encoding)) { - throw new Error('Unknown encoding: ' + encoding); - } -} + if (index !== -1) { + while (parts.length < 8) { + parts.splice(index, 0, ""); + } + } -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. CESU-8 is handled as part of the UTF-8 encoding. -// -// @TODO Handling all encodings inside a single object makes it very difficult -// to reason about this code, so it should be split up in the future. -// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code -// points as used by CESU-8. -function StringDecoder(encoding) { - this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); - assertEncoding(encoding); - switch (this.encoding) { - case 'utf8': - // CESU-8 represents each of Surrogate Pair by 3-bytes - this.surrogateSize = 3; - break; - case 'ucs2': - case 'utf16le': - // UTF-16 represents each of Surrogate Pair by 2-bytes - this.surrogateSize = 2; - this.detectIncompleteChar = utf16DetectIncompleteChar; - break; - case 'base64': - // Base-64 stores 3 bytes in 4 chars, and pads the remainder. - this.surrogateSize = 3; - this.detectIncompleteChar = base64DetectIncompleteChar; - break; - default: - this.write = passThroughWrite; - return; + for (const n of parts.map(part => BigInt(parseInt(part || 0, 16))).reverse()) { + number += n * (2n ** exp); + exp += 16n; + } } - // Enough space to store all bytes of a single character. UTF-8 needs 4 - // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). - this.charBuffer = new Buffer(6); - // Number of bytes received for the current incomplete multi-byte character. - this.charReceived = 0; - // Number of bytes expected for the current incomplete multi-byte character. - this.charLength = 0; + res.number = number; + res.version = version; + return res; } -// write decodes the given buffer and returns it as JS string that is -// guaranteed to not contain any partial multi-byte characters. Any partial -// character found at the end of the buffer is buffered up, and will be -// returned when calling write again with the remaining bytes. -// -// Note: Converting a Buffer containing an orphan surrogate to a String -// currently works, but converting a String to a Buffer (via `new Buffer`, or -// Buffer#write) will replace incomplete surrogates with the unicode -// replacement character. See https://codereview.chromium.org/121173009/ . -StringDecoder.prototype.write = function(buffer) { - var charStr = ''; - // if our last write ended with an incomplete multibyte character - while (this.charLength) { - // determine how many remaining bytes this buffer has to offer for this char - var available = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; - - // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; - - if (this.charReceived < this.charLength) { - // still not enough chars in this buffer? wait for more ... - return ''; - } +function stringifyIp({number, version, ipv4mapped, scopeid} = {}, {compress = true, hexify = false} = {}) { + if (typeof number !== "bigint") throw new Error(`Expected a BigInt`); + if (![4, 6].includes(version)) throw new Error(`Invalid version: ${version}`); + if (number < 0n || number > (version === 4 ? max4 : max6)) throw new Error(`Invalid number: ${number}`); - // remove bytes belonging to the current character from the buffer - buffer = buffer.slice(available, buffer.length); + let step = version === 4 ? 24n : 112n; + const stepReduction = version === 4 ? 8n : 16n; + let remain = number; + const parts = []; - // get the character that was split - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + while (step > 0n) { + const divisor = 2n ** step; + parts.push(remain / divisor); + remain = number % divisor; + step -= stepReduction; + } + parts.push(remain); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - this.charLength += this.surrogateSize; - charStr = ''; - continue; + if (version === 4) { + return parts.join("."); + } else { + let ip = ""; + if (ipv4mapped && !hexify) { + for (const [index, num] of parts.entries()) { + if (index < 6) { + ip += `${num.toString(16)}:`; + } else { + ip += `${String(num >> 8n)}.${String(num & 255n)}${index === 6 ? "." : ""}`; + } + } + if (compress) { + ip = compressIPv6(ip.split(":")); + } + } else { + if (compress) { + ip = compressIPv6(parts.map(n => n.toString(16))); + } else { + ip = parts.map(n => n.toString(16)).join(":"); + } } - this.charReceived = this.charLength = 0; - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; + if (scopeid) { + ip = `${ip}%${scopeid}`; } - break; + + return ip; } +} - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); +function normalizeIp(ip, {compress = true, hexify = false} = {}) { + return stringifyIp(parseIp(ip), {compress, hexify}); +} - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; +// take the longest or first sequence of "0" segments and replace it with "::" +function compressIPv6(parts) { + let longest, current; + for (const [index, part] of parts.entries()) { + if (part === "0") { + if (!current) { + current = new Set([index]); + } else { + current.add(index); + } + } else { + if (current) { + if (!longest) { + longest = current; + } else if (current.size > longest.size) { + longest = current; + } + current = null; + } + } + } + if ((!longest && current) || (current && current.size > longest.size)) { + longest = current; } - charStr += buffer.toString(this.encoding, 0, end); - - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); + for (const index of longest || []) { + parts[index] = ":"; } - // or just emit the charStr - return charStr; -}; + return parts.filter(Boolean).join(":").replace(/:{2,}/, "::"); +} -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; +;// CONCATENATED MODULE: ../tsurlfilter/node_modules/cidr-tools/index.js - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - // See http://en.wikipedia.org/wiki/UTF-8#Description - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; - } - } - this.charReceived = i; +const bits = { + "v4": 32, + "v6": 128, }; -StringDecoder.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); - - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } - - return res; -}; +const uniq = arr => Array.from(new Set(arr)); -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); +function isIP(ip) { + if (ip_regex.v4({exact: true}).test(ip)) return 4; + if (ip_regex.v6({exact: true}).test(ip)) return 6; + return 0; } -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; +function isCidr(ip) { + if (cidr_regex.v4({exact: true}).test(ip)) return 4; + if (cidr_regex.v6({exact: true}).test(ip)) return 6; + return 0; } -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; +function doNormalize(cidr, {compress = true, hexify = false} = {}) { + const {start, prefix, single, version} = cidr_tools_parse(cidr); + if (!single) { // cidr + // set network address to first address + const ip = normalizeIp(stringifyIp({number: start, version}), {compress, hexify}); + return `${ip}/${prefix}`; + } else { // single ip + return normalizeIp(cidr, {compress, hexify}); + } } -Readable.ReadableState = ReadableState; - -var debug = debuglog('stream'); -inherits$1(Readable, EventEmitter); - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') { - return emitter.prependListener(event, fn); +function normalize(cidr, {compress = true, hexify = false} = {}) { + if (Array.isArray(cidr)) { + return cidr.map(entry => normalize(entry, {compress, hexify})); } else { - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) - emitter.on(event, fn); - else if (Array.isArray(emitter._events[event])) - emitter._events[event].unshift(fn); - else - emitter._events[event] = [fn, emitter._events[event]]; - } -} -function listenerCount (emitter, type) { - return emitter.listeners(type).length; -} -function ReadableState(options, stream) { - - options = options || {}; - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = ~ ~this.highWaterMark; - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // when piping, we only care about 'readable' events that happen - // after read()ing all the bytes and not getting any pushback. - this.ranOut = false; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; + return doNormalize(cidr, {compress, hexify}); } } -function Readable(options) { - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options && typeof options.read === 'function') this._read = options.read; - - EventEmitter.call(this); -} -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; +function cidr_tools_parse(str) { + const cidrVersion = isCidr(str); + const parsed = Object.create(null); + parsed.single = false; - if (!state.objectMode && typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; + if (cidrVersion) { + parsed.cidr = str; + parsed.version = cidrVersion; + } else { + const version = isIP(str); + if (version) { + parsed.cidr = `${str}/${bits[`v${version}`]}`; + parsed.version = version; + parsed.single = true; + } else { + throw new Error(`Network is not a CIDR or IP: ${str}`); } } - return readableAddChunk(this, state, chunk, encoding, false); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - var state = this._readableState; - return readableAddChunk(this, state, chunk, '', true); -}; - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; + const [ip, prefix] = parsed.cidr.split("/"); + parsed.prefix = prefix; + const {number, version} = parseIp(ip); + const numBits = bits[`v${version}`]; + const ipBits = number.toString(2).padStart(numBits, "0"); + const prefixLen = Number(numBits - prefix); + const startBits = ipBits.substring(0, numBits - prefixLen); + parsed.start = BigInt(`0b${startBits}${"0".repeat(prefixLen)}`); + parsed.end = BigInt(`0b${startBits}${"1".repeat(prefixLen)}`); + return parsed; +} -function readableAddChunk(stream, state, chunk, encoding, addToFront) { - var er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (state.ended && !addToFront) { - var e = new Error('stream.push() after EOF'); - stream.emit('error', e); - } else if (state.endEmitted && addToFront) { - var _e = new Error('stream.unshift() after end event'); - stream.emit('error', _e); - } else { - var skipAdd; - if (state.decoder && !addToFront && !encoding) { - chunk = state.decoder.write(chunk); - skipAdd = !state.objectMode && chunk.length === 0; - } +// returns whether networks fully or partially overlap +function doNetsOverlap(a, b) { + // aaa + // bbb + if (a.start > b.end) return false; // a starts after b - if (!addToFront) state.reading = false; + // aaa + // bbb + if (b.start > a.end) return false; // b starts after a - // Don't add to the buffer if we've decoded to an empty string chunk and - // we're not in object mode - if (!skipAdd) { - // if we want the data now, just emit it. - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + return true; +} - if (state.needReadable) emitReadable(stream); - } - } +// returns whether network a fully contains network b; +function netContains(a, b) { + // aaa + // bbbb + if (b.start < a.start) return false; // a starts after b - maybeReadMore(stream, state); - } - } else if (!addToFront) { - state.reading = false; - } + // aaa + // bbbb + if (b.end > a.end) return false; // b starts after a - return needMoreData(state); + return true; } -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -} +// exclude b from a and return remainder cidrs +function excludeNets(a, b, v) { + const parts = []; -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; + // compareTo returns negative if left is less than right -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; + // aaa + // bbb + // aaa + // bbb + if (a.start > b.end || a.end < b.start) { + return [a.cidr]; } - return n; -} -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + // aaa + // bbb + if (a.start === b.start && a.end === b.end) { + return []; } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; + + // aa + // bbbb + if (a.start > b.start && a.end < b.end) { + return []; } - return state.length; -} -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; + // aaaa + // bbbb + // aaaa + // bb + if (a.start < b.start && a.end <= b.end) { + parts.push({start: a.start, end: b.start - 1n}); } - n = howMuchToRead(n, state); + // aaa + // bbb + // aaaa + // bbb + if (a.start >= b.start && a.end > b.end) { + parts.push({start: b.end + 1n, end: a.end}); + } - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; + // aaaa + // bb + if (a.start < b.start && a.end > b.end) { + parts.push( + {start: a.start, end: b.start - 1n}, + {start: b.end + 1n, end: a.end}, + ); } - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); + const remaining = []; + for (const part of parts) { + for (const subpart of subparts(part)) { + remaining.push(formatPart(subpart, v)); + } } - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); + return merge(remaining); +} + +function biggestPowerOfTwo(num) { + if (num === 0n) return 0n; + return 2n ** BigInt(String(num.toString(2).length - 1)); +} + +function subparts(part) { + // special case for when part is length 1 + if ((part.end - part.start) === 1n) { + if (part.end % 2n === 0n) { + return [{start: part.start, end: part.start}, {start: part.end, end: part.end}]; + } else { + return [{start: part.start, end: part.end}]; + } } - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; + const size = diff(part.end, part.start); + let biggest = biggestPowerOfTwo(size); - if (ret === null) { - state.needReadable = true; - n = 0; + let start, end; + if (size === biggest && part.start + size === part.end) { + return [part]; + } else if (part.start % biggest === 0n) { + // start is matching on the size-defined boundary - ex: 0-12, use 0-8 + start = part.start; + end = start + biggest - 1n; } else { - state.length -= n; - } + start = (part.end / biggest) * biggest; - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; + // start is not matching on the size-defined boundary - 4-16, use 8-16 + if ((start + biggest - 1n) > part.end) { + // divide will floor to nearest integer + start = ((part.end / biggest) - 1n) * biggest; - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } + while (start < part.start) { + biggest /= 2n; + start = ((part.end / biggest) - 1n) * biggest; + } - if (ret !== null) this.emit('data', ret); + end = start + biggest - 1n; + } else { + start = (part.end / biggest) * biggest; + end = start + biggest - 1n; + } + } - return ret; -}; + let parts = [{start, end}]; -function chunkInvalid(state, chunk) { - var er = null; - if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); + // additional subnets on left side + if (start !== part.start) { + parts = parts.concat(subparts({start: part.start, end: start - 1n})); } - return er; -} -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } + // additional subnets on right side + if (end !== part.end) { + parts = parts.concat(subparts({start: end + 1n, end: part.end})); } - state.ended = true; - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); + return parts; } -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream); - } +function diff(a, b) { + if (typeof a !== "bigint") a = BigInt(a); + if (typeof b !== "bigint") b = BigInt(b); + a += 1n; + return a - b; } -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); +function formatPart(part, v) { + const ip = normalize(stringifyIp({ + number: BigInt(part.start.toString()), + version: Number(v.substring(1)), + })); + const zeroes = diff(part.end, part.start).toString(2); + const prefix = bits[v] - (zeroes.match(/0/g) || []).length; + return `${ip}/${prefix}`; } -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - nextTick(maybeReadMore_, stream, state); - } -} +function mapNets(nets) { + const maps = {v4: {}, v6: {}}; + for (const {start, end, version} of nets) { + const v = `v${version}`; + + if (!maps[v][start]) maps[v][start] = {}; + if (!maps[v][end]) maps[v][end] = {}; + + if (maps[v][start].start) { + maps[v][start].start += 1; + } else { + maps[v][start].start = 1; + } -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; + if (maps[v][end].end) { + maps[v][end].end += 1; + } else { + maps[v][end].end = 1; + } } - state.readingMore = false; + return maps; } -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('not implemented')); -}; +function merge(nets) { + nets = uniq((Array.isArray(nets) ? nets : [nets]).map(cidr_tools_parse)); + const maps = mapNets(nets); -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + const merged = {v4: [], v6: []}; + const start = {v4: null, v6: null}; + const end = {v4: null, v6: null}; + + for (const v of ["v4", "v6"]) { + const numbers = Object.keys(maps[v]).sort(natural_compare); + let depth = 0; - var doEnd = (!pipeOpts || pipeOpts.end !== false); + for (const [index, number] of numbers.entries()) { + const marker = maps[v][number]; + + if (start[v] === null && marker.start) { + start[v] = BigInt(number); + } + if (marker.end) { + end[v] = BigInt(number); + } - var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) nextTick(endFn);else src.once('end', endFn); + if (marker.start) depth += marker.start; + if (marker.end) depth -= marker.end; - dest.on('unpipe', onunpipe); - function onunpipe(readable) { - debug('onunpipe'); - if (readable === src) { - cleanup(); + if (marker.end && depth === 0 && ((numbers[index + 1] - numbers[index]) > 1)) { + for (const sub of subparts({start: start[v], end: end[v]})) { + merged[v].push(formatPart(sub, v)); + } + start[v] = null; + end[v] = null; + } else if (index === (numbers.length - 1)) { + for (const sub of subparts({start: start[v], end: end[v]})) { + merged[v].push(formatPart(sub, v)); + } + } } } - function onend() { - debug('onend'); - dest.end(); - } + return [...merged.v4.sort(natural_compare), ...merged.v6.sort(natural_compare)]; +} + +function exclude(basenets, exclnets) { + basenets = uniq(Array.isArray(basenets) ? basenets : [basenets]); + exclnets = uniq(Array.isArray(exclnets) ? exclnets : [exclnets]); + + basenets = merge(basenets); + exclnets = merge(exclnets); - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', cleanup); - src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + const bases = {v4: [], v6: []}; + const excls = {v4: [], v6: []}; + + for (const basenet of basenets) { + bases[`v${isCidr(basenet)}`].push(basenet); } - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; - } - src.pause(); - } + for (const exclnet of exclnets) { + excls[`v${isCidr(exclnet)}`].push(exclnet); } - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (listenerCount(dest, 'error') === 0) dest.emit('error', er); + for (const v of ["v4", "v6"]) { + for (const exclcidr of excls[v]) { + for (const [index, basecidr] of bases[v].entries()) { + const base = cidr_tools_parse(basecidr); + const excl = cidr_tools_parse(exclcidr); + const remainders = excludeNets(base, excl, v); + if (base.cidr !== remainders.toString()) { + bases[v] = bases[v].concat(remainders); + bases[v].splice(index, 1); + } + } + } } - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); + return bases.v4.concat(bases.v6); +} - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); +function expand(nets) { + nets = uniq(Array.isArray(nets) ? nets : [nets]); - function unpipe() { - debug('unpipe'); - src.unpipe(dest); + const ips = []; + for (const net of merge(nets)) { + const {start, end, version} = cidr_tools_parse(net); + for (let number = start; number <= end; number++) { + ips.push(stringifyIp({number, version})); + } } + return ips.map(normalize); +} - // tell the dest that it's being piped to - dest.emit('pipe', src); +function overlap(a, b) { + const aNets = uniq(Array.isArray(a) ? a : [a]); + const bNets = uniq(Array.isArray(b) ? b : [b]); - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } + for (const a of aNets) { + const aParsed = cidr_tools_parse(a); + for (const b of bNets) { + const bParsed = cidr_tools_parse(b); - return dest; -}; + // version mismatch + if (aParsed.version !== bParsed.version) { + continue; + } -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && src.listeners('data').length) { - state.flowing = true; - flow(src); + if (doNetsOverlap(aParsed, bParsed)) { + return true; + } } - }; -} + } -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; + return false; +} - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; +function contains(a, b) { + const aNets = uniq(Array.isArray(a) ? a : [a]); + const bNets = uniq(Array.isArray(b) ? b : [b]); - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; + const numExpected = bNets.length; + let numFound = 0; + for (const a of aNets) { + const aParsed = cidr_tools_parse(a); + for (const b of bNets) { + const bParsed = cidr_tools_parse(b); - if (!dest) dest = state.pipes; + // version mismatch + if (aParsed.version !== bParsed.version) { + continue; + } - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this); - return this; + if (netContains(aParsed, bParsed)) { + numFound++; + continue; + } + } } - // slow case. multiple pipe destinations. + return numFound === numExpected; +} - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; +/* harmony default export */ const cidr_tools = ({ + merge, + exclude, + expand, + overlap, + contains, + normalize, + parse: cidr_tools_parse, +}); - for (var _i = 0; _i < len; _i++) { - dests[_i].emit('unpipe', this); - }return this; - } +;// CONCATENATED MODULE: ../tsurlfilter/dist/es/cosmetic-rule-marker.js +/** + * Enumeration with the cosmetic rules markers. + * + * All cosmetic rules have similar structure: + * ``` + * rule = [domains] "marker" content + * domains = [domain0, domain1[, ...[, domainN]]] + * ``` + * + * For instance, element hiding rules look like: + * `example.org##.banner` + * + * In this case: + * * `[domains]` is `example.org` (comma-separated list of domains) + * * `marker` is `##` (marker of element hiding rules) + * * `content` is `.banner` (CSS selector) + */ +var CosmeticRuleMarker; +(function (CosmeticRuleMarker) { + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-elemhide-rules */ + CosmeticRuleMarker["ElementHiding"] = "##"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#element-hiding-rules-exceptions */ + CosmeticRuleMarker["ElementHidingException"] = "#@#"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors */ + CosmeticRuleMarker["ElementHidingExtCSS"] = "#?#"; + /** Basically the same as {@link CosmeticRuleMarker.ElementHidingException} */ + CosmeticRuleMarker["ElementHidingExtCSSException"] = "#@?#"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules */ + CosmeticRuleMarker["Css"] = "#$#"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules-exceptions */ + CosmeticRuleMarker["CssException"] = "#@$#"; + /** + * CSS rules that use extended CSS selectors: + * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors + */ + CosmeticRuleMarker["CssExtCSS"] = "#$?#"; + /** Basically the same as {@link CosmeticRuleMarker.CssException} */ + CosmeticRuleMarker["CssExtCSSException"] = "#@$?#"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules */ + CosmeticRuleMarker["Js"] = "#%#"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules-exceptions-1 */ + CosmeticRuleMarker["JsException"] = "#@%#"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules */ + CosmeticRuleMarker["Html"] = "$$"; + /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules-exceptions-1 */ + CosmeticRuleMarker["HtmlException"] = "$@$"; +})(CosmeticRuleMarker || (CosmeticRuleMarker = {})); +/** + * findCosmeticRuleMarker looks for a cosmetic rule marker in the rule text + * and returns the start index of the marker and the marker found. + * If nothing found, it returns -1 and null. + * + * @privateRemarks + * + * The idea is to search for the rule marker as quickly as possible. + * If we were simply using `Array.includes` we had to call it a dozen of times (for every marker), + * and that'd have been much slower. + * + * @param ruleText - rule text to scan. + */ +function findCosmeticRuleMarker(ruleText) { + var maxIndex = ruleText.length - 1; + for (var i = 0; i < maxIndex; i += 1) { + var char = ruleText.charAt(i); + switch (char) { + case '#': + if (i + 4 <= maxIndex) { + if (ruleText.charAt(i + 1) === '@' + && ruleText.charAt(i + 2) === '$' + && ruleText.charAt(i + 3) === '?' + && ruleText.charAt(i + 4) === '#') { + return [i, CosmeticRuleMarker.CssExtCSSException]; + } + } + if (i + 3 <= maxIndex) { + if (ruleText.charAt(i + 1) === '@' + && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') { + return [i, CosmeticRuleMarker.ElementHidingExtCSSException]; + } + if (ruleText.charAt(i + 1) === '@' + && ruleText.charAt(i + 2) === '$' && ruleText.charAt(i + 3) === '#') { + return [i, CosmeticRuleMarker.CssException]; + } + if (ruleText.charAt(i + 1) === '@' + && ruleText.charAt(i + 2) === '%' && ruleText.charAt(i + 3) === '#') { + return [i, CosmeticRuleMarker.JsException]; + } + if (ruleText.charAt(i + 1) === '$' + && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') { + return [i, CosmeticRuleMarker.CssExtCSS]; + } + } + if (i + 2 <= maxIndex) { + if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '#') { + return [i, CosmeticRuleMarker.ElementHidingException]; + } + if (ruleText.charAt(i + 1) === '?' && ruleText.charAt(i + 2) === '#') { + return [i, CosmeticRuleMarker.ElementHidingExtCSS]; + } + if (ruleText.charAt(i + 1) === '%' && ruleText.charAt(i + 2) === '#') { + return [i, CosmeticRuleMarker.Js]; + } + if (ruleText.charAt(i + 1) === '$' && ruleText.charAt(i + 2) === '#') { + return [i, CosmeticRuleMarker.Css]; + } + } + if (i + 1 <= maxIndex) { + if (ruleText.charAt(i + 1) === '#') { + // Handling false positives while looking for cosmetic rules in host files. + // + // For instance, it could look like this: + // 127.0.0.1 localhost ## this is just a comment + if (i > 0 && ruleText.charAt(i - 1) === ' ') { + return [-1, null]; + } + return [i, CosmeticRuleMarker.ElementHiding]; + } + } + break; + case '$': + if (i + 2 <= maxIndex) { + if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '$') { + return [i, CosmeticRuleMarker.HtmlException]; + } + } + if (i + 1 <= maxIndex) { + if (ruleText.charAt(i + 1) === '$') { + return [i, CosmeticRuleMarker.Html]; + } + } + break; + } + } + return [-1, null]; +} +/** + * Detects is the rule is extended css rule + * @param marker - string to check + */ +function isExtCssMarker(marker) { + var EXTENDED_CSS_MARKERS = [ + CosmeticRuleMarker.CssExtCSS, + CosmeticRuleMarker.CssExtCSSException, + CosmeticRuleMarker.ElementHidingExtCSS, + CosmeticRuleMarker.ElementHidingExtCSSException, + ]; + return EXTENDED_CSS_MARKERS.indexOf(marker) !== -1; +} +/** + * AdGuard scriptlet rule mask + */ +var ADG_SCRIPTLET_MASK = '//scriptlet'; - // try to find the right one. - var i = indexOf(state.pipes, dest); - if (i === -1) return this; - state.pipes.splice(i, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - dest.emit('unpipe', this); +;// CONCATENATED MODULE: ../tsurlfilter/dist/es/index.js - return this; -}; -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = EventEmitter.prototype.on.call(this, ev, fn); - - if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - nextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - nextTick(resume_, stream, state); - } -} -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var state = this._readableState; - var paused = false; - var self = this; - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) self.push(chunk); - } - self.push(null); - }); - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; +/** + * Compatibility types are used to configure engine for better support of different libraries + * For example: + * extension doesn't support $app modifier. So if we set in configuration CompatibilityTypes.Extension, + * engine would ignore rules with $app modifier + */ +var CompatibilityTypes; +(function (CompatibilityTypes) { + CompatibilityTypes[CompatibilityTypes["Extension"] = 1] = "Extension"; + CompatibilityTypes[CompatibilityTypes["CoreLibs"] = 2] = "CoreLibs"; + CompatibilityTypes[CompatibilityTypes["Dns"] = 4] = "Dns"; +})(CompatibilityTypes || (CompatibilityTypes = {})); +/** + * Application configuration class + */ +var Configuration = /** @class */ (function () { + function Configuration(inputConfig) { + this.defaultConfig = { + engine: null, + version: null, + verbose: false, + compatibility: null, + }; + /** + * {'extension'|'corelibs'} engine application type + */ + this.engine = null; + /** + * {string} version + */ + this.version = null; + /** + * {boolean} verbose flag + */ + this.verbose = false; + /** + * compatibility flag + */ + this.compatibility = CompatibilityTypes.Extension; + var config = __assign(__assign({}, this.defaultConfig), inputConfig); + this.engine = config.engine; + this.version = config.version; + this.verbose = config.verbose; + this.compatibility = config.compatibility; + } + return Configuration; +}()); +// eslint-disable-next-line import/no-mutable-exports +var config = new Configuration(); +/** + * Checks config is compatible with input level + * @param compatibilityLevel + * @private + */ +function isCompatibleWith(compatibilityLevel) { + if (config.compatibility === null) { + return false; + } + return (config.compatibility & compatibilityLevel) === compatibilityLevel; +} +var setConfiguration = function (outerConfig) { + config = new Configuration(outerConfig); +}; - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); +/** + * This class stores found cosmetic css rules content in the appropriate collections + * It is primarily used by the {@see CosmeticResult} + */ +var CosmeticStylesResult = /** @class */ (function () { + /** + * Constructor + */ + function CosmeticStylesResult() { + this.generic = []; + this.specific = []; + this.genericExtCss = []; + this.specificExtCss = []; } - }); + /** + * Appends rule to the appropriate collection + * @param rule + */ + CosmeticStylesResult.prototype.append = function (rule) { + if (rule.isGeneric()) { + if (rule.isExtendedCss()) { + this.genericExtCss.push(rule); + } + else { + this.generic.push(rule); + } + } + else if (rule.isExtendedCss()) { + this.specificExtCss.push(rule); + } + else { + this.specific.push(rule); + } + }; + return CosmeticStylesResult; +}()); - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); +/** + * This class stores found script rules content in the appropriate collections + * It is primarily used by the {@see CosmeticResult} + */ +var CosmeticScriptsResult = /** @class */ (function () { + /** + * Constructor + */ + function CosmeticScriptsResult() { + this.generic = []; + this.specific = []; } - } - - // proxy certain important events. - var events = ['error', 'close', 'destroy', 'pause', 'resume']; - forEach(events, function (ev) { - stream.on(ev, self.emit.bind(self, ev)); - }); + /** + * Appends rule to appropriate collection + * @param rule + */ + CosmeticScriptsResult.prototype.append = function (rule) { + if (rule.isGeneric()) { + this.generic.push(rule); + } + else { + this.specific.push(rule); + } + }; + /** + * Returns rules collected + */ + CosmeticScriptsResult.prototype.getRules = function () { + return __spreadArray(__spreadArray([], this.generic, true), this.specific, true); + }; + return CosmeticScriptsResult; +}()); - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); +/** + * This class stores found cosmetic html rules content in the appropriate collections + * It is primarily used by the {@see CosmeticResult} + */ +var CosmeticHtmlResult = /** @class */ (function () { + /** + * Constructor + */ + function CosmeticHtmlResult() { + this.generic = []; + this.specific = []; } - }; - - return self; -}; - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } + /** + * Appends rule to the appropriate collection + * @param rule + */ + CosmeticHtmlResult.prototype.append = function (rule) { + if (rule.isGeneric()) { + this.generic.push(rule); + } + else { + this.specific.push(rule); + } + }; + /** + * Returns rules collected + */ + CosmeticHtmlResult.prototype.getRules = function () { + return __spreadArray(__spreadArray([], this.generic, true), this.specific, true); + }; + return CosmeticHtmlResult; +}()); - return ret; -} +/** + * Cosmetic result is the representation of rules + * It is primarily used by the {@see CosmeticEngine} + */ +var CosmeticResult = /** @class */ (function () { + /** + * Constructor + */ + function CosmeticResult() { + this.elementHiding = new CosmeticStylesResult(); + this.CSS = new CosmeticStylesResult(); + this.JS = new CosmeticScriptsResult(); + this.Html = new CosmeticHtmlResult(); + } + /** + * Script rules + */ + CosmeticResult.prototype.getScriptRules = function () { + return this.JS.getRules(); + }; + return CosmeticResult; +}()); -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} +/** + * CosmeticOption is the enumeration of various content script options. + * Depending on the set of enabled flags the content script will contain different set of settings. + */ +var CosmeticOption; +(function (CosmeticOption) { + /** + * if generic elemhide and CSS rules are enabled + * Could be disabled by a $generichide rule and $elemhide rule. + */ + CosmeticOption[CosmeticOption["CosmeticOptionGenericCSS"] = 2] = "CosmeticOptionGenericCSS"; + /** + * if specific elemhide and CSS rules are enabled + * Could be disabled by a $specifichide rule and $elemhide rule. + */ + CosmeticOption[CosmeticOption["CosmeticOptionSpecificCSS"] = 4] = "CosmeticOptionSpecificCSS"; + /** + * if JS rules and scriptlets are enabled + * Could be disabled by a $jsinject rule. + */ + CosmeticOption[CosmeticOption["CosmeticOptionJS"] = 8] = "CosmeticOptionJS"; + /** + * if Html filtering rules are enabled + * Could be disabled by a $content rule. + */ + CosmeticOption[CosmeticOption["CosmeticOptionHtml"] = 16] = "CosmeticOptionHtml"; + /** + * TODO: Add support for these flags + * They are useful when content script is injected into an iframe + * In this case we can check what flags were applied to the top-level frame + */ + CosmeticOption[CosmeticOption["CosmeticOptionSourceGenericCSS"] = 32] = "CosmeticOptionSourceGenericCSS"; + CosmeticOption[CosmeticOption["CosmeticOptionSourceCSS"] = 64] = "CosmeticOptionSourceCSS"; + CosmeticOption[CosmeticOption["CosmeticOptionSourceJS"] = 128] = "CosmeticOptionSourceJS"; + /** + * everything is enabled + */ + CosmeticOption[CosmeticOption["CosmeticOptionAll"] = 30] = "CosmeticOptionAll"; + /** + * everything is disabled + */ + CosmeticOption[CosmeticOption["CosmeticOptionNone"] = 0] = "CosmeticOptionNone"; +})(CosmeticOption || (CosmeticOption = {})); -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; +/** + * This is a helper class that is used specifically to work + * with domains restrictions. + * + * There are two options how you can add a domain restriction: + * * `$domain` modifier: https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier + * * domains list for the cosmetic rules + * + * The only difference between them is that in one case we use `|` as a separator, + * and in the other case - `,`. + * + * Examples: + * * `||example.org^$domain=example.com|~sub.example.com` -- network rule + * * `example.com,~sub.example.com##banner` -- cosmetic rule + */ +var DomainModifier = /** @class */ (function () { + /** + * Parses the `domains` string and initializes the object. + * + * @param domainsStr Domains string. + * @param separator Separator — `,` or `|`. + * + * @throws An error if the domains string is empty or invalid + */ + function DomainModifier(domainsStr, separator) { + if (!domainsStr) { + throw new SyntaxError('Modifier $domain cannot be empty'); + } + var permittedDomains = []; + var restrictedDomains = []; + var parts = domainsStr.toLowerCase().split(separator); + for (var i = 0; i < parts.length; i += 1) { + var domain = parts[i].trim(); + var restricted = false; + if (domain.startsWith('~')) { + restricted = true; + domain = domain.substring(1); + } + if (domain === '') { + throw new SyntaxError("Empty domain specified in \"".concat(domainsStr, "\"")); + } + if (restricted) { + restrictedDomains.push(domain); + } + else { + permittedDomains.push(domain); + } + } + this.restrictedDomains = restrictedDomains.length > 0 ? restrictedDomains : null; + this.permittedDomains = permittedDomains.length > 0 ? permittedDomains : null; } - ++c; - } - list.length -= c; - return ret; -} + /** + * isDomainOrSubdomainOfAny checks if `domain` is the same or a subdomain + * of any of `domains`. + * + * @param domain - domain to check + * @param domains - domains list to check against + */ + DomainModifier.isDomainOrSubdomainOfAny = function (domain, domains) { + for (var i = 0; i < domains.length; i += 1) { + var d = domains[i]; + if (DomainModifier.isWildcardDomain(d)) { + if (DomainModifier.matchAsWildcard(d, domain)) { + return true; + } + } + if (domain === d || (domain.endsWith(d) && domain.endsWith(".".concat(d)))) { + return true; + } + } + return false; + }; + /** + * Checks if domain ends with wildcard + * + * @param domain + */ + DomainModifier.isWildcardDomain = function (domain) { + return domain.endsWith('.*'); + }; + /** + * Checks if wildcard matches domain + * + * @param wildcard + * @param domainNameToCheck + */ + DomainModifier.matchAsWildcard = function (wildcard, domainNameToCheck) { + var wildcardedDomainToCheck = DomainModifier.genTldWildcard(domainNameToCheck); + if (wildcardedDomainToCheck) { + return wildcardedDomainToCheck === wildcard + || (wildcardedDomainToCheck.endsWith(wildcard) && wildcardedDomainToCheck.endsWith(".".concat(wildcard))); + } + return false; + }; + /** + * Generates from domain tld wildcard e.g. google.com -> google.* ; youtube.co.uk -> youtube.* + * + * @param {string} domainName + * @returns {string} string is empty if tld for provided domain name doesn't exists + */ + DomainModifier.genTldWildcard = function (domainName) { + var tld = getPublicSuffix(domainName); + if (tld) { + // lastIndexOf() is needed not to match the domain, e.g. 'www.chrono24.ch'. + // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2312. + return "".concat(domainName.slice(0, domainName.lastIndexOf(".".concat(tld))), ".*"); + } + return ''; + }; + return DomainModifier; +}()); +/** + * Comma separator + */ +var COMMA_SEPARATOR = ','; +/** + * Pipe separator + */ +var PIPE_SEPARATOR = '|'; -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; +var _a, _b; +/** + * Array of special modifiers allow to check for modifier name more efficient + * by avoiding Object.values(SpecialModifier) calls in custom type-guard while + * allowing the usage of 'const enum' for SpecialModifier + */ +var SpecialModifiers = [ + "replace" /* SpecialModifier.Replace */, + "removeparam" /* SpecialModifier.Removeparam */, + "hls" /* SpecialModifier.Hls */, +]; +var isSpecialModifierToken = function (token) { return token.type === "specialModifier" /* TokenType.SpecialModifier */; }; +/** + * TODO (s.atroschenko) git rid of necessity of adding modifier names for simple regexp values (removaparam, hls): + * use unified 'simple-regexp' pattern instead + */ +var modifiersPatterns = (_a = {}, + _a["replace" /* SpecialModifier.Replace */] = ["regexp" /* Phase.Regexp */, "replacement" /* Phase.Replacement */, "flags" /* Phase.Flags */], + _a["removeparam" /* SpecialModifier.Removeparam */] = ["regexp" /* Phase.Regexp */, "flags" /* Phase.Flags */], + _a["hls" /* SpecialModifier.Hls */] = ["regexp" /* Phase.Regexp */, "flags" /* Phase.Flags */], + _a); +/** + * Extracts modifier's plain value + */ +var parsePlainValue = function (string, startIndex) { + var modifierValue = ''; + var modifierEndIndex = -1; + var chars = []; + for (var i = startIndex; i < string.length; i += 1) { + var c = string[i]; + var isLastChar = i === (string.length - 1); + var isUnescapedChar = i > 0 && !(string[i - 1] === "\\" /* SpecialCharacter.OptionEscape */); + if ((c === "," /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) { + if (isLastChar) { + chars.push(c); + } + modifierValue = chars.join(''); + modifierEndIndex = i; + break; + } + else { + chars.push(c); + } } - ++c; - } - list.length -= c; - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - - if (!state.endEmitted) { - state.ended = true; - nextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } -} - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} - -// A bit simpler than readable streams. -Writable.WritableState = WritableState; -inherits$1(Writable, EventEmitter); - -function nop() {} - -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -function WritableState(options, stream) { - Object.defineProperty(this, 'buffer', { - get: deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') - }); - options = options || {}; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = ~ ~this.highWaterMark; - - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; - - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; - - // a flag to see when we're in the middle of a write. - this.writing = false; - - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function (er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function writableStateGetBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; -function Writable(options) { - - // Writable ctor is applied to Duplexes, though they're not - // instanceof Writable, they're instanceof Readable. - if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - - if (typeof options.writev === 'function') this._writev = options.writev; - } - - EventEmitter.call(this); -} - -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); -}; - -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - nextTick(cb, er); -} - -// If we get something that is not a buffer, string, null, or undefined, -// and we're not in objectMode, then that's an error. -// Otherwise stream chunks are all considered to be of length=1, and the -// watermarks determine how many objects to keep in the buffer, rather than -// how many bytes or characters. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - // Always throw error if a null is written - // if we are not in object mode then throw - // if it is not a buffer, string, or undefined. - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - nextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, chunk, encoding, cb); - } - - return ret; + return { + modifierValue: modifierValue, + modifierEndIndex: modifierEndIndex, + }; }; - -Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; +/** + * Extract modifier's regexp(-like) value + * + * @throws on invalid special modifier value + */ +var parseRegexpValue = function (string, startIndex, pattern) { + var currentPhase; + var nextPhase = (function () { + var i = 0; + return function () { + if (i < pattern.length) { + currentPhase = pattern[i]; + i += 1; + return; + } + // Undefined phase indicates that there were more Regexp delimiters + // than pattern implies and that makes modifier value invalid + throw new Error('Invalid pattern for regexp modifier value.'); + }; + })(); + var modifierValue = ''; + var modifierEndIndex = -1; + var chars = []; + for (var i = startIndex; i < string.length; i += 1) { + var c = string[i]; + var isLastChar = i === (string.length - 1); + var isUnescapedChar = i > 0 && !(string[i - 1] === "\\" /* SpecialCharacter.OptionEscape */); + if (c === "/" /* SpecialCharacter.RegexpDelimiter */ && isUnescapedChar) { + // Step into the next pattern phase + nextPhase(); + } + if ((c === "," /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) { + // Skip unescaped commas that are part of regexp + if (currentPhase === "regexp" /* Phase.Regexp */) { + chars.push(c); + continue; + } + if (isLastChar) { + chars.push(c); + } + // Unescaped delimiter and/or last character indicates + // the end of the modifier value, if current phase is the last one + if (currentPhase === pattern[pattern.length - 1]) { + modifierValue = chars.join(''); + modifierEndIndex = i; + break; + } + else { + throw new Error('Unexpected options delimiter or end of options string.'); + } + } + else { + chars.push(c); + } + } + return { + modifierValue: modifierValue, + modifierEndIndex: modifierEndIndex, + }; }; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } +var modifierValueParsers = (_b = {}, + _b["regexp" /* ModifierValueType.Regexp */] = parseRegexpValue, + _b["plain" /* ModifierValueType.Plain */] = parsePlainValue, + _b); +/** + * Processes raw tokens by splitting token values by delimiter + * + * @param preprocessedTokens array of preprocessed tokens (of TokenType.SpecialModifier | TokenType.Raw type) + * @param delimiter - delimiter + * @param escapeCharacter - escape character + * @param unescape if true, remove escape characters from string + * @returns array of processed tokens + */ +var tokenize = function (preprocessedTokens, delimiter, escapeCharacter, unescape) { + // Split raw tokens + var nestedProcessedTokens = preprocessedTokens + .map(function (token) { + // Modifier tokens are already concrete tokens and are being passed down the pipeline here + if (isSpecialModifierToken(token)) { + return token; + } + var tokenValue = token.value; + var tokens = []; + var chars = []; + var makeToken = function (type) { + tokens.push({ + type: type, + value: chars.join(''), + }); + chars = []; + }; + for (var i = 0; i < tokenValue.length; i += 1) { + var c = tokenValue[i]; + if (c === delimiter) { + var isEscaped = i > 0 && tokenValue[i - 1] === escapeCharacter; + if (isEscaped) { + if (unescape) { + chars.splice(chars.length - 1, 1); + } + chars.push(c); + } + else { + // Don't make token with '' value + // when raw token starts with a delimiter + if (chars.length !== 0) { + makeToken("string" /* TokenType.String */); + } + chars.push(c); + makeToken("delim" /* TokenType.Delimiter */); + } + } + else { + chars.push(c); + // Last character case + if (i === (tokenValue.length - 1)) { + makeToken("string" /* TokenType.String */); + } + } + } + return tokens; + }); + // Flatten the result + var processedTokens = []; + for (var i = 0; i < nestedProcessedTokens.length; i += 1) { + var currentVal = nestedProcessedTokens[i]; + if (Array.isArray(currentVal)) { + processedTokens.push.apply(processedTokens, currentVal); + } + else { + processedTokens.push(currentVal); + } + } + return processedTokens; }; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; +/** + * Converts arrays of tokens into array of their values + * + * @param tokens array of arbitrary tokens + * @returns array of tokens' values + */ +var makeWords = function (tokens) { + var words = []; + for (var i = 0; i < tokens.length; i += 1) { + var token = tokens[i]; + if (token.type !== "delim" /* TokenType.Delimiter */) { + words.push(token.value); + } + } + return words; }; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} - -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, chunk, encoding, cb) { - chunk = decodeChunk(state, chunk, encoding); - - if (Buffer.isBuffer(chunk)) encoding = 'buffer'; - var len = state.objectMode ? 1 : chunk.length; - - state.length += len; - - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) state.needDrain = true; - - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; +/** + * Parses special modifier value + * + * @param modifierName name of modifier to be parsed + * @param string options string + * @returns object with Modifier token value and next index to keep iterating from + */ +function parseSpecialModifier(modifierName, string) { + var tokenValue = "".concat(modifierName).concat("=" /* SpecialCharacter.ModifierValueMarker */); + var modifierValueStartIndex = string.indexOf(tokenValue) + tokenValue.length; + // Define modifier value type + var valueType = string[modifierValueStartIndex] === "/" /* SpecialCharacter.RegexpDelimiter */ + ? "regexp" /* ModifierValueType.Regexp */ + : "plain" /* ModifierValueType.Plain */; + // Pick parser for specific type of modifier value + var parser = modifierValueParsers[valueType]; + // Get pattern of current modifier + var pattern = modifiersPatterns[modifierName]; + var _a = parser(string, modifierValueStartIndex, pattern), modifierValue = _a.modifierValue, modifierEndIndex = _a.modifierEndIndex; + if (modifierEndIndex === -1) { + throw new Error("Invalid $".concat(modifierName, " modifier value.")); } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - if (sync) nextTick(cb, er);else cb(er); - - stream._writableState.errorEmitted = true; - stream.emit('error', er); -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; + tokenValue += modifierValue; + var nextIndex = modifierEndIndex; + return { + tokenValue: tokenValue, + nextIndex: nextIndex, + }; } - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - - onwriteStateUpdate(state); - - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); +/** + * Converts options string into array of Raw and Modifier tokens + * + * @param string options string + * @returns array of preprocessed tokens + */ +function splitBySpecialModifierTokens(string) { + var tokens = []; + var chars = []; + var makeToken = function (tokenType, tokenValue) { + tokens.push({ + type: tokenType, + value: tokenValue, + }); + chars = []; + }; + for (var i = 0; i < string.length; i += 1) { + var c = string[i]; + var isUnescapedChar = i > 0 && !(string[i - 1] === "\\" /* SpecialCharacter.OptionEscape */); + if (c === "=" /* SpecialCharacter.ModifierValueMarker */ && isUnescapedChar) { + // Parse current chars array to get modifier name + // Assume that modifier name is everything after last ',' and before current '=' + var charsStr = chars.join(''); + var lastCommaIndex = charsStr.lastIndexOf("," /* SpecialCharacter.OptionDelimiter */, i); + // Assertion is used to avoid type-guard for SpecialModifier, making it faster, + // and reduce call stack size + var modifierName = charsStr.substring(lastCommaIndex + 1); + // Check if this is modifier that requires custom parsing logic + if (!SpecialModifiers.includes(modifierName)) { + chars.push(c); + // Last character case + if (i === (string.length - 1)) { + makeToken("raw" /* TokenType.Raw */, charsStr); + } + continue; + } + // Remove modifier name from char stack, + // make token from whats left and empty chars + makeToken("raw" /* TokenType.Raw */, charsStr.substring(0, charsStr.lastIndexOf(modifierName))); + // Extract predefined token value and next iteration index + // Token value includes both name, separator('=') and value of modifier + var _a = parseSpecialModifier(modifierName, string), tokenValue = _a.tokenValue, nextIndex = _a.nextIndex; + makeToken("specialModifier" /* TokenType.SpecialModifier */, tokenValue); + i = nextIndex; + } + else { + chars.push(c); + // Last character case + if (i === (string.length - 1)) { + makeToken("raw" /* TokenType.Raw */, chars.join('')); + } + } } - - if (sync) { - /**/ - nextTick(afterWrite, stream, state, finished, cb); - /**/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } + return tokens; } - -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - while (entry) { - buffer[count] = entry; - entry = entry.next; - count += 1; - } - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); +/** + * Splits options string into array of modifier=value pairs + * + * @param string - string to split + * @param unescape - if true, remove escape characters from string + * @return array of string parts + * @throws on invalid special modifier value + */ +function parseOptionsString(string, unescape) { + if (unescape === void 0) { unescape = true; } + if (!string) { + return []; } - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - break; - } + if (string.startsWith("," /* SpecialCharacter.OptionDelimiter */)) { + // eslint-disable-next-line no-param-reassign + string = string.substring(1); } - - if (entry === null) state.lastBufferedRequest = null; - } - - state.bufferedRequestCount = 0; - state.bufferedRequest = entry; - state.bufferProcessing = false; -} - -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('not implemented')); -}; - -Writable.prototype._writev = null; - -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} - -function prefinish(stream, state) { - if (!state.prefinished) { - state.prefinished = true; - stream.emit('prefinish'); - } + /** + * Extract modifier tokens for modifiers that require custom parsing + * https://github.com/AdguardTeam/tsurlfilter/issues/79 + */ + var preprocessedTokens = splitBySpecialModifierTokens(string); + /** + * Split raw tokens by delimiter + */ + var tokens = tokenize(preprocessedTokens, "," /* SpecialCharacter.OptionDelimiter */, "\\" /* SpecialCharacter.OptionEscape */, unescape); + /** + * Join tokens into words + */ + return makeWords(tokens); } -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - if (state.pendingcb === 0) { - prefinish(stream, state); - state.finished = true; - stream.emit('finish'); - } else { - prefinish(stream, state); +/** + * Replace modifier class + */ +var ReplaceModifier = /** @class */ (function () { + /** + * Constructor + * + * @param value + */ + function ReplaceModifier(value) { + var parsed = ReplaceModifier.parseReplaceOption(value); + this.replaceOption = parsed.optionText; + this.replaceApply = parsed.apply; } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) nextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} + /** + * + * @param option + */ + ReplaceModifier.parseReplaceOption = function (option) { + if (!option) { + return { + apply: function (x) { return x; }, + optionText: '', + }; + } + var parts = splitByDelimiterWithEscapeCharacter(option, '/', '\\', true); + var modifiers = (parts[2] || ''); + if (modifiers.indexOf('g') < 0) { + modifiers += 'g'; + } + var pattern = new RegExp(parts[0], modifiers); + // unescape replacement alias + var replacement = parts[1].replace(/\\\$/g, '$'); + replacement = SimpleRegex.unescapeSpecials(replacement); + var apply = function (input) { return input.replace(pattern, replacement); }; + return { + apply: apply, + optionText: option, + }; + }; + /** + * Replace content + */ + ReplaceModifier.prototype.getValue = function () { + return this.replaceOption; + }; + /** + * Replace apply function + */ + ReplaceModifier.prototype.getApplyFunc = function () { + return this.replaceApply; + }; + return ReplaceModifier; +}()); -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - - this.finish = function (err) { - var entry = _this.entry; - _this.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = _this; - } else { - state.corkedRequestsFree = _this; +/** + * Csp modifier class + */ +var CspModifier = /** @class */ (function () { + /** + * Constructor + * + * @param value + * @param isAllowlist + */ + function CspModifier(value, isAllowlist) { + this.cspDirective = value; + this.isAllowlist = isAllowlist; + this.validateCspDirective(); } - }; -} - -inherits$1(Duplex, Readable); - -var keys = Object.keys(Writable.prototype); -for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; -} -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - - this.once('end', onend); -} - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. - // But allow more writes to happen in this tick. - nextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -// a transform stream is a readable/writable stream where you do -inherits$1(Transform, Duplex); - -function TransformState(stream) { - this.afterTransform = function (er, data) { - return afterTransform(stream, er, data); - }; - - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; - this.writeencoding = null; -} - -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); - - ts.writechunk = null; - ts.writecb = null; - - if (data !== null && data !== undefined) stream.push(data); - - cb(er); - - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = new TransformState(this); - - // when the writable side finishes, then flush out anything remaining. - var stream = this; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - this.once('prefinish', function () { - if (typeof this._flush === 'function') this._flush(function (er) { - done(stream, er); - });else done(stream); - }); -} - -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('Not implemented'); -}; - -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - -function done(stream, er) { - if (er) return stream.emit('error', er); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var ts = stream._transformState; - - if (ws.length) throw new Error('Calling transform done when ws.length != 0'); - - if (ts.transforming) throw new Error('Calling transform done when still transforming'); + /** + * Csp directive + */ + CspModifier.prototype.getValue = function () { + return this.cspDirective; + }; + /** + * Validates CSP rule + */ + CspModifier.prototype.validateCspDirective = function () { + /** + * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685 + * CSP directive may be empty in case of allowlist rule, + * it means to disable all $csp rules matching the allowlist rule + */ + if (!this.isAllowlist && !this.cspDirective) { + throw new Error('Invalid $CSP rule: CSP directive must not be empty'); + } + if (this.cspDirective) { + /** + * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685#issue-228287090 + * Forbids report-to and report-uri directives + */ + var cspDirective = this.cspDirective.toLowerCase(); + if (cspDirective.indexOf('report-') >= 0) { + throw new Error("Forbidden CSP directive: ".concat(cspDirective)); + } + } + }; + return CspModifier; +}()); - return stream.push(null); -} +/** + * Cookie modifier class + * + * Learn more about it here: + * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/961 + */ +var CookieModifier = /** @class */ (function () { + /** + * Constructor + * + * @param value + */ + function CookieModifier(value) { + // Save the source text of the option modifier + this.optionValue = value || ''; + this.regex = null; + this.cookieName = null; + this.sameSite = null; + this.maxAge = null; + // Parse cookie name/regex + var parts = this.optionValue.split(/;/); + if (parts.length < 1) { + throw new Error("Cannot parse ".concat(this.optionValue)); + } + var cookieName = parts[0]; + if (cookieName.startsWith('/') && cookieName.endsWith('/')) { + var pattern = cookieName.substring(1, cookieName.length - 1); + // Save regex to be used further for matching cookies + this.regex = new RegExp(pattern); + } + else { + // Match by cookie name + this.cookieName = cookieName; + } + // Parse other cookie options + if (parts.length > 1) { + for (var i = 1; i < parts.length; i += 1) { + var nameValue = parts[i].split('='); + var optionName = nameValue[0]; + var optionValue = nameValue[1]; + if (optionName === CookieModifier.MAX_AGE) { + this.maxAge = parseInt(optionValue, 10); + } + else if (optionName === CookieModifier.SAME_SITE) { + this.sameSite = optionValue; + } + else { + throw new Error("Unknown $cookie option: ".concat(optionName)); + } + } + } + } + /** + * Modifier value + */ + CookieModifier.prototype.getValue = function () { + return this.optionValue; + }; + /** + * First cookie name + */ + CookieModifier.prototype.getCookieName = function () { + return this.cookieName; + }; + /** + * Max age cookie value + */ + CookieModifier.prototype.getMaxAge = function () { + return this.maxAge; + }; + /** + * Same site cookie value + */ + CookieModifier.prototype.getSameSite = function () { + return this.sameSite; + }; + /** + * Checks if cookie with the specified name matches this option + * + * @param {string} name Cookie name + * @return {boolean} true if it does + */ + CookieModifier.prototype.matches = function (name) { + if (!name) { + return false; + } + if (this.regex) { + return this.regex.test(name); + } + if (this.cookieName) { + return this.cookieName === name; + } + // Empty regex and cookieName means that we must match all cookies + return true; + }; + /** + * Checks if cookie rule has an empty $cookie option + * + * @return {boolean} True if $cookie option is empty + */ + CookieModifier.prototype.isEmpty = function () { + return !this.regex && !this.cookieName; + }; + /** + * Cookie name maxAge + */ + CookieModifier.MAX_AGE = 'maxAge'; + /** + * Cookie name sameSite + */ + CookieModifier.SAME_SITE = 'sameSite'; + return CookieModifier; +}()); -inherits$1(PassThrough, Transform); -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); +/** + * Redirect modifier class + */ +var RedirectModifier = /** @class */ (function () { + /** + * Constructor + * + * @param value + * @param ruleText + * @param isAllowlist + * @param isRedirectingOnlyBlocked is redirect-rule modifier + */ + function RedirectModifier(value, ruleText, isAllowlist, isRedirectingOnlyBlocked) { + if (isRedirectingOnlyBlocked === void 0) { isRedirectingOnlyBlocked = false; } + /** + * Is redirecting only blocked requests + * See $redirect-rule options + */ + this.isRedirectingOnlyBlocked = false; + RedirectModifier.validate(ruleText, value, isAllowlist); + this.redirectTitle = value; + this.isRedirectingOnlyBlocked = isRedirectingOnlyBlocked; + } + /** + * Redirect title + */ + RedirectModifier.prototype.getValue = function () { + return this.redirectTitle; + }; + /** + * Validates redirect rule + * + * @param ruleText + * @param redirectTitle + * @param isAllowlist + */ + RedirectModifier.validate = function (ruleText, redirectTitle, isAllowlist) { + if (isAllowlist && !redirectTitle) { + return; + } + if (!redirectTitle) { + throw new SyntaxError('Invalid $redirect rule, redirect value must not be empty'); + } + var redirects = (scriptlets_umd_default()).redirects; + var ruleTextToValidate = ruleText.replace(NETWORK_RULE_OPTIONS.REDIRECTRULE, NETWORK_RULE_OPTIONS.REDIRECT); + if (!redirects.isAdgRedirectRule(ruleTextToValidate) || !redirects.isValidAdgRedirectRule(ruleTextToValidate)) { + throw new SyntaxError('$redirect modifier is invalid'); + } + }; + return RedirectModifier; +}()); - Transform.call(this, options); +/** + * Splits url into parts + * + * @param url + */ +function splitUrl(url) { + var strippedUrl = url; + var hash = ''; + var hashIndex = url.indexOf('#'); + if (hashIndex >= 0) { + hash = url.slice(hashIndex); + strippedUrl = url.slice(0, hashIndex); + } + var query = ''; + var queryIndex = url.indexOf('?'); + if (queryIndex >= 0) { + query = strippedUrl.slice(queryIndex + 1); + strippedUrl = strippedUrl.slice(0, queryIndex); + } + return { + path: strippedUrl, + query: query, + hash: hash, + }; } - -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; - -inherits$1(Stream$1, EventEmitter); -Stream$1.Readable = Readable; -Stream$1.Writable = Writable; -Stream$1.Duplex = Duplex; -Stream$1.Transform = Transform; -Stream$1.PassThrough = PassThrough; - -// Backwards-compat with node 0.4.x -Stream$1.Stream = Stream$1; - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream$1() { - EventEmitter.call(this); +/** + * Normalizes url query parameters + * + * @param query + */ +function normalizeQuery(query) { + // Cleanup empty params (p0=0&=2&=3) + var result = query + .split('&') + .filter(function (x) { return x && !x.startsWith('='); }) + .join('&'); + // If we've collapsed the URL to the point where there's an '&' against the '?' + // then we need to get rid of that. + while (result.charAt(0) === '&') { + result = result.substr(1); + } + return result; } - -Stream$1.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } +/** + * Removes query params from url by regexp + * + * @param url + * @param regExp + * @param invert remove every parameter in url except the ones matched regexp + */ +function cleanUrlParamByRegExp(url, regExp, invert) { + if (invert === void 0) { invert = false; } + var searchIndex = url.indexOf('?'); + // If no params, nothing to modify + if (searchIndex === -1) { + return url; } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); + var split = splitUrl(url); + var modifiedQuery; + if (invert) { + modifiedQuery = split.query + .split('&') + .filter(function (x) { return x; }) + .filter(function (x) { return x && x.match(regExp); }) + .join('&'); } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EventEmitter.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. + else { + modifiedQuery = split.query + .split('&') + .filter(function (x) { + var test = x.includes('=') ? x : "".concat(x, "="); + return !test.match(regExp); + }) + .join('&'); } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; + // Do not normalize if regexp is not applied + if (modifiedQuery === split.query) { + return url; + } + modifiedQuery = normalizeQuery(modifiedQuery); + var result = split.path; + if (modifiedQuery) { + result += "?".concat(modifiedQuery); + } + return result + split.hash; +} +var DOMAIN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$/; +/** + * Check if the string could be a domain name + * + * @param text + */ +var isDomainName = function (text) { + if (text.indexOf('.') < 0 || text.endsWith('.')) { + return false; + } + return DOMAIN_REGEX.test(text); +}; +/** + * Extract relative part from hierarchical structured URL + * @param url + */ +var getRelativeUrl = function (url) { + var i = url.indexOf('/', url.indexOf('://') + 3); + return i !== -1 ? url.substr(i) : null; }; -var _polyfillNode_stream = /*#__PURE__*/Object.freeze({ - __proto__: null, - 'default': Stream$1, - Readable: Readable, - Writable: Writable, - Duplex: Duplex, - Transform: Transform, - PassThrough: PassThrough, - Stream: Stream$1 -}); - -var require$$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_stream); - -var require$$2 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_util$1); - -var assert$1 = require$$0; -var Stream = require$$1.Stream; -var util$2 = require$$2; -var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; -function _capitalize(str) { - return (str.charAt(0).toUpperCase() + str.slice(1)); -} -function _toss(name, expected, oper, arg, actual) { - throw new assert$1.AssertionError({ - message: util$2.format('%s (%s) is required', name, expected), - actual: (actual === undefined) ? typeof (arg) : actual(arg), - expected: expected, - operator: oper || '===', - stackStartFunction: _toss.caller - }); -} -function _getClass(arg) { - return (Object.prototype.toString.call(arg).slice(8, -1)); -} -function noop() { -} -var types = { - bool: { - check: function (arg) { return typeof (arg) === 'boolean'; } - }, - func: { - check: function (arg) { return typeof (arg) === 'function'; } - }, - string: { - check: function (arg) { return typeof (arg) === 'string'; } - }, - object: { - check: function (arg) { - return typeof (arg) === 'object' && arg !== null; - } - }, - number: { - check: function (arg) { - return typeof (arg) === 'number' && !isNaN(arg); +/** + * Query parameters filtering modifier class + * Works with '$removeparam' modifier + */ +var RemoveParamModifier = /** @class */ (function () { + /** + * Constructor + * + * @param value + */ + function RemoveParamModifier(value) { + /** + * Is modifier valid for MV3 or not + */ + this.mv3Valid = true; + this.value = value; + var rawValue = value; + // TODO: Seems like negation not using in valueRegExp + if (value.startsWith('~')) { + rawValue = value.substring(1); + this.mv3Valid = false; } - }, - finite: { - check: function (arg) { - return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); + if (rawValue.startsWith('/')) { + this.valueRegExp = SimpleRegex.patternFromString(rawValue); + this.mv3Valid = false; } - }, - buffer: { - check: function (arg) { return isBuffer$2(arg); }, - operator: 'Buffer.isBuffer' - }, - array: { - check: function (arg) { return Array.isArray(arg); }, - operator: 'Array.isArray' - }, - stream: { - check: function (arg) { return arg instanceof Stream; }, - operator: 'instanceof', - actual: _getClass - }, - date: { - check: function (arg) { return arg instanceof Date; }, - operator: 'instanceof', - actual: _getClass - }, - regexp: { - check: function (arg) { return arg instanceof RegExp; }, - operator: 'instanceof', - actual: _getClass - }, - uuid: { - check: function (arg) { - return typeof (arg) === 'string' && UUID_REGEXP.test(arg); - }, - operator: 'isUUID' - } -}; -function _setExports(ndebug) { - var keys = Object.keys(types); - var out; - if (process.env.NODE_NDEBUG) { - out = noop; - } else { - out = function (arg, msg) { - if (!arg) { - _toss(msg, 'true', arg); + else { + if (rawValue.includes('|')) { + throw new Error('Unsupported option in $removeparam: multiple values are not allowed'); } - }; + this.valueRegExp = new RegExp("((^|&)(".concat(SimpleRegex.escapeRegexSpecials(rawValue), ")=[^&#]*)"), 'g'); + } } - keys.forEach(function (k) { - if (ndebug) { - out[k] = noop; - return; + /** + * Modifier value + */ + RemoveParamModifier.prototype.getValue = function () { + return this.value; + }; + /** + * Is modifier valid for MV3 or not + */ + RemoveParamModifier.prototype.getMV3Validity = function () { + return this.mv3Valid; + }; + /** + * Removes query parameters from url + * + * @param url + */ + RemoveParamModifier.prototype.removeParameters = function (url) { + var sepIndex = url.indexOf('?'); + if (sepIndex < 0) { + return url; } - var type = types[k]; - out[k] = function (arg, msg) { - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - keys.forEach(function (k) { - var name = 'optional' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; + if (!this.value) { + return url.substring(0, sepIndex); } - var type = types[k]; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - keys.forEach(function (k) { - var name = 'arrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; + if (sepIndex === url.length - 1) { + return url; } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; - }); - keys.forEach(function (k) { - var name = 'optionalArrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; + if (this.value.startsWith('~')) { + return cleanUrlParamByRegExp(url, this.valueRegExp, true); } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; + return cleanUrlParamByRegExp(url, this.valueRegExp); + }; + return RemoveParamModifier; +}()); + +/** + * Headers filtering modifier class. + * Rules with $removeheader modifier are intended to remove headers from HTTP requests and responses. + */ +var RemoveHeaderModifier = /** @class */ (function () { + /** + * Constructor + * + * @param value + * @param isAllowlist + */ + function RemoveHeaderModifier(value, isAllowlist) { + this.value = value.toLowerCase(); + if (!isAllowlist && !this.value) { + throw new SyntaxError('Invalid $removeheader rule, removeheader value must not be empty'); + } + this.isRequestModifier = this.value.startsWith(RemoveHeaderModifier.REQUEST_PREFIX); + var headerName = this.isRequestModifier + ? this.value.substring(RemoveHeaderModifier.REQUEST_PREFIX.length) + : this.value; + // Values with ":" are not supported in MV3 declarative rules, e.g. "$removeheader=dnt:1" + this.valid = RemoveHeaderModifier.isAllowedHeader(headerName) && !headerName.includes(':'); + this.applicableHeaderName = this.valid ? headerName : null; + } + /** + * Modifier value + */ + RemoveHeaderModifier.prototype.getValue = function () { + return this.value; + }; + Object.defineProperty(RemoveHeaderModifier.prototype, "isValid", { + /** + * Modifier validity + */ + get: function () { + return this.valid; + }, + enumerable: false, + configurable: true }); - Object.keys(assert$1).forEach(function (k) { - if (k === 'AssertionError') { - out[k] = assert$1[k]; - return; + /** + * Returns effective header name to be removed + * + * @param isRequestHeaders + */ + RemoveHeaderModifier.prototype.getApplicableHeaderName = function (isRequestHeaders) { + if (!this.applicableHeaderName) { + return null; } - if (ndebug) { - out[k] = noop; - return; + if (isRequestHeaders !== this.isRequestModifier) { + return null; } - out[k] = assert$1[k]; - }); - out._setExports = _setExports; - return out; -} -var assert_1 = _setExports(process.env.NODE_NDEBUG); - -var jsprim$1 = {}; - -var extsprintf$1 = {}; - -var mod_assert$2 = require$$0; -var mod_util$2 = require$$2; -extsprintf$1.sprintf = jsSprintf$1; -extsprintf$1.printf = jsPrintf$1; -extsprintf$1.fprintf = jsFprintf$1; -function jsSprintf$1(fmt) -{ - var regex = [ - '([^%]*)', - '%', - '([\'\\-+ #0]*?)', - '([1-9]\\d*)?', - '(\\.([1-9]\\d*))?', - '[lhjztL]*?', - '([diouxXfFeEgGaAcCsSp%jr])' - ].join(''); - var re = new RegExp(regex); - var args = Array.prototype.slice.call(arguments, 1); - var flags, width, precision, conversion; - var left, pad, sign, arg, match; - var ret = ''; - var argn = 1; - mod_assert$2.equal('string', typeof (fmt)); - while ((match = re.exec(fmt)) !== null) { - ret += match[1]; - fmt = fmt.substring(match[0].length); - flags = match[2] || ''; - width = match[3] || 0; - precision = match[4] || ''; - conversion = match[6]; - left = false; - sign = false; - pad = ' '; - if (conversion == '%') { - ret += '%'; - continue; - } - if (args.length === 0) - throw (new Error('too few args to sprintf')); - arg = args.shift(); - argn++; - if (flags.match(/[\' #]/)) - throw (new Error( - 'unsupported flags: ' + flags)); - if (precision.length > 0) - throw (new Error( - 'non-zero precision not supported')); - if (flags.match(/-/)) - left = true; - if (flags.match(/0/)) - pad = '0'; - if (flags.match(/\+/)) - sign = true; - switch (conversion) { - case 's': - if (arg === undefined || arg === null) - throw (new Error('argument ' + argn + - ': attempted to print undefined or null ' + - 'as a string')); - ret += doPad$1(pad, width, left, arg.toString()); - break; - case 'd': - arg = Math.floor(arg); - case 'f': - sign = sign && arg > 0 ? '+' : ''; - ret += sign + doPad$1(pad, width, left, - arg.toString()); - break; - case 'x': - ret += doPad$1(pad, width, left, arg.toString(16)); - break; - case 'j': - if (width === 0) - width = 10; - ret += mod_util$2.inspect(arg, false, width); - break; - case 'r': - ret += dumpException$1(arg); - break; - default: - throw (new Error('unsupported conversion: ' + - conversion)); - } - } - ret += fmt; - return (ret); -} -function jsPrintf$1() { - var args = Array.prototype.slice.call(arguments); - args.unshift(process.stdout); - jsFprintf$1.apply(null, args); -} -function jsFprintf$1(stream) { - var args = Array.prototype.slice.call(arguments, 1); - return (stream.write(jsSprintf$1.apply(this, args))); -} -function doPad$1(chr, width, left, str) -{ - var ret = str; - while (ret.length < width) { - if (left) - ret += chr; - else - ret = chr + ret; - } - return (ret); -} -function dumpException$1(ex) -{ - var ret; - if (!(ex instanceof Error)) - throw (new Error(jsSprintf$1('invalid type for %%r: %j', ex))); - ret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack; - if (ex.cause && typeof (ex.cause) === 'function') { - var cex = ex.cause(); - if (cex) { - ret += '\nCaused by: ' + dumpException$1(cex); - } - } - return (ret); -} - -var extsprintf = {}; - -var mod_assert$1 = require$$0; -var mod_util$1 = require$$2; -extsprintf.sprintf = jsSprintf; -extsprintf.printf = jsPrintf; -extsprintf.fprintf = jsFprintf; -function jsSprintf(ofmt) -{ - var regex = [ - '([^%]*)', - '%', - '([\'\\-+ #0]*?)', - '([1-9]\\d*)?', - '(\\.([1-9]\\d*))?', - '[lhjztL]*?', - '([diouxXfFeEgGaAcCsSp%jr])' - ].join(''); - var re = new RegExp(regex); - var args = Array.prototype.slice.call(arguments, 1); - var fmt = ofmt; - var flags, width, precision, conversion; - var left, pad, sign, arg, match; - var ret = ''; - var argn = 1; - var posn = 0; - var convposn; - var curconv; - mod_assert$1.equal('string', typeof (fmt), - 'first argument must be a format string'); - while ((match = re.exec(fmt)) !== null) { - ret += match[1]; - fmt = fmt.substring(match[0].length); - curconv = match[0].substring(match[1].length); - convposn = posn + match[1].length + 1; - posn += match[0].length; - flags = match[2] || ''; - width = match[3] || 0; - precision = match[4] || ''; - conversion = match[6]; - left = false; - sign = false; - pad = ' '; - if (conversion == '%') { - ret += '%'; - continue; - } - if (args.length === 0) { - throw (jsError(ofmt, convposn, curconv, - 'has no matching argument ' + - '(too few arguments passed)')); - } - arg = args.shift(); - argn++; - if (flags.match(/[\' #]/)) { - throw (jsError(ofmt, convposn, curconv, - 'uses unsupported flags')); - } - if (precision.length > 0) { - throw (jsError(ofmt, convposn, curconv, - 'uses non-zero precision (not supported)')); - } - if (flags.match(/-/)) - left = true; - if (flags.match(/0/)) - pad = '0'; - if (flags.match(/\+/)) - sign = true; - switch (conversion) { - case 's': - if (arg === undefined || arg === null) { - throw (jsError(ofmt, convposn, curconv, - 'attempted to print undefined or null ' + - 'as a string (argument ' + argn + ' to ' + - 'sprintf)')); - } - ret += doPad(pad, width, left, arg.toString()); - break; - case 'd': - arg = Math.floor(arg); - case 'f': - sign = sign && arg > 0 ? '+' : ''; - ret += sign + doPad(pad, width, left, - arg.toString()); - break; - case 'x': - ret += doPad(pad, width, left, arg.toString(16)); - break; - case 'j': - if (width === 0) - width = 10; - ret += mod_util$1.inspect(arg, false, width); - break; - case 'r': - ret += dumpException(arg); - break; - default: - throw (jsError(ofmt, convposn, curconv, - 'is not supported')); - } - } - ret += fmt; - return (ret); -} -function jsError(fmtstr, convposn, curconv, reason) { - mod_assert$1.equal(typeof (fmtstr), 'string'); - mod_assert$1.equal(typeof (curconv), 'string'); - mod_assert$1.equal(typeof (convposn), 'number'); - mod_assert$1.equal(typeof (reason), 'string'); - return (new Error('format string "' + fmtstr + - '": conversion specifier "' + curconv + '" at character ' + - convposn + ' ' + reason)); -} -function jsPrintf() { - var args = Array.prototype.slice.call(arguments); - args.unshift(process.stdout); - jsFprintf.apply(null, args); -} -function jsFprintf(stream) { - var args = Array.prototype.slice.call(arguments, 1); - return (stream.write(jsSprintf.apply(this, args))); -} -function doPad(chr, width, left, str) -{ - var ret = str; - while (ret.length < width) { - if (left) - ret += chr; - else - ret = chr + ret; - } - return (ret); -} -function dumpException(ex) -{ - var ret; - if (!(ex instanceof Error)) - throw (new Error(jsSprintf('invalid type for %%r: %j', ex))); - ret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack; - if (ex.cause && typeof (ex.cause) === 'function') { - var cex = ex.cause(); - if (cex) { - ret += '\nCaused by: ' + dumpException(cex); - } - } - return (ret); -} - -var util$1 = {}; - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -util$1.isArray = isArray; -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -util$1.isBoolean = isBoolean; -function isNull(arg) { - return arg === null; -} -util$1.isNull = isNull; -function isNullOrUndefined(arg) { - return arg == null; -} -util$1.isNullOrUndefined = isNullOrUndefined; -function isNumber(arg) { - return typeof arg === 'number'; -} -util$1.isNumber = isNumber; -function isString(arg) { - return typeof arg === 'string'; -} -util$1.isString = isString; -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -util$1.isSymbol = isSymbol; -function isUndefined(arg) { - return arg === void 0; -} -util$1.isUndefined = isUndefined; -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -util$1.isRegExp = isRegExp; -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -util$1.isObject = isObject; -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -util$1.isDate = isDate; -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -util$1.isError = isError; -function isFunction(arg) { - return typeof arg === 'function'; -} -util$1.isFunction = isFunction; -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || - typeof arg === 'undefined'; -} -util$1.isPrimitive = isPrimitive; -util$1.isBuffer = isBuffer$2; -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -var mod_assertplus = assert_1; -var mod_util = require$$2; -var mod_extsprintf$1 = extsprintf; -var mod_isError = util$1.isError; -var sprintf = mod_extsprintf$1.sprintf; -var verror = VError; -VError.VError = VError; -VError.SError = SError; -VError.WError = WError; -VError.MultiError = MultiError; -function parseConstructorArguments(args) -{ - var argv, options, sprintf_args, shortmessage, k; - mod_assertplus.object(args, 'args'); - mod_assertplus.bool(args.strict, 'args.strict'); - mod_assertplus.array(args.argv, 'args.argv'); - argv = args.argv; - if (argv.length === 0) { - options = {}; - sprintf_args = []; - } else if (mod_isError(argv[0])) { - options = { 'cause': argv[0] }; - sprintf_args = argv.slice(1); - } else if (typeof (argv[0]) === 'object') { - options = {}; - for (k in argv[0]) { - options[k] = argv[0][k]; - } - sprintf_args = argv.slice(1); - } else { - mod_assertplus.string(argv[0], - 'first argument to VError, SError, or WError ' + - 'constructor must be a string, object, or Error'); - options = {}; - sprintf_args = argv; - } - mod_assertplus.object(options); - if (!options.strict && !args.strict) { - sprintf_args = sprintf_args.map(function (a) { - return (a === null ? 'null' : - a === undefined ? 'undefined' : a); - }); - } - if (sprintf_args.length === 0) { - shortmessage = ''; - } else { - shortmessage = sprintf.apply(null, sprintf_args); - } - return ({ - 'options': options, - 'shortmessage': shortmessage - }); -} -function VError() -{ - var args, obj, parsed, cause, ctor, message, k; - args = Array.prototype.slice.call(arguments, 0); - if (!(this instanceof VError)) { - obj = Object.create(VError.prototype); - VError.apply(obj, arguments); - return (obj); - } - parsed = parseConstructorArguments({ - 'argv': args, - 'strict': false - }); - if (parsed.options.name) { - mod_assertplus.string(parsed.options.name, - 'error\'s "name" must be a string'); - this.name = parsed.options.name; - } - this.jse_shortmsg = parsed.shortmessage; - message = parsed.shortmessage; - cause = parsed.options.cause; - if (cause) { - mod_assertplus.ok(mod_isError(cause), 'cause is not an Error'); - this.jse_cause = cause; - if (!parsed.options.skipCauseMessage) { - message += ': ' + cause.message; - } - } - this.jse_info = {}; - if (parsed.options.info) { - for (k in parsed.options.info) { - this.jse_info[k] = parsed.options.info[k]; - } - } - this.message = message; - Error.call(this, message); - if (Error.captureStackTrace) { - ctor = parsed.options.constructorOpt || this.constructor; - Error.captureStackTrace(this, ctor); - } - return (this); -} -mod_util.inherits(VError, Error); -VError.prototype.name = 'VError'; -VError.prototype.toString = function ve_toString() -{ - var str = (this.hasOwnProperty('name') && this.name || - this.constructor.name || this.constructor.prototype.name); - if (this.message) - str += ': ' + this.message; - return (str); -}; -VError.prototype.cause = function ve_cause() -{ - var cause = VError.cause(this); - return (cause === null ? undefined : cause); -}; -VError.cause = function (err) -{ - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - return (mod_isError(err.jse_cause) ? err.jse_cause : null); -}; -VError.info = function (err) -{ - var rv, cause, k; - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - cause = VError.cause(err); - if (cause !== null) { - rv = VError.info(cause); - } else { - rv = {}; - } - if (typeof (err.jse_info) == 'object' && err.jse_info !== null) { - for (k in err.jse_info) { - rv[k] = err.jse_info[k]; - } - } - return (rv); -}; -VError.findCauseByName = function (err, name) -{ - var cause; - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - mod_assertplus.string(name, 'name'); - mod_assertplus.ok(name.length > 0, 'name cannot be empty'); - for (cause = err; cause !== null; cause = VError.cause(cause)) { - mod_assertplus.ok(mod_isError(cause)); - if (cause.name == name) { - return (cause); - } - } - return (null); -}; -VError.hasCauseWithName = function (err, name) -{ - return (VError.findCauseByName(err, name) !== null); -}; -VError.fullStack = function (err) -{ - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - var cause = VError.cause(err); - if (cause) { - return (err.stack + '\ncaused by: ' + VError.fullStack(cause)); - } - return (err.stack); -}; -VError.errorFromList = function (errors) -{ - mod_assertplus.arrayOfObject(errors, 'errors'); - if (errors.length === 0) { - return (null); - } - errors.forEach(function (e) { - mod_assertplus.ok(mod_isError(e)); - }); - if (errors.length == 1) { - return (errors[0]); - } - return (new MultiError(errors)); -}; -VError.errorForEach = function (err, func) -{ - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - mod_assertplus.func(func, 'func'); - if (err instanceof MultiError) { - err.errors().forEach(function iterError(e) { func(e); }); - } else { - func(err); - } -}; -function SError() -{ - var args, obj, parsed, options; - args = Array.prototype.slice.call(arguments, 0); - if (!(this instanceof SError)) { - obj = Object.create(SError.prototype); - SError.apply(obj, arguments); - return (obj); - } - parsed = parseConstructorArguments({ - 'argv': args, - 'strict': true - }); - options = parsed.options; - VError.call(this, options, '%s', parsed.shortmessage); - return (this); -} -mod_util.inherits(SError, VError); -function MultiError(errors) -{ - mod_assertplus.array(errors, 'list of errors'); - mod_assertplus.ok(errors.length > 0, 'must be at least one error'); - this.ase_errors = errors; - VError.call(this, { - 'cause': errors[0] - }, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's'); -} -mod_util.inherits(MultiError, VError); -MultiError.prototype.name = 'MultiError'; -MultiError.prototype.errors = function me_errors() -{ - return (this.ase_errors.slice(0)); -}; -function WError() -{ - var args, obj, parsed, options; - args = Array.prototype.slice.call(arguments, 0); - if (!(this instanceof WError)) { - obj = Object.create(WError.prototype); - WError.apply(obj, args); - return (obj); - } - parsed = parseConstructorArguments({ - 'argv': args, - 'strict': false - }); - options = parsed.options; - options['skipCauseMessage'] = true; - VError.call(this, options, '%s', parsed.shortmessage); - return (this); -} -mod_util.inherits(WError, VError); -WError.prototype.name = 'WError'; -WError.prototype.toString = function we_toString() -{ - var str = (this.hasOwnProperty('name') && this.name || - this.constructor.name || this.constructor.prototype.name); - if (this.message) - str += ': ' + this.message; - if (this.jse_cause && this.jse_cause.message) - str += '; caused by ' + this.jse_cause.toString(); - return (str); -}; -WError.prototype.cause = function we_cause(c) -{ - if (mod_isError(c)) - this.jse_cause = c; - return (this.jse_cause); -}; - -var validate = {exports: {}}; + return this.applicableHeaderName; + }; + /** + * Some headers are forbidden to remove + * + * @param headerName + */ + RemoveHeaderModifier.isAllowedHeader = function (headerName) { + return !this.FORBIDDEN_HEADERS.includes(headerName); + }; + /** + * List of forbidden headers + */ + RemoveHeaderModifier.FORBIDDEN_HEADERS = [ + 'access-control-allow-origin', + 'access-control-allow-credentials', + 'access-control-allow-headers', + 'access-control-allow-methods', + 'access-control-expose-headers', + 'access-control-max-age', + 'access-control-request-headers', + 'access-control-request-method', + 'origin', + 'timing-allow-origin', + 'allow', + 'cross-origin-embedder-policy', + 'cross-origin-opener-policy', + 'cross-origin-resource-policy', + 'content-security-policy', + 'content-security-policy-report-only', + 'expect-ct', + 'feature-policy', + 'origin-isolation', + 'strict-transport-security', + 'upgrade-insecure-requests', + 'x-content-type-options', + 'x-download-options', + 'x-frame-options', + 'x-permitted-cross-domain-policies', + 'x-powered-by', + 'x-xss-protection', + 'public-key-pins', + 'public-key-pins-report-only', + 'sec-websocket-key', + 'sec-websocket-extensions', + 'sec-websocket-accept', + 'sec-websocket-protocol', + 'sec-websocket-version', + 'p3p', + 'sec-fetch-mode', + 'sec-fetch-dest', + 'sec-fetch-site', + 'sec-fetch-user', + 'referrer-policy', + 'content-type', + 'content-length', + 'accept', + 'accept-encoding', + 'host', + 'connection', + 'transfer-encoding', + 'upgrade', + ]; + /** + * Request prefix + */ + RemoveHeaderModifier.REQUEST_PREFIX = 'request:'; + return RemoveHeaderModifier; +}()); -(function (module) { - (function (root, factory) { - if (module.exports) { - module.exports = factory(); - } else { - root.jsonSchema = factory(); - } - }(commonjsGlobal, function () { - var exports = validate; - exports.Integer = {type:"integer"}; - var primitiveConstructors = { - String: String, - Boolean: Boolean, - Number: Number, - Object: Object, - Array: Array, - Date: Date - }; - exports.validate = validate; - function validate(instance,schema) { - return validate(instance, schema, {changing: false}); - } exports.checkPropertyChange = function(value,schema, property) { - return validate(value, schema, {changing: property || "property"}); - }; - var validate = exports._validate = function(instance,schema,options) { - if (!options) options = {}; - var _changing = options.changing; - function getType(schema){ - return schema.type || (primitiveConstructors[schema.name] == schema && schema.name.toLowerCase()); - } - var errors = []; - function checkProp(value, schema, path,i){ - var l; - path += path ? typeof i == 'number' ? '[' + i + ']' : typeof i == 'undefined' ? '' : '.' + i : i; - function addError(message){ - errors.push({property:path,message:message}); - } - if((typeof schema != 'object' || schema instanceof Array) && (path || typeof schema != 'function') && !(schema && getType(schema))){ - if(typeof schema == 'function'){ - if(!(value instanceof schema)){ - addError("is not an instance of the class/constructor " + schema.name); - } - }else if(schema){ - addError("Invalid schema/property definition " + schema); - } - return null; - } - if(_changing && schema.readonly){ - addError("is a readonly field, it can not be changed"); - } - if(schema['extends']){ - checkProp(value,schema['extends'],path,i); - } - function checkType(type,value){ - if(type){ - if(typeof type == 'string' && type != 'any' && - (type == 'null' ? value !== null : typeof value != type) && - !(value instanceof Array && type == 'array') && - !(value instanceof Date && type == 'date') && - !(type == 'integer' && value%1===0)){ - return [{property:path,message:value + " - " + (typeof value) + " value found, but a " + type + " is required"}]; - } - if(type instanceof Array){ - var unionErrors=[]; - for(var j = 0; j < type.length; j++){ - if(!(unionErrors=checkType(type[j],value)).length){ - break; - } - } - if(unionErrors.length){ - return unionErrors; - } - }else if(typeof type == 'object'){ - var priorErrors = errors; - errors = []; - checkProp(value,type,path); - var theseErrors = errors; - errors = priorErrors; - return theseErrors; - } - } - return []; - } - if(value === undefined){ - if(schema.required){ - addError("is missing and it is required"); - } - }else { - errors = errors.concat(checkType(getType(schema),value)); - if(schema.disallow && !checkType(schema.disallow,value).length){ - addError(" disallowed value was matched"); - } - if(value !== null){ - if(value instanceof Array){ - if(schema.items){ - var itemsIsArray = schema.items instanceof Array; - var propDef = schema.items; - for (i = 0, l = value.length; i < l; i += 1) { - if (itemsIsArray) - propDef = schema.items[i]; - if (options.coerce) - value[i] = options.coerce(value[i], propDef); - errors.concat(checkProp(value[i],propDef,path,i)); - } - } - if(schema.minItems && value.length < schema.minItems){ - addError("There must be a minimum of " + schema.minItems + " in the array"); - } - if(schema.maxItems && value.length > schema.maxItems){ - addError("There must be a maximum of " + schema.maxItems + " in the array"); - } - }else if(schema.properties || schema.additionalProperties){ - errors.concat(checkObj(value, schema.properties, path, schema.additionalProperties)); - } - if(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){ - addError("does not match the regex pattern " + schema.pattern); - } - if(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){ - addError("may only be " + schema.maxLength + " characters long"); - } - if(schema.minLength && typeof value == 'string' && value.length < schema.minLength){ - addError("must be at least " + schema.minLength + " characters long"); - } - if(typeof schema.minimum !== 'undefined' && typeof value == typeof schema.minimum && - schema.minimum > value){ - addError("must have a minimum value of " + schema.minimum); - } - if(typeof schema.maximum !== 'undefined' && typeof value == typeof schema.maximum && - schema.maximum < value){ - addError("must have a maximum value of " + schema.maximum); - } - if(schema['enum']){ - var enumer = schema['enum']; - l = enumer.length; - var found; - for(var j = 0; j < l; j++){ - if(enumer[j]===value){ - found=1; - break; - } - } - if(!found){ - addError("does not have a value in the enumeration " + enumer.join(", ")); - } - } - if(typeof schema.maxDecimal == 'number' && - (value.toString().match(new RegExp("\\.[0-9]{" + (schema.maxDecimal + 1) + ",}")))){ - addError("may only have " + schema.maxDecimal + " digits of decimal places"); - } - } - } - return null; - } - function checkObj(instance,objTypeDef,path,additionalProp){ - if(typeof objTypeDef =='object'){ - if(typeof instance != 'object' || instance instanceof Array){ - errors.push({property:path,message:"an object is required"}); - } - for(var i in objTypeDef){ - if(objTypeDef.hasOwnProperty(i) && i != '__proto__' && i != 'constructor'){ - var value = instance.hasOwnProperty(i) ? instance[i] : undefined; - if (value === undefined && options.existingOnly) continue; - var propDef = objTypeDef[i]; - if(value === undefined && propDef["default"]){ - value = instance[i] = propDef["default"]; - } - if(options.coerce && i in instance){ - value = instance[i] = options.coerce(value, propDef); - } - checkProp(value,propDef,path,i); - } - } - } - for(i in instance){ - if(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){ - if (options.filter) { - delete instance[i]; - continue; - } else { - errors.push({property:path,message:"The property " + i + - " is not defined in the schema and the schema does not allow additional properties"}); - } - } - var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires; - if(requires && !(requires in instance)){ - errors.push({property:path,message:"the presence of the property " + i + " requires that " + requires + " also be present"}); - } - value = instance[i]; - if(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){ - if(options.coerce){ - value = instance[i] = options.coerce(value, additionalProp); - } - checkProp(value,additionalProp,path,i); - } - if(!_changing && value && value.$schema){ - errors = errors.concat(checkProp(value,value.$schema,path,i)); - } - } - return errors; - } - if(schema){ - checkProp(instance,schema,'',_changing || ''); - } - if(!_changing && instance && instance.$schema){ - checkProp(instance,instance.$schema,'',''); - } - return {valid:!errors.length,errors:errors}; - }; - exports.mustBeValid = function(result){ - if(!result.valid){ - throw new TypeError(result.errors.map(function(error){return "for property " + error.property + ': ' + error.message;}).join(", \n")); - } - }; - return exports; - })); -} (validate)); - -var mod_assert = assert_1; -var mod_extsprintf = extsprintf$1; -var mod_verror = verror; -var mod_jsonschema = validate.exports; -jsprim$1.deepCopy = deepCopy; -jsprim$1.deepEqual = deepEqual; -jsprim$1.isEmpty = isEmpty; -jsprim$1.hasKey = hasKey; -jsprim$1.forEachKey = forEachKey; -jsprim$1.pluck = pluck; -jsprim$1.flattenObject = flattenObject; -jsprim$1.flattenIter = flattenIter; -jsprim$1.validateJsonObject = validateJsonObjectJS; -jsprim$1.validateJsonObjectJS = validateJsonObjectJS; -jsprim$1.randElt = randElt; -jsprim$1.extraProperties = extraProperties; -jsprim$1.mergeObjects = mergeObjects; -jsprim$1.startsWith = startsWith$1; -jsprim$1.endsWith = endsWith; -jsprim$1.parseInteger = parseInteger; -jsprim$1.iso8601 = iso8601; -jsprim$1.rfc1123 = rfc1123; -jsprim$1.parseDateTime = parseDateTime; -jsprim$1.hrtimediff = hrtimeDiff; -jsprim$1.hrtimeDiff = hrtimeDiff; -jsprim$1.hrtimeAccum = hrtimeAccum; -jsprim$1.hrtimeAdd = hrtimeAdd; -jsprim$1.hrtimeNanosec = hrtimeNanosec; -jsprim$1.hrtimeMicrosec = hrtimeMicrosec; -jsprim$1.hrtimeMillisec = hrtimeMillisec; -function deepCopy(obj) -{ - var ret, key; - var marker = '__deepCopy'; - if (obj && obj[marker]) - throw (new Error('attempted deep copy of cyclic object')); - if (obj && obj.constructor == Object) { - ret = {}; - obj[marker] = true; - for (key in obj) { - if (key == marker) - continue; - ret[key] = deepCopy(obj[key]); - } - delete (obj[marker]); - return (ret); - } - if (obj && obj.constructor == Array) { - ret = []; - obj[marker] = true; - for (key = 0; key < obj.length; key++) - ret.push(deepCopy(obj[key])); - delete (obj[marker]); - return (ret); - } - return (obj); -} -function deepEqual(obj1, obj2) -{ - if (typeof (obj1) != typeof (obj2)) - return (false); - if (obj1 === null || obj2 === null || typeof (obj1) != 'object') - return (obj1 === obj2); - if (obj1.constructor != obj2.constructor) - return (false); - var k; - for (k in obj1) { - if (!obj2.hasOwnProperty(k)) - return (false); - if (!deepEqual(obj1[k], obj2[k])) - return (false); - } - for (k in obj2) { - if (!obj1.hasOwnProperty(k)) - return (false); - } - return (true); -} -function isEmpty(obj) -{ - var key; - for (key in obj) - return (false); - return (true); -} -function hasKey(obj, key) -{ - mod_assert.equal(typeof (key), 'string'); - return (Object.prototype.hasOwnProperty.call(obj, key)); -} -function forEachKey(obj, callback) -{ - for (var key in obj) { - if (hasKey(obj, key)) { - callback(key, obj[key]); - } - } -} -function pluck(obj, key) -{ - mod_assert.equal(typeof (key), 'string'); - return (pluckv(obj, key)); -} -function pluckv(obj, key) -{ - if (obj === null || typeof (obj) !== 'object') - return (undefined); - if (obj.hasOwnProperty(key)) - return (obj[key]); - var i = key.indexOf('.'); - if (i == -1) - return (undefined); - var key1 = key.substr(0, i); - if (!obj.hasOwnProperty(key1)) - return (undefined); - return (pluckv(obj[key1], key.substr(i + 1))); -} -function flattenIter(data, depth, callback) -{ - doFlattenIter(data, depth, [], callback); -} -function doFlattenIter(data, depth, accum, callback) -{ - var each; - var key; - if (depth === 0) { - each = accum.slice(0); - each.push(data); - callback(each); - return; - } - mod_assert.ok(data !== null); - mod_assert.equal(typeof (data), 'object'); - mod_assert.equal(typeof (depth), 'number'); - mod_assert.ok(depth >= 0); - for (key in data) { - each = accum.slice(0); - each.push(key); - doFlattenIter(data[key], depth - 1, each, callback); - } -} -function flattenObject(data, depth) -{ - if (depth === 0) - return ([ data ]); - mod_assert.ok(data !== null); - mod_assert.equal(typeof (data), 'object'); - mod_assert.equal(typeof (depth), 'number'); - mod_assert.ok(depth >= 0); - var rv = []; - var key; - for (key in data) { - flattenObject(data[key], depth - 1).forEach(function (p) { - rv.push([ key ].concat(p)); - }); - } - return (rv); -} -function startsWith$1(str, prefix) -{ - return (str.substr(0, prefix.length) == prefix); -} -function endsWith(str, suffix) -{ - return (str.substr( - str.length - suffix.length, suffix.length) == suffix); -} -function iso8601(d) -{ - if (typeof (d) == 'number') - d = new Date(d); - mod_assert.ok(d.constructor === Date); - return (mod_extsprintf.sprintf('%4d-%02d-%02dT%02d:%02d:%02d.%03dZ', - d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), - d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), - d.getUTCMilliseconds())); -} -var RFC1123_MONTHS = [ - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; -var RFC1123_DAYS = [ - 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; -function rfc1123(date) { - return (mod_extsprintf.sprintf('%s, %02d %s %04d %02d:%02d:%02d GMT', - RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(), - RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(), - date.getUTCHours(), date.getUTCMinutes(), - date.getUTCSeconds())); -} -function parseDateTime(str) -{ - var numeric = +str; - if (!isNaN(numeric)) { - return (new Date(numeric)); - } else { - return (new Date(str)); - } -} -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; -var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; -var PI_DEFAULTS = { - base: 10, - allowSign: true, - allowPrefix: false, - allowTrailing: false, - allowImprecise: false, - trimWhitespace: false, - leadingZeroIsOctal: false -}; -var CP_0 = 0x30; -var CP_9 = 0x39; -var CP_A = 0x41; -var CP_B = 0x42; -var CP_O = 0x4f; -var CP_T = 0x54; -var CP_X = 0x58; -var CP_Z = 0x5a; -var CP_a = 0x61; -var CP_b = 0x62; -var CP_o = 0x6f; -var CP_t = 0x74; -var CP_x = 0x78; -var CP_z = 0x7a; -var PI_CONV_DEC = 0x30; -var PI_CONV_UC = 0x37; -var PI_CONV_LC = 0x57; -function parseInteger(str, uopts) -{ - mod_assert.string(str, 'str'); - mod_assert.optionalObject(uopts, 'options'); - var baseOverride = false; - var options = PI_DEFAULTS; - if (uopts) { - baseOverride = hasKey(uopts, 'base'); - options = mergeObjects(options, uopts); - mod_assert.number(options.base, 'options.base'); - mod_assert.ok(options.base >= 2, 'options.base >= 2'); - mod_assert.ok(options.base <= 36, 'options.base <= 36'); - mod_assert.bool(options.allowSign, 'options.allowSign'); - mod_assert.bool(options.allowPrefix, 'options.allowPrefix'); - mod_assert.bool(options.allowTrailing, - 'options.allowTrailing'); - mod_assert.bool(options.allowImprecise, - 'options.allowImprecise'); - mod_assert.bool(options.trimWhitespace, - 'options.trimWhitespace'); - mod_assert.bool(options.leadingZeroIsOctal, - 'options.leadingZeroIsOctal'); - if (options.leadingZeroIsOctal) { - mod_assert.ok(!baseOverride, - '"base" and "leadingZeroIsOctal" are ' + - 'mutually exclusive'); - } - } - var c; - var pbase = -1; - var base = options.base; - var start; - var mult = 1; - var value = 0; - var idx = 0; - var len = str.length; - if (options.trimWhitespace) { - while (idx < len && isSpace(str.charCodeAt(idx))) { - ++idx; - } - } - if (options.allowSign) { - if (str[idx] === '-') { - idx += 1; - mult = -1; - } else if (str[idx] === '+') { - idx += 1; - } - } - if (str[idx] === '0') { - if (options.allowPrefix) { - pbase = prefixToBase(str.charCodeAt(idx + 1)); - if (pbase !== -1 && (!baseOverride || pbase === base)) { - base = pbase; - idx += 2; - } - } - if (pbase === -1 && options.leadingZeroIsOctal) { - base = 8; - } - } - for (start = idx; idx < len; ++idx) { - c = translateDigit(str.charCodeAt(idx)); - if (c !== -1 && c < base) { - value *= base; - value += c; - } else { - break; - } - } - if (start === idx) { - return (new Error('invalid number: ' + JSON.stringify(str))); - } - if (options.trimWhitespace) { - while (idx < len && isSpace(str.charCodeAt(idx))) { - ++idx; - } - } - if (idx < len && !options.allowTrailing) { - return (new Error('trailing characters after number: ' + - JSON.stringify(str.slice(idx)))); - } - if (value === 0) { - return (0); - } - var result = value * mult; - if (!options.allowImprecise && - (value > MAX_SAFE_INTEGER || result < MIN_SAFE_INTEGER)) { - return (new Error('number is outside of the supported range: ' + - JSON.stringify(str.slice(start, idx)))); - } - return (result); -} -function translateDigit(d) -{ - if (d >= CP_0 && d <= CP_9) { - return (d - PI_CONV_DEC); - } else if (d >= CP_A && d <= CP_Z) { - return (d - PI_CONV_UC); - } else if (d >= CP_a && d <= CP_z) { - return (d - PI_CONV_LC); - } else { - return (-1); - } -} -function isSpace(c) -{ - return (c === 0x20) || - (c >= 0x0009 && c <= 0x000d) || - (c === 0x00a0) || - (c === 0x1680) || - (c === 0x180e) || - (c >= 0x2000 && c <= 0x200a) || - (c === 0x2028) || - (c === 0x2029) || - (c === 0x202f) || - (c === 0x205f) || - (c === 0x3000) || - (c === 0xfeff); -} -function prefixToBase(c) -{ - if (c === CP_b || c === CP_B) { - return (2); - } else if (c === CP_o || c === CP_O) { - return (8); - } else if (c === CP_t || c === CP_T) { - return (10); - } else if (c === CP_x || c === CP_X) { - return (16); - } else { - return (-1); - } -} -function validateJsonObjectJS(schema, input) -{ - var report = mod_jsonschema.validate(input, schema); - if (report.errors.length === 0) - return (null); - var error = report.errors[0]; - var propname = error['property']; - var reason = error['message'].toLowerCase(); - var i, j; - if ((i = reason.indexOf('the property ')) != -1 && - (j = reason.indexOf(' is not defined in the schema and the ' + - 'schema does not allow additional properties')) != -1) { - i += 'the property '.length; - if (propname === '') - propname = reason.substr(i, j - i); - else - propname = propname + '.' + reason.substr(i, j - i); - reason = 'unsupported property'; - } - var rv = new mod_verror.VError('property "%s": %s', propname, reason); - rv.jsv_details = error; - return (rv); -} -function randElt(arr) -{ - mod_assert.ok(Array.isArray(arr) && arr.length > 0, - 'randElt argument must be a non-empty array'); - return (arr[Math.floor(Math.random() * arr.length)]); -} -function assertHrtime(a) -{ - mod_assert.ok(a[0] >= 0 && a[1] >= 0, - 'negative numbers not allowed in hrtimes'); - mod_assert.ok(a[1] < 1e9, 'nanoseconds column overflow'); -} -function hrtimeDiff(a, b) -{ - assertHrtime(a); - assertHrtime(b); - mod_assert.ok(a[0] > b[0] || (a[0] == b[0] && a[1] >= b[1]), - 'negative differences not allowed'); - var rv = [ a[0] - b[0], 0 ]; - if (a[1] >= b[1]) { - rv[1] = a[1] - b[1]; - } else { - rv[0]--; - rv[1] = 1e9 - (b[1] - a[1]); - } - return (rv); -} -function hrtimeNanosec(a) -{ - assertHrtime(a); - return (Math.floor(a[0] * 1e9 + a[1])); -} -function hrtimeMicrosec(a) -{ - assertHrtime(a); - return (Math.floor(a[0] * 1e6 + a[1] / 1e3)); -} -function hrtimeMillisec(a) -{ - assertHrtime(a); - return (Math.floor(a[0] * 1e3 + a[1] / 1e6)); -} -function hrtimeAccum(a, b) -{ - assertHrtime(a); - assertHrtime(b); - a[1] += b[1]; - if (a[1] >= 1e9) { - a[0]++; - a[1] -= 1e9; - } - a[0] += b[0]; - return (a); -} -function hrtimeAdd(a, b) -{ - assertHrtime(a); - var rv = [ a[0], a[1] ]; - return (hrtimeAccum(rv, b)); -} -function extraProperties(obj, allowed) -{ - mod_assert.ok(typeof (obj) === 'object' && obj !== null, - 'obj argument must be a non-null object'); - mod_assert.ok(Array.isArray(allowed), - 'allowed argument must be an array of strings'); - for (var i = 0; i < allowed.length; i++) { - mod_assert.ok(typeof (allowed[i]) === 'string', - 'allowed argument must be an array of strings'); - } - return (Object.keys(obj).filter(function (key) { - return (allowed.indexOf(key) === -1); - })); -} -function mergeObjects(provided, overrides, defaults) -{ - var rv, k; - rv = {}; - if (defaults) { - for (k in defaults) - rv[k] = defaults[k]; - } - if (provided) { - for (k in provided) - rv[k] = provided[k]; - } - if (overrides) { - for (k in overrides) - rv[k] = overrides[k]; - } - return (rv); -} +var ErrorStatusCodes; +(function (ErrorStatusCodes) { + ErrorStatusCodes[ErrorStatusCodes["ComplexRegex"] = 1001] = "ComplexRegex"; + ErrorStatusCodes[ErrorStatusCodes["RuleLimit"] = 1002] = "RuleLimit"; + ErrorStatusCodes[ErrorStatusCodes["RegexpRuleLimit"] = 1003] = "RegexpRuleLimit"; + ErrorStatusCodes[ErrorStatusCodes["RemoveparamRegexpIsNotSupported"] = 1004] = "RemoveparamRegexpIsNotSupported"; + ErrorStatusCodes[ErrorStatusCodes["RemoveparamInversionIsNotSupported"] = 1005] = "RemoveparamInversionIsNotSupported"; +})(ErrorStatusCodes || (ErrorStatusCodes = {})); +var SEPARATOR = '|'; -var assert = assert_1; -var jsprim = jsprim$1; -var util = require$$2; -function ParseError(input, message, index) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, ParseError); - this.input = input; - this.message = message; - if (index !== undefined) { - this.message += ' at index ' + index; - } -} -util.inherits(ParseError, Error); -function modulo(a, n) { - return (n + (a % n)) % n; -} -function _arrayToOctetString(input) { - var out; - out = (input[0] >> 8) + '.' + (input[0] & 0xff) + '.'; - out += (input[1] >> 8) + '.' + (input[1] & 0xff); - return out; -} -function _isAddr(addr) { - if (typeof (addr) === 'object') { - if (Array.isArray(addr._fields) && typeof (addr._attrs) === 'object') { - return true; - } - } - return false; -} -function _toAddr(input) { - if (typeof (input) === 'string') { - return ip6addrParse(input); - } else if (_isAddr(input)) { - return input; - } else { - throw new Error('Invalid argument: Addr or parsable string expected'); - } -} -function _arrayToHex(input, zeroElide, zeroPad) { - var i; - var elStart = null; - var elLen = 0; - if (zeroElide) { - var start = null; - var len = null; - for (i = 0; i < input.length; i++) { - if (input[i] === 0) { - if (start === null) { - start = i; - len = 1; - } else { - len++; +/** + * This is a helper class that is used specifically to work with app restrictions. + * + * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app + * + * Examples: + * ||baddomain.com^$app=org.example.app + * ||baddomain.com^$app=org.example.app1|org.example.app2 + */ +var AppModifier = /** @class */ (function () { + /** + * Parses the `apps` string + * + * @param apps - apps string + * + * @throws an error if the app string is empty or invalid + */ + function AppModifier(apps) { + if (!apps) { + throw new SyntaxError('$app modifier cannot be empty'); } - } else if (start !== null) { - if (len > elLen) { - elStart = start; - elLen = len; + var permittedApps = []; + var restrictedApps = []; + var parts = apps.split(SEPARATOR); + for (var i = 0; i < parts.length; i += 1) { + var app = parts[i]; + var restricted = false; + if (app.startsWith('~')) { + restricted = true; + app = app.substring(1).trim(); + } + if (app === '') { + throw new SyntaxError("Empty app specified in \"".concat(apps, "\"")); + } + if (restricted) { + restrictedApps.push(app); + } + else { + permittedApps.push(app); + } } - start = null; - } - } - if (start !== null && len > elLen) { - elStart = start; - elLen = len; + this.restrictedApps = restrictedApps.length > 0 ? restrictedApps : null; + this.permittedApps = permittedApps.length > 0 ? permittedApps : null; } - } - var output = []; - var num; - for (i = 0; i < input.length; i++) { - if (elStart !== null) { - if (i === elStart) { - if (elLen === 8) { - return ['::']; - } else if (elStart === 0 || elStart + elLen === input.length) { - output.push(':'); - } else { - output.push(''); + return AppModifier; +}()); + +var HTTPMethod; +(function (HTTPMethod) { + HTTPMethod["GET"] = "GET"; + HTTPMethod["POST"] = "POST"; + HTTPMethod["PUT"] = "PUT"; + HTTPMethod["DELETE"] = "DELETE"; + HTTPMethod["PATCH"] = "PATCH"; + HTTPMethod["HEAD"] = "HEAD"; + HTTPMethod["OPTIONS"] = "OPTIONS"; + HTTPMethod["CONNECT"] = "CONNECT"; + HTTPMethod["TRACE"] = "TRACE"; +})(HTTPMethod || (HTTPMethod = {})); +/** + * Method modifier class. + * Rules with $method modifier will be applied only to requests with specified methods. + * + * Learn more about it here: + * https://adguard.com/kb/general/ad-filtering/create-own-filters/#method-modifier + */ +var MethodModifier = /** @class */ (function () { + /** + * Constructor + * + * @param value + */ + function MethodModifier(methodsStr) { + if (methodsStr === '') { + throw new SyntaxError('$method modifier value cannot be empty'); } - } - if (i >= elStart && i < elStart + elLen) { - continue; - } - } - num = input[i].toString(16); - if (zeroPad && num.length != 4) { - num = '0000'.slice(num.length) + num; - } - output.push(num); - } - return output; -} -function _ipv4Mapped(input) { - var comp = [0, 0, 0, 0, 0, 0xffff]; - var i; - for (i = 0; i < 6; i++) { - if (input[i] != comp[i]) - return false; - } - return true; -} -function _prefixToAddr(len) { - assert.number(len); - len = len | 0; - assert.ok(len <= 128); - assert.ok(len >= 0); - var output = new Addr(); - var i; - for (i = 0; len > 16; i++, len -= 16) { - output._fields[i] = 0xffff; - } - if (len > 0) { - output._fields[i] = 0xffff - ((1 << (16 - len)) - 1); - } - return output; -} -function _toCIDR(input) { - if (typeof (input) === 'string') { - return new CIDR(input); - } else if (input instanceof CIDR) { - return input; - } else { - throw new Error('Invalid argument: CIDR or parsable string expected'); - } -} -var strDefaults = { - format: 'auto', - zeroElide: true, - zeroPad: false -}; -function getStrOpt(opts, name) { - if (opts && opts.hasOwnProperty(name)) { - return opts[name]; - } else { - return strDefaults[name]; - } -} -function Addr() { - this._fields = [0, 0, 0, 0, 0, 0, 0, 0]; - this._attrs = {}; -} -Addr.prototype.kind = function getKind() { - if (v4subnet.contains(this)) { - return 'ipv4'; - } else { - return 'ipv6'; - } -}; -Addr.prototype.toString = function toString(opts) { - assert.optionalObject(opts, 'opts'); - var format = getStrOpt(opts, 'format'); - var zeroElide = getStrOpt(opts, 'zeroElide'); - var zeroPad = getStrOpt(opts, 'zeroPad'); - assert.string(format, 'opts.format'); - assert.bool(zeroElide, 'opts.zeroElide'); - assert.bool(zeroPad, 'opts.zeroPad'); - if (format === 'auto') { - if (this._attrs.ipv4Bare) { - format = 'v4'; - } else if (this._attrs.ipv4Mapped) { - format = 'v4-mapped'; - } else { - format = 'v6'; - } - } - switch (format) { - case 'v4': - if (!v4subnet.contains(this)) { - throw new Error('cannot print non-v4 address in dotted quad notation'); - } - return _arrayToOctetString(this._fields.slice(6)); - case 'v4-mapped': - if (!v4subnet.contains(this)) { - throw new Error('cannot print non-v4 address as a v4-mapped address'); - } - var output = _arrayToHex(this._fields.slice(0, 6), zeroElide, zeroPad); - output.push(_arrayToOctetString(this._fields.slice(6))); - return output.join(':'); - case 'v6': - return _arrayToHex(this._fields, zeroElide, zeroPad).join(':'); - default: - throw new Error('unrecognized format method "' + format + '"'); - } -}; -Addr.prototype.toBuffer = function toBuffer(buf) { - if (buf !== undefined) { - if (!isBuffer$2(buf)) { - throw new Error('optional arg must be Buffer'); - } - } else { - buf = new Buffer$1(16); - } - var i; - for (i = 0; i < 8; i++) { - buf.writeUInt16BE(this._fields[i], i*2); - } - return buf; -}; -Addr.prototype.toLong = function toLong() { - if (!v4subnet.contains(this)) { - throw new Error('only possible for ipv4-mapped addresses'); - } - return ((this._fields[6] << 16) >>> 0) + this._fields[7]; -}; -Addr.prototype.clone = function cloneAddr() { - var out = new Addr(); - out._fields = this._fields.slice(); - for (var k in this._attrs) { - out._attrs[k] = this._attrs[k]; - } - return out; -}; -Addr.prototype.offset = function offset(num) { - if (num < -4294967295 || num > 4294967295) { - throw new Error('offsets should be between -4294967295 and 4294967295'); - } - var out = this.clone(); - var i, moved; - for (i = 7; i >= 0; i--) { - moved = out._fields[i] + num; - if (moved > 65535) { - num = moved >>> 16; - moved = moved & 0xffff; - } else if (moved < 0) { - num = Math.floor(moved / (1 << 16)); - moved = modulo(moved, 1 << 16); - } else { - num = 0; - } - out._fields[i] = moved; - if (num !== 0) { - if ((i === 0) || (i === 6 && this._attrs.ipv4Mapped)) { - return null; - } - } else { - break; - } - } - return out; -}; -Addr.prototype.and = function addrAnd(input) { - input = _toAddr(input); - var i; - var output = this.clone(); - for (i = 0; i < 8; i++) { - output._fields[i] = output._fields[i] & input._fields[i]; - } - return output; -}; -Addr.prototype.or = function addrOr(input) { - input = _toAddr(input); - var i; - var output = this.clone(); - for (i = 0; i < 8; i++) { - output._fields[i] = output._fields[i] | input._fields[i]; - } - return output; -}; -Addr.prototype.not = function addrNot() { - var i; - var output = this.clone(); - for (i = 0; i < 8; i++) { - output._fields[i] = (~ output._fields[i]) & 0xffff; - } - return output; -}; -Addr.prototype.compare = function compareMember(addr) { - return ip6addrCompare(this, addr); -}; -function CIDR(addr, prefixLen) { - if (prefixLen === undefined) { - assert.string(addr); - var fields = addr.match(/^([a-fA-F0-9:.]+)\/([0-9]+)$/); - if (fields === null) { - throw new Error('Invalid argument: / expected'); - } - addr = fields[1]; - prefixLen = parseInt(fields[2], 10); - } - assert.number(prefixLen); - prefixLen = prefixLen | 0; - addr = _toAddr(addr); - if (addr._attrs.ipv4Bare) { - prefixLen += 96; - } - if (prefixLen < 0 || prefixLen > 128) { - throw new Error('Invalid prefix length'); - } - this._prefix = prefixLen; - this._mask = _prefixToAddr(prefixLen); - this._addr = addr.and(this._mask); -} -CIDR.prototype.contains = function cidrContains(input) { - input = _toAddr(input); - return (this._addr.compare(input.and(this._mask)) === 0); -}; -CIDR.prototype.first = function cidrFirst() { - if (this._prefix >= 127) { - return this._addr; - } else { - return this._addr.offset(1); - } -}; -CIDR.prototype.last = function cidrLast() { - var ending = this._addr.or(this._mask.not()); - if (this._prefix >= 127) { - return ending; - } else { - if (this._addr._attrs.ipv4Mapped) { - return ending.offset(-1); - } else { - return ending; - } - } -}; -CIDR.prototype.broadcast = function getBroadcast() { - if (!v4subnet.contains(this._addr)) { - throw new Error('Only IPv4 networks have broadcast addresses'); - } - return this._addr.or(this._mask.not()); -}; -CIDR.prototype.compare = function compareCIDR(cidr) { - return ip6cidrCompare(this, cidr); -}; -CIDR.prototype.prefixLength = function getPrefixLength(format) { - assert.optionalString(format, 'format'); - if (format === undefined || format === 'auto') { - format = this._addr._attrs.ipv4Bare ? 'v4' : 'v6'; - } - switch (format) { - case 'v4': - if (!v4subnet.contains(this._addr)) { - throw new Error('cannot return v4 prefix length for non-v4 address'); - } - return this._prefix - 96; - case 'v6': - return this._prefix; - default: - throw new Error('unrecognized format method "' + format + '"'); - } -}; -CIDR.prototype.address = function getAddressComponent() { - return this._addr; -}; -CIDR.prototype.toString = function cidrString(opts) { - assert.optionalObject(opts, 'opts'); - var format = getStrOpt(opts, 'format'); - if (format === 'v4-mapped') { - format = 'v6'; - } - return this._addr.toString(opts) + '/' + this.prefixLength(format); -}; -var v4subnet = new CIDR('::ffff:0:0', 96); -function ip6cidrCompare(a, b) { - a = _toCIDR(a); - b = _toCIDR(b); - var cmp = ip6addrCompare(a._addr, b._addr); - return cmp === 0 ? b._prefix - a._prefix : cmp; -} -function AddrRange(begin, end) { - begin = _toAddr(begin); - end = _toAddr(end); - if (begin.compare(end) > 0) { - throw new Error('begin address must be <= end address'); - } - this._begin = begin; - this._end = end; -} -AddrRange.prototype.contains = function addrRangeContains(input) { - input = _toAddr(input); - return (this._begin.compare(input) <= 0 && this._end.compare(input) >= 0); -}; -AddrRange.prototype.first = function addrRangeFirst() { - return this._begin; -}; -AddrRange.prototype.last = function addrRangeLast() { - return this._end; -}; -function ip6addrParse(input) { - if (typeof (input) === 'string') { - return parseString(input); - } else if (typeof (input) === 'number') { - return parseLong(input); - } else if (typeof (input) === 'object' && _isAddr(input)) { - return input; - } else { - throw new Error('Invalid argument: only string|number allowed'); - } -} -function parseString(input) { - assert.string(input); - input = input.toLowerCase(); - var result = new Addr(); - var ip6Fields = []; - var ip4Fields = []; - var expIndex = null; - var value = ''; - var i, c; - if (input.length > 40) { - throw new ParseError(input, 'Input too long'); - } - for (i = 0; i < input.length; i++) { - c = input[i]; - if (c === ':') { - if ((i+1) < input.length && input[i+1] === ':') { - if (expIndex !== null) { - throw new ParseError(input, 'Multiple :: delimiters', i); - } - if (value !== '') { - ip6Fields.push(value); - value = ''; - } - expIndex = ip6Fields.length; - i++; - } else { - if (value === '') { - throw new ParseError(input, 'illegal delimiter', i); + var permittedMethods = []; + var restrictedMethods = []; + var parts = methodsStr.toUpperCase().split(MethodModifier.PIPE_SEPARATOR); + for (var i = 0; i < parts.length; i += 1) { + var method = parts[i].trim(); + var restricted = false; + if (method.startsWith('~')) { + restricted = true; + method = method.substring(1); + } + if (!MethodModifier.isHTTPMethod(method)) { + throw new SyntaxError("Invalid $method modifier value: ".concat(method)); + } + if (restricted) { + restrictedMethods.push(method); + } + else { + permittedMethods.push(method); + } } - ip6Fields.push(value); - value = ''; - } - } else if (c === '.') { - ip4Fields.push(value); - value = ''; - } else { - value = value + c; - } - } - if (value !== '') { - if (ip4Fields.length !== 0) { - ip4Fields.push(value); - } else { - ip6Fields.push(value); - } - value = ''; - } else { - if (expIndex !== ip6Fields.length || ip4Fields.length > 0) { - throw new ParseError(input, 'Cannot end with delimiter besides ::'); - } - } - if (ip4Fields.length === 0) { - if (ip6Fields.length > 8) { - throw new ParseError(input, 'Too many fields'); - } else if (ip6Fields.length < 8 && expIndex === null) { - throw new ParseError(input, 'Too few fields'); - } - } else { - if (ip4Fields.length !== 4) { - throw new ParseError(input, 'IPv4 portion must have 4 fields'); + if (restrictedMethods.length > 0 && permittedMethods.length > 0) { + throw new SyntaxError("Negated values cannot be mixed with non-negated values: ".concat(methodsStr)); + } + this.restrictedValues = restrictedMethods.length > 0 ? restrictedMethods : null; + this.permittedValues = permittedMethods.length > 0 ? permittedMethods : null; } - if (ip6Fields.length === 0 && expIndex === null) { - result._attrs.ipv4Bare = true; - ip6Fields = ['ffff']; - expIndex = 0; + /** + * Request methods separator + */ + MethodModifier.PIPE_SEPARATOR = '|'; + MethodModifier.isHTTPMethod = function (value) { return value in HTTPMethod; }; + return MethodModifier; +}()); + +/** + * To modifier class. + * Rules with $to modifier are limited to requests made to the specified domains and their subdomains. + * + * Learn more about it here: + * https://adguard.com/kb/general/ad-filtering/create-own-filters/#to-modifier + */ +var ToModifier = /** @class */ (function () { + /** + * Constructor + */ + function ToModifier(domainsStr) { + if (!domainsStr) { + throw new SyntaxError('$to modifier value cannot be empty'); + } + var permittedDomains = []; + var restrictedDomains = []; + var parts = domainsStr.toLowerCase().split(ToModifier.PIPE_SEPARATOR); + for (var i = 0; i < parts.length; i += 1) { + var domain = parts[i].trim(); + var restricted = false; + if (domain.startsWith('~')) { + restricted = true; + domain = domain.substring(1); + } + if (domain === '') { + throw new SyntaxError("Empty domain specified in \"".concat(domainsStr, "\"")); + } + if (restricted) { + restrictedDomains.push(domain); + } + else { + permittedDomains.push(domain); + } + } + this.restrictedValues = restrictedDomains.length > 0 ? restrictedDomains : null; + this.permittedValues = permittedDomains.length > 0 ? permittedDomains : null; } - if (ip6Fields.length > 6) { - throw new ParseError(input, 'Too many fields'); - } else if (ip6Fields.length < 6 && expIndex === null) { - throw new ParseError(input, 'Too few fields'); + /** + * Domains separator + */ + ToModifier.PIPE_SEPARATOR = '|'; + return ToModifier; +}()); + +/** + * Checks if error has message. + * + * @param error Error object. + * @returns If param is error. + */ +function isErrorWithMessage(error) { + return (typeof error === 'object' + && error !== null + && 'message' in error + && typeof error.message === 'string'); +} +/** + * Converts error to the error with message. + * + * @param maybeError Possible error. + * @returns Error with message. + */ +function toErrorWithMessage(maybeError) { + if (isErrorWithMessage(maybeError)) { + return maybeError; } - } - var field, num; - for (i = 0; i < ip6Fields.length; i++) { - field = ip6Fields[i]; - num = jsprim.parseInteger(field, { base: 16, allowSign: false }); - if (num instanceof Error || num < 0 || num > 65535) { - throw new ParseError(input, 'Invalid field value: ' + field); - } - ip6Fields[i] = num; - } - for (i = 0; i < ip4Fields.length; i++) { - field = ip4Fields[i]; - num = jsprim.parseInteger(field, { base: 10, allowSign: false }); - if (num instanceof Error || num < 0 || num > 255) { - throw new ParseError(input, 'Invalid field value: ' + field); + try { + return new Error(JSON.stringify(maybeError)); } - ip4Fields[i] = num; - } - if (ip4Fields.length !== 0) { - ip6Fields.push((ip4Fields[0]*256) + ip4Fields[1]); - ip6Fields.push((ip4Fields[2]*256) + ip4Fields[3]); - } - if (ip6Fields.length < 8 && expIndex !== null) { - var filler = []; - for (i = 0; i < (8 - ip6Fields.length); i++) { - filler.push(0); - } - ip6Fields = Array.prototype.concat( - ip6Fields.slice(0, expIndex), - filler, - ip6Fields.slice(expIndex) - ); - } - if (ip4Fields.length !== 0) { - if (!_ipv4Mapped(ip6Fields)) { - throw new ParseError(input, 'invalid dotted-quad notation'); - } else { - result._attrs.ipv4Mapped = true; + catch (_a) { + // fallback in case there's an error stringifying the maybeError + // like with circular references for example. + return new Error(String(maybeError)); } - } - result._fields = ip6Fields; - return result; } -function parseLong(input) { - assert.number(input); - if (input !== Math.floor(input)) { - throw new Error('Value must be integer'); - } - if (input < 0 || input > 0xffffffff) { - throw new Error('Value must be 32 bit'); - } - var out = new Addr(); - out._fields[7] = input & 0xffff; - out._fields[6] = (input >>> 16); - out._fields[5] = 0xffff; - out._attrs.ipv4Bare = true; - out._attrs.ipv4Mapped = true; - return out; -} -function ip6addrCompare(a, b) { - a = _toAddr(a); - b = _toAddr(b); - var i; - for (i = 0; i < 8; i++) { - if (a._fields[i] < b._fields[i]) { - return -1; - } else if (a._fields[i] > b._fields[i]) { - return 1; - } - } - return 0; +/** + * Converts error object to error with message. This method might be helpful to handle thrown errors. + * + * @param error Error object. + * + * @returns Message of the error. + */ +function getErrorMessage(error) { + return toErrorWithMessage(error).message; } -var ip6addr = { - parse: ip6addrParse, - compare: ip6addrCompare, - createCIDR: function (addr, len) { - return new CIDR(addr, len); - }, - compareCIDR: ip6cidrCompare, - createAddrRange: function (begin, end) { - return new AddrRange(begin, end); - } -}; /** * This is the base class representing double values modifiers @@ -62011,10 +64778,10 @@ var NetmasksCollection = /** @class */ (function () { * @param value */ NetmasksCollection.prototype.contains = function (value) { - if (isIp_1.v4(value)) { - return this.ipv4Masks.some(function (x) { return x.contains(value); }); + if (is_ip_default().v4(value)) { + return this.ipv4Masks.some(function (x) { return contains(x, value); }); } - return this.ipv6Masks.some(function (x) { return x.contains(value); }); + return this.ipv6Masks.some(function (x) { return contains(x, value); }); }; return NetmasksCollection; }()); @@ -62103,12 +64870,12 @@ var ClientModifier = /** @class */ (function (_super) { ClientModifier.parseNetmasks = function (values) { var result = new NetmasksCollection(); values.forEach(function (x) { - var cidrVersion = isCidr.exports(x); + var cidrVersion = is_cidr_default()(x); if (cidrVersion === 4) { - result.ipv4Masks.push(new Netmask_1(x)); + result.ipv4Masks.push(x); } else if (cidrVersion === 6) { - result.ipv6Masks.push(ip6addr.createCIDR(x)); + result.ipv6Masks.push(x); } }); return result; @@ -62379,6 +65146,41 @@ var Pattern = /** @class */ (function () { return Pattern; }()); +/** + * Counts the number of bits in the number and returns it + * + * @param a number to count bits + * + * @returns The number of bits in the number. + */ +function getBitCount(a) { + var count = 0; + var n = a; + while (n > 0) { + count += n & 1; + n >>= 1; + } + return count; +} +/** + * Count the number of bits enabled in a number based on a bit mask + * + * @param base Base number to check + * @param mask Mask to check + * + * @returns The number of bits enabled in the base number based on the mask + * + * @example + * countEnabledBits(0b100, 0b110); // 1 + * countEnabledBits(0b111, 0b000); // 0 + */ +function countEnabledBits(base, mask) { + // Get the common bits between the base and the mask + var common = base & mask; + // Count the number of bits enabled in the common bits + return getBitCount(common); +} + /** * NetworkRuleOption is the enumeration of various rule options. * In order to save memory, we store some options as a flag. @@ -62386,6 +65188,8 @@ var Pattern = /** @class */ (function () { */ var NetworkRuleOption; (function (NetworkRuleOption) { + /** No value is set. Syntax sugar to simplify code. */ + NetworkRuleOption[NetworkRuleOption["NotSet"] = 0] = "NotSet"; /** $third-party modifier */ NetworkRuleOption[NetworkRuleOption["ThirdParty"] = 1] = "ThirdParty"; /** $match-case modifier */ @@ -62412,11 +65216,6 @@ var NetworkRuleOption; NetworkRuleOption[NetworkRuleOption["Extension"] = 1024] = "Extension"; /** $stealth modifier */ NetworkRuleOption[NetworkRuleOption["Stealth"] = 2048] = "Stealth"; - // Content modifying - // $empty modifier - NetworkRuleOption[NetworkRuleOption["Empty"] = 4096] = "Empty"; - // $mp4 modifier - NetworkRuleOption[NetworkRuleOption["Mp4"] = 8192] = "Mp4"; // Other modifiers /** $popup modifier */ NetworkRuleOption[NetworkRuleOption["Popup"] = 16384] = "Popup"; @@ -62446,11 +65245,11 @@ var NetworkRuleOption; NetworkRuleOption[NetworkRuleOption["DnsRewrite"] = 67108864] = "DnsRewrite"; NetworkRuleOption[NetworkRuleOption["DnsType"] = 134217728] = "DnsType"; NetworkRuleOption[NetworkRuleOption["Ctag"] = 268435456] = "Ctag"; - // Document - NetworkRuleOption[NetworkRuleOption["Document"] = 536870912] = "Document"; + // $method modifier + NetworkRuleOption[NetworkRuleOption["Method"] = 1073741824] = "Method"; + // $to modifier + NetworkRuleOption[NetworkRuleOption["To"] = -2147483648] = "To"; // Groups (for validation) - /** Blacklist-only modifiers */ - NetworkRuleOption[NetworkRuleOption["BlacklistOnly"] = 12288] = "BlacklistOnly"; /** Allowlist-only modifiers */ NetworkRuleOption[NetworkRuleOption["AllowlistOnly"] = 4088] = "AllowlistOnly"; /** Options supported by host-level network rules * */ @@ -62458,17 +65257,17 @@ var NetworkRuleOption; /** * Removeparam compatible modifiers * - * $removeparam rules are compatible only with content type modifiers ($script, $stylesheet, etc) - * and this list of modifiers: + * $removeparam rules are compatible only with content type modifiers ($subdocument, $script, $stylesheet, etc) + * except $document (using by default) and this list of modifiers: */ - NetworkRuleOption[NetworkRuleOption["RemoveParamCompatibleOptions"] = 538443783] = "RemoveParamCompatibleOptions"; + NetworkRuleOption[NetworkRuleOption["RemoveParamCompatibleOptions"] = 1572871] = "RemoveParamCompatibleOptions"; /** * Removeheader compatible modifiers * - * $removeheader rules are compatible only with content type modifiers ($script, $stylesheet, etc) - * and this list of modifiers: + * $removeheader rules are compatible only with content type modifiers ($subdocument, $script, $stylesheet, etc) + * except $document (using by default) and this list of modifiers: */ - NetworkRuleOption[NetworkRuleOption["RemoveHeaderCompatibleOptions"] = 539492359] = "RemoveHeaderCompatibleOptions"; + NetworkRuleOption[NetworkRuleOption["RemoveHeaderCompatibleOptions"] = 2621447] = "RemoveHeaderCompatibleOptions"; })(NetworkRuleOption || (NetworkRuleOption = {})); /** * Helper class that is used for passing {@link NetworkRule.parseRuleText} @@ -62479,10 +65278,6 @@ var BasicRuleParts = /** @class */ (function () { } return BasicRuleParts; }()); -// Flag that indicates that permitted ALL request types. -var PermittedAllRequestTypes = 0; -// Flag that indicates that restricted ALL request types. -var RestrictedAllRequestTypes = 0; /** * Basic network filtering rule. * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules @@ -62506,14 +65301,22 @@ var NetworkRule = /** @class */ (function () { * https://github.com/AdguardTeam/CoreLibs/issues/1304 */ this.denyAllowDomains = null; - /** Flag with all enabled rule options */ - this.enabledOptions = 0; - /** Flag with all disabled rule options */ - this.disabledOptions = 0; - /** Flag with all permitted request types. */ - this.permittedRequestTypes = PermittedAllRequestTypes; - /** Flag with all restricted request types. */ - this.restrictedRequestTypes = RestrictedAllRequestTypes; + /** + * Flag with all enabled rule options. + */ + this.enabledOptions = NetworkRuleOption.NotSet; + /** + * Flag with all disabled rule options. + */ + this.disabledOptions = NetworkRuleOption.NotSet; + /** + * Flag with all permitted request types. + */ + this.permittedRequestTypes = RequestType.NotSet; + /** + * Flag with all restricted request types. + */ + this.restrictedRequestTypes = RequestType.NotSet; /** * Rule Advanced modifier */ @@ -62523,10 +65326,23 @@ var NetworkRule = /** @class */ (function () { */ this.appModifier = null; /** - * Priority weight - * Used in rules priority comparision + * Rule Method modifier + */ + this.methodModifier = null; + /** + * Rule To modifier + */ + this.toModifier = null; + /** + * Rule priority, which is needed when the engine has to choose between + * several rules matching the query. This value is calculated based on + * the rule modifiers enabled or disabled and rounded up + * to the smallest integer greater than or equal to the calculated weight + * in the {@link calculatePriorityWeight}. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-1 */ - this.priorityWeight = 0; + this.priorityWeight = 1; this.ruleText = ruleText; this.filterListId = filterListId; var ruleParts = NetworkRule.parseRuleText(ruleText); @@ -62556,14 +65372,37 @@ var NetworkRule = /** @class */ (function () { } } } + this.calculatePriorityWeight(); this.pattern = new Pattern(pattern, this.isOptionEnabled(NetworkRuleOption.MatchCase)); } + /** + * Returns the original text of the rule from which it was parsed. + * + * @returns Original text of the rule. + */ NetworkRule.prototype.getText = function () { return this.ruleText; }; + /** + * Returns the identifier of the filter from which the rule was received. + * + * @returns Identifier of the filter from which the rule was received. + */ NetworkRule.prototype.getFilterListId = function () { return this.filterListId; }; + /** + * Each rule has its own priority, which is necessary when several rules + * match the request and the filtering system needs to select one of them. + * Priority is measured as a positive integer. + * In the case of a conflict between two rules with the same priority value, + * it is not specified which one of them will be chosen. + * + * @returns Rule priority. + */ + NetworkRule.prototype.getPriorityWeight = function () { + return this.priorityWeight; + }; /** * Returns rule pattern, * which currently is used only in the rule validator module @@ -62579,7 +65418,8 @@ var NetworkRule = /** @class */ (function () { return this.allowlist; }; /** - * Checks if the rule is a document-level allowlist rule + * Checks if the rule is a document-level allowlist rule with $urlblock or + * $genericblock or $content. * This means that the rule is supposed to disable or modify blocking * of the page subrequests. * For instance, `@@||example.org^$urlblock` unblocks all sub-requests. @@ -62593,16 +65433,16 @@ var NetworkRule = /** @class */ (function () { || this.isOptionEnabled(NetworkRuleOption.Content); }; /** - * Checks if the rule is a document allowlist rule. - * For instance, - * "@@||example.org^$document" - * completely disables filtering on all pages at example.com and all subdomains. + * Checks if the rule completely disables filtering. */ - NetworkRule.prototype.isDocumentAllowlistRule = function () { + NetworkRule.prototype.isFilteringDisabled = function () { if (!this.isAllowlist()) { return false; } - return this.isOptionEnabled(NetworkRuleOption.Document); + return this.isOptionEnabled(NetworkRuleOption.Elemhide) + && this.isOptionEnabled(NetworkRuleOption.Content) + && this.isOptionEnabled(NetworkRuleOption.Urlblock) + && this.isOptionEnabled(NetworkRuleOption.Jsinject); }; /** * The longest part of pattern without any special characters. @@ -62632,6 +65472,26 @@ var NetworkRule = /** @class */ (function () { NetworkRule.prototype.getRestrictedDomains = function () { return this.restrictedDomains; }; + /** + * Get list of permitted $to domains. + * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#to-modifier + */ + NetworkRule.prototype.getPermittedToDomains = function () { + if (this.toModifier) { + return this.toModifier.permittedValues; + } + return null; + }; + /** + * Get list of restricted $to domains. + * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#to-modifier + */ + NetworkRule.prototype.getRestrictedToDomains = function () { + if (this.toModifier) { + return this.toModifier.restrictedValues; + } + return null; + }; /** * Gets list of permitted domains. * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app @@ -62652,11 +65512,37 @@ var NetworkRule = /** @class */ (function () { } return null; }; - /** Flag with all permitted request types. 'PermittedAll' means ALL. */ + /** + * Gets list of permitted methods. + * See https://kb.adguard.com/general/how-to-create-your-own-ad-filters#method-modifier + */ + NetworkRule.prototype.getRestrictedMethods = function () { + if (this.methodModifier) { + return this.methodModifier.restrictedValues; + } + return null; + }; + /** + * Gets list of restricted methods. + * See https://kb.adguard.com/general/how-to-create-your-own-ad-filters#method-modifier + */ + NetworkRule.prototype.getPermittedMethods = function () { + if (this.methodModifier) { + return this.methodModifier.permittedValues; + } + return null; + }; + /** + * Flag with all permitted request types. + * The value {@link RequestType.NotSet} here means "all request types are allowed". + */ NetworkRule.prototype.getPermittedRequestTypes = function () { return this.permittedRequestTypes; }; - /** Flag with all restricted request types. 'RestrictedAll' means NONE. */ + /** + * Flag with all restricted request types. + * The value {@link RequestType.NotSet} here means "no type of request is restricted". + */ NetworkRule.prototype.getRestrictedRequestTypes = function () { return this.restrictedRequestTypes; }; @@ -62701,6 +65587,9 @@ var NetworkRule = /** @class */ (function () { if (useShortcut && !this.matchShortcut(request)) { return false; } + if (this.isOptionEnabled(NetworkRuleOption.Method) && !this.matchMethod(request.method)) { + return false; + } if (this.isOptionEnabled(NetworkRuleOption.ThirdParty) && !request.thirdParty) { return false; } @@ -62721,6 +65610,9 @@ var NetworkRule = /** @class */ (function () { if (!this.matchDenyAllowDomains(request.hostname)) { return false; } + if (this.isOptionEnabled(NetworkRuleOption.To) && !this.matchToModifier(request.hostname)) { + return false; + } if (!this.matchDnsType(request.dnsType)) { return false; } @@ -62809,6 +65701,29 @@ var NetworkRule = /** @class */ (function () { } return true; }; + /** + * Checks if request target matches with specified domains + * + * @param domain request's domain + * @return true if request domain matches with specified domains + */ + NetworkRule.prototype.matchToModifier = function (domain) { + if (!this.toModifier) { + return true; + } + /** + * Request's domain must be either explicitly + * permitted and not be included in list of restricted domains + * for the rule to apply + */ + var permittedDomains = this.getPermittedToDomains(); + var restrictedDomains = this.getRestrictedToDomains(); + var isPermittedDomain = !!permittedDomains + && DomainModifier.isDomainOrSubdomainOfAny(domain, permittedDomains); + var isRestrictedDomain = !!restrictedDomains + && DomainModifier.isDomainOrSubdomainOfAny(domain, restrictedDomains); + return isPermittedDomain && !isRestrictedDomain; + }; /** * Return TRUE if this rule matches with the tags associated with a client * @@ -62884,12 +65799,12 @@ var NetworkRule = /** @class */ (function () { * @param requestType - request type to check. */ NetworkRule.prototype.matchRequestType = function (requestType) { - if (this.permittedRequestTypes !== PermittedAllRequestTypes) { + if (this.permittedRequestTypes !== RequestType.NotSet) { if ((this.permittedRequestTypes & requestType) !== requestType) { return false; } } - if (this.restrictedRequestTypes !== RestrictedAllRequestTypes) { + if (this.restrictedRequestTypes !== RequestType.NotSet) { if ((this.restrictedRequestTypes & requestType) === requestType) { return false; } @@ -62901,14 +65816,36 @@ var NetworkRule = /** @class */ (function () { * we only allow it to target other content types if the rule has an explicit content-type modifier. */ NetworkRule.prototype.matchRequestTypeExplicit = function (requestType) { - if (this.permittedRequestTypes === PermittedAllRequestTypes - && this.restrictedRequestTypes === RestrictedAllRequestTypes + if (this.permittedRequestTypes === RequestType.NotSet + && this.restrictedRequestTypes === RequestType.NotSet && requestType !== RequestType.Document && requestType !== RequestType.SubDocument) { return false; } return this.matchRequestType(requestType); }; + /** + * Checks if request's method matches with the rule + * + * @param method request's method + * @returns true, if rule must be applied to the request + */ + NetworkRule.prototype.matchMethod = function (method) { + if (!method || !MethodModifier.isHTTPMethod(method)) { + return false; + } + /** + * Request's method must be either explicitly + * permitted or not be included in list of restricted methods + * for the rule to apply + */ + var permittedMethods = this.getPermittedMethods(); + if (permittedMethods === null || permittedMethods === void 0 ? void 0 : permittedMethods.includes(method)) { + return true; + } + var restrictedMethods = this.getRestrictedMethods(); + return !!restrictedMethods && !restrictedMethods.includes(method); + }; /** * Checks if pattern has spaces * Used in order to do not create network rules from host rules @@ -62947,36 +65884,16 @@ var NetworkRule = /** @class */ (function () { } this.loadOption(optionName, optionValue); } - // More specified rule has more priority - this.priorityWeight = optionParts.length; this.validateOptions(); - // In the case of allowlist rules $document implicitly includes all other modifiers: - // `$content`, `$elemhide`, `$jsinject`, `$urlblock`. - if (this.isAllowlist() && this.isOptionEnabled(NetworkRuleOption.Document)) { - this.setOptionEnabled(NetworkRuleOption.Elemhide, true, true); - this.setOptionEnabled(NetworkRuleOption.Jsinject, true, true); - this.setOptionEnabled(NetworkRuleOption.Urlblock, true, true); - this.setOptionEnabled(NetworkRuleOption.Content, true, true); - this.priorityWeight += 4; - } - // $popup should work accumulatively with requestType modifiers - // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1992 - if (this.isOptionEnabled(NetworkRuleOption.Popup) && this.permittedRequestTypes !== PermittedAllRequestTypes) { - this.permittedRequestTypes |= RequestType.Document; - } - else if (this.isOptionEnabled(NetworkRuleOption.Popup)) { - this.permittedRequestTypes = RequestType.Document; - } - // Rules of these types can be applied to documents only - // $jsinject, $elemhide, $urlblock, $genericblock, $generichide and $content for allowlist rules. - if (this.isOptionEnabled(NetworkRuleOption.Jsinject) - || this.isOptionEnabled(NetworkRuleOption.Elemhide) - || this.isOptionEnabled(NetworkRuleOption.Content) - || this.isOptionEnabled(NetworkRuleOption.Urlblock) - || this.isOptionEnabled(NetworkRuleOption.Genericblock) - || this.isOptionEnabled(NetworkRuleOption.Generichide)) { - this.permittedRequestTypes = RequestType.Document; - } + }; + /** + * Returns true if rule contains (enabled or disabled) specified option. + * Please note, that options have three state: enabled, disabled, undefined. + * + * @param option - rule option to check. + */ + NetworkRule.prototype.hasOption = function (option) { + return this.isOptionEnabled(option) || this.isOptionDisabled(option); }; /** * Returns true if the specified option is enabled. @@ -63006,35 +65923,9 @@ var NetworkRule = /** @class */ (function () { }; /** * Checks if the rule has higher priority that the specified rule - * allowlist + $important > $important > allowlist > basic rules + * allowlist + $important > $important > redirect > allowlist > basic rules */ NetworkRule.prototype.isHigherPriority = function (r) { - var important = this.isOptionEnabled(NetworkRuleOption.Important); - var rImportant = r.isOptionEnabled(NetworkRuleOption.Important); - if (this.isAllowlist() && important && !(r.isAllowlist() && rImportant)) { - return true; - } - if (r.isAllowlist() && rImportant && !(this.isAllowlist() && important)) { - return false; - } - if (important && !rImportant) { - return true; - } - if (rImportant && !important) { - return false; - } - if (this.isAllowlist() && !r.isAllowlist()) { - return true; - } - if (r.isAllowlist() && !this.isAllowlist()) { - return false; - } - var generic = this.isGeneric(); - var rGeneric = r.isGeneric(); - if (!generic && rGeneric) { - // specific rules have priority over generic rules - return true; - } return this.priorityWeight > r.priorityWeight; }; /** @@ -63091,10 +65982,10 @@ var NetworkRule = /** @class */ (function () { if (this.permittedRequestTypes !== 0 && this.restrictedRequestTypes !== 0) { return false; } - if (this.disabledOptions !== 0) { + if (this.disabledOptions !== NetworkRuleOption.NotSet) { return false; } - if (this.enabledOptions !== 0) { + if (this.enabledOptions !== NetworkRuleOption.NotSet) { return ((this.enabledOptions & NetworkRuleOption.OptionHostLevelRules) | (this.enabledOptions @@ -63115,9 +66006,6 @@ var NetworkRule = /** @class */ (function () { NetworkRule.prototype.setOptionEnabled = function (option, enabled, skipRestrictions) { if (skipRestrictions === void 0) { skipRestrictions = false; } if (!skipRestrictions) { - if (this.allowlist && (option & NetworkRuleOption.BlacklistOnly) === option) { - throw new SyntaxError("Modifier ".concat(NetworkRuleOption[option], " cannot be used in allowlist rule")); - } if (!this.allowlist && (option & NetworkRuleOption.AllowlistOnly) === option) { throw new SyntaxError("Modifier ".concat(NetworkRuleOption[option], " cannot be used in blacklist rule")); } @@ -63171,6 +66059,7 @@ var NetworkRule = /** @class */ (function () { * @throws an error if there is an unsupported modifier */ NetworkRule.prototype.loadOption = function (optionName, optionValue) { + var _this = this; var OPTIONS = NetworkRule.OPTIONS; if (optionName.startsWith(OPTIONS.NOOP)) { /** @@ -63184,185 +66073,255 @@ var NetworkRule = /** @class */ (function () { } switch (optionName) { // General options + // $third-party, $~first-party case OPTIONS.THIRD_PARTY: case NOT_MARK + OPTIONS.FIRST_PARTY: this.setOptionEnabled(NetworkRuleOption.ThirdParty, true); break; + // $first-party, $~third-party case NOT_MARK + OPTIONS.THIRD_PARTY: case OPTIONS.FIRST_PARTY: this.setOptionEnabled(NetworkRuleOption.ThirdParty, false); break; + // $match-case case OPTIONS.MATCH_CASE: this.setOptionEnabled(NetworkRuleOption.MatchCase, true); break; + // $~match-case case NOT_MARK + OPTIONS.MATCH_CASE: this.setOptionEnabled(NetworkRuleOption.MatchCase, false); break; + // $important case OPTIONS.IMPORTANT: this.setOptionEnabled(NetworkRuleOption.Important, true); break; - // $domain modifier - case OPTIONS.DOMAIN: { + // $domain + case OPTIONS.DOMAIN: + // eslint-disable-next-line no-case-declarations var domainModifier = new DomainModifier(optionValue, PIPE_SEPARATOR); this.permittedDomains = domainModifier.permittedDomains; this.restrictedDomains = domainModifier.restrictedDomains; break; - } - case OPTIONS.DENYALLOW: { + // $denyallow + case OPTIONS.DENYALLOW: this.setDenyAllowDomains(optionValue); break; + // $method modifier + case OPTIONS.METHOD: { + this.setOptionEnabled(NetworkRuleOption.Method, true); + this.methodModifier = new MethodModifier(optionValue); + break; + } + // $to modifier + case OPTIONS.TO: { + this.setOptionEnabled(NetworkRuleOption.To, true); + this.toModifier = new ToModifier(optionValue); + break; } // Document-level allowlist rules + // $elemhide case OPTIONS.ELEMHIDE: this.setOptionEnabled(NetworkRuleOption.Elemhide, true); + this.setRequestType(RequestType.Document, true); + this.setRequestType(RequestType.SubDocument, true); break; + // $generichide case OPTIONS.GENERICHIDE: this.setOptionEnabled(NetworkRuleOption.Generichide, true); + this.setRequestType(RequestType.Document, true); + this.setRequestType(RequestType.SubDocument, true); break; + // $specifichide case OPTIONS.SPECIFICHIDE: this.setOptionEnabled(NetworkRuleOption.Specifichide, true); + this.setRequestType(RequestType.Document, true); + this.setRequestType(RequestType.SubDocument, true); break; + // $genericblock case OPTIONS.GENERICBLOCK: this.setOptionEnabled(NetworkRuleOption.Genericblock, true); + this.setRequestType(RequestType.Document, true); + this.setRequestType(RequestType.SubDocument, true); break; + // $jsinject case OPTIONS.JSINJECT: this.setOptionEnabled(NetworkRuleOption.Jsinject, true); + this.setRequestType(RequestType.Document, true); + this.setRequestType(RequestType.SubDocument, true); break; + // $urlblock case OPTIONS.URLBLOCK: this.setOptionEnabled(NetworkRuleOption.Urlblock, true); + this.setRequestType(RequestType.Document, true); + this.setRequestType(RequestType.SubDocument, true); break; + // $content case OPTIONS.CONTENT: this.setOptionEnabled(NetworkRuleOption.Content, true); + this.setRequestType(RequestType.Document, true); + this.setRequestType(RequestType.SubDocument, true); break; - // $document + // $document, $doc case OPTIONS.DOCUMENT: case OPTIONS.DOC: - this.setOptionEnabled(NetworkRuleOption.Document, true); this.setRequestType(RequestType.Document, true); + // In the case of allowlist rules $document implicitly includes + // all these modifiers: `$content`, `$elemhide`, `$jsinject`, + // `$urlblock`. + if (this.isAllowlist()) { + this.setOptionEnabled(NetworkRuleOption.Elemhide, true, true); + this.setOptionEnabled(NetworkRuleOption.Jsinject, true, true); + this.setOptionEnabled(NetworkRuleOption.Urlblock, true, true); + this.setOptionEnabled(NetworkRuleOption.Content, true, true); + } break; + // $~document, $~doc case NOT_MARK + OPTIONS.DOCUMENT: case NOT_MARK + OPTIONS.DOC: - this.setOptionEnabled(NetworkRuleOption.Document, false); this.setRequestType(RequestType.Document, false); break; - // Stealth mode $stealth + // $stealh case OPTIONS.STEALTH: this.setOptionEnabled(NetworkRuleOption.Stealth, true); break; - // $popup blocking option + // $popup case OPTIONS.POPUP: + this.setRequestType(RequestType.Document, true); this.setOptionEnabled(NetworkRuleOption.Popup, true); break; - // $empty and $mp4 - // Deprecated in favor of $redirect - case OPTIONS.EMPTY: - this.setOptionEnabled(NetworkRuleOption.Empty, true); - break; - case OPTIONS.MP4: - this.setOptionEnabled(NetworkRuleOption.Mp4, true); - break; // Content type options + // $script case OPTIONS.SCRIPT: this.setRequestType(RequestType.Script, true); break; + // $~script case NOT_MARK + OPTIONS.SCRIPT: this.setRequestType(RequestType.Script, false); break; + // $stylesheet case OPTIONS.STYLESHEET: this.setRequestType(RequestType.Stylesheet, true); break; + // $~stylesheet case NOT_MARK + OPTIONS.STYLESHEET: this.setRequestType(RequestType.Stylesheet, false); break; + // $subdocument case OPTIONS.SUBDOCUMENT: this.setRequestType(RequestType.SubDocument, true); break; + // $~subdocument case NOT_MARK + OPTIONS.SUBDOCUMENT: this.setRequestType(RequestType.SubDocument, false); break; + // $object case OPTIONS.OBJECT: this.setRequestType(RequestType.Object, true); break; + // $~object case NOT_MARK + OPTIONS.OBJECT: this.setRequestType(RequestType.Object, false); break; + // $image case OPTIONS.IMAGE: this.setRequestType(RequestType.Image, true); break; + // $~image case NOT_MARK + OPTIONS.IMAGE: this.setRequestType(RequestType.Image, false); break; + // $xmlhttprequest case OPTIONS.XMLHTTPREQUEST: this.setRequestType(RequestType.XmlHttpRequest, true); break; + // $~xmlhttprequest case NOT_MARK + OPTIONS.XMLHTTPREQUEST: this.setRequestType(RequestType.XmlHttpRequest, false); break; + // $media case OPTIONS.MEDIA: this.setRequestType(RequestType.Media, true); break; + // $~media case NOT_MARK + OPTIONS.MEDIA: this.setRequestType(RequestType.Media, false); break; + // $font case OPTIONS.FONT: this.setRequestType(RequestType.Font, true); break; + // $~font case NOT_MARK + OPTIONS.FONT: this.setRequestType(RequestType.Font, false); break; + // $websocket case OPTIONS.WEBSOCKET: this.setRequestType(RequestType.WebSocket, true); break; + // $~websocket case NOT_MARK + OPTIONS.WEBSOCKET: this.setRequestType(RequestType.WebSocket, false); break; + // $other case OPTIONS.OTHER: this.setRequestType(RequestType.Other, true); break; + // $~other case NOT_MARK + OPTIONS.OTHER: this.setRequestType(RequestType.Other, false); break; + // $ping case OPTIONS.PING: this.setRequestType(RequestType.Ping, true); break; + // $~ping case NOT_MARK + OPTIONS.PING: this.setRequestType(RequestType.Ping, false); break; // Special modifiers + // $badfilter case OPTIONS.BADFILTER: this.setOptionEnabled(NetworkRuleOption.Badfilter, true); break; + // $csp case OPTIONS.CSP: this.setOptionEnabled(NetworkRuleOption.Csp, true); this.advancedModifier = new CspModifier(optionValue, this.isAllowlist()); break; + // $replace case OPTIONS.REPLACE: this.setOptionEnabled(NetworkRuleOption.Replace, true); this.advancedModifier = new ReplaceModifier(optionValue); break; + // $cookie case OPTIONS.COOKIE: this.setOptionEnabled(NetworkRuleOption.Cookie, true); this.advancedModifier = new CookieModifier(optionValue); break; + // $redirect case OPTIONS.REDIRECT: this.setOptionEnabled(NetworkRuleOption.Redirect, true); this.advancedModifier = new RedirectModifier(optionValue, this.ruleText, this.isAllowlist()); break; + // $redirect-rule case OPTIONS.REDIRECTRULE: this.setOptionEnabled(NetworkRuleOption.Redirect, true); this.advancedModifier = new RedirectModifier(optionValue, this.ruleText, this.isAllowlist(), true); break; + // $removeparam case OPTIONS.REMOVEPARAM: this.setOptionEnabled(NetworkRuleOption.RemoveParam, true); this.advancedModifier = new RemoveParamModifier(optionValue); break; + // $removeheader case OPTIONS.REMOVEHEADER: this.setOptionEnabled(NetworkRuleOption.RemoveHeader, true); this.advancedModifier = new RemoveHeaderModifier(optionValue, this.isAllowlist()); break; + // $jsonprune // simple validation of jsonprune rules for compiler // https://github.com/AdguardTeam/FiltersCompiler/issues/168 - case OPTIONS.JSONPRUNE: { + case OPTIONS.JSONPRUNE: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension does not support $jsonprune modifier yet'); } @@ -63370,10 +66329,10 @@ var NetworkRule = /** @class */ (function () { // TODO: should be properly implemented later // https://github.com/AdguardTeam/tsurlfilter/issues/71 break; - } + // $hls // simple validation of hls rules for compiler // https://github.com/AdguardTeam/FiltersCompiler/issues/169 - case OPTIONS.HLS: { + case OPTIONS.HLS: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension does not support $hls modifier yet'); } @@ -63381,65 +66340,84 @@ var NetworkRule = /** @class */ (function () { // TODO: should be properly implemented later // https://github.com/AdguardTeam/tsurlfilter/issues/72 break; - } // Dns modifiers - case OPTIONS.CLIENT: { + // $client + case OPTIONS.CLIENT: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $client modifier'); } this.setOptionEnabled(NetworkRuleOption.Client, true); this.advancedModifier = new ClientModifier(optionValue); break; - } - case OPTIONS.DNSREWRITE: { + // $dnsrewrite + case OPTIONS.DNSREWRITE: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $dnsrewrite modifier'); } this.setOptionEnabled(NetworkRuleOption.DnsRewrite, true); this.advancedModifier = new DnsRewriteModifier(optionValue); break; - } - case OPTIONS.DNSTYPE: { + // $dnstype + case OPTIONS.DNSTYPE: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $dnstype modifier'); } this.setOptionEnabled(NetworkRuleOption.DnsType, true); this.advancedModifier = new DnsTypeModifier(optionValue); break; - } - case OPTIONS.CTAG: { + // $ctag + case OPTIONS.CTAG: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $ctag modifier'); } this.setOptionEnabled(NetworkRuleOption.Ctag, true); this.advancedModifier = new CtagModifier(optionValue); break; - } - case OPTIONS.APP: { + // $app + case OPTIONS.APP: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $app modifier'); } this.appModifier = new AppModifier(optionValue); break; - } + // $network case OPTIONS.NETWORK: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $network modifier'); } this.setOptionEnabled(NetworkRuleOption.Network, true); break; + // $extension case OPTIONS.EXTENSION: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $extension modifier'); } this.setOptionEnabled(NetworkRuleOption.Extension, true); break; + // $~extension case NOT_MARK + OPTIONS.EXTENSION: if (isCompatibleWith(CompatibilityTypes.Extension)) { throw new SyntaxError('Extension doesn\'t support $extension modifier'); } this.setOptionEnabled(NetworkRuleOption.Extension, false); break; + // $all + case OPTIONS.ALL: + if (this.isAllowlist()) { + throw new SyntaxError('Rule with $all modifier can not be allowlist rule'); + } + // Set all request types + Object.values(RequestType).forEach(function (type) { + _this.setRequestType(type, true); + }); + this.setOptionEnabled(NetworkRuleOption.Popup, true); + break; + // $empty and $mp4 + // Deprecated in favor of $redirect + case OPTIONS.EMPTY: + case OPTIONS.MP4: + // Do nothing. + break; default: { // clear empty values var modifierView = [optionName, optionValue] @@ -63449,6 +66427,114 @@ var NetworkRule = /** @class */ (function () { } } }; + /** + * To calculate priority, we've categorized modifiers into different groups. + * These groups are ranked based on their priority, from lowest to highest. + * A modifier that significantly narrows the scope of a rule adds more + * weight to its total priority. Conversely, if a rule applies to a broader + * range of requests, its priority decreases. + * + * It's worth noting that there are cases where a single-parameter modifier + * has a higher priority than multi-parameter ones. For instance, in + * the case of `$domain=example.com|example.org`, a rule that includes two + * domains has a slightly broader effective area than a rule with one + * specified domain, therefore its priority is lower. + * + * The base priority weight of any rule is 1. If the calculated priority + * is a floating-point number, it will be **rounded up** to the smallest + * integer greater than or equal to the calculated weight. + * + * @see {@link NetworkRule.PermittedRequestTypeWeight} + * @see {@link NetworkRule.PermittedDomainWeight} + * @see {@link NetworkRule.SpecificExceptionsWeight} + * @see {@link NetworkRule.AllowlistRuleWeight} + * @see {@link NetworkRule.RedirectRuleWeight} + * @see {@link NetworkRule.ImportantRuleWeight} + * + * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-counting} + */ + NetworkRule.prototype.calculatePriorityWeight = function () { + var _a, _b; + // Base modifiers, category 1. + this.priorityWeight += countEnabledBits(this.enabledOptions, NetworkRule.CATEGORY_1_OPTIONS_MASK); + this.priorityWeight += countEnabledBits(this.disabledOptions, NetworkRule.CATEGORY_1_OPTIONS_MASK); + /** + * When dealing with a negated domain, app, method, or content-type, + * we add a point for the existence of the modifier itself, regardless + * of the quantity of negated domains or content-types. This is because + * the rule's scope is already infinitely broad. Put simply, + * by prohibiting multiple domains, content-types, methods or apps, + * the scope of the rule becomes only minimally smaller. + */ + if (this.denyAllowDomains && this.denyAllowDomains.length > 0) { + this.priorityWeight += 1; + } + if (this.restrictedDomains && this.restrictedDomains.length > 0) { + this.priorityWeight += 1; + } + if (((_a = this.methodModifier) === null || _a === void 0 ? void 0 : _a.restrictedValues) && this.methodModifier.restrictedValues.length > 0) { + this.priorityWeight += 1; + } + if (this.restrictedRequestTypes !== RequestType.NotSet) { + this.priorityWeight += 1; + } + // $to modifier is basically a replacement for a regular expression + // See https://github.com/AdguardTeam/KnowledgeBase/pull/196#discussion_r1221401215 + if (this.toModifier) { + this.priorityWeight += 1; + } + /** + * Category 2: permitted request types and methods. + * Specified content-types add `50 + 50 / number_of_content_types`, + * for example: `||example.com^$image,script` will add + * `50 + 50 / 2 = 50 + 25 = 75` to the total weight of the rule. + * The `$popup` also belongs to this category, because it implicitly + * adds the modifier `$document`. + * Similarly, specific exceptions add `$document,subdocument`. + */ + if (this.permittedRequestTypes !== RequestType.NotSet) { + var numberOfPermittedRequestTypes = getBitCount(this.permittedRequestTypes); + // More permitted request types mean less priority weight. + var relativeWeight = NetworkRule.CategoryTwoWeight / numberOfPermittedRequestTypes; + this.priorityWeight += NetworkRule.CategoryTwoWeight + relativeWeight; + } + if (((_b = this.methodModifier) === null || _b === void 0 ? void 0 : _b.permittedValues) && this.methodModifier.permittedValues.length > 0) { + // More permitted request methods mean less priority weight. + var relativeWeight = NetworkRule.CategoryTwoWeight / this.methodModifier.permittedValues.length; + this.priorityWeight += NetworkRule.CategoryTwoWeight + relativeWeight; + } + /** + * Category 3: permitted domains. + * Specified domains through `$domain` and specified applications + * through `$app` add `100 + 100 / number_domains (or number_applications)`, + * for example: + * `||example.com^$domain=example.com|example.org|example.net` + * will add `100 + 100 / 3 = 134.3 = 134` or + * `||example.com^$app=org.example.app1|org.example.app2` + * will add `100 + 100 / 2 = 151`. + */ + if (this.permittedDomains && this.permittedDomains.length > 0) { + // More permitted domains mean less priority weight. + var relativeWeight = NetworkRule.CategoryThreeWeight / this.permittedDomains.length; + this.priorityWeight += NetworkRule.CategoryThreeWeight + relativeWeight; + } + // Category 4: redirect rules. + if (this.isOptionEnabled(NetworkRuleOption.Redirect)) { + this.priorityWeight += NetworkRule.CategoryFourWeight; + } + // Category 5: specific exceptions. + this.priorityWeight += NetworkRule.CategoryFiveWeight * countEnabledBits(this.enabledOptions, NetworkRule.SPECIFIC_EXCLUSIONS_MASK); + // Category 6: allowlist rules. + if (this.isAllowlist()) { + this.priorityWeight += NetworkRule.CategorySixWeight; + } + // Category 7: important rules. + if (this.isOptionEnabled(NetworkRuleOption.Important)) { + this.priorityWeight += NetworkRule.CategorySevenWeight; + } + // Round up to avoid overlap between different categories of rules. + this.priorityWeight = Math.ceil(this.priorityWeight); + }; /** * Validates rule options */ @@ -63459,6 +66545,12 @@ var NetworkRule = /** @class */ (function () { else if (this.advancedModifier instanceof RemoveHeaderModifier) { this.validateRemoveHeaderRule(); } + else if (this.toModifier !== null) { + this.validateToRule(); + } + else if (this.denyAllowDomains !== null) { + this.validateDenyallowRule(); + } }; /** * $removeparam rules are not compatible with any other modifiers except $domain, @@ -63482,6 +66574,24 @@ var NetworkRule = /** @class */ (function () { throw new SyntaxError('$removeheader rules are not compatible with some other modifiers'); } }; + /** + * $to rules are not compatible $denyallow - these rules considered invalid + * and will be discarded. + */ + NetworkRule.prototype.validateToRule = function () { + if (this.denyAllowDomains) { + throw new SyntaxError('modifier $to is not compatible with $denyallow modifier'); + } + }; + /** + * $denyallow rules are not compatible $to - these rules considered invalid + * and will be discarded. + */ + NetworkRule.prototype.validateDenyallowRule = function () { + if (this.toModifier) { + throw new SyntaxError('modifier $to is not compatible with $denyallow modifier'); + } + }; /** * parseRuleText splits the rule text into multiple parts. * @param ruleText - original rule text @@ -63533,6 +66643,80 @@ var NetworkRule = /** @class */ (function () { } return ruleParts; }; + /** + * Rules with base modifiers, from category 1, each of them adds 1 + * to the weight of the rule. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-1 + */ + NetworkRule.CATEGORY_1_OPTIONS_MASK = NetworkRuleOption.ThirdParty + | NetworkRuleOption.MatchCase + | NetworkRuleOption.DnsRewrite; + /** + * The priority weight used in {@link calculatePriorityWeight} for rules + * with permitted request types and methods. + * The value 50 is chosen in order to cover (with a margin) all possible + * combinations and variations of rules from categories with a lower + * priority (each of them adds 1 to the rule priority). + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-2 + */ + NetworkRule.CategoryTwoWeight = 50; + /** + * The priority weight used in {@link calculatePriorityWeight} for rules + * with allowed domains. + * The value 100 is chosen to cover all possible combinations and variations + * of rules from categories with a lower priority, for example a rule with + * one allowed query type will get priority 100 (50 + 50/1), but for allowed + * domains with any number of domains we will get at least 101 (for 100 + * domains: 100 + 100/100; for 200 100 + 100/200; or even for 10000: + * 100 + 100/10000) because the resulting weight is rounded up. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-3 + */ + NetworkRule.CategoryThreeWeight = 100; + /** + * The priority weight used in {@link calculatePriorityWeight} + * for $redirect rules. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-6 + */ + NetworkRule.CategoryFourWeight = Math.pow(10, 3); + /** + * The priority weight used in {@link calculatePriorityWeight} for rules + * with specific exceptions. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-4 + */ + NetworkRule.CategoryFiveWeight = Math.pow(10, 4); + /** + * Rules with specific exclusions, from category 4, each of them adds + * {@link SpecificExceptionsWeight} to the weight of the rule. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-4 + */ + NetworkRule.SPECIFIC_EXCLUSIONS_MASK = NetworkRuleOption.Elemhide + | NetworkRuleOption.Generichide + | NetworkRuleOption.Specifichide + | NetworkRuleOption.Content + | NetworkRuleOption.Urlblock + | NetworkRuleOption.Genericblock + | NetworkRuleOption.Jsinject + | NetworkRuleOption.Extension; + /** + * The priority weight used in {@link calculatePriorityWeight} for rules + * with allowlist mark '@@'. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-5 + */ + NetworkRule.CategorySixWeight = Math.pow(10, 5); + /** + * The priority weight used in {@link calculatePriorityWeight} + * for $important rules. + * + * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-7 + */ + NetworkRule.CategorySevenWeight = Math.pow(10, 6); /** * Separates the rule pattern from the list of modifiers. * @@ -63603,7 +66787,7 @@ var HostRule = /** @class */ (function () { var stripped = commentIndex >= 0 ? ruleText.substring(0, commentIndex) : ruleText; var parts = stripped.trim().split(' '); if (parts.length >= 2) { - if (!isIp_1(parts[0])) { + if (!is_ip_default()(parts[0])) { this.invalid = true; return; } @@ -63668,10 +66852,12 @@ var MatchingResult = /** @class */ (function () { /** * Creates an instance of the MatchingResult struct and fills it with the rules. * - * @param rules network rules - * @param sourceRule source rule + * @param rules A list of network rules that match the request. + * @param sourceRule A rule that matches the document that is a source + * of the request, i.e. document-level exclusions. */ function MatchingResult(rules, sourceRule) { + var _a; this.basicRule = null; this.documentRule = null; this.cspRules = null; @@ -63680,7 +66866,6 @@ var MatchingResult = /** @class */ (function () { this.removeParamRules = null; this.removeHeaderRules = null; this.redirectRules = null; - this.cspRules = null; this.stealthRule = null; // eslint-disable-next-line no-param-reassign rules = MatchingResult.removeBadfilterRules(rules); @@ -63751,7 +66936,7 @@ var MatchingResult = /** @class */ (function () { continue; } // Check blocking rules against $genericblock / $urlblock - if (!rule.isAllowlist()) { + if (!rule.isAllowlist() && ((_a = this.documentRule) === null || _a === void 0 ? void 0 : _a.isHigherPriority(rule))) { if (!basicAllowed) { continue; } @@ -63767,9 +66952,10 @@ var MatchingResult = /** @class */ (function () { /** * GetBasicResult returns a rule that should be applied to the web request. * Possible outcomes are: - * returns nil -- bypass the request. - * returns a allowlist rule -- bypass the request. + * returns nil -- allow the request. + * returns an allowlist rule -- allow the request. * returns a blocking rule -- block the request. + * returns a redirect rule -- redirect the request. * * @return {NetworkRule | null} basic result rule */ @@ -63784,30 +66970,29 @@ var MatchingResult = /** @class */ (function () { } } // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#replace-modifier - // 1. $replace rules have a higher priority than other basic rules (including exception rules). - // So if a request corresponds to two different rules one of which has the $replace modifier, - // this rule will be applied. - // 2. $document exception rules and rules with $content or $replace modifiers do disable $replace rules - // for requests matching them. + // https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-extra + // $replace rules have a higher priority than other basic rules (including exception rules). + // So if a request corresponds to two different rules one of which has the $replace modifier, + // this rule will be applied. if (this.replaceRules) { - if (basic && basic.isAllowlist()) { - if (basic.isDocumentAllowlistRule()) { - return basic; - } - if (basic.isOptionEnabled(NetworkRuleOption.Replace) - || basic.isOptionEnabled(NetworkRuleOption.Content)) { - return basic; - } - } + var isReplaceOrContent = (basic === null || basic === void 0 ? void 0 : basic.isOptionEnabled(NetworkRuleOption.Replace)) + || (basic === null || basic === void 0 ? void 0 : basic.isOptionEnabled(NetworkRuleOption.Content)); + // If basic rule is an exception with $replace or $content modifier, + // then basic rule will disable $replace rules. + if ((basic === null || basic === void 0 ? void 0 : basic.isAllowlist()) && isReplaceOrContent) { + return basic; + } + // Otherwise null is returned to allow the request, because we need + // to get response first to then apply the $replace rules to + // the response. return null; } - // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#redirect-modifier // Redirect rules have a high priority + // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#redirect-modifier + // https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-6 var redirectRule = this.getRedirectRule(); - if (redirectRule) { - if (!basic || !basic.isHigherPriority(redirectRule)) { - return redirectRule; - } + if (redirectRule && (!basic || !basic.isHigherPriority(redirectRule))) { + return redirectRule; } return basic; }; @@ -63817,28 +67002,31 @@ var MatchingResult = /** @class */ (function () { * @return {CosmeticOption} mask */ MatchingResult.prototype.getCosmeticOption = function () { - var _a, _b; - if (((_a = this.basicRule) === null || _a === void 0 ? void 0 : _a.isDocumentAllowlistRule()) || ((_b = this.documentRule) === null || _b === void 0 ? void 0 : _b.isDocumentAllowlistRule())) { - return CosmeticOption.CosmeticOptionNone; - } - if (!this.basicRule || !this.basicRule.isAllowlist()) { + var _a = this, basicRule = _a.basicRule, documentRule = _a.documentRule; + var rule = basicRule; + // We choose a non-empty rule and the one of the two with the higher + // priority in order to accurately calculate cosmetic options. + if ((!rule && documentRule) || (rule && (documentRule === null || documentRule === void 0 ? void 0 : documentRule.isHigherPriority(rule)))) { + rule = documentRule; + } + if (!rule || !rule.isAllowlist()) { return CosmeticOption.CosmeticOptionAll; } var option = CosmeticOption.CosmeticOptionAll; - if (this.basicRule.isOptionEnabled(NetworkRuleOption.Elemhide)) { + if (rule.isOptionEnabled(NetworkRuleOption.Elemhide)) { option ^= CosmeticOption.CosmeticOptionGenericCSS; option ^= CosmeticOption.CosmeticOptionSpecificCSS; } - if (this.basicRule.isOptionEnabled(NetworkRuleOption.Generichide)) { + if (rule.isOptionEnabled(NetworkRuleOption.Generichide)) { option ^= CosmeticOption.CosmeticOptionGenericCSS; } - if (this.basicRule.isOptionEnabled(NetworkRuleOption.Specifichide)) { + if (rule.isOptionEnabled(NetworkRuleOption.Specifichide)) { option ^= CosmeticOption.CosmeticOptionSpecificCSS; } - if (this.basicRule.isOptionEnabled(NetworkRuleOption.Jsinject)) { + if (rule.isOptionEnabled(NetworkRuleOption.Jsinject)) { option ^= CosmeticOption.CosmeticOptionJS; } - if (this.basicRule.isOptionEnabled(NetworkRuleOption.Content)) { + if (rule.isOptionEnabled(NetworkRuleOption.Content)) { option ^= CosmeticOption.CosmeticOptionHtml; } return option; @@ -63936,35 +67124,39 @@ var MatchingResult = /** @class */ (function () { return Array.from(rulesByDirective.values()); }; /** - * Returns a redirect rule + * Returns a redirect rule or null if redirect rules are empty. + * $redirect-rule is only returned if there's a blocking rule also matching + * this request. */ MatchingResult.prototype.getRedirectRule = function () { if (!this.redirectRules) { return null; } + // Apply allowlist $redirect rules. var result = MatchingResult.filterAdvancedModifierRules(this.redirectRules, function (rule) { return (function (x) { return x.getAdvancedModifierValue() === rule.getAdvancedModifierValue(); }); }); + // Filters only not allowlist rules. result = result.filter(function (r) { return !r.isAllowlist(); }); - var conditionalRedirectRules = result.filter(function (x) { - var redirectModifier = x.getAdvancedModifier(); - return redirectModifier.isRedirectingOnlyBlocked; + // Splits $redirect and $redirect-rule into separate arrays. + var conditionalRedirectRules = []; + var allWeatherRedirectRules = []; + result.forEach(function (rule) { + var redirectModifier = rule.getAdvancedModifier(); + if (redirectModifier.isRedirectingOnlyBlocked) { + conditionalRedirectRules.push(rule); + } + else { + allWeatherRedirectRules.push(rule); + } }); - var allWeatherRedirectRules = result.filter(function (x) { return !conditionalRedirectRules.includes(x); }); if (allWeatherRedirectRules.length > 0) { - return allWeatherRedirectRules.sort(function (a, b) { return (b.isOptionEnabled(NetworkRuleOption.Important) - && !a.isOptionEnabled(NetworkRuleOption.Important) ? 1 : -1); })[0]; + return allWeatherRedirectRules + .sort(function (a, b) { return (b.isHigherPriority(a) ? 1 : -1); })[0]; } - if (conditionalRedirectRules.length === 0) { - return null; - } - var resultRule = conditionalRedirectRules.sort(function (a, b) { return (b.isOptionEnabled(NetworkRuleOption.Important) - && !a.isOptionEnabled(NetworkRuleOption.Important) ? 1 : -1); })[0]; - var redirectModifier = resultRule.getAdvancedModifier(); - if (redirectModifier && redirectModifier.isRedirectingOnlyBlocked) { - if (!(this.basicRule && !this.basicRule.isAllowlist())) { - return null; - } + if (conditionalRedirectRules.length > 0 && this.basicRule && !this.basicRule.isAllowlist()) { + return conditionalRedirectRules + .sort(function (a, b) { return (b.isHigherPriority(a) ? 1 : -1); })[0]; } - return resultRule; + return null; }; /** * Returns an array of cookie rules @@ -63974,7 +67166,7 @@ var MatchingResult = /** @class */ (function () { return []; } var basic = this.getBasicResult(); - if (basic === null || basic === void 0 ? void 0 : basic.isDocumentAllowlistRule()) { + if ((basic === null || basic === void 0 ? void 0 : basic.isAllowlist()) && basic.isOptionEnabled(NetworkRuleOption.Urlblock)) { return []; } var allowlistPredicate = function (rule) { return (function (allowlistRule) { @@ -64640,24 +67832,29 @@ var NetworkEngine = /** @class */ (function () { /** * Request represents a web request with all it's necessary properties */ -var Request$1 = /** @class */ (function () { +var Request = /** @class */ (function () { /** * Creates an instance of a Request * * @param url - request URL * @param sourceUrl - source URL * @param requestType - request type + * @param method - request method * * @throws */ - function Request(url, sourceUrl, requestType) { + function Request(url, sourceUrl, requestType, method) { /** * the request is for a given Hostname, and not for a URL, and we don't really know what protocol it is. * This can be true for DNS requests, or for HTTP CONNECT, or SNI matching. */ this.isHostnameRequest = false; + if (typeof url !== 'string') { + throw new TypeError("Invalid request url: ".concat(url)); + } this.url = url; this.requestType = requestType; + this.method = method; this.urlLowercase = Request.compactUrl(url).toLowerCase(); this.sourceUrl = Request.compactUrl(sourceUrl); var tldResult = parse(url); @@ -64804,7 +68001,7 @@ var DnsEngine = /** @class */ (function () { return result; } var url = "http://".concat(hostname, "/"); - var request = new Request$1(url, url, RequestType.Document); + var request = new Request(url, url, RequestType.Document); request.isHostnameRequest = true; var networkRule = this.networkEngine.match(request); if (networkRule) { @@ -64847,6 +68044,8 @@ var DnsEngine = /** @class */ (function () { return DnsEngine; }()); +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; + var lru = {exports: {}}; (function (module, exports) { @@ -65704,7 +68903,7 @@ var CosmeticRule = /** @class */ (function () { }; CosmeticRule.validateJsRules = function (ruleText, ruleContent) { if (ruleContent.startsWith(ADG_SCRIPTLET_MASK)) { - if (!scriptlets_umd.exports.isValidScriptletRule(ruleText)) { + if (!scriptlets_umd_default().isValidScriptletRule(ruleText)) { throw new SyntaxError('Invalid scriptlet'); } } @@ -65829,20 +69028,20 @@ var CosmeticRule = /** @class */ (function () { var scriptletParams = ScriptletParser.parseRule(scriptletContent); var params = { args: scriptletParams.args, - engine: config$2.engine || '', + engine: config.engine || '', name: scriptletParams.name, ruleText: this.getText(), verbose: debug, domainName: request === null || request === void 0 ? void 0 : request.domain, - version: config$2.version || '', + version: config.version || '', }; this.scriptData = { - code: (_a = scriptlets_umd.exports.invoke(params)) !== null && _a !== void 0 ? _a : null, + code: (_a = scriptlets_umd_default().invoke(params)) !== null && _a !== void 0 ? _a : null, debug: debug, domain: request === null || request === void 0 ? void 0 : request.domain, }; this.scriptletData = { - func: scriptlets_umd.exports.getScriptletFunction(params.name), + func: scriptlets_umd_default().getScriptletFunction(params.name), params: params, }; }; @@ -66080,6 +69279,9 @@ var Engine = /** @class */ (function () { Engine.prototype.matchRequest = function (request, frameRule) { if (frameRule === void 0) { frameRule = null; } var cacheKey = "".concat(request.url, "#").concat(request.sourceHostname, "#").concat(request.requestType); + if (request.method) { + cacheKey += "#".concat(request.method); + } /** * Add frame url text to the key to avoid caching, * because allowlist rules are not stored in the engine @@ -66103,7 +69305,7 @@ var Engine = /** @class */ (function () { * @param frameUrl */ Engine.prototype.matchFrame = function (frameUrl) { - var sourceRequest = new Request$1(frameUrl, '', RequestType.Document); + var sourceRequest = new Request(frameUrl, '', RequestType.Document); var sourceRules = this.networkEngine.matchAll(sourceRequest); sourceRules = MatchingResult.removeBadfilterRules(sourceRules); var result = null; @@ -66212,17 +69414,25 @@ var RuleFactory = /** @class */ (function () { * Creates rule of suitable class from text string * It returns null if the line is empty or if it is a comment * + * TODO: Pack `ignore*` parameters and `silent` into one object with flags. + * * @param text rule string * @param filterListId list id * @param ignoreNetwork do not create network rules * @param ignoreCosmetic do not create cosmetic rules * @param ignoreHost do not create host rules + * @param silent Log the error for `true`, otherwise throw an exception on + * a rule creation + * + * @throws Error when `silent` flag is passed as false on rule creation error. + * * @return IRule object or null */ - RuleFactory.createRule = function (text, filterListId, ignoreNetwork, ignoreCosmetic, ignoreHost) { + RuleFactory.createRule = function (text, filterListId, ignoreNetwork, ignoreCosmetic, ignoreHost, silent) { if (ignoreNetwork === void 0) { ignoreNetwork = false; } if (ignoreCosmetic === void 0) { ignoreCosmetic = false; } if (ignoreHost === void 0) { ignoreHost = true; } + if (silent === void 0) { silent = true; } if (!text || RuleFactory.isComment(text)) { return null; } @@ -66248,8 +69458,13 @@ var RuleFactory = /** @class */ (function () { } } catch (e) { - // TODO: Throw error - logger.info("Error: \"".concat(e.message, "\" in the rule: \"").concat(line, "\"")); + var msg = "\"".concat(e.message, "\" in the rule: \"").concat(line, "\""); + if (silent) { + logger.info("Error: ".concat(msg)); + } + else { + throw new Error(msg); + } } return null; }; @@ -66792,16 +70007,14 @@ var RuleConverter = /** @class */ (function () { * Converts rules text * * @param rulesText - * @param conversionOptions */ - RuleConverter.convertRules = function (rulesText, conversionOptions) { - if (conversionOptions === void 0) { conversionOptions = {}; } + RuleConverter.convertRules = function (rulesText) { var result = []; var lines = rulesText.split(/\r?\n/); for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) { var line = lines_1[_i]; try { - result.push.apply(result, RuleConverter.convertRule(line, conversionOptions)); + result.push.apply(result, RuleConverter.convertRule(line)); } catch (e) { logger.warn(e.message); @@ -66815,10 +70028,8 @@ var RuleConverter = /** @class */ (function () { * Convert external scriptlet rule to AdGuard scriptlet syntax * * @param rawRule - * @param conversionOptions */ - RuleConverter.convertRule = function (rawRule, conversionOptions) { - if (conversionOptions === void 0) { conversionOptions = {}; } + RuleConverter.convertRule = function (rawRule) { var rule = rawRule.trim(); if (rule.startsWith(SimpleRegex.MASK_COMMENT) || rule === '') { return [rule]; @@ -66846,14 +70057,14 @@ var RuleConverter = /** @class */ (function () { var optionsParts = domainAndOptions[1]; if (optionsParts) { optionsParts = RuleConverter.replaceOptions(optionsParts); - var ruleWithConvertedOptions = RuleConverter.convertOptions(domain, optionsParts, conversionOptions); + var ruleWithConvertedOptions = RuleConverter.convertOptions(domain, optionsParts); if (ruleWithConvertedOptions) { return ruleWithConvertedOptions; } converted = "".concat(domain, "$").concat(optionsParts.join(',')); } } - var scriptletRules = scriptlets_umd.exports.convertScriptletToAdg(converted); + var scriptletRules = scriptlets_umd_default().convertScriptletToAdg(converted); // TODO Check if isValidScriptletRule call is needed here, looks like convertScriptletToAdg // should already return a valid scriptlet. if (scriptletRules && scriptletRules.every(function (x) { return RuleConverter.isValidScriptletRule(x); })) { @@ -66876,7 +70087,7 @@ var RuleConverter = /** @class */ (function () { RuleConverter.isValidScriptletRule = function (ruleText) { try { // checks whether the ADG scriptlet rule name is valid - return scriptlets_umd.exports.isValidScriptletRule(ruleText); + return scriptlets_umd_default().isValidScriptletRule(ruleText); } catch (e) { return false; @@ -66926,7 +70137,7 @@ var RuleConverter = /** @class */ (function () { * @return {string} convertedRule */ RuleConverter.convertUboAndAbpRedirectsToAdg = function (rule) { - var redirects = scriptlets_umd.exports.redirects; + var redirects = (scriptlets_umd_default()).redirects; if (redirects.isUboRedirectCompatibleWithAdg(rule) || redirects.isAbpRedirectCompatibleWithAdg(rule)) { return redirects.convertRedirectToAdg(rule); } @@ -66936,11 +70147,9 @@ var RuleConverter = /** @class */ (function () { * Converts the rule options according to the conversion map and handles special cases. * @param domainPart - The domain part of the rule. * @param optionsParts - The options part of the rule as an array of strings. - * @param conversionOptions - Optional conversion options object. * @private */ - RuleConverter.convertOptions = function (domainPart, optionsParts, conversionOptions) { - if (conversionOptions === void 0) { conversionOptions = {}; } + RuleConverter.convertOptions = function (domainPart, optionsParts) { var NAME_VALUE_SPLITTER = '='; var areOptionsConverted = false; var updatedOptionsParts = optionsParts.map(function (optionsPart) { @@ -66966,35 +70175,6 @@ var RuleConverter = /** @class */ (function () { var updatedCspOption = "csp".concat(NAME_VALUE_SPLITTER).concat(cspValues.join('; ')); updatedOptionsParts = allButCsp.concat(updatedCspOption); } - // Options without all modifier - var hasAllOption = updatedOptionsParts.indexOf('all') > -1; - if (hasAllOption && !conversionOptions.ignoreAllModifier) { - // $all modifier should be converted in 4 rules: - // ||example.org^$document,popup - // ||example.org^ - // ||example.org^$inline-font - // ||example.org^$inline-script - var allOptionReplacers = [ - ['document', 'popup'], - ['inline-script'], - ['inline-font'], - [''], - ]; - return allOptionReplacers.map(function (replacers) { - // Remove replacer and all option from the list - var optionsButAllAndReplacer = updatedOptionsParts - .filter(function (option) { return !(replacers.includes(option) || option === 'all'); }); - // Try get converted values, used for INLINE_SCRIPT_OPTION, INLINE_FONT_OPTION - var convertedReplacers = replacers.map(function (replacer) { - return RuleConverter.OPTIONS_CONVERSION_MAP.get(replacer) || replacer; - }); - // Add replacer to the list of options - var updatedOptionsString = __spreadArray(__spreadArray([], convertedReplacers, true), optionsButAllAndReplacer, true).filter(function (entity) { return entity; }) - .join(','); - // Create a new rule - return updatedOptionsString.length < 1 ? domainPart : "".concat(domainPart, "$").concat(updatedOptionsString); - }); - } if (areOptionsConverted) { var updatedOptions = updatedOptionsParts.join(','); return ["".concat(domainPart, "$").concat(updatedOptions)]; @@ -67187,7 +70367,7 @@ var RuleConverter = /** @class */ (function () { if (ruleText.startsWith(SimpleRegex.MASK_COMMENT)) { return ruleText; } - var _a = findCosmeticRuleMarker(ruleText), markerIndex = _a[0], marker = _a[1]; + var _b = findCosmeticRuleMarker(ruleText), markerIndex = _b[0], marker = _b[1]; if (!marker) { return ruleText; } @@ -67244,7 +70424,7 @@ var RuleConverter = /** @class */ (function () { */ RuleConverter.replaceOptions = function (optionsParts) { var resultOptions = optionsParts.map(function (option) { - var _a = option.split('=', 2), optionNameRaw = _a[0], optionValue = _a[1]; + var _b = option.split('=', 2), optionNameRaw = _b[0], optionValue = _b[1]; var isNegated = optionNameRaw.startsWith('~'); var optionName = isNegated ? optionNameRaw.slice(1) : optionNameRaw; var convertedOptionName = RuleConverter.OPTIONS_ALIASES[optionName]; @@ -67258,6 +70438,8 @@ var RuleConverter = /** @class */ (function () { }); return resultOptions; }; + var _a; + _a = RuleConverter; RuleConverter.CSS_RULE_REPLACE_PATTERN = /(.*):style\((.*)\)/g; // eslint-disable-next-line max-len RuleConverter.SCRIPT_HAS_TEXT_REGEX = /##\^(script(\[[{a-z0-9-_.:}]*(="[{a-z0-9-_.:}]*")*\])*:(has-text|contains))\((?!\/.+\/\))/i; @@ -67286,19 +70468,29 @@ var RuleConverter = /** @class */ (function () { RuleConverter.MASK_CSS_EXCEPTION_INJECT_EXTENDED_CSS_RULE = '#@$?#'; RuleConverter.REMOVE_RULE_PATTERN = ':remove()'; RuleConverter.REMOVE_RULE_REPLACER = ' { remove: true; }'; + /** + * Special characters + */ + RuleConverter.REGEXP_DELIMITER = '/'; + RuleConverter.ESCAPING_SLASH = '\\'; /** * Splits the given rule text into domain and options parts using the options delimiter ($). * Returns the domain part and an array of options, or null if no options are present. + * * @param ruleText - The rule text to be split. + * @returns [domain, options] or [domain, null] if no options are present. */ RuleConverter.splitIntoDomainAndOptions = function (ruleText) { var optionsDelimiterIdx = -1; + var inRegExp = false; for (var i = ruleText.length - 1; i >= 0; i -= 1) { - if (ruleText[i] === OPTIONS_DELIMITER - && ruleText[i + 1] !== '/' // not an end of regex /^bla$/ - && ruleText[i - 1] !== '\\' // not a escaped delimiter - ) { + if (!inRegExp && ruleText[i] === OPTIONS_DELIMITER) { optionsDelimiterIdx = i; + break; + } + if (ruleText[i] === _a.REGEXP_DELIMITER + && (i === 0 || ruleText[i - 1] !== _a.ESCAPING_SLASH)) { + inRegExp = !inRegExp; } } if (optionsDelimiterIdx === -1) { @@ -67306,7 +70498,8 @@ var RuleConverter = /** @class */ (function () { } var domainPart = ruleText.slice(0, optionsDelimiterIdx); var optionsPart = ruleText.slice(optionsDelimiterIdx + 1); - var optionsParts = parseOptionsString(optionsPart); + // do not remove escape characters from regexp modifiers values + var optionsParts = parseOptionsString(optionsPart, false); return [domainPart, optionsParts]; }; /** @@ -67314,7 +70507,9 @@ var RuleConverter = /** @class */ (function () { * @private */ RuleConverter.OPTIONS_CONVERSION_MAP = new Map([ + // See https://adguard.com/kb/general/ad-filtering/create-own-filters/#empty-modifier ['empty', 'redirect=nooptext'], + // See https://adguard.com/kb/general/ad-filtering/create-own-filters/#mp4-modifier ['mp4', 'redirect=noopmp4-1s'], ['inline-script', "csp=script-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:"], ['inline-font', "csp=font-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:"], @@ -67335,108 +70530,803 @@ var RuleConverter = /** @class */ (function () { ehide: 'elemhide', shide: 'specifichide', }; - return RuleConverter; -}()); - -/** - * Module, which can be used to validate filter rules in other libraries - */ -var RuleValidator = /** @class */ (function () { - function RuleValidator() { + return RuleConverter; +}()); + +/** + * Module, which can be used to validate filter rules in other libraries + */ +var RuleValidator = /** @class */ (function () { + function RuleValidator() { + } + /** + * Creates validation result + * @param valid + * @param error + * @private + */ + RuleValidator.createValidationResult = function (valid, error) { + if (error) { + return { valid: valid, error: error }; + } + return { valid: valid, error: null }; + }; + RuleValidator.validateRegexp = function (pattern, ruleText) { + if (pattern.startsWith(SimpleRegex.MASK_REGEX_RULE) + && pattern.endsWith(SimpleRegex.MASK_REGEX_RULE)) { + try { + new RegExp(pattern.slice(1, -1)); + } + catch (e) { + throw new SyntaxError("Rule has invalid regex pattern: \"".concat(ruleText, "\"")); + } + } + }; + /** + * Validates raw rule string + * @param rawRule + */ + RuleValidator.validate = function (rawRule) { + var ruleText = rawRule.trim(); + if (!ruleText || RuleFactory.isComment(ruleText)) { + return RuleValidator.createValidationResult(true); + } + if (RuleFactory.isShort(ruleText)) { + return RuleValidator.createValidationResult(false, "Rule is too short: ".concat(ruleText)); + } + try { + // Validate cosmetic rules + if (RuleFactory.isCosmetic(ruleText)) { + new CosmeticRule(ruleText, 0); + return RuleValidator.createValidationResult(true); + } + // Validate network rules + var rule = new NetworkRule(ruleText, 0); + RuleValidator.validateRegexp(rule.getPattern(), rule.getText()); + } + catch (e) { + var errorMessage = "Error: \"".concat(e.message, "\" in the rule: \"").concat(ruleText, "\""); + return RuleValidator.createValidationResult(false, errorMessage); + } + return RuleValidator.createValidationResult(true); + // TODO validate host rules + }; + return RuleValidator; +}()); + +/** + * Module with miscellaneous syntax utils exposed in API + */ +var RuleSyntaxUtils = /** @class */ (function () { + function RuleSyntaxUtils() { + } + /** + * Checks if rule can be matched by domain + * @param ruleText + * @param domain + */ + RuleSyntaxUtils.isRuleForDomain = function (ruleText, domain) { + var rule = RuleFactory.createRule(ruleText, this.DUMMY_FILTER_ID); + if (!rule) { + return false; + } + return rule.matchesPermittedDomains(domain); + }; + /** + * Checks if rule can be matched by url + * @param ruleText + * @param url + */ + RuleSyntaxUtils.isRuleForUrl = function (ruleText, url) { + var domain = getHostname(url); + if (!domain) { + return false; + } + return this.isRuleForDomain(ruleText, domain); + }; + RuleSyntaxUtils.DUMMY_FILTER_ID = 0; + return RuleSyntaxUtils; +}()); + + + +// EXTERNAL MODULE: ../tswebextension/node_modules/webextension-polyfill/dist/browser-polyfill.js +var dist_browser_polyfill = __webpack_require__(554); +var dist_browser_polyfill_default = /*#__PURE__*/__webpack_require__.n(dist_browser_polyfill); +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/domain.js +/** + * Check if `vhost` is a valid suffix of `hostname` (top-domain) + * + * It means that `vhost` needs to be a suffix of `hostname` and we then need to + * make sure that: either they are equal, or the character preceding `vhost` in + * `hostname` is a '.' (it should not be a partial label). + * + * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok + * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok + * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok + */ +function domain_shareSameDomainSuffix(hostname, vhost) { + if (hostname.endsWith(vhost)) { + return (hostname.length === vhost.length || + hostname[hostname.length - vhost.length - 1] === '.'); + } + return false; +} +/** + * Given a hostname and its public suffix, extract the general domain. + */ +function domain_extractDomainWithSuffix(hostname, publicSuffix) { + // Locate the index of the last '.' in the part of the `hostname` preceding + // the public suffix. + // + // examples: + // 1. not.evil.co.uk => evil.co.uk + // ^ ^ + // | | start of public suffix + // | index of the last dot + // + // 2. example.co.uk => example.co.uk + // ^ ^ + // | | start of public suffix + // | + // | (-1) no dot found before the public suffix + const publicSuffixIndex = hostname.length - publicSuffix.length - 2; + const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex); + // No '.' found, then `hostname` is the general domain (no sub-domain) + if (lastDotBeforeSuffixIndex === -1) { + return hostname; + } + // Extract the part between the last '.' + return hostname.slice(lastDotBeforeSuffixIndex + 1); +} +/** + * Detects the domain based on rules and upon and a host string + */ +function domain_getDomain(suffix, hostname, options) { + // Check if `hostname` ends with a member of `validHosts`. + if (options.validHosts !== null) { + const validHosts = options.validHosts; + for (const vhost of validHosts) { + if ( /*@__INLINE__*/domain_shareSameDomainSuffix(hostname, vhost)) { + return vhost; + } + } + } + let numberOfLeadingDots = 0; + if (hostname.startsWith('.')) { + while (numberOfLeadingDots < hostname.length && + hostname[numberOfLeadingDots] === '.') { + numberOfLeadingDots += 1; + } + } + // If `hostname` is a valid public suffix, then there is no domain to return. + // Since we already know that `getPublicSuffix` returns a suffix of `hostname` + // there is no need to perform a string comparison and we only compare the + // size. + if (suffix.length === hostname.length - numberOfLeadingDots) { + return null; + } + // To extract the general domain, we start by identifying the public suffix + // (if any), then consider the domain to be the public suffix with one added + // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix: + // `co.uk`, then we take one more level: `evil`, giving the final result: + // `evil.co.uk`). + return /*@__INLINE__*/ domain_extractDomainWithSuffix(hostname, suffix); +} +//# sourceMappingURL=domain.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/domain-without-suffix.js +/** + * Return the part of domain without suffix. + * + * Example: for domain 'foo.com', the result would be 'foo'. + */ +function domain_without_suffix_getDomainWithoutSuffix(domain, suffix) { + // Note: here `domain` and `suffix` cannot have the same length because in + // this case we set `domain` to `null` instead. It is thus safe to assume + // that `suffix` is shorter than `domain`. + return domain.slice(0, -suffix.length - 1); +} +//# sourceMappingURL=domain-without-suffix.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/extract-hostname.js +/** + * @param url - URL we want to extract a hostname from. + * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname. + */ +function extract_hostname_extractHostname(url, urlIsValidHostname) { + let start = 0; + let end = url.length; + let hasUpper = false; + // If url is not already a valid hostname, then try to extract hostname. + if (!urlIsValidHostname) { + // Special handling of data URLs + if (url.startsWith('data:')) { + return null; + } + // Trim leading spaces + while (start < url.length && url.charCodeAt(start) <= 32) { + start += 1; + } + // Trim trailing spaces + while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { + end -= 1; + } + // Skip scheme. + if (url.charCodeAt(start) === 47 /* '/' */ && + url.charCodeAt(start + 1) === 47 /* '/' */) { + start += 2; + } + else { + const indexOfProtocol = url.indexOf(':/', start); + if (indexOfProtocol !== -1) { + // Implement fast-path for common protocols. We expect most protocols + // should be one of these 4 and thus we will not need to perform the + // more expansive validity check most of the time. + const protocolSize = indexOfProtocol - start; + const c0 = url.charCodeAt(start); + const c1 = url.charCodeAt(start + 1); + const c2 = url.charCodeAt(start + 2); + const c3 = url.charCodeAt(start + 3); + const c4 = url.charCodeAt(start + 4); + if (protocolSize === 5 && + c0 === 104 /* 'h' */ && + c1 === 116 /* 't' */ && + c2 === 116 /* 't' */ && + c3 === 112 /* 'p' */ && + c4 === 115 /* 's' */) { + // https + } + else if (protocolSize === 4 && + c0 === 104 /* 'h' */ && + c1 === 116 /* 't' */ && + c2 === 116 /* 't' */ && + c3 === 112 /* 'p' */) { + // http + } + else if (protocolSize === 3 && + c0 === 119 /* 'w' */ && + c1 === 115 /* 's' */ && + c2 === 115 /* 's' */) { + // wss + } + else if (protocolSize === 2 && + c0 === 119 /* 'w' */ && + c1 === 115 /* 's' */) { + // ws + } + else { + // Check that scheme is valid + for (let i = start; i < indexOfProtocol; i += 1) { + const lowerCaseCode = url.charCodeAt(i) | 32; + if (!(((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z] + (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9] + lowerCaseCode === 46 || // '.' + lowerCaseCode === 45 || // '-' + lowerCaseCode === 43) // '+' + )) { + return null; + } + } + } + // Skip 0, 1 or more '/' after ':/' + start = indexOfProtocol + 2; + while (url.charCodeAt(start) === 47 /* '/' */) { + start += 1; + } + } + } + // Detect first occurrence of '/', '?' or '#'. We also keep track of the + // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of + // (respectively), identifier, ipv6 or port. + let indexOfIdentifier = -1; + let indexOfClosingBracket = -1; + let indexOfPort = -1; + for (let i = start; i < end; i += 1) { + const code = url.charCodeAt(i); + if (code === 35 || // '#' + code === 47 || // '/' + code === 63 // '?' + ) { + end = i; + break; + } + else if (code === 64) { + // '@' + indexOfIdentifier = i; + } + else if (code === 93) { + // ']' + indexOfClosingBracket = i; + } + else if (code === 58) { + // ':' + indexOfPort = i; + } + else if (code >= 65 && code <= 90) { + hasUpper = true; + } + } + // Detect identifier: '@' + if (indexOfIdentifier !== -1 && + indexOfIdentifier > start && + indexOfIdentifier < end) { + start = indexOfIdentifier + 1; + } + // Handle ipv6 addresses + if (url.charCodeAt(start) === 91 /* '[' */) { + if (indexOfClosingBracket !== -1) { + return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); + } + return null; + } + else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { + // Detect port: ':' + end = indexOfPort; + } + } + // Trim trailing dots + while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) { + end -= 1; + } + const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; + if (hasUpper) { + return hostname.toLowerCase(); + } + return hostname; +} +//# sourceMappingURL=extract-hostname.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/is-ip.js +/** + * Check if a hostname is an IP. You should be aware that this only works + * because `hostname` is already garanteed to be a valid hostname! + */ +function is_ip_isProbablyIpv4(hostname) { + // Cannot be shorted than 1.1.1.1 + if (hostname.length < 7) { + return false; + } + // Cannot be longer than: 255.255.255.255 + if (hostname.length > 15) { + return false; + } + let numberOfDots = 0; + for (let i = 0; i < hostname.length; i += 1) { + const code = hostname.charCodeAt(i); + if (code === 46 /* '.' */) { + numberOfDots += 1; + } + else if (code < 48 /* '0' */ || code > 57 /* '9' */) { + return false; + } + } + return (numberOfDots === 3 && + hostname.charCodeAt(0) !== 46 /* '.' */ && + hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */); +} +/** + * Similar to isProbablyIpv4. + */ +function is_ip_isProbablyIpv6(hostname) { + if (hostname.length < 3) { + return false; + } + let start = hostname.startsWith('[') ? 1 : 0; + let end = hostname.length; + if (hostname[end - 1] === ']') { + end -= 1; + } + // We only consider the maximum size of a normal IPV6. Note that this will + // fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case + // and a proper validation library should be used for these. + if (end - start > 39) { + return false; + } + let hasColon = false; + for (; start < end; start += 1) { + const code = hostname.charCodeAt(start); + if (code === 58 /* ':' */) { + hasColon = true; + } + else if (!(((code >= 48 && code <= 57) || // 0-9 + (code >= 97 && code <= 102) || // a-f + (code >= 65 && code <= 90)) // A-F + )) { + return false; + } + } + return hasColon; +} +/** + * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4). + * This *will not* work on any string. We need `hostname` to be a valid + * hostname. + */ +function is_ip_isIp(hostname) { + return is_ip_isProbablyIpv6(hostname) || is_ip_isProbablyIpv4(hostname); +} +//# sourceMappingURL=is-ip.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/is-valid.js +/** + * Implements fast shallow verification of hostnames. This does not perform a + * struct check on the content of labels (classes of Unicode characters, etc.) + * but instead check that the structure is valid (number of labels, length of + * labels, etc.). + * + * If you need stricter validation, consider using an external library. + */ +function is_valid_isValidAscii(code) { + return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127); +} +/** + * Check if a hostname string is valid. It's usually a preliminary check before + * trying to use getDomain or anything else. + * + * Beware: it does not check if the TLD exists. + */ +/* harmony default export */ function src_is_valid(hostname) { + if (hostname.length > 255) { + return false; + } + if (hostname.length === 0) { + return false; + } + if ( + /*@__INLINE__*/ !is_valid_isValidAscii(hostname.charCodeAt(0)) && + hostname.charCodeAt(0) !== 46 && // '.' (dot) + hostname.charCodeAt(0) !== 95 // '_' (underscore) + ) { + return false; + } + // Validate hostname according to RFC + let lastDotIndex = -1; + let lastCharCode = -1; + const len = hostname.length; + for (let i = 0; i < len; i += 1) { + const code = hostname.charCodeAt(i); + if (code === 46 /* '.' */) { + if ( + // Check that previous label is < 63 bytes long (64 = 63 + '.') + i - lastDotIndex > 64 || + // Check that previous character was not already a '.' + lastCharCode === 46 || + // Check that the previous label does not end with a '-' (dash) + lastCharCode === 45 || + // Check that the previous label does not end with a '_' (underscore) + lastCharCode === 95) { + return false; + } + lastDotIndex = i; + } + else if (!( /*@__INLINE__*/(is_valid_isValidAscii(code) || code === 45 || code === 95))) { + // Check if there is a forbidden character in the label + return false; + } + lastCharCode = code; + } + return ( + // Check that last label is shorter than 63 chars + len - lastDotIndex - 1 <= 63 && + // Check that the last character is an allowed trailing label character. + // Since we already checked that the char is a valid hostname character, + // we only need to check that it's different from '-'. + lastCharCode !== 45); +} +//# sourceMappingURL=is-valid.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/options.js +function options_setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) { + return { + allowIcannDomains, + allowPrivateDomains, + detectIp, + extractHostname, + mixedInputs, + validHosts, + validateHostname, + }; +} +const options_DEFAULT_OPTIONS = /*@__INLINE__*/ options_setDefaultsImpl({}); +function options_setDefaults(options) { + if (options === undefined) { + return options_DEFAULT_OPTIONS; + } + return /*@__INLINE__*/ options_setDefaultsImpl(options); +} +//# sourceMappingURL=options.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/subdomain.js +/** + * Returns the subdomain of a hostname string + */ +function subdomain_getSubdomain(hostname, domain) { + // If `hostname` and `domain` are the same, then there is no sub-domain + if (domain.length === hostname.length) { + return ''; + } + return hostname.slice(0, -domain.length - 1); +} +//# sourceMappingURL=subdomain.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/factory.js +/** + * Implement a factory allowing to plug different implementations of suffix + * lookup (e.g.: using a trie or the packed hashes datastructures). This is used + * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints. + */ + + + + + + + +function factory_getEmptyResult() { + return { + domain: null, + domainWithoutSuffix: null, + hostname: null, + isIcann: null, + isIp: null, + isPrivate: null, + publicSuffix: null, + subdomain: null, + }; +} +function src_factory_resetResult(result) { + result.domain = null; + result.domainWithoutSuffix = null; + result.hostname = null; + result.isIcann = null; + result.isIp = null; + result.isPrivate = null; + result.publicSuffix = null; + result.subdomain = null; +} +function src_factory_parseImpl(url, step, suffixLookup, partialOptions, result) { + const options = /*@__INLINE__*/ options_setDefaults(partialOptions); + // Very fast approximate check to make sure `url` is a string. This is needed + // because the library will not necessarily be used in a typed setup and + // values of arbitrary types might be given as argument. + if (typeof url !== 'string') { + return result; } - /** - * Creates validation result - * @param valid - * @param error - * @private - */ - RuleValidator.createValidationResult = function (valid, error) { - if (error) { - return { valid: valid, error: error }; + // Extract hostname from `url` only if needed. This can be made optional + // using `options.extractHostname`. This option will typically be used + // whenever we are sure the inputs to `parse` are already hostnames and not + // arbitrary URLs. + // + // `mixedInput` allows to specify if we expect a mix of URLs and hostnames + // as input. If only hostnames are expected then `extractHostname` can be + // set to `false` to speed-up parsing. If only URLs are expected then + // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint + // and will not change the behavior of the library. + if (!options.extractHostname) { + result.hostname = url; + } + else if (options.mixedInputs) { + result.hostname = extract_hostname_extractHostname(url, src_is_valid(url)); + } + else { + result.hostname = extract_hostname_extractHostname(url, false); + } + if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) { + return result; + } + // Check if `hostname` is a valid ip address + if (options.detectIp) { + result.isIp = is_ip_isIp(result.hostname); + if (result.isIp) { + return result; } - return { valid: valid, error: null }; - }; - RuleValidator.validateRegexp = function (pattern, ruleText) { - if (pattern.startsWith(SimpleRegex.MASK_REGEX_RULE) - && pattern.endsWith(SimpleRegex.MASK_REGEX_RULE)) { - try { - new RegExp(pattern.slice(1, -1)); - } - catch (e) { - throw new SyntaxError("Rule has invalid regex pattern: \"".concat(ruleText, "\"")); - } + } + // Perform optional hostname validation. If hostname is not valid, no need to + // go further as there will be no valid domain or sub-domain. + if (options.validateHostname && + options.extractHostname && + !src_is_valid(result.hostname)) { + result.hostname = null; + return result; + } + // Extract public suffix + suffixLookup(result.hostname, options, result); + if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) { + return result; + } + // Extract domain + result.domain = domain_getDomain(result.publicSuffix, result.hostname, options); + if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) { + return result; + } + // Extract subdomain + result.subdomain = subdomain_getSubdomain(result.hostname, result.domain); + if (step === 4 /* FLAG.SUB_DOMAIN */) { + return result; + } + // Extract domain without suffix + result.domainWithoutSuffix = domain_without_suffix_getDomainWithoutSuffix(result.domain, result.publicSuffix); + return result; +} +//# sourceMappingURL=factory.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/src/lookup/fast-path.js +/* harmony default export */ function lookup_fast_path(hostname, options, out) { + // Fast path for very popular suffixes; this allows to by-pass lookup + // completely as well as any extra allocation or string manipulation. + if (!options.allowPrivateDomains && hostname.length > 3) { + const last = hostname.length - 1; + const c3 = hostname.charCodeAt(last); + const c2 = hostname.charCodeAt(last - 1); + const c1 = hostname.charCodeAt(last - 2); + const c0 = hostname.charCodeAt(last - 3); + if (c3 === 109 /* 'm' */ && + c2 === 111 /* 'o' */ && + c1 === 99 /* 'c' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'com'; + return true; } - }; - /** - * Validates raw rule string - * @param rawRule - */ - RuleValidator.validate = function (rawRule) { - var ruleText = rawRule.trim(); - if (!ruleText || RuleFactory.isComment(ruleText)) { - return RuleValidator.createValidationResult(true); + else if (c3 === 103 /* 'g' */ && + c2 === 114 /* 'r' */ && + c1 === 111 /* 'o' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'org'; + return true; } - if (RuleFactory.isShort(ruleText)) { - return RuleValidator.createValidationResult(false, "Rule is too short: ".concat(ruleText)); + else if (c3 === 117 /* 'u' */ && + c2 === 100 /* 'd' */ && + c1 === 101 /* 'e' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'edu'; + return true; } - try { - // Validate cosmetic rules - if (RuleFactory.isCosmetic(ruleText)) { - new CosmeticRule(ruleText, 0); - return RuleValidator.createValidationResult(true); - } - // Validate network rules - var rule = new NetworkRule(ruleText, 0); - RuleValidator.validateRegexp(rule.getPattern(), rule.getText()); + else if (c3 === 118 /* 'v' */ && + c2 === 111 /* 'o' */ && + c1 === 103 /* 'g' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'gov'; + return true; } - catch (e) { - var errorMessage = "Error: \"".concat(e.message, "\" in the rule: \"").concat(ruleText, "\""); - return RuleValidator.createValidationResult(false, errorMessage); + else if (c3 === 116 /* 't' */ && + c2 === 101 /* 'e' */ && + c1 === 110 /* 'n' */ && + c0 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'net'; + return true; } - return RuleValidator.createValidationResult(true); - // TODO validate host rules - }; - return RuleValidator; -}()); + else if (c3 === 101 /* 'e' */ && + c2 === 100 /* 'd' */ && + c1 === 46 /* '.' */) { + out.isIcann = true; + out.isPrivate = false; + out.publicSuffix = 'de'; + return true; + } + } + return false; +} +//# sourceMappingURL=fast-path.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts-core/dist/es6/index.js + + + +//# sourceMappingURL=index.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts/dist/es6/src/data/trie.js +const trie_exceptions = (function () { + const _0 = [1, {}], _1 = [0, { "city": _0 }]; + const exceptions = [0, { "ck": [0, { "www": _0 }], "jp": [0, { "kawasaki": _1, "kitakyushu": _1, "kobe": _1, "nagoya": _1, "sapporo": _1, "sendai": _1, "yokohama": _1 }] }]; + return exceptions; +})(); +const trie_rules = (function () { + const _2 = [1, {}], _3 = [2, {}], _4 = [1, { "gov": _2, "com": _2, "org": _2, "net": _2, "edu": _2 }], _5 = [0, { "*": _3 }], _6 = [1, { "blogspot": _3 }], _7 = [1, { "gov": _2 }], _8 = [0, { "*": _2 }], _9 = [0, { "cloud": _3 }], _10 = [1, { "co": _3 }], _11 = [2, { "nodes": _3 }], _12 = [0, { "s3": _3 }], _13 = [0, { "direct": _3 }], _14 = [2, { "id": _3 }], _15 = [0, { "vfs": _3, "webview-assets": _3 }], _16 = [0, { "cloud9": _15 }], _17 = [0, { "dualstack": _12, "cloud9": _15 }], _18 = [0, { "dualstack": _12, "s3": _3, "s3-website": _3, "cloud9": _15 }], _19 = [0, { "apps": _3 }], _20 = [0, { "paas": _3 }], _21 = [0, { "app": _3 }], _22 = [2, { "eu": _3 }], _23 = [0, { "site": _3 }], _24 = [0, { "pages": _3 }], _25 = [1, { "com": _2, "edu": _2, "net": _2, "org": _2 }], _26 = [0, { "j": _3 }], _27 = [0, { "jelastic": _3 }], _28 = [0, { "user": _3 }], _29 = [1, { "ybo": _3 }], _30 = [0, { "cust": _3, "reservd": _3 }], _31 = [0, { "cust": _3 }], _32 = [1, { "gov": _2, "edu": _2, "mil": _2, "com": _2, "org": _2, "net": _2 }], _33 = [1, { "edu": _2, "biz": _2, "net": _2, "org": _2, "gov": _2, "info": _2, "com": _2 }], _34 = [1, { "gov": _2, "blogspot": _3 }], _35 = [1, { "framer": _3 }], _36 = [1, { "barsy": _3 }], _37 = [0, { "forgot": _3 }], _38 = [1, { "gs": _2 }], _39 = [0, { "nes": _2 }], _40 = [1, { "k12": _2, "cc": _2, "lib": _2 }], _41 = [1, { "cc": _2, "lib": _2 }]; + const rules = [0, { "ac": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "mil": _2, "org": _2, "drr": _3 }], "ad": [1, { "nom": _2 }], "ae": [1, { "co": _2, "net": _2, "org": _2, "sch": _2, "ac": _2, "gov": _2, "mil": _2, "blogspot": _3 }], "aero": [1, { "accident-investigation": _2, "accident-prevention": _2, "aerobatic": _2, "aeroclub": _2, "aerodrome": _2, "agents": _2, "aircraft": _2, "airline": _2, "airport": _2, "air-surveillance": _2, "airtraffic": _2, "air-traffic-control": _2, "ambulance": _2, "amusement": _2, "association": _2, "author": _2, "ballooning": _2, "broker": _2, "caa": _2, "cargo": _2, "catering": _2, "certification": _2, "championship": _2, "charter": _2, "civilaviation": _2, "club": _2, "conference": _2, "consultant": _2, "consulting": _2, "control": _2, "council": _2, "crew": _2, "design": _2, "dgca": _2, "educator": _2, "emergency": _2, "engine": _2, "engineer": _2, "entertainment": _2, "equipment": _2, "exchange": _2, "express": _2, "federation": _2, "flight": _2, "fuel": _2, "gliding": _2, "government": _2, "groundhandling": _2, "group": _2, "hanggliding": _2, "homebuilt": _2, "insurance": _2, "journal": _2, "journalist": _2, "leasing": _2, "logistics": _2, "magazine": _2, "maintenance": _2, "media": _2, "microlight": _2, "modelling": _2, "navigation": _2, "parachuting": _2, "paragliding": _2, "passenger-association": _2, "pilot": _2, "press": _2, "production": _2, "recreation": _2, "repbody": _2, "res": _2, "research": _2, "rotorcraft": _2, "safety": _2, "scientist": _2, "services": _2, "show": _2, "skydiving": _2, "software": _2, "student": _2, "trader": _2, "trading": _2, "trainer": _2, "union": _2, "workinggroup": _2, "works": _2 }], "af": _4, "ag": [1, { "com": _2, "org": _2, "net": _2, "co": _2, "nom": _2 }], "ai": [1, { "off": _2, "com": _2, "net": _2, "org": _2, "uwu": _3 }], "al": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "blogspot": _3 }], "am": [1, { "co": _2, "com": _2, "commune": _2, "net": _2, "org": _2, "radio": _3, "blogspot": _3, "neko": _3, "nyaa": _3 }], "ao": [1, { "ed": _2, "gv": _2, "og": _2, "co": _2, "pb": _2, "it": _2 }], "aq": _2, "ar": [1, { "bet": _2, "com": _6, "coop": _2, "edu": _2, "gob": _2, "gov": _2, "int": _2, "mil": _2, "musica": _2, "mutual": _2, "net": _2, "org": _2, "senasa": _2, "tur": _2 }], "arpa": [1, { "e164": _2, "in-addr": _2, "ip6": _2, "iris": _2, "uri": _2, "urn": _2 }], "as": _7, "asia": [1, { "cloudns": _3 }], "at": [1, { "ac": [1, { "sth": _2 }], "co": _6, "gv": _2, "or": _2, "funkfeuer": [0, { "wien": _3 }], "futurecms": [0, { "*": _3, "ex": _5, "in": _5 }], "futurehosting": _3, "futuremailing": _3, "ortsinfo": [0, { "ex": _5, "kunden": _5 }], "biz": _3, "info": _3, "123webseite": _3, "priv": _3, "myspreadshop": _3, "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3 }], "au": [1, { "com": [1, { "blogspot": _3, "cloudlets": [0, { "mel": _3 }], "myspreadshop": _3 }], "net": _2, "org": _2, "edu": [1, { "act": _2, "catholic": _2, "nsw": [1, { "schools": _2 }], "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 }], "gov": [1, { "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 }], "asn": _2, "id": _2, "info": _2, "conf": _2, "oz": _2, "act": _2, "nsw": _2, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 }], "aw": [1, { "com": _2 }], "ax": [1, { "be": _3, "cat": _3, "es": _3, "eu": _3, "gg": _3, "mc": _3, "us": _3, "xy": _3 }], "az": [1, { "com": _2, "net": _2, "int": _2, "gov": _2, "org": _2, "edu": _2, "info": _2, "pp": _2, "mil": _2, "name": _2, "pro": _2, "biz": _2 }], "ba": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "rs": _3, "blogspot": _3 }], "bb": [1, { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "store": _2, "tv": _2 }], "bd": _8, "be": [1, { "ac": _2, "webhosting": _3, "blogspot": _3, "interhostsolutions": _9, "kuleuven": [0, { "ezproxy": _3 }], "123website": _3, "myspreadshop": _3, "transurl": _5 }], "bf": _7, "bg": [1, { "0": _2, "1": _2, "2": _2, "3": _2, "4": _2, "5": _2, "6": _2, "7": _2, "8": _2, "9": _2, "a": _2, "b": _2, "c": _2, "d": _2, "e": _2, "f": _2, "g": _2, "h": _2, "i": _2, "j": _2, "k": _2, "l": _2, "m": _2, "n": _2, "o": _2, "p": _2, "q": _2, "r": _2, "s": _2, "t": _2, "u": _2, "v": _2, "w": _2, "x": _2, "y": _2, "z": _2, "blogspot": _3, "barsy": _3 }], "bh": _4, "bi": [1, { "co": _2, "com": _2, "edu": _2, "or": _2, "org": _2 }], "biz": [1, { "activetrail": _3, "cloudns": _3, "jozi": _3, "dyndns": _3, "for-better": _3, "for-more": _3, "for-some": _3, "for-the": _3, "selfip": _3, "webhop": _3, "orx": _3, "mmafan": _3, "myftp": _3, "no-ip": _3, "dscloud": _3 }], "bj": [1, { "africa": _2, "agro": _2, "architectes": _2, "assur": _2, "avocats": _2, "co": _2, "com": _2, "eco": _2, "econo": _2, "edu": _2, "info": _2, "loisirs": _2, "money": _2, "net": _2, "org": _2, "ote": _2, "resto": _2, "restaurant": _2, "tourism": _2, "univ": _2, "blogspot": _3 }], "bm": _4, "bn": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "co": _3 }], "bo": [1, { "com": _2, "edu": _2, "gob": _2, "int": _2, "org": _2, "net": _2, "mil": _2, "tv": _2, "web": _2, "academia": _2, "agro": _2, "arte": _2, "blog": _2, "bolivia": _2, "ciencia": _2, "cooperativa": _2, "democracia": _2, "deporte": _2, "ecologia": _2, "economia": _2, "empresa": _2, "indigena": _2, "industria": _2, "info": _2, "medicina": _2, "movimiento": _2, "musica": _2, "natural": _2, "nombre": _2, "noticias": _2, "patria": _2, "politica": _2, "profesional": _2, "plurinacional": _2, "pueblo": _2, "revista": _2, "salud": _2, "tecnologia": _2, "tksat": _2, "transporte": _2, "wiki": _2 }], "br": [1, { "9guacu": _2, "abc": _2, "adm": _2, "adv": _2, "agr": _2, "aju": _2, "am": _2, "anani": _2, "aparecida": _2, "app": _2, "arq": _2, "art": _2, "ato": _2, "b": _2, "barueri": _2, "belem": _2, "bhz": _2, "bib": _2, "bio": _2, "blog": _2, "bmd": _2, "boavista": _2, "bsb": _2, "campinagrande": _2, "campinas": _2, "caxias": _2, "cim": _2, "cng": _2, "cnt": _2, "com": [1, { "blogspot": _3, "virtualcloud": [0, { "scale": [0, { "users": _3 }] }], "simplesite": _3 }], "contagem": _2, "coop": _2, "coz": _2, "cri": _2, "cuiaba": _2, "curitiba": _2, "def": _2, "des": _2, "det": _2, "dev": _2, "ecn": _2, "eco": _2, "edu": _2, "emp": _2, "enf": _2, "eng": _2, "esp": _2, "etc": _2, "eti": _2, "far": _2, "feira": _2, "flog": _2, "floripa": _2, "fm": _2, "fnd": _2, "fortal": _2, "fot": _2, "foz": _2, "fst": _2, "g12": _2, "geo": _2, "ggf": _2, "goiania": _2, "gov": [1, { "ac": _2, "al": _2, "am": _2, "ap": _2, "ba": _2, "ce": _2, "df": _2, "es": _2, "go": _2, "ma": _2, "mg": _2, "ms": _2, "mt": _2, "pa": _2, "pb": _2, "pe": _2, "pi": _2, "pr": _2, "rj": _2, "rn": _2, "ro": _2, "rr": _2, "rs": _2, "sc": _2, "se": _2, "sp": _2, "to": _2 }], "gru": _2, "imb": _2, "ind": _2, "inf": _2, "jab": _2, "jampa": _2, "jdf": _2, "joinville": _2, "jor": _2, "jus": _2, "leg": [1, { "ac": _3, "al": _3, "am": _3, "ap": _3, "ba": _3, "ce": _3, "df": _3, "es": _3, "go": _3, "ma": _3, "mg": _3, "ms": _3, "mt": _3, "pa": _3, "pb": _3, "pe": _3, "pi": _3, "pr": _3, "rj": _3, "rn": _3, "ro": _3, "rr": _3, "rs": _3, "sc": _3, "se": _3, "sp": _3, "to": _3 }], "lel": _2, "log": _2, "londrina": _2, "macapa": _2, "maceio": _2, "manaus": _2, "maringa": _2, "mat": _2, "med": _2, "mil": _2, "morena": _2, "mp": _2, "mus": _2, "natal": _2, "net": _2, "niteroi": _2, "nom": _8, "not": _2, "ntr": _2, "odo": _2, "ong": _2, "org": _2, "osasco": _2, "palmas": _2, "poa": _2, "ppg": _2, "pro": _2, "psc": _2, "psi": _2, "pvh": _2, "qsl": _2, "radio": _2, "rec": _2, "recife": _2, "rep": _2, "ribeirao": _2, "rio": _2, "riobranco": _2, "riopreto": _2, "salvador": _2, "sampa": _2, "santamaria": _2, "santoandre": _2, "saobernardo": _2, "saogonca": _2, "seg": _2, "sjc": _2, "slg": _2, "slz": _2, "sorocaba": _2, "srv": _2, "taxi": _2, "tc": _2, "tec": _2, "teo": _2, "the": _2, "tmp": _2, "trd": _2, "tur": _2, "tv": _2, "udi": _2, "vet": _2, "vix": _2, "vlog": _2, "wiki": _2, "zlg": _2 }], "bs": [1, { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "we": _3 }], "bt": _4, "bv": _2, "bw": [1, { "co": _2, "org": _2 }], "by": [1, { "gov": _2, "mil": _2, "com": _6, "of": _2, "mycloud": _3, "mediatech": _3 }], "bz": [1, { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "za": _3, "gsj": _3 }], "ca": [1, { "ab": _2, "bc": _2, "mb": _2, "nb": _2, "nf": _2, "nl": _2, "ns": _2, "nt": _2, "nu": _2, "on": _2, "pe": _2, "qc": _2, "sk": _2, "yk": _2, "gc": _2, "barsy": _3, "awdev": _5, "co": _3, "blogspot": _3, "no-ip": _3, "myspreadshop": _3 }], "cat": _2, "cc": [1, { "cloudns": _3, "ftpaccess": _3, "game-server": _3, "myphotos": _3, "scrapping": _3, "twmail": _3, "csx": _3, "fantasyleague": _3, "spawn": [0, { "instances": _3 }] }], "cd": _7, "cf": _6, "cg": _2, "ch": [1, { "square7": _3, "blogspot": _3, "flow": [0, { "ae": [0, { "alp1": _3 }], "appengine": _3 }], "linkyard-cloud": _3, "dnsking": _3, "gotdns": _3, "123website": _3, "myspreadshop": _3, "firenet": [0, { "*": _3, "svc": _5 }], "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3 }], "ci": [1, { "org": _2, "or": _2, "com": _2, "co": _2, "edu": _2, "ed": _2, "ac": _2, "net": _2, "go": _2, "asso": _2, "xn--aroport-bya": _2, "aéroport": _2, "int": _2, "presse": _2, "md": _2, "gouv": _2, "fin": _3, "nl": _3 }], "ck": _8, "cl": [1, { "co": _2, "gob": _2, "gov": _2, "mil": _2, "blogspot": _3 }], "cm": [1, { "co": _2, "com": _2, "gov": _2, "net": _2 }], "cn": [1, { "ac": _2, "com": [1, { "amazonaws": [0, { "compute": _5, "cn-north-1": _12, "eb": [0, { "cn-north-1": _3, "cn-northwest-1": _3 }], "elb": _5 }] }], "edu": _2, "gov": _2, "net": _2, "org": _2, "mil": _2, "xn--55qx5d": _2, "公司": _2, "xn--io0a7i": _2, "网络": _2, "xn--od0alg": _2, "網絡": _2, "ah": _2, "bj": _2, "cq": _2, "fj": _2, "gd": _2, "gs": _2, "gz": _2, "gx": _2, "ha": _2, "hb": _2, "he": _2, "hi": _2, "hl": _2, "hn": _2, "jl": _2, "js": _2, "jx": _2, "ln": _2, "nm": _2, "nx": _2, "qh": _2, "sc": _2, "sd": _2, "sh": _2, "sn": _2, "sx": _2, "tj": _2, "xj": _2, "xz": _2, "yn": _2, "zj": _2, "hk": _2, "mo": _2, "tw": _2, "canva-apps": _3, "instantcloud": _3, "quickconnect": _13 }], "co": [1, { "arts": _2, "com": _6, "edu": _2, "firm": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "rec": _2, "web": _2, "carrd": _3, "crd": _3, "otap": _5, "leadpages": _3, "lpages": _3, "mypi": _3, "n4t": _3, "firewalledreplit": _14, "repl": _14, "supabase": _3 }], "com": [1, { "devcdnaccesso": _5, "adobeaemcloud": [2, { "dev": _5 }], "airkitapps": _3, "airkitapps-au": _3, "aivencloud": _3, "kasserver": _3, "amazonaws": [0, { "compute": _5, "compute-1": _5, "us-east-1": [2, { "dualstack": _12, "cloud9": _15 }], "ap-northeast-1": _17, "ap-northeast-2": _18, "ap-south-1": _18, "ap-southeast-1": _17, "ap-southeast-2": _17, "ca-central-1": _18, "eu-central-1": _18, "eu-west-1": _17, "eu-west-2": _18, "eu-west-3": _18, "s3": _3, "s3-ap-northeast-1": _3, "s3-ap-northeast-2": _3, "s3-ap-south-1": _3, "s3-ap-southeast-1": _3, "s3-ap-southeast-2": _3, "s3-ca-central-1": _3, "s3-eu-central-1": _3, "s3-eu-west-1": _3, "s3-eu-west-2": _3, "s3-eu-west-3": _3, "s3-external-1": _3, "s3-fips-us-gov-west-1": _3, "s3-sa-east-1": _3, "s3-us-east-2": _3, "s3-us-gov-west-1": _3, "s3-us-west-1": _3, "s3-us-west-2": _3, "s3-website-ap-northeast-1": _3, "s3-website-ap-southeast-1": _3, "s3-website-ap-southeast-2": _3, "s3-website-eu-west-1": _3, "s3-website-sa-east-1": _3, "s3-website-us-east-1": _3, "s3-website-us-west-1": _3, "s3-website-us-west-2": _3, "sa-east-1": _17, "us-east-2": _18, "af-south-1": _16, "ap-east-1": _16, "ap-northeast-3": _16, "eu-north-1": _16, "eu-south-1": _16, "me-south-1": _16, "us-west-1": _16, "us-west-2": _16, "elb": _5 }], "elasticbeanstalk": [2, { "ap-northeast-1": _3, "ap-northeast-2": _3, "ap-northeast-3": _3, "ap-south-1": _3, "ap-southeast-1": _3, "ap-southeast-2": _3, "ca-central-1": _3, "eu-central-1": _3, "eu-west-1": _3, "eu-west-2": _3, "eu-west-3": _3, "sa-east-1": _3, "us-east-1": _3, "us-east-2": _3, "us-gov-west-1": _3, "us-west-1": _3, "us-west-2": _3 }], "awsglobalaccelerator": _3, "siiites": _3, "appspacehosted": _3, "appspaceusercontent": _3, "on-aptible": _3, "myasustor": _3, "balena-devices": _3, "betainabox": _3, "boutir": _3, "bplaced": _3, "cafjs": _3, "canva-apps": _3, "br": _3, "cn": _3, "de": _3, "eu": _3, "jpn": _3, "mex": _3, "ru": _3, "sa": _3, "uk": _3, "us": _3, "za": _3, "ar": _3, "hu": _3, "kr": _3, "no": _3, "qc": _3, "uy": _3, "africa": _3, "gr": _3, "co": _3, "jdevcloud": _3, "wpdevcloud": _3, "cloudcontrolled": _3, "cloudcontrolapp": _3, "cf-ipfs": _3, "cloudflare-ipfs": _3, "trycloudflare": _3, "customer-oci": [0, { "*": _3, "oci": _5, "ocp": _5, "ocs": _5 }], "dattolocal": _3, "dattorelay": _3, "dattoweb": _3, "mydatto": _3, "builtwithdark": _3, "datadetect": [0, { "demo": _3, "instance": _3 }], "ddns5": _3, "discordsays": _3, "discordsez": _3, "drayddns": _3, "dreamhosters": _3, "mydrobo": _3, "dyndns-at-home": _3, "dyndns-at-work": _3, "dyndns-blog": _3, "dyndns-free": _3, "dyndns-home": _3, "dyndns-ip": _3, "dyndns-mail": _3, "dyndns-office": _3, "dyndns-pics": _3, "dyndns-remote": _3, "dyndns-server": _3, "dyndns-web": _3, "dyndns-wiki": _3, "dyndns-work": _3, "blogdns": _3, "cechire": _3, "dnsalias": _3, "dnsdojo": _3, "doesntexist": _3, "dontexist": _3, "doomdns": _3, "dyn-o-saur": _3, "dynalias": _3, "est-a-la-maison": _3, "est-a-la-masion": _3, "est-le-patron": _3, "est-mon-blogueur": _3, "from-ak": _3, "from-al": _3, "from-ar": _3, "from-ca": _3, "from-ct": _3, "from-dc": _3, "from-de": _3, "from-fl": _3, "from-ga": _3, "from-hi": _3, "from-ia": _3, "from-id": _3, "from-il": _3, "from-in": _3, "from-ks": _3, "from-ky": _3, "from-ma": _3, "from-md": _3, "from-mi": _3, "from-mn": _3, "from-mo": _3, "from-ms": _3, "from-mt": _3, "from-nc": _3, "from-nd": _3, "from-ne": _3, "from-nh": _3, "from-nj": _3, "from-nm": _3, "from-nv": _3, "from-oh": _3, "from-ok": _3, "from-or": _3, "from-pa": _3, "from-pr": _3, "from-ri": _3, "from-sc": _3, "from-sd": _3, "from-tn": _3, "from-tx": _3, "from-ut": _3, "from-va": _3, "from-vt": _3, "from-wa": _3, "from-wi": _3, "from-wv": _3, "from-wy": _3, "getmyip": _3, "gotdns": _3, "hobby-site": _3, "homelinux": _3, "homeunix": _3, "iamallama": _3, "is-a-anarchist": _3, "is-a-blogger": _3, "is-a-bookkeeper": _3, "is-a-bulls-fan": _3, "is-a-caterer": _3, "is-a-chef": _3, "is-a-conservative": _3, "is-a-cpa": _3, "is-a-cubicle-slave": _3, "is-a-democrat": _3, "is-a-designer": _3, "is-a-doctor": _3, "is-a-financialadvisor": _3, "is-a-geek": _3, "is-a-green": _3, "is-a-guru": _3, "is-a-hard-worker": _3, "is-a-hunter": _3, "is-a-landscaper": _3, "is-a-lawyer": _3, "is-a-liberal": _3, "is-a-libertarian": _3, "is-a-llama": _3, "is-a-musician": _3, "is-a-nascarfan": _3, "is-a-nurse": _3, "is-a-painter": _3, "is-a-personaltrainer": _3, "is-a-photographer": _3, "is-a-player": _3, "is-a-republican": _3, "is-a-rockstar": _3, "is-a-socialist": _3, "is-a-student": _3, "is-a-teacher": _3, "is-a-techie": _3, "is-a-therapist": _3, "is-an-accountant": _3, "is-an-actor": _3, "is-an-actress": _3, "is-an-anarchist": _3, "is-an-artist": _3, "is-an-engineer": _3, "is-an-entertainer": _3, "is-certified": _3, "is-gone": _3, "is-into-anime": _3, "is-into-cars": _3, "is-into-cartoons": _3, "is-into-games": _3, "is-leet": _3, "is-not-certified": _3, "is-slick": _3, "is-uberleet": _3, "is-with-theband": _3, "isa-geek": _3, "isa-hockeynut": _3, "issmarterthanyou": _3, "likes-pie": _3, "likescandy": _3, "neat-url": _3, "saves-the-whales": _3, "selfip": _3, "sells-for-less": _3, "sells-for-u": _3, "servebbs": _3, "simple-url": _3, "space-to-rent": _3, "teaches-yoga": _3, "writesthisblog": _3, "digitaloceanspaces": _5, "ddnsfree": _3, "ddnsgeek": _3, "giize": _3, "gleeze": _3, "kozow": _3, "loseyourip": _3, "ooguy": _3, "theworkpc": _3, "mytuleap": _3, "tuleap-partners": _3, "encoreapi": _3, "evennode": [0, { "eu-1": _3, "eu-2": _3, "eu-3": _3, "eu-4": _3, "us-1": _3, "us-2": _3, "us-3": _3, "us-4": _3 }], "onfabrica": _3, "fbsbx": _19, "fastly-edge": _3, "fastly-terrarium": _3, "fastvps-server": _3, "mydobiss": _3, "firebaseapp": _3, "fldrv": _3, "forgeblocks": _3, "framercanvas": _3, "freebox-os": _3, "freeboxos": _3, "freemyip": _3, "gentapps": _3, "gentlentapis": _3, "githubusercontent": _3, "0emm": _5, "appspot": [2, { "r": _5 }], "codespot": _3, "googleapis": _3, "googlecode": _3, "pagespeedmobilizer": _3, "publishproxy": _3, "withgoogle": _3, "withyoutube": _3, "blogspot": _3, "awsmppl": _3, "herokuapp": _3, "herokussl": _3, "impertrixcdn": _3, "impertrix": _3, "smushcdn": _3, "wphostedmail": _3, "wpmucdn": _3, "pixolino": _3, "amscompute": _3, "clicketcloud": _3, "dopaas": _3, "hidora": _3, "hosted-by-previder": _20, "hosteur": [0, { "rag-cloud": _3, "rag-cloud-ch": _3 }], "ik-server": [0, { "jcloud": _3, "jcloud-ver-jpc": _3 }], "jelastic": [0, { "demo": _3 }], "kilatiron": _3, "massivegrid": _20, "wafaicloud": [0, { "jed": _3, "lon": _3, "ryd": _3 }], "joyent": [0, { "cns": _5 }], "ktistory": _3, "lpusercontent": _3, "lmpm": _21, "linode": [0, { "members": _3, "nodebalancer": _5 }], "linodeobjects": _5, "linodeusercontent": [0, { "ip": _3 }], "barsycenter": _3, "barsyonline": _3, "mazeplay": _3, "miniserver": _3, "meteorapp": _22, "hostedpi": _3, "mythic-beasts": [0, { "customer": _3, "caracal": _3, "fentiger": _3, "lynx": _3, "ocelot": _3, "oncilla": _3, "onza": _3, "sphinx": _3, "vs": _3, "x": _3, "yali": _3 }], "nospamproxy": _9, "4u": _3, "nfshost": _3, "001www": _3, "ddnslive": _3, "myiphost": _3, "blogsyte": _3, "ciscofreak": _3, "damnserver": _3, "ditchyourip": _3, "dnsiskinky": _3, "dynns": _3, "geekgalaxy": _3, "health-carereform": _3, "homesecuritymac": _3, "homesecuritypc": _3, "myactivedirectory": _3, "mysecuritycamera": _3, "net-freaks": _3, "onthewifi": _3, "point2this": _3, "quicksytes": _3, "securitytactics": _3, "serveexchange": _3, "servehumour": _3, "servep2p": _3, "servesarcasm": _3, "stufftoread": _3, "unusualperson": _3, "workisboring": _3, "3utilities": _3, "ddnsking": _3, "myvnc": _3, "servebeer": _3, "servecounterstrike": _3, "serveftp": _3, "servegame": _3, "servehalflife": _3, "servehttp": _3, "serveirc": _3, "servemp3": _3, "servepics": _3, "servequake": _3, "observableusercontent": [0, { "static": _3 }], "simplesite": _3, "orsites": _3, "operaunite": _3, "authgear-staging": _3, "authgearapps": _3, "skygearapp": _3, "outsystemscloud": _3, "ownprovider": _3, "pgfog": _3, "pagefrontapp": _3, "pagexl": _3, "paywhirl": _5, "gotpantheon": _3, "platter-app": _3, "pleskns": _3, "postman-echo": _3, "prgmr": [0, { "xen": _3 }], "pythonanywhere": _22, "qualifioapp": _3, "ladesk": _3, "qbuser": _3, "qa2": _3, "dev-myqnapcloud": _3, "alpha-myqnapcloud": _3, "myqnapcloud": _3, "quipelements": _5, "rackmaze": _3, "rhcloud": _3, "render": _21, "onrender": _3, "180r": _3, "dojin": _3, "sakuratan": _3, "sakuraweb": _3, "x0": _3, "code": [0, { "builder": _5, "dev-builder": _5, "stg-builder": _5 }], "logoip": _3, "scrysec": _3, "firewall-gateway": _3, "myshopblocks": _3, "myshopify": _3, "shopitsite": _3, "1kapp": _3, "appchizi": _3, "applinzi": _3, "sinaapp": _3, "vipsinaapp": _3, "bounty-full": [2, { "alpha": _3, "beta": _3 }], "streamlitapp": _3, "try-snowplow": _3, "stackhero-network": _3, "playstation-cloud": _3, "myspreadshop": _3, "stdlib": [0, { "api": _3 }], "temp-dns": _3, "dsmynas": _3, "familyds": _3, "mytabit": _3, "tb-hosting": _23, "reservd": _3, "thingdustdata": _3, "bloxcms": _3, "townnews-staging": _3, "typeform": [0, { "pro": _3 }], "hk": _3, "it": _3, "vultrobjects": _5, "wafflecell": _3, "reserve-online": _3, "hotelwithflight": _3, "remotewd": _3, "wiardweb": _24, "messwithdns": _3, "woltlab-demo": _3, "wpenginepowered": [2, { "js": _3 }], "wixsite": _3, "xnbay": [2, { "u2": _3, "u2-local": _3 }], "yolasite": _3 }], "coop": _2, "cr": [1, { "ac": _2, "co": _2, "ed": _2, "fi": _2, "go": _2, "or": _2, "sa": _2 }], "cu": [1, { "com": _2, "edu": _2, "org": _2, "net": _2, "gov": _2, "inf": _2 }], "cv": [1, { "com": _2, "edu": _2, "int": _2, "nome": _2, "org": _2, "blogspot": _3 }], "cw": _25, "cx": [1, { "gov": _2, "ath": _3, "info": _3 }], "cy": [1, { "ac": _2, "biz": _2, "com": [1, { "blogspot": _3, "scaleforce": _26 }], "ekloges": _2, "gov": _2, "ltd": _2, "mil": _2, "net": _2, "org": _2, "press": _2, "pro": _2, "tm": _2 }], "cz": [1, { "co": _3, "realm": _3, "e4": _3, "blogspot": _3, "metacentrum": [0, { "cloud": _5, "custom": _3 }], "muni": [0, { "cloud": [0, { "flt": _3, "usr": _3 }] }] }], "de": [1, { "bplaced": _3, "square7": _3, "com": _3, "cosidns": [0, { "dyn": _3 }], "dynamisches-dns": _3, "dnsupdater": _3, "internet-dns": _3, "l-o-g-i-n": _3, "dnshome": _3, "fuettertdasnetz": _3, "isteingeek": _3, "istmein": _3, "lebtimnetz": _3, "leitungsen": _3, "traeumtgerade": _3, "ddnss": [2, { "dyn": _3, "dyndns": _3 }], "dyndns1": _3, "dyn-ip24": _3, "home-webserver": [2, { "dyn": _3 }], "myhome-server": _3, "frusky": _5, "goip": _3, "blogspot": _3, "xn--gnstigbestellen-zvb": _3, "günstigbestellen": _3, "xn--gnstigliefern-wob": _3, "günstigliefern": _3, "hs-heilbronn": [0, { "it": _24 }], "dyn-berlin": _3, "in-berlin": _3, "in-brb": _3, "in-butter": _3, "in-dsl": _3, "in-vpn": _3, "iservschule": _3, "mein-iserv": _3, "schulplattform": _3, "schulserver": _3, "test-iserv": _3, "keymachine": _3, "git-repos": _3, "lcube-server": _3, "svn-repos": _3, "barsy": _3, "123webseite": _3, "logoip": _3, "firewall-gateway": _3, "my-gateway": _3, "my-router": _3, "spdns": _3, "speedpartner": [0, { "customer": _3 }], "myspreadshop": _3, "taifun-dns": _3, "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3, "dd-dns": _3, "dray-dns": _3, "draydns": _3, "dyn-vpn": _3, "dynvpn": _3, "mein-vigor": _3, "my-vigor": _3, "my-wan": _3, "syno-ds": _3, "synology-diskstation": _3, "synology-ds": _3, "uberspace": _5, "virtualuser": _3, "virtual-user": _3, "community-pro": _3, "diskussionsbereich": _3 }], "dj": _2, "dk": [1, { "biz": _3, "co": _3, "firm": _3, "reg": _3, "store": _3, "blogspot": _3, "123hjemmeside": _3, "myspreadshop": _3 }], "dm": _4, "do": [1, { "art": _2, "com": _2, "edu": _2, "gob": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "sld": _2, "web": _2 }], "dz": [1, { "art": _2, "asso": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "net": _2, "pol": _2, "soc": _2, "tm": _2 }], "ec": [1, { "com": _2, "info": _2, "net": _2, "fin": _2, "k12": _2, "med": _2, "pro": _2, "org": _2, "edu": _2, "gov": _2, "gob": _2, "mil": _2, "base": _3, "official": _3 }], "edu": [1, { "rit": [0, { "git-pages": _3 }] }], "ee": [1, { "edu": _2, "gov": _2, "riik": _2, "lib": _2, "med": _2, "com": _6, "pri": _2, "aip": _2, "org": _2, "fie": _2 }], "eg": [1, { "com": _6, "edu": _2, "eun": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sci": _2 }], "er": _8, "es": [1, { "com": _6, "nom": _2, "org": _2, "gob": _2, "edu": _2, "123miweb": _3, "myspreadshop": _3 }], "et": [1, { "com": _2, "gov": _2, "org": _2, "edu": _2, "biz": _2, "name": _2, "info": _2, "net": _2 }], "eu": [1, { "airkitapps": _3, "mycd": _3, "cloudns": _3, "dogado": _27, "barsy": _3, "wellbeingzone": _3, "spdns": _3, "transurl": _5, "diskstation": _3 }], "fi": [1, { "aland": _2, "dy": _3, "blogspot": _3, "xn--hkkinen-5wa": _3, "häkkinen": _3, "iki": _3, "cloudplatform": [0, { "fi": _3 }], "datacenter": [0, { "demo": _3, "paas": _3 }], "kapsi": _3, "123kotisivu": _3, "myspreadshop": _3 }], "fj": [1, { "ac": _2, "biz": _2, "com": _2, "gov": _2, "info": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pro": _2 }], "fk": _8, "fm": [1, { "com": _2, "edu": _2, "net": _2, "org": _2, "radio": _3, "user": _5 }], "fo": _2, "fr": [1, { "asso": _2, "com": _2, "gouv": _2, "nom": _2, "prd": _2, "tm": _2, "aeroport": _2, "avocat": _2, "avoues": _2, "cci": _2, "chambagri": _2, "chirurgiens-dentistes": _2, "experts-comptables": _2, "geometre-expert": _2, "greta": _2, "huissier-justice": _2, "medecin": _2, "notaires": _2, "pharmacien": _2, "port": _2, "veterinaire": _2, "en-root": _3, "fbx-os": _3, "fbxos": _3, "freebox-os": _3, "freeboxos": _3, "blogspot": _3, "goupile": _3, "123siteweb": _3, "on-web": _3, "chirurgiens-dentistes-en-france": _3, "dedibox": _3, "myspreadshop": _3, "ynh": _3 }], "ga": _2, "gb": _2, "gd": [1, { "edu": _2, "gov": _2 }], "ge": [1, { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "net": _2, "pvt": _2 }], "gf": _2, "gg": [1, { "co": _2, "net": _2, "org": _2, "kaas": _3, "cya": _3, "panel": [2, { "daemon": _3 }] }], "gh": [1, { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2 }], "gi": [1, { "com": _2, "ltd": _2, "gov": _2, "mod": _2, "edu": _2, "org": _2 }], "gl": [1, { "co": _2, "com": _2, "edu": _2, "net": _2, "org": _2, "biz": _3, "xx": _3 }], "gm": _2, "gn": [1, { "ac": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "net": _2 }], "gov": _2, "gp": [1, { "com": _2, "net": _2, "mobi": _2, "edu": _2, "org": _2, "asso": _2, "app": _3 }], "gq": _2, "gr": [1, { "com": _2, "edu": _2, "net": _2, "org": _2, "gov": _2, "blogspot": _3, "simplesite": _3 }], "gs": _2, "gt": [1, { "com": _2, "edu": _2, "gob": _2, "ind": _2, "mil": _2, "net": _2, "org": _2, "blog": _3, "de": _3, "to": _3 }], "gu": [1, { "com": _2, "edu": _2, "gov": _2, "guam": _2, "info": _2, "net": _2, "org": _2, "web": _2 }], "gw": _2, "gy": [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "be": _3 }], "hk": [1, { "com": _2, "edu": _2, "gov": _2, "idv": _2, "net": _2, "org": _2, "xn--55qx5d": _2, "公司": _2, "xn--wcvs22d": _2, "教育": _2, "xn--lcvr32d": _2, "敎育": _2, "xn--mxtq1m": _2, "政府": _2, "xn--gmqw5a": _2, "個人": _2, "xn--ciqpn": _2, "个人": _2, "xn--gmq050i": _2, "箇人": _2, "xn--zf0avx": _2, "網络": _2, "xn--io0a7i": _2, "网络": _2, "xn--mk0axi": _2, "组織": _2, "xn--od0alg": _2, "網絡": _2, "xn--od0aq3b": _2, "网絡": _2, "xn--tn0ag": _2, "组织": _2, "xn--uc0atv": _2, "組織": _2, "xn--uc0ay4a": _2, "組织": _2, "blogspot": _3, "secaas": _3, "ltd": _3, "inc": _3 }], "hm": _2, "hn": [1, { "com": _2, "edu": _2, "org": _2, "net": _2, "mil": _2, "gob": _2, "cc": _3 }], "hr": [1, { "iz": _2, "from": _2, "name": _2, "com": _2, "blogspot": _3, "free": _3 }], "ht": [1, { "com": _2, "shop": _2, "firm": _2, "info": _2, "adult": _2, "net": _2, "pro": _2, "org": _2, "med": _2, "art": _2, "coop": _2, "pol": _2, "asso": _2, "edu": _2, "rel": _2, "gouv": _2, "perso": _2 }], "hu": [1, { "2000": _2, "co": _2, "info": _2, "org": _2, "priv": _2, "sport": _2, "tm": _2, "agrar": _2, "bolt": _2, "casino": _2, "city": _2, "erotica": _2, "erotika": _2, "film": _2, "forum": _2, "games": _2, "hotel": _2, "ingatlan": _2, "jogasz": _2, "konyvelo": _2, "lakas": _2, "media": _2, "news": _2, "reklam": _2, "sex": _2, "shop": _2, "suli": _2, "szex": _2, "tozsde": _2, "utazas": _2, "video": _2, "blogspot": _3 }], "id": [1, { "ac": _2, "biz": _2, "co": _6, "desa": _2, "go": _2, "mil": _2, "my": [1, { "rss": _5 }], "net": _2, "or": _2, "ponpes": _2, "sch": _2, "web": _2, "flap": _3, "forte": _3 }], "ie": [1, { "gov": _2, "blogspot": _3, "myspreadshop": _3 }], "il": [1, { "ac": _2, "co": [1, { "ravpage": _3, "blogspot": _3, "tabitorder": _3, "mytabit": _3 }], "gov": _2, "idf": _2, "k12": _2, "muni": _2, "net": _2, "org": _2 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _2, "xn--5dbhl8d": _2, "xn--8dbq2a": _2, "xn--hebda8b": _2 }], "ישראל": [1, { "אקדמיה": _2, "ישוב": _2, "צהל": _2, "ממשל": _2 }], "im": [1, { "ac": _2, "co": [1, { "ltd": _2, "plc": _2 }], "com": _2, "net": _2, "org": _2, "tt": _2, "tv": _2, "ro": _3 }], "in": [1, { "5g": _2, "6g": _2, "ac": _2, "ai": _2, "am": _2, "bihar": _2, "biz": _2, "business": _2, "ca": _2, "cn": _2, "co": _2, "com": _2, "coop": _2, "cs": _2, "delhi": _2, "dr": _2, "edu": _2, "er": _2, "firm": _2, "gen": _2, "gov": _2, "gujarat": _2, "ind": _2, "info": _2, "int": _2, "internet": _2, "io": _2, "me": _2, "mil": _2, "net": _2, "nic": _2, "org": _2, "pg": _2, "post": _2, "pro": _2, "res": _2, "travel": _2, "tv": _2, "uk": _2, "up": _2, "us": _2, "web": _3, "cloudns": _3, "blogspot": _3, "barsy": _3, "supabase": _3 }], "info": [1, { "cloudns": _3, "dynamic-dns": _3, "dyndns": _3, "barrel-of-knowledge": _3, "barrell-of-knowledge": _3, "for-our": _3, "groks-the": _3, "groks-this": _3, "here-for-more": _3, "knowsitall": _3, "selfip": _3, "webhop": _3, "barsy": _3, "mayfirst": _3, "forumz": _3, "nsupdate": _3, "dvrcam": _3, "ilovecollege": _3, "no-ip": _3, "dnsupdate": _3, "v-info": _3 }], "int": [1, { "eu": _2 }], "io": [1, { "2038": _3, "com": _2, "on-acorn": _5, "apigee": _3, "b-data": _3, "backplaneapp": _3, "banzaicloud": [0, { "app": _3, "backyards": _5 }], "beagleboard": _3, "bitbucket": _3, "bluebite": _3, "boxfuse": _3, "browsersafetymark": _3, "bigv": [0, { "uk0": _3 }], "cleverapps": _3, "dappnode": [0, { "dyndns": _3 }], "dedyn": _3, "drud": _3, "definima": _3, "fh-muenster": _3, "shw": _3, "forgerock": [0, { "id": _3 }], "ghost": _3, "github": _3, "gitlab": _3, "lolipop": _3, "hasura-app": _3, "hostyhosting": _3, "moonscale": _5, "beebyte": _20, "beebyteapp": [0, { "sekd1": _3 }], "jele": _3, "unispace": [0, { "cloud-fr1": _3 }], "webthings": _3, "loginline": _3, "barsy": _3, "azurecontainer": _5, "ngrok": [2, { "ap": _3, "au": _3, "eu": _3, "in": _3, "jp": _3, "sa": _3, "us": _3 }], "nodeart": [0, { "stage": _3 }], "nid": _3, "pantheonsite": _3, "dyn53": _3, "pstmn": [2, { "mock": _3 }], "protonet": _3, "qoto": _3, "qcx": [2, { "sys": _5 }], "vaporcloud": _3, "vbrplsbx": [0, { "g": _3 }], "on-k3s": _5, "on-rio": _5, "readthedocs": _3, "resindevice": _3, "resinstaging": [0, { "devices": _3 }], "hzc": _3, "sandcats": _3, "shiftcrypto": _3, "shiftedit": _3, "mo-siemens": _3, "musician": _3, "lair": _19, "stolos": _5, "spacekit": _3, "utwente": _3, "s5y": _5, "edugit": _3, "telebit": _3, "thingdust": [0, { "dev": _30, "disrec": _30, "prod": _31, "testing": _30 }], "tickets": _3, "upli": _3, "wedeploy": _3, "editorx": _3, "basicserver": _3, "virtualserver": _3 }], "iq": _32, "ir": [1, { "ac": _2, "co": _2, "gov": _2, "id": _2, "net": _2, "org": _2, "sch": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2 }], "is": [1, { "net": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "int": _2, "cupcake": _3, "blogspot": _3 }], "it": [1, { "gov": _2, "edu": _2, "abr": _2, "abruzzo": _2, "aosta-valley": _2, "aostavalley": _2, "bas": _2, "basilicata": _2, "cal": _2, "calabria": _2, "cam": _2, "campania": _2, "emilia-romagna": _2, "emiliaromagna": _2, "emr": _2, "friuli-v-giulia": _2, "friuli-ve-giulia": _2, "friuli-vegiulia": _2, "friuli-venezia-giulia": _2, "friuli-veneziagiulia": _2, "friuli-vgiulia": _2, "friuliv-giulia": _2, "friulive-giulia": _2, "friulivegiulia": _2, "friulivenezia-giulia": _2, "friuliveneziagiulia": _2, "friulivgiulia": _2, "fvg": _2, "laz": _2, "lazio": _2, "lig": _2, "liguria": _2, "lom": _2, "lombardia": _2, "lombardy": _2, "lucania": _2, "mar": _2, "marche": _2, "mol": _2, "molise": _2, "piedmont": _2, "piemonte": _2, "pmn": _2, "pug": _2, "puglia": _2, "sar": _2, "sardegna": _2, "sardinia": _2, "sic": _2, "sicilia": _2, "sicily": _2, "taa": _2, "tos": _2, "toscana": _2, "trentin-sud-tirol": _2, "xn--trentin-sd-tirol-rzb": _2, "trentin-süd-tirol": _2, "trentin-sudtirol": _2, "xn--trentin-sdtirol-7vb": _2, "trentin-südtirol": _2, "trentin-sued-tirol": _2, "trentin-suedtirol": _2, "trentino-a-adige": _2, "trentino-aadige": _2, "trentino-alto-adige": _2, "trentino-altoadige": _2, "trentino-s-tirol": _2, "trentino-stirol": _2, "trentino-sud-tirol": _2, "xn--trentino-sd-tirol-c3b": _2, "trentino-süd-tirol": _2, "trentino-sudtirol": _2, "xn--trentino-sdtirol-szb": _2, "trentino-südtirol": _2, "trentino-sued-tirol": _2, "trentino-suedtirol": _2, "trentino": _2, "trentinoa-adige": _2, "trentinoaadige": _2, "trentinoalto-adige": _2, "trentinoaltoadige": _2, "trentinos-tirol": _2, "trentinostirol": _2, "trentinosud-tirol": _2, "xn--trentinosd-tirol-rzb": _2, "trentinosüd-tirol": _2, "trentinosudtirol": _2, "xn--trentinosdtirol-7vb": _2, "trentinosüdtirol": _2, "trentinosued-tirol": _2, "trentinosuedtirol": _2, "trentinsud-tirol": _2, "xn--trentinsd-tirol-6vb": _2, "trentinsüd-tirol": _2, "trentinsudtirol": _2, "xn--trentinsdtirol-nsb": _2, "trentinsüdtirol": _2, "trentinsued-tirol": _2, "trentinsuedtirol": _2, "tuscany": _2, "umb": _2, "umbria": _2, "val-d-aosta": _2, "val-daosta": _2, "vald-aosta": _2, "valdaosta": _2, "valle-aosta": _2, "valle-d-aosta": _2, "valle-daosta": _2, "valleaosta": _2, "valled-aosta": _2, "valledaosta": _2, "vallee-aoste": _2, "xn--valle-aoste-ebb": _2, "vallée-aoste": _2, "vallee-d-aoste": _2, "xn--valle-d-aoste-ehb": _2, "vallée-d-aoste": _2, "valleeaoste": _2, "xn--valleaoste-e7a": _2, "valléeaoste": _2, "valleedaoste": _2, "xn--valledaoste-ebb": _2, "valléedaoste": _2, "vao": _2, "vda": _2, "ven": _2, "veneto": _2, "ag": _2, "agrigento": _2, "al": _2, "alessandria": _2, "alto-adige": _2, "altoadige": _2, "an": _2, "ancona": _2, "andria-barletta-trani": _2, "andria-trani-barletta": _2, "andriabarlettatrani": _2, "andriatranibarletta": _2, "ao": _2, "aosta": _2, "aoste": _2, "ap": _2, "aq": _2, "aquila": _2, "ar": _2, "arezzo": _2, "ascoli-piceno": _2, "ascolipiceno": _2, "asti": _2, "at": _2, "av": _2, "avellino": _2, "ba": _2, "balsan-sudtirol": _2, "xn--balsan-sdtirol-nsb": _2, "balsan-südtirol": _2, "balsan-suedtirol": _2, "balsan": _2, "bari": _2, "barletta-trani-andria": _2, "barlettatraniandria": _2, "belluno": _2, "benevento": _2, "bergamo": _2, "bg": _2, "bi": _2, "biella": _2, "bl": _2, "bn": _2, "bo": _2, "bologna": _2, "bolzano-altoadige": _2, "bolzano": _2, "bozen-sudtirol": _2, "xn--bozen-sdtirol-2ob": _2, "bozen-südtirol": _2, "bozen-suedtirol": _2, "bozen": _2, "br": _2, "brescia": _2, "brindisi": _2, "bs": _2, "bt": _2, "bulsan-sudtirol": _2, "xn--bulsan-sdtirol-nsb": _2, "bulsan-südtirol": _2, "bulsan-suedtirol": _2, "bulsan": _2, "bz": _2, "ca": _2, "cagliari": _2, "caltanissetta": _2, "campidano-medio": _2, "campidanomedio": _2, "campobasso": _2, "carbonia-iglesias": _2, "carboniaiglesias": _2, "carrara-massa": _2, "carraramassa": _2, "caserta": _2, "catania": _2, "catanzaro": _2, "cb": _2, "ce": _2, "cesena-forli": _2, "xn--cesena-forl-mcb": _2, "cesena-forlì": _2, "cesenaforli": _2, "xn--cesenaforl-i8a": _2, "cesenaforlì": _2, "ch": _2, "chieti": _2, "ci": _2, "cl": _2, "cn": _2, "co": _2, "como": _2, "cosenza": _2, "cr": _2, "cremona": _2, "crotone": _2, "cs": _2, "ct": _2, "cuneo": _2, "cz": _2, "dell-ogliastra": _2, "dellogliastra": _2, "en": _2, "enna": _2, "fc": _2, "fe": _2, "fermo": _2, "ferrara": _2, "fg": _2, "fi": _2, "firenze": _2, "florence": _2, "fm": _2, "foggia": _2, "forli-cesena": _2, "xn--forl-cesena-fcb": _2, "forlì-cesena": _2, "forlicesena": _2, "xn--forlcesena-c8a": _2, "forlìcesena": _2, "fr": _2, "frosinone": _2, "ge": _2, "genoa": _2, "genova": _2, "go": _2, "gorizia": _2, "gr": _2, "grosseto": _2, "iglesias-carbonia": _2, "iglesiascarbonia": _2, "im": _2, "imperia": _2, "is": _2, "isernia": _2, "kr": _2, "la-spezia": _2, "laquila": _2, "laspezia": _2, "latina": _2, "lc": _2, "le": _2, "lecce": _2, "lecco": _2, "li": _2, "livorno": _2, "lo": _2, "lodi": _2, "lt": _2, "lu": _2, "lucca": _2, "macerata": _2, "mantova": _2, "massa-carrara": _2, "massacarrara": _2, "matera": _2, "mb": _2, "mc": _2, "me": _2, "medio-campidano": _2, "mediocampidano": _2, "messina": _2, "mi": _2, "milan": _2, "milano": _2, "mn": _2, "mo": _2, "modena": _2, "monza-brianza": _2, "monza-e-della-brianza": _2, "monza": _2, "monzabrianza": _2, "monzaebrianza": _2, "monzaedellabrianza": _2, "ms": _2, "mt": _2, "na": _2, "naples": _2, "napoli": _2, "no": _2, "novara": _2, "nu": _2, "nuoro": _2, "og": _2, "ogliastra": _2, "olbia-tempio": _2, "olbiatempio": _2, "or": _2, "oristano": _2, "ot": _2, "pa": _2, "padova": _2, "padua": _2, "palermo": _2, "parma": _2, "pavia": _2, "pc": _2, "pd": _2, "pe": _2, "perugia": _2, "pesaro-urbino": _2, "pesarourbino": _2, "pescara": _2, "pg": _2, "pi": _2, "piacenza": _2, "pisa": _2, "pistoia": _2, "pn": _2, "po": _2, "pordenone": _2, "potenza": _2, "pr": _2, "prato": _2, "pt": _2, "pu": _2, "pv": _2, "pz": _2, "ra": _2, "ragusa": _2, "ravenna": _2, "rc": _2, "re": _2, "reggio-calabria": _2, "reggio-emilia": _2, "reggiocalabria": _2, "reggioemilia": _2, "rg": _2, "ri": _2, "rieti": _2, "rimini": _2, "rm": _2, "rn": _2, "ro": _2, "roma": _2, "rome": _2, "rovigo": _2, "sa": _2, "salerno": _2, "sassari": _2, "savona": _2, "si": _2, "siena": _2, "siracusa": _2, "so": _2, "sondrio": _2, "sp": _2, "sr": _2, "ss": _2, "suedtirol": _2, "xn--sdtirol-n2a": _2, "südtirol": _2, "sv": _2, "ta": _2, "taranto": _2, "te": _2, "tempio-olbia": _2, "tempioolbia": _2, "teramo": _2, "terni": _2, "tn": _2, "to": _2, "torino": _2, "tp": _2, "tr": _2, "trani-andria-barletta": _2, "trani-barletta-andria": _2, "traniandriabarletta": _2, "tranibarlettaandria": _2, "trapani": _2, "trento": _2, "treviso": _2, "trieste": _2, "ts": _2, "turin": _2, "tv": _2, "ud": _2, "udine": _2, "urbino-pesaro": _2, "urbinopesaro": _2, "va": _2, "varese": _2, "vb": _2, "vc": _2, "ve": _2, "venezia": _2, "venice": _2, "verbania": _2, "vercelli": _2, "verona": _2, "vi": _2, "vibo-valentia": _2, "vibovalentia": _2, "vicenza": _2, "viterbo": _2, "vr": _2, "vs": _2, "vt": _2, "vv": _2, "blogspot": _3, "ibxos": _3, "iliadboxos": _3, "neen": [0, { "jc": _3 }], "tim": [0, { "open": [0, { "jelastic": _9 }] }], "16-b": _3, "32-b": _3, "64-b": _3, "123homepage": _3, "myspreadshop": _3, "syncloud": _3 }], "je": [1, { "co": _2, "net": _2, "org": _2, "of": _3 }], "jm": _8, "jo": [1, { "com": _2, "org": _2, "net": _2, "edu": _2, "sch": _2, "gov": _2, "mil": _2, "name": _2 }], "jobs": _2, "jp": [1, { "ac": _2, "ad": _2, "co": _2, "ed": _2, "go": _2, "gr": _2, "lg": _2, "ne": [1, { "aseinet": _28, "gehirn": _3, "ivory": _3, "mail-box": _3, "mints": _3, "mokuren": _3, "opal": _3, "sakura": _3, "sumomo": _3, "topaz": _3 }], "or": _2, "aichi": [1, { "aisai": _2, "ama": _2, "anjo": _2, "asuke": _2, "chiryu": _2, "chita": _2, "fuso": _2, "gamagori": _2, "handa": _2, "hazu": _2, "hekinan": _2, "higashiura": _2, "ichinomiya": _2, "inazawa": _2, "inuyama": _2, "isshiki": _2, "iwakura": _2, "kanie": _2, "kariya": _2, "kasugai": _2, "kira": _2, "kiyosu": _2, "komaki": _2, "konan": _2, "kota": _2, "mihama": _2, "miyoshi": _2, "nishio": _2, "nisshin": _2, "obu": _2, "oguchi": _2, "oharu": _2, "okazaki": _2, "owariasahi": _2, "seto": _2, "shikatsu": _2, "shinshiro": _2, "shitara": _2, "tahara": _2, "takahama": _2, "tobishima": _2, "toei": _2, "togo": _2, "tokai": _2, "tokoname": _2, "toyoake": _2, "toyohashi": _2, "toyokawa": _2, "toyone": _2, "toyota": _2, "tsushima": _2, "yatomi": _2 }], "akita": [1, { "akita": _2, "daisen": _2, "fujisato": _2, "gojome": _2, "hachirogata": _2, "happou": _2, "higashinaruse": _2, "honjo": _2, "honjyo": _2, "ikawa": _2, "kamikoani": _2, "kamioka": _2, "katagami": _2, "kazuno": _2, "kitaakita": _2, "kosaka": _2, "kyowa": _2, "misato": _2, "mitane": _2, "moriyoshi": _2, "nikaho": _2, "noshiro": _2, "odate": _2, "oga": _2, "ogata": _2, "semboku": _2, "yokote": _2, "yurihonjo": _2 }], "aomori": [1, { "aomori": _2, "gonohe": _2, "hachinohe": _2, "hashikami": _2, "hiranai": _2, "hirosaki": _2, "itayanagi": _2, "kuroishi": _2, "misawa": _2, "mutsu": _2, "nakadomari": _2, "noheji": _2, "oirase": _2, "owani": _2, "rokunohe": _2, "sannohe": _2, "shichinohe": _2, "shingo": _2, "takko": _2, "towada": _2, "tsugaru": _2, "tsuruta": _2 }], "chiba": [1, { "abiko": _2, "asahi": _2, "chonan": _2, "chosei": _2, "choshi": _2, "chuo": _2, "funabashi": _2, "futtsu": _2, "hanamigawa": _2, "ichihara": _2, "ichikawa": _2, "ichinomiya": _2, "inzai": _2, "isumi": _2, "kamagaya": _2, "kamogawa": _2, "kashiwa": _2, "katori": _2, "katsuura": _2, "kimitsu": _2, "kisarazu": _2, "kozaki": _2, "kujukuri": _2, "kyonan": _2, "matsudo": _2, "midori": _2, "mihama": _2, "minamiboso": _2, "mobara": _2, "mutsuzawa": _2, "nagara": _2, "nagareyama": _2, "narashino": _2, "narita": _2, "noda": _2, "oamishirasato": _2, "omigawa": _2, "onjuku": _2, "otaki": _2, "sakae": _2, "sakura": _2, "shimofusa": _2, "shirako": _2, "shiroi": _2, "shisui": _2, "sodegaura": _2, "sosa": _2, "tako": _2, "tateyama": _2, "togane": _2, "tohnosho": _2, "tomisato": _2, "urayasu": _2, "yachimata": _2, "yachiyo": _2, "yokaichiba": _2, "yokoshibahikari": _2, "yotsukaido": _2 }], "ehime": [1, { "ainan": _2, "honai": _2, "ikata": _2, "imabari": _2, "iyo": _2, "kamijima": _2, "kihoku": _2, "kumakogen": _2, "masaki": _2, "matsuno": _2, "matsuyama": _2, "namikata": _2, "niihama": _2, "ozu": _2, "saijo": _2, "seiyo": _2, "shikokuchuo": _2, "tobe": _2, "toon": _2, "uchiko": _2, "uwajima": _2, "yawatahama": _2 }], "fukui": [1, { "echizen": _2, "eiheiji": _2, "fukui": _2, "ikeda": _2, "katsuyama": _2, "mihama": _2, "minamiechizen": _2, "obama": _2, "ohi": _2, "ono": _2, "sabae": _2, "sakai": _2, "takahama": _2, "tsuruga": _2, "wakasa": _2 }], "fukuoka": [1, { "ashiya": _2, "buzen": _2, "chikugo": _2, "chikuho": _2, "chikujo": _2, "chikushino": _2, "chikuzen": _2, "chuo": _2, "dazaifu": _2, "fukuchi": _2, "hakata": _2, "higashi": _2, "hirokawa": _2, "hisayama": _2, "iizuka": _2, "inatsuki": _2, "kaho": _2, "kasuga": _2, "kasuya": _2, "kawara": _2, "keisen": _2, "koga": _2, "kurate": _2, "kurogi": _2, "kurume": _2, "minami": _2, "miyako": _2, "miyama": _2, "miyawaka": _2, "mizumaki": _2, "munakata": _2, "nakagawa": _2, "nakama": _2, "nishi": _2, "nogata": _2, "ogori": _2, "okagaki": _2, "okawa": _2, "oki": _2, "omuta": _2, "onga": _2, "onojo": _2, "oto": _2, "saigawa": _2, "sasaguri": _2, "shingu": _2, "shinyoshitomi": _2, "shonai": _2, "soeda": _2, "sue": _2, "tachiarai": _2, "tagawa": _2, "takata": _2, "toho": _2, "toyotsu": _2, "tsuiki": _2, "ukiha": _2, "umi": _2, "usui": _2, "yamada": _2, "yame": _2, "yanagawa": _2, "yukuhashi": _2 }], "fukushima": [1, { "aizubange": _2, "aizumisato": _2, "aizuwakamatsu": _2, "asakawa": _2, "bandai": _2, "date": _2, "fukushima": _2, "furudono": _2, "futaba": _2, "hanawa": _2, "higashi": _2, "hirata": _2, "hirono": _2, "iitate": _2, "inawashiro": _2, "ishikawa": _2, "iwaki": _2, "izumizaki": _2, "kagamiishi": _2, "kaneyama": _2, "kawamata": _2, "kitakata": _2, "kitashiobara": _2, "koori": _2, "koriyama": _2, "kunimi": _2, "miharu": _2, "mishima": _2, "namie": _2, "nango": _2, "nishiaizu": _2, "nishigo": _2, "okuma": _2, "omotego": _2, "ono": _2, "otama": _2, "samegawa": _2, "shimogo": _2, "shirakawa": _2, "showa": _2, "soma": _2, "sukagawa": _2, "taishin": _2, "tamakawa": _2, "tanagura": _2, "tenei": _2, "yabuki": _2, "yamato": _2, "yamatsuri": _2, "yanaizu": _2, "yugawa": _2 }], "gifu": [1, { "anpachi": _2, "ena": _2, "gifu": _2, "ginan": _2, "godo": _2, "gujo": _2, "hashima": _2, "hichiso": _2, "hida": _2, "higashishirakawa": _2, "ibigawa": _2, "ikeda": _2, "kakamigahara": _2, "kani": _2, "kasahara": _2, "kasamatsu": _2, "kawaue": _2, "kitagata": _2, "mino": _2, "minokamo": _2, "mitake": _2, "mizunami": _2, "motosu": _2, "nakatsugawa": _2, "ogaki": _2, "sakahogi": _2, "seki": _2, "sekigahara": _2, "shirakawa": _2, "tajimi": _2, "takayama": _2, "tarui": _2, "toki": _2, "tomika": _2, "wanouchi": _2, "yamagata": _2, "yaotsu": _2, "yoro": _2 }], "gunma": [1, { "annaka": _2, "chiyoda": _2, "fujioka": _2, "higashiagatsuma": _2, "isesaki": _2, "itakura": _2, "kanna": _2, "kanra": _2, "katashina": _2, "kawaba": _2, "kiryu": _2, "kusatsu": _2, "maebashi": _2, "meiwa": _2, "midori": _2, "minakami": _2, "naganohara": _2, "nakanojo": _2, "nanmoku": _2, "numata": _2, "oizumi": _2, "ora": _2, "ota": _2, "shibukawa": _2, "shimonita": _2, "shinto": _2, "showa": _2, "takasaki": _2, "takayama": _2, "tamamura": _2, "tatebayashi": _2, "tomioka": _2, "tsukiyono": _2, "tsumagoi": _2, "ueno": _2, "yoshioka": _2 }], "hiroshima": [1, { "asaminami": _2, "daiwa": _2, "etajima": _2, "fuchu": _2, "fukuyama": _2, "hatsukaichi": _2, "higashihiroshima": _2, "hongo": _2, "jinsekikogen": _2, "kaita": _2, "kui": _2, "kumano": _2, "kure": _2, "mihara": _2, "miyoshi": _2, "naka": _2, "onomichi": _2, "osakikamijima": _2, "otake": _2, "saka": _2, "sera": _2, "seranishi": _2, "shinichi": _2, "shobara": _2, "takehara": _2 }], "hokkaido": [1, { "abashiri": _2, "abira": _2, "aibetsu": _2, "akabira": _2, "akkeshi": _2, "asahikawa": _2, "ashibetsu": _2, "ashoro": _2, "assabu": _2, "atsuma": _2, "bibai": _2, "biei": _2, "bifuka": _2, "bihoro": _2, "biratori": _2, "chippubetsu": _2, "chitose": _2, "date": _2, "ebetsu": _2, "embetsu": _2, "eniwa": _2, "erimo": _2, "esan": _2, "esashi": _2, "fukagawa": _2, "fukushima": _2, "furano": _2, "furubira": _2, "haboro": _2, "hakodate": _2, "hamatonbetsu": _2, "hidaka": _2, "higashikagura": _2, "higashikawa": _2, "hiroo": _2, "hokuryu": _2, "hokuto": _2, "honbetsu": _2, "horokanai": _2, "horonobe": _2, "ikeda": _2, "imakane": _2, "ishikari": _2, "iwamizawa": _2, "iwanai": _2, "kamifurano": _2, "kamikawa": _2, "kamishihoro": _2, "kamisunagawa": _2, "kamoenai": _2, "kayabe": _2, "kembuchi": _2, "kikonai": _2, "kimobetsu": _2, "kitahiroshima": _2, "kitami": _2, "kiyosato": _2, "koshimizu": _2, "kunneppu": _2, "kuriyama": _2, "kuromatsunai": _2, "kushiro": _2, "kutchan": _2, "kyowa": _2, "mashike": _2, "matsumae": _2, "mikasa": _2, "minamifurano": _2, "mombetsu": _2, "moseushi": _2, "mukawa": _2, "muroran": _2, "naie": _2, "nakagawa": _2, "nakasatsunai": _2, "nakatombetsu": _2, "nanae": _2, "nanporo": _2, "nayoro": _2, "nemuro": _2, "niikappu": _2, "niki": _2, "nishiokoppe": _2, "noboribetsu": _2, "numata": _2, "obihiro": _2, "obira": _2, "oketo": _2, "okoppe": _2, "otaru": _2, "otobe": _2, "otofuke": _2, "otoineppu": _2, "oumu": _2, "ozora": _2, "pippu": _2, "rankoshi": _2, "rebun": _2, "rikubetsu": _2, "rishiri": _2, "rishirifuji": _2, "saroma": _2, "sarufutsu": _2, "shakotan": _2, "shari": _2, "shibecha": _2, "shibetsu": _2, "shikabe": _2, "shikaoi": _2, "shimamaki": _2, "shimizu": _2, "shimokawa": _2, "shinshinotsu": _2, "shintoku": _2, "shiranuka": _2, "shiraoi": _2, "shiriuchi": _2, "sobetsu": _2, "sunagawa": _2, "taiki": _2, "takasu": _2, "takikawa": _2, "takinoue": _2, "teshikaga": _2, "tobetsu": _2, "tohma": _2, "tomakomai": _2, "tomari": _2, "toya": _2, "toyako": _2, "toyotomi": _2, "toyoura": _2, "tsubetsu": _2, "tsukigata": _2, "urakawa": _2, "urausu": _2, "uryu": _2, "utashinai": _2, "wakkanai": _2, "wassamu": _2, "yakumo": _2, "yoichi": _2 }], "hyogo": [1, { "aioi": _2, "akashi": _2, "ako": _2, "amagasaki": _2, "aogaki": _2, "asago": _2, "ashiya": _2, "awaji": _2, "fukusaki": _2, "goshiki": _2, "harima": _2, "himeji": _2, "ichikawa": _2, "inagawa": _2, "itami": _2, "kakogawa": _2, "kamigori": _2, "kamikawa": _2, "kasai": _2, "kasuga": _2, "kawanishi": _2, "miki": _2, "minamiawaji": _2, "nishinomiya": _2, "nishiwaki": _2, "ono": _2, "sanda": _2, "sannan": _2, "sasayama": _2, "sayo": _2, "shingu": _2, "shinonsen": _2, "shiso": _2, "sumoto": _2, "taishi": _2, "taka": _2, "takarazuka": _2, "takasago": _2, "takino": _2, "tamba": _2, "tatsuno": _2, "toyooka": _2, "yabu": _2, "yashiro": _2, "yoka": _2, "yokawa": _2 }], "ibaraki": [1, { "ami": _2, "asahi": _2, "bando": _2, "chikusei": _2, "daigo": _2, "fujishiro": _2, "hitachi": _2, "hitachinaka": _2, "hitachiomiya": _2, "hitachiota": _2, "ibaraki": _2, "ina": _2, "inashiki": _2, "itako": _2, "iwama": _2, "joso": _2, "kamisu": _2, "kasama": _2, "kashima": _2, "kasumigaura": _2, "koga": _2, "miho": _2, "mito": _2, "moriya": _2, "naka": _2, "namegata": _2, "oarai": _2, "ogawa": _2, "omitama": _2, "ryugasaki": _2, "sakai": _2, "sakuragawa": _2, "shimodate": _2, "shimotsuma": _2, "shirosato": _2, "sowa": _2, "suifu": _2, "takahagi": _2, "tamatsukuri": _2, "tokai": _2, "tomobe": _2, "tone": _2, "toride": _2, "tsuchiura": _2, "tsukuba": _2, "uchihara": _2, "ushiku": _2, "yachiyo": _2, "yamagata": _2, "yawara": _2, "yuki": _2 }], "ishikawa": [1, { "anamizu": _2, "hakui": _2, "hakusan": _2, "kaga": _2, "kahoku": _2, "kanazawa": _2, "kawakita": _2, "komatsu": _2, "nakanoto": _2, "nanao": _2, "nomi": _2, "nonoichi": _2, "noto": _2, "shika": _2, "suzu": _2, "tsubata": _2, "tsurugi": _2, "uchinada": _2, "wajima": _2 }], "iwate": [1, { "fudai": _2, "fujisawa": _2, "hanamaki": _2, "hiraizumi": _2, "hirono": _2, "ichinohe": _2, "ichinoseki": _2, "iwaizumi": _2, "iwate": _2, "joboji": _2, "kamaishi": _2, "kanegasaki": _2, "karumai": _2, "kawai": _2, "kitakami": _2, "kuji": _2, "kunohe": _2, "kuzumaki": _2, "miyako": _2, "mizusawa": _2, "morioka": _2, "ninohe": _2, "noda": _2, "ofunato": _2, "oshu": _2, "otsuchi": _2, "rikuzentakata": _2, "shiwa": _2, "shizukuishi": _2, "sumita": _2, "tanohata": _2, "tono": _2, "yahaba": _2, "yamada": _2 }], "kagawa": [1, { "ayagawa": _2, "higashikagawa": _2, "kanonji": _2, "kotohira": _2, "manno": _2, "marugame": _2, "mitoyo": _2, "naoshima": _2, "sanuki": _2, "tadotsu": _2, "takamatsu": _2, "tonosho": _2, "uchinomi": _2, "utazu": _2, "zentsuji": _2 }], "kagoshima": [1, { "akune": _2, "amami": _2, "hioki": _2, "isa": _2, "isen": _2, "izumi": _2, "kagoshima": _2, "kanoya": _2, "kawanabe": _2, "kinko": _2, "kouyama": _2, "makurazaki": _2, "matsumoto": _2, "minamitane": _2, "nakatane": _2, "nishinoomote": _2, "satsumasendai": _2, "soo": _2, "tarumizu": _2, "yusui": _2 }], "kanagawa": [1, { "aikawa": _2, "atsugi": _2, "ayase": _2, "chigasaki": _2, "ebina": _2, "fujisawa": _2, "hadano": _2, "hakone": _2, "hiratsuka": _2, "isehara": _2, "kaisei": _2, "kamakura": _2, "kiyokawa": _2, "matsuda": _2, "minamiashigara": _2, "miura": _2, "nakai": _2, "ninomiya": _2, "odawara": _2, "oi": _2, "oiso": _2, "sagamihara": _2, "samukawa": _2, "tsukui": _2, "yamakita": _2, "yamato": _2, "yokosuka": _2, "yugawara": _2, "zama": _2, "zushi": _2 }], "kochi": [1, { "aki": _2, "geisei": _2, "hidaka": _2, "higashitsuno": _2, "ino": _2, "kagami": _2, "kami": _2, "kitagawa": _2, "kochi": _2, "mihara": _2, "motoyama": _2, "muroto": _2, "nahari": _2, "nakamura": _2, "nankoku": _2, "nishitosa": _2, "niyodogawa": _2, "ochi": _2, "okawa": _2, "otoyo": _2, "otsuki": _2, "sakawa": _2, "sukumo": _2, "susaki": _2, "tosa": _2, "tosashimizu": _2, "toyo": _2, "tsuno": _2, "umaji": _2, "yasuda": _2, "yusuhara": _2 }], "kumamoto": [1, { "amakusa": _2, "arao": _2, "aso": _2, "choyo": _2, "gyokuto": _2, "kamiamakusa": _2, "kikuchi": _2, "kumamoto": _2, "mashiki": _2, "mifune": _2, "minamata": _2, "minamioguni": _2, "nagasu": _2, "nishihara": _2, "oguni": _2, "ozu": _2, "sumoto": _2, "takamori": _2, "uki": _2, "uto": _2, "yamaga": _2, "yamato": _2, "yatsushiro": _2 }], "kyoto": [1, { "ayabe": _2, "fukuchiyama": _2, "higashiyama": _2, "ide": _2, "ine": _2, "joyo": _2, "kameoka": _2, "kamo": _2, "kita": _2, "kizu": _2, "kumiyama": _2, "kyotamba": _2, "kyotanabe": _2, "kyotango": _2, "maizuru": _2, "minami": _2, "minamiyamashiro": _2, "miyazu": _2, "muko": _2, "nagaokakyo": _2, "nakagyo": _2, "nantan": _2, "oyamazaki": _2, "sakyo": _2, "seika": _2, "tanabe": _2, "uji": _2, "ujitawara": _2, "wazuka": _2, "yamashina": _2, "yawata": _2 }], "mie": [1, { "asahi": _2, "inabe": _2, "ise": _2, "kameyama": _2, "kawagoe": _2, "kiho": _2, "kisosaki": _2, "kiwa": _2, "komono": _2, "kumano": _2, "kuwana": _2, "matsusaka": _2, "meiwa": _2, "mihama": _2, "minamiise": _2, "misugi": _2, "miyama": _2, "nabari": _2, "shima": _2, "suzuka": _2, "tado": _2, "taiki": _2, "taki": _2, "tamaki": _2, "toba": _2, "tsu": _2, "udono": _2, "ureshino": _2, "watarai": _2, "yokkaichi": _2 }], "miyagi": [1, { "furukawa": _2, "higashimatsushima": _2, "ishinomaki": _2, "iwanuma": _2, "kakuda": _2, "kami": _2, "kawasaki": _2, "marumori": _2, "matsushima": _2, "minamisanriku": _2, "misato": _2, "murata": _2, "natori": _2, "ogawara": _2, "ohira": _2, "onagawa": _2, "osaki": _2, "rifu": _2, "semine": _2, "shibata": _2, "shichikashuku": _2, "shikama": _2, "shiogama": _2, "shiroishi": _2, "tagajo": _2, "taiwa": _2, "tome": _2, "tomiya": _2, "wakuya": _2, "watari": _2, "yamamoto": _2, "zao": _2 }], "miyazaki": [1, { "aya": _2, "ebino": _2, "gokase": _2, "hyuga": _2, "kadogawa": _2, "kawaminami": _2, "kijo": _2, "kitagawa": _2, "kitakata": _2, "kitaura": _2, "kobayashi": _2, "kunitomi": _2, "kushima": _2, "mimata": _2, "miyakonojo": _2, "miyazaki": _2, "morotsuka": _2, "nichinan": _2, "nishimera": _2, "nobeoka": _2, "saito": _2, "shiiba": _2, "shintomi": _2, "takaharu": _2, "takanabe": _2, "takazaki": _2, "tsuno": _2 }], "nagano": [1, { "achi": _2, "agematsu": _2, "anan": _2, "aoki": _2, "asahi": _2, "azumino": _2, "chikuhoku": _2, "chikuma": _2, "chino": _2, "fujimi": _2, "hakuba": _2, "hara": _2, "hiraya": _2, "iida": _2, "iijima": _2, "iiyama": _2, "iizuna": _2, "ikeda": _2, "ikusaka": _2, "ina": _2, "karuizawa": _2, "kawakami": _2, "kiso": _2, "kisofukushima": _2, "kitaaiki": _2, "komagane": _2, "komoro": _2, "matsukawa": _2, "matsumoto": _2, "miasa": _2, "minamiaiki": _2, "minamimaki": _2, "minamiminowa": _2, "minowa": _2, "miyada": _2, "miyota": _2, "mochizuki": _2, "nagano": _2, "nagawa": _2, "nagiso": _2, "nakagawa": _2, "nakano": _2, "nozawaonsen": _2, "obuse": _2, "ogawa": _2, "okaya": _2, "omachi": _2, "omi": _2, "ookuwa": _2, "ooshika": _2, "otaki": _2, "otari": _2, "sakae": _2, "sakaki": _2, "saku": _2, "sakuho": _2, "shimosuwa": _2, "shinanomachi": _2, "shiojiri": _2, "suwa": _2, "suzaka": _2, "takagi": _2, "takamori": _2, "takayama": _2, "tateshina": _2, "tatsuno": _2, "togakushi": _2, "togura": _2, "tomi": _2, "ueda": _2, "wada": _2, "yamagata": _2, "yamanouchi": _2, "yasaka": _2, "yasuoka": _2 }], "nagasaki": [1, { "chijiwa": _2, "futsu": _2, "goto": _2, "hasami": _2, "hirado": _2, "iki": _2, "isahaya": _2, "kawatana": _2, "kuchinotsu": _2, "matsuura": _2, "nagasaki": _2, "obama": _2, "omura": _2, "oseto": _2, "saikai": _2, "sasebo": _2, "seihi": _2, "shimabara": _2, "shinkamigoto": _2, "togitsu": _2, "tsushima": _2, "unzen": _2 }], "nara": [1, { "ando": _2, "gose": _2, "heguri": _2, "higashiyoshino": _2, "ikaruga": _2, "ikoma": _2, "kamikitayama": _2, "kanmaki": _2, "kashiba": _2, "kashihara": _2, "katsuragi": _2, "kawai": _2, "kawakami": _2, "kawanishi": _2, "koryo": _2, "kurotaki": _2, "mitsue": _2, "miyake": _2, "nara": _2, "nosegawa": _2, "oji": _2, "ouda": _2, "oyodo": _2, "sakurai": _2, "sango": _2, "shimoichi": _2, "shimokitayama": _2, "shinjo": _2, "soni": _2, "takatori": _2, "tawaramoto": _2, "tenkawa": _2, "tenri": _2, "uda": _2, "yamatokoriyama": _2, "yamatotakada": _2, "yamazoe": _2, "yoshino": _2 }], "niigata": [1, { "aga": _2, "agano": _2, "gosen": _2, "itoigawa": _2, "izumozaki": _2, "joetsu": _2, "kamo": _2, "kariwa": _2, "kashiwazaki": _2, "minamiuonuma": _2, "mitsuke": _2, "muika": _2, "murakami": _2, "myoko": _2, "nagaoka": _2, "niigata": _2, "ojiya": _2, "omi": _2, "sado": _2, "sanjo": _2, "seiro": _2, "seirou": _2, "sekikawa": _2, "shibata": _2, "tagami": _2, "tainai": _2, "tochio": _2, "tokamachi": _2, "tsubame": _2, "tsunan": _2, "uonuma": _2, "yahiko": _2, "yoita": _2, "yuzawa": _2 }], "oita": [1, { "beppu": _2, "bungoono": _2, "bungotakada": _2, "hasama": _2, "hiji": _2, "himeshima": _2, "hita": _2, "kamitsue": _2, "kokonoe": _2, "kuju": _2, "kunisaki": _2, "kusu": _2, "oita": _2, "saiki": _2, "taketa": _2, "tsukumi": _2, "usa": _2, "usuki": _2, "yufu": _2 }], "okayama": [1, { "akaiwa": _2, "asakuchi": _2, "bizen": _2, "hayashima": _2, "ibara": _2, "kagamino": _2, "kasaoka": _2, "kibichuo": _2, "kumenan": _2, "kurashiki": _2, "maniwa": _2, "misaki": _2, "nagi": _2, "niimi": _2, "nishiawakura": _2, "okayama": _2, "satosho": _2, "setouchi": _2, "shinjo": _2, "shoo": _2, "soja": _2, "takahashi": _2, "tamano": _2, "tsuyama": _2, "wake": _2, "yakage": _2 }], "okinawa": [1, { "aguni": _2, "ginowan": _2, "ginoza": _2, "gushikami": _2, "haebaru": _2, "higashi": _2, "hirara": _2, "iheya": _2, "ishigaki": _2, "ishikawa": _2, "itoman": _2, "izena": _2, "kadena": _2, "kin": _2, "kitadaito": _2, "kitanakagusuku": _2, "kumejima": _2, "kunigami": _2, "minamidaito": _2, "motobu": _2, "nago": _2, "naha": _2, "nakagusuku": _2, "nakijin": _2, "nanjo": _2, "nishihara": _2, "ogimi": _2, "okinawa": _2, "onna": _2, "shimoji": _2, "taketomi": _2, "tarama": _2, "tokashiki": _2, "tomigusuku": _2, "tonaki": _2, "urasoe": _2, "uruma": _2, "yaese": _2, "yomitan": _2, "yonabaru": _2, "yonaguni": _2, "zamami": _2 }], "osaka": [1, { "abeno": _2, "chihayaakasaka": _2, "chuo": _2, "daito": _2, "fujiidera": _2, "habikino": _2, "hannan": _2, "higashiosaka": _2, "higashisumiyoshi": _2, "higashiyodogawa": _2, "hirakata": _2, "ibaraki": _2, "ikeda": _2, "izumi": _2, "izumiotsu": _2, "izumisano": _2, "kadoma": _2, "kaizuka": _2, "kanan": _2, "kashiwara": _2, "katano": _2, "kawachinagano": _2, "kishiwada": _2, "kita": _2, "kumatori": _2, "matsubara": _2, "minato": _2, "minoh": _2, "misaki": _2, "moriguchi": _2, "neyagawa": _2, "nishi": _2, "nose": _2, "osakasayama": _2, "sakai": _2, "sayama": _2, "sennan": _2, "settsu": _2, "shijonawate": _2, "shimamoto": _2, "suita": _2, "tadaoka": _2, "taishi": _2, "tajiri": _2, "takaishi": _2, "takatsuki": _2, "tondabayashi": _2, "toyonaka": _2, "toyono": _2, "yao": _2 }], "saga": [1, { "ariake": _2, "arita": _2, "fukudomi": _2, "genkai": _2, "hamatama": _2, "hizen": _2, "imari": _2, "kamimine": _2, "kanzaki": _2, "karatsu": _2, "kashima": _2, "kitagata": _2, "kitahata": _2, "kiyama": _2, "kouhoku": _2, "kyuragi": _2, "nishiarita": _2, "ogi": _2, "omachi": _2, "ouchi": _2, "saga": _2, "shiroishi": _2, "taku": _2, "tara": _2, "tosu": _2, "yoshinogari": _2 }], "saitama": [1, { "arakawa": _2, "asaka": _2, "chichibu": _2, "fujimi": _2, "fujimino": _2, "fukaya": _2, "hanno": _2, "hanyu": _2, "hasuda": _2, "hatogaya": _2, "hatoyama": _2, "hidaka": _2, "higashichichibu": _2, "higashimatsuyama": _2, "honjo": _2, "ina": _2, "iruma": _2, "iwatsuki": _2, "kamiizumi": _2, "kamikawa": _2, "kamisato": _2, "kasukabe": _2, "kawagoe": _2, "kawaguchi": _2, "kawajima": _2, "kazo": _2, "kitamoto": _2, "koshigaya": _2, "kounosu": _2, "kuki": _2, "kumagaya": _2, "matsubushi": _2, "minano": _2, "misato": _2, "miyashiro": _2, "miyoshi": _2, "moroyama": _2, "nagatoro": _2, "namegawa": _2, "niiza": _2, "ogano": _2, "ogawa": _2, "ogose": _2, "okegawa": _2, "omiya": _2, "otaki": _2, "ranzan": _2, "ryokami": _2, "saitama": _2, "sakado": _2, "satte": _2, "sayama": _2, "shiki": _2, "shiraoka": _2, "soka": _2, "sugito": _2, "toda": _2, "tokigawa": _2, "tokorozawa": _2, "tsurugashima": _2, "urawa": _2, "warabi": _2, "yashio": _2, "yokoze": _2, "yono": _2, "yorii": _2, "yoshida": _2, "yoshikawa": _2, "yoshimi": _2 }], "shiga": [1, { "aisho": _2, "gamo": _2, "higashiomi": _2, "hikone": _2, "koka": _2, "konan": _2, "kosei": _2, "koto": _2, "kusatsu": _2, "maibara": _2, "moriyama": _2, "nagahama": _2, "nishiazai": _2, "notogawa": _2, "omihachiman": _2, "otsu": _2, "ritto": _2, "ryuoh": _2, "takashima": _2, "takatsuki": _2, "torahime": _2, "toyosato": _2, "yasu": _2 }], "shimane": [1, { "akagi": _2, "ama": _2, "gotsu": _2, "hamada": _2, "higashiizumo": _2, "hikawa": _2, "hikimi": _2, "izumo": _2, "kakinoki": _2, "masuda": _2, "matsue": _2, "misato": _2, "nishinoshima": _2, "ohda": _2, "okinoshima": _2, "okuizumo": _2, "shimane": _2, "tamayu": _2, "tsuwano": _2, "unnan": _2, "yakumo": _2, "yasugi": _2, "yatsuka": _2 }], "shizuoka": [1, { "arai": _2, "atami": _2, "fuji": _2, "fujieda": _2, "fujikawa": _2, "fujinomiya": _2, "fukuroi": _2, "gotemba": _2, "haibara": _2, "hamamatsu": _2, "higashiizu": _2, "ito": _2, "iwata": _2, "izu": _2, "izunokuni": _2, "kakegawa": _2, "kannami": _2, "kawanehon": _2, "kawazu": _2, "kikugawa": _2, "kosai": _2, "makinohara": _2, "matsuzaki": _2, "minamiizu": _2, "mishima": _2, "morimachi": _2, "nishiizu": _2, "numazu": _2, "omaezaki": _2, "shimada": _2, "shimizu": _2, "shimoda": _2, "shizuoka": _2, "susono": _2, "yaizu": _2, "yoshida": _2 }], "tochigi": [1, { "ashikaga": _2, "bato": _2, "haga": _2, "ichikai": _2, "iwafune": _2, "kaminokawa": _2, "kanuma": _2, "karasuyama": _2, "kuroiso": _2, "mashiko": _2, "mibu": _2, "moka": _2, "motegi": _2, "nasu": _2, "nasushiobara": _2, "nikko": _2, "nishikata": _2, "nogi": _2, "ohira": _2, "ohtawara": _2, "oyama": _2, "sakura": _2, "sano": _2, "shimotsuke": _2, "shioya": _2, "takanezawa": _2, "tochigi": _2, "tsuga": _2, "ujiie": _2, "utsunomiya": _2, "yaita": _2 }], "tokushima": [1, { "aizumi": _2, "anan": _2, "ichiba": _2, "itano": _2, "kainan": _2, "komatsushima": _2, "matsushige": _2, "mima": _2, "minami": _2, "miyoshi": _2, "mugi": _2, "nakagawa": _2, "naruto": _2, "sanagochi": _2, "shishikui": _2, "tokushima": _2, "wajiki": _2 }], "tokyo": [1, { "adachi": _2, "akiruno": _2, "akishima": _2, "aogashima": _2, "arakawa": _2, "bunkyo": _2, "chiyoda": _2, "chofu": _2, "chuo": _2, "edogawa": _2, "fuchu": _2, "fussa": _2, "hachijo": _2, "hachioji": _2, "hamura": _2, "higashikurume": _2, "higashimurayama": _2, "higashiyamato": _2, "hino": _2, "hinode": _2, "hinohara": _2, "inagi": _2, "itabashi": _2, "katsushika": _2, "kita": _2, "kiyose": _2, "kodaira": _2, "koganei": _2, "kokubunji": _2, "komae": _2, "koto": _2, "kouzushima": _2, "kunitachi": _2, "machida": _2, "meguro": _2, "minato": _2, "mitaka": _2, "mizuho": _2, "musashimurayama": _2, "musashino": _2, "nakano": _2, "nerima": _2, "ogasawara": _2, "okutama": _2, "ome": _2, "oshima": _2, "ota": _2, "setagaya": _2, "shibuya": _2, "shinagawa": _2, "shinjuku": _2, "suginami": _2, "sumida": _2, "tachikawa": _2, "taito": _2, "tama": _2, "toshima": _2 }], "tottori": [1, { "chizu": _2, "hino": _2, "kawahara": _2, "koge": _2, "kotoura": _2, "misasa": _2, "nanbu": _2, "nichinan": _2, "sakaiminato": _2, "tottori": _2, "wakasa": _2, "yazu": _2, "yonago": _2 }], "toyama": [1, { "asahi": _2, "fuchu": _2, "fukumitsu": _2, "funahashi": _2, "himi": _2, "imizu": _2, "inami": _2, "johana": _2, "kamiichi": _2, "kurobe": _2, "nakaniikawa": _2, "namerikawa": _2, "nanto": _2, "nyuzen": _2, "oyabe": _2, "taira": _2, "takaoka": _2, "tateyama": _2, "toga": _2, "tonami": _2, "toyama": _2, "unazuki": _2, "uozu": _2, "yamada": _2 }], "wakayama": [1, { "arida": _2, "aridagawa": _2, "gobo": _2, "hashimoto": _2, "hidaka": _2, "hirogawa": _2, "inami": _2, "iwade": _2, "kainan": _2, "kamitonda": _2, "katsuragi": _2, "kimino": _2, "kinokawa": _2, "kitayama": _2, "koya": _2, "koza": _2, "kozagawa": _2, "kudoyama": _2, "kushimoto": _2, "mihama": _2, "misato": _2, "nachikatsuura": _2, "shingu": _2, "shirahama": _2, "taiji": _2, "tanabe": _2, "wakayama": _2, "yuasa": _2, "yura": _2 }], "yamagata": [1, { "asahi": _2, "funagata": _2, "higashine": _2, "iide": _2, "kahoku": _2, "kaminoyama": _2, "kaneyama": _2, "kawanishi": _2, "mamurogawa": _2, "mikawa": _2, "murayama": _2, "nagai": _2, "nakayama": _2, "nanyo": _2, "nishikawa": _2, "obanazawa": _2, "oe": _2, "oguni": _2, "ohkura": _2, "oishida": _2, "sagae": _2, "sakata": _2, "sakegawa": _2, "shinjo": _2, "shirataka": _2, "shonai": _2, "takahata": _2, "tendo": _2, "tozawa": _2, "tsuruoka": _2, "yamagata": _2, "yamanobe": _2, "yonezawa": _2, "yuza": _2 }], "yamaguchi": [1, { "abu": _2, "hagi": _2, "hikari": _2, "hofu": _2, "iwakuni": _2, "kudamatsu": _2, "mitou": _2, "nagato": _2, "oshima": _2, "shimonoseki": _2, "shunan": _2, "tabuse": _2, "tokuyama": _2, "toyota": _2, "ube": _2, "yuu": _2 }], "yamanashi": [1, { "chuo": _2, "doshi": _2, "fuefuki": _2, "fujikawa": _2, "fujikawaguchiko": _2, "fujiyoshida": _2, "hayakawa": _2, "hokuto": _2, "ichikawamisato": _2, "kai": _2, "kofu": _2, "koshu": _2, "kosuge": _2, "minami-alps": _2, "minobu": _2, "nakamichi": _2, "nanbu": _2, "narusawa": _2, "nirasaki": _2, "nishikatsura": _2, "oshino": _2, "otsuki": _2, "showa": _2, "tabayama": _2, "tsuru": _2, "uenohara": _2, "yamanakako": _2, "yamanashi": _2 }], "xn--4pvxs": _2, "栃木": _2, "xn--vgu402c": _2, "愛知": _2, "xn--c3s14m": _2, "愛媛": _2, "xn--f6qx53a": _2, "兵庫": _2, "xn--8pvr4u": _2, "熊本": _2, "xn--uist22h": _2, "茨城": _2, "xn--djrs72d6uy": _2, "北海道": _2, "xn--mkru45i": _2, "千葉": _2, "xn--0trq7p7nn": _2, "和歌山": _2, "xn--8ltr62k": _2, "長崎": _2, "xn--2m4a15e": _2, "長野": _2, "xn--efvn9s": _2, "新潟": _2, "xn--32vp30h": _2, "青森": _2, "xn--4it797k": _2, "静岡": _2, "xn--1lqs71d": _2, "東京": _2, "xn--5rtp49c": _2, "石川": _2, "xn--5js045d": _2, "埼玉": _2, "xn--ehqz56n": _2, "三重": _2, "xn--1lqs03n": _2, "京都": _2, "xn--qqqt11m": _2, "佐賀": _2, "xn--kbrq7o": _2, "大分": _2, "xn--pssu33l": _2, "大阪": _2, "xn--ntsq17g": _2, "奈良": _2, "xn--uisz3g": _2, "宮城": _2, "xn--6btw5a": _2, "宮崎": _2, "xn--1ctwo": _2, "富山": _2, "xn--6orx2r": _2, "山口": _2, "xn--rht61e": _2, "山形": _2, "xn--rht27z": _2, "山梨": _2, "xn--djty4k": _2, "岩手": _2, "xn--nit225k": _2, "岐阜": _2, "xn--rht3d": _2, "岡山": _2, "xn--klty5x": _2, "島根": _2, "xn--kltx9a": _2, "広島": _2, "xn--kltp7d": _2, "徳島": _2, "xn--uuwu58a": _2, "沖縄": _2, "xn--zbx025d": _2, "滋賀": _2, "xn--ntso0iqx3a": _2, "神奈川": _2, "xn--elqq16h": _2, "福井": _2, "xn--4it168d": _2, "福岡": _2, "xn--klt787d": _2, "福島": _2, "xn--rny31h": _2, "秋田": _2, "xn--7t0a264c": _2, "群馬": _2, "xn--5rtq34k": _2, "香川": _2, "xn--k7yn95e": _2, "高知": _2, "xn--tor131o": _2, "鳥取": _2, "xn--d5qv7z876c": _2, "鹿児島": _2, "kawasaki": _8, "kitakyushu": _8, "kobe": _8, "nagoya": _8, "sapporo": _8, "sendai": _8, "yokohama": _8, "buyshop": _3, "fashionstore": _3, "handcrafted": _3, "kawaiishop": _3, "supersale": _3, "theshop": _3, "usercontent": _3, "angry": _3, "babyblue": _3, "babymilk": _3, "backdrop": _3, "bambina": _3, "bitter": _3, "blush": _3, "boo": _3, "boy": _3, "boyfriend": _3, "but": _3, "candypop": _3, "capoo": _3, "catfood": _3, "cheap": _3, "chicappa": _3, "chillout": _3, "chips": _3, "chowder": _3, "chu": _3, "ciao": _3, "cocotte": _3, "coolblog": _3, "cranky": _3, "cutegirl": _3, "daa": _3, "deca": _3, "deci": _3, "digick": _3, "egoism": _3, "fakefur": _3, "fem": _3, "flier": _3, "floppy": _3, "fool": _3, "frenchkiss": _3, "girlfriend": _3, "girly": _3, "gloomy": _3, "gonna": _3, "greater": _3, "hacca": _3, "heavy": _3, "her": _3, "hiho": _3, "hippy": _3, "holy": _3, "hungry": _3, "icurus": _3, "itigo": _3, "jellybean": _3, "kikirara": _3, "kill": _3, "kilo": _3, "kuron": _3, "littlestar": _3, "lolipopmc": _3, "lolitapunk": _3, "lomo": _3, "lovepop": _3, "lovesick": _3, "main": _3, "mods": _3, "mond": _3, "mongolian": _3, "moo": _3, "namaste": _3, "nikita": _3, "nobushi": _3, "noor": _3, "oops": _3, "parallel": _3, "parasite": _3, "pecori": _3, "peewee": _3, "penne": _3, "pepper": _3, "perma": _3, "pigboat": _3, "pinoko": _3, "punyu": _3, "pupu": _3, "pussycat": _3, "pya": _3, "raindrop": _3, "readymade": _3, "sadist": _3, "schoolbus": _3, "secret": _3, "staba": _3, "stripper": _3, "sub": _3, "sunnyday": _3, "thick": _3, "tonkotsu": _3, "under": _3, "upper": _3, "velvet": _3, "verse": _3, "versus": _3, "vivian": _3, "watson": _3, "weblike": _3, "whitesnow": _3, "zombie": _3, "blogspot": _3, "2-d": _3, "bona": _3, "crap": _3, "daynight": _3, "eek": _3, "flop": _3, "halfmoon": _3, "jeez": _3, "matrix": _3, "mimoza": _3, "netgamers": _3, "nyanta": _3, "o0o0": _3, "rdy": _3, "rgr": _3, "rulez": _3, "sakurastorage": [0, { "isk01": _12, "isk02": _12 }], "saloon": _3, "sblo": _3, "skr": _3, "tank": _3, "uh-oh": _3, "undo": _3, "webaccel": [0, { "rs": _3, "user": _3 }], "websozai": _3, "xii": _3 }], "ke": [1, { "ac": _2, "co": _6, "go": _2, "info": _2, "me": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2 }], "kg": [1, { "org": _2, "net": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "blog": _3, "io": _3, "jp": _3, "tv": _3, "uk": _3, "us": _3 }], "kh": _8, "ki": _33, "km": [1, { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "ass": _2, "com": _2, "coop": _2, "asso": _2, "presse": _2, "medecin": _2, "notaires": _2, "pharmaciens": _2, "veterinaire": _2, "gouv": _2 }], "kn": [1, { "net": _2, "org": _2, "edu": _2, "gov": _2 }], "kp": [1, { "com": _2, "edu": _2, "gov": _2, "org": _2, "rep": _2, "tra": _2 }], "kr": [1, { "ac": _2, "co": _2, "es": _2, "go": _2, "hs": _2, "kg": _2, "mil": _2, "ms": _2, "ne": _2, "or": _2, "pe": _2, "re": _2, "sc": _2, "busan": _2, "chungbuk": _2, "chungnam": _2, "daegu": _2, "daejeon": _2, "gangwon": _2, "gwangju": _2, "gyeongbuk": _2, "gyeonggi": _2, "gyeongnam": _2, "incheon": _2, "jeju": _2, "jeonbuk": _2, "jeonnam": _2, "seoul": _2, "ulsan": _2, "blogspot": _3 }], "kw": [1, { "com": _2, "edu": _2, "emb": _2, "gov": _2, "ind": _2, "net": _2, "org": _2 }], "ky": _25, "kz": [1, { "org": _2, "edu": _2, "net": _2, "gov": _2, "mil": _2, "com": _2, "jcloud": _3, "kazteleport": [0, { "upaas": _3 }] }], "la": [1, { "int": _2, "net": _2, "info": _2, "edu": _2, "gov": _2, "per": _2, "com": _2, "org": _2, "bnr": _3, "c": _3 }], "lb": _4, "lc": [1, { "com": _2, "net": _2, "co": _2, "org": _2, "edu": _2, "gov": _2, "oy": _3 }], "li": [1, { "blogspot": _3, "caa": _3 }], "lk": [1, { "gov": _2, "sch": _2, "net": _2, "int": _2, "com": _2, "org": _2, "edu": _2, "ngo": _2, "soc": _2, "web": _2, "ltd": _2, "assn": _2, "grp": _2, "hotel": _2, "ac": _2 }], "lr": _4, "ls": [1, { "ac": _2, "biz": _2, "co": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "sc": _2, "de": _3 }], "lt": _34, "lu": [1, { "blogspot": _3, "123website": _3 }], "lv": [1, { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "id": _2, "net": _2, "asn": _2, "conf": _2 }], "ly": [1, { "com": _2, "net": _2, "gov": _2, "plc": _2, "edu": _2, "sch": _2, "med": _2, "org": _2, "id": _2 }], "ma": [1, { "co": _2, "net": _2, "gov": _2, "org": _2, "ac": _2, "press": _2 }], "mc": [1, { "tm": _2, "asso": _2 }], "md": [1, { "blogspot": _3, "at": _3, "de": _3, "jp": _3, "to": _3 }], "me": [1, { "co": _2, "net": _2, "org": _2, "edu": _2, "ac": _2, "gov": _2, "its": _2, "priv": _2, "c66": _3, "daplie": [2, { "localhost": _3 }], "edgestack": _3, "filegear": _3, "filegear-au": _3, "filegear-de": _3, "filegear-gb": _3, "filegear-ie": _3, "filegear-jp": _3, "filegear-sg": _3, "glitch": _3, "ravendb": _3, "lohmus": _3, "barsy": _3, "mcpe": _3, "mcdir": _3, "soundcast": _3, "tcp4": _3, "brasilia": _3, "ddns": _3, "dnsfor": _3, "hopto": _3, "loginto": _3, "noip": _3, "webhop": _3, "vp4": _3, "diskstation": _3, "dscloud": _3, "i234": _3, "myds": _3, "synology": _3, "transip": _23, "wedeploy": _3, "yombo": _3, "nohost": _3 }], "mg": [1, { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "com": _2, "co": _2 }], "mh": _2, "mil": _2, "mk": [1, { "com": _2, "org": _2, "net": _2, "edu": _2, "gov": _2, "inf": _2, "name": _2, "blogspot": _3 }], "ml": [1, { "com": _2, "edu": _2, "gouv": _2, "gov": _2, "net": _2, "org": _2, "presse": _2 }], "mm": _8, "mn": [1, { "gov": _2, "edu": _2, "org": _2, "nyc": _3 }], "mo": _4, "mobi": [1, { "barsy": _3, "dscloud": _3 }], "mp": [1, { "ju": _3 }], "mq": _2, "mr": _34, "ms": [1, { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "lab": _3, "minisite": _3 }], "mt": [1, { "com": _6, "edu": _2, "net": _2, "org": _2 }], "mu": [1, { "com": _2, "net": _2, "org": _2, "gov": _2, "ac": _2, "co": _2, "or": _2 }], "museum": _2, "mv": [1, { "aero": _2, "biz": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "museum": _2, "name": _2, "net": _2, "org": _2, "pro": _2 }], "mw": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "int": _2, "museum": _2, "net": _2, "org": _2 }], "mx": [1, { "com": _2, "org": _2, "gob": _2, "edu": _2, "net": _2, "blogspot": _3 }], "my": [1, { "biz": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "blogspot": _3 }], "mz": [1, { "ac": _2, "adv": _2, "co": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], "na": [1, { "info": _2, "pro": _2, "name": _2, "school": _2, "or": _2, "dr": _2, "us": _2, "mx": _2, "ca": _2, "in": _2, "cc": _2, "tv": _2, "ws": _2, "mobi": _2, "co": _2, "com": _2, "org": _2 }], "name": [1, { "her": _37, "his": _37 }], "nc": [1, { "asso": _2, "nom": _2 }], "ne": _2, "net": [1, { "adobeaemcloud": _3, "adobeio-static": _3, "adobeioruntime": _3, "akadns": _3, "akamai": _3, "akamai-staging": _3, "akamaiedge": _3, "akamaiedge-staging": _3, "akamaihd": _3, "akamaihd-staging": _3, "akamaiorigin": _3, "akamaiorigin-staging": _3, "akamaized": _3, "akamaized-staging": _3, "edgekey": _3, "edgekey-staging": _3, "edgesuite": _3, "edgesuite-staging": _3, "alwaysdata": _3, "myamaze": _3, "cloudfront": _3, "t3l3p0rt": _3, "appudo": _3, "atlassian-dev": [0, { "prod": [0, { "cdn": _3 }] }], "myfritz": _3, "onavstack": _3, "shopselect": _3, "blackbaudcdn": _3, "boomla": _3, "bplaced": _3, "square7": _3, "gb": _3, "hu": _3, "jp": _3, "se": _3, "uk": _3, "in": _3, "clickrising": _3, "cloudaccess": _3, "cdn77-ssl": _3, "cdn77": [0, { "r": _3 }], "feste-ip": _3, "knx-server": _3, "static-access": _3, "cryptonomic": _5, "dattolocal": _3, "mydatto": _3, "debian": _3, "bitbridge": _3, "at-band-camp": _3, "blogdns": _3, "broke-it": _3, "buyshouses": _3, "dnsalias": _3, "dnsdojo": _3, "does-it": _3, "dontexist": _3, "dynalias": _3, "dynathome": _3, "endofinternet": _3, "from-az": _3, "from-co": _3, "from-la": _3, "from-ny": _3, "gets-it": _3, "ham-radio-op": _3, "homeftp": _3, "homeip": _3, "homelinux": _3, "homeunix": _3, "in-the-band": _3, "is-a-chef": _3, "is-a-geek": _3, "isa-geek": _3, "kicks-ass": _3, "office-on-the": _3, "podzone": _3, "scrapper-site": _3, "selfip": _3, "sells-it": _3, "servebbs": _3, "serveftp": _3, "thruhere": _3, "webhop": _3, "definima": _3, "casacam": _3, "dynu": _3, "dynv6": _3, "twmail": _3, "ru": _3, "channelsdvr": [2, { "u": _3 }], "fastlylb": [2, { "map": _3 }], "fastly": [0, { "freetls": _3, "map": _3, "prod": [0, { "a": _3, "global": _3 }], "ssl": [0, { "a": _3, "b": _3, "global": _3 }] }], "edgeapp": _3, "flynnhosting": _3, "cdn-edges": _3, "heteml": _3, "cloudfunctions": _3, "moonscale": _3, "in-dsl": _3, "in-vpn": _3, "ipifony": _3, "iobb": _3, "cloudjiffy": [2, { "fra1-de": _3, "west1-us": _3 }], "elastx": [0, { "jls-sto1": _3, "jls-sto2": _3, "jls-sto3": _3 }], "faststacks": _3, "massivegrid": [0, { "paas": [0, { "fr-1": _3, "lon-1": _3, "lon-2": _3, "ny-1": _3, "ny-2": _3, "sg-1": _3 }] }], "saveincloud": [0, { "jelastic": _3, "nordeste-idc": _3 }], "scaleforce": _26, "tsukaeru": _27, "kinghost": _3, "uni5": _3, "krellian": _3, "barsy": _3, "memset": _3, "azurewebsites": _3, "azure-mobile": _3, "cloudapp": _3, "azurestaticapps": [2, { "1": _3, "2": _3, "3": _3, "centralus": _3, "eastasia": _3, "eastus2": _3, "westeurope": _3, "westus2": _3 }], "dnsup": _3, "hicam": _3, "now-dns": _3, "ownip": _3, "vpndns": _3, "eating-organic": _3, "mydissent": _3, "myeffect": _3, "mymediapc": _3, "mypsx": _3, "mysecuritycamera": _3, "nhlfan": _3, "no-ip": _3, "pgafan": _3, "privatizehealthinsurance": _3, "bounceme": _3, "ddns": _3, "redirectme": _3, "serveblog": _3, "serveminecraft": _3, "sytes": _3, "cloudycluster": _3, "ovh": [0, { "webpaas": _5, "hosting": _5 }], "bar0": _3, "bar1": _3, "bar2": _3, "rackmaze": _3, "squares": _3, "schokokeks": _3, "firewall-gateway": _3, "seidat": _3, "senseering": _3, "siteleaf": _3, "vps-host": [2, { "jelastic": [0, { "atl": _3, "njs": _3, "ric": _3 }] }], "myspreadshop": _3, "srcf": [0, { "soc": _3, "user": _3 }], "supabase": _3, "dsmynas": _3, "familyds": _3, "tailscale": [0, { "beta": _3 }], "ts": _3, "torproject": [2, { "pages": _3 }], "reserve-online": _3, "community-pro": _3, "meinforum": _3, "yandexcloud": [2, { "storage": _3, "website": _3 }], "za": _3 }], "nf": [1, { "com": _2, "net": _2, "per": _2, "rec": _2, "web": _2, "arts": _2, "firm": _2, "info": _2, "other": _2, "store": _2 }], "ng": [1, { "com": _6, "edu": _2, "gov": _2, "i": _2, "mil": _2, "mobi": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "col": _3, "firm": _3, "gen": _3, "ltd": _3, "ngo": _3 }], "ni": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gob": _2, "in": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "web": _2 }], "nl": [1, { "co": _3, "hosting-cluster": _3, "blogspot": _3, "gov": _3, "khplay": _3, "123website": _3, "myspreadshop": _3, "transurl": _5, "cistron": _3, "demon": _3 }], "no": [1, { "fhs": _2, "vgs": _2, "fylkesbibl": _2, "folkebibl": _2, "museum": _2, "idrett": _2, "priv": _2, "mil": _2, "stat": _2, "dep": _2, "kommune": _2, "herad": _2, "aa": _38, "ah": _38, "bu": _38, "fm": _38, "hl": _38, "hm": _38, "jan-mayen": _38, "mr": _38, "nl": _38, "nt": _38, "of": _38, "ol": _38, "oslo": _38, "rl": _38, "sf": _38, "st": _38, "svalbard": _38, "tm": _38, "tr": _38, "va": _38, "vf": _38, "akrehamn": _2, "xn--krehamn-dxa": _2, "åkrehamn": _2, "algard": _2, "xn--lgrd-poac": _2, "ålgård": _2, "arna": _2, "brumunddal": _2, "bryne": _2, "bronnoysund": _2, "xn--brnnysund-m8ac": _2, "brønnøysund": _2, "drobak": _2, "xn--drbak-wua": _2, "drøbak": _2, "egersund": _2, "fetsund": _2, "floro": _2, "xn--flor-jra": _2, "florø": _2, "fredrikstad": _2, "hokksund": _2, "honefoss": _2, "xn--hnefoss-q1a": _2, "hønefoss": _2, "jessheim": _2, "jorpeland": _2, "xn--jrpeland-54a": _2, "jørpeland": _2, "kirkenes": _2, "kopervik": _2, "krokstadelva": _2, "langevag": _2, "xn--langevg-jxa": _2, "langevåg": _2, "leirvik": _2, "mjondalen": _2, "xn--mjndalen-64a": _2, "mjøndalen": _2, "mo-i-rana": _2, "mosjoen": _2, "xn--mosjen-eya": _2, "mosjøen": _2, "nesoddtangen": _2, "orkanger": _2, "osoyro": _2, "xn--osyro-wua": _2, "osøyro": _2, "raholt": _2, "xn--rholt-mra": _2, "råholt": _2, "sandnessjoen": _2, "xn--sandnessjen-ogb": _2, "sandnessjøen": _2, "skedsmokorset": _2, "slattum": _2, "spjelkavik": _2, "stathelle": _2, "stavern": _2, "stjordalshalsen": _2, "xn--stjrdalshalsen-sqb": _2, "stjørdalshalsen": _2, "tananger": _2, "tranby": _2, "vossevangen": _2, "afjord": _2, "xn--fjord-lra": _2, "åfjord": _2, "agdenes": _2, "al": _2, "xn--l-1fa": _2, "ål": _2, "alesund": _2, "xn--lesund-hua": _2, "ålesund": _2, "alstahaug": _2, "alta": _2, "xn--lt-liac": _2, "áltá": _2, "alaheadju": _2, "xn--laheadju-7ya": _2, "álaheadju": _2, "alvdal": _2, "amli": _2, "xn--mli-tla": _2, "åmli": _2, "amot": _2, "xn--mot-tla": _2, "åmot": _2, "andebu": _2, "andoy": _2, "xn--andy-ira": _2, "andøy": _2, "andasuolo": _2, "ardal": _2, "xn--rdal-poa": _2, "årdal": _2, "aremark": _2, "arendal": _2, "xn--s-1fa": _2, "ås": _2, "aseral": _2, "xn--seral-lra": _2, "åseral": _2, "asker": _2, "askim": _2, "askvoll": _2, "askoy": _2, "xn--asky-ira": _2, "askøy": _2, "asnes": _2, "xn--snes-poa": _2, "åsnes": _2, "audnedaln": _2, "aukra": _2, "aure": _2, "aurland": _2, "aurskog-holand": _2, "xn--aurskog-hland-jnb": _2, "aurskog-høland": _2, "austevoll": _2, "austrheim": _2, "averoy": _2, "xn--avery-yua": _2, "averøy": _2, "balestrand": _2, "ballangen": _2, "balat": _2, "xn--blt-elab": _2, "bálát": _2, "balsfjord": _2, "bahccavuotna": _2, "xn--bhccavuotna-k7a": _2, "báhccavuotna": _2, "bamble": _2, "bardu": _2, "beardu": _2, "beiarn": _2, "bajddar": _2, "xn--bjddar-pta": _2, "bájddar": _2, "baidar": _2, "xn--bidr-5nac": _2, "báidár": _2, "berg": _2, "bergen": _2, "berlevag": _2, "xn--berlevg-jxa": _2, "berlevåg": _2, "bearalvahki": _2, "xn--bearalvhki-y4a": _2, "bearalváhki": _2, "bindal": _2, "birkenes": _2, "bjarkoy": _2, "xn--bjarky-fya": _2, "bjarkøy": _2, "bjerkreim": _2, "bjugn": _2, "bodo": _2, "xn--bod-2na": _2, "bodø": _2, "badaddja": _2, "xn--bdddj-mrabd": _2, "bådåddjå": _2, "budejju": _2, "bokn": _2, "bremanger": _2, "bronnoy": _2, "xn--brnny-wuac": _2, "brønnøy": _2, "bygland": _2, "bykle": _2, "barum": _2, "xn--brum-voa": _2, "bærum": _2, "telemark": [0, { "bo": _2, "xn--b-5ga": _2, "bø": _2 }], "nordland": [0, { "bo": _2, "xn--b-5ga": _2, "bø": _2, "heroy": _2, "xn--hery-ira": _2, "herøy": _2 }], "bievat": _2, "xn--bievt-0qa": _2, "bievát": _2, "bomlo": _2, "xn--bmlo-gra": _2, "bømlo": _2, "batsfjord": _2, "xn--btsfjord-9za": _2, "båtsfjord": _2, "bahcavuotna": _2, "xn--bhcavuotna-s4a": _2, "báhcavuotna": _2, "dovre": _2, "drammen": _2, "drangedal": _2, "dyroy": _2, "xn--dyry-ira": _2, "dyrøy": _2, "donna": _2, "xn--dnna-gra": _2, "dønna": _2, "eid": _2, "eidfjord": _2, "eidsberg": _2, "eidskog": _2, "eidsvoll": _2, "eigersund": _2, "elverum": _2, "enebakk": _2, "engerdal": _2, "etne": _2, "etnedal": _2, "evenes": _2, "evenassi": _2, "xn--eveni-0qa01ga": _2, "evenášši": _2, "evje-og-hornnes": _2, "farsund": _2, "fauske": _2, "fuossko": _2, "fuoisku": _2, "fedje": _2, "fet": _2, "finnoy": _2, "xn--finny-yua": _2, "finnøy": _2, "fitjar": _2, "fjaler": _2, "fjell": _2, "flakstad": _2, "flatanger": _2, "flekkefjord": _2, "flesberg": _2, "flora": _2, "fla": _2, "xn--fl-zia": _2, "flå": _2, "folldal": _2, "forsand": _2, "fosnes": _2, "frei": _2, "frogn": _2, "froland": _2, "frosta": _2, "frana": _2, "xn--frna-woa": _2, "fræna": _2, "froya": _2, "xn--frya-hra": _2, "frøya": _2, "fusa": _2, "fyresdal": _2, "forde": _2, "xn--frde-gra": _2, "førde": _2, "gamvik": _2, "gangaviika": _2, "xn--ggaviika-8ya47h": _2, "gáŋgaviika": _2, "gaular": _2, "gausdal": _2, "gildeskal": _2, "xn--gildeskl-g0a": _2, "gildeskål": _2, "giske": _2, "gjemnes": _2, "gjerdrum": _2, "gjerstad": _2, "gjesdal": _2, "gjovik": _2, "xn--gjvik-wua": _2, "gjøvik": _2, "gloppen": _2, "gol": _2, "gran": _2, "grane": _2, "granvin": _2, "gratangen": _2, "grimstad": _2, "grong": _2, "kraanghke": _2, "xn--kranghke-b0a": _2, "kråanghke": _2, "grue": _2, "gulen": _2, "hadsel": _2, "halden": _2, "halsa": _2, "hamar": _2, "hamaroy": _2, "habmer": _2, "xn--hbmer-xqa": _2, "hábmer": _2, "hapmir": _2, "xn--hpmir-xqa": _2, "hápmir": _2, "hammerfest": _2, "hammarfeasta": _2, "xn--hmmrfeasta-s4ac": _2, "hámmárfeasta": _2, "haram": _2, "hareid": _2, "harstad": _2, "hasvik": _2, "aknoluokta": _2, "xn--koluokta-7ya57h": _2, "ákŋoluokta": _2, "hattfjelldal": _2, "aarborte": _2, "haugesund": _2, "hemne": _2, "hemnes": _2, "hemsedal": _2, "more-og-romsdal": [0, { "heroy": _2, "sande": _2 }], "xn--mre-og-romsdal-qqb": [0, { "xn--hery-ira": _2, "sande": _2 }], "møre-og-romsdal": [0, { "herøy": _2, "sande": _2 }], "hitra": _2, "hjartdal": _2, "hjelmeland": _2, "hobol": _2, "xn--hobl-ira": _2, "hobøl": _2, "hof": _2, "hol": _2, "hole": _2, "holmestrand": _2, "holtalen": _2, "xn--holtlen-hxa": _2, "holtålen": _2, "hornindal": _2, "horten": _2, "hurdal": _2, "hurum": _2, "hvaler": _2, "hyllestad": _2, "hagebostad": _2, "xn--hgebostad-g3a": _2, "hægebostad": _2, "hoyanger": _2, "xn--hyanger-q1a": _2, "høyanger": _2, "hoylandet": _2, "xn--hylandet-54a": _2, "høylandet": _2, "ha": _2, "xn--h-2fa": _2, "hå": _2, "ibestad": _2, "inderoy": _2, "xn--indery-fya": _2, "inderøy": _2, "iveland": _2, "jevnaker": _2, "jondal": _2, "jolster": _2, "xn--jlster-bya": _2, "jølster": _2, "karasjok": _2, "karasjohka": _2, "xn--krjohka-hwab49j": _2, "kárášjohka": _2, "karlsoy": _2, "galsa": _2, "xn--gls-elac": _2, "gálsá": _2, "karmoy": _2, "xn--karmy-yua": _2, "karmøy": _2, "kautokeino": _2, "guovdageaidnu": _2, "klepp": _2, "klabu": _2, "xn--klbu-woa": _2, "klæbu": _2, "kongsberg": _2, "kongsvinger": _2, "kragero": _2, "xn--krager-gya": _2, "kragerø": _2, "kristiansand": _2, "kristiansund": _2, "krodsherad": _2, "xn--krdsherad-m8a": _2, "krødsherad": _2, "kvalsund": _2, "rahkkeravju": _2, "xn--rhkkervju-01af": _2, "ráhkkerávju": _2, "kvam": _2, "kvinesdal": _2, "kvinnherad": _2, "kviteseid": _2, "kvitsoy": _2, "xn--kvitsy-fya": _2, "kvitsøy": _2, "kvafjord": _2, "xn--kvfjord-nxa": _2, "kvæfjord": _2, "giehtavuoatna": _2, "kvanangen": _2, "xn--kvnangen-k0a": _2, "kvænangen": _2, "navuotna": _2, "xn--nvuotna-hwa": _2, "návuotna": _2, "kafjord": _2, "xn--kfjord-iua": _2, "kåfjord": _2, "gaivuotna": _2, "xn--givuotna-8ya": _2, "gáivuotna": _2, "larvik": _2, "lavangen": _2, "lavagis": _2, "loabat": _2, "xn--loabt-0qa": _2, "loabát": _2, "lebesby": _2, "davvesiida": _2, "leikanger": _2, "leirfjord": _2, "leka": _2, "leksvik": _2, "lenvik": _2, "leangaviika": _2, "xn--leagaviika-52b": _2, "leaŋgaviika": _2, "lesja": _2, "levanger": _2, "lier": _2, "lierne": _2, "lillehammer": _2, "lillesand": _2, "lindesnes": _2, "lindas": _2, "xn--linds-pra": _2, "lindås": _2, "lom": _2, "loppa": _2, "lahppi": _2, "xn--lhppi-xqa": _2, "láhppi": _2, "lund": _2, "lunner": _2, "luroy": _2, "xn--lury-ira": _2, "lurøy": _2, "luster": _2, "lyngdal": _2, "lyngen": _2, "ivgu": _2, "lardal": _2, "lerdal": _2, "xn--lrdal-sra": _2, "lærdal": _2, "lodingen": _2, "xn--ldingen-q1a": _2, "lødingen": _2, "lorenskog": _2, "xn--lrenskog-54a": _2, "lørenskog": _2, "loten": _2, "xn--lten-gra": _2, "løten": _2, "malvik": _2, "masoy": _2, "xn--msy-ula0h": _2, "måsøy": _2, "muosat": _2, "xn--muost-0qa": _2, "muosát": _2, "mandal": _2, "marker": _2, "marnardal": _2, "masfjorden": _2, "meland": _2, "meldal": _2, "melhus": _2, "meloy": _2, "xn--mely-ira": _2, "meløy": _2, "meraker": _2, "xn--merker-kua": _2, "meråker": _2, "moareke": _2, "xn--moreke-jua": _2, "moåreke": _2, "midsund": _2, "midtre-gauldal": _2, "modalen": _2, "modum": _2, "molde": _2, "moskenes": _2, "moss": _2, "mosvik": _2, "malselv": _2, "xn--mlselv-iua": _2, "målselv": _2, "malatvuopmi": _2, "xn--mlatvuopmi-s4a": _2, "málatvuopmi": _2, "namdalseid": _2, "aejrie": _2, "namsos": _2, "namsskogan": _2, "naamesjevuemie": _2, "xn--nmesjevuemie-tcba": _2, "nååmesjevuemie": _2, "laakesvuemie": _2, "nannestad": _2, "narvik": _2, "narviika": _2, "naustdal": _2, "nedre-eiker": _2, "akershus": _39, "buskerud": _39, "nesna": _2, "nesodden": _2, "nesseby": _2, "unjarga": _2, "xn--unjrga-rta": _2, "unjárga": _2, "nesset": _2, "nissedal": _2, "nittedal": _2, "nord-aurdal": _2, "nord-fron": _2, "nord-odal": _2, "norddal": _2, "nordkapp": _2, "davvenjarga": _2, "xn--davvenjrga-y4a": _2, "davvenjárga": _2, "nordre-land": _2, "nordreisa": _2, "raisa": _2, "xn--risa-5na": _2, "ráisa": _2, "nore-og-uvdal": _2, "notodden": _2, "naroy": _2, "xn--nry-yla5g": _2, "nærøy": _2, "notteroy": _2, "xn--nttery-byae": _2, "nøtterøy": _2, "odda": _2, "oksnes": _2, "xn--ksnes-uua": _2, "øksnes": _2, "oppdal": _2, "oppegard": _2, "xn--oppegrd-ixa": _2, "oppegård": _2, "orkdal": _2, "orland": _2, "xn--rland-uua": _2, "ørland": _2, "orskog": _2, "xn--rskog-uua": _2, "ørskog": _2, "orsta": _2, "xn--rsta-fra": _2, "ørsta": _2, "hedmark": [0, { "os": _2, "valer": _2, "xn--vler-qoa": _2, "våler": _2 }], "hordaland": [0, { "os": _2 }], "osen": _2, "osteroy": _2, "xn--ostery-fya": _2, "osterøy": _2, "ostre-toten": _2, "xn--stre-toten-zcb": _2, "østre-toten": _2, "overhalla": _2, "ovre-eiker": _2, "xn--vre-eiker-k8a": _2, "øvre-eiker": _2, "oyer": _2, "xn--yer-zna": _2, "øyer": _2, "oygarden": _2, "xn--ygarden-p1a": _2, "øygarden": _2, "oystre-slidre": _2, "xn--ystre-slidre-ujb": _2, "øystre-slidre": _2, "porsanger": _2, "porsangu": _2, "xn--porsgu-sta26f": _2, "porsáŋgu": _2, "porsgrunn": _2, "radoy": _2, "xn--rady-ira": _2, "radøy": _2, "rakkestad": _2, "rana": _2, "ruovat": _2, "randaberg": _2, "rauma": _2, "rendalen": _2, "rennebu": _2, "rennesoy": _2, "xn--rennesy-v1a": _2, "rennesøy": _2, "rindal": _2, "ringebu": _2, "ringerike": _2, "ringsaker": _2, "rissa": _2, "risor": _2, "xn--risr-ira": _2, "risør": _2, "roan": _2, "rollag": _2, "rygge": _2, "ralingen": _2, "xn--rlingen-mxa": _2, "rælingen": _2, "rodoy": _2, "xn--rdy-0nab": _2, "rødøy": _2, "romskog": _2, "xn--rmskog-bya": _2, "rømskog": _2, "roros": _2, "xn--rros-gra": _2, "røros": _2, "rost": _2, "xn--rst-0na": _2, "røst": _2, "royken": _2, "xn--ryken-vua": _2, "røyken": _2, "royrvik": _2, "xn--ryrvik-bya": _2, "røyrvik": _2, "rade": _2, "xn--rde-ula": _2, "råde": _2, "salangen": _2, "siellak": _2, "saltdal": _2, "salat": _2, "xn--slt-elab": _2, "sálát": _2, "xn--slat-5na": _2, "sálat": _2, "samnanger": _2, "vestfold": [0, { "sande": _2 }], "sandefjord": _2, "sandnes": _2, "sandoy": _2, "xn--sandy-yua": _2, "sandøy": _2, "sarpsborg": _2, "sauda": _2, "sauherad": _2, "sel": _2, "selbu": _2, "selje": _2, "seljord": _2, "sigdal": _2, "siljan": _2, "sirdal": _2, "skaun": _2, "skedsmo": _2, "ski": _2, "skien": _2, "skiptvet": _2, "skjervoy": _2, "xn--skjervy-v1a": _2, "skjervøy": _2, "skierva": _2, "xn--skierv-uta": _2, "skiervá": _2, "skjak": _2, "xn--skjk-soa": _2, "skjåk": _2, "skodje": _2, "skanland": _2, "xn--sknland-fxa": _2, "skånland": _2, "skanit": _2, "xn--sknit-yqa": _2, "skánit": _2, "smola": _2, "xn--smla-hra": _2, "smøla": _2, "snillfjord": _2, "snasa": _2, "xn--snsa-roa": _2, "snåsa": _2, "snoasa": _2, "snaase": _2, "xn--snase-nra": _2, "snåase": _2, "sogndal": _2, "sokndal": _2, "sola": _2, "solund": _2, "songdalen": _2, "sortland": _2, "spydeberg": _2, "stange": _2, "stavanger": _2, "steigen": _2, "steinkjer": _2, "stjordal": _2, "xn--stjrdal-s1a": _2, "stjørdal": _2, "stokke": _2, "stor-elvdal": _2, "stord": _2, "stordal": _2, "storfjord": _2, "omasvuotna": _2, "strand": _2, "stranda": _2, "stryn": _2, "sula": _2, "suldal": _2, "sund": _2, "sunndal": _2, "surnadal": _2, "sveio": _2, "svelvik": _2, "sykkylven": _2, "sogne": _2, "xn--sgne-gra": _2, "søgne": _2, "somna": _2, "xn--smna-gra": _2, "sømna": _2, "sondre-land": _2, "xn--sndre-land-0cb": _2, "søndre-land": _2, "sor-aurdal": _2, "xn--sr-aurdal-l8a": _2, "sør-aurdal": _2, "sor-fron": _2, "xn--sr-fron-q1a": _2, "sør-fron": _2, "sor-odal": _2, "xn--sr-odal-q1a": _2, "sør-odal": _2, "sor-varanger": _2, "xn--sr-varanger-ggb": _2, "sør-varanger": _2, "matta-varjjat": _2, "xn--mtta-vrjjat-k7af": _2, "mátta-várjjat": _2, "sorfold": _2, "xn--srfold-bya": _2, "sørfold": _2, "sorreisa": _2, "xn--srreisa-q1a": _2, "sørreisa": _2, "sorum": _2, "xn--srum-gra": _2, "sørum": _2, "tana": _2, "deatnu": _2, "time": _2, "tingvoll": _2, "tinn": _2, "tjeldsund": _2, "dielddanuorri": _2, "tjome": _2, "xn--tjme-hra": _2, "tjøme": _2, "tokke": _2, "tolga": _2, "torsken": _2, "tranoy": _2, "xn--trany-yua": _2, "tranøy": _2, "tromso": _2, "xn--troms-zua": _2, "tromsø": _2, "tromsa": _2, "romsa": _2, "trondheim": _2, "troandin": _2, "trysil": _2, "trana": _2, "xn--trna-woa": _2, "træna": _2, "trogstad": _2, "xn--trgstad-r1a": _2, "trøgstad": _2, "tvedestrand": _2, "tydal": _2, "tynset": _2, "tysfjord": _2, "divtasvuodna": _2, "divttasvuotna": _2, "tysnes": _2, "tysvar": _2, "xn--tysvr-vra": _2, "tysvær": _2, "tonsberg": _2, "xn--tnsberg-q1a": _2, "tønsberg": _2, "ullensaker": _2, "ullensvang": _2, "ulvik": _2, "utsira": _2, "vadso": _2, "xn--vads-jra": _2, "vadsø": _2, "cahcesuolo": _2, "xn--hcesuolo-7ya35b": _2, "čáhcesuolo": _2, "vaksdal": _2, "valle": _2, "vang": _2, "vanylven": _2, "vardo": _2, "xn--vard-jra": _2, "vardø": _2, "varggat": _2, "xn--vrggt-xqad": _2, "várggát": _2, "vefsn": _2, "vaapste": _2, "vega": _2, "vegarshei": _2, "xn--vegrshei-c0a": _2, "vegårshei": _2, "vennesla": _2, "verdal": _2, "verran": _2, "vestby": _2, "vestnes": _2, "vestre-slidre": _2, "vestre-toten": _2, "vestvagoy": _2, "xn--vestvgy-ixa6o": _2, "vestvågøy": _2, "vevelstad": _2, "vik": _2, "vikna": _2, "vindafjord": _2, "volda": _2, "voss": _2, "varoy": _2, "xn--vry-yla5g": _2, "værøy": _2, "vagan": _2, "xn--vgan-qoa": _2, "vågan": _2, "voagat": _2, "vagsoy": _2, "xn--vgsy-qoa0j": _2, "vågsøy": _2, "vaga": _2, "xn--vg-yiab": _2, "vågå": _2, "ostfold": [0, { "valer": _2 }], "xn--stfold-9xa": [0, { "xn--vler-qoa": _2 }], "østfold": [0, { "våler": _2 }], "co": _3, "blogspot": _3, "123hjemmeside": _3, "myspreadshop": _3 }], "np": _8, "nr": _33, "nu": [1, { "merseine": _3, "mine": _3, "shacknet": _3, "enterprisecloud": _3 }], "nz": [1, { "ac": _2, "co": _6, "cri": _2, "geek": _2, "gen": _2, "govt": _2, "health": _2, "iwi": _2, "kiwi": _2, "maori": _2, "mil": _2, "xn--mori-qsa": _2, "māori": _2, "net": _2, "org": _2, "parliament": _2, "school": _2 }], "om": [1, { "co": _2, "com": _2, "edu": _2, "gov": _2, "med": _2, "museum": _2, "net": _2, "org": _2, "pro": _2 }], "onion": _2, "org": [1, { "altervista": _3, "amune": [0, { "tele": _3 }], "pimienta": _3, "poivron": _3, "potager": _3, "sweetpepper": _3, "ae": _3, "us": _3, "certmgr": _3, "cdn77": [0, { "c": _3, "rsc": _3 }], "cdn77-secure": [0, { "origin": [0, { "ssl": _3 }] }], "cloudns": _3, "duckdns": _3, "tunk": _3, "dyndns": [2, { "go": _3, "home": _3 }], "blogdns": _3, "blogsite": _3, "boldlygoingnowhere": _3, "dnsalias": _3, "dnsdojo": _3, "doesntexist": _3, "dontexist": _3, "doomdns": _3, "dvrdns": _3, "dynalias": _3, "endofinternet": _3, "endoftheinternet": _3, "from-me": _3, "game-host": _3, "gotdns": _3, "hobby-site": _3, "homedns": _3, "homeftp": _3, "homelinux": _3, "homeunix": _3, "is-a-bruinsfan": _3, "is-a-candidate": _3, "is-a-celticsfan": _3, "is-a-chef": _3, "is-a-geek": _3, "is-a-knight": _3, "is-a-linux-user": _3, "is-a-patsfan": _3, "is-a-soxfan": _3, "is-found": _3, "is-lost": _3, "is-saved": _3, "is-very-bad": _3, "is-very-evil": _3, "is-very-good": _3, "is-very-nice": _3, "is-very-sweet": _3, "isa-geek": _3, "kicks-ass": _3, "misconfused": _3, "podzone": _3, "readmyblog": _3, "selfip": _3, "sellsyourhome": _3, "servebbs": _3, "serveftp": _3, "servegame": _3, "stuff-4-sale": _3, "webhop": _3, "ddnss": _3, "accesscam": _3, "camdvr": _3, "freeddns": _3, "mywire": _3, "webredirect": _3, "eu": [2, { "al": _3, "asso": _3, "at": _3, "au": _3, "be": _3, "bg": _3, "ca": _3, "cd": _3, "ch": _3, "cn": _3, "cy": _3, "cz": _3, "de": _3, "dk": _3, "edu": _3, "ee": _3, "es": _3, "fi": _3, "fr": _3, "gr": _3, "hr": _3, "hu": _3, "ie": _3, "il": _3, "in": _3, "int": _3, "is": _3, "it": _3, "jp": _3, "kr": _3, "lt": _3, "lu": _3, "lv": _3, "mc": _3, "me": _3, "mk": _3, "mt": _3, "my": _3, "net": _3, "ng": _3, "nl": _3, "no": _3, "nz": _3, "paris": _3, "pl": _3, "pt": _3, "q-a": _3, "ro": _3, "ru": _3, "se": _3, "si": _3, "sk": _3, "tr": _3, "uk": _3, "us": _3 }], "twmail": _3, "fedorainfracloud": _3, "fedorapeople": _3, "fedoraproject": [0, { "cloud": _3, "os": _21, "stg": [0, { "os": _21 }] }], "freedesktop": _3, "hepforge": _3, "in-dsl": _3, "in-vpn": _3, "js": _3, "barsy": _3, "mayfirst": _3, "mozilla-iot": _3, "bmoattachments": _3, "dynserv": _3, "now-dns": _3, "cable-modem": _3, "collegefan": _3, "couchpotatofries": _3, "mlbfan": _3, "mysecuritycamera": _3, "nflfan": _3, "read-books": _3, "ufcfan": _3, "hopto": _3, "myftp": _3, "no-ip": _3, "zapto": _3, "httpbin": _3, "pubtls": _3, "jpn": _3, "my-firewall": _3, "myfirewall": _3, "spdns": _3, "small-web": _3, "dsmynas": _3, "familyds": _3, "teckids": _12, "tuxfamily": _3, "diskstation": _3, "hk": _3, "wmflabs": _3, "toolforge": _3, "wmcloud": _3, "za": _3 }], "pa": [1, { "ac": _2, "gob": _2, "com": _2, "org": _2, "sld": _2, "edu": _2, "net": _2, "ing": _2, "abo": _2, "med": _2, "nom": _2 }], "pe": [1, { "edu": _2, "gob": _2, "nom": _2, "mil": _2, "org": _2, "com": _2, "net": _2, "blogspot": _3 }], "pf": [1, { "com": _2, "org": _2, "edu": _2 }], "pg": _8, "ph": [1, { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "ngo": _2, "mil": _2, "i": _2 }], "pk": [1, { "com": _2, "net": _2, "edu": _2, "org": _2, "fam": _2, "biz": _2, "web": _2, "gov": _2, "gob": _2, "gok": _2, "gon": _2, "gop": _2, "gos": _2, "info": _2 }], "pl": [1, { "com": _2, "net": _2, "org": _2, "aid": _2, "agro": _2, "atm": _2, "auto": _2, "biz": _2, "edu": _2, "gmina": _2, "gsm": _2, "info": _2, "mail": _2, "miasta": _2, "media": _2, "mil": _2, "nieruchomosci": _2, "nom": _2, "pc": _2, "powiat": _2, "priv": _2, "realestate": _2, "rel": _2, "sex": _2, "shop": _2, "sklep": _2, "sos": _2, "szkola": _2, "targi": _2, "tm": _2, "tourism": _2, "travel": _2, "turystyka": _2, "gov": [1, { "ap": _2, "griw": _2, "ic": _2, "is": _2, "kmpsp": _2, "konsulat": _2, "kppsp": _2, "kwp": _2, "kwpsp": _2, "mup": _2, "mw": _2, "oia": _2, "oirm": _2, "oke": _2, "oow": _2, "oschr": _2, "oum": _2, "pa": _2, "pinb": _2, "piw": _2, "po": _2, "pr": _2, "psp": _2, "psse": _2, "pup": _2, "rzgw": _2, "sa": _2, "sdn": _2, "sko": _2, "so": _2, "sr": _2, "starostwo": _2, "ug": _2, "ugim": _2, "um": _2, "umig": _2, "upow": _2, "uppo": _2, "us": _2, "uw": _2, "uzs": _2, "wif": _2, "wiih": _2, "winb": _2, "wios": _2, "witd": _2, "wiw": _2, "wkz": _2, "wsa": _2, "wskr": _2, "wsse": _2, "wuoz": _2, "wzmiuw": _2, "zp": _2, "zpisdn": _2 }], "augustow": _2, "babia-gora": _2, "bedzin": _2, "beskidy": _2, "bialowieza": _2, "bialystok": _2, "bielawa": _2, "bieszczady": _2, "boleslawiec": _2, "bydgoszcz": _2, "bytom": _2, "cieszyn": _2, "czeladz": _2, "czest": _2, "dlugoleka": _2, "elblag": _2, "elk": _2, "glogow": _2, "gniezno": _2, "gorlice": _2, "grajewo": _2, "ilawa": _2, "jaworzno": _2, "jelenia-gora": _2, "jgora": _2, "kalisz": _2, "kazimierz-dolny": _2, "karpacz": _2, "kartuzy": _2, "kaszuby": _2, "katowice": _2, "kepno": _2, "ketrzyn": _2, "klodzko": _2, "kobierzyce": _2, "kolobrzeg": _2, "konin": _2, "konskowola": _2, "kutno": _2, "lapy": _2, "lebork": _2, "legnica": _2, "lezajsk": _2, "limanowa": _2, "lomza": _2, "lowicz": _2, "lubin": _2, "lukow": _2, "malbork": _2, "malopolska": _2, "mazowsze": _2, "mazury": _2, "mielec": _2, "mielno": _2, "mragowo": _2, "naklo": _2, "nowaruda": _2, "nysa": _2, "olawa": _2, "olecko": _2, "olkusz": _2, "olsztyn": _2, "opoczno": _2, "opole": _2, "ostroda": _2, "ostroleka": _2, "ostrowiec": _2, "ostrowwlkp": _2, "pila": _2, "pisz": _2, "podhale": _2, "podlasie": _2, "polkowice": _2, "pomorze": _2, "pomorskie": _2, "prochowice": _2, "pruszkow": _2, "przeworsk": _2, "pulawy": _2, "radom": _2, "rawa-maz": _2, "rybnik": _2, "rzeszow": _2, "sanok": _2, "sejny": _2, "slask": _2, "slupsk": _2, "sosnowiec": _2, "stalowa-wola": _2, "skoczow": _2, "starachowice": _2, "stargard": _2, "suwalki": _2, "swidnica": _2, "swiebodzin": _2, "swinoujscie": _2, "szczecin": _2, "szczytno": _2, "tarnobrzeg": _2, "tgory": _2, "turek": _2, "tychy": _2, "ustka": _2, "walbrzych": _2, "warmia": _2, "warszawa": _2, "waw": _2, "wegrow": _2, "wielun": _2, "wlocl": _2, "wloclawek": _2, "wodzislaw": _2, "wolomin": _2, "wroclaw": _2, "zachpomor": _2, "zagan": _2, "zarow": _2, "zgora": _2, "zgorzelec": _2, "beep": _3, "ecommerce-shop": _3, "shoparena": _3, "homesklep": _3, "sdscloud": _3, "unicloud": _3, "krasnik": _3, "leczna": _3, "lubartow": _3, "lublin": _3, "poniatowa": _3, "swidnik": _3, "co": _3, "simplesite": _3, "art": _3, "gliwice": _3, "krakow": _3, "poznan": _3, "wroc": _3, "zakopane": _3, "myspreadshop": _3, "gda": _3, "gdansk": _3, "gdynia": _3, "med": _3, "sopot": _3 }], "pm": [1, { "own": _3, "name": _3 }], "pn": [1, { "gov": _2, "co": _2, "org": _2, "edu": _2, "net": _2 }], "post": _2, "pr": [1, { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "isla": _2, "pro": _2, "biz": _2, "info": _2, "name": _2, "est": _2, "prof": _2, "ac": _2 }], "pro": [1, { "aaa": _2, "aca": _2, "acct": _2, "avocat": _2, "bar": _2, "cpa": _2, "eng": _2, "jur": _2, "law": _2, "med": _2, "recht": _2, "cloudns": _3, "dnstrace": [0, { "bci": _3 }], "barsy": _3 }], "ps": [1, { "edu": _2, "gov": _2, "sec": _2, "plo": _2, "com": _2, "org": _2, "net": _2 }], "pt": [1, { "net": _2, "gov": _2, "org": _2, "edu": _2, "int": _2, "publ": _2, "com": _2, "nome": _2, "blogspot": _3, "123paginaweb": _3 }], "pw": [1, { "co": _2, "ne": _2, "or": _2, "ed": _2, "go": _2, "belau": _2, "cloudns": _3, "x443": _3 }], "py": [1, { "com": _2, "coop": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], "qa": [1, { "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "blogspot": _3 }], "re": [1, { "asso": _2, "com": _2, "nom": _2, "blogspot": _3 }], "ro": [1, { "arts": _2, "com": _2, "firm": _2, "info": _2, "nom": _2, "nt": _2, "org": _2, "rec": _2, "store": _2, "tm": _2, "www": _2, "co": _3, "shop": _3, "blogspot": _3, "barsy": _3 }], "rs": [1, { "ac": _2, "co": _2, "edu": _2, "gov": _2, "in": _2, "org": _2, "brendly": [0, { "shop": _3 }], "blogspot": _3, "ua": _3, "ox": _3 }], "ru": [1, { "ac": _3, "edu": _3, "gov": _3, "int": _3, "mil": _3, "test": _3, "eurodir": _3, "adygeya": _3, "bashkiria": _3, "bir": _3, "cbg": _3, "com": _3, "dagestan": _3, "grozny": _3, "kalmykia": _3, "kustanai": _3, "marine": _3, "mordovia": _3, "msk": _3, "mytis": _3, "nalchik": _3, "nov": _3, "pyatigorsk": _3, "spb": _3, "vladikavkaz": _3, "vladimir": _3, "blogspot": _3, "na4u": _3, "mircloud": _3, "regruhosting": _27, "myjino": [2, { "hosting": _5, "landing": _5, "spectrum": _5, "vps": _5 }], "cldmail": [0, { "hb": _3 }], "mcdir": [2, { "vps": _3 }], "mcpre": _3, "net": _3, "org": _3, "pp": _3, "123sait": _3, "lk3": _3, "ras": _3 }], "rw": [1, { "ac": _2, "co": _2, "coop": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 }], "sa": [1, { "com": _2, "net": _2, "org": _2, "gov": _2, "med": _2, "pub": _2, "edu": _2, "sch": _2 }], "sb": _4, "sc": _4, "sd": [1, { "com": _2, "net": _2, "org": _2, "edu": _2, "med": _2, "tv": _2, "gov": _2, "info": _2 }], "se": [1, { "a": _2, "ac": _2, "b": _2, "bd": _2, "brand": _2, "c": _2, "d": _2, "e": _2, "f": _2, "fh": _2, "fhsk": _2, "fhv": _2, "g": _2, "h": _2, "i": _2, "k": _2, "komforb": _2, "kommunalforbund": _2, "komvux": _2, "l": _2, "lanbib": _2, "m": _2, "n": _2, "naturbruksgymn": _2, "o": _2, "org": _2, "p": _2, "parti": _2, "pp": _2, "press": _2, "r": _2, "s": _2, "t": _2, "tm": _2, "u": _2, "w": _2, "x": _2, "y": _2, "z": _2, "com": _3, "blogspot": _3, "conf": _3, "iopsys": _3, "123minsida": _3, "itcouldbewor": _3, "myspreadshop": _3, "paba": [0, { "su": _3 }] }], "sg": [1, { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "per": _2, "blogspot": _3, "enscaled": _3 }], "sh": [1, { "com": _2, "net": _2, "gov": _2, "org": _2, "mil": _2, "bip": _3, "hashbang": _3, "platform": [0, { "bc": _3, "ent": _3, "eu": _3, "us": _3 }], "now": _3, "vxl": _3, "wedeploy": _3 }], "si": [1, { "gitapp": _3, "gitpage": _3, "blogspot": _3 }], "sj": _2, "sk": _6, "sl": _4, "sm": _2, "sn": [1, { "art": _2, "com": _2, "edu": _2, "gouv": _2, "org": _2, "perso": _2, "univ": _2, "blogspot": _3 }], "so": [1, { "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "sch": _3 }], "sr": _2, "ss": [1, { "biz": _2, "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "sch": _2 }], "st": [1, { "co": _2, "com": _2, "consulado": _2, "edu": _2, "embaixada": _2, "mil": _2, "net": _2, "org": _2, "principe": _2, "saotome": _2, "store": _2, "kirara": _3, "noho": _3 }], "su": [1, { "abkhazia": _3, "adygeya": _3, "aktyubinsk": _3, "arkhangelsk": _3, "armenia": _3, "ashgabad": _3, "azerbaijan": _3, "balashov": _3, "bashkiria": _3, "bryansk": _3, "bukhara": _3, "chimkent": _3, "dagestan": _3, "east-kazakhstan": _3, "exnet": _3, "georgia": _3, "grozny": _3, "ivanovo": _3, "jambyl": _3, "kalmykia": _3, "kaluga": _3, "karacol": _3, "karaganda": _3, "karelia": _3, "khakassia": _3, "krasnodar": _3, "kurgan": _3, "kustanai": _3, "lenug": _3, "mangyshlak": _3, "mordovia": _3, "msk": _3, "murmansk": _3, "nalchik": _3, "navoi": _3, "north-kazakhstan": _3, "nov": _3, "obninsk": _3, "penza": _3, "pokrovsk": _3, "sochi": _3, "spb": _3, "tashkent": _3, "termez": _3, "togliatti": _3, "troitsk": _3, "tselinograd": _3, "tula": _3, "tuva": _3, "vladikavkaz": _3, "vladimir": _3, "vologda": _3 }], "sv": [1, { "com": _2, "edu": _2, "gob": _2, "org": _2, "red": _2 }], "sx": _7, "sy": _32, "sz": [1, { "co": _2, "ac": _2, "org": _2 }], "tc": [1, { "ch": _3, "me": _3, "we": _3 }], "td": _6, "tel": _2, "tf": [1, { "sch": _3 }], "tg": _2, "th": [1, { "ac": _2, "co": _2, "go": _2, "in": _2, "mi": _2, "net": _2, "or": _2, "online": _3, "shop": _3 }], "tj": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "go": _2, "gov": _2, "int": _2, "mil": _2, "name": _2, "net": _2, "nic": _2, "org": _2, "test": _2, "web": _2 }], "tk": _2, "tl": _7, "tm": [1, { "com": _2, "co": _2, "org": _2, "net": _2, "nom": _2, "gov": _2, "mil": _2, "edu": _2 }], "tn": [1, { "com": _2, "ens": _2, "fin": _2, "gov": _2, "ind": _2, "info": _2, "intl": _2, "mincom": _2, "nat": _2, "net": _2, "org": _2, "perso": _2, "tourism": _2, "orangecloud": _3 }], "to": [1, { "611": _3, "com": _2, "gov": _2, "net": _2, "org": _2, "edu": _2, "mil": _2, "oya": _3, "rdv": _3, "x0": _3, "vpnplus": _3, "quickconnect": _13, "nyan": _3 }], "tr": [1, { "av": _2, "bbs": _2, "bel": _2, "biz": _2, "com": _6, "dr": _2, "edu": _2, "gen": _2, "gov": _2, "info": _2, "mil": _2, "k12": _2, "kep": _2, "name": _2, "net": _2, "org": _2, "pol": _2, "tel": _2, "tsk": _2, "tv": _2, "web": _2, "nc": _7 }], "tt": [1, { "co": _2, "com": _2, "org": _2, "net": _2, "biz": _2, "info": _2, "pro": _2, "int": _2, "coop": _2, "jobs": _2, "mobi": _2, "travel": _2, "museum": _2, "aero": _2, "name": _2, "gov": _2, "edu": _2 }], "tv": [1, { "dyndns": _3, "better-than": _3, "on-the-web": _3, "worse-than": _3, "from": _3, "sakura": _3 }], "tw": [1, { "edu": _2, "gov": _2, "mil": _2, "com": [1, { "mymailer": _3 }], "net": _2, "org": _2, "idv": _2, "game": _2, "ebiz": _2, "club": _2, "xn--zf0ao64a": _2, "網路": _2, "xn--uc0atv": _2, "組織": _2, "xn--czrw28b": _2, "商業": _2, "url": _3, "blogspot": _3 }], "tz": [1, { "ac": _2, "co": _2, "go": _2, "hotel": _2, "info": _2, "me": _2, "mil": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2, "tv": _2 }], "ua": [1, { "com": _2, "edu": _2, "gov": _2, "in": _2, "net": _2, "org": _2, "cherkassy": _2, "cherkasy": _2, "chernigov": _2, "chernihiv": _2, "chernivtsi": _2, "chernovtsy": _2, "ck": _2, "cn": _2, "cr": _2, "crimea": _2, "cv": _2, "dn": _2, "dnepropetrovsk": _2, "dnipropetrovsk": _2, "donetsk": _2, "dp": _2, "if": _2, "ivano-frankivsk": _2, "kh": _2, "kharkiv": _2, "kharkov": _2, "kherson": _2, "khmelnitskiy": _2, "khmelnytskyi": _2, "kiev": _2, "kirovograd": _2, "km": _2, "kr": _2, "kropyvnytskyi": _2, "krym": _2, "ks": _2, "kv": _2, "kyiv": _2, "lg": _2, "lt": _2, "lugansk": _2, "lutsk": _2, "lv": _2, "lviv": _2, "mk": _2, "mykolaiv": _2, "nikolaev": _2, "od": _2, "odesa": _2, "odessa": _2, "pl": _2, "poltava": _2, "rivne": _2, "rovno": _2, "rv": _2, "sb": _2, "sebastopol": _2, "sevastopol": _2, "sm": _2, "sumy": _2, "te": _2, "ternopil": _2, "uz": _2, "uzhgorod": _2, "vinnica": _2, "vinnytsia": _2, "vn": _2, "volyn": _2, "yalta": _2, "zaporizhzhe": _2, "zaporizhzhia": _2, "zhitomir": _2, "zhytomyr": _2, "zp": _2, "zt": _2, "cc": _3, "inf": _3, "ltd": _3, "cx": _3, "ie": _3, "biz": _3, "co": _3, "pp": _3, "v": _3 }], "ug": [1, { "co": _2, "or": _2, "ac": _2, "sc": _2, "go": _2, "ne": _2, "com": _2, "org": _2, "blogspot": _3 }], "uk": [1, { "ac": _2, "co": [1, { "bytemark": [0, { "dh": _3, "vm": _3 }], "blogspot": _3, "layershift": _26, "barsy": _3, "barsyonline": _3, "retrosnub": _31, "nh-serv": _3, "no-ip": _3, "wellbeingzone": _3, "adimo": _3, "myspreadshop": _3 }], "gov": [1, { "campaign": _3, "service": _3, "api": _3, "homeoffice": _3 }], "ltd": _2, "me": _2, "net": _2, "nhs": _2, "org": [1, { "glug": _3, "lug": _3, "lugs": _3, "affinitylottery": _3, "raffleentry": _3, "weeklylottery": _3 }], "plc": _2, "police": _2, "sch": _8, "conn": _3, "copro": _3, "hosp": _3, "independent-commission": _3, "independent-inquest": _3, "independent-inquiry": _3, "independent-panel": _3, "independent-review": _3, "public-inquiry": _3, "royal-commission": _3, "pymnt": _3, "barsy": _3 }], "us": [1, { "dni": _2, "fed": _2, "isa": _2, "kids": _2, "nsn": _2, "ak": _40, "al": _40, "ar": _40, "as": _40, "az": _40, "ca": _40, "co": _40, "ct": _40, "dc": _40, "de": [1, { "k12": _2, "cc": _2, "lib": _3 }], "fl": _40, "ga": _40, "gu": _40, "hi": _41, "ia": _40, "id": _40, "il": _40, "in": _40, "ks": _40, "ky": _40, "la": _40, "ma": [1, { "k12": [1, { "pvt": _2, "chtr": _2, "paroch": _2 }], "cc": _2, "lib": _2 }], "md": _40, "me": _40, "mi": [1, { "k12": _2, "cc": _2, "lib": _2, "ann-arbor": _2, "cog": _2, "dst": _2, "eaton": _2, "gen": _2, "mus": _2, "tec": _2, "washtenaw": _2 }], "mn": _40, "mo": _40, "ms": _40, "mt": _40, "nc": _40, "nd": _41, "ne": _40, "nh": _40, "nj": _40, "nm": _40, "nv": _40, "ny": _40, "oh": _40, "ok": _40, "or": _40, "pa": _40, "pr": _40, "ri": _41, "sc": _40, "sd": _41, "tn": _40, "tx": _40, "ut": _40, "vi": _40, "vt": _40, "va": _40, "wa": _40, "wi": _40, "wv": [1, { "cc": _2 }], "wy": _40, "graphox": _3, "cloudns": _3, "drud": _3, "is-by": _3, "land-4-sale": _3, "stuff-4-sale": _3, "enscaled": [0, { "phx": _3 }], "mircloud": _3, "freeddns": _3, "golffan": _3, "noip": _3, "pointto": _3, "platterp": _3 }], "uy": [1, { "com": _6, "edu": _2, "gub": _2, "mil": _2, "net": _2, "org": _2 }], "uz": [1, { "co": _2, "com": _2, "net": _2, "org": _2 }], "va": _2, "vc": [1, { "com": _2, "net": _2, "org": _2, "gov": _2, "mil": _2, "edu": _2, "gv": [2, { "d": _3 }], "0e": _3 }], "ve": [1, { "arts": _2, "bib": _2, "co": _2, "com": _2, "e12": _2, "edu": _2, "firm": _2, "gob": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "rar": _2, "rec": _2, "store": _2, "tec": _2, "web": _2 }], "vg": [1, { "at": _3 }], "vi": [1, { "co": _2, "com": _2, "k12": _2, "net": _2, "org": _2 }], "vn": [1, { "ac": _2, "ai": _2, "biz": _2, "com": _2, "edu": _2, "gov": _2, "health": _2, "id": _2, "info": _2, "int": _2, "io": _2, "name": _2, "net": _2, "org": _2, "pro": _2, "angiang": _2, "bacgiang": _2, "backan": _2, "baclieu": _2, "bacninh": _2, "baria-vungtau": _2, "bentre": _2, "binhdinh": _2, "binhduong": _2, "binhphuoc": _2, "binhthuan": _2, "camau": _2, "cantho": _2, "caobang": _2, "daklak": _2, "daknong": _2, "danang": _2, "dienbien": _2, "dongnai": _2, "dongthap": _2, "gialai": _2, "hagiang": _2, "haiduong": _2, "haiphong": _2, "hanam": _2, "hanoi": _2, "hatinh": _2, "haugiang": _2, "hoabinh": _2, "hungyen": _2, "khanhhoa": _2, "kiengiang": _2, "kontum": _2, "laichau": _2, "lamdong": _2, "langson": _2, "laocai": _2, "longan": _2, "namdinh": _2, "nghean": _2, "ninhbinh": _2, "ninhthuan": _2, "phutho": _2, "phuyen": _2, "quangbinh": _2, "quangnam": _2, "quangngai": _2, "quangninh": _2, "quangtri": _2, "soctrang": _2, "sonla": _2, "tayninh": _2, "thaibinh": _2, "thainguyen": _2, "thanhhoa": _2, "thanhphohochiminh": _2, "thuathienhue": _2, "tiengiang": _2, "travinh": _2, "tuyenquang": _2, "vinhlong": _2, "vinhphuc": _2, "yenbai": _2, "blogspot": _3 }], "vu": [1, { "com": _2, "edu": _2, "net": _2, "org": _2, "cn": _3, "blog": _3, "dev": _3, "me": _3 }], "wf": [1, { "biz": _3, "sch": _3 }], "ws": [1, { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "advisor": _5, "cloud66": _3, "dyndns": _3, "mypets": _3 }], "yt": [1, { "org": _3 }], "xn--mgbaam7a8h": _2, "امارات": _2, "xn--y9a3aq": _2, "հայ": _2, "xn--54b7fta0cc": _2, "বাংলা": _2, "xn--90ae": _2, "бг": _2, "xn--mgbcpq6gpa1a": _2, "البحرين": _2, "xn--90ais": _2, "бел": _2, "xn--fiqs8s": _2, "中国": _2, "xn--fiqz9s": _2, "中國": _2, "xn--lgbbat1ad8j": _2, "الجزائر": _2, "xn--wgbh1c": _2, "مصر": _2, "xn--e1a4c": _2, "ею": _2, "xn--qxa6a": _2, "ευ": _2, "xn--mgbah1a3hjkrd": _2, "موريتانيا": _2, "xn--node": _2, "გე": _2, "xn--qxam": _2, "ελ": _2, "xn--j6w193g": [1, { "xn--55qx5d": _2, "xn--wcvs22d": _2, "xn--mxtq1m": _2, "xn--gmqw5a": _2, "xn--od0alg": _2, "xn--uc0atv": _2 }], "香港": [1, { "公司": _2, "教育": _2, "政府": _2, "個人": _2, "網絡": _2, "組織": _2 }], "xn--2scrj9c": _2, "ಭಾರತ": _2, "xn--3hcrj9c": _2, "ଭାରତ": _2, "xn--45br5cyl": _2, "ভাৰত": _2, "xn--h2breg3eve": _2, "भारतम्": _2, "xn--h2brj9c8c": _2, "भारोत": _2, "xn--mgbgu82a": _2, "ڀارت": _2, "xn--rvc1e0am3e": _2, "ഭാരതം": _2, "xn--h2brj9c": _2, "भारत": _2, "xn--mgbbh1a": _2, "بارت": _2, "xn--mgbbh1a71e": _2, "بھارت": _2, "xn--fpcrj9c3d": _2, "భారత్": _2, "xn--gecrj9c": _2, "ભારત": _2, "xn--s9brj9c": _2, "ਭਾਰਤ": _2, "xn--45brj9c": _2, "ভারত": _2, "xn--xkc2dl3a5ee0h": _2, "இந்தியா": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2, "xn--mgbtx2b": _2, "عراق": _2, "xn--mgbayh7gpa": _2, "الاردن": _2, "xn--3e0b707e": _2, "한국": _2, "xn--80ao21a": _2, "қаз": _2, "xn--q7ce6a": _2, "ລາວ": _2, "xn--fzc2c9e2c": _2, "ලංකා": _2, "xn--xkc2al3hye2a": _2, "இலங்கை": _2, "xn--mgbc0a9azcg": _2, "المغرب": _2, "xn--d1alf": _2, "мкд": _2, "xn--l1acc": _2, "мон": _2, "xn--mix891f": _2, "澳門": _2, "xn--mix082f": _2, "澳门": _2, "xn--mgbx4cd0ab": _2, "مليسيا": _2, "xn--mgb9awbf": _2, "عمان": _2, "xn--mgbai9azgqp6j": _2, "پاکستان": _2, "xn--mgbai9a5eva00b": _2, "پاكستان": _2, "xn--ygbi2ammx": _2, "فلسطين": _2, "xn--90a3ac": [1, { "xn--o1ac": _2, "xn--c1avg": _2, "xn--90azh": _2, "xn--d1at": _2, "xn--o1ach": _2, "xn--80au": _2 }], "срб": [1, { "пр": _2, "орг": _2, "обр": _2, "од": _2, "упр": _2, "ак": _2 }], "xn--p1ai": _2, "рф": _2, "xn--wgbl6a": _2, "قطر": _2, "xn--mgberp4a5d4ar": _2, "السعودية": _2, "xn--mgberp4a5d4a87g": _2, "السعودیة": _2, "xn--mgbqly7c0a67fbc": _2, "السعودیۃ": _2, "xn--mgbqly7cvafr": _2, "السعوديه": _2, "xn--mgbpl2fh": _2, "سودان": _2, "xn--yfro4i67o": _2, "新加坡": _2, "xn--clchc0ea0b2g2a9gcd": _2, "சிங்கப்பூர்": _2, "xn--ogbpf8fl": _2, "سورية": _2, "xn--mgbtf8fl": _2, "سوريا": _2, "xn--o3cw4h": [1, { "xn--12c1fe0br": _2, "xn--12co0c3b4eva": _2, "xn--h3cuzk1di": _2, "xn--o3cyx2a": _2, "xn--m3ch0j3a": _2, "xn--12cfi8ixb8l": _2 }], "ไทย": [1, { "ศึกษา": _2, "ธุรกิจ": _2, "รัฐบาล": _2, "ทหาร": _2, "เน็ต": _2, "องค์กร": _2 }], "xn--pgbs0dh": _2, "تونس": _2, "xn--kpry57d": _2, "台灣": _2, "xn--kprw13d": _2, "台湾": _2, "xn--nnx388a": _2, "臺灣": _2, "xn--j1amh": _2, "укр": _2, "xn--mgb2ddes": _2, "اليمن": _2, "xxx": _2, "ye": _32, "za": [0, { "ac": _2, "agric": _2, "alt": _2, "co": _6, "edu": _2, "gov": _2, "grondar": _2, "law": _2, "mil": _2, "net": _2, "ngo": _2, "nic": _2, "nis": _2, "nom": _2, "org": _2, "school": _2, "tm": _2, "web": _2 }], "zm": [1, { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "mil": _2, "net": _2, "org": _2, "sch": _2 }], "zw": [1, { "ac": _2, "co": _2, "gov": _2, "mil": _2, "org": _2 }], "aaa": _2, "aarp": _2, "abb": _2, "abbott": _2, "abbvie": _2, "abc": _2, "able": _2, "abogado": _2, "abudhabi": _2, "academy": [1, { "official": _3 }], "accenture": _2, "accountant": _2, "accountants": _2, "aco": _2, "actor": _2, "ads": _2, "adult": _2, "aeg": _2, "aetna": _2, "afl": _2, "africa": _2, "agakhan": _2, "agency": _2, "aig": _2, "airbus": _2, "airforce": _2, "airtel": _2, "akdn": _2, "alibaba": _2, "alipay": _2, "allfinanz": _2, "allstate": _2, "ally": _2, "alsace": _2, "alstom": _2, "amazon": _2, "americanexpress": _2, "americanfamily": _2, "amex": _2, "amfam": _2, "amica": _2, "amsterdam": _2, "analytics": _2, "android": _2, "anquan": _2, "anz": _2, "aol": _2, "apartments": _2, "app": [1, { "beget": _5, "clerk": _3, "clerkstage": _3, "wnext": _3, "platform0": _3, "deta": _3, "ondigitalocean": _3, "easypanel": _3, "encr": _3, "edgecompute": _3, "fireweb": _3, "onflashdrive": _3, "framer": _3, "run": [2, { "a": _3 }], "web": _3, "hasura": _3, "loginline": _3, "messerli": _3, "netlify": _3, "ngrok": _3, "ngrok-free": _3, "developer": _5, "noop": _3, "northflank": _5, "snowflake": [2, { "privatelink": _3 }], "streamlit": _3, "telebit": _3, "typedream": _3, "vercel": _3, "bookonline": _3 }], "apple": _2, "aquarelle": _2, "arab": _2, "aramco": _2, "archi": _2, "army": _2, "art": _2, "arte": _2, "asda": _2, "associates": _2, "athleta": _2, "attorney": _2, "auction": _2, "audi": _2, "audible": _2, "audio": _2, "auspost": _2, "author": _2, "auto": _2, "autos": _2, "avianca": _2, "aws": _2, "axa": _2, "azure": _2, "baby": _2, "baidu": _2, "banamex": _2, "bananarepublic": _2, "band": _2, "bank": _2, "bar": _2, "barcelona": _2, "barclaycard": _2, "barclays": _2, "barefoot": _2, "bargains": _2, "baseball": _2, "basketball": [1, { "aus": _3, "nz": _3 }], "bauhaus": _2, "bayern": _2, "bbc": _2, "bbt": _2, "bbva": _2, "bcg": _2, "bcn": _2, "beats": _2, "beauty": _2, "beer": _2, "bentley": _2, "berlin": _2, "best": _2, "bestbuy": _2, "bet": _2, "bharti": _2, "bible": _2, "bid": _2, "bike": _2, "bing": _2, "bingo": _2, "bio": _2, "black": _2, "blackfriday": _2, "blockbuster": _2, "blog": _2, "bloomberg": _2, "blue": _2, "bms": _2, "bmw": _2, "bnpparibas": _2, "boats": _2, "boehringer": _2, "bofa": _2, "bom": _2, "bond": _2, "boo": _2, "book": _2, "booking": _2, "bosch": _2, "bostik": _2, "boston": _2, "bot": _2, "boutique": _2, "box": _2, "bradesco": _2, "bridgestone": _2, "broadway": _2, "broker": _2, "brother": _2, "brussels": _2, "build": _2, "builders": [1, { "cloudsite": _3 }], "business": _10, "buy": _2, "buzz": _2, "bzh": _2, "cab": _2, "cafe": _2, "cal": _2, "call": _2, "calvinklein": _2, "cam": _2, "camera": _2, "camp": _2, "canon": _2, "capetown": _2, "capital": _2, "capitalone": _2, "car": _2, "caravan": _2, "cards": _2, "care": _2, "career": _2, "careers": _2, "cars": _2, "casa": [1, { "nabu": [0, { "ui": _3 }] }], "case": _2, "cash": _2, "casino": _2, "catering": _2, "catholic": _2, "cba": _2, "cbn": _2, "cbre": _2, "cbs": _2, "center": _2, "ceo": _2, "cern": _2, "cfa": _2, "cfd": _2, "chanel": _2, "channel": _2, "charity": _2, "chase": _2, "chat": _2, "cheap": _2, "chintai": _2, "christmas": _2, "chrome": _2, "church": _2, "cipriani": _2, "circle": _2, "cisco": _2, "citadel": _2, "citi": _2, "citic": _2, "city": _2, "cityeats": _2, "claims": _2, "cleaning": _2, "click": _2, "clinic": _2, "clinique": _2, "clothing": _2, "cloud": [1, { "banzai": _5, "elementor": _3, "encoway": [0, { "eu": _3 }], "statics": _5, "ravendb": _3, "axarnet": [0, { "es-1": _3 }], "diadem": _3, "jelastic": [0, { "vip": _3 }], "jele": _3, "jenv-aruba": [0, { "aruba": [0, { "eur": [0, { "it1": _3 }] }], "it1": _3 }], "keliweb": [2, { "cs": _3 }], "oxa": [2, { "tn": _3, "uk": _3 }], "primetel": [2, { "uk": _3 }], "reclaim": [0, { "ca": _3, "uk": _3, "us": _3 }], "trendhosting": [0, { "ch": _3, "de": _3 }], "jotelulu": _3, "kuleuven": _3, "linkyard": _3, "magentosite": _5, "perspecta": _3, "vapor": _3, "on-rancher": _5, "scw": [0, { "baremetal": [0, { "fr-par-1": _3, "fr-par-2": _3, "nl-ams-1": _3 }], "fr-par": [0, { "fnc": [2, { "functions": _3 }], "k8s": _11, "s3": _3, "s3-website": _3, "whm": _3 }], "instances": [0, { "priv": _3, "pub": _3 }], "k8s": _3, "nl-ams": [0, { "k8s": _11, "s3": _3, "s3-website": _3, "whm": _3 }], "pl-waw": [0, { "k8s": _11, "s3": _3, "s3-website": _3 }], "scalebook": _3, "smartlabeling": _3 }], "sensiosite": _5, "trafficplex": _3, "urown": _3, "voorloper": _3 }], "club": [1, { "cloudns": _3, "jele": _3, "barsy": _3 }], "clubmed": _2, "coach": _2, "codes": [1, { "owo": _5 }], "coffee": _2, "college": _2, "cologne": _2, "comcast": _2, "commbank": _2, "community": [1, { "nog": _3, "ravendb": _3, "myforum": _3 }], "company": _2, "compare": _2, "computer": _2, "comsec": _2, "condos": _2, "construction": _2, "consulting": _2, "contact": _2, "contractors": _2, "cooking": _2, "cool": [1, { "elementor": _3, "de": _3 }], "corsica": _2, "country": _2, "coupon": _2, "coupons": _2, "courses": _2, "cpa": _2, "credit": _2, "creditcard": _2, "creditunion": _2, "cricket": _2, "crown": _2, "crs": _2, "cruise": _2, "cruises": _2, "cuisinella": _2, "cymru": _2, "cyou": _2, "dabur": _2, "dad": _2, "dance": _2, "data": _2, "date": _2, "dating": _2, "datsun": _2, "day": _2, "dclk": _2, "dds": _2, "deal": _2, "dealer": _2, "deals": _2, "degree": _2, "delivery": _2, "dell": _2, "deloitte": _2, "delta": _2, "democrat": _2, "dental": _2, "dentist": _2, "desi": _2, "design": [1, { "bss": _3 }], "dev": [1, { "autocode": _3, "lcl": _5, "lclstage": _5, "stg": _5, "stgstage": _5, "pages": _3, "r2": _3, "workers": _3, "curv": _3, "deno": _3, "deno-staging": _3, "deta": _3, "fly": _3, "githubpreview": _3, "gateway": _5, "iserv": _3, "localcert": [0, { "user": _5 }], "loginline": _3, "mediatech": _3, "ngrok": _3, "ngrok-free": _3, "platter-app": _3, "shiftcrypto": _3, "vercel": _3, "webhare": _5 }], "dhl": _2, "diamonds": _2, "diet": _2, "digital": [1, { "cloudapps": [2, { "london": _3 }] }], "direct": _2, "directory": _2, "discount": _2, "discover": _2, "dish": _2, "diy": _2, "dnp": _2, "docs": _2, "doctor": _2, "dog": _2, "domains": _2, "dot": _2, "download": _2, "drive": _2, "dtv": _2, "dubai": _2, "dunlop": _2, "dupont": _2, "durban": _2, "dvag": _2, "dvr": _2, "earth": [1, { "dapps": [0, { "*": _3, "bzz": _5 }] }], "eat": _2, "eco": _2, "edeka": _2, "education": _10, "email": _2, "emerck": _2, "energy": _2, "engineer": _2, "engineering": _2, "enterprises": _2, "epson": _2, "equipment": _2, "ericsson": _2, "erni": _2, "esq": _2, "estate": [1, { "compute": _5 }], "etisalat": _2, "eurovision": _2, "eus": [1, { "party": _28 }], "events": [1, { "koobin": _3, "co": _3 }], "exchange": _2, "expert": _2, "exposed": _2, "express": _2, "extraspace": _2, "fage": _2, "fail": _2, "fairwinds": _2, "faith": _29, "family": _2, "fan": _2, "fans": _2, "farm": [1, { "storj": _3 }], "farmers": _2, "fashion": _2, "fast": _2, "fedex": _2, "feedback": _2, "ferrari": _2, "ferrero": _2, "fidelity": _2, "fido": _2, "film": _2, "final": _2, "finance": _2, "financial": _10, "fire": _2, "firestone": _2, "firmdale": _2, "fish": _2, "fishing": _2, "fit": _2, "fitness": _2, "flickr": _2, "flights": _2, "flir": _2, "florist": _2, "flowers": _2, "fly": _2, "foo": _2, "food": _2, "football": _2, "ford": _2, "forex": _2, "forsale": _2, "forum": _2, "foundation": _2, "fox": _2, "free": _2, "fresenius": _2, "frl": _2, "frogans": _2, "frontdoor": _2, "frontier": _2, "ftr": _2, "fujitsu": _2, "fun": _2, "fund": _2, "furniture": _2, "futbol": _2, "fyi": _2, "gal": _2, "gallery": _2, "gallo": _2, "gallup": _2, "game": _2, "games": _2, "gap": _2, "garden": _2, "gay": _2, "gbiz": _2, "gdn": [1, { "cnpy": _3 }], "gea": _2, "gent": _2, "genting": _2, "george": _2, "ggee": _2, "gift": _2, "gifts": _2, "gives": _2, "giving": _2, "glass": _2, "gle": _2, "global": _2, "globo": _2, "gmail": _2, "gmbh": _2, "gmo": _2, "gmx": _2, "godaddy": _2, "gold": _2, "goldpoint": _2, "golf": _2, "goo": _2, "goodyear": _2, "goog": [1, { "cloud": _3, "translate": _3, "usercontent": _5 }], "google": _2, "gop": _2, "got": _2, "grainger": _2, "graphics": _2, "gratis": _2, "green": _2, "gripe": _2, "grocery": _2, "group": [1, { "discourse": _3 }], "guardian": _2, "gucci": _2, "guge": _2, "guide": _2, "guitars": _2, "guru": _2, "hair": _2, "hamburg": _2, "hangout": _2, "haus": _2, "hbo": _2, "hdfc": _2, "hdfcbank": _2, "health": [1, { "hra": _3 }], "healthcare": _2, "help": _2, "helsinki": _2, "here": _2, "hermes": _2, "hiphop": _2, "hisamitsu": _2, "hitachi": _2, "hiv": _2, "hkt": _2, "hockey": _2, "holdings": _2, "holiday": _2, "homedepot": _2, "homegoods": _2, "homes": _2, "homesense": _2, "honda": _2, "horse": _2, "hospital": _2, "host": [1, { "cloudaccess": _3, "freesite": _3, "easypanel": _3, "fastvps": _3, "myfast": _3, "tempurl": _3, "wpmudev": _3, "jele": _3, "mircloud": _3, "pcloud": _3, "half": _3 }], "hosting": [1, { "opencraft": _3 }], "hot": _2, "hoteles": _2, "hotels": _2, "hotmail": _2, "house": _2, "how": _2, "hsbc": _2, "hughes": _2, "hyatt": _2, "hyundai": _2, "ibm": _2, "icbc": _2, "ice": _2, "icu": _2, "ieee": _2, "ifm": _2, "ikano": _2, "imamat": _2, "imdb": _2, "immo": _2, "immobilien": _2, "inc": _2, "industries": _2, "infiniti": _2, "ing": _2, "ink": _2, "institute": _2, "insurance": _2, "insure": _2, "international": _2, "intuit": _2, "investments": _2, "ipiranga": _2, "irish": _2, "ismaili": _2, "ist": _2, "istanbul": _2, "itau": _2, "itv": _2, "jaguar": _2, "java": _2, "jcb": _2, "jeep": _2, "jetzt": _2, "jewelry": _2, "jio": _2, "jll": _2, "jmp": _2, "jnj": _2, "joburg": _2, "jot": _2, "joy": _2, "jpmorgan": _2, "jprs": _2, "juegos": _2, "juniper": _2, "kaufen": _2, "kddi": _2, "kerryhotels": _2, "kerrylogistics": _2, "kerryproperties": _2, "kfh": _2, "kia": _2, "kids": _2, "kim": _2, "kinder": _2, "kindle": _2, "kitchen": _2, "kiwi": _2, "koeln": _2, "komatsu": _2, "kosher": _2, "kpmg": _2, "kpn": _2, "krd": [1, { "co": _3, "edu": _3 }], "kred": _2, "kuokgroup": _2, "kyoto": _2, "lacaixa": _2, "lamborghini": _2, "lamer": _2, "lancaster": _2, "land": [1, { "static": [2, { "dev": _3, "sites": _3 }] }], "landrover": _2, "lanxess": _2, "lasalle": _2, "lat": _2, "latino": _2, "latrobe": _2, "law": _2, "lawyer": _2, "lds": _2, "lease": _2, "leclerc": _2, "lefrak": _2, "legal": _2, "lego": _2, "lexus": _2, "lgbt": _2, "lidl": _2, "life": _2, "lifeinsurance": _2, "lifestyle": _2, "lighting": _2, "like": _2, "lilly": _2, "limited": _2, "limo": _2, "lincoln": _2, "link": [1, { "cyon": _3, "mypep": _3, "dweb": _5 }], "lipsy": _2, "live": [1, { "hlx": _3 }], "living": _2, "llc": _2, "llp": _2, "loan": _2, "loans": _2, "locker": _2, "locus": _2, "lol": [1, { "omg": _3 }], "london": _2, "lotte": _2, "lotto": _2, "love": _2, "lpl": _2, "lplfinancial": _2, "ltd": _2, "ltda": _2, "lundbeck": _2, "luxe": _2, "luxury": _2, "madrid": _2, "maif": _2, "maison": _2, "makeup": _2, "man": _2, "management": [1, { "router": _3 }], "mango": _2, "map": _2, "market": _2, "marketing": _2, "markets": _2, "marriott": _2, "marshalls": _2, "mattel": _2, "mba": _2, "mckinsey": _2, "med": _2, "media": _35, "meet": _2, "melbourne": _2, "meme": _2, "memorial": _2, "men": _2, "menu": _36, "merckmsd": _2, "miami": _2, "microsoft": _2, "mini": _2, "mint": _2, "mit": _2, "mitsubishi": _2, "mlb": _2, "mls": _2, "mma": _2, "mobile": _2, "moda": _2, "moe": _2, "moi": _2, "mom": _2, "monash": _2, "money": _2, "monster": _2, "mormon": _2, "mortgage": _2, "moscow": _2, "moto": _2, "motorcycles": _2, "mov": _2, "movie": _2, "msd": _2, "mtn": _2, "mtr": _2, "music": _2, "mutual": _2, "nab": _2, "nagoya": _2, "natura": _2, "navy": _2, "nba": _2, "nec": _2, "netbank": _2, "netflix": _2, "network": [1, { "alces": _5, "co": _3, "arvo": _3, "azimuth": _3, "tlon": _3 }], "neustar": _2, "new": _2, "news": [1, { "noticeable": _3 }], "next": _2, "nextdirect": _2, "nexus": _2, "nfl": _2, "ngo": _2, "nhk": _2, "nico": _2, "nike": _2, "nikon": _2, "ninja": _2, "nissan": _2, "nissay": _2, "nokia": _2, "northwesternmutual": _2, "norton": _2, "now": _2, "nowruz": _2, "nowtv": _2, "nra": _2, "nrw": _2, "ntt": _2, "nyc": _2, "obi": _2, "observer": _2, "office": _2, "okinawa": _2, "olayan": _2, "olayangroup": _2, "oldnavy": _2, "ollo": _2, "omega": _2, "one": [1, { "onred": [2, { "staging": _3 }], "service": _3, "homelink": _3 }], "ong": _2, "onl": _2, "online": [1, { "eero": _3, "eero-stage": _3, "barsy": _3 }], "ooo": _2, "open": _2, "oracle": _2, "orange": [1, { "tech": _3 }], "organic": _2, "origins": _2, "osaka": _2, "otsuka": _2, "ott": _2, "ovh": [1, { "nerdpol": _3 }], "page": [1, { "hlx": _3, "hlx3": _3, "translated": _3, "codeberg": _3, "pdns": _3, "plesk": _3, "prvcy": _3, "rocky": _3, "magnet": _3 }], "panasonic": _2, "paris": _2, "pars": _2, "partners": _2, "parts": _2, "party": _29, "passagens": _2, "pay": _2, "pccw": _2, "pet": _2, "pfizer": _2, "pharmacy": _2, "phd": _2, "philips": _2, "phone": _2, "photo": _2, "photography": _2, "photos": _35, "physio": _2, "pics": _2, "pictet": _2, "pictures": [1, { "1337": _3 }], "pid": _2, "pin": _2, "ping": _2, "pink": _2, "pioneer": _2, "pizza": [1, { "ngrok": _3 }], "place": _10, "play": _2, "playstation": _2, "plumbing": _2, "plus": _2, "pnc": _2, "pohl": _2, "poker": _2, "politie": _2, "porn": [1, { "indie": _3 }], "pramerica": _2, "praxi": _2, "press": _2, "prime": _2, "prod": _2, "productions": _2, "prof": _2, "progressive": _2, "promo": _2, "properties": _2, "property": _2, "protection": _2, "pru": _2, "prudential": _2, "pub": _36, "pwc": _2, "qpon": _2, "quebec": _2, "quest": _2, "racing": _2, "radio": _2, "read": _2, "realestate": _2, "realtor": _2, "realty": _2, "recipes": _2, "red": _2, "redstone": _2, "redumbrella": _2, "rehab": _2, "reise": _2, "reisen": _2, "reit": _2, "reliance": _2, "ren": _2, "rent": _2, "rentals": _2, "repair": _2, "report": _2, "republican": _2, "rest": _2, "restaurant": _2, "review": _29, "reviews": _2, "rexroth": _2, "rich": _2, "richardli": _2, "ricoh": _2, "ril": _2, "rio": _2, "rip": [1, { "clan": _3 }], "rocher": _2, "rocks": [1, { "myddns": _3, "lima-city": _3, "webspace": _3 }], "rodeo": _2, "rogers": _2, "room": _2, "rsvp": _2, "rugby": _2, "ruhr": _2, "run": [1, { "hs": _3, "development": _3, "ravendb": _3, "servers": _3, "build": _5, "code": _5, "database": _5, "migration": _5, "onporter": _3, "repl": _3 }], "rwe": _2, "ryukyu": _2, "saarland": _2, "safe": _2, "safety": _2, "sakura": _2, "sale": _2, "salon": _2, "samsclub": _2, "samsung": _2, "sandvik": _2, "sandvikcoromant": _2, "sanofi": _2, "sap": _2, "sarl": _2, "sas": _2, "save": _2, "saxo": _2, "sbi": _2, "sbs": _2, "sca": _2, "scb": _2, "schaeffler": _2, "schmidt": _2, "scholarships": _2, "school": _2, "schule": _2, "schwarz": _2, "science": _29, "scot": [1, { "edu": _3, "gov": [2, { "service": _3 }] }], "search": _2, "seat": _2, "secure": _2, "security": _2, "seek": _2, "select": _2, "sener": _2, "services": [1, { "loginline": _3 }], "seven": _2, "sew": _2, "sex": _2, "sexy": _2, "sfr": _2, "shangrila": _2, "sharp": _2, "shaw": _2, "shell": _2, "shia": _2, "shiksha": _2, "shoes": _2, "shop": [1, { "base": _3, "hoplix": _3, "barsy": _3 }], "shopping": _2, "shouji": _2, "show": _2, "showtime": _2, "silk": _2, "sina": _2, "singles": _2, "site": [1, { "cloudera": _5, "cyon": _3, "fnwk": _3, "folionetwork": _3, "fastvps": _3, "jele": _3, "lelux": _3, "loginline": _3, "barsy": _3, "mintere": _3, "omniwe": _3, "opensocial": _3, "platformsh": _5, "tst": _5, "byen": _3, "srht": _3, "novecore": _3 }], "ski": _2, "skin": _2, "sky": _2, "skype": _2, "sling": _2, "smart": _2, "smile": _2, "sncf": _2, "soccer": _2, "social": _2, "softbank": _2, "software": _2, "sohu": _2, "solar": _2, "solutions": [1, { "diher": _5 }], "song": _2, "sony": _2, "soy": _2, "spa": _2, "space": [1, { "myfast": _3, "uber": _3, "xs4all": _3 }], "sport": _2, "spot": _2, "srl": _2, "stada": _2, "staples": _2, "star": _2, "statebank": _2, "statefarm": _2, "stc": _2, "stcgroup": _2, "stockholm": _2, "storage": _2, "store": [1, { "sellfy": _3, "shopware": _3, "storebase": _3 }], "stream": _2, "studio": _2, "study": _2, "style": _2, "sucks": _2, "supplies": _2, "supply": _2, "support": _36, "surf": _2, "surgery": _2, "suzuki": _2, "swatch": _2, "swiss": _2, "sydney": _2, "systems": [1, { "knightpoint": _3 }], "tab": _2, "taipei": _2, "talk": _2, "taobao": _2, "target": _2, "tatamotors": _2, "tatar": _2, "tattoo": _2, "tax": _2, "taxi": _2, "tci": _2, "tdk": _2, "team": [1, { "discourse": _3, "jelastic": _3 }], "tech": _2, "technology": _10, "temasek": _2, "tennis": _2, "teva": _2, "thd": _2, "theater": _2, "theatre": _2, "tiaa": _2, "tickets": _2, "tienda": _2, "tiffany": _2, "tips": _2, "tires": _2, "tirol": _2, "tjmaxx": _2, "tjx": _2, "tkmaxx": _2, "tmall": _2, "today": [1, { "prequalifyme": _3 }], "tokyo": _2, "tools": _2, "top": [1, { "now-dns": _3, "ntdll": _3 }], "toray": _2, "toshiba": _2, "total": _2, "tours": _2, "town": _2, "toyota": _2, "toys": _2, "trade": _29, "trading": _2, "training": _2, "travel": _2, "travelers": _2, "travelersinsurance": _2, "trust": _2, "trv": _2, "tube": _2, "tui": _2, "tunes": _2, "tushu": _2, "tvs": _2, "ubank": _2, "ubs": _2, "unicom": _2, "university": _2, "uno": _2, "uol": _2, "ups": _2, "vacations": _2, "vana": _2, "vanguard": _2, "vegas": _2, "ventures": _2, "verisign": _2, "versicherung": _2, "vet": _2, "viajes": _2, "video": _2, "vig": _2, "viking": _2, "villas": _2, "vin": _2, "vip": _2, "virgin": _2, "visa": _2, "vision": _2, "viva": _2, "vivo": _2, "vlaanderen": _2, "vodka": _2, "volkswagen": _2, "volvo": _2, "vote": _2, "voting": _2, "voto": _2, "voyage": _2, "vuelos": _2, "wales": _2, "walmart": _2, "walter": _2, "wang": _2, "wanggou": _2, "watch": _2, "watches": _2, "weather": _2, "weatherchannel": _2, "webcam": _2, "weber": _2, "website": _35, "wedding": _2, "weibo": _2, "weir": _2, "whoswho": _2, "wien": _2, "wiki": _35, "williamhill": _2, "win": _2, "windows": _2, "wine": _2, "winners": _2, "wme": _2, "wolterskluwer": _2, "woodside": _2, "work": _2, "works": _2, "world": _2, "wow": _2, "wtc": _2, "wtf": _2, "xbox": _2, "xerox": _2, "xfinity": _2, "xihuan": _2, "xin": _2, "xn--11b4c3d": _2, "कॉम": _2, "xn--1ck2e1b": _2, "セール": _2, "xn--1qqw23a": _2, "佛山": _2, "xn--30rr7y": _2, "慈善": _2, "xn--3bst00m": _2, "集团": _2, "xn--3ds443g": _2, "在线": _2, "xn--3pxu8k": _2, "点看": _2, "xn--42c2d9a": _2, "คอม": _2, "xn--45q11c": _2, "八卦": _2, "xn--4gbrim": _2, "موقع": _2, "xn--55qw42g": _2, "公益": _2, "xn--55qx5d": _2, "公司": _2, "xn--5su34j936bgsg": _2, "香格里拉": _2, "xn--5tzm5g": _2, "网站": _2, "xn--6frz82g": _2, "移动": _2, "xn--6qq986b3xl": _2, "我爱你": _2, "xn--80adxhks": _2, "москва": _2, "xn--80aqecdr1a": _2, "католик": _2, "xn--80asehdb": _2, "онлайн": _2, "xn--80aswg": _2, "сайт": _2, "xn--8y0a063a": _2, "联通": _2, "xn--9dbq2a": _2, "קום": _2, "xn--9et52u": _2, "时尚": _2, "xn--9krt00a": _2, "微博": _2, "xn--b4w605ferd": _2, "淡马锡": _2, "xn--bck1b9a5dre4c": _2, "ファッション": _2, "xn--c1avg": _2, "орг": _2, "xn--c2br7g": _2, "नेट": _2, "xn--cck2b3b": _2, "ストア": _2, "xn--cckwcxetd": _2, "アマゾン": _2, "xn--cg4bki": _2, "삼성": _2, "xn--czr694b": _2, "商标": _2, "xn--czrs0t": _2, "商店": _2, "xn--czru2d": _2, "商城": _2, "xn--d1acj3b": _2, "дети": _2, "xn--eckvdtc9d": _2, "ポイント": _2, "xn--efvy88h": _2, "新闻": _2, "xn--fct429k": _2, "家電": _2, "xn--fhbei": _2, "كوم": _2, "xn--fiq228c5hs": _2, "中文网": _2, "xn--fiq64b": _2, "中信": _2, "xn--fjq720a": _2, "娱乐": _2, "xn--flw351e": _2, "谷歌": _2, "xn--fzys8d69uvgm": _2, "電訊盈科": _2, "xn--g2xx48c": _2, "购物": _2, "xn--gckr3f0f": _2, "クラウド": _2, "xn--gk3at1e": _2, "通販": _2, "xn--hxt814e": _2, "网店": _2, "xn--i1b6b1a6a2e": _2, "संगठन": _2, "xn--imr513n": _2, "餐厅": _2, "xn--io0a7i": _2, "网络": _2, "xn--j1aef": _2, "ком": _2, "xn--jlq480n2rg": _2, "亚马逊": _2, "xn--jvr189m": _2, "食品": _2, "xn--kcrx77d1x4a": _2, "飞利浦": _2, "xn--kput3i": _2, "手机": _2, "xn--mgba3a3ejt": _2, "ارامكو": _2, "xn--mgba7c0bbn0a": _2, "العليان": _2, "xn--mgbaakc7dvf": _2, "اتصالات": _2, "xn--mgbab2bd": _2, "بازار": _2, "xn--mgbca7dzdo": _2, "ابوظبي": _2, "xn--mgbi4ecexp": _2, "كاثوليك": _2, "xn--mgbt3dhd": _2, "همراه": _2, "xn--mk1bu44c": _2, "닷컴": _2, "xn--mxtq1m": _2, "政府": _2, "xn--ngbc5azd": _2, "شبكة": _2, "xn--ngbe9e0a": _2, "بيتك": _2, "xn--ngbrx": _2, "عرب": _2, "xn--nqv7f": _2, "机构": _2, "xn--nqv7fs00ema": _2, "组织机构": _2, "xn--nyqy26a": _2, "健康": _2, "xn--otu796d": _2, "招聘": _2, "xn--p1acf": [1, { "xn--90amc": _3, "xn--j1aef": _3, "xn--j1ael8b": _3, "xn--h1ahn": _3, "xn--j1adp": _3, "xn--c1avg": _3, "xn--80aaa0cvac": _3, "xn--h1aliz": _3, "xn--90a1af": _3, "xn--41a": _3 }], "рус": [1, { "биз": _3, "ком": _3, "крым": _3, "мир": _3, "мск": _3, "орг": _3, "самара": _3, "сочи": _3, "спб": _3, "я": _3 }], "xn--pssy2u": _2, "大拿": _2, "xn--q9jyb4c": _2, "みんな": _2, "xn--qcka1pmc": _2, "グーグル": _2, "xn--rhqv96g": _2, "世界": _2, "xn--rovu88b": _2, "書籍": _2, "xn--ses554g": _2, "网址": _2, "xn--t60b56a": _2, "닷넷": _2, "xn--tckwe": _2, "コム": _2, "xn--tiq49xqyj": _2, "天主教": _2, "xn--unup4y": _2, "游戏": _2, "xn--vermgensberater-ctb": _2, "vermögensberater": _2, "xn--vermgensberatung-pwb": _2, "vermögensberatung": _2, "xn--vhquv": _2, "企业": _2, "xn--vuq861b": _2, "信息": _2, "xn--w4r85el8fhu5dnra": _2, "嘉里大酒店": _2, "xn--w4rs40l": _2, "嘉里": _2, "xn--xhq521b": _2, "广东": _2, "xn--zfr164b": _2, "政务": _2, "xyz": [1, { "blogsite": _3, "localzone": _3, "crafting": _3, "zapto": _3, "telebit": _5 }], "yachts": _2, "yahoo": _2, "yamaxun": _2, "yandex": _2, "yodobashi": _2, "yoga": _2, "yokohama": _2, "you": _2, "youtube": _2, "yun": _2, "zappos": _2, "zara": _2, "zero": _2, "zip": _2, "zone": [1, { "cloud66": _3, "hs": _3, "triton": _5, "lima": _3 }], "zuerich": _2 }]; + return rules; +})(); +//# sourceMappingURL=trie.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts/dist/es6/src/suffix-trie.js + /** - * Module with miscellaneous syntax utils exposed in API + * Lookup parts of domain in Trie */ -var RuleSyntaxUtils = /** @class */ (function () { - function RuleSyntaxUtils() { - } - /** - * Checks if rule can be matched by domain - * @param ruleText - * @param domain - */ - RuleSyntaxUtils.isRuleForDomain = function (ruleText, domain) { - var rule = RuleFactory.createRule(ruleText, this.DUMMY_FILTER_ID); - if (!rule) { - return false; +function suffix_trie_lookupInTrie(parts, trie, index, allowedMask) { + var _a; + let result = null; + let node = trie; + while (node !== undefined) { + // We have a match! + if ((node[0] & allowedMask) !== 0) { + result = { + index: index + 1, + isIcann: node[0] === 1 /* RULE_TYPE.ICANN */, + isPrivate: node[0] === 2 /* RULE_TYPE.PRIVATE */, + }; } - return rule.matchesPermittedDomains(domain); - }; - /** - * Checks if rule can be matched by url - * @param ruleText - * @param url - */ - RuleSyntaxUtils.isRuleForUrl = function (ruleText, url) { - var domain = getHostname(url); - if (!domain) { - return false; + // No more `parts` to look for + if (index === -1) { + break; } - return this.isRuleForDomain(ruleText, domain); - }; - RuleSyntaxUtils.DUMMY_FILTER_ID = 0; - return RuleSyntaxUtils; -}()); - + const succ = node[1]; + node = (_a = succ[parts[index]]) !== null && _a !== void 0 ? _a : succ['*']; + index -= 1; + } + return result; +} +/** + * Check if `hostname` has a valid public suffix in `trie`. + */ +function src_suffix_trie_suffixLookup(hostname, options, out) { + var _a; + if (lookup_fast_path(hostname, options, out)) { + return; + } + const hostnameParts = hostname.split('.'); + const allowedMask = (options.allowPrivateDomains ? 2 /* RULE_TYPE.PRIVATE */ : 0) | + (options.allowIcannDomains ? 1 /* RULE_TYPE.ICANN */ : 0); + // Look for exceptions + const exceptionMatch = suffix_trie_lookupInTrie(hostnameParts, trie_exceptions, hostnameParts.length - 1, allowedMask); + if (exceptionMatch !== null) { + out.isIcann = exceptionMatch.isIcann; + out.isPrivate = exceptionMatch.isPrivate; + out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.'); + return; + } + // Look for a match in rules + const rulesMatch = suffix_trie_lookupInTrie(hostnameParts, trie_rules, hostnameParts.length - 1, allowedMask); + if (rulesMatch !== null) { + out.isIcann = rulesMatch.isIcann; + out.isPrivate = rulesMatch.isPrivate; + out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.'); + return; + } + // No match found... + // Prevailing rule is '*' so we consider the top-level domain to be the + // public suffix of `hostname` (e.g.: 'example.org' => 'org'). + out.isIcann = false; + out.isPrivate = false; + out.publicSuffix = (_a = hostnameParts[hostnameParts.length - 1]) !== null && _a !== void 0 ? _a : null; +} +//# sourceMappingURL=suffix-trie.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/tldts/dist/es6/index.js -;// CONCATENATED MODULE: ../../node_modules/zod/lib/index.mjs -var lib_util; +// For all methods but 'parse', it does not make sense to allocate an object +// every single time to only return the value of a specific attribute. To avoid +// this un-necessary allocation, we use a global object which is re-used. +const es6_RESULT = factory_getEmptyResult(); +function es6_parse(url, options = {}) { + return src_factory_parseImpl(url, 5 /* FLAG.ALL */, src_suffix_trie_suffixLookup, options, factory_getEmptyResult()); +} +function es6_getHostname(url, options = {}) { + /*@__INLINE__*/ resetResult(es6_RESULT); + return parseImpl(url, 0 /* FLAG.HOSTNAME */, suffixLookup, options, es6_RESULT).hostname; +} +function es6_getPublicSuffix(url, options = {}) { + /*@__INLINE__*/ resetResult(es6_RESULT); + return parseImpl(url, 2 /* FLAG.PUBLIC_SUFFIX */, suffixLookup, options, es6_RESULT) + .publicSuffix; +} +function dist_es6_getDomain(url, options = {}) { + /*@__INLINE__*/ src_factory_resetResult(es6_RESULT); + return src_factory_parseImpl(url, 3 /* FLAG.DOMAIN */, src_suffix_trie_suffixLookup, options, es6_RESULT).domain; +} +function dist_es6_getSubdomain(url, options = {}) { + /*@__INLINE__*/ resetResult(es6_RESULT); + return parseImpl(url, 4 /* FLAG.SUB_DOMAIN */, suffixLookup, options, es6_RESULT) + .subdomain; +} +function dist_es6_getDomainWithoutSuffix(url, options = {}) { + /*@__INLINE__*/ resetResult(es6_RESULT); + return parseImpl(url, 5 /* FLAG.ALL */, suffixLookup, options, es6_RESULT) + .domainWithoutSuffix; +} +//# sourceMappingURL=index.js.map +;// CONCATENATED MODULE: ../tswebextension/node_modules/zod/lib/index.mjs +var util; (function (util) { util.assertEqual = (val) => val; function assertIs(_arg) { } @@ -67498,8 +71388,17 @@ var lib_util; } return value; }; -})(lib_util || (lib_util = {})); -const ZodParsedType = lib_util.arrayToEnum([ +})(util || (util = {})); +var objectUtil; +(function (objectUtil) { + objectUtil.mergeShapes = (first, second) => { + return { + ...first, + ...second, // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +const ZodParsedType = util.arrayToEnum([ "string", "nan", "number", @@ -67536,6 +71435,8 @@ const getParsedType = (data) => { return ZodParsedType.function; case "bigint": return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; case "object": if (Array.isArray(data)) { return ZodParsedType.array; @@ -67564,7 +71465,7 @@ const getParsedType = (data) => { } }; -const ZodIssueCode = lib_util.arrayToEnum([ +const ZodIssueCode = util.arrayToEnum([ "invalid_type", "invalid_literal", "custom", @@ -67580,6 +71481,7 @@ const ZodIssueCode = lib_util.arrayToEnum([ "too_big", "invalid_intersection_types", "not_multiple_of", + "not_finite", ]); const quotelessJson = (obj) => { const json = JSON.stringify(obj, null, 2); @@ -67662,7 +71564,7 @@ class ZodError extends Error { return this.message; } get message() { - return JSON.stringify(this.issues, lib_util.jsonStringifyReplacer, 2); + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); } get isEmpty() { return this.issues.length === 0; @@ -67702,19 +71604,19 @@ const errorMap = (issue, _ctx) => { } break; case ZodIssueCode.invalid_literal: - message = `Invalid literal value, expected ${JSON.stringify(issue.expected, lib_util.jsonStringifyReplacer)}`; + message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`; break; case ZodIssueCode.unrecognized_keys: - message = `Unrecognized key(s) in object: ${lib_util.joinValues(issue.keys, ", ")}`; + message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`; break; case ZodIssueCode.invalid_union: message = `Invalid input`; break; case ZodIssueCode.invalid_union_discriminator: - message = `Invalid discriminator value. Expected ${lib_util.joinValues(issue.options)}`; + message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`; break; case ZodIssueCode.invalid_enum_value: - message = `Invalid enum value. Expected ${lib_util.joinValues(issue.options)}, received '${issue.received}'`; + message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`; break; case ZodIssueCode.invalid_arguments: message = `Invalid function arguments`; @@ -67727,14 +71629,20 @@ const errorMap = (issue, _ctx) => { break; case ZodIssueCode.invalid_string: if (typeof issue.validation === "object") { - if ("startsWith" in issue.validation) { + if ("includes" in issue.validation) { + message = `Invalid input: must include "${issue.validation.includes}"`; + if (typeof issue.validation.position === "number") { + message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`; + } + } + else if ("startsWith" in issue.validation) { message = `Invalid input: must start with "${issue.validation.startsWith}"`; } else if ("endsWith" in issue.validation) { message = `Invalid input: must end with "${issue.validation.endsWith}"`; } else { - lib_util.assertNever(issue.validation); + util.assertNever(issue.validation); } } else if (issue.validation !== "regex") { @@ -67746,25 +71654,47 @@ const errorMap = (issue, _ctx) => { break; case ZodIssueCode.too_small: if (issue.type === "array") - message = `Array must contain ${issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; + message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`; else if (issue.type === "string") - message = `String must contain ${issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; + message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`; else if (issue.type === "number") - message = `Number must be greater than ${issue.inclusive ? `or equal to ` : ``}${issue.minimum}`; + message = `Number must be ${issue.exact + ? `exactly equal to ` + : issue.inclusive + ? `greater than or equal to ` + : `greater than `}${issue.minimum}`; else if (issue.type === "date") - message = `Date must be greater than ${issue.inclusive ? `or equal to ` : ``}${new Date(issue.minimum)}`; + message = `Date must be ${issue.exact + ? `exactly equal to ` + : issue.inclusive + ? `greater than or equal to ` + : `greater than `}${new Date(Number(issue.minimum))}`; else message = "Invalid input"; break; case ZodIssueCode.too_big: if (issue.type === "array") - message = `Array must contain ${issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; + message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`; else if (issue.type === "string") - message = `String must contain ${issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; + message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`; else if (issue.type === "number") - message = `Number must be less than ${issue.inclusive ? `or equal to ` : ``}${issue.maximum}`; + message = `Number must be ${issue.exact + ? `exactly` + : issue.inclusive + ? `less than or equal to` + : `less than`} ${issue.maximum}`; + else if (issue.type === "bigint") + message = `BigInt must be ${issue.exact + ? `exactly` + : issue.inclusive + ? `less than or equal to` + : `less than`} ${issue.maximum}`; else if (issue.type === "date") - message = `Date must be smaller than ${issue.inclusive ? `or equal to ` : ``}${new Date(issue.maximum)}`; + message = `Date must be ${issue.exact + ? `exactly` + : issue.inclusive + ? `smaller than or equal to` + : `smaller than`} ${new Date(Number(issue.maximum))}`; else message = "Invalid input"; break; @@ -67777,9 +71707,12 @@ const errorMap = (issue, _ctx) => { case ZodIssueCode.not_multiple_of: message = `Number must be a multiple of ${issue.multipleOf}`; break; + case ZodIssueCode.not_finite: + message = "Number must be finite"; + break; default: message = _ctx.defaultError; - lib_util.assertNever(issue); + util.assertNever(issue); } return { message }; }; @@ -67823,7 +71756,7 @@ function addIssueToContext(ctx, issueData) { ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), - errorMap, + errorMap, // then global default map ].filter((x) => !!x), }); ctx.common.issues.push(issue); @@ -67888,7 +71821,7 @@ const OK = (value) => ({ status: "valid", value }); const isAborted = (x) => x.status === "aborted"; const isDirty = (x) => x.status === "dirty"; const isValid = (x) => x.status === "valid"; -const isAsync = (x) => typeof Promise !== undefined && x instanceof Promise; +const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; var errorUtil; (function (errorUtil) { @@ -67898,13 +71831,22 @@ var errorUtil; class ParseInputLazyPath { constructor(parent, value, path, key) { + this._cachedPath = []; this.parent = parent; this.data = value; this._path = path; this._key = key; } get path() { - return this._path.concat(this._key); + if (!this._cachedPath.length) { + if (this._key instanceof Array) { + this._cachedPath.push(...this._path, ...this._key); + } + else { + this._cachedPath.push(...this._path, this._key); + } + } + return this._cachedPath; } } const handleResult = (ctx, result) => { @@ -67915,8 +71857,16 @@ const handleResult = (ctx, result) => { if (!ctx.common.issues.length) { throw new Error("Validation failed but no issues detected."); } - const error = new ZodError(ctx.common.issues); - return { success: false, error }; + return { + success: false, + get error() { + if (this._error) + return this._error; + const error = new ZodError(ctx.common.issues); + this._error = error; + return this._error; + }, + }; } }; function processCreateParams(params) { @@ -67942,7 +71892,6 @@ class ZodType { constructor(def) { /** Alias of safeParseAsync */ this.spa = this.safeParseAsync; - this.superRefine = this._refinement; this._def = def; this.parse = this.parse.bind(this); this.safeParse = this.safeParse.bind(this); @@ -67960,8 +71909,11 @@ class ZodType { this.or = this.or.bind(this); this.and = this.and.bind(this); this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); this.default = this.default.bind(this); + this.catch = this.catch.bind(this); this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); this.isNullable = this.isNullable.bind(this); this.isOptional = this.isOptional.bind(this); } @@ -68047,7 +71999,7 @@ class ZodType { data, parsedType: getParsedType(data), }; - const maybeAsyncResult = this._parse({ data, path: [], parent: ctx }); + const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)); @@ -68111,29 +72063,33 @@ class ZodType { effect: { type: "refinement", refinement }, }); } + superRefine(refinement) { + return this._refinement(refinement); + } optional() { - return ZodOptional.create(this); + return ZodOptional.create(this, this._def); } nullable() { - return ZodNullable.create(this); + return ZodNullable.create(this, this._def); } nullish() { - return this.optional().nullable(); + return this.nullable().optional(); } array() { - return ZodArray.create(this); + return ZodArray.create(this, this._def); } promise() { - return ZodPromise.create(this); + return ZodPromise.create(this, this._def); } or(option) { - return ZodUnion.create([this, option]); + return ZodUnion.create([this, option], this._def); } and(incoming) { - return ZodIntersection.create(this, incoming); + return ZodIntersection.create(this, incoming, this._def); } transform(transform) { return new ZodEffects({ + ...processCreateParams(this._def), schema: this, typeName: ZodFirstPartyTypeKind.ZodEffects, effect: { type: "transform", transform }, @@ -68142,6 +72098,7 @@ class ZodType { default(def) { const defaultValueFunc = typeof def === "function" ? def : () => def; return new ZodDefault({ + ...processCreateParams(this._def), innerType: this, defaultValue: defaultValueFunc, typeName: ZodFirstPartyTypeKind.ZodDefault, @@ -68151,7 +72108,16 @@ class ZodType { return new ZodBranded({ typeName: ZodFirstPartyTypeKind.ZodBranded, type: this, - ...processCreateParams(undefined), + ...processCreateParams(this._def), + }); + } + catch(def) { + const catchValueFunc = typeof def === "function" ? def : () => def; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: catchValueFunc, + typeName: ZodFirstPartyTypeKind.ZodCatch, }); } describe(description) { @@ -68161,6 +72127,9 @@ class ZodType { description, }); } + pipe(target) { + return ZodPipeline.create(this, target); + } isOptional() { return this.safeParse(undefined).success; } @@ -68169,12 +72138,56 @@ class ZodType { } } const cuidRegex = /^c[^\s-]{8,}$/i; +const cuid2Regex = /^[a-z][a-z0-9]*$/; +const ulidRegex = /[0-9A-HJKMNP-TV-Z]{26}/; const uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i; // from https://stackoverflow.com/a/46181/1550155 // old version: too slow, didn't support unicode // const emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i; +//old email regex +// const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i; // eslint-disable-next-line -const emailRegex = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; +const emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/; +// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression +const emojiRegex = /^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u; +const ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/; +const ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/; +// Adapted from https://stackoverflow.com/a/3143231 +const datetimeRegex = (args) => { + if (args.precision) { + if (args.offset) { + return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`); + } + else { + return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}Z$`); + } + } + else if (args.precision === 0) { + if (args.offset) { + return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$`); + } + else { + return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$`); + } + } + else { + if (args.offset) { + return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$`); + } + else { + return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$`); + } + } +}; +function isValidIP(ip, version) { + if ((version === "v4" || !version) && ipv4Regex.test(ip)) { + return true; + } + if ((version === "v6" || !version) && ipv6Regex.test(ip)) { + return true; + } + return false; +} class ZodString extends ZodType { constructor() { super(...arguments); @@ -68192,8 +72205,19 @@ class ZodString extends ZodType { ...this._def, checks: [...this._def.checks, { kind: "trim" }], }); + this.toLowerCase = () => new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }], + }); + this.toUpperCase = () => new ZodString({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }], + }); } _parse(input) { + if (this._def.coerce) { + input.data = String(input.data); + } const parsedType = this._getType(input); if (parsedType !== ZodParsedType.string) { const ctx = this._getOrReturnCtx(input); @@ -68213,55 +72237,118 @@ class ZodString extends ZodType { if (input.data.length < check.value) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: check.value, - type: "string", - inclusive: true, + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "max") { + if (input.data.length > check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: false, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "length") { + const tooBig = input.data.length > check.value; + const tooSmall = input.data.length < check.value; + if (tooBig || tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + if (tooBig) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message, + }); + } + else if (tooSmall) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check.value, + type: "string", + inclusive: true, + exact: true, + message: check.message, + }); + } + status.dirty(); + } + } + else if (check.kind === "email") { + if (!emailRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "email", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "emoji") { + if (!emojiRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "emoji", + code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "max") { - if (input.data.length > check.value) { + else if (check.kind === "uuid") { + if (!uuidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: check.value, - type: "string", - inclusive: true, + validation: "uuid", + code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "email") { - if (!emailRegex.test(input.data)) { + else if (check.kind === "cuid") { + if (!cuidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "email", + validation: "cuid", code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "uuid") { - if (!uuidRegex.test(input.data)) { + else if (check.kind === "cuid2") { + if (!cuid2Regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "uuid", + validation: "cuid2", code: ZodIssueCode.invalid_string, message: check.message, }); status.dirty(); } } - else if (check.kind === "cuid") { - if (!cuidRegex.test(input.data)) { + else if (check.kind === "ulid") { + if (!ulidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - validation: "cuid", + validation: "ulid", code: ZodIssueCode.invalid_string, message: check.message, }); @@ -68298,6 +72385,23 @@ class ZodString extends ZodType { else if (check.kind === "trim") { input.data = input.data.trim(); } + else if (check.kind === "includes") { + if (!input.data.includes(check.value, check.position)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { includes: check.value, position: check.position }, + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "toLowerCase") { + input.data = input.data.toLowerCase(); + } + else if (check.kind === "toUpperCase") { + input.data = input.data.toUpperCase(); + } else if (check.kind === "startsWith") { if (!input.data.startsWith(check.value)) { ctx = this._getOrReturnCtx(input, ctx); @@ -68320,8 +72424,31 @@ class ZodString extends ZodType { status.dirty(); } } + else if (check.kind === "datetime") { + const regex = datetimeRegex(check); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "datetime", + message: check.message, + }); + status.dirty(); + } + } + else if (check.kind === "ip") { + if (!isValidIP(input.data, check.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ip", + code: ZodIssueCode.invalid_string, + message: check.message, + }); + status.dirty(); + } + } else { - lib_util.assertNever(check); + util.assertNever(check); } } return { status: status.value, value: input.data }; @@ -68338,12 +72465,41 @@ class ZodString extends ZodType { url(message) { return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); } + emoji(message) { + return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + } uuid(message) { return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); } cuid(message) { return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); } + cuid2(message) { + return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); + } + ulid(message) { + return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); + } + ip(options) { + return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + } + datetime(options) { + var _a; + if (typeof options === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + message: options, + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === "undefined" ? null : options === null || options === void 0 ? void 0 : options.precision, + offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), + }); + } regex(regex, message) { return this._addCheck({ kind: "regex", @@ -68351,6 +72507,14 @@ class ZodString extends ZodType { ...errorUtil.errToObj(message), }); } + includes(value, options) { + return this._addCheck({ + kind: "includes", + value: value, + position: options === null || options === void 0 ? void 0 : options.position, + ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message), + }); + } startsWith(value, message) { return this._addCheck({ kind: "startsWith", @@ -68380,7 +72544,14 @@ class ZodString extends ZodType { }); } length(len, message) { - return this.min(len, message).max(len, message); + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message), + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); } get isEmail() { return !!this._def.checks.find((ch) => ch.kind === "email"); @@ -68388,12 +72559,24 @@ class ZodString extends ZodType { get isURL() { return !!this._def.checks.find((ch) => ch.kind === "url"); } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } get isUUID() { return !!this._def.checks.find((ch) => ch.kind === "uuid"); } get isCUID() { return !!this._def.checks.find((ch) => ch.kind === "cuid"); } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } get minLength() { let min = null; for (const ch of this._def.checks) { @@ -68416,9 +72599,11 @@ class ZodString extends ZodType { } } ZodString.create = (params) => { + var _a; return new ZodString({ checks: [], typeName: ZodFirstPartyTypeKind.ZodString, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, ...processCreateParams(params), }); }; @@ -68439,6 +72624,9 @@ class ZodNumber extends ZodType { this.step = this.multipleOf; } _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } const parsedType = this._getType(input); if (parsedType !== ZodParsedType.number) { const ctx = this._getOrReturnCtx(input); @@ -68453,7 +72641,7 @@ class ZodNumber extends ZodType { const status = new ParseStatus(); for (const check of this._def.checks) { if (check.kind === "int") { - if (!lib_util.isInteger(input.data)) { + if (!util.isInteger(input.data)) { ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, @@ -68475,6 +72663,7 @@ class ZodNumber extends ZodType { minimum: check.value, type: "number", inclusive: check.inclusive, + exact: false, message: check.message, }); status.dirty(); @@ -68491,6 +72680,7 @@ class ZodNumber extends ZodType { maximum: check.value, type: "number", inclusive: check.inclusive, + exact: false, message: check.message, }); status.dirty(); @@ -68507,8 +72697,18 @@ class ZodNumber extends ZodType { status.dirty(); } } + else if (check.kind === "finite") { + if (!Number.isFinite(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check.message, + }); + status.dirty(); + } + } else { - lib_util.assertNever(check); + util.assertNever(check); } } return { status: status.value, value: input.data }; @@ -68570,2992 +72770,2648 @@ class ZodNumber extends ZodType { nonpositive(message) { return this._addCheck({ kind: "max", - value: 0, - inclusive: true, - message: errorUtil.toString(message), - }); - } - nonnegative(message) { - return this._addCheck({ - kind: "min", - value: 0, - inclusive: true, - message: errorUtil.toString(message), - }); - } - multipleOf(value, message) { - return this._addCheck({ - kind: "multipleOf", - value: value, - message: errorUtil.toString(message), - }); - } - get minValue() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - } - return min; - } - get maxValue() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return max; - } - get isInt() { - return !!this._def.checks.find((ch) => ch.kind === "int"); - } -} -ZodNumber.create = (params) => { - return new ZodNumber({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodNumber, - ...processCreateParams(params), - }); -}; -class ZodBigInt extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.bigint) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.bigint, - received: ctx.parsedType, - }); - return INVALID; - } - return OK(input.data); - } -} -ZodBigInt.create = (params) => { - return new ZodBigInt({ - typeName: ZodFirstPartyTypeKind.ZodBigInt, - ...processCreateParams(params), - }); -}; -class ZodBoolean extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.boolean) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.boolean, - received: ctx.parsedType, - }); - return INVALID; - } - return OK(input.data); - } -} -ZodBoolean.create = (params) => { - return new ZodBoolean({ - typeName: ZodFirstPartyTypeKind.ZodBoolean, - ...processCreateParams(params), - }); -}; -class ZodDate extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.date) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.date, - received: ctx.parsedType, - }); - return INVALID; - } - if (isNaN(input.data.getTime())) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_date, - }); - return INVALID; - } - const status = new ParseStatus(); - let ctx = undefined; - for (const check of this._def.checks) { - if (check.kind === "min") { - if (input.data.getTime() < check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - message: check.message, - inclusive: true, - minimum: check.value, - type: "date", - }); - status.dirty(); - } - } - else if (check.kind === "max") { - if (input.data.getTime() > check.value) { - ctx = this._getOrReturnCtx(input, ctx); - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - message: check.message, - inclusive: true, - maximum: check.value, - type: "date", - }); - status.dirty(); - } - } - else { - lib_util.assertNever(check); - } - } - return { - status: status.value, - value: new Date(input.data.getTime()), - }; - } - _addCheck(check) { - return new ZodDate({ - ...this._def, - checks: [...this._def.checks, check], - }); - } - min(minDate, message) { - return this._addCheck({ - kind: "min", - value: minDate.getTime(), - message: errorUtil.toString(message), - }); - } - max(maxDate, message) { - return this._addCheck({ - kind: "max", - value: maxDate.getTime(), - message: errorUtil.toString(message), - }); - } - get minDate() { - let min = null; - for (const ch of this._def.checks) { - if (ch.kind === "min") { - if (min === null || ch.value > min) - min = ch.value; - } - } - return min != null ? new Date(min) : null; - } - get maxDate() { - let max = null; - for (const ch of this._def.checks) { - if (ch.kind === "max") { - if (max === null || ch.value < max) - max = ch.value; - } - } - return max != null ? new Date(max) : null; - } -} -ZodDate.create = (params) => { - return new ZodDate({ - checks: [], - typeName: ZodFirstPartyTypeKind.ZodDate, - ...processCreateParams(params), - }); -}; -class ZodUndefined extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.undefined, - received: ctx.parsedType, - }); - return INVALID; - } - return OK(input.data); - } -} -ZodUndefined.create = (params) => { - return new ZodUndefined({ - typeName: ZodFirstPartyTypeKind.ZodUndefined, - ...processCreateParams(params), - }); -}; -class ZodNull extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.null) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.null, - received: ctx.parsedType, - }); - return INVALID; - } - return OK(input.data); - } -} -ZodNull.create = (params) => { - return new ZodNull({ - typeName: ZodFirstPartyTypeKind.ZodNull, - ...processCreateParams(params), - }); -}; -class ZodAny extends ZodType { - constructor() { - super(...arguments); - // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. - this._any = true; - } - _parse(input) { - return OK(input.data); - } -} -ZodAny.create = (params) => { - return new ZodAny({ - typeName: ZodFirstPartyTypeKind.ZodAny, - ...processCreateParams(params), - }); -}; -class ZodUnknown extends ZodType { - constructor() { - super(...arguments); - // required - this._unknown = true; - } - _parse(input) { - return OK(input.data); - } -} -ZodUnknown.create = (params) => { - return new ZodUnknown({ - typeName: ZodFirstPartyTypeKind.ZodUnknown, - ...processCreateParams(params), - }); -}; -class ZodNever extends ZodType { - _parse(input) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.never, - received: ctx.parsedType, - }); - return INVALID; - } -} -ZodNever.create = (params) => { - return new ZodNever({ - typeName: ZodFirstPartyTypeKind.ZodNever, - ...processCreateParams(params), - }); -}; -class ZodVoid extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.undefined) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.void, - received: ctx.parsedType, - }); - return INVALID; - } - return OK(input.data); - } -} -ZodVoid.create = (params) => { - return new ZodVoid({ - typeName: ZodFirstPartyTypeKind.ZodVoid, - ...processCreateParams(params), - }); -}; -class ZodArray extends ZodType { - _parse(input) { - const { ctx, status } = this._processInputParams(input); - const def = this._def; - if (ctx.parsedType !== ZodParsedType.array) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, - received: ctx.parsedType, - }); - return INVALID; - } - if (def.minLength !== null) { - if (ctx.data.length < def.minLength.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: def.minLength.value, - type: "array", - inclusive: true, - message: def.minLength.message, - }); - status.dirty(); - } - } - if (def.maxLength !== null) { - if (ctx.data.length > def.maxLength.value) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: def.maxLength.value, - type: "array", - inclusive: true, - message: def.maxLength.message, - }); - status.dirty(); - } - } - if (ctx.common.async) { - return Promise.all(ctx.data.map((item, i) => { - return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - })).then((result) => { - return ParseStatus.mergeArray(status, result); - }); - } - const result = ctx.data.map((item, i) => { - return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); - }); - return ParseStatus.mergeArray(status, result); - } - get element() { - return this._def.type; - } - min(minLength, message) { - return new ZodArray({ - ...this._def, - minLength: { value: minLength, message: errorUtil.toString(message) }, - }); - } - max(maxLength, message) { - return new ZodArray({ - ...this._def, - maxLength: { value: maxLength, message: errorUtil.toString(message) }, + value: 0, + inclusive: true, + message: errorUtil.toString(message), }); } - length(len, message) { - return this.min(len, message).max(len, message); + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message), + }); } - nonempty(message) { - return this.min(1, message); + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value: value, + message: errorUtil.toString(message), + }); } -} -ZodArray.create = (schema, params) => { - return new ZodArray({ - type: schema, - minLength: null, - maxLength: null, - typeName: ZodFirstPartyTypeKind.ZodArray, - ...processCreateParams(params), - }); -}; -///////////////////////////////////////// -///////////////////////////////////////// -////////// ////////// -////////// ZodObject ////////// -////////// ////////// -///////////////////////////////////////// -///////////////////////////////////////// -var objectUtil; -(function (objectUtil) { - objectUtil.mergeShapes = (first, second) => { - return { - ...first, - ...second, - }; - }; -})(objectUtil || (objectUtil = {})); -const AugmentFactory = (def) => (augmentation) => { - return new ZodObject({ - ...def, - shape: () => ({ - ...def.shape(), - ...augmentation, - }), - }); -}; -function deepPartialify(schema) { - if (schema instanceof ZodObject) { - const newShape = {}; - for (const key in schema.shape) { - const fieldSchema = schema.shape[key]; - newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); - } - return new ZodObject({ - ...schema._def, - shape: () => newShape, + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message), }); } - else if (schema instanceof ZodArray) { - return ZodArray.create(deepPartialify(schema.element)); + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message), + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message), + }); } - else if (schema instanceof ZodOptional) { - return ZodOptional.create(deepPartialify(schema.unwrap())); + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; } - else if (schema instanceof ZodNullable) { - return ZodNullable.create(deepPartialify(schema.unwrap())); + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; } - else if (schema instanceof ZodTuple) { - return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || + (ch.kind === "multipleOf" && util.isInteger(ch.value))); } - else { - return schema; + get isFinite() { + let max = null, min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || + ch.kind === "int" || + ch.kind === "multipleOf") { + return true; + } + else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); } } -class ZodObject extends ZodType { +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + ...processCreateParams(params), + }); +}; +class ZodBigInt extends ZodType { constructor() { super(...arguments); - this._cached = null; - /** - * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. - * If you want to pass through unknown properties, use `.passthrough()` instead. - */ - this.nonstrict = this.passthrough; - this.augment = AugmentFactory(this._def); - this.extend = AugmentFactory(this._def); - } - _getCached() { - if (this._cached !== null) - return this._cached; - const shape = this._def.shape(); - const keys = lib_util.objectKeys(shape); - return (this._cached = { shape, keys }); + this.min = this.gte; + this.max = this.lte; } _parse(input) { + if (this._def.coerce) { + input.data = BigInt(input.data); + } const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.object) { + if (parsedType !== ZodParsedType.bigint) { const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.bigint, received: ctx.parsedType, }); return INVALID; } - const { status, ctx } = this._processInputParams(input); - const { shape, keys: shapeKeys } = this._getCached(); - const extraKeys = []; - if (!(this._def.catchall instanceof ZodNever && - this._def.unknownKeys === "strip")) { - for (const key in ctx.data) { - if (!shapeKeys.includes(key)) { - extraKeys.push(key); + let ctx = undefined; + const status = new ParseStatus(); + for (const check of this._def.checks) { + if (check.kind === "min") { + const tooSmall = check.inclusive + ? input.data < check.value + : input.data <= check.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check.value, + inclusive: check.inclusive, + message: check.message, + }); + status.dirty(); } } - } - const pairs = []; - for (const key of shapeKeys) { - const keyValidator = shape[key]; - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), - alwaysSet: key in ctx.data, - }); - } - if (this._def.catchall instanceof ZodNever) { - const unknownKeys = this._def.unknownKeys; - if (unknownKeys === "passthrough") { - for (const key of extraKeys) { - pairs.push({ - key: { status: "valid", value: key }, - value: { status: "valid", value: ctx.data[key] }, + else if (check.kind === "max") { + const tooBig = check.inclusive + ? input.data > check.value + : input.data >= check.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check.value, + inclusive: check.inclusive, + message: check.message, }); + status.dirty(); } } - else if (unknownKeys === "strict") { - if (extraKeys.length > 0) { + else if (check.kind === "multipleOf") { + if (input.data % check.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input, ctx); addIssueToContext(ctx, { - code: ZodIssueCode.unrecognized_keys, - keys: extraKeys, + code: ZodIssueCode.not_multiple_of, + multipleOf: check.value, + message: check.message, }); status.dirty(); } } - else if (unknownKeys === "strip") ; else { - throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); - } - } - else { - // run catchall validation - const catchall = this._def.catchall; - for (const key of extraKeys) { - const value = ctx.data[key]; - pairs.push({ - key: { status: "valid", value: key }, - value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) - ), - alwaysSet: key in ctx.data, - }); + util.assertNever(check); } } - if (ctx.common.async) { - return Promise.resolve() - .then(async () => { - const syncPairs = []; - for (const pair of pairs) { - const key = await pair.key; - syncPairs.push({ - key, - value: await pair.value, - alwaysSet: pair.alwaysSet, - }); - } - return syncPairs; - }) - .then((syncPairs) => { - return ParseStatus.mergeObjectSync(status, syncPairs); - }); - } - else { - return ParseStatus.mergeObjectSync(status, pairs); - } + return { status: status.value, value: input.data }; } - get shape() { - return this._def.shape(); + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); } - strict(message) { - errorUtil.errToObj; - return new ZodObject({ - ...this._def, - unknownKeys: "strict", - ...(message !== undefined - ? { - errorMap: (issue, ctx) => { - var _a, _b, _c, _d; - const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; - if (issue.code === "unrecognized_keys") - return { - message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, - }; - return { - message: defaultError, - }; - }, - } - : {}), - }); + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); } - strip() { - return new ZodObject({ + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new ZodBigInt({ ...this._def, - unknownKeys: "strip", + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message), + }, + ], }); } - passthrough() { - return new ZodObject({ + _addCheck(check) { + return new ZodBigInt({ ...this._def, - unknownKeys: "passthrough", + checks: [...this._def.checks, check], }); } - setKey(key, schema) { - return this.augment({ [key]: schema }); - } - /** - * Prior to zod@1.0.12 there was a bug in the - * inferred type of merged objects. Please - * upgrade if you are experiencing issues. - */ - merge(merging) { - // const mergedShape = objectUtil.mergeShapes( - // this._def.shape(), - // merging._def.shape() - // ); - const merged = new ZodObject({ - unknownKeys: merging._def.unknownKeys, - catchall: merging._def.catchall, - shape: () => objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), - typeName: ZodFirstPartyTypeKind.ZodObject, + positive(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), }); - return merged; } - catchall(index) { - return new ZodObject({ - ...this._def, - catchall: index, + negative(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message), }); } - pick(mask) { - const shape = {}; - lib_util.objectKeys(mask).map((key) => { - // only add to shape if key corresponds to an element of the current shape - if (this.shape[key]) - shape[key] = this.shape[key]; - }); - return new ZodObject({ - ...this._def, - shape: () => shape, + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), }); } - omit(mask) { - const shape = {}; - lib_util.objectKeys(this.shape).map((key) => { - if (lib_util.objectKeys(mask).indexOf(key) === -1) { - shape[key] = this.shape[key]; - } - }); - return new ZodObject({ - ...this._def, - shape: () => shape, + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message), }); } - deepPartial() { - return deepPartialify(this); + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message), + }); } - partial(mask) { - const newShape = {}; - if (mask) { - lib_util.objectKeys(this.shape).map((key) => { - if (lib_util.objectKeys(mask).indexOf(key) === -1) { - newShape[key] = this.shape[key]; - } - else { - newShape[key] = this.shape[key].optional(); - } - }); - return new ZodObject({ - ...this._def, - shape: () => newShape, - }); - } - else { - for (const key in this.shape) { - const fieldSchema = this.shape[key]; - newShape[key] = fieldSchema.optional(); + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; } } - return new ZodObject({ - ...this._def, - shape: () => newShape, - }); + return min; } - required() { - const newShape = {}; - for (const key in this.shape) { - const fieldSchema = this.shape[key]; - let newField = fieldSchema; - while (newField instanceof ZodOptional) { - newField = newField._def.innerType; + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; } - newShape[key] = newField; } - return new ZodObject({ - ...this._def, - shape: () => newShape, - }); - } - keyof() { - return createZodEnum(lib_util.objectKeys(this.shape)); + return max; } } -ZodObject.create = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, - ...processCreateParams(params), - }); -}; -ZodObject.strictCreate = (shape, params) => { - return new ZodObject({ - shape: () => shape, - unknownKeys: "strict", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, - ...processCreateParams(params), - }); -}; -ZodObject.lazycreate = (shape, params) => { - return new ZodObject({ - shape, - unknownKeys: "strip", - catchall: ZodNever.create(), - typeName: ZodFirstPartyTypeKind.ZodObject, - ...processCreateParams(params), - }); -}; -class ZodUnion extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - const options = this._def.options; - function handleResults(results) { - // return first issue-free validation if it exists - for (const result of results) { - if (result.result.status === "valid") { - return result.result; - } - } - for (const result of results) { - if (result.result.status === "dirty") { - // add issues from dirty option - ctx.common.issues.push(...result.ctx.common.issues); - return result.result; - } - } - // return invalid - const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, - }); - return INVALID; - } - if (ctx.common.async) { - return Promise.all(options.map(async (option) => { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - return { - result: await option._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: childCtx, - }), - ctx: childCtx, - }; - })).then(handleResults); - } - else { - let dirty = undefined; - const issues = []; - for (const option of options) { - const childCtx = { - ...ctx, - common: { - ...ctx.common, - issues: [], - }, - parent: null, - }; - const result = option._parseSync({ - data: ctx.data, - path: ctx.path, - parent: childCtx, - }); - if (result.status === "valid") { - return result; - } - else if (result.status === "dirty" && !dirty) { - dirty = { result, ctx: childCtx }; - } - if (childCtx.common.issues.length) { - issues.push(childCtx.common.issues); - } - } - if (dirty) { - ctx.common.issues.push(...dirty.ctx.common.issues); - return dirty.result; - } - const unionErrors = issues.map((issues) => new ZodError(issues)); +ZodBigInt.create = (params) => { + var _a; + return new ZodBigInt({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodBigInt, + coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false, + ...processCreateParams(params), + }); +}; +class ZodBoolean extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union, - unionErrors, + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType, }); return INVALID; } - } - get options() { - return this._def.options; + return OK(input.data); } } -ZodUnion.create = (types, params) => { - return new ZodUnion({ - options: types, - typeName: ZodFirstPartyTypeKind.ZodUnion, +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, ...processCreateParams(params), }); }; -class ZodDiscriminatedUnion extends ZodType { +class ZodDate extends ZodType { _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { + if (this._def.coerce) { + input.data = new Date(input.data); + } + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.date) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.date, received: ctx.parsedType, }); return INVALID; } - const discriminator = this.discriminator; - const discriminatorValue = ctx.data[discriminator]; - const option = this.options.get(discriminatorValue); - if (!option) { + if (isNaN(input.data.getTime())) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { - code: ZodIssueCode.invalid_union_discriminator, - options: this.validDiscriminatorValues, - path: [discriminator], + code: ZodIssueCode.invalid_date, }); return INVALID; } - if (ctx.common.async) { - return option._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - } - else { - return option._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); + const status = new ParseStatus(); + let ctx = undefined; + for (const check of this._def.checks) { + if (check.kind === "min") { + if (input.data.getTime() < check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + message: check.message, + inclusive: true, + exact: false, + minimum: check.value, + type: "date", + }); + status.dirty(); + } + } + else if (check.kind === "max") { + if (input.data.getTime() > check.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + message: check.message, + inclusive: true, + exact: false, + maximum: check.value, + type: "date", + }); + status.dirty(); + } + } + else { + util.assertNever(check); + } } + return { + status: status.value, + value: new Date(input.data.getTime()), + }; } - get discriminator() { - return this._def.discriminator; - } - get validDiscriminatorValues() { - return Array.from(this.options.keys()); - } - get options() { - return this._def.options; - } - /** - * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. - * However, it only allows a union of objects, all of which need to share a discriminator property. This property must - * have a different value for each object in the union. - * @param discriminator the name of the discriminator property - * @param types an array of object schemas - * @param params - */ - static create(discriminator, types, params) { - // Get all the valid discriminator values - const options = new Map(); - try { - types.forEach((type) => { - const discriminatorValue = type.shape[discriminator].value; - options.set(discriminatorValue, type); - }); - } - catch (e) { - throw new Error("The discriminator value could not be extracted from all the provided schemas"); - } - // Assert that all the discriminator values are unique - if (options.size !== types.length) { - throw new Error("Some of the discriminator values are not unique"); - } - return new ZodDiscriminatedUnion({ - typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, - discriminator, - options, - ...processCreateParams(params), + _addCheck(check) { + return new ZodDate({ + ...this._def, + checks: [...this._def.checks, check], }); } -} -function mergeValues(a, b) { - const aType = getParsedType(a); - const bType = getParsedType(b); - if (a === b) { - return { valid: true, data: a }; + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message), + }); } - else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { - const bKeys = lib_util.objectKeys(b); - const sharedKeys = lib_util - .objectKeys(a) - .filter((key) => bKeys.indexOf(key) !== -1); - const newObj = { ...a, ...b }; - for (const key of sharedKeys) { - const sharedValue = mergeValues(a[key], b[key]); - if (!sharedValue.valid) { - return { valid: false }; - } - newObj[key] = sharedValue.data; - } - return { valid: true, data: newObj }; + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message), + }); } - else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { - if (a.length !== b.length) { - return { valid: false }; - } - const newArray = []; - for (let index = 0; index < a.length; index++) { - const itemA = a[index]; - const itemB = b[index]; - const sharedValue = mergeValues(itemA, itemB); - if (!sharedValue.valid) { - return { valid: false }; + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; } - newArray.push(sharedValue.data); } - return { valid: true, data: newArray }; - } - else if (aType === ZodParsedType.date && - bType === ZodParsedType.date && - +a === +b) { - return { valid: true, data: a }; - } - else { - return { valid: false }; + return min != null ? new Date(min) : null; } -} -class ZodIntersection extends ZodType { - _parse(input) { - const { status, ctx } = this._processInputParams(input); - const handleParsed = (parsedLeft, parsedRight) => { - if (isAborted(parsedLeft) || isAborted(parsedRight)) { - return INVALID; - } - const merged = mergeValues(parsedLeft.value, parsedRight.value); - if (!merged.valid) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_intersection_types, - }); - return INVALID; - } - if (isDirty(parsedLeft) || isDirty(parsedRight)) { - status.dirty(); + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; } - return { status: status.value, value: merged.data }; - }; - if (ctx.common.async) { - return Promise.all([ - this._def.left._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }), - this._def.right._parseAsync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }), - ]).then(([left, right]) => handleParsed(left, right)); - } - else { - return handleParsed(this._def.left._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }), this._def.right._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - })); } + return max != null ? new Date(max) : null; } } -ZodIntersection.create = (left, right, params) => { - return new ZodIntersection({ - left: left, - right: right, - typeName: ZodFirstPartyTypeKind.ZodIntersection, +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false, + typeName: ZodFirstPartyTypeKind.ZodDate, ...processCreateParams(params), }); }; -class ZodTuple extends ZodType { +class ZodSymbol extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.array) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.array, + expected: ZodParsedType.symbol, received: ctx.parsedType, }); return INVALID; } - if (ctx.data.length < this._def.items.length) { + return OK(input.data); + } +} +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params), + }); +}; +class ZodUndefined extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { - code: ZodIssueCode.too_small, - minimum: this._def.items.length, - inclusive: true, - type: "array", + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType, }); return INVALID; } - const rest = this._def.rest; - if (!rest && ctx.data.length > this._def.items.length) { - addIssueToContext(ctx, { - code: ZodIssueCode.too_big, - maximum: this._def.items.length, - inclusive: true, - type: "array", - }); - status.dirty(); - } - const items = ctx.data - .map((item, itemIndex) => { - const schema = this._def.items[itemIndex] || this._def.rest; - if (!schema) - return null; - return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); - }) - .filter((x) => !!x); // filter nulls - if (ctx.common.async) { - return Promise.all(items).then((results) => { - return ParseStatus.mergeArray(status, results); - }); - } - else { - return ParseStatus.mergeArray(status, items); - } - } - get items() { - return this._def.items; - } - rest(rest) { - return new ZodTuple({ - ...this._def, - rest, - }); + return OK(input.data); } } -ZodTuple.create = (schemas, params) => { - if (!Array.isArray(schemas)) { - throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); - } - return new ZodTuple({ - items: schemas, - typeName: ZodFirstPartyTypeKind.ZodTuple, - rest: null, +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, ...processCreateParams(params), }); }; -class ZodRecord extends ZodType { - get keySchema() { - return this._def.keyType; - } - get valueSchema() { - return this._def.valueType; - } +class ZodNull extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.object) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.object, + expected: ZodParsedType.null, received: ctx.parsedType, }); return INVALID; } - const pairs = []; - const keyType = this._def.keyType; - const valueType = this._def.valueType; - for (const key in ctx.data) { - pairs.push({ - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), - value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), - }); - } - if (ctx.common.async) { - return ParseStatus.mergeObjectAsync(status, pairs); - } - else { - return ParseStatus.mergeObjectSync(status, pairs); - } + return OK(input.data); } - get element() { - return this._def.valueType; +} +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params), + }); +}; +class ZodAny extends ZodType { + constructor() { + super(...arguments); + // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject. + this._any = true; } - static create(first, second, third) { - if (second instanceof ZodType) { - return new ZodRecord({ - keyType: first, - valueType: second, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(third), - }); - } - return new ZodRecord({ - keyType: ZodString.create(), - valueType: first, - typeName: ZodFirstPartyTypeKind.ZodRecord, - ...processCreateParams(second), + _parse(input) { + return OK(input.data); + } +} +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params), + }); +}; +class ZodUnknown extends ZodType { + constructor() { + super(...arguments); + // required + this._unknown = true; + } + _parse(input) { + return OK(input.data); + } +} +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params), + }); +}; +class ZodNever extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType, }); + return INVALID; } } -class ZodMap extends ZodType { +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params), + }); +}; +class ZodVoid extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.map) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.map, + expected: ZodParsedType.void, received: ctx.parsedType, }); return INVALID; } - const keyType = this._def.keyType; - const valueType = this._def.valueType; - const pairs = [...ctx.data.entries()].map(([key, value], index) => { - return { - key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), - value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), - }; - }); - if (ctx.common.async) { - const finalMap = new Map(); - return Promise.resolve().then(async () => { - for (const pair of pairs) { - const key = await pair.key; - const value = await pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; - } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); - } - finalMap.set(key.value, value.value); - } - return { status: status.value, value: finalMap }; - }); - } - else { - const finalMap = new Map(); - for (const pair of pairs) { - const key = pair.key; - const value = pair.value; - if (key.status === "aborted" || value.status === "aborted") { - return INVALID; - } - if (key.status === "dirty" || value.status === "dirty") { - status.dirty(); - } - finalMap.set(key.value, value.value); - } - return { status: status.value, value: finalMap }; - } + return OK(input.data); } } -ZodMap.create = (keyType, valueType, params) => { - return new ZodMap({ - valueType, - keyType, - typeName: ZodFirstPartyTypeKind.ZodMap, +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, ...processCreateParams(params), }); }; -class ZodSet extends ZodType { +class ZodArray extends ZodType { _parse(input) { - const { status, ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.set) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.set, + expected: ZodParsedType.array, received: ctx.parsedType, }); return INVALID; } - const def = this._def; - if (def.minSize !== null) { - if (ctx.data.size < def.minSize.value) { + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: (tooSmall ? def.exactLength.value : undefined), + maximum: (tooBig ? def.exactLength.value : undefined), + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message, + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_small, - minimum: def.minSize.value, - type: "set", + minimum: def.minLength.value, + type: "array", inclusive: true, - message: def.minSize.message, + exact: false, + message: def.minLength.message, }); status.dirty(); } } - if (def.maxSize !== null) { - if (ctx.data.size > def.maxSize.value) { + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { addIssueToContext(ctx, { code: ZodIssueCode.too_big, - maximum: def.maxSize.value, - type: "set", + maximum: def.maxLength.value, + type: "array", inclusive: true, - message: def.maxSize.message, + exact: false, + message: def.maxLength.message, }); status.dirty(); } } - const valueType = this._def.valueType; - function finalizeSet(elements) { - const parsedSet = new Set(); - for (const element of elements) { - if (element.status === "aborted") - return INVALID; - if (element.status === "dirty") - status.dirty(); - parsedSet.add(element.value); - } - return { status: status.value, value: parsedSet }; - } - const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); if (ctx.common.async) { - return Promise.all(elements).then((elements) => finalizeSet(elements)); - } - else { - return finalizeSet(elements); + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result) => { + return ParseStatus.mergeArray(status, result); + }); } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); } - min(minSize, message) { - return new ZodSet({ + get element() { + return this._def.type; + } + min(minLength, message) { + return new ZodArray({ ...this._def, - minSize: { value: minSize, message: errorUtil.toString(message) }, + minLength: { value: minLength, message: errorUtil.toString(message) }, }); } - max(maxSize, message) { - return new ZodSet({ + max(maxLength, message) { + return new ZodArray({ ...this._def, - maxSize: { value: maxSize, message: errorUtil.toString(message) }, + maxLength: { value: maxLength, message: errorUtil.toString(message) }, }); } - size(size, message) { - return this.min(size, message).max(size, message); + length(len, message) { + return new ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) }, + }); } nonempty(message) { return this.min(1, message); } } -ZodSet.create = (valueType, params) => { - return new ZodSet({ - valueType, - minSize: null, - maxSize: null, - typeName: ZodFirstPartyTypeKind.ZodSet, +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, ...processCreateParams(params), }); }; -class ZodFunction extends ZodType { +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape, + }); + } + else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element), + }); + } + else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); + } + else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); + } + else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); + } + else { + return schema; + } +} +class ZodObject extends ZodType { constructor() { super(...arguments); - this.validate = this.implement; + this._cached = null; + /** + * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped. + * If you want to pass through unknown properties, use `.passthrough()` instead. + */ + this.nonstrict = this.passthrough; + // extend< + // Augmentation extends ZodRawShape, + // NewOutput extends util.flatten<{ + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }>, + // NewInput extends util.flatten<{ + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // }> + // >( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, + // UnknownKeys, + // Catchall, + // NewOutput, + // NewInput + // > { + // return new ZodObject({ + // ...this._def, + // shape: () => ({ + // ...this._def.shape(), + // ...augmentation, + // }), + // }) as any; + // } + /** + * @deprecated Use `.extend` instead + * */ + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + return (this._cached = { shape, keys }); } _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.function) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.object) { + const ctx = this._getOrReturnCtx(input); addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.function, + expected: ZodParsedType.object, received: ctx.parsedType, }); return INVALID; } - function makeArgsIssue(args, error) { - return makeIssue({ - data: args, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_arguments, - argumentsError: error, - }, - }); + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && + this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); + } + } } - function makeReturnsIssue(returns, error) { - return makeIssue({ - data: returns, - path: ctx.path, - errorMaps: [ - ctx.common.contextualErrorMap, - ctx.schemaErrorMap, - getErrorMap(), - errorMap, - ].filter((x) => !!x), - issueData: { - code: ZodIssueCode.invalid_return_type, - returnTypeError: error, - }, + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data, }); } - const params = { errorMap: ctx.common.contextualErrorMap }; - const fn = ctx.data; - if (this._def.returns instanceof ZodPromise) { - return OK(async (...args) => { - const error = new ZodError([]); - const parsedArgs = await this._def.args - .parseAsync(args, params) - .catch((e) => { - error.addIssue(makeArgsIssue(args, e)); - throw error; - }); - const result = await fn(...parsedArgs); - const parsedReturns = await this._def.returns._def.type - .parseAsync(result, params) - .catch((e) => { - error.addIssue(makeReturnsIssue(result, e)); - throw error; - }); - return parsedReturns; - }); + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] }, + }); + } + } + else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { + addIssueToContext(ctx, { + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys, + }); + status.dirty(); + } + } + else if (unknownKeys === "strip") ; + else { + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); + } } else { - return OK((...args) => { - const parsedArgs = this._def.args.safeParse(args, params); - if (!parsedArgs.success) { - throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); - } - const result = fn(...parsedArgs.data); - const parsedReturns = this._def.returns.safeParse(result, params); - if (!parsedReturns.success) { - throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + // run catchall validation + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data, + }); + } + } + if (ctx.common.async) { + return Promise.resolve() + .then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + syncPairs.push({ + key, + value: await pair.value, + alwaysSet: pair.alwaysSet, + }); } - return parsedReturns.data; + return syncPairs; + }) + .then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); }); } + else { + return ParseStatus.mergeObjectSync(status, pairs); + } } - parameters() { - return this._def.args; + get shape() { + return this._def.shape(); } - returnType() { - return this._def.returns; + strict(message) { + errorUtil.errToObj; + return new ZodObject({ + ...this._def, + unknownKeys: "strict", + ...(message !== undefined + ? { + errorMap: (issue, ctx) => { + var _a, _b, _c, _d; + const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError; + if (issue.code === "unrecognized_keys") + return { + message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError, + }; + return { + message: defaultError, + }; + }, + } + : {}), + }); } - args(...items) { - return new ZodFunction({ + strip() { + return new ZodObject({ ...this._def, - args: ZodTuple.create(items).rest(ZodUnknown.create()), + unknownKeys: "strip", }); } - returns(returnType) { - return new ZodFunction({ + passthrough() { + return new ZodObject({ ...this._def, - returns: returnType, + unknownKeys: "passthrough", }); } - implement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation, + }), + }); } - strictImplement(func) { - const validatedFunc = this.parse(func); - return validatedFunc; + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape(), + }), + typeName: ZodFirstPartyTypeKind.ZodObject, + }); + return merged; } - static create(args, returns, params) { - return new ZodFunction({ - args: (args - ? args - : ZodTuple.create([]).rest(ZodUnknown.create())), - returns: returns || ZodUnknown.create(), - typeName: ZodFirstPartyTypeKind.ZodFunction, - ...processCreateParams(params), + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new ZodObject({ + ...this._def, + catchall: index, }); } -} -class ZodLazy extends ZodType { - get schema() { - return this._def.getter(); + pick(mask) { + const shape = {}; + util.objectKeys(mask).forEach((key) => { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } + }); + return new ZodObject({ + ...this._def, + shape: () => shape, + }); + } + omit(mask) { + const shape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (!mask[key]) { + shape[key] = this.shape[key]; + } + }); + return new ZodObject({ + ...this._def, + shape: () => shape, + }); + } + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); + } + partial(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } + else { + newShape[key] = fieldSchema.optional(); + } + }); + return new ZodObject({ + ...this._def, + shape: () => newShape, + }); + } + required(mask) { + const newShape = {}; + util.objectKeys(this.shape).forEach((key) => { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; + } + else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; + } + }); + return new ZodObject({ + ...this._def, + shape: () => newShape, + }); } - _parse(input) { - const { ctx } = this._processInputParams(input); - const lazySchema = this._def.getter(); - return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); + keyof() { + return createZodEnum(util.objectKeys(this.shape)); } } -ZodLazy.create = (getter, params) => { - return new ZodLazy({ - getter: getter, - typeName: ZodFirstPartyTypeKind.ZodLazy, +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params), }); }; -class ZodLiteral extends ZodType { - _parse(input) { - if (input.data !== this._def.value) { - const ctx = this._getOrReturnCtx(input); - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_literal, - expected: this._def.value, - }); - return INVALID; - } - return { status: "valid", value: input.data }; - } - get value() { - return this._def.value; - } -} -ZodLiteral.create = (value, params) => { - return new ZodLiteral({ - value: value, - typeName: ZodFirstPartyTypeKind.ZodLiteral, +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params), }); }; -function createZodEnum(values, params) { - return new ZodEnum({ - values: values, - typeName: ZodFirstPartyTypeKind.ZodEnum, +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, ...processCreateParams(params), }); -} -class ZodEnum extends ZodType { +}; +class ZodUnion extends ZodType { _parse(input) { - if (typeof input.data !== "string") { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + // return first issue-free validation if it exists + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + // add issues from dirty option + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + // return invalid + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); addIssueToContext(ctx, { - expected: lib_util.joinValues(expectedValues), - received: ctx.parsedType, - code: ZodIssueCode.invalid_type, + code: ZodIssueCode.invalid_union, + unionErrors, }); return INVALID; } - if (this._def.values.indexOf(input.data) === -1) { - const ctx = this._getOrReturnCtx(input); - const expectedValues = this._def.values; + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }), + ctx: childCtx, + }; + })).then(handleResults); + } + else { + let dirty = undefined; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + parent: null, + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx, + }); + if (result.status === "valid") { + return result; + } + else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues) => new ZodError(issues)); addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, + code: ZodIssueCode.invalid_union, + unionErrors, }); return INVALID; } - return OK(input.data); } get options() { - return this._def.values; + return this._def.options; } - get enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; - } - return enumValues; +} +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, + ...processCreateParams(params), + }); +}; +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +////////// ////////// +////////// ZodDiscriminatedUnion ////////// +////////// ////////// +///////////////////////////////////////////////////// +///////////////////////////////////////////////////// +const getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); } - get Values() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; - } - return enumValues; + else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); } - get Enum() { - const enumValues = {}; - for (const val of this._def.values) { - enumValues[val] = val; - } - return enumValues; + else if (type instanceof ZodLiteral) { + return [type.value]; } -} -ZodEnum.create = createZodEnum; -class ZodNativeEnum extends ZodType { + else if (type instanceof ZodEnum) { + return type.options; + } + else if (type instanceof ZodNativeEnum) { + // eslint-disable-next-line ban/ban + return Object.keys(type.enum); + } + else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } + else if (type instanceof ZodUndefined) { + return [undefined]; + } + else if (type instanceof ZodNull) { + return [null]; + } + else { + return null; + } +}; +class ZodDiscriminatedUnion extends ZodType { _parse(input) { - const nativeEnumValues = lib_util.getValidEnumValues(this._def.values); - const ctx = this._getOrReturnCtx(input); - if (ctx.parsedType !== ZodParsedType.string && - ctx.parsedType !== ZodParsedType.number) { - const expectedValues = lib_util.objectValues(nativeEnumValues); + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { addIssueToContext(ctx, { - expected: lib_util.joinValues(expectedValues), - received: ctx.parsedType, code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType, }); return INVALID; } - if (nativeEnumValues.indexOf(input.data) === -1) { - const expectedValues = lib_util.objectValues(nativeEnumValues); + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { addIssueToContext(ctx, { - received: ctx.data, - code: ZodIssueCode.invalid_enum_value, - options: expectedValues, + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator], }); return INVALID; } - return OK(input.data); - } - get enum() { - return this._def.values; - } -} -ZodNativeEnum.create = (values, params) => { - return new ZodNativeEnum({ - values: values, - typeName: ZodFirstPartyTypeKind.ZodNativeEnum, - ...processCreateParams(params), - }); -}; -class ZodPromise extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - if (ctx.parsedType !== ZodParsedType.promise && - ctx.common.async === false) { - addIssueToContext(ctx, { - code: ZodIssueCode.invalid_type, - expected: ZodParsedType.promise, - received: ctx.parsedType, + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, }); - return INVALID; } - const promisified = ctx.parsedType === ZodParsedType.promise - ? ctx.data - : Promise.resolve(ctx.data); - return OK(promisified.then((data) => { - return this._def.type.parseAsync(data, { + else { + return option._parseSync({ + data: ctx.data, path: ctx.path, - errorMap: ctx.common.contextualErrorMap, + parent: ctx, }); - })); + } } -} -ZodPromise.create = (schema, params) => { - return new ZodPromise({ - type: schema, - typeName: ZodFirstPartyTypeKind.ZodPromise, - ...processCreateParams(params), - }); -}; -class ZodEffects extends ZodType { - innerType() { - return this._def.schema; + get discriminator() { + return this._def.discriminator; } - _parse(input) { - const { status, ctx } = this._processInputParams(input); - const effect = this._def.effect || null; - if (effect.type === "preprocess") { - const processed = effect.transform(ctx.data); - if (ctx.common.async) { - return Promise.resolve(processed).then((processed) => { - return this._def.schema._parseAsync({ - data: processed, - path: ctx.path, - parent: ctx, - }); - }); - } - else { - return this._def.schema._parseSync({ - data: processed, - path: ctx.path, - parent: ctx, - }); + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + // Get all the valid discriminator values + const optionsMap = new Map(); + // try { + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); } - } - const checkCtx = { - addIssue: (arg) => { - addIssueToContext(ctx, arg); - if (arg.fatal) { - status.abort(); - } - else { - status.dirty(); - } - }, - get path() { - return ctx.path; - }, - }; - checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); - if (effect.type === "refinement") { - const executeRefinement = (acc - // effect: RefinementEffect - ) => { - const result = effect.refinement(acc, checkCtx); - if (ctx.common.async) { - return Promise.resolve(result); - } - if (result instanceof Promise) { - throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); } - return acc; - }; - if (ctx.common.async === false) { - const inner = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - // return value is ignored - executeRefinement(inner.value); - return { status: status.value, value: inner.value }; - } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((inner) => { - if (inner.status === "aborted") - return INVALID; - if (inner.status === "dirty") - status.dirty(); - return executeRefinement(inner.value).then(() => { - return { status: status.value, value: inner.value }; - }); - }); + optionsMap.set(value, type); } } - if (effect.type === "transform") { - if (ctx.common.async === false) { - const base = this._def.schema._parseSync({ - data: ctx.data, - path: ctx.path, - parent: ctx, - }); - // if (base.status === "aborted") return INVALID; - // if (base.status === "dirty") { - // return { status: "dirty", value: base.value }; - // } - if (!isValid(base)) - return base; - const result = effect.transform(base.value, checkCtx); - if (result instanceof Promise) { - throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); - } - return { status: status.value, value: result }; - } - else { - return this._def.schema - ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) - .then((base) => { - if (!isValid(base)) - return base; - // if (base.status === "aborted") return INVALID; - // if (base.status === "dirty") { - // return { status: "dirty", value: base.value }; - // } - return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); - }); + return new ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params), + }); + } +} +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; + } + else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util + .objectKeys(a) + .filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; } + newObj[key] = sharedValue.data; } - lib_util.assertNever(effect); + return { valid: true, data: newObj }; } -} -ZodEffects.create = (schema, effect, params) => { - return new ZodEffects({ - schema, - typeName: ZodFirstPartyTypeKind.ZodEffects, - effect, - ...processCreateParams(params), - }); -}; -ZodEffects.createWithPreprocess = (preprocess, schema, params) => { - return new ZodEffects({ - schema, - effect: { type: "preprocess", transform: preprocess }, - typeName: ZodFirstPartyTypeKind.ZodEffects, - ...processCreateParams(params), - }); -}; -class ZodOptional extends ZodType { - _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.undefined) { - return OK(undefined); + else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; } - return this._def.innerType._parse(input); + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; } - unwrap() { - return this._def.innerType; + else if (aType === ZodParsedType.date && + bType === ZodParsedType.date && + +a === +b) { + return { valid: true, data: a }; + } + else { + return { valid: false }; } } -ZodOptional.create = (type, params) => { - return new ZodOptional({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodOptional, - ...processCreateParams(params), - }); -}; -class ZodNullable extends ZodType { +class ZodIntersection extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType === ZodParsedType.null) { - return OK(null); + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types, + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); + } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), + ]).then(([left, right]) => handleParsed(left, right)); } - return this._def.innerType._parse(input); - } - unwrap() { - return this._def.innerType; - } -} -ZodNullable.create = (type, params) => { - return new ZodNullable({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodNullable, - ...processCreateParams(params), - }); -}; -class ZodDefault extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - let data = ctx.data; - if (ctx.parsedType === ZodParsedType.undefined) { - data = this._def.defaultValue(); + else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + })); } - return this._def.innerType._parse({ - data, - path: ctx.path, - parent: ctx, - }); - } - removeDefault() { - return this._def.innerType; } } -ZodDefault.create = (type, params) => { - return new ZodOptional({ - innerType: type, - typeName: ZodFirstPartyTypeKind.ZodOptional, +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left: left, + right: right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, ...processCreateParams(params), }); }; -class ZodNaN extends ZodType { +class ZodTuple extends ZodType { _parse(input) { - const parsedType = this._getType(input); - if (parsedType !== ZodParsedType.nan) { - const ctx = this._getOrReturnCtx(input); + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { addIssueToContext(ctx, { code: ZodIssueCode.invalid_type, - expected: ZodParsedType.nan, + expected: ZodParsedType.array, received: ctx.parsedType, }); return INVALID; } - return { status: "valid", value: input.data }; - } -} -ZodNaN.create = (params) => { - return new ZodNaN({ - typeName: ZodFirstPartyTypeKind.ZodNaN, - ...processCreateParams(params), - }); -}; -const BRAND = Symbol("zod_brand"); -class ZodBranded extends ZodType { - _parse(input) { - const { ctx } = this._processInputParams(input); - const data = ctx.data; - return this._def.type._parse({ - data, - path: ctx.path, - parent: ctx, - }); + if (ctx.data.length < this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", + }); + return INVALID; + } + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array", + }); + status.dirty(); + } + const items = [...ctx.data] + .map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }) + .filter((x) => !!x); // filter nulls + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } + else { + return ParseStatus.mergeArray(status, items); + } } - unwrap() { - return this._def.type; + get items() { + return this._def.items; } -} -const custom = (check, params = {}, fatal) => { - if (check) - return ZodAny.create().superRefine((data, ctx) => { - if (!check(data)) { - const p = typeof params === "function" ? params(data) : params; - const p2 = typeof p === "string" ? { message: p } : p; - ctx.addIssue({ code: "custom", ...p2, fatal }); - } + rest(rest) { + return new ZodTuple({ + ...this._def, + rest, }); - return ZodAny.create(); -}; -const late = { - object: ZodObject.lazycreate, -}; -var ZodFirstPartyTypeKind; -(function (ZodFirstPartyTypeKind) { - ZodFirstPartyTypeKind["ZodString"] = "ZodString"; - ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; - ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; - ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; - ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; - ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; - ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; - ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; - ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; - ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; - ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; - ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; - ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; - ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; - ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; - ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; - ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; - ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; - ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; - ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; - ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; - ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; - ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; - ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; - ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; - ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; - ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; - ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; - ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; - ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; - ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; - ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; -})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); -// new approach that works for abstract classes -// but required TS 4.4+ -// abstract class Class { -// constructor(..._: any[]) {} -// } -// const instanceOfType = ( -const instanceOfType = (cls, params = { - message: `Input not instance of ${cls.name}`, -}) => custom((data) => data instanceof cls, params, true); -const stringType = ZodString.create; -const numberType = ZodNumber.create; -const nanType = ZodNaN.create; -const bigIntType = ZodBigInt.create; -const booleanType = ZodBoolean.create; -const dateType = ZodDate.create; -const undefinedType = ZodUndefined.create; -const nullType = ZodNull.create; -const anyType = ZodAny.create; -const unknownType = ZodUnknown.create; -const neverType = ZodNever.create; -const voidType = ZodVoid.create; -const arrayType = ZodArray.create; -const objectType = ZodObject.create; -const strictObjectType = ZodObject.strictCreate; -const unionType = ZodUnion.create; -const discriminatedUnionType = ZodDiscriminatedUnion.create; -const intersectionType = ZodIntersection.create; -const tupleType = ZodTuple.create; -const recordType = ZodRecord.create; -const mapType = ZodMap.create; -const setType = ZodSet.create; -const functionType = ZodFunction.create; -const lazyType = ZodLazy.create; -const literalType = ZodLiteral.create; -const enumType = ZodEnum.create; -const nativeEnumType = ZodNativeEnum.create; -const promiseType = ZodPromise.create; -const effectsType = ZodEffects.create; -const optionalType = ZodOptional.create; -const nullableType = ZodNullable.create; -const preprocessType = ZodEffects.createWithPreprocess; -const ostring = () => stringType().optional(); -const onumber = () => numberType().optional(); -const oboolean = () => booleanType().optional(); -const NEVER = INVALID; - -var mod = /*#__PURE__*/Object.freeze({ - __proto__: null, - getParsedType: getParsedType, - ZodParsedType: ZodParsedType, - defaultErrorMap: errorMap, - setErrorMap: setErrorMap, - getErrorMap: getErrorMap, - makeIssue: makeIssue, - EMPTY_PATH: EMPTY_PATH, - addIssueToContext: addIssueToContext, - ParseStatus: ParseStatus, - INVALID: INVALID, - DIRTY: DIRTY, - OK: OK, - isAborted: isAborted, - isDirty: isDirty, - isValid: isValid, - isAsync: isAsync, - ZodType: ZodType, - ZodString: ZodString, - ZodNumber: ZodNumber, - ZodBigInt: ZodBigInt, - ZodBoolean: ZodBoolean, - ZodDate: ZodDate, - ZodUndefined: ZodUndefined, - ZodNull: ZodNull, - ZodAny: ZodAny, - ZodUnknown: ZodUnknown, - ZodNever: ZodNever, - ZodVoid: ZodVoid, - ZodArray: ZodArray, - get objectUtil () { return objectUtil; }, - ZodObject: ZodObject, - ZodUnion: ZodUnion, - ZodDiscriminatedUnion: ZodDiscriminatedUnion, - ZodIntersection: ZodIntersection, - ZodTuple: ZodTuple, - ZodRecord: ZodRecord, - ZodMap: ZodMap, - ZodSet: ZodSet, - ZodFunction: ZodFunction, - ZodLazy: ZodLazy, - ZodLiteral: ZodLiteral, - ZodEnum: ZodEnum, - ZodNativeEnum: ZodNativeEnum, - ZodPromise: ZodPromise, - ZodEffects: ZodEffects, - ZodTransformer: ZodEffects, - ZodOptional: ZodOptional, - ZodNullable: ZodNullable, - ZodDefault: ZodDefault, - ZodNaN: ZodNaN, - BRAND: BRAND, - ZodBranded: ZodBranded, - custom: custom, - Schema: ZodType, - ZodSchema: ZodType, - late: late, - get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, - any: anyType, - array: arrayType, - bigint: bigIntType, - boolean: booleanType, - date: dateType, - discriminatedUnion: discriminatedUnionType, - effect: effectsType, - 'enum': enumType, - 'function': functionType, - 'instanceof': instanceOfType, - intersection: intersectionType, - lazy: lazyType, - literal: literalType, - map: mapType, - nan: nanType, - nativeEnum: nativeEnumType, - never: neverType, - 'null': nullType, - nullable: nullableType, - number: numberType, - object: objectType, - oboolean: oboolean, - onumber: onumber, - optional: optionalType, - ostring: ostring, - preprocess: preprocessType, - promise: promiseType, - record: recordType, - set: setType, - strictObject: strictObjectType, - string: stringType, - transformer: effectsType, - tuple: tupleType, - 'undefined': undefinedType, - union: unionType, - unknown: unknownType, - 'void': voidType, - NEVER: NEVER, - ZodIssueCode: ZodIssueCode, - quotelessJson: quotelessJson, - ZodError: ZodError -}); - - - -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/domain.js -/** - * Check if `vhost` is a valid suffix of `hostname` (top-domain) - * - * It means that `vhost` needs to be a suffix of `hostname` and we then need to - * make sure that: either they are equal, or the character preceding `vhost` in - * `hostname` is a '.' (it should not be a partial label). - * - * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok - * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok - * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok - */ -function domain_shareSameDomainSuffix(hostname, vhost) { - if (hostname.endsWith(vhost)) { - return (hostname.length === vhost.length || - hostname[hostname.length - vhost.length - 1] === '.'); } - return false; } -/** - * Given a hostname and its public suffix, extract the general domain. - */ -function domain_extractDomainWithSuffix(hostname, publicSuffix) { - // Locate the index of the last '.' in the part of the `hostname` preceding - // the public suffix. - // - // examples: - // 1. not.evil.co.uk => evil.co.uk - // ^ ^ - // | | start of public suffix - // | index of the last dot - // - // 2. example.co.uk => example.co.uk - // ^ ^ - // | | start of public suffix - // | - // | (-1) no dot found before the public suffix - const publicSuffixIndex = hostname.length - publicSuffix.length - 2; - const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex); - // No '.' found, then `hostname` is the general domain (no sub-domain) - if (lastDotBeforeSuffixIndex === -1) { - return hostname; +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); } - // Extract the part between the last '.' - return hostname.slice(lastDotBeforeSuffixIndex + 1); -} -/** - * Detects the domain based on rules and upon and a host string - */ -function domain_getDomain(suffix, hostname, options) { - // Check if `hostname` ends with a member of `validHosts`. - if (options.validHosts !== null) { - const validHosts = options.validHosts; - for (let i = 0; i < validHosts.length; i += 1) { - const vhost = validHosts[i]; - if ( /*@__INLINE__*/domain_shareSameDomainSuffix(hostname, vhost) === true) { - return vhost; - } - } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, + ...processCreateParams(params), + }); +}; +class ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; } - // If `hostname` is a valid public suffix, then there is no domain to return. - // Since we already know that `getPublicSuffix` returns a suffix of `hostname` - // there is no need to perform a string comparison and we only compare the - // size. - if (suffix.length === hostname.length) { - return null; + get valueSchema() { + return this._def.valueType; } - // To extract the general domain, we start by identifying the public suffix - // (if any), then consider the domain to be the public suffix with one added - // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix: - // `co.uk`, then we take one more level: `evil`, giving the final result: - // `evil.co.uk`). - return /*@__INLINE__*/ domain_extractDomainWithSuffix(hostname, suffix); -} -//# sourceMappingURL=domain.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/domain-without-suffix.js -/** - * Return the part of domain without suffix. - * - * Example: for domain 'foo.com', the result would be 'foo'. - */ -function domain_without_suffix_getDomainWithoutSuffix(domain, suffix) { - // Note: here `domain` and `suffix` cannot have the same length because in - // this case we set `domain` to `null` instead. It is thus safe to assume - // that `suffix` is shorter than `domain`. - return domain.slice(0, -suffix.length - 1); -} -//# sourceMappingURL=domain-without-suffix.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/extract-hostname.js -/** - * @param url - URL we want to extract a hostname from. - * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname. - */ -function extract_hostname_extractHostname(url, urlIsValidHostname) { - let start = 0; - let end = url.length; - let hasUpper = false; - // If url is not already a valid hostname, then try to extract hostname. - if (urlIsValidHostname === false) { - // Special handling of data URLs - if (url.startsWith('data:') === true) { - return null; - } - // Trim leading spaces - while (start < url.length && url.charCodeAt(start) <= 32) { - start += 1; + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType, + }); + return INVALID; } - // Trim trailing spaces - while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { - end -= 1; + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + }); } - // Skip scheme. - if (url.charCodeAt(start) === 47 /* '/' */ && - url.charCodeAt(start + 1) === 47 /* '/' */) { - start += 2; + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); } else { - const indexOfProtocol = url.indexOf(':/', start); - if (indexOfProtocol !== -1) { - // Implement fast-path for common protocols. We expect most protocols - // should be one of these 4 and thus we will not need to perform the - // more expansive validity check most of the time. - const protocolSize = indexOfProtocol - start; - const c0 = url.charCodeAt(start); - const c1 = url.charCodeAt(start + 1); - const c2 = url.charCodeAt(start + 2); - const c3 = url.charCodeAt(start + 3); - const c4 = url.charCodeAt(start + 4); - if (protocolSize === 5 && - c0 === 104 /* 'h' */ && - c1 === 116 /* 't' */ && - c2 === 116 /* 't' */ && - c3 === 112 /* 'p' */ && - c4 === 115 /* 's' */) { - // https - } - else if (protocolSize === 4 && - c0 === 104 /* 'h' */ && - c1 === 116 /* 't' */ && - c2 === 116 /* 't' */ && - c3 === 112 /* 'p' */) { - // http - } - else if (protocolSize === 3 && - c0 === 119 /* 'w' */ && - c1 === 115 /* 's' */ && - c2 === 115 /* 's' */) { - // wss - } - else if (protocolSize === 2 && - c0 === 119 /* 'w' */ && - c1 === 115 /* 's' */) { - // ws - } - else { - // Check that scheme is valid - for (let i = start; i < indexOfProtocol; i += 1) { - const lowerCaseCode = url.charCodeAt(i) | 32; - if (((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z] - (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9] - lowerCaseCode === 46 || // '.' - lowerCaseCode === 45 || // '-' - lowerCaseCode === 43) === false // '+' - ) { - return null; - } + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get element() { + return this._def.valueType; + } + static create(first, second, third) { + if (second instanceof ZodType) { + return new ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third), + }); + } + return new ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second), + }); + } +} +class ZodMap extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.map, + received: ctx.parsedType, + }); + return INVALID; + } + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])), + }; + }); + if (ctx.common.async) { + const finalMap = new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); } + finalMap.set(key.value, value.value); } - // Skip 0, 1 or more '/' after ':/' - start = indexOfProtocol + 2; - while (url.charCodeAt(start) === 47 /* '/' */) { - start += 1; + return { status: status.value, value: finalMap }; + }); + } + else { + const finalMap = new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); } + finalMap.set(key.value, value.value); } + return { status: status.value, value: finalMap }; } - // Detect first occurrence of '/', '?' or '#'. We also keep track of the - // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of - // (respectively), identifier, ipv6 or port. - let indexOfIdentifier = -1; - let indexOfClosingBracket = -1; - let indexOfPort = -1; - for (let i = start; i < end; i += 1) { - const code = url.charCodeAt(i); - if (code === 35 || // '#' - code === 47 || // '/' - code === 63 // '?' - ) { - end = i; - break; - } - else if (code === 64) { - // '@' - indexOfIdentifier = i; - } - else if (code === 93) { - // ']' - indexOfClosingBracket = i; - } - else if (code === 58) { - // ':' - indexOfPort = i; - } - else if (code >= 65 && code <= 90) { - hasUpper = true; + } +} +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, + ...processCreateParams(params), + }); +}; +class ZodSet extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.set, + received: ctx.parsedType, + }); + return INVALID; + } + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.minSize.message, + }); + status.dirty(); } } - // Detect identifier: '@' - if (indexOfIdentifier !== -1 && - indexOfIdentifier > start && - indexOfIdentifier < end) { - start = indexOfIdentifier + 1; + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.maxSize.message, + }); + status.dirty(); + } } - // Handle ipv6 addresses - if (url.charCodeAt(start) === 91 /* '[' */) { - if (indexOfClosingBracket !== -1) { - return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); + const valueType = this._def.valueType; + function finalizeSet(elements) { + const parsedSet = new Set(); + for (const element of elements) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); } - return null; + return { status: status.value, value: parsedSet }; } - else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { - // Detect port: ':' - end = indexOfPort; + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); + if (ctx.common.async) { + return Promise.all(elements).then((elements) => finalizeSet(elements)); + } + else { + return finalizeSet(elements); } } - // Trim trailing dots - while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) { - end -= 1; + min(minSize, message) { + return new ZodSet({ + ...this._def, + minSize: { value: minSize, message: errorUtil.toString(message) }, + }); } - const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; - if (hasUpper) { - return hostname.toLowerCase(); + max(maxSize, message) { + return new ZodSet({ + ...this._def, + maxSize: { value: maxSize, message: errorUtil.toString(message) }, + }); } - return hostname; -} -//# sourceMappingURL=extract-hostname.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/is-ip.js -/** - * Check if a hostname is an IP. You should be aware that this only works - * because `hostname` is already garanteed to be a valid hostname! - */ -function is_ip_isProbablyIpv4(hostname) { - // Cannot be shorted than 1.1.1.1 - if (hostname.length < 7) { - return false; + size(size, message) { + return this.min(size, message).max(size, message); } - // Cannot be longer than: 255.255.255.255 - if (hostname.length > 15) { - return false; + nonempty(message) { + return this.min(1, message); } - let numberOfDots = 0; - for (let i = 0; i < hostname.length; i += 1) { - const code = hostname.charCodeAt(i); - if (code === 46 /* '.' */) { - numberOfDots += 1; +} +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, + ...processCreateParams(params), + }); +}; +class ZodFunction extends ZodType { + constructor() { + super(...arguments); + this.validate = this.implement; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.function, + received: ctx.parsedType, + }); + return INVALID; } - else if (code < 48 /* '0' */ || code > 57 /* '9' */) { - return false; + function makeArgsIssue(args, error) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error, + }, + }); + } + function makeReturnsIssue(returns, error) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + ctx.schemaErrorMap, + getErrorMap(), + errorMap, + ].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error, + }, + }); + } + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + return OK(async (...args) => { + const error = new ZodError([]); + const parsedArgs = await this._def.args + .parseAsync(args, params) + .catch((e) => { + error.addIssue(makeArgsIssue(args, e)); + throw error; + }); + const result = await fn(...parsedArgs); + const parsedReturns = await this._def.returns._def.type + .parseAsync(result, params) + .catch((e) => { + error.addIssue(makeReturnsIssue(result, e)); + throw error; + }); + return parsedReturns; + }); + } + else { + return OK((...args) => { + const parsedArgs = this._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + } + const result = fn(...parsedArgs.data); + const parsedReturns = this._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); } } - return (numberOfDots === 3 && - hostname.charCodeAt(0) !== 46 /* '.' */ && - hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */); -} -/** - * Similar to isProbablyIpv4. - */ -function is_ip_isProbablyIpv6(hostname) { - if (hostname.length < 3) { - return false; - } - let start = hostname[0] === '[' ? 1 : 0; - let end = hostname.length; - if (hostname[end - 1] === ']') { - end -= 1; + parameters() { + return this._def.args; } - // We only consider the maximum size of a normal IPV6. Note that this will - // fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case - // and a proper validation library should be used for these. - if (end - start > 39) { - return false; + returnType() { + return this._def.returns; } - let hasColon = false; - for (; start < end; start += 1) { - const code = hostname.charCodeAt(start); - if (code === 58 /* ':' */) { - hasColon = true; - } - else if (((code >= 48 && code <= 57) || // 0-9 - (code >= 97 && code <= 102) || // a-f - (code >= 65 && code <= 90)) === // A-F - false) { - return false; - } + args(...items) { + return new ZodFunction({ + ...this._def, + args: ZodTuple.create(items).rest(ZodUnknown.create()), + }); } - return hasColon; -} -/** - * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4). - * This *will not* work on any string. We need `hostname` to be a valid - * hostname. - */ -function is_ip_isIp(hostname) { - return is_ip_isProbablyIpv6(hostname) || is_ip_isProbablyIpv4(hostname); -} -//# sourceMappingURL=is-ip.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/is-valid.js -/** - * Implements fast shallow verification of hostnames. This does not perform a - * struct check on the content of labels (classes of Unicode characters, etc.) - * but instead check that the structure is valid (number of labels, length of - * labels, etc.). - * - * If you need stricter validation, consider using an external library. - */ -function is_valid_isValidAscii(code) { - return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127); -} -/** - * Check if a hostname string is valid. It's usually a preliminary check before - * trying to use getDomain or anything else. - * - * Beware: it does not check if the TLD exists. - */ -/* harmony default export */ function is_valid(hostname) { - if (hostname.length > 255) { - return false; + returns(returnType) { + return new ZodFunction({ + ...this._def, + returns: returnType, + }); } - if (hostname.length === 0) { - return false; + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - if ( /*@__INLINE__*/is_valid_isValidAscii(hostname.charCodeAt(0)) === false) { - return false; + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; } - // Validate hostname according to RFC - let lastDotIndex = -1; - let lastCharCode = -1; - const len = hostname.length; - for (let i = 0; i < len; i += 1) { - const code = hostname.charCodeAt(i); - if (code === 46 /* '.' */) { - if ( - // Check that previous label is < 63 bytes long (64 = 63 + '.') - i - lastDotIndex > 64 || - // Check that previous character was not already a '.' - lastCharCode === 46 || - // Check that the previous label does not end with a '-' (dash) - lastCharCode === 45 || - // Check that the previous label does not end with a '_' (underscore) - lastCharCode === 95) { - return false; - } - lastDotIndex = i; - } - else if (( /*@__INLINE__*/is_valid_isValidAscii(code) || code === 45 || code === 95) === - false) { - // Check if there is a forbidden character in the label - return false; - } - lastCharCode = code; + static create(args, returns, params) { + return new ZodFunction({ + args: (args + ? args + : ZodTuple.create([]).rest(ZodUnknown.create())), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params), + }); } - return ( - // Check that last label is shorter than 63 chars - len - lastDotIndex - 1 <= 63 && - // Check that the last character is an allowed trailing label character. - // Since we already checked that the char is a valid hostname character, - // we only need to check that it's different from '-'. - lastCharCode !== 45); -} -//# sourceMappingURL=is-valid.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/options.js -function options_setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) { - return { - allowIcannDomains, - allowPrivateDomains, - detectIp, - extractHostname, - mixedInputs, - validHosts, - validateHostname, - }; } -const options_DEFAULT_OPTIONS = /*@__INLINE__*/ options_setDefaultsImpl({}); -function options_setDefaults(options) { - if (options === undefined) { - return options_DEFAULT_OPTIONS; +class ZodLazy extends ZodType { + get schema() { + return this._def.getter(); } - return /*@__INLINE__*/ options_setDefaultsImpl(options); -} -//# sourceMappingURL=options.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/subdomain.js -/** - * Returns the subdomain of a hostname string - */ -function subdomain_getSubdomain(hostname, domain) { - // If `hostname` and `domain` are the same, then there is no sub-domain - if (domain.length === hostname.length) { - return ''; + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); } - return hostname.slice(0, -domain.length - 1); -} -//# sourceMappingURL=subdomain.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/factory.js -/** - * Implement a factory allowing to plug different implementations of suffix - * lookup (e.g.: using a trie or the packed hashes datastructures). This is used - * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints. - */ - - - - - - - -function factory_getEmptyResult() { - return { - domain: null, - domainWithoutSuffix: null, - hostname: null, - isIcann: null, - isIp: null, - isPrivate: null, - publicSuffix: null, - subdomain: null, - }; -} -function factory_resetResult(result) { - result.domain = null; - result.domainWithoutSuffix = null; - result.hostname = null; - result.isIcann = null; - result.isIp = null; - result.isPrivate = null; - result.publicSuffix = null; - result.subdomain = null; } -function factory_parseImpl(url, step, suffixLookup, partialOptions, result) { - const options = /*@__INLINE__*/ options_setDefaults(partialOptions); - // Very fast approximate check to make sure `url` is a string. This is needed - // because the library will not necessarily be used in a typed setup and - // values of arbitrary types might be given as argument. - if (typeof url !== 'string') { - return result; - } - // Extract hostname from `url` only if needed. This can be made optional - // using `options.extractHostname`. This option will typically be used - // whenever we are sure the inputs to `parse` are already hostnames and not - // arbitrary URLs. - // - // `mixedInput` allows to specify if we expect a mix of URLs and hostnames - // as input. If only hostnames are expected then `extractHostname` can be - // set to `false` to speed-up parsing. If only URLs are expected then - // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint - // and will not change the behavior of the library. - if (options.extractHostname === false) { - result.hostname = url; +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter: getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, + ...processCreateParams(params), + }); +}; +class ZodLiteral extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value, + }); + return INVALID; + } + return { status: "valid", value: input.data }; } - else if (options.mixedInputs === true) { - result.hostname = extract_hostname_extractHostname(url, is_valid(url)); + get value() { + return this._def.value; } - else { - result.hostname = extract_hostname_extractHostname(url, false); +} +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value: value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, + ...processCreateParams(params), + }); +}; +function createZodEnum(values, params) { + return new ZodEnum({ + values: values, + typeName: ZodFirstPartyTypeKind.ZodEnum, + ...processCreateParams(params), + }); +} +class ZodEnum extends ZodType { + _parse(input) { + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, + }); + return INVALID; + } + if (this._def.values.indexOf(input.data) === -1) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, + }); + return INVALID; + } + return OK(input.data); } - if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) { - return result; + get options() { + return this._def.values; } - // Check if `hostname` is a valid ip address - if (options.detectIp === true) { - result.isIp = is_ip_isIp(result.hostname); - if (result.isIp === true) { - return result; + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; } + return enumValues; } - // Perform optional hostname validation. If hostname is not valid, no need to - // go further as there will be no valid domain or sub-domain. - if (options.validateHostname === true && - options.extractHostname === true && - is_valid(result.hostname) === false) { - result.hostname = null; - return result; + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; } - // Extract public suffix - suffixLookup(result.hostname, options, result); - if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) { - return result; + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; } - // Extract domain - result.domain = domain_getDomain(result.publicSuffix, result.hostname, options); - if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) { - return result; + extract(values) { + return ZodEnum.create(values); } - // Extract subdomain - result.subdomain = subdomain_getSubdomain(result.hostname, result.domain); - if (step === 4 /* FLAG.SUB_DOMAIN */) { - return result; + exclude(values) { + return ZodEnum.create(this.options.filter((opt) => !values.includes(opt))); } - // Extract domain without suffix - result.domainWithoutSuffix = domain_without_suffix_getDomainWithoutSuffix(result.domain, result.publicSuffix); - return result; } -//# sourceMappingURL=factory.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/src/lookup/fast-path.js -/* harmony default export */ function fast_path(hostname, options, out) { - // Fast path for very popular suffixes; this allows to by-pass lookup - // completely as well as any extra allocation or string manipulation. - if (options.allowPrivateDomains === false && hostname.length > 3) { - const last = hostname.length - 1; - const c3 = hostname.charCodeAt(last); - const c2 = hostname.charCodeAt(last - 1); - const c1 = hostname.charCodeAt(last - 2); - const c0 = hostname.charCodeAt(last - 3); - if (c3 === 109 /* 'm' */ && - c2 === 111 /* 'o' */ && - c1 === 99 /* 'c' */ && - c0 === 46 /* '.' */) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'com'; - return true; +ZodEnum.create = createZodEnum; +class ZodNativeEnum extends ZodType { + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && + ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type, + }); + return INVALID; } - else if (c3 === 103 /* 'g' */ && - c2 === 114 /* 'r' */ && - c1 === 111 /* 'o' */ && - c0 === 46 /* '.' */) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'org'; - return true; + if (nativeEnumValues.indexOf(input.data) === -1) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues, + }); + return INVALID; } - else if (c3 === 117 /* 'u' */ && - c2 === 100 /* 'd' */ && - c1 === 101 /* 'e' */ && - c0 === 46 /* '.' */) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'edu'; - return true; + return OK(input.data); + } + get enum() { + return this._def.values; + } +} +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values: values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, + ...processCreateParams(params), + }); +}; +class ZodPromise extends ZodType { + unwrap() { + return this._def.type; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.promise && + ctx.common.async === false) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.promise, + received: ctx.parsedType, + }); + return INVALID; } - else if (c3 === 118 /* 'v' */ && - c2 === 111 /* 'o' */ && - c1 === 103 /* 'g' */ && - c0 === 46 /* '.' */) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'gov'; - return true; + const promisified = ctx.parsedType === ZodParsedType.promise + ? ctx.data + : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { + path: ctx.path, + errorMap: ctx.common.contextualErrorMap, + }); + })); + } +} +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params), + }); +}; +class ZodEffects extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects + ? this._def.schema.sourceType() + : this._def.schema; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const effect = this._def.effect || null; + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data); + if (ctx.common.async) { + return Promise.resolve(processed).then((processed) => { + return this._def.schema._parseAsync({ + data: processed, + path: ctx.path, + parent: ctx, + }); + }); + } + else { + return this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx, + }); + } } - else if (c3 === 116 /* 't' */ && - c2 === 101 /* 'e' */ && - c1 === 110 /* 'n' */ && - c0 === 46 /* '.' */) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'net'; - return true; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } + else { + status.dirty(); + } + }, + get path() { + return ctx.path; + }, + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "refinement") { + const executeRefinement = (acc + // effect: RefinementEffect + ) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + // return value is ignored + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } } - else if (c3 === 101 /* 'e' */ && - c2 === 100 /* 'd' */ && - c1 === 46 /* '.' */) { - out.isIcann = true; - out.isPrivate = false; - out.publicSuffix = 'de'; - return true; + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + if (!isValid(base)) + return base; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } + else { + return this._def.schema + ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }) + .then((base) => { + if (!isValid(base)) + return base; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result })); + }); + } } + util.assertNever(effect); } - return false; } -//# sourceMappingURL=fast-path.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts-core/dist/es6/index.js - - - -//# sourceMappingURL=index.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts/dist/es6/src/data/trie.js -const trie_exceptions = (function () { - const _0 = { "$": 1, "succ": {} }, _1 = { "$": 0, "succ": { "city": _0 } }; - const exceptions = { "$": 0, "succ": { "ck": { "$": 0, "succ": { "www": _0 } }, "jp": { "$": 0, "succ": { "kawasaki": _1, "kitakyushu": _1, "kobe": _1, "nagoya": _1, "sapporo": _1, "sendai": _1, "yokohama": _1 } } } }; - ; - return exceptions; -})(); -const trie_rules = (function () { - const _2 = { "$": 1, "succ": {} }, _3 = { "$": 2, "succ": {} }, _4 = { "$": 1, "succ": { "gov": _2, "com": _2, "org": _2, "net": _2, "edu": _2 } }, _5 = { "$": 0, "succ": { "*": _3 } }, _6 = { "$": 1, "succ": { "blogspot": _3 } }, _7 = { "$": 1, "succ": { "gov": _2 } }, _8 = { "$": 0, "succ": { "*": _2 } }, _9 = { "$": 0, "succ": { "cloud": _3 } }, _10 = { "$": 1, "succ": { "co": _3 } }, _11 = { "$": 2, "succ": { "nodes": _3 } }, _12 = { "$": 0, "succ": { "s3": _3 } }, _13 = { "$": 0, "succ": { "direct": _3 } }, _14 = { "$": 2, "succ": { "id": _3 } }, _15 = { "$": 0, "succ": { "vfs": _3, "webview-assets": _3 } }, _16 = { "$": 0, "succ": { "cloud9": _15 } }, _17 = { "$": 0, "succ": { "dualstack": _12, "cloud9": _15 } }, _18 = { "$": 0, "succ": { "dualstack": _12, "s3": _3, "s3-website": _3, "cloud9": _15 } }, _19 = { "$": 0, "succ": { "apps": _3 } }, _20 = { "$": 0, "succ": { "paas": _3 } }, _21 = { "$": 0, "succ": { "app": _3 } }, _22 = { "$": 2, "succ": { "eu": _3 } }, _23 = { "$": 0, "succ": { "site": _3 } }, _24 = { "$": 0, "succ": { "pages": _3 } }, _25 = { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2 } }, _26 = { "$": 0, "succ": { "j": _3 } }, _27 = { "$": 0, "succ": { "jelastic": _3 } }, _28 = { "$": 0, "succ": { "user": _3 } }, _29 = { "$": 1, "succ": { "ybo": _3 } }, _30 = { "$": 0, "succ": { "cust": _3, "reservd": _3 } }, _31 = { "$": 0, "succ": { "cust": _3 } }, _32 = { "$": 1, "succ": { "gov": _2, "edu": _2, "mil": _2, "com": _2, "org": _2, "net": _2 } }, _33 = { "$": 1, "succ": { "edu": _2, "biz": _2, "net": _2, "org": _2, "gov": _2, "info": _2, "com": _2 } }, _34 = { "$": 1, "succ": { "gov": _2, "blogspot": _3 } }, _35 = { "$": 1, "succ": { "framer": _3 } }, _36 = { "$": 1, "succ": { "barsy": _3 } }, _37 = { "$": 0, "succ": { "forgot": _3 } }, _38 = { "$": 1, "succ": { "gs": _2 } }, _39 = { "$": 0, "succ": { "nes": _2 } }, _40 = { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _2 } }, _41 = { "$": 1, "succ": { "cc": _2, "lib": _2 } }; - const rules = { "$": 0, "succ": { "ac": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "mil": _2, "org": _2, "drr": _3 } }, "ad": { "$": 1, "succ": { "nom": _2 } }, "ae": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "sch": _2, "ac": _2, "gov": _2, "mil": _2, "blogspot": _3 } }, "aero": { "$": 1, "succ": { "accident-investigation": _2, "accident-prevention": _2, "aerobatic": _2, "aeroclub": _2, "aerodrome": _2, "agents": _2, "aircraft": _2, "airline": _2, "airport": _2, "air-surveillance": _2, "airtraffic": _2, "air-traffic-control": _2, "ambulance": _2, "amusement": _2, "association": _2, "author": _2, "ballooning": _2, "broker": _2, "caa": _2, "cargo": _2, "catering": _2, "certification": _2, "championship": _2, "charter": _2, "civilaviation": _2, "club": _2, "conference": _2, "consultant": _2, "consulting": _2, "control": _2, "council": _2, "crew": _2, "design": _2, "dgca": _2, "educator": _2, "emergency": _2, "engine": _2, "engineer": _2, "entertainment": _2, "equipment": _2, "exchange": _2, "express": _2, "federation": _2, "flight": _2, "fuel": _2, "gliding": _2, "government": _2, "groundhandling": _2, "group": _2, "hanggliding": _2, "homebuilt": _2, "insurance": _2, "journal": _2, "journalist": _2, "leasing": _2, "logistics": _2, "magazine": _2, "maintenance": _2, "media": _2, "microlight": _2, "modelling": _2, "navigation": _2, "parachuting": _2, "paragliding": _2, "passenger-association": _2, "pilot": _2, "press": _2, "production": _2, "recreation": _2, "repbody": _2, "res": _2, "research": _2, "rotorcraft": _2, "safety": _2, "scientist": _2, "services": _2, "show": _2, "skydiving": _2, "software": _2, "student": _2, "trader": _2, "trading": _2, "trainer": _2, "union": _2, "workinggroup": _2, "works": _2 } }, "af": _4, "ag": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "co": _2, "nom": _2 } }, "ai": { "$": 1, "succ": { "off": _2, "com": _2, "net": _2, "org": _2, "uwu": _3 } }, "al": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "blogspot": _3 } }, "am": { "$": 1, "succ": { "co": _2, "com": _2, "commune": _2, "net": _2, "org": _2, "radio": _3, "blogspot": _3, "neko": _3, "nyaa": _3 } }, "ao": { "$": 1, "succ": { "ed": _2, "gv": _2, "og": _2, "co": _2, "pb": _2, "it": _2 } }, "aq": _2, "ar": { "$": 1, "succ": { "bet": _2, "com": _6, "coop": _2, "edu": _2, "gob": _2, "gov": _2, "int": _2, "mil": _2, "musica": _2, "mutual": _2, "net": _2, "org": _2, "senasa": _2, "tur": _2 } }, "arpa": { "$": 1, "succ": { "e164": _2, "in-addr": _2, "ip6": _2, "iris": _2, "uri": _2, "urn": _2 } }, "as": _7, "asia": { "$": 1, "succ": { "cloudns": _3 } }, "at": { "$": 1, "succ": { "ac": { "$": 1, "succ": { "sth": _2 } }, "co": _6, "gv": _2, "or": _2, "funkfeuer": { "$": 0, "succ": { "wien": _3 } }, "futurecms": { "$": 0, "succ": { "*": _3, "ex": _5, "in": _5 } }, "futurehosting": _3, "futuremailing": _3, "ortsinfo": { "$": 0, "succ": { "ex": _5, "kunden": _5 } }, "biz": _3, "info": _3, "123webseite": _3, "priv": _3, "myspreadshop": _3, "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3 } }, "au": { "$": 1, "succ": { "com": { "$": 1, "succ": { "blogspot": _3, "cloudlets": { "$": 0, "succ": { "mel": _3 } }, "myspreadshop": _3 } }, "net": _2, "org": _2, "edu": { "$": 1, "succ": { "act": _2, "catholic": _2, "nsw": { "$": 1, "succ": { "schools": _2 } }, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "gov": { "$": 1, "succ": { "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "asn": _2, "id": _2, "info": _2, "conf": _2, "oz": _2, "act": _2, "nsw": _2, "nt": _2, "qld": _2, "sa": _2, "tas": _2, "vic": _2, "wa": _2 } }, "aw": { "$": 1, "succ": { "com": _2 } }, "ax": { "$": 1, "succ": { "be": _3, "cat": _3, "es": _3, "eu": _3, "gg": _3, "mc": _3, "us": _3, "xy": _3 } }, "az": { "$": 1, "succ": { "com": _2, "net": _2, "int": _2, "gov": _2, "org": _2, "edu": _2, "info": _2, "pp": _2, "mil": _2, "name": _2, "pro": _2, "biz": _2 } }, "ba": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "rs": _3, "blogspot": _3 } }, "bb": { "$": 1, "succ": { "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "store": _2, "tv": _2 } }, "bd": _8, "be": { "$": 1, "succ": { "ac": _2, "webhosting": _3, "blogspot": _3, "interhostsolutions": _9, "kuleuven": { "$": 0, "succ": { "ezproxy": _3 } }, "123website": _3, "myspreadshop": _3, "transurl": _5 } }, "bf": _7, "bg": { "$": 1, "succ": { "0": _2, "1": _2, "2": _2, "3": _2, "4": _2, "5": _2, "6": _2, "7": _2, "8": _2, "9": _2, "a": _2, "b": _2, "c": _2, "d": _2, "e": _2, "f": _2, "g": _2, "h": _2, "i": _2, "j": _2, "k": _2, "l": _2, "m": _2, "n": _2, "o": _2, "p": _2, "q": _2, "r": _2, "s": _2, "t": _2, "u": _2, "v": _2, "w": _2, "x": _2, "y": _2, "z": _2, "blogspot": _3, "barsy": _3 } }, "bh": _4, "bi": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "or": _2, "org": _2 } }, "biz": { "$": 1, "succ": { "activetrail": _3, "cloudns": _3, "jozi": _3, "dyndns": _3, "for-better": _3, "for-more": _3, "for-some": _3, "for-the": _3, "selfip": _3, "webhop": _3, "orx": _3, "mmafan": _3, "myftp": _3, "no-ip": _3, "dscloud": _3 } }, "bj": { "$": 1, "succ": { "africa": _2, "agro": _2, "architectes": _2, "assur": _2, "avocats": _2, "co": _2, "com": _2, "eco": _2, "econo": _2, "edu": _2, "info": _2, "loisirs": _2, "money": _2, "net": _2, "org": _2, "ote": _2, "resto": _2, "restaurant": _2, "tourism": _2, "univ": _2, "blogspot": _3 } }, "bm": _4, "bn": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "co": _3 } }, "bo": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "int": _2, "org": _2, "net": _2, "mil": _2, "tv": _2, "web": _2, "academia": _2, "agro": _2, "arte": _2, "blog": _2, "bolivia": _2, "ciencia": _2, "cooperativa": _2, "democracia": _2, "deporte": _2, "ecologia": _2, "economia": _2, "empresa": _2, "indigena": _2, "industria": _2, "info": _2, "medicina": _2, "movimiento": _2, "musica": _2, "natural": _2, "nombre": _2, "noticias": _2, "patria": _2, "politica": _2, "profesional": _2, "plurinacional": _2, "pueblo": _2, "revista": _2, "salud": _2, "tecnologia": _2, "tksat": _2, "transporte": _2, "wiki": _2 } }, "br": { "$": 1, "succ": { "9guacu": _2, "abc": _2, "adm": _2, "adv": _2, "agr": _2, "aju": _2, "am": _2, "anani": _2, "aparecida": _2, "app": _2, "arq": _2, "art": _2, "ato": _2, "b": _2, "barueri": _2, "belem": _2, "bhz": _2, "bib": _2, "bio": _2, "blog": _2, "bmd": _2, "boavista": _2, "bsb": _2, "campinagrande": _2, "campinas": _2, "caxias": _2, "cim": _2, "cng": _2, "cnt": _2, "com": { "$": 1, "succ": { "blogspot": _3, "virtualcloud": { "$": 0, "succ": { "scale": { "$": 0, "succ": { "users": _3 } } } }, "simplesite": _3 } }, "contagem": _2, "coop": _2, "coz": _2, "cri": _2, "cuiaba": _2, "curitiba": _2, "def": _2, "des": _2, "det": _2, "dev": _2, "ecn": _2, "eco": _2, "edu": _2, "emp": _2, "enf": _2, "eng": _2, "esp": _2, "etc": _2, "eti": _2, "far": _2, "feira": _2, "flog": _2, "floripa": _2, "fm": _2, "fnd": _2, "fortal": _2, "fot": _2, "foz": _2, "fst": _2, "g12": _2, "geo": _2, "ggf": _2, "goiania": _2, "gov": { "$": 1, "succ": { "ac": _2, "al": _2, "am": _2, "ap": _2, "ba": _2, "ce": _2, "df": _2, "es": _2, "go": _2, "ma": _2, "mg": _2, "ms": _2, "mt": _2, "pa": _2, "pb": _2, "pe": _2, "pi": _2, "pr": _2, "rj": _2, "rn": _2, "ro": _2, "rr": _2, "rs": _2, "sc": _2, "se": _2, "sp": _2, "to": _2 } }, "gru": _2, "imb": _2, "ind": _2, "inf": _2, "jab": _2, "jampa": _2, "jdf": _2, "joinville": _2, "jor": _2, "jus": _2, "leg": { "$": 1, "succ": { "ac": _3, "al": _3, "am": _3, "ap": _3, "ba": _3, "ce": _3, "df": _3, "es": _3, "go": _3, "ma": _3, "mg": _3, "ms": _3, "mt": _3, "pa": _3, "pb": _3, "pe": _3, "pi": _3, "pr": _3, "rj": _3, "rn": _3, "ro": _3, "rr": _3, "rs": _3, "sc": _3, "se": _3, "sp": _3, "to": _3 } }, "lel": _2, "log": _2, "londrina": _2, "macapa": _2, "maceio": _2, "manaus": _2, "maringa": _2, "mat": _2, "med": _2, "mil": _2, "morena": _2, "mp": _2, "mus": _2, "natal": _2, "net": _2, "niteroi": _2, "nom": _8, "not": _2, "ntr": _2, "odo": _2, "ong": _2, "org": _2, "osasco": _2, "palmas": _2, "poa": _2, "ppg": _2, "pro": _2, "psc": _2, "psi": _2, "pvh": _2, "qsl": _2, "radio": _2, "rec": _2, "recife": _2, "rep": _2, "ribeirao": _2, "rio": _2, "riobranco": _2, "riopreto": _2, "salvador": _2, "sampa": _2, "santamaria": _2, "santoandre": _2, "saobernardo": _2, "saogonca": _2, "seg": _2, "sjc": _2, "slg": _2, "slz": _2, "sorocaba": _2, "srv": _2, "taxi": _2, "tc": _2, "tec": _2, "teo": _2, "the": _2, "tmp": _2, "trd": _2, "tur": _2, "tv": _2, "udi": _2, "vet": _2, "vix": _2, "vlog": _2, "wiki": _2, "zlg": _2 } }, "bs": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "we": _3 } }, "bt": _4, "bv": _2, "bw": { "$": 1, "succ": { "co": _2, "org": _2 } }, "by": { "$": 1, "succ": { "gov": _2, "mil": _2, "com": _6, "of": _2, "mycloud": _3, "mediatech": _3 } }, "bz": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "za": _3, "gsj": _3 } }, "ca": { "$": 1, "succ": { "ab": _2, "bc": _2, "mb": _2, "nb": _2, "nf": _2, "nl": _2, "ns": _2, "nt": _2, "nu": _2, "on": _2, "pe": _2, "qc": _2, "sk": _2, "yk": _2, "gc": _2, "barsy": _3, "awdev": _5, "co": _3, "blogspot": _3, "no-ip": _3, "myspreadshop": _3 } }, "cat": _2, "cc": { "$": 1, "succ": { "cloudns": _3, "ftpaccess": _3, "game-server": _3, "myphotos": _3, "scrapping": _3, "twmail": _3, "csx": _3, "fantasyleague": _3, "spawn": { "$": 0, "succ": { "instances": _3 } } } }, "cd": _7, "cf": _6, "cg": _2, "ch": { "$": 1, "succ": { "square7": _3, "blogspot": _3, "flow": { "$": 0, "succ": { "ae": { "$": 0, "succ": { "alp1": _3 } }, "appengine": _3 } }, "linkyard-cloud": _3, "dnsking": _3, "gotdns": _3, "123website": _3, "myspreadshop": _3, "firenet": { "$": 0, "succ": { "*": _3, "svc": _5 } }, "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3 } }, "ci": { "$": 1, "succ": { "org": _2, "or": _2, "com": _2, "co": _2, "edu": _2, "ed": _2, "ac": _2, "net": _2, "go": _2, "asso": _2, "xn--aroport-bya": _2, "aéroport": _2, "int": _2, "presse": _2, "md": _2, "gouv": _2, "fin": _3, "nl": _3 } }, "ck": _8, "cl": { "$": 1, "succ": { "co": _2, "gob": _2, "gov": _2, "mil": _2, "blogspot": _3 } }, "cm": { "$": 1, "succ": { "co": _2, "com": _2, "gov": _2, "net": _2 } }, "cn": { "$": 1, "succ": { "ac": _2, "com": { "$": 1, "succ": { "amazonaws": { "$": 0, "succ": { "compute": _5, "cn-north-1": _12, "eb": { "$": 0, "succ": { "cn-north-1": _3, "cn-northwest-1": _3 } }, "elb": _5 } } } }, "edu": _2, "gov": _2, "net": _2, "org": _2, "mil": _2, "xn--55qx5d": _2, "公司": _2, "xn--io0a7i": _2, "网络": _2, "xn--od0alg": _2, "網絡": _2, "ah": _2, "bj": _2, "cq": _2, "fj": _2, "gd": _2, "gs": _2, "gz": _2, "gx": _2, "ha": _2, "hb": _2, "he": _2, "hi": _2, "hl": _2, "hn": _2, "jl": _2, "js": _2, "jx": _2, "ln": _2, "nm": _2, "nx": _2, "qh": _2, "sc": _2, "sd": _2, "sh": _2, "sn": _2, "sx": _2, "tj": _2, "xj": _2, "xz": _2, "yn": _2, "zj": _2, "hk": _2, "mo": _2, "tw": _2, "canva-apps": _3, "instantcloud": _3, "quickconnect": _13 } }, "co": { "$": 1, "succ": { "arts": _2, "com": _6, "edu": _2, "firm": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "rec": _2, "web": _2, "carrd": _3, "crd": _3, "otap": _5, "leadpages": _3, "lpages": _3, "mypi": _3, "n4t": _3, "firewalledreplit": _14, "repl": _14, "supabase": _3 } }, "com": { "$": 1, "succ": { "devcdnaccesso": _5, "adobeaemcloud": { "$": 2, "succ": { "dev": _5 } }, "airkitapps": _3, "airkitapps-au": _3, "aivencloud": _3, "kasserver": _3, "amazonaws": { "$": 0, "succ": { "compute": _5, "compute-1": _5, "us-east-1": { "$": 2, "succ": { "dualstack": _12, "cloud9": _15 } }, "ap-northeast-1": _17, "ap-northeast-2": _18, "ap-south-1": _18, "ap-southeast-1": _17, "ap-southeast-2": _17, "ca-central-1": _18, "eu-central-1": _18, "eu-west-1": _17, "eu-west-2": _18, "eu-west-3": _18, "s3": _3, "s3-ap-northeast-1": _3, "s3-ap-northeast-2": _3, "s3-ap-south-1": _3, "s3-ap-southeast-1": _3, "s3-ap-southeast-2": _3, "s3-ca-central-1": _3, "s3-eu-central-1": _3, "s3-eu-west-1": _3, "s3-eu-west-2": _3, "s3-eu-west-3": _3, "s3-external-1": _3, "s3-fips-us-gov-west-1": _3, "s3-sa-east-1": _3, "s3-us-east-2": _3, "s3-us-gov-west-1": _3, "s3-us-west-1": _3, "s3-us-west-2": _3, "s3-website-ap-northeast-1": _3, "s3-website-ap-southeast-1": _3, "s3-website-ap-southeast-2": _3, "s3-website-eu-west-1": _3, "s3-website-sa-east-1": _3, "s3-website-us-east-1": _3, "s3-website-us-west-1": _3, "s3-website-us-west-2": _3, "sa-east-1": _17, "us-east-2": _18, "af-south-1": _16, "ap-east-1": _16, "ap-northeast-3": _16, "eu-north-1": _16, "eu-south-1": _16, "me-south-1": _16, "us-west-1": _16, "us-west-2": _16, "elb": _5 } }, "elasticbeanstalk": { "$": 2, "succ": { "ap-northeast-1": _3, "ap-northeast-2": _3, "ap-northeast-3": _3, "ap-south-1": _3, "ap-southeast-1": _3, "ap-southeast-2": _3, "ca-central-1": _3, "eu-central-1": _3, "eu-west-1": _3, "eu-west-2": _3, "eu-west-3": _3, "sa-east-1": _3, "us-east-1": _3, "us-east-2": _3, "us-gov-west-1": _3, "us-west-1": _3, "us-west-2": _3 } }, "awsglobalaccelerator": _3, "siiites": _3, "appspacehosted": _3, "appspaceusercontent": _3, "on-aptible": _3, "myasustor": _3, "balena-devices": _3, "betainabox": _3, "boutir": _3, "bplaced": _3, "cafjs": _3, "canva-apps": _3, "br": _3, "cn": _3, "de": _3, "eu": _3, "jpn": _3, "mex": _3, "ru": _3, "sa": _3, "uk": _3, "us": _3, "za": _3, "ar": _3, "hu": _3, "kr": _3, "no": _3, "qc": _3, "uy": _3, "africa": _3, "gr": _3, "co": _3, "jdevcloud": _3, "wpdevcloud": _3, "cloudcontrolled": _3, "cloudcontrolapp": _3, "cf-ipfs": _3, "cloudflare-ipfs": _3, "trycloudflare": _3, "customer-oci": { "$": 0, "succ": { "*": _3, "oci": _5, "ocp": _5, "ocs": _5 } }, "dattolocal": _3, "dattorelay": _3, "dattoweb": _3, "mydatto": _3, "builtwithdark": _3, "datadetect": { "$": 0, "succ": { "demo": _3, "instance": _3 } }, "ddns5": _3, "discordsays": _3, "discordsez": _3, "drayddns": _3, "dreamhosters": _3, "mydrobo": _3, "dyndns-at-home": _3, "dyndns-at-work": _3, "dyndns-blog": _3, "dyndns-free": _3, "dyndns-home": _3, "dyndns-ip": _3, "dyndns-mail": _3, "dyndns-office": _3, "dyndns-pics": _3, "dyndns-remote": _3, "dyndns-server": _3, "dyndns-web": _3, "dyndns-wiki": _3, "dyndns-work": _3, "blogdns": _3, "cechire": _3, "dnsalias": _3, "dnsdojo": _3, "doesntexist": _3, "dontexist": _3, "doomdns": _3, "dyn-o-saur": _3, "dynalias": _3, "est-a-la-maison": _3, "est-a-la-masion": _3, "est-le-patron": _3, "est-mon-blogueur": _3, "from-ak": _3, "from-al": _3, "from-ar": _3, "from-ca": _3, "from-ct": _3, "from-dc": _3, "from-de": _3, "from-fl": _3, "from-ga": _3, "from-hi": _3, "from-ia": _3, "from-id": _3, "from-il": _3, "from-in": _3, "from-ks": _3, "from-ky": _3, "from-ma": _3, "from-md": _3, "from-mi": _3, "from-mn": _3, "from-mo": _3, "from-ms": _3, "from-mt": _3, "from-nc": _3, "from-nd": _3, "from-ne": _3, "from-nh": _3, "from-nj": _3, "from-nm": _3, "from-nv": _3, "from-oh": _3, "from-ok": _3, "from-or": _3, "from-pa": _3, "from-pr": _3, "from-ri": _3, "from-sc": _3, "from-sd": _3, "from-tn": _3, "from-tx": _3, "from-ut": _3, "from-va": _3, "from-vt": _3, "from-wa": _3, "from-wi": _3, "from-wv": _3, "from-wy": _3, "getmyip": _3, "gotdns": _3, "hobby-site": _3, "homelinux": _3, "homeunix": _3, "iamallama": _3, "is-a-anarchist": _3, "is-a-blogger": _3, "is-a-bookkeeper": _3, "is-a-bulls-fan": _3, "is-a-caterer": _3, "is-a-chef": _3, "is-a-conservative": _3, "is-a-cpa": _3, "is-a-cubicle-slave": _3, "is-a-democrat": _3, "is-a-designer": _3, "is-a-doctor": _3, "is-a-financialadvisor": _3, "is-a-geek": _3, "is-a-green": _3, "is-a-guru": _3, "is-a-hard-worker": _3, "is-a-hunter": _3, "is-a-landscaper": _3, "is-a-lawyer": _3, "is-a-liberal": _3, "is-a-libertarian": _3, "is-a-llama": _3, "is-a-musician": _3, "is-a-nascarfan": _3, "is-a-nurse": _3, "is-a-painter": _3, "is-a-personaltrainer": _3, "is-a-photographer": _3, "is-a-player": _3, "is-a-republican": _3, "is-a-rockstar": _3, "is-a-socialist": _3, "is-a-student": _3, "is-a-teacher": _3, "is-a-techie": _3, "is-a-therapist": _3, "is-an-accountant": _3, "is-an-actor": _3, "is-an-actress": _3, "is-an-anarchist": _3, "is-an-artist": _3, "is-an-engineer": _3, "is-an-entertainer": _3, "is-certified": _3, "is-gone": _3, "is-into-anime": _3, "is-into-cars": _3, "is-into-cartoons": _3, "is-into-games": _3, "is-leet": _3, "is-not-certified": _3, "is-slick": _3, "is-uberleet": _3, "is-with-theband": _3, "isa-geek": _3, "isa-hockeynut": _3, "issmarterthanyou": _3, "likes-pie": _3, "likescandy": _3, "neat-url": _3, "saves-the-whales": _3, "selfip": _3, "sells-for-less": _3, "sells-for-u": _3, "servebbs": _3, "simple-url": _3, "space-to-rent": _3, "teaches-yoga": _3, "writesthisblog": _3, "digitaloceanspaces": _5, "ddnsfree": _3, "ddnsgeek": _3, "giize": _3, "gleeze": _3, "kozow": _3, "loseyourip": _3, "ooguy": _3, "theworkpc": _3, "mytuleap": _3, "tuleap-partners": _3, "encoreapi": _3, "evennode": { "$": 0, "succ": { "eu-1": _3, "eu-2": _3, "eu-3": _3, "eu-4": _3, "us-1": _3, "us-2": _3, "us-3": _3, "us-4": _3 } }, "onfabrica": _3, "fbsbx": _19, "fastly-edge": _3, "fastly-terrarium": _3, "fastvps-server": _3, "mydobiss": _3, "firebaseapp": _3, "fldrv": _3, "forgeblocks": _3, "framercanvas": _3, "freebox-os": _3, "freeboxos": _3, "freemyip": _3, "gentapps": _3, "gentlentapis": _3, "githubusercontent": _3, "0emm": _5, "appspot": { "$": 2, "succ": { "r": _5 } }, "codespot": _3, "googleapis": _3, "googlecode": _3, "pagespeedmobilizer": _3, "publishproxy": _3, "withgoogle": _3, "withyoutube": _3, "blogspot": _3, "awsmppl": _3, "herokuapp": _3, "herokussl": _3, "impertrixcdn": _3, "impertrix": _3, "smushcdn": _3, "wphostedmail": _3, "wpmucdn": _3, "pixolino": _3, "amscompute": _3, "clicketcloud": _3, "dopaas": _3, "hidora": _3, "hosted-by-previder": _20, "hosteur": { "$": 0, "succ": { "rag-cloud": _3, "rag-cloud-ch": _3 } }, "ik-server": { "$": 0, "succ": { "jcloud": _3, "jcloud-ver-jpc": _3 } }, "jelastic": { "$": 0, "succ": { "demo": _3 } }, "kilatiron": _3, "massivegrid": _20, "wafaicloud": { "$": 0, "succ": { "jed": _3, "lon": _3, "ryd": _3 } }, "joyent": { "$": 0, "succ": { "cns": _5 } }, "ktistory": _3, "lpusercontent": _3, "lmpm": _21, "linode": { "$": 0, "succ": { "members": _3, "nodebalancer": _5 } }, "linodeobjects": _5, "linodeusercontent": { "$": 0, "succ": { "ip": _3 } }, "barsycenter": _3, "barsyonline": _3, "mazeplay": _3, "miniserver": _3, "meteorapp": _22, "hostedpi": _3, "mythic-beasts": { "$": 0, "succ": { "customer": _3, "caracal": _3, "fentiger": _3, "lynx": _3, "ocelot": _3, "oncilla": _3, "onza": _3, "sphinx": _3, "vs": _3, "x": _3, "yali": _3 } }, "nospamproxy": _9, "4u": _3, "nfshost": _3, "001www": _3, "ddnslive": _3, "myiphost": _3, "blogsyte": _3, "ciscofreak": _3, "damnserver": _3, "ditchyourip": _3, "dnsiskinky": _3, "dynns": _3, "geekgalaxy": _3, "health-carereform": _3, "homesecuritymac": _3, "homesecuritypc": _3, "myactivedirectory": _3, "mysecuritycamera": _3, "net-freaks": _3, "onthewifi": _3, "point2this": _3, "quicksytes": _3, "securitytactics": _3, "serveexchange": _3, "servehumour": _3, "servep2p": _3, "servesarcasm": _3, "stufftoread": _3, "unusualperson": _3, "workisboring": _3, "3utilities": _3, "ddnsking": _3, "myvnc": _3, "servebeer": _3, "servecounterstrike": _3, "serveftp": _3, "servegame": _3, "servehalflife": _3, "servehttp": _3, "serveirc": _3, "servemp3": _3, "servepics": _3, "servequake": _3, "observableusercontent": { "$": 0, "succ": { "static": _3 } }, "simplesite": _3, "orsites": _3, "operaunite": _3, "authgear-staging": _3, "authgearapps": _3, "skygearapp": _3, "outsystemscloud": _3, "ownprovider": _3, "pgfog": _3, "pagefrontapp": _3, "pagexl": _3, "paywhirl": _5, "gotpantheon": _3, "platter-app": _3, "pleskns": _3, "postman-echo": _3, "prgmr": { "$": 0, "succ": { "xen": _3 } }, "pythonanywhere": _22, "qualifioapp": _3, "qbuser": _3, "qa2": _3, "dev-myqnapcloud": _3, "alpha-myqnapcloud": _3, "myqnapcloud": _3, "quipelements": _5, "rackmaze": _3, "rhcloud": _3, "render": _21, "onrender": _3, "180r": _3, "dojin": _3, "sakuratan": _3, "sakuraweb": _3, "x0": _3, "code": { "$": 0, "succ": { "builder": _5, "dev-builder": _5, "stg-builder": _5 } }, "logoip": _3, "scrysec": _3, "firewall-gateway": _3, "myshopblocks": _3, "myshopify": _3, "shopitsite": _3, "1kapp": _3, "appchizi": _3, "applinzi": _3, "sinaapp": _3, "vipsinaapp": _3, "bounty-full": { "$": 2, "succ": { "alpha": _3, "beta": _3 } }, "streamlitapp": _3, "try-snowplow": _3, "stackhero-network": _3, "playstation-cloud": _3, "myspreadshop": _3, "stdlib": { "$": 0, "succ": { "api": _3 } }, "temp-dns": _3, "dsmynas": _3, "familyds": _3, "mytabit": _3, "tb-hosting": _23, "reservd": _3, "thingdustdata": _3, "bloxcms": _3, "townnews-staging": _3, "typeform": { "$": 0, "succ": { "pro": _3 } }, "hk": _3, "it": _3, "vultrobjects": _5, "wafflecell": _3, "reserve-online": _3, "hotelwithflight": _3, "remotewd": _3, "wiardweb": _24, "messwithdns": _3, "woltlab-demo": _3, "wpenginepowered": { "$": 2, "succ": { "js": _3 } }, "wixsite": _3, "xnbay": { "$": 2, "succ": { "u2": _3, "u2-local": _3 } }, "yolasite": _3 } }, "coop": _2, "cr": { "$": 1, "succ": { "ac": _2, "co": _2, "ed": _2, "fi": _2, "go": _2, "or": _2, "sa": _2 } }, "cu": { "$": 1, "succ": { "com": _2, "edu": _2, "org": _2, "net": _2, "gov": _2, "inf": _2 } }, "cv": { "$": 1, "succ": { "com": _2, "edu": _2, "int": _2, "nome": _2, "org": _2, "blogspot": _3 } }, "cw": _25, "cx": { "$": 1, "succ": { "gov": _2, "ath": _3, "info": _3 } }, "cy": { "$": 1, "succ": { "ac": _2, "biz": _2, "com": { "$": 1, "succ": { "blogspot": _3, "scaleforce": _26 } }, "ekloges": _2, "gov": _2, "ltd": _2, "mil": _2, "net": _2, "org": _2, "press": _2, "pro": _2, "tm": _2 } }, "cz": { "$": 1, "succ": { "co": _3, "realm": _3, "e4": _3, "blogspot": _3, "metacentrum": { "$": 0, "succ": { "cloud": _5, "custom": _3 } }, "muni": { "$": 0, "succ": { "cloud": { "$": 0, "succ": { "flt": _3, "usr": _3 } } } } } }, "de": { "$": 1, "succ": { "bplaced": _3, "square7": _3, "com": _3, "cosidns": { "$": 0, "succ": { "dyn": _3 } }, "dynamisches-dns": _3, "dnsupdater": _3, "internet-dns": _3, "l-o-g-i-n": _3, "dnshome": _3, "fuettertdasnetz": _3, "isteingeek": _3, "istmein": _3, "lebtimnetz": _3, "leitungsen": _3, "traeumtgerade": _3, "ddnss": { "$": 2, "succ": { "dyn": _3, "dyndns": _3 } }, "dyndns1": _3, "dyn-ip24": _3, "home-webserver": { "$": 2, "succ": { "dyn": _3 } }, "myhome-server": _3, "frusky": _5, "goip": _3, "blogspot": _3, "xn--gnstigbestellen-zvb": _3, "günstigbestellen": _3, "xn--gnstigliefern-wob": _3, "günstigliefern": _3, "hs-heilbronn": { "$": 0, "succ": { "it": _24 } }, "dyn-berlin": _3, "in-berlin": _3, "in-brb": _3, "in-butter": _3, "in-dsl": _3, "in-vpn": _3, "iservschule": _3, "mein-iserv": _3, "schulplattform": _3, "schulserver": _3, "test-iserv": _3, "keymachine": _3, "git-repos": _3, "lcube-server": _3, "svn-repos": _3, "barsy": _3, "123webseite": _3, "logoip": _3, "firewall-gateway": _3, "my-gateway": _3, "my-router": _3, "spdns": _3, "speedpartner": { "$": 0, "succ": { "customer": _3 } }, "myspreadshop": _3, "taifun-dns": _3, "12hp": _3, "2ix": _3, "4lima": _3, "lima-city": _3, "dd-dns": _3, "dray-dns": _3, "draydns": _3, "dyn-vpn": _3, "dynvpn": _3, "mein-vigor": _3, "my-vigor": _3, "my-wan": _3, "syno-ds": _3, "synology-diskstation": _3, "synology-ds": _3, "uberspace": _5, "virtualuser": _3, "virtual-user": _3, "community-pro": _3, "diskussionsbereich": _3 } }, "dj": _2, "dk": { "$": 1, "succ": { "biz": _3, "co": _3, "firm": _3, "reg": _3, "store": _3, "blogspot": _3, "123hjemmeside": _3, "myspreadshop": _3 } }, "dm": _4, "do": { "$": 1, "succ": { "art": _2, "com": _2, "edu": _2, "gob": _2, "gov": _2, "mil": _2, "net": _2, "org": _2, "sld": _2, "web": _2 } }, "dz": { "$": 1, "succ": { "art": _2, "asso": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "net": _2, "pol": _2, "soc": _2, "tm": _2 } }, "ec": { "$": 1, "succ": { "com": _2, "info": _2, "net": _2, "fin": _2, "k12": _2, "med": _2, "pro": _2, "org": _2, "edu": _2, "gov": _2, "gob": _2, "mil": _2, "base": _3, "official": _3 } }, "edu": { "$": 1, "succ": { "rit": { "$": 0, "succ": { "git-pages": _3 } } } }, "ee": { "$": 1, "succ": { "edu": _2, "gov": _2, "riik": _2, "lib": _2, "med": _2, "com": _6, "pri": _2, "aip": _2, "org": _2, "fie": _2 } }, "eg": { "$": 1, "succ": { "com": _6, "edu": _2, "eun": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sci": _2 } }, "er": _8, "es": { "$": 1, "succ": { "com": _6, "nom": _2, "org": _2, "gob": _2, "edu": _2, "123miweb": _3, "myspreadshop": _3 } }, "et": { "$": 1, "succ": { "com": _2, "gov": _2, "org": _2, "edu": _2, "biz": _2, "name": _2, "info": _2, "net": _2 } }, "eu": { "$": 1, "succ": { "airkitapps": _3, "mycd": _3, "cloudns": _3, "dogado": _27, "barsy": _3, "wellbeingzone": _3, "spdns": _3, "transurl": _5, "diskstation": _3 } }, "fi": { "$": 1, "succ": { "aland": _2, "dy": _3, "blogspot": _3, "xn--hkkinen-5wa": _3, "häkkinen": _3, "iki": _3, "cloudplatform": { "$": 0, "succ": { "fi": _3 } }, "datacenter": { "$": 0, "succ": { "demo": _3, "paas": _3 } }, "kapsi": _3, "123kotisivu": _3, "myspreadshop": _3 } }, "fj": { "$": 1, "succ": { "ac": _2, "biz": _2, "com": _2, "gov": _2, "info": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "pro": _2 } }, "fk": _8, "fm": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "radio": _3, "user": _5 } }, "fo": _2, "fr": { "$": 1, "succ": { "asso": _2, "com": _2, "gouv": _2, "nom": _2, "prd": _2, "tm": _2, "aeroport": _2, "avocat": _2, "avoues": _2, "cci": _2, "chambagri": _2, "chirurgiens-dentistes": _2, "experts-comptables": _2, "geometre-expert": _2, "greta": _2, "huissier-justice": _2, "medecin": _2, "notaires": _2, "pharmacien": _2, "port": _2, "veterinaire": _2, "en-root": _3, "fbx-os": _3, "fbxos": _3, "freebox-os": _3, "freeboxos": _3, "blogspot": _3, "goupile": _3, "123siteweb": _3, "on-web": _3, "chirurgiens-dentistes-en-france": _3, "dedibox": _3, "myspreadshop": _3, "ynh": _3 } }, "ga": _2, "gb": _2, "gd": { "$": 1, "succ": { "edu": _2, "gov": _2 } }, "ge": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "net": _2, "pvt": _2 } }, "gf": _2, "gg": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "kaas": _3, "cya": _3, "panel": { "$": 2, "succ": { "daemon": _3 } } } }, "gh": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2 } }, "gi": { "$": 1, "succ": { "com": _2, "ltd": _2, "gov": _2, "mod": _2, "edu": _2, "org": _2 } }, "gl": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "net": _2, "org": _2, "biz": _3, "xx": _3 } }, "gm": _2, "gn": { "$": 1, "succ": { "ac": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "net": _2 } }, "gov": _2, "gp": { "$": 1, "succ": { "com": _2, "net": _2, "mobi": _2, "edu": _2, "org": _2, "asso": _2, "app": _3 } }, "gq": _2, "gr": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "gov": _2, "blogspot": _3, "simplesite": _3 } }, "gs": _2, "gt": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "ind": _2, "mil": _2, "net": _2, "org": _2, "blog": _3, "de": _3, "to": _3 } }, "gu": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "guam": _2, "info": _2, "net": _2, "org": _2, "web": _2 } }, "gw": _2, "gy": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "be": _3 } }, "hk": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "idv": _2, "net": _2, "org": _2, "xn--55qx5d": _2, "公司": _2, "xn--wcvs22d": _2, "教育": _2, "xn--lcvr32d": _2, "敎育": _2, "xn--mxtq1m": _2, "政府": _2, "xn--gmqw5a": _2, "個人": _2, "xn--ciqpn": _2, "个人": _2, "xn--gmq050i": _2, "箇人": _2, "xn--zf0avx": _2, "網络": _2, "xn--io0a7i": _2, "网络": _2, "xn--mk0axi": _2, "组織": _2, "xn--od0alg": _2, "網絡": _2, "xn--od0aq3b": _2, "网絡": _2, "xn--tn0ag": _2, "组织": _2, "xn--uc0atv": _2, "組織": _2, "xn--uc0ay4a": _2, "組织": _2, "blogspot": _3, "secaas": _3, "ltd": _3, "inc": _3 } }, "hm": _2, "hn": { "$": 1, "succ": { "com": _2, "edu": _2, "org": _2, "net": _2, "mil": _2, "gob": _2, "cc": _3 } }, "hr": { "$": 1, "succ": { "iz": _2, "from": _2, "name": _2, "com": _2, "blogspot": _3, "free": _3 } }, "ht": { "$": 1, "succ": { "com": _2, "shop": _2, "firm": _2, "info": _2, "adult": _2, "net": _2, "pro": _2, "org": _2, "med": _2, "art": _2, "coop": _2, "pol": _2, "asso": _2, "edu": _2, "rel": _2, "gouv": _2, "perso": _2 } }, "hu": { "$": 1, "succ": { "2000": _2, "co": _2, "info": _2, "org": _2, "priv": _2, "sport": _2, "tm": _2, "agrar": _2, "bolt": _2, "casino": _2, "city": _2, "erotica": _2, "erotika": _2, "film": _2, "forum": _2, "games": _2, "hotel": _2, "ingatlan": _2, "jogasz": _2, "konyvelo": _2, "lakas": _2, "media": _2, "news": _2, "reklam": _2, "sex": _2, "shop": _2, "suli": _2, "szex": _2, "tozsde": _2, "utazas": _2, "video": _2, "blogspot": _3 } }, "id": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _6, "desa": _2, "go": _2, "mil": _2, "my": { "$": 1, "succ": { "rss": _5 } }, "net": _2, "or": _2, "ponpes": _2, "sch": _2, "web": _2, "flap": _3, "forte": _3 } }, "ie": { "$": 1, "succ": { "gov": _2, "blogspot": _3, "myspreadshop": _3 } }, "il": { "$": 1, "succ": { "ac": _2, "co": { "$": 1, "succ": { "ravpage": _3, "blogspot": _3, "tabitorder": _3, "mytabit": _3 } }, "gov": _2, "idf": _2, "k12": _2, "muni": _2, "net": _2, "org": _2 } }, "xn--4dbrk0ce": { "$": 1, "succ": { "xn--4dbgdty6c": _2, "xn--5dbhl8d": _2, "xn--8dbq2a": _2, "xn--hebda8b": _2 } }, "ישראל": { "$": 1, "succ": { "אקדמיה": _2, "ישוב": _2, "צהל": _2, "ממשל": _2 } }, "im": { "$": 1, "succ": { "ac": _2, "co": { "$": 1, "succ": { "ltd": _2, "plc": _2 } }, "com": _2, "net": _2, "org": _2, "tt": _2, "tv": _2, "ro": _3 } }, "in": { "$": 1, "succ": { "5g": _2, "6g": _2, "ac": _2, "ai": _2, "am": _2, "bihar": _2, "biz": _2, "business": _2, "ca": _2, "cn": _2, "co": _2, "com": _2, "coop": _2, "cs": _2, "delhi": _2, "dr": _2, "edu": _2, "er": _2, "firm": _2, "gen": _2, "gov": _2, "gujarat": _2, "ind": _2, "info": _2, "int": _2, "internet": _2, "io": _2, "me": _2, "mil": _2, "net": _2, "nic": _2, "org": _2, "pg": _2, "post": _2, "pro": _2, "res": _2, "travel": _2, "tv": _2, "uk": _2, "up": _2, "us": _2, "web": _3, "cloudns": _3, "blogspot": _3, "barsy": _3, "supabase": _3 } }, "info": { "$": 1, "succ": { "cloudns": _3, "dynamic-dns": _3, "dyndns": _3, "barrel-of-knowledge": _3, "barrell-of-knowledge": _3, "for-our": _3, "groks-the": _3, "groks-this": _3, "here-for-more": _3, "knowsitall": _3, "selfip": _3, "webhop": _3, "barsy": _3, "mayfirst": _3, "forumz": _3, "nsupdate": _3, "dvrcam": _3, "ilovecollege": _3, "no-ip": _3, "dnsupdate": _3, "v-info": _3 } }, "int": { "$": 1, "succ": { "eu": _2 } }, "io": { "$": 1, "succ": { "2038": _3, "com": _2, "on-acorn": _5, "apigee": _3, "b-data": _3, "backplaneapp": _3, "banzaicloud": { "$": 0, "succ": { "app": _3, "backyards": _5 } }, "beagleboard": _3, "bitbucket": _3, "bluebite": _3, "boxfuse": _3, "browsersafetymark": _3, "bigv": { "$": 0, "succ": { "uk0": _3 } }, "cleverapps": _3, "dappnode": { "$": 0, "succ": { "dyndns": _3 } }, "dedyn": _3, "drud": _3, "definima": _3, "fh-muenster": _3, "shw": _3, "forgerock": { "$": 0, "succ": { "id": _3 } }, "ghost": _3, "github": _3, "gitlab": _3, "lolipop": _3, "hasura-app": _3, "hostyhosting": _3, "moonscale": _5, "beebyte": _20, "beebyteapp": { "$": 0, "succ": { "sekd1": _3 } }, "jele": _3, "unispace": { "$": 0, "succ": { "cloud-fr1": _3 } }, "webthings": _3, "loginline": _3, "barsy": _3, "azurecontainer": _5, "ngrok": { "$": 2, "succ": { "ap": _3, "au": _3, "eu": _3, "in": _3, "jp": _3, "sa": _3, "us": _3 } }, "nodeart": { "$": 0, "succ": { "stage": _3 } }, "nid": _3, "pantheonsite": _3, "dyn53": _3, "pstmn": { "$": 2, "succ": { "mock": _3 } }, "protonet": _3, "qoto": _3, "qcx": { "$": 2, "succ": { "sys": _5 } }, "vaporcloud": _3, "vbrplsbx": { "$": 0, "succ": { "g": _3 } }, "on-k3s": _5, "on-rio": _5, "readthedocs": _3, "resindevice": _3, "resinstaging": { "$": 0, "succ": { "devices": _3 } }, "hzc": _3, "sandcats": _3, "shiftcrypto": _3, "shiftedit": _3, "mo-siemens": _3, "musician": _3, "lair": _19, "stolos": _5, "spacekit": _3, "utwente": _3, "s5y": _5, "edugit": _3, "telebit": _3, "thingdust": { "$": 0, "succ": { "dev": _30, "disrec": _30, "prod": _31, "testing": _30 } }, "tickets": _3, "upli": _3, "wedeploy": _3, "editorx": _3, "basicserver": _3, "virtualserver": _3 } }, "iq": _32, "ir": { "$": 1, "succ": { "ac": _2, "co": _2, "gov": _2, "id": _2, "net": _2, "org": _2, "sch": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2 } }, "is": { "$": 1, "succ": { "net": _2, "com": _2, "edu": _2, "gov": _2, "org": _2, "int": _2, "cupcake": _3, "blogspot": _3 } }, "it": { "$": 1, "succ": { "gov": _2, "edu": _2, "abr": _2, "abruzzo": _2, "aosta-valley": _2, "aostavalley": _2, "bas": _2, "basilicata": _2, "cal": _2, "calabria": _2, "cam": _2, "campania": _2, "emilia-romagna": _2, "emiliaromagna": _2, "emr": _2, "friuli-v-giulia": _2, "friuli-ve-giulia": _2, "friuli-vegiulia": _2, "friuli-venezia-giulia": _2, "friuli-veneziagiulia": _2, "friuli-vgiulia": _2, "friuliv-giulia": _2, "friulive-giulia": _2, "friulivegiulia": _2, "friulivenezia-giulia": _2, "friuliveneziagiulia": _2, "friulivgiulia": _2, "fvg": _2, "laz": _2, "lazio": _2, "lig": _2, "liguria": _2, "lom": _2, "lombardia": _2, "lombardy": _2, "lucania": _2, "mar": _2, "marche": _2, "mol": _2, "molise": _2, "piedmont": _2, "piemonte": _2, "pmn": _2, "pug": _2, "puglia": _2, "sar": _2, "sardegna": _2, "sardinia": _2, "sic": _2, "sicilia": _2, "sicily": _2, "taa": _2, "tos": _2, "toscana": _2, "trentin-sud-tirol": _2, "xn--trentin-sd-tirol-rzb": _2, "trentin-süd-tirol": _2, "trentin-sudtirol": _2, "xn--trentin-sdtirol-7vb": _2, "trentin-südtirol": _2, "trentin-sued-tirol": _2, "trentin-suedtirol": _2, "trentino-a-adige": _2, "trentino-aadige": _2, "trentino-alto-adige": _2, "trentino-altoadige": _2, "trentino-s-tirol": _2, "trentino-stirol": _2, "trentino-sud-tirol": _2, "xn--trentino-sd-tirol-c3b": _2, "trentino-süd-tirol": _2, "trentino-sudtirol": _2, "xn--trentino-sdtirol-szb": _2, "trentino-südtirol": _2, "trentino-sued-tirol": _2, "trentino-suedtirol": _2, "trentino": _2, "trentinoa-adige": _2, "trentinoaadige": _2, "trentinoalto-adige": _2, "trentinoaltoadige": _2, "trentinos-tirol": _2, "trentinostirol": _2, "trentinosud-tirol": _2, "xn--trentinosd-tirol-rzb": _2, "trentinosüd-tirol": _2, "trentinosudtirol": _2, "xn--trentinosdtirol-7vb": _2, "trentinosüdtirol": _2, "trentinosued-tirol": _2, "trentinosuedtirol": _2, "trentinsud-tirol": _2, "xn--trentinsd-tirol-6vb": _2, "trentinsüd-tirol": _2, "trentinsudtirol": _2, "xn--trentinsdtirol-nsb": _2, "trentinsüdtirol": _2, "trentinsued-tirol": _2, "trentinsuedtirol": _2, "tuscany": _2, "umb": _2, "umbria": _2, "val-d-aosta": _2, "val-daosta": _2, "vald-aosta": _2, "valdaosta": _2, "valle-aosta": _2, "valle-d-aosta": _2, "valle-daosta": _2, "valleaosta": _2, "valled-aosta": _2, "valledaosta": _2, "vallee-aoste": _2, "xn--valle-aoste-ebb": _2, "vallée-aoste": _2, "vallee-d-aoste": _2, "xn--valle-d-aoste-ehb": _2, "vallée-d-aoste": _2, "valleeaoste": _2, "xn--valleaoste-e7a": _2, "valléeaoste": _2, "valleedaoste": _2, "xn--valledaoste-ebb": _2, "valléedaoste": _2, "vao": _2, "vda": _2, "ven": _2, "veneto": _2, "ag": _2, "agrigento": _2, "al": _2, "alessandria": _2, "alto-adige": _2, "altoadige": _2, "an": _2, "ancona": _2, "andria-barletta-trani": _2, "andria-trani-barletta": _2, "andriabarlettatrani": _2, "andriatranibarletta": _2, "ao": _2, "aosta": _2, "aoste": _2, "ap": _2, "aq": _2, "aquila": _2, "ar": _2, "arezzo": _2, "ascoli-piceno": _2, "ascolipiceno": _2, "asti": _2, "at": _2, "av": _2, "avellino": _2, "ba": _2, "balsan-sudtirol": _2, "xn--balsan-sdtirol-nsb": _2, "balsan-südtirol": _2, "balsan-suedtirol": _2, "balsan": _2, "bari": _2, "barletta-trani-andria": _2, "barlettatraniandria": _2, "belluno": _2, "benevento": _2, "bergamo": _2, "bg": _2, "bi": _2, "biella": _2, "bl": _2, "bn": _2, "bo": _2, "bologna": _2, "bolzano-altoadige": _2, "bolzano": _2, "bozen-sudtirol": _2, "xn--bozen-sdtirol-2ob": _2, "bozen-südtirol": _2, "bozen-suedtirol": _2, "bozen": _2, "br": _2, "brescia": _2, "brindisi": _2, "bs": _2, "bt": _2, "bulsan-sudtirol": _2, "xn--bulsan-sdtirol-nsb": _2, "bulsan-südtirol": _2, "bulsan-suedtirol": _2, "bulsan": _2, "bz": _2, "ca": _2, "cagliari": _2, "caltanissetta": _2, "campidano-medio": _2, "campidanomedio": _2, "campobasso": _2, "carbonia-iglesias": _2, "carboniaiglesias": _2, "carrara-massa": _2, "carraramassa": _2, "caserta": _2, "catania": _2, "catanzaro": _2, "cb": _2, "ce": _2, "cesena-forli": _2, "xn--cesena-forl-mcb": _2, "cesena-forlì": _2, "cesenaforli": _2, "xn--cesenaforl-i8a": _2, "cesenaforlì": _2, "ch": _2, "chieti": _2, "ci": _2, "cl": _2, "cn": _2, "co": _2, "como": _2, "cosenza": _2, "cr": _2, "cremona": _2, "crotone": _2, "cs": _2, "ct": _2, "cuneo": _2, "cz": _2, "dell-ogliastra": _2, "dellogliastra": _2, "en": _2, "enna": _2, "fc": _2, "fe": _2, "fermo": _2, "ferrara": _2, "fg": _2, "fi": _2, "firenze": _2, "florence": _2, "fm": _2, "foggia": _2, "forli-cesena": _2, "xn--forl-cesena-fcb": _2, "forlì-cesena": _2, "forlicesena": _2, "xn--forlcesena-c8a": _2, "forlìcesena": _2, "fr": _2, "frosinone": _2, "ge": _2, "genoa": _2, "genova": _2, "go": _2, "gorizia": _2, "gr": _2, "grosseto": _2, "iglesias-carbonia": _2, "iglesiascarbonia": _2, "im": _2, "imperia": _2, "is": _2, "isernia": _2, "kr": _2, "la-spezia": _2, "laquila": _2, "laspezia": _2, "latina": _2, "lc": _2, "le": _2, "lecce": _2, "lecco": _2, "li": _2, "livorno": _2, "lo": _2, "lodi": _2, "lt": _2, "lu": _2, "lucca": _2, "macerata": _2, "mantova": _2, "massa-carrara": _2, "massacarrara": _2, "matera": _2, "mb": _2, "mc": _2, "me": _2, "medio-campidano": _2, "mediocampidano": _2, "messina": _2, "mi": _2, "milan": _2, "milano": _2, "mn": _2, "mo": _2, "modena": _2, "monza-brianza": _2, "monza-e-della-brianza": _2, "monza": _2, "monzabrianza": _2, "monzaebrianza": _2, "monzaedellabrianza": _2, "ms": _2, "mt": _2, "na": _2, "naples": _2, "napoli": _2, "no": _2, "novara": _2, "nu": _2, "nuoro": _2, "og": _2, "ogliastra": _2, "olbia-tempio": _2, "olbiatempio": _2, "or": _2, "oristano": _2, "ot": _2, "pa": _2, "padova": _2, "padua": _2, "palermo": _2, "parma": _2, "pavia": _2, "pc": _2, "pd": _2, "pe": _2, "perugia": _2, "pesaro-urbino": _2, "pesarourbino": _2, "pescara": _2, "pg": _2, "pi": _2, "piacenza": _2, "pisa": _2, "pistoia": _2, "pn": _2, "po": _2, "pordenone": _2, "potenza": _2, "pr": _2, "prato": _2, "pt": _2, "pu": _2, "pv": _2, "pz": _2, "ra": _2, "ragusa": _2, "ravenna": _2, "rc": _2, "re": _2, "reggio-calabria": _2, "reggio-emilia": _2, "reggiocalabria": _2, "reggioemilia": _2, "rg": _2, "ri": _2, "rieti": _2, "rimini": _2, "rm": _2, "rn": _2, "ro": _2, "roma": _2, "rome": _2, "rovigo": _2, "sa": _2, "salerno": _2, "sassari": _2, "savona": _2, "si": _2, "siena": _2, "siracusa": _2, "so": _2, "sondrio": _2, "sp": _2, "sr": _2, "ss": _2, "suedtirol": _2, "xn--sdtirol-n2a": _2, "südtirol": _2, "sv": _2, "ta": _2, "taranto": _2, "te": _2, "tempio-olbia": _2, "tempioolbia": _2, "teramo": _2, "terni": _2, "tn": _2, "to": _2, "torino": _2, "tp": _2, "tr": _2, "trani-andria-barletta": _2, "trani-barletta-andria": _2, "traniandriabarletta": _2, "tranibarlettaandria": _2, "trapani": _2, "trento": _2, "treviso": _2, "trieste": _2, "ts": _2, "turin": _2, "tv": _2, "ud": _2, "udine": _2, "urbino-pesaro": _2, "urbinopesaro": _2, "va": _2, "varese": _2, "vb": _2, "vc": _2, "ve": _2, "venezia": _2, "venice": _2, "verbania": _2, "vercelli": _2, "verona": _2, "vi": _2, "vibo-valentia": _2, "vibovalentia": _2, "vicenza": _2, "viterbo": _2, "vr": _2, "vs": _2, "vt": _2, "vv": _2, "blogspot": _3, "ibxos": _3, "iliadboxos": _3, "neen": { "$": 0, "succ": { "jc": _3 } }, "tim": { "$": 0, "succ": { "open": { "$": 0, "succ": { "jelastic": _9 } } } }, "16-b": _3, "32-b": _3, "64-b": _3, "123homepage": _3, "myspreadshop": _3, "syncloud": _3 } }, "je": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "of": _3 } }, "jm": _8, "jo": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "edu": _2, "sch": _2, "gov": _2, "mil": _2, "name": _2 } }, "jobs": _2, "jp": { "$": 1, "succ": { "ac": _2, "ad": _2, "co": _2, "ed": _2, "go": _2, "gr": _2, "lg": _2, "ne": { "$": 1, "succ": { "aseinet": _28, "gehirn": _3, "ivory": _3, "mail-box": _3, "mints": _3, "mokuren": _3, "opal": _3, "sakura": _3, "sumomo": _3, "topaz": _3 } }, "or": _2, "aichi": { "$": 1, "succ": { "aisai": _2, "ama": _2, "anjo": _2, "asuke": _2, "chiryu": _2, "chita": _2, "fuso": _2, "gamagori": _2, "handa": _2, "hazu": _2, "hekinan": _2, "higashiura": _2, "ichinomiya": _2, "inazawa": _2, "inuyama": _2, "isshiki": _2, "iwakura": _2, "kanie": _2, "kariya": _2, "kasugai": _2, "kira": _2, "kiyosu": _2, "komaki": _2, "konan": _2, "kota": _2, "mihama": _2, "miyoshi": _2, "nishio": _2, "nisshin": _2, "obu": _2, "oguchi": _2, "oharu": _2, "okazaki": _2, "owariasahi": _2, "seto": _2, "shikatsu": _2, "shinshiro": _2, "shitara": _2, "tahara": _2, "takahama": _2, "tobishima": _2, "toei": _2, "togo": _2, "tokai": _2, "tokoname": _2, "toyoake": _2, "toyohashi": _2, "toyokawa": _2, "toyone": _2, "toyota": _2, "tsushima": _2, "yatomi": _2 } }, "akita": { "$": 1, "succ": { "akita": _2, "daisen": _2, "fujisato": _2, "gojome": _2, "hachirogata": _2, "happou": _2, "higashinaruse": _2, "honjo": _2, "honjyo": _2, "ikawa": _2, "kamikoani": _2, "kamioka": _2, "katagami": _2, "kazuno": _2, "kitaakita": _2, "kosaka": _2, "kyowa": _2, "misato": _2, "mitane": _2, "moriyoshi": _2, "nikaho": _2, "noshiro": _2, "odate": _2, "oga": _2, "ogata": _2, "semboku": _2, "yokote": _2, "yurihonjo": _2 } }, "aomori": { "$": 1, "succ": { "aomori": _2, "gonohe": _2, "hachinohe": _2, "hashikami": _2, "hiranai": _2, "hirosaki": _2, "itayanagi": _2, "kuroishi": _2, "misawa": _2, "mutsu": _2, "nakadomari": _2, "noheji": _2, "oirase": _2, "owani": _2, "rokunohe": _2, "sannohe": _2, "shichinohe": _2, "shingo": _2, "takko": _2, "towada": _2, "tsugaru": _2, "tsuruta": _2 } }, "chiba": { "$": 1, "succ": { "abiko": _2, "asahi": _2, "chonan": _2, "chosei": _2, "choshi": _2, "chuo": _2, "funabashi": _2, "futtsu": _2, "hanamigawa": _2, "ichihara": _2, "ichikawa": _2, "ichinomiya": _2, "inzai": _2, "isumi": _2, "kamagaya": _2, "kamogawa": _2, "kashiwa": _2, "katori": _2, "katsuura": _2, "kimitsu": _2, "kisarazu": _2, "kozaki": _2, "kujukuri": _2, "kyonan": _2, "matsudo": _2, "midori": _2, "mihama": _2, "minamiboso": _2, "mobara": _2, "mutsuzawa": _2, "nagara": _2, "nagareyama": _2, "narashino": _2, "narita": _2, "noda": _2, "oamishirasato": _2, "omigawa": _2, "onjuku": _2, "otaki": _2, "sakae": _2, "sakura": _2, "shimofusa": _2, "shirako": _2, "shiroi": _2, "shisui": _2, "sodegaura": _2, "sosa": _2, "tako": _2, "tateyama": _2, "togane": _2, "tohnosho": _2, "tomisato": _2, "urayasu": _2, "yachimata": _2, "yachiyo": _2, "yokaichiba": _2, "yokoshibahikari": _2, "yotsukaido": _2 } }, "ehime": { "$": 1, "succ": { "ainan": _2, "honai": _2, "ikata": _2, "imabari": _2, "iyo": _2, "kamijima": _2, "kihoku": _2, "kumakogen": _2, "masaki": _2, "matsuno": _2, "matsuyama": _2, "namikata": _2, "niihama": _2, "ozu": _2, "saijo": _2, "seiyo": _2, "shikokuchuo": _2, "tobe": _2, "toon": _2, "uchiko": _2, "uwajima": _2, "yawatahama": _2 } }, "fukui": { "$": 1, "succ": { "echizen": _2, "eiheiji": _2, "fukui": _2, "ikeda": _2, "katsuyama": _2, "mihama": _2, "minamiechizen": _2, "obama": _2, "ohi": _2, "ono": _2, "sabae": _2, "sakai": _2, "takahama": _2, "tsuruga": _2, "wakasa": _2 } }, "fukuoka": { "$": 1, "succ": { "ashiya": _2, "buzen": _2, "chikugo": _2, "chikuho": _2, "chikujo": _2, "chikushino": _2, "chikuzen": _2, "chuo": _2, "dazaifu": _2, "fukuchi": _2, "hakata": _2, "higashi": _2, "hirokawa": _2, "hisayama": _2, "iizuka": _2, "inatsuki": _2, "kaho": _2, "kasuga": _2, "kasuya": _2, "kawara": _2, "keisen": _2, "koga": _2, "kurate": _2, "kurogi": _2, "kurume": _2, "minami": _2, "miyako": _2, "miyama": _2, "miyawaka": _2, "mizumaki": _2, "munakata": _2, "nakagawa": _2, "nakama": _2, "nishi": _2, "nogata": _2, "ogori": _2, "okagaki": _2, "okawa": _2, "oki": _2, "omuta": _2, "onga": _2, "onojo": _2, "oto": _2, "saigawa": _2, "sasaguri": _2, "shingu": _2, "shinyoshitomi": _2, "shonai": _2, "soeda": _2, "sue": _2, "tachiarai": _2, "tagawa": _2, "takata": _2, "toho": _2, "toyotsu": _2, "tsuiki": _2, "ukiha": _2, "umi": _2, "usui": _2, "yamada": _2, "yame": _2, "yanagawa": _2, "yukuhashi": _2 } }, "fukushima": { "$": 1, "succ": { "aizubange": _2, "aizumisato": _2, "aizuwakamatsu": _2, "asakawa": _2, "bandai": _2, "date": _2, "fukushima": _2, "furudono": _2, "futaba": _2, "hanawa": _2, "higashi": _2, "hirata": _2, "hirono": _2, "iitate": _2, "inawashiro": _2, "ishikawa": _2, "iwaki": _2, "izumizaki": _2, "kagamiishi": _2, "kaneyama": _2, "kawamata": _2, "kitakata": _2, "kitashiobara": _2, "koori": _2, "koriyama": _2, "kunimi": _2, "miharu": _2, "mishima": _2, "namie": _2, "nango": _2, "nishiaizu": _2, "nishigo": _2, "okuma": _2, "omotego": _2, "ono": _2, "otama": _2, "samegawa": _2, "shimogo": _2, "shirakawa": _2, "showa": _2, "soma": _2, "sukagawa": _2, "taishin": _2, "tamakawa": _2, "tanagura": _2, "tenei": _2, "yabuki": _2, "yamato": _2, "yamatsuri": _2, "yanaizu": _2, "yugawa": _2 } }, "gifu": { "$": 1, "succ": { "anpachi": _2, "ena": _2, "gifu": _2, "ginan": _2, "godo": _2, "gujo": _2, "hashima": _2, "hichiso": _2, "hida": _2, "higashishirakawa": _2, "ibigawa": _2, "ikeda": _2, "kakamigahara": _2, "kani": _2, "kasahara": _2, "kasamatsu": _2, "kawaue": _2, "kitagata": _2, "mino": _2, "minokamo": _2, "mitake": _2, "mizunami": _2, "motosu": _2, "nakatsugawa": _2, "ogaki": _2, "sakahogi": _2, "seki": _2, "sekigahara": _2, "shirakawa": _2, "tajimi": _2, "takayama": _2, "tarui": _2, "toki": _2, "tomika": _2, "wanouchi": _2, "yamagata": _2, "yaotsu": _2, "yoro": _2 } }, "gunma": { "$": 1, "succ": { "annaka": _2, "chiyoda": _2, "fujioka": _2, "higashiagatsuma": _2, "isesaki": _2, "itakura": _2, "kanna": _2, "kanra": _2, "katashina": _2, "kawaba": _2, "kiryu": _2, "kusatsu": _2, "maebashi": _2, "meiwa": _2, "midori": _2, "minakami": _2, "naganohara": _2, "nakanojo": _2, "nanmoku": _2, "numata": _2, "oizumi": _2, "ora": _2, "ota": _2, "shibukawa": _2, "shimonita": _2, "shinto": _2, "showa": _2, "takasaki": _2, "takayama": _2, "tamamura": _2, "tatebayashi": _2, "tomioka": _2, "tsukiyono": _2, "tsumagoi": _2, "ueno": _2, "yoshioka": _2 } }, "hiroshima": { "$": 1, "succ": { "asaminami": _2, "daiwa": _2, "etajima": _2, "fuchu": _2, "fukuyama": _2, "hatsukaichi": _2, "higashihiroshima": _2, "hongo": _2, "jinsekikogen": _2, "kaita": _2, "kui": _2, "kumano": _2, "kure": _2, "mihara": _2, "miyoshi": _2, "naka": _2, "onomichi": _2, "osakikamijima": _2, "otake": _2, "saka": _2, "sera": _2, "seranishi": _2, "shinichi": _2, "shobara": _2, "takehara": _2 } }, "hokkaido": { "$": 1, "succ": { "abashiri": _2, "abira": _2, "aibetsu": _2, "akabira": _2, "akkeshi": _2, "asahikawa": _2, "ashibetsu": _2, "ashoro": _2, "assabu": _2, "atsuma": _2, "bibai": _2, "biei": _2, "bifuka": _2, "bihoro": _2, "biratori": _2, "chippubetsu": _2, "chitose": _2, "date": _2, "ebetsu": _2, "embetsu": _2, "eniwa": _2, "erimo": _2, "esan": _2, "esashi": _2, "fukagawa": _2, "fukushima": _2, "furano": _2, "furubira": _2, "haboro": _2, "hakodate": _2, "hamatonbetsu": _2, "hidaka": _2, "higashikagura": _2, "higashikawa": _2, "hiroo": _2, "hokuryu": _2, "hokuto": _2, "honbetsu": _2, "horokanai": _2, "horonobe": _2, "ikeda": _2, "imakane": _2, "ishikari": _2, "iwamizawa": _2, "iwanai": _2, "kamifurano": _2, "kamikawa": _2, "kamishihoro": _2, "kamisunagawa": _2, "kamoenai": _2, "kayabe": _2, "kembuchi": _2, "kikonai": _2, "kimobetsu": _2, "kitahiroshima": _2, "kitami": _2, "kiyosato": _2, "koshimizu": _2, "kunneppu": _2, "kuriyama": _2, "kuromatsunai": _2, "kushiro": _2, "kutchan": _2, "kyowa": _2, "mashike": _2, "matsumae": _2, "mikasa": _2, "minamifurano": _2, "mombetsu": _2, "moseushi": _2, "mukawa": _2, "muroran": _2, "naie": _2, "nakagawa": _2, "nakasatsunai": _2, "nakatombetsu": _2, "nanae": _2, "nanporo": _2, "nayoro": _2, "nemuro": _2, "niikappu": _2, "niki": _2, "nishiokoppe": _2, "noboribetsu": _2, "numata": _2, "obihiro": _2, "obira": _2, "oketo": _2, "okoppe": _2, "otaru": _2, "otobe": _2, "otofuke": _2, "otoineppu": _2, "oumu": _2, "ozora": _2, "pippu": _2, "rankoshi": _2, "rebun": _2, "rikubetsu": _2, "rishiri": _2, "rishirifuji": _2, "saroma": _2, "sarufutsu": _2, "shakotan": _2, "shari": _2, "shibecha": _2, "shibetsu": _2, "shikabe": _2, "shikaoi": _2, "shimamaki": _2, "shimizu": _2, "shimokawa": _2, "shinshinotsu": _2, "shintoku": _2, "shiranuka": _2, "shiraoi": _2, "shiriuchi": _2, "sobetsu": _2, "sunagawa": _2, "taiki": _2, "takasu": _2, "takikawa": _2, "takinoue": _2, "teshikaga": _2, "tobetsu": _2, "tohma": _2, "tomakomai": _2, "tomari": _2, "toya": _2, "toyako": _2, "toyotomi": _2, "toyoura": _2, "tsubetsu": _2, "tsukigata": _2, "urakawa": _2, "urausu": _2, "uryu": _2, "utashinai": _2, "wakkanai": _2, "wassamu": _2, "yakumo": _2, "yoichi": _2 } }, "hyogo": { "$": 1, "succ": { "aioi": _2, "akashi": _2, "ako": _2, "amagasaki": _2, "aogaki": _2, "asago": _2, "ashiya": _2, "awaji": _2, "fukusaki": _2, "goshiki": _2, "harima": _2, "himeji": _2, "ichikawa": _2, "inagawa": _2, "itami": _2, "kakogawa": _2, "kamigori": _2, "kamikawa": _2, "kasai": _2, "kasuga": _2, "kawanishi": _2, "miki": _2, "minamiawaji": _2, "nishinomiya": _2, "nishiwaki": _2, "ono": _2, "sanda": _2, "sannan": _2, "sasayama": _2, "sayo": _2, "shingu": _2, "shinonsen": _2, "shiso": _2, "sumoto": _2, "taishi": _2, "taka": _2, "takarazuka": _2, "takasago": _2, "takino": _2, "tamba": _2, "tatsuno": _2, "toyooka": _2, "yabu": _2, "yashiro": _2, "yoka": _2, "yokawa": _2 } }, "ibaraki": { "$": 1, "succ": { "ami": _2, "asahi": _2, "bando": _2, "chikusei": _2, "daigo": _2, "fujishiro": _2, "hitachi": _2, "hitachinaka": _2, "hitachiomiya": _2, "hitachiota": _2, "ibaraki": _2, "ina": _2, "inashiki": _2, "itako": _2, "iwama": _2, "joso": _2, "kamisu": _2, "kasama": _2, "kashima": _2, "kasumigaura": _2, "koga": _2, "miho": _2, "mito": _2, "moriya": _2, "naka": _2, "namegata": _2, "oarai": _2, "ogawa": _2, "omitama": _2, "ryugasaki": _2, "sakai": _2, "sakuragawa": _2, "shimodate": _2, "shimotsuma": _2, "shirosato": _2, "sowa": _2, "suifu": _2, "takahagi": _2, "tamatsukuri": _2, "tokai": _2, "tomobe": _2, "tone": _2, "toride": _2, "tsuchiura": _2, "tsukuba": _2, "uchihara": _2, "ushiku": _2, "yachiyo": _2, "yamagata": _2, "yawara": _2, "yuki": _2 } }, "ishikawa": { "$": 1, "succ": { "anamizu": _2, "hakui": _2, "hakusan": _2, "kaga": _2, "kahoku": _2, "kanazawa": _2, "kawakita": _2, "komatsu": _2, "nakanoto": _2, "nanao": _2, "nomi": _2, "nonoichi": _2, "noto": _2, "shika": _2, "suzu": _2, "tsubata": _2, "tsurugi": _2, "uchinada": _2, "wajima": _2 } }, "iwate": { "$": 1, "succ": { "fudai": _2, "fujisawa": _2, "hanamaki": _2, "hiraizumi": _2, "hirono": _2, "ichinohe": _2, "ichinoseki": _2, "iwaizumi": _2, "iwate": _2, "joboji": _2, "kamaishi": _2, "kanegasaki": _2, "karumai": _2, "kawai": _2, "kitakami": _2, "kuji": _2, "kunohe": _2, "kuzumaki": _2, "miyako": _2, "mizusawa": _2, "morioka": _2, "ninohe": _2, "noda": _2, "ofunato": _2, "oshu": _2, "otsuchi": _2, "rikuzentakata": _2, "shiwa": _2, "shizukuishi": _2, "sumita": _2, "tanohata": _2, "tono": _2, "yahaba": _2, "yamada": _2 } }, "kagawa": { "$": 1, "succ": { "ayagawa": _2, "higashikagawa": _2, "kanonji": _2, "kotohira": _2, "manno": _2, "marugame": _2, "mitoyo": _2, "naoshima": _2, "sanuki": _2, "tadotsu": _2, "takamatsu": _2, "tonosho": _2, "uchinomi": _2, "utazu": _2, "zentsuji": _2 } }, "kagoshima": { "$": 1, "succ": { "akune": _2, "amami": _2, "hioki": _2, "isa": _2, "isen": _2, "izumi": _2, "kagoshima": _2, "kanoya": _2, "kawanabe": _2, "kinko": _2, "kouyama": _2, "makurazaki": _2, "matsumoto": _2, "minamitane": _2, "nakatane": _2, "nishinoomote": _2, "satsumasendai": _2, "soo": _2, "tarumizu": _2, "yusui": _2 } }, "kanagawa": { "$": 1, "succ": { "aikawa": _2, "atsugi": _2, "ayase": _2, "chigasaki": _2, "ebina": _2, "fujisawa": _2, "hadano": _2, "hakone": _2, "hiratsuka": _2, "isehara": _2, "kaisei": _2, "kamakura": _2, "kiyokawa": _2, "matsuda": _2, "minamiashigara": _2, "miura": _2, "nakai": _2, "ninomiya": _2, "odawara": _2, "oi": _2, "oiso": _2, "sagamihara": _2, "samukawa": _2, "tsukui": _2, "yamakita": _2, "yamato": _2, "yokosuka": _2, "yugawara": _2, "zama": _2, "zushi": _2 } }, "kochi": { "$": 1, "succ": { "aki": _2, "geisei": _2, "hidaka": _2, "higashitsuno": _2, "ino": _2, "kagami": _2, "kami": _2, "kitagawa": _2, "kochi": _2, "mihara": _2, "motoyama": _2, "muroto": _2, "nahari": _2, "nakamura": _2, "nankoku": _2, "nishitosa": _2, "niyodogawa": _2, "ochi": _2, "okawa": _2, "otoyo": _2, "otsuki": _2, "sakawa": _2, "sukumo": _2, "susaki": _2, "tosa": _2, "tosashimizu": _2, "toyo": _2, "tsuno": _2, "umaji": _2, "yasuda": _2, "yusuhara": _2 } }, "kumamoto": { "$": 1, "succ": { "amakusa": _2, "arao": _2, "aso": _2, "choyo": _2, "gyokuto": _2, "kamiamakusa": _2, "kikuchi": _2, "kumamoto": _2, "mashiki": _2, "mifune": _2, "minamata": _2, "minamioguni": _2, "nagasu": _2, "nishihara": _2, "oguni": _2, "ozu": _2, "sumoto": _2, "takamori": _2, "uki": _2, "uto": _2, "yamaga": _2, "yamato": _2, "yatsushiro": _2 } }, "kyoto": { "$": 1, "succ": { "ayabe": _2, "fukuchiyama": _2, "higashiyama": _2, "ide": _2, "ine": _2, "joyo": _2, "kameoka": _2, "kamo": _2, "kita": _2, "kizu": _2, "kumiyama": _2, "kyotamba": _2, "kyotanabe": _2, "kyotango": _2, "maizuru": _2, "minami": _2, "minamiyamashiro": _2, "miyazu": _2, "muko": _2, "nagaokakyo": _2, "nakagyo": _2, "nantan": _2, "oyamazaki": _2, "sakyo": _2, "seika": _2, "tanabe": _2, "uji": _2, "ujitawara": _2, "wazuka": _2, "yamashina": _2, "yawata": _2 } }, "mie": { "$": 1, "succ": { "asahi": _2, "inabe": _2, "ise": _2, "kameyama": _2, "kawagoe": _2, "kiho": _2, "kisosaki": _2, "kiwa": _2, "komono": _2, "kumano": _2, "kuwana": _2, "matsusaka": _2, "meiwa": _2, "mihama": _2, "minamiise": _2, "misugi": _2, "miyama": _2, "nabari": _2, "shima": _2, "suzuka": _2, "tado": _2, "taiki": _2, "taki": _2, "tamaki": _2, "toba": _2, "tsu": _2, "udono": _2, "ureshino": _2, "watarai": _2, "yokkaichi": _2 } }, "miyagi": { "$": 1, "succ": { "furukawa": _2, "higashimatsushima": _2, "ishinomaki": _2, "iwanuma": _2, "kakuda": _2, "kami": _2, "kawasaki": _2, "marumori": _2, "matsushima": _2, "minamisanriku": _2, "misato": _2, "murata": _2, "natori": _2, "ogawara": _2, "ohira": _2, "onagawa": _2, "osaki": _2, "rifu": _2, "semine": _2, "shibata": _2, "shichikashuku": _2, "shikama": _2, "shiogama": _2, "shiroishi": _2, "tagajo": _2, "taiwa": _2, "tome": _2, "tomiya": _2, "wakuya": _2, "watari": _2, "yamamoto": _2, "zao": _2 } }, "miyazaki": { "$": 1, "succ": { "aya": _2, "ebino": _2, "gokase": _2, "hyuga": _2, "kadogawa": _2, "kawaminami": _2, "kijo": _2, "kitagawa": _2, "kitakata": _2, "kitaura": _2, "kobayashi": _2, "kunitomi": _2, "kushima": _2, "mimata": _2, "miyakonojo": _2, "miyazaki": _2, "morotsuka": _2, "nichinan": _2, "nishimera": _2, "nobeoka": _2, "saito": _2, "shiiba": _2, "shintomi": _2, "takaharu": _2, "takanabe": _2, "takazaki": _2, "tsuno": _2 } }, "nagano": { "$": 1, "succ": { "achi": _2, "agematsu": _2, "anan": _2, "aoki": _2, "asahi": _2, "azumino": _2, "chikuhoku": _2, "chikuma": _2, "chino": _2, "fujimi": _2, "hakuba": _2, "hara": _2, "hiraya": _2, "iida": _2, "iijima": _2, "iiyama": _2, "iizuna": _2, "ikeda": _2, "ikusaka": _2, "ina": _2, "karuizawa": _2, "kawakami": _2, "kiso": _2, "kisofukushima": _2, "kitaaiki": _2, "komagane": _2, "komoro": _2, "matsukawa": _2, "matsumoto": _2, "miasa": _2, "minamiaiki": _2, "minamimaki": _2, "minamiminowa": _2, "minowa": _2, "miyada": _2, "miyota": _2, "mochizuki": _2, "nagano": _2, "nagawa": _2, "nagiso": _2, "nakagawa": _2, "nakano": _2, "nozawaonsen": _2, "obuse": _2, "ogawa": _2, "okaya": _2, "omachi": _2, "omi": _2, "ookuwa": _2, "ooshika": _2, "otaki": _2, "otari": _2, "sakae": _2, "sakaki": _2, "saku": _2, "sakuho": _2, "shimosuwa": _2, "shinanomachi": _2, "shiojiri": _2, "suwa": _2, "suzaka": _2, "takagi": _2, "takamori": _2, "takayama": _2, "tateshina": _2, "tatsuno": _2, "togakushi": _2, "togura": _2, "tomi": _2, "ueda": _2, "wada": _2, "yamagata": _2, "yamanouchi": _2, "yasaka": _2, "yasuoka": _2 } }, "nagasaki": { "$": 1, "succ": { "chijiwa": _2, "futsu": _2, "goto": _2, "hasami": _2, "hirado": _2, "iki": _2, "isahaya": _2, "kawatana": _2, "kuchinotsu": _2, "matsuura": _2, "nagasaki": _2, "obama": _2, "omura": _2, "oseto": _2, "saikai": _2, "sasebo": _2, "seihi": _2, "shimabara": _2, "shinkamigoto": _2, "togitsu": _2, "tsushima": _2, "unzen": _2 } }, "nara": { "$": 1, "succ": { "ando": _2, "gose": _2, "heguri": _2, "higashiyoshino": _2, "ikaruga": _2, "ikoma": _2, "kamikitayama": _2, "kanmaki": _2, "kashiba": _2, "kashihara": _2, "katsuragi": _2, "kawai": _2, "kawakami": _2, "kawanishi": _2, "koryo": _2, "kurotaki": _2, "mitsue": _2, "miyake": _2, "nara": _2, "nosegawa": _2, "oji": _2, "ouda": _2, "oyodo": _2, "sakurai": _2, "sango": _2, "shimoichi": _2, "shimokitayama": _2, "shinjo": _2, "soni": _2, "takatori": _2, "tawaramoto": _2, "tenkawa": _2, "tenri": _2, "uda": _2, "yamatokoriyama": _2, "yamatotakada": _2, "yamazoe": _2, "yoshino": _2 } }, "niigata": { "$": 1, "succ": { "aga": _2, "agano": _2, "gosen": _2, "itoigawa": _2, "izumozaki": _2, "joetsu": _2, "kamo": _2, "kariwa": _2, "kashiwazaki": _2, "minamiuonuma": _2, "mitsuke": _2, "muika": _2, "murakami": _2, "myoko": _2, "nagaoka": _2, "niigata": _2, "ojiya": _2, "omi": _2, "sado": _2, "sanjo": _2, "seiro": _2, "seirou": _2, "sekikawa": _2, "shibata": _2, "tagami": _2, "tainai": _2, "tochio": _2, "tokamachi": _2, "tsubame": _2, "tsunan": _2, "uonuma": _2, "yahiko": _2, "yoita": _2, "yuzawa": _2 } }, "oita": { "$": 1, "succ": { "beppu": _2, "bungoono": _2, "bungotakada": _2, "hasama": _2, "hiji": _2, "himeshima": _2, "hita": _2, "kamitsue": _2, "kokonoe": _2, "kuju": _2, "kunisaki": _2, "kusu": _2, "oita": _2, "saiki": _2, "taketa": _2, "tsukumi": _2, "usa": _2, "usuki": _2, "yufu": _2 } }, "okayama": { "$": 1, "succ": { "akaiwa": _2, "asakuchi": _2, "bizen": _2, "hayashima": _2, "ibara": _2, "kagamino": _2, "kasaoka": _2, "kibichuo": _2, "kumenan": _2, "kurashiki": _2, "maniwa": _2, "misaki": _2, "nagi": _2, "niimi": _2, "nishiawakura": _2, "okayama": _2, "satosho": _2, "setouchi": _2, "shinjo": _2, "shoo": _2, "soja": _2, "takahashi": _2, "tamano": _2, "tsuyama": _2, "wake": _2, "yakage": _2 } }, "okinawa": { "$": 1, "succ": { "aguni": _2, "ginowan": _2, "ginoza": _2, "gushikami": _2, "haebaru": _2, "higashi": _2, "hirara": _2, "iheya": _2, "ishigaki": _2, "ishikawa": _2, "itoman": _2, "izena": _2, "kadena": _2, "kin": _2, "kitadaito": _2, "kitanakagusuku": _2, "kumejima": _2, "kunigami": _2, "minamidaito": _2, "motobu": _2, "nago": _2, "naha": _2, "nakagusuku": _2, "nakijin": _2, "nanjo": _2, "nishihara": _2, "ogimi": _2, "okinawa": _2, "onna": _2, "shimoji": _2, "taketomi": _2, "tarama": _2, "tokashiki": _2, "tomigusuku": _2, "tonaki": _2, "urasoe": _2, "uruma": _2, "yaese": _2, "yomitan": _2, "yonabaru": _2, "yonaguni": _2, "zamami": _2 } }, "osaka": { "$": 1, "succ": { "abeno": _2, "chihayaakasaka": _2, "chuo": _2, "daito": _2, "fujiidera": _2, "habikino": _2, "hannan": _2, "higashiosaka": _2, "higashisumiyoshi": _2, "higashiyodogawa": _2, "hirakata": _2, "ibaraki": _2, "ikeda": _2, "izumi": _2, "izumiotsu": _2, "izumisano": _2, "kadoma": _2, "kaizuka": _2, "kanan": _2, "kashiwara": _2, "katano": _2, "kawachinagano": _2, "kishiwada": _2, "kita": _2, "kumatori": _2, "matsubara": _2, "minato": _2, "minoh": _2, "misaki": _2, "moriguchi": _2, "neyagawa": _2, "nishi": _2, "nose": _2, "osakasayama": _2, "sakai": _2, "sayama": _2, "sennan": _2, "settsu": _2, "shijonawate": _2, "shimamoto": _2, "suita": _2, "tadaoka": _2, "taishi": _2, "tajiri": _2, "takaishi": _2, "takatsuki": _2, "tondabayashi": _2, "toyonaka": _2, "toyono": _2, "yao": _2 } }, "saga": { "$": 1, "succ": { "ariake": _2, "arita": _2, "fukudomi": _2, "genkai": _2, "hamatama": _2, "hizen": _2, "imari": _2, "kamimine": _2, "kanzaki": _2, "karatsu": _2, "kashima": _2, "kitagata": _2, "kitahata": _2, "kiyama": _2, "kouhoku": _2, "kyuragi": _2, "nishiarita": _2, "ogi": _2, "omachi": _2, "ouchi": _2, "saga": _2, "shiroishi": _2, "taku": _2, "tara": _2, "tosu": _2, "yoshinogari": _2 } }, "saitama": { "$": 1, "succ": { "arakawa": _2, "asaka": _2, "chichibu": _2, "fujimi": _2, "fujimino": _2, "fukaya": _2, "hanno": _2, "hanyu": _2, "hasuda": _2, "hatogaya": _2, "hatoyama": _2, "hidaka": _2, "higashichichibu": _2, "higashimatsuyama": _2, "honjo": _2, "ina": _2, "iruma": _2, "iwatsuki": _2, "kamiizumi": _2, "kamikawa": _2, "kamisato": _2, "kasukabe": _2, "kawagoe": _2, "kawaguchi": _2, "kawajima": _2, "kazo": _2, "kitamoto": _2, "koshigaya": _2, "kounosu": _2, "kuki": _2, "kumagaya": _2, "matsubushi": _2, "minano": _2, "misato": _2, "miyashiro": _2, "miyoshi": _2, "moroyama": _2, "nagatoro": _2, "namegawa": _2, "niiza": _2, "ogano": _2, "ogawa": _2, "ogose": _2, "okegawa": _2, "omiya": _2, "otaki": _2, "ranzan": _2, "ryokami": _2, "saitama": _2, "sakado": _2, "satte": _2, "sayama": _2, "shiki": _2, "shiraoka": _2, "soka": _2, "sugito": _2, "toda": _2, "tokigawa": _2, "tokorozawa": _2, "tsurugashima": _2, "urawa": _2, "warabi": _2, "yashio": _2, "yokoze": _2, "yono": _2, "yorii": _2, "yoshida": _2, "yoshikawa": _2, "yoshimi": _2 } }, "shiga": { "$": 1, "succ": { "aisho": _2, "gamo": _2, "higashiomi": _2, "hikone": _2, "koka": _2, "konan": _2, "kosei": _2, "koto": _2, "kusatsu": _2, "maibara": _2, "moriyama": _2, "nagahama": _2, "nishiazai": _2, "notogawa": _2, "omihachiman": _2, "otsu": _2, "ritto": _2, "ryuoh": _2, "takashima": _2, "takatsuki": _2, "torahime": _2, "toyosato": _2, "yasu": _2 } }, "shimane": { "$": 1, "succ": { "akagi": _2, "ama": _2, "gotsu": _2, "hamada": _2, "higashiizumo": _2, "hikawa": _2, "hikimi": _2, "izumo": _2, "kakinoki": _2, "masuda": _2, "matsue": _2, "misato": _2, "nishinoshima": _2, "ohda": _2, "okinoshima": _2, "okuizumo": _2, "shimane": _2, "tamayu": _2, "tsuwano": _2, "unnan": _2, "yakumo": _2, "yasugi": _2, "yatsuka": _2 } }, "shizuoka": { "$": 1, "succ": { "arai": _2, "atami": _2, "fuji": _2, "fujieda": _2, "fujikawa": _2, "fujinomiya": _2, "fukuroi": _2, "gotemba": _2, "haibara": _2, "hamamatsu": _2, "higashiizu": _2, "ito": _2, "iwata": _2, "izu": _2, "izunokuni": _2, "kakegawa": _2, "kannami": _2, "kawanehon": _2, "kawazu": _2, "kikugawa": _2, "kosai": _2, "makinohara": _2, "matsuzaki": _2, "minamiizu": _2, "mishima": _2, "morimachi": _2, "nishiizu": _2, "numazu": _2, "omaezaki": _2, "shimada": _2, "shimizu": _2, "shimoda": _2, "shizuoka": _2, "susono": _2, "yaizu": _2, "yoshida": _2 } }, "tochigi": { "$": 1, "succ": { "ashikaga": _2, "bato": _2, "haga": _2, "ichikai": _2, "iwafune": _2, "kaminokawa": _2, "kanuma": _2, "karasuyama": _2, "kuroiso": _2, "mashiko": _2, "mibu": _2, "moka": _2, "motegi": _2, "nasu": _2, "nasushiobara": _2, "nikko": _2, "nishikata": _2, "nogi": _2, "ohira": _2, "ohtawara": _2, "oyama": _2, "sakura": _2, "sano": _2, "shimotsuke": _2, "shioya": _2, "takanezawa": _2, "tochigi": _2, "tsuga": _2, "ujiie": _2, "utsunomiya": _2, "yaita": _2 } }, "tokushima": { "$": 1, "succ": { "aizumi": _2, "anan": _2, "ichiba": _2, "itano": _2, "kainan": _2, "komatsushima": _2, "matsushige": _2, "mima": _2, "minami": _2, "miyoshi": _2, "mugi": _2, "nakagawa": _2, "naruto": _2, "sanagochi": _2, "shishikui": _2, "tokushima": _2, "wajiki": _2 } }, "tokyo": { "$": 1, "succ": { "adachi": _2, "akiruno": _2, "akishima": _2, "aogashima": _2, "arakawa": _2, "bunkyo": _2, "chiyoda": _2, "chofu": _2, "chuo": _2, "edogawa": _2, "fuchu": _2, "fussa": _2, "hachijo": _2, "hachioji": _2, "hamura": _2, "higashikurume": _2, "higashimurayama": _2, "higashiyamato": _2, "hino": _2, "hinode": _2, "hinohara": _2, "inagi": _2, "itabashi": _2, "katsushika": _2, "kita": _2, "kiyose": _2, "kodaira": _2, "koganei": _2, "kokubunji": _2, "komae": _2, "koto": _2, "kouzushima": _2, "kunitachi": _2, "machida": _2, "meguro": _2, "minato": _2, "mitaka": _2, "mizuho": _2, "musashimurayama": _2, "musashino": _2, "nakano": _2, "nerima": _2, "ogasawara": _2, "okutama": _2, "ome": _2, "oshima": _2, "ota": _2, "setagaya": _2, "shibuya": _2, "shinagawa": _2, "shinjuku": _2, "suginami": _2, "sumida": _2, "tachikawa": _2, "taito": _2, "tama": _2, "toshima": _2 } }, "tottori": { "$": 1, "succ": { "chizu": _2, "hino": _2, "kawahara": _2, "koge": _2, "kotoura": _2, "misasa": _2, "nanbu": _2, "nichinan": _2, "sakaiminato": _2, "tottori": _2, "wakasa": _2, "yazu": _2, "yonago": _2 } }, "toyama": { "$": 1, "succ": { "asahi": _2, "fuchu": _2, "fukumitsu": _2, "funahashi": _2, "himi": _2, "imizu": _2, "inami": _2, "johana": _2, "kamiichi": _2, "kurobe": _2, "nakaniikawa": _2, "namerikawa": _2, "nanto": _2, "nyuzen": _2, "oyabe": _2, "taira": _2, "takaoka": _2, "tateyama": _2, "toga": _2, "tonami": _2, "toyama": _2, "unazuki": _2, "uozu": _2, "yamada": _2 } }, "wakayama": { "$": 1, "succ": { "arida": _2, "aridagawa": _2, "gobo": _2, "hashimoto": _2, "hidaka": _2, "hirogawa": _2, "inami": _2, "iwade": _2, "kainan": _2, "kamitonda": _2, "katsuragi": _2, "kimino": _2, "kinokawa": _2, "kitayama": _2, "koya": _2, "koza": _2, "kozagawa": _2, "kudoyama": _2, "kushimoto": _2, "mihama": _2, "misato": _2, "nachikatsuura": _2, "shingu": _2, "shirahama": _2, "taiji": _2, "tanabe": _2, "wakayama": _2, "yuasa": _2, "yura": _2 } }, "yamagata": { "$": 1, "succ": { "asahi": _2, "funagata": _2, "higashine": _2, "iide": _2, "kahoku": _2, "kaminoyama": _2, "kaneyama": _2, "kawanishi": _2, "mamurogawa": _2, "mikawa": _2, "murayama": _2, "nagai": _2, "nakayama": _2, "nanyo": _2, "nishikawa": _2, "obanazawa": _2, "oe": _2, "oguni": _2, "ohkura": _2, "oishida": _2, "sagae": _2, "sakata": _2, "sakegawa": _2, "shinjo": _2, "shirataka": _2, "shonai": _2, "takahata": _2, "tendo": _2, "tozawa": _2, "tsuruoka": _2, "yamagata": _2, "yamanobe": _2, "yonezawa": _2, "yuza": _2 } }, "yamaguchi": { "$": 1, "succ": { "abu": _2, "hagi": _2, "hikari": _2, "hofu": _2, "iwakuni": _2, "kudamatsu": _2, "mitou": _2, "nagato": _2, "oshima": _2, "shimonoseki": _2, "shunan": _2, "tabuse": _2, "tokuyama": _2, "toyota": _2, "ube": _2, "yuu": _2 } }, "yamanashi": { "$": 1, "succ": { "chuo": _2, "doshi": _2, "fuefuki": _2, "fujikawa": _2, "fujikawaguchiko": _2, "fujiyoshida": _2, "hayakawa": _2, "hokuto": _2, "ichikawamisato": _2, "kai": _2, "kofu": _2, "koshu": _2, "kosuge": _2, "minami-alps": _2, "minobu": _2, "nakamichi": _2, "nanbu": _2, "narusawa": _2, "nirasaki": _2, "nishikatsura": _2, "oshino": _2, "otsuki": _2, "showa": _2, "tabayama": _2, "tsuru": _2, "uenohara": _2, "yamanakako": _2, "yamanashi": _2 } }, "xn--4pvxs": _2, "栃木": _2, "xn--vgu402c": _2, "愛知": _2, "xn--c3s14m": _2, "愛媛": _2, "xn--f6qx53a": _2, "兵庫": _2, "xn--8pvr4u": _2, "熊本": _2, "xn--uist22h": _2, "茨城": _2, "xn--djrs72d6uy": _2, "北海道": _2, "xn--mkru45i": _2, "千葉": _2, "xn--0trq7p7nn": _2, "和歌山": _2, "xn--8ltr62k": _2, "長崎": _2, "xn--2m4a15e": _2, "長野": _2, "xn--efvn9s": _2, "新潟": _2, "xn--32vp30h": _2, "青森": _2, "xn--4it797k": _2, "静岡": _2, "xn--1lqs71d": _2, "東京": _2, "xn--5rtp49c": _2, "石川": _2, "xn--5js045d": _2, "埼玉": _2, "xn--ehqz56n": _2, "三重": _2, "xn--1lqs03n": _2, "京都": _2, "xn--qqqt11m": _2, "佐賀": _2, "xn--kbrq7o": _2, "大分": _2, "xn--pssu33l": _2, "大阪": _2, "xn--ntsq17g": _2, "奈良": _2, "xn--uisz3g": _2, "宮城": _2, "xn--6btw5a": _2, "宮崎": _2, "xn--1ctwo": _2, "富山": _2, "xn--6orx2r": _2, "山口": _2, "xn--rht61e": _2, "山形": _2, "xn--rht27z": _2, "山梨": _2, "xn--djty4k": _2, "岩手": _2, "xn--nit225k": _2, "岐阜": _2, "xn--rht3d": _2, "岡山": _2, "xn--klty5x": _2, "島根": _2, "xn--kltx9a": _2, "広島": _2, "xn--kltp7d": _2, "徳島": _2, "xn--uuwu58a": _2, "沖縄": _2, "xn--zbx025d": _2, "滋賀": _2, "xn--ntso0iqx3a": _2, "神奈川": _2, "xn--elqq16h": _2, "福井": _2, "xn--4it168d": _2, "福岡": _2, "xn--klt787d": _2, "福島": _2, "xn--rny31h": _2, "秋田": _2, "xn--7t0a264c": _2, "群馬": _2, "xn--5rtq34k": _2, "香川": _2, "xn--k7yn95e": _2, "高知": _2, "xn--tor131o": _2, "鳥取": _2, "xn--d5qv7z876c": _2, "鹿児島": _2, "kawasaki": _8, "kitakyushu": _8, "kobe": _8, "nagoya": _8, "sapporo": _8, "sendai": _8, "yokohama": _8, "buyshop": _3, "fashionstore": _3, "handcrafted": _3, "kawaiishop": _3, "supersale": _3, "theshop": _3, "usercontent": _3, "angry": _3, "babyblue": _3, "babymilk": _3, "backdrop": _3, "bambina": _3, "bitter": _3, "blush": _3, "boo": _3, "boy": _3, "boyfriend": _3, "but": _3, "candypop": _3, "capoo": _3, "catfood": _3, "cheap": _3, "chicappa": _3, "chillout": _3, "chips": _3, "chowder": _3, "chu": _3, "ciao": _3, "cocotte": _3, "coolblog": _3, "cranky": _3, "cutegirl": _3, "daa": _3, "deca": _3, "deci": _3, "digick": _3, "egoism": _3, "fakefur": _3, "fem": _3, "flier": _3, "floppy": _3, "fool": _3, "frenchkiss": _3, "girlfriend": _3, "girly": _3, "gloomy": _3, "gonna": _3, "greater": _3, "hacca": _3, "heavy": _3, "her": _3, "hiho": _3, "hippy": _3, "holy": _3, "hungry": _3, "icurus": _3, "itigo": _3, "jellybean": _3, "kikirara": _3, "kill": _3, "kilo": _3, "kuron": _3, "littlestar": _3, "lolipopmc": _3, "lolitapunk": _3, "lomo": _3, "lovepop": _3, "lovesick": _3, "main": _3, "mods": _3, "mond": _3, "mongolian": _3, "moo": _3, "namaste": _3, "nikita": _3, "nobushi": _3, "noor": _3, "oops": _3, "parallel": _3, "parasite": _3, "pecori": _3, "peewee": _3, "penne": _3, "pepper": _3, "perma": _3, "pigboat": _3, "pinoko": _3, "punyu": _3, "pupu": _3, "pussycat": _3, "pya": _3, "raindrop": _3, "readymade": _3, "sadist": _3, "schoolbus": _3, "secret": _3, "staba": _3, "stripper": _3, "sub": _3, "sunnyday": _3, "thick": _3, "tonkotsu": _3, "under": _3, "upper": _3, "velvet": _3, "verse": _3, "versus": _3, "vivian": _3, "watson": _3, "weblike": _3, "whitesnow": _3, "zombie": _3, "blogspot": _3, "2-d": _3, "bona": _3, "crap": _3, "daynight": _3, "eek": _3, "flop": _3, "halfmoon": _3, "jeez": _3, "matrix": _3, "mimoza": _3, "netgamers": _3, "nyanta": _3, "o0o0": _3, "rdy": _3, "rgr": _3, "rulez": _3, "sakurastorage": { "$": 0, "succ": { "isk01": _12, "isk02": _12 } }, "saloon": _3, "sblo": _3, "skr": _3, "tank": _3, "uh-oh": _3, "undo": _3, "webaccel": { "$": 0, "succ": { "rs": _3, "user": _3 } }, "websozai": _3, "xii": _3 } }, "ke": { "$": 1, "succ": { "ac": _2, "co": _6, "go": _2, "info": _2, "me": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2 } }, "kg": { "$": 1, "succ": { "org": _2, "net": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "blog": _3, "io": _3, "jp": _3, "tv": _3, "uk": _3, "us": _3 } }, "kh": _8, "ki": _33, "km": { "$": 1, "succ": { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "ass": _2, "com": _2, "coop": _2, "asso": _2, "presse": _2, "medecin": _2, "notaires": _2, "pharmaciens": _2, "veterinaire": _2, "gouv": _2 } }, "kn": { "$": 1, "succ": { "net": _2, "org": _2, "edu": _2, "gov": _2 } }, "kp": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "rep": _2, "tra": _2 } }, "kr": { "$": 1, "succ": { "ac": _2, "co": _2, "es": _2, "go": _2, "hs": _2, "kg": _2, "mil": _2, "ms": _2, "ne": _2, "or": _2, "pe": _2, "re": _2, "sc": _2, "busan": _2, "chungbuk": _2, "chungnam": _2, "daegu": _2, "daejeon": _2, "gangwon": _2, "gwangju": _2, "gyeongbuk": _2, "gyeonggi": _2, "gyeongnam": _2, "incheon": _2, "jeju": _2, "jeonbuk": _2, "jeonnam": _2, "seoul": _2, "ulsan": _2, "blogspot": _3 } }, "kw": { "$": 1, "succ": { "com": _2, "edu": _2, "emb": _2, "gov": _2, "ind": _2, "net": _2, "org": _2 } }, "ky": _25, "kz": { "$": 1, "succ": { "org": _2, "edu": _2, "net": _2, "gov": _2, "mil": _2, "com": _2, "jcloud": _3, "kazteleport": { "$": 0, "succ": { "upaas": _3 } } } }, "la": { "$": 1, "succ": { "int": _2, "net": _2, "info": _2, "edu": _2, "gov": _2, "per": _2, "com": _2, "org": _2, "bnr": _3, "c": _3 } }, "lb": _4, "lc": { "$": 1, "succ": { "com": _2, "net": _2, "co": _2, "org": _2, "edu": _2, "gov": _2, "oy": _3 } }, "li": { "$": 1, "succ": { "blogspot": _3, "caa": _3 } }, "lk": { "$": 1, "succ": { "gov": _2, "sch": _2, "net": _2, "int": _2, "com": _2, "org": _2, "edu": _2, "ngo": _2, "soc": _2, "web": _2, "ltd": _2, "assn": _2, "grp": _2, "hotel": _2, "ac": _2 } }, "lr": _4, "ls": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "edu": _2, "gov": _2, "info": _2, "net": _2, "org": _2, "sc": _2, "de": _3 } }, "lt": _34, "lu": { "$": 1, "succ": { "blogspot": _3, "123website": _3 } }, "lv": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "org": _2, "mil": _2, "id": _2, "net": _2, "asn": _2, "conf": _2 } }, "ly": { "$": 1, "succ": { "com": _2, "net": _2, "gov": _2, "plc": _2, "edu": _2, "sch": _2, "med": _2, "org": _2, "id": _2 } }, "ma": { "$": 1, "succ": { "co": _2, "net": _2, "gov": _2, "org": _2, "ac": _2, "press": _2 } }, "mc": { "$": 1, "succ": { "tm": _2, "asso": _2 } }, "md": { "$": 1, "succ": { "blogspot": _3, "at": _3, "de": _3, "jp": _3, "to": _3 } }, "me": { "$": 1, "succ": { "co": _2, "net": _2, "org": _2, "edu": _2, "ac": _2, "gov": _2, "its": _2, "priv": _2, "c66": _3, "daplie": { "$": 2, "succ": { "localhost": _3 } }, "edgestack": _3, "filegear": _3, "filegear-au": _3, "filegear-de": _3, "filegear-gb": _3, "filegear-ie": _3, "filegear-jp": _3, "filegear-sg": _3, "glitch": _3, "ravendb": _3, "lohmus": _3, "barsy": _3, "mcpe": _3, "mcdir": _3, "soundcast": _3, "tcp4": _3, "brasilia": _3, "ddns": _3, "dnsfor": _3, "hopto": _3, "loginto": _3, "noip": _3, "webhop": _3, "vp4": _3, "diskstation": _3, "dscloud": _3, "i234": _3, "myds": _3, "synology": _3, "transip": _23, "wedeploy": _3, "yombo": _3, "nohost": _3 } }, "mg": { "$": 1, "succ": { "org": _2, "nom": _2, "gov": _2, "prd": _2, "tm": _2, "edu": _2, "mil": _2, "com": _2, "co": _2 } }, "mh": _2, "mil": _2, "mk": { "$": 1, "succ": { "com": _2, "org": _2, "net": _2, "edu": _2, "gov": _2, "inf": _2, "name": _2, "blogspot": _3 } }, "ml": { "$": 1, "succ": { "com": _2, "edu": _2, "gouv": _2, "gov": _2, "net": _2, "org": _2, "presse": _2 } }, "mm": _8, "mn": { "$": 1, "succ": { "gov": _2, "edu": _2, "org": _2, "nyc": _3 } }, "mo": _4, "mobi": { "$": 1, "succ": { "barsy": _3, "dscloud": _3 } }, "mp": { "$": 1, "succ": { "ju": _3 } }, "mq": _2, "mr": _34, "ms": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "net": _2, "org": _2, "lab": _3, "minisite": _3 } }, "mt": { "$": 1, "succ": { "com": _6, "edu": _2, "net": _2, "org": _2 } }, "mu": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "ac": _2, "co": _2, "or": _2 } }, "museum": { "$": 1, "succ": { "academy": _2, "agriculture": _2, "air": _2, "airguard": _2, "alabama": _2, "alaska": _2, "amber": _2, "ambulance": _2, "american": _2, "americana": _2, "americanantiques": _2, "americanart": _2, "amsterdam": _2, "and": _2, "annefrank": _2, "anthro": _2, "anthropology": _2, "antiques": _2, "aquarium": _2, "arboretum": _2, "archaeological": _2, "archaeology": _2, "architecture": _2, "art": _2, "artanddesign": _2, "artcenter": _2, "artdeco": _2, "arteducation": _2, "artgallery": _2, "arts": _2, "artsandcrafts": _2, "asmatart": _2, "assassination": _2, "assisi": _2, "association": _2, "astronomy": _2, "atlanta": _2, "austin": _2, "australia": _2, "automotive": _2, "aviation": _2, "axis": _2, "badajoz": _2, "baghdad": _2, "bahn": _2, "bale": _2, "baltimore": _2, "barcelona": _2, "baseball": _2, "basel": _2, "baths": _2, "bauern": _2, "beauxarts": _2, "beeldengeluid": _2, "bellevue": _2, "bergbau": _2, "berkeley": _2, "berlin": _2, "bern": _2, "bible": _2, "bilbao": _2, "bill": _2, "birdart": _2, "birthplace": _2, "bonn": _2, "boston": _2, "botanical": _2, "botanicalgarden": _2, "botanicgarden": _2, "botany": _2, "brandywinevalley": _2, "brasil": _2, "bristol": _2, "british": _2, "britishcolumbia": _2, "broadcast": _2, "brunel": _2, "brussel": _2, "brussels": _2, "bruxelles": _2, "building": _2, "burghof": _2, "bus": _2, "bushey": _2, "cadaques": _2, "california": _2, "cambridge": _2, "can": _2, "canada": _2, "capebreton": _2, "carrier": _2, "cartoonart": _2, "casadelamoneda": _2, "castle": _2, "castres": _2, "celtic": _2, "center": _2, "chattanooga": _2, "cheltenham": _2, "chesapeakebay": _2, "chicago": _2, "children": _2, "childrens": _2, "childrensgarden": _2, "chiropractic": _2, "chocolate": _2, "christiansburg": _2, "cincinnati": _2, "cinema": _2, "circus": _2, "civilisation": _2, "civilization": _2, "civilwar": _2, "clinton": _2, "clock": _2, "coal": _2, "coastaldefence": _2, "cody": _2, "coldwar": _2, "collection": _2, "colonialwilliamsburg": _2, "coloradoplateau": _2, "columbia": _2, "columbus": _2, "communication": _2, "communications": _2, "community": _2, "computer": _2, "computerhistory": _2, "xn--comunicaes-v6a2o": _2, "comunicações": _2, "contemporary": _2, "contemporaryart": _2, "convent": _2, "copenhagen": _2, "corporation": _2, "xn--correios-e-telecomunicaes-ghc29a": _2, "correios-e-telecomunicações": _2, "corvette": _2, "costume": _2, "countryestate": _2, "county": _2, "crafts": _2, "cranbrook": _2, "creation": _2, "cultural": _2, "culturalcenter": _2, "culture": _2, "cyber": _2, "cymru": _2, "dali": _2, "dallas": _2, "database": _2, "ddr": _2, "decorativearts": _2, "delaware": _2, "delmenhorst": _2, "denmark": _2, "depot": _2, "design": _2, "detroit": _2, "dinosaur": _2, "discovery": _2, "dolls": _2, "donostia": _2, "durham": _2, "eastafrica": _2, "eastcoast": _2, "education": _2, "educational": _2, "egyptian": _2, "eisenbahn": _2, "elburg": _2, "elvendrell": _2, "embroidery": _2, "encyclopedic": _2, "england": _2, "entomology": _2, "environment": _2, "environmentalconservation": _2, "epilepsy": _2, "essex": _2, "estate": _2, "ethnology": _2, "exeter": _2, "exhibition": _2, "family": _2, "farm": _2, "farmequipment": _2, "farmers": _2, "farmstead": _2, "field": _2, "figueres": _2, "filatelia": _2, "film": _2, "fineart": _2, "finearts": _2, "finland": _2, "flanders": _2, "florida": _2, "force": _2, "fortmissoula": _2, "fortworth": _2, "foundation": _2, "francaise": _2, "frankfurt": _2, "franziskaner": _2, "freemasonry": _2, "freiburg": _2, "fribourg": _2, "frog": _2, "fundacio": _2, "furniture": _2, "gallery": _2, "garden": _2, "gateway": _2, "geelvinck": _2, "gemological": _2, "geology": _2, "georgia": _2, "giessen": _2, "glas": _2, "glass": _2, "gorge": _2, "grandrapids": _2, "graz": _2, "guernsey": _2, "halloffame": _2, "hamburg": _2, "handson": _2, "harvestcelebration": _2, "hawaii": _2, "health": _2, "heimatunduhren": _2, "hellas": _2, "helsinki": _2, "hembygdsforbund": _2, "heritage": _2, "histoire": _2, "historical": _2, "historicalsociety": _2, "historichouses": _2, "historisch": _2, "historisches": _2, "history": _2, "historyofscience": _2, "horology": _2, "house": _2, "humanities": _2, "illustration": _2, "imageandsound": _2, "indian": _2, "indiana": _2, "indianapolis": _2, "indianmarket": _2, "intelligence": _2, "interactive": _2, "iraq": _2, "iron": _2, "isleofman": _2, "jamison": _2, "jefferson": _2, "jerusalem": _2, "jewelry": _2, "jewish": _2, "jewishart": _2, "jfk": _2, "journalism": _2, "judaica": _2, "judygarland": _2, "juedisches": _2, "juif": _2, "karate": _2, "karikatur": _2, "kids": _2, "koebenhavn": _2, "koeln": _2, "kunst": _2, "kunstsammlung": _2, "kunstunddesign": _2, "labor": _2, "labour": _2, "lajolla": _2, "lancashire": _2, "landes": _2, "lans": _2, "xn--lns-qla": _2, "läns": _2, "larsson": _2, "lewismiller": _2, "lincoln": _2, "linz": _2, "living": _2, "livinghistory": _2, "localhistory": _2, "london": _2, "losangeles": _2, "louvre": _2, "loyalist": _2, "lucerne": _2, "luxembourg": _2, "luzern": _2, "mad": _2, "madrid": _2, "mallorca": _2, "manchester": _2, "mansion": _2, "mansions": _2, "manx": _2, "marburg": _2, "maritime": _2, "maritimo": _2, "maryland": _2, "marylhurst": _2, "media": _2, "medical": _2, "medizinhistorisches": _2, "meeres": _2, "memorial": _2, "mesaverde": _2, "michigan": _2, "midatlantic": _2, "military": _2, "mill": _2, "miners": _2, "mining": _2, "minnesota": _2, "missile": _2, "missoula": _2, "modern": _2, "moma": _2, "money": _2, "monmouth": _2, "monticello": _2, "montreal": _2, "moscow": _2, "motorcycle": _2, "muenchen": _2, "muenster": _2, "mulhouse": _2, "muncie": _2, "museet": _2, "museumcenter": _2, "museumvereniging": _2, "music": _2, "national": _2, "nationalfirearms": _2, "nationalheritage": _2, "nativeamerican": _2, "naturalhistory": _2, "naturalhistorymuseum": _2, "naturalsciences": _2, "nature": _2, "naturhistorisches": _2, "natuurwetenschappen": _2, "naumburg": _2, "naval": _2, "nebraska": _2, "neues": _2, "newhampshire": _2, "newjersey": _2, "newmexico": _2, "newport": _2, "newspaper": _2, "newyork": _2, "niepce": _2, "norfolk": _2, "north": _2, "nrw": _2, "nyc": _2, "nyny": _2, "oceanographic": _2, "oceanographique": _2, "omaha": _2, "online": _2, "ontario": _2, "openair": _2, "oregon": _2, "oregontrail": _2, "otago": _2, "oxford": _2, "pacific": _2, "paderborn": _2, "palace": _2, "paleo": _2, "palmsprings": _2, "panama": _2, "paris": _2, "pasadena": _2, "pharmacy": _2, "philadelphia": _2, "philadelphiaarea": _2, "philately": _2, "phoenix": _2, "photography": _2, "pilots": _2, "pittsburgh": _2, "planetarium": _2, "plantation": _2, "plants": _2, "plaza": _2, "portal": _2, "portland": _2, "portlligat": _2, "posts-and-telecommunications": _2, "preservation": _2, "presidio": _2, "press": _2, "project": _2, "public": _2, "pubol": _2, "quebec": _2, "railroad": _2, "railway": _2, "research": _2, "resistance": _2, "riodejaneiro": _2, "rochester": _2, "rockart": _2, "roma": _2, "russia": _2, "saintlouis": _2, "salem": _2, "salvadordali": _2, "salzburg": _2, "sandiego": _2, "sanfrancisco": _2, "santabarbara": _2, "santacruz": _2, "santafe": _2, "saskatchewan": _2, "satx": _2, "savannahga": _2, "schlesisches": _2, "schoenbrunn": _2, "schokoladen": _2, "school": _2, "schweiz": _2, "science": _2, "scienceandhistory": _2, "scienceandindustry": _2, "sciencecenter": _2, "sciencecenters": _2, "science-fiction": _2, "sciencehistory": _2, "sciences": _2, "sciencesnaturelles": _2, "scotland": _2, "seaport": _2, "settlement": _2, "settlers": _2, "shell": _2, "sherbrooke": _2, "sibenik": _2, "silk": _2, "ski": _2, "skole": _2, "society": _2, "sologne": _2, "soundandvision": _2, "southcarolina": _2, "southwest": _2, "space": _2, "spy": _2, "square": _2, "stadt": _2, "stalbans": _2, "starnberg": _2, "state": _2, "stateofdelaware": _2, "station": _2, "steam": _2, "steiermark": _2, "stjohn": _2, "stockholm": _2, "stpetersburg": _2, "stuttgart": _2, "suisse": _2, "surgeonshall": _2, "surrey": _2, "svizzera": _2, "sweden": _2, "sydney": _2, "tank": _2, "tcm": _2, "technology": _2, "telekommunikation": _2, "television": _2, "texas": _2, "textile": _2, "theater": _2, "time": _2, "timekeeping": _2, "topology": _2, "torino": _2, "touch": _2, "town": _2, "transport": _2, "tree": _2, "trolley": _2, "trust": _2, "trustee": _2, "uhren": _2, "ulm": _2, "undersea": _2, "university": _2, "usa": _2, "usantiques": _2, "usarts": _2, "uscountryestate": _2, "usculture": _2, "usdecorativearts": _2, "usgarden": _2, "ushistory": _2, "ushuaia": _2, "uslivinghistory": _2, "utah": _2, "uvic": _2, "valley": _2, "vantaa": _2, "versailles": _2, "viking": _2, "village": _2, "virginia": _2, "virtual": _2, "virtuel": _2, "vlaanderen": _2, "volkenkunde": _2, "wales": _2, "wallonie": _2, "war": _2, "washingtondc": _2, "watchandclock": _2, "watch-and-clock": _2, "western": _2, "westfalen": _2, "whaling": _2, "wildlife": _2, "williamsburg": _2, "windmill": _2, "workshop": _2, "york": _2, "yorkshire": _2, "yosemite": _2, "youth": _2, "zoological": _2, "zoology": _2, "xn--9dbhblg6di": _2, "ירושלים": _2, "xn--h1aegh": _2, "иком": _2 } }, "mv": { "$": 1, "succ": { "aero": _2, "biz": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "museum": _2, "name": _2, "net": _2, "org": _2, "pro": _2 } }, "mw": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "coop": _2, "edu": _2, "gov": _2, "int": _2, "museum": _2, "net": _2, "org": _2 } }, "mx": { "$": 1, "succ": { "com": _2, "org": _2, "gob": _2, "edu": _2, "net": _2, "blogspot": _3 } }, "my": { "$": 1, "succ": { "biz": _2, "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "blogspot": _3 } }, "mz": { "$": 1, "succ": { "ac": _2, "adv": _2, "co": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "na": { "$": 1, "succ": { "info": _2, "pro": _2, "name": _2, "school": _2, "or": _2, "dr": _2, "us": _2, "mx": _2, "ca": _2, "in": _2, "cc": _2, "tv": _2, "ws": _2, "mobi": _2, "co": _2, "com": _2, "org": _2 } }, "name": { "$": 1, "succ": { "her": _37, "his": _37 } }, "nc": { "$": 1, "succ": { "asso": _2, "nom": _2 } }, "ne": _2, "net": { "$": 1, "succ": { "adobeaemcloud": _3, "adobeio-static": _3, "adobeioruntime": _3, "akadns": _3, "akamai": _3, "akamai-staging": _3, "akamaiedge": _3, "akamaiedge-staging": _3, "akamaihd": _3, "akamaihd-staging": _3, "akamaiorigin": _3, "akamaiorigin-staging": _3, "akamaized": _3, "akamaized-staging": _3, "edgekey": _3, "edgekey-staging": _3, "edgesuite": _3, "edgesuite-staging": _3, "alwaysdata": _3, "myamaze": _3, "cloudfront": _3, "t3l3p0rt": _3, "appudo": _3, "atlassian-dev": { "$": 0, "succ": { "prod": { "$": 0, "succ": { "cdn": _3 } } } }, "myfritz": _3, "onavstack": _3, "shopselect": _3, "blackbaudcdn": _3, "boomla": _3, "bplaced": _3, "square7": _3, "gb": _3, "hu": _3, "jp": _3, "se": _3, "uk": _3, "in": _3, "clickrising": _3, "cloudaccess": _3, "cdn77-ssl": _3, "cdn77": { "$": 0, "succ": { "r": _3 } }, "feste-ip": _3, "knx-server": _3, "static-access": _3, "cryptonomic": _5, "dattolocal": _3, "mydatto": _3, "debian": _3, "bitbridge": _3, "at-band-camp": _3, "blogdns": _3, "broke-it": _3, "buyshouses": _3, "dnsalias": _3, "dnsdojo": _3, "does-it": _3, "dontexist": _3, "dynalias": _3, "dynathome": _3, "endofinternet": _3, "from-az": _3, "from-co": _3, "from-la": _3, "from-ny": _3, "gets-it": _3, "ham-radio-op": _3, "homeftp": _3, "homeip": _3, "homelinux": _3, "homeunix": _3, "in-the-band": _3, "is-a-chef": _3, "is-a-geek": _3, "isa-geek": _3, "kicks-ass": _3, "office-on-the": _3, "podzone": _3, "scrapper-site": _3, "selfip": _3, "sells-it": _3, "servebbs": _3, "serveftp": _3, "thruhere": _3, "webhop": _3, "definima": _3, "casacam": _3, "dynu": _3, "dynv6": _3, "twmail": _3, "ru": _3, "channelsdvr": { "$": 2, "succ": { "u": _3 } }, "fastlylb": { "$": 2, "succ": { "map": _3 } }, "fastly": { "$": 0, "succ": { "freetls": _3, "map": _3, "prod": { "$": 0, "succ": { "a": _3, "global": _3 } }, "ssl": { "$": 0, "succ": { "a": _3, "b": _3, "global": _3 } } } }, "edgeapp": _3, "flynnhosting": _3, "cdn-edges": _3, "heteml": _3, "cloudfunctions": _3, "moonscale": _3, "in-dsl": _3, "in-vpn": _3, "ipifony": _3, "iobb": _3, "cloudjiffy": { "$": 2, "succ": { "fra1-de": _3, "west1-us": _3 } }, "elastx": { "$": 0, "succ": { "jls-sto1": _3, "jls-sto2": _3, "jls-sto3": _3 } }, "faststacks": _3, "massivegrid": { "$": 0, "succ": { "paas": { "$": 0, "succ": { "fr-1": _3, "lon-1": _3, "lon-2": _3, "ny-1": _3, "ny-2": _3, "sg-1": _3 } } } }, "saveincloud": { "$": 0, "succ": { "jelastic": _3, "nordeste-idc": _3 } }, "scaleforce": _26, "tsukaeru": _27, "kinghost": _3, "uni5": _3, "krellian": _3, "barsy": _3, "memset": _3, "azurewebsites": _3, "azure-mobile": _3, "cloudapp": _3, "azurestaticapps": { "$": 2, "succ": { "1": _3, "2": _3, "3": _3, "centralus": _3, "eastasia": _3, "eastus2": _3, "westeurope": _3, "westus2": _3 } }, "dnsup": _3, "hicam": _3, "now-dns": _3, "ownip": _3, "vpndns": _3, "eating-organic": _3, "mydissent": _3, "myeffect": _3, "mymediapc": _3, "mypsx": _3, "mysecuritycamera": _3, "nhlfan": _3, "no-ip": _3, "pgafan": _3, "privatizehealthinsurance": _3, "bounceme": _3, "ddns": _3, "redirectme": _3, "serveblog": _3, "serveminecraft": _3, "sytes": _3, "cloudycluster": _3, "ovh": { "$": 0, "succ": { "webpaas": _5, "hosting": _5 } }, "bar0": _3, "bar1": _3, "bar2": _3, "rackmaze": _3, "squares": _3, "schokokeks": _3, "firewall-gateway": _3, "seidat": _3, "senseering": _3, "siteleaf": _3, "vps-host": { "$": 2, "succ": { "jelastic": { "$": 0, "succ": { "atl": _3, "njs": _3, "ric": _3 } } } }, "myspreadshop": _3, "srcf": { "$": 0, "succ": { "soc": _3, "user": _3 } }, "supabase": _3, "dsmynas": _3, "familyds": _3, "tailscale": { "$": 0, "succ": { "beta": _3 } }, "ts": _3, "torproject": { "$": 2, "succ": { "pages": _3 } }, "reserve-online": _3, "community-pro": _3, "meinforum": _3, "yandexcloud": { "$": 2, "succ": { "storage": _3, "website": _3 } }, "za": _3 } }, "nf": { "$": 1, "succ": { "com": _2, "net": _2, "per": _2, "rec": _2, "web": _2, "arts": _2, "firm": _2, "info": _2, "other": _2, "store": _2 } }, "ng": { "$": 1, "succ": { "com": _6, "edu": _2, "gov": _2, "i": _2, "mil": _2, "mobi": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "col": _3, "firm": _3, "gen": _3, "ltd": _3, "ngo": _3 } }, "ni": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gob": _2, "in": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "web": _2 } }, "nl": { "$": 1, "succ": { "co": _3, "hosting-cluster": _3, "blogspot": _3, "gov": _3, "khplay": _3, "123website": _3, "myspreadshop": _3, "transurl": _5, "cistron": _3, "demon": _3 } }, "no": { "$": 1, "succ": { "fhs": _2, "vgs": _2, "fylkesbibl": _2, "folkebibl": _2, "museum": _2, "idrett": _2, "priv": _2, "mil": _2, "stat": _2, "dep": _2, "kommune": _2, "herad": _2, "aa": _38, "ah": _38, "bu": _38, "fm": _38, "hl": _38, "hm": _38, "jan-mayen": _38, "mr": _38, "nl": _38, "nt": _38, "of": _38, "ol": _38, "oslo": _38, "rl": _38, "sf": _38, "st": _38, "svalbard": _38, "tm": _38, "tr": _38, "va": _38, "vf": _38, "akrehamn": _2, "xn--krehamn-dxa": _2, "åkrehamn": _2, "algard": _2, "xn--lgrd-poac": _2, "ålgård": _2, "arna": _2, "brumunddal": _2, "bryne": _2, "bronnoysund": _2, "xn--brnnysund-m8ac": _2, "brønnøysund": _2, "drobak": _2, "xn--drbak-wua": _2, "drøbak": _2, "egersund": _2, "fetsund": _2, "floro": _2, "xn--flor-jra": _2, "florø": _2, "fredrikstad": _2, "hokksund": _2, "honefoss": _2, "xn--hnefoss-q1a": _2, "hønefoss": _2, "jessheim": _2, "jorpeland": _2, "xn--jrpeland-54a": _2, "jørpeland": _2, "kirkenes": _2, "kopervik": _2, "krokstadelva": _2, "langevag": _2, "xn--langevg-jxa": _2, "langevåg": _2, "leirvik": _2, "mjondalen": _2, "xn--mjndalen-64a": _2, "mjøndalen": _2, "mo-i-rana": _2, "mosjoen": _2, "xn--mosjen-eya": _2, "mosjøen": _2, "nesoddtangen": _2, "orkanger": _2, "osoyro": _2, "xn--osyro-wua": _2, "osøyro": _2, "raholt": _2, "xn--rholt-mra": _2, "råholt": _2, "sandnessjoen": _2, "xn--sandnessjen-ogb": _2, "sandnessjøen": _2, "skedsmokorset": _2, "slattum": _2, "spjelkavik": _2, "stathelle": _2, "stavern": _2, "stjordalshalsen": _2, "xn--stjrdalshalsen-sqb": _2, "stjørdalshalsen": _2, "tananger": _2, "tranby": _2, "vossevangen": _2, "afjord": _2, "xn--fjord-lra": _2, "åfjord": _2, "agdenes": _2, "al": _2, "xn--l-1fa": _2, "ål": _2, "alesund": _2, "xn--lesund-hua": _2, "ålesund": _2, "alstahaug": _2, "alta": _2, "xn--lt-liac": _2, "áltá": _2, "alaheadju": _2, "xn--laheadju-7ya": _2, "álaheadju": _2, "alvdal": _2, "amli": _2, "xn--mli-tla": _2, "åmli": _2, "amot": _2, "xn--mot-tla": _2, "åmot": _2, "andebu": _2, "andoy": _2, "xn--andy-ira": _2, "andøy": _2, "andasuolo": _2, "ardal": _2, "xn--rdal-poa": _2, "årdal": _2, "aremark": _2, "arendal": _2, "xn--s-1fa": _2, "ås": _2, "aseral": _2, "xn--seral-lra": _2, "åseral": _2, "asker": _2, "askim": _2, "askvoll": _2, "askoy": _2, "xn--asky-ira": _2, "askøy": _2, "asnes": _2, "xn--snes-poa": _2, "åsnes": _2, "audnedaln": _2, "aukra": _2, "aure": _2, "aurland": _2, "aurskog-holand": _2, "xn--aurskog-hland-jnb": _2, "aurskog-høland": _2, "austevoll": _2, "austrheim": _2, "averoy": _2, "xn--avery-yua": _2, "averøy": _2, "balestrand": _2, "ballangen": _2, "balat": _2, "xn--blt-elab": _2, "bálát": _2, "balsfjord": _2, "bahccavuotna": _2, "xn--bhccavuotna-k7a": _2, "báhccavuotna": _2, "bamble": _2, "bardu": _2, "beardu": _2, "beiarn": _2, "bajddar": _2, "xn--bjddar-pta": _2, "bájddar": _2, "baidar": _2, "xn--bidr-5nac": _2, "báidár": _2, "berg": _2, "bergen": _2, "berlevag": _2, "xn--berlevg-jxa": _2, "berlevåg": _2, "bearalvahki": _2, "xn--bearalvhki-y4a": _2, "bearalváhki": _2, "bindal": _2, "birkenes": _2, "bjarkoy": _2, "xn--bjarky-fya": _2, "bjarkøy": _2, "bjerkreim": _2, "bjugn": _2, "bodo": _2, "xn--bod-2na": _2, "bodø": _2, "badaddja": _2, "xn--bdddj-mrabd": _2, "bådåddjå": _2, "budejju": _2, "bokn": _2, "bremanger": _2, "bronnoy": _2, "xn--brnny-wuac": _2, "brønnøy": _2, "bygland": _2, "bykle": _2, "barum": _2, "xn--brum-voa": _2, "bærum": _2, "telemark": { "$": 0, "succ": { "bo": _2, "xn--b-5ga": _2, "bø": _2 } }, "nordland": { "$": 0, "succ": { "bo": _2, "xn--b-5ga": _2, "bø": _2, "heroy": _2, "xn--hery-ira": _2, "herøy": _2 } }, "bievat": _2, "xn--bievt-0qa": _2, "bievát": _2, "bomlo": _2, "xn--bmlo-gra": _2, "bømlo": _2, "batsfjord": _2, "xn--btsfjord-9za": _2, "båtsfjord": _2, "bahcavuotna": _2, "xn--bhcavuotna-s4a": _2, "báhcavuotna": _2, "dovre": _2, "drammen": _2, "drangedal": _2, "dyroy": _2, "xn--dyry-ira": _2, "dyrøy": _2, "donna": _2, "xn--dnna-gra": _2, "dønna": _2, "eid": _2, "eidfjord": _2, "eidsberg": _2, "eidskog": _2, "eidsvoll": _2, "eigersund": _2, "elverum": _2, "enebakk": _2, "engerdal": _2, "etne": _2, "etnedal": _2, "evenes": _2, "evenassi": _2, "xn--eveni-0qa01ga": _2, "evenášši": _2, "evje-og-hornnes": _2, "farsund": _2, "fauske": _2, "fuossko": _2, "fuoisku": _2, "fedje": _2, "fet": _2, "finnoy": _2, "xn--finny-yua": _2, "finnøy": _2, "fitjar": _2, "fjaler": _2, "fjell": _2, "flakstad": _2, "flatanger": _2, "flekkefjord": _2, "flesberg": _2, "flora": _2, "fla": _2, "xn--fl-zia": _2, "flå": _2, "folldal": _2, "forsand": _2, "fosnes": _2, "frei": _2, "frogn": _2, "froland": _2, "frosta": _2, "frana": _2, "xn--frna-woa": _2, "fræna": _2, "froya": _2, "xn--frya-hra": _2, "frøya": _2, "fusa": _2, "fyresdal": _2, "forde": _2, "xn--frde-gra": _2, "førde": _2, "gamvik": _2, "gangaviika": _2, "xn--ggaviika-8ya47h": _2, "gáŋgaviika": _2, "gaular": _2, "gausdal": _2, "gildeskal": _2, "xn--gildeskl-g0a": _2, "gildeskål": _2, "giske": _2, "gjemnes": _2, "gjerdrum": _2, "gjerstad": _2, "gjesdal": _2, "gjovik": _2, "xn--gjvik-wua": _2, "gjøvik": _2, "gloppen": _2, "gol": _2, "gran": _2, "grane": _2, "granvin": _2, "gratangen": _2, "grimstad": _2, "grong": _2, "kraanghke": _2, "xn--kranghke-b0a": _2, "kråanghke": _2, "grue": _2, "gulen": _2, "hadsel": _2, "halden": _2, "halsa": _2, "hamar": _2, "hamaroy": _2, "habmer": _2, "xn--hbmer-xqa": _2, "hábmer": _2, "hapmir": _2, "xn--hpmir-xqa": _2, "hápmir": _2, "hammerfest": _2, "hammarfeasta": _2, "xn--hmmrfeasta-s4ac": _2, "hámmárfeasta": _2, "haram": _2, "hareid": _2, "harstad": _2, "hasvik": _2, "aknoluokta": _2, "xn--koluokta-7ya57h": _2, "ákŋoluokta": _2, "hattfjelldal": _2, "aarborte": _2, "haugesund": _2, "hemne": _2, "hemnes": _2, "hemsedal": _2, "more-og-romsdal": { "$": 0, "succ": { "heroy": _2, "sande": _2 } }, "xn--mre-og-romsdal-qqb": { "$": 0, "succ": { "xn--hery-ira": _2, "sande": _2 } }, "møre-og-romsdal": { "$": 0, "succ": { "herøy": _2, "sande": _2 } }, "hitra": _2, "hjartdal": _2, "hjelmeland": _2, "hobol": _2, "xn--hobl-ira": _2, "hobøl": _2, "hof": _2, "hol": _2, "hole": _2, "holmestrand": _2, "holtalen": _2, "xn--holtlen-hxa": _2, "holtålen": _2, "hornindal": _2, "horten": _2, "hurdal": _2, "hurum": _2, "hvaler": _2, "hyllestad": _2, "hagebostad": _2, "xn--hgebostad-g3a": _2, "hægebostad": _2, "hoyanger": _2, "xn--hyanger-q1a": _2, "høyanger": _2, "hoylandet": _2, "xn--hylandet-54a": _2, "høylandet": _2, "ha": _2, "xn--h-2fa": _2, "hå": _2, "ibestad": _2, "inderoy": _2, "xn--indery-fya": _2, "inderøy": _2, "iveland": _2, "jevnaker": _2, "jondal": _2, "jolster": _2, "xn--jlster-bya": _2, "jølster": _2, "karasjok": _2, "karasjohka": _2, "xn--krjohka-hwab49j": _2, "kárášjohka": _2, "karlsoy": _2, "galsa": _2, "xn--gls-elac": _2, "gálsá": _2, "karmoy": _2, "xn--karmy-yua": _2, "karmøy": _2, "kautokeino": _2, "guovdageaidnu": _2, "klepp": _2, "klabu": _2, "xn--klbu-woa": _2, "klæbu": _2, "kongsberg": _2, "kongsvinger": _2, "kragero": _2, "xn--krager-gya": _2, "kragerø": _2, "kristiansand": _2, "kristiansund": _2, "krodsherad": _2, "xn--krdsherad-m8a": _2, "krødsherad": _2, "kvalsund": _2, "rahkkeravju": _2, "xn--rhkkervju-01af": _2, "ráhkkerávju": _2, "kvam": _2, "kvinesdal": _2, "kvinnherad": _2, "kviteseid": _2, "kvitsoy": _2, "xn--kvitsy-fya": _2, "kvitsøy": _2, "kvafjord": _2, "xn--kvfjord-nxa": _2, "kvæfjord": _2, "giehtavuoatna": _2, "kvanangen": _2, "xn--kvnangen-k0a": _2, "kvænangen": _2, "navuotna": _2, "xn--nvuotna-hwa": _2, "návuotna": _2, "kafjord": _2, "xn--kfjord-iua": _2, "kåfjord": _2, "gaivuotna": _2, "xn--givuotna-8ya": _2, "gáivuotna": _2, "larvik": _2, "lavangen": _2, "lavagis": _2, "loabat": _2, "xn--loabt-0qa": _2, "loabát": _2, "lebesby": _2, "davvesiida": _2, "leikanger": _2, "leirfjord": _2, "leka": _2, "leksvik": _2, "lenvik": _2, "leangaviika": _2, "xn--leagaviika-52b": _2, "leaŋgaviika": _2, "lesja": _2, "levanger": _2, "lier": _2, "lierne": _2, "lillehammer": _2, "lillesand": _2, "lindesnes": _2, "lindas": _2, "xn--linds-pra": _2, "lindås": _2, "lom": _2, "loppa": _2, "lahppi": _2, "xn--lhppi-xqa": _2, "láhppi": _2, "lund": _2, "lunner": _2, "luroy": _2, "xn--lury-ira": _2, "lurøy": _2, "luster": _2, "lyngdal": _2, "lyngen": _2, "ivgu": _2, "lardal": _2, "lerdal": _2, "xn--lrdal-sra": _2, "lærdal": _2, "lodingen": _2, "xn--ldingen-q1a": _2, "lødingen": _2, "lorenskog": _2, "xn--lrenskog-54a": _2, "lørenskog": _2, "loten": _2, "xn--lten-gra": _2, "løten": _2, "malvik": _2, "masoy": _2, "xn--msy-ula0h": _2, "måsøy": _2, "muosat": _2, "xn--muost-0qa": _2, "muosát": _2, "mandal": _2, "marker": _2, "marnardal": _2, "masfjorden": _2, "meland": _2, "meldal": _2, "melhus": _2, "meloy": _2, "xn--mely-ira": _2, "meløy": _2, "meraker": _2, "xn--merker-kua": _2, "meråker": _2, "moareke": _2, "xn--moreke-jua": _2, "moåreke": _2, "midsund": _2, "midtre-gauldal": _2, "modalen": _2, "modum": _2, "molde": _2, "moskenes": _2, "moss": _2, "mosvik": _2, "malselv": _2, "xn--mlselv-iua": _2, "målselv": _2, "malatvuopmi": _2, "xn--mlatvuopmi-s4a": _2, "málatvuopmi": _2, "namdalseid": _2, "aejrie": _2, "namsos": _2, "namsskogan": _2, "naamesjevuemie": _2, "xn--nmesjevuemie-tcba": _2, "nååmesjevuemie": _2, "laakesvuemie": _2, "nannestad": _2, "narvik": _2, "narviika": _2, "naustdal": _2, "nedre-eiker": _2, "akershus": _39, "buskerud": _39, "nesna": _2, "nesodden": _2, "nesseby": _2, "unjarga": _2, "xn--unjrga-rta": _2, "unjárga": _2, "nesset": _2, "nissedal": _2, "nittedal": _2, "nord-aurdal": _2, "nord-fron": _2, "nord-odal": _2, "norddal": _2, "nordkapp": _2, "davvenjarga": _2, "xn--davvenjrga-y4a": _2, "davvenjárga": _2, "nordre-land": _2, "nordreisa": _2, "raisa": _2, "xn--risa-5na": _2, "ráisa": _2, "nore-og-uvdal": _2, "notodden": _2, "naroy": _2, "xn--nry-yla5g": _2, "nærøy": _2, "notteroy": _2, "xn--nttery-byae": _2, "nøtterøy": _2, "odda": _2, "oksnes": _2, "xn--ksnes-uua": _2, "øksnes": _2, "oppdal": _2, "oppegard": _2, "xn--oppegrd-ixa": _2, "oppegård": _2, "orkdal": _2, "orland": _2, "xn--rland-uua": _2, "ørland": _2, "orskog": _2, "xn--rskog-uua": _2, "ørskog": _2, "orsta": _2, "xn--rsta-fra": _2, "ørsta": _2, "hedmark": { "$": 0, "succ": { "os": _2, "valer": _2, "xn--vler-qoa": _2, "våler": _2 } }, "hordaland": { "$": 0, "succ": { "os": _2 } }, "osen": _2, "osteroy": _2, "xn--ostery-fya": _2, "osterøy": _2, "ostre-toten": _2, "xn--stre-toten-zcb": _2, "østre-toten": _2, "overhalla": _2, "ovre-eiker": _2, "xn--vre-eiker-k8a": _2, "øvre-eiker": _2, "oyer": _2, "xn--yer-zna": _2, "øyer": _2, "oygarden": _2, "xn--ygarden-p1a": _2, "øygarden": _2, "oystre-slidre": _2, "xn--ystre-slidre-ujb": _2, "øystre-slidre": _2, "porsanger": _2, "porsangu": _2, "xn--porsgu-sta26f": _2, "porsáŋgu": _2, "porsgrunn": _2, "radoy": _2, "xn--rady-ira": _2, "radøy": _2, "rakkestad": _2, "rana": _2, "ruovat": _2, "randaberg": _2, "rauma": _2, "rendalen": _2, "rennebu": _2, "rennesoy": _2, "xn--rennesy-v1a": _2, "rennesøy": _2, "rindal": _2, "ringebu": _2, "ringerike": _2, "ringsaker": _2, "rissa": _2, "risor": _2, "xn--risr-ira": _2, "risør": _2, "roan": _2, "rollag": _2, "rygge": _2, "ralingen": _2, "xn--rlingen-mxa": _2, "rælingen": _2, "rodoy": _2, "xn--rdy-0nab": _2, "rødøy": _2, "romskog": _2, "xn--rmskog-bya": _2, "rømskog": _2, "roros": _2, "xn--rros-gra": _2, "røros": _2, "rost": _2, "xn--rst-0na": _2, "røst": _2, "royken": _2, "xn--ryken-vua": _2, "røyken": _2, "royrvik": _2, "xn--ryrvik-bya": _2, "røyrvik": _2, "rade": _2, "xn--rde-ula": _2, "råde": _2, "salangen": _2, "siellak": _2, "saltdal": _2, "salat": _2, "xn--slt-elab": _2, "sálát": _2, "xn--slat-5na": _2, "sálat": _2, "samnanger": _2, "vestfold": { "$": 0, "succ": { "sande": _2 } }, "sandefjord": _2, "sandnes": _2, "sandoy": _2, "xn--sandy-yua": _2, "sandøy": _2, "sarpsborg": _2, "sauda": _2, "sauherad": _2, "sel": _2, "selbu": _2, "selje": _2, "seljord": _2, "sigdal": _2, "siljan": _2, "sirdal": _2, "skaun": _2, "skedsmo": _2, "ski": _2, "skien": _2, "skiptvet": _2, "skjervoy": _2, "xn--skjervy-v1a": _2, "skjervøy": _2, "skierva": _2, "xn--skierv-uta": _2, "skiervá": _2, "skjak": _2, "xn--skjk-soa": _2, "skjåk": _2, "skodje": _2, "skanland": _2, "xn--sknland-fxa": _2, "skånland": _2, "skanit": _2, "xn--sknit-yqa": _2, "skánit": _2, "smola": _2, "xn--smla-hra": _2, "smøla": _2, "snillfjord": _2, "snasa": _2, "xn--snsa-roa": _2, "snåsa": _2, "snoasa": _2, "snaase": _2, "xn--snase-nra": _2, "snåase": _2, "sogndal": _2, "sokndal": _2, "sola": _2, "solund": _2, "songdalen": _2, "sortland": _2, "spydeberg": _2, "stange": _2, "stavanger": _2, "steigen": _2, "steinkjer": _2, "stjordal": _2, "xn--stjrdal-s1a": _2, "stjørdal": _2, "stokke": _2, "stor-elvdal": _2, "stord": _2, "stordal": _2, "storfjord": _2, "omasvuotna": _2, "strand": _2, "stranda": _2, "stryn": _2, "sula": _2, "suldal": _2, "sund": _2, "sunndal": _2, "surnadal": _2, "sveio": _2, "svelvik": _2, "sykkylven": _2, "sogne": _2, "xn--sgne-gra": _2, "søgne": _2, "somna": _2, "xn--smna-gra": _2, "sømna": _2, "sondre-land": _2, "xn--sndre-land-0cb": _2, "søndre-land": _2, "sor-aurdal": _2, "xn--sr-aurdal-l8a": _2, "sør-aurdal": _2, "sor-fron": _2, "xn--sr-fron-q1a": _2, "sør-fron": _2, "sor-odal": _2, "xn--sr-odal-q1a": _2, "sør-odal": _2, "sor-varanger": _2, "xn--sr-varanger-ggb": _2, "sør-varanger": _2, "matta-varjjat": _2, "xn--mtta-vrjjat-k7af": _2, "mátta-várjjat": _2, "sorfold": _2, "xn--srfold-bya": _2, "sørfold": _2, "sorreisa": _2, "xn--srreisa-q1a": _2, "sørreisa": _2, "sorum": _2, "xn--srum-gra": _2, "sørum": _2, "tana": _2, "deatnu": _2, "time": _2, "tingvoll": _2, "tinn": _2, "tjeldsund": _2, "dielddanuorri": _2, "tjome": _2, "xn--tjme-hra": _2, "tjøme": _2, "tokke": _2, "tolga": _2, "torsken": _2, "tranoy": _2, "xn--trany-yua": _2, "tranøy": _2, "tromso": _2, "xn--troms-zua": _2, "tromsø": _2, "tromsa": _2, "romsa": _2, "trondheim": _2, "troandin": _2, "trysil": _2, "trana": _2, "xn--trna-woa": _2, "træna": _2, "trogstad": _2, "xn--trgstad-r1a": _2, "trøgstad": _2, "tvedestrand": _2, "tydal": _2, "tynset": _2, "tysfjord": _2, "divtasvuodna": _2, "divttasvuotna": _2, "tysnes": _2, "tysvar": _2, "xn--tysvr-vra": _2, "tysvær": _2, "tonsberg": _2, "xn--tnsberg-q1a": _2, "tønsberg": _2, "ullensaker": _2, "ullensvang": _2, "ulvik": _2, "utsira": _2, "vadso": _2, "xn--vads-jra": _2, "vadsø": _2, "cahcesuolo": _2, "xn--hcesuolo-7ya35b": _2, "čáhcesuolo": _2, "vaksdal": _2, "valle": _2, "vang": _2, "vanylven": _2, "vardo": _2, "xn--vard-jra": _2, "vardø": _2, "varggat": _2, "xn--vrggt-xqad": _2, "várggát": _2, "vefsn": _2, "vaapste": _2, "vega": _2, "vegarshei": _2, "xn--vegrshei-c0a": _2, "vegårshei": _2, "vennesla": _2, "verdal": _2, "verran": _2, "vestby": _2, "vestnes": _2, "vestre-slidre": _2, "vestre-toten": _2, "vestvagoy": _2, "xn--vestvgy-ixa6o": _2, "vestvågøy": _2, "vevelstad": _2, "vik": _2, "vikna": _2, "vindafjord": _2, "volda": _2, "voss": _2, "varoy": _2, "xn--vry-yla5g": _2, "værøy": _2, "vagan": _2, "xn--vgan-qoa": _2, "vågan": _2, "voagat": _2, "vagsoy": _2, "xn--vgsy-qoa0j": _2, "vågsøy": _2, "vaga": _2, "xn--vg-yiab": _2, "vågå": _2, "ostfold": { "$": 0, "succ": { "valer": _2 } }, "xn--stfold-9xa": { "$": 0, "succ": { "xn--vler-qoa": _2 } }, "østfold": { "$": 0, "succ": { "våler": _2 } }, "co": _3, "blogspot": _3, "123hjemmeside": _3, "myspreadshop": _3 } }, "np": _8, "nr": _33, "nu": { "$": 1, "succ": { "merseine": _3, "mine": _3, "shacknet": _3, "enterprisecloud": _3 } }, "nz": { "$": 1, "succ": { "ac": _2, "co": _6, "cri": _2, "geek": _2, "gen": _2, "govt": _2, "health": _2, "iwi": _2, "kiwi": _2, "maori": _2, "mil": _2, "xn--mori-qsa": _2, "māori": _2, "net": _2, "org": _2, "parliament": _2, "school": _2 } }, "om": { "$": 1, "succ": { "co": _2, "com": _2, "edu": _2, "gov": _2, "med": _2, "museum": _2, "net": _2, "org": _2, "pro": _2 } }, "onion": _2, "org": { "$": 1, "succ": { "altervista": _3, "amune": { "$": 0, "succ": { "tele": _3 } }, "pimienta": _3, "poivron": _3, "potager": _3, "sweetpepper": _3, "ae": _3, "us": _3, "certmgr": _3, "cdn77": { "$": 0, "succ": { "c": _3, "rsc": _3 } }, "cdn77-secure": { "$": 0, "succ": { "origin": { "$": 0, "succ": { "ssl": _3 } } } }, "cloudns": _3, "duckdns": _3, "tunk": _3, "dyndns": { "$": 2, "succ": { "go": _3, "home": _3 } }, "blogdns": _3, "blogsite": _3, "boldlygoingnowhere": _3, "dnsalias": _3, "dnsdojo": _3, "doesntexist": _3, "dontexist": _3, "doomdns": _3, "dvrdns": _3, "dynalias": _3, "endofinternet": _3, "endoftheinternet": _3, "from-me": _3, "game-host": _3, "gotdns": _3, "hobby-site": _3, "homedns": _3, "homeftp": _3, "homelinux": _3, "homeunix": _3, "is-a-bruinsfan": _3, "is-a-candidate": _3, "is-a-celticsfan": _3, "is-a-chef": _3, "is-a-geek": _3, "is-a-knight": _3, "is-a-linux-user": _3, "is-a-patsfan": _3, "is-a-soxfan": _3, "is-found": _3, "is-lost": _3, "is-saved": _3, "is-very-bad": _3, "is-very-evil": _3, "is-very-good": _3, "is-very-nice": _3, "is-very-sweet": _3, "isa-geek": _3, "kicks-ass": _3, "misconfused": _3, "podzone": _3, "readmyblog": _3, "selfip": _3, "sellsyourhome": _3, "servebbs": _3, "serveftp": _3, "servegame": _3, "stuff-4-sale": _3, "webhop": _3, "ddnss": _3, "accesscam": _3, "camdvr": _3, "freeddns": _3, "mywire": _3, "webredirect": _3, "eu": { "$": 2, "succ": { "al": _3, "asso": _3, "at": _3, "au": _3, "be": _3, "bg": _3, "ca": _3, "cd": _3, "ch": _3, "cn": _3, "cy": _3, "cz": _3, "de": _3, "dk": _3, "edu": _3, "ee": _3, "es": _3, "fi": _3, "fr": _3, "gr": _3, "hr": _3, "hu": _3, "ie": _3, "il": _3, "in": _3, "int": _3, "is": _3, "it": _3, "jp": _3, "kr": _3, "lt": _3, "lu": _3, "lv": _3, "mc": _3, "me": _3, "mk": _3, "mt": _3, "my": _3, "net": _3, "ng": _3, "nl": _3, "no": _3, "nz": _3, "paris": _3, "pl": _3, "pt": _3, "q-a": _3, "ro": _3, "ru": _3, "se": _3, "si": _3, "sk": _3, "tr": _3, "uk": _3, "us": _3 } }, "twmail": _3, "fedorainfracloud": _3, "fedorapeople": _3, "fedoraproject": { "$": 0, "succ": { "cloud": _3, "os": _21, "stg": { "$": 0, "succ": { "os": _21 } } } }, "freedesktop": _3, "hepforge": _3, "in-dsl": _3, "in-vpn": _3, "js": _3, "barsy": _3, "mayfirst": _3, "mozilla-iot": _3, "bmoattachments": _3, "dynserv": _3, "now-dns": _3, "cable-modem": _3, "collegefan": _3, "couchpotatofries": _3, "mlbfan": _3, "mysecuritycamera": _3, "nflfan": _3, "read-books": _3, "ufcfan": _3, "hopto": _3, "myftp": _3, "no-ip": _3, "zapto": _3, "httpbin": _3, "pubtls": _3, "jpn": _3, "my-firewall": _3, "myfirewall": _3, "spdns": _3, "small-web": _3, "dsmynas": _3, "familyds": _3, "teckids": _12, "tuxfamily": _3, "diskstation": _3, "hk": _3, "wmflabs": _3, "toolforge": _3, "wmcloud": _3, "za": _3 } }, "pa": { "$": 1, "succ": { "ac": _2, "gob": _2, "com": _2, "org": _2, "sld": _2, "edu": _2, "net": _2, "ing": _2, "abo": _2, "med": _2, "nom": _2 } }, "pe": { "$": 1, "succ": { "edu": _2, "gob": _2, "nom": _2, "mil": _2, "org": _2, "com": _2, "net": _2, "blogspot": _3 } }, "pf": { "$": 1, "succ": { "com": _2, "org": _2, "edu": _2 } }, "pg": _8, "ph": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "ngo": _2, "mil": _2, "i": _2 } }, "pk": { "$": 1, "succ": { "com": _2, "net": _2, "edu": _2, "org": _2, "fam": _2, "biz": _2, "web": _2, "gov": _2, "gob": _2, "gok": _2, "gon": _2, "gop": _2, "gos": _2, "info": _2 } }, "pl": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "aid": _2, "agro": _2, "atm": _2, "auto": _2, "biz": _2, "edu": _2, "gmina": _2, "gsm": _2, "info": _2, "mail": _2, "miasta": _2, "media": _2, "mil": _2, "nieruchomosci": _2, "nom": _2, "pc": _2, "powiat": _2, "priv": _2, "realestate": _2, "rel": _2, "sex": _2, "shop": _2, "sklep": _2, "sos": _2, "szkola": _2, "targi": _2, "tm": _2, "tourism": _2, "travel": _2, "turystyka": _2, "gov": { "$": 1, "succ": { "ap": _2, "ic": _2, "is": _2, "us": _2, "kmpsp": _2, "kppsp": _2, "kwpsp": _2, "psp": _2, "wskr": _2, "kwp": _2, "mw": _2, "ug": _2, "um": _2, "umig": _2, "ugim": _2, "upow": _2, "uw": _2, "starostwo": _2, "pa": _2, "po": _2, "psse": _2, "pup": _2, "rzgw": _2, "sa": _2, "so": _2, "sr": _2, "wsa": _2, "sko": _2, "uzs": _2, "wiih": _2, "winb": _2, "pinb": _2, "wios": _2, "witd": _2, "wzmiuw": _2, "piw": _2, "wiw": _2, "griw": _2, "wif": _2, "oum": _2, "sdn": _2, "zp": _2, "uppo": _2, "mup": _2, "wuoz": _2, "konsulat": _2, "oirm": _2 } }, "augustow": _2, "babia-gora": _2, "bedzin": _2, "beskidy": _2, "bialowieza": _2, "bialystok": _2, "bielawa": _2, "bieszczady": _2, "boleslawiec": _2, "bydgoszcz": _2, "bytom": _2, "cieszyn": _2, "czeladz": _2, "czest": _2, "dlugoleka": _2, "elblag": _2, "elk": _2, "glogow": _2, "gniezno": _2, "gorlice": _2, "grajewo": _2, "ilawa": _2, "jaworzno": _2, "jelenia-gora": _2, "jgora": _2, "kalisz": _2, "kazimierz-dolny": _2, "karpacz": _2, "kartuzy": _2, "kaszuby": _2, "katowice": _2, "kepno": _2, "ketrzyn": _2, "klodzko": _2, "kobierzyce": _2, "kolobrzeg": _2, "konin": _2, "konskowola": _2, "kutno": _2, "lapy": _2, "lebork": _2, "legnica": _2, "lezajsk": _2, "limanowa": _2, "lomza": _2, "lowicz": _2, "lubin": _2, "lukow": _2, "malbork": _2, "malopolska": _2, "mazowsze": _2, "mazury": _2, "mielec": _2, "mielno": _2, "mragowo": _2, "naklo": _2, "nowaruda": _2, "nysa": _2, "olawa": _2, "olecko": _2, "olkusz": _2, "olsztyn": _2, "opoczno": _2, "opole": _2, "ostroda": _2, "ostroleka": _2, "ostrowiec": _2, "ostrowwlkp": _2, "pila": _2, "pisz": _2, "podhale": _2, "podlasie": _2, "polkowice": _2, "pomorze": _2, "pomorskie": _2, "prochowice": _2, "pruszkow": _2, "przeworsk": _2, "pulawy": _2, "radom": _2, "rawa-maz": _2, "rybnik": _2, "rzeszow": _2, "sanok": _2, "sejny": _2, "slask": _2, "slupsk": _2, "sosnowiec": _2, "stalowa-wola": _2, "skoczow": _2, "starachowice": _2, "stargard": _2, "suwalki": _2, "swidnica": _2, "swiebodzin": _2, "swinoujscie": _2, "szczecin": _2, "szczytno": _2, "tarnobrzeg": _2, "tgory": _2, "turek": _2, "tychy": _2, "ustka": _2, "walbrzych": _2, "warmia": _2, "warszawa": _2, "waw": _2, "wegrow": _2, "wielun": _2, "wlocl": _2, "wloclawek": _2, "wodzislaw": _2, "wolomin": _2, "wroclaw": _2, "zachpomor": _2, "zagan": _2, "zarow": _2, "zgora": _2, "zgorzelec": _2, "beep": _3, "ecommerce-shop": _3, "shoparena": _3, "homesklep": _3, "sdscloud": _3, "unicloud": _3, "krasnik": _3, "leczna": _3, "lubartow": _3, "lublin": _3, "poniatowa": _3, "swidnik": _3, "co": _3, "simplesite": _3, "art": _3, "gliwice": _3, "krakow": _3, "poznan": _3, "wroc": _3, "zakopane": _3, "myspreadshop": _3, "gda": _3, "gdansk": _3, "gdynia": _3, "med": _3, "sopot": _3 } }, "pm": { "$": 1, "succ": { "own": _3, "name": _3 } }, "pn": { "$": 1, "succ": { "gov": _2, "co": _2, "org": _2, "edu": _2, "net": _2 } }, "post": _2, "pr": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "isla": _2, "pro": _2, "biz": _2, "info": _2, "name": _2, "est": _2, "prof": _2, "ac": _2 } }, "pro": { "$": 1, "succ": { "aaa": _2, "aca": _2, "acct": _2, "avocat": _2, "bar": _2, "cpa": _2, "eng": _2, "jur": _2, "law": _2, "med": _2, "recht": _2, "cloudns": _3, "dnstrace": { "$": 0, "succ": { "bci": _3 } }, "barsy": _3 } }, "ps": { "$": 1, "succ": { "edu": _2, "gov": _2, "sec": _2, "plo": _2, "com": _2, "org": _2, "net": _2 } }, "pt": { "$": 1, "succ": { "net": _2, "gov": _2, "org": _2, "edu": _2, "int": _2, "publ": _2, "com": _2, "nome": _2, "blogspot": _3, "123paginaweb": _3 } }, "pw": { "$": 1, "succ": { "co": _2, "ne": _2, "or": _2, "ed": _2, "go": _2, "belau": _2, "cloudns": _3, "x443": _3 } }, "py": { "$": 1, "succ": { "com": _2, "coop": _2, "edu": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "qa": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "mil": _2, "name": _2, "net": _2, "org": _2, "sch": _2, "blogspot": _3 } }, "re": { "$": 1, "succ": { "asso": _2, "com": _2, "nom": _2, "blogspot": _3 } }, "ro": { "$": 1, "succ": { "arts": _2, "com": _2, "firm": _2, "info": _2, "nom": _2, "nt": _2, "org": _2, "rec": _2, "store": _2, "tm": _2, "www": _2, "co": _3, "shop": _3, "blogspot": _3, "barsy": _3 } }, "rs": { "$": 1, "succ": { "ac": _2, "co": _2, "edu": _2, "gov": _2, "in": _2, "org": _2, "brendly": { "$": 0, "succ": { "shop": _3 } }, "blogspot": _3, "ua": _3, "ox": _3 } }, "ru": { "$": 1, "succ": { "ac": _3, "edu": _3, "gov": _3, "int": _3, "mil": _3, "test": _3, "eurodir": _3, "adygeya": _3, "bashkiria": _3, "bir": _3, "cbg": _3, "com": _3, "dagestan": _3, "grozny": _3, "kalmykia": _3, "kustanai": _3, "marine": _3, "mordovia": _3, "msk": _3, "mytis": _3, "nalchik": _3, "nov": _3, "pyatigorsk": _3, "spb": _3, "vladikavkaz": _3, "vladimir": _3, "blogspot": _3, "na4u": _3, "mircloud": _3, "regruhosting": _27, "myjino": { "$": 2, "succ": { "hosting": _5, "landing": _5, "spectrum": _5, "vps": _5 } }, "cldmail": { "$": 0, "succ": { "hb": _3 } }, "mcdir": { "$": 2, "succ": { "vps": _3 } }, "mcpre": _3, "net": _3, "org": _3, "pp": _3, "123sait": _3, "lk3": _3, "ras": _3 } }, "rw": { "$": 1, "succ": { "ac": _2, "co": _2, "coop": _2, "gov": _2, "mil": _2, "net": _2, "org": _2 } }, "sa": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "med": _2, "pub": _2, "edu": _2, "sch": _2 } }, "sb": _4, "sc": _4, "sd": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "med": _2, "tv": _2, "gov": _2, "info": _2 } }, "se": { "$": 1, "succ": { "a": _2, "ac": _2, "b": _2, "bd": _2, "brand": _2, "c": _2, "d": _2, "e": _2, "f": _2, "fh": _2, "fhsk": _2, "fhv": _2, "g": _2, "h": _2, "i": _2, "k": _2, "komforb": _2, "kommunalforbund": _2, "komvux": _2, "l": _2, "lanbib": _2, "m": _2, "n": _2, "naturbruksgymn": _2, "o": _2, "org": _2, "p": _2, "parti": _2, "pp": _2, "press": _2, "r": _2, "s": _2, "t": _2, "tm": _2, "u": _2, "w": _2, "x": _2, "y": _2, "z": _2, "com": _3, "blogspot": _3, "conf": _3, "iopsys": _3, "123minsida": _3, "itcouldbewor": _3, "myspreadshop": _3, "paba": { "$": 0, "succ": { "su": _3 } } } }, "sg": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "per": _2, "blogspot": _3, "enscaled": _3 } }, "sh": { "$": 1, "succ": { "com": _2, "net": _2, "gov": _2, "org": _2, "mil": _2, "bip": _3, "hashbang": _3, "platform": { "$": 0, "succ": { "bc": _3, "ent": _3, "eu": _3, "us": _3 } }, "now": _3, "vxl": _3, "wedeploy": _3 } }, "si": { "$": 1, "succ": { "gitapp": _3, "gitpage": _3, "blogspot": _3 } }, "sj": _2, "sk": _6, "sl": _4, "sm": _2, "sn": { "$": 1, "succ": { "art": _2, "com": _2, "edu": _2, "gouv": _2, "org": _2, "perso": _2, "univ": _2, "blogspot": _3 } }, "so": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "sch": _3 } }, "sr": _2, "ss": { "$": 1, "succ": { "biz": _2, "com": _2, "edu": _2, "gov": _2, "me": _2, "net": _2, "org": _2, "sch": _2 } }, "st": { "$": 1, "succ": { "co": _2, "com": _2, "consulado": _2, "edu": _2, "embaixada": _2, "mil": _2, "net": _2, "org": _2, "principe": _2, "saotome": _2, "store": _2, "kirara": _3, "noho": _3 } }, "su": { "$": 1, "succ": { "abkhazia": _3, "adygeya": _3, "aktyubinsk": _3, "arkhangelsk": _3, "armenia": _3, "ashgabad": _3, "azerbaijan": _3, "balashov": _3, "bashkiria": _3, "bryansk": _3, "bukhara": _3, "chimkent": _3, "dagestan": _3, "east-kazakhstan": _3, "exnet": _3, "georgia": _3, "grozny": _3, "ivanovo": _3, "jambyl": _3, "kalmykia": _3, "kaluga": _3, "karacol": _3, "karaganda": _3, "karelia": _3, "khakassia": _3, "krasnodar": _3, "kurgan": _3, "kustanai": _3, "lenug": _3, "mangyshlak": _3, "mordovia": _3, "msk": _3, "murmansk": _3, "nalchik": _3, "navoi": _3, "north-kazakhstan": _3, "nov": _3, "obninsk": _3, "penza": _3, "pokrovsk": _3, "sochi": _3, "spb": _3, "tashkent": _3, "termez": _3, "togliatti": _3, "troitsk": _3, "tselinograd": _3, "tula": _3, "tuva": _3, "vladikavkaz": _3, "vladimir": _3, "vologda": _3 } }, "sv": { "$": 1, "succ": { "com": _2, "edu": _2, "gob": _2, "org": _2, "red": _2 } }, "sx": _7, "sy": _32, "sz": { "$": 1, "succ": { "co": _2, "ac": _2, "org": _2 } }, "tc": { "$": 1, "succ": { "ch": _3, "me": _3, "we": _3 } }, "td": _6, "tel": _2, "tf": { "$": 1, "succ": { "sch": _3 } }, "tg": _2, "th": { "$": 1, "succ": { "ac": _2, "co": _2, "go": _2, "in": _2, "mi": _2, "net": _2, "or": _2, "online": _3, "shop": _3 } }, "tj": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "go": _2, "gov": _2, "int": _2, "mil": _2, "name": _2, "net": _2, "nic": _2, "org": _2, "test": _2, "web": _2 } }, "tk": _2, "tl": _7, "tm": { "$": 1, "succ": { "com": _2, "co": _2, "org": _2, "net": _2, "nom": _2, "gov": _2, "mil": _2, "edu": _2 } }, "tn": { "$": 1, "succ": { "com": _2, "ens": _2, "fin": _2, "gov": _2, "ind": _2, "info": _2, "intl": _2, "mincom": _2, "nat": _2, "net": _2, "org": _2, "perso": _2, "tourism": _2, "orangecloud": _3 } }, "to": { "$": 1, "succ": { "611": _3, "com": _2, "gov": _2, "net": _2, "org": _2, "edu": _2, "mil": _2, "oya": _3, "rdv": _3, "x0": _3, "vpnplus": _3, "quickconnect": _13, "nyan": _3 } }, "tr": { "$": 1, "succ": { "av": _2, "bbs": _2, "bel": _2, "biz": _2, "com": _6, "dr": _2, "edu": _2, "gen": _2, "gov": _2, "info": _2, "mil": _2, "k12": _2, "kep": _2, "name": _2, "net": _2, "org": _2, "pol": _2, "tel": _2, "tsk": _2, "tv": _2, "web": _2, "nc": _7 } }, "tt": { "$": 1, "succ": { "co": _2, "com": _2, "org": _2, "net": _2, "biz": _2, "info": _2, "pro": _2, "int": _2, "coop": _2, "jobs": _2, "mobi": _2, "travel": _2, "museum": _2, "aero": _2, "name": _2, "gov": _2, "edu": _2 } }, "tv": { "$": 1, "succ": { "dyndns": _3, "better-than": _3, "on-the-web": _3, "worse-than": _3, "from": _3, "sakura": _3 } }, "tw": { "$": 1, "succ": { "edu": _2, "gov": _2, "mil": _2, "com": { "$": 1, "succ": { "mymailer": _3 } }, "net": _2, "org": _2, "idv": _2, "game": _2, "ebiz": _2, "club": _2, "xn--zf0ao64a": _2, "網路": _2, "xn--uc0atv": _2, "組織": _2, "xn--czrw28b": _2, "商業": _2, "url": _3, "blogspot": _3 } }, "tz": { "$": 1, "succ": { "ac": _2, "co": _2, "go": _2, "hotel": _2, "info": _2, "me": _2, "mil": _2, "mobi": _2, "ne": _2, "or": _2, "sc": _2, "tv": _2 } }, "ua": { "$": 1, "succ": { "com": _2, "edu": _2, "gov": _2, "in": _2, "net": _2, "org": _2, "cherkassy": _2, "cherkasy": _2, "chernigov": _2, "chernihiv": _2, "chernivtsi": _2, "chernovtsy": _2, "ck": _2, "cn": _2, "cr": _2, "crimea": _2, "cv": _2, "dn": _2, "dnepropetrovsk": _2, "dnipropetrovsk": _2, "donetsk": _2, "dp": _2, "if": _2, "ivano-frankivsk": _2, "kh": _2, "kharkiv": _2, "kharkov": _2, "kherson": _2, "khmelnitskiy": _2, "khmelnytskyi": _2, "kiev": _2, "kirovograd": _2, "km": _2, "kr": _2, "krym": _2, "ks": _2, "kv": _2, "kyiv": _2, "lg": _2, "lt": _2, "lugansk": _2, "lutsk": _2, "lv": _2, "lviv": _2, "mk": _2, "mykolaiv": _2, "nikolaev": _2, "od": _2, "odesa": _2, "odessa": _2, "pl": _2, "poltava": _2, "rivne": _2, "rovno": _2, "rv": _2, "sb": _2, "sebastopol": _2, "sevastopol": _2, "sm": _2, "sumy": _2, "te": _2, "ternopil": _2, "uz": _2, "uzhgorod": _2, "vinnica": _2, "vinnytsia": _2, "vn": _2, "volyn": _2, "yalta": _2, "zaporizhzhe": _2, "zaporizhzhia": _2, "zhitomir": _2, "zhytomyr": _2, "zp": _2, "zt": _2, "cc": _3, "inf": _3, "ltd": _3, "cx": _3, "ie": _3, "biz": _3, "co": _3, "pp": _3, "v": _3 } }, "ug": { "$": 1, "succ": { "co": _2, "or": _2, "ac": _2, "sc": _2, "go": _2, "ne": _2, "com": _2, "org": _2, "blogspot": _3 } }, "uk": { "$": 1, "succ": { "ac": _2, "co": { "$": 1, "succ": { "bytemark": { "$": 0, "succ": { "dh": _3, "vm": _3 } }, "blogspot": _3, "layershift": _26, "barsy": _3, "barsyonline": _3, "retrosnub": _31, "nh-serv": _3, "no-ip": _3, "wellbeingzone": _3, "adimo": _3, "myspreadshop": _3 } }, "gov": { "$": 1, "succ": { "campaign": _3, "service": _3, "api": _3, "homeoffice": _3 } }, "ltd": _2, "me": _2, "net": _2, "nhs": _2, "org": { "$": 1, "succ": { "glug": _3, "lug": _3, "lugs": _3, "affinitylottery": _3, "raffleentry": _3, "weeklylottery": _3 } }, "plc": _2, "police": _2, "sch": _8, "conn": _3, "copro": _3, "hosp": _3, "independent-commission": _3, "independent-inquest": _3, "independent-inquiry": _3, "independent-panel": _3, "independent-review": _3, "public-inquiry": _3, "royal-commission": _3, "pymnt": _3, "barsy": _3 } }, "us": { "$": 1, "succ": { "dni": _2, "fed": _2, "isa": _2, "kids": _2, "nsn": _2, "ak": _40, "al": _40, "ar": _40, "as": _40, "az": _40, "ca": _40, "co": _40, "ct": _40, "dc": _40, "de": { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _3 } }, "fl": _40, "ga": _40, "gu": _40, "hi": _41, "ia": _40, "id": _40, "il": _40, "in": _40, "ks": _40, "ky": _40, "la": _40, "ma": { "$": 1, "succ": { "k12": { "$": 1, "succ": { "pvt": _2, "chtr": _2, "paroch": _2 } }, "cc": _2, "lib": _2 } }, "md": _40, "me": _40, "mi": { "$": 1, "succ": { "k12": _2, "cc": _2, "lib": _2, "ann-arbor": _2, "cog": _2, "dst": _2, "eaton": _2, "gen": _2, "mus": _2, "tec": _2, "washtenaw": _2 } }, "mn": _40, "mo": _40, "ms": _40, "mt": _40, "nc": _40, "nd": _41, "ne": _40, "nh": _40, "nj": _40, "nm": _40, "nv": _40, "ny": _40, "oh": _40, "ok": _40, "or": _40, "pa": _40, "pr": _40, "ri": _41, "sc": _40, "sd": _41, "tn": _40, "tx": _40, "ut": _40, "vi": _40, "vt": _40, "va": _40, "wa": _40, "wi": _40, "wv": { "$": 1, "succ": { "cc": _2 } }, "wy": _40, "graphox": _3, "cloudns": _3, "drud": _3, "is-by": _3, "land-4-sale": _3, "stuff-4-sale": _3, "enscaled": { "$": 0, "succ": { "phx": _3 } }, "mircloud": _3, "freeddns": _3, "golffan": _3, "noip": _3, "pointto": _3, "platterp": _3 } }, "uy": { "$": 1, "succ": { "com": _6, "edu": _2, "gub": _2, "mil": _2, "net": _2, "org": _2 } }, "uz": { "$": 1, "succ": { "co": _2, "com": _2, "net": _2, "org": _2 } }, "va": _2, "vc": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "mil": _2, "edu": _2, "gv": { "$": 2, "succ": { "d": _3 } }, "0e": _3 } }, "ve": { "$": 1, "succ": { "arts": _2, "bib": _2, "co": _2, "com": _2, "e12": _2, "edu": _2, "firm": _2, "gob": _2, "gov": _2, "info": _2, "int": _2, "mil": _2, "net": _2, "nom": _2, "org": _2, "rar": _2, "rec": _2, "store": _2, "tec": _2, "web": _2 } }, "vg": { "$": 1, "succ": { "at": _3 } }, "vi": { "$": 1, "succ": { "co": _2, "com": _2, "k12": _2, "net": _2, "org": _2 } }, "vn": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "edu": _2, "gov": _2, "int": _2, "ac": _2, "biz": _2, "info": _2, "name": _2, "pro": _2, "health": _2, "blogspot": _3 } }, "vu": { "$": 1, "succ": { "com": _2, "edu": _2, "net": _2, "org": _2, "cn": _3, "blog": _3, "dev": _3, "me": _3 } }, "wf": { "$": 1, "succ": { "biz": _3, "sch": _3 } }, "ws": { "$": 1, "succ": { "com": _2, "net": _2, "org": _2, "gov": _2, "edu": _2, "advisor": _5, "cloud66": _3, "dyndns": _3, "mypets": _3 } }, "yt": { "$": 1, "succ": { "org": _3 } }, "xn--mgbaam7a8h": _2, "امارات": _2, "xn--y9a3aq": _2, "հայ": _2, "xn--54b7fta0cc": _2, "বাংলা": _2, "xn--90ae": _2, "бг": _2, "xn--mgbcpq6gpa1a": _2, "البحرين": _2, "xn--90ais": _2, "бел": _2, "xn--fiqs8s": _2, "中国": _2, "xn--fiqz9s": _2, "中國": _2, "xn--lgbbat1ad8j": _2, "الجزائر": _2, "xn--wgbh1c": _2, "مصر": _2, "xn--e1a4c": _2, "ею": _2, "xn--qxa6a": _2, "ευ": _2, "xn--mgbah1a3hjkrd": _2, "موريتانيا": _2, "xn--node": _2, "გე": _2, "xn--qxam": _2, "ελ": _2, "xn--j6w193g": { "$": 1, "succ": { "xn--55qx5d": _2, "xn--wcvs22d": _2, "xn--mxtq1m": _2, "xn--gmqw5a": _2, "xn--od0alg": _2, "xn--uc0atv": _2 } }, "香港": { "$": 1, "succ": { "公司": _2, "教育": _2, "政府": _2, "個人": _2, "網絡": _2, "組織": _2 } }, "xn--2scrj9c": _2, "ಭಾರತ": _2, "xn--3hcrj9c": _2, "ଭାରତ": _2, "xn--45br5cyl": _2, "ভাৰত": _2, "xn--h2breg3eve": _2, "भारतम्": _2, "xn--h2brj9c8c": _2, "भारोत": _2, "xn--mgbgu82a": _2, "ڀارت": _2, "xn--rvc1e0am3e": _2, "ഭാരതം": _2, "xn--h2brj9c": _2, "भारत": _2, "xn--mgbbh1a": _2, "بارت": _2, "xn--mgbbh1a71e": _2, "بھارت": _2, "xn--fpcrj9c3d": _2, "భారత్": _2, "xn--gecrj9c": _2, "ભારત": _2, "xn--s9brj9c": _2, "ਭਾਰਤ": _2, "xn--45brj9c": _2, "ভারত": _2, "xn--xkc2dl3a5ee0h": _2, "இந்தியா": _2, "xn--mgba3a4f16a": _2, "ایران": _2, "xn--mgba3a4fra": _2, "ايران": _2, "xn--mgbtx2b": _2, "عراق": _2, "xn--mgbayh7gpa": _2, "الاردن": _2, "xn--3e0b707e": _2, "한국": _2, "xn--80ao21a": _2, "қаз": _2, "xn--q7ce6a": _2, "ລາວ": _2, "xn--fzc2c9e2c": _2, "ලංකා": _2, "xn--xkc2al3hye2a": _2, "இலங்கை": _2, "xn--mgbc0a9azcg": _2, "المغرب": _2, "xn--d1alf": _2, "мкд": _2, "xn--l1acc": _2, "мон": _2, "xn--mix891f": _2, "澳門": _2, "xn--mix082f": _2, "澳门": _2, "xn--mgbx4cd0ab": _2, "مليسيا": _2, "xn--mgb9awbf": _2, "عمان": _2, "xn--mgbai9azgqp6j": _2, "پاکستان": _2, "xn--mgbai9a5eva00b": _2, "پاكستان": _2, "xn--ygbi2ammx": _2, "فلسطين": _2, "xn--90a3ac": { "$": 1, "succ": { "xn--o1ac": _2, "xn--c1avg": _2, "xn--90azh": _2, "xn--d1at": _2, "xn--o1ach": _2, "xn--80au": _2 } }, "срб": { "$": 1, "succ": { "пр": _2, "орг": _2, "обр": _2, "од": _2, "упр": _2, "ак": _2 } }, "xn--p1ai": _2, "рф": _2, "xn--wgbl6a": _2, "قطر": _2, "xn--mgberp4a5d4ar": _2, "السعودية": _2, "xn--mgberp4a5d4a87g": _2, "السعودیة": _2, "xn--mgbqly7c0a67fbc": _2, "السعودیۃ": _2, "xn--mgbqly7cvafr": _2, "السعوديه": _2, "xn--mgbpl2fh": _2, "سودان": _2, "xn--yfro4i67o": _2, "新加坡": _2, "xn--clchc0ea0b2g2a9gcd": _2, "சிங்கப்பூர்": _2, "xn--ogbpf8fl": _2, "سورية": _2, "xn--mgbtf8fl": _2, "سوريا": _2, "xn--o3cw4h": { "$": 1, "succ": { "xn--12c1fe0br": _2, "xn--12co0c3b4eva": _2, "xn--h3cuzk1di": _2, "xn--o3cyx2a": _2, "xn--m3ch0j3a": _2, "xn--12cfi8ixb8l": _2 } }, "ไทย": { "$": 1, "succ": { "ศึกษา": _2, "ธุรกิจ": _2, "รัฐบาล": _2, "ทหาร": _2, "เน็ต": _2, "องค์กร": _2 } }, "xn--pgbs0dh": _2, "تونس": _2, "xn--kpry57d": _2, "台灣": _2, "xn--kprw13d": _2, "台湾": _2, "xn--nnx388a": _2, "臺灣": _2, "xn--j1amh": _2, "укр": _2, "xn--mgb2ddes": _2, "اليمن": _2, "xxx": _2, "ye": _32, "za": { "$": 0, "succ": { "ac": _2, "agric": _2, "alt": _2, "co": _6, "edu": _2, "gov": _2, "grondar": _2, "law": _2, "mil": _2, "net": _2, "ngo": _2, "nic": _2, "nis": _2, "nom": _2, "org": _2, "school": _2, "tm": _2, "web": _2 } }, "zm": { "$": 1, "succ": { "ac": _2, "biz": _2, "co": _2, "com": _2, "edu": _2, "gov": _2, "info": _2, "mil": _2, "net": _2, "org": _2, "sch": _2 } }, "zw": { "$": 1, "succ": { "ac": _2, "co": _2, "gov": _2, "mil": _2, "org": _2 } }, "aaa": _2, "aarp": _2, "abarth": _2, "abb": _2, "abbott": _2, "abbvie": _2, "abc": _2, "able": _2, "abogado": _2, "abudhabi": _2, "academy": { "$": 1, "succ": { "official": _3 } }, "accenture": _2, "accountant": _2, "accountants": _2, "aco": _2, "actor": _2, "ads": _2, "adult": _2, "aeg": _2, "aetna": _2, "afl": _2, "africa": _2, "agakhan": _2, "agency": _2, "aig": _2, "airbus": _2, "airforce": _2, "airtel": _2, "akdn": _2, "alfaromeo": _2, "alibaba": _2, "alipay": _2, "allfinanz": _2, "allstate": _2, "ally": _2, "alsace": _2, "alstom": _2, "amazon": _2, "americanexpress": _2, "americanfamily": _2, "amex": _2, "amfam": _2, "amica": _2, "amsterdam": _2, "analytics": _2, "android": _2, "anquan": _2, "anz": _2, "aol": _2, "apartments": _2, "app": { "$": 1, "succ": { "beget": _5, "clerk": _3, "clerkstage": _3, "wnext": _3, "platform0": _3, "deta": _3, "ondigitalocean": _3, "easypanel": _3, "encr": _3, "edgecompute": _3, "fireweb": _3, "onflashdrive": _3, "framer": _3, "run": { "$": 2, "succ": { "a": _3 } }, "web": _3, "hasura": _3, "loginline": _3, "messerli": _3, "netlify": _3, "ngrok": _3, "ngrok-free": _3, "developer": _5, "noop": _3, "northflank": _5, "snowflake": { "$": 2, "succ": { "privatelink": _3 } }, "streamlit": _3, "telebit": _3, "typedream": _3, "vercel": _3, "bookonline": _3 } }, "apple": _2, "aquarelle": _2, "arab": _2, "aramco": _2, "archi": _2, "army": _2, "art": _2, "arte": _2, "asda": _2, "associates": _2, "athleta": _2, "attorney": _2, "auction": _2, "audi": _2, "audible": _2, "audio": _2, "auspost": _2, "author": _2, "auto": _2, "autos": _2, "avianca": _2, "aws": _2, "axa": _2, "azure": _2, "baby": _2, "baidu": _2, "banamex": _2, "bananarepublic": _2, "band": _2, "bank": _2, "bar": _2, "barcelona": _2, "barclaycard": _2, "barclays": _2, "barefoot": _2, "bargains": _2, "baseball": _2, "basketball": { "$": 1, "succ": { "aus": _3, "nz": _3 } }, "bauhaus": _2, "bayern": _2, "bbc": _2, "bbt": _2, "bbva": _2, "bcg": _2, "bcn": _2, "beats": _2, "beauty": _2, "beer": _2, "bentley": _2, "berlin": _2, "best": _2, "bestbuy": _2, "bet": _2, "bharti": _2, "bible": _2, "bid": _2, "bike": _2, "bing": _2, "bingo": _2, "bio": _2, "black": _2, "blackfriday": _2, "blockbuster": _2, "blog": _2, "bloomberg": _2, "blue": _2, "bms": _2, "bmw": _2, "bnpparibas": _2, "boats": _2, "boehringer": _2, "bofa": _2, "bom": _2, "bond": _2, "boo": _2, "book": _2, "booking": _2, "bosch": _2, "bostik": _2, "boston": _2, "bot": _2, "boutique": _2, "box": _2, "bradesco": _2, "bridgestone": _2, "broadway": _2, "broker": _2, "brother": _2, "brussels": _2, "build": _2, "builders": { "$": 1, "succ": { "cloudsite": _3 } }, "business": _10, "buy": _2, "buzz": _2, "bzh": _2, "cab": _2, "cafe": _2, "cal": _2, "call": _2, "calvinklein": _2, "cam": _2, "camera": _2, "camp": _2, "canon": _2, "capetown": _2, "capital": _2, "capitalone": _2, "car": _2, "caravan": _2, "cards": _2, "care": _2, "career": _2, "careers": _2, "cars": _2, "casa": { "$": 1, "succ": { "nabu": { "$": 0, "succ": { "ui": _3 } } } }, "case": _2, "cash": _2, "casino": _2, "catering": _2, "catholic": _2, "cba": _2, "cbn": _2, "cbre": _2, "cbs": _2, "center": _2, "ceo": _2, "cern": _2, "cfa": _2, "cfd": _2, "chanel": _2, "channel": _2, "charity": _2, "chase": _2, "chat": _2, "cheap": _2, "chintai": _2, "christmas": _2, "chrome": _2, "church": _2, "cipriani": _2, "circle": _2, "cisco": _2, "citadel": _2, "citi": _2, "citic": _2, "city": _2, "cityeats": _2, "claims": _2, "cleaning": _2, "click": _2, "clinic": _2, "clinique": _2, "clothing": _2, "cloud": { "$": 1, "succ": { "banzai": _5, "elementor": _3, "encoway": { "$": 0, "succ": { "eu": _3 } }, "statics": _5, "ravendb": _3, "axarnet": { "$": 0, "succ": { "es-1": _3 } }, "diadem": _3, "jelastic": { "$": 0, "succ": { "vip": _3 } }, "jele": _3, "jenv-aruba": { "$": 0, "succ": { "aruba": { "$": 0, "succ": { "eur": { "$": 0, "succ": { "it1": _3 } } } }, "it1": _3 } }, "keliweb": { "$": 2, "succ": { "cs": _3 } }, "oxa": { "$": 2, "succ": { "tn": _3, "uk": _3 } }, "primetel": { "$": 2, "succ": { "uk": _3 } }, "reclaim": { "$": 0, "succ": { "ca": _3, "uk": _3, "us": _3 } }, "trendhosting": { "$": 0, "succ": { "ch": _3, "de": _3 } }, "jotelulu": _3, "kuleuven": _3, "linkyard": _3, "magentosite": _5, "perspecta": _3, "vapor": _3, "on-rancher": _5, "scw": { "$": 0, "succ": { "baremetal": { "$": 0, "succ": { "fr-par-1": _3, "fr-par-2": _3, "nl-ams-1": _3 } }, "fr-par": { "$": 0, "succ": { "fnc": { "$": 2, "succ": { "functions": _3 } }, "k8s": _11, "s3": _3, "s3-website": _3, "whm": _3 } }, "instances": { "$": 0, "succ": { "priv": _3, "pub": _3 } }, "k8s": _3, "nl-ams": { "$": 0, "succ": { "k8s": _11, "s3": _3, "s3-website": _3, "whm": _3 } }, "pl-waw": { "$": 0, "succ": { "k8s": _11, "s3": _3, "s3-website": _3 } }, "scalebook": _3, "smartlabeling": _3 } }, "sensiosite": _5, "trafficplex": _3, "urown": _3, "voorloper": _3 } }, "club": { "$": 1, "succ": { "cloudns": _3, "jele": _3, "barsy": _3 } }, "clubmed": _2, "coach": _2, "codes": { "$": 1, "succ": { "owo": _5 } }, "coffee": _2, "college": _2, "cologne": _2, "comcast": _2, "commbank": _2, "community": { "$": 1, "succ": { "nog": _3, "ravendb": _3, "myforum": _3 } }, "company": _2, "compare": _2, "computer": _2, "comsec": _2, "condos": _2, "construction": _2, "consulting": _2, "contact": _2, "contractors": _2, "cooking": _2, "cookingchannel": _2, "cool": { "$": 1, "succ": { "elementor": _3, "de": _3 } }, "corsica": _2, "country": _2, "coupon": _2, "coupons": _2, "courses": _2, "cpa": _2, "credit": _2, "creditcard": _2, "creditunion": _2, "cricket": _2, "crown": _2, "crs": _2, "cruise": _2, "cruises": _2, "cuisinella": _2, "cymru": _2, "cyou": _2, "dabur": _2, "dad": _2, "dance": _2, "data": _2, "date": _2, "dating": _2, "datsun": _2, "day": _2, "dclk": _2, "dds": _2, "deal": _2, "dealer": _2, "deals": _2, "degree": _2, "delivery": _2, "dell": _2, "deloitte": _2, "delta": _2, "democrat": _2, "dental": _2, "dentist": _2, "desi": _2, "design": { "$": 1, "succ": { "bss": _3 } }, "dev": { "$": 1, "succ": { "autocode": _3, "lcl": _5, "lclstage": _5, "stg": _5, "stgstage": _5, "pages": _3, "r2": _3, "workers": _3, "curv": _3, "deno": _3, "deno-staging": _3, "deta": _3, "fly": _3, "githubpreview": _3, "gateway": _5, "iserv": _3, "localcert": { "$": 0, "succ": { "user": _5 } }, "loginline": _3, "mediatech": _3, "ngrok": _3, "ngrok-free": _3, "platter-app": _3, "shiftcrypto": _3, "vercel": _3, "webhare": _5 } }, "dhl": _2, "diamonds": _2, "diet": _2, "digital": { "$": 1, "succ": { "cloudapps": { "$": 2, "succ": { "london": _3 } } } }, "direct": _2, "directory": _2, "discount": _2, "discover": _2, "dish": _2, "diy": _2, "dnp": _2, "docs": _2, "doctor": _2, "dog": _2, "domains": _2, "dot": _2, "download": _2, "drive": _2, "dtv": _2, "dubai": _2, "dunlop": _2, "dupont": _2, "durban": _2, "dvag": _2, "dvr": _2, "earth": { "$": 1, "succ": { "dapps": { "$": 0, "succ": { "*": _3, "bzz": _5 } } } }, "eat": _2, "eco": _2, "edeka": _2, "education": _10, "email": _2, "emerck": _2, "energy": _2, "engineer": _2, "engineering": _2, "enterprises": _2, "epson": _2, "equipment": _2, "ericsson": _2, "erni": _2, "esq": _2, "estate": { "$": 1, "succ": { "compute": _5 } }, "etisalat": _2, "eurovision": _2, "eus": { "$": 1, "succ": { "party": _28 } }, "events": { "$": 1, "succ": { "koobin": _3, "co": _3 } }, "exchange": _2, "expert": _2, "exposed": _2, "express": _2, "extraspace": _2, "fage": _2, "fail": _2, "fairwinds": _2, "faith": _29, "family": _2, "fan": _2, "fans": _2, "farm": { "$": 1, "succ": { "storj": _3 } }, "farmers": _2, "fashion": _2, "fast": _2, "fedex": _2, "feedback": _2, "ferrari": _2, "ferrero": _2, "fiat": _2, "fidelity": _2, "fido": _2, "film": _2, "final": _2, "finance": _2, "financial": _10, "fire": _2, "firestone": _2, "firmdale": _2, "fish": _2, "fishing": _2, "fit": _2, "fitness": _2, "flickr": _2, "flights": _2, "flir": _2, "florist": _2, "flowers": _2, "fly": _2, "foo": _2, "food": _2, "foodnetwork": _2, "football": _2, "ford": _2, "forex": _2, "forsale": _2, "forum": _2, "foundation": _2, "fox": _2, "free": _2, "fresenius": _2, "frl": _2, "frogans": _2, "frontdoor": _2, "frontier": _2, "ftr": _2, "fujitsu": _2, "fun": _2, "fund": _2, "furniture": _2, "futbol": _2, "fyi": _2, "gal": _2, "gallery": _2, "gallo": _2, "gallup": _2, "game": _2, "games": _2, "gap": _2, "garden": _2, "gay": _2, "gbiz": _2, "gdn": { "$": 1, "succ": { "cnpy": _3 } }, "gea": _2, "gent": _2, "genting": _2, "george": _2, "ggee": _2, "gift": _2, "gifts": _2, "gives": _2, "giving": _2, "glass": _2, "gle": _2, "global": _2, "globo": _2, "gmail": _2, "gmbh": _2, "gmo": _2, "gmx": _2, "godaddy": _2, "gold": _2, "goldpoint": _2, "golf": _2, "goo": _2, "goodyear": _2, "goog": { "$": 1, "succ": { "cloud": _3, "translate": _3, "usercontent": _5 } }, "google": _2, "gop": _2, "got": _2, "grainger": _2, "graphics": _2, "gratis": _2, "green": _2, "gripe": _2, "grocery": _2, "group": { "$": 1, "succ": { "discourse": _3 } }, "guardian": _2, "gucci": _2, "guge": _2, "guide": _2, "guitars": _2, "guru": _2, "hair": _2, "hamburg": _2, "hangout": _2, "haus": _2, "hbo": _2, "hdfc": _2, "hdfcbank": _2, "health": { "$": 1, "succ": { "hra": _3 } }, "healthcare": _2, "help": _2, "helsinki": _2, "here": _2, "hermes": _2, "hgtv": _2, "hiphop": _2, "hisamitsu": _2, "hitachi": _2, "hiv": _2, "hkt": _2, "hockey": _2, "holdings": _2, "holiday": _2, "homedepot": _2, "homegoods": _2, "homes": _2, "homesense": _2, "honda": _2, "horse": _2, "hospital": _2, "host": { "$": 1, "succ": { "cloudaccess": _3, "freesite": _3, "easypanel": _3, "fastvps": _3, "myfast": _3, "tempurl": _3, "wpmudev": _3, "jele": _3, "mircloud": _3, "pcloud": _3, "half": _3 } }, "hosting": { "$": 1, "succ": { "opencraft": _3 } }, "hot": _2, "hoteles": _2, "hotels": _2, "hotmail": _2, "house": _2, "how": _2, "hsbc": _2, "hughes": _2, "hyatt": _2, "hyundai": _2, "ibm": _2, "icbc": _2, "ice": _2, "icu": _2, "ieee": _2, "ifm": _2, "ikano": _2, "imamat": _2, "imdb": _2, "immo": _2, "immobilien": _2, "inc": _2, "industries": _2, "infiniti": _2, "ing": _2, "ink": _2, "institute": _2, "insurance": _2, "insure": _2, "international": _2, "intuit": _2, "investments": _2, "ipiranga": _2, "irish": _2, "ismaili": _2, "ist": _2, "istanbul": _2, "itau": _2, "itv": _2, "jaguar": _2, "java": _2, "jcb": _2, "jeep": _2, "jetzt": _2, "jewelry": _2, "jio": _2, "jll": _2, "jmp": _2, "jnj": _2, "joburg": _2, "jot": _2, "joy": _2, "jpmorgan": _2, "jprs": _2, "juegos": _2, "juniper": _2, "kaufen": _2, "kddi": _2, "kerryhotels": _2, "kerrylogistics": _2, "kerryproperties": _2, "kfh": _2, "kia": _2, "kids": _2, "kim": _2, "kinder": _2, "kindle": _2, "kitchen": _2, "kiwi": _2, "koeln": _2, "komatsu": _2, "kosher": _2, "kpmg": _2, "kpn": _2, "krd": { "$": 1, "succ": { "co": _3, "edu": _3 } }, "kred": _2, "kuokgroup": _2, "kyoto": _2, "lacaixa": _2, "lamborghini": _2, "lamer": _2, "lancaster": _2, "lancia": _2, "land": { "$": 1, "succ": { "static": { "$": 2, "succ": { "dev": _3, "sites": _3 } } } }, "landrover": _2, "lanxess": _2, "lasalle": _2, "lat": _2, "latino": _2, "latrobe": _2, "law": _2, "lawyer": _2, "lds": _2, "lease": _2, "leclerc": _2, "lefrak": _2, "legal": _2, "lego": _2, "lexus": _2, "lgbt": _2, "lidl": _2, "life": _2, "lifeinsurance": _2, "lifestyle": _2, "lighting": _2, "like": _2, "lilly": _2, "limited": _2, "limo": _2, "lincoln": _2, "link": { "$": 1, "succ": { "cyon": _3, "mypep": _3, "dweb": _5 } }, "lipsy": _2, "live": { "$": 1, "succ": { "hlx": _3 } }, "living": _2, "llc": _2, "llp": _2, "loan": _2, "loans": _2, "locker": _2, "locus": _2, "lol": { "$": 1, "succ": { "omg": _3 } }, "london": _2, "lotte": _2, "lotto": _2, "love": _2, "lpl": _2, "lplfinancial": _2, "ltd": _2, "ltda": _2, "lundbeck": _2, "luxe": _2, "luxury": _2, "madrid": _2, "maif": _2, "maison": _2, "makeup": _2, "man": _2, "management": { "$": 1, "succ": { "router": _3 } }, "mango": _2, "map": _2, "market": _2, "marketing": _2, "markets": _2, "marriott": _2, "marshalls": _2, "maserati": _2, "mattel": _2, "mba": _2, "mckinsey": _2, "med": _2, "media": _35, "meet": _2, "melbourne": _2, "meme": _2, "memorial": _2, "men": _2, "menu": _36, "merckmsd": _2, "miami": _2, "microsoft": _2, "mini": _2, "mint": _2, "mit": _2, "mitsubishi": _2, "mlb": _2, "mls": _2, "mma": _2, "mobile": _2, "moda": _2, "moe": _2, "moi": _2, "mom": _2, "monash": _2, "money": _2, "monster": _2, "mormon": _2, "mortgage": _2, "moscow": _2, "moto": _2, "motorcycles": _2, "mov": _2, "movie": _2, "msd": _2, "mtn": _2, "mtr": _2, "music": _2, "mutual": _2, "nab": _2, "nagoya": _2, "natura": _2, "navy": _2, "nba": _2, "nec": _2, "netbank": _2, "netflix": _2, "network": { "$": 1, "succ": { "alces": _5, "co": _3, "arvo": _3, "azimuth": _3, "tlon": _3 } }, "neustar": _2, "new": _2, "news": { "$": 1, "succ": { "noticeable": _3 } }, "next": _2, "nextdirect": _2, "nexus": _2, "nfl": _2, "ngo": _2, "nhk": _2, "nico": _2, "nike": _2, "nikon": _2, "ninja": _2, "nissan": _2, "nissay": _2, "nokia": _2, "northwesternmutual": _2, "norton": _2, "now": _2, "nowruz": _2, "nowtv": _2, "nra": _2, "nrw": _2, "ntt": _2, "nyc": _2, "obi": _2, "observer": _2, "office": _2, "okinawa": _2, "olayan": _2, "olayangroup": _2, "oldnavy": _2, "ollo": _2, "omega": _2, "one": { "$": 1, "succ": { "onred": { "$": 2, "succ": { "staging": _3 } }, "service": _3, "homelink": _3 } }, "ong": _2, "onl": _2, "online": { "$": 1, "succ": { "eero": _3, "eero-stage": _3, "barsy": _3 } }, "ooo": _2, "open": _2, "oracle": _2, "orange": { "$": 1, "succ": { "tech": _3 } }, "organic": _2, "origins": _2, "osaka": _2, "otsuka": _2, "ott": _2, "ovh": { "$": 1, "succ": { "nerdpol": _3 } }, "page": { "$": 1, "succ": { "hlx": _3, "hlx3": _3, "translated": _3, "codeberg": _3, "pdns": _3, "plesk": _3, "prvcy": _3, "rocky": _3, "magnet": _3 } }, "panasonic": _2, "paris": _2, "pars": _2, "partners": _2, "parts": _2, "party": _29, "passagens": _2, "pay": _2, "pccw": _2, "pet": _2, "pfizer": _2, "pharmacy": _2, "phd": _2, "philips": _2, "phone": _2, "photo": _2, "photography": _2, "photos": _35, "physio": _2, "pics": _2, "pictet": _2, "pictures": { "$": 1, "succ": { "1337": _3 } }, "pid": _2, "pin": _2, "ping": _2, "pink": _2, "pioneer": _2, "pizza": { "$": 1, "succ": { "ngrok": _3 } }, "place": _10, "play": _2, "playstation": _2, "plumbing": _2, "plus": _2, "pnc": _2, "pohl": _2, "poker": _2, "politie": _2, "porn": { "$": 1, "succ": { "indie": _3 } }, "pramerica": _2, "praxi": _2, "press": _2, "prime": _2, "prod": _2, "productions": _2, "prof": _2, "progressive": _2, "promo": _2, "properties": _2, "property": _2, "protection": _2, "pru": _2, "prudential": _2, "pub": _36, "pwc": _2, "qpon": _2, "quebec": _2, "quest": _2, "racing": _2, "radio": _2, "read": _2, "realestate": _2, "realtor": _2, "realty": _2, "recipes": _2, "red": _2, "redstone": _2, "redumbrella": _2, "rehab": _2, "reise": _2, "reisen": _2, "reit": _2, "reliance": _2, "ren": _2, "rent": _2, "rentals": _2, "repair": _2, "report": _2, "republican": _2, "rest": _2, "restaurant": _2, "review": _29, "reviews": _2, "rexroth": _2, "rich": _2, "richardli": _2, "ricoh": _2, "ril": _2, "rio": _2, "rip": { "$": 1, "succ": { "clan": _3 } }, "rocher": _2, "rocks": { "$": 1, "succ": { "myddns": _3, "lima-city": _3, "webspace": _3 } }, "rodeo": _2, "rogers": _2, "room": _2, "rsvp": _2, "rugby": _2, "ruhr": _2, "run": { "$": 1, "succ": { "hs": _3, "development": _3, "ravendb": _3, "servers": _3, "build": _5, "code": _5, "database": _5, "migration": _5, "onporter": _3, "repl": _3 } }, "rwe": _2, "ryukyu": _2, "saarland": _2, "safe": _2, "safety": _2, "sakura": _2, "sale": _2, "salon": _2, "samsclub": _2, "samsung": _2, "sandvik": _2, "sandvikcoromant": _2, "sanofi": _2, "sap": _2, "sarl": _2, "sas": _2, "save": _2, "saxo": _2, "sbi": _2, "sbs": _2, "sca": _2, "scb": _2, "schaeffler": _2, "schmidt": _2, "scholarships": _2, "school": _2, "schule": _2, "schwarz": _2, "science": _29, "scot": { "$": 1, "succ": { "edu": _3, "gov": { "$": 2, "succ": { "service": _3 } } } }, "search": _2, "seat": _2, "secure": _2, "security": _2, "seek": _2, "select": _2, "sener": _2, "services": { "$": 1, "succ": { "loginline": _3 } }, "seven": _2, "sew": _2, "sex": _2, "sexy": _2, "sfr": _2, "shangrila": _2, "sharp": _2, "shaw": _2, "shell": _2, "shia": _2, "shiksha": _2, "shoes": _2, "shop": { "$": 1, "succ": { "base": _3, "hoplix": _3, "barsy": _3 } }, "shopping": _2, "shouji": _2, "show": _2, "showtime": _2, "silk": _2, "sina": _2, "singles": _2, "site": { "$": 1, "succ": { "cloudera": _5, "cyon": _3, "fnwk": _3, "folionetwork": _3, "fastvps": _3, "jele": _3, "lelux": _3, "loginline": _3, "barsy": _3, "mintere": _3, "omniwe": _3, "opensocial": _3, "platformsh": _5, "tst": _5, "byen": _3, "srht": _3, "novecore": _3 } }, "ski": _2, "skin": _2, "sky": _2, "skype": _2, "sling": _2, "smart": _2, "smile": _2, "sncf": _2, "soccer": _2, "social": _2, "softbank": _2, "software": _2, "sohu": _2, "solar": _2, "solutions": { "$": 1, "succ": { "diher": _5 } }, "song": _2, "sony": _2, "soy": _2, "spa": _2, "space": { "$": 1, "succ": { "myfast": _3, "uber": _3, "xs4all": _3 } }, "sport": _2, "spot": _2, "srl": _2, "stada": _2, "staples": _2, "star": _2, "statebank": _2, "statefarm": _2, "stc": _2, "stcgroup": _2, "stockholm": _2, "storage": _2, "store": { "$": 1, "succ": { "sellfy": _3, "shopware": _3, "storebase": _3 } }, "stream": _2, "studio": _2, "study": _2, "style": _2, "sucks": _2, "supplies": _2, "supply": _2, "support": _36, "surf": _2, "surgery": _2, "suzuki": _2, "swatch": _2, "swiss": _2, "sydney": _2, "systems": { "$": 1, "succ": { "knightpoint": _3 } }, "tab": _2, "taipei": _2, "talk": _2, "taobao": _2, "target": _2, "tatamotors": _2, "tatar": _2, "tattoo": _2, "tax": _2, "taxi": _2, "tci": _2, "tdk": _2, "team": { "$": 1, "succ": { "discourse": _3, "jelastic": _3 } }, "tech": _2, "technology": _10, "temasek": _2, "tennis": _2, "teva": _2, "thd": _2, "theater": _2, "theatre": _2, "tiaa": _2, "tickets": _2, "tienda": _2, "tiffany": _2, "tips": _2, "tires": _2, "tirol": _2, "tjmaxx": _2, "tjx": _2, "tkmaxx": _2, "tmall": _2, "today": { "$": 1, "succ": { "prequalifyme": _3 } }, "tokyo": _2, "tools": _2, "top": { "$": 1, "succ": { "now-dns": _3, "ntdll": _3 } }, "toray": _2, "toshiba": _2, "total": _2, "tours": _2, "town": _2, "toyota": _2, "toys": _2, "trade": _29, "trading": _2, "training": _2, "travel": _2, "travelchannel": _2, "travelers": _2, "travelersinsurance": _2, "trust": _2, "trv": _2, "tube": _2, "tui": _2, "tunes": _2, "tushu": _2, "tvs": _2, "ubank": _2, "ubs": _2, "unicom": _2, "university": _2, "uno": _2, "uol": _2, "ups": _2, "vacations": _2, "vana": _2, "vanguard": _2, "vegas": _2, "ventures": _2, "verisign": _2, "versicherung": _2, "vet": _2, "viajes": _2, "video": _2, "vig": _2, "viking": _2, "villas": _2, "vin": _2, "vip": _2, "virgin": _2, "visa": _2, "vision": _2, "viva": _2, "vivo": _2, "vlaanderen": _2, "vodka": _2, "volkswagen": _2, "volvo": _2, "vote": _2, "voting": _2, "voto": _2, "voyage": _2, "vuelos": _2, "wales": _2, "walmart": _2, "walter": _2, "wang": _2, "wanggou": _2, "watch": _2, "watches": _2, "weather": _2, "weatherchannel": _2, "webcam": _2, "weber": _2, "website": _35, "wedding": _2, "weibo": _2, "weir": _2, "whoswho": _2, "wien": _2, "wiki": _35, "williamhill": _2, "win": _2, "windows": _2, "wine": _2, "winners": _2, "wme": _2, "wolterskluwer": _2, "woodside": _2, "work": _2, "works": _2, "world": _2, "wow": _2, "wtc": _2, "wtf": _2, "xbox": _2, "xerox": _2, "xfinity": _2, "xihuan": _2, "xin": _2, "xn--11b4c3d": _2, "कॉम": _2, "xn--1ck2e1b": _2, "セール": _2, "xn--1qqw23a": _2, "佛山": _2, "xn--30rr7y": _2, "慈善": _2, "xn--3bst00m": _2, "集团": _2, "xn--3ds443g": _2, "在线": _2, "xn--3pxu8k": _2, "点看": _2, "xn--42c2d9a": _2, "คอม": _2, "xn--45q11c": _2, "八卦": _2, "xn--4gbrim": _2, "موقع": _2, "xn--55qw42g": _2, "公益": _2, "xn--55qx5d": _2, "公司": _2, "xn--5su34j936bgsg": _2, "香格里拉": _2, "xn--5tzm5g": _2, "网站": _2, "xn--6frz82g": _2, "移动": _2, "xn--6qq986b3xl": _2, "我爱你": _2, "xn--80adxhks": _2, "москва": _2, "xn--80aqecdr1a": _2, "католик": _2, "xn--80asehdb": _2, "онлайн": _2, "xn--80aswg": _2, "сайт": _2, "xn--8y0a063a": _2, "联通": _2, "xn--9dbq2a": _2, "קום": _2, "xn--9et52u": _2, "时尚": _2, "xn--9krt00a": _2, "微博": _2, "xn--b4w605ferd": _2, "淡马锡": _2, "xn--bck1b9a5dre4c": _2, "ファッション": _2, "xn--c1avg": _2, "орг": _2, "xn--c2br7g": _2, "नेट": _2, "xn--cck2b3b": _2, "ストア": _2, "xn--cckwcxetd": _2, "アマゾン": _2, "xn--cg4bki": _2, "삼성": _2, "xn--czr694b": _2, "商标": _2, "xn--czrs0t": _2, "商店": _2, "xn--czru2d": _2, "商城": _2, "xn--d1acj3b": _2, "дети": _2, "xn--eckvdtc9d": _2, "ポイント": _2, "xn--efvy88h": _2, "新闻": _2, "xn--fct429k": _2, "家電": _2, "xn--fhbei": _2, "كوم": _2, "xn--fiq228c5hs": _2, "中文网": _2, "xn--fiq64b": _2, "中信": _2, "xn--fjq720a": _2, "娱乐": _2, "xn--flw351e": _2, "谷歌": _2, "xn--fzys8d69uvgm": _2, "電訊盈科": _2, "xn--g2xx48c": _2, "购物": _2, "xn--gckr3f0f": _2, "クラウド": _2, "xn--gk3at1e": _2, "通販": _2, "xn--hxt814e": _2, "网店": _2, "xn--i1b6b1a6a2e": _2, "संगठन": _2, "xn--imr513n": _2, "餐厅": _2, "xn--io0a7i": _2, "网络": _2, "xn--j1aef": _2, "ком": _2, "xn--jlq480n2rg": _2, "亚马逊": _2, "xn--jvr189m": _2, "食品": _2, "xn--kcrx77d1x4a": _2, "飞利浦": _2, "xn--kput3i": _2, "手机": _2, "xn--mgba3a3ejt": _2, "ارامكو": _2, "xn--mgba7c0bbn0a": _2, "العليان": _2, "xn--mgbaakc7dvf": _2, "اتصالات": _2, "xn--mgbab2bd": _2, "بازار": _2, "xn--mgbca7dzdo": _2, "ابوظبي": _2, "xn--mgbi4ecexp": _2, "كاثوليك": _2, "xn--mgbt3dhd": _2, "همراه": _2, "xn--mk1bu44c": _2, "닷컴": _2, "xn--mxtq1m": _2, "政府": _2, "xn--ngbc5azd": _2, "شبكة": _2, "xn--ngbe9e0a": _2, "بيتك": _2, "xn--ngbrx": _2, "عرب": _2, "xn--nqv7f": _2, "机构": _2, "xn--nqv7fs00ema": _2, "组织机构": _2, "xn--nyqy26a": _2, "健康": _2, "xn--otu796d": _2, "招聘": _2, "xn--p1acf": { "$": 1, "succ": { "xn--90amc": _3, "xn--j1aef": _3, "xn--j1ael8b": _3, "xn--h1ahn": _3, "xn--j1adp": _3, "xn--c1avg": _3, "xn--80aaa0cvac": _3, "xn--h1aliz": _3, "xn--90a1af": _3, "xn--41a": _3 } }, "рус": { "$": 1, "succ": { "биз": _3, "ком": _3, "крым": _3, "мир": _3, "мск": _3, "орг": _3, "самара": _3, "сочи": _3, "спб": _3, "я": _3 } }, "xn--pssy2u": _2, "大拿": _2, "xn--q9jyb4c": _2, "みんな": _2, "xn--qcka1pmc": _2, "グーグル": _2, "xn--rhqv96g": _2, "世界": _2, "xn--rovu88b": _2, "書籍": _2, "xn--ses554g": _2, "网址": _2, "xn--t60b56a": _2, "닷넷": _2, "xn--tckwe": _2, "コム": _2, "xn--tiq49xqyj": _2, "天主教": _2, "xn--unup4y": _2, "游戏": _2, "xn--vermgensberater-ctb": _2, "vermögensberater": _2, "xn--vermgensberatung-pwb": _2, "vermögensberatung": _2, "xn--vhquv": _2, "企业": _2, "xn--vuq861b": _2, "信息": _2, "xn--w4r85el8fhu5dnra": _2, "嘉里大酒店": _2, "xn--w4rs40l": _2, "嘉里": _2, "xn--xhq521b": _2, "广东": _2, "xn--zfr164b": _2, "政务": _2, "xyz": { "$": 1, "succ": { "blogsite": _3, "localzone": _3, "crafting": _3, "zapto": _3, "telebit": _5 } }, "yachts": _2, "yahoo": _2, "yamaxun": _2, "yandex": _2, "yodobashi": _2, "yoga": _2, "yokohama": _2, "you": _2, "youtube": _2, "yun": _2, "zappos": _2, "zara": _2, "zero": _2, "zip": _2, "zone": { "$": 1, "succ": { "cloud66": _3, "hs": _3, "triton": _5, "lima": _3 } }, "zuerich": _2 } }; - ; - return rules; -})(); -//# sourceMappingURL=trie.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts/dist/es6/src/suffix-trie.js - - -/** - * Lookup parts of domain in Trie - */ -function suffix_trie_lookupInTrie(parts, trie, index, allowedMask) { - let result = null; - let node = trie; - while (node !== undefined) { - // We have a match! - if ((node.$ & allowedMask) !== 0) { - result = { - index: index + 1, - isIcann: node.$ === 1 /* RULE_TYPE.ICANN */, - isPrivate: node.$ === 2 /* RULE_TYPE.PRIVATE */, - }; +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, + ...processCreateParams(params), + }); +}; +ZodEffects.createWithPreprocess = (preprocess, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params), + }); +}; +class ZodOptional extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.undefined) { + return OK(undefined); } - // No more `parts` to look for - if (index === -1) { - break; + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +} +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params), + }); +}; +class ZodNullable extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType === ZodParsedType.null) { + return OK(null); } - const succ = node.succ; - node = succ && (succ[parts[index]] || succ['*']); - index -= 1; + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; } - return result; } -/** - * Check if `hostname` has a valid public suffix in `trie`. - */ -function suffix_trie_suffixLookup(hostname, options, out) { - if (fast_path(hostname, options, out) === true) { - return; +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params), + }); +}; +class ZodDefault extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx, + }); } - const hostnameParts = hostname.split('.'); - const allowedMask = (options.allowPrivateDomains === true ? 2 /* RULE_TYPE.PRIVATE */ : 0) | - (options.allowIcannDomains === true ? 1 /* RULE_TYPE.ICANN */ : 0); - // Look for exceptions - const exceptionMatch = suffix_trie_lookupInTrie(hostnameParts, trie_exceptions, hostnameParts.length - 1, allowedMask); - if (exceptionMatch !== null) { - out.isIcann = exceptionMatch.isIcann; - out.isPrivate = exceptionMatch.isPrivate; - out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.'); - return; + removeDefault() { + return this._def.innerType; } - // Look for a match in rules - const rulesMatch = suffix_trie_lookupInTrie(hostnameParts, trie_rules, hostnameParts.length - 1, allowedMask); - if (rulesMatch !== null) { - out.isIcann = rulesMatch.isIcann; - out.isPrivate = rulesMatch.isPrivate; - out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.'); - return; +} +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" + ? params.default + : () => params.default, + ...processCreateParams(params), + }); +}; +class ZodCatch extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + // newCtx is used to not collect issues from inner types in ctx + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [], + }, + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx, + }, + }); + if (isAsync(result)) { + return result.then((result) => { + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; + }); + } + else { + return { + status: "valid", + value: result.status === "valid" + ? result.value + : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data, + }), + }; + } + } + removeCatch() { + return this._def.innerType; } - // No match found... - // Prevailing rule is '*' so we consider the top-level domain to be the - // public suffix of `hostname` (e.g.: 'example.org' => 'org'). - out.isIcann = false; - out.isPrivate = false; - out.publicSuffix = hostnameParts[hostnameParts.length - 1]; -} -//# sourceMappingURL=suffix-trie.js.map -;// CONCATENATED MODULE: ../../node_modules/tldts/dist/es6/index.js - - -// For all methods but 'parse', it does not make sense to allocate an object -// every single time to only return the value of a specific attribute. To avoid -// this un-necessary allocation, we use a global object which is re-used. -const es6_RESULT = factory_getEmptyResult(); -function es6_parse(url, options = {}) { - return factory_parseImpl(url, 5 /* FLAG.ALL */, suffix_trie_suffixLookup, options, factory_getEmptyResult()); -} -function es6_getHostname(url, options = {}) { - /*@__INLINE__*/ resetResult(es6_RESULT); - return parseImpl(url, 0 /* FLAG.HOSTNAME */, suffixLookup, options, es6_RESULT).hostname; -} -function es6_getPublicSuffix(url, options = {}) { - /*@__INLINE__*/ resetResult(es6_RESULT); - return parseImpl(url, 2 /* FLAG.PUBLIC_SUFFIX */, suffixLookup, options, es6_RESULT) - .publicSuffix; -} -function es6_getDomain(url, options = {}) { - /*@__INLINE__*/ factory_resetResult(es6_RESULT); - return factory_parseImpl(url, 3 /* FLAG.DOMAIN */, suffix_trie_suffixLookup, options, es6_RESULT).domain; -} -function es6_getSubdomain(url, options = {}) { - /*@__INLINE__*/ resetResult(es6_RESULT); - return parseImpl(url, 4 /* FLAG.SUB_DOMAIN */, suffixLookup, options, es6_RESULT) - .subdomain; } -function es6_getDomainWithoutSuffix(url, options = {}) { - /*@__INLINE__*/ resetResult(es6_RESULT); - return parseImpl(url, 5 /* FLAG.ALL */, suffixLookup, options, es6_RESULT) - .domainWithoutSuffix; +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, + ...processCreateParams(params), + }); +}; +class ZodNaN extends ZodType { + _parse(input) { + const parsedType = this._getType(input); + if (parsedType !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.nan, + received: ctx.parsedType, + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } } -//# sourceMappingURL=index.js.map -// EXTERNAL MODULE: ../../node_modules/bowser/es5.js -var es5 = __webpack_require__(7160); -var es5_default = /*#__PURE__*/__webpack_require__.n(es5); -;// CONCATENATED MODULE: ../tswebextension/node_modules/nanoid/index.browser.js - -let random = bytes => crypto.getRandomValues(new Uint8Array(bytes)) -let customRandom = (alphabet, defaultSize, getRandom) => { - let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 - let step = -~((1.6 * mask * defaultSize) / alphabet.length) - return (size = defaultSize) => { - let id = '' - while (true) { - let bytes = getRandom(step) - let j = step - while (j--) { - id += alphabet[bytes[j] & mask] || '' - if (id.length === size) return id - } +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params), + }); +}; +const BRAND = Symbol("zod_brand"); +class ZodBranded extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx, + }); + } + unwrap() { + return this._def.type; } - } } -let customAlphabet = (alphabet, size = 21) => - customRandom(alphabet, size, random) -let nanoid = (size = 21) => - crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => { - byte &= 63 - if (byte < 36) { - id += byte.toString(36) - } else if (byte < 62) { - id += (byte - 26).toString(36).toUpperCase() - } else if (byte > 62) { - id += '-' - } else { - id += '_' +class ZodPipeline extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.common.async) { + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } + else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } + }; + return handleAsync(); + } + else { + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx, + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value, + }; + } + else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx, + }); + } + } + } + static create(a, b) { + return new ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline, + }); } - return id - }, '') - -// EXTERNAL MODULE: ../../node_modules/@adguard/scriptlets/dist/umd/scriptlets.umd.js -var umd_scriptlets_umd = __webpack_require__(1586); -// EXTERNAL MODULE: ../../node_modules/lru_map/dist/lru.js -var dist_lru = __webpack_require__(1427); -;// CONCATENATED MODULE: ../tswebextension/dist/index.js - - - - - - - - - - -function dist_awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); } - -/** - * Top level app context storage. +const custom = (check, params = {}, +/* + * @deprecated + * + * Pass `fatal` into the params object instead: + * + * ```ts + * z.string().custom((val) => val.length > 5, { fatal: false }) + * ``` * - * This context is needed to share data between other modules without cyclic dependencies. */ -class AppContext { - constructor() { - /** - * Is app started. - */ - this.isAppStarted = false; - } -} -const appContext = new AppContext(); - -var dist_RequestType = { - Document: 1, - SubDocument: 2, - Script: 4, - Stylesheet: 8, - Object: 16, - Image: 32, - XmlHttpRequest: 64, - Media: 128, - Font: 256, - WebSocket: 512, - Ping: 1024, - Other: 2048, +fatal) => { + if (check) + return ZodAny.create().superRefine((data, ctx) => { + var _a, _b; + if (!check(data)) { + const p = typeof params === "function" + ? params(data) + : typeof params === "string" + ? { message: params } + : params; + const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true; + const p2 = typeof p === "string" ? { message: p } : p; + ctx.addIssue({ code: "custom", ...p2, fatal: _fatal }); + } + }); + return ZodAny.create(); +}; +const late = { + object: ZodObject.lazycreate, +}; +var ZodFirstPartyTypeKind; +(function (ZodFirstPartyTypeKind) { + ZodFirstPartyTypeKind["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind["ZodPipeline"] = "ZodPipeline"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +const instanceOfType = ( +// const instanceOfType = any>( +cls, params = { + message: `Input not instance of ${cls.name}`, +}) => custom((data) => data instanceof cls, params); +const stringType = ZodString.create; +const numberType = ZodNumber.create; +const nanType = ZodNaN.create; +const bigIntType = ZodBigInt.create; +const booleanType = ZodBoolean.create; +const dateType = ZodDate.create; +const symbolType = ZodSymbol.create; +const undefinedType = ZodUndefined.create; +const nullType = ZodNull.create; +const anyType = ZodAny.create; +const unknownType = ZodUnknown.create; +const neverType = ZodNever.create; +const voidType = ZodVoid.create; +const arrayType = ZodArray.create; +const objectType = ZodObject.create; +const strictObjectType = ZodObject.strictCreate; +const unionType = ZodUnion.create; +const discriminatedUnionType = ZodDiscriminatedUnion.create; +const intersectionType = ZodIntersection.create; +const tupleType = ZodTuple.create; +const recordType = ZodRecord.create; +const mapType = ZodMap.create; +const setType = ZodSet.create; +const functionType = ZodFunction.create; +const lazyType = ZodLazy.create; +const literalType = ZodLiteral.create; +const enumType = ZodEnum.create; +const nativeEnumType = ZodNativeEnum.create; +const promiseType = ZodPromise.create; +const effectsType = ZodEffects.create; +const optionalType = ZodOptional.create; +const nullableType = ZodNullable.create; +const preprocessType = ZodEffects.createWithPreprocess; +const pipelineType = ZodPipeline.create; +const ostring = () => stringType().optional(); +const onumber = () => numberType().optional(); +const oboolean = () => booleanType().optional(); +const coerce = { + string: ((arg) => ZodString.create({ ...arg, coerce: true })), + number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), + boolean: ((arg) => ZodBoolean.create({ + ...arg, + coerce: true, + })), + bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), + date: ((arg) => ZodDate.create({ ...arg, coerce: true })), }; +const NEVER = INVALID; + +var z = /*#__PURE__*/Object.freeze({ + __proto__: null, + defaultErrorMap: errorMap, + setErrorMap: setErrorMap, + getErrorMap: getErrorMap, + makeIssue: makeIssue, + EMPTY_PATH: EMPTY_PATH, + addIssueToContext: addIssueToContext, + ParseStatus: ParseStatus, + INVALID: INVALID, + DIRTY: DIRTY, + OK: OK, + isAborted: isAborted, + isDirty: isDirty, + isValid: isValid, + isAsync: isAsync, + get util () { return util; }, + get objectUtil () { return objectUtil; }, + ZodParsedType: ZodParsedType, + getParsedType: getParsedType, + ZodType: ZodType, + ZodString: ZodString, + ZodNumber: ZodNumber, + ZodBigInt: ZodBigInt, + ZodBoolean: ZodBoolean, + ZodDate: ZodDate, + ZodSymbol: ZodSymbol, + ZodUndefined: ZodUndefined, + ZodNull: ZodNull, + ZodAny: ZodAny, + ZodUnknown: ZodUnknown, + ZodNever: ZodNever, + ZodVoid: ZodVoid, + ZodArray: ZodArray, + ZodObject: ZodObject, + ZodUnion: ZodUnion, + ZodDiscriminatedUnion: ZodDiscriminatedUnion, + ZodIntersection: ZodIntersection, + ZodTuple: ZodTuple, + ZodRecord: ZodRecord, + ZodMap: ZodMap, + ZodSet: ZodSet, + ZodFunction: ZodFunction, + ZodLazy: ZodLazy, + ZodLiteral: ZodLiteral, + ZodEnum: ZodEnum, + ZodNativeEnum: ZodNativeEnum, + ZodPromise: ZodPromise, + ZodEffects: ZodEffects, + ZodTransformer: ZodEffects, + ZodOptional: ZodOptional, + ZodNullable: ZodNullable, + ZodDefault: ZodDefault, + ZodCatch: ZodCatch, + ZodNaN: ZodNaN, + BRAND: BRAND, + ZodBranded: ZodBranded, + ZodPipeline: ZodPipeline, + custom: custom, + Schema: ZodType, + ZodSchema: ZodType, + late: late, + get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; }, + coerce: coerce, + any: anyType, + array: arrayType, + bigint: bigIntType, + boolean: booleanType, + date: dateType, + discriminatedUnion: discriminatedUnionType, + effect: effectsType, + 'enum': enumType, + 'function': functionType, + 'instanceof': instanceOfType, + intersection: intersectionType, + lazy: lazyType, + literal: literalType, + map: mapType, + nan: nanType, + nativeEnum: nativeEnumType, + never: neverType, + 'null': nullType, + nullable: nullableType, + number: numberType, + object: objectType, + oboolean: oboolean, + onumber: onumber, + optional: optionalType, + ostring: ostring, + pipeline: pipelineType, + preprocess: preprocessType, + promise: promiseType, + record: recordType, + set: setType, + strictObject: strictObjectType, + string: stringType, + symbol: symbolType, + transformer: effectsType, + tuple: tupleType, + 'undefined': undefinedType, + union: unionType, + unknown: unknownType, + 'void': voidType, + NEVER: NEVER, + ZodIssueCode: ZodIssueCode, + quotelessJson: quotelessJson, + ZodError: ZodError +}); + + + +;// CONCATENATED MODULE: ../tswebextension/node_modules/nanoid/index.browser.js + +let random = bytes => crypto.getRandomValues(new Uint8Array(bytes)) +let customRandom = (alphabet, defaultSize, getRandom) => { + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + let step = -~((1.6 * mask * defaultSize) / alphabet.length) + return (size = defaultSize) => { + let id = '' + while (true) { + let bytes = getRandom(step) + let j = step + while (j--) { + id += alphabet[bytes[j] & mask] || '' + if (id.length === size) return id + } + } + } +} +let customAlphabet = (alphabet, size = 21) => + customRandom(alphabet, size, random) +let nanoid = (size = 21) => + crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => { + byte &= 63 + if (byte < 36) { + id += byte.toString(36) + } else if (byte < 62) { + id += (byte - 26).toString(36).toUpperCase() + } else if (byte > 62) { + id += '-' + } else { + id += '_' + } + return id + }, '') + +// EXTERNAL MODULE: ../tswebextension/node_modules/bowser/es5.js +var es5 = __webpack_require__(3563); +var es5_default = /*#__PURE__*/__webpack_require__.n(es5); +// EXTERNAL MODULE: ../tswebextension/node_modules/@adguard/scriptlets/dist/umd/scriptlets.umd.js +var umd_scriptlets_umd = __webpack_require__(6145); +// EXTERNAL MODULE: ../tswebextension/node_modules/lru_map/dist/lru.js +var dist_lru = __webpack_require__(6317); +;// CONCATENATED MODULE: ../tswebextension/dist/index.js + -/** - * Stealth mode configuration schema. - */ -const stealthConfigValidator = mod.object({ - /** - * Should the application set a fixed lifetime from - * {@link StealthConfig.selfDestructFirstPartyCookiesTime} for first-party - * cookies. - */ - selfDestructFirstPartyCookies: mod.boolean(), - /** - * Time in minutes to delete first-party cookies. - */ - selfDestructFirstPartyCookiesTime: mod.number(), - /** - * Should the application set a fixed lifetime from - * {@link StealthConfig.selfDestructThirdPartyCookiesTime} for third-party - * cookies. - */ - selfDestructThirdPartyCookies: mod.boolean(), - /** - * Time in minutes to delete third-party cookies. - */ - selfDestructThirdPartyCookiesTime: mod.number(), - /** - * Should the application hide the origin referrer in third-party requests - * by replacing the referrer url with the request url. - */ - hideReferrer: mod.boolean(), - /** - * Should the application hide the original referrer from the search page - * containing the search query in third-party queries, replacing - * the referrer url with the request url. - */ - hideSearchQueries: mod.boolean(), - /** - * For Google Chrome, it removes the 'X-Client-Data' header from - * the requests, which contains information about the browser version - * and modifications. - */ - blockChromeClientData: mod.boolean(), - /** - * Includes HTTP headers 'DNT' and 'Sec-GPC' in all requests. - * - * @see https://en.wikipedia.org/wiki/Do_Not_Track - * @see https://globalprivacycontrol.org - */ - sendDoNotTrack: mod.boolean(), - /** - * Blocks the possibility of leaking your IP address through WebRTC, even if - * you use a proxy server or VPN. - */ - blockWebRTC: mod.boolean(), -}).strict(); -/** - * Settings configuration schema. - */ -const settingsConfigValidator = mod.object({ - /** - * If this flag is true, the application will work ONLY with domains - * from the {@link Configuration.allowlist}, - * otherwise it will work everywhere EXCLUDING domains from the list. - */ - allowlistInverted: mod.boolean(), - /** - * Flag specifying {@link Configuration.allowlist} enable state. - * We don't use allowlist array length condition for calculate enable state, - * because it's not cover case with empty list in inverted mode. - */ - allowlistEnabled: mod.boolean(), - /** - * Enables css hits counter if true. - */ - collectStats: mod.boolean(), - /** - * Enables stealth mode if true. - */ - stealthModeEnabled: mod.boolean(), - /** - * Enables filtering if true. - */ - filteringEnabled: mod.boolean(), - /** - * Redirect url for $document rules. - */ - documentBlockingPageUrl: mod.string().optional(), - /** - * Path to the assembled @adguard/assistant module. Necessary for lazy - * on-demand loading of the assistant. - */ - assistantUrl: mod.string(), - /** - * Stealth mode options. - */ - stealth: stealthConfigValidator, -}); -/** - * Generic app configuration schema. - */ -const configurationValidator = mod.object({ - /** - * List of hostnames or domains of sites, which should be excluded - * from blocking or which should be included in blocking - * depending on the value of {@link SettingsConfig.allowlistInverted} setting value. - */ - allowlist: mod.string().array(), - /** - * List of domain names of sites, which should be temporary excluded from document blocking. - */ - trustedDomains: mod.string().array(), - /** - * List of rules added by user. - */ - userrules: mod.string().array(), - /** - * Flag responsible for logging. - */ - verbose: mod.boolean(), - settings: settingsConfigValidator, -}).strict(); -/** - * @file - * This file contains constants for communication between background and content scripts. - * This constants are separated from message.ts to reduce bundle size, - * because rollup cannot tree-shake tswebextension library code. - */ -/** - * Name of the message handler. - * It is needed for determining specific tswebextension message from other messages. - */ -const MESSAGE_HANDLER_NAME = 'tsWebExtension'; -/** - * Message types for communication between background and content scripts. - */ -var MessageType; -(function (MessageType) { - MessageType["ProcessShouldCollapse"] = "processShouldCollapse"; - MessageType["GetCosmeticData"] = "getCosmeticData"; - MessageType["GetCss"] = "getCss"; - MessageType["GetCookieRules"] = "getCookieRules"; - MessageType["SaveCookieLogEvent"] = "saveCookieLogEvent"; - MessageType["InitAssistant"] = "initAssistant"; - MessageType["CloseAssistant"] = "closeAssistant"; - MessageType["AssistantCreateRule"] = "assistantCreateRule"; - MessageType["SaveCssHitsStats"] = "saveCssHitsStats"; -})(MessageType || (MessageType = {})); -/** - * @file - * This file contains validation schemas and inferred types for message data. - */ -/** - * Message DTO validation schema. - */ -const messageValidator = mod.object({ - handlerName: mod.literal(MESSAGE_HANDLER_NAME), - type: mod.nativeEnum(MessageType), - payload: mod.unknown(), -}).strict(); -/** - * {@link MessageType.ProcessShouldCollapse} Message payload validation schema. - */ -const processShouldCollapsePayloadValidator = mod.object({ - elementUrl: mod.string(), - documentUrl: mod.string(), - requestType: mod.nativeEnum(RequestType), -}).strict(); -/** - * {@link MessageType.GetCosmeticData} Message payload validation schema. - */ -const getExtendedCssPayloadValidator = mod.object({ - documentUrl: mod.string(), -}).strict(); -/** - * {@link MessageType.GetCss} Message payload validation schema. - */ -const getCssPayloadValidator = mod.object({ - url: mod.string(), -}).strict(); -/** - * {@link MessageType.GetCookieRules} Message payload validation schema. - */ -const getCookieRulesPayloadValidator = mod.object({ - documentUrl: mod.string(), -}).strict(); -/** - * {@link MessageType.SaveCookieLogEvent} Message payload validation schema. - */ -const getSaveCookieLogEventPayloadValidator = mod.object({ - cookieName: mod.string(), - cookieDomain: mod.string(), - cookieValue: mod.string(), - ruleText: mod.string(), - filterId: mod.number(), - thirdParty: mod.boolean(), -}).strict(); -/** - * {@link MessageType.InitAssistant} Message payload validation schema. - */ -const getAssistantCreateRulePayloadValidator = mod.object({ - ruleText: mod.string(), -}).strict(); + + + + + + +const USER_FILTER_ID = 0; +const ALLOWLIST_FILTER_ID = 100; +const BACKGROUND_TAB_ID = -1; /** - * Simple pub-sub implementation. + * The allowlist is used to exclude certain websites from filtering. + * Blocking rules are not applied to the sites in the list. + * The allow list can also be inverted. + * In inverted mode, the application will unblock ads everywhere except for the sites added to this list. */ -class EventChannel { +class Allowlist { constructor() { - this.listeners = []; + this.domains = []; + this.inverted = false; + this.enabled = false; } /** - * Dispatch event. + * Configures allowlist state based on app configuration. * - * @param data Event data. + * @param configuration App configuration. */ - dispatch(data) { - this.listeners.forEach((listener) => listener(data)); + configure(configuration) { + const { allowlist, settings, } = configuration; + const { allowlistEnabled, allowlistInverted, } = settings; + this.enabled = allowlistEnabled; + this.inverted = allowlistInverted; + const domains = []; + allowlist.forEach((hostname) => { + domains.push(hostname.startsWith('www.') ? hostname.substring(4) : hostname); + }); + this.domains = domains; } /** - * Subscribe to events channel. + * Returns a list of rules to be loaded into the engine based on allowlist state. * - * @param listener Callback to be called on event. + * @returns List of allowlist rules or null. */ - subscribe(listener) { - this.listeners.push(listener); + getAllowlistRules() { + if (this.enabled && !this.inverted) { + return new StringRuleList(ALLOWLIST_FILTER_ID, this.domains.map((domain) => { + return Allowlist.createAllowlistRuleString(domain); + }).join('\n')); + } + return null; } /** - * Unsubscribe from events channel. + * Creates allowlist rule for domain. * - * @param listener Callback to be removed from listeners. + * @param domain Domain name. + * @returns Allowlist rule or null. */ - unsubscribe(listener) { - const index = this.listeners.indexOf(listener); - if (index !== -1) { - this.listeners.splice(index, 1); + static createAllowlistRule(domain) { + if (!domain) { + return null; } + const ruleString = Allowlist.createAllowlistRuleString(domain); + return new NetworkRule(ruleString, ALLOWLIST_FILTER_ID); + } + /** + * Creates rule string based on specified domain. + * + * @param domain Allowlisted domain. + * @returns Allowlist rule string. + */ + static createAllowlistRuleString(domain) { + return String.raw `@@///(www\.)?${domain}/$document,important`; } } +function dist_awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + /** * Checks if url is http request. * @@ -71632,7 +75488,7 @@ function dist_getDomain(url) { * @returns True if request is extension's own. */ function isExtensionUrl(url) { - return url.indexOf(browser_polyfill_default().runtime.getURL('')) === 0; + return url.indexOf(dist_browser_polyfill_default().runtime.getURL('')) === 0; } /** * Checks third party relation. @@ -71648,357 +75504,161 @@ function isThirdPartyRequest(requestUrl, referrer) { } /** - * Export logger implementation. + * TSUrlFilter Engine wrapper. */ -class Logger { - /** - * Logger constructor. - * - * @param loggerImpl Logger implementation to set, defaults to global console. - */ - constructor(loggerImpl = console) { - this.verbose = false; - this.loggerImpl = loggerImpl; - this.setVerbose = this.setVerbose.bind(this); - this.error = this.error.bind(this); - this.warn = this.warn.bind(this); - this.debug = this.debug.bind(this); - this.info = this.info.bind(this); - } - /** - * Sets verbose mode. - * - * @param value Boolean flag. - */ - setVerbose(value) { - this.verbose = value; - } - /** - * Calls error method on logger implementation. - * - * @param message Log message. - */ - error(message) { - this.loggerImpl.error(message); - } - /** - * Calls warn method on logger implementation. - * - * @param message Log message. - */ - warn(message) { - if (this.verbose) { - this.loggerImpl.warn(message); - } - } +class EngineApi { /** - * Calls debug method on logger implementation. + * Gets app filtering status. * - * @param message Log message. + * @returns True if filtering is enabled, otherwise returns false. */ - debug(message) { - if (this.verbose) { - this.loggerImpl.debug(message); - } + get isFilteringEnabled() { + var _a; + return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled); } /** - * Calls info method on logger implementation. + * Creates Engine Api instance. * - * @param message Log message. + * @param allowlist Allowlist. + * @param appContext App context. + * @param stealthApi Stealth Api. */ - info(message) { - if (this.verbose) { - this.loggerImpl.info(message); - } - } -} -const dist_logger = new Logger(); - -/** - * Types of filtering events that can occur during request processing. - */ -var FilteringEventType; -(function (FilteringEventType) { - FilteringEventType["SendRequest"] = "sendRequest"; - FilteringEventType["TabReload"] = "tabReload"; - FilteringEventType["ApplyBasicRule"] = "applyBasicRule"; - FilteringEventType["ApplyCosmeticRule"] = "applyCosmeticRule"; - FilteringEventType["ApplyCspRule"] = "applyCspRule"; - FilteringEventType["ReceiveResponse"] = "receiveResponse"; - FilteringEventType["Cookie"] = "cookie"; - FilteringEventType["RemoveHeader"] = "removeHeader"; - FilteringEventType["RemoveParam"] = "removeParam"; - FilteringEventType["ReplaceRuleApply"] = "replaceRuleApply"; - FilteringEventType["ContentFilteringStart"] = "contentFilteringStart"; - FilteringEventType["ContentFilteringFinish"] = "contentFilteringFinish"; - FilteringEventType["StealthAction"] = "stealthAction"; - FilteringEventType["JsInject"] = "jsInject"; -})(FilteringEventType || (FilteringEventType = {})); -/** - * {@link FilteringLogInterface} Default implementation. - */ -class FilteringLog { - constructor() { - this.onLogEvent = new EventChannel(); - this.channels = []; + constructor(allowlist, appContext, stealthApi) { + this.allowlist = allowlist; + this.appContext = appContext; + this.stealthApi = stealthApi; } /** - * Registers listener for specified {@link FilteringLogEvent}. + * Starts engine. * - * @param type Filtering log type. - * @param listener Filtering log listener. + * @param configuration Engine configuration. */ - addEventListener(type, listener) { - const channel = { type, listener }; - this.channels.push(channel); + startEngine(configuration) { + return dist_awaiter(this, void 0, void 0, function* () { + const { filters, userrules, verbose, } = configuration; + this.allowlist.configure(configuration); + const lists = []; + for (let i = 0; i < filters.length; i += 1) { + const { filterId, content, trusted } = filters[i]; + const convertedContent = RuleConverter.convertRules(content); + lists.push(new StringRuleList(filterId, convertedContent, false, !trusted, !trusted)); + } + if (userrules.length > 0) { + const convertedUserRules = RuleConverter.convertRules(userrules.join('\n')); + lists.push(new StringRuleList(USER_FILTER_ID, convertedUserRules)); + } + const allowlistRules = this.allowlist.getAllowlistRules(); + if (allowlistRules) { + lists.push(allowlistRules); + } + const stealthModeList = this.stealthApi.getStealthModeRuleList(); + if (stealthModeList) { + lists.push(stealthModeList); + } + const ruleStorage = new RuleStorage(lists); + setConfiguration({ + engine: 'extension', + version: dist_browser_polyfill_default().runtime.getManifest().version, + verbose, + compatibility: CompatibilityTypes.Extension, + }); + /* + * UI thread becomes blocked on the options page while request filter is created + * that's why we create filter rules using chunks of the specified length + * Request filter creation is rather slow operation so we should + * use setTimeout calls to give UI thread some time. + */ + const engine = new Engine(ruleStorage, true); + yield engine.loadRulesAsync(EngineApi.ASYNC_LOAD_CHINK_SIZE); + this.engine = engine; + }); } /** - * Publishes event to attached listeners. + * Searched for rules by match query. * - * @param event Filtering log event. - */ - publishEvent(event) { - const listeners = this.channels - .filter(({ type }) => type === event.type) - .map(({ listener }) => listener); - for (const listener of listeners) { - listener(event); - } - this.onLogEvent.dispatch(event); - } -} -/** - * Shared {@link FilteringLog} instance. - */ -const defaultFilteringLog = new FilteringLog(); - -// Disable jest coverage for this file, because it will insert -// line comments, and code to count lines covered by tests, for example: -// /* istanbul ignore next */ -// cov_uqm40oh03().f[0]++; -// cov_uqm40oh03().s[2]++; -// And we cannot test these strings correctly, because the names of these -// functions with counters are generated at runtime -/* istanbul ignore file */ -/** - * This module applies stealth actions in page context. - */ -class StealthHelper { - /** - * Sends a Global Privacy Control DOM signal. + * @param matchQuery Query against which the request would be matched. + * @returns Matching result or null. */ - static setDomSignal() { - try { - if ('globalPrivacyControl' in Navigator.prototype) { - return; - } - Object.defineProperty(Navigator.prototype, 'globalPrivacyControl', { - get: () => true, - configurable: true, - enumerable: true, - }); + matchRequest(matchQuery) { + if (!this.engine || !this.isFilteringEnabled) { + return null; } - catch (ex) { - // Ignore + const { requestUrl, frameUrl, requestType, method, } = matchQuery; + let { frameRule } = matchQuery; + const request = new Request(requestUrl, frameUrl, requestType, method); + if (!frameRule) { + frameRule = null; } + return this.engine.matchRequest(request, frameRule); } -} - -// TODO check if we can return typed message here -/** - * Sends message to the background page. - * - * @param message Message to send. - * @param message.payload Payload of the message. - * @param message.type Message type. - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const sendAppMessage = (message) => dist_awaiter(void 0, void 0, void 0, function* () { - return browser.runtime.sendMessage(Object.assign({ handlerName: MESSAGE_HANDLER_NAME }, message)); -}); - -/** - * Request content type. - * - * NOTE: Do not use `const enum`, - * because this enum is imported in extension frontend writing in js. - */ -var ContentType; -(function (ContentType) { - ContentType["Document"] = "document"; - ContentType["Subdocument"] = "subdocument"; - ContentType["Script"] = "script"; - ContentType["Stylesheet"] = "stylesheet"; - ContentType["Object"] = "object"; - ContentType["Image"] = "image"; - ContentType["XmlHttpRequest"] = "xmlHttpRequest"; - ContentType["Media"] = "media"; - ContentType["Font"] = "font"; - ContentType["Websocket"] = "websocket"; - ContentType["WebRtc"] = "webRtc"; - ContentType["Other"] = "other"; - ContentType["Csp"] = "csp"; - ContentType["Cookie"] = "cookie"; - ContentType["Ping"] = "ping"; - ContentType["CspReport"] = "cspReport"; -})(ContentType || (ContentType = {})); -/** - * Returns request type and content type by resource type. - * - * @param resourceType Resource type. - * @returns Request type and content type. - */ -function getRequestType(resourceType) { - switch (resourceType) { - case 'main_frame': - return { - contentType: ContentType.Document, - requestType: dist_RequestType.Document, - }; - case 'sub_frame': - return { - contentType: ContentType.Subdocument, - requestType: dist_RequestType.SubDocument, - }; - case 'stylesheet': - return { - contentType: ContentType.Stylesheet, - requestType: dist_RequestType.Stylesheet, - }; - case 'script': - return { - contentType: ContentType.Script, - requestType: dist_RequestType.Script, - }; - case 'image': - case 'imageset': - return { - contentType: ContentType.Image, - requestType: dist_RequestType.Image, - }; - case 'object': - return { - contentType: ContentType.Object, - requestType: dist_RequestType.Object, - }; - case 'xmlhttprequest': - return { - contentType: ContentType.XmlHttpRequest, - requestType: dist_RequestType.XmlHttpRequest, - }; - case 'ping': - case 'beacon': - return { - contentType: ContentType.Ping, - requestType: dist_RequestType.Ping, - }; - case 'font': - return { - contentType: ContentType.Font, - requestType: dist_RequestType.Font, - }; - case 'media': - return { - contentType: ContentType.Media, - requestType: dist_RequestType.Media, - }; - case 'websocket': - return { - contentType: ContentType.Websocket, - requestType: dist_RequestType.WebSocket, - }; - case 'csp_report': - return { - contentType: ContentType.CspReport, - requestType: dist_RequestType.Other, - }; - default: - return { - contentType: ContentType.Other, - requestType: dist_RequestType.Other, - }; - } -} - -/** - * Checks if error has message. - * - * @param error Error object. - * @returns If param is error. - */ -function dist_isErrorWithMessage(error) { - return (typeof error === 'object' - && error !== null - && 'message' in error - && typeof error.message === 'string'); -} -/** - * Converts error to the error with message. - * - * @param maybeError Possible error. - * @returns Error with message. - */ -function dist_toErrorWithMessage(maybeError) { - if (dist_isErrorWithMessage(maybeError)) { - return maybeError; - } - try { - return new Error(JSON.stringify(maybeError)); - } - catch (_a) { - // fallback in case there's an error stringifying the maybeError - // like with circular references for example. - return new Error(String(maybeError)); - } -} -/** - * Converts error object to error with message. This method might be helpful to handle thrown errors. - * - * @param error Error object. - * - * @returns Message of the error. - */ -function dist_getErrorMessage(error) { - return dist_toErrorWithMessage(error).message; -} - -/** - * Allowlist service. - */ -class AllowlistApi { - constructor() { - this.domains = []; - this.inverted = false; - this.enabled = false; + /** + * Searched for cosmetic rules by match query. + * + * @param matchQuery Query against which the request would be matched. + * @returns Cosmetic result. + */ + matchCosmetic(matchQuery) { + if (!this.engine || !this.isFilteringEnabled) { + return new CosmeticResult(); + } + const matchingResult = this.matchRequest(matchQuery); + if (!matchingResult) { + return new CosmeticResult(); + } + const cosmeticOption = matchingResult.getCosmeticOption(); + return this.getCosmeticResult(matchQuery.requestUrl, cosmeticOption); } /** - * Configures allowlist state based on app configuration. + * Matches current frame url and returns rule if found. * - * @param configuration App configuration. + * @param frameUrl Frame url. + * @returns NetworkRule or null. */ - configure(configuration) { - const { allowlist, settings, } = configuration; - const { allowlistEnabled, allowlistInverted, } = settings; - this.enabled = allowlistEnabled; - this.inverted = allowlistInverted; - const domains = []; - allowlist.forEach((hostname) => { - domains.push(hostname.startsWith('www.') ? hostname.substring(4) : hostname); - }); - this.domains = domains; + matchFrame(frameUrl) { + if (!this.engine || !this.isFilteringEnabled) { + return null; + } + return this.engine.matchFrame(frameUrl); } /** - * Returns a list of rules to be loaded into the engine based on allowlist state. + * Gets cosmetic result for the specified hostname and cosmetic options. * - * @returns List of allowlist rules or null. + * @param url Request url. + * @param option Cosmetic options. + * @returns Cosmetic result. */ - getAllowlistRules() { - if (this.enabled && !this.inverted) { - return new StringRuleList(AllowlistApi.allowlistFilterId, this.domains.map((domain) => { - return AllowlistApi.createAllowlistRuleString(domain); - }).join('\n')); + getCosmeticResult(url, option) { + if (!this.engine || !this.isFilteringEnabled) { + return new CosmeticResult(); } - return null; + const frameUrl = getHost(url); + const request = new Request(url, frameUrl, RequestType.Document); + return this.engine.getCosmeticResult(request, option); + } + /** + * Simple getter for rules count. + * + * @returns Number of rules in the engine. + */ + getRulesCount() { + return this.engine ? this.engine.getRulesCount() : 0; + } +} +EngineApi.ASYNC_LOAD_CHINK_SIZE = 5000; + +/** + * Matches rules from {@link EngineApi} based on current {@link Allowlist} state. + */ +class DocumentApi { + /** + * Creates new DocumentApi instance. + * + * @param allowlist Allowlist API. + * @param engineApi Engine API. + */ + constructor(allowlist, engineApi) { + this.allowlist = allowlist; + this.engineApi = engineApi; } /** * Match frame rule based on allowlist state. @@ -72007,17 +75667,18 @@ class AllowlistApi { * @returns Matched rule or null. */ matchFrame(frameUrl) { + const { enabled, inverted } = this.allowlist; /** * If inverted allowlist enabled, use specific matching strategy. */ - if (this.enabled && this.inverted) { + if (enabled && inverted) { return this.matchFrameInverted(frameUrl); } /** * If allowlist mode is default, request rule from engine. * If allowlist is enabled, rules have already loaded. */ - return engineApi.matchFrame(frameUrl); + return this.engineApi.matchFrame(frameUrl); } /** * Creates allowlist rule for domains that are not in the inverted list. @@ -72031,541 +75692,394 @@ class AllowlistApi { if (!domain) { return null; } - if (!this.domains.includes(domain)) { - return AllowlistApi.createAllowlistRule(domain); + if (!this.allowlist.domains.includes(domain)) { + return Allowlist.createAllowlistRule(domain); } - return engineApi.matchFrame(frameUrl); + return this.engineApi.matchFrame(frameUrl); + } +} + +/** + * Simple pub-sub implementation. + */ +class EventChannel { + constructor() { + this.listeners = []; } /** - * Creates allowlist rule for domain. + * Dispatch event. * - * @param domain Domain name. - * @returns Allowlist rule or null. + * @param data Event data. */ - static createAllowlistRule(domain) { - if (!domain) { - return null; - } - const ruleString = AllowlistApi.createAllowlistRuleString(domain); - return new NetworkRule(ruleString, AllowlistApi.allowlistFilterId); + dispatch(data) { + this.listeners.forEach((listener) => listener(data)); } /** - * Creates rule string based on specified domain. + * Subscribe to events channel. * - * @param domain Allowlisted domain. - * @returns Allowlist rule string. + * @param listener Callback to be called on event. */ - static createAllowlistRuleString(domain) { - return String.raw `@@///(www\.)?${domain}/$document,important`; + subscribe(listener) { + this.listeners.push(listener); + } + /** + * Unsubscribe from events channel. + * + * @param listener Callback to be removed from listeners. + */ + unsubscribe(listener) { + const index = this.listeners.indexOf(listener); + if (index !== -1) { + this.listeners.splice(index, 1); + } } } -AllowlistApi.allowlistFilterId = 100; -const allowlistApi = new AllowlistApi(); + +var dist_RequestType = { + NotSet: 0, + Document: 1, + SubDocument: 2, + Script: 4, + Stylesheet: 8, + Object: 16, + Image: 32, + XmlHttpRequest: 64, + Media: 128, + Font: 256, + WebSocket: 512, + Ping: 1024, + Other: 2048, +}; /** - * Finds header object by header name (case-insensitive). - * - * @param headers Headers collection. - * @param headerName Header name. - * @returns Found header, or null if not found. + * Document level frame id. */ -function findHeaderByName(headers, headerName) { - for (let i = 0; i < headers.length; i += 1) { - const header = headers[i]; - if (header.name.toLowerCase() === headerName.toLowerCase()) { - return header; - } - } - return null; -} +const MAIN_FRAME_ID = 0; /** - * TODO: Make function pure (don't modify headers, return new object instead) - * Removes header from headers by name. - * - * @param headers Headers collection. - * @param headerName Header name. - * @returns True if headers were removed. + * Frame context data. */ -function removeHeader(headers, headerName) { - let removed = false; - for (let i = headers.length - 1; i >= 0; i -= 1) { - const header = headers[i]; - if (header.name.toLowerCase() === headerName.toLowerCase()) { - headers.splice(i, 1); - removed = true; - } +class Frame { + /** + * Creates frame instance. + * + * @param url Frame url. + * @param requestId Request id. + */ + constructor(url, requestId) { + this.url = url; + this.requestId = requestId; } - return removed; } +const logLevelNames = [ + "error" /* LogLevelName.Error */, + "warn" /* LogLevelName.Warn */, + "info" /* LogLevelName.Info */, + "debug" /* LogLevelName.Debug */, +]; +const LogLevelEnum = z["enum"](logLevelNames); +const LogLevelValidator = LogLevelEnum.optional(); /** - * Stealth action bitwise masks used on the background page and on the filtering log page. - */ -var StealthActions; -(function (StealthActions) { - StealthActions[StealthActions["None"] = 0] = "None"; - StealthActions[StealthActions["HideReferrer"] = 1] = "HideReferrer"; - StealthActions[StealthActions["HideSearchQueries"] = 2] = "HideSearchQueries"; - StealthActions[StealthActions["BlockChromeClientData"] = 4] = "BlockChromeClientData"; - StealthActions[StealthActions["SendDoNotTrack"] = 8] = "SendDoNotTrack"; - // TODO check where this enums are used, and add comments - StealthActions[StealthActions["FirstPartyCookies"] = 16] = "FirstPartyCookies"; - StealthActions[StealthActions["ThirdPartyCookies"] = 32] = "ThirdPartyCookies"; -})(StealthActions || (StealthActions = {})); -/** - * Stealth service module. + * Stealth mode configuration schema. */ -class StealthService { +const stealthConfigValidator = z.object({ /** - * Constructor. - * - * @param appContext App context. - * @param filteringLog Filtering log. + * Should the application set a fixed lifetime from + * {@link StealthConfig.selfDestructFirstPartyCookiesTime} for first-party + * cookies. */ - constructor(appContext, filteringLog) { - this.appContext = appContext; - this.filteringLog = filteringLog; - } + selfDestructFirstPartyCookies: z.boolean(), /** - * Configuration. - * - * @returns App Stealth configuration or undefined. + * Time in minutes to delete first-party cookies. */ - get config() { - var _a; - return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth; - } + selfDestructFirstPartyCookiesTime: z.number(), /** - * Returns synthetic set of rules matching the specified request. - * - * @returns Strings of cookie rules. + * Should the application set a fixed lifetime from + * {@link StealthConfig.selfDestructThirdPartyCookiesTime} for third-party + * cookies. */ - getCookieRulesTexts() { - var _a, _b; - const result = []; - if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.selfDestructFirstPartyCookies) { - result.push(StealthService.generateCookieRuleText(this.config.selfDestructFirstPartyCookiesTime)); - } - if ((_b = this.config) === null || _b === void 0 ? void 0 : _b.selfDestructThirdPartyCookies) { - result.push(StealthService.generateCookieRuleText(this.config.selfDestructThirdPartyCookiesTime, true)); - } - return result; - } + selfDestructThirdPartyCookies: z.boolean(), /** - * Applies stealth actions to request headers. - * - * @param context Request context. - * @returns Stealth actions bitmask. + * Time in minutes to delete third-party cookies. */ - processRequestHeaders(context) { - var _a, _b, _c, _d; - let stealthActions = StealthActions.None; - const { requestUrl, requestType, requestHeaders } = context; - if (!requestHeaders) { - return stealthActions; - } - // Remove referrer for third-party requests - if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.hideReferrer) { - const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER); - if (refHeader - && refHeader.value - && isThirdPartyRequest(requestUrl, refHeader.value)) { - refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl); - stealthActions |= StealthActions.HideReferrer; - } - } - // Hide referrer in case of search engine is referrer - const isMainFrame = requestType === dist_RequestType.Document; - if (((_b = this.config) === null || _b === void 0 ? void 0 : _b.hideSearchQueries) && isMainFrame) { - const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER); - if (refHeader - && refHeader.value - && StealthService.isSearchEngine(refHeader.value) - && isThirdPartyRequest(requestUrl, refHeader.value)) { - refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl); - stealthActions |= StealthActions.HideSearchQueries; - } - } - // Remove X-Client-Data header - if ((_c = this.config) === null || _c === void 0 ? void 0 : _c.blockChromeClientData) { - if (removeHeader(requestHeaders, StealthService.HEADERS.X_CLIENT_DATA)) { - stealthActions |= StealthActions.BlockChromeClientData; - } - } - // Adding Do-Not-Track (DNT) header - if ((_d = this.config) === null || _d === void 0 ? void 0 : _d.sendDoNotTrack) { - requestHeaders.push(StealthService.HEADER_VALUES.DO_NOT_TRACK); - requestHeaders.push(StealthService.HEADER_VALUES.GLOBAL_PRIVACY_CONTROL); - stealthActions |= StealthActions.SendDoNotTrack; - } - if (stealthActions > 0) { - this.filteringLog.publishEvent({ - type: FilteringEventType.StealthAction, - data: { - tabId: context.tabId, - eventId: context.requestId, - stealthActions, - }, - }); - } - return stealthActions; - } + selfDestructThirdPartyCookiesTime: z.number(), /** - * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string. - * - * @returns Dom signal script. + * Should the application hide the origin referrer in third-party requests + * by replacing the referrer url with the request url. */ - getSetDomSignalScript() { - var _a; - if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.sendDoNotTrack) { - return `;(function ${StealthHelper.setDomSignal.toString()})();`; - } - return ''; - } + hideReferrer: z.boolean(), /** - * Generates rule removing cookies. - * - * @param maxAgeMinutes Cookie maxAge in minutes. - * @param isThirdParty Flag for generating third-party rule texts. - * @returns Rule text. + * Should the application hide the original referrer from the search page + * containing the search query in third-party queries, replacing + * the referrer url with the request url. */ - static generateCookieRuleText(maxAgeMinutes, isThirdParty = false) { - const maxAgeOption = maxAgeMinutes > 0 ? `;maxAge=${maxAgeMinutes * 60}` : ''; - const thirdPartyOption = isThirdParty ? ',third-party' : ''; - const ruleText = `$cookie=/.+/${maxAgeOption}${thirdPartyOption}`; - return ruleText; - } + hideSearchQueries: z.boolean(), /** - * Crops url path. - * - * @param url URL. - * @returns URL without path. + * For Google Chrome, it removes the 'X-Client-Data' header from + * the requests, which contains information about the browser version + * and modifications. */ - static createMockRefHeaderUrl(url) { - const host = getHost(url); - return `${(url.indexOf('https') === 0 ? 'https://' : 'http://') + host}/`; - } + blockChromeClientData: z.boolean(), /** - * Is url search engine. + * Includes HTTP headers 'DNT' and 'Sec-GPC' in all requests. * - * @param url Url for check. - * @returns True if url is search engine. + * @see https://en.wikipedia.org/wiki/Do_Not_Track + * @see https://globalprivacycontrol.org */ - static isSearchEngine(url) { - return StealthService.SEARCH_ENGINES.some((searchEngineRegex) => searchEngineRegex.test(url)); - } -} -/** - * Headers. - */ -StealthService.HEADERS = { - REFERRER: 'Referer', - X_CLIENT_DATA: 'X-Client-Data', - DO_NOT_TRACK: 'DNT', -}; -/** - * Header values. - */ -StealthService.HEADER_VALUES = { - DO_NOT_TRACK: { - name: 'DNT', - value: '1', - }, - GLOBAL_PRIVACY_CONTROL: { - name: 'Sec-GPC', - value: '1', - }, -}; -/** - * Search engines regexps. - */ -StealthService.SEARCH_ENGINES = [ - /https?:\/\/(www\.)?google\./i, - /https?:\/\/(www\.)?yandex\./i, - /https?:\/\/(www\.)?bing\./i, - /https?:\/\/(www\.)?yahoo\./i, - /https?:\/\/(www\.)?go\.mail\.ru/i, - /https?:\/\/(www\.)?ask\.com/i, - /https?:\/\/(www\.)?aol\.com/i, - /https?:\/\/(www\.)?baidu\.com/i, - /https?:\/\/(www\.)?seznam\.cz/i, -]; - + sendDoNotTrack: z.boolean(), + /** + * Blocks the possibility of leaking your IP address through WebRTC, even if + * you use a proxy server or VPN. + */ + blockWebRTC: z.boolean(), +}).strict(); /** - * Stealth api implementation. + * Settings configuration schema. */ -class StealthApi { +const settingsConfigValidator = z.object({ /** - * Stealth API constructor. - * - * @param appContextInstance App context. - * @param filteringLog Filtering log. + * If this flag is true, the application will work ONLY with domains + * from the {@link Configuration.allowlist}, + * otherwise it will work everywhere EXCLUDING domains from the list. */ - constructor(appContextInstance, filteringLog) { - this.appContext = appContextInstance; - this.filteringLog = filteringLog; - this.engine = new StealthService(this.appContext, this.filteringLog); - } + allowlistInverted: z.boolean(), /** - * Stealth configuration. - * - * @returns App Stealth configuration or undefined. + * Flag specifying {@link Configuration.allowlist} enable state. + * We don't use allowlist array length condition for calculate enable state, + * because it's not cover case with empty list in inverted mode. */ - get configuration() { - var _a; - return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth; - } + allowlistEnabled: z.boolean(), /** - * Gets app stealth mode status. - * - * @returns True if stealth mode is enabled, otherwise returns false. + * Enables css hits counter if true. */ - get isStealthModeEnabled() { - var _a; - return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealthModeEnabled); - } + collectStats: z.boolean(), /** - * Gets app filtering status. - * - * @returns True if filtering is enabled, otherwise returns false. + * Enables stealth mode if true. */ - get isFilteringEnabled() { - var _a; - return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled); - } + stealthModeEnabled: z.boolean(), /** - * Requires privacy permissions and updates browser privacy.network - * settings depending on blocking WebRTC or not. + * Enables filtering if true. */ - updateWebRtcPrivacyPermissions() { - return dist_awaiter(this, void 0, void 0, function* () { - if (!StealthApi.canBlockWebRTC()) { - return; - } - try { - const isPermissionsGranted = yield browser_polyfill_default().permissions.contains(StealthApi.PRIVACY_PERMISSIONS); - if (isPermissionsGranted) { - yield this.handleBlockWebRTC(); - } - } - catch (e) { - dist_logger.error(dist_getErrorMessage(e)); - } - }); - } + filteringEnabled: z.boolean(), /** - * Returns rule list with stealth mode rules. + * Redirect url for $document rules. + */ + documentBlockingPageUrl: z.string().optional(), + /** + * Path to the assembled @adguard/assistant module. Necessary for lazy + * on-demand loading of the assistant. + */ + assistantUrl: z.string(), + /** + * Stealth mode options. + */ + stealth: stealthConfigValidator, +}); +/** + * Generic app configuration schema. + */ +const configurationValidator = z.object({ + /** + * List of hostnames or domains of sites, which should be excluded + * from blocking or which should be included in blocking + * depending on the value of {@link SettingsConfig.allowlistInverted} setting value. + */ + allowlist: z.string().array(), + /** + * List of domain names of sites, which should be temporary excluded from document blocking. + */ + trustedDomains: z.string().array(), + /** + * List of rules added by user. + */ + userrules: z.string().array(), + /** + * Flag responsible for logging. * - * @returns String rule list or null. + * @deprecated Will be removed in the next minor version. + * Use {@link Configuration.logLevel} instead. */ - getStealthModeRuleList() { - if (!this.engine || !this.isStealthModeEnabled) { - return null; - } - const rulesTexts = this.engine.getCookieRulesTexts().join('\n'); - return new StringRuleList(StealthApi.STEALTH_MODE_FILTER_ID, rulesTexts, false, false); + verbose: z.boolean().optional(), + /** + * Logging level. + */ + logLevel: LogLevelValidator, + settings: settingsConfigValidator, +}).strict(); + +/** + * Top level app context storage. + * + * This context is needed to share data between other modules without cyclic dependencies. + * + * TODO (v.zhelvis) move app context to common and make it generic. + */ +class AppContext { + constructor() { + /** + * Is app started. + */ + this.isAppStarted = false; } +} +const appContext = new AppContext(); + +// TODO (v.zhelvis) move app context to common and make it generic. +const DEFAULT_VERBOSE_FLAG = true; +const DEFAULT_LOG_LEVEL = "error" /* LogLevelName.Error */; +/** + * Export logger implementation. + */ +class Logger { /** - * Stealth api onBeforeRequest handler. + * Gets app verbose status. * - * @param context Request context. + * TODO (v.zhelvis) remove eslint rule after passing appContext the right way. * - * @returns True if the headers have been changed. + * @returns App verbose status. */ - onBeforeSendHeaders(context) { - if (!context) { - return false; - } - if (!this.canApplyStealthActionsToContext(context)) { - return false; - } - const stealthActions = this.engine.processRequestHeaders(context); - return stealthActions !== StealthActions.None; + // eslint-disable-next-line class-methods-use-this + get verbose() { + var _a, _b; + return (_b = (_a = appContext.configuration) === null || _a === void 0 ? void 0 : _a.verbose) !== null && _b !== void 0 ? _b : DEFAULT_VERBOSE_FLAG; } /** - * Checks if stealth actions can be applied to request context. + * Gets app log level. * - * @param context Request context. - * @returns True if stealth actions can be applied to request context. + * TODO (v.zhelvis) remove eslint rule after passing appContext the right way. + * + * @returns Log level. */ - canApplyStealthActionsToContext(context) { - if (!this.isStealthModeEnabled || !this.isFilteringEnabled) { - return false; - } - const { matchingResult } = context; - if (matchingResult) { - if (matchingResult.documentRule || matchingResult.stealthRule) { - return false; - } + // eslint-disable-next-line class-methods-use-this + get logLevel() { + var _a, _b; + const logLevelString = (_b = (_a = appContext.configuration) === null || _a === void 0 ? void 0 : _a.logLevel) !== null && _b !== void 0 ? _b : DEFAULT_LOG_LEVEL; + switch (logLevelString) { + case "error" /* LogLevelName.Error */: + return 1 /* LogLevelWeight.Error */; + case "warn" /* LogLevelName.Warn */: + return 2 /* LogLevelWeight.Warn */; + case "info" /* LogLevelName.Info */: + return 3 /* LogLevelWeight.Info */; + case "debug" /* LogLevelName.Debug */: + return 4 /* LogLevelWeight.Debug */; + default: + throw new Error(`Logger only supports following levels: ${[logLevelNames.join(', ')]}`); } - return true; } /** - * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string. + * Logger constructor. * - * @returns Dom signal script. + * @param loggerImpl Logger implementation to set, defaults to global console. */ - getSetDomSignalScript() { - return this.engine.getSetDomSignalScript(); + constructor(loggerImpl = console) { + this.loggerImpl = loggerImpl; + this.error = this.error.bind(this); + this.warn = this.warn.bind(this); + this.debug = this.debug.bind(this); + this.info = this.info.bind(this); } /** - * Updates browser privacy.network settings depending on blocking WebRTC or not. + * Calls error method on logger implementation. + * + * @param message Log message. */ - handleBlockWebRTC() { - return dist_awaiter(this, void 0, void 0, function* () { - if (!this.configuration) { - return; - } - const webRTCDisabled = this.configuration.blockWebRTC - && this.isStealthModeEnabled - && this.isFilteringEnabled; - try { - if (webRTCDisabled) { - yield browser_polyfill_default().privacy.network.webRTCIPHandlingPolicy.set({ - value: 'disable_non_proxied_udp', - scope: 'regular', - }); - } - else { - yield browser_polyfill_default().privacy.network.webRTCIPHandlingPolicy.clear({ - scope: 'regular', - }); - } - } - catch (e) { - dist_logger.error(`Error updating privacy.network settings: ${dist_getErrorMessage(e)}`); - } - // privacy.network.peerConnectionEnabled is currently only supported in Firefox - if (typeof (browser_polyfill_default()).privacy.network.peerConnectionEnabled === 'object') { - try { - if (webRTCDisabled) { - yield browser_polyfill_default().privacy.network.peerConnectionEnabled.set({ - value: false, - scope: 'regular', - }); - } - else { - yield browser_polyfill_default().privacy.network.peerConnectionEnabled.clear({ - scope: 'regular', - }); - } - } - catch (e) { - dist_logger.error(`Error updating privacy.network settings: ${dist_getErrorMessage(e)}`); - } - } - }); + error(message) { + if (this.logLevel >= 1 /* LogLevelWeight.Error */) { + this.loggerImpl.error(message); + } } /** - * // TODO consider deprecating this method as edge browser is built on chromium now. - * Checks if there is browser.privacy permission is granted. + * Calls warn method on logger implementation. * - * @returns True if there is browser.privacy permission. + * @param message Log message. */ - static canBlockWebRTC() { - // Edge doesn't support privacy api - // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy - return !!(browser_polyfill_default()).privacy; + warn(message) { + if (this.verbose && this.logLevel >= 2 /* LogLevelWeight.Warn */) { + this.loggerImpl.warn(message); + } } -} -/** - * Privacy permission for block webrtc stealth setting. - */ -StealthApi.PRIVACY_PERMISSIONS = { - permissions: ['privacy'], -}; -const stealthApi = new StealthApi(appContext, defaultFilteringLog); - -const browserDetector = es5_default().getParser(window.navigator.userAgent); -const browserDetails = browserDetector.getBrowser(); -const engineDetails = browserDetector.getEngine(); -const isFirefox = browserDetails.name === 'Firefox'; -const isChrome = browserDetails.name === 'Chrome'; -const isChromium = engineDetails.name === 'Blink'; - -/** - * Simple finite state machine with synchronous transitions. - */ -class FSM { /** - * Creates a new FSM instance. + * Calls debug method on logger implementation. * - * @param transitions Declarative description of the FSM transitions. - * @param state Initial state of the FSM. + * @param message Log message. */ - constructor(transitions, state) { - this.transitions = transitions; - this.state = state; + debug(message) { + if (this.verbose && this.logLevel >= 4 /* LogLevelWeight.Debug */) { + this.loggerImpl.debug(message); + } } /** - * Dispatches an event to the FSM. - * - * If the event is valid for the current state, the FSM will transition to the next state. + * Calls info method on logger implementation. * - * @param event Event to dispatch. + * @param message Log message. */ - dispatch(event) { - // TODO: improve Transitions generic type to avoid this type assertion - const nextState = this.transitions[this.state][event]; - if (nextState) { - this.state = nextState; - } - else { - dist_logger.error(`Invalid state transition: ${String(this.state)} -> ${String(event)}`); + info(message) { + if (this.verbose && this.logLevel >= 3 /* LogLevelWeight.Info */) { + this.loggerImpl.info(message); } } } +const dist_logger = new Logger(); /** - * Declarative description of the {@link InjectionFsm} transitions. - */ -const injectionsTransitions = { - ["idle" /* InjectionState.Idle */]: { - ["start" /* InjectionEvent.Start */]: "loading" /* InjectionState.Loading */, - }, - ["loading" /* InjectionState.Loading */]: { - ["success" /* InjectionEvent.Success */]: "completed" /* InjectionState.Completed */, - ["failure" /* InjectionEvent.Failure */]: "idle" /* InjectionState.Idle */, - }, - ["completed" /* InjectionState.Completed */]: {}, -}; -/** - * Factory for creating a new {@link InjectionFsm}. - * - * @param initialState Initial state of the FSM. - * @returns New FSM instance. - */ -function createInjectionFsm(initialState = "idle" /* InjectionState.Idle */) { - return new FSM(injectionsTransitions, initialState); -} - -/** - * Document level frame id. + * Types of filtering events that can occur during request processing. */ -const MAIN_FRAME_ID = 0; +var FilteringEventType; +(function (FilteringEventType) { + FilteringEventType["SendRequest"] = "sendRequest"; + FilteringEventType["TabReload"] = "tabReload"; + FilteringEventType["ApplyBasicRule"] = "applyBasicRule"; + FilteringEventType["ApplyCosmeticRule"] = "applyCosmeticRule"; + // TODO: Doesn't look like it's being used. + FilteringEventType["ApplyCspRule"] = "applyCspRule"; + FilteringEventType["ReceiveResponse"] = "receiveResponse"; + FilteringEventType["Cookie"] = "cookie"; + FilteringEventType["RemoveHeader"] = "removeHeader"; + FilteringEventType["RemoveParam"] = "removeParam"; + FilteringEventType["ReplaceRuleApply"] = "replaceRuleApply"; + FilteringEventType["ContentFilteringStart"] = "contentFilteringStart"; + FilteringEventType["ContentFilteringFinish"] = "contentFilteringFinish"; + FilteringEventType["StealthAction"] = "stealthAction"; + FilteringEventType["JsInject"] = "jsInject"; +})(FilteringEventType || (FilteringEventType = {})); /** - * Frame context data. + * {@link FilteringLogInterface} Default implementation. */ -class Frame { +class FilteringLog { + constructor() { + this.onLogEvent = new EventChannel(); + this.channels = []; + } /** - * Creates frame instance. + * Registers listener for specified {@link FilteringLogEvent}. * - * @param url Frame url. - * @param requestId Request id. + * @param type Filtering log type. + * @param listener Filtering log listener. */ - constructor(url, requestId) { - /** - * FSM for managing the injection of the JS rules. - */ - this.jsInjectionFsm = createInjectionFsm(); - /** - * FSM for managing the injection of the Css rules. - */ - this.cssInjectionFsm = createInjectionFsm(); - this.url = url; - this.requestId = requestId; + addEventListener(type, listener) { + const channel = { type, listener }; + this.channels.push(channel); + } + /** + * Publishes event to attached listeners. + * + * @param event Filtering log event. + */ + publishEvent(event) { + const listeners = this.channels + .filter(({ type }) => type === event.type) + .map(({ listener }) => listener); + for (const listener of listeners) { + listener(event); + } + this.onLogEvent.dispatch(event); } } +/** + * Shared {@link FilteringLog} instance. + */ +const defaultFilteringLog = new FilteringLog(); /** * Tab context. @@ -72574,9 +76088,14 @@ class TabContext { /** * Context constructor. * - * @param info Tab info. + * @param info Webextension API tab data. + * @param documentApi Document API. + * @param filteringLog Filtering Log API. */ - constructor(info) { + constructor(info, documentApi, filteringLog = defaultFilteringLog) { + this.info = info; + this.documentApi = documentApi; + this.filteringLog = filteringLog; /** * Frames context. */ @@ -72593,6 +76112,10 @@ class TabContext { * We mark these tabs as synthetic because they may not actually exist. */ this.isSyntheticTab = true; + /** + * Is document page request handled by memory cache or sw. + */ + this.isDocumentRequestCached = false; this.info = info; } /** @@ -72602,8 +76125,31 @@ class TabContext { */ updateTabInfo(changeInfo) { this.info = Object.assign(this.info, changeInfo); - // If the tab was updated it means that it wasn't used to send requests in the background + // If the tab was updated it means that it wasn't used to send requests in the background. this.isSyntheticTab = false; + // Update main frame data when we navigate to another page with document request caching enabled. + if (changeInfo.url) { + // Get current main frame. + const frame = this.frames.get(MAIN_FRAME_ID); + // If main frame url is the same as request url, do nothing. + if ((frame === null || frame === void 0 ? void 0 : frame.url) === changeInfo.url) { + return; + } + // If the main frame doesn't exist or its URL is different from the request URL, + // it means that the document request hasn't been processed by the WebRequestApi yet. + // In this case, we mark the tab as using the cache and update its context using the tabsApi. + this.isDocumentRequestCached = true; + // Update main frame data. + this.handleMainFrameRequest(changeInfo.url); + } + // When the cached page is reloaded, we need to manually update + // the main frame rule for correct document-level rule processing. + if (!changeInfo.url + && changeInfo.status === 'loading' + && this.isDocumentRequestCached + && this.info.url) { + this.handleMainFrameRequest(this.info.url); + } } /** * Increments blocked requests count. @@ -72622,9 +76168,12 @@ class TabContext { * @param requestContext Request context data. */ handleFrameRequest(requestContext) { + // This method is called in the WebRequest onBeforeRequest handler. + // It means that the request is being processed. + this.isDocumentRequestCached = false; const { frameId, requestId, requestUrl, requestType, } = requestContext; if (requestType === dist_RequestType.Document) { - this.handleMainFrameRequest(requestContext); + this.handleMainFrameRequest(requestUrl, requestId); } else { this.frames.set(frameId, new Frame(requestUrl, requestId)); @@ -72657,646 +76206,1100 @@ class TabContext { } } /** - * Handles document request and stores data in main frame context. + * Handles document request and updates main frame context. + * * Also matches document level rule and store it {@link mainFrameRule}. - * This method is called before filtering processing in WebRequest onBeforeRequest handler. * * MatchingResult handles in {@link handleFrameMatchingResult}. * CosmeticResult handles in {@link handleFrameCosmeticResult}. * - * @param requestContext Request context data. + * @param requestUrl Request url. + * @param requestId Request id. */ - handleMainFrameRequest(requestContext) { - const { requestUrl, requestId, } = requestContext; - // clear frames data on tab reload + handleMainFrameRequest(requestUrl, requestId) { + // Clear frames data on tab reload. this.frames.clear(); - // set new main frame data + // Set new main frame data. this.frames.set(MAIN_FRAME_ID, new Frame(requestUrl, requestId)); - // calculate new main frame rule - this.mainFrameRule = allowlistApi.matchFrame(requestUrl); - // reset tab blocked count + // Calculate new main frame rule. + this.mainFrameRule = this.documentApi.matchFrame(requestUrl); + // Reset tab blocked count. this.blockedRequestCount = 0; + // dispatch filtering log reload event + this.filteringLog.publishEvent({ + type: FilteringEventType.TabReload, + data: { + tabId: this.info.id, + }, + }); + } + /** + * Creates context for new tab. + * + * @param tab Webextension API tab data. + * @param allowlistApi Allowlist API. + * @returns Tab context for new tab. + */ + static createNewTabContext(tab, allowlistApi) { + const tabContext = new TabContext(tab, allowlistApi); + // In some cases, tab is created while browser navigation processing. + // For example: when you navigate outside the browser or create new empty tab. + // `pendingUrl` represent url navigated to. We check it first. + // If server returns redirect, new main frame url will be processed in WebRequestApi. + const url = tab.pendingUrl || tab.url; + if (url) { + tabContext.mainFrameRule = allowlistApi.matchFrame(url); + tabContext.frames.set(MAIN_FRAME_ID, new Frame(url)); + } + return tabContext; + } + /** + * Checks if passed {@link Tabs.Tab} details represent a browser tab. + * + * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab#type + * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/TAB_ID_NONE + * + * @param tab Tab details. + * @returns True if the tab is a browser tab, otherwise returns false. + */ + static isBrowserTab(tab) { + return typeof tab.id === 'number' && tab.id !== (dist_browser_polyfill_default()).tabs.TAB_ID_NONE; + } +} + +/** + * Tabs API. Wrapper around browser.tabs API. + */ +class TabsApi { + /** + * Tabs API constructor. + * + * @param documentApi Document API. + */ + constructor(documentApi) { + this.documentApi = documentApi; + this.context = new Map(); + this.onCreate = new EventChannel(); + this.onUpdate = new EventChannel(); + this.onDelete = new EventChannel(); + this.onActivate = new EventChannel(); + this.handleTabCreate = this.handleTabCreate.bind(this); + this.handleTabUpdate = this.handleTabUpdate.bind(this); + this.handleTabActivate = this.handleTabActivate.bind(this); + this.handleTabDelete = this.handleTabDelete.bind(this); + this.handleFrameRequest = this.handleFrameRequest.bind(this); + this.handleFrameCosmeticResult = this.handleFrameCosmeticResult.bind(this); + this.handleFrameMatchingResult = this.handleFrameMatchingResult.bind(this); + this.getTabContext = this.getTabContext.bind(this); + this.getTabFrameRule = this.getTabFrameRule.bind(this); + this.getTabFrame = this.getTabFrame.bind(this); + this.getTabMainFrame = this.getTabMainFrame.bind(this); + this.onWindowFocusChanged = this.onWindowFocusChanged.bind(this); + } + /** + * Initializes tabs API and starts listening for tab & window events. + */ + start() { + return dist_awaiter(this, void 0, void 0, function* () { + dist_browser_polyfill_default().tabs.onCreated.addListener(this.handleTabCreate); + dist_browser_polyfill_default().tabs.onRemoved.addListener(this.handleTabDelete); + dist_browser_polyfill_default().tabs.onUpdated.addListener(this.handleTabUpdate); + dist_browser_polyfill_default().tabs.onActivated.addListener(this.handleTabActivate); + dist_browser_polyfill_default().windows.onFocusChanged.addListener(this.onWindowFocusChanged); + }); + } + /** + * Stops listening for tab & window events and clears tabs context. + */ + stop() { + dist_browser_polyfill_default().tabs.onCreated.removeListener(this.handleTabCreate); + dist_browser_polyfill_default().tabs.onRemoved.removeListener(this.handleTabDelete); + dist_browser_polyfill_default().tabs.onUpdated.removeListener(this.handleTabUpdate); + dist_browser_polyfill_default().tabs.onActivated.removeListener(this.handleTabActivate); + dist_browser_polyfill_default().windows.onFocusChanged.removeListener(this.onWindowFocusChanged); + this.context.clear(); + } + /** + * Retrieves frame rule for the tab context. + * + * @param tabId Tab ID. + * @returns Frame rule or null if not found. + */ + getTabFrameRule(tabId) { + const tabContext = this.context.get(tabId); + if (!tabContext) { + return null; + } + return tabContext.mainFrameRule; + } + /** + * Retrieves frame data for the frame in the tab context. + * + * @param tabId Tab ID. + * @param frameId Frame ID. + * @returns Frame data or null if not found. + */ + getTabFrame(tabId, frameId) { + const tabContext = this.context.get(tabId); + if (!tabContext) { + return null; + } + const frame = tabContext.frames.get(frameId); + if (!frame) { + return null; + } + return frame; + } + /** + * Retrieves main frame data for the tab context. + * + * @param tabId Tab ID. + * @returns Frame data or null if not found. + */ + getTabMainFrame(tabId) { + return this.getTabFrame(tabId, MAIN_FRAME_ID); + } + /** + * Records request context to the tab context. + * + * @param requestContext Tab's frame's request context. + */ + handleFrameRequest(requestContext) { + const { tabId } = requestContext; + const tabContext = this.context.get(tabId); + if (!tabContext) { + return; + } + tabContext.handleFrameRequest(requestContext); + } + /** + * Records frame cosmetic result to the tab context. + * + * @param tabId Tab id. + * @param frameId Frame id. + * @param cosmeticResult Frame {@link CosmeticResult}. + */ + handleFrameCosmeticResult(tabId, frameId, cosmeticResult) { + const tabContext = this.context.get(tabId); + if (!tabContext) { + return; + } + tabContext.handleFrameCosmeticResult(frameId, cosmeticResult); + } + /** + * Records frame matching result to the tab context. + * + * @param tabId Tab id. + * @param frameId Frame id. + * @param matchingResult Frame {@link MatchingResult}. + */ + handleFrameMatchingResult(tabId, frameId, matchingResult) { + const tabContext = this.context.get(tabId); + if (!tabContext) { + return; + } + tabContext.handleFrameMatchingResult(frameId, matchingResult); + } + /** + * Retrieves tab context by tab ID. + * + * @param tabId Tab ID. + * @returns Tab context or undefined if not found. + */ + getTabContext(tabId) { + return this.context.get(tabId); + } + /** + * Checks whether the tab with the specified ID is open in incognito mode + * or not. + * + * @param tabId Tab ID. + * @returns True if the tab is open in incognito mode, and false + * if otherwise. + */ + isIncognitoTab(tabId) { + const tabContext = this.getTabContext(tabId); + if (!tabContext) { + return false; + } + return tabContext.info.incognito; + } + /** + * Increments tab context blocked request count. + * + * @param tabId Tab ID. + */ + incrementTabBlockedRequestCount(tabId) { + const tabContext = this.context.get(tabId); + if (!tabContext) { + return; + } + tabContext.incrementBlockedRequestCount(); + } + /** + * Updates tab's main frame rule. + * + * @param tabId Tab ID. + */ + updateTabMainFrameRule(tabId) { + const tabContext = this.context.get(tabId); + if (!(tabContext === null || tabContext === void 0 ? void 0 : tabContext.info.url)) { + return; + } + tabContext.mainFrameRule = this.documentApi.matchFrame(tabContext.info.url); + } + /** + * Updates tab context data after filter engine load. + */ + updateCurrentTabsMainFrameRules() { + return dist_awaiter(this, void 0, void 0, function* () { + const currentTabs = yield dist_browser_polyfill_default().tabs.query({}); + if (!Array.isArray(currentTabs)) { + return; + } + for (const tab of currentTabs) { + if (typeof tab.id === 'number') { + this.updateTabMainFrameRule(tab.id); + } + } + }); + } + /** + * Checks if tab is a new tab. + * + * TODO: Change in AG-22715: if the lifetime of the tab is less than N + * seconds (for example 5 seconds), then it is a popup and we close it. If + * the opposite is true, then we block it with a stub. + * + * @param tabId Tab ID. + * @returns True if tab is a new tab. + */ + isNewPopupTab(tabId) { + var _a; + const tab = this.context.get(tabId); + if (!tab) { + return false; + } + const url = (_a = tab.info) === null || _a === void 0 ? void 0 : _a.url; + return url === undefined + || url === '' + || url === 'about:blank'; + } + /** + * Creates a new tab context. + * + * @param tab Tab info. + * @param tab.id Tab id. + * + * @returns Created tab context, or null if tab is not browser tab. + */ + handleTabCreate(tab) { + if (!TabContext.isBrowserTab(tab)) { + return null; + } + const tabContext = TabContext.createNewTabContext(tab, this.documentApi); + this.context.set(tab.id, tabContext); + this.onCreate.dispatch(tabContext); + return tabContext; + } + /** + * Removes tab context by tab ID. + * + * @param tabId Tab ID. + */ + handleTabDelete(tabId) { + const tabContext = this.context.get(tabId); + if (tabContext) { + this.context.delete(tabId); + this.onDelete.dispatch(tabContext); + } + } + /** + * Updates tab context data on tab update. + * + * @param tabId Tab ID. + * @param changeInfo Tab change info. + */ + handleTabUpdate(tabId, changeInfo) { + // TODO: we can ignore some events (favicon url update etc.) + const tabContext = this.context.get(tabId); + if (tabContext) { + tabContext.updateTabInfo(changeInfo); + this.onUpdate.dispatch(tabContext); + } + } + /** + * Dispatches tab on activated event. + * + * @param info Tab activated info. + * @param info.tabId Tab ID. + */ + handleTabActivate({ tabId }) { + const tabContext = this.context.get(tabId); + if (tabContext) { + this.onActivate.dispatch(tabContext); + } + } + /** + * Called when focus state of window changed. + * + * @param windowId Window ID. + */ + onWindowFocusChanged(windowId) { + return dist_awaiter(this, void 0, void 0, function* () { + // If all browser windows have lost focus. + if (windowId === (dist_browser_polyfill_default()).windows.WINDOW_ID_NONE) { + return; + } + const [activeTab] = yield dist_browser_polyfill_default().tabs.query({ + active: true, + windowId, + }); + if (!activeTab || !activeTab.id) { + return; + } + const tabContext = this.context.get(activeTab.id); + if (tabContext) { + this.onActivate.dispatch(tabContext); + } + }); + } + /** + * Injects script to the frame by tab id and frame id. + * + * @param code Script to be injected. + * @param tabId Tab ID. + * @param frameId Frame ID. + */ + static injectScript(code, tabId, frameId) { + return dist_awaiter(this, void 0, void 0, function* () { + const injectDetails = { + code, + frameId, + runAt: 'document_start', + matchAboutBlank: true, + }; + yield dist_browser_polyfill_default().tabs.executeScript(tabId, injectDetails); + }); } /** - * Creates context for new tab. + * Injects css styles to the frame by tab id and frame id. * - * @param tab Tab info. - * @returns Tab context for new tab. + * @param code CSS styles to be injected. + * @param tabId Tab ID. + * @param frameId Frame ID. */ - static createNewTabContext(tab) { - const tabContext = new TabContext(tab); - /** - * In some cases, tab is created while browser navigation processing. - * For example: when you navigate outside the browser or create new empty tab. - * `pendingUrl` represent url navigated to. - * We check it first. - * If server returns redirect, new main frame url will be processed in WebRequestApi. - */ - const url = tab.pendingUrl || tab.url; - if (url) { - tabContext.mainFrameRule = allowlistApi.matchFrame(url); - tabContext.frames.set(MAIN_FRAME_ID, new Frame(url)); + static injectCss(code, tabId, frameId) { + return dist_awaiter(this, void 0, void 0, function* () { + const injectDetails = { + code, + frameId, + runAt: 'document_start', + matchAboutBlank: true, + cssOrigin: 'user', + }; + yield dist_browser_polyfill_default().tabs.insertCSS(tabId, injectDetails); + }); + } +} + +/** + * Finds header object by header name (case-insensitive). + * + * @param headers Headers collection. + * @param headerName Header name. + * @returns Found header, or null if not found. + */ +function findHeaderByName(headers, headerName) { + for (let i = 0; i < headers.length; i += 1) { + const header = headers[i]; + if (header.name.toLowerCase() === headerName.toLowerCase()) { + return header; + } + } + return null; +} +/** + * TODO: Make function pure (don't modify headers, return new object instead) + * Removes header from headers by name. + * + * @param headers Headers collection. + * @param headerName Header name. + * @returns True if headers were removed. + */ +function removeHeader(headers, headerName) { + let removed = false; + for (let i = headers.length - 1; i >= 0; i -= 1) { + const header = headers[i]; + if (header.name.toLowerCase() === headerName.toLowerCase()) { + headers.splice(i, 1); + removed = true; } - return tabContext; } + return removed; +} + +// Disable jest coverage for this file, because it will insert +// line comments, and code to count lines covered by tests, for example: +// /* istanbul ignore next */ +// cov_uqm40oh03().f[0]++; +// cov_uqm40oh03().s[2]++; +// And we cannot test these strings correctly, because the names of these +// functions with counters are generated at runtime +/* istanbul ignore file */ +/** + * This module applies stealth actions in page context. + */ +class StealthHelper { /** - * Checks if passed {@link Tabs.Tab} details represent a browser tab. - * - * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab#type - * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/TAB_ID_NONE - * - * @param tab Tab details. - * @returns True if the tab is a browser tab, otherwise returns false. + * Sends a Global Privacy Control DOM signal. */ - static isBrowserTab(tab) { - return typeof tab.id === 'number' && tab.id !== (browser_polyfill_default()).tabs.TAB_ID_NONE; + static setDomSignal() { + try { + if ('globalPrivacyControl' in Navigator.prototype) { + return; + } + Object.defineProperty(Navigator.prototype, 'globalPrivacyControl', { + get: () => true, + configurable: true, + enumerable: true, + }); + } + catch (ex) { + // Ignore + } } } /** - * Tabs API. Wrapper around browser.tabs API. + * Stealth action bitwise masks used on the background page and on the filtering log page. */ -class TabsApi { +var StealthActions; +(function (StealthActions) { + StealthActions[StealthActions["None"] = 0] = "None"; + StealthActions[StealthActions["HideReferrer"] = 1] = "HideReferrer"; + StealthActions[StealthActions["HideSearchQueries"] = 2] = "HideSearchQueries"; + StealthActions[StealthActions["BlockChromeClientData"] = 4] = "BlockChromeClientData"; + StealthActions[StealthActions["SendDoNotTrack"] = 8] = "SendDoNotTrack"; + // TODO check where this enums are used, and add comments + StealthActions[StealthActions["FirstPartyCookies"] = 16] = "FirstPartyCookies"; + StealthActions[StealthActions["ThirdPartyCookies"] = 32] = "ThirdPartyCookies"; +})(StealthActions || (StealthActions = {})); +/** + * Stealth service module. + */ +class StealthService { /** - * Tabs API constructor. + * Configuration. + * + * @returns App Stealth configuration or undefined. */ - constructor() { - this.context = new Map(); - this.onCreate = new EventChannel(); - this.onUpdate = new EventChannel(); - this.onDelete = new EventChannel(); - this.onActivate = new EventChannel(); - this.handleTabCreate = this.handleTabCreate.bind(this); - this.handleTabUpdate = this.handleTabUpdate.bind(this); - this.handleTabActivate = this.handleTabActivate.bind(this); - this.handleTabDelete = this.handleTabDelete.bind(this); - this.handleFrameRequest = this.handleFrameRequest.bind(this); - this.handleFrameCosmeticResult = this.handleFrameCosmeticResult.bind(this); - this.handleFrameMatchingResult = this.handleFrameMatchingResult.bind(this); - this.getTabContext = this.getTabContext.bind(this); - this.getTabFrameRule = this.getTabFrameRule.bind(this); - this.getTabFrame = this.getTabFrame.bind(this); - this.getTabMainFrame = this.getTabMainFrame.bind(this); - this.onWindowFocusChanged = this.onWindowFocusChanged.bind(this); + get config() { + var _a; + return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth; } /** - * Initializes tabs API and starts listening for tab & window events. + * Constructor. + * + * @param appContext App context. + * @param filteringLog Filtering log. */ - start() { - return dist_awaiter(this, void 0, void 0, function* () { - browser_polyfill_default().tabs.onCreated.addListener(this.handleTabCreate); - browser_polyfill_default().tabs.onRemoved.addListener(this.handleTabDelete); - browser_polyfill_default().tabs.onUpdated.addListener(this.handleTabUpdate); - browser_polyfill_default().tabs.onActivated.addListener(this.handleTabActivate); - browser_polyfill_default().windows.onFocusChanged.addListener(this.onWindowFocusChanged); - }); + constructor(appContext, filteringLog) { + this.appContext = appContext; + this.filteringLog = filteringLog; } /** - * Stops listening for tab & window events and clears tabs context. + * Returns synthetic set of rules matching the specified request. + * + * @returns Strings of cookie rules. */ - stop() { - browser_polyfill_default().tabs.onCreated.removeListener(this.handleTabCreate); - browser_polyfill_default().tabs.onRemoved.removeListener(this.handleTabDelete); - browser_polyfill_default().tabs.onUpdated.removeListener(this.handleTabUpdate); - browser_polyfill_default().tabs.onActivated.removeListener(this.handleTabActivate); - browser_polyfill_default().windows.onFocusChanged.removeListener(this.onWindowFocusChanged); - this.context.clear(); + getCookieRulesTexts() { + var _a, _b; + const result = []; + if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.selfDestructFirstPartyCookies) { + result.push(StealthService.generateCookieRuleText(this.config.selfDestructFirstPartyCookiesTime)); + } + if ((_b = this.config) === null || _b === void 0 ? void 0 : _b.selfDestructThirdPartyCookies) { + result.push(StealthService.generateCookieRuleText(this.config.selfDestructThirdPartyCookiesTime, true)); + } + return result; } /** - * Retrieves frame rule for the tab context. + * Applies stealth actions to request headers. * - * @param tabId Tab ID. - * @returns Frame rule or null if not found. + * @param context Request context. + * @returns Stealth actions bitmask. */ - getTabFrameRule(tabId) { - const tabContext = this.context.get(tabId); - if (!tabContext) { - return null; + processRequestHeaders(context) { + var _a, _b, _c, _d; + let stealthActions = StealthActions.None; + const { requestUrl, requestType, requestHeaders } = context; + if (!requestHeaders) { + return stealthActions; } - return tabContext.mainFrameRule; + // Remove referrer for third-party requests + if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.hideReferrer) { + const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER); + if (refHeader + && refHeader.value + && isThirdPartyRequest(requestUrl, refHeader.value)) { + refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl); + stealthActions |= StealthActions.HideReferrer; + } + } + // Hide referrer in case of search engine is referrer + const isMainFrame = requestType === dist_RequestType.Document; + if (((_b = this.config) === null || _b === void 0 ? void 0 : _b.hideSearchQueries) && isMainFrame) { + const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER); + if (refHeader + && refHeader.value + && StealthService.isSearchEngine(refHeader.value) + && isThirdPartyRequest(requestUrl, refHeader.value)) { + refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl); + stealthActions |= StealthActions.HideSearchQueries; + } + } + // Remove X-Client-Data header + if ((_c = this.config) === null || _c === void 0 ? void 0 : _c.blockChromeClientData) { + if (removeHeader(requestHeaders, StealthService.HEADERS.X_CLIENT_DATA)) { + stealthActions |= StealthActions.BlockChromeClientData; + } + } + // Adding Do-Not-Track (DNT) header + if ((_d = this.config) === null || _d === void 0 ? void 0 : _d.sendDoNotTrack) { + requestHeaders.push(StealthService.HEADER_VALUES.DO_NOT_TRACK); + requestHeaders.push(StealthService.HEADER_VALUES.GLOBAL_PRIVACY_CONTROL); + stealthActions |= StealthActions.SendDoNotTrack; + } + if (stealthActions > 0) { + this.filteringLog.publishEvent({ + type: FilteringEventType.StealthAction, + data: { + tabId: context.tabId, + eventId: context.eventId, + stealthActions, + }, + }); + } + return stealthActions; } /** - * Sets frame data for the frame in the tab context. + * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string. * - * @param tabId Tab ID. - * @param frameId Frame ID. - * @param frameData Frame data. + * @returns Dom signal script. */ - setTabFrame(tabId, frameId, frameData) { - const tabContext = this.context.get(tabId); - if (tabContext) { - tabContext.frames.set(frameId, frameData); - this.onUpdate.dispatch(tabContext); + getSetDomSignalScript() { + var _a; + if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.sendDoNotTrack) { + return `;(function ${StealthHelper.setDomSignal.toString()})();`; } + return ''; } /** - * Retrieves frame data for the frame in the tab context. + * Generates rule removing cookies. * - * @param tabId Tab ID. - * @param frameId Frame ID. - * @returns Frame data or null if not found. + * @param maxAgeMinutes Cookie maxAge in minutes. + * @param isThirdParty Flag for generating third-party rule texts. + * @returns Rule text. */ - getTabFrame(tabId, frameId) { - const tabContext = this.context.get(tabId); - if (!tabContext) { - return null; - } - const frame = tabContext.frames.get(frameId); - if (!frame) { - return null; - } - return frame; + static generateCookieRuleText(maxAgeMinutes, isThirdParty = false) { + const maxAgeOption = maxAgeMinutes > 0 ? `;maxAge=${maxAgeMinutes * 60}` : ''; + const thirdPartyOption = isThirdParty ? ',third-party' : ''; + const ruleText = `$cookie=/.+/${maxAgeOption}${thirdPartyOption}`; + return ruleText; } /** - * Retrieves main frame data for the tab context. + * Crops url path. * - * @param tabId Tab ID. - * @returns Frame data or null if not found. + * @param url URL. + * @returns URL without path. */ - getTabMainFrame(tabId) { - return this.getTabFrame(tabId, TabsApi.MAIN_FRAME_ID); + static createMockRefHeaderUrl(url) { + const host = getHost(url); + return `${(url.indexOf('https') === 0 ? 'https://' : 'http://') + host}/`; } /** - * Records request context to the tab context. + * Is url search engine. * - * @param requestContext Tab's frame's request context. + * @param url Url for check. + * @returns True if url is search engine. */ - handleFrameRequest(requestContext) { - const { tabId } = requestContext; - const tabContext = this.context.get(tabId); - if (!tabContext) { - return; - } - tabContext.handleFrameRequest(requestContext); + static isSearchEngine(url) { + return StealthService.SEARCH_ENGINES.some((searchEngineRegex) => searchEngineRegex.test(url)); + } +} +/** + * Headers. + */ +StealthService.HEADERS = { + REFERRER: 'Referer', + X_CLIENT_DATA: 'X-Client-Data', + DO_NOT_TRACK: 'DNT', +}; +/** + * Header values. + */ +StealthService.HEADER_VALUES = { + DO_NOT_TRACK: { + name: 'DNT', + value: '1', + }, + GLOBAL_PRIVACY_CONTROL: { + name: 'Sec-GPC', + value: '1', + }, +}; +/** + * Search engines regexps. + */ +StealthService.SEARCH_ENGINES = [ + /https?:\/\/(www\.)?google\./i, + /https?:\/\/(www\.)?yandex\./i, + /https?:\/\/(www\.)?bing\./i, + /https?:\/\/(www\.)?yahoo\./i, + /https?:\/\/(www\.)?go\.mail\.ru/i, + /https?:\/\/(www\.)?ask\.com/i, + /https?:\/\/(www\.)?aol\.com/i, + /https?:\/\/(www\.)?baidu\.com/i, + /https?:\/\/(www\.)?seznam\.cz/i, +]; + +/** + * @file + * This file contains constants for communication between background and content scripts. + * This constants are separated from message.ts to reduce bundle size, + * because rollup cannot tree-shake tswebextension library code. + */ +/** + * Name of the message handler. + * It is needed for determining specific tswebextension message from other messages. + */ +const MESSAGE_HANDLER_NAME = 'tsWebExtension'; +/** + * Message types for communication between background and content scripts. + */ +var MessageType; +(function (MessageType) { + MessageType["ProcessShouldCollapse"] = "processShouldCollapse"; + MessageType["GetCosmeticData"] = "getCosmeticData"; + MessageType["GetCss"] = "getCss"; + MessageType["GetCookieRules"] = "getCookieRules"; + MessageType["SaveCookieLogEvent"] = "saveCookieLogEvent"; + MessageType["InitAssistant"] = "initAssistant"; + MessageType["CloseAssistant"] = "closeAssistant"; + MessageType["AssistantCreateRule"] = "assistantCreateRule"; + MessageType["SaveCssHitsStats"] = "saveCssHitsStats"; +})(MessageType || (MessageType = {})); + +/** + * @file + * This file contains validation schemas and inferred types for message data. + */ +/** + * Message DTO validation schema. + */ +const messageValidator = z.object({ + handlerName: z.literal(MESSAGE_HANDLER_NAME), + type: z.nativeEnum(MessageType), + payload: z.unknown(), +}).strict(); +/** + * {@link MessageType.ProcessShouldCollapse} Message payload validation schema. + */ +const processShouldCollapsePayloadValidator = z.object({ + elementUrl: z.string(), + documentUrl: z.string(), + requestType: z.nativeEnum(RequestType), +}).strict(); +/** + * {@link MessageType.GetCosmeticData} Message payload validation schema. + */ +const getExtendedCssPayloadValidator = z.object({ + documentUrl: z.string(), +}).strict(); +/** + * {@link MessageType.GetCss} Message payload validation schema. + */ +const getCssPayloadValidator = z.object({ + url: z.string(), + referrer: z.string(), +}).strict(); +/** + * {@link MessageType.GetCookieRules} Message payload validation schema. + */ +const getCookieRulesPayloadValidator = z.object({ + documentUrl: z.string(), +}).strict(); +/** + * {@link MessageType.SaveCookieLogEvent} Message payload validation schema. + */ +const getSaveCookieLogEventPayloadValidator = z.object({ + cookieName: z.string(), + cookieDomain: z.string(), + cookieValue: z.string(), + ruleText: z.string(), + filterId: z.number(), + thirdParty: z.boolean(), +}).strict(); +/** + * {@link MessageType.InitAssistant} Message payload validation schema. + */ +const getAssistantCreateRulePayloadValidator = z.object({ + ruleText: z.string(), +}).strict(); + +// TODO check if we can return typed message here +/** + * Sends message to the background page. + * + * @param message Message to send. + * @param message.payload Payload of the message. + * @param message.type Message type. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const sendAppMessage = (message) => dist_awaiter(void 0, void 0, void 0, function* () { + return browser.runtime.sendMessage(Object.assign({ handlerName: MESSAGE_HANDLER_NAME }, message)); +}); + +/** + * Request content type. + * + * NOTE: Do not use `const enum`, + * because this enum is imported in extension frontend writing in js. + */ +var ContentType; +(function (ContentType) { + ContentType["Document"] = "document"; + ContentType["Subdocument"] = "subdocument"; + ContentType["Script"] = "script"; + ContentType["Stylesheet"] = "stylesheet"; + ContentType["Object"] = "object"; + ContentType["Image"] = "image"; + ContentType["XmlHttpRequest"] = "xmlHttpRequest"; + ContentType["Media"] = "media"; + ContentType["Font"] = "font"; + ContentType["Websocket"] = "websocket"; + ContentType["WebRtc"] = "webRtc"; + ContentType["Other"] = "other"; + ContentType["Csp"] = "csp"; + ContentType["Cookie"] = "cookie"; + ContentType["Ping"] = "ping"; + ContentType["CspReport"] = "cspReport"; +})(ContentType || (ContentType = {})); +/** + * Returns request type and content type by resource type. + * + * @param resourceType Resource type. + * @returns Request type and content type. + */ +function getRequestType(resourceType) { + switch (resourceType) { + case 'main_frame': + return { + contentType: ContentType.Document, + requestType: dist_RequestType.Document, + }; + case 'sub_frame': + return { + contentType: ContentType.Subdocument, + requestType: dist_RequestType.SubDocument, + }; + case 'stylesheet': + return { + contentType: ContentType.Stylesheet, + requestType: dist_RequestType.Stylesheet, + }; + case 'script': + return { + contentType: ContentType.Script, + requestType: dist_RequestType.Script, + }; + case 'image': + case 'imageset': + return { + contentType: ContentType.Image, + requestType: dist_RequestType.Image, + }; + case 'object': + return { + contentType: ContentType.Object, + requestType: dist_RequestType.Object, + }; + case 'xmlhttprequest': + return { + contentType: ContentType.XmlHttpRequest, + requestType: dist_RequestType.XmlHttpRequest, + }; + case 'ping': + case 'beacon': + return { + contentType: ContentType.Ping, + requestType: dist_RequestType.Ping, + }; + case 'font': + return { + contentType: ContentType.Font, + requestType: dist_RequestType.Font, + }; + case 'media': + return { + contentType: ContentType.Media, + requestType: dist_RequestType.Media, + }; + case 'websocket': + return { + contentType: ContentType.Websocket, + requestType: dist_RequestType.WebSocket, + }; + case 'csp_report': + return { + contentType: ContentType.CspReport, + requestType: dist_RequestType.Other, + }; + default: + return { + contentType: ContentType.Other, + requestType: dist_RequestType.Other, + }; + } +} + +/** + * Checks if error has message. + * + * @param error Error object. + * @returns If param is error. + */ +function dist_isErrorWithMessage(error) { + return (typeof error === 'object' + && error !== null + && 'message' in error + && typeof error.message === 'string'); +} +/** + * Converts error to the error with message. + * + * @param maybeError Possible error. + * @returns Error with message. + */ +function dist_toErrorWithMessage(maybeError) { + if (dist_isErrorWithMessage(maybeError)) { + return maybeError; } - /** - * Records frame cosmetic result to the tab context. - * - * @param tabId Tab id. - * @param frameId Frame id. - * @param cosmeticResult Frame {@link CosmeticResult}. - */ - handleFrameCosmeticResult(tabId, frameId, cosmeticResult) { - const tabContext = this.context.get(tabId); - if (!tabContext || !cosmeticResult) { - return; - } - tabContext.handleFrameCosmeticResult(frameId, cosmeticResult); + try { + return new Error(JSON.stringify(maybeError)); } - /** - * Records frame matching result to the tab context. - * - * @param tabId Tab id. - * @param frameId Frame id. - * @param matchingResult Frame {@link MatchingResult}. - */ - handleFrameMatchingResult(tabId, frameId, matchingResult) { - const tabContext = this.context.get(tabId); - if (!tabContext || !matchingResult) { - return; - } - tabContext.handleFrameMatchingResult(frameId, matchingResult); + catch (_a) { + // fallback in case there's an error stringifying the maybeError + // like with circular references for example. + return new Error(String(maybeError)); } +} +/** + * Converts error object to error with message. This method might be helpful to handle thrown errors. + * + * @param error Error object. + * + * @returns Message of the error. + */ +function dist_getErrorMessage(error) { + return dist_toErrorWithMessage(error).message; +} + +/** + * Stealth api implementation. + */ +class StealthApi { /** - * Retrieves tab context by tab ID. + * Stealth configuration. * - * @param tabId Tab ID. - * @returns Tab context or undefined if not found. + * @returns App Stealth configuration or undefined. */ - getTabContext(tabId) { - return this.context.get(tabId); + get configuration() { + var _a; + return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth; } /** - * Checks whether the tab with the specified ID is open in incognito mode - * or not. + * Gets app stealth mode status. * - * @param tabId Tab ID. - * @returns True if the tab is open in incognito mode, and false - * if otherwise. + * @returns True if stealth mode is enabled, otherwise returns false. */ - isIncognitoTab(tabId) { - const tabContext = this.getTabContext(tabId); - if (!tabContext) { - return false; - } - return tabContext.info.incognito; + get isStealthModeEnabled() { + var _a; + return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealthModeEnabled); } /** - * Increments tab context blocked request count. + * Gets app filtering status. * - * @param tabId Tab ID. + * @returns True if filtering is enabled, otherwise returns false. */ - incrementTabBlockedRequestCount(tabId) { - const tabContext = this.context.get(tabId); - if (!tabContext) { - return; - } - tabContext.incrementBlockedRequestCount(); + get isFilteringEnabled() { + var _a; + return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled); } /** - * Updates tab's main frame rule. + * Stealth API constructor. * - * @param tabId Tab ID. + * @param appContextInstance App context. + * @param filteringLog Filtering log. */ - updateTabMainFrameRule(tabId) { - const tabContext = this.context.get(tabId); - if (!(tabContext === null || tabContext === void 0 ? void 0 : tabContext.info.url)) { - return; - } - tabContext.mainFrameRule = allowlistApi.matchFrame(tabContext.info.url); + constructor(appContextInstance, filteringLog) { + this.appContext = appContextInstance; + this.filteringLog = filteringLog; + this.engine = new StealthService(this.appContext, this.filteringLog); } /** - * Updates tab context data on extension initialization. + * Requires privacy permissions and updates browser privacy.network + * settings depending on blocking WebRTC or not. */ - updateCurrentTabsMainFrameRules() { + updateWebRtcPrivacyPermissions() { return dist_awaiter(this, void 0, void 0, function* () { - const currentTabs = yield browser_polyfill_default().tabs.query({}); - if (!Array.isArray(currentTabs)) { + if (!StealthApi.canBlockWebRTC()) { return; } - for (const tab of currentTabs) { - if (tab.id) { - this.updateTabMainFrameRule(tab.id); + try { + const isPermissionsGranted = yield dist_browser_polyfill_default().permissions.contains(StealthApi.PRIVACY_PERMISSIONS); + if (isPermissionsGranted) { + yield this.handleBlockWebRTC(); } } + catch (e) { + dist_logger.error(dist_getErrorMessage(e)); + } }); } /** - * Checks if tab is a new tab. + * Returns rule list with stealth mode rules. * - * @param tabId Tab ID. - * @returns True if tab is a new tab. + * @returns String rule list or null. */ - isNewPopupTab(tabId) { - var _a; - const tab = this.context.get(tabId); - if (!tab) { - return false; + getStealthModeRuleList() { + if (!this.engine || !this.isStealthModeEnabled) { + return null; } - const url = (_a = tab.info) === null || _a === void 0 ? void 0 : _a.url; - return url === undefined - || url === '' - || url === 'about:blank'; + const rulesTexts = this.engine.getCookieRulesTexts().join('\n'); + return new StringRuleList(StealthApi.STEALTH_MODE_FILTER_ID, rulesTexts, false, false); } /** - * Creates a new tab context. + * Stealth api onBeforeRequest handler. * - * @param tab Tab info. - * @param tab.id Tab id. + * @param context Request context. * - * @returns Created tab context, or null if tab is not browser tab. + * @returns True if the headers have been changed. */ - handleTabCreate(tab) { - if (!TabContext.isBrowserTab(tab)) { - return null; + onBeforeSendHeaders(context) { + if (!context) { + return false; } - const tabContext = TabContext.createNewTabContext(tab); - this.context.set(tab.id, tabContext); - this.onCreate.dispatch(tabContext); - return tabContext; - } - /** - * Removes tab context by tab ID. - * - * @param tabId Tab ID. - */ - handleTabDelete(tabId) { - const tabContext = this.context.get(tabId); - if (tabContext) { - this.context.delete(tabId); - this.onDelete.dispatch(tabContext); + if (!this.canApplyStealthActionsToContext(context)) { + return false; } + const stealthActions = this.engine.processRequestHeaders(context); + return stealthActions !== StealthActions.None; } /** - * Updates tab context data on tab update. + * Checks if stealth actions can be applied to request context. * - * @param tabId Tab ID. - * @param changeInfo Tab change info. + * @param context Request context. + * @returns True if stealth actions can be applied to request context. */ - handleTabUpdate(tabId, changeInfo) { - // TODO: we can ignore some events (favicon url update etc.) - const tabContext = this.context.get(tabId); - if (tabContext) { - tabContext.updateTabInfo(changeInfo); - this.onUpdate.dispatch(tabContext); + canApplyStealthActionsToContext(context) { + if (!this.isStealthModeEnabled || !this.isFilteringEnabled) { + return false; } + const { matchingResult } = context; + if (matchingResult) { + if (matchingResult.documentRule || matchingResult.stealthRule) { + return false; + } + } + return true; } /** - * Dispatches tab on activated event. + * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string. * - * @param info Tab activated info. - * @param info.tabId Tab ID. + * @returns Dom signal script. */ - handleTabActivate({ tabId }) { - const tabContext = this.context.get(tabId); - if (tabContext) { - this.onActivate.dispatch(tabContext); - } + getSetDomSignalScript() { + return this.engine.getSetDomSignalScript(); } /** - * Called when focus state of window changed. - * - * @param windowId Window ID. + * Updates browser privacy.network settings depending on blocking WebRTC or not. */ - onWindowFocusChanged(windowId) { + handleBlockWebRTC() { return dist_awaiter(this, void 0, void 0, function* () { - // If all browser windows have lost focus. - if (windowId === (browser_polyfill_default()).windows.WINDOW_ID_NONE) { + if (!this.configuration) { return; } - const [activeTab] = yield browser_polyfill_default().tabs.query({ - active: true, - windowId, - }); - if (!activeTab || !activeTab.id) { - return; + const webRTCDisabled = this.configuration.blockWebRTC + && this.isStealthModeEnabled + && this.isFilteringEnabled; + try { + if (webRTCDisabled) { + yield dist_browser_polyfill_default().privacy.network.webRTCIPHandlingPolicy.set({ + value: 'disable_non_proxied_udp', + scope: 'regular', + }); + } + else { + yield dist_browser_polyfill_default().privacy.network.webRTCIPHandlingPolicy.clear({ + scope: 'regular', + }); + } } - const tabContext = this.context.get(activeTab.id); - if (tabContext) { - this.onActivate.dispatch(tabContext); + catch (e) { + dist_logger.error(`Error updating privacy.network settings: ${dist_getErrorMessage(e)}`); + } + // privacy.network.peerConnectionEnabled is currently only supported in Firefox + if (typeof (dist_browser_polyfill_default()).privacy.network.peerConnectionEnabled === 'object') { + try { + if (webRTCDisabled) { + yield dist_browser_polyfill_default().privacy.network.peerConnectionEnabled.set({ + value: false, + scope: 'regular', + }); + } + else { + yield dist_browser_polyfill_default().privacy.network.peerConnectionEnabled.clear({ + scope: 'regular', + }); + } + } + catch (e) { + dist_logger.error(`Error updating privacy.network settings: ${dist_getErrorMessage(e)}`); + } } }); } /** - * Injects script to the frame by tab id and frame id. - * - * @param code Script to be injected. - * @param tabId Tab ID. - * @param frameId Frame ID. - */ - static injectScript(code, tabId, frameId) { - return dist_awaiter(this, void 0, void 0, function* () { - const injectDetails = { - code, - frameId, - runAt: 'document_start', - matchAboutBlank: true, - }; - yield browser_polyfill_default().tabs.executeScript(tabId, injectDetails); - }); - } - /** - * Injects css styles to the frame by tab id and frame id. + * // TODO consider deprecating this method as edge browser is built on chromium now. + * Checks if there is browser.privacy permission is granted. * - * @param code CSS styles to be injected. - * @param tabId Tab ID. - * @param frameId Frame ID. + * @returns True if there is browser.privacy permission. */ - static injectCss(code, tabId, frameId) { - return dist_awaiter(this, void 0, void 0, function* () { - const injectDetails = { - code, - frameId, - runAt: 'document_start', - matchAboutBlank: true, - cssOrigin: 'user', - }; - yield browser_polyfill_default().tabs.insertCSS(tabId, injectDetails); - }); + static canBlockWebRTC() { + // Edge doesn't support privacy api + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy + return !!(dist_browser_polyfill_default()).privacy; } } -TabsApi.MAIN_FRAME_ID = 0; -const tabsApi = new TabsApi(); - /** - * This service encapsulate processing of $document modifier rules. - * - * Service is initialized in {@link configure} method, called from {@link EngineApi#startEngine}. - * - * Request rule is processed in {@link getDocumentBlockingResponse} method, called - * from {@link RequestBlockingApi.getBlockingResponse}. - * - * Request rule is processed following scenario: - * - if domain is trusted, ignore request - * - if rule is document blocking and {@link documentBlockingPageUrl} is undefined, return - * {@link WebRequestApi.onBeforeRequest} blocking response - * - if rule is document blocking and {@link documentBlockingPageUrl} is defined, return redirect response with - * required params. - * - if browser is Firefox, update page url by {@link browser.tabs} API, because FF doesn't support redirects to - * extension pages. + * Privacy permission for block webrtc stealth setting. */ -class DocumentBlockingService { - constructor() { - // list of domain names of sites, which should be excluded from document blocking - this.trustedDomains = []; - } - /** - * Configures service instance {@link documentBlockingPageUrl}. - * - * @param configuration App {@link Configuration}. - */ - configure(configuration) { - const { settings, trustedDomains } = configuration; - this.documentBlockingPageUrl = settings === null || settings === void 0 ? void 0 : settings.documentBlockingPageUrl; - this.trustedDomains = trustedDomains; - } - /** - * Processes $document modifier rule matched request in {@link RequestBlockingApi.getBlockingResponse}. - * - * @param requestId Request id. - * @param requestUrl Url of processed request. - * @param rule {@link NetworkRule} Instance of matched rule. - * @param tabId TabId of processed request. - * @returns Blocking response or null {@link WebRequestApi.onBeforeRequest}. - */ - getDocumentBlockingResponse(requestId, requestUrl, rule, tabId) { - // if request url domain is trusted, ignore document blocking rule - if (this.isTrustedDomain(requestUrl)) { - return undefined; - } - // public filtering log event - defaultFilteringLog.publishEvent({ - type: FilteringEventType.ApplyBasicRule, - data: { - eventId: requestId, - tabId, - rule, - }, - }); - // if documentBlockingPage is undefined, block request - if (!this.documentBlockingPageUrl) { - return { cancel: true }; - } - // get document blocking url with required params - const blockingUrl = DocumentBlockingService.createBlockingUrl(this.documentBlockingPageUrl, requestUrl, rule.getText()); - // Firefox doesn't allow redirects to extension pages - // We set blocking page url via browser.tabs api for bypassing this limitation - if (isFirefox) { - DocumentBlockingService.reloadTabWithBlockingPage(tabId, blockingUrl); - // Chrome doesn't allow to show extension pages in incognito mode - } - else if (isChromium && tabsApi.isIncognitoTab(tabId)) { - // Closing tab before opening a new one may lead to browser crash (Chromium) - browser_polyfill_default().tabs.create({ url: blockingUrl }) - .then(() => { - browser_polyfill_default().tabs.remove(tabId); - }) - .catch((e) => { - dist_logger.warn(`Can't open info page about blocked domain. Err: ${e}`); - }); - } - return { redirectUrl: blockingUrl }; - } - /** - * Checks if request url domain is trusted. - * - * @param url Request url. - * @returns True, if request url domain is trusted, else false. - */ - isTrustedDomain(url) { - const domain = es6_getDomain(url); - if (domain) { - return this.trustedDomains.includes(domain); - } - return false; - } - /** - * Updates tab with document blocking page url. - * - * @param tabId Tab id. - * @param url Blocking page url. - */ - static reloadTabWithBlockingPage(tabId, url) { - const tabContext = tabsApi.getTabContext(tabId); - if (!tabContext) { - return; - } - browser_polyfill_default().tabs.update(tabId, { url }); - } - /** - * Sets required url and rule query params to document-blocking page url. - * - * @param documentBlockingPageUrl Url of document-blocking page. - * @param requestUrl Processed request url. - * @param ruleText Matched rule text. - * @returns Document blocking page url with required params. - */ - static createBlockingUrl(documentBlockingPageUrl, requestUrl, ruleText) { - const url = new URL(documentBlockingPageUrl); - url.searchParams.set('url', requestUrl); - url.searchParams.set('rule', ruleText); - return url.toString(); - } -} -const documentBlockingService = new DocumentBlockingService(); - -const USER_FILTER_ID = 0; +StealthApi.PRIVACY_PERMISSIONS = { + permissions: ['privacy'], +}; +const stealthApi = new StealthApi(appContext, defaultFilteringLog); -const ASYNC_LOAD_CHINK_SIZE = 5000; /** - * TSUrlFilter Engine wrapper. + * @file Temporary entry point for global background submodule instances. + * Needed for backward compatibility during internal API updates. + * Will be removed in the future. */ -class EngineApi { - /** - * Gets app filtering status. - * - * @returns True if filtering is enabled, otherwise returns false. - */ - get isFilteringEnabled() { - var _a; - return Boolean((_a = appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled); - } - /** - * Starts engine. - * - * @param configuration Engine configuration. - */ - startEngine(configuration) { - return dist_awaiter(this, void 0, void 0, function* () { - const { filters, userrules, verbose, } = configuration; - allowlistApi.configure(configuration); - documentBlockingService.configure(configuration); - const lists = []; - for (let i = 0; i < filters.length; i += 1) { - const { filterId, content, trusted } = filters[i]; - const convertedContent = RuleConverter.convertRules(content); - lists.push(new StringRuleList(filterId, convertedContent, false, !trusted, !trusted)); - } - if (userrules.length > 0) { - const convertedUserRules = RuleConverter.convertRules(userrules.join('\n')); - lists.push(new StringRuleList(USER_FILTER_ID, convertedUserRules)); - } - const allowlistRules = allowlistApi.getAllowlistRules(); - if (allowlistRules) { - lists.push(allowlistRules); - } - const stealthModeList = stealthApi.getStealthModeRuleList(); - if (stealthModeList) { - lists.push(stealthModeList); - } - const ruleStorage = new RuleStorage(lists); - setConfiguration({ - engine: 'extension', - version: browser_polyfill_default().runtime.getManifest().version, - verbose, - compatibility: CompatibilityTypes.Extension, - }); - /* - * UI thread becomes blocked on the options page while request filter is created - * that's why we create filter rules using chunks of the specified length - * Request filter creation is rather slow operation so we should - * use setTimeout calls to give UI thread some time. - */ - const engine = new Engine(ruleStorage, true); - yield engine.loadRulesAsync(ASYNC_LOAD_CHINK_SIZE); - this.engine = engine; - }); - } - /** - * Searched for rules by match query. - * - * @param matchQuery Query against which the request would be matched. - * @returns Matching result or null. - */ - matchRequest(matchQuery) { - if (!this.engine || !this.isFilteringEnabled) { - return null; - } - const { requestUrl, frameUrl, requestType, } = matchQuery; - let { frameRule } = matchQuery; - const request = new Request$1(requestUrl, frameUrl, requestType); - if (!frameRule) { - frameRule = null; - } - return this.engine.matchRequest(request, frameRule); - } - /** - * Matches current frame url and returns rule if found. - * - * @param frameUrl Frame url. - * @returns NetworkRule or null. - */ - matchFrame(frameUrl) { - if (!this.engine || !this.isFilteringEnabled) { - return null; - } - return this.engine.matchFrame(frameUrl); - } - /** - * Gets cosmetic result for the specified hostname and cosmetic options. - * - * @param url Request url. - * @param option Cosmetic options. - * @returns Cosmetic result. - */ - getCosmeticResult(url, option) { - if (!this.engine || !this.isFilteringEnabled) { - return new CosmeticResult(); - } - const frameUrl = getHost(url); - const request = new Request$1(url, frameUrl, RequestType.Document); - return this.engine.getCosmeticResult(request, option); - } - /** - * Simple getter for rules count. - * - * @returns Number of rules in the engine. - */ - getRulesCount() { - return this.engine ? this.engine.getRulesCount() : 0; - } -} -const engineApi = new EngineApi(); +const allowlist = new Allowlist(); +const engineApi = new EngineApi(allowlist, appContext, stealthApi); +const documentApi = new DocumentApi(allowlist, engineApi); +const tabsApi = new TabsApi(documentApi); /** * Taken from: @@ -73532,23 +77535,8 @@ class CosmeticApi { if (rules.length === 0) { return undefined; } - const scriptText = rules - .filter((rule) => { - // Scriptlets should not be excluded for remote filters - if (rule.isScriptlet) { - return true; - } - // User rules should not be excluded from remote filters - const filterId = rule.getFilterListId(); - if (filterId === USER_FILTER_ID) { - return true; - } - /** - * @see {@link LocalScriptRulesService} for details about script source - */ - const text = rule.getText(); - return localScriptRulesService.isLocal(text); - }) + const permittedRules = CosmeticApi.sanitizeScriptRules(rules); + const scriptText = permittedRules .map((rule) => rule.getScript()) .join('\n'); if (!scriptText) { @@ -73571,10 +77559,26 @@ class CosmeticApi { areHitsStatsCollected, extCssRules: null, }; - const frame = tabsApi.getTabFrame(tabId, frameId); - if (!(frame === null || frame === void 0 ? void 0 : frame.cosmeticResult)) { + const tabContext = tabsApi.getTabContext(tabId); + if (!tabContext) { + return data; + } + const frame = tabContext.frames.get(frameId); + if (!frame) { return data; } + /** + * Cosmetic result may not be committed to frame context during worker request processing. + * We use engine request as a fallback for this case. + */ + if (!(frame === null || frame === void 0 ? void 0 : frame.cosmeticResult)) { + frame.cosmeticResult = engineApi.matchCosmetic({ + requestUrl: frame.url, + frameUrl: frame.url, + requestType: frameId === MAIN_FRAME_ID ? dist_RequestType.Document : dist_RequestType.SubDocument, + frameRule: tabContext.mainFrameRule, + }); + } data.extCssRules = CosmeticApi.getExtCssRules(frame.cosmeticResult, areHitsStatsCollected); return data; } @@ -73597,11 +77601,11 @@ class CosmeticApi { /** * Applies js rules to specific frame. * - * @param params Data for js rule injecting and logging. + * @param params Data for js rule injecting. */ static applyJsRules(params) { return dist_awaiter(this, void 0, void 0, function* () { - const { tabId, frameId, cosmeticResult, url, contentType, timestamp, } = params; + const { tabId, frameId, cosmeticResult, } = params; const scriptRules = cosmeticResult.getScriptRules(); let scriptText = CosmeticApi.getScriptText(scriptRules); scriptText += stealthApi.getSetDomSignalScript(); @@ -73614,55 +77618,65 @@ class CosmeticApi { * @see {@link LocalScriptRulesService} for details about script source */ yield CosmeticApi.injectScript(scriptText, tabId, frameId); - for (const scriptRule of scriptRules) { - if (!scriptRule.isGeneric()) { - defaultFilteringLog.publishEvent({ - type: FilteringEventType.JsInject, - data: { - script: true, - tabId, - // for proper filtering log request info rule displaying - // event id should be unique for each event, not copied from request - // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2341 - eventId: nanoid(), - requestUrl: url, - frameUrl: url, - frameDomain: dist_getDomain(url), - requestType: contentType, - timestamp, - rule: scriptRule, - }, - }); - } - } } }); } + /** + * Logs js rules to specific frame. + * + * We need a separate function for logging because script rules can be logged before injection + * to avoid duplicate logs while the js rule is being applied. + * + * See {@link WebRequestApi.onBeforeRequest} for details. + * + * @param params Data for js rule logging. + */ + static logScriptRules(params) { + const { tabId, cosmeticResult, url, contentType, timestamp, } = params; + const scriptRules = cosmeticResult.getScriptRules(); + const permittedScriptRules = CosmeticApi.sanitizeScriptRules(scriptRules); + for (const scriptRule of permittedScriptRules) { + if (!scriptRule.isGeneric()) { + defaultFilteringLog.publishEvent({ + type: FilteringEventType.JsInject, + data: { + script: true, + tabId, + // for proper filtering log request info rule displaying + // event id should be unique for each event, not copied from request + // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2341 + eventId: nanoid(), + requestUrl: url, + frameUrl: url, + frameDomain: dist_getDomain(url), + requestType: contentType, + timestamp, + rule: scriptRule, + }, + }); + } + } + } /** * Apply js to specified frame based on provided data and injection FSM state. * * @param params The data required for the injection. - * @param fsm Injection finite state machine. * @param tries The number of tries for the operation in case of failure. */ - static applyFrameJsRules(params, fsm, tries = 0) { - if (fsm.state !== "idle" /* InjectionState.Idle */) { - return; - } - fsm.dispatch("start" /* InjectionEvent.Start */); - CosmeticApi - .applyJsRules(params) - .then(() => { - fsm.dispatch("success" /* InjectionEvent.Success */); - }).catch((e) => { - fsm.dispatch("failure" /* InjectionEvent.Failure */); - if (tries < CosmeticApi.INJECTION_MAX_TRIES) { - setTimeout(() => { - CosmeticApi.applyFrameJsRules(params, fsm, tries + 1); - }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS); + static applyFrameJsRules(params, tries = 0) { + return dist_awaiter(this, void 0, void 0, function* () { + try { + yield CosmeticApi.applyJsRules(params); } - else { - dist_logger.debug(dist_getErrorMessage(e)); + catch (e) { + if (tries < CosmeticApi.INJECTION_MAX_TRIES) { + setTimeout(() => { + CosmeticApi.applyFrameJsRules(params, tries + 1); + }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS); + } + else { + dist_logger.debug(dist_getErrorMessage(e)); + } } }); } @@ -73670,30 +77684,49 @@ class CosmeticApi { * Injects css to specified frame based on provided data and injection FSM state. * * @param params Data required for the injection. - * @param fsm Injection finite state machine. * @param tries Number of tries for the operation in case of failure. */ - static applyFrameCssRules(params, fsm, tries = 0) { - if (fsm.state !== "idle" /* InjectionState.Idle */) { - return; - } - fsm.dispatch("start" /* InjectionEvent.Start */); - CosmeticApi - .applyCssRules(params) - .then(() => { - fsm.dispatch("success" /* InjectionEvent.Success */); - }).catch((e) => { - fsm.dispatch("failure" /* InjectionEvent.Failure */); - if (tries < CosmeticApi.INJECTION_MAX_TRIES) { - setTimeout(() => { - CosmeticApi.applyFrameCssRules(params, fsm, tries + 1); - }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS); + static applyFrameCssRules(params, tries = 0) { + return dist_awaiter(this, void 0, void 0, function* () { + try { + yield CosmeticApi.applyCssRules(params); } - else { - dist_logger.debug(dist_getErrorMessage(e)); + catch (e) { + if (tries < CosmeticApi.INJECTION_MAX_TRIES) { + setTimeout(() => { + CosmeticApi.applyFrameCssRules(params, tries + 1); + }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS); + } + else { + dist_logger.debug(dist_getErrorMessage(e)); + } } }); } + /** + * Filters insecure scripts from remote sources. + * + * @param rules Cosmetic rules. + * @returns Permitted script rules. + */ + static sanitizeScriptRules(rules) { + return rules.filter((rule) => { + // Scriptlets should not be excluded for remote filters + if (rule.isScriptlet) { + return true; + } + // User rules should not be excluded + const filterId = rule.getFilterListId(); + if (filterId === USER_FILTER_ID) { + return true; + } + /** + * @see {@link LocalScriptRulesService} for details about script source + */ + const text = rule.getText(); + return localScriptRulesService.isLocal(text); + }); + } /** * Builds element hiding stylesheet from rules. * If `groupElemhideSelectors` is set, @@ -73849,35 +77882,18 @@ CosmeticApi.INJECTION_MAX_TRIES = 100; /** * Implementation of the request context storage. */ -class RequestContextStorage { - constructor() { - this.contextStorage = new Map(); - this.onRecord = new EventChannel(); - this.onUpdate = new EventChannel(); - } +class RequestContextStorage extends Map { /** - * Get request by requestId. + * Create new request context. * * @param requestId Request id. - * @returns Request context. + * @param data Request context with a omitted eventId field. It is automatically generated. + * @returns Request context storage instance. */ - get(requestId) { - return this.contextStorage.get(requestId); - } - /** - * Record request context. And dispatch event. - * - * @param requestId Request id. - * @param data Request context. - * @returns Request context. - */ - record(requestId, data) { - this.contextStorage.set(requestId, data); - this.onRecord.dispatch({ - id: requestId, - data, - }); - return data; + create(requestId, data) { + const requestContext = Object.assign({ eventId: nanoid() }, data); + super.set(requestId, requestContext); + return requestContext; } /** * Update request context fields. Can be done partially. @@ -73887,63 +77903,71 @@ class RequestContextStorage { * @returns Updated request context. */ update(requestId, data) { - const requestContext = this.contextStorage.get(requestId); + const requestContext = super.get(requestId); if (requestContext) { - const newData = Object.assign(requestContext, data); - this.contextStorage.set(requestId, newData); - this.onUpdate.dispatch({ - id: requestId, - data: newData, - }); - return newData; - } - this.contextStorage.set(requestId, data); - this.onUpdate.dispatch({ - id: requestId, - data: data, - }); - return undefined; - } - /** - * Removes request context from storage. - * - * @param requestId Request id. - */ - delete(requestId) { - if (this.contextStorage.has(requestId)) { - this.contextStorage.delete(requestId); - } - } - /** - * Search for the request context by url and request type. - * - * @param requestUrl Request url. - * @param requestType Request type. - * @returns Request context or undefined. - */ - find(requestUrl, requestType) { - for (const context of this.contextStorage.values()) { - if (context.requestUrl === requestUrl && context.requestType === requestType) { - return context; - } + Object.assign(requestContext, data); + return requestContext; } + // TODO: Throws error if request context not found after RequestEvents refactoring. + super.set(requestId, data); return undefined; } - /** - * Clear context storage. - */ - clear() { - this.contextStorage.clear(); - } } const requestContextStorage = new RequestContextStorage(); -const BACKGROUND_TAB_ID = -1; /** * Css, injected to broken element for hiding. */ // eslint-disable-next-line max-len -const INITIATOR_TAG_HIDDEN_STYLE = '{ display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important; }'; +const HIDING_STYLE = '{ display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important; }'; +/** + * Creates hiding css rule for specified tag with src attribute. + * + * @param tag Element tag for css selector. + * @param src `src` attribute value for css selector. If value is the empty string + * then the selector does not represent anything. + * @param matching Attribute matching type. Currently support strict (=) and suffix ($=) matching. + * Default to strict. + * + * @returns Css rule text. + */ +function createHidingCssRule(tag, src, matching = "=" /* AttributeMatching.Strict */) { + return `${tag}[src${matching}"${src}"] ${HIDING_STYLE}\n`; +} + +/** + * Get relative path of first-party request for resource `src` attribute. + * + * @param requestUrl Resource url. + * @param documentUrl Url of the document in which the resource will be loaded. + * + * @returns Relative path of resource `src` attribute for css selector. + */ +function getRelativeSrcPath(requestUrl, documentUrl) { + const requestUrlData = new URL(requestUrl); + const documentUrlData = new URL(documentUrl); + const documentPathname = documentUrlData.pathname; + const requestPathname = requestUrlData.pathname; + const requestUrlTail = requestUrlData.search + requestUrlData.hash; + if (documentPathname === '/') { + return requestPathname + requestUrlTail; + } + // Check that partial pathnames match + const requestUrlPathParts = requestPathname.split('/').filter((part) => !!part); + const documentUrlPathParts = documentPathname.split('/').filter((part) => !!part); + const commonParts = []; + for (let i = 0; i < Math.min(requestUrlPathParts.length, documentUrlPathParts.length); i += 1) { + if (requestUrlPathParts[i] !== documentUrlPathParts[i]) { + const path = requestUrlPathParts.slice(i).join('/') + requestUrlTail; + // If first parts are matched, return path relative to document page + // else return path relative to host + return i > 0 ? path : `/${path}`; + } + commonParts.push(requestUrlPathParts[i]); + } + const commonPath = `/${commonParts.join('/')}`; + return requestPathname.substring(commonPath.length + 1) + requestUrlTail; +} /** * Returns network request initiator tag by request type. * @@ -73952,9 +77976,9 @@ const INITIATOR_TAG_HIDDEN_STYLE = '{ display: none!important; visibility: hidde */ function getRequestInitiatorTag(requestType) { switch (requestType) { - case RequestType.SubDocument: + case dist_RequestType.SubDocument: return ["iframe" /* InitiatorTag.Iframe */, "frame" /* InitiatorTag.Frame */]; - case RequestType.Image: + case dist_RequestType.Image: return ["img" /* InitiatorTag.Image */]; default: return null; @@ -73965,28 +77989,163 @@ function getRequestInitiatorTag(requestType) { * * @param tabId Tab id. * @param requestFrameId Request frame id. - * @param url Request url. + * @param requestUrl Request url. + * @param documentUrl Document url. * @param requestType Request type. * @param isThirdParty Flag telling if request is third-party. */ -function hideRequestInitiatorElement(tabId, requestFrameId, url, requestType, isThirdParty) { +function hideRequestInitiatorElement(tabId, requestFrameId, requestUrl, documentUrl, requestType, isThirdParty) { const initiatorTags = getRequestInitiatorTag(requestType); if (!initiatorTags || tabId === BACKGROUND_TAB_ID) { return; } - // Strip the protocol and host name (for first-party requests) from the selector - let srcUrlStartIndex = url.indexOf('//'); - if (!isThirdParty) { - srcUrlStartIndex = url.indexOf('/', srcUrlStartIndex + 2); + let src; + let matching; + if (isThirdParty) { + src = requestUrl.substring(requestUrl.indexOf('//')); + matching = "$=" /* AttributeMatching.Suffix */; + } + else { + src = getRelativeSrcPath(requestUrl, documentUrl); + matching = "=" /* AttributeMatching.Strict */; } - const srcUrl = url.substring(srcUrlStartIndex); let code = ''; for (let i = 0; i < initiatorTags.length; i += 1) { - code += `${initiatorTags[i]}[src$="${srcUrl}"] ${INITIATOR_TAG_HIDDEN_STYLE}\n`; + code += createHidingCssRule(initiatorTags[i], src, matching); } CosmeticApi.injectCss(code, tabId, requestFrameId); } +const browserDetector = es5_default().getParser(window.navigator.userAgent); +const browserDetails = browserDetector.getBrowser(); +const engineDetails = browserDetector.getEngine(); +const isFirefox = browserDetails.name === 'Firefox'; +browserDetails.name === 'Chrome'; +const isChromium = engineDetails.name === 'Blink'; + +/** + * This service encapsulate processing of $document modifier rules. + * + * Service is initialized in {@link configure} method, called from {@link EngineApi#startEngine}. + * + * Request rule is processed in {@link getDocumentBlockingResponse} method, called + * from {@link RequestBlockingApi.getBlockingResponse}. + * + * Request rule is processed following scenario: + * - if domain is trusted, ignore request + * - if rule is document blocking and {@link documentBlockingPageUrl} is undefined, return + * {@link WebRequestApi.onBeforeRequest} blocking response + * - if rule is document blocking and {@link documentBlockingPageUrl} is defined, return redirect response with + * required params. + * - if browser is Firefox, update page url by {@link browser.tabs} API, because FF doesn't support redirects to + * extension pages. + */ +class DocumentBlockingService { + constructor() { + // list of domain names of sites, which should be excluded from document blocking + this.trustedDomains = []; + } + /** + * Configures service instance {@link documentBlockingPageUrl}. + * + * @param configuration App {@link Configuration}. + */ + configure(configuration) { + const { settings, trustedDomains } = configuration; + this.documentBlockingPageUrl = settings === null || settings === void 0 ? void 0 : settings.documentBlockingPageUrl; + this.trustedDomains = trustedDomains; + } + /** + * Processes $document modifier rule matched request in {@link RequestBlockingApi.getBlockingResponse}. + * + * @param eventId Request event id. + * @param requestUrl Url of processed request. + * @param rule {@link NetworkRule} Instance of matched rule. + * @param tabId TabId of processed request. + * @returns Blocking response or null {@link WebRequestApi.onBeforeRequest}. + */ + getDocumentBlockingResponse(eventId, requestUrl, rule, tabId) { + // if request url domain is trusted, ignore document blocking rule + if (this.isTrustedDomain(requestUrl)) { + return undefined; + } + // public filtering log event + defaultFilteringLog.publishEvent({ + type: FilteringEventType.ApplyBasicRule, + data: { + eventId, + tabId, + rule, + }, + }); + // if documentBlockingPage is undefined, block request + if (!this.documentBlockingPageUrl) { + return { cancel: true }; + } + // get document blocking url with required params + const blockingUrl = DocumentBlockingService.createBlockingUrl(this.documentBlockingPageUrl, requestUrl, rule.getText()); + // Chrome doesn't allow to show extension pages in incognito mode + if (isChromium && tabsApi.isIncognitoTab(tabId)) { + // Closing tab before opening a new one may lead to browser crash (Chromium) + dist_browser_polyfill_default().tabs.create({ url: blockingUrl }) + .then(() => { + dist_browser_polyfill_default().tabs.remove(tabId); + }) + .catch((e) => { + dist_logger.warn(`Can't open info page about blocked domain. Err: ${e}`); + }); + } + else { + // Browser doesn't allow redirects to extension pages which are not listed in web + // accessible resources. We set blocking page url via browser.tabs + // api for bypassing this limitation. + DocumentBlockingService.reloadTabWithBlockingPage(tabId, blockingUrl); + } + return { cancel: true }; + } + /** + * Checks if request url domain is trusted. + * + * @param url Request url. + * @returns True, if request url domain is trusted, else false. + */ + isTrustedDomain(url) { + const domain = dist_es6_getDomain(url); + if (domain) { + return this.trustedDomains.includes(domain); + } + return false; + } + /** + * Updates tab with document blocking page url. + * + * @param tabId Tab id. + * @param url Blocking page url. + */ + static reloadTabWithBlockingPage(tabId, url) { + const tabContext = tabsApi.getTabContext(tabId); + if (!tabContext) { + return; + } + dist_browser_polyfill_default().tabs.update(tabId, { url }); + } + /** + * Sets required url and rule query params to document-blocking page url. + * + * @param documentBlockingPageUrl Url of document-blocking page. + * @param requestUrl Processed request url. + * @param ruleText Matched rule text. + * @returns Document blocking page url with required params. + */ + static createBlockingUrl(documentBlockingPageUrl, requestUrl, ruleText) { + const url = new URL(documentBlockingPageUrl); + url.searchParams.set('url', requestUrl); + url.searchParams.set('rule', ruleText); + return url.toString(); + } +} +const documentBlockingService = new DocumentBlockingService(); + /** * RedirectsCache is used for new type of blocking redirects, like click2load.html. * Here we save redirected urls to check later for being able to view hidden frame after user @@ -74069,7 +78228,7 @@ class ResourcesService { */ constructor(generateSecretKey) { this.secrets = []; - this.root = browser_polyfill_default().runtime.getURL('/'); + this.root = dist_browser_polyfill_default().runtime.getURL('/'); this.lastSecretTime = 0; this.generateSecretKey = generateSecretKey; this.guardWar = this.guardWar.bind(this); @@ -74085,7 +78244,7 @@ class ResourcesService { urls: [`${this.root}${this.warDir}/*`], }; const extraInfoSpec = ['blocking']; - browser_polyfill_default().webRequest.onBeforeRequest.addListener(this.guardWar, filter, extraInfoSpec); + dist_browser_polyfill_default().webRequest.onBeforeRequest.addListener(this.guardWar, filter, extraInfoSpec); } /** * Stops service. @@ -74093,7 +78252,7 @@ class ResourcesService { stop() { this.warDir = undefined; this.secrets = []; - browser_polyfill_default().webRequest.onBeforeRequest.removeListener(this.guardWar); + dist_browser_polyfill_default().webRequest.onBeforeRequest.removeListener(this.guardWar); } /** * Creates url for war file. @@ -74110,7 +78269,7 @@ class ResourcesService { } const secretParams = new URLSearchParams(this.createSecretParam()); const resultParams = new URLSearchParams([...secretParams, ...params]); - return browser_polyfill_default().runtime.getURL(`/${this.warDir}/${path}?${resultParams.toString()}`); + return dist_browser_polyfill_default().runtime.getURL(`/${this.warDir}/${path}?${resultParams.toString()}`); } /** * Loads war resource by path. @@ -74322,62 +78481,65 @@ class RequestBlockingApi { * Processes rule applying for request and compute response for {@link WebRequestApi.onBeforeRequest} listener. * * @param rule Matched rule. - * @param requestId Request id. + * @param eventId Request event id. * @param requestUrl Request url. * @param requestType Request type. * @param tabId Tab id. * * @returns Response for {@link WebRequestApi.onBeforeRequest} listener. */ - static getBlockingResponse(rule, requestId, requestUrl, requestType, tabId) { + static getBlockingResponse(rule, eventId, requestUrl, requestType, tabId) { if (!rule) { return undefined; } if (rule.isAllowlist()) { - RequestBlockingApi.logRuleApplying(requestId, rule, tabId); + RequestBlockingApi.logRuleApplying(eventId, rule, tabId); return undefined; } + // If the request is a document request. if (requestType === RequestType.Document) { - if (rule.isOptionEnabled(NetworkRuleOption.Document)) { - return documentBlockingService.getDocumentBlockingResponse(requestId, requestUrl, rule, tabId); + // First, make sure that the content-types of the matching rule include + // the content-type of the document. + if ((rule.getPermittedRequestTypes() & RequestType.Document) !== RequestType.Document) { + return undefined; } + // Blocking rule can be with $popup modifier - in this case we need + // to close the tab as soon as possible. + // https://adguard.com/kb/ru/general/ad-filtering/create-own-filters/#popup-modifier if (rule.isOptionEnabled(NetworkRuleOption.Popup)) { const isNewTab = tabsApi.isNewPopupTab(tabId); if (isNewTab) { - RequestBlockingApi.logRuleApplying(requestId, rule, tabId); - browser_polyfill_default().tabs.remove(tabId); + RequestBlockingApi.logRuleApplying(eventId, rule, tabId); + dist_browser_polyfill_default().tabs.remove(tabId); return { cancel: true }; } } - // Other url blocking rules are not applicable to main frame - return undefined; - } - // Replace rules are processed in content-filtering - if (rule.isOptionEnabled(NetworkRuleOption.Replace)) { - return undefined; + // For all other blocking rules, we return our dummy page with the + // option to temporarily disable blocking for the specified domain. + return documentBlockingService.getDocumentBlockingResponse(eventId, requestUrl, rule, tabId); } if (rule.isOptionEnabled(NetworkRuleOption.Redirect)) { const redirectUrl = redirectsService.createRedirectUrl(rule.getAdvancedModifierValue(), requestUrl); if (redirectUrl) { - RequestBlockingApi.logRuleApplying(requestId, rule, tabId); + RequestBlockingApi.logRuleApplying(eventId, rule, tabId); return { redirectUrl }; } } - RequestBlockingApi.logRuleApplying(requestId, rule, tabId); + RequestBlockingApi.logRuleApplying(eventId, rule, tabId); return { cancel: true }; } /** * Creates {@link FilteringLog} event of rule applying for processed request. * - * @param requestId Request id. + * @param eventId Request event id. * @param requestRule Request rule. * @param tabId Tab id. */ - static logRuleApplying(requestId, requestRule, tabId) { + static logRuleApplying(eventId, requestRule, tabId) { defaultFilteringLog.publishEvent({ type: FilteringEventType.ApplyBasicRule, data: { - eventId: requestId, + eventId, tabId, rule: requestRule, }, @@ -74442,6 +78604,104 @@ class RequestEvent { } } +/** + * Injects cosmetic rules into tabs, opened before app initialization. + */ +class TabsCosmeticInjector { + /** + * Create instance of TabsCosmeticInjector. + * + * @param engineApi Engine API. + * @param documentApi Document API. + * @param tabsApi Tabs API. + */ + constructor(engineApi, documentApi, tabsApi) { + this.engineApi = engineApi; + this.documentApi = documentApi; + this.tabsApi = tabsApi; + } + /** + * Creates contexts for tabs opened before api initialization and + * applies cosmetic rules for each frame. + */ + processOpenTabs() { + return dist_awaiter(this, void 0, void 0, function* () { + const currentTabs = yield dist_browser_polyfill_default().tabs.query({}); + const tasks = currentTabs.map((tab) => this.processOpenTab(tab)); + const promises = yield Promise.allSettled(tasks); + // Handles errors + promises.forEach((promise) => { + if (promise.status === 'rejected') { + dist_logger.error(promise.reason); + } + }); + }); + } + /** + * Creates context for tab opened before api initialization and + * applies cosmetic rules for each frame. + * + * @param tab Tab details. + */ + processOpenTab(tab) { + return dist_awaiter(this, void 0, void 0, function* () { + if (!TabContext.isBrowserTab(tab)) { + return; + } + const tabContext = new TabContext(tab, this.documentApi); + const tabId = tab.id; + this.tabsApi.context.set(tabId, tabContext); + if (tab.url) { + tabContext.mainFrameRule = this.documentApi.matchFrame(tab.url); + } + const frames = yield dist_browser_polyfill_default().webNavigation.getAllFrames({ tabId }); + if (!frames) { + return; + } + frames.forEach(({ frameId, url }) => { + const frame = new Frame(url); + tabContext.frames.set(frameId, frame); + if (!isHttpOrWsRequest(url)) { + return; + } + const isDocumentFrame = frameId === MAIN_FRAME_ID; + frame.matchingResult = this.engineApi.matchRequest({ + requestUrl: url, + frameUrl: url, + requestType: isDocumentFrame ? dist_RequestType.Document : dist_RequestType.SubDocument, + frameRule: tabContext.mainFrameRule, + }); + if (!frame.matchingResult) { + return; + } + const cosmeticOption = frame.matchingResult.getCosmeticOption(); + frame.cosmeticResult = this.engineApi.getCosmeticResult(url, cosmeticOption); + const { cosmeticResult } = frame; + const cssInjectionParams = { + tabId, + frameId, + cosmeticResult, + }; + CosmeticApi.applyFrameCssRules(cssInjectionParams); + CosmeticApi.applyFrameJsRules({ + tabId, + frameId, + cosmeticResult, + }); + CosmeticApi.logScriptRules({ + url, + tabId, + cosmeticResult, + timestamp: Date.now(), + contentType: isDocumentFrame + ? ContentType.Document + : ContentType.Subdocument, + }); + }); + }); + } +} + const MAX_URL_LENGTH = 1024 * 16; /** * Request events class. @@ -74451,23 +78711,27 @@ class RequestEvents { * Initializes request events service. */ static init() { - RequestEvents.onBeforeRequest.init((browser_polyfill_default()).webRequest.onBeforeRequest, RequestEvents.handleOnBeforeRequest, { urls: [''] }, ['blocking', 'requestBody']); + RequestEvents.onBeforeRequest.init((dist_browser_polyfill_default()).webRequest.onBeforeRequest, RequestEvents.handleOnBeforeRequest, { urls: [''] }, ['blocking', 'requestBody']); const onBeforeSendHeadersOptions = ['requestHeaders', 'blocking']; - if (isChrome) { + const onBeforeSendHeadersOptionTypes = (dist_browser_polyfill_default()).webRequest.OnBeforeSendHeadersOptions; + if (typeof onBeforeSendHeadersOptionTypes !== 'undefined' + && Object.prototype.hasOwnProperty.call(onBeforeSendHeadersOptionTypes, 'EXTRA_HEADERS')) { onBeforeSendHeadersOptions.push('extraHeaders'); } - RequestEvents.onBeforeSendHeaders.init((browser_polyfill_default()).webRequest.onBeforeSendHeaders, RequestEvents.handleOnBeforeSendHeaders, { urls: [''] }, onBeforeSendHeadersOptions); - RequestEvents.onSendHeaders.init((browser_polyfill_default()).webRequest.onSendHeaders, RequestEvents.handleSendHeaders, { urls: [''] }); + RequestEvents.onBeforeSendHeaders.init((dist_browser_polyfill_default()).webRequest.onBeforeSendHeaders, RequestEvents.handleOnBeforeSendHeaders, { urls: [''] }, onBeforeSendHeadersOptions); + RequestEvents.onSendHeaders.init((dist_browser_polyfill_default()).webRequest.onSendHeaders, RequestEvents.handleSendHeaders, { urls: [''] }); const onHeadersReceivedOptions = ['responseHeaders', 'blocking']; - if (isChrome) { + const onHeadersReceivedOptionTypes = (dist_browser_polyfill_default()).webRequest.OnHeadersReceivedOptions; + if (typeof onHeadersReceivedOptionTypes !== 'undefined' + && Object.prototype.hasOwnProperty.call(onBeforeSendHeadersOptionTypes, 'EXTRA_HEADERS')) { onHeadersReceivedOptions.push('extraHeaders'); } - RequestEvents.onHeadersReceived.init((browser_polyfill_default()).webRequest.onHeadersReceived, RequestEvents.handleOnHeadersReceived, { urls: [''] }, onHeadersReceivedOptions); - RequestEvents.onAuthRequired.init((browser_polyfill_default()).webRequest.onAuthRequired, RequestEvents.handleOnAuthRequired, { urls: [''] }); - RequestEvents.onBeforeRedirect.init((browser_polyfill_default()).webRequest.onBeforeRedirect, RequestEvents.handleOnBeforeRedirect, { urls: [''] }); - RequestEvents.onResponseStarted.init((browser_polyfill_default()).webRequest.onResponseStarted, RequestEvents.handleOnResponseStarted, { urls: [''] }); - RequestEvents.onCompleted.init((browser_polyfill_default()).webRequest.onCompleted, RequestEvents.handleOnCompleted, { urls: [''] }, ['responseHeaders']); - RequestEvents.onErrorOccurred.init((browser_polyfill_default()).webRequest.onErrorOccurred, RequestEvents.handleOnErrorOccurred, { urls: [''] }); + RequestEvents.onHeadersReceived.init((dist_browser_polyfill_default()).webRequest.onHeadersReceived, RequestEvents.handleOnHeadersReceived, { urls: [''] }, onHeadersReceivedOptions); + RequestEvents.onAuthRequired.init((dist_browser_polyfill_default()).webRequest.onAuthRequired, RequestEvents.handleOnAuthRequired, { urls: [''] }); + RequestEvents.onBeforeRedirect.init((dist_browser_polyfill_default()).webRequest.onBeforeRedirect, RequestEvents.handleOnBeforeRedirect, { urls: [''] }); + RequestEvents.onResponseStarted.init((dist_browser_polyfill_default()).webRequest.onResponseStarted, RequestEvents.handleOnResponseStarted, { urls: [''] }); + RequestEvents.onCompleted.init((dist_browser_polyfill_default()).webRequest.onCompleted, RequestEvents.handleOnCompleted, { urls: [''] }, ['responseHeaders']); + RequestEvents.onErrorOccurred.init((dist_browser_polyfill_default()).webRequest.onErrorOccurred, RequestEvents.handleOnErrorOccurred, { urls: [''] }); } /** * Handles onBeforeRequest event. @@ -74477,8 +78741,8 @@ class RequestEvents { */ static handleOnBeforeRequest(details) { var _a, _b; - const { requestId, type, frameId, tabId, parentFrameId, originUrl, initiator, method, timeStamp, } = details; - let { url } = details; + const { requestId, type, tabId, parentFrameId, originUrl, initiator, method, timeStamp, } = details; + let { url, frameId } = details; /** * Truncate too long urls. * @@ -74496,7 +78760,10 @@ class RequestEvents { url = url.replace(/^http(s)?:/, 'ws$1:'); } const { requestType, contentType } = getRequestType(type); - let requestFrameId = type === 'main_frame' ? frameId : parentFrameId; + const isDocumentRequest = requestType === dist_RequestType.Document; + // Pre-rendered documents can have a frame ID other than zero + frameId = isDocumentRequest ? MAIN_FRAME_ID : details.frameId; + let requestFrameId = isDocumentRequest ? frameId : parentFrameId; // Relate request to main_frame if (requestFrameId === -1) { requestFrameId = 0; @@ -74512,7 +78779,7 @@ class RequestEvents { frameId, tabId, }; - if (requestType === dist_RequestType.Document || requestType === dist_RequestType.SubDocument) { + if (isDocumentRequest || requestType === dist_RequestType.SubDocument) { // Saves the current tab url to retrieve it correctly below. tabsApi.handleFrameRequest(tabFrameRequestContext); } @@ -74524,11 +78791,9 @@ class RequestEvents { || ((_b = tabsApi.getTabFrame(tabId, requestFrameId)) === null || _b === void 0 ? void 0 : _b.url) || url; // Retrieve the rest part of the request context for record all fields. - const requestContext = Object.assign(Object.assign({}, tabFrameRequestContext), { requestFrameId, state: "beforeRequest" /* RequestContextState.BeforeRequest */, timestamp: timeStamp, thirdParty: isThirdPartyRequest(url, referrerUrl), referrerUrl, - contentType, - method }); - const context = requestContextStorage.record(requestId, requestContext); - return { details, context }; + const requestContext = requestContextStorage.create(requestId, Object.assign(Object.assign({}, tabFrameRequestContext), { requestFrameId, state: "beforeRequest" /* RequestContextState.BeforeRequest */, timestamp: timeStamp, thirdParty: isThirdPartyRequest(url, referrerUrl), referrerUrl, + contentType, method: method })); + return { details, context: requestContext }; } /** * Handles onBeforeSendHeaders event. @@ -75272,7 +79537,7 @@ class BrowserCookieApi { removeCookie(name, url) { return dist_awaiter(this, void 0, void 0, function* () { try { - yield browser_polyfill_default().cookies.remove({ name, url }); + yield dist_browser_polyfill_default().cookies.remove({ name, url }); return true; } catch (e) { @@ -75287,14 +79552,22 @@ class BrowserCookieApi { * @param cookie Cookie for update. */ modifyCookie(cookie) { + var _a; return dist_awaiter(this, void 0, void 0, function* () { try { const update = BrowserCookieApi.convertToSetDetailsType(cookie); - yield browser_polyfill_default().cookies.set(update); + yield dist_browser_polyfill_default().cookies.set(update); return true; } catch (e) { - dist_logger.error(e.message); + // If `domain` contains the `path` part, the cookie cannot be saved, + // since `domain` can only contain hostname. + if ((_a = cookie.domain) === null || _a === void 0 ? void 0 : _a.includes('/')) { + dist_logger.info(e.message); + } + else { + dist_logger.error(e.message); + } } return false; }); @@ -75309,7 +79582,7 @@ class BrowserCookieApi { findCookies(pattern) { return dist_awaiter(this, void 0, void 0, function* () { try { - const found = yield browser_polyfill_default().cookies.getAll(pattern); + const found = yield dist_browser_polyfill_default().cookies.getAll(pattern); return found; } catch (e) { @@ -75763,7 +80036,7 @@ class CookieFiltering { tabId, cookieName: cookie.name, cookieValue: cookie.value, - frameDomain: es6_getDomain(requestUrl) || requestUrl, + frameDomain: dist_es6_getDomain(requestUrl) || requestUrl, rule, isModifyingCookieRule, requestThirdParty, @@ -76183,12 +80456,12 @@ class ContentStringFilter { const element = elements[j]; if (element.parentNode && deleted.indexOf(element) < 0) { element.parentNode.removeChild(element); - const { tabId, requestId, requestUrl, timestamp, contentType, } = this.context; + const { tabId, requestUrl, timestamp, contentType, } = this.context; this.filteringLog.publishEvent({ type: FilteringEventType.ApplyCosmeticRule, data: { tabId, - eventId: requestId, + eventId: nanoid(), element: element.innerHTML, frameUrl: requestUrl, rule, @@ -76232,13 +80505,13 @@ class ContentStringFilter { appliedRules.push(replaceRule); } } - const { tabId, requestId } = this.context; + const { tabId, eventId } = this.context; if (appliedRules.length > 0) { this.filteringLog.publishEvent({ type: FilteringEventType.ReplaceRuleApply, data: { tabId, - eventId: requestId, + eventId, rules: appliedRules, }, }); @@ -76299,8 +80572,8 @@ function requireEncodingIndexes () { "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255], "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364] }; - }(dist_commonjsGlobal || {})); -} (encodingIndexes)); + }(dist_commonjsGlobal || {})); + } (encodingIndexes)); return encodingIndexes.exports; } @@ -78012,10 +82285,12 @@ function requireEncodingIndexes () { EncodingIndexes: global["encoding-indexes"] }; } - }(dist_commonjsGlobal || {})); + }(dist_commonjsGlobal || {})); } (encoding$1)); -var encoding = encoding$1.exports; +var encodingExports = encoding$1.exports; + +var encoding = encodingExports; var textEncoding = { TextEncoder: encoding.TextEncoder, TextDecoder: encoding.TextDecoder, @@ -78408,7 +82683,7 @@ class ContentFiltering { * @param context Request context. */ static onBeforeRequest(context) { - if (!(browser_polyfill_default()).webRequest.filterResponseData + if (!(dist_browser_polyfill_default()).webRequest.filterResponseData || !ContentFiltering.isRequestMethodSupported(context) || ContentFiltering.hasContentExceptionRule(context)) { return; @@ -78417,7 +82692,7 @@ class ContentFiltering { const replaceRules = ContentFiltering.getReplaceRules(context); if (htmlRules || replaceRules) { const contentStringFilter = new ContentStringFilter(context, htmlRules, replaceRules, defaultFilteringLog); - const contentStream = new ContentStream(context, contentStringFilter, (browser_polyfill_default()).webRequest.filterResponseData, defaultFilteringLog); + const contentStream = new ContentStream(context, contentStringFilter, (dist_browser_polyfill_default()).webRequest.filterResponseData, defaultFilteringLog); contentStream.init(); } } @@ -78467,10 +82742,10 @@ class CspService { type: FilteringEventType.ApplyCspRule, data: { tabId, - eventId: requestId, + eventId: nanoid(), requestUrl, frameUrl: referrerUrl, - frameDomain: es6_getDomain(referrerUrl), + frameDomain: dist_es6_getDomain(referrerUrl), requestType: ContentType.Csp, rule, timestamp: Date.now(), @@ -78529,8 +82804,8 @@ class WebRequestApi { RequestEvents.onErrorOccurred.addListener(WebRequestApi.onErrorOccurred); RequestEvents.onCompleted.addListener(WebRequestApi.onCompleted); // browser.webNavigation Events - browser_polyfill_default().webNavigation.onCommitted.addListener(WebRequestApi.onCommitted); - browser_polyfill_default().webNavigation.onDOMContentLoaded.addListener(WebRequestApi.onDomContentLoaded); + dist_browser_polyfill_default().webNavigation.onCommitted.addListener(WebRequestApi.onCommitted); + dist_browser_polyfill_default().webNavigation.onDOMContentLoaded.addListener(WebRequestApi.onDomContentLoaded); } /** * Removes web request event handlers. @@ -78542,8 +82817,8 @@ class WebRequestApi { RequestEvents.onResponseStarted.removeListener(WebRequestApi.onResponseStarted); RequestEvents.onErrorOccurred.removeListener(WebRequestApi.onErrorOccurred); RequestEvents.onCompleted.removeListener(WebRequestApi.onCompleted); - browser_polyfill_default().webNavigation.onCommitted.removeListener(WebRequestApi.onCommitted); - browser_polyfill_default().webNavigation.onDOMContentLoaded.removeListener(WebRequestApi.onDomContentLoaded); + dist_browser_polyfill_default().webNavigation.onCommitted.removeListener(WebRequestApi.onCommitted); + dist_browser_polyfill_default().webNavigation.onDOMContentLoaded.removeListener(WebRequestApi.onDomContentLoaded); } /** * Flush browser in-memory cache. @@ -78554,7 +82829,7 @@ class WebRequestApi { static flushMemoryCache() { return dist_awaiter(this, void 0, void 0, function* () { try { - yield browser_polyfill_default().webRequest.handlerBehaviorChanged(); + yield dist_browser_polyfill_default().webRequest.handlerBehaviorChanged(); } catch (e) { // TODO: use getErrorMessage instead @@ -78571,21 +82846,11 @@ class WebRequestApi { * @returns Web request response or void if there is nothing to do. */ static onBeforeRequest({ context }) { + var _a; if (!context) { return undefined; } - const { requestType, tabId, frameId, requestUrl, referrerUrl, requestId, contentType, timestamp, thirdParty, method, requestFrameId, } = context; - if (requestType === dist_RequestType.Document || requestType === dist_RequestType.SubDocument) { - tabsApi.handleFrameRequest(context); - if (requestType === dist_RequestType.Document) { - defaultFilteringLog.publishEvent({ - type: FilteringEventType.TabReload, - data: { - tabId, - }, - }); - } - } + const { requestType, tabId, frameId, requestUrl, referrerUrl, eventId, requestId, contentType, timestamp, thirdParty, method, requestFrameId, } = context; if (!isHttpOrWsRequest(requestUrl)) { return undefined; } @@ -78593,7 +82858,7 @@ class WebRequestApi { type: FilteringEventType.SendRequest, data: { tabId, - eventId: requestId, + eventId, requestUrl, requestDomain: dist_getDomain(requestUrl), frameUrl: referrerUrl, @@ -78609,6 +82874,7 @@ class WebRequestApi { frameUrl: referrerUrl, requestType, frameRule: tabsApi.getTabFrameRule(tabId), + method, }); if (!result) { return undefined; @@ -78626,7 +82892,9 @@ class WebRequestApi { }); } const basicResult = result.getBasicResult(); - const response = RequestBlockingApi.getBlockingResponse(basicResult, requestId, requestUrl, requestType, tabId); + // For a $replace rule, response will be undefined since we need to get + // the response in order to actually apply $replace rules to it. + const response = RequestBlockingApi.getBlockingResponse(basicResult, eventId, requestUrl, requestType, tabId); if (!response) { /* Strip url by $removeparam rules @@ -78640,7 +82908,8 @@ class WebRequestApi { } if (response === null || response === void 0 ? void 0 : response.cancel) { tabsApi.incrementTabBlockedRequestCount(tabId); - hideRequestInitiatorElement(tabId, requestFrameId, requestUrl, requestType, thirdParty); + const mainFrameUrl = (_a = tabsApi.getTabMainFrame(tabId)) === null || _a === void 0 ? void 0 : _a.url; + hideRequestInitiatorElement(tabId, requestFrameId, requestUrl, mainFrameUrl || referrerUrl, requestType, thirdParty); } else { ContentFiltering.onBeforeRequest(context); @@ -78696,11 +82965,14 @@ class WebRequestApi { */ static onHeadersReceived({ context, details, }) { var _a; + if (!context) { + return undefined; + } defaultFilteringLog.publishEvent({ type: FilteringEventType.ReceiveResponse, data: { - tabId: details.tabId, - eventId: details.requestId, + tabId: context.tabId, + eventId: context.eventId, statusCode: details.statusCode, }, }); @@ -78739,7 +83011,7 @@ class WebRequestApi { if (!context) { return; } - const { requestId, tabId, frameId, requestType, contentType, timestamp, } = context; + const { tabId, frameId, requestType, } = context; if (requestType !== dist_RequestType.Document && requestType !== dist_RequestType.SubDocument) { return; } @@ -78760,17 +83032,13 @@ class WebRequestApi { if (requestType === dist_RequestType.Document && frame.url !== tabContext.info.url) { return; } - const { cosmeticResult, url, jsInjectionFsm, } = frame; + const { cosmeticResult } = frame; const injectionParams = { - requestId, - url, tabId, frameId, cosmeticResult, - timestamp, - contentType, }; - CosmeticApi.applyFrameJsRules(injectionParams, jsInjectionFsm); + CosmeticApi.applyFrameJsRules(injectionParams); } /** * This is handler for the last event from the request lifecycle. @@ -78783,7 +83051,7 @@ class WebRequestApi { if (!context) { return; } - const { requestId, requestType, tabId, frameId, requestUrl, timestamp, } = context; + const { requestId, requestType, tabId, frameId, requestUrl, timestamp, contentType, cosmeticResult, } = context; /** * If the request is a subdocument request in Firefox, try injecting frame cosmetic result into frame, * because {@link WebRequestApi.onCommitted} can be not triggered. @@ -78796,6 +83064,16 @@ class WebRequestApi { url: requestUrl, }); } + if (cosmeticResult + && (requestType === dist_RequestType.Document || requestType === dist_RequestType.SubDocument)) { + CosmeticApi.logScriptRules({ + tabId, + cosmeticResult, + url: requestUrl, + contentType, + timestamp, + }); + } requestContextStorage.delete(requestId); } /** @@ -78834,32 +83112,40 @@ class WebRequestApi { * @param params Data required for rule injection. */ static injectCosmetic(params) { - const { frameId, tabId, timestamp, url, } = params; - const frame = tabsApi.getTabFrame(tabId, frameId); - if (!frame - || !frame.cosmeticResult - || !frame.requestId) { + const { frameId, tabId, url, } = params; + const tabContext = tabsApi.getTabContext(tabId); + if (!tabContext) { return; } - const { cosmeticResult, requestId, cssInjectionFsm, jsInjectionFsm, } = frame; + const frame = tabContext.frames.get(frameId); + if (!frame) { + return; + } + /** + * Cosmetic result may not be committed to frame context during worker request processing. + * We use engine request as a fallback for this case. + */ + if (!frame.cosmeticResult) { + frame.cosmeticResult = engineApi.matchCosmetic({ + requestUrl: url, + frameUrl: url, + requestType: frameId === MAIN_FRAME_ID ? dist_RequestType.Document : dist_RequestType.SubDocument, + frameRule: tabContext.mainFrameRule, + }); + } + const { cosmeticResult } = frame; const cssInjectionParams = { tabId, frameId, cosmeticResult, }; const jsInjectionParams = { - requestId, - url, tabId, frameId, cosmeticResult, - timestamp, - contentType: frameId === MAIN_FRAME_ID - ? ContentType.Document - : ContentType.Subdocument, }; - CosmeticApi.applyFrameCssRules(cssInjectionParams, cssInjectionFsm); - CosmeticApi.applyFrameJsRules(jsInjectionParams, jsInjectionFsm); + CosmeticApi.applyFrameCssRules(cssInjectionParams); + CosmeticApi.applyFrameJsRules(jsInjectionParams); } /** * On committed web navigation event handler. @@ -78890,15 +83176,14 @@ class WebRequestApi { * @param details Event details. */ static onDomContentLoaded(details) { - const { tabId, frameId, url, timeStamp, } = details; + const { tabId, frameId, url, } = details; const mainFrame = tabsApi.getTabMainFrame(tabId); if (!mainFrame || !mainFrame.cosmeticResult - || !mainFrame.requestId || !WebRequestApi.isLocalFrame(url, frameId, mainFrame.url)) { return; } - const { cosmeticResult, requestId } = mainFrame; + const { cosmeticResult } = mainFrame; CosmeticApi .applyCssRules({ tabId, @@ -78908,13 +83193,9 @@ class WebRequestApi { .catch(dist_logger.debug); CosmeticApi .applyJsRules({ - requestId, - url: mainFrame.url, tabId, frameId, cosmeticResult, - timestamp: timeStamp, - contentType: ContentType.Subdocument, }) .catch(dist_logger.debug); } @@ -78932,7 +83213,7 @@ class Assistant { static openAssistant(tabId) { return dist_awaiter(this, void 0, void 0, function* () { // Lazy load assistant - yield browser_polyfill_default().tabs.executeScript(tabId, { file: this.assistantUrl }); + yield dist_browser_polyfill_default().tabs.executeScript(tabId, { file: this.assistantUrl }); yield messagesApi.sendMessage(tabId, { type: MessageType.InitAssistant, tabId, @@ -78983,7 +83264,7 @@ class MessagesApi { */ sendMessage(tabId, message) { return dist_awaiter(this, void 0, void 0, function* () { - yield browser_polyfill_default().tabs.sendMessage(tabId, message); + yield dist_browser_polyfill_default().tabs.sendMessage(tabId, message); }); } /** @@ -79211,19 +83492,19 @@ const messagesApi = new MessagesApi(defaultFilteringLog); /** * Filter list configuration validator for MV2. */ -const filterMV2Validator = mod.object({ +const filterMV2Validator = z.object({ /** * Filter identifier. */ - filterId: mod.number(), + filterId: z.number(), /** * Filter list text content. */ - content: mod.string(), + content: z.string(), /** * Filter trusted flag. If true, js rules from list can be executed. */ - trusted: mod.boolean(), + trusted: z.boolean(), }); /** * Configuration validator for MV2. @@ -79232,124 +83513,10 @@ const configurationMV2Validator = configurationValidator.extend({ filters: filterMV2Validator.array(), }); -/** - * Injects cosmetic rules into tabs, opened before app initialization. - */ -class TabsCosmeticInjector { - /** - * Creates contexts for tabs opened before api initialization and - * applies cosmetic rules for each frame. - */ - static processOpenTabs() { - return dist_awaiter(this, void 0, void 0, function* () { - const currentTabs = yield browser_polyfill_default().tabs.query({}); - const tasks = currentTabs.map((tab) => TabsCosmeticInjector.processOpenTab(tab)); - const promises = yield Promise.allSettled(tasks); - // Handles errors - promises.forEach((promise) => { - if (promise.status === 'rejected') { - dist_logger.error(promise.reason); - } - }); - }); - } - /** - * Creates context for tab opened before api initialization and - * applies cosmetic rules for each frame. - * - * @param tab Tab details. - */ - static processOpenTab(tab) { - return dist_awaiter(this, void 0, void 0, function* () { - if (!TabContext.isBrowserTab(tab)) { - return; - } - const tabContext = new TabContext(tab); - const tabId = tab.id; - tabsApi.context.set(tabId, tabContext); - if (tab.url) { - tabContext.mainFrameRule = allowlistApi.matchFrame(tab.url); - } - const frames = yield browser_polyfill_default().webNavigation.getAllFrames({ tabId }); - if (!frames) { - return; - } - frames.forEach(({ frameId, url }) => { - const frame = new Frame(url); - tabContext.frames.set(frameId, frame); - if (!isHttpOrWsRequest(url)) { - return; - } - const isDocumentFrame = frameId === MAIN_FRAME_ID; - frame.matchingResult = engineApi.matchRequest({ - requestUrl: url, - frameUrl: url, - requestType: isDocumentFrame ? dist_RequestType.Document : dist_RequestType.SubDocument, - frameRule: tabContext.mainFrameRule, - }); - if (!frame.matchingResult) { - return; - } - const cosmeticOption = frame.matchingResult.getCosmeticOption(); - frame.cosmeticResult = engineApi.getCosmeticResult(url, cosmeticOption); - const { cosmeticResult, cssInjectionFsm, jsInjectionFsm, } = frame; - const cssInjectionParams = { - tabId, - frameId, - cosmeticResult, - }; - const jsInjectionParams = { - url, - tabId, - frameId, - cosmeticResult, - requestId: TabsCosmeticInjector.generateFrameRequestId(), - timestamp: Date.now(), - contentType: isDocumentFrame - ? ContentType.Document - : ContentType.Subdocument, - }; - CosmeticApi.applyFrameCssRules(cssInjectionParams, cssInjectionFsm); - CosmeticApi.applyFrameJsRules(jsInjectionParams, jsInjectionFsm); - }); - }); - } - /** - * Generates synthetic request id for frame, opened before extension initialization. - * Used for logging js rule apply. - * - * @returns Request id. - */ - static generateFrameRequestId() { - return `${TabsCosmeticInjector.SYNTHETIC_REQUEST_ID_PREFIX}-${nanoid(7)}`; - } -} -/** - * Synthetic request id prefix for frames, opened before extension initialization. - * Used in filtering log for displaying cosmetic rule events. - */ -TabsCosmeticInjector.SYNTHETIC_REQUEST_ID_PREFIX = 'synthetic'; - /** * App implementation for MV2. */ class TsWebExtension { - /** - * Constructor. - * - * @param webAccessibleResourcesPath Path to web accessible resources for {@link resourcesService}. - */ - constructor(webAccessibleResourcesPath) { - /** - * Fires on filtering log event. - */ - this.onFilteringLogEvent = defaultFilteringLog.onLogEvent; - /** - * Fires when a rule has been created from the helper. - */ - this.onAssistantCreateRule = Assistant.onCreateRule; - resourcesService.init(webAccessibleResourcesPath); - } /** * Gets app running status. * @@ -79386,6 +83553,27 @@ class TsWebExtension { set configuration(value) { appContext.configuration = value; } + /** + * Constructor. + * + * @param webAccessibleResourcesPath Path to web accessible resources for {@link resourcesService}. + */ + constructor(webAccessibleResourcesPath) { + /** + * Fires on filtering log event. + */ + this.onFilteringLogEvent = defaultFilteringLog.onLogEvent; + /** + * Fires when a rule has been created from the helper. + */ + this.onAssistantCreateRule = Assistant.onCreateRule; + /** + * Tabs cosmetic injector. + * Used to inject cosmetic rules into opened tabs on extension start. + */ + this.tabCosmeticInjector = new TabsCosmeticInjector(engineApi, documentApi, tabsApi); + resourcesService.init(webAccessibleResourcesPath); + } /** * Initializes {@link EngineApi} with passed {@link configuration}. * Starts request processing via {@link WebRequestApi} and tab tracking via {@link tabsApi}. @@ -79400,11 +83588,11 @@ class TsWebExtension { return dist_awaiter(this, void 0, void 0, function* () { configurationMV2Validator.parse(configuration); this.configuration = TsWebExtension.createConfigurationMV2Context(configuration); - dist_logger.setVerbose(configuration.verbose); RequestEvents.init(); yield redirectsService.start(); + documentBlockingService.configure(configuration); yield engineApi.startEngine(configuration); - yield TabsCosmeticInjector.processOpenTabs(); + yield this.tabCosmeticInjector.processOpenTabs(); yield tabsApi.start(); WebRequestApi.start(); Assistant.assistantUrl = configuration.settings.assistantUrl; @@ -79442,7 +83630,7 @@ class TsWebExtension { } configurationMV2Validator.parse(configuration); this.configuration = TsWebExtension.createConfigurationMV2Context(configuration); - dist_logger.setVerbose(configuration.verbose); + documentBlockingService.configure(configuration); yield engineApi.startEngine(configuration); yield tabsApi.updateCurrentTabsMainFrameRules(); yield WebRequestApi.flushMemoryCache(); @@ -79625,10 +83813,11 @@ class TsWebExtension { * @returns Configuration context. */ static createConfigurationMV2Context(configuration) { - const { filters, verbose, settings } = configuration; + const { filters, verbose, logLevel, settings, } = configuration; return { filters: filters.map(({ filterId }) => filterId), verbose, + logLevel, settings, }; } @@ -79636,8 +83825,8 @@ class TsWebExtension { -// EXTERNAL MODULE: ../../node_modules/@adguard/filters-downloader/src/index.browser.js -var index_browser = __webpack_require__(2846); +// EXTERNAL MODULE: ./node_modules/@adguard/filters-downloader/src/index.browser.js +var index_browser = __webpack_require__(5042); var index_browser_default = /*#__PURE__*/__webpack_require__.n(index_browser); ;// CONCATENATED MODULE: ./src/background/utils/version.ts /** @@ -79913,7 +84102,7 @@ class I18n { ;// CONCATENATED MODULE: ./node_modules/zod/lib/index.mjs -var zod_lib_util; +var lib_util; (function (util) { util.assertEqual = (val) => val; function assertIs(_arg) { } @@ -79975,7 +84164,7 @@ var zod_lib_util; } return value; }; -})(zod_lib_util || (zod_lib_util = {})); +})(lib_util || (lib_util = {})); var lib_objectUtil; (function (objectUtil) { objectUtil.mergeShapes = (first, second) => { @@ -79985,7 +84174,7 @@ var lib_objectUtil; }; }; })(lib_objectUtil || (lib_objectUtil = {})); -const lib_ZodParsedType = zod_lib_util.arrayToEnum([ +const lib_ZodParsedType = lib_util.arrayToEnum([ "string", "nan", "number", @@ -80052,7 +84241,7 @@ const lib_getParsedType = (data) => { } }; -const lib_ZodIssueCode = zod_lib_util.arrayToEnum([ +const lib_ZodIssueCode = lib_util.arrayToEnum([ "invalid_type", "invalid_literal", "custom", @@ -80151,7 +84340,7 @@ class lib_ZodError extends Error { return this.message; } get message() { - return JSON.stringify(this.issues, zod_lib_util.jsonStringifyReplacer, 2); + return JSON.stringify(this.issues, lib_util.jsonStringifyReplacer, 2); } get isEmpty() { return this.issues.length === 0; @@ -80191,19 +84380,19 @@ const lib_errorMap = (issue, _ctx) => { } break; case lib_ZodIssueCode.invalid_literal: - message = `Invalid literal value, expected ${JSON.stringify(issue.expected, zod_lib_util.jsonStringifyReplacer)}`; + message = `Invalid literal value, expected ${JSON.stringify(issue.expected, lib_util.jsonStringifyReplacer)}`; break; case lib_ZodIssueCode.unrecognized_keys: - message = `Unrecognized key(s) in object: ${zod_lib_util.joinValues(issue.keys, ", ")}`; + message = `Unrecognized key(s) in object: ${lib_util.joinValues(issue.keys, ", ")}`; break; case lib_ZodIssueCode.invalid_union: message = `Invalid input`; break; case lib_ZodIssueCode.invalid_union_discriminator: - message = `Invalid discriminator value. Expected ${zod_lib_util.joinValues(issue.options)}`; + message = `Invalid discriminator value. Expected ${lib_util.joinValues(issue.options)}`; break; case lib_ZodIssueCode.invalid_enum_value: - message = `Invalid enum value. Expected ${zod_lib_util.joinValues(issue.options)}, received '${issue.received}'`; + message = `Invalid enum value. Expected ${lib_util.joinValues(issue.options)}, received '${issue.received}'`; break; case lib_ZodIssueCode.invalid_arguments: message = `Invalid function arguments`; @@ -80229,7 +84418,7 @@ const lib_errorMap = (issue, _ctx) => { message = `Invalid input: must end with "${issue.validation.endsWith}"`; } else { - zod_lib_util.assertNever(issue.validation); + lib_util.assertNever(issue.validation); } } else if (issue.validation !== "regex") { @@ -80299,7 +84488,7 @@ const lib_errorMap = (issue, _ctx) => { break; default: message = _ctx.defaultError; - zod_lib_util.assertNever(issue); + lib_util.assertNever(issue); } return { message }; }; @@ -80700,7 +84889,7 @@ class lib_ZodType { } catch(def) { const catchValueFunc = typeof def === "function" ? def : () => def; - return new ZodCatch({ + return new lib_ZodCatch({ ...lib_processCreateParams(this._def), innerType: this, catchValue: catchValueFunc, @@ -80715,7 +84904,7 @@ class lib_ZodType { }); } pipe(target) { - return ZodPipeline.create(this, target); + return lib_ZodPipeline.create(this, target); } isOptional() { return this.safeParse(undefined).success; @@ -80725,8 +84914,8 @@ class lib_ZodType { } } const lib_cuidRegex = /^c[^\s-]{8,}$/i; -const cuid2Regex = /^[a-z][a-z0-9]*$/; -const ulidRegex = /[0-9A-HJKMNP-TV-Z]{26}/; +const lib_cuid2Regex = /^[a-z][a-z0-9]*$/; +const lib_ulidRegex = /[0-9A-HJKMNP-TV-Z]{26}/; const lib_uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i; // from https://stackoverflow.com/a/46181/1550155 // old version: too slow, didn't support unicode @@ -80736,11 +84925,11 @@ const lib_uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a // eslint-disable-next-line const lib_emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/; // from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression -const emojiRegex = /^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u; -const ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/; -const ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/; +const lib_emojiRegex = /^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u; +const lib_ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/; +const lib_ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/; // Adapted from https://stackoverflow.com/a/3143231 -const datetimeRegex = (args) => { +const lib_datetimeRegex = (args) => { if (args.precision) { if (args.offset) { return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`); @@ -80766,11 +84955,11 @@ const datetimeRegex = (args) => { } } }; -function isValidIP(ip, version) { - if ((version === "v4" || !version) && ipv4Regex.test(ip)) { +function lib_isValidIP(ip, version) { + if ((version === "v4" || !version) && lib_ipv4Regex.test(ip)) { return true; } - if ((version === "v6" || !version) && ipv6Regex.test(ip)) { + if ((version === "v6" || !version) && lib_ipv6Regex.test(ip)) { return true; } return false; @@ -80888,7 +85077,7 @@ class lib_ZodString extends lib_ZodType { } } else if (check.kind === "emoji") { - if (!emojiRegex.test(input.data)) { + if (!lib_emojiRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); lib_addIssueToContext(ctx, { validation: "emoji", @@ -80921,7 +85110,7 @@ class lib_ZodString extends lib_ZodType { } } else if (check.kind === "cuid2") { - if (!cuid2Regex.test(input.data)) { + if (!lib_cuid2Regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); lib_addIssueToContext(ctx, { validation: "cuid2", @@ -80932,7 +85121,7 @@ class lib_ZodString extends lib_ZodType { } } else if (check.kind === "ulid") { - if (!ulidRegex.test(input.data)) { + if (!lib_ulidRegex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); lib_addIssueToContext(ctx, { validation: "ulid", @@ -81012,7 +85201,7 @@ class lib_ZodString extends lib_ZodType { } } else if (check.kind === "datetime") { - const regex = datetimeRegex(check); + const regex = lib_datetimeRegex(check); if (!regex.test(input.data)) { ctx = this._getOrReturnCtx(input, ctx); lib_addIssueToContext(ctx, { @@ -81024,7 +85213,7 @@ class lib_ZodString extends lib_ZodType { } } else if (check.kind === "ip") { - if (!isValidIP(input.data, check.version)) { + if (!lib_isValidIP(input.data, check.version)) { ctx = this._getOrReturnCtx(input, ctx); lib_addIssueToContext(ctx, { validation: "ip", @@ -81035,7 +85224,7 @@ class lib_ZodString extends lib_ZodType { } } else { - zod_lib_util.assertNever(check); + lib_util.assertNever(check); } } return { status: status.value, value: input.data }; @@ -81228,7 +85417,7 @@ class lib_ZodNumber extends lib_ZodType { const status = new lib_ParseStatus(); for (const check of this._def.checks) { if (check.kind === "int") { - if (!zod_lib_util.isInteger(input.data)) { + if (!lib_util.isInteger(input.data)) { ctx = this._getOrReturnCtx(input, ctx); lib_addIssueToContext(ctx, { code: lib_ZodIssueCode.invalid_type, @@ -81295,7 +85484,7 @@ class lib_ZodNumber extends lib_ZodType { } } else { - zod_lib_util.assertNever(check); + lib_util.assertNever(check); } } return { status: status.value, value: input.data }; @@ -81418,7 +85607,7 @@ class lib_ZodNumber extends lib_ZodType { } get isInt() { return !!this._def.checks.find((ch) => ch.kind === "int" || - (ch.kind === "multipleOf" && zod_lib_util.isInteger(ch.value))); + (ch.kind === "multipleOf" && lib_util.isInteger(ch.value))); } get isFinite() { let max = null, min = null; @@ -81515,7 +85704,7 @@ class lib_ZodBigInt extends lib_ZodType { } } else { - zod_lib_util.assertNever(check); + lib_util.assertNever(check); } } return { status: status.value, value: input.data }; @@ -81700,7 +85889,7 @@ class lib_ZodDate extends lib_ZodType { } } else { - zod_lib_util.assertNever(check); + lib_util.assertNever(check); } } return { @@ -81757,7 +85946,7 @@ lib_ZodDate.create = (params) => { ...lib_processCreateParams(params), }); }; -class ZodSymbol extends lib_ZodType { +class lib_ZodSymbol extends lib_ZodType { _parse(input) { const parsedType = this._getType(input); if (parsedType !== lib_ZodParsedType.symbol) { @@ -81772,8 +85961,8 @@ class ZodSymbol extends lib_ZodType { return lib_OK(input.data); } } -ZodSymbol.create = (params) => { - return new ZodSymbol({ +lib_ZodSymbol.create = (params) => { + return new lib_ZodSymbol({ typeName: lib_ZodFirstPartyTypeKind.ZodSymbol, ...lib_processCreateParams(params), }); @@ -82073,7 +86262,7 @@ class lib_ZodObject extends lib_ZodType { if (this._cached !== null) return this._cached; const shape = this._def.shape(); - const keys = zod_lib_util.objectKeys(shape); + const keys = lib_util.objectKeys(shape); return (this._cached = { shape, keys }); } _parse(input) { @@ -82314,7 +86503,7 @@ class lib_ZodObject extends lib_ZodType { } pick(mask) { const shape = {}; - zod_lib_util.objectKeys(mask).forEach((key) => { + lib_util.objectKeys(mask).forEach((key) => { if (mask[key] && this.shape[key]) { shape[key] = this.shape[key]; } @@ -82326,7 +86515,7 @@ class lib_ZodObject extends lib_ZodType { } omit(mask) { const shape = {}; - zod_lib_util.objectKeys(this.shape).forEach((key) => { + lib_util.objectKeys(this.shape).forEach((key) => { if (!mask[key]) { shape[key] = this.shape[key]; } @@ -82344,7 +86533,7 @@ class lib_ZodObject extends lib_ZodType { } partial(mask) { const newShape = {}; - zod_lib_util.objectKeys(this.shape).forEach((key) => { + lib_util.objectKeys(this.shape).forEach((key) => { const fieldSchema = this.shape[key]; if (mask && !mask[key]) { newShape[key] = fieldSchema; @@ -82360,7 +86549,7 @@ class lib_ZodObject extends lib_ZodType { } required(mask) { const newShape = {}; - zod_lib_util.objectKeys(this.shape).forEach((key) => { + lib_util.objectKeys(this.shape).forEach((key) => { if (mask && !mask[key]) { newShape[key] = this.shape[key]; } @@ -82379,7 +86568,7 @@ class lib_ZodObject extends lib_ZodType { }); } keyof() { - return lib_createZodEnum(zod_lib_util.objectKeys(this.shape)); + return lib_createZodEnum(lib_util.objectKeys(this.shape)); } } lib_ZodObject.create = (shape, params) => { @@ -82512,12 +86701,12 @@ lib_ZodUnion.create = (types, params) => { ////////// ////////// ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// -const getDiscriminator = (type) => { +const lib_getDiscriminator = (type) => { if (type instanceof lib_ZodLazy) { - return getDiscriminator(type.schema); + return lib_getDiscriminator(type.schema); } else if (type instanceof lib_ZodEffects) { - return getDiscriminator(type.innerType()); + return lib_getDiscriminator(type.innerType()); } else if (type instanceof lib_ZodLiteral) { return [type.value]; @@ -82530,7 +86719,7 @@ const getDiscriminator = (type) => { return Object.keys(type.enum); } else if (type instanceof lib_ZodDefault) { - return getDiscriminator(type._def.innerType); + return lib_getDiscriminator(type._def.innerType); } else if (type instanceof lib_ZodUndefined) { return [undefined]; @@ -82601,7 +86790,7 @@ class lib_ZodDiscriminatedUnion extends lib_ZodType { const optionsMap = new Map(); // try { for (const type of options) { - const discriminatorValues = getDiscriminator(type.shape[discriminator]); + const discriminatorValues = lib_getDiscriminator(type.shape[discriminator]); if (!discriminatorValues) { throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); } @@ -82628,8 +86817,8 @@ function lib_mergeValues(a, b) { return { valid: true, data: a }; } else if (aType === lib_ZodParsedType.object && bType === lib_ZodParsedType.object) { - const bKeys = zod_lib_util.objectKeys(b); - const sharedKeys = zod_lib_util + const bKeys = lib_util.objectKeys(b); + const sharedKeys = lib_util .objectKeys(a) .filter((key) => bKeys.indexOf(key) !== -1); const newObj = { ...a, ...b }; @@ -83165,7 +87354,7 @@ class lib_ZodEnum extends lib_ZodType { const ctx = this._getOrReturnCtx(input); const expectedValues = this._def.values; lib_addIssueToContext(ctx, { - expected: zod_lib_util.joinValues(expectedValues), + expected: lib_util.joinValues(expectedValues), received: ctx.parsedType, code: lib_ZodIssueCode.invalid_type, }); @@ -83217,20 +87406,20 @@ class lib_ZodEnum extends lib_ZodType { lib_ZodEnum.create = lib_createZodEnum; class lib_ZodNativeEnum extends lib_ZodType { _parse(input) { - const nativeEnumValues = zod_lib_util.getValidEnumValues(this._def.values); + const nativeEnumValues = lib_util.getValidEnumValues(this._def.values); const ctx = this._getOrReturnCtx(input); if (ctx.parsedType !== lib_ZodParsedType.string && ctx.parsedType !== lib_ZodParsedType.number) { - const expectedValues = zod_lib_util.objectValues(nativeEnumValues); + const expectedValues = lib_util.objectValues(nativeEnumValues); lib_addIssueToContext(ctx, { - expected: zod_lib_util.joinValues(expectedValues), + expected: lib_util.joinValues(expectedValues), received: ctx.parsedType, code: lib_ZodIssueCode.invalid_type, }); return lib_INVALID; } if (nativeEnumValues.indexOf(input.data) === -1) { - const expectedValues = zod_lib_util.objectValues(nativeEnumValues); + const expectedValues = lib_util.objectValues(nativeEnumValues); lib_addIssueToContext(ctx, { received: ctx.data, code: lib_ZodIssueCode.invalid_enum_value, @@ -83396,7 +87585,7 @@ class lib_ZodEffects extends lib_ZodType { }); } } - zod_lib_util.assertNever(effect); + lib_util.assertNever(effect); } } lib_ZodEffects.create = (schema, effect, params) => { @@ -83480,7 +87669,7 @@ lib_ZodDefault.create = (type, params) => { ...lib_processCreateParams(params), }); }; -class ZodCatch extends lib_ZodType { +class lib_ZodCatch extends lib_ZodType { _parse(input) { const { ctx } = this._processInputParams(input); // newCtx is used to not collect issues from inner types in ctx @@ -83531,8 +87720,8 @@ class ZodCatch extends lib_ZodType { return this._def.innerType; } } -ZodCatch.create = (type, params) => { - return new ZodCatch({ +lib_ZodCatch.create = (type, params) => { + return new lib_ZodCatch({ innerType: type, typeName: lib_ZodFirstPartyTypeKind.ZodCatch, catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, @@ -83575,7 +87764,7 @@ class lib_ZodBranded extends lib_ZodType { return this._def.type; } } -class ZodPipeline extends lib_ZodType { +class lib_ZodPipeline extends lib_ZodType { _parse(input) { const { status, ctx } = this._processInputParams(input); if (ctx.common.async) { @@ -83626,7 +87815,7 @@ class ZodPipeline extends lib_ZodType { } } static create(a, b) { - return new ZodPipeline({ + return new lib_ZodPipeline({ in: a, out: b, typeName: lib_ZodFirstPartyTypeKind.ZodPipeline, @@ -83713,7 +87902,7 @@ const lib_nanType = lib_ZodNaN.create; const lib_bigIntType = lib_ZodBigInt.create; const lib_booleanType = lib_ZodBoolean.create; const lib_dateType = lib_ZodDate.create; -const symbolType = ZodSymbol.create; +const lib_symbolType = lib_ZodSymbol.create; const lib_undefinedType = lib_ZodUndefined.create; const lib_nullType = lib_ZodNull.create; const lib_anyType = lib_ZodAny.create; @@ -83740,11 +87929,11 @@ const lib_effectsType = lib_ZodEffects.create; const lib_optionalType = lib_ZodOptional.create; const lib_nullableType = lib_ZodNullable.create; const lib_preprocessType = lib_ZodEffects.createWithPreprocess; -const pipelineType = ZodPipeline.create; +const lib_pipelineType = lib_ZodPipeline.create; const lib_ostring = () => lib_stringType().optional(); const lib_onumber = () => lib_numberType().optional(); const lib_oboolean = () => lib_booleanType().optional(); -const coerce = { +const lib_coerce = { string: ((arg) => lib_ZodString.create({ ...arg, coerce: true })), number: ((arg) => lib_ZodNumber.create({ ...arg, coerce: true })), boolean: ((arg) => lib_ZodBoolean.create({ @@ -83756,7 +87945,7 @@ const coerce = { }; const lib_NEVER = lib_INVALID; -var z = /*#__PURE__*/Object.freeze({ +var lib_z = /*#__PURE__*/Object.freeze({ __proto__: null, defaultErrorMap: lib_errorMap, setErrorMap: lib_setErrorMap, @@ -83772,7 +87961,7 @@ var z = /*#__PURE__*/Object.freeze({ isDirty: lib_isDirty, isValid: lib_isValid, isAsync: lib_isAsync, - get util () { return zod_lib_util; }, + get util () { return lib_util; }, get objectUtil () { return lib_objectUtil; }, ZodParsedType: lib_ZodParsedType, getParsedType: lib_getParsedType, @@ -83782,7 +87971,7 @@ var z = /*#__PURE__*/Object.freeze({ ZodBigInt: lib_ZodBigInt, ZodBoolean: lib_ZodBoolean, ZodDate: lib_ZodDate, - ZodSymbol: ZodSymbol, + ZodSymbol: lib_ZodSymbol, ZodUndefined: lib_ZodUndefined, ZodNull: lib_ZodNull, ZodAny: lib_ZodAny, @@ -83809,17 +87998,17 @@ var z = /*#__PURE__*/Object.freeze({ ZodOptional: lib_ZodOptional, ZodNullable: lib_ZodNullable, ZodDefault: lib_ZodDefault, - ZodCatch: ZodCatch, + ZodCatch: lib_ZodCatch, ZodNaN: lib_ZodNaN, BRAND: lib_BRAND, ZodBranded: lib_ZodBranded, - ZodPipeline: ZodPipeline, + ZodPipeline: lib_ZodPipeline, custom: lib_custom, Schema: lib_ZodType, ZodSchema: lib_ZodType, late: lib_late, get ZodFirstPartyTypeKind () { return lib_ZodFirstPartyTypeKind; }, - coerce: coerce, + coerce: lib_coerce, any: lib_anyType, array: lib_arrayType, bigint: lib_bigIntType, @@ -83845,14 +88034,14 @@ var z = /*#__PURE__*/Object.freeze({ onumber: lib_onumber, optional: lib_optionalType, ostring: lib_ostring, - pipeline: pipelineType, + pipeline: lib_pipelineType, preprocess: lib_preprocessType, promise: lib_promiseType, record: lib_recordType, set: lib_setType, strictObject: lib_strictObjectType, string: lib_stringType, - symbol: symbolType, + symbol: lib_symbolType, transformer: lib_effectsType, tuple: lib_tupleType, 'undefined': lib_undefinedType, @@ -83887,38 +88076,38 @@ var z = /*#__PURE__*/Object.freeze({ */ /** * {@link AdguardApi} configuration runtime validator - */ const configuration_configurationValidator = z.object({ + */ const configuration_configurationValidator = lib_z.object({ /** * An array of filters identifiers. * * You can look for possible filters identifiers in the filters metadata file. * * @see https://filters.adtidy.org/extension/chromium/filters.json - */ filters: z.number().array(), + */ filters: lib_z.number().array(), /** * An array of domains, for which AdGuard won't work. - */ allowlist: z.string().array().optional(), + */ allowlist: lib_z.string().array().optional(), /** * This property completely changes AdGuard behavior. * * If it is defined, Adguard will work for domains from the {@link blocklist} only. * * All other domains will be ignored. If {@link blocklist} is defined, {@link allowlist} will be ignored. - */ blocklist: z.string().array().optional(), + */ blocklist: lib_z.string().array().optional(), /** * An array of custom filtering rules. * * These custom rules might be created by a user via AdGuard Assistant UI. * * @see https://adguard.com/en/filterrules.html - */ rules: z.string().array().optional(), + */ rules: lib_z.string().array().optional(), /** * An absolute path to a file, containing filters metadata. * * Once started, AdGuard will periodically check filters updates by downloading this file. * * Example: `https://filters.adtidy.org/extension/chromium/filters.json`. - */ filtersMetadataUrl: z.string(), + */ filtersMetadataUrl: lib_z.string(), /** * URL mask used for fetching filters rules. * `{filter_id}` parameter will be replaced with an actual filter identifier. @@ -83926,7 +88115,7 @@ var z = /*#__PURE__*/Object.freeze({ * Example: `https://filters.adtidy.org/extension/chromium/filters/{filter_id}.txt` * * English filter (filter id = 2) will be loaded from: `https://filters.adtidy.org/extension/chromium/2.txt`. - */ filterRulesUrl: z.string() + */ filterRulesUrl: lib_z.string() }); ;// CONCATENATED MODULE: ./src/background/schemas/configuration/index.ts @@ -83972,21 +88161,21 @@ var z = /*#__PURE__*/Object.freeze({ * Filter metadata item runtime validator * * @see https://filters.adtidy.org/extension/chromium/filters.json - */ const filterMetadataValidator = z.object({ - description: z.string(), - displayNumber: z.number(), - expires: z.number(), - filterId: z.number(), - groupId: z.number(), - homepage: z.string(), - languages: z.string().array(), - name: z.string(), - subscriptionUrl: z.string(), - tags: z.number().array(), - timeAdded: z.string(), - timeUpdated: z.string(), - trustLevel: z.string(), - version: z.string() + */ const filterMetadataValidator = lib_z.object({ + description: lib_z.string(), + displayNumber: lib_z.number(), + expires: lib_z.number(), + filterId: lib_z.number(), + groupId: lib_z.number(), + homepage: lib_z.string(), + languages: lib_z.string().array(), + name: lib_z.string(), + subscriptionUrl: lib_z.string(), + tags: lib_z.number().array(), + timeAdded: lib_z.string(), + timeUpdated: lib_z.string(), + trustLevel: lib_z.string(), + version: lib_z.string() }); ;// CONCATENATED MODULE: ./src/background/schemas/metadata/tag.ts @@ -84011,11 +88200,11 @@ var z = /*#__PURE__*/Object.freeze({ * Filter tag metadata item runtime validator * * @see https://filters.adtidy.org/extension/chromium/filters.json - */ const tagMetadataValidator = z.object({ - tagId: z.number(), - keyword: z.string(), - description: z.string().optional(), - name: z.string().optional() + */ const tagMetadataValidator = lib_z.object({ + tagId: lib_z.number(), + keyword: lib_z.string(), + description: lib_z.string().optional(), + name: lib_z.string().optional() }); ;// CONCATENATED MODULE: ./src/background/schemas/metadata/group.ts @@ -84040,10 +88229,10 @@ var z = /*#__PURE__*/Object.freeze({ * Filter group metadata item runtime validator * * @see https://filters.adtidy.org/extension/chromium/filters.json - */ const groupMetadataValidator = z.object({ - displayNumber: z.number(), - groupId: z.number(), - groupName: z.string() + */ const groupMetadataValidator = lib_z.object({ + displayNumber: lib_z.number(), + groupId: lib_z.number(), + groupName: lib_z.string() }); ;// CONCATENATED MODULE: ./src/background/schemas/metadata/metadata.ts @@ -84071,7 +88260,7 @@ var z = /*#__PURE__*/Object.freeze({ * Metadata runtime validator * * @see https://filters.adtidy.org/extension/chromium/filters.json - */ const metadataValidator = z.object({ + */ const metadataValidator = lib_z.object({ filters: filterMetadataValidator.array(), groups: groupMetadataValidator.array(), tags: tagMetadataValidator.array() @@ -84170,10 +88359,10 @@ var z = /*#__PURE__*/Object.freeze({ } /** * {@link zod} runtime validator with {@link castStringToBoolean} preprocessor - */ preprocessor_define_property(SchemaPreprocessor, "booleanValidator", z.preprocess(SchemaPreprocessor.castStringToBoolean, z.boolean())); + */ preprocessor_define_property(SchemaPreprocessor, "booleanValidator", lib_z.preprocess(SchemaPreprocessor.castStringToBoolean, lib_z.boolean())); /** * {@link zod} runtime validator with {@link castStringToNumber} preprocessor - */ preprocessor_define_property(SchemaPreprocessor, "numberValidator", z.preprocess(SchemaPreprocessor.castStringToNumber, z.number())); + */ preprocessor_define_property(SchemaPreprocessor, "numberValidator", lib_z.preprocess(SchemaPreprocessor.castStringToNumber, lib_z.number())); ;// CONCATENATED MODULE: ./src/background/schemas/filter-version/filter-version.ts /** @@ -84196,18 +88385,18 @@ var z = /*#__PURE__*/Object.freeze({ /** * Runtime validator for persistent filter version data - */ const filterVersionDataValidator = z.object({ - version: z.string(), - lastCheckTime: z.number(), - lastUpdateTime: z.number(), - expires: z.number() + */ const filterVersionDataValidator = lib_z.object({ + version: lib_z.string(), + lastCheckTime: lib_z.number(), + lastUpdateTime: lib_z.number(), + expires: lib_z.number() }); /** * Runtime validator for persistent key value storage of filter version data. * * Key is filter metadata id. * Value is {@link FilterVersionData}. - */ const filterVersionStorageDataValidator = z.record(SchemaPreprocessor.numberValidator, filterVersionDataValidator); + */ const filterVersionStorageDataValidator = lib_z.record(SchemaPreprocessor.numberValidator, filterVersionDataValidator); ;// CONCATENATED MODULE: ./src/background/schemas/filter-version/index.ts /** @@ -84415,8 +88604,8 @@ var z = /*#__PURE__*/Object.freeze({ } } -// EXTERNAL MODULE: ../../node_modules/core-js/modules/es.array.push.js -var es_array_push = __webpack_require__(6728); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js +var es_array_push = __webpack_require__(7658); ;// CONCATENATED MODULE: ./src/background/filters/metadata.ts /** * @file @@ -85054,10 +89243,10 @@ update_define_property(FiltersUpdateService, "initDelay", 1000 * 60 * 5) // 5 mi update_define_property(FiltersUpdateService, "checkPeriodMs", 1000 * 60 * 30) // 30 min ; -// EXTERNAL MODULE: ../../node_modules/core-js/modules/es.string.at-alternative.js -var es_string_at_alternative = __webpack_require__(6406); -// EXTERNAL MODULE: ../../node_modules/core-js/modules/es.array.at.js -var es_array_at = __webpack_require__(724); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.string.at-alternative.js +var es_string_at_alternative = __webpack_require__(4506); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.at.js +var es_array_at = __webpack_require__(2262); ;// CONCATENATED MODULE: ./src/background/filters/locale-detect.ts /** * @file diff --git a/packages/adguard-api/dist/adguard-api.js.map b/packages/adguard-api/dist/adguard-api.js.map index f94957d72..f892d6e6d 100644 --- a/packages/adguard-api/dist/adguard-api.js.map +++ b/packages/adguard-api/dist/adguard-api.js.map @@ -1 +1 @@ -{"version":3,"file":"adguard-api.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,uDAAuD,KAAK,cAAc,gBAAgB;AAC1F;;AAEA;AACA;AACA;AACA;AACA;AACA,qEAAqE,YAAY;AACjF;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,gEAAgE,KAAK,cAAc,gBAAgB;AACnG;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY;AAC1F;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,0CAA0C;AAC9H,kGAAkG,mBAAmB;AACrH,kGAAkG,mBAAmB;;AAErH;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS,wBAAwB,QAAQ,iCAAiC,OAAO;AAClG;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS,wBAAwB,QAAQ,iCAAiC,OAAO;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;ACzJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,kBAAkB;AACnD;;AAEA;AACA;;AAEA,cAAc;AACd;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,kBAAkB;AAC1C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,eAAe,SAAS;AACxB,iBAAiB,SAAS,wBAAwB,QAAQ,iCAAiC,OAAO;AAClG;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AA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CA;AACA;AACA;AACA;AACA,OAAO,IAAI;AACX;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;;AAEA;AACA;AACA;AACA;AACA,eAAe,eAAe,6CAA6C;AAC3E,iBAAiB,QAAQ,oBAAoB;AAC7C,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;;AAEA;AACA;AACA;AACA,eAAe,eAAe;AAC9B,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,SAAS;AAC3B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,SAAS;AAC3B,kBAAkB,aAAa;AAC/B;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,8BAA8B,mCAAmC;AACjE;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,kBAAkB,oCAAoC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA,iGAAiG,oCAAoC;AACrI;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,WAAW;AAC5B;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ,iBAAiB;AACxC,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,6BAA6B;AAC9C;AACA;AACA,gGAAgG;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,aAAa;AAC5B,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,eAAe;AACjC,kBAAkB,eAAe;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,iCAAiC;AAChD,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,eAAe,KAAK;AACpB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,mDAAmD,8BAA8B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,SAAS;AACxB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,4BAA4B;AAC5B,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,KAAK;AACpB,eAAe,SAAS;AACxB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,+BAA+B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,wBAAwB;AACxB,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA,eAAe,OAAO;AACtB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,SAAS;AACxB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ;AACzB;AACA,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,UAAU;AAC5B;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,sBAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,6CAA6C;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oJAAoJ,IAAI;AACxJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG,mGAAmG;AACnG;AACA;AACA;AACA;AACA;AACA,uEAAuE,kBAAkB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,wBAAwB;AACxB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,aAAa;AACvF;AACA;AACA,yBAAyB;AACzB;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iCAAiC,kBAAkB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;;AAEvB;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kIAAkI;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kIAAkI;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,OAAO;AAClE;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,eAAe;AAC1E;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF,mFAAmF;AACnF;AACA;AACA,gHAAgH;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF,qGAAqG;AACrG;AACA;AACA;AACA,qJAAqJ;AACrJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yIAAyI;AACzI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,sCAAsC;AACtC;AACA,6BAA6B;AAC7B;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,iBAAiB,QAAQ;AACzB,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+GAA+G;AAC/G;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+GAA+G;AAC/G;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF,mFAAmF;AACnF;AACA;AACA,gHAAgH;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B,mBAAmB,QAAQ;AAC3B,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,kCAAkC;AAC1H;AACA;AACA;AACA,kFAAkF,0CAA0C;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,iBAAiB,gBAAgB;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,2BAA2B;AAC1G;AACA;AACA;AACA;AACA,yEAAyE,2BAA2B;AACpG;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C,IAAI;;AAEhD;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,eAAe;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,eAAe;AAC9B,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA,uDAAuD,EAAE,uBAAuB,GAAG;AACnF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,+BAA+B;AAC9C,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ,iBAAiB,KAAK;AACxE;AACA,oDAAoD,QAAQ,kBAAkB,KAAK;;AAEnF;AACA;AACA;AACA;AACA,sCAAsC,QAAQ,QAAQ,KAAK;AAC3D;AACA,gDAAgD,QAAQ,SAAS,KAAK;AACtE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,sCAAsC,kBAAkB;AACxD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,OAAO;AACxB;AACA;AACA,kCAAkC,iBAAiB,EAAE;AACrD;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAI;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA;AACA;AACA;AACA,iCAAiC;AACjC,wCAAwC;AACxC,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB,wBAAwB,oBAAoB;AAC7G;AACA;AACA;AACA;AACA,sBAAsB,oBAAoB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,+BAA+B;AACjF;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,UAAU,QAAQ,SAAS,YAAY;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD,+CAA+C,sBAAsB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,UAAU;AAC3B,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,yBAAyB;AACzF;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,mBAAmB;AAC7H;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F,6BAA6B;AACxH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,uBAAuB;AACvB,uBAAuB;AACvB,wBAAwB;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB;AACxB;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,yBAAyB;AACzB,4BAA4B;AAC5B,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,oBAAoB;AACpB,sBAAsB;AACtB,qBAAqB;AACrB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,WAAW;AAC/B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,8CAA8C,iBAAiB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,EAAE;AAC7C;AACA,0CAA0C,EAAE,eAAe,EAAE,YAAY;AACzE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+FAA+F,sBAAsB;AACrH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,qBAAqB;AAC7E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,kBAAkB;AACzE;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,QAAQ,0BAA0B;AAClC,2BAA2B,KAAK;AAChC;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA,iFAAiF;AACjF,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ,iEAAiE,sBAAsB;AACvF;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,wEAAwE;AACxE,cAAc;AACd;AACA;AACA,2BAA2B;AAC3B;AACA,YAAY;AACZ,mEAAmE;AACnE,YAAY;AACZ;AACA;AACA,yBAAyB;AACzB;AACA,UAAU;AACV,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA,yEAAyE,0BAA0B;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yBAAyB;AACzB,+BAA+B;AAC/B,qCAAqC;AACrC,2BAA2B;AAC3B,iCAAiC;AACjC,kCAAkC;AAClC,2BAA2B;AAC3B,6BAA6B;AAC7B,+BAA+B;AAC/B,kCAAkC;AAClC,8BAA8B;AAC9B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,4BAA4B;AAC5B,kCAAkC;AAClC,8BAA8B;AAC9B,mCAAmC;AACnC,yCAAyC;AACzC,0CAA0C;AAC1C,kCAAkC;AAClC,wCAAwC,KAAK;AAC7C,mCAAmC;AACnC,yCAAyC,KAAK;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,gBAAgB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA,2BAA2B;AAC3B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,GAAG;AACpC;;AAEA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA,YAAY;AACZ;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,+CAA+C,gCAAgC,oCAAoC,oDAAoD,6DAA6D,iEAAiE,sCAAsC;AAC3U,qCAAqC,gBAAgB,sBAAsB,OAAO,uDAAuD,6DAA6D,2CAA2C,oKAAoK,mFAAmF,KAAK;;AAE7e;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,SAAS;AAC3B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,UAAU;AAC3D;AACA,aAAa;AACb,WAAW,IAAI;AACf,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,eAAe;AACjC,kBAAkB,oBAAoB;AACtC;AACA,kBAAkB,SAAS;AAC3B;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kBAAkB;AAChD;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA,mCAAmC,kBAAkB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,+BAA+B;AAC/B,kCAAkC;AAClC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,IAAI;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,eAAe;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV,mDAAmD,8BAA8B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,6BAA6B;AAC7B,0BAA0B;AAC1B,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,8CAA8C,EAAE;AAChD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6BAA6B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,IAAI;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,eAAe;AACjC,kBAAkB,+BAA+B;AACjD,kBAAkB,QAAQ;AAC1B,kBAAkB,SAAS;AAC3B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrhwBA,eAAe,KAAiD,oBAAoB,CAA2G,CAAC,kBAAkB,mBAAmB,SAAS,cAAc,4BAA4B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AEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;;;;;;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;;;;;;;;;AC/Da;;AAEb,cAAc,GAAG,yCAAmC;AACpD,cAAc,GAAG,6CAAuC;;;;;;;;;ACHxD;AACA,CAAC;;AAED;AACA,mBAAmB,KAA0B;AAC7C;AACA,kBAAkB,KAAyB;AAC3C;AACA,yBAAyB,qBAAM,gBAAgB,qBAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,UAAU;AACtB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,MAAM;AACN,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc,QAAQ;AACtB;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;;AAEzB,0CAA0C,qBAAqB;;AAE/D;AACA;AACA;AACA;AACA;AACA,mCAAmC,oBAAoB;;AAEvD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,eAAe,iBAAiB;AAChC;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,oBAAoB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE,IAEU;AACZ;AACA,EAAE,mCAAmB;AACrB;AACA,GAAG;AAAA,kGAAC;AACJ,GAAG,KAAK,EAUN;;AAEF,CAAC;;;;;;;;;;ACjhBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb,eAAe,mBAAO,CAAC,IAAU;AACjC,WAAW,mBAAO,CAAC,IAAQ;;AAE3B,yBAAa;AACb,yBAAe;AACf,yBAAqB;AACrB,yBAAc;;AAEd,yBAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,KAAK;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,2CAA2C,KAAK;AAChD,0CAA0C,KAAK;AAC/C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,kBAAkB,mBAAO,CAAC,IAAa;;AAEvC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA;AACA;AACA,2CAA2C,OAAO;AAClD;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,2CAA2C,OAAO;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,iBAAiB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3tBa;;AAEb;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;;;;;;;ACfA;AACA,MAAM,IAA0C;AAChD,IAAI,iCAAgC,CAAC,MAAQ,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AACxD,IAAI,KAAK,YAQN;AACH,CAAC;AACD;;AAEA,sCAAsC;;AAEtC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wHAAwH;AACxH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB,SAAS;AAC5B;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA,iDAAiD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC5I;;AAEA;AACA,gDAAgD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC3I;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB,gCAAgC,MAAM;AACtC,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA,6DAA6D,gBAAgB;AAC7E;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,mBAAmB;AACnB;;AAEA,+CAA+C,eAAe;AAC9D;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA,eAAe;AACf;AACA;;AAEA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA,WAAW;;AAEX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oCAAoC;AACrD;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;;AAGA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,GAAG;AACtB;AACA,mBAAmB,QAAQ;AAC3B;AACA,mBAAmB,aAAa;AAChC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA,0EAA0E;AAC1E;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA,aAAa;AACb,aAAa;AACb;AACA;;;AAGA;AACA;AACA,YAAY;AACZ;AACA,YAAY;;;AAGZ;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,+CAA+C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC1I;;AAEA;AACA,8CAA8C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AACzI;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,IAAI;AACJ;AACA;AACA,CAAC;AACD;;;;;;;UCpvCA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;WACA;WACA;WACA;WACA;;;;;;;;;;;;;;;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gBAAgB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC;AACrC;AACA,+CAA+C,KAAK;AACpD;AACA,wCAAwC;AACxC,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,6DAA6D,4BAA4B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2P;;;ACvf5P;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+F;;;ACvD/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEuB;;;AChCvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iDAAiD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,uCAAuC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE0F;;;ACzJqI;AAC+D;AAC9J;AAC5C;AACpC;AACA;AAC2E;AAC5D;;AAE/D;AACA;AACA,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACA,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,kCAAkC;AAClC;AACA;AACA,UAAU,YAAY,aAAa,SAAS,UAAU;AACtD,oCAAoC,SAAS;AAC7C;AACA;AACA;AACA,6EAA6E,OAAO;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wBAAwB;AACpC;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,iKAAiK;AAC5L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAW;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,YAAS;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,oBAAoB,SAAS,kBAAkB;AAChE,yBAAyB,kBAAkB,QAAQ,kBAAkB,aAAa,UAAU,kBAAkB;AAC9G;AACA,CAAC;AACD;AACA,iBAAiB,oBAAoB,SAAS,kBAAkB,oEAAoE,SAAS,oBAAoB,SAAS,kBAAkB,kBAAkB,SAAS,kBAAkB,aAAa,SAAS,kBAAkB,WAAW,SAAS,kBAAkB,WAAW,SAAS,kBAAkB,yDAAyD,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,YAAY,UAAU,kBA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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC,WAAW,YAAS,UAAU,eAAY;AAC1C;AACA,sCAAsC;AACtC,IAAI,cAAW;AACf,WAAW,YAAS,UAAU,eAAY;AAC1C;AACA,0CAA0C;AAC1C,IAAI,cAAW;AACf,WAAW,YAAS,UAAU,eAAY;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,WAAW;AACjD;AACA;AACA;AACA,oBAAoB,mCAAmC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED,sHAAsH,qBAAM,mBAAmB,qBAAM;;AAErJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,0CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;AACF;AACA;;AAEA,sBAAsB;;AAEtB;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,yGAAyG,WAAW,+DAA+D,QAAQ,WAAW,yBAAyB,OAAO;AACtO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB,uBAAuB;AACpF;AACA,sDAAsD;AACtD;AACA;AACA,qCAAqC,qBAAqB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAI;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,8BAA8B,mCAAmC;AACjE;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,oCAAoC;AACrI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR,mDAAmD,8BAA8B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,wBAAwB;AACxB,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,wBAAwB;AACxB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,aAAa;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA,iCAAiC,kBAAkB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,6BAA6B;AAC7B,gCAAgC;AAChC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,IAAI;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,uDAAuD,EAAE,uBAAuB,GAAG;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ,iBAAiB,KAAK;AACxE,oDAAoD,QAAQ,kBAAkB,KAAK;AACnF,sCAAsC,QAAQ,QAAQ,KAAK;AAC3D,gDAAgD,QAAQ,SAAS,KAAK;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,kBAAkB;AACxD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,kCAAkC,iBAAiB,EAAE;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAI;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA;AACA;AACA,wCAAwC;AACxC,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,yBAAyB,wBAAwB,oBAAoB;AAC7G;AACA;AACA;AACA;AACA,sBAAsB,oBAAoB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,+BAA+B;AACjF;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,UAAU,QAAQ,SAAS,YAAY;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD,+CAA+C,sBAAsB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,yBAAyB;AACzF;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,mBAAmB;AAC7H;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F,6BAA6B;AACxH;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,uBAAuB;AACvB,uBAAuB;AACvB,wBAAwB;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB;AACxB;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT,yBAAyB;AACzB,4BAA4B;AAC5B,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,oBAAoB;AACpB,sBAAsB;AACtB,qBAAqB;AACrB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,EAAE;AAC7C;AACA,0CAA0C,EAAE,eAAe,EAAE,YAAY;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,qBAAqB;AAC7E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,kBAAkB;AACzE;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA,iFAAiF;AACjF,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ,iEAAiE,sBAAsB;AACvF;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,wEAAwE;AACxE,cAAc;AACd;AACA;AACA;AACA;AACA,YAAY;AACZ,mEAAmE;AACnE,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA,yEAAyE,0BAA0B;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,gBAAgB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA,YAAY;AACZ;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gCAAgC,oCAAoC,oDAAoD,6DAA6D,iEAAiE,sCAAsC;AAC3U,qCAAqC,gBAAgB,sBAAsB,OAAO,uDAAuD,6DAA6D,2CAA2C,oKAAoK,mFAAmF,KAAK;AAC7e;AACA;AACA;AACA;AACA;AACA,iDAAiD,UAAU;AAC3D;AACA,aAAa;AACb,WAAW,IAAI;AACf,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kBAAkB;AAChD;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA,mCAAmC,kBAAkB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,+BAA+B;AAC/B,kCAAkC;AAClC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,IAAI;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,eAAe;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV,mDAAmD,8BAA8B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,6BAA6B;AAC7B,0BAA0B;AAC1B,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,8CAA8C,EAAE;AAChD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6BAA6B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,IAAI;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mGAAmG,oCAAoC;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,iCAAiC,EAAE,6BAA6B;AAClH;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iCAAiC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,WAAW;AAC9C,mCAAmC,8BAA8B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,KAAK,yBAAyB,GAAG;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,+BAA+B;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc;;AAEd,iBAAiB;;AAEjB;AACA;AACA,oBAAoB,KAAK,QAAQ,KAAK;AACtC;AACA,0GAA0G,EAAE;AAC5G,2BAA2B,IAAI;AAC/B;AACA;AACA,KAAK,MAAM,GAAG,EAAE,KAAK,MAAM;AAC3B,KAAK,MAAM,GAAG,EAAE,KAAK,KAAK,IAAI,MAAM;AACpC,KAAK,MAAM,GAAG,EAAE,MAAM,KAAK,OAAO,MAAM,EAAE,IAAI;AAC9C,KAAK,MAAM,GAAG,EAAE,SAAS,MAAM,EAAE,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,IAAI;AAChE,KAAK,MAAM,GAAG,EAAE,SAAS,MAAM,EAAE,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,IAAI;AAChE,KAAK,MAAM,GAAG,EAAE,SAAS,MAAM,EAAE,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,IAAI;AAChE,KAAK,MAAM,GAAG,EAAE,SAAS,MAAM,EAAE,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,IAAI;AAChE,aAAa,MAAM,EAAE,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,IAAI;AACpD,iBAAiB,GAAG;AACpB;AACA,mCAAmC,KAAK,SAAS,KAAK;AACtD,iCAAiC,KAAK;AACtC,iCAAiC,KAAK;AACtC;AACA;AACA,kBAAkB,WAAW,EAAE,KAAK,EAAE,WAAW,OAAO,WAAW,EAAE,KAAK,EAAE,WAAW;AACvF,wEAAwE,WAAW,EAAE,KAAK,EAAE,WAAW;AACvG,wEAAwE,WAAW,EAAE,KAAK,EAAE,WAAW;AACvG;;AAEA;AACA,qBAAqB;AACrB,iBAAiB,sBAAsB;AACvC,iBAAiB,sBAAsB;AACvC,+BAA+B,MAAM;AACrC,+BAA+B,MAAM;AACrC,mCAAmC,MAAM,SAAS,MAAM;AACxD,sBAAsB,OAAO,sDAAsD,MAAM,OAAO,MAAM;AACtG,yBAAyB,OAAO;AAChC,yBAAyB,OAAO;;AAEhC,OAAO,QAAQ;AACf,gBAAgB,YAAY;AAC5B,gBAAgB,YAAY;AAC5B;AACA;AACA;;AAEA;AACA,gCAAgC,YAAY;AAC5C,gCAAgC,YAAY;AAC5C,gCAAgC,YAAY;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED,uBAAuB,qBAAM,mBAAmB,qBAAM;AACtD;AACA,uDAAuD;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,SAAS;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,SAAS,WAAW;AACpB;AACA;AACA,SAAS,UAAU;AACnB;AACA;;AAEA,mBAAmB;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,EAAE;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,eAAe;AACxC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,yBAAyB,QAAQ;AACjC;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,IAAI;AACJ,gBAAgB,SAAS;AACzB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,CAAC,qBAAqB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,qBAAM,mBAAmB,qBAAM;AACtD;AACA,6CAA6C;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,SAAS;AAC9C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,8BAA8B;;AAE9B;AACA,2CAA2C,UAAU;AACrD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS,WAAW;;AAEpB;AACA;AACA;AACA,SAAS,WAAW;;AAEpB;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA,SAAS,WAAW;;AAEpB;AACA;AACA,SAAS,UAAU;;AAEnB;AACA;;AAEA,IAAI,WAAQ,KAAK;;AAEjB;AACA,SAAS,WAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB;;AAExB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;;AAEA;AACA,oBAAoB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;;AAEA;AACA;AACA,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD,EAAE;AAClD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,sBAAsB;AACtB;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,eAAe;AACxC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,yBAAyB,QAAQ;AACjC;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA,IAAI;AACJ;AACA,gBAAgB,SAAS;AACzB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB,YAAY;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAO;AACX;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAkB;AAClB;AACA;AACA,CAAC,mBAAmB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;;AAEd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,UAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,wBAAwB,SAAS;AACjC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA4C,KAAK;;AAEjD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA,oCAAoC,OAAO;AAC3C,QAAQ,iBAAc;AACtB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;;AAGA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,OAAO,iBAAc;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA,WAAW;AACX;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAc;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA,mDAAmD;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,gDAAgD;;AAEhD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ,sBAAsB;;AAEtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,SAAM;AACxB,SAAS,SAAM;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAM;AAClB;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,gBAAgB;AAChB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kDAAkD,OAAO;AACzD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB,8CAA8C;AAC9C;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS,OAAO;AAChB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,sDAAsD;;AAEtD;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC;;AAEtC;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,UAAU;AAC/B;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,4EAA4E;;AAE5E;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD;AACnD;AACA,mDAAmD,iEAAiE;AACpH;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA,uCAAuC;AACvC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,OAAO;AACxC;AACA;AACA;;AAEA;AACA,iCAAiC,OAAO;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kDAAkD;;AAElD;;AAEA,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;;AAEA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oDAAoD;AACpD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK,EAAE;AACP,GAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA,gCAAgC,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GAAG;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,KAAK;AACL;AACA,gCAAgC;AAChC,KAAK;AACL;AACA,gCAAgC;AAChC,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,gCAAgC,yBAAyB;AACzD;AACA,KAAK;AACL;AACA,gCAAgC,4BAA4B;AAC5D;AACA,KAAK;AACL;AACA,gCAAgC,+BAA+B;AAC/D;AACA;AACA,KAAK;AACL;AACA,gCAAgC,6BAA6B;AAC7D;AACA;AACA,KAAK;AACL;AACA,gCAAgC,+BAA+B;AAC/D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,cAAc;AACd;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,UAAU;AACzD,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,EAAE;AACF;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,gBAAgB;AACtD,IAAI;AACJ,mCAAmC,iCAAiC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8BAA8B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sGAAsG;AACrH;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,iCAAiC;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,8CAA8C;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,mBAAmB;AACnB,2FAA2F;AAC3F;AACA;AACA;AACA;AACA,kBAAkB,8GAA8G;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,yDAAyD,gEAAgE;AACzH;AACA;AACA;AACA,EAAE;AACF,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,uCAAuC,4BAA4B;AACnE;AACA;AACA;AACA;AACA;AACA,cAAc,sBAAsB;AACpC;AACA,uCAAuC,4BAA4B;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,2BAA2B;AACjF;AACA,kDAAkD,2BAA2B;AAC7E;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,gDAAgD;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,0BAA0B;AAC9D,qCAAqC,0BAA0B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,0BAA0B;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB;AACrD,+DAA+D,kBAAkB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD,2BAA2B,8BAA8B;AACzD;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,2BAA2B;AACxE,0CAA0C,2BAA2B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,oBAAoB;AACzE,uCAAuC,uBAAuB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gCAAgC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB;AACnD,+BAA+B,uBAAuB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,oBAAoB;AAC9D;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,kBAAkB;AAC/B;AACA;AACA,aAAa,4BAA4B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,kBAAkB,8BAA8B,IAAI;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,aAAa;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,kBAAkB;AACtD;AACA;AACA,oCAAoC,sBAAsB;AAC1D;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,sBAAsB;AAC1D;AACA;AACA,oCAAoC,uBAAuB;AAC3D;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,uBAAuB;AAC3D;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,kBAAkB;AACtD;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,iBAAiB;AACrD;AACA;AACA,oCAAoC,0BAA0B;AAC9D;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,0BAA0B;AAC9D;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,iBAAiB;AACrD;AACA;AACA,oCAAoC,gBAAgB;AACpD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,gBAAgB;AACpD;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,qBAAqB;AACzD;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,iBAAiB;AACrD;AACA;AACA,oCAAoC,gBAAgB;AACpD;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,gBAAgB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,WAAW;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,2BAA2B;AACpE,0CAA0C,2BAA2B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,aAAa;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,uBAAuB,0EAA0E,IAAI;AACpM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yDAAyD;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,0DAA0D,wCAAwC;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,gBAAgB;AAC7D;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,uBAAuB,0EAA0E,IAAI;AAC3M,8CAA8C,0BAA0B;AACxE;AACA;AACA;AACA,SAAS;AACT,mEAAmE,+CAA+C;AAClH;AACA,kEAAkE;AAClE,+EAA+E;AAC/E;AACA;AACA;AACA;AACA,yEAAyE;AACzE,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wFAAwF,yBAAyB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,SAAS,IAAI;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,uBAAuB,0EAA0E,IAAI;AACzM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,0CAA0C;AACzH;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,4CAA4C;AACjH;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C,uBAAuB,QAAQ;AAC/B;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B,sBAAsB,0BAA0B;AACzG,qCAAqC,iCAAiC,mBAAmB,iCAAiC;AAC1H;AACA;AACA,+BAA+B,0BAA0B,qBAAqB,0BAA0B;AACxG,sCAAsC,0BAA0B;AAChE,qCAAqC,iCAAiC;AACtE;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C,uBAAuB,QAAQ;AAC/B;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,oBAAoB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,CAAC;;AAED,WAAW;;AAEX;AACA,gBAAgB,YAAY,4BAA4B,0CAA0C,QAAQ,iBAAiB,+JAA+J,oBAAoB,0BAA0B,0JAA0J,UAAU,qCAAqC,qBAAqB,2BAA2B,mBAAmB,QAAQ,YAAY,mCAAmC,8DAA8D,sCAAsC,2CAA2C,OAAO,0BAA0B,mDAAmD,SAAS,0BAA0B,sNAAsN,QAAQ,kBAAkB,8LAA8L,QAAQ,0BAA0B,wBAAwB,OAAO,2BAA2B,UAAU,0BAA0B,qNAAqN,QAAQ,iEAAiE,OAAO,0BAA0B,SAAS,0BAA0B,UAAU,YAAY,oBAAoB,0BAA0B,aAAa,8BAA8B,kBAAkB,KAAK,EAAE,sCAAsC,SAAS,iDAAiD,EAAE,SAAS,wBAAwB,QAAQ,SAAS,WAAW,2BAA2B,EAAE,mDAAmD,UAAU,WAAW,gBAAgB,uDAAuD,cAAc,cAAc,wCAAwC,YAAY,6BAA6B,iBAAiB,2BAA2B,8BAA8B,GAAG,uBAAuB,cAAc,cAAc,wCAAwC,YAAY,6BAA6B,iBAAiB,2BAA2B,oBAAoB,GAAG,uBAAuB,cAAc,cAAc,wCAAwC,YAAY,6BAA6B,iBAAiB,2BAA2B,sBAAsB,GAAG,wBAAwB;AACt1F;AACA,EAAE;;AAEF;AACA;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,4CAA4C;AAC5G;AACA;AACA;AACA;AACA,kDAAkD,uBAAuB;AACzE;AACA;AACA;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,QAAQ;AAC7D;AACA;AACA,yEAAyE,2CAA2C;AACpH,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,2EAA2E,0BAA0B;AACrG,+CAA+C,6BAA6B;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C,2BAA2B,iCAAiC,OAAO,qDAAqD;AACxH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,8BAA8B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yBAAyB;AACxC,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,kBAAkB;AAClB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,mEAAmE;AACnE;AACA,oBAAoB;AACpB;AACA,0HAA0H,wBAAwB;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,kBAAkB,QAAQ;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC;AACA;AACA;AACA;AACA;AACA,8BAA8B,iBAAiB;AAC/C,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,mCAAmC,mBAAmB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gCAAgC;AACjD,iBAAiB,sCAAsC;AACvD;AACA,iBAAiB,yCAAyC;AAC1D,iBAAiB,+CAA+C;AAChE;AACA,iBAAiB,sBAAsB;AACvC,iBAAiB,4BAA4B;AAC7C;AACA,iBAAiB,+BAA+B;AAChD,iBAAiB,qCAAqC;AACtD;AACA,iBAAiB,qBAAqB;AACtC;AACA,iBAAiB,8BAA8B;AAC/C;AACA,iBAAiB,uBAAuB;AACxC;AACA,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,yCAAyC;AAC1D,iBAAiB,+CAA+C;AAChE,iBAAiB,+BAA+B;AAChD,iBAAiB,qCAAqC;AACtD,iBAAiB,8BAA8B;AAC/C,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd,iBAAiB;AACjB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,eAAe,oBAAoB;AACnC,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,yBAAyB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,GAAG;AACnD;AACA,CAAC;;AAED;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,gBAAgB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,6BAA6B;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,gCAAgC;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,yCAAyC;AACzC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,sCAAsC;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,+CAA+C;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,4BAA4B;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,2EAA2E,uCAAuC;AAClH;AACA,gFAAgF,wCAAwC;AACxH,8DAA8D,+CAA+C;AAC7G,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,2DAA2D;AAC3G;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iKAAiK,gBAAgB;AACjL;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,wBAAwB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA,8EAA8E,2BAA2B;AACzG;AACA;AACA,mBAAmB,+BAA+B,OAAO,8CAA8C;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,2DAA2D,WAAW,OAAO,WAAW;AACxF;AACA;AACA,0CAA0C,WAAW,OAAO,WAAW;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,+BAA+B,2BAA2B;AAC1D,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAEwoB;;;ACpinCzoB,IAAI,QAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE,QAAI,KAAK,QAAI,KAAK;AACrB,sBAAsB,QAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,QAAI;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAI;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,+BAA+B,QAAI,wBAAwB;AACpH;AACA;AACA,wDAAwD,QAAI,8BAA8B;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,QAAI,2BAA2B;AAC9F;AACA;AACA,sDAAsD,QAAI,2BAA2B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA,oBAAoB,QAAI;AACxB;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,4CAA4C,EAAE,eAAe;AAC7G;AACA,iDAAiD,uCAAuC,EAAE,eAAe;AACzG;AACA,yDAAyD,sCAAsC,EAAE,cAAc;AAC/G;AACA,uDAAuD,sCAAsC,EAAE,wBAAwB;AACvH;AACA;AACA;AACA;AACA;AACA,gDAAgD,2CAA2C,EAAE,eAAe;AAC5G;AACA,iDAAiD,uCAAuC,EAAE,eAAe;AACzG;AACA,sDAAsD,sCAAsC,EAAE,cAAc;AAC5G;AACA,uDAAuD,sCAAsC,EAAE,wBAAwB;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA,YAAY,QAAI;AAChB;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,6BAA6B;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B,8BAA8B,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACtF;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,oCAAoC,wBAAwB,qCAAqC,yBAAyB,QAAQ,GAAG;AACrI;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,QAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,QAAI;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,QAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,QAAI;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,QAAI;AACzB,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,QAAI;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,QAAI;AACZ,gBAAgB,QAAI;AACpB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAI;AAChB,oBAAoB,QAAI;AACxB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,6BAA6B,QAAI;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,sBAAsB,QAAI;AAC1B,2BAA2B,QAAI;AAC/B;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,QAAI;AAC9B;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAI;AACrC;AACA;AACA;AACA,mCAAmC,QAAI;AACvC;AACA,0BAA0B,QAAI;AAC9B;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,mCAAmC,QAAI;AACvC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA,QAAQ,QAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,8BAA8B;AAC7D;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAEwkD;;;AC9hGzkD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,4BAAqB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,8BAAuB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,gBAAS;AACjC;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA,gCAAgC,4BAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,8BAAuB;AAClD;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACe,SAAS,4CAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA,iDAAiD;AACjD;AACe,SAAS,gCAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA,SAAS,oBAAc;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAc;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,UAAI;AAC5B,WAAW,oBAAc,cAAc,oBAAc;AACrD;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qBAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAAe,SAAS,SAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,qBAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA,SAAS,uBAAe,GAAG,iKAAiK;AAC5L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uBAAe,mBAAmB,uBAAe,GAAG;AACnD,SAAS,mBAAW;AAC3B;AACA,eAAe,uBAAe;AAC9B;AACA,2BAA2B,uBAAe;AAC1C;AACA;;AClBA;AACA;AACA;AACe,SAAS,sBAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACiC;AAC4B;AACZ;AACtB;AACc;AACD;AACD;AAChC,SAAS,sBAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAS;AACzB,oCAAoC,mBAAW;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gCAAe,MAAM,QAAe;AAC9D;AACA;AACA,0BAA0B,gCAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,UAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,QAAe;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAS;AAC7B;AACA;AACA;AACA;AACA,uBAAuB,sBAAY;AACnC;AACA;AACA;AACA;AACA,iCAAiC,4CAAsB;AACvD;AACA;AACA;;AClGA,6BAAe,SAAS,UAAC;AACzB,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEuE;AACJ;AACvB;AAC5C;;ACHO,MAAM,eAAU;AACvB,iBAAiB,oBAAoB,SAAS,kBAAkB;AAChE,yBAAyB,kBAAkB,QAAQ,kBAAkB,aAAa,UAAU,kBAAkB;AAC9G;AACA;AACA,CAAC;AACM,MAAM,UAAK;AAClB,iBAAiB,oBAAoB,SAAS,oBAAoB,SAAS,kBAAkB,yDAAyD,SAAS,kBAAkB,WAAW,SAAS,kBAAkB,kBAAkB,SAAS,kBAAkB,aAAa,SAAS,kBAAkB,WAAW,SAAS,kBAAkB,eAAe,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,eAAe,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,gBAAgB,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,mCAAmC,UAAU,kBAAkB,iBAAiB,UAA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AAS,gBAAY,kBAAkB;AAC9C,gCAAgC,UAAM;AACtC,0EAA0E,UAAM;AAChF;AACA;AACO,SAAS,0BAAsB,kBAAkB;AACxD,gCAAgC,UAAM;AACtC,mEAAmE,UAAM;AACzE;AACA;AACA;;;;;AChCqD;AAC9C;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;;;;;;AChC0P;AACvJ;AAC1D;AACpB;AACgC;AAC5B;AACI;AACgB;AACf;;AAEjC,SAAS,YAAS;AAClB,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,gBAAW;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B,UAAQ;AACvC;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;AACA,mCAAmC,WAAS;AAC5C;AACA;AACA;AACA,uCAAuC,UAAQ;AAC/C;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;AACA,mCAAmC,WAAS;AAC5C;AACA;AACA;AACA,uCAAuC,UAAQ;AAC/C;AACA;AACA;AACA;AACA,kBAAkB,WAAS;AAC3B;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAS;AAChC;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAS;AAC7B;AACA;AACA;AACA;AACA,iBAAiB,WAAS;AAC1B,CAAC;AACD;AACA;AACA;AACA,gCAAgC,UAAQ;AACxC;AACA;AACA,iBAAiB,8BAA8B;AAC/C;AACA;AACA,uBAAuB,WAAS;AAChC;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA,sBAAsB,WAAS;AAC/B;AACA;AACA;AACA,kBAAkB,WAAS;AAC3B;AACA;AACA;AACA,wBAAwB,WAAS;AACjC;AACA;AACA;AACA,sBAAsB,WAAS;AAC/B;AACA;AACA;AACA,6BAA6B,UAAQ;AACrC;AACA;AACA;AACA;AACA,kBAAkB,UAAQ;AAC1B;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,+BAA+B,UAAQ;AACvC;AACA;AACA;AACA,kCAAkC,wCAAwC;AAC1E;AACA,eAAe,UAAQ;AACvB;AACA;AACA;AACA,oBAAoB,UAAQ;AAC5B;AACA;AACA;AACA,eAAe,UAAQ;AACvB;AACA;AACA;AACA,aAAa,WAAS;AACtB;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAQ;AACjC,iBAAiB,WAAS;AAC1B,UAAU,cAAY;AACtB,aAAa,WAAS;AACtB,CAAC;AACD;AACA,IAAI,yCAAyC;AAC7C;AACA,8CAA8C,UAAQ;AACtD,gBAAgB,UAAQ;AACxB,iBAAiB,UAAQ;AACzB,iBAAiB,cAAY,CAAC,WAAa;AAC3C,CAAC;AACD;AACA,IAAI,mCAAmC;AACvC;AACA,uCAAuC,UAAQ;AAC/C,iBAAiB,UAAQ;AACzB,CAAC;AACD;AACA,IAAI,0BAA0B;AAC9B;AACA,+BAA+B,UAAQ;AACvC,SAAS,UAAQ;AACjB,CAAC;AACD;AACA,IAAI,kCAAkC;AACtC;AACA,uCAAuC,UAAQ;AAC/C,iBAAiB,UAAQ;AACzB,CAAC;AACD;AACA,IAAI,sCAAsC;AAC1C;AACA,8CAA8C,UAAQ;AACtD,gBAAgB,UAAQ;AACxB,kBAAkB,UAAQ;AAC1B,iBAAiB,UAAQ;AACzB,cAAc,UAAQ;AACtB,cAAc,UAAQ;AACtB,gBAAgB,WAAS;AACzB,CAAC;AACD;AACA,IAAI,iCAAiC;AACrC;AACA,+CAA+C,UAAQ;AACvD,cAAc,UAAQ;AACtB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC,GAAG;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,IAAI;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAS;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yEAAyE;AACjG;AACA;AACA;AACA;AACA;AACA,uBAAuB,yCAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAK;AAC3B,4BAA4B,SAAK;AACjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAM;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA,IAAI,6BAA6B;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,MAAM;AAC7B,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAS;AAC7C,uDAAuD,mCAAmC;AAC1F,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uBAAkB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uBAAkB;AAC3B,QAAQ,uBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAe;AACxB,WAAW,uBAAkB;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,OAAO;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0CAA0C;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,gBAAW;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,YAAY,sCAAsC,IAAI;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,SAAS,mBAAmB;AAC/E;AACA,wCAAwC,aAAa,EAAE,iBAAiB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,6DAA6D;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA,mDAAmD,+CAA4B;AAC/E;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAM,OAAO,oBAAe;AAC5C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,qEAAkD;AAC5E;AACA;AACA,qBAAqB;AACrB;AACA;AACA,0BAA0B,uEAAoD;AAC9E;AACA,qBAAqB;AACrB;AACA;AACA;AACA,gBAAgB,WAAM,mDAAmD,oBAAe,IAAI;AAC5F;AACA;AACA,uBAAuB,kEAA6C;AACpE;AACA;AACA,8BAA8B,oEAAiD;AAC/E;AACA;AACA,yBAAyB;AACzB;AACA;AACA,8BAA8B,sEAAmD;AACjF;AACA,yBAAyB;AACzB;AACA;AACA;AACA,oBAAoB,WAAM,mDAAmD,oBAAe,IAAI;AAChG;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oCAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,uBAAgB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM,oCAAoC,oBAAoB,KAAK,cAAc;AAC7F;AACA;AACA;;AAEA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL,oDAAoD;AACpD;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA,qCAAqC,gCAAgC;AACrE,qCAAqC,gCAAgC;AACrE;AACA;AACA;AACA;AACA,gBAAgB,+CAA+C;AAC/D,4BAA4B,gBAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB;AAC1E;AACA;AACA,kCAAkC,gCAAgC;AAClE,kCAAkC,gCAAgC;AAClE;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,6CAAwB;AAChF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,YAAY,qDAAkC;AAC9C,YAAY,qDAAkC;AAC9C,YAAY,qDAAkC;AAC9C,YAAY,uDAAoC;AAChD,YAAY,6DAA0C;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,wDAAqC;AAC7C,QAAQ,wDAAqC;AAC7C,QAAQ,wDAAqC;AAC7C,QAAQ,0DAAuC;AAC/C,QAAQ,gEAA6C;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,sCAAsC,qCAAkB,GAAG;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,6BAA6B,mDAA8B;AAC3D;AACA;AACA,sCAAsC,qCAAkB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,6CAA0B;AAC5C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,yCAAsB;AACxC,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,iBAAiB,qBAAqB,4BAA4B;AAChG;AACA,iCAAiC,mCAAmC;AACpE,SAAS,6CAA6C;AACtD;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE,IAAI,qCAAqC;AACzC,uCAAuC,+BAA+B;AACtE;AACA,gDAAgD,oBAAoB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,8BAA8B;AAClE;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA,gBAAgB,2BAA2B;AAC3C;AACA;AACA;AACA;AACA,6DAA6D,6CAA6C;AAC1G;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA,2CAA2C,oCAAoC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sCAAmB,GAAG,kBAAkB;AACpD;AACA,gBAAgB,sCAAmB;AACnC,aAAa;AACb;AACA,gBAAgB,WAAM,yDAAyD,EAAE;AACjF,aAAa;AACb;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sCAAmB,UAAU,KAAK;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,+BAA+B;AACnD;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD,wBAAwB,6BAA6B;AACrD,yCAAyC,0BAA0B;AACnE,+BAA+B,cAAc;AAC7C;AACA;AACA,2CAA2C,0BAA0B;AACrE,+BAA+B,cAAc;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C,YAAY,gBAAgB;AAC5B;AACA,yBAAyB,8CAA2B;AACpD;AACA,+BAA+B,4BAA4B;AAC3D,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,MAAM;AACrC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qCAAqC;AACrD,cAAc,YAAY;AAC1B,4BAA4B,SAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA,4BAA4B,SAAO,gBAAgB,oBAAsB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,IAAI,sEAAsE;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E;AAC5F;AACA,sCAAsC,WAAW;AACjD;AACA;AACA;AACA,SAAS,+BAA+B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,aAAa;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,yEAAyE;AAChH;AACA,yBAAyB;AACzB,6BAA6B,aAAa,GAAG;AAC7C,2BAA2B;AAC3B,iBAAiB;AACjB,8DAA8D;AAC9D,+DAA+D;AAC/D,wCAAwC,yCAAyC,EAAE;AACnF,+CAA+C;AAC/C,sCAAsC;AACtC,wCAAwC;AACxC,uCAAuC;AACvC,2EAA2E;AAC3E,iCAAiC;AACjC,6BAA6B;AAC7B,uDAAuD;AACvD,uDAAuD;AACvD,0BAA0B,WAAW;AACrC,0BAA0B,SAAS;AACnC,qCAAqC,cAAc,OAAO;AAC1D,wCAAwC;AACxC,yBAAyB;AACzB,qBAAqB;AACrB,8DAA8D;AAC9D,0DAA0D;AAC1D,sBAAsB,MAAM;AAC5B,oHAAoH;AACpH,qBAAqB;AACrB,iBAAiB;AACjB,6BAA6B;AAC7B,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA,2BAA2B,gDAAgD,EAAE,OAAO;AACpF;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,uBAAuB;AACpC,aAAa,+BAA+B;AAC5C;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB,WAAW,UAAU,YAAY;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8BAA8B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,kCAAkC;AACtD,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,+DAA+D;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD,yBAAyB,+BAA+B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,MAAM;AAC/C;AACA;AACA,6CAA6C,cAAS;AACtD;AACA;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,WAAM,OAAO,oBAAe;AAC5C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,WAAM,OAAO,oBAAe;AAC5C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,2DAA2D,yCAAyC;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,2BAA2B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,SAAS,EAAE,mBAAmB;AACxD,aAAa;AACb;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA,mCAAmC,aAAa,EAAE,mBAAmB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,yCAAyC;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,oCAAoC;AAChH;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB,WAAW,UAAU,YAAY;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa,eAAe,8BAA8B,WAAW,UAAU,YAAY;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA,iBAAiB,2BAA2B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0BAA0B;AAC/D;AACA,2CAA2C;AAC3C,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB,8BAA8B,uBAAuB,4BAA4B;AAChJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,uBAAyB;AACtC;AACA,aAAa,iBAAmB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C,mBAAmB,iBAAiB,SAAS,OAAO,KAAK,2BAA2B;AACpF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,eAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,eAAM;AAC/B;AACA;AACA,uDAAuD,yCAAyC;AAChG;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA,6CAA6C,+CAA+C;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,yCAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,UAAU,EAAE,YAAY;AAC9C;AACA;AACA,QAAQ,iEAA8C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oEAAiD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yCAAsB,KAAK,YAAY,GAAG,KAAK,GAAG,wBAAwB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB,kFAAkF,OAAO;AACzF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,WAAW,EAAE,aAAa,GAAG,kBAAkB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,qCAAqC,sCAAmB;AACxD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM,mDAAmD,MAAM;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,oBAAoB;AACnF;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,2BAA2B;AACtC,QAAQ,qCAAqC;AAC7C;AACA,WAAW,6BAA6B;AACxC;AACA,oCAAoC,8BAA8B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,yBAAyB;AACrE,4CAA4C,0BAA0B;AACtE;AACA;AACA,qEAAqE,qCAAqC;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,qCAAqC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAsB;AAClD,qCAAqC,0BAA0B;AAC/D;AACA;AACA,qCAAqC,uBAAuB;AAC5D;AACA;AACA;AACA,oBAAoB,sCAAmB;AACvC,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yBAAyB;AAC1D;AACA;AACA,iCAAiC,0BAA0B;AAC3D;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uDAAkC,yCAAyC,sBAAsB;AAC5I;AACA;AACA;AACA;AACA,+CAA+C,2DAAsC,6CAA6C,sBAAsB;AACxJ,yCAAyC,qDAAgC,qCAAqC,sBAAsB;AACpI;AACA;AACA;AACA;AACA,6CAA6C,yDAAoC,2CAA2C,sBAAsB;AAClJ,0CAA0C,sDAAiC,wCAAwC,sBAAsB;AACzI,4CAA4C,wDAAmC,0CAA0C,sBAAsB;AAC/I,6CAA6C,yDAAoC,2CAA2C,sBAAsB;AAClJ,uCAAuC,mDAA8B,qCAAqC,sBAAsB;AAChI,2CAA2C,uDAAkC,yCAAyC,sBAAsB;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2FAA2F;AAC3G,cAAc,MAAM;AACpB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2BAA2B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAW,6BAA6B,gBAAW;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,6BAA6B;AAC1F;AACA,oBAAoB;AACpB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0CAA0C;AAC1D;AACA;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wFAAwF;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,qCAAqC,cAAS;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,SAAS;AACT;AACA,sDAAsD,gBAAgB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yFAAyF;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,qCAAqC,cAAS;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,SAAS;AACT;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8DAA8D;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,qCAAqC,cAAS;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4BAA4B;AAC9D;AACA;AACA,qDAAqD,4BAA4B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB,eAAe,qBAAqB;AAC5E;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA,YAAY,WAAM,qEAAqE,eAAe;AACtG;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM,iFAAiF,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,YAAY;AACvE;AACA;AACA,4DAA4D,aAAa;AACzE;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA,2DAA2D,YAAY;AACvE;AACA;AACA,8DAA8D,eAAe;AAC7E;AACA;AACA,gCAAgC,YAAY,GAAG,aAAa;AAC5D;AACA,iCAAiC,UAAU,0BAA0B;AACrE;AACA;AACA,iCAAiC,SAAS,cAAc;AACxD;AACA;AACA,iCAAiC,OAAO,YAAY;AACpD;AACA;AACA,iCAAiC,UAAU,6BAA6B;AACxE;AACA;AACA,iCAAiC;AACjC;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA,yCAAyC;AACzC;AACA;AACA,yCAAyC;AACzC;AACA;AACA,uEAAuE,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA,iCAAiC,WAAW,gBAAgB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD;AACA;AACA;AACA;AACA,gCAAgC,YAAY,GAAG,aAAa;AAC5D,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,sBAAsB,yCAAsB,GAAG,WAAW;AAC1D;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,sBAAsB,sCAAmB;AACzC;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,oCAAoC,yCAAsB;AAC1D;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wCAAwC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM;AAClB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qFAAqF;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,yBAAyB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6EAA6E;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,QAAQ;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,uDAAuD,QAAQ,uFAAuF;AACtJ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM;AAClB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,8CAA8C;AAClE;AACA;AACA;AACA;AACA,qDAAqD,YAAS;AAC9D;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,6BAA6B,oBAAoB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA,6BAA6B,aAAW;AACxC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gFAAgF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C;AACA,6CAA6C,oBAAoB;AACjE;AACA,iBAAiB,UAAU;AAC3B,iBAAiB,UAAU;AAC3B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,UAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2CAA2C;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA,gCAAgC,wDAAwD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,cAAS;AACtD;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mDAAmD;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;;AAEA,IAAI,mBAAc,oGAAoG,qBAAM,mBAAmB,qBAAM;;AAErJ,kBAAkB;;AAElB,uBAAuB;;AAEvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,CAAC,mBAAc,MAAM;AACxB,EAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,MAAM;AACN;AACA,yBAAyB;AACzB,MAAM;AACN;AACA,yBAAyB;AACzB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC,mBAAc,MAAM;AACvB,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uCAAuC;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iCAAiC;AACjD,4BAA4B,iBAAmB,oBAAoB,0BAA4B;AAC/F;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,uBAAyB;AAC1E,oDAAoD,oBAAsB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,sBAAwB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,cAAc;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA;AACA;AACA;AACA;AACA,8DAA8D,cAAc;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAM,0BAA0B,wBAAwB,oBAAoB,+BAA+B;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8BAA8B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,0DAAqC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,0DAAqC;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,oBAAsB;AAC1B,IAAI,uBAAyB;AAC7B,IAAI,kBAAoB;AACxB,IAAI,sBAAwB;AAC5B,IAAI,0BAA4B;AAChC,IAAI,iBAAmB;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8EAA8E;AAC9F;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,aAAW;AACpD;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sCAAsC;AACtD;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gEAA6C;AACrD,QAAQ,uEAAoD;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mEAAgD;AACxD,QAAQ,0EAAuD;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,sBAAsB,4DAAyC;AAC/D;AACA;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,SAAS;AACtC;AACA;AACA;AACA,gBAAgB,+HAA+H;AAC/I,4BAA4B,gBAAW,6BAA6B,gBAAW;AAC/E;AACA,gCAAgC,gBAAW;AAC3C;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,cAAS;AACxC;AACA,6BAA6B,cAAS;AACtC;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4BAA4B,gBAAW,6BAA6B,gBAAW;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,UAAU;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,gBAAgB,uDAAuD;AACvE;AACA;AACA,sDAAsD,mBAAmB;AACzE;AACA;AACA,2CAA2C,gBAAW,6BAA6B,gBAAW;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,UAAU;AACzC;AACA;AACA;AACA,gBAAgB,kEAAkE;AAClF,4BAA4B,gBAAW,6BAA6B,gBAAW;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2BAA2B,KAAK,WAAW;AAC1D;AACA,qDAAqD,iCAAiC;AACtF;AACA,4BAA4B,gBAAW;AACvC;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA,gBAAgB,iEAAiE;AACjF;AACA;AACA,oBAAoB,iCAAiC;AACrD;AACA,yCAAyC,gBAAW;AACpD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,UAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8DAA8D;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,WAAM;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,WAAM;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,kBAAkB,6CAA0B,UAAU,yBAAyB;AAC/E;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,kBAAkB,2CAAwB;AAC1C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,4BAA4B;AAC3E;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,wBAAwB,oBAAoB;AAC5C;AACA,6BAA6B,YAAY;AACzC;AACA;AACA;AACA;AACA,6BAA6B,MAAM;AACnC;AACA;AACA;AACA,iCAAiC,cAAS;AAC1C;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B,UAAQ;AACnC;AACA;AACA;AACA,cAAc,UAAQ;AACtB;AACA;AACA;AACA,aAAa,UAAQ;AACrB;AACA;AACA;AACA,aAAa,WAAS;AACtB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,sCAAsC,qCAAkB,GAAG;AAC3D;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAM;AAC1B;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,qDAAkC,GAAG,OAAO;AAC7E;AACA;AACA;AACA,8BAA8B,cAAc;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAW,YAAY,gBAAW;AACrF;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,wBAAwB,mDAAmD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,iDAAiD,GAAG,MAAM,IAAI;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,uBAAuB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB,aAAa,oBAAoB;AACtE,sCAAsC,qBAAqB,sBAAsB,cAAc;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,YAAY,WAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uBAAuB,iBAAiB,aAAa;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,0EAA0E,8BAA8B;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;A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A,CAAC,EAAE,cAAU,KAAK,cAAU,KAAK;AACjC,MAAM,iBAAa,GAAG,YAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAa;AACnB;AACA;AACA;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA,iCAAiC,iBAAa,OAAO,iBAAa;AAClE;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA;;AAEA,MAAM,gBAAY,GAAG,YAAI;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAa;AACnB;AACA;AACA;AACA,MAAM,YAAQ;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,YAAI;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,YAAQ;AACR,sBAAsB,YAAQ;AAC9B;AACA;;AAEA,MAAM,YAAQ;AACd;AACA;AACA,aAAa,gBAAY;AACzB,mCAAmC,iBAAa;AAChD;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA,aAAa,gBAAY;AACzB,yDAAyD,+BAA+B,YAAI,wBAAwB;AACpH;AACA,aAAa,gBAAY;AACzB,wDAAwD,YAAI,8BAA8B;AAC1F;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB,+DAA+D,YAAI,2BAA2B;AAC9F;AACA,aAAa,gBAAY;AACzB,sDAAsD,YAAI,2BAA2B,cAAc,eAAe;AAClH;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA,oBAAoB,YAAI;AACxB;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA,aAAa,gBAAY;AACzB;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA,aAAa,gBAAY;AACzB;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB,sDAAsD,iBAAiB;AACvE;AACA,aAAa,gBAAY;AACzB;AACA;AACA;AACA;AACA,YAAY,YAAI;AAChB;AACA,aAAa;AACb;;AAEA,IAAI,oBAAgB,GAAG,YAAQ;AAC/B,SAAS,eAAW;AACpB,IAAI,oBAAgB;AACpB;AACA,SAAS,eAAW;AACpB,WAAW,oBAAgB;AAC3B;;AAEA,MAAM,aAAS;AACf,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,cAAU;AAChB,SAAS,qBAAiB;AAC1B,kBAAkB,aAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,eAAW;AACvB,YAAY,YAAQ;AACpB;AACA,KAAK;AACL;AACA;AACA,MAAM,eAAW;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAO;AAC9B;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,eAAe,eAAW;AAC1B;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA,uBAAuB,WAAO;AAC9B;AACA,uBAAuB,WAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,MAAM,WAAO;AACb;AACA,CAAC;AACD,MAAM,SAAK,iBAAiB,wBAAwB;AACpD,MAAM,MAAE,iBAAiB,wBAAwB;AACjD,MAAM,aAAS;AACf,MAAM,WAAO;AACb,MAAM,WAAO;AACb,MAAM,WAAO;;AAEb,IAAI,aAAS;AACb;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,EAAE,aAAS,KAAK,aAAS,KAAK;;AAE/B,MAAM,sBAAkB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,gBAAY;AAClB,QAAQ,WAAO;AACf,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,YAAQ;AAC1C;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS,uBAAmB;AAC5B;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA,MAAM,WAAO;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAa;AAC5B;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAa;AACrC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,wBAAwB,eAAW;AACnC;AACA;AACA;AACA,4BAA4B,iBAAa;AACzC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,YAAY,WAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,wBAAwB,iBAAa;AACrC;AACA,yCAAyC,mCAAmC;AAC5E,eAAe,gBAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,wBAAwB,iBAAa;AACrC;AACA,+CAA+C,mCAAmC;AAClF,8BAA8B,WAAO;AACrC;AACA;AACA,eAAe,gBAAY;AAC3B;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mBAAmB,cAAU;AAC7B;AACA,sBAAsB,yBAAqB;AAC3C,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,eAAW;AAC1B;AACA;AACA,eAAe,eAAW;AAC1B;AACA;AACA;AACA;AACA;AACA,eAAe,YAAQ;AACvB;AACA;AACA,eAAe,cAAU;AACzB;AACA;AACA,eAAe,YAAQ;AACvB;AACA;AACA,eAAe,mBAAe;AAC9B;AACA;AACA,mBAAmB,cAAU;AAC7B,eAAe,uBAAmB;AAClC;AACA,sBAAsB,yBAAqB;AAC3C,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA,mBAAmB,cAAU;AAC7B,eAAe,uBAAmB;AAClC;AACA;AACA,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA,mBAAmB,cAAU;AAC7B,sBAAsB,yBAAqB;AAC3C;AACA,eAAe,uBAAmB;AAClC,SAAS;AACT;AACA;AACA;AACA;AACA,eAAe,uBAAmB;AAClC;AACA;AACA,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAS,aAAa,GAAG;AAC/B;AACA,sCAAsC,GAAG;AACzC,MAAM,aAAS,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACtF;AACA;A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C9C;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,qBAAqB,cAAU;AAC/B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,YAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kBAAkB,aAAS,oBAAoB;AAC/E;AACA;AACA,gCAAgC,gBAAgB,aAAS,oBAAoB;AAC7E;AACA;AACA,gCAAgC,kBAAkB,aAAS,oBAAoB;AAC/E;AACA;AACA,gCAAgC,iBAAiB,aAAS,oBAAoB;AAC9E;AACA;AACA,gCAAgC,iBAAiB,aAAS,oBAAoB;AAC9E;AACA;AACA,gCAAgC,kBAAkB,aAAS,oBAAoB;AAC/E;AACA;AACA,gCAAgC,iBAAiB,aAAS,oBAAoB;AAC9E;AACA;AACA,gCAAgC,eAAe,aAAS,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAS;AACT;AACA,eAAe,aAAS;AACxB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA;AACA,SAAS,sBAAkB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA,2BAA2B,eAAW;AACtC;AACA;AACA,qBAAqB,YAAI;AACzB;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,oBAAoB,sBAAkB;AACtC;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,YAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,aAAS;AACtC,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,YAAI;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA,2BAA2B,eAAW;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,YAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,aAAS;AACtC,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAS;AACT;AACA,eAAe,aAAS;AACxB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,eAAe,MAAE;AACjB;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,WAAO,SAAS,WAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,2BAA2B,eAAW;AACtC;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,YAAI;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAO;AAC1B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAO;AACP,eAAe,WAAO;AACtB;AACA;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,wBAAwB,WAAO;AAC/B;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB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AACA;AACA;AACA;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,SAAS,kBAAc;AACvB,0BAA0B,aAAS;AACnC;AACA;AACA;AACA,4BAA4B,eAAW,QAAQ,kBAAc;AAC7D;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA,+BAA+B,YAAQ;AACvC,mBAAmB,YAAQ;AAC3B;AACA,kBAAkB,kBAAc;AAChC,SAAS;AACT;AACA,+BAA+B,eAAW;AAC1C,eAAe,eAAW,QAAQ,kBAAc;AAChD;AACA,+BAA+B,eAAW;AAC1C,eAAe,eAAW,QAAQ,kBAAc;AAChD;AACA,+BAA+B,YAAQ;AACvC,eAAe,YAAQ,mCAAmC,kBAAc;AACxE;AACA;AACA;AACA;AACA;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,YAAI;AACzB,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA,4CAA4C,YAAQ;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD,+CAA+C,sBAAkB;AACjE;AACA,aAAa;AACb;AACA,0CAA0C,YAAQ;AAClD;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD,+CAA+C,sBAAkB;AACjE;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA,uBAAuB,eAAW;AAClC,aAAa;AACb;AACA;AACA,mBAAmB,eAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,aAAS;AACjB,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,aAAS;AACxD;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAS;AACpC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,YAAI;AACZ;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,YAAI;AACZ;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAc;AAC7B;AACA;AACA;AACA,QAAQ,YAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,YAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,eAAW;AACtD;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,iBAAa,CAAC,YAAI;AACjC;AACA;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA;AACA,kBAAkB,YAAQ;AAC1B,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA;AACA,kBAAkB,YAAQ;AAC1B,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA;AACA,kBAAkB,YAAQ;AAC1B,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,YAAQ,SAAS,WAAO;AAC9B;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,YAAQ;AACpE,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,YAAQ;AACnE,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,YAAQ;AACR,eAAe,YAAQ;AACvB;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,WAAO;AAC/B;AACA;AACA,6BAA6B,cAAU;AACvC;AACA;AACA,6BAA6B,cAAU;AACvC;AACA;AACA,6BAA6B,WAAO;AACpC;AACA;AACA,6BAA6B,iBAAa;AAC1C;AACA;AACA;AACA,6BAA6B,cAAU;AACvC;AACA;AACA,6BAA6B,gBAAY;AACzC;AACA;AACA,6BAA6B,WAAO;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,yBAAqB,SAAS,WAAO;AAC3C;AACA,gBAAgB,MAAM;AACtB,+BAA+B,iBAAa;AAC5C,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC;AACA;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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B;AAClC,SAAS;AACT;AACA;AACA,MAAM,UAAM,SAAS,WAAO;AAC5B;AACA,gBAAgB,cAAc;AAC9B,+BAA+B,iBAAa;AAC5C,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,wCAAwC,sBAAkB;AAC1D,4CAA4C,sBAAkB;AAC9D;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,WAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,UAAM;AACN,eAAe,UAAM;AACrB;AACA;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,UAAM,SAAS,WAAO;AAC5B;AACA,gBAAgB,cAAc;AAC9B,+BAA+B,iBAAa;AAC5C,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA,gBAAgB,qBAAiB;AACjC,0BAA0B,gBAAY;AACtC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAiB;AACjC,0BAA0B,gBAAY;AACtC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAO;AAClC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,sFAAsF,sBAAkB;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAM;AACzB;AACA,uBAAuB,yBAAyB,aAAS,oBAAoB;AAC7E,SAAS;AACT;AACA;AACA,mBAAmB,UAAM;AACzB;AACA,uBAAuB,yBAAyB,aAAS,oBAAoB;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAM;AACN,eAAe,UAAM;AACrB;AACA;AACA;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,eAAW,SAAS,WAAO;AACjC;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB,+BAA+B,iBAAa;AAC5C,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAW;AAC/B,oBAAoB,YAAQ;AAC5B;AACA;AACA,0BAA0B,gBAAY;AACtC;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAW;AAC/B,oBAAoB,YAAQ;AAC5B;AACA;AACA,0BAA0B,gBAAY;AACtC;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA,yCAAyC,cAAU;AACnD,mBAAmB,MAAE;AACrB,kCAAkC,YAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA,mBAAmB,MAAE;AACrB;AACA;AACA,8BAA8B,YAAQ;AACtC;AACA;AACA;AACA;AACA,8BAA8B,YAAQ;AACtC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAW;AAC9B;AACA,kBAAkB,YAAQ,oBAAoB,cAAU;AACxD,SAAS;AACT;AACA;AACA,mBAAmB,eAAW;AAC9B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,eAAW;AAC9B;AACA;AACA,kBAAkB,YAAQ,iBAAiB,cAAU;AACrD,gCAAgC,cAAU;AAC1C,sBAAsB,yBAAqB;AAC3C,eAAe,uBAAmB;AAClC,SAAS;AACT;AACA;AACA,MAAM,WAAO,SAAS,WAAO;AAC7B;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA,WAAO;AACP,eAAe,WAAO;AACtB;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA;AACA;AACA,YAAY,qBAAiB;AAC7B;AACA,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,SAAS,iBAAa;AACtB,eAAe,WAAO;AACtB;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,WAAO,SAAS,WAAO;AAC7B;AACA;AACA;AACA;AACA,YAAY,qBAAiB;AAC7B,0BAA0B,YAAI;AAC9B;AACA,sBAAsB,gBAAY;AAClC,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA,YAAY,qBAAiB;AAC7B;AACA,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,eAAe,MAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,WAAO;AACtB;AACA;AACA,eAAe,WAAO;AACtB;AACA;AACA,WAAO,UAAU,iBAAa;AAC9B,MAAM,iBAAa,SAAS,WAAO;AACnC;AACA,iCAAiC,YAAI;AACrC;AACA,+BAA+B,iBAAa;AAC5C,+BAA+B,iBAAa;AAC5C,mCAAmC,YAAI;AACvC,YAAY,qBAAiB;AAC7B,0BAA0B,YAAI;AAC9B;AACA,sBAAsB,gBAAY;AAClC,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA,mCAAmC,YAAI;AACvC,YAAY,qBAAiB;AAC7B;AACA,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,eAAe,MAAE;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAa;AACb,eAAe,iBAAa;AAC5B;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB,+BAA+B,iBAAa;AAC5C;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,+CAA+C,iBAAa;AAC5D;AACA;AACA,eAAe,MAAE;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA;AACA;AACA;AACA,kDAAkD,yBAAqB;AACvE;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,qBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,2BAA2B,WAAO;AAClC;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA,+BAA+B,WAAO;AACtC;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,qBAAqB,WAAO;AAC5B;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA,yBAAyB,WAAO;AAChC;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA,QAAQ,YAAI;AACZ;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,2CAA2C;AAC7D,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,eAAW,SAAS,WAAO;AACjC;AACA;AACA,2BAA2B,iBAAa;AACxC,mBAAmB,MAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAW;AACX,eAAe,eAAW;AAC1B;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,eAAW,SAAS,WAAO;AACjC;AACA;AACA,2BAA2B,iBAAa;AACxC,mBAAmB,MAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAW;AACX,eAAe,eAAW;AAC1B;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA,gBAAgB,MAAM;AACtB;AACA,+BAA+B,iBAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,yBAAqB;AACvC;AACA;AACA;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,uBAAuB,WAAO;AAC9B;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,YAAY,WAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,YAAQ;AACnD,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,YAAQ;AAC/C,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,UAAM,SAAS,WAAO;AAC5B;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,iBAAiB;AACjB;AACA;AACA,UAAM;AACN,eAAe,UAAM;AACrB,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,SAAK;AACX,MAAM,cAAU,SAAS,WAAO;AAChC;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,0BAA0B,WAAO;AACjC;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,2BAA2B,WAAO;AAClC;AACA;AACA,2BAA2B,SAAK;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,uBAAuB,WAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA,MAAM,UAAM,sBAAsB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA,eAAe,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","sources":["webpack://@adguard/api/webpack/universalModuleDefinition","webpack://@adguard/api/../../node_modules/@adguard/filters-downloader/src/browser/file-download-wrapper.js","webpack://@adguard/api/../../node_modules/@adguard/filters-downloader/src/filters-downloader-creator.js","webpack://@adguard/api/../../node_modules/@adguard/filters-downloader/src/index.browser.js","webpack://@adguard/api/../../node_modules/@adguard/scriptlets/dist/umd/scriptlets.umd.js","webpack://@adguard/api/../../node_modules/bowser/es5.js","webpack://@adguard/api/../../node_modules/core-js/internals/a-callable.js","webpack://@adguard/api/../../node_modules/core-js/internals/a-possible-prototype.js","webpack://@adguard/api/../../node_modules/core-js/internals/add-to-unscopables.js","webpack://@adguard/api/../../node_modules/core-js/internals/an-object.js","webpack://@adguard/api/../../node_modules/core-js/internals/array-includes.js","webpack://@adguard/api/../../node_modules/core-js/internals/array-set-length.js","webpack://@adguard/api/../../node_modules/core-js/internals/classof-raw.js","webpack://@adguard/api/../../node_modules/core-js/internals/classof.js","webpack://@adguard/api/../../node_modules/core-js/internals/copy-constructor-properties.js","webpack://@adguard/api/../../node_modules/core-js/internals/create-non-enumerable-property.js","webpack://@adguard/api/../../node_modules/core-js/internals/create-property-descriptor.js","webpack://@adguard/api/../../node_modules/core-js/internals/define-built-in.js","webpack://@adguard/api/../../node_modules/core-js/internals/define-global-property.js","webpack://@adguard/api/../../node_modules/core-js/internals/descriptors.js","webpack://@adguard/api/../../node_modules/core-js/internals/document-all.js","webpack://@adguard/api/../../node_modules/core-js/internals/document-create-element.js","webpack://@adguard/api/../../node_modules/core-js/internals/does-not-exceed-safe-integer.js","webpack://@adguard/api/../../node_modules/core-js/internals/engine-user-agent.js","webpack://@adguard/api/../../node_modules/core-js/internals/engine-v8-version.js","webpack://@adguard/api/../../node_modules/core-js/internals/enum-bug-keys.js","webpack://@adguard/api/../../node_modules/core-js/internals/error-stack-clear.js","webpack://@adguard/api/../../node_modules/core-js/internals/error-stack-install.js","webpack://@adguard/api/../../node_modules/core-js/internals/error-stack-installable.js","webpack://@adguard/api/../../node_modules/core-js/internals/export.js","webpack://@adguard/api/../../node_modules/core-js/internals/fails.js","webpack://@adguard/api/../../node_modules/core-js/internals/function-apply.js","webpack://@adguard/api/../../node_modules/core-js/internals/function-bind-native.js","webpack://@adguard/api/../../node_modules/core-js/internals/function-call.js","webpack://@adguard/api/../../node_modules/core-js/internals/function-name.js","webpack://@adguard/api/../../node_modules/core-js/internals/function-uncurry-this-accessor.js","webpack://@adguard/api/../../node_modules/core-js/internals/function-uncurry-this.js","webpack://@adguard/api/../../node_modules/core-js/internals/get-built-in.js","webpack://@adguard/api/../../node_modules/core-js/internals/get-method.js","webpack://@adguard/api/../../node_modules/core-js/internals/global.js","webpack://@adguard/api/../../node_modules/core-js/internals/has-own-property.js","webpack://@adguard/api/../../node_modules/core-js/internals/hidden-keys.js","webpack://@adguard/api/../../node_modules/core-js/internals/html.js","webpack://@adguard/api/../../node_modules/core-js/internals/ie8-dom-define.js","webpack://@adguard/api/../../node_modules/core-js/internals/indexed-object.js","webpack://@adguard/api/../../node_modules/core-js/internals/inherit-if-required.js","webpack://@adguard/api/../../node_modules/core-js/internals/inspect-source.js","webpack://@adguard/api/../../node_modules/core-js/internals/install-error-cause.js","webpack://@adguard/api/../../node_modules/core-js/internals/internal-state.js","webpack://@adguard/api/../../node_modules/core-js/internals/is-array.js","webpack://@adguard/api/../../node_modules/core-js/internals/is-callable.js","webpack://@adguard/api/../../node_modules/core-js/internals/is-forced.js","webpack://@adguard/api/../../node_modules/core-js/internals/is-null-or-undefined.js","webpack://@adguard/api/../../node_modules/core-js/internals/is-object.js","webpack://@adguard/api/../../node_modules/core-js/internals/is-pure.js","webpack://@adguard/api/../../node_modules/core-js/internals/is-symbol.js","webpack://@adguard/api/../../node_modules/core-js/internals/length-of-array-like.js","webpack://@adguard/api/../../node_modules/core-js/internals/make-built-in.js","webpack://@adguard/api/../../node_modules/core-js/internals/math-trunc.js","webpack://@adguard/api/../../node_modules/core-js/internals/normalize-string-argument.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-create.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-define-properties.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-define-property.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-get-own-property-names.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-is-prototype-of.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-keys-internal.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-keys.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-property-is-enumerable.js","webpack://@adguard/api/../../node_modules/core-js/internals/object-set-prototype-of.js","webpack://@adguard/api/../../node_modules/core-js/internals/ordinary-to-primitive.js","webpack://@adguard/api/../../node_modules/core-js/internals/own-keys.js","webpack://@adguard/api/../../node_modules/core-js/internals/proxy-accessor.js","webpack://@adguard/api/../../node_modules/core-js/internals/require-object-coercible.js","webpack://@adguard/api/../../node_modules/core-js/internals/shared-key.js","webpack://@adguard/api/../../node_modules/core-js/internals/shared-store.js","webpack://@adguard/api/../../node_modules/core-js/internals/shared.js","webpack://@adguard/api/../../node_modules/core-js/internals/symbol-constructor-detection.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-absolute-index.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-indexed-object.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-integer-or-infinity.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-length.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-object.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-primitive.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-property-key.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-string-tag-support.js","webpack://@adguard/api/../../node_modules/core-js/internals/to-string.js","webpack://@adguard/api/../../node_modules/core-js/internals/try-to-string.js","webpack://@adguard/api/../../node_modules/core-js/internals/uid.js","webpack://@adguard/api/../../node_modules/core-js/internals/use-symbol-as-uid.js","webpack://@adguard/api/../../node_modules/core-js/internals/v8-prototype-define-bug.js","webpack://@adguard/api/../../node_modules/core-js/internals/weak-map-basic-detection.js","webpack://@adguard/api/../../node_modules/core-js/internals/well-known-symbol.js","webpack://@adguard/api/../../node_modules/core-js/internals/wrap-error-constructor-with-cause.js","webpack://@adguard/api/../../node_modules/core-js/modules/es.array.at.js","webpack://@adguard/api/../../node_modules/core-js/modules/es.array.includes.js","webpack://@adguard/api/../../node_modules/core-js/modules/es.array.push.js","webpack://@adguard/api/../../node_modules/core-js/modules/es.error.cause.js","webpack://@adguard/api/../../node_modules/core-js/modules/es.string.at-alternative.js","webpack://@adguard/api/../../node_modules/lru_map/dist/lru.js","webpack://@adguard/api/../../node_modules/querystring/decode.js","webpack://@adguard/api/../../node_modules/querystring/encode.js","webpack://@adguard/api/../../node_modules/querystring/index.js","webpack://@adguard/api/../../node_modules/url/node_modules/punycode/punycode.js","webpack://@adguard/api/../../node_modules/url/url.js","webpack://@adguard/api/../../node_modules/url/util.js","webpack://@adguard/api/../../node_modules/webextension-polyfill/dist/browser-polyfill.js","webpack://@adguard/api/webpack/bootstrap","webpack://@adguard/api/webpack/runtime/compat get default export","webpack://@adguard/api/webpack/runtime/define property getters","webpack://@adguard/api/webpack/runtime/global","webpack://@adguard/api/webpack/runtime/hasOwnProperty shorthand","webpack://@adguard/api/webpack/runtime/make namespace object","webpack://@adguard/api/webpack/runtime/node module decorator","webpack://@adguard/api/../tsurlfilter/dist/es/simple-regex-40f65170.js","webpack://@adguard/api/../tsurlfilter/dist/es/network-rule-options.js","webpack://@adguard/api/../tsurlfilter/dist/es/request-type.js","webpack://@adguard/api/../tsurlfilter/dist/es/cosmetic-rule-marker.js","webpack://@adguard/api/../tsurlfilter/dist/es/index.js","webpack://@adguard/api/../../node_modules/zod/lib/index.mjs","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/domain.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/domain-without-suffix.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/extract-hostname.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/is-ip.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/is-valid.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/options.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/subdomain.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/factory.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/src/lookup/fast-path.js","webpack://@adguard/api/../../node_modules/tldts-core/dist/es6/index.js","webpack://@adguard/api/../../node_modules/tldts/dist/es6/src/data/trie.js","webpack://@adguard/api/../../node_modules/tldts/dist/es6/src/suffix-trie.js","webpack://@adguard/api/../../node_modules/tldts/dist/es6/index.js","webpack://@adguard/api/../tswebextension/node_modules/nanoid/index.browser.js","webpack://@adguard/api/../tswebextension/dist/index.js","webpack://@adguard/api/./src/background/utils/version.ts","webpack://@adguard/api/./src/background/utils/browser-utils.ts","webpack://@adguard/api/./src/background/utils/user-agent.ts","webpack://@adguard/api/./src/background/utils/i18n.ts","webpack://@adguard/api/./src/background/utils/index.ts","webpack://@adguard/api/./node_modules/zod/lib/index.mjs","webpack://@adguard/api/./src/background/schemas/configuration/configuration.ts","webpack://@adguard/api/./src/background/schemas/configuration/index.ts","webpack://@adguard/api/./src/background/schemas/metadata/filter.ts","webpack://@adguard/api/./src/background/schemas/metadata/tag.ts","webpack://@adguard/api/./src/background/schemas/metadata/group.ts","webpack://@adguard/api/./src/background/schemas/metadata/metadata.ts","webpack://@adguard/api/./src/background/schemas/metadata/index.ts","webpack://@adguard/api/./src/background/schemas/preprocessor.ts","webpack://@adguard/api/./src/background/schemas/filter-version/filter-version.ts","webpack://@adguard/api/./src/background/schemas/filter-version/index.ts","webpack://@adguard/api/./src/background/schemas/index.ts","webpack://@adguard/api/./src/background/network.ts","webpack://@adguard/api/./src/background/storage.ts","webpack://@adguard/api/./src/background/filters/metadata.ts","webpack://@adguard/api/./src/background/filters/versions.ts","webpack://@adguard/api/./src/background/filters/rules.ts","webpack://@adguard/api/./src/background/notifier.ts","webpack://@adguard/api/./src/background/filters/api.ts","webpack://@adguard/api/./src/background/filters/update.ts","webpack://@adguard/api/./src/background/filters/locale-detect.ts","webpack://@adguard/api/./src/background/filters/index.ts","webpack://@adguard/api/./src/background/request-blocking-logger.ts","webpack://@adguard/api/./src/background/logger.ts","webpack://@adguard/api/./constants.ts","webpack://@adguard/api/./src/background/main.ts","webpack://@adguard/api/./src/background/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/**\n * This file is part of Adguard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension).\n *\n * Adguard Browser Extension is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard Browser Extension is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with Adguard Browser Extension. If not, see .\n */\n\n/**\n * As it is not possible to use one library in node and browser environments,\n * we have to implementation of simple file download interface.\n * The one for node uses axios, the one for browser XMLHttpRequest.\n *\n * @type {{getLocalFile, getExternalFile}}\n */\nmodule.exports = (() => {\n 'use strict';\n\n /**\n * If url protocol is not http or https return true, else false\n * @param url\n * @returns {boolean}\n */\n const isLocal = (url) => {\n const parsedUrl = new URL(url);\n const protocols = ['http:', 'https:'];\n return !protocols.includes(parsedUrl.protocol);\n };\n\n /**\n * Executes async request via fetch\n * fetch doesn't allow to download urls with file:// scheme\n *\n * @param url Url\n * @param contentType Content type\n * @returns {Promise}\n */\n const executeRequestAsyncFetch = async (url, contentType) => {\n const response = await fetch(url, {\n cache: 'no-cache',\n headers: {\n Pragma: 'no-cache',\n 'Content-Type': contentType,\n }\n });\n\n if (response.status !== 200 && response.status !== 0) {\n throw new Error(`Response status for url ${url} is invalid: ${response.status}`);\n }\n\n // Don't check response headers if url is local,\n // because edge extension doesn't provide headers for such url\n if (!isLocal(response.url)) {\n const responseContentType = response.headers.get('Content-Type');\n if (!responseContentType || !responseContentType.includes(contentType)) {\n throw new Error(`Response content type should be: \"${contentType}\"`);\n }\n }\n\n const responseText = await response.text();\n\n return responseText.trim().split(/[\\r\\n]+/);\n };\n\n /**\n * Executes async request via XMLHttpRequest\n * XMLHttpRequest is undefined in the service worker\n *\n * @param {string} url Url\n * @param {string} contentType Content type\n * @returns {Promise}\n */\n const executeRequestAsyncXhr = (url, contentType) => {\n return new Promise((resolve, reject) => {\n const onRequestLoad = (response) => {\n if (response.status !== 200 && response.status !== 0) {\n reject(new Error(`Response status for url ${url} is invalid: ${response.status}`));\n }\n\n const responseText = response.responseText ? response.responseText : response.data;\n\n // Don't check response headers if url is local,\n // because edge extension doesn't provide headers for such url\n if (!isLocal(response.responseURL)) {\n const responseContentType = response.getResponseHeader('Content-Type');\n if (!responseContentType || !responseContentType.includes(contentType)) {\n reject(new Error(`Response content type should be: \"${contentType}\"`));\n }\n }\n const lines = responseText.trim().split(/[\\r\\n]+/);\n resolve(lines);\n };\n\n const request = new XMLHttpRequest();\n\n try {\n request.open('GET', url);\n request.setRequestHeader('Pragma', 'no-cache');\n request.overrideMimeType(contentType);\n request.mozBackgroundRequest = true;\n request.onload = function () {\n onRequestLoad(request);\n };\n request.onerror = () => reject(new Error(`Request error happened: ${request.statusText || 'status text empty'}`));\n request.onabort = () => reject(new Error(`Request was aborted with status text: ${request.statusText}`));\n request.ontimeout = () => reject(new Error(`Request timed out with status text: ${request.statusText}`));\n\n request.send(null);\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n /**\n * Downloads filter rules from external url\n *\n * @param {string} url Filter file absolute URL or relative path\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const getExternalFile = (url) => {\n return executeRequestAsyncFetch(url, 'text/plain');\n };\n\n /**\n * Get filter rules from local path\n *\n * @param {string} url local path\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const getLocalFile = (url) => {\n if (typeof XMLHttpRequest !== 'undefined') {\n return executeRequestAsyncXhr(url, 'text/plain');\n }\n if (typeof fetch !== 'undefined') {\n return executeRequestAsyncFetch(url, 'text/plain');\n }\n throw new Error('XMLHttpRequest or fetch are undefined, getting local files inside service worker is not working');\n };\n\n return {\n getLocalFile: getLocalFile,\n getExternalFile: getExternalFile,\n };\n})();\n","/**\n * This file is part of Adguard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension).\n *\n * Adguard Browser Extension is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard Browser Extension is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with Adguard Browser Extension. If not, see .\n */\n\n/**\n * The utility tool resolves preprocessor directives in filter content.\n *\n * Directives syntax:\n * !#if, !#endif - filters maintainers can use these conditions to supply different rules depending on the ad blocker type.\n * condition - just like in some popular programming languages, pre-processor conditions are based on constants declared by ad blockers. Ad blocker authors define on their own what exact constants do they declare.\n * !#include - this directive allows to include contents of a specified file into the filter.\n *\n * Condition constants should be declared in FilterCompilerConditionsConstants\n *\n * More details:\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/917\n */\nconst FiltersDownloaderCreator = (FileDownloadWrapper) => {\n \"use strict\";\n\n const CONDITION_DIRECTIVE_START = \"!#if\";\n const CONDITION_DIRECTIVE_END = \"!#endif\";\n\n const CONDITION_OPERATOR_NOT = \"!\";\n const CONDITION_OPERATOR_AND = \"&&\";\n const CONDITION_OPERATOR_OR = \"||\";\n const CONDITION_BRACKET_OPEN_CHAR = \"(\";\n const CONDITION_BRACKET_CLOSE_CHAR = \")\";\n\n const INCLUDE_DIRECTIVE = \"!#include\";\n\n const REGEXP_ABSOLUTE_URL = /^([a-z]+:\\/\\/|\\/\\/)/i;\n const REGEXP_EXTERNAL_ABSOLUTE_URL = /^((?!file)[a-z]+:\\/\\/|\\/\\/)/i;\n\n /**\n * Checks brackets in string\n *\n * @param str\n */\n const checkBracketsBalance = (str) => {\n let depth = 0;\n for (let i in str) {\n if (str[i] === CONDITION_BRACKET_OPEN_CHAR) {\n // if the char is an opening parenthesis then we increase the depth\n depth++;\n } else if (str[i] === CONDITION_BRACKET_CLOSE_CHAR) {\n // if the char is an closing parenthesis then we decrease the depth\n depth--;\n }\n // if the depth is negative we have a closing parenthesis\n // before any matching opening parenthesis\n if (depth < 0) {\n return false;\n }\n }\n // If the depth is not null then a closing parenthesis is missing\n if (depth > 0) {\n return false;\n }\n\n return true;\n };\n\n /**\n * Finds end of condition block started with startIndex\n *\n * @param rules\n * @param startIndex\n */\n const findConditionEnd = (rules, startIndex) => {\n const stack = [];\n for (let j = startIndex; j < rules.length; j++) {\n let internalRule = rules[j];\n\n if (internalRule.startsWith(CONDITION_DIRECTIVE_START)) {\n stack.push(CONDITION_DIRECTIVE_START);\n\n } else if (internalRule.startsWith(CONDITION_DIRECTIVE_END)) {\n if (stack.length > 0) {\n stack.pop();\n } else {\n return j;\n }\n }\n }\n\n return -1;\n };\n\n /**\n * Resolves constant expression\n *\n * @param expression\n * @param definedProperties\n */\n const resolveConditionConstant = (expression, definedProperties) => {\n if (!expression) {\n throw new Error('Invalid directives: Empty condition');\n }\n\n let trim = expression.trim();\n return trim === \"true\" || definedProperties[trim];\n };\n\n /**\n * Calculates conditional expression\n *\n * @param expression\n * @param definedProperties\n */\n const resolveExpression = (expression, definedProperties) => {\n if (!expression) {\n throw new Error('Invalid directives: Empty condition');\n }\n\n expression = expression.trim();\n\n if (!checkBracketsBalance(expression)) {\n throw new Error('Invalid directives: Incorrect brackets: ' + expression);\n }\n\n //Replace bracketed expressions\n const openBracketIndex = expression.lastIndexOf(CONDITION_BRACKET_OPEN_CHAR);\n if (openBracketIndex !== -1) {\n const endBracketIndex = expression.indexOf(CONDITION_BRACKET_CLOSE_CHAR, openBracketIndex);\n const innerExpression = expression.substring(openBracketIndex + 1, endBracketIndex);\n const innerResult = resolveExpression(innerExpression, definedProperties);\n const resolvedInner = expression.substring(0, openBracketIndex) +\n innerResult + expression.substring(endBracketIndex + 1);\n\n return resolveExpression(resolvedInner, definedProperties);\n }\n\n let result;\n\n // Resolve logical operators\n const indexOfAndOperator = expression.indexOf(CONDITION_OPERATOR_AND);\n const indexOfOrOperator = expression.indexOf(CONDITION_OPERATOR_OR);\n const indexOfNotOperator = expression.indexOf(CONDITION_OPERATOR_NOT);\n\n if (indexOfOrOperator !== -1) {\n result = resolveExpression(expression.substring(0, indexOfOrOperator - 1), definedProperties) ||\n resolveExpression(expression.substring(indexOfOrOperator + CONDITION_OPERATOR_OR.length, expression.length), definedProperties);\n } else if (indexOfAndOperator !== -1) {\n result = resolveExpression(expression.substring(0, indexOfAndOperator - 1), definedProperties) &&\n resolveExpression(expression.substring(indexOfAndOperator + CONDITION_OPERATOR_AND.length, expression.length), definedProperties);\n } else if (indexOfNotOperator === 0) {\n result = !resolveExpression(expression.substring(CONDITION_OPERATOR_NOT.length), definedProperties);\n } else {\n result = resolveConditionConstant(expression, definedProperties);\n }\n\n return result;\n };\n\n /**\n * Validates and resolves condition directive\n *\n * @param directive\n * @param definedProperties\n */\n const resolveCondition = (directive, definedProperties) => {\n const expression = directive.substring(CONDITION_DIRECTIVE_START.length).trim();\n\n return resolveExpression(expression, definedProperties);\n };\n\n /**\n * Resolves conditions directives\n *\n * @param rules\n * @param definedProperties\n */\n const resolveConditions = (rules, definedProperties) => {\n if (!definedProperties) {\n return rules;\n }\n\n let result = [];\n\n for (let i = 0; i < rules.length; i++) {\n let rule = rules[i];\n\n if (rule.indexOf(CONDITION_DIRECTIVE_START) === 0) {\n let endLineIndex = findConditionEnd(rules, i + 1);\n if (endLineIndex === -1) {\n throw new Error('Invalid directives: Condition end not found: ' + rule);\n }\n\n let conditionValue = resolveCondition(rule, definedProperties);\n if (conditionValue) {\n let rulesUnderCondition = rules.slice(i + 1, endLineIndex);\n // Resolve inner conditions in recursion\n result = result.concat(resolveConditions(rulesUnderCondition, definedProperties));\n }\n\n // Skip to the end of block\n i = endLineIndex;\n } else if (rule.indexOf(CONDITION_DIRECTIVE_END) === 0) {\n // Found condition end without start\n throw new Error('Invalid directives: Found unexpected condition end: ' + rule);\n } else {\n result.push(rule);\n }\n }\n\n return result;\n };\n\n /**\n * Validates url to be the same origin with original filterUrl\n *\n * @param url\n * @param filterUrlOrigin\n */\n const validateUrl = function (url, filterUrlOrigin) {\n if (filterUrlOrigin) {\n if (REGEXP_ABSOLUTE_URL.test(url)) {\n\n // Include url is absolute\n const urlOrigin = parseURL(url).origin;\n const filterOrigin = parseURL(filterUrlOrigin).origin;\n if (urlOrigin !== filterOrigin) {\n throw new Error('Include url is rejected with origin: ' + urlOrigin);\n }\n }\n }\n };\n\n /**\n * Validates and resolves include directive\n *\n * @param {string} line\n * @param {?string} filterOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const resolveInclude = function (line, filterOrigin, definedProperties) {\n if (line.indexOf(INCLUDE_DIRECTIVE) !== 0) {\n return Promise.resolve(line);\n } else {\n const url = line.substring(INCLUDE_DIRECTIVE.length).trim();\n validateUrl(url, filterOrigin);\n return downloadFilterRules(url, filterOrigin, definedProperties);\n }\n };\n\n /**\n * Resolves include directives\n *\n * @param {Array} rules array of rules\n * @param {?string} filterOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const resolveIncludes = async (rules, filterOrigin, definedProperties) => {\n const promises = rules.map(rule => {\n return resolveInclude(rule, filterOrigin, definedProperties);\n });\n\n let result = [];\n // We do not use here Promise.all because it freezes the chromium browsers and electron built on it, if there\n // are more than 1_100_00 promises. Also, we consider that wa can afford promises to be resolved sequentially.\n for (let i = 0; i < promises.length; i++) {\n const resolved = await promises[i];\n if (Array.isArray(resolved)) {\n result = result.concat(resolved);\n } else {\n result.push(resolved);\n }\n }\n\n return result;\n };\n\n /**\n * Compiles filter content\n *\n * @param {Array} rules Array of strings\n * @param {?string} filterOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const compile = (rules, filterOrigin, definedProperties) => {\n try {\n // Resolve 'if' conditions\n const resolvedConditionsResult = resolveConditions(rules, definedProperties);\n\n // Resolve 'includes' directives\n return resolveIncludes(resolvedConditionsResult, filterOrigin, definedProperties);\n } catch (ex) {\n return Promise.reject(ex);\n }\n };\n\n /**\n * Downloads filter rules from url\n *\n * @param {string} url Filter file URL\n * @param {?string} filterUrlOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const downloadFilterRules = (url, filterUrlOrigin, definedProperties) => {\n if (REGEXP_EXTERNAL_ABSOLUTE_URL.test(url) || REGEXP_EXTERNAL_ABSOLUTE_URL.test(filterUrlOrigin)) {\n return externalDownload(url, filterUrlOrigin, definedProperties);\n } else {\n return getLocalFile(url, filterUrlOrigin, definedProperties);\n }\n };\n\n /**\n * Downloads filter rules from external url\n *\n * @param {string} url Filter file absolute URL or relative path\n * @param {?string} filterUrlOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const externalDownload = (url, filterUrlOrigin, definedProperties) => {\n\n // getting absolute url for external file with relative url\n if (!REGEXP_ABSOLUTE_URL.test(url) && REGEXP_ABSOLUTE_URL.test(filterUrlOrigin)) {\n url = `${filterUrlOrigin}/${url}`;\n }\n\n return FileDownloadWrapper.getExternalFile(url, filterUrlOrigin, definedProperties).then((lines) => {\n // Filter origin could change in case url contains subdirectories\n // https://github.com/AdguardTeam/FiltersRegistry/pull/256\n filterUrlOrigin = getFilterUrlOrigin(url, null);\n\n // Resolve 'if' conditions and 'includes' directives\n const resolvedConditionsResult = resolveConditions(lines, definedProperties);\n return resolveIncludes(resolvedConditionsResult, filterUrlOrigin, definedProperties);\n });\n };\n\n /**\n * Get filter rules from local path\n *\n * @param {string} url local path\n * @param {?string} filterUrlOrigin origin path\n * @param {?object} definedProperties An object with the defined properties\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const getLocalFile = (url, filterUrlOrigin, definedProperties) => {\n if (filterUrlOrigin) {\n url = `${filterUrlOrigin}/${url}`;\n }\n\n filterUrlOrigin = getFilterUrlOrigin(url, filterUrlOrigin);\n\n return FileDownloadWrapper.getLocalFile(url, filterUrlOrigin, definedProperties).then((lines) => {\n filterUrlOrigin = getFilterUrlOrigin(url, null);\n\n // Resolve 'if' conditions and 'includes' directives\n const resolvedConditionsResult = resolveConditions(lines, definedProperties);\n return resolveIncludes(resolvedConditionsResult, filterUrlOrigin, definedProperties);\n });\n };\n\n /**\n * Get the `filterUrlOrigin` from url for relative path resolve\n *\n * @param {string} url Filter file URL\n * @param {string|null} [filterUrlOrigin] existing origin url\n * @returns {string} valid origin url\n */\n const getFilterUrlOrigin = (url, filterUrlOrigin) => {\n if (filterUrlOrigin) {\n return filterUrlOrigin;\n } else {\n return url.substring(0, url.lastIndexOf('/'));\n }\n };\n\n /**\n * Downloads a specified filter and interpretes all the pre-processor directives from there.\n *\n * @param {string} url Filter file URL\n * @param {Object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const download = async (url, definedProperties) => {\n try {\n let filterUrlOrigin;\n if (url && REGEXP_EXTERNAL_ABSOLUTE_URL.test(url)) {\n filterUrlOrigin = getFilterUrlOrigin(url)\n }\n\n const response = await downloadFilterRules(url, filterUrlOrigin, definedProperties);\n\n // only included filters can be empty\n if (response && response.join().trim() == '') {\n throw new Error(\"Response is empty\");\n }\n\n return response;\n } catch (ex) {\n return Promise.reject(ex);\n }\n };\n\n /**\n * Parse url\n *\n * @param {string} url\n * @returns {object} parsed url data\n */\n const parseURL = (url) => {\n if (typeof URL !== 'undefined') {\n return new URL(url);\n } else {\n let URL = require('url').URL;\n return new URL(url);\n }\n };\n\n return {\n compile: compile,\n download: download,\n resolveConditions: resolveConditions,\n resolveIncludes: resolveIncludes,\n getFilterUrlOrigin: getFilterUrlOrigin\n };\n};\n\nmodule.exports = FiltersDownloaderCreator;\n","// This file replaces `index.js` in bundlers like webpack or Rollup,\n// according to `browser` config in `package.json`.\n\nconst filtersDownloaderCreator = require('./filters-downloader-creator');\nconst FileDownloadWrapper = require('./browser/file-download-wrapper');\n\nconst FiltersDownloader = filtersDownloaderCreator(FileDownloadWrapper);\n\nmodule.exports = FiltersDownloader;\n","\n/**\n * AdGuard Scriptlets\n * Version 1.9.7\n */\n\n(function (factory) {\n typeof define === 'function' && define.amd ? define(factory) :\n factory();\n})((function () {\n /**\n * Concat dependencies to scriptlet code\n *\n * @param {string} scriptlet string view of scriptlet\n * @returns {string} string view of scriptlet with attached dependencies\n */\n function attachDependencies(scriptlet) {\n const _scriptlet$injections = scriptlet.injections,\n injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections;\n return injections.reduce(function (accum, dep) {\n return \"\".concat(accum, \"\\n\").concat(dep.toString());\n }, scriptlet.toString());\n }\n\n /**\n * Add scriptlet call to existing code\n *\n * @param {Function} scriptlet scriptlet func\n * @param {string} code scriptlet's string representation\n * @returns {string} wrapped scriptlet call\n */\n function addCall(scriptlet, code) {\n return \"\".concat(code, \"\\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\\n try {\\n \").concat(scriptlet.name, \".apply(this, updatedArgs);\\n } catch (e) {\\n console.log(e);\\n }\");\n }\n\n /**\n * Wrap function into IIFE (Immediately invoked function expression)\n *\n * @example\n * const source = {\n * args: [\"aaa\", \"bbb\"],\n * name: 'noeval',\n * };\n * const code = \"function noeval(source, args) { alert(source); } noeval.apply(this, args);\"\n * const result = wrapInIIFE(source, code);\n *\n * // result\n * `(function(source, args) {\n * function noeval(source) { alert(source); }\n * noeval.apply(this, args);\n * )({\"args\": [\"aaa\", \"bbb\"], \"name\":\"noeval\"}, [\"aaa\", \"bbb\"])`\n * @param {Object} source - object with scriptlet properties\n * @param {string} code - scriptlet source code with dependencies\n * @param {boolean} redirect if function is redirect\n * @returns {string} full scriptlet code\n */\n function passSourceAndProps(source, code) {\n let redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (source.hit) {\n source.hit = source.hit.toString();\n }\n const sourceString = JSON.stringify(source);\n const argsString = source.args ? \"[\".concat(source.args.map(JSON.stringify), \"]\") : undefined;\n const params = argsString ? \"\".concat(sourceString, \", \").concat(argsString) : sourceString;\n if (redirect) {\n return \"(function(source, args){\\n\".concat(code, \"\\n})(\").concat(params, \");\");\n }\n return \"(\".concat(code, \")(\").concat(params, \");\");\n }\n\n /**\n * Wrap code in no name function\n *\n * @param {string} code which must be wrapped\n * @returns {string} wrapped code\n */\n function wrapInNonameFunc(code) {\n return \"function(source, args){\\n\".concat(code, \"\\n}\");\n }\n\n /**\n * Converts object to array of pairs.\n * Object.entries() polyfill because it is not supported by IE\n * https://caniuse.com/?search=Object.entries\n *\n * @param {Object} object arbitrary object\n * @returns {Array} array of pairs\n */\n const getObjectEntries = function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n };\n\n /**\n * Converts array of pairs to object.\n * Object.fromEntries() polyfill because it is not supported by IE\n * https://caniuse.com/?search=Object.fromEntries\n *\n * @param {Array} entries - array of pairs\n * @returns {Object} result object\n */\n const getObjectFromEntries = function getObjectFromEntries(entries) {\n const output = entries.reduce(function (acc, el) {\n const key = el[0];\n const value = el[1];\n acc[key] = value;\n return acc;\n }, {});\n return output;\n };\n\n /**\n * Checks whether the obj is an empty object\n *\n * @param {Object} obj arbitrary object\n * @returns {boolean} if object is empty\n */\n const isEmptyObject = function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n };\n\n /**\n * Safely retrieve property descriptor\n *\n * @param {Object} obj target object\n * @param {string} prop target property\n * @returns {object|null} descriptor or null if it's not available or non-configurable\n */\n const safeGetDescriptor = function safeGetDescriptor(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n };\n\n /**\n * Set getter and setter to property if it's configurable\n *\n * @param {Object} object target object with property\n * @param {string} property property name\n * @param {Object} descriptor contains getter and setter functions\n * @returns {boolean} is operation successful\n */\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n\n /**\n * Determines whether the passed value is NaN\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN\n *\n * @param {any} num arbitrary value\n * @returns {boolean} if provided value is NaN\n */\n const nativeIsNaN = function nativeIsNaN(num) {\n // eslint-disable-next-line no-restricted-properties\n const native = Number.isNaN || window.isNaN;\n return native(num);\n };\n\n /**\n * Determines whether the passed value is a finite number\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite\n *\n * @param {any} num arbitrary value\n * @returns {boolean} if provided value is finite\n */\n const nativeIsFinite = function nativeIsFinite(num) {\n // eslint-disable-next-line no-restricted-properties\n const native = Number.isFinite || window.isFinite;\n return native(num);\n };\n\n /**\n * Parses string for a number, if possible, otherwise returns null.\n *\n * @param {any} rawString arbitrary string\n * @returns {number|null} number or null if string not parsable\n */\n const getNumberFromString = function getNumberFromString(rawString) {\n const parsedDelay = parseInt(rawString, 10);\n const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n };\n\n /**\n * Generate a random integer between two values, inclusive\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive\n *\n * @param {number} min range minimum\n * @param {number} max range maximum\n * @returns {number} random number\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n\n /**\n * String.prototype.replaceAll polyfill\n *\n * @param {string} input input string\n * @param {string} substr to look for\n * @param {string} newSubstr replacement\n * @returns {string} result string\n */\n const replaceAll = function replaceAll(input, substr, newSubstr) {\n return input.split(substr).join(newSubstr);\n };\n\n /**\n * Escapes special chars in string\n *\n * @param {string} str raw string\n * @returns {string} string with escaped special characters\n */\n const escapeRegExp = function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n\n /**\n * A literal string or regexp pattern wrapped in forward slashes.\n * For example, 'simpleStr' or '/adblock|_0x/'.\n *\n * @typedef {string} RawStrPattern\n */\n\n /**\n * Converts string to the regexp\n * TODO think about nested dependencies, but be careful with dependency loops\n *\n * @param {RawStrPattern} [input=''] literal string or regexp pattern; defaults to '' (empty string)\n * @returns {RegExp} regular expression; defaults to /.?/\n * @throws {SyntaxError} Throw an error for invalid regex pattern\n */\n const toRegExp = function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n const DEFAULT_VALUE = '.?';\n const FORWARD_SLASH = '/';\n if (input === '') {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(escaped);\n };\n\n /**\n * Checks whether the input string can be converted to regexp\n *\n * @param {RawStrPattern} input literal string or regexp pattern\n * @returns {boolean} if input can be converted to regexp\n */\n const isValidStrPattern = function isValidStrPattern(input) {\n const FORWARD_SLASH = '/';\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n };\n\n /**\n * Get string before regexp first match\n *\n * @param {string} str input string\n * @param {RegExp} rx find pattern\n * @returns {string} result string\n */\n const getBeforeRegExp = function getBeforeRegExp(str, rx) {\n const index = str.search(rx);\n return str.substring(0, index);\n };\n\n /**\n * Checks whether the string starts with the substring\n *\n * @param {string} str full string\n * @param {string} prefix substring\n * @returns {boolean} if string start with the substring\n */\n const startsWith$1 = function startsWith(str, prefix) {\n // if str === '', (str && false) will return ''\n // that's why it has to be !!str\n return !!str && str.indexOf(prefix) === 0;\n };\n\n /**\n * Checks whether the string ends with the substring\n *\n * @param {string} str full string\n * @param {string} ending substring\n * @returns {boolean} string ends with the substring\n */\n const endsWith = function endsWith(str, ending) {\n // if str === '', (str && false) will return ''\n // that's why it has to be !!str\n return !!str && str.lastIndexOf(ending) === str.length - ending.length;\n };\n const substringAfter$1 = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n const substringBefore = function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n };\n\n /**\n * Wrap str in single quotes and replaces single quotes to double one\n *\n * @param {string} str input string\n * @returns {string} string with swapped quotes\n */\n const wrapInSingleQuotes = function wrapInSingleQuotes(str) {\n if (str[0] === '\\'' && str[str.length - 1] === '\\'' || str[0] === '\"' && str[str.length - 1] === '\"') {\n str = str.substring(1, str.length - 1);\n }\n // eslint-disable-next-line no-useless-escape\n str = str.replace(/\\'/g, '\"');\n return \"'\".concat(str, \"'\");\n };\n\n /**\n * Returns substring enclosed in the widest braces\n *\n * @param {string} str input string\n * @returns {string} substring\n */\n const getStringInBraces = function getStringInBraces(str) {\n const firstIndex = str.indexOf('(');\n const lastIndex = str.lastIndexOf(')');\n return str.substring(firstIndex + 1, lastIndex);\n };\n\n /**\n * Prepares RTCPeerConnection config as string for proper logging\n *\n * @param {any} config RTC config\n * @returns {string} stringified config\n */\n const convertRtcConfigToString = function convertRtcConfigToString(config) {\n const UNDEF_STR = 'undefined';\n let str = UNDEF_STR;\n if (config === null) {\n str = 'null';\n } else if (config instanceof Object) {\n const SERVERS_PROP_NAME = 'iceServers';\n const URLS_PROP_NAME = 'urls';\n /*\n const exampleConfig = {\n 'iceServers': [\n 'urls': ['stun:35.66.206.188:443'],\n ],\n };\n */\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n };\n\n /**\n * Checks whether the match input string can be converted to regexp,\n * used for match inputs with possible negation\n *\n * @param {string} match literal string or regexp pattern\n * @returns {boolean} true if input can be converted to regexp\n */\n const isValidMatchStr = function isValidMatchStr(match) {\n const INVERT_MARKER = '!';\n let str = match;\n if (startsWith$1(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n };\n\n /**\n * Validates the match input number,\n * used for match inputs with possible negation\n *\n * @param {string} match string of match number\n * @returns {boolean} if match number is valid\n */\n const isValidMatchNumber = function isValidMatchNumber(match) {\n const INVERT_MARKER = '!';\n let str = match;\n if (startsWith$1(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n const num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n };\n\n /**\n * @typedef {Object} MatchData\n * @property {boolean} isInvertedMatch if matching should be inverted\n * @property {RegExp} matchRegexp match value parsed into regex\n */\n\n /**\n * Parses match arg with possible negation for no matching.\n * Needed for prevent-setTimeout, prevent-setInterval,\n * prevent-requestAnimationFrame and prevent-window-open\n *\n * @param {string} match matching arg\n * @returns {MatchData} data prepared for matching\n */\n const parseMatchArg = function parseMatchArg(match) {\n const INVERT_MARKER = '!';\n // In case if \"match\" is \"undefined\" return \"false\"\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch,\n matchRegexp,\n matchValue\n };\n };\n\n /**\n * @typedef {Object} DelayData\n * @property {boolean} isInvertedDelayMatch if matching should be inverted\n * @property {number|null} delayMatch parsed delay or null if delay is invalid\n */\n\n /**\n * Parses delay arg with possible negation for no matching.\n * Needed for prevent-setTimeout and prevent-setInterval\n *\n * @param {string} delay scriptlet's delay arg\n * @returns {DelayData} parsed delay data\n */\n const parseDelayArg = function parseDelayArg(delay) {\n const INVERT_MARKER = '!';\n const isInvertedDelayMatch = startsWith$1(delay, INVERT_MARKER);\n let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n delayValue = parseInt(delayValue, 10);\n const delayMatch = nativeIsNaN(delayValue) ? null : delayValue;\n return {\n isInvertedDelayMatch,\n delayMatch\n };\n };\n\n /**\n * Converts object to string for logging\n *\n * @param {Object} obj data object\n * @returns {string} object's string representation\n */\n const objectToString = function objectToString(obj) {\n // In case if the type of passed obj is different than Object\n // https://github.com/AdguardTeam/Scriptlets/issues/282\n if (!obj || typeof obj !== 'object') {\n return String(obj);\n }\n return isEmptyObject(obj) ? '{}' : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, \":\\\"\").concat(recordValueStr, \"\\\"\");\n }).join(' ');\n };\n\n /**\n * Converts types into a string\n *\n * @param {any} value input value type\n * @returns {string} type's string representation\n */\n const convertTypeToString = function convertTypeToString(value) {\n let output;\n if (typeof value === 'undefined') {\n output = 'undefined';\n } else if (typeof value === 'object') {\n if (value === null) {\n output = 'null';\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n };\n\n /**\n * Generate a random string, a length of the string is provided as an argument\n *\n * @param {number} length output's length\n * @returns {string} random string\n */\n function getRandomStrByLength(length) {\n let result = '';\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~';\n const charactersLength = characters.length;\n for (let i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n\n /**\n * Generate a random string\n *\n * @param {string} customResponseText response text to include in output\n * @returns {string|null} random string or null if passed argument is invalid\n */\n function generateRandomResponse(customResponseText) {\n let customResponse = customResponseText;\n if (customResponse === 'true') {\n // Generate random alphanumeric string of 10 symbols\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace('length:', '');\n const rangeRegex = /^\\d+-\\d+$/;\n // Return empty string if range is invalid\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n let rangeMin = getNumberFromString(customResponse.split('-')[0]);\n let rangeMax = getNumberFromString(customResponse.split('-')[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n\n // If rangeMin > rangeMax, swap variables\n if (rangeMin > rangeMax) {\n const temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n const LENGTH_RANGE_LIMIT = 500 * 1000;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n const length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n\n /**\n * Infers value from string argument\n * Inferring goes from more specific to more ambiguous options\n * Arrays, objects and strings are parsed via JSON.parse\n *\n * @param {string} value arbitrary string\n * @returns {any} converted value\n * @throws an error on unexpected input\n */\n function inferValue(value) {\n if (value === 'undefined') {\n return undefined;\n }\n if (value === 'false') {\n return false;\n }\n if (value === 'true') {\n return true;\n }\n if (value === 'null') {\n return null;\n }\n if (value === 'NaN') {\n return NaN;\n }\n\n // Number class constructor works 2 times faster than JSON.parse\n // and wont interpret mixed inputs like '123asd' as parseFloat would\n const MAX_ALLOWED_NUM = 32767;\n const numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error('number values bigger than 32767 are not allowed');\n }\n return numVal;\n }\n let errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n // Parse strings, arrays and objects represented as JSON strings\n // '[1,2,3,\"string\"]' > [1, 2, 3, 'string']\n // '\"arbitrary string\"' > 'arbitrary string'\n const parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === 'string') {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n\n /**\n * Iterate over iterable argument and evaluate current state with transitions\n *\n * @param {Array|string} iterable rule or list or rules\n * @param {Object} transitions transtion functions\n * @param {string} init first transition name\n * @param {any} args arguments which should be passed to transition functions\n * @returns {string} state\n */\n function iterateWithTransitions(iterable, transitions, init, args) {\n let state = init || Object.keys(transitions)[0];\n for (let i = 0; i < iterable.length; i += 1) {\n state = transitions[state](iterable, i, args);\n }\n return state;\n }\n\n /**\n * AdGuard scriptlet rule mask\n */\n const ADG_SCRIPTLET_MASK = '#//scriptlet';\n\n /**\n * Helper to accumulate an array of strings char by char\n *\n * @returns {Object} object with helper methods\n */\n const wordSaver = function wordSaver() {\n let str = '';\n const strings = [];\n const saveSymb = function saveSymb(s) {\n str += s;\n return str;\n };\n const saveStr = function saveStr() {\n strings.push(str);\n str = '';\n };\n const getAll = function getAll() {\n return [...strings];\n };\n return {\n saveSymb,\n saveStr,\n getAll\n };\n };\n const substringAfter = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n\n /**\n * Parses scriptlet rule and validates its syntax.\n *\n * @param {string} ruleText Rule string\n *\n * @returns {{name: string, args: Array}} Parsed rule data.\n * @throws An error on invalid rule syntax.\n */\n const parseRule = function parseRule(ruleText) {\n ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK);\n /**\n * Transition names\n */\n const TRANSITION = {\n OPENED: 'opened',\n PARAM: 'param',\n CLOSED: 'closed'\n };\n\n /**\n * Transition function: the current index position in start, end or between params\n *\n * @param {string} rule rule string\n * @param {number} index index\n * @param {Object} Object helper object\n * @param {Object} Object.sep contains prop symb with current separator char\n * @throws {string} throws if given rule is not a scriptlet\n * @returns {string} transition\n */\n const opened = function opened(rule, index, _ref) {\n let sep = _ref.sep;\n const char = rule[index];\n let transition;\n switch (char) {\n case ' ':\n case '(':\n case ',':\n {\n transition = TRANSITION.OPENED;\n break;\n }\n case '\\'':\n case '\"':\n {\n sep.symb = char;\n transition = TRANSITION.PARAM;\n break;\n }\n case ')':\n {\n transition = index === rule.length - 1 ? TRANSITION.CLOSED : TRANSITION.OPENED;\n break;\n }\n default:\n {\n throw new Error('The rule is not a scriptlet');\n }\n }\n return transition;\n };\n /**\n * Transition function: the current index position inside param\n *\n * @param {string} rule rule string\n * @param {number} index index\n * @param {Object} Object helper object\n * @param {Object} Object.sep contains prop `symb` with current separator char\n * @param {Object} Object.saver helper which allow to save strings by car by char\n * @returns {void}\n */\n const param = function param(rule, index, _ref2) {\n let saver = _ref2.saver,\n sep = _ref2.sep;\n const char = rule[index];\n switch (char) {\n case '\\'':\n case '\"':\n {\n const preIndex = index - 1;\n const before = rule[preIndex];\n if (char === sep.symb && before !== '\\\\') {\n sep.symb = null;\n saver.saveStr();\n return TRANSITION.OPENED;\n }\n }\n // eslint-disable-next-line no-fallthrough\n default:\n {\n saver.saveSymb(char);\n return TRANSITION.PARAM;\n }\n }\n };\n const transitions = {\n [TRANSITION.OPENED]: opened,\n [TRANSITION.PARAM]: param,\n [TRANSITION.CLOSED]: function () {}\n };\n const sep = {\n symb: null\n };\n const saver = wordSaver();\n const state = iterateWithTransitions(ruleText, transitions, TRANSITION.OPENED, {\n sep,\n saver\n });\n if (state !== 'closed') {\n throw new Error(\"Invalid scriptlet rule \".concat(ruleText));\n }\n const args = saver.getAll();\n return {\n name: args[0],\n args: args.slice(1)\n };\n };\n\n /**\n * Validates event type\n *\n * @param {any} type event type\n * @returns {boolean} if type is valid\n */\n const validateType = function validateType(type) {\n // https://github.com/AdguardTeam/Scriptlets/issues/125\n return typeof type !== 'undefined';\n };\n\n /**\n * Validates event listener\n *\n * @param {any} listener event listener\n * @returns {boolean} if listener callback is valid\n */\n const validateListener = function validateListener(listener) {\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters\n return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object'\n // https://github.com/AdguardTeam/Scriptlets/issues/76\n && listener !== null && typeof listener.handleEvent === 'function');\n };\n\n /**\n * @typedef {object|Function|null} EventListener\n */\n\n /**\n * Serialize valid event listener\n * https://developer.mozilla.org/en-US/docs/Web/API/EventListener\n *\n * @param {EventListener} listener valid listener\n * @returns {string} listener string\n */\n const listenerToString = function listenerToString(listener) {\n return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString();\n };\n\n const shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) {\n return delay === '*';\n };\n\n /**\n * Handles input delay value\n *\n * @param {any} delay matchDelay argument of adjust-* scriptlets\n * @returns {number} proper number delay value\n */\n const getMatchDelay = function getMatchDelay(delay) {\n const DEFAULT_DELAY = 1000;\n const parsedDelay = parseInt(delay, 10);\n const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY // default scriptlet value\n : parsedDelay;\n return delayMatch;\n };\n\n /**\n * Checks delay match condition\n *\n * @param {any} inputDelay matchDelay argument of adjust-* scriptlets\n * @param {number} realDelay delay argument of setTimeout/setInterval\n * @returns {boolean} if given delays match\n */\n const isDelayMatched = function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n };\n\n /**\n * Handles input boost value\n *\n * @param {any} boost boost argument of adjust-* scriptlets\n * @returns {number} proper number boost multiplier value\n */\n const getBoostMultiplier = function getBoostMultiplier(boost) {\n const DEFAULT_MULTIPLIER = 0.05;\n // https://github.com/AdguardTeam/Scriptlets/issues/262\n const MIN_MULTIPLIER = 0.001;\n const MAX_MULTIPLIER = 50;\n const parsedBoost = parseFloat(boost);\n let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value\n : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n };\n\n /**\n * Some browsers do not support Array.prototype.flat()\n * for example, Opera 42 which is used for browserstack tests\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n *\n * @param {Array} input arbitrary array\n * @returns {Array} flattened array\n */\n const flatten = function flatten(input) {\n const stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n const res = [];\n while (stack.length) {\n // pop value from stack\n const next = stack.pop();\n if (Array.isArray(next)) {\n // push back array items, won't modify the original input\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n // reverse to restore input order\n return res.reverse();\n };\n\n /**\n * Predicate method to check if the array item exists\n *\n * @param {any} item arbitrary\n * @returns {boolean} if item is truthy or not\n */\n const isExisting = function isExisting(item) {\n return !!item;\n };\n\n /**\n * Checks whether the input path is supported\n *\n * @param {string} rawPath input path\n * @returns {boolean} if cookie path is valid\n */\n const isValidCookiePath = function isValidCookiePath(rawPath) {\n return rawPath === '/' || rawPath === 'none';\n };\n\n /**\n * Returns 'path=/' if rawPath is '/'\n * or empty string '' for other cases, `rawPath === 'none'` included\n *\n * @param {string} rawPath path argument of *set-cookie-* scriptlets\n * @returns {string} cookie path\n */\n const getCookiePath = function getCookiePath(rawPath) {\n if (rawPath === '/') {\n return 'path=/';\n }\n // otherwise do not set path as invalid\n // the same for pathArg === 'none'\n return '';\n };\n\n /**\n * Combines input cookie name, value, and path into string.\n *\n * @param {string} rawName name argument of *set-cookie-* scriptlets\n * @param {string} rawValue value argument of *set-cookie-* scriptlets\n * @param {string} rawPath path argument of *set-cookie-* scriptlets\n * @returns {string|null} string OR `null` if path is not supported\n */\n const concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n // eslint-disable-next-line max-len\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n };\n\n /**\n * Gets supported cookie value\n *\n * @param {string} value input cookie value\n * @returns {string|null} valid cookie string if ok OR null if not\n */\n const getLimitedCookieValue = function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n let validValue;\n if (value === 'true') {\n validValue = 'true';\n } else if (value === 'True') {\n validValue = 'True';\n } else if (value === 'false') {\n validValue = 'false';\n } else if (value === 'False') {\n validValue = 'False';\n } else if (value === 'yes') {\n validValue = 'yes';\n } else if (value === 'Yes') {\n validValue = 'Yes';\n } else if (value === 'Y') {\n validValue = 'Y';\n } else if (value === 'no') {\n validValue = 'no';\n } else if (value === 'ok') {\n validValue = 'ok';\n } else if (value === 'OK') {\n validValue = 'OK';\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n };\n\n /**\n * Parses cookie string into object\n *\n * @param {string} cookieString string that conforms to document.cookie format\n * @returns {Object} key:value object that corresponds with incoming cookies keys and values\n */\n const parseCookieString = function parseCookieString(cookieString) {\n const COOKIE_DELIMITER = '=';\n const COOKIE_PAIRS_DELIMITER = ';';\n\n // Get raw cookies\n const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n const cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n let cookieKey;\n let cookieValue;\n const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n // Save cookie key=value data with null instead of empty ('') values\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n };\n\n /**\n * Check if cookie with specified name and value is present in a cookie string\n *\n * @param {string} cookieString 'document.cookie'-like string\n * @param {string} name name argument of *set-cookie-* scriptlets\n * @param {string} value value argument of *set-cookie-* scriptlets\n * @returns {boolean} if cookie is already set\n */\n const isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(';').some(function (cookieStr) {\n const pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return false;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n };\n\n /**\n * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid\n *\n * @param {string} offsetExpiresSec input offset param in seconds\n * @returns {number|null} number is milliseconds OR null\n */\n const getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) {\n const ONE_YEAR_EXPIRATION_KEYWORD = '1year';\n const ONE_DAY_EXPIRATION_KEYWORD = '1day';\n const MS_IN_SEC = 1000;\n const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n const SECONDS_IN_DAY = 24 * 60 * 60;\n let parsedSec;\n // Set predefined expire value if corresponding keyword was passed\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n // If offsetExpiresSec has been parsed to NaN - do not set cookie at all\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n };\n\n /**\n * Noop function\n *\n * @returns {undefined} undefined\n */\n const noopFunc = function noopFunc() {};\n\n /**\n * Function returns noopFunc\n *\n * @returns {Function} noopFunc\n */\n const noopCallbackFunc = function noopCallbackFunc() {\n return noopFunc;\n };\n\n /**\n * Function returns null\n *\n * @returns {null} null\n */\n const noopNull = function noopNull() {\n return null;\n };\n\n /**\n * Function returns true\n *\n * @returns {boolean} true\n */\n const trueFunc = function trueFunc() {\n return true;\n };\n\n /**\n * Function returns false\n *\n * @returns {boolean} false\n */\n const falseFunc = function falseFunc() {\n return false;\n };\n\n /**\n * Function returns this\n *\n * @returns {this} this object\n */\n function noopThis() {\n return this;\n }\n\n /**\n * Function returns empty string\n *\n * @returns {string} empty string\n */\n const noopStr = function noopStr() {\n return '';\n };\n\n /**\n * Function returns empty array\n *\n * @returns {Array} empty array\n */\n const noopArray = function noopArray() {\n return [];\n };\n\n /**\n * Function returns empty object\n *\n * @returns {Object} empty object\n */\n const noopObject = function noopObject() {\n return {};\n };\n\n /**\n * Function throws an error\n *\n * @throws\n */\n const throwFunc = function throwFunc() {\n throw new Error();\n };\n\n /**\n * Function returns Promise.reject()\n *\n * @returns {Promise} rejected Promise\n */\n const noopPromiseReject = function noopPromiseReject() {\n return Promise.reject();\n };\n\n /**\n * Returns Promise object that is resolved with specified props\n *\n * @param {string} [responseBody='{}'] value to set as responseBody\n * @param {string} [responseUrl=''] value to set as responseUrl\n * @param {string} [responseType='default'] value to set as responseType\n * @returns {Promise|undefined} resolved Promise or undefined if Response interface is not available\n */\n const noopPromiseResolve = function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}';\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default';\n if (typeof Response === 'undefined') {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: 'OK'\n });\n\n // Mock response' url & type to avoid adb checks\n // https://github.com/AdguardTeam/Scriptlets/issues/216\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n\n // eslint-disable-next-line consistent-return\n return Promise.resolve(response);\n };\n\n /**\n * Determines if type of script is inline or injected\n * and when it's one of them then return true, otherwise false\n * https://github.com/AdguardTeam/Scriptlets/issues/201\n *\n * @param {string|undefined} stackMatch - input stack value to match\n * @param {string} stackTrace - script error stack trace\n * @returns {boolean} if stacks match\n */\n const shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = 'inlineScript';\n const INJECTED_SCRIPT_STRING = 'injectedScript';\n const INJECTED_SCRIPT_MARKER = '';\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf('#');\n // Remove URL hash\n // in Chrome, URL in stackTrace doesn't contain hash\n // so, it's necessary to remove it, otherwise location.href\n // will not match with location from stackTrace\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split('\\n').slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n // Get stack trace URL\n // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20\n // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16)\n // so, first group \"(.*?@)\" is required for Firefox, second group contains URL\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith$1(stackURL, '(')) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith$1(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith$1(stackFunction, 'at')) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith$1(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n };\n\n /**\n * Finds shadow-dom host (elements with shadowRoot property) in DOM of rootElement.\n *\n * @param {HTMLElement} rootElement shadow dom root\n * @returns {HTMLElement[]} shadow-dom hosts\n */\n const findHostElements = function findHostElements(rootElement) {\n const hosts = [];\n // Element.querySelectorAll() returns list of elements\n // which are defined in DOM of Element.\n // Meanwhile, inner DOM of the element with shadowRoot property\n // is absolutely another DOM and which can not be reached by querySelectorAll('*')\n const domElems = rootElement.querySelectorAll('*');\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n return hosts;\n };\n\n /**\n * A collection of nodes.\n *\n * @external NodeList\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/NodeList NodeList}\n */\n\n /**\n * @typedef {Object} PierceData\n * @property {HTMLElement[]} targets found elements that match the specified selector\n * @property {HTMLElement[]} innerHosts inner shadow-dom hosts\n */\n\n /**\n * Pierces open shadow-dom in order to find:\n * - elements by 'selector' matching\n * - inner shadow-dom hosts\n *\n * @param {string} selector DOM elements selector\n * @param {HTMLElement[]|external:NodeList} hostElements shadow-dom hosts\n * @returns {PierceData} object with found elements and shadow-dom hosts\n */\n const pierceShadowDom = function pierceShadowDom(selector, hostElements) {\n let targets = [];\n const innerHostsAcc = [];\n\n // it's possible to get a few hostElements found by baseSelector on the page\n hostElements.forEach(function (host) {\n // check presence of selector element inside base element if it's not in shadow-dom\n const simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n const shadowRootElem = host.shadowRoot;\n const shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n\n // find inner shadow-dom hosts inside processing shadow-dom\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n\n // if there were more than one host element,\n // innerHostsAcc is an array of arrays and should be flatten\n const innerHosts = flatten(innerHostsAcc);\n return {\n targets,\n innerHosts\n };\n };\n\n /**\n * Checks whether the passed arg is proper callback\n *\n * @param {any} callback arbitrary callback\n * @returns {boolean} if callback is valid\n */\n const isValidCallback = function isValidCallback(callback) {\n return callback instanceof Function\n // passing string as 'code' arg is not recommended\n // but it is possible and not restricted\n // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters\n || typeof callback === 'string';\n };\n\n /**\n * Parses delay argument of setTimeout / setInterval methods into\n * rounded down number for number/string values or passes on for other types.\n * Needed for prevent-setTimeout and prevent-setInterval\n *\n * @param {any} delay native method delay arg\n * @returns {any} number as parsed delay or any input type if `delay` is not parsable\n */\n const parseRawDelay = function parseRawDelay(delay) {\n const parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n };\n\n /**\n * Checks whether 'callback' and 'delay' are matching\n * by given parameters 'matchCallback' and 'matchDelay'.\n * Used for prevent-setTimeout and prevent-setInterval.\n *\n * @param {Object} preventData set of data to determine if scriptlet should match\n * @param {Function} preventData.callback method's callback arg\n * @param {any} preventData.delay method's delay arg\n * @param {string} preventData.matchCallback scriptlets's callback arg\n * @param {string} preventData.matchDelay scriptlets's delay arg\n * @returns {boolean} if scriptlet should match\n */\n const isPreventionNeeded = function isPreventionNeeded(_ref) {\n let callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n // if callback is has not valid type\n // scriptlet can not prevent it\n // so no need for more checking and do not call hit() later\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n const _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n\n // Parse delay for decimal, string and non-number values\n // https://github.com/AdguardTeam/Scriptlets/issues/247\n const parsedDelay = parseRawDelay(delay);\n let shouldPrevent = false;\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n const callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n };\n\n const handleOldReplacement = function handleOldReplacement(replacement) {\n let result;\n // defaults to return noopFunc instead of window.open\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === 'trueFunc') {\n result = trueFunc;\n } else if (replacement.indexOf('=') > -1) {\n // We should return noopFunc instead of window.open\n // but with some property if website checks it (examples 5, 6)\n // https://github.com/AdguardTeam/Scriptlets/issues/71\n const isProp = startsWith$1(replacement, '{') && endsWith(replacement, '}');\n if (isProp) {\n const propertyPart = replacement.slice(1, -1);\n const propertyName = substringBefore(propertyPart, '=');\n const propertyValue = substringAfter$1(propertyPart, '=');\n if (propertyValue === 'noopFunc') {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n };\n const createDecoy = function createDecoy(args) {\n const OBJECT_TAG_NAME = 'object';\n const OBJECT_URL_PROP_NAME = 'data';\n const IFRAME_TAG_NAME = 'iframe';\n const IFRAME_URL_PROP_NAME = 'src';\n const replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n let tag;\n let urlProp;\n if (replacement === 'obj') {\n tag = OBJECT_TAG_NAME;\n urlProp = OBJECT_URL_PROP_NAME;\n } else {\n tag = IFRAME_TAG_NAME;\n urlProp = IFRAME_URL_PROP_NAME;\n }\n const decoy = document.createElement(tag);\n decoy[urlProp] = url;\n decoy.style.setProperty('height', '1px', 'important');\n decoy.style.setProperty('position', 'fixed', 'important');\n decoy.style.setProperty('top', '-1px', 'important');\n decoy.style.setProperty('width', '1px', 'important');\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1000);\n return decoy;\n };\n const getPreventGetter = function getPreventGetter(nativeGetter) {\n const preventGetter = function preventGetter(target, prop) {\n if (prop && prop === 'closed') {\n return false;\n }\n if (typeof nativeGetter === 'function') {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n };\n\n const getNativeRegexpTest = function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, 'test').value;\n };\n\n /**\n * Returns array of request props that are supported by fetch/xhr scriptlets.\n * Includes common 'url' and 'method' props and all other fetch-specific props\n *\n * @returns {string[]} list of request props\n */\n const getRequestProps = function getRequestProps() {\n return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal'];\n };\n\n /**\n * Collects Request options to object\n *\n * @param {Request} request Request instance to collect properties from\n * @returns {Object} data object\n */\n const getRequestData = function getRequestData(request) {\n const requestInitOptions = getRequestProps();\n const entries = requestInitOptions.map(function (key) {\n // if request has no such option, value will be undefined\n const value = request[key];\n return [key, value];\n });\n return getObjectFromEntries(entries);\n };\n\n /**\n * Collects fetch args to object\n *\n * @param {any} args fetch args\n * @returns {Object} data object\n */\n const getFetchData = function getFetchData(args) {\n const fetchPropsObj = {};\n let fetchUrl;\n let fetchInit;\n if (args[0] instanceof Request) {\n // if Request passed to fetch, it will be in array\n const requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0]; // eslint-disable-line prefer-destructuring\n fetchInit = args[1]; // eslint-disable-line prefer-destructuring\n }\n\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n Object.keys(fetchInit).forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n };\n\n /**\n * Collect xhr.open arguments to object\n *\n * @param {string} method request method\n * @param {string} url request url\n * @param {string} async request async prop\n * @param {string} user request user prop\n * @param {string} password request password prop\n * @returns {Object} aggregated request data\n */\n const getXhrData = function getXhrData(method, url, async, user, password) {\n return {\n method,\n url,\n async,\n user,\n password\n };\n };\n\n /**\n * Parse propsToMatch input string into object;\n * used for prevent-fetch and prevent-xhr\n *\n * @param {string} propsToMatchStr string of space-separated request properties to match\n * @returns {Object} object where 'key' is prop name and 'value' is prop value\n */\n const parseMatchProps = function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = ' ';\n const PAIRS_MARKER = ':';\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n // Escape multiple colons in prop\n // i.e regex value and/or url with protocol specified, with or without 'url:' match prop\n // https://github.com/AdguardTeam/Scriptlets/issues/216#issuecomment-1178591463\n propsObj.url = prop;\n }\n });\n return propsObj;\n };\n\n /**\n * Validates parsed data values\n *\n * @param {Object} data request data\n * @returns {boolean} if data is valid\n */\n const validateParsedData = function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n };\n\n /**\n * Converts valid parsed data to data obj for further matching\n *\n * @param {Object} data parsed request data\n * @returns {Object} data obj ready for matching\n */\n const getMatchPropsData = function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n };\n\n /**\n * Conditionally logs message to console.\n * Convention is to log messages by source.verbose if such log\n * is not a part of scriptlet's functionality, eg on invalid input,\n * and use 'forced' argument otherwise.\n *\n * @param {Object} source required, scriptlet properties\n * @param {any} message required, message to log\n * @param {boolean} [forced=false] to log message unconditionally\n * @param {boolean} [convertMessageToString=true] to convert message to string\n */\n const logMessage = function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n\n // eslint-disable-next-line no-console\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n // Template literals convert object to string,\n // so 'message' should not be passed to template literals\n // as it will not be logged correctly\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n\n // Extract scriptlet part from rule text\n if (ruleText) {\n const RULE_MARKER = '#%#//scriptlet';\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n };\n\n /**\n * Sets item to a specified storage, if storage isn't full.\n *\n * @param {Object} source scriptlet's configuration\n * @param {Storage} storage storage instance to set item into\n * @param {string} key storage key\n * @param {string} value staroge value\n */\n const setStorageItem = function setStorageItem(source, storage, key, value) {\n // setItem() may throw an exception if the storage is full.\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n };\n\n /**\n * Gets supported storage item value\n *\n * @param {string} value input item value\n * @returns {string|null|undefined|boolean} valid item value if ok OR null if not\n */\n const getLimitedStorageItemValue = function getLimitedStorageItemValue(value) {\n if (typeof value !== 'string') {\n throw new Error('Invalid value');\n }\n let validValue;\n if (value === 'undefined') {\n validValue = undefined;\n } else if (value === 'false') {\n validValue = false;\n } else if (value === 'true') {\n validValue = true;\n } else if (value === 'null') {\n validValue = null;\n } else if (value === 'emptyArr') {\n validValue = '[]';\n } else if (value === 'emptyObj') {\n validValue = '{}';\n } else if (value === '') {\n validValue = '';\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error('Invalid value');\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error('Invalid value');\n }\n } else if (value === 'yes') {\n validValue = 'yes';\n } else if (value === 'no') {\n validValue = 'no';\n } else {\n throw new Error('Invalid value');\n }\n return validValue;\n };\n\n /**\n * Generates function which silents global errors on page generated by scriptlet\n * If error doesn't belong to our error we transfer it to the native onError handler\n *\n * @param {string} rid - unique identifier of scriptlet\n * @returns {Function} window.onerror handler\n */\n function createOnErrorHandler(rid) {\n // eslint-disable-next-line consistent-return\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === 'string' && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n\n /**\n * Generate random seven symbols id\n *\n * @returns {string} randomized id\n */\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n\n /**\n * Prevents infinite loops when trapping props that could be used by scriptlet's own helpers\n * Example: window.RegExp, that is used by matchStackTrace > toRegExp\n *\n * https://github.com/AdguardTeam/Scriptlets/issues/251\n * https://github.com/AdguardTeam/Scriptlets/issues/226\n * https://github.com/AdguardTeam/Scriptlets/issues/232\n *\n * @returns {Object} descriptor addon\n */\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n // try...catch is required in case there are more than one inline scripts\n // which should be aborted,\n // so after the first successful abortion, `cb(...args);` will throw error,\n // and we should not stop on that and continue to abort other scripts\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n const result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n const rid = randomId();\n this.isAbortingSuspended = false;\n // It's necessary to throw error\n // otherwise script will be not aborted\n throw new ReferenceError(rid);\n }\n }\n };\n }\n\n /**\n * @typedef ChainInfo\n * @property {Object} base current chain base\n * @property {string} prop current chain prop\n * @property {string} [chain] string representation\n */\n\n /**\n * Check if the property exists in the base object (recursively)\n *\n * If property doesn't exist in base object,\n * defines this property as 'undefined'\n * and returns base, property name and remaining part of property chain\n *\n * @param {Object} base object that owns chain\n * @param {string} chain chain of owner properties\n * @returns {ChainInfo} chain info object\n */\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf('.');\n if (pos === -1) {\n return {\n base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n\n // https://github.com/AdguardTeam/Scriptlets/issues/128\n if (base === null) {\n // if base is null, return 'null' as base.\n // it's needed for triggering the reason logging while debugging\n return {\n base,\n prop,\n chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n // for empty objects in chain\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase === null) {\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base,\n prop,\n chain\n };\n }\n\n /**\n * @typedef ChainInfo\n * @property {Object} base current chain base\n * @property {string} prop current chain prop\n * @property {string} [chain] string representation\n */\n\n /**\n * Check if the property exists in the base object (recursively).\n * Similar to getPropertyInChain but upgraded for json-prune:\n * handle wildcard properties and does not define nonexistent base property as 'undefined'\n *\n * @param {Object} base object that owns chain\n * @param {string} chain chain of owner properties\n * @param {boolean} [lookThrough=false]\n * should the method look through it's props in order to wildcard\n * @param {Array} [output=[]] result acc\n * @returns {ChainInfo[]} array of objects\n */\n function getWildcardPropertyInChain(base, chain) {\n let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n const pos = chain.indexOf('.');\n if (pos === -1) {\n // for paths like 'a.b.*' every final nested prop should be processed\n if (chain === '*' || chain === '[]') {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in base) {\n // to process each key in base except inherited ones\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base,\n prop: chain\n });\n }\n return output;\n }\n const prop = chain.slice(0, pos);\n const shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object;\n if (shouldLookThrough) {\n const nextProp = chain.slice(pos + 1);\n const baseKeys = Object.keys(base);\n\n // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'),\n // each one of base keys should be considered as a potential chain prop in final path\n baseKeys.forEach(function (key) {\n const item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n\n /* eslint-disable no-console, no-underscore-dangle */\n\n /**\n * Hit used only for debug purposes now\n *\n * @param {Object} source scriptlet properties\n * use LOG_MARKER = 'log: ' at the start of a message\n * for logging scriptlets\n */\n const hit = function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || '';\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = '#%#//';\n const UBO_SCRIPTLET_MARKER = '##+js';\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n // delete all domains from ruleText and leave just rule part\n const rulePart = source.ruleText.slice(ruleStartIndex);\n // prepare applied scriptlet rule for specific domain\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {\n // try catch for Edge 15\n // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/\n // console.log throws an error\n }\n\n // This is necessary for unit-tests only!\n if (typeof window.__debug === 'function') {\n window.__debug(source);\n }\n };\n\n /**\n * Checks if given propsToMatch string matches with given request data\n * This is used by prevent-xhr, prevent-fetch, trusted-replace-xhr-response\n * and trusted-replace-fetch-response scriptlets\n *\n * @param {Object} source scriptlet properties\n * @param {string} propsToMatch string of space-separated request properties to match\n * @param {Object} requestData object with standard properties of fetch/xhr like url, method etc\n * @returns {boolean} if request properties match\n */\n const matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === '' || propsToMatch === '*') {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n // prevent only if all props match\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n };\n\n /**\n * Checks if the stackTrace contains stackRegexp\n * https://github.com/AdguardTeam/Scriptlets/issues/82\n *\n * @param {string|undefined} stackMatch - input stack value to match\n * @param {string} stackTrace - script error stack trace\n * @returns {boolean} if the stackTrace contains stackRegexp\n */\n const matchStackTrace = function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === '') {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split('\\n').slice(2) // get rid of our own functions in the stack trace\n .map(function (line) {\n return line.trim();\n }) // trim the lines\n .join('\\n');\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n };\n\n /**\n * Returns a wrapper, passing the call to 'method' at maximum once per 'delay' milliseconds.\n * Those calls that fall into the \"cooldown\" period, are ignored\n *\n * @param {Function} cb callback\n * @param {number} delay - milliseconds\n * @returns {Function} throttled callback\n */\n const throttle = function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n // \"savedArgs\" might contains few arguments, so it's necessary to use spread operator\n // https://github.com/AdguardTeam/Scriptlets/issues/284#issuecomment-1419464354\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n };\n\n /**\n * DOM tree changes observer. Used for 'remove-attr' and 'remove-class' scriptlets\n *\n * @param {Function} callback function to call on each mutation\n * @param {boolean} [observeAttrs] if observer should observe attributes changes\n * @param {Array} [attrsToObserve] list of attributes to observe\n */\n const observeDOMChanges = function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n /**\n * 'delay' in milliseconds for 'throttle' method\n */\n const THROTTLE_DELAY_MS = 20;\n /**\n * Used for remove-class\n */\n // eslint-disable-next-line no-use-before-define\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n\n /**\n * Callback wrapper to prevent loops\n * when callback tinkers with attributes\n */\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n };\n\n /**\n * @typedef {Object} FlagsData object that holds info about valid flags\n * and provides method for easy access\n * @property {string} ASAP asap flag string\n * @property {string} COMPLETE complete flag string\n * @property {string} STAY stay flag string\n * @property {Function} hasFlag to check if given flag is present\n */\n\n /**\n * Behaviour flags string parser\n *\n * @param {string} flags required, 'applying' argument string\n * @returns {FlagsData} object with parsed flags\n */\n const parseFlags = function parseFlags(flags) {\n const FLAGS_DIVIDER = ' ';\n const ASAP_FLAG = 'asap';\n const COMPLETE_FLAG = 'complete';\n const STAY_FLAG = 'stay';\n const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.indexOf(f) !== -1;\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.indexOf(flag) !== -1;\n }\n };\n };\n\n /**\n * Modifies passed keyword value according to its purpose.\n * Returns initial value if it's not a keyword.\n *\n * Supported keywords:\n * - '$now$' - returns current time in ms, e.g 1667915146503\n * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n *\n * @param {string} rawValue keyword\n * @returns {string} parsed value\n */\n const parseKeywordValue = function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = '$now$';\n const CURRENT_DATE_KEYWORD = '$currentDate$';\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n // Set to current time in ms, e.g 1667915146503\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n parsedValue = Date();\n }\n return parsedValue;\n };\n\n /**\n * Makes arbitrary operations on shadow root element,\n * to be passed as callback to hijackAttachShadow\n *\n * @callback attachShadowCallback\n * @param {HTMLElement} shadowRoot\n * @returns {void}\n */\n\n /**\n * Overrides attachShadow method of Element API on a given context\n * to pass retrieved shadowRoots to callback\n *\n * @param {Object} context e.g global window object or contentWindow of an iframe\n * @param {string} hostSelector selector to determine if callback should be called on current shadow subtree\n * @param {attachShadowCallback} callback callback to call on shadow root\n */\n const hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) {\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || '*')) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n const attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n };\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-click-element\n * @description\n * Clicks selected elements in a strict sequence, ordered by selectors passed, and waiting for them to render in the DOM first.\n * Deactivates after all elements have been clicked or by 10s timeout.\n *\n * **Syntax**\n * ```\n * example.com#%#//scriptlet('trusted-click-element', selectors[, extraMatch[, delay]])\n * ```\n *\n * - `selectors` — required, string with query selectors delimited by comma\n * - `extraMatch` — optional, extra condition to check on a page; allows to match `cookie` and `localStorage`; can be set as `name:key[=value]` where `value` is optional.\n * If `cookie`/`localStorage` starts with `!` then the element will only be clicked if specified cookie/localStorage item does not exist.\n * Multiple conditions are allowed inside one `extraMatch` but they should be delimited by comma and each of them should match the syntax. Possible `name`s:\n * - `cookie` - test string or regex against cookies on a page\n * - `localStorage` - check if localStorage item is present\n * - `delay` — optional, time in ms to delay scriptlet execution, defaults to instant execution.\n *\n * **Examples**\n * 1. Click single element by selector\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]')\n * ```\n *\n * 2. Delay click execution by 500ms\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '', '500')\n * ```\n *\n * 3. Click multiple elements by selector with a delay\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"], button[name=\"check\"], input[type=\"submit\"][value=\"akkoord\"]', '', '500')\n * ```\n *\n * 4. Match cookies by keys using regex and string\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'cookie:userConsentCommunity, cookie:/cmpconsent|cmp/')\n * ```\n *\n * 5. Match by cookie key=value pairs using regex and string\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'cookie:userConsentCommunity=true, cookie:/cmpconsent|cmp/=/[a-z]{1,5}/')\n * ```\n *\n * 6. Match by localStorage item 'promo' key\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'localStorage:promo')\n * ```\n *\n * 7. Click multiple elements with delay and matching by both cookie string and localStorage item\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"], input[type=\"submit\"][value=\"akkoord\"]', 'cookie:cmpconsent, localStorage:promo', '250')\n * ```\n *\n * 8. Click element only if cookie with name `cmpconsent` does not exist\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '!cookie:cmpconsent')\n * ```\n *\n * 9. Click element only if specified cookie string and localStorage item does not exist\n * ```\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '!cookie:cmpconsent, !localStorage:promo')\n * ```\n */\n /* eslint-enable max-len */\n function trustedClickElement$1(source, selectors) {\n let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n const OBSERVER_TIMEOUT_MS = 10000;\n const THROTTLE_DELAY_MS = 20;\n const STATIC_CLICK_DELAY_MS = 150;\n const COOKIE_MATCH_MARKER = 'cookie:';\n const LOCAL_STORAGE_MATCH_MARKER = 'localStorage:';\n const SELECTORS_DELIMITER = ',';\n const COOKIE_STRING_DELIMITER = ';';\n // Regex to split match pairs by commas, avoiding the ones included in regexes\n const EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n const sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n let parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n // eslint-disable-next-line max-len\n const message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n let canClick = !parsedDelay;\n const cookieMatches = [];\n const localStorageMatches = [];\n let isInvertedMatchCookie = false;\n let isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n // Get all match marker:value pairs from argument\n const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n\n // Filter match pairs by marker\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) {\n const _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, '');\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) {\n const _parseMatchArg2 = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = isInvertedMatch;\n const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, '');\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n const parsedCookies = parseCookieString(document.cookie);\n const cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n // Avoid getting /.?/ result from toRegExp on undefined\n // as cookie may be set without value,\n // on which cookie parsing will return cookieKey:undefined pair\n const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n const keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n const keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n\n // Key matching is enough if cookie value match is not specified\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n const shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n const localStorageMatched = localStorageMatches.every(function (str) {\n const itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === '';\n });\n const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!shouldRun) {\n return;\n }\n }\n\n /**\n * Create selectors array and swap selectors to null on finding it's element\n *\n * Selectors / nulls should not be (re)moved from array to:\n * - keep track of selectors order\n * - always know on what index corresponding element should be put\n * - prevent selectors from being queried multiple times\n */\n let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n const createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n const elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n\n /**\n * Go through elementsSequence from left to right, clicking on found elements\n *\n * Element should not be clicked if it is already clicked,\n * or a previous element is not found or clicked yet\n */\n const clickElementsBySequence = async function clickElementsBySequence() {\n for (let i = 0; i < elementsSequence.length; i += 1) {\n const elementObj = elementsSequence[i];\n // Add a delay between clicks to every element except the first one\n // https://github.com/AdguardTeam/Scriptlets/issues/284\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n // Stop clicking if that pos element is not found yet\n if (!elementObj.element) {\n break;\n }\n // Skip already clicked elements\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n const allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n // At this stage observer is already disconnected\n hit(source);\n }\n };\n const handleElement = function handleElement(element, i) {\n const elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n\n /**\n * Query all selectors from queue on each mutation\n * Each selector is swapped to null in selectorsSequence on founding corresponding element\n *\n * We start looking for elements before possible delay is over, to avoid cases\n * when delay is getting off after the last mutation took place.\n *\n */\n const findElements = function findElements(mutations, observer) {\n const fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n const element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n\n // selectorsSequence should be modified after the loop to not break loop indexation\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.indexOf(selector) === -1 ? selector : null;\n });\n\n // Disconnect observer after finding all elements\n const allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n // Click previously collected elements\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n trustedClickElement$1.names = ['trusted-click-element'\n // trusted scriptlets support no aliases\n ];\n\n trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage, parseMatchArg];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-property-read\n * @description\n * Aborts a script when it attempts to **read** the specified property.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-readjs-\n *\n * Related ABP source:\n * https://github.com/adblockplus/adblockpluscore/blob/6b2a309054cc23432102b85d13f12559639ef495/lib/content/snippets.js#L864\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('abort-on-property-read', property)\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`\n *\n * **Examples**\n * ```\n * ! Aborts script when it tries to access `window.alert`\n * example.org#%#//scriptlet('abort-on-property-read', 'alert')\n *\n * ! Aborts script when it tries to access `navigator.language`\n * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language')\n * ```\n */\n /* eslint-enable max-len */\n function abortOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyRead$1.names = ['abort-on-property-read',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read'];\n abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-property-write\n * @description\n * Aborts a script when it attempts to **write** the specified property.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-writejs-\n *\n * Related ABP source:\n * https://github.com/adblockplus/adblockpluscore/blob/6b2a309054cc23432102b85d13f12559639ef495/lib/content/snippets.js#L896\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('abort-on-property-write', property)\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`\n *\n * **Examples**\n * ```\n * ! Aborts script when it tries to set `window.adblock` value\n * example.org#%#//scriptlet('abort-on-property-write', 'adblock')\n * ```\n */\n /* eslint-enable max-len */\n function abortOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyWrite$1.names = ['abort-on-property-write',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write'];\n abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-setTimeout\n * @description\n * Prevents a `setTimeout` call if:\n * 1) the text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`;\n * otherwise mismatched calls should be defused;\n * 2) the delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-settimeout-ifjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-setTimeout'[, matchCallback[, matchDelay]])\n * ```\n *\n * Call with no arguments will log calls to setTimeout while debugging (`log-setTimeout` superseding),\n * so production filter lists' rules definitely require at least one of the parameters:\n * - `matchCallback` — optional, string or regular expression; invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * If not set, prevents all `setTimeout` calls due to specified `matchDelay`.\n * - `matchDelay` — optional, must be an integer.\n * If starts with `!`, scriptlet will not match the delay but all other will be defused.\n * If do not start with `!`, the delay passed to the `setTimeout` call will be matched.\n * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`.\n *\n * > If `prevent-setTimeout` log looks like `setTimeout(undefined, 1000)`,\n * it means that no callback was passed to setTimeout() and that's not scriptlet issue\n * and obviously it can not be matched by `matchCallback`.\n *\n * **Examples**\n * 1. Prevents `setTimeout` calls if the callback matches `/\\.test/` regardless of the delay.\n * ```bash\n * example.org#%#//scriptlet('prevent-setTimeout', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 100);\n * ```\n *\n * 2. Prevents `setTimeout` calls if the callback does not contain `value`.\n * ```\n * example.org#%#//scriptlet('prevent-setTimeout', '!value')\n * ```\n *\n * For instance, only the first of the following calls will be prevented:\n * ```javascript\n * setTimeout(function () {\n * window.test = \"test -- prevented\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setTimeout(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 3. Prevents `setTimeout` calls if the callback contains `value` and the delay is not set to `300`.\n * ```\n * example.org#%#//scriptlet('prevent-setTimeout', 'value', '!300')\n * ```\n *\n * For instance, only the first of the following calls will not be prevented:\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value 1 -- executed\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value 2 -- prevented\";\n * }, 400);\n * setTimeout(function () {\n * window.test = \"value 3 -- prevented\";\n * }, 500);\n * ```\n *\n * 4. Prevents `setTimeout` calls if the callback does not contain `value` and the delay is not set to `300`.\n * ```\n * example.org#%#//scriptlet('prevent-setTimeout', '!value', '!300')\n * ```\n *\n * For instance, only the second of the following calls will be prevented:\n * ```javascript\n * setTimeout(function () {\n * window.test = \"test -- executed\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"test -- prevented\";\n * }, 400);\n * setTimeout(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setTimeout(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 5. Prevents `setTimeout` calls if the callback contains `value` and delay is a decimal.\n * ```\n * example.org#%#//scriptlet('prevent-setTimeout', 'value', '300')\n * ```\n *\n * For instance, the following calls will be prevented:\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 300 + Math.random());\n * ```\n */\n /* eslint-enable max-len */\n function preventSetTimeout$1(source, matchCallback, matchDelay) {\n // logs setTimeouts to console if no arguments have been specified\n const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n preventSetTimeout$1.names = ['prevent-setTimeout',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-setTimeout-if.js',\n // new implementation of setTimeout-defuser.js\n 'ubo-no-setTimeout-if.js', 'nostif.js',\n // new short name of no-setTimeout-if\n 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif',\n // old scriptlet names which should be supported as well.\n // should be removed eventually.\n // do not remove until other filter lists maintainers use them\n 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std'];\n preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n // following helpers should be injected as helpers above use them\n parseMatchArg, parseDelayArg, toRegExp, startsWith$1, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-setInterval\n * @description\n * Prevents a `setInterval` call if:\n * 1) the text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`;\n * otherwise mismatched calls should be defused;\n * 2) the delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-setinterval-ifjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-setInterval'[, matchCallback[, matchDelay]])\n * ```\n *\n * Call with no arguments will log calls to setInterval while debugging (`log-setInterval` superseding),\n * so production filter lists' rules definitely require at least one of the parameters:\n * - `matchCallback` — optional, string or regular expression; invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * If not set, prevents all `setInterval` calls due to specified `matchDelay`.\n * - `matchDelay` — optional, must be an integer.\n * If starts with `!`, scriptlet will not match the delay but all other will be defused.\n * If do not start with `!`, the delay passed to the `setInterval` call will be matched.\n * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`.\n *\n * > If `prevent-setInterval` log looks like `setInterval(undefined, 1000)`,\n * it means that no callback was passed to setInterval() and that's not scriptlet issue\n * and obviously it can not be matched by `matchCallback`.\n *\n * **Examples**\n * 1. Prevents `setInterval` calls if the callback matches `/\\.test/` regardless of the delay.\n * ```bash\n * example.org#%#//scriptlet('prevent-setInterval', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n * ```javascript\n * setInterval(function () {\n * window.test = \"value\";\n * }, 100);\n * ```\n *\n * 2. Prevents `setInterval` calls if the callback does not contain `value`.\n * ```\n * example.org#%#//scriptlet('prevent-setInterval', '!value')\n * ```\n *\n * For instance, only the first of the following calls will be prevented:\n * ```javascript\n * setInterval(function () {\n * window.test = \"test -- prevented\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setInterval(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 3. Prevents `setInterval` calls if the callback contains `value` and the delay is not set to `300`.\n * ```\n * example.org#%#//scriptlet('prevent-setInterval', 'value', '!300')\n * ```\n *\n * For instance, only the first of the following calls will not be prevented:\n * ```javascript\n * setInterval(function () {\n * window.test = \"value 1 -- executed\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value 2 -- prevented\";\n * }, 400);\n * setInterval(function () {\n * window.test = \"value 3 -- prevented\";\n * }, 500);\n * ```\n *\n * 4. Prevents `setInterval` calls if the callback does not contain `value` and the delay is not set to `300`.\n * ```\n * example.org#%#//scriptlet('prevent-setInterval', '!value', '!300')\n * ```\n *\n * For instance, only the second of the following calls will be prevented:\n * ```javascript\n * setInterval(function () {\n * window.test = \"test -- executed\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"test -- prevented\";\n * }, 400);\n * setInterval(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setInterval(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 5. Prevents `setInterval` calls if the callback contains `value` and delay is a decimal.\n * ```\n * example.org#%#//scriptlet('prevent-setInterval', 'value', '300')\n * ```\n *\n * For instance, the following calls will be prevented:\n * ```javascript\n * setInterval(function () {\n * window.test = \"value\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value\";\n * }, 300 + Math.random());\n * ```\n */\n /* eslint-enable max-len */\n function preventSetInterval$1(source, matchCallback, matchDelay) {\n // logs setIntervals to console if no arguments have been specified\n const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n preventSetInterval$1.names = ['prevent-setInterval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-setInterval-if.js',\n // new implementation of setInterval-defuser.js\n 'ubo-no-setInterval-if.js', 'setInterval-defuser.js',\n // old name should be supported as well\n 'ubo-setInterval-defuser.js', 'nosiif.js',\n // new short name of no-setInterval-if\n 'ubo-nosiif.js', 'sid.js',\n // old short scriptlet name\n 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid'];\n preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n // following helpers should be injected as helpers above use them\n toRegExp, startsWith$1, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-window-open\n * @description\n * Prevents `window.open` calls when URL either matches or not matches the specified string/regexp. Using it without parameters prevents all `window.open` calls.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#windowopen-defuserjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-window-open'[, match[, delay[, replacement]]])\n * ```\n *\n * - `match` — optional, string or regular expression. If not set or regular expression is invalid, all window.open calls will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * - `delay` — optional, number of seconds. If not set, scriptlet will return `null`,\n * otherwise valid sham window object as injected `iframe` will be returned\n * for accessing its methods (blur(), focus() etc.) and will be removed after the delay.\n * - `replacement` — optional, string; one of the predefined constants:\n * - `obj` — for returning an object instead of default iframe;\n * for cases when the page requires a valid `window` instance to be returned\n * - `log` — for logging window.open calls; permitted for production filter lists.\n *\n * **Examples**\n * 1. Prevent all `window.open` calls:\n * ```\n * example.org#%#//scriptlet('prevent-window-open')\n * ```\n *\n * 2. Prevent `window.open` for all URLs containing `example`:\n * ```\n * example.org#%#//scriptlet('prevent-window-open', 'example')\n * ```\n *\n * 3. Prevent `window.open` for all URLs matching RegExp `/example\\./`:\n * ```\n * example.org#%#//scriptlet('prevent-window-open', '/example\\./')\n * ```\n *\n * 4. Prevent `window.open` for all URLs **NOT** containing `example`:\n * ```\n * example.org#%#//scriptlet('prevent-window-open', '!example')\n * ```\n *\n * Old syntax of prevent-window-open parameters:\n * - `match` — optional, defaults to \"matching\", any positive number or nothing for \"matching\", 0 or empty string for \"not matching\"\n * - `search` — optional, string or regexp for matching the URL passed to `window.open` call; defaults to search all `window.open` call\n * - `replacement` — optional, string to return prop value or property instead of window.open; defaults to return noopFunc.\n * **Examples**\n * ```\n * example.org#%#//scriptlet('prevent-window-open', '1', '/example\\./')\n * example.org#%#//scriptlet('prevent-window-open', '0', 'example')\n * example.org#%#//scriptlet('prevent-window-open', '', '', 'trueFunc')\n * example.org#%#//scriptlet('prevent-window-open', '1', '', '{propName=noopFunc}')\n * ```\n *\n * > For better compatibility with uBO, old syntax is not recommended to use.\n */\n /* eslint-enable max-len */\n function preventWindowOpen$1(source) {\n let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*';\n let delay = arguments.length > 2 ? arguments[2] : undefined;\n let replacement = arguments.length > 3 ? arguments[3] : undefined;\n // default match value is needed for preventing all window.open calls\n // if scriptlet runs without args\n const nativeOpen = window.open;\n const isNewSyntax = match !== '0' && match !== '1';\n const oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n // 'delay' was 'search' prop for matching in old syntax\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n const searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n const newOpenWrapper = function newOpenWrapper(url) {\n const shouldLog = replacement && replacement.indexOf('log') > -1;\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n const argsStr = args && args.length > 0 ? \", \".concat(args.join(', ')) : '';\n const message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n let shouldPrevent = false;\n if (match === '*') {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n const parsedDelay = parseInt(delay, 10);\n let result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n const decoyArgs = {\n replacement,\n url,\n delay: parsedDelay\n };\n const decoy = createDecoy(decoyArgs);\n let popup = decoy.contentWindow;\n if (typeof popup === 'object' && popup !== null) {\n Object.defineProperty(popup, 'closed', {\n value: false\n });\n Object.defineProperty(popup, 'opener', {\n value: window\n });\n Object.defineProperty(popup, 'frameElement', {\n value: null\n });\n } else {\n const nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, 'contentWindow', {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n\n // Protect window.open from native code check\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n preventWindowOpen$1.names = ['prevent-window-open',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif'];\n preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith$1, endsWith, substringBefore, substringAfter$1];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-current-inline-script\n * @description\n * Aborts an inline script when it attempts to **read** or **write to** the specified property\n * AND when the contents of the `\n * ```\n *\n * 3. Aborts inline scripts which are trying to access `window.alert` and match this regexp: `/Hello.+world/`.\n * ```\n * example.org#%#//scriptlet('abort-current-inline-script', 'alert', '/Hello.+world/')\n * ```\n *\n * For instance, the following scripts will be aborted:\n * ```html\n * \n * ```\n * ```html\n * \n * ```\n *\n * This script will not be aborted:\n * ```html\n * \n * ```\n */\n /* eslint-enable max-len */\n function abortCurrentInlineScript$1(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const SRC_DATA_MARKER = 'data:text/javascript;base64,';\n const getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n\n // We are using Node.prototype.textContent property descriptor\n // to get the real script content\n // even when document.currentScript.textContent is replaced.\n // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {} // eslint-disable-line no-empty\n\n // https://github.com/AdguardTeam/Scriptlets/issues/130\n if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith$1(scriptEl.src, SRC_DATA_MARKER)) {\n const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // The scriptlet might be executed before the chain property has been created\n // (for instance, document.body before the HTML body was loaded).\n // In this case we're checking whether the base element exists or not\n // and if not, we simply exit without overriding anything.\n // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092\n if (base instanceof Object === false && base === null) {\n const props = property.split('.');\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n let origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortCurrentInlineScript$1.names = ['abort-current-inline-script',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js',\n // \"ubo\"-aliases with no \"js\"-ending\n 'ubo-abort-current-script', 'ubo-acs',\n // obsolete but supported aliases\n 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script'];\n abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith$1, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-constant\n * @description\n * Creates a constant property and assigns it one of the values from the predefined list.\n *\n * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type.\n *\n * > If empty object is present in chain it will be trapped until chain leftovers appear.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#set-constantjs-\n *\n * Related ABP snippet:\n * https://github.com/adblockplus/adblockpluscore/blob/adblockpluschrome-3.9.4/lib/content/snippets.js#L1361\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('set-constant', property, value[, stack])\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`.\n * - `value` — required. Possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `noopFunc` — function with empty body\n * - `noopCallbackFunc` — function returning noopFunc\n * - `trueFunc` — function returning true\n * - `falseFunc` — function returning false\n * - `throwFunc` — function throwing an error\n * - `noopPromiseResolve` — function returning Promise object that is resolved with an empty response\n * - `noopPromiseReject` — function returning Promise.reject()\n * - `''` — empty string\n * - `-1` — number value `-1`\n * - `yes`\n * - `no`\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * **Examples**\n * ```\n * ! Any access to `window.first` will return `false`\n * example.org#%#//scriptlet('set-constant', 'first', 'false')\n *\n * ✔ window.first === false\n * ```\n *\n * ```\n * ! Any call to `window.second()` will return `true`\n * example.org#%#//scriptlet('set-constant', 'second', 'trueFunc')\n *\n * ✔ window.second() === true\n * ✔ window.second.toString() === \"function trueFunc() {return true;}\"\n * ```\n *\n * ```\n * ! Any call to `document.third()` will return `true` if the method is related to `checking.js`\n * example.org#%#//scriptlet('set-constant', 'document.third', 'trueFunc', 'checking.js')\n *\n * ✔ document.third() === true // if the condition described above is met\n * ```\n */\n /* eslint-enable max-len */\n function setConstant$1(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const emptyArr = noopArray();\n const emptyObj = noopObject();\n let constantValue;\n if (value === 'undefined') {\n constantValue = undefined;\n } else if (value === 'false') {\n constantValue = false;\n } else if (value === 'true') {\n constantValue = true;\n } else if (value === 'null') {\n constantValue = null;\n } else if (value === 'emptyArr') {\n constantValue = emptyArr;\n } else if (value === 'emptyObj') {\n constantValue = emptyObj;\n } else if (value === 'noopFunc') {\n constantValue = noopFunc;\n } else if (value === 'noopCallbackFunc') {\n constantValue = noopCallbackFunc;\n } else if (value === 'trueFunc') {\n constantValue = trueFunc;\n } else if (value === 'falseFunc') {\n constantValue = falseFunc;\n } else if (value === 'throwFunc') {\n constantValue = throwFunc;\n } else if (value === 'noopPromiseResolve') {\n constantValue = noopPromiseResolve;\n } else if (value === 'noopPromiseReject') {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === '-1') {\n constantValue = -1;\n } else if (value === '') {\n constantValue = '';\n } else if (value === 'yes') {\n constantValue = 'yes';\n } else if (value === 'no') {\n constantValue = 'no';\n } else {\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n\n /**\n * Safely sets property on a given object\n *\n * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {Object} base arbitrary reachable object\n * @param {string} prop property name\n * @param {boolean} configurable if set property should be configurable\n * @param {Object} handler custom property descriptor object\n * @returns {boolean} true if prop was trapped successfully\n */\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n // This is required to prevent scriptlets overwrite each over\n if (origDescriptor instanceof Object) {\n // This check is required to avoid defining non-configurable props\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n\n /**\n * Traverses given chain to set constant value to its end prop\n * Chains that yet include non-object values (e.g null) are valid and will be\n * traversed when appropriate chain member is set by an external script\n *\n * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {Object} owner object that owns chain\n * @param {string} property chain of owner properties\n */\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // Handler method init is used to keep track of factual value\n // and apply mustCancel() check only on end prop\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n // Prevent breakage due to loop assignments like win.obj = win.obj\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n\n // End prop case\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n\n // Null prop in chain\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n\n // Empty object prop in chain\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n\n // Defined prop in chain\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n\n // Undefined prop in chain\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n setConstant$1.names = ['set-constant',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read'];\n setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest,\n // following helpers should be imported and injected\n // because they are used by helpers above\n shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-cookie\n * @description\n * Removes current page cookies by passed string matching with name. For current domain and subdomains. Runs on load and before unload.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#cookie-removerjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('remove-cookie'[, match])\n * ```\n *\n * - `match` — optional, string or regex matching the cookie name. If not specified all accessible cookies will be removed.\n *\n * **Examples**\n * 1. Removes all cookies:\n * ```\n * example.org#%#//scriptlet('remove-cookie')\n * ```\n *\n * 2. Removes cookies which name contains `example` string:\n * ```\n * example.org#%#//scriptlet('remove-cookie', 'example')\n * ```\n *\n * For instance this cookie will be removed:\n *\n * ```javascript\n * document.cookie = '__example=randomValue';\n * ```\n */\n /* eslint-enable max-len */\n function removeCookie$1(source, match) {\n const matchRegexp = toRegExp(match);\n const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n const cookieSpec = \"\".concat(cookieName, \"=\");\n const domain1 = \"; domain=\".concat(hostName);\n const domain2 = \"; domain=.\".concat(hostName);\n const path = '; path=/';\n const expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n const rmCookie = function rmCookie() {\n document.cookie.split(';').forEach(function (cookieStr) {\n const pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n const hostParts = document.location.hostname.split('.');\n for (let i = 0; i <= hostParts.length - 1; i += 1) {\n const hostName = hostParts.slice(i).join('.');\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener('beforeunload', rmCookie);\n }\n removeCookie$1.names = ['remove-cookie',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover'];\n removeCookie$1.injections = [toRegExp, hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-addEventListener\n * @description\n * Prevents adding event listeners for the specified events and callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-defuserjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-addEventListener'[, typeSearch[, listenerSearch]])\n * ```\n *\n * - `typeSearch` — optional, string or regular expression matching the type (event name);\n * defaults to match all types; invalid regular expression will cause exit and rule will not work\n * - `listenerSearch` — optional, string or regular expression matching the listener function body;\n * defaults to match all listeners; invalid regular expression will cause exit and rule will not work\n *\n * **Examples**\n * 1. Prevent all `click` listeners:\n * ```\n * example.org#%#//scriptlet('prevent-addEventListener', 'click')\n * ```\n *\n 2. Prevent 'click' listeners with the callback body containing `searchString`.\n * ```\n * example.org#%#//scriptlet('prevent-addEventListener', 'click', 'searchString')\n * ```\n *\n * For instance, this listener will not be called:\n *\n * ```javascript\n * el.addEventListener('click', () => {\n * window.test = 'searchString';\n * });\n * ```\n */\n /* eslint-enable max-len */\n function preventAddEventListener$1(source, typeSearch, listenerSearch) {\n const typeSearchRegexp = toRegExp(typeSearch);\n const listenerSearchRegexp = toRegExp(listenerSearch);\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n let shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n\n // Avoid illegal invocations due to lost context\n // https://github.com/AdguardTeam/Scriptlets/issues/271\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/215\n // https://github.com/AdguardTeam/Scriptlets/issues/143\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n preventAddEventListener$1.names = ['prevent-addEventListener',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld'];\n preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString];\n\n /* eslint-disable consistent-return, no-eval */\n\n /**\n * @scriptlet prevent-bab\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#bab-defuserjs-\n *\n * It also can be used as `$redirect` sometimes.\n * See [redirect description](../wiki/about-redirects.md#prevent-bab).\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-bab')\n * ```\n */\n function preventBab$2(source) {\n const nativeSetTimeout = window.setTimeout;\n const babRegex = /\\.bab_elementid.$/;\n const timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== 'string' || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n const signatures = [['blockadblock'], ['babasbm'], [/getItem\\('babn'\\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']];\n const check = function check(str) {\n if (typeof str !== 'string') {\n return false;\n }\n for (let i = 0; i < signatures.length; i += 1) {\n const tokens = signatures[i];\n let match = 0;\n for (let j = 0; j < tokens.length; j += 1) {\n const token = tokens[j];\n const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1;\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= 0.8) {\n return true;\n }\n }\n return false;\n };\n const nativeEval = window.eval;\n const evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n const bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty('visibility');\n }\n const el = document.getElementById('babasbmsgx');\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n preventBab$2.names = ['prevent-bab'\n // there is no aliases for this scriptlet\n ];\n\n preventBab$2.injections = [hit];\n\n /* eslint-disable no-unused-vars, no-extra-bind, func-names */\n\n /* eslint-disable max-len */\n /**\n * @scriptlet nowebrtc\n * @description\n * Disables WebRTC by overriding `RTCPeerConnection`. The overridden function will log every attempt to create a new connection.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nowebrtcjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('nowebrtc')\n * ```\n */\n /* eslint-enable max-len */\n function nowebrtc$1(source) {\n let propertyName = '';\n if (window.RTCPeerConnection) {\n propertyName = 'RTCPeerConnection';\n } else if (window.webkitRTCPeerConnection) {\n propertyName = 'webkitRTCPeerConnection';\n }\n if (propertyName === '') {\n return;\n }\n const rtcReplacement = function rtcReplacement(config) {\n // eslint-disable-next-line max-len\n const message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n const rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n nowebrtc$1.names = ['nowebrtc',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc'];\n nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString];\n\n /**\n * @scriptlet log-addEventListener\n * @description\n * Logs all addEventListener calls to the console.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-loggerjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('log-addEventListener')\n * ```\n */\n function logAddEventListener$1(source) {\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n const message = \"addEventListener(\\\"\".concat(type, \"\\\", \").concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n }\n\n // logging while debugging\n const message = \"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type), \"\\nlistener: \").concat(convertTypeToString(listener));\n logMessage(source, message, true);\n\n // Avoid illegal invocations due to lost context\n // https://github.com/AdguardTeam/Scriptlets/issues/271\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/215\n // https://github.com/AdguardTeam/Scriptlets/issues/143\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n logAddEventListener$1.names = ['log-addEventListener',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell'];\n logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject, getObjectEntries];\n\n /* eslint-disable no-eval */\n\n /**\n * @scriptlet log-eval\n * @description\n * Logs all `eval()` or `new Function()` calls to the console.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('log-eval')\n * ```\n */\n function logEval$1(source) {\n // wrap eval function\n const nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, \"eval(\\\"\".concat(str, \"\\\")\"), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n\n // wrap new Function\n const nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(', '), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n logEval$1.names = ['log-eval'];\n logEval$1.injections = [hit, logMessage];\n\n /**\n * @scriptlet log\n * @description\n * A simple scriptlet which only purpose is to print arguments to console.\n * This scriptlet can be helpful for debugging and troubleshooting other scriptlets.\n *\n * **Example**\n * ```\n * example.org#%#//scriptlet('log', 'arg1', 'arg2')\n * ```\n */\n function log$1() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args); // eslint-disable-line no-console\n }\n\n log$1.names = ['log'];\n\n /* eslint-disable no-eval, no-extra-bind */\n\n /**\n * @scriptlet noeval\n * @description\n * Prevents page to use eval.\n * Notifies about attempts in the console\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#noevaljs-\n *\n * It also can be used as `$redirect` rules sometimes.\n * See [redirect description](../wiki/about-redirects.md#noeval).\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('noeval')\n * ```\n */\n function noeval$1(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n noeval$1.names = ['noeval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval'];\n noeval$1.injections = [hit, logMessage];\n\n /* eslint-disable no-eval, no-extra-bind, func-names */\n\n /**\n * @scriptlet prevent-eval-if\n * @description\n * Prevents page to use eval matching payload.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#noeval-ifjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-eval-if'[, search])\n * ```\n *\n * - `search` — optional, string or regular expression matching the stringified eval payload;\n * defaults to match all stringified eval payloads;\n * invalid regular expression will cause exit and rule will not work\n *\n * **Examples**\n * ```\n * ! Prevents eval if it matches 'test'\n * example.org#%#//scriptlet('prevent-eval-if', 'test')\n * ```\n */\n function preventEvalIf$1(source, search) {\n const searchRegexp = toRegExp(search);\n const nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n preventEvalIf$1.names = ['prevent-eval-if',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if'];\n preventEvalIf$1.injections = [toRegExp, hit];\n\n /* eslint-disable func-names, no-multi-assign */\n\n /**\n * @scriptlet prevent-fab-3.2.0\n * @description\n * Prevents execution of the FAB script v3.2.0.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#fuckadblockjs-320-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-fab-3.2.0')\n * ```\n */\n function preventFab$1(source) {\n hit(source);\n\n // redefines Fab function for adblock detection\n const Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n const fab = new Fab();\n const getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n const getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n\n // redefined Fab data properties which if 'FuckAdBlock' variable exists\n if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) {\n window.FuckAdBlock = Fab;\n } else {\n // or redefined Fab accessor properties\n Object.defineProperty(window, 'FuckAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'BlockAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'SniffAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, 'fuckAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, 'blockAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, 'sniffAdBlock', getsetfab);\n }\n }\n preventFab$1.names = ['prevent-fab-3.2.0',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab'];\n preventFab$1.injections = [hit, noopFunc, noopThis];\n\n /* eslint-disable func-names, no-multi-assign */\n\n /**\n * @scriptlet set-popads-dummy\n * @description\n * Sets static properties PopAds and popns.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#popads-dummyjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('set-popads-dummy')\n * ```\n */\n function setPopadsDummy$1(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n setPopadsDummy$1.names = ['set-popads-dummy',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy'];\n setPopadsDummy$1.injections = [hit];\n\n /**\n * @scriptlet prevent-popads-net\n * @description\n * Aborts on property write (PopAds, popns), throws reference error with random id.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#popadsnetjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-popads-net')\n * ```\n */\n function preventPopadsNet$1(source) {\n const rid = randomId();\n const throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n preventPopadsNet$1.names = ['prevent-popads-net',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net'];\n preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit];\n\n /* eslint-disable func-names */\n\n /**\n * @scriptlet prevent-adfly\n * @description\n * Prevents anti-adblock scripts on adfly short links.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#adfly-defuserjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-adfly')\n * ```\n */\n function preventAdfly$1(source) {\n const isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n const handler = function handler(encodedURL) {\n let evenChars = '';\n let oddChars = '';\n for (let i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n let data = (evenChars + oddChars).split('');\n for (let i = 0; i < data.length; i += 1) {\n if (isDigit(data[i])) {\n for (let ii = i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n // eslint-disable-next-line no-bitwise\n const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[i] = temp.toString();\n }\n i = ii;\n break;\n }\n }\n }\n }\n data = data.join('');\n const decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n let val;\n // Do not apply handler more than one time\n let applyHandler = true;\n const result = setPropertyAccess(window, 'ysmm', {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === 'string') {\n handler(value);\n }\n } catch (err) {} // eslint-disable-line no-empty\n }\n\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, 'Failed to set up prevent-adfly scriptlet');\n }\n }\n preventAdfly$1.names = ['prevent-adfly',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser'];\n preventAdfly$1.injections = [setPropertyAccess, hit, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-on-property-read\n * @description\n * This scriptlet is basically the same as [abort-on-property-read](#abort-on-property-read), but instead of aborting it starts the debugger.\n *\n * **It is not supposed to be used in production filter lists!**\n *\n * **Syntax**\n * ```\n * ! Debug script if it tries to access `window.alert`\n * example.org#%#//scriptlet('debug-on-property-read', 'alert')\n * ! of `window.open`\n * example.org#%#//scriptlet('debug-on-property-read', 'open')\n * ```\n */\n /* eslint-enable max-len */\n function debugOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n };\n\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyRead$1.names = ['debug-on-property-read'];\n debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-on-property-write\n * @description\n * This scriptlet is basically the same as [abort-on-property-write](#abort-on-property-write), but instead of aborting it starts the debugger.\n *\n * **It is not supposed to be used in production filter lists!**\n *\n * **Syntax**\n * ```\n * ! Aborts script when it tries to write in property `window.test`\n * example.org#%#//scriptlet('debug-on-property-write', 'test')\n * ```\n */\n /* eslint-enable max-len */\n function debugOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n };\n\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyWrite$1.names = ['debug-on-property-write'];\n debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-current-inline-script\n * @description\n * This scriptlet is basically the same as [abort-current-inline-script](#abort-current-inline-script), but instead of aborting it starts the debugger.\n *\n * **It is not supposed to be used in production filter lists!**\n *\n * **Syntax**\n *```\n * ! Aborts script when it tries to access `window.alert`\n * example.org#%#//scriptlet('debug-current-inline-script', 'alert')\n * ```\n */\n /* eslint-enable max-len */\n function debugCurrentInlineScript$1(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n\n // We are using Node.prototype.textContent property descriptor\n // to get the real script content\n // even when document.currentScript.textContent is replaced.\n // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {} // eslint-disable-line no-empty\n\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n }\n };\n\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // The scriptlet might be executed before the chain property has been created\n // (for instance, document.body before the HTML body was loaded).\n // In this case we're checking whether the base element exists or not\n // and if not, we simply exit without overriding anything.\n // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092\n if (base instanceof Object === false && base === null) {\n const props = property.split('.');\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugCurrentInlineScript$1.names = ['debug-current-inline-script'];\n debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-attr\n * @description\n * Removes the specified attributes from DOM nodes. This scriptlet runs once when the page loads\n * and after that periodically in order to DOM tree changes by default,\n * or as specified by applying argument.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-attrjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('remove-attr', attrs[, selector, applying])\n * ```\n *\n * - `attrs` — required, attribute or list of attributes joined by '|'\n * - `selector` — optional, CSS selector, specifies DOM nodes from which the attributes will be removed\n * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, defaults to 'asap stay'; possible flags:\n * - `asap` — runs as fast as possible **once**\n * - `complete` — runs **once** after the whole page has been loaded\n * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes\n *\n * **Examples**\n * 1. Removes by attribute\n * ```\n * example.org#%#//scriptlet('remove-attr', 'example|test')\n * ```\n *\n * ```html\n * \n *
Some text
\n *\n * \n *
Some text
\n * ```\n *\n * 2. Removes with specified selector\n * ```\n * example.org#%#//scriptlet('remove-attr', 'example', 'div[class=\"inner\"]')\n * ```\n *\n * ```html\n * \n *
\n *
Some text
\n *
\n *\n * \n *
\n *
Some text
\n *
\n * ```\n *\n * 3. Using flags\n * ```\n * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete')\n * ```\n */\n /* eslint-enable max-len */\n function removeAttr$1(source, attrs, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join('],['), \"]\");\n }\n const rmattr = function rmattr() {\n let nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n let removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const flags = parseFlags(applying);\n const run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n // 'true' for observing attributes\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n // https://github.com/AdguardTeam/Scriptlets/issues/245\n // Call rmattr on DOM content loaded\n // to ensure that target node is present on the page\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n // Only call rmattr for single 'stay' flag\n if (!applying.indexOf(' ') !== -1) {\n rmattr();\n }\n // 'true' for observing attributes\n observeDOMChanges(rmattr, true);\n }\n }\n removeAttr$1.names = ['remove-attr',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra'];\n removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-attr\n * @description\n * Sets the specified attribute on the specified elements. This scriptlet runs once when the page loads\n * and after that and after that on DOM tree changes.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('set-attr', selector, attr[, value])\n * ```\n *\n * - `selector` — required, CSS selector, specifies DOM nodes to set attributes on\n * - `attr` — required, attribute to be set\n * - `value` — the value to assign to the attribute, defaults to ''. Possible values:\n * - `''` — empty string\n * - positive decimal integer `<= 32767`\n * - `true` / `false` in any case variation\n *\n * **Examples**\n * 1. Set attribute by selector\n * ```\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', '0')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n * 2. Set attribute without value\n * ```\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n * 3. Set attribute value to `TRUE`\n * ```\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'TRUE')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n * 4. Set attribute value to `fAlse`\n * ```\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'fAlse')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n */\n /* eslint-enable max-len */\n function setAttr$1(source, selector, attr) {\n let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n if (!selector || !attr) {\n return;\n }\n const allowedValues = ['true', 'false'];\n\n // Drop strings that cant be parsed into number, negative numbers and numbers below 32767\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n const setAttr = function setAttr() {\n const nodes = [].slice.call(document.querySelectorAll(selector));\n let set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n setAttr$1.names = ['set-attr'];\n setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-class\n * @description\n * Removes the specified classes from DOM nodes. This scriptlet runs once after the page loads\n * and after that periodically in order to DOM tree changes.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-classjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('remove-class', classes[, selector, applying])\n * ```\n *\n * - `classes` — required, class or list of classes separated by '|'\n * - `selector` — optional, CSS selector, specifies DOM nodes from which the classes will be removed.\n * If there is no `selector`, each class of `classes` independently will be removed from all nodes which has one\n * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply, defaults to 'asap stay'; possible flags:\n * - `asap` — runs as fast as possible **once**\n * - `complete` — runs **once** after the whole page has been loaded\n * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes\n *\n * **Examples**\n * 1. Removes by classes\n * ```\n * example.org#%#//scriptlet('remove-class', 'example|test')\n * ```\n *\n * ```html\n * \n *
Some text
\n *
Some text
\n *
Some text
\n *\n * \n *
Some text
\n *
Some text
\n *
Some text
\n * ```\n *\n * 2. Removes with specified selector\n * ```\n * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^=\"inner\"]')\n * ```\n *\n * ```html\n * \n *
\n *
Some text
\n *
\n *\n * \n *
\n *
Some text
\n *
\n * ```\n *\n * 3. Using flags\n * ```\n * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^=\"inner\"]', 'asap complete')\n * ```\n */\n /* eslint-enable max-len */\n\n function removeClass$1(source, classNames, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n let selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n const removeClassHandler = function removeClassHandler() {\n const nodes = new Set();\n if (selector) {\n let foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n const elements = document.querySelectorAll(s);\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n nodes.add(element);\n }\n });\n }\n let removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const CLASS_ATTR_NAME = ['class'];\n const flags = parseFlags(applying);\n const run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n // 'true' for observing attributes\n // 'class' for observing only classes\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n // https://github.com/AdguardTeam/Scriptlets/issues/245\n // Call removeClassHandler on DOM content loaded\n // to ensure that target node is present on the page\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n // Only call removeClassHandler for single 'stay' flag\n if (!applying.indexOf(' ') !== -1) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n removeClass$1.names = ['remove-class',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc'];\n removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /**\n * @scriptlet disable-newtab-links\n * @description\n * Prevents opening new tabs and windows if there is `target` attribute in element.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#disable-newtab-linksjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('disable-newtab-links')\n * ```\n */\n function disableNewtabLinks$1(source) {\n document.addEventListener('click', function (ev) {\n let target = ev.target;\n while (target !== null) {\n if (target.localName === 'a' && target.hasAttribute('target')) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n disableNewtabLinks$1.names = ['disable-newtab-links',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links'];\n disableNewtabLinks$1.injections = [hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet adjust-setInterval\n * @description\n * Adjusts delay for specified setInterval() callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-setinterval-boosterjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('adjust-setInterval'[, matchCallback [, matchDelay[, boost]]])\n * ```\n *\n * - `matchCallback` — optional, string or regular expression for stringified callback matching;\n * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work\n * - `matchDelay` — optional, defaults to 1000, matching setInterval delay; decimal integer OR '*' for any delay\n * - `boost` — optional, default to 0.05, float, capped at 1000 times for up and 50 for down (0.001...50), setInterval delay multiplier\n *\n * **Examples**\n * 1. Adjust all setInterval() x20 times where delay equal 1000ms:\n * ```\n * example.org#%#//scriptlet('adjust-setInterval')\n * ```\n *\n * 2. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 1000ms\n * ```\n * example.org#%#//scriptlet('adjust-setInterval', 'example')\n * ```\n *\n * 3. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 400ms\n * ```\n * example.org#%#//scriptlet('adjust-setInterval', 'example', '400')\n * ```\n *\n * 4. Slow down setInterval() x2 times where callback matched with `example` and delay equal 1000ms\n * ```\n * example.org#%#//scriptlet('adjust-setInterval', 'example', '', '2')\n * ```\n * 5. Adjust all setInterval() x50 times where delay equal 2000ms\n * ```\n * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.02')\n * ```\n * 6. Adjust all setInterval() x1000 times where delay equal 2000ms\n * ```\n * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.001')\n * ```\n * 7. Adjust all setInterval() x50 times where delay is randomized\n * ```\n * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02')\n * ```\n */\n /* eslint-enable max-len */\n function adjustSetInterval$1(source, matchCallback, matchDelay, boost) {\n const nativeSetInterval = window.setInterval;\n const matchRegexp = toRegExp(matchCallback);\n const intervalWrapper = function intervalWrapper(callback, delay) {\n // https://github.com/AdguardTeam/Scriptlets/issues/221\n if (!isValidCallback(callback)) {\n // eslint-disable-next-line max-len\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n adjustSetInterval$1.names = ['adjust-setInterval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib'];\n adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n // following helpers should be injected as helpers above use them\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet adjust-setTimeout\n * @description\n * Adjusts delay for specified setTimeout() callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-settimeout-boosterjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout'[, matchCallback [, matchDelay[, boost]]])\n * ```\n *\n * - `matchCallback` — optional, string or regular expression for stringified callback matching;\n * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work\n * - `matchDelay` — optional, defaults to 1000, matching setTimeout delay; decimal integer OR '*' for any delay\n * - `boost` — optional, default to 0.05, float, capped at 1000 times for up and 50 for down (0.001...50), setTimeout delay multiplier\n *\n * **Examples**\n * 1. Adjust all setTimeout() x20 times where timeout equal 1000ms:\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout')\n * ```\n *\n * 2. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 1000ms\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout', 'example')\n * ```\n *\n * 3. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 400ms\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout', 'example', '400')\n * ```\n *\n * 4. Slow down setTimeout() x2 times where callback matched with `example` and timeout equal 1000ms\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout', 'example', '', '2')\n * ```\n * 5. Adjust all setTimeout() x50 times where timeout equal 2000ms\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.02')\n * ```\n * 6. Adjust all setTimeout() x1000 times where timeout equal 2000ms\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.001')\n * ```\n * 7. Adjust all setTimeout() x20 times where callback matched with `test` and timeout is randomized\n * ```\n * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*')\n * ```\n */\n /* eslint-enable max-len */\n function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) {\n const nativeSetTimeout = window.setTimeout;\n const matchRegexp = toRegExp(matchCallback);\n const timeoutWrapper = function timeoutWrapper(callback, delay) {\n // https://github.com/AdguardTeam/Scriptlets/issues/221\n if (!isValidCallback(callback)) {\n // eslint-disable-next-line max-len\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n adjustSetTimeout$1.names = ['adjust-setTimeout',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb'];\n adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n // following helpers should be injected as helpers above use them\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet dir-string\n * @description\n * Wraps the `console.dir` API to call the `toString` method of the argument.\n * There are several adblock circumvention systems that detect browser devtools\n * and hide themselves. Therefore, if we force them to think\n * that devtools are open (using this scriptlet),\n * it will automatically disable the adblock circumvention script.\n *\n * Related ABP source:\n * https://github.com/adblockplus/adblockpluscore/blob/6b2a309054cc23432102b85d13f12559639ef495/lib/content/snippets.js#L766\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('dir-string'[, times])\n * ```\n * - `times` — optional, the number of times to call the `toString` method of the argument to `console.dir`\n *\n * **Example**\n * ```\n * ! Run 2 times\n * example.org#%#//scriptlet('dir-string', '2')\n * ```\n */\n /* eslint-enable max-len */\n function dirString$1(source, times) {\n const _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === 'function') {\n dir.call(this, object);\n }\n hit(source);\n }\n // eslint-disable-next-line no-console\n console.dir = dirWrapper;\n }\n dirString$1.names = ['dir-string', 'abp-dir-string'];\n dirString$1.injections = [hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet json-prune\n * @description\n * Removes specified properties from the result of calling JSON.parse and returns the caller\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#json-prunejs-\n *\n * Related ABP source:\n * https://github.com/adblockplus/adblockpluscore/blob/master/lib/content/snippets.js#L1285\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('json-prune'[, propsToRemove [, obligatoryProps [, stack]]])\n * ```\n *\n * - `propsToRemove` — optional, string of space-separated properties to remove\n * - `obligatoryProps` — optional, string of space-separated properties which must be all present for the pruning to occur\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * > Note please that you can use wildcard `*` for chain property name.\n * e.g. 'ad.*.src' instead of 'ad.0.src ad.1.src ad.2.src ...'\n *\n * **Examples**\n * 1. Removes property `example` from the results of JSON.parse call\n * ```\n * example.org#%#//scriptlet('json-prune', 'example')\n * ```\n *\n * For instance, the following call will return `{ one: 1}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"example\":true}')\n * ```\n *\n * 2. If there are no specified properties in the result of JSON.parse call, pruning will NOT occur\n * ```\n * example.org#%#//scriptlet('json-prune', 'one', 'obligatoryProp')\n * ```\n *\n * For instance, the following call will return `{ one: 1, two: 2}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"two\":2}')\n * ```\n *\n * 3. A property in a list of properties can be a chain of properties\n *\n * ```\n * example.org#%#//scriptlet('json-prune', 'a.b', 'adpath.url.first')\n * ```\n *\n * 4. Removes property `content.ad` from the results of JSON.parse call if its error stack trace contains `test.js`\n * ```\n * example.org#%#//scriptlet('json-prune', 'content.ad', '', 'test.js')\n * ```\n *\n * 5. A property in a list of properties can be a chain of properties with wildcard in it\n *\n * ```\n * example.org#%#//scriptlet('json-prune', 'content.*.media.src', 'content.*.media.preroll')\n * ```\n *\n * 6. Call with no arguments will log the current hostname and json payload at the console\n * ```\n * example.org#%#//scriptlet('json-prune')\n * ```\n *\n * 7. Call with only second argument will log the current hostname and matched json payload at the console\n * ```\n * example.org#%#//scriptlet('json-prune', '', '\"id\":\"117458\"')\n * ```\n */\n /* eslint-enable max-len */\n function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : [];\n const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : [];\n function isPruningNeeded(root) {\n if (!root) {\n return false;\n }\n let shouldProcess;\n\n // Only log hostname and matched JSON payload if only second argument is present\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n const rootString = JSON.stringify(root);\n const matchRegex = toRegExp(requiredPaths.join(''));\n const shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n for (let i = 0; i < requiredPaths.length; i += 1) {\n const requiredPath = requiredPaths[i];\n const lastNestedPropName = requiredPath.split('.').pop();\n const hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1;\n\n // if the path has wildcard, getPropertyInChain should 'look through' chain props\n const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n\n // start value of 'shouldProcess' due to checking below\n shouldProcess = !hasWildcard;\n for (let i = 0; i < details.length; i += 1) {\n if (hasWildcard) {\n // if there is a wildcard,\n // at least one (||) of props chain should be present in object\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess;\n } else {\n // otherwise each one (&&) of them should be there\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess;\n }\n }\n }\n return shouldProcess;\n }\n\n /**\n * Prunes properties of 'root' object\n *\n * @param {Object} root\n * @returns {Object} pruned root\n */\n const jsonPruner = function jsonPruner(root) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(root) === false) {\n return root;\n }\n\n // if pruning is needed, we check every input pathToRemove\n // and delete it if root has it\n prunePaths.forEach(function (path) {\n const ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n };\n const nativeJSONParse = JSON.parse;\n const jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n // dealing with stringified json in args, which should be parsed.\n // so we call nativeJSONParse as JSON.parse which is bound to JSON object\n const root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(root);\n };\n\n // JSON.parse mocking\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n const nativeResponseJson = Response.prototype.json;\n // eslint-disable-next-line func-names\n const responseJsonWrapper = function responseJsonWrapper() {\n const promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(obj);\n });\n };\n\n // do nothing if browser does not support Response (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/Response\n if (typeof Response === 'undefined') {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n jsonPrune$1.names = ['json-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune'];\n jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage,\n // following helpers are needed for helpers above\n toRegExp, getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-requestAnimationFrame\n * @description\n * Prevents a `requestAnimationFrame` call\n * if the text of the callback is matching the specified search string which does not start with `!`;\n * otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-requestanimationframe-ifjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-requestAnimationFrame'[, search])\n * ```\n *\n * - `search` — optional, string or regular expression; invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n *\n * Call with no argument will log all requestAnimationFrame calls while debugging.\n * So do not use the scriptlet without any parameter in production filter lists.\n *\n * **Examples**\n * 1. Prevents `requestAnimationFrame` calls if the callback matches `/\\.test/`.\n * ```bash\n * example.org#%#//scriptlet('prevent-requestAnimationFrame', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n * ```javascript\n * var times = 0;\n * requestAnimationFrame(function change() {\n * window.test = 'new value';\n * if (times < 2) {\n * times += 1;\n * requestAnimationFrame(change);\n * }\n * });\n * ```\n * 2. Prevents `requestAnimationFrame` calls if **does not match** 'check'.\n * ```bash\n * example.org#%#//scriptlet('prevent-requestAnimationFrame', '!check')\n * ```\n *\n * For instance, only the first call will be prevented:\n *\n * ```javascript\n * var timesFirst = 0;\n * requestAnimationFrame(function changeFirst() {\n * window.check = 'should not be prevented';\n * if (timesFirst < 2) {\n * timesFirst += 1;\n * requestAnimationFrame(changeFirst);\n * }\n * });\n *\n * var timesSecond = 0;\n * requestAnimationFrame(function changeSecond() {\n * window.second = 'should be prevented';\n * if (timesSecond < 2) {\n * timesSecond += 1;\n * requestAnimationFrame(changeSecond);\n * }\n * });\n * ```\n */\n /* eslint-enable max-len */\n\n function preventRequestAnimationFrame$1(source, match) {\n const nativeRequestAnimationFrame = window.requestAnimationFrame;\n\n // logs requestAnimationFrame to console if no arguments have been specified\n const shouldLog = typeof match === 'undefined';\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const rafWrapper = function rafWrapper(callback) {\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif'];\n preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage,\n // following helpers should be injected as helpers above use them\n escapeRegExp, toRegExp, startsWith$1];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-cookie\n * @description\n * Sets a cookie with the specified name, value, and path.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('set-cookie', name, value[, path])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value; possible values:\n * - number `>= 0 && <= 15`\n * - one of the predefined constants:\n * - `true` / `True`\n * - `false` / `False`\n * - `yes` / `Yes` / `Y`\n * - `no`\n * - `ok` / `OK`\n * - `path` — optional, cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * **Examples**\n * ```\n * example.org#%#//scriptlet('set-cookie', 'CookieConsent', '1')\n *\n * example.org#%#//scriptlet('set-cookie', 'gdpr-settings-cookie', 'true')\n *\n * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none')\n * ```\n */\n /* eslint-enable max-len */\n function setCookie$1(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n setCookie$1.names = ['set-cookie'];\n setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n\n /**\n * @scriptlet set-cookie-reload\n * @description\n * Sets a cookie with the specified name and value, and path,\n * and reloads the current page after the cookie setting.\n * If reloading option is not needed, use [set-cookie](#set-cookie) scriptlet.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('set-cookie-reload', name, value[, path])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value; possible values:\n * - number `>= 0 && <= 15`\n * - one of the predefined constants:\n * - `true` / `True`\n * - `false` / `False`\n * - `yes` / `Yes` / `Y`\n * - `no`\n * - `ok` / `OK`\n * - `path` — optional, cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * **Examples**\n * ```\n * example.org#%#//scriptlet('set-cookie-reload', 'checking', 'ok')\n *\n * example.org#%#//scriptlet('set-cookie-reload', 'gdpr-settings-cookie', '1')\n *\n * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none')\n * ```\n */\n function setCookieReload$1(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n\n // Only reload the page if cookie was set\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n setCookieReload$1.names = ['set-cookie-reload'];\n setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n\n /**\n * @scriptlet hide-in-shadow-dom\n * @description\n * Hides elements inside open shadow DOM elements.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('hide-in-shadow-dom', selector[, baseSelector])\n * ```\n *\n * - `selector` — required, CSS selector of element in shadow-dom to hide\n * - `baseSelector` — optional, selector of specific page DOM element,\n * narrows down the part of the page DOM where shadow-dom host supposed to be,\n * defaults to document.documentElement\n *\n * > `baseSelector` should match element of the page DOM, but not of shadow DOM\n *\n * **Examples**\n * ```\n * ! hides menu bar\n * virustotal.com#%#//scriptlet('hide-in-shadow-dom', 'iron-pages', 'vt-virustotal-app')\n *\n * ! hides floating element\n * virustotal.com#%#//scriptlet('hide-in-shadow-dom', 'vt-ui-contact-fab')\n * ```\n */\n function hideInShadowDom$1(source, selector, baseSelector) {\n // do nothing if browser does not support ShadowRoot\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow) {\n return;\n }\n const hideElement = function hideElement(targetElement) {\n const DISPLAY_NONE_CSS = 'display:none!important;';\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n\n /**\n * Handles shadow-dom piercing and hiding of found elements\n */\n const hideHandler = function hideHandler() {\n // start value of shadow-dom hosts for the page dom\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n\n // if there is shadow-dom host, they should be explored\n while (hostElements.length !== 0) {\n let isHidden = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n\n // continue to pierce for inner shadow-dom hosts\n // and search inside them while the next iteration\n hostElements = innerHosts;\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n hideInShadowDom$1.names = ['hide-in-shadow-dom'];\n hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n // following helpers should be imported and injected\n // because they are used by helpers above\n flatten, throttle];\n\n /**\n * @scriptlet remove-in-shadow-dom\n * @description\n * Removes elements inside open shadow DOM elements.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('remove-in-shadow-dom', selector[, baseSelector])\n * ```\n *\n * - `selector` — required, CSS selector of element in shadow-dom to remove\n * - `baseSelector` — optional, selector of specific page DOM element,\n * narrows down the part of the page DOM where shadow-dom host supposed to be,\n * defaults to document.documentElement\n *\n * > `baseSelector` should match element of the page DOM, but not of shadow DOM\n *\n * **Examples**\n * ```\n * ! removes menu bar\n * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'iron-pages', 'vt-virustotal-app')\n *\n * ! removes floating element\n * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab')\n * ```\n */\n function removeInShadowDom$1(source, selector, baseSelector) {\n // do nothing if browser does not support ShadowRoot\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow) {\n return;\n }\n const removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n\n /**\n * Handles shadow-dom piercing and removing of found elements\n */\n const removeHandler = function removeHandler() {\n // start value of shadow-dom hosts for the page dom\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n\n // if there is shadow-dom host, they should be explored\n while (hostElements.length !== 0) {\n let isRemoved = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n\n // continue to pierce for inner shadow-dom hosts\n // and search inside them while the next iteration\n hostElements = innerHosts;\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n removeInShadowDom$1.names = ['remove-in-shadow-dom'];\n removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n // following helpers should be imported and injected\n // because they are used by helpers above\n flatten, throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-fetch\n * @description\n * Prevents `fetch` calls if **all** given parameters match\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-fetch-ifjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-fetch'[, propsToMatch[, responseBody[, responseType]]])\n * ```\n *\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to fetch call; empty string, wildcard `*` or invalid regular expression will match all fetch calls\n * - colon-separated pairs `name:value` where\n * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters)\n * - `value` is string or regular expression for matching the value of the option passed to fetch call; invalid regular expression will cause any value matching\n * - `responseBody` — optional, string for defining response body value, defaults to `emptyObj`. Possible values:\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `responseType` — optional, string for defining response type, defaults to `default`. Possible values:\n * - `default`\n * - `opaque`\n *\n * > Usage with no arguments will log fetch calls to browser console;\n * which is useful for debugging but not permitted for production filter lists.\n *\n * **Examples**\n * 1. Log all fetch calls\n * ```\n * example.org#%#//scriptlet('prevent-fetch')\n * ```\n *\n * 2. Prevent all fetch calls\n * ```\n * example.org#%#//scriptlet('prevent-fetch', '*')\n * OR\n * example.org#%#//scriptlet('prevent-fetch', '')\n * ```\n *\n * 3. Prevent fetch call for specific url\n * ```\n * example.org#%#//scriptlet('prevent-fetch', '/url\\\\.part/')\n * ```\n *\n * 4. Prevent fetch call for specific request method\n * ```\n * example.org#%#//scriptlet('prevent-fetch', 'method:HEAD')\n * ```\n *\n * 5. Prevent fetch call for specific url and request method\n * ```\n * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/')\n * ```\n *\n * 6. Prevent fetch call and specify response body value\n * ```\n * ! Specify response body for fetch call to a specific url\n * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/', 'emptyArr')\n *\n * ! Specify response body for all fetch calls\n * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr')\n * ```\n *\n * 7. Prevent all fetch calls and specify response type value\n * ```\n * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque')\n * ```\n */\n /* eslint-enable max-len */\n function preventFetch$1(source, propsToMatch) {\n let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj';\n let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default';\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n let strResponseBody;\n if (responseBody === '' || responseBody === 'emptyObj') {\n strResponseBody = '{}';\n } else if (responseBody === 'emptyArr') {\n strResponseBody = '[]';\n } else {\n return;\n }\n\n // Skip disallowed response types\n if (!(responseType === 'default' || responseType === 'opaque')) {\n logMessage(source, \"Invalid parameter: \".concat(responseType));\n return;\n }\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n let shouldPrevent = false;\n const fetchData = getFetchData(args);\n if (typeof propsToMatch === 'undefined') {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign\n }\n\n preventFetch$1.names = ['prevent-fetch',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if'];\n preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-local-storage-item\n * @description\n * Adds specified key and its value to localStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * **Syntax**\n * ```\n * example.com#%#//scriptlet('set-local-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `''` — empty string\n * - `yes`\n * - `no`\n *\n * **Examples**\n * ```\n * example.org#%#//scriptlet('set-local-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1')\n * ```\n */\n /* eslint-enable max-len */\n\n function setLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, validValue);\n hit(source);\n }\n setLocalStorageItem$1.names = ['set-local-storage-item'];\n setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-session-storage-item\n * @description\n * Adds specified key and its value to sessionStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * **Syntax**\n * ```\n * example.com#%#//scriptlet('set-session-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `''` — empty string\n * - `yes`\n * - `no`\n *\n * **Examples**\n * ```\n * example.org#%#//scriptlet('set-session-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1')\n * ```\n */\n /* eslint-enable max-len */\n\n function setSessionStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n sessionStorage = _window.sessionStorage;\n setStorageItem(source, sessionStorage, key, validValue);\n hit(source);\n }\n setSessionStorageItem$1.names = ['set-session-storage-item'];\n setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-stack-trace\n * @description\n * Aborts a script when it attempts to utilize (read or write to) the specified property and it's error stack trace contains given value.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock-for-firefox-legacy/commit/7099186ae54e70b588d5e99554a05d783cabc8ff\n *\n * **Syntax**\n * ```\n * example.com#%#//scriptlet('abort-on-stack-trace', property, stack)\n * ```\n *\n * - `property` — required, path to a property. The property must be attached to window.\n * - `stack` — required, string that must match the current function call stack trace.\n * - values to abort inline or injected script, accordingly:\n * - `inlineScript`\n * - `injectedScript`\n *\n * **Examples**\n * ```\n * ! Aborts script when it tries to access `window.Ya` and it's error stack trace contains `test.js`\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'test.js')\n *\n * ! Aborts script when it tries to access `window.Ya.videoAd` and it's error stack trace contains `test.js`\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya.videoAd', 'test.js')\n *\n * ! Aborts script when stack trace matches with any of these parameters\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexFuncName')\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexScriptName')\n *\n * ! Aborts script when it tries to access `window.Ya` and it's an inline script\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'inlineScript')\n *\n * ! Aborts script when it tries to access `window.Ya` and it's an injected script\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript')\n * ```\n */\n /* eslint-enable max-len */\n function abortOnStackTrace$1(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n\n // Prevent infinite loops when trapping prop used by helpers in getter/setter\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnStackTrace$1.names = ['abort-on-stack-trace',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace'];\n abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith$1, shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet log-on-stack-trace\n * @description\n * This scriptlet is basically the same as [abort-on-stack-trace](#abort-on-stack-trace), but instead of aborting it logs:\n * - function and source script names pairs that access the given property\n * - was that get or set attempt\n * - script being injected or inline\n *\n * **Syntax**\n * ```\n * example.com#%#//scriptlet('log-on-stack-trace', 'property')\n * ```\n *\n * - `property` — required, path to a property. The property must be attached to window.\n */\n /* eslint-enable max-len */\n function logOnStacktrace$1(source, property) {\n if (!property) {\n return;\n }\n const refineStackTrace = function refineStackTrace(stackString) {\n // Split stack trace string by lines and remove first two elements ('Error' and getter call)\n // Remove ' at ' at the start of each string\n const stackSteps = stackString.split('\\n').slice(2).map(function (line) {\n return line.replace(/ {4}at /, '');\n });\n // Trim each line extracting funcName : fullPath pair\n const logInfoArray = stackSteps.map(function (line) {\n let funcName;\n let funcFullPath;\n /* eslint-disable-next-line no-useless-escape */\n const reg = /\\(([^\\)]+)\\)/;\n const regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(' ').slice(0, -1).join(' ');\n /* eslint-disable-next-line prefer-destructuring */\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split('@').slice(0, -1).join(' ');\n /* eslint-disable-next-line prefer-destructuring */\n funcFullPath = line.match(regFirefox)[2];\n } else {\n // For when func name is not available\n funcName = 'function name is not available';\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n // Convert array into object for better display using console.table\n const logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n /* eslint-disable-next-line prefer-destructuring */\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let value = base[prop];\n /* eslint-disable no-console */\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n /* eslint-enable no-console */\n };\n\n setChainPropAccess(window, property);\n }\n logOnStacktrace$1.names = ['log-on-stack-trace'];\n logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-xhr\n * @description\n * Prevents `xhr` calls if **all** given parameters match.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-xhr-ifjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-xhr'[, propsToMatch[, randomize]])\n * ```\n *\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call; empty string or wildcard `*` for all `XMLHttpRequest.open()` calls match\n * - colon-separated pairs `name:value` where\n * - `name` is XMLHttpRequest object property name\n * - `value` is string or regular expression for matching the value of the option passed to `XMLHttpRequest.open()` call\n * - `randomize` — defaults to `false` for empty responseText, optional argument to randomize responseText of matched XMLHttpRequest's response; possible values:\n * - `true` to randomize responseText, random alphanumeric string of 10 symbols\n * - colon-separated pair `name:value` string value to customize responseText data where\n * - `name` — only `length` supported for now\n * - `value` — range on numbers, for example `100-300`, limited to 500000 characters\n *\n * > Usage with no arguments will log XMLHttpRequest objects to browser console;\n * which is useful for debugging but not allowed for production filter lists.\n *\n * **Examples**\n * 1. Log all XMLHttpRequests\n * ```\n * example.org#%#//scriptlet('prevent-xhr')\n * ```\n *\n * 2. Prevent all XMLHttpRequests\n * ```\n * example.org#%#//scriptlet('prevent-xhr', '*')\n * example.org#%#//scriptlet('prevent-xhr', '')\n * ```\n *\n * 3. Prevent XMLHttpRequests for specific url\n * ```\n * example.org#%#//scriptlet('prevent-xhr', 'example.org')\n * ```\n *\n * 4. Prevent XMLHttpRequests for specific request method\n * ```\n * example.org#%#//scriptlet('prevent-xhr', 'method:HEAD')\n * ```\n *\n * 5. Prevent XMLHttpRequests for specific url and specified request methods\n * ```\n * example.org#%#//scriptlet('prevent-xhr', 'example.org method:/HEAD|GET/')\n * ```\n *\n * 6. Prevent XMLHttpRequests for specific url and randomize it's response text\n * ```\n * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'true')\n * ```\n *\n * 7. Prevent XMLHttpRequests for specific url and randomize it's response text with range\n * ```\n * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300')\n * ```\n */\n /* eslint-enable max-len */\n function preventXHR$1(source, propsToMatch, customResponseText) {\n // do nothing if browser does not support Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof Proxy === 'undefined') {\n return;\n }\n let response = '';\n let responseText = '';\n let responseUrl;\n const openWrapper = function openWrapper(target, thisArg, args) {\n // Get method and url from .open()\n const xhrData = {\n method: args[0],\n url: args[1]\n };\n responseUrl = xhrData.url;\n if (typeof propsToMatch === 'undefined') {\n // Log if no propsToMatch given\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === 'blob') {\n response = new Blob();\n }\n if (thisArg.responseType === 'arraybuffer') {\n response = new ArrayBuffer();\n }\n if (customResponseText) {\n const randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n responseText = randomText;\n } else {\n logMessage(source, \"Invalid range: \".concat(customResponseText));\n }\n }\n // Mock response object\n Object.defineProperties(thisArg, {\n readyState: {\n value: 4,\n writable: false\n },\n response: {\n value: response,\n writable: false\n },\n responseText: {\n value: responseText,\n writable: false\n },\n responseURL: {\n value: responseUrl,\n writable: false\n },\n responseXML: {\n value: '',\n writable: false\n },\n status: {\n value: 200,\n writable: false\n },\n statusText: {\n value: 'OK',\n writable: false\n }\n });\n // Mock events\n setTimeout(function () {\n const stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n preventXHR$1.names = ['prevent-xhr',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if'];\n preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength];\n\n /**\n * @scriptlet close-window\n * @description\n * Closes the browser tab immediately.\n *\n * > `window.close()` usage is restricted in Chrome. In this case\n * tab will only be closed when using AdGuard browser extension.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('close-window'[, path])\n * ```\n *\n * - `path` — optional, string or regular expression\n * matching the current location's path: `window.location.pathname` + `window.location.search`.\n * Defaults to execute on every page.\n *\n * **Examples**\n * ```\n * ! closes any example.org tab\n * example.org#%#//scriptlet('close-window')\n *\n * ! closes specific example.org tab\n * example.org#%#//scriptlet('close-window', '/example-page.html')\n * ```\n */\n function forceWindowClose$1(source) {\n let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036\n if (typeof window.close !== 'function') {\n const message = 'window.close() is not a function so \\'close-window\\' scriptlet is unavailable';\n logMessage(source, message);\n return;\n }\n const closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n // log the error if window closing is impossible\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/close\n logMessage(source, e);\n }\n };\n const closeByExtension = function closeByExtension() {\n const extCall = function extCall() {\n dispatchEvent(new Event('adguard:scriptlet-close-window'));\n };\n window.addEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n }, 5000);\n };\n const shouldClose = function shouldClose() {\n if (path === '') {\n return true;\n }\n const pathRegexp = toRegExp(path);\n const currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.indexOf('Chrome') > -1) {\n closeByExtension();\n }\n }\n }\n forceWindowClose$1.names = ['close-window', 'window-close-if.js', 'ubo-window-close-if.js', 'ubo-window-close-if'];\n forceWindowClose$1.injections = [hit, toRegExp, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-refresh\n * @description\n * Prevents reloading of a document through a meta \"refresh\" tag.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#refresh-defuserjs-\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-refresh'[, delay])\n * ```\n *\n * - `delay` — optional, number of seconds for delay that indicates when scriptlet should run. If not set, source tag value will be applied.\n *\n * **Examples**\n * 1. Prevent reloading of a document through a meta \"refresh\" tag.\n * ```\n * enrt.eu#%#//scriptlet('prevent-refresh')\n * ```\n *\n * 2. Prevent reloading of a document with delay.\n * ```\n * cryptodirectories.com#%#//scriptlet('prevent-refresh', 3)\n * ```\n */\n /* eslint-enable max-len */\n function preventRefresh$1(source, delaySec) {\n const getMetaElements = function getMetaElements() {\n let metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n // 'i' attribute flag is problematic in Edge 15\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n const getMetaContentDelay = function getMetaContentDelay(metaElements) {\n const delays = metaElements.map(function (meta) {\n const contentString = meta.getAttribute('content');\n if (contentString.length === 0) {\n return null;\n }\n let contentDelay;\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv\n const limiterIndex = contentString.indexOf(';');\n if (limiterIndex !== -1) {\n const delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n // Check if \"delays\" array is empty, may happens when meta's content is invalid\n // and reduce() method cannot be used with empty arrays without initial value\n if (!delays.length) {\n return null;\n }\n // Get smallest delay of all metas on the page\n const minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n // eslint-disable-next-line consistent-return\n return minDelay;\n };\n const stop = function stop() {\n const metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n let secondsToRun = getNumberFromString(delaySec);\n // Check if argument is provided\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n // Check if meta tag has delay\n if (secondsToRun === null) {\n return;\n }\n const delayMs = secondsToRun * 1000;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n preventRefresh$1.names = ['prevent-refresh',\n // Aliases are needed for matching the related scriptlet converted into our syntax\n // These are used by UBO rules syntax\n // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets\n 'refresh-defuser.js', 'refresh-defuser',\n // Prefix 'ubo-' is required to run converted rules\n 'ubo-refresh-defuser.js', 'ubo-refresh-defuser'];\n preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN];\n\n /* eslint-disable max-len, consistent-return */\n /**\n * @scriptlet prevent-element-src-loading\n * @description\n * Prevents target element source loading without triggering 'onerror' listeners and not breaking 'onload' ones.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('prevent-element-src-loading', tagName, match)\n * ```\n *\n * - `tagName` — required, case-insensitive target element tagName which `src` property resource loading will be silently prevented; possible values:\n * - `script`\n * - `img`\n * - `iframe`\n * - `match` — required, string or regular expression for matching the element's URL;\n *\n * **Examples**\n * 1. Prevent script source loading:\n * ```\n * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle')\n * ```\n */\n /* eslint-enable max-len */\n function preventElementSrcLoading$1(source, tagName, match) {\n // do nothing if browser does not support Proxy or Reflect\n if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n const srcMockData = {\n // \"KCk9Pnt9\" = \"()=>{}\"\n script: 'data:text/javascript;base64,KCk9Pnt9',\n // Empty 1x1 image\n img: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n // Empty h1 tag\n iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4='\n };\n let instance;\n if (tagName === 'script') {\n instance = HTMLScriptElement;\n } else if (tagName === 'img') {\n instance = HTMLImageElement;\n } else if (tagName === 'iframe') {\n instance = HTMLIFrameElement;\n } else {\n return;\n }\n\n // For websites that use Trusted Types\n // https://w3c.github.io/webappsec-trusted-types/dist/spec/\n const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function';\n let policy;\n if (hasTrustedTypes) {\n // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can\n // allow our policy if the server has restricted the creation of a trusted-types policy with\n // the directive 'Content-Security-Policy: trusted-types ;`.\n // If such a header is presented in the server response, corelibs adds permission to create\n // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors.\n // See AG-18204 for details.\n policy = window.trustedTypes.createPolicy('AGPolicy', {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n const SOURCE_PROPERTY_NAME = 'src';\n const ONERROR_PROPERTY_NAME = 'onerror';\n const searchRegexp = toRegExp(match);\n\n // This will be needed to silent error events on matched element,\n // as url wont be available\n const setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, 'matched');\n };\n const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n // Check if arguments are present\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n const nodeName = thisArg.nodeName.toLowerCase();\n const attrName = args[0].toLowerCase();\n const attrValue = args[1];\n const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n // Forward the URI that corresponds with element's MIME type\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n const setAttributeHandler = {\n apply: setAttributeWrapper\n };\n // eslint-disable-next-line max-len\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n const nodeName = this.nodeName.toLowerCase();\n const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n\n // eslint-disable-next-line no-undef\n if (policy && urlValue instanceof TrustedScriptURL) {\n const trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n\n // https://github.com/AdguardTeam/Scriptlets/issues/228\n // Prevent error event being triggered by other sources\n const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n const isMatched = this.getAttribute(source.name) === 'matched';\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n // Check if arguments are present\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n const eventName = args[0];\n const isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error';\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n // eslint-disable-next-line max-len\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n }\n preventElementSrcLoading$1.names = ['prevent-element-src-loading'];\n preventElementSrcLoading$1.injections = [hit, toRegExp, safeGetDescriptor, noopFunc];\n\n /**\n * @scriptlet no-topics\n * @description\n * Prevents using The Topics API\n * https://developer.chrome.com/docs/privacy-sandbox/topics/\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('no-topics')\n * ```\n */\n function noTopics$1(source) {\n const TOPICS_PROPERTY_NAME = 'browsingTopics';\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n\n // document.browsingTopics() is async function so it's better to return noopPromiseResolve()\n // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve('[]');\n };\n hit(source);\n }\n noTopics$1.names = ['no-topics'];\n noTopics$1.injections = [hit, noopPromiseResolve];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-xhr-response\n * @description\n * Replaces response content of `xhr` requests if **all** given parameters match.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]])\n * ```\n *\n * - `pattern` — optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required;\n * possible values:\n * - `*` to match all text content\n * - non-empty string\n * - regular expression\n * - `replacement` — optional, should be set if `pattern` is set. String to replace matched content with. Empty string to remove content.\n * - `propsToMatch` — optional, string of space-separated properties to match for extra condition; possible props:\n * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call;\n * - colon-separated pairs `name:value` where\n * - `name` — string or regular expression for matching XMLHttpRequest property name\n * - `value` — string or regular expression for matching the value of the option passed to `XMLHttpRequest.open()` call\n *\n * > Usage with no arguments will log XMLHttpRequest objects to browser console;\n * which is useful for debugging but not permitted for production filter lists.\n *\n * **Examples**\n * 1. Log all XMLHttpRequests\n * ```\n * example.org#%#//scriptlet('trusted-replace-xhr-response')\n * ```\n *\n * 2. Replace text content of XMLHttpRequests with specific url\n * ```\n * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org')\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', 'example.org')\n * ```\n *\n * 3. Remove all text content of XMLHttpRequests with specific request method\n * ```\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET')\n * ```\n *\n * 4. Replace text content of XMLHttpRequests matching by URL regex and request methods\n * ```\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', '/\\.m3u8/ method:/GET|HEAD/')\n * ```\n * 5. Remove all text content of all XMLHttpRequests for example.com\n * ```\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com')\n * ```\n */\n /* eslint-enable max-len */\n function trustedReplaceXhrResponse$1(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof Proxy === 'undefined') {\n return;\n }\n\n // Only allow pattern as empty string for logging purposes\n if (pattern === '' && replacement !== '') {\n const message = 'Pattern argument should not be empty string.';\n logMessage(source, message);\n return;\n }\n const shouldLog = pattern === '' && replacement === '';\n const nativeOpen = window.XMLHttpRequest.prototype.open;\n const nativeSend = window.XMLHttpRequest.prototype.send;\n let xhrData;\n const openWrapper = function openWrapper(target, thisArg, args) {\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n // Log if no propsToMatch given\n const message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n const setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n\n // setRequestHeader can only be called on open xhr object,\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n const forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n const readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n\n // Extract content from response\n const content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n const patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedContent = content.replace(patternRegexp, replacement);\n\n // Manually put required values into target XHR object\n // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState\n },\n response: {\n value: modifiedContent\n },\n responseText: {\n value: modifiedContent\n },\n responseURL: {\n value: responseURL\n },\n responseXML: {\n value: responseXML\n },\n status: {\n value: status\n },\n statusText: {\n value: statusText\n }\n });\n\n // Mock events\n setTimeout(function () {\n const stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n const name = header[0];\n const value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response'\n // trusted scriptlets support no aliases\n ];\n\n trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet xml-prune\n * @description\n * Removes an element from the specified XML.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('xml-prune'[, propsToMatch[, optionalProp[, urlToMatch]]])\n * ```\n *\n * - `propsToMatch` — optional, selector of elements which will be removed from XML\n * - `optionalProp` — optional, selector of elements that must occur in XML document\n * - `urlToMatch` — optional, string or regular expression for matching the request's URL\n * > Usage with no arguments will log response payload and URL to browser console;\n * which is useful for debugging but prohibited for production filter lists.\n *\n * **Examples**\n * 1. Remove `Period` tag whose `id` contains `-ad-` from all requests\n * ```\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]')\n * ```\n *\n * 2. Remove `Period` tag whose `id` contains `-ad-`, only if XML contains `SegmentTemplate`\n * ```\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]', 'SegmentTemplate')\n * ```\n *\n * 3. Remove `Period` tag whose `id` contains `-ad-`, only if request's URL contains `.mpd`\n * ```\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]', '', '.mpd')\n * ```\n *\n * 4. Call with no arguments will log response payload and URL at the console\n * ```\n * example.org#%#//scriptlet('xml-prune')\n * ```\n *\n * 5. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL\n * ```\n * example.org#%#//scriptlet('xml-prune', '', '', '.mpd')\n * ```\n */\n /* eslint-enable max-len */\n\n function xmlPrune$1(source, propsToRemove) {\n var _this = this;\n let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let urlToMatch = arguments.length > 3 ? arguments[3] : undefined;\n // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n let shouldPruneResponse = true;\n if (!propsToRemove) {\n // If \"propsToRemove\" is not defined, then response shouldn't be pruned\n // but it should be logged in browser console\n shouldPruneResponse = false;\n }\n const urlMatchRegexp = toRegExp(urlToMatch);\n const isXML = function isXML(text) {\n // It's necessary to check the type of 'text'\n // because 'text' is obtained from the xhr/fetch response,\n // so it could also be Blob/ArrayBuffer/Object or another type\n if (typeof text === 'string') {\n // Check if \"text\" starts with \"<\" and check if it ends with \">\"\n // If so, then it might be an XML file and should be pruned or logged\n const trimedText = text.trim();\n if (trimedText.startsWith('<') && trimedText.endsWith('>')) {\n return true;\n }\n }\n return false;\n };\n const createXMLDocument = function createXMLDocument(text) {\n const xmlParser = new DOMParser();\n const xmlDocument = xmlParser.parseFromString(text, 'text/xml');\n return xmlDocument;\n };\n const pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n const xmlDoc = createXMLDocument(text);\n const errorNode = xmlDoc.querySelector('parsererror');\n if (errorNode) {\n return text;\n }\n if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n const elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n const serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== 'string' || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener('readystatechange', function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener('readystatechange', pruneResponse);\n if (!shouldPruneResponse) {\n if (isXML(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n const prunedResponseContent = pruneXML(response);\n if (shouldPruneResponse) {\n Object.defineProperty(thisArg, 'response', {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, 'responseText', {\n value: prunedResponseContent\n });\n hit(source);\n }\n // In case if response shouldn't be pruned\n // pruneXML sets shouldPruneResponse to false\n // so it's necessary to set it to true again\n // otherwise response will be only logged\n shouldPruneResponse = true;\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n // eslint-disable-next-line max-len\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n return nativeFetch.apply(_this, args).then(function (response) {\n return response.text().then(function (text) {\n if (!shouldPruneResponse) {\n if (isXML(text)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(text);\n logMessage(source, message);\n logMessage(source, createXMLDocument(text), true, false);\n }\n return Reflect.apply(target, thisArg, args);\n }\n const prunedText = pruneXML(text);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n // If response shouldn't be pruned\n // pruneXML sets shouldPruneResponse to false\n // so it's necessary to set it to true again\n // otherwise response will be only logged\n shouldPruneResponse = true;\n return Reflect.apply(target, thisArg, args);\n });\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n xmlPrune$1.names = ['xml-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune'];\n xmlPrune$1.injections = [hit, logMessage, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet m3u-prune\n * @description\n * Removes content from the specified M3U file.\n *\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch]])\n * ```\n *\n * - `propsToRemove` — optional, string or regular expression to match the URL line (segment) which will be removed alongside with its tags\n * - `urlToMatch` — optional, string or regular expression for matching the request's URL\n * > Usage with no arguments will log response payload and URL to browser console;\n * which is useful for debugging but prohibited for production filter lists.\n *\n * **Examples**\n * 1. Removes a tag which contains `tvessaiprod.nbcuni.com/video/`, from all requests\n * ```\n * example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/')\n * ```\n *\n * 2. Removes a line which contains `tvessaiprod.nbcuni.com/video/`, only if request's URL contains `.m3u8`\n * ```\n * example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/', '.m3u8')\n * ```\n *\n * 3. Call with no arguments will log response payload and URL at the console\n * ```\n * example.org#%#//scriptlet('m3u-prune')\n * ```\n *\n * 4. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL\n * ```\n * example.org#%#//scriptlet('m3u-prune', '', '.m3u8')\n * ```\n */\n /* eslint-enable max-len */\n\n function m3uPrune$1(source, propsToRemove, urlToMatch) {\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n let shouldPruneResponse = false;\n const urlMatchRegexp = toRegExp(urlToMatch);\n const SEGMENT_MARKER = '#';\n const AD_MARKER = {\n ASSET: '#EXT-X-ASSET:',\n CUE: '#EXT-X-CUE:',\n CUE_IN: '#EXT-X-CUE-IN',\n DISCONTINUITY: '#EXT-X-DISCONTINUITY',\n EXTINF: '#EXTINF',\n EXTM3U: '#EXTM3U',\n SCTE35: '#EXT-X-SCTE35:'\n };\n const COMCAST_AD_MARKER = {\n AD: '-AD-',\n VAST: '-VAST-',\n VMAP_AD: '-VMAP-AD-',\n VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:'\n };\n\n // List of tags which should not be removed\n const TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START'];\n const isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY\n *\n * @param {Array} lines\n * @param {number} i\n * @returns {Object} { array, index }\n */\n const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n let array = lines.slice();\n let index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array,\n index\n };\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * COMCAST_AD_MARKER: COMCAST_AD_MARKER.VMAP_AD, COMCAST_AD_MARKER.VAST, COMCAST_AD_MARKER.AD\n *\n * @param {Array} lines\n * @returns {Array}\n */\n const pruneVmapBlock = function pruneVmapBlock(lines) {\n let array = lines.slice();\n for (let i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n // It's necessary to subtract 1 from \"i\",\n // otherwise one line will be skipped\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * AD_MARKER: AD_MARKER.CUE, AD_MARKER.ASSET, AD_MARKER.SCTE35, AD_MARKER.CUE_IN\n *\n * @param {string} line\n * @param {number} index\n * @param {Array} array\n * @returns {string|undefined}\n */\n\n const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n const removeM3ULineRegexp = toRegExp(propsToRemove);\n\n /**\n * Sets an item in array to undefined, if it contains removeM3ULineRegexp and one of the\n * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY\n *\n * @param {string} line\n * @param {number} index\n * @param {Array} array\n * @returns {string|undefined}\n */\n\n const pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n\n /**\n * Removes block of segments (if it contains removeM3ULineRegexp) until another segment occurs\n *\n * @param {Array} lines\n * @returns {Array}\n */\n const pruneSegments = function pruneSegments(lines) {\n for (let i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n const segmentName = lines[i].substring(0, lines[i].indexOf(':'));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (let j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n\n /**\n * Determines if text contains \"#EXTM3U\" or \"VMAP_AD_BREAK\"\n *\n * @param {*} text\n * @returns {boolean}\n */\n const isM3U = function isM3U(text) {\n if (typeof text === 'string') {\n // Check if \"text\" starts with \"#EXTM3U\" or with \"VMAP_AD_BREAK\"\n // If so, then it might be an M3U file and should be pruned or logged\n const trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n\n /**\n * Determines if pruning is needed\n *\n * @param {string} text\n * @param {RegExp} regexp\n * @returns {boolean}\n */\n const isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n\n /**\n * Prunes lines which contain removeM3ULineRegexp and specific AD_MARKER\n *\n * @param {string} text\n * @returns {string}\n */\n // TODO: make it compatible with $hls modifier\n const pruneM3U = function pruneM3U(text) {\n let lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join('\\n');\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === 'undefined') {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== 'undefined') {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join('\\n');\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== 'string' || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener('readystatechange', function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener('readystatechange', pruneResponse);\n // If \"propsToRemove\" is not defined, then response should be logged only\n if (!propsToRemove) {\n if (isM3U(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n if (shouldPruneResponse) {\n const prunedResponseContent = pruneM3U(response);\n Object.defineProperty(thisArg, 'response', {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, 'responseText', {\n value: prunedResponseContent\n });\n hit(source);\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n // eslint-disable-next-line max-len\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n const response = await nativeFetch(...args);\n const responseText = await response.text();\n // If \"propsToRemove\" is not defined, then response should be logged only\n if (!propsToRemove && isM3U(responseText)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n const prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return Reflect.apply(target, thisArg, args);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n m3uPrune$1.names = ['m3u-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'm3u-prune.js', 'ubo-m3u-prune.js', 'ubo-m3u-prune'];\n m3uPrune$1.injections = [hit, toRegExp, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-cookie\n * @description\n * Sets a cookie with arbitrary name and value,\n * and with optional ability to offset cookie attribute 'expires' and set path.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value. Possible values:\n * - arbitrary value\n * - empty string for no value\n * - `$now$` keyword for setting current time in ms, e.g 1667915146503\n * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; defaults to no offset\n * Possible values:\n * - positive integer in seconds\n * - `1year` keyword for setting expiration date to one year\n * - `1day` keyword for setting expiration date to one day\n * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * **Examples**\n * 1. Set cookie\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept')\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '1-accept_1')\n * ```\n *\n * 2. Set cookie with `new Date().getTime()` value\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$')\n * ```\n *\n * 3. Set cookie which will expire in 3 days\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '259200')\n * ```\n *\n * 4. Set cookie which will expire in one year\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year')\n * ```\n *\n * 5. Set cookie with no path\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none')\n * ```\n */\n /* eslint-enable max-len */\n\n function trustedSetCookie$1(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n trustedSetCookie$1.names = ['trusted-set-cookie'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-cookie-reload\n * @description\n * Sets a cookie with arbitrary name and value,\n * and with optional ability to offset cookie attribute 'expires' and set path.\n * Also reloads the current page after the cookie setting.\n * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie).\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value. Possible values:\n * - arbitrary value\n * - empty string for no value\n * - `$now$` keyword for setting current time in ms, e.g 1667915146503\n * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire; defaults to no offset\n * Possible values:\n * - positive integer in seconds\n * - `1year` keyword for setting expiration date to one year\n * - `1day` keyword for setting expiration date to one day\n * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * **Examples**\n * 1. Set cookie and reload the page after it\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept')\n * ```\n *\n * 2. Set cookie with `new Date().getTime()` value and reload the page after it\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$')\n * ```\n *\n * 3. Set cookie which will expire in 3 days and reload the page after it\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200')\n * ```\n *\n * 4. Set cookie which will expire in one year and reload the page after it\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year')\n * ```\n *\n * 5. Set cookie with no 'expire' and no path, reload the page after it\n * ```\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none')\n * ```\n */\n /* eslint-enable max-len */\n\n function trustedSetCookieReload$1(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n\n // Prevent infinite reloads if cookie was already set or blocked by the browser\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n\n // Only reload the page if cookie was set\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n trustedSetCookieReload$1.names = ['trusted-set-cookie-reload'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-fetch-response\n * @description\n * Replaces response text content of `fetch` requests if **all** given parameters match.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('trusted-replace-fetch-response'[, pattern, replacement[, propsToMatch]])\n * ```\n *\n * - `pattern` — optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required;\n * possible values:\n * - `*` to match all text content\n * - non-empty string\n * - regular expression\n * - `replacement` — optional, should be set if `pattern` is set. String to replace the response text content matched by `pattern`.\n * Empty string to remove content. Defaults to empty string.\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to fetch call; empty string, wildcard `*` or invalid regular expression will match all fetch calls\n * - colon-separated pairs `name:value` where\n * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters)\n * - `value` is string or regular expression for matching the value of the option passed to fetch call; invalid regular expression will cause any value matching\n *\n * > Usage with no arguments will log fetch calls to browser console;\n * which is useful for debugging but only allowed for production filter lists.\n *\n * > Scriptlet does nothing if response body can't be converted to text.\n *\n * **Examples**\n * 1. Log all fetch calls\n * ```\n * example.org#%#//scriptlet('trusted-replace-fetch-response')\n * ```\n *\n * 2. Replace response text content of fetch requests with specific url\n * ```\n * example.org#%#//scriptlet('trusted-replace-fetch-response', 'adb_detect:true', 'adb_detect:false', 'example.org')\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', 'example.org')\n * ```\n *\n * 3. Remove all text content of fetch responses with specific request method\n * ```\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'method:GET')\n * ```\n *\n * 4. Replace response text content of fetch requests matching by URL regex and request methods\n * ```\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', '/\\.m3u8/ method:/GET|HEAD/')\n * ```\n * 5. Remove text content of all fetch responses for example.com\n * ```\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com')\n * ```\n */\n /* eslint-enable max-len */\n function trustedReplaceFetchResponse$1(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n\n // Only allow pattern as empty string for logging purposes\n if (pattern === '' && replacement !== '') {\n logMessage(source, 'Pattern argument should not be empty string');\n return;\n }\n const shouldLog = pattern === '' && replacement === '';\n const nativeFetch = fetch;\n let shouldReplace = false;\n let fetchData;\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n // log if no propsToMatch given\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create new Response object using original response' properties\n * and given text as body content\n *\n * @param {Response} response original response to copy properties from\n * @param {string} textContent text to set as body content\n * @returns {Response}\n */\n const forgeResponse = function forgeResponse(response, textContent) {\n const bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n const forgedResponse = new Response(textContent, {\n status,\n statusText,\n headers\n });\n\n // Manually set properties which can't be set by Response constructor\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n\n // eslint-disable-next-line prefer-spread\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n const patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n const forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n // log if response body can't be converted to a string\n const fetchDataStr = objectToString(fetchData);\n const message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign\n }\n\n trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response'];\n trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-local-storage-item\n * @description\n * Adds item with arbitrary key and value to localStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * **Syntax**\n * ```\n * example.com#%#//scriptlet('trusted-set-local-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - arbitrary value\n * - `$now$` keyword for setting current time in ms, corresponds to `Date.now()` and `(new Date).getTime()` calls\n * - `$currentDate$` keyword for setting string representation of the current date and time, corresponds to `Date()` and `(new Date).toString()` calls\n *\n * **Examples**\n * 1. Set local storage item\n * ```\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'COOKIE_CONSENTS', '{\"preferences\":3,\"marketing\":false}')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '[16364,88364]')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '{\"providers\":[16364,88364],\"consent\":\"all\"}')\n * ```\n *\n * 2. Set item with current time since unix epoch in ms\n * ```\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$now$')\n * ```\n *\n * 3. Set item with current date, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n * ```\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$currentDate$')\n * ```\n *\n * 4. Set item without value\n * ```\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '')\n * ```\n */\n /* eslint-enable max-len */\n\n function trustedSetLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Item value should be specified');\n return;\n }\n const parsedValue = parseKeywordValue(value);\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-constant\n * @description\n * Creates a constant property and assigns it a specified value.\n *\n * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type.\n *\n * > If empty object is present in chain it will be trapped until chain leftovers appear.\n *\n * > Use [set-constant](./about-scriptlets.md#set-constant) to set predefined values and functions.\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('trusted-set-constant', property, value[, stack])\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`.\n * - `value` — required, an arbitrary value to be set; value type is being inferred from the argument, e.g '500' will be set as number;\n * to set string type value wrap argument into another pair of quotes: `'\"500\"'`;\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * **Examples**\n * 1. Set property values of different types\n * ```\n * ! Set string value wrapping argument into another pair of quotes\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '\"null\"')\n *\n * ✔ window.click_r === 'null'\n * ✔ typeof window.click_r === 'string'\n *\n * ! Set inferred null value\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', 'null')\n *\n * ✔ window.click_r === null\n * ✔ typeof window.click_r === 'object'\n *\n * ! Set number type value\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '48')\n *\n * ✔ window.click_r === 48\n * ✔ typeof window.click_r === 'number'\n *\n * ! Set array or object as property value, argument should be a JSON string\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '[1,\"string\"]')\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '{\"aaa\":123,\"bbb\":{\"ccc\":\"string\"}}')\n * ```\n *\n * 2. Use script stack matching to set value\n * ```\n * ! `document.first` will return `1` if the method is related to `checking.js`\n * example.org#%#//scriptlet('trusted-set-constant', 'document.first', '1', 'checking.js')\n *\n * ✔ document.first === 1 // if the condition described above is met\n * ```\n */\n /* eslint-enable max-len */\n function trustedSetConstant$1(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n let constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n\n /**\n * Safely sets property on a given object\n *\n * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {Object} base arbitrary reachable object\n * @param {string} prop property name\n * @param {boolean} configurable if set property should be configurable\n * @param {Object} handler custom property descriptor object\n * @returns {boolean} true if prop was trapped successfully\n */\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n // This is required to prevent scriptlets overwrite each over\n if (origDescriptor instanceof Object) {\n // This check is required to avoid defining non-configurable props\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n\n /**\n * Traverses given chain to set constant value to its end prop\n * Chains that yet include non-object values (e.g null) are valid and will be\n * traversed when appropriate chain member is set by an external script\n *\n * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {Object} owner object that owns chain\n * @param {string} property chain of owner properties\n */\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // Handler method init is used to keep track of factual value\n // and apply mustCancel() check only on end prop\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n // Prevent breakage due to loop assignments like win.obj = win.obj\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n\n // End prop case\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n\n // Null prop in chain\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n\n // Empty object prop in chain\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n\n // Defined prop in chain\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n\n // Undefined prop in chain\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n trustedSetConstant$1.names = ['trusted-set-constant'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetConstant$1.injections = [hit, inferValue, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest,\n // following helpers should be imported and injected\n // because they are used by helpers above\n shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet inject-css-in-shadow-dom\n * @description\n * Injects CSS rule into selected Shadow DOM subtrees on a page\n *\n * **Syntax**\n * ```\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', cssRule[, hostSelector])\n * ```\n *\n * - `cssRule` — required, string representing a single css rule\n * - `hostSelector` — optional, string, selector to match shadow host elements. CSS rule will be only applied to shadow roots inside these elements.\n * Defaults to injecting css rule into all available roots.\n *\n * **Examples**\n * 1. Apply style to all shadow dom subtrees\n * ```\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#advertisement { display: none !important; }')\n * ```\n *\n * 2. Apply style to a specific shadow dom subtree\n * ```\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#content { margin-top: 0 !important; }', '.row > #hidden')\n * ```\n */\n /* eslint-enable max-len */\n\n function injectCssInShadowDom$1(source, cssRule) {\n let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n // do nothing if browser does not support ShadowRoot, Proxy or Reflect\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n\n // Prevent url() and image-set() styles from being applied\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n const callback = function callback(shadowRoot) {\n try {\n // adoptedStyleSheets and CSSStyleSheet constructor are not yet supported by Safari\n // https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptedStyleSheets\n // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet\n const stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n const styleTag = document.createElement('style');\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n injectCssInShadowDom$1.names = ['inject-css-in-shadow-dom'];\n injectCssInShadowDom$1.injections = [hit, logMessage, hijackAttachShadow];\n\n /**\n * This file must export all scriptlets which should be accessible\n */\n\n var scriptletList = /*#__PURE__*/Object.freeze({\n __proto__: null,\n trustedClickElement: trustedClickElement$1,\n abortOnPropertyRead: abortOnPropertyRead$1,\n abortOnPropertyWrite: abortOnPropertyWrite$1,\n preventSetTimeout: preventSetTimeout$1,\n preventSetInterval: preventSetInterval$1,\n preventWindowOpen: preventWindowOpen$1,\n abortCurrentInlineScript: abortCurrentInlineScript$1,\n setConstant: setConstant$1,\n removeCookie: removeCookie$1,\n preventAddEventListener: preventAddEventListener$1,\n preventBab: preventBab$2,\n nowebrtc: nowebrtc$1,\n logAddEventListener: logAddEventListener$1,\n logEval: logEval$1,\n log: log$1,\n noeval: noeval$1,\n preventEvalIf: preventEvalIf$1,\n preventFab: preventFab$1,\n setPopadsDummy: setPopadsDummy$1,\n preventPopadsNet: preventPopadsNet$1,\n preventAdfly: preventAdfly$1,\n debugOnPropertyRead: debugOnPropertyRead$1,\n debugOnPropertyWrite: debugOnPropertyWrite$1,\n debugCurrentInlineScript: debugCurrentInlineScript$1,\n removeAttr: removeAttr$1,\n setAttr: setAttr$1,\n removeClass: removeClass$1,\n disableNewtabLinks: disableNewtabLinks$1,\n adjustSetInterval: adjustSetInterval$1,\n adjustSetTimeout: adjustSetTimeout$1,\n dirString: dirString$1,\n jsonPrune: jsonPrune$1,\n preventRequestAnimationFrame: preventRequestAnimationFrame$1,\n setCookie: setCookie$1,\n setCookieReload: setCookieReload$1,\n hideInShadowDom: hideInShadowDom$1,\n removeInShadowDom: removeInShadowDom$1,\n preventFetch: preventFetch$1,\n setLocalStorageItem: setLocalStorageItem$1,\n setSessionStorageItem: setSessionStorageItem$1,\n abortOnStackTrace: abortOnStackTrace$1,\n logOnStacktrace: logOnStacktrace$1,\n preventXHR: preventXHR$1,\n forceWindowClose: forceWindowClose$1,\n preventRefresh: preventRefresh$1,\n preventElementSrcLoading: preventElementSrcLoading$1,\n noTopics: noTopics$1,\n trustedReplaceXhrResponse: trustedReplaceXhrResponse$1,\n xmlPrune: xmlPrune$1,\n m3uPrune: m3uPrune$1,\n trustedSetCookie: trustedSetCookie$1,\n trustedSetCookieReload: trustedSetCookieReload$1,\n trustedReplaceFetchResponse: trustedReplaceFetchResponse$1,\n trustedSetLocalStorageItem: trustedSetLocalStorageItem$1,\n trustedSetConstant: trustedSetConstant$1,\n injectCssInShadowDom: injectCssInShadowDom$1\n });\n\n /**\n * Store of ADG redirects names and their analogs.\n * As it is not a compatibility table, no need to keep in redirects array third-party redirects.\n *\n * Needed only for conversion purposes.\n * e.g. googletagmanager-gtm is removed and should be removed from compatibility table as well\n * but now it works as alias for google-analytics so it should stay valid for compiler\n */\n const redirects$1 = [{\n adg: '1x1-transparent.gif',\n ubo: '1x1.gif',\n abp: '1x1-transparent-gif'\n }, {\n adg: '2x2-transparent.png',\n ubo: '2x2.png',\n abp: '2x2-transparent-png'\n }, {\n adg: '3x2-transparent.png',\n ubo: '3x2.png',\n abp: '3x2-transparent-png'\n }, {\n adg: '32x32-transparent.png',\n ubo: '32x32.png',\n abp: '32x32-transparent-png'\n }, {\n adg: 'amazon-apstag',\n ubo: 'amazon_apstag.js'\n }, {\n adg: 'ati-smarttag'\n }, {\n adg: 'didomi-loader'\n }, {\n adg: 'click2load.html',\n ubo: 'click2load.html'\n }, {\n adg: 'fingerprintjs2',\n ubo: 'fingerprint2.js'\n }, {\n adg: 'fingerprintjs3',\n ubo: 'fingerprint3.js'\n }, {\n adg: 'google-analytics',\n ubo: 'google-analytics_analytics.js'\n }, {\n adg: 'google-analytics-ga',\n ubo: 'google-analytics_ga.js'\n }, {\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication_adsbygoogle.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/162\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication.com/adsbygoogle.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/127\n adg: 'googletagmanager-gtm',\n ubo: 'google-analytics_ga.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/260\n adg: 'googletagmanager-gtm',\n ubo: 'googletagmanager_gtm.js'\n }, {\n adg: 'googletagservices-gpt',\n ubo: 'googletagservices_gpt.js'\n }, {\n adg: 'google-ima3',\n ubo: 'google-ima.js'\n }, {\n adg: 'gemius'\n }, {\n adg: 'matomo'\n }, {\n adg: 'metrika-yandex-watch'\n }, {\n adg: 'metrika-yandex-tag'\n }, {\n adg: 'naver-wcslog'\n }, {\n adg: 'noeval',\n ubo: 'noeval-silent.js'\n }, {\n adg: 'noopcss',\n ubo: 'noop.css',\n abp: 'blank-css'\n }, {\n adg: 'noopframe',\n ubo: 'noop.html',\n abp: 'blank-html'\n }, {\n adg: 'noopjs',\n ubo: 'noop.js',\n abp: 'blank-js'\n }, {\n adg: 'noopjson'\n }, {\n adg: 'nooptext',\n ubo: 'noop.txt',\n abp: 'blank-text'\n }, {\n adg: 'noopmp3-0.1s',\n ubo: 'noop-0.1s.mp3',\n abp: 'blank-mp3'\n }, {\n adg: 'noopmp4-1s',\n ubo: 'noop-1s.mp4',\n abp: 'blank-mp4'\n }, {\n adg: 'noopvmap-1.0',\n ubo: 'noop-vmap1.0.xml'\n }, {\n adg: 'noopvast-2.0'\n }, {\n adg: 'noopvast-3.0'\n }, {\n adg: 'noopvast-4.0'\n }, {\n adg: 'prebid'\n }, {\n adg: 'pardot-1.0'\n }, {\n adg: 'prevent-bab',\n ubo: 'nobab.js'\n }, {\n adg: 'prevent-bab2',\n ubo: 'nobab2.js'\n }, {\n adg: 'prevent-fab-3.2.0',\n ubo: 'nofab.js'\n }, {\n // AG-15917\n adg: 'prevent-fab-3.2.0',\n ubo: 'fuckadblock.js-3.2.0'\n }, {\n adg: 'prevent-popads-net',\n ubo: 'popads.js'\n }, {\n adg: 'scorecardresearch-beacon',\n ubo: 'scorecardresearch_beacon.js'\n }, {\n adg: 'set-popads-dummy',\n ubo: 'popads-dummy.js'\n }, {\n adg: 'empty',\n ubo: 'empty'\n }, {\n adg: 'prebid-ads',\n ubo: 'prebid-ads.js'\n }];\n\n const JS_RULE_MARKER = '#%#';\n const COMMENT_MARKER = '!';\n\n /**\n * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false)\n *\n * @param {string} rule rule text\n * @returns {boolean} if rule text is comment\n */\n const isComment = function isComment(rule) {\n return startsWith$1(rule, COMMENT_MARKER);\n };\n\n /* ************************************************************************\n *\n * Scriptlets\n *\n ************************************************************************** */\n\n /**\n * uBlock scriptlet rule mask\n */\n const UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\\s*\\+js/;\n const UBO_SCRIPTLET_MASK_1 = '##+js';\n const UBO_SCRIPTLET_MASK_2 = '##script:inject';\n const UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js';\n const UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject';\n\n /**\n * AdBlock Plus snippet rule mask\n */\n const ABP_SCRIPTLET_MASK = '#$#';\n const ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#';\n\n /**\n * AdGuard CSS rule mask\n */\n const ADG_CSS_MASK_REG = /#@?\\$#.+?\\s*\\{.*\\}\\s*$/g;\n\n /**\n * Checks if the `rule` is AdGuard scriptlet rule\n *\n * @param {string} rule - rule text\n * @returns {boolean} if given rule is adg rule\n */\n const isAdgScriptletRule = function isAdgScriptletRule(rule) {\n return !isComment(rule) && rule.indexOf(ADG_SCRIPTLET_MASK) > -1;\n };\n\n /**\n * Checks if the `rule` is uBO scriptlet rule\n *\n * @param {string} rule rule text\n * @returns {boolean} if given rule is ubo rule\n */\n const isUboScriptletRule = function isUboScriptletRule(rule) {\n return (rule.indexOf(UBO_SCRIPTLET_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_MASK_2) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_2) > -1) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule);\n };\n\n /**\n * Checks if the `rule` is AdBlock Plus snippet\n *\n * @param {string} rule rule text\n * @returns {boolean} if given rule is abp rule\n */\n const isAbpSnippetRule = function isAbpSnippetRule(rule) {\n return (rule.indexOf(ABP_SCRIPTLET_MASK) > -1 || rule.indexOf(ABP_SCRIPTLET_EXCEPTION_MASK) > -1) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule);\n };\n\n /**\n * Returns array of scriptlet objects.\n * Needed for scriptlet name validation which will check aliases names.\n *\n * @returns {Array} Array of all scriptlet objects.\n */\n const getScriptletsObjList = function getScriptletsObjList() {\n return Object.values(scriptletList);\n };\n\n /**\n * Finds scriptlet by the `name`.\n *\n * @param {string} name Scriptlet name.\n * @param {Array} scriptlets Array of all scriptlet objects.\n * @returns {Function} Scriptlet function.\n */\n const getScriptletByName = function getScriptletByName(name, scriptlets) {\n if (!scriptlets) {\n scriptlets = getScriptletsObjList();\n }\n return scriptlets.find(function (s) {\n return s.names\n // full match name checking\n && (s.names.indexOf(name) > -1\n // or check ubo alias name without '.js' at the end\n || !endsWith(name, '.js') && s.names.indexOf(\"\".concat(name, \".js\")) > -1);\n });\n };\n const scriptletObjects = getScriptletsObjList();\n\n /**\n * Checks whether the scriptlet `name` is valid by checking the scriptlet list object.\n *\n * @param {string} name Scriptlet name.\n * @returns {boolean} True if scriptlet name is valid.\n */\n const isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) {\n if (!name) {\n return false;\n }\n const scriptlet = getScriptletByName(name, scriptletObjects);\n if (!scriptlet) {\n return false;\n }\n return true;\n };\n\n /**\n * Cache for better performance of scriptlet name validation.\n */\n const scriptletNameValidationCache = new Map();\n\n /**\n * Checks whether the `name` is valid scriptlet name.\n * Uses cache for better performance.\n *\n * @param {string} name Scriptlet name.\n * @returns {boolean} True if scriptlet name is valid.\n */\n const isValidScriptletName = function isValidScriptletName(name) {\n if (!name) {\n return false;\n }\n // if there is no cached validation value\n if (!scriptletNameValidationCache.has(name)) {\n // we should calculate it first\n const isValid = isValidScriptletNameNotCached(name);\n // and save it to the cache then\n scriptletNameValidationCache.set(name, isValid);\n return isValid;\n }\n // otherwise return cached validation result\n return scriptletNameValidationCache.get(name);\n };\n\n /* ************************************************************************\n *\n * Redirects\n *\n ************************************************************************** */\n\n /**\n * Redirect resources markers\n */\n const ADG_UBO_REDIRECT_MARKER = 'redirect=';\n const ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule=';\n const ABP_REDIRECT_MARKER = 'rewrite=abp-resource:';\n const EMPTY_REDIRECT_MARKER = 'empty';\n const VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other'];\n\n /**\n * Source types for redirect rules if there is no one of them.\n * Used for ADG -> UBO conversion.\n */\n const ABSENT_SOURCE_TYPE_REPLACEMENT = [{\n NAME: 'nooptext',\n TYPES: VALID_SOURCE_TYPES\n }, {\n NAME: 'noopcss',\n TYPES: ['stylesheet']\n }, {\n NAME: 'noopjs',\n TYPES: ['script']\n }, {\n NAME: 'noopframe',\n TYPES: ['subdocument']\n }, {\n NAME: '1x1-transparent.gif',\n TYPES: ['image']\n }, {\n NAME: 'noopmp3-0.1s',\n TYPES: ['media']\n }, {\n NAME: 'noopmp4-1s',\n TYPES: ['media']\n }, {\n NAME: 'googlesyndication-adsbygoogle',\n TYPES: ['xmlhttprequest', 'script']\n }, {\n NAME: 'google-analytics',\n TYPES: ['script']\n }, {\n NAME: 'googletagservices-gpt',\n TYPES: ['script']\n }];\n const validAdgRedirects = redirects$1.filter(function (el) {\n return el.adg;\n });\n\n /**\n * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names\n * It's used for UBO -> ADG converting\n */\n const uboToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) {\n return el.ubo;\n }).map(function (el) {\n return [el.ubo, el.adg];\n }));\n\n /**\n * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names\n * It's used for ABP -> ADG converting\n */\n const abpToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) {\n return el.abp;\n }).map(function (el) {\n return [el.abp, el.adg];\n }));\n\n /**\n * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names\n * It's used for ADG -> UBO converting\n */\n const adgToUboCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) {\n return el.ubo;\n }).map(function (el) {\n return [el.adg, el.ubo];\n }));\n\n /**\n * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names\n * 'adgToUboCompatibility' is still needed for ADG -> UBO converting\n */\n const validAdgCompatibility = getObjectFromEntries(validAdgRedirects.map(function (el) {\n return [el.adg, 'valid adg redirect'];\n }));\n const REDIRECT_RULE_TYPES = {\n VALID_ADG: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER,\n compatibility: validAdgCompatibility\n },\n ADG: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER,\n compatibility: adgToUboCompatibility\n },\n UBO: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER,\n compatibility: uboToAdgCompatibility\n },\n ABP: {\n redirectMarker: ABP_REDIRECT_MARKER,\n compatibility: abpToAdgCompatibility\n }\n };\n\n /**\n * Parses redirect rule modifiers\n *\n * @param {string} rule rule text\n * @returns {Array} list of rule modifiers\n */\n const parseModifiers = function parseModifiers(rule) {\n return substringAfter$1(rule, '$').split(',');\n };\n\n /**\n * Gets redirect resource name\n *\n * @param {string} rule rule text\n * @param {string} marker - specific Adg/Ubo or Abp redirect resources marker\n * @returns {string} - redirect resource name\n */\n const getRedirectName = function getRedirectName(rule, marker) {\n const ruleModifiers = parseModifiers(rule);\n const redirectNamePart = ruleModifiers.find(function (el) {\n return el.includes(marker);\n });\n return substringAfter$1(redirectNamePart, marker);\n };\n\n /**\n * Checks if the `rule` is AdGuard redirect rule.\n * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier.\n *\n * @param {string} rule - rule text\n * @returns {boolean} if given rule is adg redirect\n */\n const isAdgRedirectRule = function isAdgRedirectRule(rule) {\n const MARKER_IN_BASE_PART_MASK = '/((?!\\\\$|\\\\,).{1})redirect((-rule)?)=(.{0,}?)\\\\$(popup)?/';\n return !isComment(rule) && (rule.includes(REDIRECT_RULE_TYPES.ADG.redirectMarker) || rule.includes(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker))\n // some js rules may have 'redirect=' in it, so we should get rid of them\n && !rule.includes(JS_RULE_MARKER)\n // get rid of rules like '_redirect=*://look.$popup'\n && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule);\n };\n\n // const getRedirectResourceMarkerData = ()\n\n /**\n * Checks if the `rule` satisfies the `type`\n *\n * @param {string} rule - rule text\n * @param {'VALID_ADG'|'ADG'|'UBO'|'ABP'} type - type of a redirect rule\n * @returns {boolean} if the `rule` satisfies the `type`\n */\n const isRedirectRuleByType = function isRedirectRuleByType(rule, type) {\n const _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[type],\n redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker,\n redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker,\n compatibility = _REDIRECT_RULE_TYPES$.compatibility;\n if (rule && !isComment(rule)) {\n let marker;\n // check if there is a $redirect-rule modifier in rule\n let markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1;\n if (markerIndex > -1) {\n marker = redirectRuleMarker;\n } else {\n // check if there $redirect modifier in rule\n markerIndex = rule.indexOf(redirectMarker);\n if (markerIndex > -1) {\n marker = redirectMarker;\n } else {\n return false;\n }\n }\n const redirectName = getRedirectName(rule, marker);\n if (!redirectName) {\n return false;\n }\n return redirectName === Object.keys(compatibility).find(function (el) {\n return el === redirectName;\n });\n }\n return false;\n };\n\n /**\n * Checks if the `rule` is **valid** AdGuard redirect resource rule\n *\n * @param {string} rule - rule text\n * @returns {boolean} if given rule is valid adg redirect\n */\n const isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) {\n return isRedirectRuleByType(rule, 'VALID_ADG');\n };\n\n /**\n * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion\n *\n * @param {string} rule - AdGuard rule text\n * @returns {boolean} - true if the rule can be converted to Ubo\n */\n const isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) {\n return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, 'ADG');\n };\n\n /**\n * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion\n *\n * @param {string} rule - Ubo rule text\n * @returns {boolean} - true if the rule can be converted to AdGuard\n */\n const isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, 'UBO');\n };\n\n /**\n * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion\n *\n * @param {string} rule - Abp rule text\n * @returns {boolean} - true if the rule can be converted to AdGuard\n */\n const isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, 'ABP');\n };\n\n /**\n * Checks if the rule has specified content type before Adg -> Ubo conversion.\n *\n * Used ONLY for Adg -> Ubo conversion\n * because Ubo redirect rules must contain content type, but Adg and Abp must not.\n *\n * Also source type can not be added automatically because of such valid rules:\n * ! Abp:\n * $rewrite=abp-resource:blank-js,xmlhttprequest\n * ! Adg:\n * $script,redirect=noopvast-2.0\n * $xmlhttprequest,redirect=noopvast-2.0\n *\n * @param {string} rule rule text\n * @returns {boolean} if the rule has specified content type before conversion\n */\n const hasValidContentType = function hasValidContentType(rule) {\n const ruleModifiers = parseModifiers(rule);\n // rule can have more than one source type modifier\n const sourceTypes = ruleModifiers.filter(function (el) {\n return VALID_SOURCE_TYPES.includes(el);\n });\n const isSourceTypeSpecified = sourceTypes.length > 0;\n const isEmptyRedirect = ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER));\n if (isEmptyRedirect) {\n // no source type for 'empty' is allowed\n return true;\n }\n return isSourceTypeSpecified;\n };\n const validator = {\n UBO_SCRIPTLET_MASK_REG,\n ABP_SCRIPTLET_MASK,\n ABP_SCRIPTLET_EXCEPTION_MASK,\n isComment,\n isAdgScriptletRule,\n isUboScriptletRule,\n isAbpSnippetRule,\n getScriptletByName,\n isValidScriptletName,\n ADG_UBO_REDIRECT_RULE_MARKER,\n REDIRECT_RULE_TYPES,\n ABSENT_SOURCE_TYPE_REPLACEMENT,\n isAdgRedirectRule,\n isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg,\n parseModifiers,\n getRedirectName,\n hasValidContentType\n };\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n var arrayWithHoles = _arrayWithHoles;\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n }\n var iterableToArray = _iterableToArray;\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n }\n var arrayLikeToArray = _arrayLikeToArray;\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n }\n var unsupportedIterableToArray = _unsupportedIterableToArray;\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n var nonIterableRest = _nonIterableRest;\n\n function _toArray(arr) {\n return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest();\n }\n var toArray$1 = _toArray;\n\n /**\n * AdGuard scriptlet rule\n */\n const ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\\/\\/scriptlet\\(.+\\)/;\n // eslint-disable-next-line no-template-curly-in-string\n const ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})';\n // eslint-disable-next-line no-template-curly-in-string\n const ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})';\n\n /**\n * uBlock scriptlet rule mask\n */\n // eslint-disable-next-line no-template-curly-in-string\n const UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})';\n // eslint-disable-next-line no-template-curly-in-string\n const UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})';\n const UBO_ALIAS_NAME_MARKER = 'ubo-';\n const UBO_SCRIPTLET_JS_ENDING = '.js';\n\n // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr\n const UBO_XHR_TYPE = 'xhr';\n const ADG_XHR_TYPE = 'xmlhttprequest';\n const ADG_SET_CONSTANT_NAME = 'set-constant';\n const ADG_SET_CONSTANT_EMPTY_STRING = '';\n const ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr';\n const ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj';\n const UBO_SET_CONSTANT_EMPTY_STRING = '\\'\\'';\n const UBO_SET_CONSTANT_EMPTY_ARRAY = '[]';\n const UBO_SET_CONSTANT_EMPTY_OBJECT = '{}';\n const ADG_PREVENT_FETCH_NAME = 'prevent-fetch';\n const ADG_PREVENT_FETCH_EMPTY_STRING = '';\n const ADG_PREVENT_FETCH_WILDCARD = '*';\n const UBO_NO_FETCH_IF_WILDCARD = '/^/';\n const ESCAPED_COMMA_SEPARATOR = '\\\\,';\n const COMMA_SEPARATOR = ',';\n const REMOVE_ATTR_METHOD = 'removeAttr';\n const REMOVE_CLASS_METHOD = 'removeClass';\n const REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names;\n const REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names;\n const ADG_REMOVE_ATTR_NAME = REMOVE_ATTR_ALIASES[0];\n const ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0];\n const REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete'];\n\n /**\n * Returns array of strings separated by space which is not in quotes\n *\n * @param {string} str arbitrary string\n * @returns {string[]} result array\n */\n const getSentences = function getSentences(str) {\n const reg = /'.*?'|\".*?\"|\\S+/g;\n return str.match(reg);\n };\n\n /**\n * Replaces string with data by placeholders\n *\n * @param {string} str string with placeholders\n * @param {Object} data where keys are placeholders names\n * @returns {string} string filled with data\n */\n const replacePlaceholders = function replacePlaceholders(str, data) {\n return Object.keys(data).reduce(function (acc, key) {\n const reg = new RegExp(\"\\\\$\\\\{\".concat(key, \"\\\\}\"), 'g');\n acc = acc.replace(reg, data[key]);\n return acc;\n }, str);\n };\n const splitArgs = function splitArgs(str) {\n const args = [];\n let prevArgStart = 0;\n for (let i = 0; i < str.length; i += 1) {\n // do not split args by escaped comma\n // https://github.com/AdguardTeam/Scriptlets/issues/133\n if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\\\') {\n args.push(str.slice(prevArgStart, i).trim());\n prevArgStart = i + 1;\n }\n }\n // collect arg after last comma\n args.push(str.slice(prevArgStart, str.length).trim());\n return args;\n };\n\n /**\n * Validates remove-attr/class scriptlet args\n *\n * @param {string[]} parsedArgs scriptlet arguments\n * @returns {string[]|Error} valid args OR error for invalid selector\n */\n const validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) {\n const _parsedArgs = toArray$1(parsedArgs),\n name = _parsedArgs[0],\n value = _parsedArgs[1],\n restArgs = _parsedArgs.slice(2);\n // no extra checking if there are only scriptlet name and value\n // https://github.com/AdguardTeam/Scriptlets/issues/235\n if (restArgs.length === 0) {\n return [name, value];\n }\n\n // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should:\n // 1. check if last arg is 'applying' parameter\n // 2. join 'selector' into one arg\n // 3. combine all args\n // https://github.com/AdguardTeam/Scriptlets/issues/133\n const lastArg = restArgs.pop();\n let applying;\n // check the last parsed arg for matching possible 'applying' vale\n if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) {\n return lastArg.indexOf(el) > -1;\n })) {\n applying = lastArg;\n } else {\n restArgs.push(lastArg);\n }\n const selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR);\n if (selector.length > 0 && typeof document !== 'undefined') {\n // empty selector is valid for these scriptlets as it applies to all elements,\n // all other selectors should be validated\n // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html')\n document.querySelectorAll(selector);\n }\n const validArgs = applying ? [name, value, selector, applying] : [name, value, selector];\n return validArgs;\n };\n\n /**\n * Converts string of UBO scriptlet rule to AdGuard scriptlet rule\n *\n * @param {string} rule UBO scriptlet rule\n * @returns {string[]} array with one AdGuard scriptlet rule\n */\n const convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) {\n const domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG);\n const mask = rule.match(validator.UBO_SCRIPTLET_MASK_REG)[0];\n let template;\n if (mask.indexOf('@') > -1) {\n template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = ADGUARD_SCRIPTLET_TEMPLATE;\n }\n const argsStr = getStringInBraces(rule);\n let parsedArgs = splitArgs(argsStr);\n const scriptletName = parsedArgs[0].indexOf(UBO_SCRIPTLET_JS_ENDING) > -1 ? \"ubo-\".concat(parsedArgs[0]) : \"ubo-\".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING);\n if (REMOVE_ATTR_ALIASES.indexOf(scriptletName) > -1 || REMOVE_CLASS_ALIASES.indexOf(scriptletName) > -1) {\n parsedArgs = validateRemoveAttrClassArgs(parsedArgs);\n }\n const args = parsedArgs.map(function (arg, index) {\n let outputArg = arg;\n if (index === 0) {\n outputArg = scriptletName;\n }\n // for example: example.org##+js(abort-current-inline-script, $, popup)\n if (arg === '$') {\n outputArg = '$$';\n }\n return outputArg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n const adgRule = replacePlaceholders(template, {\n domains,\n args\n });\n return [adgRule];\n };\n\n /**\n * Convert string of ABP snippet rule to AdGuard scriptlet rule\n *\n * @param {string} rule ABP snippet rule\n * @returns {Array} array of AdGuard scriptlet rules, one or few items depends on Abp-rule\n */\n const convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) {\n const SEMICOLON_DIVIDER = /;(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/g;\n const mask = rule.indexOf(validator.ABP_SCRIPTLET_MASK) > -1 ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK;\n const template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n const domains = substringBefore(rule, mask);\n const args = substringAfter$1(rule, mask);\n return args.split(SEMICOLON_DIVIDER)\n // abp-rule may have `;` at the end which makes last array item irrelevant\n // https://github.com/AdguardTeam/Scriptlets/issues/236\n .filter(isExisting).map(function (args) {\n return getSentences(args).map(function (arg, index) {\n return index === 0 ? \"abp-\".concat(arg) : arg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n }).map(function (args) {\n return replacePlaceholders(template, {\n domains,\n args\n });\n });\n };\n\n /**\n * Validates ADG scriptlet rule syntax.\n *\n * IMPORTANT! The method is not very fast as it parses the rule and checks its syntax.\n *\n * @param {string} adgRuleText Single ADG scriptlet rule.\n *\n * @returns {boolean} False if ADG scriptlet rule syntax is not valid\n * or `adgRuleText` is not an ADG scriptlet rule.\n */\n const isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) {\n if (!adgRuleText) {\n return false;\n }\n if (!validator.isAdgScriptletRule(adgRuleText)) {\n return false;\n }\n // isAdgScriptletRule() does not check the rule syntax\n let parsedRule;\n try {\n // parseRule() ensures that the rule syntax is valid\n // and it will throw an error if it is not\n parsedRule = parseRule(adgRuleText);\n return validator.isValidScriptletName(parsedRule.name);\n } catch (e) {\n return false;\n }\n };\n\n /**\n * Converts any scriptlet rule into AdGuard syntax rule.\n * Comment is returned as is.\n *\n * @param {string} rule Scriptlet rule.\n *\n * @returns {string[]} Array of AdGuard scriptlet rules: one array item for ADG and UBO or few items for ABP.\n * For the ADG `rule`, validates its syntax and returns an empty array if it is invalid.\n */\n const convertScriptletToAdg = function convertScriptletToAdg(rule) {\n let result;\n // TODO: multiple conditions may be refactored\n if (validator.isUboScriptletRule(rule)) {\n result = convertUboScriptletToAdg(rule);\n } else if (validator.isAbpSnippetRule(rule)) {\n result = convertAbpSnippetToAdg(rule);\n } else if (validator.isAdgScriptletRule(rule)) {\n if (isValidAdgScriptletRuleSyntax(rule)) {\n result = [rule];\n } else {\n // eslint-disable-next-line no-console\n console.log(\"Invalid AdGuard scriptlet rule: \".concat(rule));\n result = [];\n }\n } else if (validator.isComment(rule)) {\n result = [rule];\n }\n return result;\n };\n\n /**\n * Converts UBO scriptlet rule to AdGuard one\n *\n * @param {string} rule AdGuard scriptlet rule\n * @returns {string} UBO scriptlet rule\n */\n const convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) {\n let res;\n if (validator.isAdgScriptletRule(rule)) {\n const _parseRule = parseRule(rule),\n parsedName = _parseRule.name,\n parsedParams = _parseRule.args;\n let preparedParams;\n if (parsedName === ADG_SET_CONSTANT_NAME\n // https://github.com/AdguardTeam/FiltersCompiler/issues/102\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING];\n } else if (parsedName === ADG_SET_CONSTANT_NAME\n // https://github.com/uBlockOrigin/uBlock-issues/issues/2411\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY];\n } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT];\n } else if (parsedName === ADG_PREVENT_FETCH_NAME\n // https://github.com/AdguardTeam/Scriptlets/issues/109\n && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) {\n preparedParams = [UBO_NO_FETCH_IF_WILDCARD];\n } else if ((parsedName === ADG_REMOVE_ATTR_NAME || parsedName === ADG_REMOVE_CLASS_NAME) && parsedParams[1] && parsedParams[1].indexOf(COMMA_SEPARATOR) > -1) {\n preparedParams = [parsedParams[0], replaceAll(parsedParams[1], COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR)];\n } else {\n preparedParams = parsedParams;\n }\n\n // object of name and aliases for the Adg-scriptlet\n const adgScriptletObject = Object.keys(scriptletList).map(function (el) {\n return scriptletList[el];\n }).map(function (s) {\n const _s$names = toArray$1(s.names),\n name = _s$names[0],\n aliases = _s$names.slice(1);\n return {\n name,\n aliases\n };\n }).find(function (el) {\n return el.name === parsedName || el.aliases.indexOf(parsedName) >= 0;\n });\n const aliases = adgScriptletObject.aliases;\n if (aliases.length > 0) {\n const uboAlias = adgScriptletObject.aliases\n // eslint-disable-next-line no-restricted-properties\n .find(function (alias) {\n return alias.includes(UBO_ALIAS_NAME_MARKER);\n });\n if (uboAlias) {\n const mask = rule.match(ADGUARD_SCRIPTLET_MASK_REG)[0];\n let template;\n if (mask.indexOf('@') > -1) {\n template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = UBO_SCRIPTLET_TEMPLATE;\n }\n const domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG);\n const uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '')\n // '.js' in the Ubo scriptlet name can be omitted\n // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets\n .replace(UBO_SCRIPTLET_JS_ENDING, '');\n const args = preparedParams.length > 0 ? \"\".concat(uboName, \", \").concat(preparedParams.join(\"\".concat(COMMA_SEPARATOR, \" \"))) : uboName;\n const uboRule = replacePlaceholders(template, {\n domains,\n args\n });\n res = uboRule;\n }\n }\n }\n return res;\n };\n\n /**\n * Returns scriptlet name from `rule`.\n *\n * @param {string} rule AdGuard syntax scriptlet rule.\n * @returns {string|null} Scriptlet name or null.\n */\n const getAdgScriptletName = function getAdgScriptletName(rule) {\n // get substring after '#//scriptlet('\n let buffer = substringAfter$1(rule, \"\".concat(ADG_SCRIPTLET_MASK, \"(\"));\n if (!buffer) {\n return null;\n }\n // get the quote used for the first scriptlet parameter which is a name\n const nameQuote = buffer[0];\n // delete the quote from the buffer\n buffer = buffer.slice(1);\n if (!buffer) {\n return null;\n }\n // get a supposed scriptlet name\n const name = substringBefore(buffer, nameQuote);\n return name === buffer ? null : name;\n };\n\n /**\n * 1. For ADG scriptlet checks whether the scriptlet syntax and name are valid.\n * 2. For UBO and ABP scriptlet first checks their compatibility with ADG\n * by converting them into ADG syntax, and after that checks the name.\n *\n * ADG or UBO rules are \"single-scriptlet\", but ABP rule may contain more than one snippet\n * so if at least one of them is not valid — whole `ruleText` rule is not valid too.\n *\n * @param {string} ruleText Any scriptlet rule — ADG or UBO or ABP.\n *\n * @returns {boolean} True if scriptlet name is valid in rule.\n */\n const isValidScriptletRule = function isValidScriptletRule(ruleText) {\n if (!ruleText) {\n return false;\n }\n\n // `ruleText` with ABP syntax may contain more than one snippet in one rule\n const rulesArray = convertScriptletToAdg(ruleText);\n\n // for ADG rule with invalid syntax convertScriptletToAdg() will return empty array\n if (rulesArray.length === 0) {\n return false;\n }\n\n // checking if each of parsed scriptlets is valid\n // if at least one of them is not valid - whole `ruleText` is not valid too\n const isValid = rulesArray.every(function (rule) {\n const name = getAdgScriptletName(rule);\n return validator.isValidScriptletName(name);\n });\n return isValid;\n };\n\n /**\n * Gets index and redirect resource marker from UBO/ADG modifiers array\n *\n * @param {string[]} modifiers rule modifiers\n * @param {Object} redirectsData validator.REDIRECT_RULE_TYPES.(UBO|ADG)\n * @param {string} rule rule string\n * @returns {Object} { index, marker }\n */\n const getMarkerData = function getMarkerData(modifiers, redirectsData, rule) {\n let marker;\n let index = modifiers.findIndex(function (m) {\n return m.indexOf(redirectsData.redirectRuleMarker) > -1;\n });\n if (index > -1) {\n marker = redirectsData.redirectRuleMarker;\n } else {\n index = modifiers.findIndex(function (m) {\n return m.indexOf(redirectsData.redirectMarker) > -1;\n });\n if (index > -1) {\n marker = redirectsData.redirectMarker;\n } else {\n throw new Error(\"No redirect resource modifier found in rule: \".concat(rule));\n }\n }\n return {\n index,\n marker\n };\n };\n\n /**\n * Converts Ubo redirect rule to Adg one\n *\n * @param {string} rule ubo redirect rule\n * @returns {string} converted adg rule\n */\n const convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) {\n const firstPartOfRule = substringBefore(rule, '$');\n const uboModifiers = validator.parseModifiers(rule);\n const uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule);\n const adgModifiers = uboModifiers.map(function (modifier, index) {\n if (index === uboMarkerData.index) {\n const uboName = substringAfter$1(modifier, uboMarkerData.marker);\n const adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName];\n const adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker;\n return \"\".concat(adgMarker).concat(adgName);\n }\n if (modifier === UBO_XHR_TYPE) {\n return ADG_XHR_TYPE;\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n\n /**\n * Converts Abp redirect rule to Adg one\n *\n * @param {string} rule abp redirect rule\n * @returns {string} converted adg rule\n */\n const convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) {\n const firstPartOfRule = substringBefore(rule, '$');\n const abpModifiers = validator.parseModifiers(rule);\n const adgModifiers = abpModifiers.map(function (modifier) {\n if (modifier.indexOf(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker) > -1) {\n const abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker);\n const adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName];\n return \"\".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName);\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n\n /**\n * Converts redirect rule to AdGuard one\n *\n * @param {string} rule redirect rule\n * @returns {string} converted adg rule\n */\n const convertRedirectToAdg = function convertRedirectToAdg(rule) {\n let result;\n if (validator.isUboRedirectCompatibleWithAdg(rule)) {\n result = convertUboRedirectToAdg(rule);\n } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) {\n result = convertAbpRedirectToAdg(rule);\n } else if (validator.isValidAdgRedirectRule(rule)) {\n result = rule;\n }\n return result;\n };\n\n /**\n * Converts Adg redirect rule to Ubo one\n * 1. Checks if there is Ubo analog for Adg rule\n * 2. Parses the rule and checks if there are any source type modifiers which are required by Ubo\n * and if there are no one we add it manually to the end.\n * Source types are chosen according to redirect name\n * e.g. ||ad.com^$redirect=,important ->> ||ad.com^$redirect=,important,script\n * 3. Replaces Adg redirect name by Ubo analog\n *\n * @param {string} rule adg rule\n * @returns {string} converted ubo rule\n * @throws on incompatible rule\n */\n const convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) {\n if (!validator.isAdgRedirectCompatibleWithUbo(rule)) {\n throw new Error(\"Unable to convert for uBO - unsupported redirect in rule: \".concat(rule));\n }\n const basePart = substringBefore(rule, '$');\n const adgModifiers = validator.parseModifiers(rule);\n const adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule);\n const adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length);\n if (!validator.hasValidContentType(rule)) {\n // add missed source types as content type modifiers\n const sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) {\n return el.NAME === adgRedirectName;\n });\n if (typeof sourceTypesData === 'undefined') {\n // eslint-disable-next-line max-len\n throw new Error(\"Unable to convert for uBO - no types to add for specific redirect in rule: \".concat(rule));\n }\n const additionModifiers = sourceTypesData.TYPES;\n adgModifiers.push(...additionModifiers);\n }\n const uboModifiers = adgModifiers.map(function (el, index) {\n if (index === adgMarkerData.index) {\n const uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker;\n // eslint-disable-next-line max-len\n const uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName];\n return \"\".concat(uboMarker).concat(uboRedirectName);\n }\n return el;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(basePart, \"$\").concat(uboModifiers);\n };\n\n /**\n * @redirect google-analytics\n * @description\n * Mocks Google's Analytics and Tag Manager APIs.\n * [Covers obsolete googletagmanager-gtm redirect functionality](https://github.com/AdguardTeam/Scriptlets/issues/127).\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/8cd2a1d263a96421487b39040c1d23eb01169484/src/web_accessible_resources/google-analytics_analytics.js\n *\n * **Example**\n * ```\n * ||google-analytics.com/analytics.js$script,redirect=google-analytics\n * ||googletagmanager.com/gtm.js$script,redirect=googletagmanager-gtm\n * ```\n */\n function GoogleAnalytics(source) {\n // eslint-disable-next-line func-names\n const Tracker = function Tracker() {}; // constructor\n const proto = Tracker.prototype;\n proto.get = noopFunc;\n proto.set = noopFunc;\n proto.send = noopFunc;\n const googleAnalyticsName = window.GoogleAnalyticsObject || 'ga';\n // a -- fake arg for 'ga.length < 1' antiadblock checking\n // eslint-disable-next-line no-unused-vars\n function ga(a) {\n const len = arguments.length;\n if (len === 0) {\n return;\n }\n // eslint-disable-next-line prefer-rest-params\n const lastArg = arguments[len - 1];\n let replacer;\n if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') {\n replacer = lastArg.hitCallback;\n } else if (typeof lastArg === 'function') {\n // https://github.com/AdguardTeam/Scriptlets/issues/98\n replacer = function replacer() {\n lastArg(ga.create());\n };\n }\n try {\n setTimeout(replacer, 1);\n // eslint-disable-next-line no-empty\n } catch (ex) {}\n }\n ga.create = function () {\n return new Tracker();\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/134\n ga.getByName = function () {\n return new Tracker();\n };\n ga.getAll = function () {\n return [new Tracker()];\n };\n ga.remove = noopFunc;\n ga.loaded = true;\n window[googleAnalyticsName] = ga;\n const _window = window,\n dataLayer = _window.dataLayer,\n google_optimize = _window.google_optimize; // eslint-disable-line camelcase\n if (dataLayer instanceof Object === false) {\n return;\n }\n if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') {\n dataLayer.hide.end();\n }\n\n /**\n * checks data object and delays callback\n *\n * @param {object|Array} dataObj gtag payload\n * @param {string} funcName callback prop name\n */\n const handleCallback = function handleCallback(dataObj, funcName) {\n if (dataObj && typeof dataObj[funcName] === 'function') {\n setTimeout(dataObj[funcName]);\n }\n };\n if (typeof dataLayer.push === 'function') {\n dataLayer.push = function (data) {\n if (data instanceof Object) {\n handleCallback(data, 'eventCallback');\n // eslint-disable-next-line no-restricted-syntax, guard-for-in\n for (const key in data) {\n handleCallback(data[key], 'event_callback');\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) {\n [].push.call(window.dataLayer, data);\n }\n }\n if (Array.isArray(data)) {\n data.forEach(function (arg) {\n handleCallback(arg, 'callback');\n });\n }\n return noopFunc;\n };\n }\n\n // https://github.com/AdguardTeam/Scriptlets/issues/81\n // eslint-disable-next-line camelcase\n if (google_optimize instanceof Object && typeof google_optimize.get === 'function') {\n const googleOptimizeWrapper = {\n get: noopFunc\n };\n window.google_optimize = googleOptimizeWrapper;\n }\n hit(source);\n }\n GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js',\n // https://github.com/AdguardTeam/Scriptlets/issues/127\n 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js'];\n GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray];\n\n /* eslint-disable no-underscore-dangle */\n\n /**\n * @redirect google-analytics-ga\n * @description\n * Mocks old Google Analytics API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/google-analytics_ga.js\n *\n * **Example**\n * ```\n * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga\n * ```\n */\n function GoogleAnalyticsGa(source) {\n // Gaq constructor\n function Gaq() {}\n Gaq.prototype.Na = noopFunc;\n Gaq.prototype.O = noopFunc;\n Gaq.prototype.Sa = noopFunc;\n Gaq.prototype.Ta = noopFunc;\n Gaq.prototype.Va = noopFunc;\n Gaq.prototype._createAsyncTracker = noopFunc;\n Gaq.prototype._getAsyncTracker = noopFunc;\n Gaq.prototype._getPlugin = noopFunc;\n Gaq.prototype.push = function (data) {\n if (typeof data === 'function') {\n data();\n return;\n }\n if (Array.isArray(data) === false) {\n return;\n }\n // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link\n // https://github.com/uBlockOrigin/uBlock-issues/issues/1807\n if (typeof data[0] === 'string' && /(^|\\.)_link$/.test(data[0]) && typeof data[1] === 'string') {\n window.location.assign(data[1]);\n }\n // https://github.com/gorhill/uBlock/issues/2162\n if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') {\n data[2]();\n }\n };\n const gaq = new Gaq();\n const asyncTrackers = window._gaq || [];\n if (Array.isArray(asyncTrackers)) {\n while (asyncTrackers[0]) {\n gaq.push(asyncTrackers.shift());\n }\n }\n // eslint-disable-next-line no-multi-assign\n window._gaq = gaq.qf = gaq;\n\n // Gat constructor\n function Gat() {}\n\n // Mock tracker api\n const api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode'];\n const tracker = api.reduce(function (res, funcName) {\n res[funcName] = noopFunc;\n return res;\n }, {});\n tracker._getLinkerUrl = function (a) {\n return a;\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/154\n tracker._link = function (url) {\n if (typeof url !== 'string') {\n return;\n }\n try {\n window.location.assign(url);\n } catch (e) {\n logMessage(source, e);\n }\n };\n Gat.prototype._anonymizeIP = noopFunc;\n Gat.prototype._createTracker = noopFunc;\n Gat.prototype._forceSSL = noopFunc;\n Gat.prototype._getPlugin = noopFunc;\n Gat.prototype._getTracker = function () {\n return tracker;\n };\n Gat.prototype._getTrackerByName = function () {\n return tracker;\n };\n Gat.prototype._getTrackers = noopFunc;\n Gat.prototype.aa = noopFunc;\n Gat.prototype.ab = noopFunc;\n Gat.prototype.hb = noopFunc;\n Gat.prototype.la = noopFunc;\n Gat.prototype.oa = noopFunc;\n Gat.prototype.pa = noopFunc;\n Gat.prototype.u = noopFunc;\n const gat = new Gat();\n window._gat = gat;\n hit(source);\n }\n GoogleAnalyticsGa.names = ['google-analytics-ga', 'ubo-google-analytics_ga.js', 'google-analytics_ga.js'];\n GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @redirect googlesyndication-adsbygoogle\n * @description\n * Mocks Google AdSense API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/googlesyndication_adsbygoogle.js\n *\n * **Example**\n * ```\n * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle\n * ```\n */\n /* eslint-enable max-len */\n function GoogleSyndicationAdsByGoogle(source) {\n window.adsbygoogle = {\n // https://github.com/AdguardTeam/Scriptlets/issues/113\n // length: 0,\n loaded: true,\n // https://github.com/AdguardTeam/Scriptlets/issues/184\n push(arg) {\n if (typeof this.length === 'undefined') {\n this.length = 0;\n this.length += 1;\n }\n if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) {\n const key = _Object$keys[_i];\n if (typeof arg[key] === 'function') {\n try {\n // https://github.com/AdguardTeam/Scriptlets/issues/252\n // argument \"{}\" is needed to fix issue with undefined argument\n arg[key].call(this, {});\n } catch (_unused) {\n /* empty */\n }\n }\n }\n }\n }\n };\n const adElems = document.querySelectorAll('.adsbygoogle');\n const css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;';\n const statusAttrName = 'data-adsbygoogle-status';\n const ASWIFT_IFRAME_MARKER = 'aswift_';\n const GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_';\n let executed = false;\n for (let i = 0; i < adElems.length; i += 1) {\n const adElemChildNodes = adElems[i].childNodes;\n const childNodesQuantity = adElemChildNodes.length;\n // childNodes of .adsbygoogle can be defined if scriptlet was executed before\n // so we should check that childNodes are exactly defined by us\n // TODO: remake after scriptlets context developing in 1.3\n let areIframesDefined = false;\n if (childNodesQuantity > 0) {\n // it should be only 2 child iframes if scriptlet was executed\n areIframesDefined = childNodesQuantity === 2\n // the first of child nodes should be aswift iframe\n && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1\n // the second of child nodes should be google_ads iframe\n && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.indexOf(GOOGLE_ADS_IFRAME_MARKER) > -1;\n }\n if (!areIframesDefined) {\n // here we do the job if scriptlet has not been executed earlier\n adElems[i].setAttribute(statusAttrName, 'done');\n const aswiftIframe = document.createElement('iframe');\n aswiftIframe.id = \"\".concat(ASWIFT_IFRAME_MARKER).concat(i);\n aswiftIframe.style = css;\n adElems[i].appendChild(aswiftIframe);\n const innerAswiftIframe = document.createElement('iframe');\n aswiftIframe.contentWindow.document.body.appendChild(innerAswiftIframe);\n const googleadsIframe = document.createElement('iframe');\n googleadsIframe.id = \"\".concat(GOOGLE_ADS_IFRAME_MARKER).concat(i);\n googleadsIframe.style = css;\n adElems[i].appendChild(googleadsIframe);\n const innerGoogleadsIframe = document.createElement('iframe');\n googleadsIframe.contentWindow.document.body.appendChild(innerGoogleadsIframe);\n executed = true;\n }\n }\n if (executed) {\n hit(source);\n }\n }\n GoogleSyndicationAdsByGoogle.names = ['googlesyndication-adsbygoogle', 'ubo-googlesyndication_adsbygoogle.js', 'googlesyndication_adsbygoogle.js'];\n GoogleSyndicationAdsByGoogle.injections = [hit];\n\n function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n var iterableToArrayLimit = _iterableToArrayLimit;\n\n function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n }\n var slicedToArray = _slicedToArray;\n\n /**\n * @redirect googletagservices-gpt\n * @description\n * Mocks Google Publisher Tag API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/googletagservices_gpt.js\n *\n * **Example**\n * ```\n * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt\n * ```\n */\n function GoogleTagServicesGpt(source) {\n const slots = new Map();\n const slotsById = new Map();\n const slotsPerPath = new Map();\n const slotCreatives = new Map();\n const eventCallbacks = new Map();\n const gTargeting = new Map();\n const addEventListener = function addEventListener(name, listener) {\n if (!eventCallbacks.has(name)) {\n eventCallbacks.set(name, new Set());\n }\n eventCallbacks.get(name).add(listener);\n return this;\n };\n const removeEventListener = function removeEventListener(name, listener) {\n if (eventCallbacks.has(name)) {\n return eventCallbacks.get(name).delete(listener);\n }\n return false;\n };\n const fireSlotEvent = function fireSlotEvent(name, slot) {\n return new Promise(function (resolve) {\n requestAnimationFrame(function () {\n const size = [0, 0];\n const callbacksSet = eventCallbacks.get(name) || [];\n const callbackArray = Array.from(callbacksSet);\n for (let i = 0; i < callbackArray.length; i += 1) {\n callbackArray[i]({\n isEmpty: true,\n size,\n slot\n });\n }\n resolve();\n });\n });\n };\n const emptySlotElement = function emptySlotElement(slot) {\n const node = document.getElementById(slot.getSlotElementId());\n while (node !== null && node !== void 0 && node.lastChild) {\n node.lastChild.remove();\n }\n };\n const recreateIframeForSlot = function recreateIframeForSlot(slot) {\n var _document$getElementB;\n const eid = \"google_ads_iframe_\".concat(slot.getId());\n (_document$getElementB = document.getElementById(eid)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();\n const node = document.getElementById(slot.getSlotElementId());\n if (node) {\n const f = document.createElement('iframe');\n f.id = eid;\n f.srcdoc = '';\n f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0';\n f.setAttribute('width', 0);\n f.setAttribute('height', 0);\n // https://github.com/AdguardTeam/Scriptlets/issues/259\n f.setAttribute('data-load-complete', true);\n f.setAttribute('data-google-container-id', true);\n f.setAttribute('sandbox', true);\n node.appendChild(f);\n }\n };\n const displaySlot = function displaySlot(slot) {\n if (!slot) {\n return;\n }\n const id = slot.getSlotElementId();\n if (!document.getElementById(id)) {\n return;\n }\n const parent = document.getElementById(id);\n if (parent) {\n parent.appendChild(document.createElement('div'));\n }\n emptySlotElement(slot);\n recreateIframeForSlot(slot);\n fireSlotEvent('slotRenderEnded', slot);\n fireSlotEvent('slotRequested', slot);\n fireSlotEvent('slotResponseReceived', slot);\n fireSlotEvent('slotOnload', slot);\n fireSlotEvent('impressionViewable', slot);\n };\n const companionAdsService = {\n addEventListener,\n removeEventListener,\n enableSyncLoading: noopFunc,\n setRefreshUnfilledSlots: noopFunc,\n getSlots: noopArray\n };\n const contentService = {\n addEventListener,\n removeEventListener,\n setContent: noopFunc\n };\n function PassbackSlot() {} // constructor\n\n PassbackSlot.prototype.display = noopFunc;\n PassbackSlot.prototype.get = noopNull;\n PassbackSlot.prototype.set = noopThis;\n PassbackSlot.prototype.setClickUrl = noopThis;\n PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis;\n PassbackSlot.prototype.setTargeting = noopThis;\n PassbackSlot.prototype.updateTargetingFromMap = noopThis;\n function SizeMappingBuilder() {} // constructor\n SizeMappingBuilder.prototype.addSize = noopThis;\n SizeMappingBuilder.prototype.build = noopNull;\n const getTargetingValue = function getTargetingValue(v) {\n if (typeof v === 'string') {\n return [v];\n }\n try {\n return [Array.prototype.flat.call(v)[0]];\n } catch (_unused) {\n // do nothing\n }\n return [];\n };\n const updateTargeting = function updateTargeting(targeting, map) {\n if (typeof map === 'object') {\n const entries = Object.entries(map || {});\n for (var _i = 0, _entries = entries; _i < _entries.length; _i++) {\n const _entries$_i = slicedToArray(_entries[_i], 2),\n k = _entries$_i[0],\n v = _entries$_i[1];\n targeting.set(k, getTargetingValue(v));\n }\n }\n };\n const defineSlot = function defineSlot(adUnitPath, creatives, optDiv) {\n if (slotsById.has(optDiv)) {\n var _document$getElementB2;\n (_document$getElementB2 = document.getElementById(optDiv)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.remove();\n return slotsById.get(optDiv);\n }\n const attributes = new Map();\n const targeting = new Map();\n const exclusions = new Set();\n const response = {\n advertiserId: undefined,\n campaignId: undefined,\n creativeId: undefined,\n creativeTemplateId: undefined,\n lineItemId: undefined\n };\n const sizes = [{\n getHeight: function getHeight() {\n return 2;\n },\n getWidth: function getWidth() {\n return 2;\n }\n }];\n const num = (slotsPerPath.get(adUnitPath) || 0) + 1;\n slotsPerPath.set(adUnitPath, num);\n const id = \"\".concat(adUnitPath, \"_\").concat(num);\n let clickUrl = '';\n let collapseEmptyDiv = null;\n const services = new Set();\n const slot = {\n addService(e) {\n services.add(e);\n return slot;\n },\n clearCategoryExclusions: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n targeting.clear();\n } else {\n targeting.delete(k);\n }\n },\n defineSizeMapping(mapping) {\n slotCreatives.set(optDiv, mapping);\n return this;\n },\n get: function get(k) {\n return attributes.get(k);\n },\n getAdUnitPath: function getAdUnitPath() {\n return adUnitPath;\n },\n getAttributeKeys: function getAttributeKeys() {\n return Array.from(attributes.keys());\n },\n getCategoryExclusions: function getCategoryExclusions() {\n return Array.from(exclusions);\n },\n getClickUrl: function getClickUrl() {\n return clickUrl;\n },\n getCollapseEmptyDiv: function getCollapseEmptyDiv() {\n return collapseEmptyDiv;\n },\n getContentUrl: function getContentUrl() {\n return '';\n },\n getDivStartsCollapsed: function getDivStartsCollapsed() {\n return null;\n },\n getDomId: function getDomId() {\n return optDiv;\n },\n getEscapedQemQueryId: function getEscapedQemQueryId() {\n return '';\n },\n getFirstLook: function getFirstLook() {\n return 0;\n },\n getId: function getId() {\n return id;\n },\n getHtml: function getHtml() {\n return '';\n },\n getName: function getName() {\n return id;\n },\n getOutOfPage: function getOutOfPage() {\n return false;\n },\n getResponseInformation: function getResponseInformation() {\n return response;\n },\n getServices: function getServices() {\n return Array.from(services);\n },\n getSizes: function getSizes() {\n return sizes;\n },\n getSlotElementId: function getSlotElementId() {\n return optDiv;\n },\n getSlotId: function getSlotId() {\n return slot;\n },\n getTargeting: function getTargeting(k) {\n return targeting.get(k) || gTargeting.get(k) || [];\n },\n getTargetingKeys: function getTargetingKeys() {\n return Array.from(new Set(Array.of(...gTargeting.keys(), ...targeting.keys())));\n },\n getTargetingMap: function getTargetingMap() {\n return Object.assign(Object.fromEntries(gTargeting.entries()), Object.fromEntries(targeting.entries()));\n },\n set(k, v) {\n attributes.set(k, v);\n return slot;\n },\n setCategoryExclusion(e) {\n exclusions.add(e);\n return slot;\n },\n setClickUrl(u) {\n clickUrl = u;\n return slot;\n },\n setCollapseEmptyDiv(v) {\n collapseEmptyDiv = !!v;\n return slot;\n },\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting(k, v) {\n targeting.set(k, getTargetingValue(v));\n return slot;\n },\n toString: function toString() {\n return id;\n },\n updateTargetingFromMap(map) {\n updateTargeting(targeting, map);\n return slot;\n }\n };\n slots.set(adUnitPath, slot);\n slotsById.set(optDiv, slot);\n slotCreatives.set(optDiv, creatives);\n return slot;\n };\n const pubAdsService = {\n addEventListener,\n removeEventListener,\n clear: noopFunc,\n clearCategoryExclusions: noopThis,\n clearTagForChildDirectedTreatment: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n gTargeting.clear();\n } else {\n gTargeting.delete(k);\n }\n },\n collapseEmptyDivs: noopFunc,\n defineOutOfPagePassback() {\n return new PassbackSlot();\n },\n definePassback() {\n return new PassbackSlot();\n },\n disableInitialLoad: noopFunc,\n display: noopFunc,\n enableAsyncRendering: noopFunc,\n enableLazyLoad: noopFunc,\n enableSingleRequest: noopFunc,\n enableSyncRendering: noopFunc,\n enableVideoAds: noopFunc,\n get: noopNull,\n getAttributeKeys: noopArray,\n getTargeting: noopArray,\n getTargetingKeys: noopArray,\n getSlots: noopArray,\n isInitialLoadDisabled: trueFunc,\n refresh: noopFunc,\n set: noopThis,\n setCategoryExclusion: noopThis,\n setCentering: noopFunc,\n setCookieOptions: noopThis,\n setForceSafeFrame: noopThis,\n setLocation: noopThis,\n setPublisherProvidedId: noopThis,\n setRequestNonPersonalizedAds: noopThis,\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting: noopThis,\n setVideoContent: noopThis,\n updateCorrelator: noopFunc\n };\n const _window = window,\n _window$googletag = _window.googletag,\n googletag = _window$googletag === void 0 ? {} : _window$googletag;\n const _googletag$cmd = googletag.cmd,\n cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd;\n googletag.apiReady = true;\n googletag.cmd = [];\n googletag.cmd.push = function (a) {\n try {\n a();\n // eslint-disable-next-line no-empty\n } catch (ex) {}\n return 1;\n };\n googletag.companionAds = function () {\n return companionAdsService;\n };\n googletag.content = function () {\n return contentService;\n };\n googletag.defineOutOfPageSlot = defineSlot;\n googletag.defineSlot = defineSlot;\n googletag.destroySlots = function () {\n slots.clear();\n slotsById.clear();\n };\n googletag.disablePublisherConsole = noopFunc;\n googletag.display = function (arg) {\n let id;\n if (arg !== null && arg !== void 0 && arg.getSlotElementId) {\n id = arg.getSlotElementId();\n } else if (arg !== null && arg !== void 0 && arg.nodeType) {\n id = arg.id;\n } else {\n id = String(arg);\n }\n displaySlot(slotsById.get(id));\n };\n googletag.enableServices = noopFunc;\n googletag.getVersion = noopStr;\n googletag.pubads = function () {\n return pubAdsService;\n };\n googletag.pubadsReady = true;\n googletag.setAdIframeTitle = noopFunc;\n googletag.sizeMapping = function () {\n return new SizeMappingBuilder();\n };\n window.googletag = googletag;\n while (cmd.length !== 0) {\n googletag.cmd.push(cmd.shift());\n }\n hit(source);\n }\n GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js'];\n GoogleTagServicesGpt.injections = [hit, noopFunc, noopThis, noopNull, noopArray, noopStr, trueFunc];\n\n /**\n * @redirect scorecardresearch-beacon\n * @description\n * Mocks Scorecard Research API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/scorecardresearch_beacon.js\n *\n * **Example**\n * ```\n * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon\n * ```\n */\n function ScoreCardResearchBeacon(source) {\n window.COMSCORE = {\n purge() {\n // eslint-disable-next-line no-underscore-dangle\n window._comscore = [];\n },\n beacon() {}\n };\n hit(source);\n }\n ScoreCardResearchBeacon.names = ['scorecardresearch-beacon', 'ubo-scorecardresearch_beacon.js', 'scorecardresearch_beacon.js'];\n ScoreCardResearchBeacon.injections = [hit];\n\n /**\n * @redirect metrika-yandex-tag\n * @description\n * Mocks Yandex Metrika API.\n * https://yandex.ru/support/metrica/objects/method-reference.html\n *\n * **Example**\n * ```\n * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag\n * ```\n */\n function metrikaYandexTag(source) {\n const asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let callback = options.callback;\n const ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/addfileextension.html\n */\n const addFileExtension = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/extlink.html\n */\n const extLink = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/file.html\n */\n const file = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/get-client-id.html\n *\n * @param {string} id\n * @param {Function} cb\n */\n const getClientID = function getClientID(id, cb) {\n if (!cb) {\n return;\n }\n setTimeout(cb(null));\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/hit.html\n */\n const hitFunc = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/notbounce.html\n */\n const notBounce = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/params-method.html\n */\n const params = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/reachgoal.html\n *\n * @param {string} id\n * @param {string} target\n * @param {Object} params\n * @param {Function} callback\n * @param {any} ctx\n */\n const reachGoal = function reachGoal(id, target, params, callback, ctx) {\n asyncCallbackFromOptions(null, null, {\n callback,\n ctx\n });\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/set-user-id.html\n */\n const setUserID = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/user-params.html\n */\n const userParams = noopFunc;\n\n // https://github.com/AdguardTeam/Scriptlets/issues/198\n const destruct = noopFunc;\n const api = {\n addFileExtension,\n extLink,\n file,\n getClientID,\n hit: hitFunc,\n notBounce,\n params,\n reachGoal,\n setUserID,\n userParams,\n destruct\n };\n function ym(id, funcName) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return api[funcName] && api[funcName](id, ...args);\n }\n function init(id) {\n // yaCounter object should provide api\n window[\"yaCounter\".concat(id)] = api;\n document.dispatchEvent(new Event(\"yacounter\".concat(id, \"inited\")));\n }\n if (typeof window.ym === 'undefined') {\n window.ym = ym;\n ym.a = [];\n } else if (window.ym && window.ym.a) {\n // Keep initial counters array intact\n ym.a = window.ym.a;\n window.ym = ym;\n window.ym.a.forEach(function (params) {\n const id = params[0];\n init(id);\n });\n }\n hit(source);\n }\n metrikaYandexTag.names = ['metrika-yandex-tag'];\n metrikaYandexTag.injections = [hit, noopFunc];\n\n /**\n * @redirect metrika-yandex-watch\n * @description\n * Mocks the old Yandex Metrika API.\n * https://yandex.ru/support/metrica/objects/_method-reference.html\n *\n * **Example**\n * ```\n * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch\n * ```\n */\n function metrikaYandexWatch(source) {\n const cbName = 'yandex_metrika_callbacks';\n\n /**\n * Gets callback and its context from options and call it in async way\n *\n * @param {Object} options Yandex Metrika API options\n */\n const asyncCallbackFromOptions = function asyncCallbackFromOptions() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = options.callback;\n const ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n function Metrika() {} // constructor\n Metrika.counters = noopArray;\n // Methods without options\n Metrika.prototype.addFileExtension = noopFunc;\n Metrika.prototype.getClientID = noopFunc;\n Metrika.prototype.setUserID = noopFunc;\n Metrika.prototype.userParams = noopFunc;\n Metrika.prototype.params = noopFunc;\n Metrika.prototype.counters = noopArray;\n\n // Methods with options\n // The order of arguments should be kept in according to API\n Metrika.prototype.extLink = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.file = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.hit = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.reachGoal = function (target, params, cb, ctx) {\n asyncCallbackFromOptions({\n callback: cb,\n ctx\n });\n };\n Metrika.prototype.notBounce = asyncCallbackFromOptions;\n if (window.Ya) {\n window.Ya.Metrika = Metrika;\n } else {\n window.Ya = {\n Metrika\n };\n }\n if (window[cbName] && Array.isArray(window[cbName])) {\n window[cbName].forEach(function (func) {\n if (typeof func === 'function') {\n func();\n }\n });\n }\n hit(source);\n }\n metrikaYandexWatch.names = ['metrika-yandex-watch'];\n metrikaYandexWatch.injections = [hit, noopFunc, noopArray];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect pardot-1.0\n * @description\n * Mocks the pd.js file of Salesforce.\n * https://pi.pardot.com/pd.js\n * https://developer.salesforce.com/docs/marketing/pardot/overview\n *\n * **Example**\n * ```\n * ||pi.pardot.com/pd.js$script,redirect=pardot\n * ||pacedg.com.au/pd.js$redirect=pardot\n * ```\n */\n\n function Pardot(source) {\n window.piVersion = '1.0.2';\n window.piScriptNum = 0;\n window.piScriptObj = [];\n window.checkNamespace = noopFunc;\n window.getPardotUrl = noopStr;\n window.piGetParameter = noopNull;\n window.piSetCookie = noopFunc;\n window.piGetCookie = noopStr;\n function piTracker() {\n window.pi = {\n tracker: {\n visitor_id: '',\n visitor_id_sign: '',\n pi_opt_in: '',\n campaign_id: ''\n }\n };\n window.piScriptNum += 1;\n }\n window.piResponse = noopFunc;\n window.piTracker = piTracker;\n piTracker();\n hit(source);\n }\n Pardot.names = ['pardot-1.0'];\n Pardot.injections = [hit, noopFunc, noopStr, noopNull];\n\n /**\n * @redirect prevent-bab\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Mostly it is used as `scriptlet`.\n * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab).\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/nobab.js\n *\n * **Example**\n * ```\n * /blockadblock.$script,redirect=prevent-bab\n * ```\n */\n const preventBab$1 = preventBab$2;\n preventBab$1.names = ['prevent-bab',\n // list of prevent-bab redirect aliases\n 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser'];\n\n /**\n * @redirect amazon-apstag\n * @description\n * Mocks Amazon's apstag.js\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/f842ab6d3c1cf0394f95d27092bf59627262da40/src/web_accessible_resources/amazon_apstag.js\n *\n * **Example**\n * ```\n * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag\n * ```\n */\n function AmazonApstag(source) {\n const apstagWrapper = {\n fetchBids(a, b) {\n if (typeof b === 'function') {\n b([]);\n }\n },\n init: noopFunc,\n setDisplayBids: noopFunc,\n targetingKeys: noopFunc\n };\n window.apstag = apstagWrapper;\n hit(source);\n }\n AmazonApstag.names = ['amazon-apstag', 'ubo-amazon_apstag.js', 'amazon_apstag.js'];\n AmazonApstag.injections = [hit, noopFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect matomo\n * @description\n * Mocks the piwik.js file of Matomo (formerly Piwik).\n *\n * **Example**\n * ```\n * ||example.org/piwik.js$script,redirect=matomo\n * ```\n */\n\n function Matomo(source) {\n const Tracker = function Tracker() {};\n Tracker.prototype.setDoNotTrack = noopFunc;\n Tracker.prototype.setDomains = noopFunc;\n Tracker.prototype.setCustomDimension = noopFunc;\n Tracker.prototype.trackPageView = noopFunc;\n const AsyncTracker = function AsyncTracker() {};\n AsyncTracker.prototype.addListener = noopFunc;\n const matomoWrapper = {\n getTracker: Tracker,\n getAsyncTracker: AsyncTracker\n };\n window.Piwik = matomoWrapper;\n hit(source);\n }\n Matomo.names = ['matomo'];\n Matomo.injections = [hit, noopFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect fingerprintjs2\n * @description\n * Mocks FingerprintJS v2\n * https://github.com/fingerprintjs\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint2.js\n *\n * **Example**\n * ```\n * ||the-japan-news.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2\n * ```\n */\n function Fingerprintjs2(source) {\n let browserId = '';\n for (let i = 0; i < 8; i += 1) {\n browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n const Fingerprint2 = function Fingerprint2() {};\n Fingerprint2.get = function (options, callback) {\n if (!callback) {\n callback = options;\n }\n setTimeout(function () {\n if (callback) {\n callback(browserId, []);\n }\n }, 1);\n };\n Fingerprint2.prototype = {\n get: Fingerprint2.get\n };\n window.Fingerprint2 = Fingerprint2;\n hit(source);\n }\n Fingerprintjs2.names = ['fingerprintjs2',\n // redirect aliases are needed for conversion:\n // prefixed for us\n 'ubo-fingerprint2.js',\n // original ubo name\n 'fingerprint2.js'];\n Fingerprintjs2.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect fingerprintjs3\n * @description\n * Mocks FingerprintJS v3\n * https://github.com/fingerprintjs\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint3.js\n *\n * **Example**\n * ```\n * ||sephora.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3\n * ```\n */\n function Fingerprintjs3(source) {\n const visitorId = function () {\n let id = '';\n for (let i = 0; i < 8; i += 1) {\n id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n return id;\n }();\n const FingerprintJS = function FingerprintJS() {};\n FingerprintJS.prototype = {\n load() {\n return Promise.resolve(new FingerprintJS());\n },\n get() {\n return Promise.resolve({\n visitorId\n });\n },\n hashComponents: noopStr\n };\n window.FingerprintJS = new FingerprintJS();\n hit(source);\n }\n Fingerprintjs3.names = ['fingerprintjs3',\n // redirect aliases are needed for conversion:\n // prefixed for us\n 'ubo-fingerprint3.js',\n // original ubo name\n 'fingerprint3.js'];\n Fingerprintjs3.injections = [hit, noopStr];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect gemius\n * @description\n * Mocks Gemius Analytics.\n * https://flowplayer.com/developers/plugins/gemius\n *\n * **Example**\n * ```\n * ||gapt.hit.gemius.pl/gplayer.js$script,redirect=gemius\n * ```\n */\n function Gemius(source) {\n const GemiusPlayer = function GemiusPlayer() {};\n GemiusPlayer.prototype = {\n setVideoObject: noopFunc,\n newProgram: noopFunc,\n programEvent: noopFunc,\n newAd: noopFunc,\n adEvent: noopFunc\n };\n window.GemiusPlayer = GemiusPlayer;\n hit(source);\n }\n Gemius.names = ['gemius'];\n Gemius.injections = [hit, noopFunc];\n\n /**\n * @redirect ati-smarttag\n * @description\n * Mocks AT Internat SmartTag.\n * https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/\n *\n * **Example**\n * ```\n * ||bloctel.gouv.fr/assets/scripts/smarttag.js$script,redirect=ati-smarttag\n * ```\n */\n function ATInternetSmartTag(source) {\n const setNoopFuncWrapper = {\n set: noopFunc\n };\n const sendNoopFuncWrapper = {\n send: noopFunc\n };\n const ecommerceWrapper = {\n displayCart: {\n products: setNoopFuncWrapper,\n cart: setNoopFuncWrapper\n },\n updateCart: {\n cart: setNoopFuncWrapper\n },\n displayProduct: {\n products: setNoopFuncWrapper\n },\n displayPageProduct: {\n products: setNoopFuncWrapper\n },\n addProduct: {\n products: setNoopFuncWrapper\n },\n removeProduct: {\n products: setNoopFuncWrapper\n }\n };\n\n // eslint-disable-next-line new-cap, func-names\n const tag = function tag() {};\n tag.prototype = {\n setConfig: noopFunc,\n setParam: noopFunc,\n dispatch: noopFunc,\n customVars: setNoopFuncWrapper,\n publisher: setNoopFuncWrapper,\n order: setNoopFuncWrapper,\n click: sendNoopFuncWrapper,\n clickListener: sendNoopFuncWrapper,\n internalSearch: {\n set: noopFunc,\n send: noopFunc\n },\n ecommerce: ecommerceWrapper,\n identifiedVisitor: {\n unset: noopFunc\n },\n page: {\n set: noopFunc,\n send: noopFunc\n },\n selfPromotion: {\n add: noopFunc,\n send: noopFunc\n },\n privacy: {\n setVisitorMode: noopFunc,\n getVisitorMode: noopFunc,\n hit: noopFunc\n },\n richMedia: {\n add: noopFunc,\n send: noopFunc,\n remove: noopFunc,\n removeAll: noopFunc\n }\n };\n const smartTagWrapper = {\n Tracker: {\n Tag: tag\n }\n };\n window.ATInternet = smartTagWrapper;\n hit(source);\n }\n ATInternetSmartTag.names = ['ati-smarttag'];\n ATInternetSmartTag.injections = [hit, noopFunc];\n\n /* eslint-disable consistent-return, no-eval */\n\n /**\n * @redirect prevent-bab2\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Related UBO redirect:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab2.js\n *\n * See [redirect description](../wiki/about-redirects.md#prevent-bab2).\n *\n * **Syntax**\n * ```\n * /blockadblock.$script,redirect=prevent-bab2\n * ```\n */\n function preventBab2(source) {\n const script = document.currentScript;\n if (script === null) {\n return;\n }\n const url = script.src;\n if (typeof url !== 'string') {\n return;\n }\n const domainsStr = ['adclixx\\\\.net', 'adnetasia\\\\.com', 'adtrackers\\\\.net', 'bannertrack\\\\.net'].join('|');\n const matchStr = \"^https?://[\\\\w-]+\\\\.(\".concat(domainsStr, \")/.\");\n const domainsRegex = new RegExp(matchStr);\n if (domainsRegex.test(url) === false) {\n return;\n }\n window.nH7eXzOsG = 858;\n hit(source);\n }\n preventBab2.names = ['prevent-bab2',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nobab2.js'];\n preventBab2.injections = [hit];\n\n /* eslint-disable func-names, no-underscore-dangle */\n\n /**\n * @redirect google-ima3\n * @description\n * Mocks the IMA SDK of Google.\n *\n * **Example**\n * ```\n * ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima3\n * ```\n */\n\n function GoogleIma3(source) {\n const VERSION = '3.453.0';\n const ima = {};\n const AdDisplayContainer = function AdDisplayContainer() {};\n AdDisplayContainer.prototype.destroy = noopFunc;\n AdDisplayContainer.prototype.initialize = noopFunc;\n const ImaSdkSettings = function ImaSdkSettings() {};\n ImaSdkSettings.CompanionBackfillMode = {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n };\n ImaSdkSettings.VpaidMode = {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n };\n ImaSdkSettings.prototype = {\n c: true,\n f: {},\n i: false,\n l: '',\n p: '',\n r: 0,\n t: '',\n v: '',\n getCompanionBackfill: noopFunc,\n getDisableCustomPlaybackForIOS10Plus() {\n return this.i;\n },\n getDisabledFlashAds: function getDisabledFlashAds() {\n return true;\n },\n getFeatureFlags() {\n return this.f;\n },\n getLocale() {\n return this.l;\n },\n getNumRedirects() {\n return this.r;\n },\n getPlayerType() {\n return this.t;\n },\n getPlayerVersion() {\n return this.v;\n },\n getPpid() {\n return this.p;\n },\n getVpaidMode() {\n return this.C;\n },\n isCookiesEnabled() {\n return this.c;\n },\n isVpaidAdapter() {\n return this.M;\n },\n setCompanionBackfill: noopFunc,\n setAutoPlayAdBreaks(a) {\n this.K = a;\n },\n setCookiesEnabled(c) {\n this.c = !!c;\n },\n setDisableCustomPlaybackForIOS10Plus(i) {\n this.i = !!i;\n },\n setDisableFlashAds: noopFunc,\n setFeatureFlags(f) {\n this.f = !!f;\n },\n setIsVpaidAdapter(a) {\n this.M = a;\n },\n setLocale(l) {\n this.l = !!l;\n },\n setNumRedirects(r) {\n this.r = !!r;\n },\n setPageCorrelator(a) {\n this.R = a;\n },\n setPlayerType(t) {\n this.t = !!t;\n },\n setPlayerVersion(v) {\n this.v = !!v;\n },\n setPpid(p) {\n this.p = !!p;\n },\n setVpaidMode(a) {\n this.C = a;\n },\n setSessionId: noopFunc,\n setStreamCorrelator: noopFunc,\n setVpaidAllowed: noopFunc,\n CompanionBackfillMode: {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n },\n VpaidMode: {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n }\n };\n const EventHandler = function EventHandler() {\n this.listeners = new Map();\n this._dispatch = function (e) {\n const listeners = this.listeners.get(e.type) || [];\n // eslint-disable-next-line no-restricted-syntax\n for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) {\n const listener = _Array$from[_i];\n try {\n listener(e);\n } catch (r) {\n logMessage(source, r);\n }\n }\n };\n this.addEventListener = function (t, c) {\n if (!this.listeners.has(t)) {\n this.listeners.set(t, new Set());\n }\n this.listeners.get(t).add(c);\n };\n this.removeEventListener = function (t, c) {\n var _this$listeners$get;\n (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c);\n };\n };\n const AdsManager = new EventHandler();\n /* eslint-disable no-use-before-define */\n AdsManager.volume = 1;\n AdsManager.collapse = noopFunc;\n AdsManager.configureAdsManager = noopFunc;\n AdsManager.destroy = noopFunc;\n AdsManager.discardAdBreak = noopFunc;\n AdsManager.expand = noopFunc;\n AdsManager.focus = noopFunc;\n AdsManager.getAdSkippableState = function () {\n return false;\n };\n AdsManager.getCuePoints = function () {\n return [0];\n };\n AdsManager.getCurrentAd = function () {\n return currentAd;\n };\n AdsManager.getCurrentAdCuePoints = function () {\n return [];\n };\n AdsManager.getRemainingTime = function () {\n return 0;\n };\n AdsManager.getVolume = function () {\n return this.volume;\n };\n AdsManager.init = noopFunc;\n AdsManager.isCustomClickTrackingUsed = function () {\n return false;\n };\n AdsManager.isCustomPlaybackUsed = function () {\n return false;\n };\n AdsManager.pause = noopFunc;\n AdsManager.requestNextAdBreak = noopFunc;\n AdsManager.resize = noopFunc;\n AdsManager.resume = noopFunc;\n AdsManager.setVolume = function (v) {\n this.volume = v;\n };\n AdsManager.skip = noopFunc;\n AdsManager.start = function () {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) {\n const type = _arr[_i2];\n try {\n this._dispatch(new ima.AdEvent(type));\n } catch (e) {\n logMessage(source, e);\n }\n }\n };\n AdsManager.stop = noopFunc;\n AdsManager.updateAdsRenderingSettings = noopFunc;\n /* eslint-enable no-use-before-define */\n\n const manager = Object.create(AdsManager);\n const AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) {\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n };\n AdsManagerLoadedEvent.prototype = {\n getAdsManager: function getAdsManager() {\n return manager;\n },\n getUserRequestContext() {\n if (this.userRequestContext) {\n return this.userRequestContext;\n }\n return {};\n }\n };\n AdsManagerLoadedEvent.Type = {\n ADS_MANAGER_LOADED: 'adsManagerLoaded'\n };\n const AdsLoader = EventHandler;\n AdsLoader.prototype.settings = new ImaSdkSettings();\n AdsLoader.prototype.contentComplete = noopFunc;\n AdsLoader.prototype.destroy = noopFunc;\n AdsLoader.prototype.getSettings = function () {\n return this.settings;\n };\n AdsLoader.prototype.getVersion = function () {\n return VERSION;\n };\n AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) {\n var _this = this;\n requestAnimationFrame(function () {\n const ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED;\n const event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext);\n _this._dispatch(event);\n });\n const e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext);\n requestAnimationFrame(function () {\n _this._dispatch(new ima.AdErrorEvent(e));\n });\n };\n const AdsRenderingSettings = noopFunc;\n const AdsRequest = function AdsRequest() {};\n AdsRequest.prototype = {\n setAdWillAutoPlay: noopFunc,\n setAdWillPlayMuted: noopFunc,\n setContinuousPlayback: noopFunc\n };\n const AdPodInfo = function AdPodInfo() {};\n AdPodInfo.prototype = {\n getAdPosition: function getAdPosition() {\n return 1;\n },\n getIsBumper: function getIsBumper() {\n return false;\n },\n getMaxDuration: function getMaxDuration() {\n return -1;\n },\n getPodIndex: function getPodIndex() {\n return 1;\n },\n getTimeOffset: function getTimeOffset() {\n return 0;\n },\n getTotalAds: function getTotalAds() {\n return 1;\n }\n };\n const Ad = function Ad() {};\n Ad.prototype = {\n pi: new AdPodInfo(),\n getAdId: function getAdId() {\n return '';\n },\n getAdPodInfo() {\n return this.pi;\n },\n getAdSystem: function getAdSystem() {\n return '';\n },\n getAdvertiserName: function getAdvertiserName() {\n return '';\n },\n getApiFramework: function getApiFramework() {\n return null;\n },\n getCompanionAds: function getCompanionAds() {\n return [];\n },\n getContentType: function getContentType() {\n return '';\n },\n getCreativeAdId: function getCreativeAdId() {\n return '';\n },\n getDealId: function getDealId() {\n return '';\n },\n getDescription: function getDescription() {\n return '';\n },\n getDuration: function getDuration() {\n return 8.5;\n },\n getHeight: function getHeight() {\n return 0;\n },\n getMediaUrl: function getMediaUrl() {\n return null;\n },\n getMinSuggestedDuration: function getMinSuggestedDuration() {\n return -2;\n },\n getSkipTimeOffset: function getSkipTimeOffset() {\n return -1;\n },\n getSurveyUrl: function getSurveyUrl() {\n return null;\n },\n getTitle: function getTitle() {\n return '';\n },\n getTraffickingParametersString: function getTraffickingParametersString() {\n return '';\n },\n getUiElements: function getUiElements() {\n return [''];\n },\n getUniversalAdIdRegistry: function getUniversalAdIdRegistry() {\n return 'unknown';\n },\n getUniversalAdIds: function getUniversalAdIds() {\n return [''];\n },\n getUniversalAdIdValue: function getUniversalAdIdValue() {\n return 'unknown';\n },\n getVastMediaBitrate: function getVastMediaBitrate() {\n return 0;\n },\n getVastMediaHeight: function getVastMediaHeight() {\n return 0;\n },\n getVastMediaWidth: function getVastMediaWidth() {\n return 0;\n },\n getWidth: function getWidth() {\n return 0;\n },\n getWrapperAdIds: function getWrapperAdIds() {\n return [''];\n },\n getWrapperAdSystems: function getWrapperAdSystems() {\n return [''];\n },\n getWrapperCreativeIds: function getWrapperCreativeIds() {\n return [''];\n },\n isLinear: function isLinear() {\n return true;\n },\n isSkippable() {\n return true;\n }\n };\n const CompanionAd = function CompanionAd() {};\n CompanionAd.prototype = {\n getAdSlotId: function getAdSlotId() {\n return '';\n },\n getContent: function getContent() {\n return '';\n },\n getContentType: function getContentType() {\n return '';\n },\n getHeight: function getHeight() {\n return 1;\n },\n getWidth: function getWidth() {\n return 1;\n }\n };\n const AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) {\n this.errorCode = code;\n this.message = message;\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n this.getErrorCode = function () {\n return this.errorCode;\n };\n this.getInnerError = function () {};\n this.getMessage = function () {\n return this.message;\n };\n this.getType = function () {\n return this.type;\n };\n this.getVastErrorCode = function () {\n return this.vastErrorCode;\n };\n this.toString = function () {\n return \"AdError \".concat(this.errorCode, \": \").concat(this.message);\n };\n };\n AdError.ErrorCode = {};\n AdError.Type = {};\n const isEngadget = function isEngadget() {\n try {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) {\n var _ctx$getPlayer, _ctx$getPlayer$div;\n const ctx = _Object$values[_i3];\n // eslint-disable-next-line no-restricted-properties\n if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) {\n return true;\n }\n }\n } catch (e) {} // eslint-disable-line no-empty\n return false;\n };\n const currentAd = isEngadget() ? undefined : new Ad();\n const AdEvent = function AdEvent(type) {\n this.type = type;\n };\n AdEvent.prototype = {\n getAd: function getAd() {\n return currentAd;\n },\n getAdData: function getAdData() {}\n };\n AdEvent.Type = {\n AD_BREAK_READY: 'adBreakReady',\n AD_BUFFERING: 'adBuffering',\n AD_CAN_PLAY: 'adCanPlay',\n AD_METADATA: 'adMetadata',\n AD_PROGRESS: 'adProgress',\n ALL_ADS_COMPLETED: 'allAdsCompleted',\n CLICK: 'click',\n COMPLETE: 'complete',\n CONTENT_PAUSE_REQUESTED: 'contentPauseRequested',\n CONTENT_RESUME_REQUESTED: 'contentResumeRequested',\n DURATION_CHANGE: 'durationChange',\n EXPANDED_CHANGED: 'expandedChanged',\n FIRST_QUARTILE: 'firstQuartile',\n IMPRESSION: 'impression',\n INTERACTION: 'interaction',\n LINEAR_CHANGE: 'linearChange',\n LINEAR_CHANGED: 'linearChanged',\n LOADED: 'loaded',\n LOG: 'log',\n MIDPOINT: 'midpoint',\n PAUSED: 'pause',\n RESUMED: 'resume',\n SKIPPABLE_STATE_CHANGED: 'skippableStateChanged',\n SKIPPED: 'skip',\n STARTED: 'start',\n THIRD_QUARTILE: 'thirdQuartile',\n USER_CLOSE: 'userClose',\n VIDEO_CLICKED: 'videoClicked',\n VIDEO_ICON_CLICKED: 'videoIconClicked',\n VIEWABLE_IMPRESSION: 'viewable_impression',\n VOLUME_CHANGED: 'volumeChange',\n VOLUME_MUTED: 'mute'\n };\n const AdErrorEvent = function AdErrorEvent(error) {\n this.error = error;\n this.type = 'adError';\n this.getError = function () {\n return this.error;\n };\n this.getUserRequestContext = function () {\n var _this$error;\n if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) {\n return this.error.userRequestContext;\n }\n return {};\n };\n };\n AdErrorEvent.Type = {\n AD_ERROR: 'adError'\n };\n const CustomContentLoadedEvent = function CustomContentLoadedEvent() {};\n CustomContentLoadedEvent.Type = {\n CUSTOM_CONTENT_LOADED: 'deprecated-event'\n };\n const CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {};\n CompanionAdSelectionSettings.CreativeType = {\n ALL: 'All',\n FLASH: 'Flash',\n IMAGE: 'Image'\n };\n CompanionAdSelectionSettings.ResourceType = {\n ALL: 'All',\n HTML: 'Html',\n IFRAME: 'IFrame',\n STATIC: 'Static'\n };\n CompanionAdSelectionSettings.SizeCriteria = {\n IGNORE: 'IgnoreSize',\n SELECT_EXACT_MATCH: 'SelectExactMatch',\n SELECT_NEAR_MATCH: 'SelectNearMatch'\n };\n const AdCuePoints = function AdCuePoints() {};\n AdCuePoints.prototype = {\n getCuePoints: function getCuePoints() {\n return [];\n },\n getAdIdRegistry: function getAdIdRegistry() {\n return '';\n },\n getAdIsValue: function getAdIsValue() {\n return '';\n }\n };\n const AdProgressData = noopFunc;\n const UniversalAdIdInfo = function UniversalAdIdInfo() {};\n Object.assign(ima, {\n AdCuePoints,\n AdDisplayContainer,\n AdError,\n AdErrorEvent,\n AdEvent,\n AdPodInfo,\n AdProgressData,\n AdsLoader,\n AdsManager: manager,\n AdsManagerLoadedEvent,\n AdsRenderingSettings,\n AdsRequest,\n CompanionAd,\n CompanionAdSelectionSettings,\n CustomContentLoadedEvent,\n gptProxyInstance: {},\n ImaSdkSettings,\n OmidAccessMode: {\n DOMAIN: 'domain',\n FULL: 'full',\n LIMITED: 'limited'\n },\n settings: new ImaSdkSettings(),\n UiElements: {\n AD_ATTRIBUTION: 'adAttribution',\n COUNTDOWN: 'countdown'\n },\n UniversalAdIdInfo,\n VERSION,\n ViewMode: {\n FULLSCREEN: 'fullscreen',\n NORMAL: 'normal'\n }\n });\n if (!window.google) {\n window.google = {};\n }\n window.google.ima = ima;\n hit(source);\n }\n GoogleIma3.names = ['google-ima3',\n // prefixed name\n 'ubo-google-ima.js',\n // original ubo name\n 'google-ima.js'];\n GoogleIma3.injections = [hit, noopFunc, logMessage];\n\n /* eslint-disable func-names, no-underscore-dangle */\n\n /**\n * @redirect didomi-loader\n * @description\n * Mocks Didomi's CMP loader script.\n * https://developers.didomi.io/\n *\n * **Example**\n * ```\n * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader\n * ```\n */\n function DidomiLoader(source) {\n function UserConsentStatusForVendorSubscribe() {}\n UserConsentStatusForVendorSubscribe.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc;\n function UserConsentStatusForVendor() {}\n UserConsentStatusForVendor.prototype.first = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.subscribe = noopFunc;\n const DidomiWrapper = {\n isConsentRequired: falseFunc,\n getUserConsentStatusForPurpose: trueFunc,\n getUserConsentStatus: trueFunc,\n getUserStatus: noopFunc,\n getRequiredPurposes: noopArray,\n getUserConsentStatusForVendor: trueFunc,\n Purposes: {\n Cookies: 'cookies'\n },\n notice: {\n configure: noopFunc,\n hide: noopFunc,\n isVisible: falseFunc,\n show: noopFunc,\n showDataProcessing: trueFunc\n },\n isUserConsentStatusPartial: falseFunc,\n on() {\n return {\n actions: {},\n emitter: {},\n services: {},\n store: {}\n };\n },\n shouldConsentBeCollected: falseFunc,\n getUserConsentStatusForAll: noopFunc,\n getObservableOnUserConsentStatusForVendor() {\n return new UserConsentStatusForVendor();\n }\n };\n window.Didomi = DidomiWrapper;\n const didomiStateWrapper = {\n didomiExperimentId: '',\n didomiExperimentUserGroup: '',\n didomiGDPRApplies: 1,\n didomiIABConsent: '',\n didomiPurposesConsent: '',\n didomiPurposesConsentDenied: '',\n didomiPurposesConsentUnknown: '',\n didomiVendorsConsent: '',\n didomiVendorsConsentDenied: '',\n didomiVendorsConsentUnknown: '',\n didomiVendorsRawConsent: '',\n didomiVendorsRawConsentDenied: '',\n didomiVendorsRawConsentUnknown: ''\n };\n window.didomiState = didomiStateWrapper;\n const tcData = {\n eventStatus: 'tcloaded',\n gdprApplies: false,\n listenerId: noopFunc,\n vendor: {\n consents: []\n },\n purpose: {\n consents: []\n }\n };\n\n // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api\n const __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) {\n if (typeof callback !== 'function' || command === 'removeEventListener') {\n return;\n }\n callback(tcData, true);\n };\n window.__tcfapi = __tcfapiWrapper;\n const didomiEventListenersWrapper = {\n stub: true,\n push: noopFunc\n };\n window.didomiEventListeners = didomiEventListenersWrapper;\n const didomiOnReadyWrapper = {\n stub: true,\n push(arg) {\n if (typeof arg !== 'function') {\n return;\n }\n if (document.readyState !== 'complete') {\n window.addEventListener('load', function () {\n setTimeout(arg(window.Didomi));\n });\n } else {\n setTimeout(arg(window.Didomi));\n }\n }\n };\n window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper;\n if (Array.isArray(window.didomiOnReady)) {\n window.didomiOnReady.forEach(function (arg) {\n if (typeof arg === 'function') {\n try {\n setTimeout(arg(window.Didomi));\n } catch (e) {\n /* empty */\n }\n }\n });\n }\n hit(source);\n }\n DidomiLoader.names = ['didomi-loader'];\n DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect prebid\n * @description\n * Mocks the prebid.js header bidding suit.\n * https://docs.prebid.org/\n *\n * **Example**\n * ```\n * ||tmgrup.com.tr/bd/hb/prebid.js$script,redirect=prebid\n * ```\n */\n\n function Prebid(source) {\n const pushFunction = function pushFunction(arg) {\n if (typeof arg === 'function') {\n try {\n arg.call();\n } catch (ex) {\n /* empty */\n }\n }\n };\n const pbjsWrapper = {\n addAdUnits() {},\n adServers: {\n dfp: {\n // https://docs.prebid.org/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html\n // returns ad URL\n buildVideoUrl: noopStr\n }\n },\n adUnits: [],\n aliasBidder() {},\n cmd: [],\n enableAnalytics() {},\n getHighestCpmBids: noopArray,\n libLoaded: true,\n que: [],\n requestBids(arg) {\n if (arg instanceof Object && arg.bidsBackHandler) {\n try {\n arg.bidsBackHandler.call(); // https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html\n } catch (ex) {\n /* empty */\n }\n }\n },\n removeAdUnit() {},\n setBidderConfig() {},\n setConfig() {},\n setTargetingForGPTAsync() {}\n };\n pbjsWrapper.cmd.push = pushFunction;\n pbjsWrapper.que.push = pushFunction;\n window.pbjs = pbjsWrapper;\n hit(source);\n }\n Prebid.names = ['prebid'];\n Prebid.injections = [hit, noopFunc, noopStr, noopArray];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect prebid-ads\n * @description\n * Sets predefined constants on a page:\n * - `canRunAds`: `true`\n * - `isAdBlockActive`: `false`\n *\n * **Example**\n * ```\n * ||playerdrive.me/assets/js/prebid-ads.js$script,redirect=prebid-ads\n * ```\n */\n function prebidAds(source) {\n window.canRunAds = true;\n window.isAdBlockActive = false;\n hit(source);\n }\n prebidAds.names = ['prebid-ads', 'ubo-prebid-ads.js', 'prebid-ads.js'];\n prebidAds.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect naver-wcslog\n * @description\n * Mocks wcslog.js of Naver Analytics.\n *\n * **Example**\n * ```\n * ||wcs.naver.net/wcslog.js$script,redirect=naver-wcslog\n * ```\n */\n\n function NaverWcslog(source) {\n window.wcs_add = {};\n window.wcs_do = noopFunc;\n window.wcs = {\n inflow: noopFunc\n };\n hit(source);\n }\n NaverWcslog.names = ['naver-wcslog'];\n NaverWcslog.injections = [hit, noopFunc];\n\n var redirectsList = /*#__PURE__*/Object.freeze({\n __proto__: null,\n noeval: noeval$1,\n GoogleAnalytics: GoogleAnalytics,\n GoogleAnalyticsGa: GoogleAnalyticsGa,\n GoogleSyndicationAdsByGoogle: GoogleSyndicationAdsByGoogle,\n GoogleTagServicesGpt: GoogleTagServicesGpt,\n ScoreCardResearchBeacon: ScoreCardResearchBeacon,\n metrikaYandexTag: metrikaYandexTag,\n metrikaYandexWatch: metrikaYandexWatch,\n Pardot: Pardot,\n preventFab: preventFab$1,\n preventBab: preventBab$1,\n setPopadsDummy: setPopadsDummy$1,\n preventPopadsNet: preventPopadsNet$1,\n AmazonApstag: AmazonApstag,\n Matomo: Matomo,\n Fingerprintjs2: Fingerprintjs2,\n Fingerprintjs3: Fingerprintjs3,\n Gemius: Gemius,\n ATInternetSmartTag: ATInternetSmartTag,\n preventBab2: preventBab2,\n GoogleIma3: GoogleIma3,\n DidomiLoader: DidomiLoader,\n Prebid: Prebid,\n prebidAds: prebidAds,\n NaverWcslog: NaverWcslog\n });\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n var defineProperty = _defineProperty;\n\n function isNothing(subject) {\n return typeof subject === 'undefined' || subject === null;\n }\n function isObject(subject) {\n return typeof subject === 'object' && subject !== null;\n }\n function toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return [];\n return [sequence];\n }\n function extend(target, source) {\n var index, length, key, sourceKeys;\n if (source) {\n sourceKeys = Object.keys(source);\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n return target;\n }\n function repeat(string, count) {\n var result = '',\n cycle;\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n return result;\n }\n function isNegativeZero(number) {\n return number === 0 && Number.NEGATIVE_INFINITY === 1 / number;\n }\n var isNothing_1 = isNothing;\n var isObject_1 = isObject;\n var toArray_1 = toArray;\n var repeat_1 = repeat;\n var isNegativeZero_1 = isNegativeZero;\n var extend_1 = extend;\n var common = {\n isNothing: isNothing_1,\n isObject: isObject_1,\n toArray: toArray_1,\n repeat: repeat_1,\n isNegativeZero: isNegativeZero_1,\n extend: extend_1\n };\n\n // YAML error class. http://stackoverflow.com/questions/8458984\n\n function YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = new Error().stack || '';\n }\n }\n\n // Inherit from Error\n YAMLException$1.prototype = Object.create(Error.prototype);\n YAMLException$1.prototype.constructor = YAMLException$1;\n YAMLException$1.prototype.toString = function toString(compact) {\n var result = this.name + ': ';\n result += this.reason || '(unknown reason)';\n if (!compact && this.mark) {\n result += ' ' + this.mark.toString();\n }\n return result;\n };\n var exception = YAMLException$1;\n\n function Mark(name, buffer, position, line, column) {\n this.name = name;\n this.buffer = buffer;\n this.position = position;\n this.line = line;\n this.column = column;\n }\n Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {\n var head, start, tail, end, snippet;\n if (!this.buffer) return null;\n indent = indent || 4;\n maxLength = maxLength || 75;\n head = '';\n start = this.position;\n while (start > 0 && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(start - 1)) === -1) {\n start -= 1;\n if (this.position - start > maxLength / 2 - 1) {\n head = ' ... ';\n start += 5;\n break;\n }\n }\n tail = '';\n end = this.position;\n while (end < this.buffer.length && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(end)) === -1) {\n end += 1;\n if (end - this.position > maxLength / 2 - 1) {\n tail = ' ... ';\n end -= 5;\n break;\n }\n }\n snippet = this.buffer.slice(start, end);\n return common.repeat(' ', indent) + head + snippet + tail + '\\n' + common.repeat(' ', indent + this.position - start + head.length) + '^';\n };\n Mark.prototype.toString = function toString(compact) {\n var snippet,\n where = '';\n if (this.name) {\n where += 'in \"' + this.name + '\" ';\n }\n where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);\n if (!compact) {\n snippet = this.getSnippet();\n if (snippet) {\n where += ':\\n' + snippet;\n }\n }\n return where;\n };\n var mark = Mark;\n\n var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases'];\n var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping'];\n function compileStyleAliases(map) {\n var result = {};\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n return result;\n }\n function Type$1(tag, options) {\n options = options || {};\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () {\n return true;\n };\n this.construct = options['construct'] || function (data) {\n return data;\n };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n }\n var type = Type$1;\n\n /*eslint-disable max-len*/\n\n function compileList(schema, name, result) {\n var exclude = [];\n schema.include.forEach(function (includedSchema) {\n result = compileList(includedSchema, name, result);\n });\n schema[name].forEach(function (currentType) {\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {\n exclude.push(previousIndex);\n }\n });\n result.push(currentType);\n });\n return result.filter(function (type, index) {\n return exclude.indexOf(index) === -1;\n });\n }\n function compileMap( /* lists... */\n ) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {}\n },\n index,\n length;\n function collectType(type) {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n }\n function Schema$1(definition) {\n this.include = definition.include || [];\n this.implicit = definition.implicit || [];\n this.explicit = definition.explicit || [];\n this.implicit.forEach(function (type) {\n if (type.loadKind && type.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n });\n this.compiledImplicit = compileList(this, 'implicit', []);\n this.compiledExplicit = compileList(this, 'explicit', []);\n this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);\n }\n Schema$1.DEFAULT = null;\n Schema$1.create = function createSchema() {\n var schemas, types;\n switch (arguments.length) {\n case 1:\n schemas = Schema$1.DEFAULT;\n types = arguments[0];\n break;\n case 2:\n schemas = arguments[0];\n types = arguments[1];\n break;\n default:\n throw new exception('Wrong number of arguments for Schema.create function');\n }\n schemas = common.toArray(schemas);\n types = common.toArray(types);\n if (!schemas.every(function (schema) {\n return schema instanceof Schema$1;\n })) {\n throw new exception('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');\n }\n if (!types.every(function (type$1) {\n return type$1 instanceof type;\n })) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n return new Schema$1({\n include: schemas,\n explicit: types\n });\n };\n var schema = Schema$1;\n\n var str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function construct(data) {\n return data !== null ? data : '';\n }\n });\n\n var seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function construct(data) {\n return data !== null ? data : [];\n }\n });\n\n var map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function construct(data) {\n return data !== null ? data : {};\n }\n });\n\n var failsafe = new schema({\n explicit: [str, seq, map]\n });\n\n function resolveYamlNull(data) {\n if (data === null) return true;\n var max = data.length;\n return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL');\n }\n function constructYamlNull() {\n return null;\n }\n function isNull(object) {\n return object === null;\n }\n var _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function canonical() {\n return '~';\n },\n lowercase: function lowercase() {\n return 'null';\n },\n uppercase: function uppercase() {\n return 'NULL';\n },\n camelcase: function camelcase() {\n return 'Null';\n }\n },\n defaultStyle: 'lowercase'\n });\n\n function resolveYamlBoolean(data) {\n if (data === null) return false;\n var max = data.length;\n return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE');\n }\n function constructYamlBoolean(data) {\n return data === 'true' || data === 'True' || data === 'TRUE';\n }\n function isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n }\n var bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function lowercase(object) {\n return object ? 'true' : 'false';\n },\n uppercase: function uppercase(object) {\n return object ? 'TRUE' : 'FALSE';\n },\n camelcase: function camelcase(object) {\n return object ? 'True' : 'False';\n }\n },\n defaultStyle: 'lowercase'\n });\n\n function isHexCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */;\n }\n\n function isOctCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */;\n }\n\n function isDecCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */;\n }\n\n function resolveYamlInteger(data) {\n if (data === null) return false;\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n if (!max) return false;\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n if (ch === 'x') {\n // base 16\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n // base 8\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n // base 10 (except 0) or base 60\n\n // value should not start with `_`;\n if (ch === '_') return false;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch === ':') break;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n // if !base60 - done;\n if (ch !== ':') return true;\n\n // base60 almost not used, no needs to optimize\n return /^(:[0-5]?[0-9])+$/.test(data.slice(index));\n }\n function constructYamlInteger(data) {\n var value = data,\n sign = 1,\n ch,\n base,\n digits = [];\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n ch = value[0];\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n if (value === '0') return 0;\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value, 16);\n return sign * parseInt(value, 8);\n }\n if (value.indexOf(':') !== -1) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseInt(v, 10));\n });\n value = 0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseInt(value, 10);\n }\n function isInteger(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common.isNegativeZero(object);\n }\n var int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function binary(obj) {\n return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1);\n },\n octal: function octal(obj) {\n return obj >= 0 ? '0' + obj.toString(8) : '-0' + obj.toString(8).slice(1);\n },\n decimal: function decimal(obj) {\n return obj.toString(10);\n },\n /* eslint-disable max-len */\n hexadecimal: function hexadecimal(obj) {\n return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1);\n }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [2, 'bin'],\n octal: [8, 'oct'],\n decimal: [10, 'dec'],\n hexadecimal: [16, 'hex']\n }\n });\n\n var YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // 20:59\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n function resolveYamlFloat(data) {\n if (data === null) return false;\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n return true;\n }\n function constructYamlFloat(data) {\n var value, sign, base, digits;\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n digits = [];\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n if (value === '.inf') {\n return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n } else if (value === '.nan') {\n return NaN;\n } else if (value.indexOf(':') >= 0) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseFloat(v, 10));\n });\n value = 0.0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseFloat(value, 10);\n }\n var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n function representYamlFloat(object, style) {\n var res;\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase':\n return '.nan';\n case 'uppercase':\n return '.NAN';\n case 'camelcase':\n return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '.inf';\n case 'uppercase':\n return '.INF';\n case 'camelcase':\n return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '-.inf';\n case 'uppercase':\n return '-.INF';\n case 'camelcase':\n return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n }\n function isFloat(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common.isNegativeZero(object));\n }\n var float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n });\n\n var json = new schema({\n include: [failsafe],\n implicit: [_null, bool, int, float]\n });\n\n var core = new schema({\n include: [json]\n });\n\n var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n // [1] year\n '-([0-9][0-9])' +\n // [2] month\n '-([0-9][0-9])$'); // [3] day\n\n var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n // [1] year\n '-([0-9][0-9]?)' +\n // [2] month\n '-([0-9][0-9]?)' +\n // [3] day\n '(?:[Tt]|[ \\\\t]+)' +\n // ...\n '([0-9][0-9]?)' +\n // [4] hour\n ':([0-9][0-9])' +\n // [5] minute\n ':([0-9][0-9])' +\n // [6] second\n '(?:\\\\.([0-9]*))?' +\n // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' +\n // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\n function resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n }\n function constructYamlTimestamp(data) {\n var match,\n year,\n month,\n day,\n hour,\n minute,\n second,\n fraction = 0,\n delta = null,\n tz_hour,\n tz_minute,\n date;\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +match[1];\n month = +match[2] - 1; // JS month starts with 0\n day = +match[3];\n if (!match[4]) {\n // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +match[4];\n minute = +match[5];\n second = +match[6];\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) {\n // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +match[10];\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n if (delta) date.setTime(date.getTime() - delta);\n return date;\n }\n function representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n }\n var timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n });\n\n function resolveYamlMerge(data) {\n return data === '<<' || data === null;\n }\n var merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n });\n\n function commonjsRequire (target) {\n \tthrow new Error('Could not dynamically require \"' + target + '\". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.');\n }\n\n /*eslint-disable no-bitwise*/\n\n var NodeBuffer;\n try {\n // A trick for browserified version, to not include `Buffer` shim\n var _require$1 = commonjsRequire;\n NodeBuffer = _require$1('buffer').Buffer;\n } catch (__) {}\n\n // [ 64, 65, 66 ] -> [ padding, CR, LF ]\n var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n function resolveYamlBinary(data) {\n if (data === null) return false;\n var code,\n idx,\n bitlen = 0,\n max = data.length,\n map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return bitlen % 8 === 0;\n }\n function constructYamlBinary(data) {\n var idx,\n tailbits,\n input = data.replace(/[\\r\\n=]/g, ''),\n // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if (idx % 4 === 0 && idx) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n }\n bits = bits << 6 | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = max % 4 * 6;\n if (tailbits === 0) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push(bits >> 10 & 0xFF);\n result.push(bits >> 2 & 0xFF);\n } else if (tailbits === 12) {\n result.push(bits >> 4 & 0xFF);\n }\n\n // Wrap into Buffer for NodeJS and leave Array for browser\n if (NodeBuffer) {\n // Support node 6.+ Buffer API when available\n return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);\n }\n return result;\n }\n function representYamlBinary(object /*, style*/) {\n var result = '',\n bits = 0,\n idx,\n tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if (idx % 3 === 0 && idx) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n }\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n if (tail === 0) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[bits >> 10 & 0x3F];\n result += map[bits >> 4 & 0x3F];\n result += map[bits << 2 & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[bits >> 2 & 0x3F];\n result += map[bits << 4 & 0x3F];\n result += map[64];\n result += map[64];\n }\n return result;\n }\n function isBinary(object) {\n return NodeBuffer && NodeBuffer.isBuffer(object);\n }\n var binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n });\n\n var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\n var _toString$2 = Object.prototype.toString;\n function resolveYamlOmap(data) {\n if (data === null) return true;\n var objectKeys = [],\n index,\n length,\n pair,\n pairKey,\n pairHasKey,\n object = data;\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n if (_toString$2.call(pair) !== '[object Object]') return false;\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;else return false;\n }\n }\n if (!pairHasKey) return false;\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false;\n }\n return true;\n }\n function constructYamlOmap(data) {\n return data !== null ? data : [];\n }\n var omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n });\n\n var _toString$1 = Object.prototype.toString;\n function resolveYamlPairs(data) {\n if (data === null) return true;\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n if (_toString$1.call(pair) !== '[object Object]') return false;\n keys = Object.keys(pair);\n if (keys.length !== 1) return false;\n result[index] = [keys[0], pair[keys[0]]];\n }\n return true;\n }\n function constructYamlPairs(data) {\n if (data === null) return [];\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n keys = Object.keys(pair);\n result[index] = [keys[0], pair[keys[0]]];\n }\n return result;\n }\n var pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n });\n\n var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n function resolveYamlSet(data) {\n if (data === null) return true;\n var key,\n object = data;\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n return true;\n }\n function constructYamlSet(data) {\n return data !== null ? data : {};\n }\n var set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n });\n\n var default_safe = new schema({\n include: [core],\n implicit: [timestamp, merge],\n explicit: [binary, omap, pairs, set]\n });\n\n function resolveJavascriptUndefined() {\n return true;\n }\n function constructJavascriptUndefined() {\n /*eslint-disable no-undefined*/\n return undefined;\n }\n function representJavascriptUndefined() {\n return '';\n }\n function isUndefined(object) {\n return typeof object === 'undefined';\n }\n var _undefined = new type('tag:yaml.org,2002:js/undefined', {\n kind: 'scalar',\n resolve: resolveJavascriptUndefined,\n construct: constructJavascriptUndefined,\n predicate: isUndefined,\n represent: representJavascriptUndefined\n });\n\n function resolveJavascriptRegExp(data) {\n if (data === null) return false;\n if (data.length === 0) return false;\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n\n // if regexp starts with '/' it can have modifiers and must be properly closed\n // `/foo/gim` - modifiers tail can be maximum 3 chars\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n if (modifiers.length > 3) return false;\n // if expression starts with /, is should be properly terminated\n if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;\n }\n return true;\n }\n function constructJavascriptRegExp(data) {\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n\n // `/foo/gim` - tail can be maximum 4 chars\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n regexp = regexp.slice(1, regexp.length - modifiers.length - 1);\n }\n return new RegExp(regexp, modifiers);\n }\n function representJavascriptRegExp(object /*, style*/) {\n var result = '/' + object.source + '/';\n if (object.global) result += 'g';\n if (object.multiline) result += 'm';\n if (object.ignoreCase) result += 'i';\n return result;\n }\n function isRegExp(object) {\n return Object.prototype.toString.call(object) === '[object RegExp]';\n }\n var regexp = new type('tag:yaml.org,2002:js/regexp', {\n kind: 'scalar',\n resolve: resolveJavascriptRegExp,\n construct: constructJavascriptRegExp,\n predicate: isRegExp,\n represent: representJavascriptRegExp\n });\n\n var esprima;\n\n // Browserified version does not have esprima\n //\n // 1. For node.js just require module as deps\n // 2. For browser try to require mudule via external AMD system.\n // If not found - try to fallback to window.esprima. If not\n // found too - then fail to parse.\n //\n try {\n // workaround to exclude package from browserify list.\n var _require = commonjsRequire;\n esprima = _require('esprima');\n } catch (_) {\n /* eslint-disable no-redeclare */\n /* global window */\n if (typeof window !== 'undefined') esprima = window.esprima;\n }\n function resolveJavascriptFunction(data) {\n if (data === null) return false;\n try {\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n });\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n return false;\n }\n return true;\n } catch (err) {\n return false;\n }\n }\n function constructJavascriptFunction(data) {\n /*jslint evil:true*/\n\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n }),\n params = [],\n body;\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n throw new Error('Failed to resolve function');\n }\n ast.body[0].expression.params.forEach(function (param) {\n params.push(param.name);\n });\n body = ast.body[0].expression.body.range;\n\n // Esprima's ranges include the first '{' and the last '}' characters on\n // function expressions. So cut them out.\n if (ast.body[0].expression.body.type === 'BlockStatement') {\n /*eslint-disable no-new-func*/\n return new Function(params, source.slice(body[0] + 1, body[1] - 1));\n }\n // ES6 arrow functions can omit the BlockStatement. In that case, just return\n // the body.\n /*eslint-disable no-new-func*/\n return new Function(params, 'return ' + source.slice(body[0], body[1]));\n }\n function representJavascriptFunction(object /*, style*/) {\n return object.toString();\n }\n function isFunction(object) {\n return Object.prototype.toString.call(object) === '[object Function]';\n }\n var _function = new type('tag:yaml.org,2002:js/function', {\n kind: 'scalar',\n resolve: resolveJavascriptFunction,\n construct: constructJavascriptFunction,\n predicate: isFunction,\n represent: representJavascriptFunction\n });\n\n var default_full = schema.DEFAULT = new schema({\n include: [default_safe],\n explicit: [_undefined, regexp, _function]\n });\n\n /*eslint-disable max-len,no-use-before-define*/\n\n var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n var CONTEXT_FLOW_IN = 1;\n var CONTEXT_FLOW_OUT = 2;\n var CONTEXT_BLOCK_IN = 3;\n var CONTEXT_BLOCK_OUT = 4;\n var CHOMPING_CLIP = 1;\n var CHOMPING_STRIP = 2;\n var CHOMPING_KEEP = 3;\n var PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\n var PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\n var PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\n var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\n var PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n function _class(obj) {\n return Object.prototype.toString.call(obj);\n }\n function is_EOL(c) {\n return c === 0x0A /* LF */ || c === 0x0D /* CR */;\n }\n\n function is_WHITE_SPACE(c) {\n return c === 0x09 /* Tab */ || c === 0x20 /* Space */;\n }\n\n function is_WS_OR_EOL(c) {\n return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */;\n }\n\n function is_FLOW_INDICATOR(c) {\n return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */;\n }\n\n function fromHexCode(c) {\n var lc;\n if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) {\n return lc - 0x61 + 10;\n }\n return -1;\n }\n function escapedHexLen(c) {\n if (c === 0x78 /* x */) {\n return 2;\n }\n if (c === 0x75 /* u */) {\n return 4;\n }\n if (c === 0x55 /* U */) {\n return 8;\n }\n return 0;\n }\n function fromDecimalCode(c) {\n if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) {\n return c - 0x30;\n }\n return -1;\n }\n function simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return c === 0x30 /* 0 */ ? '\\x00' : c === 0x61 /* a */ ? '\\x07' : c === 0x62 /* b */ ? '\\x08' : c === 0x74 /* t */ ? '\\x09' : c === 0x09 /* Tab */ ? '\\x09' : c === 0x6E /* n */ ? '\\x0A' : c === 0x76 /* v */ ? '\\x0B' : c === 0x66 /* f */ ? '\\x0C' : c === 0x72 /* r */ ? '\\x0D' : c === 0x65 /* e */ ? '\\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* \" */ ? '\\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \\ */ ? '\\x5C' : c === 0x4E /* N */ ? '\\x85' : c === 0x5F /* _ */ ? '\\xA0' : c === 0x4C /* L */ ? \"\\u2028\" : c === 0x50 /* P */ ? \"\\u2029\" : '';\n }\n function charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00);\n }\n var simpleEscapeCheck = new Array(256); // integer, for fast access\n var simpleEscapeMap = new Array(256);\n for (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n }\n function State$1(input, options) {\n this.input = input;\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || default_full;\n this.onWarning = options['onWarning'] || null;\n this.legacy = options['legacy'] || false;\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n }\n\n function generateError(state, message) {\n return new exception(message, new mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart));\n }\n function throwError(state, message) {\n throw generateError(state, message);\n }\n function throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n }\n var directiveHandlers = {\n YAML: function handleYamlDirective(state, name, args) {\n var match, major, minor;\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n state.version = args[0];\n state.checkLineBreaks = minor < 2;\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n TAG: function handleTagDirective(state, name, args) {\n var handle, prefix;\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n handle = args[0];\n prefix = args[1];\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n state.tagMap[handle] = prefix;\n }\n };\n function captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n if (start < end) {\n _result = state.input.slice(start, end);\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n state.result += _result;\n }\n }\n function mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n sourceKeys = Object.keys(source);\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n if (!_hasOwnProperty$1.call(destination, key)) {\n destination[key] = source[key];\n overridableKeys[key] = true;\n }\n }\n }\n function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n keyNode = String(keyNode);\n if (_result === null) {\n _result = {};\n }\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n _result[keyNode] = valueNode;\n delete overridableKeys[keyNode];\n }\n return _result;\n }\n function readLineBreak(state) {\n var ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x0A /* LF */) {\n state.position++;\n } else if (ch === 0x0D /* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A /* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n state.line += 1;\n state.lineStart = state.position;\n }\n function skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (allowComments && ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0);\n }\n if (is_EOL(ch)) {\n readLineBreak(state);\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n while (ch === 0x20 /* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n return lineBreaks;\n }\n function testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) {\n _position += 3;\n ch = state.input.charCodeAt(_position);\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n return false;\n }\n function writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n }\n function readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* \" */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) {\n return false;\n }\n if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n while (ch !== 0) {\n if (ch === 0x3A /* : */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n } else if (ch === 0x23 /* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, captureEnd, false);\n if (state.result) {\n return true;\n }\n state.kind = _kind;\n state.result = _result;\n return false;\n }\n function readSingleQuotedScalar(state, nodeIndent) {\n var ch, captureStart, captureEnd;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x27 /* ' */) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27 /* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x27 /* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n }\n function readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart, captureEnd, hexLength, hexResult, tmp, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x22 /* \" */) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22 /* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n } else if (ch === 0x5C /* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n state.result += charFromCodepoint(hexResult);\n state.position++;\n } else {\n throwError(state, 'unknown escape sequence');\n }\n captureStart = captureEnd = state.position;\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n }\n function readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = {},\n keyNode,\n keyTag,\n valueNode,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x5B /* [ */) {\n terminator = 0x5D; /* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B /* { */) {\n terminator = 0x7D; /* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(++state.position);\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n }\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n if (ch === 0x3F /* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));\n } else {\n _result.push(keyNode);\n }\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x2C /* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n throwError(state, 'unexpected end of the stream within a flow collection');\n }\n function readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x7C /* | */) {\n folding = false;\n } else if (ch === 0x3E /* > */) {\n folding = true;\n } else {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x2B /* + */ || ch === 0x2D /* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n } else {\n break;\n }\n }\n if (is_WHITE_SPACE(ch)) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (is_WHITE_SPACE(ch));\n if (ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (!is_EOL(ch) && ch !== 0);\n }\n }\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n ch = state.input.charCodeAt(state.position);\n while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) {\n // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) {\n // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n while (!is_EOL(ch) && ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, state.position, false);\n }\n return true;\n }\n function readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n if (ch !== 0x2D /* - */) {\n break;\n }\n following = state.input.charCodeAt(state.position + 1);\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n detected = true;\n state.position++;\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n }\n function readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _pos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = {},\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n _pos = state.position;\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) {\n if (ch === 0x3F /* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x3A /* : */) {\n ch = state.input.charCodeAt(++state.position);\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n } else {\n break; // Reading is done. Go to the epilogue.\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);\n keyTag = keyNode = valueNode = null;\n }\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n if (state.lineIndent > nodeIndent && ch !== 0) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n return detected;\n }\n function readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x21 /* ! */) return false;\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x3C /* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n } else if (ch === 0x21 /* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n } else {\n tagHandle = '!';\n }\n _position = state.position;\n if (isVerbatim) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && ch !== 0x3E /* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n if (ch === 0x21 /* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n ch = state.input.charCodeAt(++state.position);\n }\n tagName = state.input.slice(_position, state.position);\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n if (isVerbatim) {\n state.tag = tagName;\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n return true;\n }\n function readAnchorProperty(state) {\n var _position, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x26 /* & */) return false;\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n state.anchor = state.input.slice(_position, state.position);\n return true;\n }\n function readAlias(state) {\n var _position, alias, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x2A /* * */) return false;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n alias = state.input.slice(_position, state.position);\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n }\n function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1,\n // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n blockIndent = state.position - state.lineStart;\n if (indentStatus === 1) {\n if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n } else if (readAlias(state)) {\n hasContent = true;\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n if (state.tag !== null && state.tag !== '!') {\n if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n if (type.resolve(state.result)) {\n // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n if (!type.resolve(state.result)) {\n // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n }\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n }\n function readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = {};\n state.anchorMap = {};\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if (state.lineIndent > 0 || ch !== 0x25 /* % */) {\n break;\n }\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && !is_EOL(ch));\n break;\n }\n if (is_EOL(ch)) break;\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n if (ch !== 0) readLineBreak(state);\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n skipSeparationSpace(state, true, -1);\n if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n state.documents.push(state.result);\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n if (state.input.charCodeAt(state.position) === 0x2E /* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n if (state.position < state.length - 1) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n }\n function loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n if (input.length !== 0) {\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n var state = new State$1(input, options);\n var nullpos = input.indexOf('\\0');\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n while (state.input.charCodeAt(state.position) === 0x20 /* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n while (state.position < state.length - 1) {\n readDocument(state);\n }\n return state.documents;\n }\n function loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n var documents = loadDocuments(input, options);\n if (typeof iterator !== 'function') {\n return documents;\n }\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n }\n function load$1(input, options) {\n var documents = loadDocuments(input, options);\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n }\n function safeLoadAll$1(input, iterator, options) {\n if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n return loadAll$1(input, iterator, common.extend({\n schema: default_safe\n }, options));\n }\n function safeLoad$1(input, options) {\n return load$1(input, common.extend({\n schema: default_safe\n }, options));\n }\n var loadAll_1 = loadAll$1;\n var load_1 = load$1;\n var safeLoadAll_1 = safeLoadAll$1;\n var safeLoad_1 = safeLoad$1;\n var loader = {\n loadAll: loadAll_1,\n load: load_1,\n safeLoadAll: safeLoadAll_1,\n safeLoad: safeLoad_1\n };\n\n /*eslint-disable no-use-before-define*/\n\n var _toString = Object.prototype.toString;\n var _hasOwnProperty = Object.prototype.hasOwnProperty;\n var CHAR_TAB = 0x09; /* Tab */\n var CHAR_LINE_FEED = 0x0A; /* LF */\n var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\n var CHAR_SPACE = 0x20; /* Space */\n var CHAR_EXCLAMATION = 0x21; /* ! */\n var CHAR_DOUBLE_QUOTE = 0x22; /* \" */\n var CHAR_SHARP = 0x23; /* # */\n var CHAR_PERCENT = 0x25; /* % */\n var CHAR_AMPERSAND = 0x26; /* & */\n var CHAR_SINGLE_QUOTE = 0x27; /* ' */\n var CHAR_ASTERISK = 0x2A; /* * */\n var CHAR_COMMA = 0x2C; /* , */\n var CHAR_MINUS = 0x2D; /* - */\n var CHAR_COLON = 0x3A; /* : */\n var CHAR_EQUALS = 0x3D; /* = */\n var CHAR_GREATER_THAN = 0x3E; /* > */\n var CHAR_QUESTION = 0x3F; /* ? */\n var CHAR_COMMERCIAL_AT = 0x40; /* @ */\n var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\n var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\n var CHAR_GRAVE_ACCENT = 0x60; /* ` */\n var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\n var CHAR_VERTICAL_LINE = 0x7C; /* | */\n var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\n var ESCAPE_SEQUENCES = {};\n ESCAPE_SEQUENCES[0x00] = '\\\\0';\n ESCAPE_SEQUENCES[0x07] = '\\\\a';\n ESCAPE_SEQUENCES[0x08] = '\\\\b';\n ESCAPE_SEQUENCES[0x09] = '\\\\t';\n ESCAPE_SEQUENCES[0x0A] = '\\\\n';\n ESCAPE_SEQUENCES[0x0B] = '\\\\v';\n ESCAPE_SEQUENCES[0x0C] = '\\\\f';\n ESCAPE_SEQUENCES[0x0D] = '\\\\r';\n ESCAPE_SEQUENCES[0x1B] = '\\\\e';\n ESCAPE_SEQUENCES[0x22] = '\\\\\"';\n ESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\n ESCAPE_SEQUENCES[0x85] = '\\\\N';\n ESCAPE_SEQUENCES[0xA0] = '\\\\_';\n ESCAPE_SEQUENCES[0x2028] = '\\\\L';\n ESCAPE_SEQUENCES[0x2029] = '\\\\P';\n var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'];\n function compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n if (map === null) return {};\n result = {};\n keys = Object.keys(map);\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n result[tag] = style;\n }\n return result;\n }\n function encodeHex(character) {\n var string, handle, length;\n string = character.toString(16).toUpperCase();\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n }\n function State(options) {\n this.schema = options['schema'] || default_full;\n this.indent = Math.max(1, options['indent'] || 2);\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = common.isNothing(options['flowLevel']) ? -1 : options['flowLevel'];\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n this.tag = null;\n this.result = '';\n this.duplicates = [];\n this.usedDuplicates = null;\n }\n\n // Indents every line in a string. Empty lines (\\n only) are not indented.\n function indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n if (line.length && line !== '\\n') result += ind;\n result += line;\n }\n return result;\n }\n function generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n }\n function testImplicitResolving(state, str) {\n var index, length, type;\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n if (type.resolve(str)) {\n return true;\n }\n }\n return false;\n }\n\n // [33] s-white ::= s-space | s-tab\n function isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n }\n\n // Returns true if the character can be printed without escaping.\n // From YAML 1.2: \"any allowed characters known to be non-printable\n // should also be escaped. [However,] This isn’t mandatory\"\n // Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\n function isPrintable(c) {\n return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF;\n }\n\n // [34] ns-char ::= nb-char - s-white\n // [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n // [26] b-char ::= b-line-feed | b-carriage-return\n // [24] b-line-feed ::= #xA /* LF */\n // [25] b-carriage-return ::= #xD /* CR */\n // [3] c-byte-order-mark ::= #xFEFF\n function isNsChar(c) {\n return isPrintable(c) && !isWhitespace(c)\n // byte-order-mark\n && c !== 0xFEFF\n // b-char\n && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED;\n }\n\n // Simplified test for values allowed after the first character in plain style.\n function isPlainSafe(c, prev) {\n // Uses a subset of nb-char - c-flow-indicator - \":\" - \"#\"\n // where nb-char ::= c-printable - b-char - c-byte-order-mark.\n return isPrintable(c) && c !== 0xFEFF\n // - c-flow-indicator\n && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n // - \":\" - \"#\"\n // /* An ns-char preceding */ \"#\"\n && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev));\n }\n\n // Simplified test for values allowed as the first character in plain style.\n function isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “\"”\n && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE\n // | “%” | “@” | “`”)\n && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT;\n }\n\n // Determines whether block indentation indicator is required.\n function needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n }\n var STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n // Determines which scalar styles are possible and returns the preferred style.\n // lineWidth = -1 => no limit.\n // Pre-conditions: str.length > 0.\n // Post-conditions:\n // STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\n function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {\n var i;\n var char, prev_char;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1));\n if (singleLineOnly) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n\n // Note: line breaking/folding is implemented for only the folded style.\n // NB. We drop the last trailing newline (if any) of a returned block scalar\n // since the dumper adds its own newline. This always works:\n // • No ending newline => unaffected; already using strip \"-\" chomping.\n // • Ending newline => removed then restored.\n // Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\n function writeScalar(state, string, level, iskey) {\n state.dump = function () {\n if (string.length === 0) {\n return \"''\";\n }\n if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {\n return \"'\" + string + \"'\";\n }\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || state.flowLevel > -1 && level >= state.flowLevel;\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }();\n }\n\n // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\n function blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : clip ? '' : '-';\n return indentIndicator + chomp + '\\n';\n }\n\n // (See the note for writeScalar.)\n function dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n }\n\n // Note: a long line without a suitable break point will exceed the width limit.\n // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\n function foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }();\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while (match = lineRe.exec(string)) {\n var prefix = match[1],\n line = match[2];\n moreIndented = line[0] === ' ';\n result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\\n' : '') + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n return result;\n }\n\n // Greedy line breaking.\n // Picks the longest line under the limit each time,\n // otherwise settles for the shortest line over the limit.\n // NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\n function foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0,\n end,\n curr = 0,\n next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while (match = breakRe.exec(line)) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = curr > start ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n return result.slice(1); // drop extra \\n joiner\n }\n\n // Escapes a double-quoted string.\n function escapeString(string) {\n var result = '';\n var char, nextChar;\n var escapeSeq;\n for (var i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n // Check for surrogate pairs (reference Unicode 3.0 section \"3.7 Surrogates\").\n if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) {\n nextChar = string.charCodeAt(i + 1);\n if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) {\n // Combine the surrogate pair and store it escaped.\n result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);\n // Advance index one extra since we already used that char here.\n i++;\n continue;\n }\n }\n escapeSeq = ESCAPE_SEQUENCES[char];\n result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char);\n }\n return result;\n }\n function writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n // Write only valid elements.\n if (writeNode(state, level, object[index], false, false)) {\n if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n }\n function writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n // Write only valid elements.\n if (writeNode(state, level + 1, object[index], true, true)) {\n if (!compact || index !== 0) {\n _result += generateNextLine(state, level);\n }\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n }\n\n function writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (index !== 0) pairBuffer += ', ';\n if (state.condenseFlow) pairBuffer += '\"';\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n }\n function writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (!compact || index !== 0) {\n pairBuffer += generateNextLine(state, level);\n }\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024;\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n pairBuffer += state.dump;\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n }\n\n function detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) {\n state.tag = explicit ? type.tag : '?';\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n state.dump = _result;\n }\n return true;\n }\n }\n return false;\n }\n\n // Serializes `object` and writes it to global `result`.\n // Returns true on success, or false on invalid object.\n //\n function writeNode(state, level, object, block, compact, iskey) {\n state.tag = null;\n state.dump = object;\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n var type = _toString.call(state.dump);\n if (block) {\n block = state.flowLevel < 0 || state.flowLevel > level;\n }\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) {\n compact = false;\n }\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && Object.keys(state.dump).length !== 0) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level;\n if (block && state.dump.length !== 0) {\n writeBlockSequence(state, arrayLevel, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, arrayLevel, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey);\n }\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n if (state.tag !== null && state.tag !== '?') {\n state.dump = '!<' + state.tag + '> ' + state.dump;\n }\n }\n return true;\n }\n function getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n inspectNode(object, objects, duplicatesIndexes);\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n }\n function inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList, index, length;\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n }\n function dump$1(input, options) {\n options = options || {};\n var state = new State(options);\n if (!state.noRefs) getDuplicateReferences(input, state);\n if (writeNode(state, 0, input, true, true)) return state.dump + '\\n';\n return '';\n }\n function safeDump$1(input, options) {\n return dump$1(input, common.extend({\n schema: default_safe\n }, options));\n }\n var dump_1 = dump$1;\n var safeDump_1 = safeDump$1;\n var dumper = {\n dump: dump_1,\n safeDump: safeDump_1\n };\n\n function deprecated(name) {\n return function () {\n throw new Error('Function ' + name + ' is deprecated and cannot be used.');\n };\n }\n var Type = type;\n var Schema = schema;\n var FAILSAFE_SCHEMA = failsafe;\n var JSON_SCHEMA = json;\n var CORE_SCHEMA = core;\n var DEFAULT_SAFE_SCHEMA = default_safe;\n var DEFAULT_FULL_SCHEMA = default_full;\n var load = loader.load;\n var loadAll = loader.loadAll;\n var safeLoad = loader.safeLoad;\n var safeLoadAll = loader.safeLoadAll;\n var dump = dumper.dump;\n var safeDump = dumper.safeDump;\n var YAMLException = exception;\n\n // Deprecated schema names from JS-YAML 2.0.x\n var MINIMAL_SCHEMA = failsafe;\n var SAFE_SCHEMA = default_safe;\n var DEFAULT_SCHEMA = default_full;\n\n // Deprecated functions from JS-YAML 1.x.x\n var scan = deprecated('scan');\n var parse = deprecated('parse');\n var compose = deprecated('compose');\n var addConstructor = deprecated('addConstructor');\n var jsYaml$1 = {\n Type: Type,\n Schema: Schema,\n FAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n JSON_SCHEMA: JSON_SCHEMA,\n CORE_SCHEMA: CORE_SCHEMA,\n DEFAULT_SAFE_SCHEMA: DEFAULT_SAFE_SCHEMA,\n DEFAULT_FULL_SCHEMA: DEFAULT_FULL_SCHEMA,\n load: load,\n loadAll: loadAll,\n safeLoad: safeLoad,\n safeLoadAll: safeLoadAll,\n dump: dump,\n safeDump: safeDump,\n YAMLException: YAMLException,\n MINIMAL_SCHEMA: MINIMAL_SCHEMA,\n SAFE_SCHEMA: SAFE_SCHEMA,\n DEFAULT_SCHEMA: DEFAULT_SCHEMA,\n scan: scan,\n parse: parse,\n compose: compose,\n addConstructor: addConstructor\n };\n\n var jsYaml = jsYaml$1;\n\n function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n /**\n * Redirect - object used to redirect some requests\n * e.g.\n * {\n * title: 1x1-transparent.gif\n * comment: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever\n * contentType: image/gif;base64\n * content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n * }\n *\n * @typedef {Object} Redirect\n * @property {string} title resource name\n * @property {string} comment resource description\n * @property {string} content encoded resource content\n * @property {string} contentType MIME type\n * @property {boolean} [isBlocking] e.g click2load redirect\n * @property {string} [sha] hash\n */\n\n class Redirects {\n /**\n * Converts rawYaml into JS object with sources titles used as keys\n *\n * @param {string} rawYaml\n * @returns {Object} - return object with titles in the keys and RedirectSources\n * in the values\n */\n constructor(rawYaml) {\n try {\n const arrOfRedirects = jsYaml.safeLoad(rawYaml);\n this.redirects = arrOfRedirects.reduce(function (acc, redirect) {\n return _objectSpread(_objectSpread({}, acc), {}, {\n [redirect.title]: redirect\n });\n }, {});\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(\"Was unable to load YAML into JS due to: \".concat(e.message));\n throw e;\n }\n }\n\n /**\n * Returns redirect source object\n *\n * @param {string} title\n * @returns {Redirect|undefined} Found redirect source object, or `undefined` if not found.\n */\n getRedirect(title) {\n var _this = this;\n if (Object.prototype.hasOwnProperty.call(this.redirects, title)) {\n return this.redirects[title];\n }\n\n // look title among aliases\n const values = Object.keys(this.redirects).map(function (key) {\n return _this.redirects[key];\n });\n return values.find(function (redirect) {\n const aliases = redirect.aliases;\n if (!aliases) {\n return false;\n }\n return aliases.indexOf(title) > -1;\n });\n }\n\n /**\n * Checks if redirect is blocking like click2load.html\n *\n * @param {string} title Title of the redirect.\n * @returns {boolean} True if redirect is blocking otherwise returns `false` even if redirect name is\n * unknown.\n */\n isBlocking(title) {\n const redirect = this.redirects[title];\n if (redirect) {\n return !!redirect.isBlocking;\n }\n return false;\n }\n }\n\n const redirectsMap = {\n \"1x1-transparent.gif\": \"1x1-transparent.gif\",\n \"1x1.gif\": \"1x1-transparent.gif\",\n \"1x1-transparent-gif\": \"1x1-transparent.gif\",\n \"2x2-transparent.png\": \"2x2-transparent.png\",\n \"2x2.png\": \"2x2-transparent.png\",\n \"2x2-transparent-png\": \"2x2-transparent.png\",\n \"3x2-transparent.png\": \"3x2-transparent.png\",\n \"3x2.png\": \"3x2-transparent.png\",\n \"3x2-transparent-png\": \"3x2-transparent.png\",\n \"32x32-transparent.png\": \"32x32-transparent.png\",\n \"32x32.png\": \"32x32-transparent.png\",\n \"32x32-transparent-png\": \"32x32-transparent.png\",\n noopframe: \"noopframe.html\",\n \"noop.html\": \"noopframe.html\",\n \"blank-html\": \"noopframe.html\",\n noopcss: \"noopcss.css\",\n \"noop.css\": \"noopcss.css\",\n \"blank-css\": \"noopcss.css\",\n noopjs: \"noopjs.js\",\n \"noop.js\": \"noopjs.js\",\n \"blank-js\": \"noopjs.js\",\n noopjson: \"noopjson.json\",\n nooptext: \"nooptext.js\",\n \"noop.txt\": \"nooptext.js\",\n \"blank-text\": \"nooptext.js\",\n empty: \"nooptext.js\",\n \"noopvmap-1.0\": \"noopvmap01.xml\",\n \"noop-vmap1.0.xml\": \"noopvmap01.xml\",\n \"noopvast-2.0\": \"noopvast02.xml\",\n \"noopvast-3.0\": \"noopvast03.xml\",\n \"noopvast-4.0\": \"noopvast04.xml\",\n \"noopmp3-0.1s\": \"noopmp3.mp3\",\n \"blank-mp3\": \"noopmp3.mp3\",\n \"noopmp4-1s\": \"noopmp4.mp4\",\n \"noop-1s.mp4\": \"noopmp4.mp4\",\n \"blank-mp4\": \"noopmp4.mp4\",\n \"click2load.html\": \"click2load.html\",\n \"ubo-click2load.html\": \"click2load.html\",\n \"amazon-apstag\": \"amazon-apstag.js\",\n \"ubo-amazon_apstag.js\": \"amazon-apstag.js\",\n \"amazon_apstag.js\": \"amazon-apstag.js\",\n \"ati-smarttag\": \"ati-smarttag.js\",\n \"didomi-loader\": \"didomi-loader.js\",\n fingerprintjs2: \"fingerprintjs2.js\",\n \"ubo-fingerprint2.js\": \"fingerprintjs2.js\",\n \"fingerprint2.js\": \"fingerprintjs2.js\",\n fingerprintjs3: \"fingerprintjs3.js\",\n \"ubo-fingerprint3.js\": \"fingerprintjs3.js\",\n \"fingerprint3.js\": \"fingerprintjs3.js\",\n gemius: \"gemius.js\",\n \"google-analytics-ga\": \"google-analytics-ga.js\",\n \"ubo-google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics\": \"google-analytics.js\",\n \"ubo-google-analytics_analytics.js\": \"google-analytics.js\",\n \"google-analytics_analytics.js\": \"google-analytics.js\",\n \"googletagmanager-gtm\": \"google-analytics.js\",\n \"ubo-googletagmanager_gtm.js\": \"google-analytics.js\",\n \"googletagmanager_gtm.js\": \"google-analytics.js\",\n \"google-ima3\": \"google-ima3.js\",\n \"ubo-google-ima.js\": \"google-ima3.js\",\n \"google-ima.js\": \"google-ima3.js\",\n \"googlesyndication-adsbygoogle\": \"googlesyndication-adsbygoogle.js\",\n \"ubo-googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googletagservices-gpt\": \"googletagservices-gpt.js\",\n \"ubo-googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n \"googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n matomo: \"matomo.js\",\n \"metrika-yandex-tag\": \"metrika-yandex-tag.js\",\n \"metrika-yandex-watch\": \"metrika-yandex-watch.js\",\n \"naver-wcslog\": \"naver-wcslog.js\",\n noeval: \"noeval.js\",\n \"noeval.js\": \"noeval.js\",\n \"silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval.js\": \"noeval.js\",\n \"ubo-silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval\": \"noeval.js\",\n \"ubo-silent-noeval\": \"noeval.js\",\n \"pardot-1.0\": \"pardot-1.0.js\",\n \"prebid-ads\": \"prebid-ads.js\",\n \"ubo-prebid-ads.js\": \"prebid-ads.js\",\n \"prebid-ads.js\": \"prebid-ads.js\",\n prebid: \"prebid.js\",\n \"prevent-bab\": \"prevent-bab.js\",\n \"nobab.js\": \"prevent-bab.js\",\n \"ubo-nobab.js\": \"prevent-bab.js\",\n \"bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-nobab\": \"prevent-bab.js\",\n \"ubo-bab-defuser\": \"prevent-bab.js\",\n \"prevent-bab2\": \"prevent-bab2.js\",\n \"nobab2.js\": \"prevent-bab2.js\",\n \"prevent-fab-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"nofab.js\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab.js\": \"prevent-fab-3.2.0.js\",\n \"fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab\": \"prevent-fab-3.2.0.js\",\n \"prevent-popads-net\": \"prevent-popads-net.js\",\n \"popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net\": \"prevent-popads-net.js\",\n \"scorecardresearch-beacon\": \"scorecardresearch-beacon.js\",\n \"ubo-scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"set-popads-dummy\": \"set-popads-dummy.js\",\n \"popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy\": \"set-popads-dummy.js\"\n };\n\n /**\n * Finds redirect resource by it's name\n *\n * @param {string} name - redirect name\n * @returns {Function}\n */\n const getRedirectByName = function getRedirectByName(name) {\n const redirects = Object.keys(redirectsList).map(function (key) {\n return redirectsList[key];\n });\n return redirects.find(function (r) {\n return r.names && r.names.indexOf(name) > -1;\n });\n };\n\n /**\n * @typedef {Object} Source - redirect properties\n * @property {string} name redirect name\n * @property {Array} args Arguments for redirect function\n * @property {'extension'|'test'} [engine] -\n * Defines the final form of redirect string presentation\n * @property {boolean} [verbose] flag to enable printing to console debug information\n */\n\n /**\n * Returns redirect code by param\n *\n * @param {Source} source\n * @returns {string} redirect code\n */\n const getRedirectCode = function getRedirectCode(source) {\n const redirect = getRedirectByName(source.name);\n let result = attachDependencies(redirect);\n result = addCall(redirect, result);\n\n // redirect code for different sources is checked in tests\n // so it should be just a code without any source and props passed\n result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true);\n return result;\n };\n const getRedirectFilename = function getRedirectFilename(name) {\n return redirectsMap[name];\n };\n const redirects = {\n Redirects,\n getRedirectFilename,\n getCode: getRedirectCode,\n isAdgRedirectRule: validator.isAdgRedirectRule,\n isValidAdgRedirectRule: validator.isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo: validator.isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg: validator.isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg: validator.isAbpRedirectCompatibleWithAdg,\n convertUboRedirectToAdg,\n convertAbpRedirectToAdg,\n convertRedirectToAdg,\n convertAdgRedirectToUbo\n };\n\n function abortCurrentInlineScript(source, args) {\n function abortCurrentInlineScript(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const SRC_DATA_MARKER = \"data:text/javascript;base64,\";\n const getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (content.length === 0 && typeof scriptEl.src !== \"undefined\" && startsWith(scriptEl.src, SRC_DATA_MARKER)) {\n const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n const props = property.split(\".\");\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n let origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue: currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n const result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n const rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyRead(source, args) {\n function abortOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyWrite(source, args) {\n function abortOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnStackTrace(source, args) {\n function abortOnStackTrace(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n const result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n const rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnStackTrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetInterval(source, args) {\n function adjustSetInterval(source, matchCallback, matchDelay, boost) {\n const nativeSetInterval = window.setInterval;\n const matchRegexp = toRegExp(matchCallback);\n const intervalWrapper = function intervalWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n const DEFAULT_MULTIPLIER = .05;\n const MIN_MULTIPLIER = .001;\n const MAX_MULTIPLIER = 50;\n const parsedBoost = parseFloat(boost);\n let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n const DEFAULT_DELAY = 1e3;\n const parsedDelay = parseInt(delay, 10);\n const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetTimeout(source, args) {\n function adjustSetTimeout(source, matchCallback, matchDelay, boost) {\n const nativeSetTimeout = window.setTimeout;\n const matchRegexp = toRegExp(matchCallback);\n const timeoutWrapper = function timeoutWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n const DEFAULT_MULTIPLIER = .05;\n const MIN_MULTIPLIER = .001;\n const MAX_MULTIPLIER = 50;\n const parsedBoost = parseFloat(boost);\n let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n const DEFAULT_DELAY = 1e3;\n const parsedDelay = parseInt(delay, 10);\n const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugCurrentInlineScript(source, args) {\n function debugCurrentInlineScript(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger;\n }\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n const props = property.split(\".\");\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyRead(source, args) {\n function debugOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyWrite(source, args) {\n function debugOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function dirString(source, args) {\n function dirString(source, times) {\n const _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === \"function\") {\n dir.call(this, object);\n }\n hit(source);\n }\n console.dir = dirWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n dirString.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function disableNewtabLinks(source, args) {\n function disableNewtabLinks(source) {\n document.addEventListener(\"click\", function (ev) {\n let target = ev.target;\n while (target !== null) {\n if (target.localName === \"a\" && target.hasAttribute(\"target\")) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n disableNewtabLinks.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function forceWindowClose(source, args) {\n function forceWindowClose(source) {\n let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n if (typeof window.close !== \"function\") {\n const message = \"window.close() is not a function so 'close-window' scriptlet is unavailable\";\n logMessage(source, message);\n return;\n }\n const closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n logMessage(source, e);\n }\n };\n const closeByExtension = function closeByExtension() {\n const extCall = function extCall() {\n dispatchEvent(new Event(\"adguard:scriptlet-close-window\"));\n };\n window.addEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n }, 5e3);\n };\n const shouldClose = function shouldClose() {\n if (path === \"\") {\n return true;\n }\n const pathRegexp = toRegExp(path);\n const currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.indexOf(\"Chrome\") > -1) {\n closeByExtension();\n }\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n forceWindowClose.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function hideInShadowDom(source, args) {\n function hideInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n const hideElement = function hideElement(targetElement) {\n const DISPLAY_NONE_CSS = \"display:none!important;\";\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n const hideHandler = function hideHandler() {\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n while (hostElements.length !== 0) {\n let isHidden = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n hostElements = innerHosts;\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n const hosts = [];\n const domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n let targets = [];\n const innerHostsAcc = [];\n hostElements.forEach(function (host) {\n const simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n const shadowRootElem = host.shadowRoot;\n const shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n const innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n const stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n const res = [];\n while (stack.length) {\n const next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n hideInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function injectCssInShadowDom(source, args) {\n function injectCssInShadowDom(source, cssRule) {\n let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n if (!Element.prototype.attachShadow || typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n const callback = function callback(shadowRoot) {\n try {\n const stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n const styleTag = document.createElement(\"style\");\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function hijackAttachShadow(context, hostSelector, callback) {\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || \"*\")) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n const attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n injectCssInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function jsonPrune(source, args) {\n function jsonPrune(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const prunePaths = propsToRemove !== undefined && propsToRemove !== \"\" ? propsToRemove.split(/ +/) : [];\n const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== \"\" ? requiredInitialProps.split(/ +/) : [];\n function isPruningNeeded(root) {\n if (!root) {\n return false;\n }\n let shouldProcess;\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n const rootString = JSON.stringify(root);\n const matchRegex = toRegExp(requiredPaths.join(\"\"));\n const shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n for (let i = 0; i < requiredPaths.length; i += 1) {\n const requiredPath = requiredPaths[i];\n const lastNestedPropName = requiredPath.split(\".\").pop();\n const hasWildcard = requiredPath.indexOf(\".*.\") > -1 || requiredPath.indexOf(\"*.\") > -1 || requiredPath.indexOf(\".*\") > -1 || requiredPath.indexOf(\".[].\") > -1 || requiredPath.indexOf(\"[].\") > -1 || requiredPath.indexOf(\".[]\") > -1;\n const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n shouldProcess = !hasWildcard;\n for (let i = 0; i < details.length; i += 1) {\n if (hasWildcard) {\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess;\n } else {\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess;\n }\n }\n }\n return shouldProcess;\n }\n const jsonPruner = function jsonPruner(root) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(root) === false) {\n return root;\n }\n prunePaths.forEach(function (path) {\n const ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n };\n const nativeJSONParse = JSON.parse;\n const jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n const root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(root);\n };\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n const nativeResponseJson = Response.prototype.json;\n const responseJsonWrapper = function responseJsonWrapper() {\n const promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(obj);\n });\n };\n if (typeof Response === \"undefined\") {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getWildcardPropertyInChain(base, chain) {\n let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n if (chain === \"*\" || chain === \"[]\") {\n for (const key in base) {\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base: base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base: base,\n prop: chain\n });\n }\n return output;\n }\n const prop = chain.slice(0, pos);\n const shouldLookThrough = prop === \"[]\" && Array.isArray(base) || prop === \"*\" && base instanceof Object;\n if (shouldLookThrough) {\n const nextProp = chain.slice(pos + 1);\n const baseKeys = Object.keys(base);\n baseKeys.forEach(function (key) {\n const item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n jsonPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function log(source, args) {\n function log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n log.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logAddEventListener(source, args) {\n function logAddEventListener(source) {\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n const message = 'addEventListener(\"'.concat(type, '\", ').concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n }\n const message = \"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type), \"\\nlistener: \").concat(convertTypeToString(listener));\n logMessage(source, message, true);\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n function convertTypeToString(value) {\n let output;\n if (typeof value === \"undefined\") {\n output = \"undefined\";\n } else if (typeof value === \"object\") {\n if (value === null) {\n output = \"null\";\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logEval(source, args) {\n function logEval(source) {\n const nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, 'eval(\"'.concat(str, '\")'), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n const nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(\", \"), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logEval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logOnStacktrace(source, args) {\n function logOnStacktrace(source, property) {\n if (!property) {\n return;\n }\n const refineStackTrace = function refineStackTrace(stackString) {\n const stackSteps = stackString.split(\"\\n\").slice(2).map(function (line) {\n return line.replace(/ {4}at /, \"\");\n });\n const logInfoArray = stackSteps.map(function (line) {\n let funcName;\n let funcFullPath;\n const reg = /\\(([^\\)]+)\\)/;\n const regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(\" \").slice(0, -1).join(\" \");\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split(\"@\").slice(0, -1).join(\" \");\n funcFullPath = line.match(regFirefox)[2];\n } else {\n funcName = \"function name is not available\";\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n const logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let value = base[prop];\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n };\n setChainPropAccess(window, property);\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logOnStacktrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function m3uPrune(source, args) {\n function m3uPrune(source, propsToRemove, urlToMatch) {\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n let shouldPruneResponse = false;\n const urlMatchRegexp = toRegExp(urlToMatch);\n const SEGMENT_MARKER = \"#\";\n const AD_MARKER = {\n ASSET: \"#EXT-X-ASSET:\",\n CUE: \"#EXT-X-CUE:\",\n CUE_IN: \"#EXT-X-CUE-IN\",\n DISCONTINUITY: \"#EXT-X-DISCONTINUITY\",\n EXTINF: \"#EXTINF\",\n EXTM3U: \"#EXTM3U\",\n SCTE35: \"#EXT-X-SCTE35:\"\n };\n const COMCAST_AD_MARKER = {\n AD: \"-AD-\",\n VAST: \"-VAST-\",\n VMAP_AD: \"-VMAP-AD-\",\n VMAP_AD_BREAK: \"#EXT-X-VMAP-AD-BREAK:\"\n };\n const TAGS_ALLOWLIST = [\"#EXT-X-TARGETDURATION\", \"#EXT-X-MEDIA-SEQUENCE\", \"#EXT-X-DISCONTINUITY-SEQUENCE\", \"#EXT-X-ENDLIST\", \"#EXT-X-PLAYLIST-TYPE\", \"#EXT-X-I-FRAMES-ONLY\", \"#EXT-X-MEDIA\", \"#EXT-X-STREAM-INF\", \"#EXT-X-I-FRAME-STREAM-INF\", \"#EXT-X-SESSION-DATA\", \"#EXT-X-SESSION-KEY\", \"#EXT-X-INDEPENDENT-SEGMENTS\", \"#EXT-X-START\"];\n const isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n let array = lines.slice();\n let index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array: array,\n index: index\n };\n };\n const pruneVmapBlock = function pruneVmapBlock(lines) {\n let array = lines.slice();\n for (let i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n const removeM3ULineRegexp = toRegExp(propsToRemove);\n const pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n const pruneSegments = function pruneSegments(lines) {\n for (let i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n const segmentName = lines[i].substring(0, lines[i].indexOf(\":\"));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (let j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n const isM3U = function isM3U(text) {\n if (typeof text === \"string\") {\n const trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n const isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n const pruneM3U = function pruneM3U(text) {\n let lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === \"undefined\") {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== \"undefined\") {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== \"string\" || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener(\"readystatechange\", function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener(\"readystatechange\", pruneResponse);\n if (!propsToRemove) {\n if (isM3U(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n if (shouldPruneResponse) {\n const prunedResponseContent = pruneM3U(response);\n Object.defineProperty(thisArg, \"response\", {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, \"responseText\", {\n value: prunedResponseContent\n });\n hit(source);\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n const response = await nativeFetch(...args);\n const responseText = await response.text();\n if (!propsToRemove && isM3U(responseText)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n const prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return Reflect.apply(target, thisArg, args);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n m3uPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noTopics(source, args) {\n function noTopics(source) {\n const TOPICS_PROPERTY_NAME = \"browsingTopics\";\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve(\"[]\");\n };\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noTopics.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noeval(source, args) {\n function noeval(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noeval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function nowebrtc(source, args) {\n function nowebrtc(source) {\n let propertyName = \"\";\n if (window.RTCPeerConnection) {\n propertyName = \"RTCPeerConnection\";\n } else if (window.webkitRTCPeerConnection) {\n propertyName = \"webkitRTCPeerConnection\";\n }\n if (propertyName === \"\") {\n return;\n }\n const rtcReplacement = function rtcReplacement(config) {\n const message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n const rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function convertRtcConfigToString(config) {\n const UNDEF_STR = \"undefined\";\n let str = UNDEF_STR;\n if (config === null) {\n str = \"null\";\n } else if (config instanceof Object) {\n const SERVERS_PROP_NAME = \"iceServers\";\n const URLS_PROP_NAME = \"urls\";\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n nowebrtc.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAddEventListener(source, args) {\n function preventAddEventListener(source, typeSearch, listenerSearch) {\n const typeSearchRegexp = toRegExp(typeSearch);\n const listenerSearchRegexp = toRegExp(listenerSearch);\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n let shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAdfly(source, args) {\n function preventAdfly(source) {\n const isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n const handler = function handler(encodedURL) {\n let evenChars = \"\";\n let oddChars = \"\";\n for (let i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n let data = (evenChars + oddChars).split(\"\");\n for (let i = 0; i < data.length; i += 1) {\n if (isDigit(data[i])) {\n for (let ii = i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[i] = temp.toString();\n }\n i = ii;\n break;\n }\n }\n }\n }\n data = data.join(\"\");\n const decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n let val;\n let applyHandler = true;\n const result = setPropertyAccess(window, \"ysmm\", {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === \"string\") {\n handler(value);\n }\n } catch (err) {}\n }\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, \"Failed to set up prevent-adfly scriptlet\");\n }\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAdfly.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventBab(source, args) {\n function preventBab(source) {\n const nativeSetTimeout = window.setTimeout;\n const babRegex = /\\.bab_elementid.$/;\n const timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== \"string\" || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n const signatures = [[\"blockadblock\"], [\"babasbm\"], [/getItem\\('babn'\\)/], [\"getElementById\", \"String.fromCharCode\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\", \"charAt\", \"DOMContentLoaded\", \"AdBlock\", \"addEventListener\", \"doScroll\", \"fromCharCode\", \"<<2|r>>4\", \"sessionStorage\", \"clientWidth\", \"localStorage\", \"Math\", \"random\"]];\n const check = function check(str) {\n if (typeof str !== \"string\") {\n return false;\n }\n for (let i = 0; i < signatures.length; i += 1) {\n const tokens = signatures[i];\n let match = 0;\n for (let j = 0; j < tokens.length; j += 1) {\n const token = tokens[j];\n const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1;\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= .8) {\n return true;\n }\n }\n return false;\n };\n const nativeEval = window.eval;\n const evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n const bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty(\"visibility\");\n }\n const el = document.getElementById(\"babasbmsgx\");\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventBab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventElementSrcLoading(source, args) {\n function preventElementSrcLoading(source, tagName, match) {\n if (typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n const srcMockData = {\n script: \"data:text/javascript;base64,KCk9Pnt9\",\n img: \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",\n iframe: \"data:text/html;base64, PGRpdj48L2Rpdj4=\"\n };\n let instance;\n if (tagName === \"script\") {\n instance = HTMLScriptElement;\n } else if (tagName === \"img\") {\n instance = HTMLImageElement;\n } else if (tagName === \"iframe\") {\n instance = HTMLIFrameElement;\n } else {\n return;\n }\n const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === \"function\";\n let policy;\n if (hasTrustedTypes) {\n policy = window.trustedTypes.createPolicy(\"AGPolicy\", {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n const SOURCE_PROPERTY_NAME = \"src\";\n const ONERROR_PROPERTY_NAME = \"onerror\";\n const searchRegexp = toRegExp(match);\n const setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, \"matched\");\n };\n const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n const nodeName = thisArg.nodeName.toLowerCase();\n const attrName = args[0].toLowerCase();\n const attrValue = args[1];\n const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n const setAttributeHandler = {\n apply: setAttributeWrapper\n };\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n const nodeName = this.nodeName.toLowerCase();\n const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n if (policy && urlValue instanceof TrustedScriptURL) {\n const trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n const isMatched = this.getAttribute(source.name) === \"matched\";\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n const eventName = args[0];\n const isMatched = typeof thisArg.getAttribute === \"function\" && thisArg.getAttribute(source.name) === \"matched\" && eventName === \"error\";\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function safeGetDescriptor(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n }\n function noopFunc() {}\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventElementSrcLoading.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventEvalIf(source, args) {\n function preventEvalIf(source, search) {\n const searchRegexp = toRegExp(search);\n const nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventEvalIf.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFab(source, args) {\n function preventFab(source) {\n hit(source);\n const Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n const fab = new Fab();\n const getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n const getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n if (Object.prototype.hasOwnProperty.call(window, \"FuckAdBlock\")) {\n window.FuckAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"FuckAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"BlockAdBlock\")) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"BlockAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"SniffAdBlock\")) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"SniffAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"fuckAdBlock\")) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, \"fuckAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"blockAdBlock\")) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, \"blockAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"sniffAdBlock\")) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, \"sniffAdBlock\", getsetfab);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function noopThis() {\n return this;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFetch(source, args) {\n function preventFetch(source, propsToMatch) {\n let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"emptyObj\";\n let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"default\";\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n let strResponseBody;\n if (responseBody === \"\" || responseBody === \"emptyObj\") {\n strResponseBody = \"{}\";\n } else if (responseBody === \"emptyArr\") {\n strResponseBody = \"[]\";\n } else {\n return;\n }\n if (!(responseType === \"default\" || responseType === \"opaque\")) {\n logMessage(source, \"Invalid parameter: \".concat(responseType));\n return;\n }\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n let shouldPrevent = false;\n const fetchData = getFetchData(args);\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getFetchData(args) {\n const fetchPropsObj = {};\n let fetchUrl;\n let fetchInit;\n if (args[0] instanceof Request) {\n const requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n Object.keys(fetchInit).forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n const requestInitOptions = getRequestProps();\n const entries = requestInitOptions.map(function (key) {\n const value = request[key];\n return [key, value];\n });\n return getObjectFromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n function getObjectFromEntries(entries) {\n const output = entries.reduce(function (acc, el) {\n const key = el[0];\n const value = el[1];\n acc[key] = value;\n return acc;\n }, {});\n return output;\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFetch.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventPopadsNet(source, args) {\n function preventPopadsNet(source) {\n const rid = randomId();\n const throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventPopadsNet.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRefresh(source, args) {\n function preventRefresh(source, delaySec) {\n const getMetaElements = function getMetaElements() {\n let metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n const getMetaContentDelay = function getMetaContentDelay(metaElements) {\n const delays = metaElements.map(function (meta) {\n const contentString = meta.getAttribute(\"content\");\n if (contentString.length === 0) {\n return null;\n }\n let contentDelay;\n const limiterIndex = contentString.indexOf(\";\");\n if (limiterIndex !== -1) {\n const delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n if (!delays.length) {\n return null;\n }\n const minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n return minDelay;\n };\n const stop = function stop() {\n const metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n let secondsToRun = getNumberFromString(delaySec);\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n if (secondsToRun === null) {\n return;\n }\n const delayMs = secondsToRun * 1e3;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getNumberFromString(rawString) {\n const parsedDelay = parseInt(rawString, 10);\n const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRefresh.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRequestAnimationFrame(source, args) {\n function preventRequestAnimationFrame(source, match) {\n const nativeRequestAnimationFrame = window.requestAnimationFrame;\n const shouldLog = typeof match === \"undefined\";\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const rafWrapper = function rafWrapper(callback) {\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRequestAnimationFrame.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetInterval(source, args) {\n function preventSetInterval(source, matchCallback, matchDelay) {\n const shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n let callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n const _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n const parsedDelay = parseRawDelay(delay);\n let shouldPrevent = false;\n const callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n const INVERT_MARKER = \"!\";\n const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER);\n let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n delayValue = parseInt(delayValue, 10);\n const delayMatch = nativeIsNaN(delayValue) ? null : delayValue;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n const num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n const parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetTimeout(source, args) {\n function preventSetTimeout(source, matchCallback, matchDelay) {\n const shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n let callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n const _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n const parsedDelay = parseRawDelay(delay);\n let shouldPrevent = false;\n const callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n const INVERT_MARKER = \"!\";\n const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER);\n let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n delayValue = parseInt(delayValue, 10);\n const delayMatch = nativeIsNaN(delayValue) ? null : delayValue;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n const num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n const parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventWindowOpen(source, args) {\n function preventWindowOpen(source) {\n let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"*\";\n let delay = arguments.length > 2 ? arguments[2] : undefined;\n let replacement = arguments.length > 3 ? arguments[3] : undefined;\n const nativeOpen = window.open;\n const isNewSyntax = match !== \"0\" && match !== \"1\";\n const oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n const searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n const newOpenWrapper = function newOpenWrapper(url) {\n const shouldLog = replacement && replacement.indexOf(\"log\") > -1;\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n const argsStr = args && args.length > 0 ? \", \".concat(args.join(\", \")) : \"\";\n const message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n let shouldPrevent = false;\n if (match === \"*\") {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n const parsedDelay = parseInt(delay, 10);\n let result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n const decoyArgs = {\n replacement: replacement,\n url: url,\n delay: parsedDelay\n };\n const decoy = createDecoy(decoyArgs);\n let popup = decoy.contentWindow;\n if (typeof popup === \"object\" && popup !== null) {\n Object.defineProperty(popup, \"closed\", {\n value: false\n });\n Object.defineProperty(popup, \"opener\", {\n value: window\n });\n Object.defineProperty(popup, \"frameElement\", {\n value: null\n });\n } else {\n const nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, \"contentWindow\", {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidMatchStr(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function handleOldReplacement(replacement) {\n let result;\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === \"trueFunc\") {\n result = trueFunc;\n } else if (replacement.indexOf(\"=\") > -1) {\n const isProp = startsWith(replacement, \"{\") && endsWith(replacement, \"}\");\n if (isProp) {\n const propertyPart = replacement.slice(1, -1);\n const propertyName = substringBefore(propertyPart, \"=\");\n const propertyValue = substringAfter(propertyPart, \"=\");\n if (propertyValue === \"noopFunc\") {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n }\n function createDecoy(args) {\n const OBJECT_TAG_NAME = \"object\";\n const OBJECT_URL_PROP_NAME = \"data\";\n const IFRAME_TAG_NAME = \"iframe\";\n const IFRAME_URL_PROP_NAME = \"src\";\n const replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n let tag;\n let urlProp;\n if (replacement === \"obj\") {\n tag = OBJECT_TAG_NAME;\n urlProp = OBJECT_URL_PROP_NAME;\n } else {\n tag = IFRAME_TAG_NAME;\n urlProp = IFRAME_URL_PROP_NAME;\n }\n const decoy = document.createElement(tag);\n decoy[urlProp] = url;\n decoy.style.setProperty(\"height\", \"1px\", \"important\");\n decoy.style.setProperty(\"position\", \"fixed\", \"important\");\n decoy.style.setProperty(\"top\", \"-1px\", \"important\");\n decoy.style.setProperty(\"width\", \"1px\", \"important\");\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1e3);\n return decoy;\n }\n function getPreventGetter(nativeGetter) {\n const preventGetter = function preventGetter(target, prop) {\n if (prop && prop === \"closed\") {\n return false;\n }\n if (typeof nativeGetter === \"function\") {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n }\n function noopNull() {\n return null;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function noopFunc() {}\n function trueFunc() {\n return true;\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function endsWith(str, ending) {\n return !!str && str.lastIndexOf(ending) === str.length - ending.length;\n }\n function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n }\n function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? \"\" : str.substring(index + separator.length);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventWindowOpen.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventXHR(source, args) {\n function preventXHR(source, propsToMatch, customResponseText) {\n if (typeof Proxy === \"undefined\") {\n return;\n }\n let response = \"\";\n let responseText = \"\";\n let responseUrl;\n const openWrapper = function openWrapper(target, thisArg, args) {\n const xhrData = {\n method: args[0],\n url: args[1]\n };\n responseUrl = xhrData.url;\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === \"blob\") {\n response = new Blob();\n }\n if (thisArg.responseType === \"arraybuffer\") {\n response = new ArrayBuffer();\n }\n if (customResponseText) {\n const randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n responseText = randomText;\n } else {\n logMessage(source, \"Invalid range: \".concat(customResponseText));\n }\n }\n Object.defineProperties(thisArg, {\n readyState: {\n value: 4,\n writable: false\n },\n response: {\n value: response,\n writable: false\n },\n responseText: {\n value: responseText,\n writable: false\n },\n responseURL: {\n value: responseUrl,\n writable: false\n },\n responseXML: {\n value: \"\",\n writable: false\n },\n status: {\n value: 200,\n writable: false\n },\n statusText: {\n value: \"OK\",\n writable: false\n }\n });\n setTimeout(function () {\n const stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function generateRandomResponse(customResponseText) {\n let customResponse = customResponseText;\n if (customResponse === \"true\") {\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace(\"length:\", \"\");\n const rangeRegex = /^\\d+-\\d+$/;\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n let rangeMin = getNumberFromString(customResponse.split(\"-\")[0]);\n let rangeMax = getNumberFromString(customResponse.split(\"-\")[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n if (rangeMin > rangeMax) {\n const temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n const LENGTH_RANGE_LIMIT = 500 * 1e3;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n const length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n function getNumberFromString(rawString) {\n const parsedDelay = parseInt(rawString, 10);\n const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n function getRandomStrByLength(length) {\n let result = \"\";\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\";\n const charactersLength = characters.length;\n for (let i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventXHR.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeAttr(source, args) {\n function removeAttr(source, attrs, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join(\"],[\"), \"]\");\n }\n const rmattr = function rmattr() {\n let nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n let removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const flags = parseFlags(applying);\n const run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.indexOf(\" \") !== -1) {\n rmattr();\n }\n observeDOMChanges(rmattr, true);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n const FLAGS_DIVIDER = \" \";\n const ASAP_FLAG = \"asap\";\n const COMPLETE_FLAG = \"complete\";\n const STAY_FLAG = \"stay\";\n const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.indexOf(f) !== -1;\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.indexOf(flag) !== -1;\n }\n };\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeClass(source, args) {\n function removeClass(source, classNames, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n let selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n const removeClassHandler = function removeClassHandler() {\n const nodes = new Set();\n if (selector) {\n let foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n const elements = document.querySelectorAll(s);\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n nodes.add(element);\n }\n });\n }\n let removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const CLASS_ATTR_NAME = [\"class\"];\n const flags = parseFlags(applying);\n const run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.indexOf(\" \") !== -1) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n const FLAGS_DIVIDER = \" \";\n const ASAP_FLAG = \"asap\";\n const COMPLETE_FLAG = \"complete\";\n const STAY_FLAG = \"stay\";\n const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.indexOf(f) !== -1;\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.indexOf(flag) !== -1;\n }\n };\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeClass.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeCookie(source, args) {\n function removeCookie(source, match) {\n const matchRegexp = toRegExp(match);\n const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n const cookieSpec = \"\".concat(cookieName, \"=\");\n const domain1 = \"; domain=\".concat(hostName);\n const domain2 = \"; domain=.\".concat(hostName);\n const path = \"; path=/\";\n const expiration = \"; expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n const rmCookie = function rmCookie() {\n document.cookie.split(\";\").forEach(function (cookieStr) {\n const pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n const hostParts = document.location.hostname.split(\".\");\n for (let i = 0; i <= hostParts.length - 1; i += 1) {\n const hostName = hostParts.slice(i).join(\".\");\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener(\"beforeunload\", rmCookie);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeInShadowDom(source, args) {\n function removeInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n const removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n const removeHandler = function removeHandler() {\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n while (hostElements.length !== 0) {\n let isRemoved = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n hostElements = innerHosts;\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n const hosts = [];\n const domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n let targets = [];\n const innerHostsAcc = [];\n hostElements.forEach(function (host) {\n const simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n const shadowRootElem = host.shadowRoot;\n const shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n const innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n const stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n const res = [];\n while (stack.length) {\n const next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setAttr(source, args) {\n function setAttr(source, selector, attr) {\n let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (!selector || !attr) {\n return;\n }\n const allowedValues = [\"true\", \"false\"];\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n const setAttr = function setAttr() {\n const nodes = [].slice.call(document.querySelectorAll(selector));\n let set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setConstant(source, args) {\n function setConstant(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const emptyArr = noopArray();\n const emptyObj = noopObject();\n let constantValue;\n if (value === \"undefined\") {\n constantValue = undefined;\n } else if (value === \"false\") {\n constantValue = false;\n } else if (value === \"true\") {\n constantValue = true;\n } else if (value === \"null\") {\n constantValue = null;\n } else if (value === \"emptyArr\") {\n constantValue = emptyArr;\n } else if (value === \"emptyObj\") {\n constantValue = emptyObj;\n } else if (value === \"noopFunc\") {\n constantValue = noopFunc;\n } else if (value === \"noopCallbackFunc\") {\n constantValue = noopCallbackFunc;\n } else if (value === \"trueFunc\") {\n constantValue = trueFunc;\n } else if (value === \"falseFunc\") {\n constantValue = falseFunc;\n } else if (value === \"throwFunc\") {\n constantValue = throwFunc;\n } else if (value === \"noopPromiseResolve\") {\n constantValue = noopPromiseResolve;\n } else if (value === \"noopPromiseReject\") {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === \"-1\") {\n constantValue = -1;\n } else if (value === \"\") {\n constantValue = \"\";\n } else if (value === \"yes\") {\n constantValue = \"yes\";\n } else if (value === \"no\") {\n constantValue = \"no\";\n } else {\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function noopArray() {\n return [];\n }\n function noopObject() {\n return {};\n }\n function noopFunc() {}\n function noopCallbackFunc() {\n return noopFunc;\n }\n function trueFunc() {\n return true;\n }\n function falseFunc() {\n return false;\n }\n function throwFunc() {\n throw new Error();\n }\n function noopPromiseReject() {\n return Promise.reject();\n }\n function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookie(source, args) {\n function setCookie(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n let validValue;\n if (value === \"true\") {\n validValue = \"true\";\n } else if (value === \"True\") {\n validValue = \"True\";\n } else if (value === \"false\") {\n validValue = \"false\";\n } else if (value === \"False\") {\n validValue = \"False\";\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"Yes\") {\n validValue = \"Yes\";\n } else if (value === \"Y\") {\n validValue = \"Y\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"ok\") {\n validValue = \"ok\";\n } else if (value === \"OK\") {\n validValue = \"OK\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookieReload(source, args) {\n function setCookieReload(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n const pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n let validValue;\n if (value === \"true\") {\n validValue = \"true\";\n } else if (value === \"True\") {\n validValue = \"True\";\n } else if (value === \"false\") {\n validValue = \"false\";\n } else if (value === \"False\") {\n validValue = \"False\";\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"Yes\") {\n validValue = \"Yes\";\n } else if (value === \"Y\") {\n validValue = \"Y\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"ok\") {\n validValue = \"ok\";\n } else if (value === \"OK\") {\n validValue = \"OK\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setLocalStorageItem(source, args) {\n function setLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, validValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n let validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setPopadsDummy(source, args) {\n function setPopadsDummy(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setPopadsDummy.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setSessionStorageItem(source, args) {\n function setSessionStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n sessionStorage = _window.sessionStorage;\n setStorageItem(source, sessionStorage, key, validValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n let validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setSessionStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedClickElement(source, args) {\n function trustedClickElement(source, selectors) {\n let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n const OBSERVER_TIMEOUT_MS = 1e4;\n const THROTTLE_DELAY_MS = 20;\n const STATIC_CLICK_DELAY_MS = 150;\n const COOKIE_MATCH_MARKER = \"cookie:\";\n const LOCAL_STORAGE_MATCH_MARKER = \"localStorage:\";\n const SELECTORS_DELIMITER = \",\";\n const COOKIE_STRING_DELIMITER = \";\";\n const EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n const sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n let parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n const message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n let canClick = !parsedDelay;\n const cookieMatches = [];\n const localStorageMatches = [];\n let isInvertedMatchCookie = false;\n let isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) {\n const _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, \"\");\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) {\n const _parseMatchArg2 = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = isInvertedMatch;\n const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, \"\");\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n const parsedCookies = parseCookieString(document.cookie);\n const cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n const keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n const keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n const shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n const localStorageMatched = localStorageMatches.every(function (str) {\n const itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === \"\";\n });\n const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!shouldRun) {\n return;\n }\n }\n let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n const createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n const elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n const clickElementsBySequence = async function clickElementsBySequence() {\n for (let i = 0; i < elementsSequence.length; i += 1) {\n const elementObj = elementsSequence[i];\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n if (!elementObj.element) {\n break;\n }\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n const allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n hit(source);\n }\n };\n const handleElement = function handleElement(element, i) {\n const elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n const findElements = function findElements(mutations, observer) {\n const fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n const element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.indexOf(selector) === -1 ? selector : null;\n });\n const allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function parseCookieString(cookieString) {\n const COOKIE_DELIMITER = \"=\";\n const COOKIE_PAIRS_DELIMITER = \";\";\n const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n const cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n let cookieKey;\n let cookieValue;\n const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedClickElement.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceFetchResponse(source, args) {\n function trustedReplaceFetchResponse(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n logMessage(source, \"Pattern argument should not be empty string\");\n return;\n }\n const shouldLog = pattern === \"\" && replacement === \"\";\n const nativeFetch = fetch;\n let shouldReplace = false;\n let fetchData;\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n const forgeResponse = function forgeResponse(response, textContent) {\n const bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n const forgedResponse = new Response(textContent, {\n status: status,\n statusText: statusText,\n headers: headers\n });\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n const patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n const forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n const fetchDataStr = objectToString(fetchData);\n const message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function getFetchData(args) {\n const fetchPropsObj = {};\n let fetchUrl;\n let fetchInit;\n if (args[0] instanceof Request) {\n const requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n Object.keys(fetchInit).forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n const requestInitOptions = getRequestProps();\n const entries = requestInitOptions.map(function (key) {\n const value = request[key];\n return [key, value];\n });\n return getObjectFromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n function getObjectFromEntries(entries) {\n const output = entries.reduce(function (acc, el) {\n const key = el[0];\n const value = el[1];\n acc[key] = value;\n return acc;\n }, {});\n return output;\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceFetchResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceXhrResponse(source, args) {\n function trustedReplaceXhrResponse(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof Proxy === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n const message = \"Pattern argument should not be empty string.\";\n logMessage(source, message);\n return;\n }\n const shouldLog = pattern === \"\" && replacement === \"\";\n const nativeOpen = window.XMLHttpRequest.prototype.open;\n const nativeSend = window.XMLHttpRequest.prototype.send;\n let xhrData;\n const openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n const message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n const setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n const forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n const readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n const content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n const patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedContent = content.replace(patternRegexp, replacement);\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState\n },\n response: {\n value: modifiedContent\n },\n responseText: {\n value: modifiedContent\n },\n responseURL: {\n value: responseURL\n },\n responseXML: {\n value: responseXML\n },\n status: {\n value: status\n },\n statusText: {\n value: statusText\n }\n });\n setTimeout(function () {\n const stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n const name = header[0];\n const value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceXhrResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetConstant(source, args) {\n function trustedSetConstant(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n let constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function inferValue(value) {\n if (value === \"undefined\") {\n return undefined;\n }\n if (value === \"false\") {\n return false;\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"null\") {\n return null;\n }\n if (value === \"NaN\") {\n return NaN;\n }\n const MAX_ALLOWED_NUM = 32767;\n const numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error(\"number values bigger than 32767 are not allowed\");\n }\n return numVal;\n }\n let errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n const parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === \"string\") {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookie(source, args) {\n function trustedSetCookie(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n const ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n const ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n const MS_IN_SEC = 1e3;\n const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n const SECONDS_IN_DAY = 24 * 60 * 60;\n let parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = \"$now$\";\n const CURRENT_DATE_KEYWORD = \"$currentDate$\";\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookieReload(source, args) {\n function trustedSetCookieReload(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n const pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n const ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n const ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n const MS_IN_SEC = 1e3;\n const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n const SECONDS_IN_DAY = 24 * 60 * 60;\n let parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = \"$now$\";\n const CURRENT_DATE_KEYWORD = \"$currentDate$\";\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetLocalStorageItem(source, args) {\n function trustedSetLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Item value should be specified\");\n return;\n }\n const parsedValue = parseKeywordValue(value);\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = \"$now$\";\n const CURRENT_DATE_KEYWORD = \"$currentDate$\";\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function xmlPrune(source, args) {\n function xmlPrune(source, propsToRemove) {\n var _this = this;\n let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let urlToMatch = arguments.length > 3 ? arguments[3] : undefined;\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n let shouldPruneResponse = true;\n if (!propsToRemove) {\n shouldPruneResponse = false;\n }\n const urlMatchRegexp = toRegExp(urlToMatch);\n const isXML = function isXML(text) {\n if (typeof text === \"string\") {\n const trimedText = text.trim();\n if (trimedText.startsWith(\"<\") && trimedText.endsWith(\">\")) {\n return true;\n }\n }\n return false;\n };\n const createXMLDocument = function createXMLDocument(text) {\n const xmlParser = new DOMParser();\n const xmlDocument = xmlParser.parseFromString(text, \"text/xml\");\n return xmlDocument;\n };\n const pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n const xmlDoc = createXMLDocument(text);\n const errorNode = xmlDoc.querySelector(\"parsererror\");\n if (errorNode) {\n return text;\n }\n if (optionalProp !== \"\" && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n const elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n const serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== \"string\" || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener(\"readystatechange\", function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener(\"readystatechange\", pruneResponse);\n if (!shouldPruneResponse) {\n if (isXML(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n const prunedResponseContent = pruneXML(response);\n if (shouldPruneResponse) {\n Object.defineProperty(thisArg, \"response\", {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, \"responseText\", {\n value: prunedResponseContent\n });\n hit(source);\n }\n shouldPruneResponse = true;\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n return nativeFetch.apply(_this, args).then(function (response) {\n return response.text().then(function (text) {\n if (!shouldPruneResponse) {\n if (isXML(text)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(text);\n logMessage(source, message);\n logMessage(source, createXMLDocument(text), true, false);\n }\n return Reflect.apply(target, thisArg, args);\n }\n const prunedText = pruneXML(text);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n shouldPruneResponse = true;\n return Reflect.apply(target, thisArg, args);\n });\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n xmlPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n const scriptletsMap = {\n \"abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-current-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script.js\": abortCurrentInlineScript,\n \"acs.js\": abortCurrentInlineScript,\n \"ubo-acs.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script\": abortCurrentInlineScript,\n \"ubo-acs\": abortCurrentInlineScript,\n \"abort-current-inline-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script.js\": abortCurrentInlineScript,\n \"acis.js\": abortCurrentInlineScript,\n \"ubo-acis.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script\": abortCurrentInlineScript,\n \"ubo-acis\": abortCurrentInlineScript,\n \"abp-abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-read.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read.js\": abortOnPropertyRead,\n \"aopr.js\": abortOnPropertyRead,\n \"ubo-aopr.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read\": abortOnPropertyRead,\n \"ubo-aopr\": abortOnPropertyRead,\n \"abp-abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-property-write.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write.js\": abortOnPropertyWrite,\n \"aopw.js\": abortOnPropertyWrite,\n \"ubo-aopw.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write\": abortOnPropertyWrite,\n \"ubo-aopw\": abortOnPropertyWrite,\n \"abp-abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-stack-trace\": abortOnStackTrace,\n \"abort-on-stack-trace.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace.js\": abortOnStackTrace,\n \"aost.js\": abortOnStackTrace,\n \"ubo-aost.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace\": abortOnStackTrace,\n \"ubo-aost\": abortOnStackTrace,\n \"abp-abort-on-stack-trace\": abortOnStackTrace,\n \"adjust-setInterval\": adjustSetInterval,\n \"nano-setInterval-booster.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster.js\": adjustSetInterval,\n \"nano-sib.js\": adjustSetInterval,\n \"ubo-nano-sib.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster\": adjustSetInterval,\n \"ubo-nano-sib\": adjustSetInterval,\n \"adjust-setTimeout\": adjustSetTimeout,\n \"nano-setTimeout-booster.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster.js\": adjustSetTimeout,\n \"nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster\": adjustSetTimeout,\n \"ubo-nano-stb\": adjustSetTimeout,\n \"debug-current-inline-script\": debugCurrentInlineScript,\n \"debug-on-property-read\": debugOnPropertyRead,\n \"debug-on-property-write\": debugOnPropertyWrite,\n \"dir-string\": dirString,\n \"abp-dir-string\": dirString,\n \"disable-newtab-links\": disableNewtabLinks,\n \"disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links\": disableNewtabLinks,\n \"close-window\": forceWindowClose,\n \"window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if\": forceWindowClose,\n \"hide-in-shadow-dom\": hideInShadowDom,\n \"inject-css-in-shadow-dom\": injectCssInShadowDom,\n \"json-prune\": jsonPrune,\n \"json-prune.js\": jsonPrune,\n \"ubo-json-prune.js\": jsonPrune,\n \"ubo-json-prune\": jsonPrune,\n \"abp-json-prune\": jsonPrune,\n log: log,\n \"log-addEventListener\": logAddEventListener,\n \"addEventListener-logger.js\": logAddEventListener,\n \"ubo-addEventListener-logger.js\": logAddEventListener,\n \"aell.js\": logAddEventListener,\n \"ubo-aell.js\": logAddEventListener,\n \"ubo-addEventListener-logger\": logAddEventListener,\n \"ubo-aell\": logAddEventListener,\n \"log-eval\": logEval,\n \"log-on-stack-trace\": logOnStacktrace,\n \"m3u-prune\": m3uPrune,\n \"m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune\": m3uPrune,\n \"no-topics\": noTopics,\n noeval: noeval,\n \"noeval.js\": noeval,\n \"silent-noeval.js\": noeval,\n \"ubo-noeval.js\": noeval,\n \"ubo-silent-noeval.js\": noeval,\n \"ubo-noeval\": noeval,\n \"ubo-silent-noeval\": noeval,\n nowebrtc: nowebrtc,\n \"nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc\": nowebrtc,\n \"prevent-addEventListener\": preventAddEventListener,\n \"addEventListener-defuser.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser.js\": preventAddEventListener,\n \"aeld.js\": preventAddEventListener,\n \"ubo-aeld.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser\": preventAddEventListener,\n \"ubo-aeld\": preventAddEventListener,\n \"prevent-adfly\": preventAdfly,\n \"adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser\": preventAdfly,\n \"prevent-bab\": preventBab,\n \"prevent-element-src-loading\": preventElementSrcLoading,\n \"prevent-eval-if\": preventEvalIf,\n \"noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if\": preventEvalIf,\n \"prevent-fab-3.2.0\": preventFab,\n \"nofab.js\": preventFab,\n \"ubo-nofab.js\": preventFab,\n \"fuckadblock.js-3.2.0\": preventFab,\n \"ubo-fuckadblock.js-3.2.0\": preventFab,\n \"ubo-nofab\": preventFab,\n \"prevent-fetch\": preventFetch,\n \"no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if\": preventFetch,\n \"prevent-popads-net\": preventPopadsNet,\n \"popads.net.js\": preventPopadsNet,\n \"ubo-popads.net.js\": preventPopadsNet,\n \"ubo-popads.net\": preventPopadsNet,\n \"prevent-refresh\": preventRefresh,\n \"refresh-defuser.js\": preventRefresh,\n \"refresh-defuser\": preventRefresh,\n \"ubo-refresh-defuser.js\": preventRefresh,\n \"ubo-refresh-defuser\": preventRefresh,\n \"prevent-requestAnimationFrame\": preventRequestAnimationFrame,\n \"no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"norafif.js\": preventRequestAnimationFrame,\n \"ubo-norafif.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if\": preventRequestAnimationFrame,\n \"ubo-norafif\": preventRequestAnimationFrame,\n \"prevent-setInterval\": preventSetInterval,\n \"no-setInterval-if.js\": preventSetInterval,\n \"ubo-no-setInterval-if.js\": preventSetInterval,\n \"setInterval-defuser.js\": preventSetInterval,\n \"ubo-setInterval-defuser.js\": preventSetInterval,\n \"nosiif.js\": preventSetInterval,\n \"ubo-nosiif.js\": preventSetInterval,\n \"sid.js\": preventSetInterval,\n \"ubo-sid.js\": preventSetInterval,\n \"ubo-no-setInterval-if\": preventSetInterval,\n \"ubo-setInterval-defuser\": preventSetInterval,\n \"ubo-nosiif\": preventSetInterval,\n \"ubo-sid\": preventSetInterval,\n \"prevent-setTimeout\": preventSetTimeout,\n \"no-setTimeout-if.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if.js\": preventSetTimeout,\n \"nostif.js\": preventSetTimeout,\n \"ubo-nostif.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if\": preventSetTimeout,\n \"ubo-nostif\": preventSetTimeout,\n \"setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser\": preventSetTimeout,\n \"std.js\": preventSetTimeout,\n \"ubo-std.js\": preventSetTimeout,\n \"ubo-std\": preventSetTimeout,\n \"prevent-window-open\": preventWindowOpen,\n \"window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser\": preventWindowOpen,\n \"nowoif.js\": preventWindowOpen,\n \"ubo-nowoif.js\": preventWindowOpen,\n \"ubo-nowoif\": preventWindowOpen,\n \"prevent-xhr\": preventXHR,\n \"no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if\": preventXHR,\n \"remove-attr\": removeAttr,\n \"remove-attr.js\": removeAttr,\n \"ubo-remove-attr.js\": removeAttr,\n \"ra.js\": removeAttr,\n \"ubo-ra.js\": removeAttr,\n \"ubo-remove-attr\": removeAttr,\n \"ubo-ra\": removeAttr,\n \"remove-class\": removeClass,\n \"remove-class.js\": removeClass,\n \"ubo-remove-class.js\": removeClass,\n \"rc.js\": removeClass,\n \"ubo-rc.js\": removeClass,\n \"ubo-remove-class\": removeClass,\n \"ubo-rc\": removeClass,\n \"remove-cookie\": removeCookie,\n \"cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover\": removeCookie,\n \"remove-in-shadow-dom\": removeInShadowDom,\n \"set-attr\": setAttr,\n \"set-constant\": setConstant,\n \"set-constant.js\": setConstant,\n \"ubo-set-constant.js\": setConstant,\n \"set.js\": setConstant,\n \"ubo-set.js\": setConstant,\n \"ubo-set-constant\": setConstant,\n \"ubo-set\": setConstant,\n \"abp-override-property-read\": setConstant,\n \"set-cookie\": setCookie,\n \"set-cookie-reload\": setCookieReload,\n \"set-local-storage-item\": setLocalStorageItem,\n \"set-popads-dummy\": setPopadsDummy,\n \"popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy\": setPopadsDummy,\n \"set-session-storage-item\": setSessionStorageItem,\n \"trusted-click-element\": trustedClickElement,\n \"trusted-replace-fetch-response\": trustedReplaceFetchResponse,\n \"trusted-replace-xhr-response\": trustedReplaceXhrResponse,\n \"trusted-set-constant\": trustedSetConstant,\n \"trusted-set-cookie\": trustedSetCookie,\n \"trusted-set-cookie-reload\": trustedSetCookieReload,\n \"trusted-set-local-storage-item\": trustedSetLocalStorageItem,\n \"xml-prune\": xmlPrune,\n \"xml-prune.js\": xmlPrune,\n \"ubo-xml-prune.js\": xmlPrune,\n \"ubo-xml-prune\": xmlPrune\n };\n var getScriptletFunction = function getScriptletFunction(name) {\n return scriptletsMap[name];\n };\n\n /**\n * @typedef {Object} Source Scriptlet properties.\n * @property {string} name Scriptlet name.\n * @property {Array} args Arguments for scriptlet function.\n * @property {'extension'|'corelibs'|'test'} engine Defines the final form of scriptlet string presentation.\n * @property {string} [version] Extension version.\n * @property {boolean} [verbose] Flag to enable debug information printing to console.\n * @property {string} [ruleText] Source rule text, needed for debug purposes.\n * @property {string} [domainName] Domain name where scriptlet is applied, needed for debug purposes.\n */\n\n /**\n * Returns scriptlet code by `source`.\n *\n * @param {Source} source Scriptlet properties.\n *\n * @returns {string|null} Scriptlet code.\n * @throws An error on unknown scriptlet name.\n */\n function getScriptletCode(source) {\n if (!validator.isValidScriptletName(source.name)) {\n return null;\n }\n const scriptletFunction = getScriptletFunction(source.name);\n // In case isValidScriptletName check will pass invalid scriptlet name,\n // for example when there is a bad alias\n if (typeof scriptletFunction !== 'function') {\n throw new Error(\"Error: cannot invoke scriptlet with name: '\".concat(source.name, \"'\"));\n }\n const scriptletFunctionString = scriptletFunction.toString();\n const result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString);\n return result;\n }\n\n /**\n * Scriptlets variable\n *\n * @returns {Object} object with methods:\n * `invoke` method receives one argument with `Source` type\n * `validate` method receives one argument with `String` type\n */\n const scriptletsObject = function () {\n return {\n invoke: getScriptletCode,\n getScriptletFunction,\n isValidScriptletName: validator.isValidScriptletName,\n isValidScriptletRule,\n isAdgScriptletRule: validator.isAdgScriptletRule,\n isUboScriptletRule: validator.isUboScriptletRule,\n isAbpSnippetRule: validator.isAbpSnippetRule,\n convertUboToAdg: convertUboScriptletToAdg,\n convertAbpToAdg: convertAbpSnippetToAdg,\n convertScriptletToAdg,\n convertAdgToUbo: convertAdgScriptletToUbo,\n redirects\n };\n }();\n\n /**\n * Add module exports to be used as node package\n */\n module.exports = scriptletsObject;\n\n}));\n\n/**\n * -------------------------------------------\n * | |\n * | If you want to add your own scriptlet |\n * | please put your code below |\n * | |\n * -------------------------------------------\n */\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.bowser=t():e.bowser=t()}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\"a\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\"\",r(r.s=90)}({17:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n=r(18),i=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||\"\"},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||\"\"},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}},e.getMacOSVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return\"Leopard\";case 6:return\"Snow Leopard\";case 7:return\"Lion\";case 8:return\"Mountain Lion\";case 9:return\"Mavericks\";case 10:return\"Yosemite\";case 11:return\"El Capitan\";case 12:return\"Sierra\";case 13:return\"High Sierra\";case 14:return\"Mojave\";case 15:return\"Catalina\";default:return}},e.getAndroidVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?\"Cupcake\":1===t[0]&&t[1]>=6?\"Donut\":2===t[0]&&t[1]<2?\"Eclair\":2===t[0]&&2===t[1]?\"Froyo\":2===t[0]&&t[1]>2?\"Gingerbread\":3===t[0]?\"Honeycomb\":4===t[0]&&t[1]<1?\"Ice Cream Sandwich\":4===t[0]&&t[1]<4?\"Jelly Bean\":4===t[0]&&t[1]>=4?\"KitKat\":5===t[0]?\"Lollipop\":6===t[0]?\"Marshmallow\":7===t[0]?\"Nougat\":8===t[0]?\"Oreo\":9===t[0]?\"Pie\":void 0},e.getVersionPrecision=function(e){return e.split(\".\").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),a=Math.max(i,s),o=0,u=e.map([t,r],(function(t){var r=a-e.getVersionPrecision(t),n=t+new Array(r+1).join(\".0\");return e.map(n.split(\".\"),(function(e){return new Array(20-e.length).join(\"0\")+e})).reverse()}));for(n&&(o=a-Math.min(i,s)),a-=1;a>=o;){if(u[0][a]>u[1][a])return 1;if(u[0][a]===u[1][a]){if(a===o)return 0;a-=1}else if(u[0][a]1?i-1:0),a=1;a0){var a=Object.keys(r),u=o.default.find(a,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=o.default.find(a,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(s>0){var l=Object.keys(i),h=o.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(i[h])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=o.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if(\"string\"==typeof i)return\">\"===e[0]||\"<\"===e[0]?(r=e.substr(1),\"=\"===e[1]?(n=!0,r=e.substr(2)):t=[],\">\"===e[0]?t.push(1):t.push(-1)):\"=\"===e[0]?r=e.substr(1):\"~\"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(o.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\\/(\\d+(\\.?_?\\d+)+)/i,a=[{test:[/googlebot/i],describe:function(e){var t={name:\"Googlebot\"},r=i.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\\/|opios/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:\"Samsung Internet for Android\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:\"NAVER Whale Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:\"MZ Browser\"},r=i.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:\"Focus\"},r=i.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:\"Swing\"},r=i.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:\"Opera Coast\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\\/\\d+(?:.?_?\\d+)+/i],describe:function(e){var t={name:\"Opera Touch\"},r=i.default.getFirstMatch(/(?:opt)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:\"Yandex Browser\"},r=i.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:\"UC Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:\"Maxthon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:\"Epiphany\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:\"Puffin\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:\"Sleipnir\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:\"K-Meleon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:\"WeChat\"},r=i.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?\"QQ Browser Lite\":\"QQ Browser\"},r=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:\"Internet Explorer\"},r=i.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\\sedg\\//i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:\"Vivaldi\"},r=i.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:\"SeaMonkey\"},r=i.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:\"Sailfish\"},r=i.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:\"Amazon Silk\"},r=i.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:\"PhantomJS\"},r=i.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:\"SlimerJS\"},r=i.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t={name:\"BlackBerry\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:\"WebOS Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:\"Bada\"},r=i.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:\"Tizen\"},r=i.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:\"QupZilla\"},r=i.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:\"Firefox\"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:\"Electron\"},r=i.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:\"Miui\"},r=i.default.getFirstMatch(/(?:MiuiBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:\"Chromium\"},r=i.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:\"Chrome\"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:\"Google Search\"},r=i.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:\"Android Browser\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:\"PlayStation 4\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:\"Safari\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search(\"\\\\(\")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=a,e.exports=t.default},93:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/Roku\\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,e);return{name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,e),r=i.default.getWindowsVersionName(t);return{name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(e){var t={name:s.OS_MAP.iOS},r=i.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,e).replace(/[_\\s]/g,\".\"),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,e).replace(/[_\\s]/g,\".\");return{name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,e)||i.default.getFirstMatch(/\\bbb(\\d+)/i,e);return{name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.PlayStation4,version:t}}}];t.default=a,e.exports=t.default},94:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/googlebot/i],describe:function(){return{type:\"bot\",vendor:\"Google\"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&\"Nova\",r={type:s.PLATFORMS_MAP.mobile,vendor:\"Huawei\"};return t&&(r.model=t),r}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Nexus\"}}},{test:[/ipad/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/kftt build/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\",model:\"Kindle Fire HD 7\"}}},{test:[/silk/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:s.PLATFORMS_MAP.mobile,vendor:\"Apple\",model:t}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Nexus\"}}},{test:[/[^-]mobi/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"blackberry\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"BlackBerry\"}}},{test:function(e){return\"bada\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"windows phone\"===e.getBrowserName()},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Microsoft\"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(\".\")[0]);return\"android\"===e.getOSName(!0)&&t>=3},describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return\"android\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"macos\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop,vendor:\"Apple\"}}},{test:function(e){return\"windows\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"linux\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"playstation 4\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}},{test:function(e){return\"roku\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}}];t.default=a,e.exports=t.default},95:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:function(e){return\"microsoft edge\"===e.getBrowserName(!0)},describe:function(e){if(/\\sedg\\//i.test(e))return{name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,e);return{name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=a,e.exports=t.default}})}));","var isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw $TypeError(tryToString(argument) + ' is not a function');\n};\n","var isCallable = require('../internals/is-callable');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (typeof argument == 'object' || isCallable(argument)) return argument;\n throw $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw $TypeError($String(argument) + ' is not an object');\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar isArray = require('../internals/is-array');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Safari < 13 does not throw an error in this case\nvar SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {\n // makes no sense without proper strict mode support\n if (this !== undefined) return true;\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).length = 1;\n } catch (error) {\n return error instanceof TypeError;\n }\n}();\n\nmodule.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {\n if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {\n throw $TypeError('Cannot set read only .length');\n } return O.length = length;\n} : function (O, length) {\n return O.length = length;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","var hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","var global = require('../internals/global');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(global, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var documentAll = typeof document == 'object' && document.all;\n\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nvar IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined;\n\nmodule.exports = {\n all: documentAll,\n IS_HTMLDDA: IS_HTMLDDA\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n","module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar $Error = Error;\nvar replace = uncurryThis(''.replace);\n\nvar TEST = (function (arg) { return String($Error(arg).stack); })('zxcasd');\n// eslint-disable-next-line redos/no-vulnerable -- safe\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\n\nmodule.exports = function (stack, dropEntries) {\n if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {\n while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n } return stack;\n};\n","var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar clearErrorStack = require('../internals/error-stack-clear');\nvar ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');\n\n// non-standard V8\nvar captureStackTrace = Error.captureStackTrace;\n\nmodule.exports = function (error, C, stack, dropEntries) {\n if (ERROR_STACK_INSTALLABLE) {\n if (captureStackTrace) captureStackTrace(error, C);\n else createNonEnumerableProperty(error, 'stack', clearErrorStack(stack, dropEntries));\n }\n};\n","var fails = require('../internals/fails');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = !fails(function () {\n var error = Error('a');\n if (!('stack' in error)) return true;\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));\n return error.stack !== 7;\n});\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","var aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || this || Function('return this')();\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","module.exports = {};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","var isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\n// `InstallErrorCause` abstract operation\n// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause\nmodule.exports = function (O, options) {\n if (isObject(options) && 'cause' in options) {\n createNonEnumerableProperty(O, 'cause', options.cause);\n }\n};\n","var NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) == 'Array';\n};\n","var $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = $documentAll.IS_HTMLDDA ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","var isCallable = require('../internals/is-callable');\nvar $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\nmodule.exports = $documentAll.IS_HTMLDDA ? function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll;\n} : function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","module.exports = false;\n","var getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","var toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","var toString = require('../internals/to-string');\n\nmodule.exports = function (argument, $default) {\n return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n","/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw $TypeError(\"Can't convert object to primitive value\");\n};\n","var getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","var defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (Target, Source, key) {\n key in Target || defineProperty(Target, key, {\n configurable: true,\n get: function () { return Source[key]; },\n set: function (it) { Source[key] = it; }\n });\n};\n","var isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || defineGlobalProperty(SHARED, {});\n\nmodule.exports = store;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.30.2',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar $String = global.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","var call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","var $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype != 42;\n});\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = global.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar hasOwn = require('../internals/has-own-property');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar proxyAccessor = require('../internals/proxy-accessor');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar normalizeStringArgument = require('../internals/normalize-string-argument');\nvar installErrorCause = require('../internals/install-error-cause');\nvar installErrorStack = require('../internals/error-stack-install');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nmodule.exports = function (FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) {\n var STACK_TRACE_LIMIT = 'stackTraceLimit';\n var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1;\n var path = FULL_NAME.split('.');\n var ERROR_NAME = path[path.length - 1];\n var OriginalError = getBuiltIn.apply(null, path);\n\n if (!OriginalError) return;\n\n var OriginalErrorPrototype = OriginalError.prototype;\n\n // V8 9.3- bug https://bugs.chromium.org/p/v8/issues/detail?id=12006\n if (!IS_PURE && hasOwn(OriginalErrorPrototype, 'cause')) delete OriginalErrorPrototype.cause;\n\n if (!FORCED) return OriginalError;\n\n var BaseError = getBuiltIn('Error');\n\n var WrappedError = wrapper(function (a, b) {\n var message = normalizeStringArgument(IS_AGGREGATE_ERROR ? b : a, undefined);\n var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError();\n if (message !== undefined) createNonEnumerableProperty(result, 'message', message);\n installErrorStack(result, WrappedError, result.stack, 2);\n if (this && isPrototypeOf(OriginalErrorPrototype, this)) inheritIfRequired(result, this, WrappedError);\n if (arguments.length > OPTIONS_POSITION) installErrorCause(result, arguments[OPTIONS_POSITION]);\n return result;\n });\n\n WrappedError.prototype = OriginalErrorPrototype;\n\n if (ERROR_NAME !== 'Error') {\n if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError);\n else copyConstructorProperties(WrappedError, BaseError, { name: true });\n } else if (DESCRIPTORS && STACK_TRACE_LIMIT in OriginalError) {\n proxyAccessor(WrappedError, OriginalError, STACK_TRACE_LIMIT);\n proxyAccessor(WrappedError, OriginalError, 'prepareStackTrace');\n }\n\n copyConstructorProperties(WrappedError, OriginalError);\n\n if (!IS_PURE) try {\n // Safari 13- bug: WebAssembly errors does not have a proper `.name`\n if (OriginalErrorPrototype.name !== ERROR_NAME) {\n createNonEnumerableProperty(OriginalErrorPrototype, 'name', ERROR_NAME);\n }\n OriginalErrorPrototype.constructor = WrappedError;\n } catch (error) { /* empty */ }\n\n return WrappedError;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.at` method\n// https://github.com/tc39/proposal-relative-indexing-method\n$({ target: 'Array', proto: true }, {\n at: function at(index) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var relativeIndex = toIntegerOrInfinity(index);\n var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;\n return (k < 0 || k >= len) ? undefined : O[k];\n }\n});\n\naddToUnscopables('at');\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar setArrayLength = require('../internals/array-set-length');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar fails = require('../internals/fails');\n\nvar INCORRECT_TO_LENGTH = fails(function () {\n return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;\n});\n\n// V8 and Safari <= 15.4, FF < 23 throws InternalError\n// https://bugs.chromium.org/p/v8/issues/detail?id=12681\nvar properErrorOnNonWritableLength = function () {\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).push();\n } catch (error) {\n return error instanceof TypeError;\n }\n};\n\nvar FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();\n\n// `Array.prototype.push` method\n// https://tc39.es/ecma262/#sec-array.prototype.push\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n push: function push(item) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var argCount = arguments.length;\n doesNotExceedSafeInteger(len + argCount);\n for (var i = 0; i < argCount; i++) {\n O[len] = arguments[i];\n len++;\n }\n setArrayLength(O, len);\n return len;\n }\n});\n","/* eslint-disable no-unused-vars -- required for functions `.length` */\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar apply = require('../internals/function-apply');\nvar wrapErrorConstructorWithCause = require('../internals/wrap-error-constructor-with-cause');\n\nvar WEB_ASSEMBLY = 'WebAssembly';\nvar WebAssembly = global[WEB_ASSEMBLY];\n\nvar FORCED = Error('e', { cause: 7 }).cause !== 7;\n\nvar exportGlobalErrorCauseWrapper = function (ERROR_NAME, wrapper) {\n var O = {};\n O[ERROR_NAME] = wrapErrorConstructorWithCause(ERROR_NAME, wrapper, FORCED);\n $({ global: true, constructor: true, arity: 1, forced: FORCED }, O);\n};\n\nvar exportWebAssemblyErrorCauseWrapper = function (ERROR_NAME, wrapper) {\n if (WebAssembly && WebAssembly[ERROR_NAME]) {\n var O = {};\n O[ERROR_NAME] = wrapErrorConstructorWithCause(WEB_ASSEMBLY + '.' + ERROR_NAME, wrapper, FORCED);\n $({ target: WEB_ASSEMBLY, stat: true, constructor: true, arity: 1, forced: FORCED }, O);\n }\n};\n\n// https://tc39.es/ecma262/#sec-nativeerror\n// https://github.com/tc39/proposal-error-cause\nexportGlobalErrorCauseWrapper('Error', function (init) {\n return function Error(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('EvalError', function (init) {\n return function EvalError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('RangeError', function (init) {\n return function RangeError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('ReferenceError', function (init) {\n return function ReferenceError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('SyntaxError', function (init) {\n return function SyntaxError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('TypeError', function (init) {\n return function TypeError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('URIError', function (init) {\n return function URIError(message) { return apply(init, this, arguments); };\n});\nexportWebAssemblyErrorCauseWrapper('CompileError', function (init) {\n return function CompileError(message) { return apply(init, this, arguments); };\n});\nexportWebAssemblyErrorCauseWrapper('LinkError', function (init) {\n return function LinkError(message) { return apply(init, this, arguments); };\n});\nexportWebAssemblyErrorCauseWrapper('RuntimeError', function (init) {\n return function RuntimeError(message) { return apply(init, this, arguments); };\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\n\nvar charAt = uncurryThis(''.charAt);\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line es/no-array-string-prototype-at -- safe\n return '𠮷'.at(-2) !== '\\uD842';\n});\n\n// `String.prototype.at` method\n// https://github.com/tc39/proposal-relative-indexing-method\n$({ target: 'String', proto: true, forced: FORCED }, {\n at: function at(index) {\n var S = toString(requireObjectCoercible(this));\n var len = S.length;\n var relativeIndex = toIntegerOrInfinity(index);\n var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;\n return (k < 0 || k >= len) ? undefined : charAt(S, k);\n }\n});\n","!function(g,c){typeof exports==\"object\"&&typeof module!=\"undefined\"?c(exports):typeof define==\"function\"&&define.amd?define([\"exports\"],c):c((g=g||self).lru_map=g.lru_map||{})}(this,function(g){const c=Symbol(\"newer\"),e=Symbol(\"older\");class n{constructor(a,b){typeof a!==\"number\"&&(b=a,a=0),this.size=0,this.limit=a,this.oldest=this.newest=void 0,this._keymap=new Map(),b&&(this.assign(b),a<1&&(this.limit=this.size))}_markEntryAsUsed(a){if(a===this.newest)return;a[c]&&(a===this.oldest&&(this.oldest=a[c]),a[c][e]=a[e]),a[e]&&(a[e][c]=a[c]),a[c]=void 0,a[e]=this.newest,this.newest&&(this.newest[c]=a),this.newest=a}assign(a){let b,d=this.limit||Number.MAX_VALUE;this._keymap.clear();let m=a[Symbol.iterator]();for(let h=m.next();!h.done;h=m.next()){let f=new l(h.value[0],h.value[1]);this._keymap.set(f.key,f),b?(b[c]=f,f[e]=b):this.oldest=f,b=f;if(d--==0)throw new Error(\"overflow\")}this.newest=b,this.size=this._keymap.size}get(a){var b=this._keymap.get(a);return b?(this._markEntryAsUsed(b),b.value):void 0}set(a,b){var d=this._keymap.get(a);return d?(d.value=b,this._markEntryAsUsed(d),this):(this._keymap.set(a,d=new l(a,b)),this.newest?(this.newest[c]=d,d[e]=this.newest):this.oldest=d,this.newest=d,++this.size,this.size>this.limit&&this.shift(),this)}shift(){var a=this.oldest;if(a)return this.oldest[c]?(this.oldest=this.oldest[c],this.oldest[e]=void 0):(this.oldest=void 0,this.newest=void 0),a[c]=a[e]=void 0,this._keymap.delete(a.key),--this.size,[a.key,a.value]}find(a){let b=this._keymap.get(a);return b?b.value:void 0}has(a){return this._keymap.has(a)}delete(a){var b=this._keymap.get(a);return b?(this._keymap.delete(b.key),b[c]&&b[e]?(b[e][c]=b[c],b[c][e]=b[e]):b[c]?(b[c][e]=void 0,this.oldest=b[c]):b[e]?(b[e][c]=void 0,this.newest=b[e]):this.oldest=this.newest=void 0,this.size--,b.value):void 0}clear(){this.oldest=this.newest=void 0,this.size=0,this._keymap.clear()}keys(){return new j(this.oldest)}values(){return new k(this.oldest)}entries(){return this}[Symbol.iterator](){return new i(this.oldest)}forEach(a,b){typeof b!==\"object\"&&(b=this);let d=this.oldest;for(;d;)a.call(b,d.value,d.key,this),d=d[c]}toJSON(){for(var a=new Array(this.size),b=0,d=this.oldest;d;)a[b++]={key:d.key,value:d.value},d=d[c];return a}toString(){for(var a=\"\",b=this.oldest;b;)a+=String(b.key)+\":\"+b.value,b=b[c],b&&(a+=\" < \");return a}}g.LRUMap=n;function l(a,b){this.key=a,this.value=b,this[c]=void 0,this[e]=void 0}function i(a){this.entry=a}i.prototype[Symbol.iterator]=function(){return this},i.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:[a.key,a.value]}):{done:!0,value:void 0}};function j(a){this.entry=a}j.prototype[Symbol.iterator]=function(){return this},j.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.key}):{done:!0,value:void 0}};function k(a){this.entry=a}k.prototype[Symbol.iterator]=function(){return this},k.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.value}):{done:!0,value:void 0}}});\n//# sourceMappingURL=lru.js.map\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (Array.isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return Object.keys(obj).map(function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (Array.isArray(obj[k])) {\n return obj[k].map(function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n","/*! https://mths.be/punycode v1.3.2 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see \n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * http://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.3.2',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see \n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar punycode = require('punycode');\nvar util = require('./util');\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n },\n querystring = require('querystring');\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n\n var u = new Url;\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter =\n (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1)\n hostEnd = rest.length;\n\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1)\n continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\n\nUrl.prototype.format = function() {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ?\n this.hostname :\n '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n\n if (this.query &&\n util.isObject(this.query) &&\n Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n\n var search = this.search || (query && ('?' + query)) || '';\n\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes ||\n (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n\n pathname = pathname.replace(/[?#]/g, function(match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n\n return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol')\n result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] &&\n result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n\n result.href = result.format();\n return result;\n }\n\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n\n var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n isRelAbs = (\n relative.host ||\n relative.pathname && relative.pathname.charAt(0) === '/'\n ),\n mustEndAbs = (isRelAbs || isSourceAbs ||\n (result.host && relative.pathname)),\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;\n else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;\n else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n\n if (isRelAbs) {\n // it's absolute.\n result.host = (relative.host || relative.host === '') ?\n relative.host : result.host;\n result.hostname = (relative.hostname || relative.hostname === '') ?\n relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (\n (result.host || relative.host || srcPath.length > 1) &&\n (last === '.' || last === '..') || last === '');\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n\n if (mustEndAbs && srcPath[0] !== '' &&\n (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n\n if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n srcPath.push('');\n }\n\n var isAbsolute = srcPath[0] === '' ||\n (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' :\n srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\n\nUrl.prototype.parseHost = function() {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\n","'use strict';\n\nmodule.exports = {\n isString: function(arg) {\n return typeof(arg) === 'string';\n },\n isObject: function(arg) {\n return typeof(arg) === 'object' && arg !== null;\n },\n isNull: function(arg) {\n return arg === null;\n },\n isNullOrUndefined: function(arg) {\n return arg == null;\n }\n};\n","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */\n\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n\n /* vim: set sts=2 sw=2 et tw=80: */\n\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!globalThis.chrome?.runtime?.id) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n\n if (typeof globalThis.browser === \"undefined\" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n\n\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n\n return super.get(key);\n }\n\n }\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n\n\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n\n\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n\n\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args); // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n\n\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n\n });\n };\n\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy}\n */\n\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n\n if (!(prop in target)) {\n return undefined;\n }\n\n let value = target[prop];\n\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n\n get() {\n return target[prop];\n },\n\n set(value) {\n target[prop] = value;\n }\n\n });\n return value;\n }\n\n cache[prop] = value;\n return value;\n },\n\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n\n return true;\n },\n\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n\n }; // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n\n\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n\n });\n\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n\n\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {}\n /* wrappers */\n , {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n\n\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n\n const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n } // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n\n\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n }; // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n\n\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n } // Let Chrome know that the listener is replying.\n\n\n return true;\n };\n });\n\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n }; // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n\n\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","/**\n * Splits the string by the delimiter, ignoring escaped delimiters\n * and without tokenizing.\n * Works for plain strings that don't include string representation of\n * complex entities, e.g $replace modifier values.\n *\n * @param string - string to split\n * @param delimiter - delimiter\n * @param escapeCharacter - escape character\n * @param preserveEmptyTokens - if true, preserve empty parts\n * @param shouldUnescape - if true, unescape characters\n * @return array of string parts\n */\nfunction splitByDelimiterWithEscapeCharacter(string, delimiter, escapeCharacter, preserveEmptyTokens, shouldUnescape) {\n if (shouldUnescape === void 0) { shouldUnescape = true; }\n if (!string) {\n return [];\n }\n if (string.startsWith(delimiter)) {\n // eslint-disable-next-line no-param-reassign\n string = string.substring(1);\n }\n var words = [];\n if (!string.includes(escapeCharacter)) {\n words = string.split(delimiter);\n if (!preserveEmptyTokens) {\n words = words.filter(function (word) { return !!word; });\n }\n return words;\n }\n var chars = [];\n var makeWord = function () {\n var word = chars.join('');\n words.push(word);\n chars = [];\n };\n for (var i = 0; i < string.length; i += 1) {\n var char = string.charAt(i);\n var isLastChar = i === (string.length - 1);\n if (char === delimiter) {\n var isEscapedChar = i > 0 && string[i - 1] === escapeCharacter;\n if (isEscapedChar) {\n if (shouldUnescape) {\n chars.splice(chars.length - 1, 1);\n }\n chars.push(char);\n }\n else {\n makeWord();\n }\n if (isLastChar) {\n makeWord();\n }\n }\n else if (isLastChar) {\n chars.push(char);\n makeWord();\n }\n else {\n chars.push(char);\n }\n }\n if (!preserveEmptyTokens) {\n words = words.filter(function (word) { return !!word; });\n }\n return words;\n}\n/**\n * Checks if the specified string starts with a substr at the specified index.\n *\n * @param str - String to check\n * @param startIndex - Index to start checking from\n * @param substr - Substring to check\n * @return boolean true if it does start\n */\nfunction startsAtIndexWith(str, startIndex, substr) {\n if (str.length - startIndex < substr.length) {\n return false;\n }\n for (var i = 0; i < substr.length; i += 1) {\n if (str.charAt(startIndex + i) !== substr.charAt(i)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Checks if str has unquoted substr\n *\n * @param str\n * @param substr\n */\nfunction hasUnquotedSubstring(str, substr) {\n var quotes = ['\"', \"'\", '/'];\n if (!str.includes(substr)) {\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n if (indexOfAny(str, quotes) === -1) {\n return true;\n }\n var stack = [];\n for (var i = 0; i < str.length; i += 1) {\n var cursor = str[i];\n if (stack.length === 0) {\n if (startsAtIndexWith(str, i, substr)) {\n return true;\n }\n }\n if (quotes.indexOf(cursor) >= 0\n && (i === 0 || str[i - 1] !== '\\\\')) {\n var last = stack.pop();\n if (!last) {\n stack.push(cursor);\n }\n else if (last !== cursor) {\n stack.push(last);\n stack.push(cursor);\n }\n }\n }\n return false;\n}\n/**\n * djb2 hash algorithm\n *\n * @param str string to get hash\n * @param begin index from\n * @param end index to\n * @return {number} hash\n */\nfunction fastHashBetween(str, begin, end) {\n var hash = 5381;\n for (var idx = begin; idx < end; idx += 1) {\n hash = 33 * hash + str.charCodeAt(idx);\n }\n return hash;\n}\n/**\n * djb2 hash algorithm\n *\n * @param str string to get hash\n * @return {number} hash\n */\nfunction fastHash(str) {\n if (str === '') {\n return 0;\n }\n var len = str.length;\n return fastHashBetween(str, 0, len);\n}\n/**\n * Look for any symbol from \"chars\" array starting at \"start\" index or from the start of the string\n *\n * @param str String to search\n * @param chars Chars to search for\n * @param start Start index (optional, inclusive)\n * @return int Index of the element found or -1 if not\n */\nfunction indexOfAny(str, chars, start) {\n if (start === void 0) { start = 0; }\n if (str.length <= start) {\n return -1;\n }\n for (var i = start; i < str.length; i += 1) {\n var c = str.charAt(i);\n if (chars.indexOf(c) > -1) {\n return i;\n }\n }\n return -1;\n}\n/**\n * Replaces all occurences of find with replace in str\n *\n * @param str\n * @param find\n * @param replace\n */\nfunction replaceAll(str, find, replace) {\n if (!str) {\n return str;\n }\n return str.split(find).join(replace);\n}\n/**\n * Checks if arrays are equal\n *\n * @param left array\n * @param right array\n * @return {boolean} true on equality\n */\nfunction stringArraysEquals(left, right) {\n if (!left || !right) {\n return !left && !right;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (var i = 0; i < left.length; i += 1) {\n if (left[i] !== right[i]) {\n return false;\n }\n }\n return true;\n}\n/**\n * Checks if arrays have an intersection\n *\n * @param left array\n * @param right array\n * @return {boolean} true on equality\n */\nfunction stringArraysHaveIntersection(left, right) {\n if (!left || !right) {\n return true;\n }\n for (var i = 0; i < left.length; i += 1) {\n if (right.includes(left[i])) {\n return true;\n }\n }\n return false;\n}\n\n/* eslint-disable prefer-regex-literals */\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp\n// should be escaped . * + ? ^ $ { } ( ) | [ ] / \\\n// except of * | ^\nvar specialCharacters = ['.', '+', '?', '$', '{', '}', '(', ')', '[', ']', '/', '\\\\'];\nvar reSpecialCharacters = new RegExp(\"[\".concat(specialCharacters.join('\\\\'), \"]\"), 'g');\nvar reSpecialCharactersFull = /[.*+?^${}()|[\\]\\\\]/g;\nvar reEscapedSpecialCharactersFull = /\\\\[.*+?^${}()|[\\]\\\\]/g;\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings\nvar escapeSequence = {\n n: '\\n',\n r: '\\r',\n t: '\\t',\n b: '\\b',\n f: '\\f',\n v: '\\v',\n};\n/**\n * Class with static helper methods for working with basic filtering rules patterns.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules\n */\nvar SimpleRegex = /** @class */ (function () {\n function SimpleRegex() {\n }\n /**\n * Extracts the shortcut from the rule's pattern.\n * Shortcut is the longest substring of the pattern that does not contain\n * any special characters.\n *\n * Please note, that the shortcut is always lower-case!\n *\n * @param pattern - network rule's pattern.\n * @returns the shortcut or the empty string if we could not extract any.\n */\n SimpleRegex.extractShortcut = function (pattern) {\n if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) {\n return this.extractRegexpShortcut(pattern);\n }\n return this.extractBasicShortcut(pattern);\n };\n /**\n * Searches for the longest substring of the pattern that\n * does not contain any special characters: *,^,|.\n *\n * @param pattern - network rule's pattern.\n * @returns the shortcut or the empty string\n */\n SimpleRegex.extractBasicShortcut = function (pattern) {\n var longest = '';\n var parts = pattern.split(this.rePatternSpecialCharacters);\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\n var part = parts_1[_i];\n if (part.length > longest.length) {\n longest = part;\n }\n }\n return (longest || '').toLowerCase();\n };\n /**\n * Searches for a shortcut inside of a regexp pattern.\n * Shortcut in this case is a longest string with no REGEX special characters.\n * Also, we discard complicated regexps right away.\n *\n * @param pattern - network rule's pattern (regexp).\n * @returns the shortcut or the empty string\n */\n SimpleRegex.extractRegexpShortcut = function (pattern) {\n var reText = pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length);\n if (reText.length === 0) {\n // The rule is too short, doing nothing\n return '';\n }\n if (reText.indexOf('?') >= 0) {\n // Do not mess with complex expressions which use lookahead\n // And with those using ? special character\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/978\n return '';\n }\n var specialCharacter = '$$$';\n // Prepend specialCharacter for the following replace calls to work properly\n reText = specialCharacter + reText;\n // Strip all types of brackets\n reText = reText.replace(/[^\\\\]\\(.*[^\\\\]\\)/, specialCharacter);\n reText = reText.replace(/[^\\\\]\\[.*[^\\\\]\\]/, specialCharacter);\n reText = reText.replace(/[^\\\\]\\{.*[^\\\\]\\}/, specialCharacter);\n // Strip some special characters\n reText = reText.replace(/[^\\\\]\\\\[a-zA-Z]/, specialCharacter);\n // Replace \\. with .\n reText = reText.replace(/\\\\\\./g, '.');\n // Split by special characters\n // `.` is one of the special characters so our `specialCharacter`\n // will be removed from the resulting array\n var parts = reText.split(/[\\\\^$*+?()|[\\]{}]/);\n var longest = '';\n for (var i = 0; i < parts.length; i += 1) {\n var part = parts[i];\n if (part.length > longest.length) {\n longest = part;\n }\n }\n return longest.toLowerCase();\n };\n /**\n * patternToRegexp is a helper method for creating regular expressions from the simple\n * wildcard-based syntax which is used in basic filters:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules\n *\n * @param pattern - basic rule pattern\n * @returns regular expression\n */\n SimpleRegex.patternToRegexp = function (pattern) {\n if (pattern === this.MASK_START_URL\n || pattern === this.MASK_PIPE\n || pattern === this.MASK_ANY_CHARACTER\n || pattern === '') {\n return this.REGEX_ANY_CHARACTER;\n }\n if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) {\n // This is a regex rule, just remove the regex markers\n return pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length);\n }\n // Escape special characters except of * | ^\n var regex = pattern.replace(reSpecialCharacters, '\\\\$&');\n // Now escape \"|\" characters but avoid escaping them in the special places\n if (regex.startsWith(this.MASK_START_URL)) {\n regex = regex.substring(0, this.MASK_START_URL.length)\n + replaceAll(regex.substring(this.MASK_START_URL.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, \"\\\\\".concat(this.MASK_PIPE))\n + regex.substring(regex.length - this.MASK_PIPE.length);\n }\n else {\n regex = regex.substring(0, this.MASK_PIPE.length)\n + replaceAll(regex.substring(this.MASK_PIPE.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, \"\\\\\".concat(this.MASK_PIPE))\n + regex.substring(regex.length - this.MASK_PIPE.length);\n }\n // Replace special URL masks\n regex = replaceAll(regex, this.MASK_ANY_CHARACTER, this.REGEX_ANY_CHARACTER);\n regex = replaceAll(regex, this.MASK_SEPARATOR, this.REGEX_SEPARATOR);\n // Replace start URL and pipes\n if (regex.startsWith(this.MASK_START_URL)) {\n regex = this.REGEX_START_URL + regex.substring(this.MASK_START_URL.length);\n }\n else if (regex.startsWith(this.MASK_PIPE)) {\n regex = this.REGEX_START_STRING + regex.substring(this.MASK_PIPE.length);\n }\n if (regex.endsWith(this.MASK_PIPE)) {\n regex = regex.substring(0, regex.length - this.MASK_PIPE.length) + this.REGEX_END_STRING;\n }\n return regex;\n };\n /**\n * Creates RegExp object from string in '/reg_exp/gi' format\n *\n * @param str\n */\n SimpleRegex.patternFromString = function (str) {\n var parts = splitByDelimiterWithEscapeCharacter(str, '/', '\\\\', true);\n var modifiers = (parts[1] || '');\n if (modifiers.indexOf('g') < 0) {\n modifiers += 'g';\n }\n return new RegExp(parts[0], modifiers);\n };\n /**\n * Escapes characters with special meaning inside a regular expression.\n *\n * @param str\n * @param searchPattern - Pattern for detecting special characters. Optional.\n */\n SimpleRegex.escapeRegexSpecials = function (str, searchPattern) {\n if (searchPattern === void 0) { searchPattern = reSpecialCharactersFull; }\n return str.replace(searchPattern, '\\\\$&');\n };\n /**\n * Unescapes characters with special meaning inside a regular expression.\n *\n * @param str\n * @param searchPattern - Pattern for detecting special characters. Optional.\n */\n SimpleRegex.unescapeRegexSpecials = function (str, searchPattern) {\n if (searchPattern === void 0) { searchPattern = reEscapedSpecialCharactersFull; }\n return str.replace(searchPattern, function (match) { return match.substring(1); });\n };\n /**\n * Check if pattern is Regex\n */\n SimpleRegex.isRegexPattern = function (str) {\n return str.startsWith('/') && str.endsWith('/');\n };\n /**\n * Unescapes special characters in a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings\n */\n SimpleRegex.unescapeSpecials = function (str) {\n var keys = Object.keys(escapeSequence).join('|');\n var regex = new RegExp(\"\\\\\\\\(\".concat(keys, \")\"), 'g');\n return str.replace(regex, function (match, group) {\n return escapeSequence[group];\n });\n };\n /**\n * Matching the beginning of an address. With this character you don't\n * have to specify a particular protocol and subdomain in address mask.\n * It means, || stands for http://*., https://*., ws://*., wss://*. at once.\n */\n SimpleRegex.MASK_START_URL = '||';\n /**\n * REGEX_START_URL corresponds to MASK_START_URL\n */\n SimpleRegex.REGEX_START_URL = '^(http|https|ws|wss)://([a-z0-9-_.]+\\\\.)?';\n /**\n * A pointer to the beginning or the end of address. The value depends on the\n * character placement in the mask. For example, a rule swf| corresponds\n * to http://example.com/annoyingflash.swf , but not to http://example.com/swf/index.html.\n * |http://example.org corresponds to http://example.org,\n * but not to http://domain.com?url=http://example.org.\n */\n SimpleRegex.MASK_PIPE = '|';\n /**\n * REGEX_END_STRING corresponds to MASK_PIPE if it is in the end of a pattern.\n */\n SimpleRegex.REGEX_END_STRING = '$';\n /**\n * REGEX_START_STRING corresponds to MASK_PIPE if it is in the beginning of a pattern.\n */\n SimpleRegex.REGEX_START_STRING = '^';\n /**\n * Separator character mark. Separator character is any character,\n * but a letter, a digit, or one of the following: _ - .\n */\n SimpleRegex.MASK_SEPARATOR = '^';\n /**\n * REGEX_SEPARATOR corresponds to MASK_SEPARATOR\n */\n SimpleRegex.REGEX_SEPARATOR = '([^ a-zA-Z0-9.%_-]|$)';\n /**\n * This is a wildcard character. It is used to represent \"any set of characters\".\n * This can also be an empty string or a string of any length.\n */\n SimpleRegex.MASK_ANY_CHARACTER = '*';\n /**\n * Path separator\n */\n SimpleRegex.MASK_BACKSLASH = '/';\n /**\n * REGEX_ANY_CHARACTER corresponds to MASK_ANY_CHARACTER.\n */\n SimpleRegex.REGEX_ANY_CHARACTER = '.*';\n /**\n * Enclose regex in two backslashes to mark a regex rule:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#regular-expressions-support\n */\n SimpleRegex.MASK_REGEX_RULE = '/';\n /**\n * Regex for matching special characters in modifier regex pattern\n */\n SimpleRegex.reModifierPatternSpecialCharacters = /[[\\],\\\\]/g;\n /**\n * Regex for matching escaped special characters in modifier regex pattern\n */\n SimpleRegex.reModifierPatternEscapedSpecialCharacters = /\\\\[[\\],\\\\]/g;\n /**\n * If string starts with exclamation mark \"!\" we consider it as comment\n */\n SimpleRegex.MASK_COMMENT = '!';\n /**\n * Min length of rule shortcut\n * This value has been picked as a result of performance experiments\n */\n SimpleRegex.MIN_SHORTCUT_LENGTH = 3;\n /**\n * Min length of generic rule shortcut\n */\n SimpleRegex.MIN_GENERIC_RULE_LENGTH = 4;\n /** Regex with basic matching pattern special characters */\n SimpleRegex.rePatternSpecialCharacters = new RegExp('[*^|]');\n return SimpleRegex;\n}());\n\nexport { SimpleRegex as S, stringArraysEquals as a, stringArraysHaveIntersection as b, startsAtIndexWith as c, fastHashBetween as d, fastHash as f, hasUnquotedSubstring as h, indexOfAny as i, replaceAll as r, splitByDelimiterWithEscapeCharacter as s };\n","var NETWORK_RULE_OPTIONS = {\n THIRD_PARTY: 'third-party',\n FIRST_PARTY: 'first-party',\n MATCH_CASE: 'match-case',\n IMPORTANT: 'important',\n DOMAIN: 'domain',\n DENYALLOW: 'denyallow',\n ELEMHIDE: 'elemhide',\n GENERICHIDE: 'generichide',\n SPECIFICHIDE: 'specifichide',\n GENERICBLOCK: 'genericblock',\n JSINJECT: 'jsinject',\n URLBLOCK: 'urlblock',\n CONTENT: 'content',\n DOCUMENT: 'document',\n DOC: 'doc',\n STEALTH: 'stealth',\n POPUP: 'popup',\n EMPTY: 'empty',\n MP4: 'mp4',\n SCRIPT: 'script',\n STYLESHEET: 'stylesheet',\n SUBDOCUMENT: 'subdocument',\n OBJECT: 'object',\n IMAGE: 'image',\n XMLHTTPREQUEST: 'xmlhttprequest',\n MEDIA: 'media',\n FONT: 'font',\n WEBSOCKET: 'websocket',\n OTHER: 'other',\n PING: 'ping',\n BADFILTER: 'badfilter',\n CSP: 'csp',\n REPLACE: 'replace',\n COOKIE: 'cookie',\n REDIRECT: 'redirect',\n REDIRECTRULE: 'redirect-rule',\n REMOVEPARAM: 'removeparam',\n REMOVEHEADER: 'removeheader',\n JSONPRUNE: 'jsonprune',\n HLS: 'hls',\n APP: 'app',\n NETWORK: 'network',\n EXTENSION: 'extension',\n NOOP: '_',\n CLIENT: 'client',\n DNSREWRITE: 'dnsrewrite',\n DNSTYPE: 'dnstype',\n CTAG: 'ctag',\n};\nvar OPTIONS_DELIMITER = '$';\nvar MASK_ALLOWLIST = '@@';\nvar NOT_MARK = '~';\nvar ESCAPE_CHARACTER = '\\\\';\n\nexport { ESCAPE_CHARACTER, MASK_ALLOWLIST, NETWORK_RULE_OPTIONS, NOT_MARK, OPTIONS_DELIMITER };\n","/**\n * RequestType is the request types enumeration.\n * Important: the enumeration is marked as const to avoid side effects when\n * importing it into an extension.\n */\nvar RequestType = {\n /** main frame */\n Document: 1,\n /** (iframe) $subdocument */\n SubDocument: 2,\n /** (javascript, etc) $script */\n Script: 4,\n /** (css) $stylesheet */\n Stylesheet: 8,\n /** (flash, etc) $object */\n Object: 16,\n /** (any image) $image */\n Image: 32,\n /** (ajax/fetch) $xmlhttprequest */\n XmlHttpRequest: 64,\n /** (video/music) $media */\n Media: 128,\n /** (any custom font) $font */\n Font: 256,\n /** (a websocket connection) $websocket */\n WebSocket: 512,\n /** (navigator.sendBeacon()) $ping */\n Ping: 1024,\n /** any other request type */\n Other: 2048, // 1 << 11\n};\n\nexport { RequestType };\n","/**\n * Enumeration with the cosmetic rules markers.\n *\n * All cosmetic rules have similar structure:\n * ```\n * rule = [domains] \"marker\" content\n * domains = [domain0, domain1[, ...[, domainN]]]\n * ```\n *\n * For instance, element hiding rules look like:\n * `example.org##.banner`\n *\n * In this case:\n * * `[domains]` is `example.org` (comma-separated list of domains)\n * * `marker` is `##` (marker of element hiding rules)\n * * `content` is `.banner` (CSS selector)\n */\nvar CosmeticRuleMarker;\n(function (CosmeticRuleMarker) {\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-elemhide-rules */\n CosmeticRuleMarker[\"ElementHiding\"] = \"##\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#element-hiding-rules-exceptions */\n CosmeticRuleMarker[\"ElementHidingException\"] = \"#@#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors */\n CosmeticRuleMarker[\"ElementHidingExtCSS\"] = \"#?#\";\n /** Basically the same as {@link CosmeticRuleMarker.ElementHidingException} */\n CosmeticRuleMarker[\"ElementHidingExtCSSException\"] = \"#@?#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules */\n CosmeticRuleMarker[\"Css\"] = \"#$#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules-exceptions */\n CosmeticRuleMarker[\"CssException\"] = \"#@$#\";\n /**\n * CSS rules that use extended CSS selectors:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors\n */\n CosmeticRuleMarker[\"CssExtCSS\"] = \"#$?#\";\n /** Basically the same as {@link CosmeticRuleMarker.CssException} */\n CosmeticRuleMarker[\"CssExtCSSException\"] = \"#@$?#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules */\n CosmeticRuleMarker[\"Js\"] = \"#%#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules-exceptions-1 */\n CosmeticRuleMarker[\"JsException\"] = \"#@%#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules */\n CosmeticRuleMarker[\"Html\"] = \"$$\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules-exceptions-1 */\n CosmeticRuleMarker[\"HtmlException\"] = \"$@$\";\n})(CosmeticRuleMarker || (CosmeticRuleMarker = {}));\n/**\n * findCosmeticRuleMarker looks for a cosmetic rule marker in the rule text\n * and returns the start index of the marker and the marker found.\n * If nothing found, it returns -1 and null.\n *\n * @privateRemarks\n *\n * The idea is to search for the rule marker as quickly as possible.\n * If we were simply using `Array.includes` we had to call it a dozen of times (for every marker),\n * and that'd have been much slower.\n *\n * @param ruleText - rule text to scan.\n */\nfunction findCosmeticRuleMarker(ruleText) {\n var maxIndex = ruleText.length - 1;\n for (var i = 0; i < maxIndex; i += 1) {\n var char = ruleText.charAt(i);\n switch (char) {\n case '#':\n if (i + 4 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '$'\n && ruleText.charAt(i + 3) === '?'\n && ruleText.charAt(i + 4) === '#') {\n return [i, CosmeticRuleMarker.CssExtCSSException];\n }\n }\n if (i + 3 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.ElementHidingExtCSSException];\n }\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '$' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.CssException];\n }\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '%' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.JsException];\n }\n if (ruleText.charAt(i + 1) === '$'\n && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.CssExtCSS];\n }\n }\n if (i + 2 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.ElementHidingException];\n }\n if (ruleText.charAt(i + 1) === '?' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.ElementHidingExtCSS];\n }\n if (ruleText.charAt(i + 1) === '%' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.Js];\n }\n if (ruleText.charAt(i + 1) === '$' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.Css];\n }\n }\n if (i + 1 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '#') {\n // Handling false positives while looking for cosmetic rules in host files.\n //\n // For instance, it could look like this:\n // 127.0.0.1 localhost ## this is just a comment\n if (i > 0 && ruleText.charAt(i - 1) === ' ') {\n return [-1, null];\n }\n return [i, CosmeticRuleMarker.ElementHiding];\n }\n }\n break;\n case '$':\n if (i + 2 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '$') {\n return [i, CosmeticRuleMarker.HtmlException];\n }\n }\n if (i + 1 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '$') {\n return [i, CosmeticRuleMarker.Html];\n }\n }\n break;\n }\n }\n return [-1, null];\n}\n/**\n * Detects is the rule is extended css rule\n * @param marker - string to check\n */\nfunction isExtCssMarker(marker) {\n var EXTENDED_CSS_MARKERS = [\n CosmeticRuleMarker.CssExtCSS,\n CosmeticRuleMarker.CssExtCSSException,\n CosmeticRuleMarker.ElementHidingExtCSS,\n CosmeticRuleMarker.ElementHidingExtCSSException,\n ];\n return EXTENDED_CSS_MARKERS.indexOf(marker) !== -1;\n}\n/**\n * AdGuard scriptlet rule mask\n */\nvar ADG_SCRIPTLET_MASK = '//scriptlet';\n\nexport { ADG_SCRIPTLET_MASK, CosmeticRuleMarker, findCosmeticRuleMarker, isExtCssMarker };\n","import { s as splitByDelimiterWithEscapeCharacter, S as SimpleRegex, a as stringArraysEquals, b as stringArraysHaveIntersection, f as fastHash, i as indexOfAny, h as hasUnquotedSubstring } from './simple-regex-40f65170.js';\nexport { S as SimpleRegex, f as fastHash, d as fastHashBetween, h as hasUnquotedSubstring, i as indexOfAny, r as replaceAll, s as splitByDelimiterWithEscapeCharacter, c as startsAtIndexWith, a as stringArraysEquals, b as stringArraysHaveIntersection } from './simple-regex-40f65170.js';\nimport { NETWORK_RULE_OPTIONS, NOT_MARK, OPTIONS_DELIMITER, ESCAPE_CHARACTER, MASK_ALLOWLIST } from './network-rule-options.js';\nexport { NETWORK_RULE_OPTIONS, OPTIONS_DELIMITER } from './network-rule-options.js';\nimport { RequestType } from './request-type.js';\nexport { RequestType } from './request-type.js';\nimport { findCosmeticRuleMarker, CosmeticRuleMarker, ADG_SCRIPTLET_MASK, isExtCssMarker } from './cosmetic-rule-marker.js';\nexport { CosmeticRuleMarker } from './cosmetic-rule-marker.js';\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\nfunction __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nvar __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\n/**\n * Compatibility types are used to configure engine for better support of different libraries\n * For example:\n * extension doesn't support $app modifier. So if we set in configuration CompatibilityTypes.Extension,\n * engine would ignore rules with $app modifier\n */\nvar CompatibilityTypes;\n(function (CompatibilityTypes) {\n CompatibilityTypes[CompatibilityTypes[\"Extension\"] = 1] = \"Extension\";\n CompatibilityTypes[CompatibilityTypes[\"CoreLibs\"] = 2] = \"CoreLibs\";\n CompatibilityTypes[CompatibilityTypes[\"Dns\"] = 4] = \"Dns\";\n})(CompatibilityTypes || (CompatibilityTypes = {}));\n/**\n * Application configuration class\n */\nvar Configuration = /** @class */ (function () {\n function Configuration(inputConfig) {\n this.defaultConfig = {\n engine: null,\n version: null,\n verbose: false,\n compatibility: null,\n };\n /**\n * {'extension'|'corelibs'} engine application type\n */\n this.engine = null;\n /**\n * {string} version\n */\n this.version = null;\n /**\n * {boolean} verbose flag\n */\n this.verbose = false;\n /**\n * compatibility flag\n */\n this.compatibility = CompatibilityTypes.Extension;\n var config = __assign(__assign({}, this.defaultConfig), inputConfig);\n this.engine = config.engine;\n this.version = config.version;\n this.verbose = config.verbose;\n this.compatibility = config.compatibility;\n }\n return Configuration;\n}());\n// eslint-disable-next-line import/no-mutable-exports\nvar config$2 = new Configuration();\n/**\n * Checks config is compatible with input level\n * @param compatibilityLevel\n * @private\n */\nfunction isCompatibleWith(compatibilityLevel) {\n if (config$2.compatibility === null) {\n return false;\n }\n return (config$2.compatibility & compatibilityLevel) === compatibilityLevel;\n}\nvar setConfiguration = function (outerConfig) {\n config$2 = new Configuration(outerConfig);\n};\n\n/**\n * This class stores found cosmetic css rules content in the appropriate collections\n * It is primarily used by the {@see CosmeticResult}\n */\nvar CosmeticStylesResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticStylesResult() {\n this.generic = [];\n this.specific = [];\n this.genericExtCss = [];\n this.specificExtCss = [];\n }\n /**\n * Appends rule to the appropriate collection\n * @param rule\n */\n CosmeticStylesResult.prototype.append = function (rule) {\n if (rule.isGeneric()) {\n if (rule.isExtendedCss()) {\n this.genericExtCss.push(rule);\n }\n else {\n this.generic.push(rule);\n }\n }\n else if (rule.isExtendedCss()) {\n this.specificExtCss.push(rule);\n }\n else {\n this.specific.push(rule);\n }\n };\n return CosmeticStylesResult;\n}());\n\n/**\n * This class stores found script rules content in the appropriate collections\n * It is primarily used by the {@see CosmeticResult}\n */\nvar CosmeticScriptsResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticScriptsResult() {\n this.generic = [];\n this.specific = [];\n }\n /**\n * Appends rule to appropriate collection\n * @param rule\n */\n CosmeticScriptsResult.prototype.append = function (rule) {\n if (rule.isGeneric()) {\n this.generic.push(rule);\n }\n else {\n this.specific.push(rule);\n }\n };\n /**\n * Returns rules collected\n */\n CosmeticScriptsResult.prototype.getRules = function () {\n return __spreadArray(__spreadArray([], this.generic, true), this.specific, true);\n };\n return CosmeticScriptsResult;\n}());\n\n/**\n * This class stores found cosmetic html rules content in the appropriate collections\n * It is primarily used by the {@see CosmeticResult}\n */\nvar CosmeticHtmlResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticHtmlResult() {\n this.generic = [];\n this.specific = [];\n }\n /**\n * Appends rule to the appropriate collection\n * @param rule\n */\n CosmeticHtmlResult.prototype.append = function (rule) {\n if (rule.isGeneric()) {\n this.generic.push(rule);\n }\n else {\n this.specific.push(rule);\n }\n };\n /**\n * Returns rules collected\n */\n CosmeticHtmlResult.prototype.getRules = function () {\n return __spreadArray(__spreadArray([], this.generic, true), this.specific, true);\n };\n return CosmeticHtmlResult;\n}());\n\n/**\n * Cosmetic result is the representation of rules\n * It is primarily used by the {@see CosmeticEngine}\n */\nvar CosmeticResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticResult() {\n this.elementHiding = new CosmeticStylesResult();\n this.CSS = new CosmeticStylesResult();\n this.JS = new CosmeticScriptsResult();\n this.Html = new CosmeticHtmlResult();\n }\n /**\n * Script rules\n */\n CosmeticResult.prototype.getScriptRules = function () {\n return this.JS.getRules();\n };\n return CosmeticResult;\n}());\n\n/**\n * CosmeticOption is the enumeration of various content script options.\n * Depending on the set of enabled flags the content script will contain different set of settings.\n */\nvar CosmeticOption;\n(function (CosmeticOption) {\n /**\n * if generic elemhide and CSS rules are enabled\n * Could be disabled by a $generichide rule and $elemhide rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionGenericCSS\"] = 2] = \"CosmeticOptionGenericCSS\";\n /**\n * if specific elemhide and CSS rules are enabled\n * Could be disabled by a $specifichide rule and $elemhide rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionSpecificCSS\"] = 4] = \"CosmeticOptionSpecificCSS\";\n /**\n * if JS rules and scriptlets are enabled\n * Could be disabled by a $jsinject rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionJS\"] = 8] = \"CosmeticOptionJS\";\n /**\n * if Html filtering rules are enabled\n * Could be disabled by a $content rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionHtml\"] = 16] = \"CosmeticOptionHtml\";\n /**\n * TODO: Add support for these flags\n * They are useful when content script is injected into an iframe\n * In this case we can check what flags were applied to the top-level frame\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionSourceGenericCSS\"] = 32] = \"CosmeticOptionSourceGenericCSS\";\n CosmeticOption[CosmeticOption[\"CosmeticOptionSourceCSS\"] = 64] = \"CosmeticOptionSourceCSS\";\n CosmeticOption[CosmeticOption[\"CosmeticOptionSourceJS\"] = 128] = \"CosmeticOptionSourceJS\";\n /**\n * everything is enabled\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionAll\"] = 30] = \"CosmeticOptionAll\";\n /**\n * everything is disabled\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionNone\"] = 0] = \"CosmeticOptionNone\";\n})(CosmeticOption || (CosmeticOption = {}));\n\nfunction shareSameDomainSuffix(hostname, vhost) {\n if (hostname.endsWith(vhost)) {\n return (hostname.length === vhost.length ||\n hostname[hostname.length - vhost.length - 1] === '.');\n }\n return false;\n}\nfunction extractDomainWithSuffix(hostname, publicSuffix) {\n const publicSuffixIndex = hostname.length - publicSuffix.length - 2;\n const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex);\n if (lastDotBeforeSuffixIndex === -1) {\n return hostname;\n }\n return hostname.slice(lastDotBeforeSuffixIndex + 1);\n}\nfunction getDomain(suffix, hostname, options) {\n if (options.validHosts !== null) {\n const validHosts = options.validHosts;\n for (let i = 0; i < validHosts.length; i += 1) {\n const vhost = validHosts[i];\n if ( shareSameDomainSuffix(hostname, vhost) === true) {\n return vhost;\n }\n }\n }\n if (suffix.length === hostname.length) {\n return null;\n }\n return extractDomainWithSuffix(hostname, suffix);\n}\n\nfunction getDomainWithoutSuffix(domain, suffix) {\n return domain.slice(0, -suffix.length - 1);\n}\n\nfunction extractHostname(url, urlIsValidHostname) {\n let start = 0;\n let end = url.length;\n let hasUpper = false;\n if (urlIsValidHostname === false) {\n if (url.startsWith('data:') === true) {\n return null;\n }\n while (start < url.length && url.charCodeAt(start) <= 32) {\n start += 1;\n }\n while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {\n end -= 1;\n }\n if (url.charCodeAt(start) === 47 &&\n url.charCodeAt(start + 1) === 47 ) {\n start += 2;\n }\n else {\n const indexOfProtocol = url.indexOf(':/', start);\n if (indexOfProtocol !== -1) {\n const protocolSize = indexOfProtocol - start;\n const c0 = url.charCodeAt(start);\n const c1 = url.charCodeAt(start + 1);\n const c2 = url.charCodeAt(start + 2);\n const c3 = url.charCodeAt(start + 3);\n const c4 = url.charCodeAt(start + 4);\n if (protocolSize === 5 &&\n c0 === 104 &&\n c1 === 116 &&\n c2 === 116 &&\n c3 === 112 &&\n c4 === 115 ) ;\n else if (protocolSize === 4 &&\n c0 === 104 &&\n c1 === 116 &&\n c2 === 116 &&\n c3 === 112 ) ;\n else if (protocolSize === 3 &&\n c0 === 119 &&\n c1 === 115 &&\n c2 === 115 ) ;\n else if (protocolSize === 2 &&\n c0 === 119 &&\n c1 === 115 ) ;\n else {\n for (let i = start; i < indexOfProtocol; i += 1) {\n const lowerCaseCode = url.charCodeAt(i) | 32;\n if (((lowerCaseCode >= 97 && lowerCaseCode <= 122) ||\n (lowerCaseCode >= 48 && lowerCaseCode <= 57) ||\n lowerCaseCode === 46 ||\n lowerCaseCode === 45 ||\n lowerCaseCode === 43) === false\n ) {\n return null;\n }\n }\n }\n start = indexOfProtocol + 2;\n while (url.charCodeAt(start) === 47 ) {\n start += 1;\n }\n }\n }\n let indexOfIdentifier = -1;\n let indexOfClosingBracket = -1;\n let indexOfPort = -1;\n for (let i = start; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 35 ||\n code === 47 ||\n code === 63\n ) {\n end = i;\n break;\n }\n else if (code === 64) {\n indexOfIdentifier = i;\n }\n else if (code === 93) {\n indexOfClosingBracket = i;\n }\n else if (code === 58) {\n indexOfPort = i;\n }\n else if (code >= 65 && code <= 90) {\n hasUpper = true;\n }\n }\n if (indexOfIdentifier !== -1 &&\n indexOfIdentifier > start &&\n indexOfIdentifier < end) {\n start = indexOfIdentifier + 1;\n }\n if (url.charCodeAt(start) === 91 ) {\n if (indexOfClosingBracket !== -1) {\n return url.slice(start + 1, indexOfClosingBracket).toLowerCase();\n }\n return null;\n }\n else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) {\n end = indexOfPort;\n }\n }\n while (end > start + 1 && url.charCodeAt(end - 1) === 46 ) {\n end -= 1;\n }\n const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;\n if (hasUpper) {\n return hostname.toLowerCase();\n }\n return hostname;\n}\n\nfunction isProbablyIpv4(hostname) {\n if (hostname.length < 7) {\n return false;\n }\n if (hostname.length > 15) {\n return false;\n }\n let numberOfDots = 0;\n for (let i = 0; i < hostname.length; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 ) {\n numberOfDots += 1;\n }\n else if (code < 48 || code > 57 ) {\n return false;\n }\n }\n return (numberOfDots === 3 &&\n hostname.charCodeAt(0) !== 46 &&\n hostname.charCodeAt(hostname.length - 1) !== 46 );\n}\nfunction isProbablyIpv6(hostname) {\n if (hostname.length < 3) {\n return false;\n }\n let start = hostname[0] === '[' ? 1 : 0;\n let end = hostname.length;\n if (hostname[end - 1] === ']') {\n end -= 1;\n }\n if (end - start > 39) {\n return false;\n }\n let hasColon = false;\n for (; start < end; start += 1) {\n const code = hostname.charCodeAt(start);\n if (code === 58 ) {\n hasColon = true;\n }\n else if (((code >= 48 && code <= 57) ||\n (code >= 97 && code <= 102) ||\n (code >= 65 && code <= 90)) ===\n false) {\n return false;\n }\n }\n return hasColon;\n}\nfunction isIp$1(hostname) {\n return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);\n}\n\nfunction isValidAscii(code) {\n return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127);\n}\nfunction isValidHostname (hostname) {\n if (hostname.length > 255) {\n return false;\n }\n if (hostname.length === 0) {\n return false;\n }\n if ( isValidAscii(hostname.charCodeAt(0)) === false) {\n return false;\n }\n let lastDotIndex = -1;\n let lastCharCode = -1;\n const len = hostname.length;\n for (let i = 0; i < len; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 ) {\n if (\n i - lastDotIndex > 64 ||\n lastCharCode === 46 ||\n lastCharCode === 45 ||\n lastCharCode === 95) {\n return false;\n }\n lastDotIndex = i;\n }\n else if (( isValidAscii(code) || code === 45 || code === 95) ===\n false) {\n return false;\n }\n lastCharCode = code;\n }\n return (\n len - lastDotIndex - 1 <= 63 &&\n lastCharCode !== 45);\n}\n\nfunction setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) {\n return {\n allowIcannDomains,\n allowPrivateDomains,\n detectIp,\n extractHostname,\n mixedInputs,\n validHosts,\n validateHostname,\n };\n}\nconst DEFAULT_OPTIONS = setDefaultsImpl({});\nfunction setDefaults(options) {\n if (options === undefined) {\n return DEFAULT_OPTIONS;\n }\n return setDefaultsImpl(options);\n}\n\nfunction getSubdomain(hostname, domain) {\n if (domain.length === hostname.length) {\n return '';\n }\n return hostname.slice(0, -domain.length - 1);\n}\n\nfunction getEmptyResult() {\n return {\n domain: null,\n domainWithoutSuffix: null,\n hostname: null,\n isIcann: null,\n isIp: null,\n isPrivate: null,\n publicSuffix: null,\n subdomain: null,\n };\n}\nfunction resetResult(result) {\n result.domain = null;\n result.domainWithoutSuffix = null;\n result.hostname = null;\n result.isIcann = null;\n result.isIp = null;\n result.isPrivate = null;\n result.publicSuffix = null;\n result.subdomain = null;\n}\nfunction parseImpl(url, step, suffixLookup, partialOptions, result) {\n const options = setDefaults(partialOptions);\n if (typeof url !== 'string') {\n return result;\n }\n if (options.extractHostname === false) {\n result.hostname = url;\n }\n else if (options.mixedInputs === true) {\n result.hostname = extractHostname(url, isValidHostname(url));\n }\n else {\n result.hostname = extractHostname(url, false);\n }\n if (step === 0 || result.hostname === null) {\n return result;\n }\n if (options.detectIp === true) {\n result.isIp = isIp$1(result.hostname);\n if (result.isIp === true) {\n return result;\n }\n }\n if (options.validateHostname === true &&\n options.extractHostname === true &&\n isValidHostname(result.hostname) === false) {\n result.hostname = null;\n return result;\n }\n suffixLookup(result.hostname, options, result);\n if (step === 2 || result.publicSuffix === null) {\n return result;\n }\n result.domain = getDomain(result.publicSuffix, result.hostname, options);\n if (step === 3 || result.domain === null) {\n return result;\n }\n result.subdomain = getSubdomain(result.hostname, result.domain);\n if (step === 4 ) {\n return result;\n }\n result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix);\n return result;\n}\n\nfunction fastPathLookup (hostname, options, out) {\n if (options.allowPrivateDomains === false && hostname.length > 3) {\n const last = hostname.length - 1;\n const c3 = hostname.charCodeAt(last);\n const c2 = hostname.charCodeAt(last - 1);\n const c1 = hostname.charCodeAt(last - 2);\n const c0 = hostname.charCodeAt(last - 3);\n if (c3 === 109 &&\n c2 === 111 &&\n c1 === 99 &&\n c0 === 46 ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'com';\n return true;\n }\n else if (c3 === 103 &&\n c2 === 114 &&\n c1 === 111 &&\n c0 === 46 ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'org';\n return true;\n }\n else if (c3 === 117 &&\n c2 === 100 &&\n c1 === 101 &&\n c0 === 46 ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'edu';\n return true;\n }\n else if (c3 === 118 &&\n c2 === 111 &&\n c1 === 103 &&\n c0 === 46 ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'gov';\n return true;\n }\n else if (c3 === 116 &&\n c2 === 101 &&\n c1 === 110 &&\n c0 === 46 ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'net';\n return true;\n }\n else if (c3 === 101 &&\n c2 === 100 &&\n c1 === 46 ) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'de';\n return true;\n }\n }\n return false;\n}\n\nconst exceptions = (function () {\n const _0 = { \"$\": 1, \"succ\": {} }, _1 = { \"$\": 0, \"succ\": { \"city\": _0 } };\n const exceptions = { \"$\": 0, \"succ\": { \"ck\": { \"$\": 0, \"succ\": { \"www\": _0 } }, \"jp\": { \"$\": 0, \"succ\": { \"kawasaki\": _1, \"kitakyushu\": _1, \"kobe\": _1, \"nagoya\": _1, \"sapporo\": _1, \"sendai\": _1, \"yokohama\": _1 } } } };\n return exceptions;\n})();\nconst rules = (function () {\n const _2 = { \"$\": 1, \"succ\": {} }, _3 = { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"mil\": _2, \"org\": _2 } }, _4 = { \"$\": 2, \"succ\": {} }, _5 = { \"$\": 1, \"succ\": { \"blogspot\": _4 } }, _6 = { \"$\": 1, \"succ\": { \"gov\": _2 } }, _7 = { \"$\": 0, \"succ\": { \"*\": _4 } }, _8 = { \"$\": 0, \"succ\": { \"*\": _2 } }, _9 = { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"gov\": _2 } }, _10 = { \"$\": 1, \"succ\": { \"co\": _4 } }, _11 = { \"$\": 1, \"succ\": { \"ng\": _4 } }, _12 = { \"$\": 0, \"succ\": { \"s3\": _4 } }, _13 = { \"$\": 0, \"succ\": { \"dualstack\": _12 } }, _14 = { \"$\": 0, \"succ\": { \"s3\": _4, \"dualstack\": _12, \"s3-website\": _4 } }, _15 = { \"$\": 0, \"succ\": { \"apps\": _4 } }, _16 = { \"$\": 0, \"succ\": { \"app\": _4 } }, _17 = { \"$\": 0, \"succ\": { \"j\": _4 } }, _18 = { \"$\": 0, \"succ\": { \"user\": _4 } }, _19 = { \"$\": 1, \"succ\": { \"ybo\": _4 } }, _20 = { \"$\": 1, \"succ\": { \"gov\": _2, \"blogspot\": _4, \"nym\": _4 } }, _21 = { \"$\": 0, \"succ\": { \"cust\": _4 } }, _22 = { \"$\": 1, \"succ\": { \"edu\": _2, \"biz\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"info\": _2, \"com\": _2 } }, _23 = { \"$\": 1, \"succ\": { \"blogspot\": _4, \"nym\": _4 } }, _24 = { \"$\": 1, \"succ\": { \"for\": _4 } }, _25 = { \"$\": 1, \"succ\": { \"barsy\": _4 } }, _26 = { \"$\": 0, \"succ\": { \"forgot\": _4 } }, _27 = { \"$\": 0, \"succ\": { \"jelastic\": _4 } }, _28 = { \"$\": 1, \"succ\": { \"gs\": _2 } }, _29 = { \"$\": 0, \"succ\": { \"nes\": _2 } }, _30 = { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _2 } }, _31 = { \"$\": 1, \"succ\": { \"cc\": _2, \"lib\": _2 } };\n const rules = { \"$\": 0, \"succ\": { \"ac\": _3, \"ad\": { \"$\": 1, \"succ\": { \"nom\": _2 } }, \"ae\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"ac\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"aero\": { \"$\": 1, \"succ\": { \"accident-investigation\": _2, \"accident-prevention\": _2, \"aerobatic\": _2, \"aeroclub\": _2, \"aerodrome\": _2, \"agents\": _2, \"aircraft\": _2, \"airline\": _2, \"airport\": _2, \"air-surveillance\": _2, \"airtraffic\": _2, \"air-traffic-control\": _2, \"ambulance\": _2, \"amusement\": _2, \"association\": _2, \"author\": _2, \"ballooning\": _2, \"broker\": _2, \"caa\": _2, \"cargo\": _2, \"catering\": _2, \"certification\": _2, \"championship\": _2, \"charter\": _2, \"civilaviation\": _2, \"club\": _2, \"conference\": _2, \"consultant\": _2, \"consulting\": _2, \"control\": _2, \"council\": _2, \"crew\": _2, \"design\": _2, \"dgca\": _2, \"educator\": _2, \"emergency\": _2, \"engine\": _2, \"engineer\": _2, \"entertainment\": _2, \"equipment\": _2, \"exchange\": _2, \"express\": _2, \"federation\": _2, \"flight\": _2, \"fuel\": _2, \"gliding\": _2, \"government\": _2, \"groundhandling\": _2, \"group\": _2, \"hanggliding\": _2, \"homebuilt\": _2, \"insurance\": _2, \"journal\": _2, \"journalist\": _2, \"leasing\": _2, \"logistics\": _2, \"magazine\": _2, \"maintenance\": _2, \"media\": _2, \"microlight\": _2, \"modelling\": _2, \"navigation\": _2, \"parachuting\": _2, \"paragliding\": _2, \"passenger-association\": _2, \"pilot\": _2, \"press\": _2, \"production\": _2, \"recreation\": _2, \"repbody\": _2, \"res\": _2, \"research\": _2, \"rotorcraft\": _2, \"safety\": _2, \"scientist\": _2, \"services\": _2, \"show\": _2, \"skydiving\": _2, \"software\": _2, \"student\": _2, \"trader\": _2, \"trading\": _2, \"trainer\": _2, \"union\": _2, \"workinggroup\": _2, \"works\": _2 } }, \"af\": { \"$\": 1, \"succ\": { \"gov\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"nom\": _4 } }, \"ag\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"co\": _2, \"nom\": _2 } }, \"ai\": { \"$\": 1, \"succ\": { \"off\": _2, \"com\": _2, \"net\": _2, \"org\": _2, \"uwu\": _4, \"nom\": _4 } }, \"al\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"am\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"commune\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _4, \"neko\": _4, \"nyaa\": _4 } }, \"ao\": { \"$\": 1, \"succ\": { \"ed\": _2, \"gv\": _2, \"og\": _2, \"co\": _2, \"pb\": _2, \"it\": _2 } }, \"aq\": _2, \"ar\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"musica\": _2, \"net\": _2, \"org\": _2, \"tur\": _2 } }, \"arpa\": { \"$\": 1, \"succ\": { \"e164\": _2, \"in-addr\": _2, \"ip6\": _2, \"iris\": _2, \"uri\": _2, \"urn\": _2 } }, \"as\": _6, \"asia\": { \"$\": 1, \"succ\": { \"cloudns\": _4 } }, \"at\": { \"$\": 1, \"succ\": { \"ac\": { \"$\": 1, \"succ\": { \"sth\": _2 } }, \"co\": _5, \"gv\": _2, \"or\": _2, \"funkfeuer\": { \"$\": 0, \"succ\": { \"wien\": _4 } }, \"futurecms\": { \"$\": 0, \"succ\": { \"*\": _4, \"ex\": _7, \"in\": _7 } }, \"futurehosting\": _4, \"futuremailing\": _4, \"ortsinfo\": { \"$\": 0, \"succ\": { \"ex\": _7, \"kunden\": _7 } }, \"biz\": _4, \"info\": _4, \"priv\": _4, \"12hp\": _4, \"2ix\": _4, \"4lima\": _4, \"lima-city\": _4 } }, \"au\": { \"$\": 1, \"succ\": { \"com\": _5, \"net\": _2, \"org\": _2, \"edu\": { \"$\": 1, \"succ\": { \"act\": _2, \"catholic\": _2, \"nsw\": { \"$\": 1, \"succ\": { \"schools\": _2 } }, \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"gov\": { \"$\": 1, \"succ\": { \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"asn\": _2, \"id\": _2, \"info\": _2, \"conf\": _2, \"oz\": _2, \"act\": _2, \"nsw\": _2, \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"aw\": { \"$\": 1, \"succ\": { \"com\": _2 } }, \"ax\": { \"$\": 1, \"succ\": { \"be\": _4, \"cat\": _4, \"es\": _4, \"eu\": _4, \"gg\": _4, \"mc\": _4, \"us\": _4, \"xy\": _4 } }, \"az\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"int\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"info\": _2, \"pp\": _2, \"mil\": _2, \"name\": _2, \"pro\": _2, \"biz\": _2 } }, \"ba\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _4 } }, \"bb\": { \"$\": 1, \"succ\": { \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"store\": _2, \"tv\": _2 } }, \"bd\": _8, \"be\": { \"$\": 1, \"succ\": { \"ac\": _2, \"webhosting\": _4, \"blogspot\": _4, \"transurl\": _7 } }, \"bf\": _6, \"bg\": { \"$\": 1, \"succ\": { \"0\": _2, \"1\": _2, \"2\": _2, \"3\": _2, \"4\": _2, \"5\": _2, \"6\": _2, \"7\": _2, \"8\": _2, \"9\": _2, \"a\": _2, \"b\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"j\": _2, \"k\": _2, \"l\": _2, \"m\": _2, \"n\": _2, \"o\": _2, \"p\": _2, \"q\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"u\": _2, \"v\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"blogspot\": _4, \"barsy\": _4 } }, \"bh\": _9, \"bi\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"or\": _2, \"org\": _2 } }, \"biz\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"dyndns\": _4, \"for-better\": _4, \"for-more\": _4, \"for-some\": _4, \"for-the\": _4, \"selfip\": _4, \"webhop\": _4, \"bpl\": _4, \"orx\": _4, \"mmafan\": _4, \"myftp\": _4, \"no-ip\": _4, \"dscloud\": _4 } }, \"bj\": { \"$\": 1, \"succ\": { \"asso\": _2, \"barreau\": _2, \"gouv\": _2, \"blogspot\": _4 } }, \"bm\": _9, \"bn\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"co\": _4 } }, \"bo\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"int\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"tv\": _2, \"web\": _2, \"academia\": _2, \"agro\": _2, \"arte\": _2, \"blog\": _2, \"bolivia\": _2, \"ciencia\": _2, \"cooperativa\": _2, \"democracia\": _2, \"deporte\": _2, \"ecologia\": _2, \"economia\": _2, \"empresa\": _2, \"indigena\": _2, \"industria\": _2, \"info\": _2, \"medicina\": _2, \"movimiento\": _2, \"musica\": _2, \"natural\": _2, \"nombre\": _2, \"noticias\": _2, \"patria\": _2, \"politica\": _2, \"profesional\": _2, \"plurinacional\": _2, \"pueblo\": _2, \"revista\": _2, \"salud\": _2, \"tecnologia\": _2, \"tksat\": _2, \"transporte\": _2, \"wiki\": _2 } }, \"br\": { \"$\": 1, \"succ\": { \"9guacu\": _2, \"abc\": _2, \"adm\": _2, \"adv\": _2, \"agr\": _2, \"aju\": _2, \"am\": _2, \"anani\": _2, \"aparecida\": _2, \"app\": _2, \"arq\": _2, \"art\": _2, \"ato\": _2, \"b\": _2, \"barueri\": _2, \"belem\": _2, \"bhz\": _2, \"bib\": _2, \"bio\": _2, \"blog\": _2, \"bmd\": _2, \"boavista\": _2, \"bsb\": _2, \"campinagrande\": _2, \"campinas\": _2, \"caxias\": _2, \"cim\": _2, \"cng\": _2, \"cnt\": _2, \"com\": _5, \"contagem\": _2, \"coop\": _2, \"coz\": _2, \"cri\": _2, \"cuiaba\": _2, \"curitiba\": _2, \"def\": _2, \"des\": _2, \"det\": _2, \"dev\": _2, \"ecn\": _2, \"eco\": _2, \"edu\": _2, \"emp\": _2, \"enf\": _2, \"eng\": _2, \"esp\": _2, \"etc\": _2, \"eti\": _2, \"far\": _2, \"feira\": _2, \"flog\": _2, \"floripa\": _2, \"fm\": _2, \"fnd\": _2, \"fortal\": _2, \"fot\": _2, \"foz\": _2, \"fst\": _2, \"g12\": _2, \"geo\": _2, \"ggf\": _2, \"goiania\": _2, \"gov\": { \"$\": 1, \"succ\": { \"ac\": _2, \"al\": _2, \"am\": _2, \"ap\": _2, \"ba\": _2, \"ce\": _2, \"df\": _2, \"es\": _2, \"go\": _2, \"ma\": _2, \"mg\": _2, \"ms\": _2, \"mt\": _2, \"pa\": _2, \"pb\": _2, \"pe\": _2, \"pi\": _2, \"pr\": _2, \"rj\": _2, \"rn\": _2, \"ro\": _2, \"rr\": _2, \"rs\": _2, \"sc\": _2, \"se\": _2, \"sp\": _2, \"to\": _2 } }, \"gru\": _2, \"imb\": _2, \"ind\": _2, \"inf\": _2, \"jab\": _2, \"jampa\": _2, \"jdf\": _2, \"joinville\": _2, \"jor\": _2, \"jus\": _2, \"leg\": { \"$\": 1, \"succ\": { \"ac\": _4, \"al\": _4, \"am\": _4, \"ap\": _4, \"ba\": _4, \"ce\": _4, \"df\": _4, \"es\": _4, \"go\": _4, \"ma\": _4, \"mg\": _4, \"ms\": _4, \"mt\": _4, \"pa\": _4, \"pb\": _4, \"pe\": _4, \"pi\": _4, \"pr\": _4, \"rj\": _4, \"rn\": _4, \"ro\": _4, \"rr\": _4, \"rs\": _4, \"sc\": _4, \"se\": _4, \"sp\": _4, \"to\": _4 } }, \"lel\": _2, \"log\": _2, \"londrina\": _2, \"macapa\": _2, \"maceio\": _2, \"manaus\": _2, \"maringa\": _2, \"mat\": _2, \"med\": _2, \"mil\": _2, \"morena\": _2, \"mp\": _2, \"mus\": _2, \"natal\": _2, \"net\": _2, \"niteroi\": _2, \"nom\": _8, \"not\": _2, \"ntr\": _2, \"odo\": _2, \"ong\": _2, \"org\": _2, \"osasco\": _2, \"palmas\": _2, \"poa\": _2, \"ppg\": _2, \"pro\": _2, \"psc\": _2, \"psi\": _2, \"pvh\": _2, \"qsl\": _2, \"radio\": _2, \"rec\": _2, \"recife\": _2, \"rep\": _2, \"ribeirao\": _2, \"rio\": _2, \"riobranco\": _2, \"riopreto\": _2, \"salvador\": _2, \"sampa\": _2, \"santamaria\": _2, \"santoandre\": _2, \"saobernardo\": _2, \"saogonca\": _2, \"seg\": _2, \"sjc\": _2, \"slg\": _2, \"slz\": _2, \"sorocaba\": _2, \"srv\": _2, \"taxi\": _2, \"tc\": _2, \"tec\": _2, \"teo\": _2, \"the\": _2, \"tmp\": _2, \"trd\": _2, \"tur\": _2, \"tv\": _2, \"udi\": _2, \"vet\": _2, \"vix\": _2, \"vlog\": _2, \"wiki\": _2, \"zlg\": _2 } }, \"bs\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"we\": _4 } }, \"bt\": _9, \"bv\": _2, \"bw\": { \"$\": 1, \"succ\": { \"co\": _2, \"org\": _2 } }, \"by\": { \"$\": 1, \"succ\": { \"gov\": _2, \"mil\": _2, \"com\": _5, \"of\": _2, \"nym\": _4 } }, \"bz\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"za\": _4, \"nom\": _4, \"nym\": _4 } }, \"ca\": { \"$\": 1, \"succ\": { \"ab\": _2, \"bc\": _2, \"mb\": _2, \"nb\": _2, \"nf\": _2, \"nl\": _2, \"ns\": _2, \"nt\": _2, \"nu\": _2, \"on\": _2, \"pe\": _2, \"qc\": _2, \"sk\": _2, \"yk\": _2, \"gc\": _2, \"barsy\": _4, \"awdev\": _7, \"co\": _4, \"blogspot\": _4, \"no-ip\": _4 } }, \"cat\": _2, \"cc\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"ftpaccess\": _4, \"game-server\": _4, \"myphotos\": _4, \"scrapping\": _4, \"twmail\": _4, \"csx\": _4, \"fantasyleague\": _4 } }, \"cd\": _6, \"cf\": _5, \"cg\": _2, \"ch\": { \"$\": 1, \"succ\": { \"square7\": _4, \"blogspot\": _4, \"linkyard-cloud\": _4, \"dnsking\": _4, \"gotdns\": _4, \"12hp\": _4, \"2ix\": _4, \"4lima\": _4, \"lima-city\": _4 } }, \"ci\": { \"$\": 1, \"succ\": { \"org\": _2, \"or\": _2, \"com\": _2, \"co\": _2, \"edu\": _2, \"ed\": _2, \"ac\": _2, \"net\": _2, \"go\": _2, \"asso\": _2, \"xn--aroport-bya\": _2, \"aéroport\": _2, \"int\": _2, \"presse\": _2, \"md\": _2, \"gouv\": _2, \"fin\": _4, \"nl\": _4 } }, \"ck\": _8, \"cl\": { \"$\": 1, \"succ\": { \"aprendemas\": _2, \"co\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"cm\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"gov\": _2, \"net\": _2 } }, \"cn\": { \"$\": 1, \"succ\": { \"ac\": _2, \"com\": { \"$\": 1, \"succ\": { \"amazonaws\": { \"$\": 0, \"succ\": { \"compute\": _7, \"eb\": { \"$\": 0, \"succ\": { \"cn-north-1\": _4, \"cn-northwest-1\": _4 } }, \"elb\": _7, \"cn-north-1\": _12 } } } }, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"mil\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"ah\": _2, \"bj\": _2, \"cq\": _2, \"fj\": _2, \"gd\": _2, \"gs\": _2, \"gz\": _2, \"gx\": _2, \"ha\": _2, \"hb\": _2, \"he\": _2, \"hi\": _2, \"hl\": _2, \"hn\": _2, \"jl\": _2, \"js\": _2, \"jx\": _2, \"ln\": _2, \"nm\": _2, \"nx\": _2, \"qh\": _2, \"sc\": _2, \"sd\": _2, \"sh\": _2, \"sn\": _2, \"sx\": _2, \"tj\": _2, \"xj\": _2, \"xz\": _2, \"yn\": _2, \"zj\": _2, \"hk\": _2, \"mo\": _2, \"tw\": _2, \"instantcloud\": _4 } }, \"co\": { \"$\": 1, \"succ\": { \"arts\": _2, \"com\": _5, \"edu\": _2, \"firm\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"rec\": _2, \"web\": _2, \"carrd\": _4, \"crd\": _4, \"otap\": _7, \"leadpages\": _4, \"lpages\": _4, \"mypi\": _4, \"n4t\": _4, \"nodum\": _4, \"repl\": _4 } }, \"com\": { \"$\": 1, \"succ\": { \"adobeaemcloud\": { \"$\": 2, \"succ\": { \"dev\": _7 } }, \"kasserver\": _4, \"amazonaws\": { \"$\": 0, \"succ\": { \"compute\": _7, \"compute-1\": _7, \"us-east-1\": { \"$\": 2, \"succ\": { \"dualstack\": _12 } }, \"elb\": _7, \"s3\": _4, \"s3-ap-northeast-1\": _4, \"s3-ap-northeast-2\": _4, \"s3-ap-south-1\": _4, \"s3-ap-southeast-1\": _4, \"s3-ap-southeast-2\": _4, \"s3-ca-central-1\": _4, \"s3-eu-central-1\": _4, \"s3-eu-west-1\": _4, \"s3-eu-west-2\": _4, \"s3-eu-west-3\": _4, \"s3-external-1\": _4, \"s3-fips-us-gov-west-1\": _4, \"s3-sa-east-1\": _4, \"s3-us-gov-west-1\": _4, \"s3-us-east-2\": _4, \"s3-us-west-1\": _4, \"s3-us-west-2\": _4, \"ap-northeast-2\": _14, \"ap-south-1\": _14, \"ca-central-1\": _14, \"eu-central-1\": _14, \"eu-west-2\": _14, \"eu-west-3\": _14, \"us-east-2\": _14, \"ap-northeast-1\": _13, \"ap-southeast-1\": _13, \"ap-southeast-2\": _13, \"eu-west-1\": _13, \"sa-east-1\": _13, \"s3-website-us-east-1\": _4, \"s3-website-us-west-1\": _4, \"s3-website-us-west-2\": _4, \"s3-website-ap-northeast-1\": _4, \"s3-website-ap-southeast-1\": _4, \"s3-website-ap-southeast-2\": _4, \"s3-website-eu-west-1\": _4, \"s3-website-sa-east-1\": _4 } }, \"elasticbeanstalk\": { \"$\": 2, \"succ\": { \"ap-northeast-1\": _4, \"ap-northeast-2\": _4, \"ap-northeast-3\": _4, \"ap-south-1\": _4, \"ap-southeast-1\": _4, \"ap-southeast-2\": _4, \"ca-central-1\": _4, \"eu-central-1\": _4, \"eu-west-1\": _4, \"eu-west-2\": _4, \"eu-west-3\": _4, \"sa-east-1\": _4, \"us-east-1\": _4, \"us-east-2\": _4, \"us-gov-west-1\": _4, \"us-west-1\": _4, \"us-west-2\": _4 } }, \"on-aptible\": _4, \"myasustor\": _4, \"balena-devices\": _4, \"betainabox\": _4, \"bplaced\": _4, \"ar\": _4, \"br\": _4, \"cn\": _4, \"de\": _4, \"eu\": _4, \"gb\": _4, \"hu\": _4, \"jpn\": _4, \"kr\": _4, \"mex\": _4, \"no\": _4, \"qc\": _4, \"ru\": _4, \"sa\": _4, \"uk\": _4, \"us\": _4, \"uy\": _4, \"za\": _4, \"africa\": _4, \"gr\": _4, \"co\": _4, \"xenapponazure\": _4, \"jdevcloud\": _4, \"wpdevcloud\": _4, \"cloudcontrolled\": _4, \"cloudcontrolapp\": _4, \"trycloudflare\": _4, \"customer-oci\": { \"$\": 0, \"succ\": { \"*\": _4, \"oci\": _7, \"ocp\": _7, \"ocs\": _7 } }, \"dattolocal\": _4, \"dattorelay\": _4, \"dattoweb\": _4, \"mydatto\": _4, \"builtwithdark\": _4, \"drayddns\": _4, \"dreamhosters\": _4, \"mydrobo\": _4, \"dyndns-at-home\": _4, \"dyndns-at-work\": _4, \"dyndns-blog\": _4, \"dyndns-free\": _4, \"dyndns-home\": _4, \"dyndns-ip\": _4, \"dyndns-mail\": _4, \"dyndns-office\": _4, \"dyndns-pics\": _4, \"dyndns-remote\": _4, \"dyndns-server\": _4, \"dyndns-web\": _4, \"dyndns-wiki\": _4, \"dyndns-work\": _4, \"blogdns\": _4, \"cechire\": _4, \"dnsalias\": _4, \"dnsdojo\": _4, \"doesntexist\": _4, \"dontexist\": _4, \"doomdns\": _4, \"dyn-o-saur\": _4, \"dynalias\": _4, \"est-a-la-maison\": _4, \"est-a-la-masion\": _4, \"est-le-patron\": _4, \"est-mon-blogueur\": _4, \"from-ak\": _4, \"from-al\": _4, \"from-ar\": _4, \"from-ca\": _4, \"from-ct\": _4, \"from-dc\": _4, \"from-de\": _4, \"from-fl\": _4, \"from-ga\": _4, \"from-hi\": _4, \"from-ia\": _4, \"from-id\": _4, \"from-il\": _4, \"from-in\": _4, \"from-ks\": _4, \"from-ky\": _4, \"from-ma\": _4, \"from-md\": _4, \"from-mi\": _4, \"from-mn\": _4, \"from-mo\": _4, \"from-ms\": _4, \"from-mt\": _4, \"from-nc\": _4, \"from-nd\": _4, \"from-ne\": _4, \"from-nh\": _4, \"from-nj\": _4, \"from-nm\": _4, \"from-nv\": _4, \"from-oh\": _4, \"from-ok\": _4, \"from-or\": _4, \"from-pa\": _4, \"from-pr\": _4, \"from-ri\": _4, \"from-sc\": _4, \"from-sd\": _4, \"from-tn\": _4, \"from-tx\": _4, \"from-ut\": _4, \"from-va\": _4, \"from-vt\": _4, \"from-wa\": _4, \"from-wi\": _4, \"from-wv\": _4, \"from-wy\": _4, \"getmyip\": _4, \"gotdns\": _4, \"hobby-site\": _4, \"homelinux\": _4, \"homeunix\": _4, \"iamallama\": _4, \"is-a-anarchist\": _4, \"is-a-blogger\": _4, \"is-a-bookkeeper\": _4, \"is-a-bulls-fan\": _4, \"is-a-caterer\": _4, \"is-a-chef\": _4, \"is-a-conservative\": _4, \"is-a-cpa\": _4, \"is-a-cubicle-slave\": _4, \"is-a-democrat\": _4, \"is-a-designer\": _4, \"is-a-doctor\": _4, \"is-a-financialadvisor\": _4, \"is-a-geek\": _4, \"is-a-green\": _4, \"is-a-guru\": _4, \"is-a-hard-worker\": _4, \"is-a-hunter\": _4, \"is-a-landscaper\": _4, \"is-a-lawyer\": _4, \"is-a-liberal\": _4, \"is-a-libertarian\": _4, \"is-a-llama\": _4, \"is-a-musician\": _4, \"is-a-nascarfan\": _4, \"is-a-nurse\": _4, \"is-a-painter\": _4, \"is-a-personaltrainer\": _4, \"is-a-photographer\": _4, \"is-a-player\": _4, \"is-a-republican\": _4, \"is-a-rockstar\": _4, \"is-a-socialist\": _4, \"is-a-student\": _4, \"is-a-teacher\": _4, \"is-a-techie\": _4, \"is-a-therapist\": _4, \"is-an-accountant\": _4, \"is-an-actor\": _4, \"is-an-actress\": _4, \"is-an-anarchist\": _4, \"is-an-artist\": _4, \"is-an-engineer\": _4, \"is-an-entertainer\": _4, \"is-certified\": _4, \"is-gone\": _4, \"is-into-anime\": _4, \"is-into-cars\": _4, \"is-into-cartoons\": _4, \"is-into-games\": _4, \"is-leet\": _4, \"is-not-certified\": _4, \"is-slick\": _4, \"is-uberleet\": _4, \"is-with-theband\": _4, \"isa-geek\": _4, \"isa-hockeynut\": _4, \"issmarterthanyou\": _4, \"likes-pie\": _4, \"likescandy\": _4, \"neat-url\": _4, \"saves-the-whales\": _4, \"selfip\": _4, \"sells-for-less\": _4, \"sells-for-u\": _4, \"servebbs\": _4, \"simple-url\": _4, \"space-to-rent\": _4, \"teaches-yoga\": _4, \"writesthisblog\": _4, \"ddnsfree\": _4, \"ddnsgeek\": _4, \"giize\": _4, \"gleeze\": _4, \"kozow\": _4, \"loseyourip\": _4, \"ooguy\": _4, \"theworkpc\": _4, \"mytuleap\": _4, \"evennode\": { \"$\": 0, \"succ\": { \"eu-1\": _4, \"eu-2\": _4, \"eu-3\": _4, \"eu-4\": _4, \"us-1\": _4, \"us-2\": _4, \"us-3\": _4, \"us-4\": _4 } }, \"onfabrica\": _4, \"fbsbx\": _15, \"fastly-terrarium\": _4, \"fastvps-server\": _4, \"mydobiss\": _4, \"firebaseapp\": _4, \"freebox-os\": _4, \"freeboxos\": _4, \"gentapps\": _4, \"gentlentapis\": _4, \"githubusercontent\": _4, \"0emm\": _7, \"appspot\": { \"$\": 2, \"succ\": { \"r\": _7 } }, \"blogspot\": _4, \"codespot\": _4, \"googleapis\": _4, \"googlecode\": _4, \"pagespeedmobilizer\": _4, \"publishproxy\": _4, \"withgoogle\": _4, \"withyoutube\": _4, \"awsmppl\": _4, \"herokuapp\": _4, \"herokussl\": _4, \"myravendb\": _4, \"pixolino\": _4, \"dopaas\": _4, \"hidora\": _4, \"ik-server\": { \"$\": 0, \"succ\": { \"jcloud\": _4 } }, \"jelastic\": { \"$\": 0, \"succ\": { \"demo\": _4 } }, \"joyent\": { \"$\": 0, \"succ\": { \"cns\": _7 } }, \"lpusercontent\": _4, \"lmpm\": _16, \"linode\": { \"$\": 0, \"succ\": { \"members\": _4, \"nodebalancer\": _7 } }, \"linodeobjects\": _7, \"barsycenter\": _4, \"barsyonline\": _4, \"miniserver\": _4, \"meteorapp\": { \"$\": 2, \"succ\": { \"eu\": _4 } }, \"4u\": _4, \"nfshost\": _4, \"001www\": _4, \"ddnslive\": _4, \"myiphost\": _4, \"blogsyte\": _4, \"ciscofreak\": _4, \"damnserver\": _4, \"ditchyourip\": _4, \"dnsiskinky\": _4, \"dynns\": _4, \"geekgalaxy\": _4, \"health-carereform\": _4, \"homesecuritymac\": _4, \"homesecuritypc\": _4, \"myactivedirectory\": _4, \"mysecuritycamera\": _4, \"net-freaks\": _4, \"onthewifi\": _4, \"point2this\": _4, \"quicksytes\": _4, \"securitytactics\": _4, \"serveexchange\": _4, \"servehumour\": _4, \"servep2p\": _4, \"servesarcasm\": _4, \"stufftoread\": _4, \"unusualperson\": _4, \"workisboring\": _4, \"3utilities\": _4, \"ddnsking\": _4, \"myvnc\": _4, \"servebeer\": _4, \"servecounterstrike\": _4, \"serveftp\": _4, \"servegame\": _4, \"servehalflife\": _4, \"servehttp\": _4, \"serveirc\": _4, \"servemp3\": _4, \"servepics\": _4, \"servequake\": _4, \"observableusercontent\": { \"$\": 0, \"succ\": { \"static\": _4 } }, \"operaunite\": _4, \"skygearapp\": _4, \"outsystemscloud\": _4, \"ownprovider\": _4, \"pgfog\": _4, \"pagefrontapp\": _4, \"pagexl\": _4, \"gotpantheon\": _4, \"platter-app\": _4, \"pleskns\": _4, \"prgmr\": { \"$\": 0, \"succ\": { \"xen\": _4 } }, \"qualifioapp\": _4, \"qbuser\": _4, \"qa2\": _4, \"dev-myqnapcloud\": _4, \"alpha-myqnapcloud\": _4, \"myqnapcloud\": _4, \"quipelements\": _7, \"rackmaze\": _4, \"rhcloud\": _4, \"render\": _16, \"onrender\": _4, \"logoip\": _4, \"scrysec\": _4, \"firewall-gateway\": _4, \"myshopblocks\": _4, \"shopitsite\": _4, \"1kapp\": _4, \"appchizi\": _4, \"applinzi\": _4, \"sinaapp\": _4, \"vipsinaapp\": _4, \"bounty-full\": { \"$\": 2, \"succ\": { \"alpha\": _4, \"beta\": _4 } }, \"stackhero-network\": _4, \"playstation-cloud\": _4, \"stdlib\": { \"$\": 0, \"succ\": { \"api\": _4 } }, \"temp-dns\": _4, \"dsmynas\": _4, \"familyds\": _4, \"thingdustdata\": _4, \"bloxcms\": _4, \"townnews-staging\": _4, \"hk\": _4, \"wafflecell\": _4, \"remotewd\": _4, \"wiardweb\": { \"$\": 0, \"succ\": { \"pages\": _4 } }, \"xnbay\": { \"$\": 2, \"succ\": { \"u2\": _4, \"u2-local\": _4 } }, \"yolasite\": _4, \"wpenginepowered\": _4, \"impertrixcdn\": _4, \"impertrix\": _4 } }, \"coop\": _2, \"cr\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"ed\": _2, \"fi\": _2, \"go\": _2, \"or\": _2, \"sa\": _2 } }, \"cu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"gov\": _2, \"inf\": _2 } }, \"cv\": _5, \"cw\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2 } }, \"cx\": { \"$\": 1, \"succ\": { \"gov\": _2, \"ath\": _4, \"info\": _4 } }, \"cy\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"com\": { \"$\": 1, \"succ\": { \"blogspot\": _4, \"scaleforce\": _17 } }, \"ekloges\": _2, \"gov\": _2, \"ltd\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"parliament\": _2, \"press\": _2, \"pro\": _2, \"tm\": _2 } }, \"cz\": { \"$\": 1, \"succ\": { \"co\": _4, \"realm\": _4, \"e4\": _4, \"blogspot\": _4, \"metacentrum\": { \"$\": 0, \"succ\": { \"cloud\": _4, \"custom\": _4 } }, \"muni\": { \"$\": 0, \"succ\": { \"cloud\": { \"$\": 0, \"succ\": { \"flt\": _4, \"usr\": _4 } } } } } }, \"de\": { \"$\": 1, \"succ\": { \"bplaced\": _4, \"square7\": _4, \"com\": _4, \"cosidns\": { \"$\": 0, \"succ\": { \"dyn\": _4 } }, \"dynamisches-dns\": _4, \"dnsupdater\": _4, \"internet-dns\": _4, \"l-o-g-i-n\": _4, \"dnshome\": _4, \"fuettertdasnetz\": _4, \"isteingeek\": _4, \"istmein\": _4, \"lebtimnetz\": _4, \"leitungsen\": _4, \"traeumtgerade\": _4, \"ddnss\": { \"$\": 2, \"succ\": { \"dyn\": _4, \"dyndns\": _4 } }, \"dyndns1\": _4, \"dyn-ip24\": _4, \"home-webserver\": { \"$\": 2, \"succ\": { \"dyn\": _4 } }, \"myhome-server\": _4, \"goip\": _4, \"blogspot\": _4, \"dyn-berlin\": _4, \"in-berlin\": _4, \"in-brb\": _4, \"in-butter\": _4, \"in-dsl\": _4, \"in-vpn\": _4, \"mein-iserv\": _4, \"schulserver\": _4, \"test-iserv\": _4, \"keymachine\": _4, \"git-repos\": _4, \"lcube-server\": _4, \"svn-repos\": _4, \"barsy\": _4, \"logoip\": _4, \"firewall-gateway\": _4, \"my-gateway\": _4, \"my-router\": _4, \"spdns\": _4, \"speedpartner\": { \"$\": 0, \"succ\": { \"customer\": _4 } }, \"taifun-dns\": _4, \"12hp\": _4, \"2ix\": _4, \"4lima\": _4, \"lima-city\": _4, \"dd-dns\": _4, \"dray-dns\": _4, \"draydns\": _4, \"dyn-vpn\": _4, \"dynvpn\": _4, \"mein-vigor\": _4, \"my-vigor\": _4, \"my-wan\": _4, \"syno-ds\": _4, \"synology-diskstation\": _4, \"synology-ds\": _4, \"uberspace\": _7, \"virtualuser\": _4, \"virtual-user\": _4, \"community-pro\": _4, \"diskussionsbereich\": _4 } }, \"dj\": _2, \"dk\": { \"$\": 1, \"succ\": { \"biz\": _4, \"co\": _4, \"firm\": _4, \"reg\": _4, \"store\": _4, \"blogspot\": _4 } }, \"dm\": _9, \"do\": { \"$\": 1, \"succ\": { \"art\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sld\": _2, \"web\": _2 } }, \"dz\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"gov\": _2, \"edu\": _2, \"asso\": _2, \"pol\": _2, \"art\": _2 } }, \"ec\": { \"$\": 1, \"succ\": { \"com\": _2, \"info\": _2, \"net\": _2, \"fin\": _2, \"k12\": _2, \"med\": _2, \"pro\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"gob\": _2, \"mil\": _2, \"nym\": _4 } }, \"edu\": { \"$\": 1, \"succ\": { \"rit\": { \"$\": 0, \"succ\": { \"git-pages\": _4 } } } }, \"ee\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"riik\": _2, \"lib\": _2, \"med\": _2, \"com\": _5, \"pri\": _2, \"aip\": _2, \"org\": _2, \"fie\": _2 } }, \"eg\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"eun\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sci\": _2 } }, \"er\": _8, \"es\": { \"$\": 1, \"succ\": { \"com\": _5, \"nom\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2 } }, \"et\": { \"$\": 1, \"succ\": { \"com\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"biz\": _2, \"name\": _2, \"info\": _2, \"net\": _2 } }, \"eu\": { \"$\": 1, \"succ\": { \"mycd\": _4, \"cloudns\": _4, \"barsy\": _4, \"wellbeingzone\": _4, \"spdns\": _4, \"transurl\": _7, \"diskstation\": _4 } }, \"fi\": { \"$\": 1, \"succ\": { \"aland\": _2, \"dy\": _4, \"blogspot\": _4, \"xn--hkkinen-5wa\": _4, \"häkkinen\": _4, \"iki\": _4 } }, \"fj\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"com\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"fk\": _8, \"fm\": _2, \"fo\": _2, \"fr\": { \"$\": 1, \"succ\": { \"asso\": _2, \"com\": _2, \"gouv\": _2, \"nom\": _2, \"prd\": _2, \"tm\": _2, \"aeroport\": _2, \"avocat\": _2, \"avoues\": _2, \"cci\": _2, \"chambagri\": _2, \"chirurgiens-dentistes\": _2, \"experts-comptables\": _2, \"geometre-expert\": _2, \"greta\": _2, \"huissier-justice\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmacien\": _2, \"port\": _2, \"veterinaire\": _2, \"en-root\": _4, \"fbx-os\": _4, \"fbxos\": _4, \"freebox-os\": _4, \"freeboxos\": _4, \"blogspot\": _4, \"on-web\": _4, \"chirurgiens-dentistes-en-france\": _4 } }, \"ga\": _2, \"gb\": _2, \"gd\": { \"$\": 1, \"succ\": { \"nom\": _4 } }, \"ge\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"net\": _2, \"pvt\": _2, \"nom\": _4 } }, \"gf\": _2, \"gg\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"kaas\": _4, \"cya\": _4, \"panel\": { \"$\": 2, \"succ\": { \"daemon\": _4 } } } }, \"gh\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2 } }, \"gi\": { \"$\": 1, \"succ\": { \"com\": _2, \"ltd\": _2, \"gov\": _2, \"mod\": _2, \"edu\": _2, \"org\": _2 } }, \"gl\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"biz\": _4, \"nom\": _4, \"xx\": _4 } }, \"gm\": _2, \"gn\": { \"$\": 1, \"succ\": { \"ac\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"net\": _2 } }, \"gov\": _2, \"gp\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"mobi\": _2, \"edu\": _2, \"org\": _2, \"asso\": _2, \"app\": _4 } }, \"gq\": _2, \"gr\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"gs\": _2, \"gt\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"ind\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"nom\": _4, \"blog\": _4, \"de\": _4, \"to\": _4 } }, \"gu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"guam\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"web\": _2 } }, \"gw\": _2, \"gy\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"nym\": _4, \"be\": _4 } }, \"hk\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"idv\": _2, \"net\": _2, \"org\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--wcvs22d\": _2, \"教育\": _2, \"xn--lcvr32d\": _2, \"敎育\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--gmqw5a\": _2, \"個人\": _2, \"xn--ciqpn\": _2, \"个人\": _2, \"xn--gmq050i\": _2, \"箇人\": _2, \"xn--zf0avx\": _2, \"網络\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--mk0axi\": _2, \"组織\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"xn--od0aq3b\": _2, \"网絡\": _2, \"xn--tn0ag\": _2, \"组织\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--uc0ay4a\": _2, \"組织\": _2, \"blogspot\": _4, \"nym\": _4, \"ltd\": _4, \"inc\": _4 } }, \"hm\": _2, \"hn\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"gob\": _2, \"nom\": _4, \"cc\": _4 } }, \"hr\": { \"$\": 1, \"succ\": { \"iz\": _2, \"from\": _2, \"name\": _2, \"com\": _2, \"blogspot\": _4, \"free\": _4 } }, \"ht\": { \"$\": 1, \"succ\": { \"com\": _2, \"shop\": _2, \"firm\": _2, \"info\": _2, \"adult\": _2, \"net\": _2, \"pro\": _2, \"org\": _2, \"med\": _2, \"art\": _2, \"coop\": _2, \"pol\": _2, \"asso\": _2, \"edu\": _2, \"rel\": _2, \"gouv\": _2, \"perso\": _2 } }, \"hu\": { \"$\": 1, \"succ\": { \"2000\": _2, \"co\": _2, \"info\": _2, \"org\": _2, \"priv\": _2, \"sport\": _2, \"tm\": _2, \"agrar\": _2, \"bolt\": _2, \"casino\": _2, \"city\": _2, \"erotica\": _2, \"erotika\": _2, \"film\": _2, \"forum\": _2, \"games\": _2, \"hotel\": _2, \"ingatlan\": _2, \"jogasz\": _2, \"konyvelo\": _2, \"lakas\": _2, \"media\": _2, \"news\": _2, \"reklam\": _2, \"sex\": _2, \"shop\": _2, \"suli\": _2, \"szex\": _2, \"tozsde\": _2, \"utazas\": _2, \"video\": _2, \"blogspot\": _4 } }, \"id\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _5, \"desa\": _2, \"go\": _2, \"mil\": _2, \"my\": _2, \"net\": _2, \"or\": _2, \"ponpes\": _2, \"sch\": _2, \"web\": _2 } }, \"ie\": _20, \"il\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _5, \"gov\": _2, \"idf\": _2, \"k12\": _2, \"muni\": _2, \"net\": _2, \"org\": _2 } }, \"im\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": { \"$\": 1, \"succ\": { \"ltd\": _2, \"plc\": _2 } }, \"com\": _2, \"net\": _2, \"org\": _2, \"tt\": _2, \"tv\": _2, \"ro\": _4, \"nom\": _4 } }, \"in\": { \"$\": 1, \"succ\": { \"co\": _2, \"firm\": _2, \"net\": _2, \"org\": _2, \"gen\": _2, \"ind\": _2, \"nic\": _2, \"ac\": _2, \"edu\": _2, \"res\": _2, \"gov\": _2, \"mil\": _2, \"cloudns\": _4, \"blogspot\": _4, \"barsy\": _4 } }, \"info\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"dynamic-dns\": _4, \"dyndns\": _4, \"barrel-of-knowledge\": _4, \"barrell-of-knowledge\": _4, \"for-our\": _4, \"groks-the\": _4, \"groks-this\": _4, \"here-for-more\": _4, \"knowsitall\": _4, \"selfip\": _4, \"webhop\": _4, \"barsy\": _4, \"mayfirst\": _4, \"forumz\": _4, \"nsupdate\": _4, \"dvrcam\": _4, \"ilovecollege\": _4, \"no-ip\": _4, \"dnsupdate\": _4, \"v-info\": _4 } }, \"int\": { \"$\": 1, \"succ\": { \"eu\": _2 } }, \"io\": { \"$\": 1, \"succ\": { \"2038\": _4, \"com\": _2, \"apigee\": _4, \"b-data\": _4, \"backplaneapp\": _4, \"banzaicloud\": { \"$\": 0, \"succ\": { \"app\": _4, \"backyards\": _7 } }, \"boxfuse\": _4, \"browsersafetymark\": _4, \"bigv\": { \"$\": 0, \"succ\": { \"uk0\": _4 } }, \"cleverapps\": _4, \"dappnode\": { \"$\": 0, \"succ\": { \"dyndns\": _4 } }, \"dedyn\": _4, \"drud\": _4, \"definima\": _4, \"enonic\": { \"$\": 2, \"succ\": { \"customer\": _4 } }, \"shw\": _4, \"github\": _4, \"gitlab\": _4, \"lolipop\": _4, \"hasura-app\": _4, \"hostyhosting\": _4, \"moonscale\": _7, \"jele\": _4, \"loginline\": _4, \"barsy\": _4, \"azurecontainer\": _7, \"ngrok\": _4, \"nodeart\": { \"$\": 0, \"succ\": { \"stage\": _4 } }, \"nodum\": _4, \"nid\": _4, \"pantheonsite\": _4, \"dyn53\": _4, \"protonet\": _4, \"qcx\": { \"$\": 2, \"succ\": { \"sys\": _7 } }, \"vaporcloud\": _4, \"vbrplsbx\": { \"$\": 0, \"succ\": { \"g\": _4 } }, \"on-k3s\": _7, \"on-rio\": _7, \"readthedocs\": _4, \"resindevice\": _4, \"resinstaging\": { \"$\": 0, \"succ\": { \"devices\": _4 } }, \"hzc\": _4, \"sandcats\": _4, \"shiftedit\": _4, \"mo-siemens\": _4, \"lair\": _15, \"stolos\": _7, \"spacekit\": _4, \"utwente\": _4, \"applicationcloud\": _4, \"scapp\": _4, \"s5y\": _7, \"telebit\": _4, \"thingdust\": { \"$\": 0, \"succ\": { \"dev\": _21, \"disrec\": _21, \"prod\": _21, \"testing\": _21 } }, \"wedeploy\": _4, \"basicserver\": _4, \"virtualserver\": _4 } }, \"iq\": _3, \"ir\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"gov\": _2, \"id\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2 } }, \"is\": { \"$\": 1, \"succ\": { \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"int\": _2, \"cupcake\": _4, \"blogspot\": _4 } }, \"it\": { \"$\": 1, \"succ\": { \"gov\": _2, \"edu\": _2, \"abr\": _2, \"abruzzo\": _2, \"aosta-valley\": _2, \"aostavalley\": _2, \"bas\": _2, \"basilicata\": _2, \"cal\": _2, \"calabria\": _2, \"cam\": _2, \"campania\": _2, \"emilia-romagna\": _2, \"emiliaromagna\": _2, \"emr\": _2, \"friuli-v-giulia\": _2, \"friuli-ve-giulia\": _2, \"friuli-vegiulia\": _2, \"friuli-venezia-giulia\": _2, \"friuli-veneziagiulia\": _2, \"friuli-vgiulia\": _2, \"friuliv-giulia\": _2, \"friulive-giulia\": _2, \"friulivegiulia\": _2, \"friulivenezia-giulia\": _2, \"friuliveneziagiulia\": _2, \"friulivgiulia\": _2, \"fvg\": _2, \"laz\": _2, \"lazio\": _2, \"lig\": _2, \"liguria\": _2, \"lom\": _2, \"lombardia\": _2, \"lombardy\": _2, \"lucania\": _2, \"mar\": _2, \"marche\": _2, \"mol\": _2, \"molise\": _2, \"piedmont\": _2, \"piemonte\": _2, \"pmn\": _2, \"pug\": _2, \"puglia\": _2, \"sar\": _2, \"sardegna\": _2, \"sardinia\": _2, \"sic\": _2, \"sicilia\": _2, \"sicily\": _2, \"taa\": _2, \"tos\": _2, \"toscana\": _2, \"trentin-sud-tirol\": _2, \"xn--trentin-sd-tirol-rzb\": _2, \"trentin-süd-tirol\": _2, \"trentin-sudtirol\": _2, \"xn--trentin-sdtirol-7vb\": _2, \"trentin-südtirol\": _2, \"trentin-sued-tirol\": _2, \"trentin-suedtirol\": _2, \"trentino-a-adige\": _2, \"trentino-aadige\": _2, \"trentino-alto-adige\": _2, \"trentino-altoadige\": _2, \"trentino-s-tirol\": _2, \"trentino-stirol\": _2, \"trentino-sud-tirol\": _2, \"xn--trentino-sd-tirol-c3b\": _2, \"trentino-süd-tirol\": _2, \"trentino-sudtirol\": _2, \"xn--trentino-sdtirol-szb\": _2, \"trentino-südtirol\": _2, \"trentino-sued-tirol\": _2, \"trentino-suedtirol\": _2, \"trentino\": _2, \"trentinoa-adige\": _2, \"trentinoaadige\": _2, \"trentinoalto-adige\": _2, \"trentinoaltoadige\": _2, \"trentinos-tirol\": _2, \"trentinostirol\": _2, \"trentinosud-tirol\": _2, \"xn--trentinosd-tirol-rzb\": _2, \"trentinosüd-tirol\": _2, \"trentinosudtirol\": _2, \"xn--trentinosdtirol-7vb\": _2, \"trentinosüdtirol\": _2, \"trentinosued-tirol\": _2, \"trentinosuedtirol\": _2, \"trentinsud-tirol\": _2, \"xn--trentinsd-tirol-6vb\": _2, \"trentinsüd-tirol\": _2, \"trentinsudtirol\": _2, \"xn--trentinsdtirol-nsb\": _2, \"trentinsüdtirol\": _2, \"trentinsued-tirol\": _2, \"trentinsuedtirol\": _2, \"tuscany\": _2, \"umb\": _2, \"umbria\": _2, \"val-d-aosta\": _2, \"val-daosta\": _2, \"vald-aosta\": _2, \"valdaosta\": _2, \"valle-aosta\": _2, \"valle-d-aosta\": _2, \"valle-daosta\": _2, \"valleaosta\": _2, \"valled-aosta\": _2, \"valledaosta\": _2, \"vallee-aoste\": _2, \"xn--valle-aoste-ebb\": _2, \"vallée-aoste\": _2, \"vallee-d-aoste\": _2, \"xn--valle-d-aoste-ehb\": _2, \"vallée-d-aoste\": _2, \"valleeaoste\": _2, \"xn--valleaoste-e7a\": _2, \"valléeaoste\": _2, \"valleedaoste\": _2, \"xn--valledaoste-ebb\": _2, \"valléedaoste\": _2, \"vao\": _2, \"vda\": _2, \"ven\": _2, \"veneto\": _2, \"ag\": _2, \"agrigento\": _2, \"al\": _2, \"alessandria\": _2, \"alto-adige\": _2, \"altoadige\": _2, \"an\": _2, \"ancona\": _2, \"andria-barletta-trani\": _2, \"andria-trani-barletta\": _2, \"andriabarlettatrani\": _2, \"andriatranibarletta\": _2, \"ao\": _2, \"aosta\": _2, \"aoste\": _2, \"ap\": _2, \"aq\": _2, \"aquila\": _2, \"ar\": _2, \"arezzo\": _2, \"ascoli-piceno\": _2, \"ascolipiceno\": _2, \"asti\": _2, \"at\": _2, \"av\": _2, \"avellino\": _2, \"ba\": _2, \"balsan-sudtirol\": _2, \"xn--balsan-sdtirol-nsb\": _2, \"balsan-südtirol\": _2, \"balsan-suedtirol\": _2, \"balsan\": _2, \"bari\": _2, \"barletta-trani-andria\": _2, \"barlettatraniandria\": _2, \"belluno\": _2, \"benevento\": _2, \"bergamo\": _2, \"bg\": _2, \"bi\": _2, \"biella\": _2, \"bl\": _2, \"bn\": _2, \"bo\": _2, \"bologna\": _2, \"bolzano-altoadige\": _2, \"bolzano\": _2, \"bozen-sudtirol\": _2, \"xn--bozen-sdtirol-2ob\": _2, \"bozen-südtirol\": _2, \"bozen-suedtirol\": _2, \"bozen\": _2, \"br\": _2, \"brescia\": _2, \"brindisi\": _2, \"bs\": _2, \"bt\": _2, \"bulsan-sudtirol\": _2, \"xn--bulsan-sdtirol-nsb\": _2, \"bulsan-südtirol\": _2, \"bulsan-suedtirol\": _2, \"bulsan\": _2, \"bz\": _2, \"ca\": _2, \"cagliari\": _2, \"caltanissetta\": _2, \"campidano-medio\": _2, \"campidanomedio\": _2, \"campobasso\": _2, \"carbonia-iglesias\": _2, \"carboniaiglesias\": _2, \"carrara-massa\": _2, \"carraramassa\": _2, \"caserta\": _2, \"catania\": _2, \"catanzaro\": _2, \"cb\": _2, \"ce\": _2, \"cesena-forli\": _2, \"xn--cesena-forl-mcb\": _2, \"cesena-forlì\": _2, \"cesenaforli\": _2, \"xn--cesenaforl-i8a\": _2, \"cesenaforlì\": _2, \"ch\": _2, \"chieti\": _2, \"ci\": _2, \"cl\": _2, \"cn\": _2, \"co\": _2, \"como\": _2, \"cosenza\": _2, \"cr\": _2, \"cremona\": _2, \"crotone\": _2, \"cs\": _2, \"ct\": _2, \"cuneo\": _2, \"cz\": _2, \"dell-ogliastra\": _2, \"dellogliastra\": _2, \"en\": _2, \"enna\": _2, \"fc\": _2, \"fe\": _2, \"fermo\": _2, \"ferrara\": _2, \"fg\": _2, \"fi\": _2, \"firenze\": _2, \"florence\": _2, \"fm\": _2, \"foggia\": _2, \"forli-cesena\": _2, \"xn--forl-cesena-fcb\": _2, \"forlì-cesena\": _2, \"forlicesena\": _2, \"xn--forlcesena-c8a\": _2, \"forlìcesena\": _2, \"fr\": _2, \"frosinone\": _2, \"ge\": _2, \"genoa\": _2, \"genova\": _2, \"go\": _2, \"gorizia\": _2, \"gr\": _2, \"grosseto\": _2, \"iglesias-carbonia\": _2, \"iglesiascarbonia\": _2, \"im\": _2, \"imperia\": _2, \"is\": _2, \"isernia\": _2, \"kr\": _2, \"la-spezia\": _2, \"laquila\": _2, \"laspezia\": _2, \"latina\": _2, \"lc\": _2, \"le\": _2, \"lecce\": _2, \"lecco\": _2, \"li\": _2, \"livorno\": _2, \"lo\": _2, \"lodi\": _2, \"lt\": _2, \"lu\": _2, \"lucca\": _2, \"macerata\": _2, \"mantova\": _2, \"massa-carrara\": _2, \"massacarrara\": _2, \"matera\": _2, \"mb\": _2, \"mc\": _2, \"me\": _2, \"medio-campidano\": _2, \"mediocampidano\": _2, \"messina\": _2, \"mi\": _2, \"milan\": _2, \"milano\": _2, \"mn\": _2, \"mo\": _2, \"modena\": _2, \"monza-brianza\": _2, \"monza-e-della-brianza\": _2, \"monza\": _2, \"monzabrianza\": _2, \"monzaebrianza\": _2, \"monzaedellabrianza\": _2, \"ms\": _2, \"mt\": _2, \"na\": _2, \"naples\": _2, \"napoli\": _2, \"no\": _2, \"novara\": _2, \"nu\": _2, \"nuoro\": _2, \"og\": _2, \"ogliastra\": _2, \"olbia-tempio\": _2, \"olbiatempio\": _2, \"or\": _2, \"oristano\": _2, \"ot\": _2, \"pa\": _2, \"padova\": _2, \"padua\": _2, \"palermo\": _2, \"parma\": _2, \"pavia\": _2, \"pc\": _2, \"pd\": _2, \"pe\": _2, \"perugia\": _2, \"pesaro-urbino\": _2, \"pesarourbino\": _2, \"pescara\": _2, \"pg\": _2, \"pi\": _2, \"piacenza\": _2, \"pisa\": _2, \"pistoia\": _2, \"pn\": _2, \"po\": _2, \"pordenone\": _2, \"potenza\": _2, \"pr\": _2, \"prato\": _2, \"pt\": _2, \"pu\": _2, \"pv\": _2, \"pz\": _2, \"ra\": _2, \"ragusa\": _2, \"ravenna\": _2, \"rc\": _2, \"re\": _2, \"reggio-calabria\": _2, \"reggio-emilia\": _2, \"reggiocalabria\": _2, \"reggioemilia\": _2, \"rg\": _2, \"ri\": _2, \"rieti\": _2, \"rimini\": _2, \"rm\": _2, \"rn\": _2, \"ro\": _2, \"roma\": _2, \"rome\": _2, \"rovigo\": _2, \"sa\": _2, \"salerno\": _2, \"sassari\": _2, \"savona\": _2, \"si\": _2, \"siena\": _2, \"siracusa\": _2, \"so\": _2, \"sondrio\": _2, \"sp\": _2, \"sr\": _2, \"ss\": _2, \"suedtirol\": _2, \"xn--sdtirol-n2a\": _2, \"südtirol\": _2, \"sv\": _2, \"ta\": _2, \"taranto\": _2, \"te\": _2, \"tempio-olbia\": _2, \"tempioolbia\": _2, \"teramo\": _2, \"terni\": _2, \"tn\": _2, \"to\": _2, \"torino\": _2, \"tp\": _2, \"tr\": _2, \"trani-andria-barletta\": _2, \"trani-barletta-andria\": _2, \"traniandriabarletta\": _2, \"tranibarlettaandria\": _2, \"trapani\": _2, \"trento\": _2, \"treviso\": _2, \"trieste\": _2, \"ts\": _2, \"turin\": _2, \"tv\": _2, \"ud\": _2, \"udine\": _2, \"urbino-pesaro\": _2, \"urbinopesaro\": _2, \"va\": _2, \"varese\": _2, \"vb\": _2, \"vc\": _2, \"ve\": _2, \"venezia\": _2, \"venice\": _2, \"verbania\": _2, \"vercelli\": _2, \"verona\": _2, \"vi\": _2, \"vibo-valentia\": _2, \"vibovalentia\": _2, \"vicenza\": _2, \"viterbo\": _2, \"vr\": _2, \"vs\": _2, \"vt\": _2, \"vv\": _2, \"blogspot\": _4, \"16-b\": _4, \"32-b\": _4, \"64-b\": _4, \"syncloud\": _4 } }, \"je\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2 } }, \"jm\": _8, \"jo\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"sch\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2 } }, \"jobs\": _2, \"jp\": { \"$\": 1, \"succ\": { \"ac\": _2, \"ad\": _2, \"co\": _2, \"ed\": _2, \"go\": _2, \"gr\": _2, \"lg\": _2, \"ne\": { \"$\": 1, \"succ\": { \"aseinet\": _18, \"gehirn\": _4 } }, \"or\": _2, \"aichi\": { \"$\": 1, \"succ\": { \"aisai\": _2, \"ama\": _2, \"anjo\": _2, \"asuke\": _2, \"chiryu\": _2, \"chita\": _2, \"fuso\": _2, \"gamagori\": _2, \"handa\": _2, \"hazu\": _2, \"hekinan\": _2, \"higashiura\": _2, \"ichinomiya\": _2, \"inazawa\": _2, \"inuyama\": _2, \"isshiki\": _2, \"iwakura\": _2, \"kanie\": _2, \"kariya\": _2, \"kasugai\": _2, \"kira\": _2, \"kiyosu\": _2, \"komaki\": _2, \"konan\": _2, \"kota\": _2, \"mihama\": _2, \"miyoshi\": _2, \"nishio\": _2, \"nisshin\": _2, \"obu\": _2, \"oguchi\": _2, \"oharu\": _2, \"okazaki\": _2, \"owariasahi\": _2, \"seto\": _2, \"shikatsu\": _2, \"shinshiro\": _2, \"shitara\": _2, \"tahara\": _2, \"takahama\": _2, \"tobishima\": _2, \"toei\": _2, \"togo\": _2, \"tokai\": _2, \"tokoname\": _2, \"toyoake\": _2, \"toyohashi\": _2, \"toyokawa\": _2, \"toyone\": _2, \"toyota\": _2, \"tsushima\": _2, \"yatomi\": _2 } }, \"akita\": { \"$\": 1, \"succ\": { \"akita\": _2, \"daisen\": _2, \"fujisato\": _2, \"gojome\": _2, \"hachirogata\": _2, \"happou\": _2, \"higashinaruse\": _2, \"honjo\": _2, \"honjyo\": _2, \"ikawa\": _2, \"kamikoani\": _2, \"kamioka\": _2, \"katagami\": _2, \"kazuno\": _2, \"kitaakita\": _2, \"kosaka\": _2, \"kyowa\": _2, \"misato\": _2, \"mitane\": _2, \"moriyoshi\": _2, \"nikaho\": _2, \"noshiro\": _2, \"odate\": _2, \"oga\": _2, \"ogata\": _2, \"semboku\": _2, \"yokote\": _2, \"yurihonjo\": _2 } }, \"aomori\": { \"$\": 1, \"succ\": { \"aomori\": _2, \"gonohe\": _2, \"hachinohe\": _2, \"hashikami\": _2, \"hiranai\": _2, \"hirosaki\": _2, \"itayanagi\": _2, \"kuroishi\": _2, \"misawa\": _2, \"mutsu\": _2, \"nakadomari\": _2, \"noheji\": _2, \"oirase\": _2, \"owani\": _2, \"rokunohe\": _2, \"sannohe\": _2, \"shichinohe\": _2, \"shingo\": _2, \"takko\": _2, \"towada\": _2, \"tsugaru\": _2, \"tsuruta\": _2 } }, \"chiba\": { \"$\": 1, \"succ\": { \"abiko\": _2, \"asahi\": _2, \"chonan\": _2, \"chosei\": _2, \"choshi\": _2, \"chuo\": _2, \"funabashi\": _2, \"futtsu\": _2, \"hanamigawa\": _2, \"ichihara\": _2, \"ichikawa\": _2, \"ichinomiya\": _2, \"inzai\": _2, \"isumi\": _2, \"kamagaya\": _2, \"kamogawa\": _2, \"kashiwa\": _2, \"katori\": _2, \"katsuura\": _2, \"kimitsu\": _2, \"kisarazu\": _2, \"kozaki\": _2, \"kujukuri\": _2, \"kyonan\": _2, \"matsudo\": _2, \"midori\": _2, \"mihama\": _2, \"minamiboso\": _2, \"mobara\": _2, \"mutsuzawa\": _2, \"nagara\": _2, \"nagareyama\": _2, \"narashino\": _2, \"narita\": _2, \"noda\": _2, \"oamishirasato\": _2, \"omigawa\": _2, \"onjuku\": _2, \"otaki\": _2, \"sakae\": _2, \"sakura\": _2, \"shimofusa\": _2, \"shirako\": _2, \"shiroi\": _2, \"shisui\": _2, \"sodegaura\": _2, \"sosa\": _2, \"tako\": _2, \"tateyama\": _2, \"togane\": _2, \"tohnosho\": _2, \"tomisato\": _2, \"urayasu\": _2, \"yachimata\": _2, \"yachiyo\": _2, \"yokaichiba\": _2, \"yokoshibahikari\": _2, \"yotsukaido\": _2 } }, \"ehime\": { \"$\": 1, \"succ\": { \"ainan\": _2, \"honai\": _2, \"ikata\": _2, \"imabari\": _2, \"iyo\": _2, \"kamijima\": _2, \"kihoku\": _2, \"kumakogen\": _2, \"masaki\": _2, \"matsuno\": _2, \"matsuyama\": _2, \"namikata\": _2, \"niihama\": _2, \"ozu\": _2, \"saijo\": _2, \"seiyo\": _2, \"shikokuchuo\": _2, \"tobe\": _2, \"toon\": _2, \"uchiko\": _2, \"uwajima\": _2, \"yawatahama\": _2 } }, \"fukui\": { \"$\": 1, \"succ\": { \"echizen\": _2, \"eiheiji\": _2, \"fukui\": _2, \"ikeda\": _2, \"katsuyama\": _2, \"mihama\": _2, \"minamiechizen\": _2, \"obama\": _2, \"ohi\": _2, \"ono\": _2, \"sabae\": _2, \"sakai\": _2, \"takahama\": _2, \"tsuruga\": _2, \"wakasa\": _2 } }, \"fukuoka\": { \"$\": 1, \"succ\": { \"ashiya\": _2, \"buzen\": _2, \"chikugo\": _2, \"chikuho\": _2, \"chikujo\": _2, \"chikushino\": _2, \"chikuzen\": _2, \"chuo\": _2, \"dazaifu\": _2, \"fukuchi\": _2, \"hakata\": _2, \"higashi\": _2, \"hirokawa\": _2, \"hisayama\": _2, \"iizuka\": _2, \"inatsuki\": _2, \"kaho\": _2, \"kasuga\": _2, \"kasuya\": _2, \"kawara\": _2, \"keisen\": _2, \"koga\": _2, \"kurate\": _2, \"kurogi\": _2, \"kurume\": _2, \"minami\": _2, \"miyako\": _2, \"miyama\": _2, \"miyawaka\": _2, \"mizumaki\": _2, \"munakata\": _2, \"nakagawa\": _2, \"nakama\": _2, \"nishi\": _2, \"nogata\": _2, \"ogori\": _2, \"okagaki\": _2, \"okawa\": _2, \"oki\": _2, \"omuta\": _2, \"onga\": _2, \"onojo\": _2, \"oto\": _2, \"saigawa\": _2, \"sasaguri\": _2, \"shingu\": _2, \"shinyoshitomi\": _2, \"shonai\": _2, \"soeda\": _2, \"sue\": _2, \"tachiarai\": _2, \"tagawa\": _2, \"takata\": _2, \"toho\": _2, \"toyotsu\": _2, \"tsuiki\": _2, \"ukiha\": _2, \"umi\": _2, \"usui\": _2, \"yamada\": _2, \"yame\": _2, \"yanagawa\": _2, \"yukuhashi\": _2 } }, \"fukushima\": { \"$\": 1, \"succ\": { \"aizubange\": _2, \"aizumisato\": _2, \"aizuwakamatsu\": _2, \"asakawa\": _2, \"bandai\": _2, \"date\": _2, \"fukushima\": _2, \"furudono\": _2, \"futaba\": _2, \"hanawa\": _2, \"higashi\": _2, \"hirata\": _2, \"hirono\": _2, \"iitate\": _2, \"inawashiro\": _2, \"ishikawa\": _2, \"iwaki\": _2, \"izumizaki\": _2, \"kagamiishi\": _2, \"kaneyama\": _2, \"kawamata\": _2, \"kitakata\": _2, \"kitashiobara\": _2, \"koori\": _2, \"koriyama\": _2, \"kunimi\": _2, \"miharu\": _2, \"mishima\": _2, \"namie\": _2, \"nango\": _2, \"nishiaizu\": _2, \"nishigo\": _2, \"okuma\": _2, \"omotego\": _2, \"ono\": _2, \"otama\": _2, \"samegawa\": _2, \"shimogo\": _2, \"shirakawa\": _2, \"showa\": _2, \"soma\": _2, \"sukagawa\": _2, \"taishin\": _2, \"tamakawa\": _2, \"tanagura\": _2, \"tenei\": _2, \"yabuki\": _2, \"yamato\": _2, \"yamatsuri\": _2, \"yanaizu\": _2, \"yugawa\": _2 } }, \"gifu\": { \"$\": 1, \"succ\": { \"anpachi\": _2, \"ena\": _2, \"gifu\": _2, \"ginan\": _2, \"godo\": _2, \"gujo\": _2, \"hashima\": _2, \"hichiso\": _2, \"hida\": _2, \"higashishirakawa\": _2, \"ibigawa\": _2, \"ikeda\": _2, \"kakamigahara\": _2, \"kani\": _2, \"kasahara\": _2, \"kasamatsu\": _2, \"kawaue\": _2, \"kitagata\": _2, \"mino\": _2, \"minokamo\": _2, \"mitake\": _2, \"mizunami\": _2, \"motosu\": _2, \"nakatsugawa\": _2, \"ogaki\": _2, \"sakahogi\": _2, \"seki\": _2, \"sekigahara\": _2, \"shirakawa\": _2, \"tajimi\": _2, \"takayama\": _2, \"tarui\": _2, \"toki\": _2, \"tomika\": _2, \"wanouchi\": _2, \"yamagata\": _2, \"yaotsu\": _2, \"yoro\": _2 } }, \"gunma\": { \"$\": 1, \"succ\": { \"annaka\": _2, \"chiyoda\": _2, \"fujioka\": _2, \"higashiagatsuma\": _2, \"isesaki\": _2, \"itakura\": _2, \"kanna\": _2, \"kanra\": _2, \"katashina\": _2, \"kawaba\": _2, \"kiryu\": _2, \"kusatsu\": _2, \"maebashi\": _2, \"meiwa\": _2, \"midori\": _2, \"minakami\": _2, \"naganohara\": _2, \"nakanojo\": _2, \"nanmoku\": _2, \"numata\": _2, \"oizumi\": _2, \"ora\": _2, \"ota\": _2, \"shibukawa\": _2, \"shimonita\": _2, \"shinto\": _2, \"showa\": _2, \"takasaki\": _2, \"takayama\": _2, \"tamamura\": _2, \"tatebayashi\": _2, \"tomioka\": _2, \"tsukiyono\": _2, \"tsumagoi\": _2, \"ueno\": _2, \"yoshioka\": _2 } }, \"hiroshima\": { \"$\": 1, \"succ\": { \"asaminami\": _2, \"daiwa\": _2, \"etajima\": _2, \"fuchu\": _2, \"fukuyama\": _2, \"hatsukaichi\": _2, \"higashihiroshima\": _2, \"hongo\": _2, \"jinsekikogen\": _2, \"kaita\": _2, \"kui\": _2, \"kumano\": _2, \"kure\": _2, \"mihara\": _2, \"miyoshi\": _2, \"naka\": _2, \"onomichi\": _2, \"osakikamijima\": _2, \"otake\": _2, \"saka\": _2, \"sera\": _2, \"seranishi\": _2, \"shinichi\": _2, \"shobara\": _2, \"takehara\": _2 } }, \"hokkaido\": { \"$\": 1, \"succ\": { \"abashiri\": _2, \"abira\": _2, \"aibetsu\": _2, \"akabira\": _2, \"akkeshi\": _2, \"asahikawa\": _2, \"ashibetsu\": _2, \"ashoro\": _2, \"assabu\": _2, \"atsuma\": _2, \"bibai\": _2, \"biei\": _2, \"bifuka\": _2, \"bihoro\": _2, \"biratori\": _2, \"chippubetsu\": _2, \"chitose\": _2, \"date\": _2, \"ebetsu\": _2, \"embetsu\": _2, \"eniwa\": _2, \"erimo\": _2, \"esan\": _2, \"esashi\": _2, \"fukagawa\": _2, \"fukushima\": _2, \"furano\": _2, \"furubira\": _2, \"haboro\": _2, \"hakodate\": _2, \"hamatonbetsu\": _2, \"hidaka\": _2, \"higashikagura\": _2, \"higashikawa\": _2, \"hiroo\": _2, \"hokuryu\": _2, \"hokuto\": _2, \"honbetsu\": _2, \"horokanai\": _2, \"horonobe\": _2, \"ikeda\": _2, \"imakane\": _2, \"ishikari\": _2, \"iwamizawa\": _2, \"iwanai\": _2, \"kamifurano\": _2, \"kamikawa\": _2, \"kamishihoro\": _2, \"kamisunagawa\": _2, \"kamoenai\": _2, \"kayabe\": _2, \"kembuchi\": _2, \"kikonai\": _2, \"kimobetsu\": _2, \"kitahiroshima\": _2, \"kitami\": _2, \"kiyosato\": _2, \"koshimizu\": _2, \"kunneppu\": _2, \"kuriyama\": _2, \"kuromatsunai\": _2, \"kushiro\": _2, \"kutchan\": _2, \"kyowa\": _2, \"mashike\": _2, \"matsumae\": _2, \"mikasa\": _2, \"minamifurano\": _2, \"mombetsu\": _2, \"moseushi\": _2, \"mukawa\": _2, \"muroran\": _2, \"naie\": _2, \"nakagawa\": _2, \"nakasatsunai\": _2, \"nakatombetsu\": _2, \"nanae\": _2, \"nanporo\": _2, \"nayoro\": _2, \"nemuro\": _2, \"niikappu\": _2, \"niki\": _2, \"nishiokoppe\": _2, \"noboribetsu\": _2, \"numata\": _2, \"obihiro\": _2, \"obira\": _2, \"oketo\": _2, \"okoppe\": _2, \"otaru\": _2, \"otobe\": _2, \"otofuke\": _2, \"otoineppu\": _2, \"oumu\": _2, \"ozora\": _2, \"pippu\": _2, \"rankoshi\": _2, \"rebun\": _2, \"rikubetsu\": _2, \"rishiri\": _2, \"rishirifuji\": _2, \"saroma\": _2, \"sarufutsu\": _2, \"shakotan\": _2, \"shari\": _2, \"shibecha\": _2, \"shibetsu\": _2, \"shikabe\": _2, \"shikaoi\": _2, \"shimamaki\": _2, \"shimizu\": _2, \"shimokawa\": _2, \"shinshinotsu\": _2, \"shintoku\": _2, \"shiranuka\": _2, \"shiraoi\": _2, \"shiriuchi\": _2, \"sobetsu\": _2, \"sunagawa\": _2, \"taiki\": _2, \"takasu\": _2, \"takikawa\": _2, \"takinoue\": _2, \"teshikaga\": _2, \"tobetsu\": _2, \"tohma\": _2, \"tomakomai\": _2, \"tomari\": _2, \"toya\": _2, \"toyako\": _2, \"toyotomi\": _2, \"toyoura\": _2, \"tsubetsu\": _2, \"tsukigata\": _2, \"urakawa\": _2, \"urausu\": _2, \"uryu\": _2, \"utashinai\": _2, \"wakkanai\": _2, \"wassamu\": _2, \"yakumo\": _2, \"yoichi\": _2 } }, \"hyogo\": { \"$\": 1, \"succ\": { \"aioi\": _2, \"akashi\": _2, \"ako\": _2, \"amagasaki\": _2, \"aogaki\": _2, \"asago\": _2, \"ashiya\": _2, \"awaji\": _2, \"fukusaki\": _2, \"goshiki\": _2, \"harima\": _2, \"himeji\": _2, \"ichikawa\": _2, \"inagawa\": _2, \"itami\": _2, \"kakogawa\": _2, \"kamigori\": _2, \"kamikawa\": _2, \"kasai\": _2, \"kasuga\": _2, \"kawanishi\": _2, \"miki\": _2, \"minamiawaji\": _2, \"nishinomiya\": _2, \"nishiwaki\": _2, \"ono\": _2, \"sanda\": _2, \"sannan\": _2, \"sasayama\": _2, \"sayo\": _2, \"shingu\": _2, \"shinonsen\": _2, \"shiso\": _2, \"sumoto\": _2, \"taishi\": _2, \"taka\": _2, \"takarazuka\": _2, \"takasago\": _2, \"takino\": _2, \"tamba\": _2, \"tatsuno\": _2, \"toyooka\": _2, \"yabu\": _2, \"yashiro\": _2, \"yoka\": _2, \"yokawa\": _2 } }, \"ibaraki\": { \"$\": 1, \"succ\": { \"ami\": _2, \"asahi\": _2, \"bando\": _2, \"chikusei\": _2, \"daigo\": _2, \"fujishiro\": _2, \"hitachi\": _2, \"hitachinaka\": _2, \"hitachiomiya\": _2, \"hitachiota\": _2, \"ibaraki\": _2, \"ina\": _2, \"inashiki\": _2, \"itako\": _2, \"iwama\": _2, \"joso\": _2, \"kamisu\": _2, \"kasama\": _2, \"kashima\": _2, \"kasumigaura\": _2, \"koga\": _2, \"miho\": _2, \"mito\": _2, \"moriya\": _2, \"naka\": _2, \"namegata\": _2, \"oarai\": _2, \"ogawa\": _2, \"omitama\": _2, \"ryugasaki\": _2, \"sakai\": _2, \"sakuragawa\": _2, \"shimodate\": _2, \"shimotsuma\": _2, \"shirosato\": _2, \"sowa\": _2, \"suifu\": _2, \"takahagi\": _2, \"tamatsukuri\": _2, \"tokai\": _2, \"tomobe\": _2, \"tone\": _2, \"toride\": _2, \"tsuchiura\": _2, \"tsukuba\": _2, \"uchihara\": _2, \"ushiku\": _2, \"yachiyo\": _2, \"yamagata\": _2, \"yawara\": _2, \"yuki\": _2 } }, \"ishikawa\": { \"$\": 1, \"succ\": { \"anamizu\": _2, \"hakui\": _2, \"hakusan\": _2, \"kaga\": _2, \"kahoku\": _2, \"kanazawa\": _2, \"kawakita\": _2, \"komatsu\": _2, \"nakanoto\": _2, \"nanao\": _2, \"nomi\": _2, \"nonoichi\": _2, \"noto\": _2, \"shika\": _2, \"suzu\": _2, \"tsubata\": _2, \"tsurugi\": _2, \"uchinada\": _2, \"wajima\": _2 } }, \"iwate\": { \"$\": 1, \"succ\": { \"fudai\": _2, \"fujisawa\": _2, \"hanamaki\": _2, \"hiraizumi\": _2, \"hirono\": _2, \"ichinohe\": _2, \"ichinoseki\": _2, \"iwaizumi\": _2, \"iwate\": _2, \"joboji\": _2, \"kamaishi\": _2, \"kanegasaki\": _2, \"karumai\": _2, \"kawai\": _2, \"kitakami\": _2, \"kuji\": _2, \"kunohe\": _2, \"kuzumaki\": _2, \"miyako\": _2, \"mizusawa\": _2, \"morioka\": _2, \"ninohe\": _2, \"noda\": _2, \"ofunato\": _2, \"oshu\": _2, \"otsuchi\": _2, \"rikuzentakata\": _2, \"shiwa\": _2, \"shizukuishi\": _2, \"sumita\": _2, \"tanohata\": _2, \"tono\": _2, \"yahaba\": _2, \"yamada\": _2 } }, \"kagawa\": { \"$\": 1, \"succ\": { \"ayagawa\": _2, \"higashikagawa\": _2, \"kanonji\": _2, \"kotohira\": _2, \"manno\": _2, \"marugame\": _2, \"mitoyo\": _2, \"naoshima\": _2, \"sanuki\": _2, \"tadotsu\": _2, \"takamatsu\": _2, \"tonosho\": _2, \"uchinomi\": _2, \"utazu\": _2, \"zentsuji\": _2 } }, \"kagoshima\": { \"$\": 1, \"succ\": { \"akune\": _2, \"amami\": _2, \"hioki\": _2, \"isa\": _2, \"isen\": _2, \"izumi\": _2, \"kagoshima\": _2, \"kanoya\": _2, \"kawanabe\": _2, \"kinko\": _2, \"kouyama\": _2, \"makurazaki\": _2, \"matsumoto\": _2, \"minamitane\": _2, \"nakatane\": _2, \"nishinoomote\": _2, \"satsumasendai\": _2, \"soo\": _2, \"tarumizu\": _2, \"yusui\": _2 } }, \"kanagawa\": { \"$\": 1, \"succ\": { \"aikawa\": _2, \"atsugi\": _2, \"ayase\": _2, \"chigasaki\": _2, \"ebina\": _2, \"fujisawa\": _2, \"hadano\": _2, \"hakone\": _2, \"hiratsuka\": _2, \"isehara\": _2, \"kaisei\": _2, \"kamakura\": _2, \"kiyokawa\": _2, \"matsuda\": _2, \"minamiashigara\": _2, \"miura\": _2, \"nakai\": _2, \"ninomiya\": _2, \"odawara\": _2, \"oi\": _2, \"oiso\": _2, \"sagamihara\": _2, \"samukawa\": _2, \"tsukui\": _2, \"yamakita\": _2, \"yamato\": _2, \"yokosuka\": _2, \"yugawara\": _2, \"zama\": _2, \"zushi\": _2 } }, \"kochi\": { \"$\": 1, \"succ\": { \"aki\": _2, \"geisei\": _2, \"hidaka\": _2, \"higashitsuno\": _2, \"ino\": _2, \"kagami\": _2, \"kami\": _2, \"kitagawa\": _2, \"kochi\": _2, \"mihara\": _2, \"motoyama\": _2, \"muroto\": _2, \"nahari\": _2, \"nakamura\": _2, \"nankoku\": _2, \"nishitosa\": _2, \"niyodogawa\": _2, \"ochi\": _2, \"okawa\": _2, \"otoyo\": _2, \"otsuki\": _2, \"sakawa\": _2, \"sukumo\": _2, \"susaki\": _2, \"tosa\": _2, \"tosashimizu\": _2, \"toyo\": _2, \"tsuno\": _2, \"umaji\": _2, \"yasuda\": _2, \"yusuhara\": _2 } }, \"kumamoto\": { \"$\": 1, \"succ\": { \"amakusa\": _2, \"arao\": _2, \"aso\": _2, \"choyo\": _2, \"gyokuto\": _2, \"kamiamakusa\": _2, \"kikuchi\": _2, \"kumamoto\": _2, \"mashiki\": _2, \"mifune\": _2, \"minamata\": _2, \"minamioguni\": _2, \"nagasu\": _2, \"nishihara\": _2, \"oguni\": _2, \"ozu\": _2, \"sumoto\": _2, \"takamori\": _2, \"uki\": _2, \"uto\": _2, \"yamaga\": _2, \"yamato\": _2, \"yatsushiro\": _2 } }, \"kyoto\": { \"$\": 1, \"succ\": { \"ayabe\": _2, \"fukuchiyama\": _2, \"higashiyama\": _2, \"ide\": _2, \"ine\": _2, \"joyo\": _2, \"kameoka\": _2, \"kamo\": _2, \"kita\": _2, \"kizu\": _2, \"kumiyama\": _2, \"kyotamba\": _2, \"kyotanabe\": _2, \"kyotango\": _2, \"maizuru\": _2, \"minami\": _2, \"minamiyamashiro\": _2, \"miyazu\": _2, \"muko\": _2, \"nagaokakyo\": _2, \"nakagyo\": _2, \"nantan\": _2, \"oyamazaki\": _2, \"sakyo\": _2, \"seika\": _2, \"tanabe\": _2, \"uji\": _2, \"ujitawara\": _2, \"wazuka\": _2, \"yamashina\": _2, \"yawata\": _2 } }, \"mie\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"inabe\": _2, \"ise\": _2, \"kameyama\": _2, \"kawagoe\": _2, \"kiho\": _2, \"kisosaki\": _2, \"kiwa\": _2, \"komono\": _2, \"kumano\": _2, \"kuwana\": _2, \"matsusaka\": _2, \"meiwa\": _2, \"mihama\": _2, \"minamiise\": _2, \"misugi\": _2, \"miyama\": _2, \"nabari\": _2, \"shima\": _2, \"suzuka\": _2, \"tado\": _2, \"taiki\": _2, \"taki\": _2, \"tamaki\": _2, \"toba\": _2, \"tsu\": _2, \"udono\": _2, \"ureshino\": _2, \"watarai\": _2, \"yokkaichi\": _2 } }, \"miyagi\": { \"$\": 1, \"succ\": { \"furukawa\": _2, \"higashimatsushima\": _2, \"ishinomaki\": _2, \"iwanuma\": _2, \"kakuda\": _2, \"kami\": _2, \"kawasaki\": _2, \"marumori\": _2, \"matsushima\": _2, \"minamisanriku\": _2, \"misato\": _2, \"murata\": _2, \"natori\": _2, \"ogawara\": _2, \"ohira\": _2, \"onagawa\": _2, \"osaki\": _2, \"rifu\": _2, \"semine\": _2, \"shibata\": _2, \"shichikashuku\": _2, \"shikama\": _2, \"shiogama\": _2, \"shiroishi\": _2, \"tagajo\": _2, \"taiwa\": _2, \"tome\": _2, \"tomiya\": _2, \"wakuya\": _2, \"watari\": _2, \"yamamoto\": _2, \"zao\": _2 } }, \"miyazaki\": { \"$\": 1, \"succ\": { \"aya\": _2, \"ebino\": _2, \"gokase\": _2, \"hyuga\": _2, \"kadogawa\": _2, \"kawaminami\": _2, \"kijo\": _2, \"kitagawa\": _2, \"kitakata\": _2, \"kitaura\": _2, \"kobayashi\": _2, \"kunitomi\": _2, \"kushima\": _2, \"mimata\": _2, \"miyakonojo\": _2, \"miyazaki\": _2, \"morotsuka\": _2, \"nichinan\": _2, \"nishimera\": _2, \"nobeoka\": _2, \"saito\": _2, \"shiiba\": _2, \"shintomi\": _2, \"takaharu\": _2, \"takanabe\": _2, \"takazaki\": _2, \"tsuno\": _2 } }, \"nagano\": { \"$\": 1, \"succ\": { \"achi\": _2, \"agematsu\": _2, \"anan\": _2, \"aoki\": _2, \"asahi\": _2, \"azumino\": _2, \"chikuhoku\": _2, \"chikuma\": _2, \"chino\": _2, \"fujimi\": _2, \"hakuba\": _2, \"hara\": _2, \"hiraya\": _2, \"iida\": _2, \"iijima\": _2, \"iiyama\": _2, \"iizuna\": _2, \"ikeda\": _2, \"ikusaka\": _2, \"ina\": _2, \"karuizawa\": _2, \"kawakami\": _2, \"kiso\": _2, \"kisofukushima\": _2, \"kitaaiki\": _2, \"komagane\": _2, \"komoro\": _2, \"matsukawa\": _2, \"matsumoto\": _2, \"miasa\": _2, \"minamiaiki\": _2, \"minamimaki\": _2, \"minamiminowa\": _2, \"minowa\": _2, \"miyada\": _2, \"miyota\": _2, \"mochizuki\": _2, \"nagano\": _2, \"nagawa\": _2, \"nagiso\": _2, \"nakagawa\": _2, \"nakano\": _2, \"nozawaonsen\": _2, \"obuse\": _2, \"ogawa\": _2, \"okaya\": _2, \"omachi\": _2, \"omi\": _2, \"ookuwa\": _2, \"ooshika\": _2, \"otaki\": _2, \"otari\": _2, \"sakae\": _2, \"sakaki\": _2, \"saku\": _2, \"sakuho\": _2, \"shimosuwa\": _2, \"shinanomachi\": _2, \"shiojiri\": _2, \"suwa\": _2, \"suzaka\": _2, \"takagi\": _2, \"takamori\": _2, \"takayama\": _2, \"tateshina\": _2, \"tatsuno\": _2, \"togakushi\": _2, \"togura\": _2, \"tomi\": _2, \"ueda\": _2, \"wada\": _2, \"yamagata\": _2, \"yamanouchi\": _2, \"yasaka\": _2, \"yasuoka\": _2 } }, \"nagasaki\": { \"$\": 1, \"succ\": { \"chijiwa\": _2, \"futsu\": _2, \"goto\": _2, \"hasami\": _2, \"hirado\": _2, \"iki\": _2, \"isahaya\": _2, \"kawatana\": _2, \"kuchinotsu\": _2, \"matsuura\": _2, \"nagasaki\": _2, \"obama\": _2, \"omura\": _2, \"oseto\": _2, \"saikai\": _2, \"sasebo\": _2, \"seihi\": _2, \"shimabara\": _2, \"shinkamigoto\": _2, \"togitsu\": _2, \"tsushima\": _2, \"unzen\": _2 } }, \"nara\": { \"$\": 1, \"succ\": { \"ando\": _2, \"gose\": _2, \"heguri\": _2, \"higashiyoshino\": _2, \"ikaruga\": _2, \"ikoma\": _2, \"kamikitayama\": _2, \"kanmaki\": _2, \"kashiba\": _2, \"kashihara\": _2, \"katsuragi\": _2, \"kawai\": _2, \"kawakami\": _2, \"kawanishi\": _2, \"koryo\": _2, \"kurotaki\": _2, \"mitsue\": _2, \"miyake\": _2, \"nara\": _2, \"nosegawa\": _2, \"oji\": _2, \"ouda\": _2, \"oyodo\": _2, \"sakurai\": _2, \"sango\": _2, \"shimoichi\": _2, \"shimokitayama\": _2, \"shinjo\": _2, \"soni\": _2, \"takatori\": _2, \"tawaramoto\": _2, \"tenkawa\": _2, \"tenri\": _2, \"uda\": _2, \"yamatokoriyama\": _2, \"yamatotakada\": _2, \"yamazoe\": _2, \"yoshino\": _2 } }, \"niigata\": { \"$\": 1, \"succ\": { \"aga\": _2, \"agano\": _2, \"gosen\": _2, \"itoigawa\": _2, \"izumozaki\": _2, \"joetsu\": _2, \"kamo\": _2, \"kariwa\": _2, \"kashiwazaki\": _2, \"minamiuonuma\": _2, \"mitsuke\": _2, \"muika\": _2, \"murakami\": _2, \"myoko\": _2, \"nagaoka\": _2, \"niigata\": _2, \"ojiya\": _2, \"omi\": _2, \"sado\": _2, \"sanjo\": _2, \"seiro\": _2, \"seirou\": _2, \"sekikawa\": _2, \"shibata\": _2, \"tagami\": _2, \"tainai\": _2, \"tochio\": _2, \"tokamachi\": _2, \"tsubame\": _2, \"tsunan\": _2, \"uonuma\": _2, \"yahiko\": _2, \"yoita\": _2, \"yuzawa\": _2 } }, \"oita\": { \"$\": 1, \"succ\": { \"beppu\": _2, \"bungoono\": _2, \"bungotakada\": _2, \"hasama\": _2, \"hiji\": _2, \"himeshima\": _2, \"hita\": _2, \"kamitsue\": _2, \"kokonoe\": _2, \"kuju\": _2, \"kunisaki\": _2, \"kusu\": _2, \"oita\": _2, \"saiki\": _2, \"taketa\": _2, \"tsukumi\": _2, \"usa\": _2, \"usuki\": _2, \"yufu\": _2 } }, \"okayama\": { \"$\": 1, \"succ\": { \"akaiwa\": _2, \"asakuchi\": _2, \"bizen\": _2, \"hayashima\": _2, \"ibara\": _2, \"kagamino\": _2, \"kasaoka\": _2, \"kibichuo\": _2, \"kumenan\": _2, \"kurashiki\": _2, \"maniwa\": _2, \"misaki\": _2, \"nagi\": _2, \"niimi\": _2, \"nishiawakura\": _2, \"okayama\": _2, \"satosho\": _2, \"setouchi\": _2, \"shinjo\": _2, \"shoo\": _2, \"soja\": _2, \"takahashi\": _2, \"tamano\": _2, \"tsuyama\": _2, \"wake\": _2, \"yakage\": _2 } }, \"okinawa\": { \"$\": 1, \"succ\": { \"aguni\": _2, \"ginowan\": _2, \"ginoza\": _2, \"gushikami\": _2, \"haebaru\": _2, \"higashi\": _2, \"hirara\": _2, \"iheya\": _2, \"ishigaki\": _2, \"ishikawa\": _2, \"itoman\": _2, \"izena\": _2, \"kadena\": _2, \"kin\": _2, \"kitadaito\": _2, \"kitanakagusuku\": _2, \"kumejima\": _2, \"kunigami\": _2, \"minamidaito\": _2, \"motobu\": _2, \"nago\": _2, \"naha\": _2, \"nakagusuku\": _2, \"nakijin\": _2, \"nanjo\": _2, \"nishihara\": _2, \"ogimi\": _2, \"okinawa\": _2, \"onna\": _2, \"shimoji\": _2, \"taketomi\": _2, \"tarama\": _2, \"tokashiki\": _2, \"tomigusuku\": _2, \"tonaki\": _2, \"urasoe\": _2, \"uruma\": _2, \"yaese\": _2, \"yomitan\": _2, \"yonabaru\": _2, \"yonaguni\": _2, \"zamami\": _2 } }, \"osaka\": { \"$\": 1, \"succ\": { \"abeno\": _2, \"chihayaakasaka\": _2, \"chuo\": _2, \"daito\": _2, \"fujiidera\": _2, \"habikino\": _2, \"hannan\": _2, \"higashiosaka\": _2, \"higashisumiyoshi\": _2, \"higashiyodogawa\": _2, \"hirakata\": _2, \"ibaraki\": _2, \"ikeda\": _2, \"izumi\": _2, \"izumiotsu\": _2, \"izumisano\": _2, \"kadoma\": _2, \"kaizuka\": _2, \"kanan\": _2, \"kashiwara\": _2, \"katano\": _2, \"kawachinagano\": _2, \"kishiwada\": _2, \"kita\": _2, \"kumatori\": _2, \"matsubara\": _2, \"minato\": _2, \"minoh\": _2, \"misaki\": _2, \"moriguchi\": _2, \"neyagawa\": _2, \"nishi\": _2, \"nose\": _2, \"osakasayama\": _2, \"sakai\": _2, \"sayama\": _2, \"sennan\": _2, \"settsu\": _2, \"shijonawate\": _2, \"shimamoto\": _2, \"suita\": _2, \"tadaoka\": _2, \"taishi\": _2, \"tajiri\": _2, \"takaishi\": _2, \"takatsuki\": _2, \"tondabayashi\": _2, \"toyonaka\": _2, \"toyono\": _2, \"yao\": _2 } }, \"saga\": { \"$\": 1, \"succ\": { \"ariake\": _2, \"arita\": _2, \"fukudomi\": _2, \"genkai\": _2, \"hamatama\": _2, \"hizen\": _2, \"imari\": _2, \"kamimine\": _2, \"kanzaki\": _2, \"karatsu\": _2, \"kashima\": _2, \"kitagata\": _2, \"kitahata\": _2, \"kiyama\": _2, \"kouhoku\": _2, \"kyuragi\": _2, \"nishiarita\": _2, \"ogi\": _2, \"omachi\": _2, \"ouchi\": _2, \"saga\": _2, \"shiroishi\": _2, \"taku\": _2, \"tara\": _2, \"tosu\": _2, \"yoshinogari\": _2 } }, \"saitama\": { \"$\": 1, \"succ\": { \"arakawa\": _2, \"asaka\": _2, \"chichibu\": _2, \"fujimi\": _2, \"fujimino\": _2, \"fukaya\": _2, \"hanno\": _2, \"hanyu\": _2, \"hasuda\": _2, \"hatogaya\": _2, \"hatoyama\": _2, \"hidaka\": _2, \"higashichichibu\": _2, \"higashimatsuyama\": _2, \"honjo\": _2, \"ina\": _2, \"iruma\": _2, \"iwatsuki\": _2, \"kamiizumi\": _2, \"kamikawa\": _2, \"kamisato\": _2, \"kasukabe\": _2, \"kawagoe\": _2, \"kawaguchi\": _2, \"kawajima\": _2, \"kazo\": _2, \"kitamoto\": _2, \"koshigaya\": _2, \"kounosu\": _2, \"kuki\": _2, \"kumagaya\": _2, \"matsubushi\": _2, \"minano\": _2, \"misato\": _2, \"miyashiro\": _2, \"miyoshi\": _2, \"moroyama\": _2, \"nagatoro\": _2, \"namegawa\": _2, \"niiza\": _2, \"ogano\": _2, \"ogawa\": _2, \"ogose\": _2, \"okegawa\": _2, \"omiya\": _2, \"otaki\": _2, \"ranzan\": _2, \"ryokami\": _2, \"saitama\": _2, \"sakado\": _2, \"satte\": _2, \"sayama\": _2, \"shiki\": _2, \"shiraoka\": _2, \"soka\": _2, \"sugito\": _2, \"toda\": _2, \"tokigawa\": _2, \"tokorozawa\": _2, \"tsurugashima\": _2, \"urawa\": _2, \"warabi\": _2, \"yashio\": _2, \"yokoze\": _2, \"yono\": _2, \"yorii\": _2, \"yoshida\": _2, \"yoshikawa\": _2, \"yoshimi\": _2 } }, \"shiga\": { \"$\": 1, \"succ\": { \"aisho\": _2, \"gamo\": _2, \"higashiomi\": _2, \"hikone\": _2, \"koka\": _2, \"konan\": _2, \"kosei\": _2, \"koto\": _2, \"kusatsu\": _2, \"maibara\": _2, \"moriyama\": _2, \"nagahama\": _2, \"nishiazai\": _2, \"notogawa\": _2, \"omihachiman\": _2, \"otsu\": _2, \"ritto\": _2, \"ryuoh\": _2, \"takashima\": _2, \"takatsuki\": _2, \"torahime\": _2, \"toyosato\": _2, \"yasu\": _2 } }, \"shimane\": { \"$\": 1, \"succ\": { \"akagi\": _2, \"ama\": _2, \"gotsu\": _2, \"hamada\": _2, \"higashiizumo\": _2, \"hikawa\": _2, \"hikimi\": _2, \"izumo\": _2, \"kakinoki\": _2, \"masuda\": _2, \"matsue\": _2, \"misato\": _2, \"nishinoshima\": _2, \"ohda\": _2, \"okinoshima\": _2, \"okuizumo\": _2, \"shimane\": _2, \"tamayu\": _2, \"tsuwano\": _2, \"unnan\": _2, \"yakumo\": _2, \"yasugi\": _2, \"yatsuka\": _2 } }, \"shizuoka\": { \"$\": 1, \"succ\": { \"arai\": _2, \"atami\": _2, \"fuji\": _2, \"fujieda\": _2, \"fujikawa\": _2, \"fujinomiya\": _2, \"fukuroi\": _2, \"gotemba\": _2, \"haibara\": _2, \"hamamatsu\": _2, \"higashiizu\": _2, \"ito\": _2, \"iwata\": _2, \"izu\": _2, \"izunokuni\": _2, \"kakegawa\": _2, \"kannami\": _2, \"kawanehon\": _2, \"kawazu\": _2, \"kikugawa\": _2, \"kosai\": _2, \"makinohara\": _2, \"matsuzaki\": _2, \"minamiizu\": _2, \"mishima\": _2, \"morimachi\": _2, \"nishiizu\": _2, \"numazu\": _2, \"omaezaki\": _2, \"shimada\": _2, \"shimizu\": _2, \"shimoda\": _2, \"shizuoka\": _2, \"susono\": _2, \"yaizu\": _2, \"yoshida\": _2 } }, \"tochigi\": { \"$\": 1, \"succ\": { \"ashikaga\": _2, \"bato\": _2, \"haga\": _2, \"ichikai\": _2, \"iwafune\": _2, \"kaminokawa\": _2, \"kanuma\": _2, \"karasuyama\": _2, \"kuroiso\": _2, \"mashiko\": _2, \"mibu\": _2, \"moka\": _2, \"motegi\": _2, \"nasu\": _2, \"nasushiobara\": _2, \"nikko\": _2, \"nishikata\": _2, \"nogi\": _2, \"ohira\": _2, \"ohtawara\": _2, \"oyama\": _2, \"sakura\": _2, \"sano\": _2, \"shimotsuke\": _2, \"shioya\": _2, \"takanezawa\": _2, \"tochigi\": _2, \"tsuga\": _2, \"ujiie\": _2, \"utsunomiya\": _2, \"yaita\": _2 } }, \"tokushima\": { \"$\": 1, \"succ\": { \"aizumi\": _2, \"anan\": _2, \"ichiba\": _2, \"itano\": _2, \"kainan\": _2, \"komatsushima\": _2, \"matsushige\": _2, \"mima\": _2, \"minami\": _2, \"miyoshi\": _2, \"mugi\": _2, \"nakagawa\": _2, \"naruto\": _2, \"sanagochi\": _2, \"shishikui\": _2, \"tokushima\": _2, \"wajiki\": _2 } }, \"tokyo\": { \"$\": 1, \"succ\": { \"adachi\": _2, \"akiruno\": _2, \"akishima\": _2, \"aogashima\": _2, \"arakawa\": _2, \"bunkyo\": _2, \"chiyoda\": _2, \"chofu\": _2, \"chuo\": _2, \"edogawa\": _2, \"fuchu\": _2, \"fussa\": _2, \"hachijo\": _2, \"hachioji\": _2, \"hamura\": _2, \"higashikurume\": _2, \"higashimurayama\": _2, \"higashiyamato\": _2, \"hino\": _2, \"hinode\": _2, \"hinohara\": _2, \"inagi\": _2, \"itabashi\": _2, \"katsushika\": _2, \"kita\": _2, \"kiyose\": _2, \"kodaira\": _2, \"koganei\": _2, \"kokubunji\": _2, \"komae\": _2, \"koto\": _2, \"kouzushima\": _2, \"kunitachi\": _2, \"machida\": _2, \"meguro\": _2, \"minato\": _2, \"mitaka\": _2, \"mizuho\": _2, \"musashimurayama\": _2, \"musashino\": _2, \"nakano\": _2, \"nerima\": _2, \"ogasawara\": _2, \"okutama\": _2, \"ome\": _2, \"oshima\": _2, \"ota\": _2, \"setagaya\": _2, \"shibuya\": _2, \"shinagawa\": _2, \"shinjuku\": _2, \"suginami\": _2, \"sumida\": _2, \"tachikawa\": _2, \"taito\": _2, \"tama\": _2, \"toshima\": _2 } }, \"tottori\": { \"$\": 1, \"succ\": { \"chizu\": _2, \"hino\": _2, \"kawahara\": _2, \"koge\": _2, \"kotoura\": _2, \"misasa\": _2, \"nanbu\": _2, \"nichinan\": _2, \"sakaiminato\": _2, \"tottori\": _2, \"wakasa\": _2, \"yazu\": _2, \"yonago\": _2 } }, \"toyama\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"fuchu\": _2, \"fukumitsu\": _2, \"funahashi\": _2, \"himi\": _2, \"imizu\": _2, \"inami\": _2, \"johana\": _2, \"kamiichi\": _2, \"kurobe\": _2, \"nakaniikawa\": _2, \"namerikawa\": _2, \"nanto\": _2, \"nyuzen\": _2, \"oyabe\": _2, \"taira\": _2, \"takaoka\": _2, \"tateyama\": _2, \"toga\": _2, \"tonami\": _2, \"toyama\": _2, \"unazuki\": _2, \"uozu\": _2, \"yamada\": _2 } }, \"wakayama\": { \"$\": 1, \"succ\": { \"arida\": _2, \"aridagawa\": _2, \"gobo\": _2, \"hashimoto\": _2, \"hidaka\": _2, \"hirogawa\": _2, \"inami\": _2, \"iwade\": _2, \"kainan\": _2, \"kamitonda\": _2, \"katsuragi\": _2, \"kimino\": _2, \"kinokawa\": _2, \"kitayama\": _2, \"koya\": _2, \"koza\": _2, \"kozagawa\": _2, \"kudoyama\": _2, \"kushimoto\": _2, \"mihama\": _2, \"misato\": _2, \"nachikatsuura\": _2, \"shingu\": _2, \"shirahama\": _2, \"taiji\": _2, \"tanabe\": _2, \"wakayama\": _2, \"yuasa\": _2, \"yura\": _2 } }, \"yamagata\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"funagata\": _2, \"higashine\": _2, \"iide\": _2, \"kahoku\": _2, \"kaminoyama\": _2, \"kaneyama\": _2, \"kawanishi\": _2, \"mamurogawa\": _2, \"mikawa\": _2, \"murayama\": _2, \"nagai\": _2, \"nakayama\": _2, \"nanyo\": _2, \"nishikawa\": _2, \"obanazawa\": _2, \"oe\": _2, \"oguni\": _2, \"ohkura\": _2, \"oishida\": _2, \"sagae\": _2, \"sakata\": _2, \"sakegawa\": _2, \"shinjo\": _2, \"shirataka\": _2, \"shonai\": _2, \"takahata\": _2, \"tendo\": _2, \"tozawa\": _2, \"tsuruoka\": _2, \"yamagata\": _2, \"yamanobe\": _2, \"yonezawa\": _2, \"yuza\": _2 } }, \"yamaguchi\": { \"$\": 1, \"succ\": { \"abu\": _2, \"hagi\": _2, \"hikari\": _2, \"hofu\": _2, \"iwakuni\": _2, \"kudamatsu\": _2, \"mitou\": _2, \"nagato\": _2, \"oshima\": _2, \"shimonoseki\": _2, \"shunan\": _2, \"tabuse\": _2, \"tokuyama\": _2, \"toyota\": _2, \"ube\": _2, \"yuu\": _2 } }, \"yamanashi\": { \"$\": 1, \"succ\": { \"chuo\": _2, \"doshi\": _2, \"fuefuki\": _2, \"fujikawa\": _2, \"fujikawaguchiko\": _2, \"fujiyoshida\": _2, \"hayakawa\": _2, \"hokuto\": _2, \"ichikawamisato\": _2, \"kai\": _2, \"kofu\": _2, \"koshu\": _2, \"kosuge\": _2, \"minami-alps\": _2, \"minobu\": _2, \"nakamichi\": _2, \"nanbu\": _2, \"narusawa\": _2, \"nirasaki\": _2, \"nishikatsura\": _2, \"oshino\": _2, \"otsuki\": _2, \"showa\": _2, \"tabayama\": _2, \"tsuru\": _2, \"uenohara\": _2, \"yamanakako\": _2, \"yamanashi\": _2 } }, \"xn--4pvxs\": _2, \"栃木\": _2, \"xn--vgu402c\": _2, \"愛知\": _2, \"xn--c3s14m\": _2, \"愛媛\": _2, \"xn--f6qx53a\": _2, \"兵庫\": _2, \"xn--8pvr4u\": _2, \"熊本\": _2, \"xn--uist22h\": _2, \"茨城\": _2, \"xn--djrs72d6uy\": _2, \"北海道\": _2, \"xn--mkru45i\": _2, \"千葉\": _2, \"xn--0trq7p7nn\": _2, \"和歌山\": _2, \"xn--8ltr62k\": _2, \"長崎\": _2, \"xn--2m4a15e\": _2, \"長野\": _2, \"xn--efvn9s\": _2, \"新潟\": _2, \"xn--32vp30h\": _2, \"青森\": _2, \"xn--4it797k\": _2, \"静岡\": _2, \"xn--1lqs71d\": _2, \"東京\": _2, \"xn--5rtp49c\": _2, \"石川\": _2, \"xn--5js045d\": _2, \"埼玉\": _2, \"xn--ehqz56n\": _2, \"三重\": _2, \"xn--1lqs03n\": _2, \"京都\": _2, \"xn--qqqt11m\": _2, \"佐賀\": _2, \"xn--kbrq7o\": _2, \"大分\": _2, \"xn--pssu33l\": _2, \"大阪\": _2, \"xn--ntsq17g\": _2, \"奈良\": _2, \"xn--uisz3g\": _2, \"宮城\": _2, \"xn--6btw5a\": _2, \"宮崎\": _2, \"xn--1ctwo\": _2, \"富山\": _2, \"xn--6orx2r\": _2, \"山口\": _2, \"xn--rht61e\": _2, \"山形\": _2, \"xn--rht27z\": _2, \"山梨\": _2, \"xn--djty4k\": _2, \"岩手\": _2, \"xn--nit225k\": _2, \"岐阜\": _2, \"xn--rht3d\": _2, \"岡山\": _2, \"xn--klty5x\": _2, \"島根\": _2, \"xn--kltx9a\": _2, \"広島\": _2, \"xn--kltp7d\": _2, \"徳島\": _2, \"xn--uuwu58a\": _2, \"沖縄\": _2, \"xn--zbx025d\": _2, \"滋賀\": _2, \"xn--ntso0iqx3a\": _2, \"神奈川\": _2, \"xn--elqq16h\": _2, \"福井\": _2, \"xn--4it168d\": _2, \"福岡\": _2, \"xn--klt787d\": _2, \"福島\": _2, \"xn--rny31h\": _2, \"秋田\": _2, \"xn--7t0a264c\": _2, \"群馬\": _2, \"xn--5rtq34k\": _2, \"香川\": _2, \"xn--k7yn95e\": _2, \"高知\": _2, \"xn--tor131o\": _2, \"鳥取\": _2, \"xn--d5qv7z876c\": _2, \"鹿児島\": _2, \"kawasaki\": _8, \"kitakyushu\": _8, \"kobe\": _8, \"nagoya\": _8, \"sapporo\": _8, \"sendai\": _8, \"yokohama\": _8, \"usercontent\": _4, \"blogspot\": _4 } }, \"ke\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _5, \"go\": _2, \"info\": _2, \"me\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2, \"nom\": _4 } }, \"kg\": { \"$\": 1, \"succ\": { \"org\": _2, \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"blog\": _4, \"io\": _4, \"jp\": _4, \"tv\": _4, \"uk\": _4, \"us\": _4 } }, \"kh\": _8, \"ki\": _22, \"km\": { \"$\": 1, \"succ\": { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"ass\": _2, \"com\": _2, \"coop\": _2, \"asso\": _2, \"presse\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmaciens\": _2, \"veterinaire\": _2, \"gouv\": _2 } }, \"kn\": { \"$\": 1, \"succ\": { \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2 } }, \"kp\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"rep\": _2, \"tra\": _2 } }, \"kr\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"es\": _2, \"go\": _2, \"hs\": _2, \"kg\": _2, \"mil\": _2, \"ms\": _2, \"ne\": _2, \"or\": _2, \"pe\": _2, \"re\": _2, \"sc\": _2, \"busan\": _2, \"chungbuk\": _2, \"chungnam\": _2, \"daegu\": _2, \"daejeon\": _2, \"gangwon\": _2, \"gwangju\": _2, \"gyeongbuk\": _2, \"gyeonggi\": _2, \"gyeongnam\": _2, \"incheon\": _2, \"jeju\": _2, \"jeonbuk\": _2, \"jeonnam\": _2, \"seoul\": _2, \"ulsan\": _2, \"blogspot\": _4 } }, \"kw\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"emb\": _2, \"gov\": _2, \"ind\": _2, \"net\": _2, \"org\": _2 } }, \"ky\": _9, \"kz\": { \"$\": 1, \"succ\": { \"org\": _2, \"edu\": _2, \"net\": _2, \"gov\": _2, \"mil\": _2, \"com\": _2, \"nym\": _4 } }, \"la\": { \"$\": 1, \"succ\": { \"int\": _2, \"net\": _2, \"info\": _2, \"edu\": _2, \"gov\": _2, \"per\": _2, \"com\": _2, \"org\": _2, \"bnr\": _4, \"c\": _4, \"nym\": _4 } }, \"lb\": _9, \"lc\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"nym\": _4, \"oy\": _4 } }, \"li\": { \"$\": 1, \"succ\": { \"blogspot\": _4, \"caa\": _4, \"nom\": _4, \"nym\": _4 } }, \"lk\": { \"$\": 1, \"succ\": { \"gov\": _2, \"sch\": _2, \"net\": _2, \"int\": _2, \"com\": _2, \"org\": _2, \"edu\": _2, \"ngo\": _2, \"soc\": _2, \"web\": _2, \"ltd\": _2, \"assn\": _2, \"grp\": _2, \"hotel\": _2, \"ac\": _2 } }, \"lr\": _9, \"ls\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"sc\": _2, \"de\": _4 } }, \"lt\": _20, \"lu\": _23, \"lv\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"id\": _2, \"net\": _2, \"asn\": _2, \"conf\": _2, \"nom\": _4 } }, \"ly\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"gov\": _2, \"plc\": _2, \"edu\": _2, \"sch\": _2, \"med\": _2, \"org\": _2, \"id\": _2 } }, \"ma\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"ac\": _2, \"press\": _2 } }, \"mc\": { \"$\": 1, \"succ\": { \"tm\": _2, \"asso\": _2 } }, \"md\": { \"$\": 1, \"succ\": { \"blogspot\": _4, \"at\": _4, \"de\": _4, \"jp\": _4, \"to\": _4 } }, \"me\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"ac\": _2, \"gov\": _2, \"its\": _2, \"priv\": _2, \"c66\": _4, \"daplie\": { \"$\": 2, \"succ\": { \"localhost\": _4 } }, \"edgestack\": _4, \"couk\": _4, \"ukco\": _4, \"filegear\": _4, \"filegear-au\": _4, \"filegear-de\": _4, \"filegear-gb\": _4, \"filegear-ie\": _4, \"filegear-jp\": _4, \"filegear-sg\": _4, \"glitch\": _4, \"ravendb\": _4, \"barsy\": _4, \"nctu\": _4, \"soundcast\": _4, \"tcp4\": _4, \"brasilia\": _4, \"ddns\": _4, \"dnsfor\": _4, \"hopto\": _4, \"loginto\": _4, \"noip\": _4, \"webhop\": _4, \"nym\": _4, \"diskstation\": _4, \"dscloud\": _4, \"i234\": _4, \"myds\": _4, \"synology\": _4, \"wedeploy\": _4, \"yombo\": _4, \"nohost\": _4 } }, \"mg\": { \"$\": 1, \"succ\": { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"com\": _2, \"co\": _2 } }, \"mh\": _2, \"mil\": _2, \"mk\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"gov\": _2, \"inf\": _2, \"name\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"ml\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gouv\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"presse\": _2 } }, \"mm\": _8, \"mn\": { \"$\": 1, \"succ\": { \"gov\": _2, \"edu\": _2, \"org\": _2, \"nyc\": _4, \"nym\": _4 } }, \"mo\": _9, \"mobi\": { \"$\": 1, \"succ\": { \"barsy\": _4, \"dscloud\": _4 } }, \"mp\": _2, \"mq\": _2, \"mr\": { \"$\": 1, \"succ\": { \"gov\": _2, \"blogspot\": _4 } }, \"ms\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"lab\": _4 } }, \"mt\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"net\": _2, \"org\": _2 } }, \"mu\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"ac\": _2, \"co\": _2, \"or\": _2 } }, \"museum\": { \"$\": 1, \"succ\": { \"academy\": _2, \"agriculture\": _2, \"air\": _2, \"airguard\": _2, \"alabama\": _2, \"alaska\": _2, \"amber\": _2, \"ambulance\": _2, \"american\": _2, \"americana\": _2, \"americanantiques\": _2, \"americanart\": _2, \"amsterdam\": _2, \"and\": _2, \"annefrank\": _2, \"anthro\": _2, \"anthropology\": _2, \"antiques\": _2, \"aquarium\": _2, \"arboretum\": _2, \"archaeological\": _2, \"archaeology\": _2, \"architecture\": _2, \"art\": _2, \"artanddesign\": _2, \"artcenter\": _2, \"artdeco\": _2, \"arteducation\": _2, \"artgallery\": _2, \"arts\": _2, \"artsandcrafts\": _2, \"asmatart\": _2, \"assassination\": _2, \"assisi\": _2, \"association\": _2, \"astronomy\": _2, \"atlanta\": _2, \"austin\": _2, \"australia\": _2, \"automotive\": _2, \"aviation\": _2, \"axis\": _2, \"badajoz\": _2, \"baghdad\": _2, \"bahn\": _2, \"bale\": _2, \"baltimore\": _2, \"barcelona\": _2, \"baseball\": _2, \"basel\": _2, \"baths\": _2, \"bauern\": _2, \"beauxarts\": _2, \"beeldengeluid\": _2, \"bellevue\": _2, \"bergbau\": _2, \"berkeley\": _2, \"berlin\": _2, \"bern\": _2, \"bible\": _2, \"bilbao\": _2, \"bill\": _2, \"birdart\": _2, \"birthplace\": _2, \"bonn\": _2, \"boston\": _2, \"botanical\": _2, \"botanicalgarden\": _2, \"botanicgarden\": _2, \"botany\": _2, \"brandywinevalley\": _2, \"brasil\": _2, \"bristol\": _2, \"british\": _2, \"britishcolumbia\": _2, \"broadcast\": _2, \"brunel\": _2, \"brussel\": _2, \"brussels\": _2, \"bruxelles\": _2, \"building\": _2, \"burghof\": _2, \"bus\": _2, \"bushey\": _2, \"cadaques\": _2, \"california\": _2, \"cambridge\": _2, \"can\": _2, \"canada\": _2, \"capebreton\": _2, \"carrier\": _2, \"cartoonart\": _2, \"casadelamoneda\": _2, \"castle\": _2, \"castres\": _2, \"celtic\": _2, \"center\": _2, \"chattanooga\": _2, \"cheltenham\": _2, \"chesapeakebay\": _2, \"chicago\": _2, \"children\": _2, \"childrens\": _2, \"childrensgarden\": _2, \"chiropractic\": _2, \"chocolate\": _2, \"christiansburg\": _2, \"cincinnati\": _2, \"cinema\": _2, \"circus\": _2, \"civilisation\": _2, \"civilization\": _2, \"civilwar\": _2, \"clinton\": _2, \"clock\": _2, \"coal\": _2, \"coastaldefence\": _2, \"cody\": _2, \"coldwar\": _2, \"collection\": _2, \"colonialwilliamsburg\": _2, \"coloradoplateau\": _2, \"columbia\": _2, \"columbus\": _2, \"communication\": _2, \"communications\": _2, \"community\": _2, \"computer\": _2, \"computerhistory\": _2, \"xn--comunicaes-v6a2o\": _2, \"comunicações\": _2, \"contemporary\": _2, \"contemporaryart\": _2, \"convent\": _2, \"copenhagen\": _2, \"corporation\": _2, \"xn--correios-e-telecomunicaes-ghc29a\": _2, \"correios-e-telecomunicações\": _2, \"corvette\": _2, \"costume\": _2, \"countryestate\": _2, \"county\": _2, \"crafts\": _2, \"cranbrook\": _2, \"creation\": _2, \"cultural\": _2, \"culturalcenter\": _2, \"culture\": _2, \"cyber\": _2, \"cymru\": _2, \"dali\": _2, \"dallas\": _2, \"database\": _2, \"ddr\": _2, \"decorativearts\": _2, \"delaware\": _2, \"delmenhorst\": _2, \"denmark\": _2, \"depot\": _2, \"design\": _2, \"detroit\": _2, \"dinosaur\": _2, \"discovery\": _2, \"dolls\": _2, \"donostia\": _2, \"durham\": _2, \"eastafrica\": _2, \"eastcoast\": _2, \"education\": _2, \"educational\": _2, \"egyptian\": _2, \"eisenbahn\": _2, \"elburg\": _2, \"elvendrell\": _2, \"embroidery\": _2, \"encyclopedic\": _2, \"england\": _2, \"entomology\": _2, \"environment\": _2, \"environmentalconservation\": _2, \"epilepsy\": _2, \"essex\": _2, \"estate\": _2, \"ethnology\": _2, \"exeter\": _2, \"exhibition\": _2, \"family\": _2, \"farm\": _2, \"farmequipment\": _2, \"farmers\": _2, \"farmstead\": _2, \"field\": _2, \"figueres\": _2, \"filatelia\": _2, \"film\": _2, \"fineart\": _2, \"finearts\": _2, \"finland\": _2, \"flanders\": _2, \"florida\": _2, \"force\": _2, \"fortmissoula\": _2, \"fortworth\": _2, \"foundation\": _2, \"francaise\": _2, \"frankfurt\": _2, \"franziskaner\": _2, \"freemasonry\": _2, \"freiburg\": _2, \"fribourg\": _2, \"frog\": _2, \"fundacio\": _2, \"furniture\": _2, \"gallery\": _2, \"garden\": _2, \"gateway\": _2, \"geelvinck\": _2, \"gemological\": _2, \"geology\": _2, \"georgia\": _2, \"giessen\": _2, \"glas\": _2, \"glass\": _2, \"gorge\": _2, \"grandrapids\": _2, \"graz\": _2, \"guernsey\": _2, \"halloffame\": _2, \"hamburg\": _2, \"handson\": _2, \"harvestcelebration\": _2, \"hawaii\": _2, \"health\": _2, \"heimatunduhren\": _2, \"hellas\": _2, \"helsinki\": _2, \"hembygdsforbund\": _2, \"heritage\": _2, \"histoire\": _2, \"historical\": _2, \"historicalsociety\": _2, \"historichouses\": _2, \"historisch\": _2, \"historisches\": _2, \"history\": _2, \"historyofscience\": _2, \"horology\": _2, \"house\": _2, \"humanities\": _2, \"illustration\": _2, \"imageandsound\": _2, \"indian\": _2, \"indiana\": _2, \"indianapolis\": _2, \"indianmarket\": _2, \"intelligence\": _2, \"interactive\": _2, \"iraq\": _2, \"iron\": _2, \"isleofman\": _2, \"jamison\": _2, \"jefferson\": _2, \"jerusalem\": _2, \"jewelry\": _2, \"jewish\": _2, \"jewishart\": _2, \"jfk\": _2, \"journalism\": _2, \"judaica\": _2, \"judygarland\": _2, \"juedisches\": _2, \"juif\": _2, \"karate\": _2, \"karikatur\": _2, \"kids\": _2, \"koebenhavn\": _2, \"koeln\": _2, \"kunst\": _2, \"kunstsammlung\": _2, \"kunstunddesign\": _2, \"labor\": _2, \"labour\": _2, \"lajolla\": _2, \"lancashire\": _2, \"landes\": _2, \"lans\": _2, \"xn--lns-qla\": _2, \"läns\": _2, \"larsson\": _2, \"lewismiller\": _2, \"lincoln\": _2, \"linz\": _2, \"living\": _2, \"livinghistory\": _2, \"localhistory\": _2, \"london\": _2, \"losangeles\": _2, \"louvre\": _2, \"loyalist\": _2, \"lucerne\": _2, \"luxembourg\": _2, \"luzern\": _2, \"mad\": _2, \"madrid\": _2, \"mallorca\": _2, \"manchester\": _2, \"mansion\": _2, \"mansions\": _2, \"manx\": _2, \"marburg\": _2, \"maritime\": _2, \"maritimo\": _2, \"maryland\": _2, \"marylhurst\": _2, \"media\": _2, \"medical\": _2, \"medizinhistorisches\": _2, \"meeres\": _2, \"memorial\": _2, \"mesaverde\": _2, \"michigan\": _2, \"midatlantic\": _2, \"military\": _2, \"mill\": _2, \"miners\": _2, \"mining\": _2, \"minnesota\": _2, \"missile\": _2, \"missoula\": _2, \"modern\": _2, \"moma\": _2, \"money\": _2, \"monmouth\": _2, \"monticello\": _2, \"montreal\": _2, \"moscow\": _2, \"motorcycle\": _2, \"muenchen\": _2, \"muenster\": _2, \"mulhouse\": _2, \"muncie\": _2, \"museet\": _2, \"museumcenter\": _2, \"museumvereniging\": _2, \"music\": _2, \"national\": _2, \"nationalfirearms\": _2, \"nationalheritage\": _2, \"nativeamerican\": _2, \"naturalhistory\": _2, \"naturalhistorymuseum\": _2, \"naturalsciences\": _2, \"nature\": _2, \"naturhistorisches\": _2, \"natuurwetenschappen\": _2, \"naumburg\": _2, \"naval\": _2, \"nebraska\": _2, \"neues\": _2, \"newhampshire\": _2, \"newjersey\": _2, \"newmexico\": _2, \"newport\": _2, \"newspaper\": _2, \"newyork\": _2, \"niepce\": _2, \"norfolk\": _2, \"north\": _2, \"nrw\": _2, \"nyc\": _2, \"nyny\": _2, \"oceanographic\": _2, \"oceanographique\": _2, \"omaha\": _2, \"online\": _2, \"ontario\": _2, \"openair\": _2, \"oregon\": _2, \"oregontrail\": _2, \"otago\": _2, \"oxford\": _2, \"pacific\": _2, \"paderborn\": _2, \"palace\": _2, \"paleo\": _2, \"palmsprings\": _2, \"panama\": _2, \"paris\": _2, \"pasadena\": _2, \"pharmacy\": _2, \"philadelphia\": _2, \"philadelphiaarea\": _2, \"philately\": _2, \"phoenix\": _2, \"photography\": _2, \"pilots\": _2, \"pittsburgh\": _2, \"planetarium\": _2, \"plantation\": _2, \"plants\": _2, \"plaza\": _2, \"portal\": _2, \"portland\": _2, \"portlligat\": _2, \"posts-and-telecommunications\": _2, \"preservation\": _2, \"presidio\": _2, \"press\": _2, \"project\": _2, \"public\": _2, \"pubol\": _2, \"quebec\": _2, \"railroad\": _2, \"railway\": _2, \"research\": _2, \"resistance\": _2, \"riodejaneiro\": _2, \"rochester\": _2, \"rockart\": _2, \"roma\": _2, \"russia\": _2, \"saintlouis\": _2, \"salem\": _2, \"salvadordali\": _2, \"salzburg\": _2, \"sandiego\": _2, \"sanfrancisco\": _2, \"santabarbara\": _2, \"santacruz\": _2, \"santafe\": _2, \"saskatchewan\": _2, \"satx\": _2, \"savannahga\": _2, \"schlesisches\": _2, \"schoenbrunn\": _2, \"schokoladen\": _2, \"school\": _2, \"schweiz\": _2, \"science\": _2, \"scienceandhistory\": _2, \"scienceandindustry\": _2, \"sciencecenter\": _2, \"sciencecenters\": _2, \"science-fiction\": _2, \"sciencehistory\": _2, \"sciences\": _2, \"sciencesnaturelles\": _2, \"scotland\": _2, \"seaport\": _2, \"settlement\": _2, \"settlers\": _2, \"shell\": _2, \"sherbrooke\": _2, \"sibenik\": _2, \"silk\": _2, \"ski\": _2, \"skole\": _2, \"society\": _2, \"sologne\": _2, \"soundandvision\": _2, \"southcarolina\": _2, \"southwest\": _2, \"space\": _2, \"spy\": _2, \"square\": _2, \"stadt\": _2, \"stalbans\": _2, \"starnberg\": _2, \"state\": _2, \"stateofdelaware\": _2, \"station\": _2, \"steam\": _2, \"steiermark\": _2, \"stjohn\": _2, \"stockholm\": _2, \"stpetersburg\": _2, \"stuttgart\": _2, \"suisse\": _2, \"surgeonshall\": _2, \"surrey\": _2, \"svizzera\": _2, \"sweden\": _2, \"sydney\": _2, \"tank\": _2, \"tcm\": _2, \"technology\": _2, \"telekommunikation\": _2, \"television\": _2, \"texas\": _2, \"textile\": _2, \"theater\": _2, \"time\": _2, \"timekeeping\": _2, \"topology\": _2, \"torino\": _2, \"touch\": _2, \"town\": _2, \"transport\": _2, \"tree\": _2, \"trolley\": _2, \"trust\": _2, \"trustee\": _2, \"uhren\": _2, \"ulm\": _2, \"undersea\": _2, \"university\": _2, \"usa\": _2, \"usantiques\": _2, \"usarts\": _2, \"uscountryestate\": _2, \"usculture\": _2, \"usdecorativearts\": _2, \"usgarden\": _2, \"ushistory\": _2, \"ushuaia\": _2, \"uslivinghistory\": _2, \"utah\": _2, \"uvic\": _2, \"valley\": _2, \"vantaa\": _2, \"versailles\": _2, \"viking\": _2, \"village\": _2, \"virginia\": _2, \"virtual\": _2, \"virtuel\": _2, \"vlaanderen\": _2, \"volkenkunde\": _2, \"wales\": _2, \"wallonie\": _2, \"war\": _2, \"washingtondc\": _2, \"watchandclock\": _2, \"watch-and-clock\": _2, \"western\": _2, \"westfalen\": _2, \"whaling\": _2, \"wildlife\": _2, \"williamsburg\": _2, \"windmill\": _2, \"workshop\": _2, \"york\": _2, \"yorkshire\": _2, \"yosemite\": _2, \"youth\": _2, \"zoological\": _2, \"zoology\": _2, \"xn--9dbhblg6di\": _2, \"ירושלים\": _2, \"xn--h1aegh\": _2, \"иком\": _2 } }, \"mv\": { \"$\": 1, \"succ\": { \"aero\": _2, \"biz\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"museum\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"mw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"int\": _2, \"museum\": _2, \"net\": _2, \"org\": _2 } }, \"mx\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2, \"net\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"my\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"mil\": _2, \"name\": _2, \"blogspot\": _4 } }, \"mz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"adv\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"na\": { \"$\": 1, \"succ\": { \"info\": _2, \"pro\": _2, \"name\": _2, \"school\": _2, \"or\": _2, \"dr\": _2, \"us\": _2, \"mx\": _2, \"ca\": _2, \"in\": _2, \"cc\": _2, \"tv\": _2, \"ws\": _2, \"mobi\": _2, \"co\": _2, \"com\": _2, \"org\": _2 } }, \"name\": { \"$\": 1, \"succ\": { \"her\": _26, \"his\": _26 } }, \"nc\": { \"$\": 1, \"succ\": { \"asso\": _2, \"nom\": _2 } }, \"ne\": _2, \"net\": { \"$\": 1, \"succ\": { \"adobeaemcloud\": _4, \"alwaysdata\": _4, \"cloudfront\": _4, \"t3l3p0rt\": _4, \"myfritz\": _4, \"blackbaudcdn\": _4, \"boomla\": _4, \"bplaced\": _4, \"square7\": _4, \"gb\": _4, \"hu\": _4, \"jp\": _4, \"se\": _4, \"uk\": _4, \"in\": _4, \"clic2000\": _4, \"cloudaccess\": _4, \"cdn77-ssl\": _4, \"cdn77\": { \"$\": 0, \"succ\": { \"r\": _4 } }, \"cloudeity\": _4, \"feste-ip\": _4, \"knx-server\": _4, \"static-access\": _4, \"cryptonomic\": _7, \"dattolocal\": _4, \"mydatto\": _4, \"debian\": _4, \"bitbridge\": _4, \"at-band-camp\": _4, \"blogdns\": _4, \"broke-it\": _4, \"buyshouses\": _4, \"dnsalias\": _4, \"dnsdojo\": _4, \"does-it\": _4, \"dontexist\": _4, \"dynalias\": _4, \"dynathome\": _4, \"endofinternet\": _4, \"from-az\": _4, \"from-co\": _4, \"from-la\": _4, \"from-ny\": _4, \"gets-it\": _4, \"ham-radio-op\": _4, \"homeftp\": _4, \"homeip\": _4, \"homelinux\": _4, \"homeunix\": _4, \"in-the-band\": _4, \"is-a-chef\": _4, \"is-a-geek\": _4, \"isa-geek\": _4, \"kicks-ass\": _4, \"office-on-the\": _4, \"podzone\": _4, \"scrapper-site\": _4, \"selfip\": _4, \"sells-it\": _4, \"servebbs\": _4, \"serveftp\": _4, \"thruhere\": _4, \"webhop\": _4, \"definima\": _4, \"casacam\": _4, \"dynu\": _4, \"dynv6\": _4, \"twmail\": _4, \"ru\": _4, \"channelsdvr\": { \"$\": 2, \"succ\": { \"u\": _4 } }, \"fastlylb\": { \"$\": 2, \"succ\": { \"map\": _4 } }, \"fastly\": { \"$\": 0, \"succ\": { \"freetls\": _4, \"map\": _4, \"prod\": { \"$\": 0, \"succ\": { \"a\": _4, \"global\": _4 } }, \"ssl\": { \"$\": 0, \"succ\": { \"a\": _4, \"b\": _4, \"global\": _4 } } } }, \"edgeapp\": _4, \"flynnhosting\": _4, \"cloudfunctions\": _4, \"moonscale\": _4, \"in-dsl\": _4, \"in-vpn\": _4, \"ipifony\": _4, \"iobb\": _4, \"cloudjiffy\": _4, \"elastx\": { \"$\": 0, \"succ\": { \"jls-sto1\": _4 } }, \"saveincloud\": _27, \"kinghost\": _4, \"uni5\": _4, \"barsy\": _4, \"memset\": _4, \"azurewebsites\": _4, \"azure-mobile\": _4, \"cloudapp\": _4, \"dnsup\": _4, \"hicam\": _4, \"now-dns\": _4, \"ownip\": _4, \"vpndns\": _4, \"eating-organic\": _4, \"mydissent\": _4, \"myeffect\": _4, \"mymediapc\": _4, \"mypsx\": _4, \"mysecuritycamera\": _4, \"nhlfan\": _4, \"no-ip\": _4, \"pgafan\": _4, \"privatizehealthinsurance\": _4, \"bounceme\": _4, \"ddns\": _4, \"redirectme\": _4, \"serveblog\": _4, \"serveminecraft\": _4, \"sytes\": _4, \"cloudycluster\": _4, \"rackmaze\": _4, \"schokokeks\": _4, \"firewall-gateway\": _4, \"seidat\": _4, \"senseering\": _4, \"siteleaf\": _4, \"srcf\": { \"$\": 0, \"succ\": { \"soc\": _4, \"user\": _4 } }, \"dsmynas\": _4, \"familyds\": _4, \"community-pro\": _4, \"meinforum\": _4, \"yandexcloud\": { \"$\": 2, \"succ\": { \"storage\": _4, \"website\": _4 } }, \"za\": _4 } }, \"nf\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"per\": _2, \"rec\": _2, \"web\": _2, \"arts\": _2, \"firm\": _2, \"info\": _2, \"other\": _2, \"store\": _2 } }, \"ng\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"gov\": _2, \"i\": _2, \"mil\": _2, \"mobi\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"col\": _4, \"firm\": _4, \"gen\": _4, \"ltd\": _4, \"ngo\": _4 } }, \"ni\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"in\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"web\": _2 } }, \"nl\": { \"$\": 1, \"succ\": { \"amsw\": _4, \"virtueeldomein\": _4, \"co\": _4, \"hosting-cluster\": _4, \"blogspot\": _4, \"khplay\": _4, \"transurl\": _7, \"cistron\": _4, \"demon\": _4 } }, \"no\": { \"$\": 1, \"succ\": { \"fhs\": _2, \"vgs\": _2, \"fylkesbibl\": _2, \"folkebibl\": _2, \"museum\": _2, \"idrett\": _2, \"priv\": _2, \"mil\": _2, \"stat\": _2, \"dep\": _2, \"kommune\": _2, \"herad\": _2, \"aa\": _28, \"ah\": _28, \"bu\": _28, \"fm\": _28, \"hl\": _28, \"hm\": _28, \"jan-mayen\": _28, \"mr\": _28, \"nl\": _28, \"nt\": _28, \"of\": _28, \"ol\": _28, \"oslo\": _28, \"rl\": _28, \"sf\": _28, \"st\": _28, \"svalbard\": _28, \"tm\": _28, \"tr\": _28, \"va\": _28, \"vf\": _28, \"akrehamn\": _2, \"xn--krehamn-dxa\": _2, \"åkrehamn\": _2, \"algard\": _2, \"xn--lgrd-poac\": _2, \"ålgård\": _2, \"arna\": _2, \"brumunddal\": _2, \"bryne\": _2, \"bronnoysund\": _2, \"xn--brnnysund-m8ac\": _2, \"brønnøysund\": _2, \"drobak\": _2, \"xn--drbak-wua\": _2, \"drøbak\": _2, \"egersund\": _2, \"fetsund\": _2, \"floro\": _2, \"xn--flor-jra\": _2, \"florø\": _2, \"fredrikstad\": _2, \"hokksund\": _2, \"honefoss\": _2, \"xn--hnefoss-q1a\": _2, \"hønefoss\": _2, \"jessheim\": _2, \"jorpeland\": _2, \"xn--jrpeland-54a\": _2, \"jørpeland\": _2, \"kirkenes\": _2, \"kopervik\": _2, \"krokstadelva\": _2, \"langevag\": _2, \"xn--langevg-jxa\": _2, \"langevåg\": _2, \"leirvik\": _2, \"mjondalen\": _2, \"xn--mjndalen-64a\": _2, \"mjøndalen\": _2, \"mo-i-rana\": _2, \"mosjoen\": _2, \"xn--mosjen-eya\": _2, \"mosjøen\": _2, \"nesoddtangen\": _2, \"orkanger\": _2, \"osoyro\": _2, \"xn--osyro-wua\": _2, \"osøyro\": _2, \"raholt\": _2, \"xn--rholt-mra\": _2, \"råholt\": _2, \"sandnessjoen\": _2, \"xn--sandnessjen-ogb\": _2, \"sandnessjøen\": _2, \"skedsmokorset\": _2, \"slattum\": _2, \"spjelkavik\": _2, \"stathelle\": _2, \"stavern\": _2, \"stjordalshalsen\": _2, \"xn--stjrdalshalsen-sqb\": _2, \"stjørdalshalsen\": _2, \"tananger\": _2, \"tranby\": _2, \"vossevangen\": _2, \"afjord\": _2, \"xn--fjord-lra\": _2, \"åfjord\": _2, \"agdenes\": _2, \"al\": _2, \"xn--l-1fa\": _2, \"ål\": _2, \"alesund\": _2, \"xn--lesund-hua\": _2, \"ålesund\": _2, \"alstahaug\": _2, \"alta\": _2, \"xn--lt-liac\": _2, \"áltá\": _2, \"alaheadju\": _2, \"xn--laheadju-7ya\": _2, \"álaheadju\": _2, \"alvdal\": _2, \"amli\": _2, \"xn--mli-tla\": _2, \"åmli\": _2, \"amot\": _2, \"xn--mot-tla\": _2, \"åmot\": _2, \"andebu\": _2, \"andoy\": _2, \"xn--andy-ira\": _2, \"andøy\": _2, \"andasuolo\": _2, \"ardal\": _2, \"xn--rdal-poa\": _2, \"årdal\": _2, \"aremark\": _2, \"arendal\": _2, \"xn--s-1fa\": _2, \"ås\": _2, \"aseral\": _2, \"xn--seral-lra\": _2, \"åseral\": _2, \"asker\": _2, \"askim\": _2, \"askvoll\": _2, \"askoy\": _2, \"xn--asky-ira\": _2, \"askøy\": _2, \"asnes\": _2, \"xn--snes-poa\": _2, \"åsnes\": _2, \"audnedaln\": _2, \"aukra\": _2, \"aure\": _2, \"aurland\": _2, \"aurskog-holand\": _2, \"xn--aurskog-hland-jnb\": _2, \"aurskog-høland\": _2, \"austevoll\": _2, \"austrheim\": _2, \"averoy\": _2, \"xn--avery-yua\": _2, \"averøy\": _2, \"balestrand\": _2, \"ballangen\": _2, \"balat\": _2, \"xn--blt-elab\": _2, \"bálát\": _2, \"balsfjord\": _2, \"bahccavuotna\": _2, \"xn--bhccavuotna-k7a\": _2, \"báhccavuotna\": _2, \"bamble\": _2, \"bardu\": _2, \"beardu\": _2, \"beiarn\": _2, \"bajddar\": _2, \"xn--bjddar-pta\": _2, \"bájddar\": _2, \"baidar\": _2, \"xn--bidr-5nac\": _2, \"báidár\": _2, \"berg\": _2, \"bergen\": _2, \"berlevag\": _2, \"xn--berlevg-jxa\": _2, \"berlevåg\": _2, \"bearalvahki\": _2, \"xn--bearalvhki-y4a\": _2, \"bearalváhki\": _2, \"bindal\": _2, \"birkenes\": _2, \"bjarkoy\": _2, \"xn--bjarky-fya\": _2, \"bjarkøy\": _2, \"bjerkreim\": _2, \"bjugn\": _2, \"bodo\": _2, \"xn--bod-2na\": _2, \"bodø\": _2, \"badaddja\": _2, \"xn--bdddj-mrabd\": _2, \"bådåddjå\": _2, \"budejju\": _2, \"bokn\": _2, \"bremanger\": _2, \"bronnoy\": _2, \"xn--brnny-wuac\": _2, \"brønnøy\": _2, \"bygland\": _2, \"bykle\": _2, \"barum\": _2, \"xn--brum-voa\": _2, \"bærum\": _2, \"telemark\": { \"$\": 0, \"succ\": { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2 } }, \"nordland\": { \"$\": 0, \"succ\": { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2, \"heroy\": _2, \"xn--hery-ira\": _2, \"herøy\": _2 } }, \"bievat\": _2, \"xn--bievt-0qa\": _2, \"bievát\": _2, \"bomlo\": _2, \"xn--bmlo-gra\": _2, \"bømlo\": _2, \"batsfjord\": _2, \"xn--btsfjord-9za\": _2, \"båtsfjord\": _2, \"bahcavuotna\": _2, \"xn--bhcavuotna-s4a\": _2, \"báhcavuotna\": _2, \"dovre\": _2, \"drammen\": _2, \"drangedal\": _2, \"dyroy\": _2, \"xn--dyry-ira\": _2, \"dyrøy\": _2, \"donna\": _2, \"xn--dnna-gra\": _2, \"dønna\": _2, \"eid\": _2, \"eidfjord\": _2, \"eidsberg\": _2, \"eidskog\": _2, \"eidsvoll\": _2, \"eigersund\": _2, \"elverum\": _2, \"enebakk\": _2, \"engerdal\": _2, \"etne\": _2, \"etnedal\": _2, \"evenes\": _2, \"evenassi\": _2, \"xn--eveni-0qa01ga\": _2, \"evenášši\": _2, \"evje-og-hornnes\": _2, \"farsund\": _2, \"fauske\": _2, \"fuossko\": _2, \"fuoisku\": _2, \"fedje\": _2, \"fet\": _2, \"finnoy\": _2, \"xn--finny-yua\": _2, \"finnøy\": _2, \"fitjar\": _2, \"fjaler\": _2, \"fjell\": _2, \"flakstad\": _2, \"flatanger\": _2, \"flekkefjord\": _2, \"flesberg\": _2, \"flora\": _2, \"fla\": _2, \"xn--fl-zia\": _2, \"flå\": _2, \"folldal\": _2, \"forsand\": _2, \"fosnes\": _2, \"frei\": _2, \"frogn\": _2, \"froland\": _2, \"frosta\": _2, \"frana\": _2, \"xn--frna-woa\": _2, \"fræna\": _2, \"froya\": _2, \"xn--frya-hra\": _2, \"frøya\": _2, \"fusa\": _2, \"fyresdal\": _2, \"forde\": _2, \"xn--frde-gra\": _2, \"førde\": _2, \"gamvik\": _2, \"gangaviika\": _2, \"xn--ggaviika-8ya47h\": _2, \"gáŋgaviika\": _2, \"gaular\": _2, \"gausdal\": _2, \"gildeskal\": _2, \"xn--gildeskl-g0a\": _2, \"gildeskål\": _2, \"giske\": _2, \"gjemnes\": _2, \"gjerdrum\": _2, \"gjerstad\": _2, \"gjesdal\": _2, \"gjovik\": _2, \"xn--gjvik-wua\": _2, \"gjøvik\": _2, \"gloppen\": _2, \"gol\": _2, \"gran\": _2, \"grane\": _2, \"granvin\": _2, \"gratangen\": _2, \"grimstad\": _2, \"grong\": _2, \"kraanghke\": _2, \"xn--kranghke-b0a\": _2, \"kråanghke\": _2, \"grue\": _2, \"gulen\": _2, \"hadsel\": _2, \"halden\": _2, \"halsa\": _2, \"hamar\": _2, \"hamaroy\": _2, \"habmer\": _2, \"xn--hbmer-xqa\": _2, \"hábmer\": _2, \"hapmir\": _2, \"xn--hpmir-xqa\": _2, \"hápmir\": _2, \"hammerfest\": _2, \"hammarfeasta\": _2, \"xn--hmmrfeasta-s4ac\": _2, \"hámmárfeasta\": _2, \"haram\": _2, \"hareid\": _2, \"harstad\": _2, \"hasvik\": _2, \"aknoluokta\": _2, \"xn--koluokta-7ya57h\": _2, \"ákŋoluokta\": _2, \"hattfjelldal\": _2, \"aarborte\": _2, \"haugesund\": _2, \"hemne\": _2, \"hemnes\": _2, \"hemsedal\": _2, \"more-og-romsdal\": { \"$\": 0, \"succ\": { \"heroy\": _2, \"sande\": _2 } }, \"xn--mre-og-romsdal-qqb\": { \"$\": 0, \"succ\": { \"xn--hery-ira\": _2, \"sande\": _2 } }, \"møre-og-romsdal\": { \"$\": 0, \"succ\": { \"herøy\": _2, \"sande\": _2 } }, \"hitra\": _2, \"hjartdal\": _2, \"hjelmeland\": _2, \"hobol\": _2, \"xn--hobl-ira\": _2, \"hobøl\": _2, \"hof\": _2, \"hol\": _2, \"hole\": _2, \"holmestrand\": _2, \"holtalen\": _2, \"xn--holtlen-hxa\": _2, \"holtålen\": _2, \"hornindal\": _2, \"horten\": _2, \"hurdal\": _2, \"hurum\": _2, \"hvaler\": _2, \"hyllestad\": _2, \"hagebostad\": _2, \"xn--hgebostad-g3a\": _2, \"hægebostad\": _2, \"hoyanger\": _2, \"xn--hyanger-q1a\": _2, \"høyanger\": _2, \"hoylandet\": _2, \"xn--hylandet-54a\": _2, \"høylandet\": _2, \"ha\": _2, \"xn--h-2fa\": _2, \"hå\": _2, \"ibestad\": _2, \"inderoy\": _2, \"xn--indery-fya\": _2, \"inderøy\": _2, \"iveland\": _2, \"jevnaker\": _2, \"jondal\": _2, \"jolster\": _2, \"xn--jlster-bya\": _2, \"jølster\": _2, \"karasjok\": _2, \"karasjohka\": _2, \"xn--krjohka-hwab49j\": _2, \"kárášjohka\": _2, \"karlsoy\": _2, \"galsa\": _2, \"xn--gls-elac\": _2, \"gálsá\": _2, \"karmoy\": _2, \"xn--karmy-yua\": _2, \"karmøy\": _2, \"kautokeino\": _2, \"guovdageaidnu\": _2, \"klepp\": _2, \"klabu\": _2, \"xn--klbu-woa\": _2, \"klæbu\": _2, \"kongsberg\": _2, \"kongsvinger\": _2, \"kragero\": _2, \"xn--krager-gya\": _2, \"kragerø\": _2, \"kristiansand\": _2, \"kristiansund\": _2, \"krodsherad\": _2, \"xn--krdsherad-m8a\": _2, \"krødsherad\": _2, \"kvalsund\": _2, \"rahkkeravju\": _2, \"xn--rhkkervju-01af\": _2, \"ráhkkerávju\": _2, \"kvam\": _2, \"kvinesdal\": _2, \"kvinnherad\": _2, \"kviteseid\": _2, \"kvitsoy\": _2, \"xn--kvitsy-fya\": _2, \"kvitsøy\": _2, \"kvafjord\": _2, \"xn--kvfjord-nxa\": _2, \"kvæfjord\": _2, \"giehtavuoatna\": _2, \"kvanangen\": _2, \"xn--kvnangen-k0a\": _2, \"kvænangen\": _2, \"navuotna\": _2, \"xn--nvuotna-hwa\": _2, \"návuotna\": _2, \"kafjord\": _2, \"xn--kfjord-iua\": _2, \"kåfjord\": _2, \"gaivuotna\": _2, \"xn--givuotna-8ya\": _2, \"gáivuotna\": _2, \"larvik\": _2, \"lavangen\": _2, \"lavagis\": _2, \"loabat\": _2, \"xn--loabt-0qa\": _2, \"loabát\": _2, \"lebesby\": _2, \"davvesiida\": _2, \"leikanger\": _2, \"leirfjord\": _2, \"leka\": _2, \"leksvik\": _2, \"lenvik\": _2, \"leangaviika\": _2, \"xn--leagaviika-52b\": _2, \"leaŋgaviika\": _2, \"lesja\": _2, \"levanger\": _2, \"lier\": _2, \"lierne\": _2, \"lillehammer\": _2, \"lillesand\": _2, \"lindesnes\": _2, \"lindas\": _2, \"xn--linds-pra\": _2, \"lindås\": _2, \"lom\": _2, \"loppa\": _2, \"lahppi\": _2, \"xn--lhppi-xqa\": _2, \"láhppi\": _2, \"lund\": _2, \"lunner\": _2, \"luroy\": _2, \"xn--lury-ira\": _2, \"lurøy\": _2, \"luster\": _2, \"lyngdal\": _2, \"lyngen\": _2, \"ivgu\": _2, \"lardal\": _2, \"lerdal\": _2, \"xn--lrdal-sra\": _2, \"lærdal\": _2, \"lodingen\": _2, \"xn--ldingen-q1a\": _2, \"lødingen\": _2, \"lorenskog\": _2, \"xn--lrenskog-54a\": _2, \"lørenskog\": _2, \"loten\": _2, \"xn--lten-gra\": _2, \"løten\": _2, \"malvik\": _2, \"masoy\": _2, \"xn--msy-ula0h\": _2, \"måsøy\": _2, \"muosat\": _2, \"xn--muost-0qa\": _2, \"muosát\": _2, \"mandal\": _2, \"marker\": _2, \"marnardal\": _2, \"masfjorden\": _2, \"meland\": _2, \"meldal\": _2, \"melhus\": _2, \"meloy\": _2, \"xn--mely-ira\": _2, \"meløy\": _2, \"meraker\": _2, \"xn--merker-kua\": _2, \"meråker\": _2, \"moareke\": _2, \"xn--moreke-jua\": _2, \"moåreke\": _2, \"midsund\": _2, \"midtre-gauldal\": _2, \"modalen\": _2, \"modum\": _2, \"molde\": _2, \"moskenes\": _2, \"moss\": _2, \"mosvik\": _2, \"malselv\": _2, \"xn--mlselv-iua\": _2, \"målselv\": _2, \"malatvuopmi\": _2, \"xn--mlatvuopmi-s4a\": _2, \"málatvuopmi\": _2, \"namdalseid\": _2, \"aejrie\": _2, \"namsos\": _2, \"namsskogan\": _2, \"naamesjevuemie\": _2, \"xn--nmesjevuemie-tcba\": _2, \"nååmesjevuemie\": _2, \"laakesvuemie\": _2, \"nannestad\": _2, \"narvik\": _2, \"narviika\": _2, \"naustdal\": _2, \"nedre-eiker\": _2, \"akershus\": _29, \"buskerud\": _29, \"nesna\": _2, \"nesodden\": _2, \"nesseby\": _2, \"unjarga\": _2, \"xn--unjrga-rta\": _2, \"unjárga\": _2, \"nesset\": _2, \"nissedal\": _2, \"nittedal\": _2, \"nord-aurdal\": _2, \"nord-fron\": _2, \"nord-odal\": _2, \"norddal\": _2, \"nordkapp\": _2, \"davvenjarga\": _2, \"xn--davvenjrga-y4a\": _2, \"davvenjárga\": _2, \"nordre-land\": _2, \"nordreisa\": _2, \"raisa\": _2, \"xn--risa-5na\": _2, \"ráisa\": _2, \"nore-og-uvdal\": _2, \"notodden\": _2, \"naroy\": _2, \"xn--nry-yla5g\": _2, \"nærøy\": _2, \"notteroy\": _2, \"xn--nttery-byae\": _2, \"nøtterøy\": _2, \"odda\": _2, \"oksnes\": _2, \"xn--ksnes-uua\": _2, \"øksnes\": _2, \"oppdal\": _2, \"oppegard\": _2, \"xn--oppegrd-ixa\": _2, \"oppegård\": _2, \"orkdal\": _2, \"orland\": _2, \"xn--rland-uua\": _2, \"ørland\": _2, \"orskog\": _2, \"xn--rskog-uua\": _2, \"ørskog\": _2, \"orsta\": _2, \"xn--rsta-fra\": _2, \"ørsta\": _2, \"hedmark\": { \"$\": 0, \"succ\": { \"os\": _2, \"valer\": _2, \"xn--vler-qoa\": _2, \"våler\": _2 } }, \"hordaland\": { \"$\": 0, \"succ\": { \"os\": _2 } }, \"osen\": _2, \"osteroy\": _2, \"xn--ostery-fya\": _2, \"osterøy\": _2, \"ostre-toten\": _2, \"xn--stre-toten-zcb\": _2, \"østre-toten\": _2, \"overhalla\": _2, \"ovre-eiker\": _2, \"xn--vre-eiker-k8a\": _2, \"øvre-eiker\": _2, \"oyer\": _2, \"xn--yer-zna\": _2, \"øyer\": _2, \"oygarden\": _2, \"xn--ygarden-p1a\": _2, \"øygarden\": _2, \"oystre-slidre\": _2, \"xn--ystre-slidre-ujb\": _2, \"øystre-slidre\": _2, \"porsanger\": _2, \"porsangu\": _2, \"xn--porsgu-sta26f\": _2, \"porsáŋgu\": _2, \"porsgrunn\": _2, \"radoy\": _2, \"xn--rady-ira\": _2, \"radøy\": _2, \"rakkestad\": _2, \"rana\": _2, \"ruovat\": _2, \"randaberg\": _2, \"rauma\": _2, \"rendalen\": _2, \"rennebu\": _2, \"rennesoy\": _2, \"xn--rennesy-v1a\": _2, \"rennesøy\": _2, \"rindal\": _2, \"ringebu\": _2, \"ringerike\": _2, \"ringsaker\": _2, \"rissa\": _2, \"risor\": _2, \"xn--risr-ira\": _2, \"risør\": _2, \"roan\": _2, \"rollag\": _2, \"rygge\": _2, \"ralingen\": _2, \"xn--rlingen-mxa\": _2, \"rælingen\": _2, \"rodoy\": _2, \"xn--rdy-0nab\": _2, \"rødøy\": _2, \"romskog\": _2, \"xn--rmskog-bya\": _2, \"rømskog\": _2, \"roros\": _2, \"xn--rros-gra\": _2, \"røros\": _2, \"rost\": _2, \"xn--rst-0na\": _2, \"røst\": _2, \"royken\": _2, \"xn--ryken-vua\": _2, \"røyken\": _2, \"royrvik\": _2, \"xn--ryrvik-bya\": _2, \"røyrvik\": _2, \"rade\": _2, \"xn--rde-ula\": _2, \"råde\": _2, \"salangen\": _2, \"siellak\": _2, \"saltdal\": _2, \"salat\": _2, \"xn--slt-elab\": _2, \"sálát\": _2, \"xn--slat-5na\": _2, \"sálat\": _2, \"samnanger\": _2, \"vestfold\": { \"$\": 0, \"succ\": { \"sande\": _2 } }, \"sandefjord\": _2, \"sandnes\": _2, \"sandoy\": _2, \"xn--sandy-yua\": _2, \"sandøy\": _2, \"sarpsborg\": _2, \"sauda\": _2, \"sauherad\": _2, \"sel\": _2, \"selbu\": _2, \"selje\": _2, \"seljord\": _2, \"sigdal\": _2, \"siljan\": _2, \"sirdal\": _2, \"skaun\": _2, \"skedsmo\": _2, \"ski\": _2, \"skien\": _2, \"skiptvet\": _2, \"skjervoy\": _2, \"xn--skjervy-v1a\": _2, \"skjervøy\": _2, \"skierva\": _2, \"xn--skierv-uta\": _2, \"skiervá\": _2, \"skjak\": _2, \"xn--skjk-soa\": _2, \"skjåk\": _2, \"skodje\": _2, \"skanland\": _2, \"xn--sknland-fxa\": _2, \"skånland\": _2, \"skanit\": _2, \"xn--sknit-yqa\": _2, \"skánit\": _2, \"smola\": _2, \"xn--smla-hra\": _2, \"smøla\": _2, \"snillfjord\": _2, \"snasa\": _2, \"xn--snsa-roa\": _2, \"snåsa\": _2, \"snoasa\": _2, \"snaase\": _2, \"xn--snase-nra\": _2, \"snåase\": _2, \"sogndal\": _2, \"sokndal\": _2, \"sola\": _2, \"solund\": _2, \"songdalen\": _2, \"sortland\": _2, \"spydeberg\": _2, \"stange\": _2, \"stavanger\": _2, \"steigen\": _2, \"steinkjer\": _2, \"stjordal\": _2, \"xn--stjrdal-s1a\": _2, \"stjørdal\": _2, \"stokke\": _2, \"stor-elvdal\": _2, \"stord\": _2, \"stordal\": _2, \"storfjord\": _2, \"omasvuotna\": _2, \"strand\": _2, \"stranda\": _2, \"stryn\": _2, \"sula\": _2, \"suldal\": _2, \"sund\": _2, \"sunndal\": _2, \"surnadal\": _2, \"sveio\": _2, \"svelvik\": _2, \"sykkylven\": _2, \"sogne\": _2, \"xn--sgne-gra\": _2, \"søgne\": _2, \"somna\": _2, \"xn--smna-gra\": _2, \"sømna\": _2, \"sondre-land\": _2, \"xn--sndre-land-0cb\": _2, \"søndre-land\": _2, \"sor-aurdal\": _2, \"xn--sr-aurdal-l8a\": _2, \"sør-aurdal\": _2, \"sor-fron\": _2, \"xn--sr-fron-q1a\": _2, \"sør-fron\": _2, \"sor-odal\": _2, \"xn--sr-odal-q1a\": _2, \"sør-odal\": _2, \"sor-varanger\": _2, \"xn--sr-varanger-ggb\": _2, \"sør-varanger\": _2, \"matta-varjjat\": _2, \"xn--mtta-vrjjat-k7af\": _2, \"mátta-várjjat\": _2, \"sorfold\": _2, \"xn--srfold-bya\": _2, \"sørfold\": _2, \"sorreisa\": _2, \"xn--srreisa-q1a\": _2, \"sørreisa\": _2, \"sorum\": _2, \"xn--srum-gra\": _2, \"sørum\": _2, \"tana\": _2, \"deatnu\": _2, \"time\": _2, \"tingvoll\": _2, \"tinn\": _2, \"tjeldsund\": _2, \"dielddanuorri\": _2, \"tjome\": _2, \"xn--tjme-hra\": _2, \"tjøme\": _2, \"tokke\": _2, \"tolga\": _2, \"torsken\": _2, \"tranoy\": _2, \"xn--trany-yua\": _2, \"tranøy\": _2, \"tromso\": _2, \"xn--troms-zua\": _2, \"tromsø\": _2, \"tromsa\": _2, \"romsa\": _2, \"trondheim\": _2, \"troandin\": _2, \"trysil\": _2, \"trana\": _2, \"xn--trna-woa\": _2, \"træna\": _2, \"trogstad\": _2, \"xn--trgstad-r1a\": _2, \"trøgstad\": _2, \"tvedestrand\": _2, \"tydal\": _2, \"tynset\": _2, \"tysfjord\": _2, \"divtasvuodna\": _2, \"divttasvuotna\": _2, \"tysnes\": _2, \"tysvar\": _2, \"xn--tysvr-vra\": _2, \"tysvær\": _2, \"tonsberg\": _2, \"xn--tnsberg-q1a\": _2, \"tønsberg\": _2, \"ullensaker\": _2, \"ullensvang\": _2, \"ulvik\": _2, \"utsira\": _2, \"vadso\": _2, \"xn--vads-jra\": _2, \"vadsø\": _2, \"cahcesuolo\": _2, \"xn--hcesuolo-7ya35b\": _2, \"čáhcesuolo\": _2, \"vaksdal\": _2, \"valle\": _2, \"vang\": _2, \"vanylven\": _2, \"vardo\": _2, \"xn--vard-jra\": _2, \"vardø\": _2, \"varggat\": _2, \"xn--vrggt-xqad\": _2, \"várggát\": _2, \"vefsn\": _2, \"vaapste\": _2, \"vega\": _2, \"vegarshei\": _2, \"xn--vegrshei-c0a\": _2, \"vegårshei\": _2, \"vennesla\": _2, \"verdal\": _2, \"verran\": _2, \"vestby\": _2, \"vestnes\": _2, \"vestre-slidre\": _2, \"vestre-toten\": _2, \"vestvagoy\": _2, \"xn--vestvgy-ixa6o\": _2, \"vestvågøy\": _2, \"vevelstad\": _2, \"vik\": _2, \"vikna\": _2, \"vindafjord\": _2, \"volda\": _2, \"voss\": _2, \"varoy\": _2, \"xn--vry-yla5g\": _2, \"værøy\": _2, \"vagan\": _2, \"xn--vgan-qoa\": _2, \"vågan\": _2, \"voagat\": _2, \"vagsoy\": _2, \"xn--vgsy-qoa0j\": _2, \"vågsøy\": _2, \"vaga\": _2, \"xn--vg-yiab\": _2, \"vågå\": _2, \"ostfold\": { \"$\": 0, \"succ\": { \"valer\": _2 } }, \"xn--stfold-9xa\": { \"$\": 0, \"succ\": { \"xn--vler-qoa\": _2 } }, \"østfold\": { \"$\": 0, \"succ\": { \"våler\": _2 } }, \"co\": _4, \"blogspot\": _4 } }, \"np\": _8, \"nr\": _22, \"nu\": { \"$\": 1, \"succ\": { \"merseine\": _4, \"mine\": _4, \"shacknet\": _4, \"nom\": _4, \"uwu\": _4, \"enterprisecloud\": _4 } }, \"nz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _5, \"cri\": _2, \"geek\": _2, \"gen\": _2, \"govt\": _2, \"health\": _2, \"iwi\": _2, \"kiwi\": _2, \"maori\": _2, \"mil\": _2, \"xn--mori-qsa\": _2, \"māori\": _2, \"net\": _2, \"org\": _2, \"parliament\": _2, \"school\": _2, \"nym\": _4 } }, \"om\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"med\": _2, \"museum\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"onion\": _2, \"org\": { \"$\": 1, \"succ\": { \"altervista\": _4, \"amune\": { \"$\": 0, \"succ\": { \"tele\": _4 } }, \"pimienta\": _4, \"poivron\": _4, \"potager\": _4, \"sweetpepper\": _4, \"ae\": _4, \"us\": _4, \"certmgr\": _4, \"cdn77\": { \"$\": 0, \"succ\": { \"c\": _4, \"rsc\": _4 } }, \"cdn77-secure\": { \"$\": 0, \"succ\": { \"origin\": { \"$\": 0, \"succ\": { \"ssl\": _4 } } } }, \"cloudns\": _4, \"duckdns\": _4, \"tunk\": _4, \"dyndns\": { \"$\": 2, \"succ\": { \"go\": _4, \"home\": _4 } }, \"blogdns\": _4, \"blogsite\": _4, \"boldlygoingnowhere\": _4, \"dnsalias\": _4, \"dnsdojo\": _4, \"doesntexist\": _4, \"dontexist\": _4, \"doomdns\": _4, \"dvrdns\": _4, \"dynalias\": _4, \"endofinternet\": _4, \"endoftheinternet\": _4, \"from-me\": _4, \"game-host\": _4, \"gotdns\": _4, \"hobby-site\": _4, \"homedns\": _4, \"homeftp\": _4, \"homelinux\": _4, \"homeunix\": _4, \"is-a-bruinsfan\": _4, \"is-a-candidate\": _4, \"is-a-celticsfan\": _4, \"is-a-chef\": _4, \"is-a-geek\": _4, \"is-a-knight\": _4, \"is-a-linux-user\": _4, \"is-a-patsfan\": _4, \"is-a-soxfan\": _4, \"is-found\": _4, \"is-lost\": _4, \"is-saved\": _4, \"is-very-bad\": _4, \"is-very-evil\": _4, \"is-very-good\": _4, \"is-very-nice\": _4, \"is-very-sweet\": _4, \"isa-geek\": _4, \"kicks-ass\": _4, \"misconfused\": _4, \"podzone\": _4, \"readmyblog\": _4, \"selfip\": _4, \"sellsyourhome\": _4, \"servebbs\": _4, \"serveftp\": _4, \"servegame\": _4, \"stuff-4-sale\": _4, \"webhop\": _4, \"ddnss\": _4, \"accesscam\": _4, \"camdvr\": _4, \"freeddns\": _4, \"mywire\": _4, \"webredirect\": _4, \"eu\": { \"$\": 2, \"succ\": { \"al\": _4, \"asso\": _4, \"at\": _4, \"au\": _4, \"be\": _4, \"bg\": _4, \"ca\": _4, \"cd\": _4, \"ch\": _4, \"cn\": _4, \"cy\": _4, \"cz\": _4, \"de\": _4, \"dk\": _4, \"edu\": _4, \"ee\": _4, \"es\": _4, \"fi\": _4, \"fr\": _4, \"gr\": _4, \"hr\": _4, \"hu\": _4, \"ie\": _4, \"il\": _4, \"in\": _4, \"int\": _4, \"is\": _4, \"it\": _4, \"jp\": _4, \"kr\": _4, \"lt\": _4, \"lu\": _4, \"lv\": _4, \"mc\": _4, \"me\": _4, \"mk\": _4, \"mt\": _4, \"my\": _4, \"net\": _4, \"ng\": _4, \"nl\": _4, \"no\": _4, \"nz\": _4, \"paris\": _4, \"pl\": _4, \"pt\": _4, \"q-a\": _4, \"ro\": _4, \"ru\": _4, \"se\": _4, \"si\": _4, \"sk\": _4, \"tr\": _4, \"uk\": _4, \"us\": _4 } }, \"twmail\": _4, \"fedorainfracloud\": _4, \"fedorapeople\": _4, \"fedoraproject\": { \"$\": 0, \"succ\": { \"cloud\": _4, \"os\": _16, \"stg\": { \"$\": 0, \"succ\": { \"os\": _16 } } } }, \"freedesktop\": _4, \"hepforge\": _4, \"in-dsl\": _4, \"in-vpn\": _4, \"js\": _4, \"uklugs\": _4, \"barsy\": _4, \"mayfirst\": _4, \"mozilla-iot\": _4, \"bmoattachments\": _4, \"dynserv\": _4, \"now-dns\": _4, \"cable-modem\": _4, \"collegefan\": _4, \"couchpotatofries\": _4, \"mlbfan\": _4, \"mysecuritycamera\": _4, \"nflfan\": _4, \"read-books\": _4, \"ufcfan\": _4, \"hopto\": _4, \"myftp\": _4, \"no-ip\": _4, \"zapto\": _4, \"pubtls\": _4, \"my-firewall\": _4, \"myfirewall\": _4, \"spdns\": _4, \"dsmynas\": _4, \"familyds\": _4, \"edugit\": _4, \"tuxfamily\": _4, \"diskstation\": _4, \"hk\": _4, \"wmflabs\": _4, \"toolforge\": _4, \"wmcloud\": _4, \"za\": _4 } }, \"pa\": { \"$\": 1, \"succ\": { \"ac\": _2, \"gob\": _2, \"com\": _2, \"org\": _2, \"sld\": _2, \"edu\": _2, \"net\": _2, \"ing\": _2, \"abo\": _2, \"med\": _2, \"nom\": _2 } }, \"pe\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gob\": _2, \"nom\": _2, \"mil\": _2, \"org\": _2, \"com\": _2, \"net\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"pf\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"edu\": _2 } }, \"pg\": _8, \"ph\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"ngo\": _2, \"mil\": _2, \"i\": _2 } }, \"pk\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"edu\": _2, \"org\": _2, \"fam\": _2, \"biz\": _2, \"web\": _2, \"gov\": _2, \"gob\": _2, \"gok\": _2, \"gon\": _2, \"gop\": _2, \"gos\": _2, \"info\": _2 } }, \"pl\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"aid\": _2, \"agro\": _2, \"atm\": _2, \"auto\": _2, \"biz\": _2, \"edu\": _2, \"gmina\": _2, \"gsm\": _2, \"info\": _2, \"mail\": _2, \"miasta\": _2, \"media\": _2, \"mil\": _2, \"nieruchomosci\": _2, \"nom\": _2, \"pc\": _2, \"powiat\": _2, \"priv\": _2, \"realestate\": _2, \"rel\": _2, \"sex\": _2, \"shop\": _2, \"sklep\": _2, \"sos\": _2, \"szkola\": _2, \"targi\": _2, \"tm\": _2, \"tourism\": _2, \"travel\": _2, \"turystyka\": _2, \"gov\": { \"$\": 1, \"succ\": { \"ap\": _2, \"ic\": _2, \"is\": _2, \"us\": _2, \"kmpsp\": _2, \"kppsp\": _2, \"kwpsp\": _2, \"psp\": _2, \"wskr\": _2, \"kwp\": _2, \"mw\": _2, \"ug\": _2, \"um\": _2, \"umig\": _2, \"ugim\": _2, \"upow\": _2, \"uw\": _2, \"starostwo\": _2, \"pa\": _2, \"po\": _2, \"psse\": _2, \"pup\": _2, \"rzgw\": _2, \"sa\": _2, \"so\": _2, \"sr\": _2, \"wsa\": _2, \"sko\": _2, \"uzs\": _2, \"wiih\": _2, \"winb\": _2, \"pinb\": _2, \"wios\": _2, \"witd\": _2, \"wzmiuw\": _2, \"piw\": _2, \"wiw\": _2, \"griw\": _2, \"wif\": _2, \"oum\": _2, \"sdn\": _2, \"zp\": _2, \"uppo\": _2, \"mup\": _2, \"wuoz\": _2, \"konsulat\": _2, \"oirm\": _2 } }, \"augustow\": _2, \"babia-gora\": _2, \"bedzin\": _2, \"beskidy\": _2, \"bialowieza\": _2, \"bialystok\": _2, \"bielawa\": _2, \"bieszczady\": _2, \"boleslawiec\": _2, \"bydgoszcz\": _2, \"bytom\": _2, \"cieszyn\": _2, \"czeladz\": _2, \"czest\": _2, \"dlugoleka\": _2, \"elblag\": _2, \"elk\": _2, \"glogow\": _2, \"gniezno\": _2, \"gorlice\": _2, \"grajewo\": _2, \"ilawa\": _2, \"jaworzno\": _2, \"jelenia-gora\": _2, \"jgora\": _2, \"kalisz\": _2, \"kazimierz-dolny\": _2, \"karpacz\": _2, \"kartuzy\": _2, \"kaszuby\": _2, \"katowice\": _2, \"kepno\": _2, \"ketrzyn\": _2, \"klodzko\": _2, \"kobierzyce\": _2, \"kolobrzeg\": _2, \"konin\": _2, \"konskowola\": _2, \"kutno\": _2, \"lapy\": _2, \"lebork\": _2, \"legnica\": _2, \"lezajsk\": _2, \"limanowa\": _2, \"lomza\": _2, \"lowicz\": _2, \"lubin\": _2, \"lukow\": _2, \"malbork\": _2, \"malopolska\": _2, \"mazowsze\": _2, \"mazury\": _2, \"mielec\": _2, \"mielno\": _2, \"mragowo\": _2, \"naklo\": _2, \"nowaruda\": _2, \"nysa\": _2, \"olawa\": _2, \"olecko\": _2, \"olkusz\": _2, \"olsztyn\": _2, \"opoczno\": _2, \"opole\": _2, \"ostroda\": _2, \"ostroleka\": _2, \"ostrowiec\": _2, \"ostrowwlkp\": _2, \"pila\": _2, \"pisz\": _2, \"podhale\": _2, \"podlasie\": _2, \"polkowice\": _2, \"pomorze\": _2, \"pomorskie\": _2, \"prochowice\": _2, \"pruszkow\": _2, \"przeworsk\": _2, \"pulawy\": _2, \"radom\": _2, \"rawa-maz\": _2, \"rybnik\": _2, \"rzeszow\": _2, \"sanok\": _2, \"sejny\": _2, \"slask\": _2, \"slupsk\": _2, \"sosnowiec\": _2, \"stalowa-wola\": _2, \"skoczow\": _2, \"starachowice\": _2, \"stargard\": _2, \"suwalki\": _2, \"swidnica\": _2, \"swiebodzin\": _2, \"swinoujscie\": _2, \"szczecin\": _2, \"szczytno\": _2, \"tarnobrzeg\": _2, \"tgory\": _2, \"turek\": _2, \"tychy\": _2, \"ustka\": _2, \"walbrzych\": _2, \"warmia\": _2, \"warszawa\": _2, \"waw\": _2, \"wegrow\": _2, \"wielun\": _2, \"wlocl\": _2, \"wloclawek\": _2, \"wodzislaw\": _2, \"wolomin\": _2, \"wroclaw\": _2, \"zachpomor\": _2, \"zagan\": _2, \"zarow\": _2, \"zgora\": _2, \"zgorzelec\": _2, \"beep\": _4, \"krasnik\": _4, \"leczna\": _4, \"lubartow\": _4, \"lublin\": _4, \"poniatowa\": _4, \"swidnik\": _4, \"co\": _4, \"art\": _4, \"gliwice\": _4, \"krakow\": _4, \"poznan\": _4, \"wroc\": _4, \"zakopane\": _4, \"gda\": _4, \"gdansk\": _4, \"gdynia\": _4, \"med\": _4, \"sopot\": _4 } }, \"pm\": { \"$\": 1, \"succ\": { \"own\": _4 } }, \"pn\": { \"$\": 1, \"succ\": { \"gov\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"net\": _2 } }, \"post\": _2, \"pr\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"isla\": _2, \"pro\": _2, \"biz\": _2, \"info\": _2, \"name\": _2, \"est\": _2, \"prof\": _2, \"ac\": _2 } }, \"pro\": { \"$\": 1, \"succ\": { \"aaa\": _2, \"aca\": _2, \"acct\": _2, \"avocat\": _2, \"bar\": _2, \"cpa\": _2, \"eng\": _2, \"jur\": _2, \"law\": _2, \"med\": _2, \"recht\": _2, \"cloudns\": _4, \"dnstrace\": { \"$\": 0, \"succ\": { \"bci\": _4 } }, \"barsy\": _4 } }, \"ps\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"sec\": _2, \"plo\": _2, \"com\": _2, \"org\": _2, \"net\": _2 } }, \"pt\": { \"$\": 1, \"succ\": { \"net\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"int\": _2, \"publ\": _2, \"com\": _2, \"nome\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"pw\": { \"$\": 1, \"succ\": { \"co\": _2, \"ne\": _2, \"or\": _2, \"ed\": _2, \"go\": _2, \"belau\": _2, \"cloudns\": _4, \"x443\": _4, \"nom\": _4 } }, \"py\": { \"$\": 1, \"succ\": { \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"qa\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"re\": { \"$\": 1, \"succ\": { \"asso\": _2, \"com\": _2, \"nom\": _2, \"blogspot\": _4 } }, \"ro\": { \"$\": 1, \"succ\": { \"arts\": _2, \"com\": _2, \"firm\": _2, \"info\": _2, \"nom\": _2, \"nt\": _2, \"org\": _2, \"rec\": _2, \"store\": _2, \"tm\": _2, \"www\": _2, \"shop\": _4, \"blogspot\": _4, \"nym\": _4 } }, \"rs\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"org\": _2, \"blogspot\": _4, \"ua\": _4, \"nom\": _4, \"ox\": _4 } }, \"ru\": { \"$\": 1, \"succ\": { \"ac\": _4, \"edu\": _4, \"gov\": _4, \"int\": _4, \"mil\": _4, \"test\": _4, \"adygeya\": _4, \"bashkiria\": _4, \"bir\": _4, \"cbg\": _4, \"com\": _4, \"dagestan\": _4, \"grozny\": _4, \"kalmykia\": _4, \"kustanai\": _4, \"marine\": _4, \"mordovia\": _4, \"msk\": _4, \"mytis\": _4, \"nalchik\": _4, \"nov\": _4, \"pyatigorsk\": _4, \"spb\": _4, \"vladikavkaz\": _4, \"vladimir\": _4, \"blogspot\": _4, \"regruhosting\": _27, \"myjino\": { \"$\": 2, \"succ\": { \"hosting\": _7, \"landing\": _7, \"spectrum\": _7, \"vps\": _7 } }, \"cldmail\": { \"$\": 0, \"succ\": { \"hb\": _4 } }, \"net\": _4, \"org\": _4, \"pp\": _4, \"ras\": _4 } }, \"rw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"coop\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"sa\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"med\": _2, \"pub\": _2, \"edu\": _2, \"sch\": _2 } }, \"sb\": _9, \"sc\": _9, \"sd\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"med\": _2, \"tv\": _2, \"gov\": _2, \"info\": _2 } }, \"se\": { \"$\": 1, \"succ\": { \"a\": _2, \"ac\": _2, \"b\": _2, \"bd\": _2, \"brand\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"fh\": _2, \"fhsk\": _2, \"fhv\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"k\": _2, \"komforb\": _2, \"kommunalforbund\": _2, \"komvux\": _2, \"l\": _2, \"lanbib\": _2, \"m\": _2, \"n\": _2, \"naturbruksgymn\": _2, \"o\": _2, \"org\": _2, \"p\": _2, \"parti\": _2, \"pp\": _2, \"press\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"tm\": _2, \"u\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"com\": _4, \"blogspot\": _4, \"conf\": _4 } }, \"sg\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"per\": _2, \"blogspot\": _4 } }, \"sh\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"hashbang\": _4, \"platform\": { \"$\": 0, \"succ\": { \"bc\": _4, \"ent\": _4, \"eu\": _4, \"us\": _4 } }, \"now\": _4, \"vxl\": _4, \"wedeploy\": _4 } }, \"si\": { \"$\": 1, \"succ\": { \"gitpage\": _4, \"blogspot\": _4, \"nom\": _4 } }, \"sj\": _2, \"sk\": _23, \"sl\": _9, \"sm\": _2, \"sn\": { \"$\": 1, \"succ\": { \"art\": _2, \"com\": _2, \"edu\": _2, \"gouv\": _2, \"org\": _2, \"perso\": _2, \"univ\": _2, \"blogspot\": _4 } }, \"so\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"me\": _2, \"net\": _2, \"org\": _2, \"sch\": _4 } }, \"sr\": _2, \"ss\": { \"$\": 1, \"succ\": { \"biz\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2 } }, \"st\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"consulado\": _2, \"edu\": _2, \"embaixada\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"principe\": _2, \"saotome\": _2, \"store\": _2, \"nom\": _4, \"noho\": _4 } }, \"su\": { \"$\": 1, \"succ\": { \"abkhazia\": _4, \"adygeya\": _4, \"aktyubinsk\": _4, \"arkhangelsk\": _4, \"armenia\": _4, \"ashgabad\": _4, \"azerbaijan\": _4, \"balashov\": _4, \"bashkiria\": _4, \"bryansk\": _4, \"bukhara\": _4, \"chimkent\": _4, \"dagestan\": _4, \"east-kazakhstan\": _4, \"exnet\": _4, \"georgia\": _4, \"grozny\": _4, \"ivanovo\": _4, \"jambyl\": _4, \"kalmykia\": _4, \"kaluga\": _4, \"karacol\": _4, \"karaganda\": _4, \"karelia\": _4, \"khakassia\": _4, \"krasnodar\": _4, \"kurgan\": _4, \"kustanai\": _4, \"lenug\": _4, \"mangyshlak\": _4, \"mordovia\": _4, \"msk\": _4, \"murmansk\": _4, \"nalchik\": _4, \"navoi\": _4, \"north-kazakhstan\": _4, \"nov\": _4, \"obninsk\": _4, \"penza\": _4, \"pokrovsk\": _4, \"sochi\": _4, \"spb\": _4, \"tashkent\": _4, \"termez\": _4, \"togliatti\": _4, \"troitsk\": _4, \"tselinograd\": _4, \"tula\": _4, \"tuva\": _4, \"vladikavkaz\": _4, \"vladimir\": _4, \"vologda\": _4, \"nym\": _4 } }, \"sv\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"org\": _2, \"red\": _2 } }, \"sx\": { \"$\": 1, \"succ\": { \"gov\": _2, \"nym\": _4 } }, \"sy\": _3, \"sz\": { \"$\": 1, \"succ\": { \"co\": _2, \"ac\": _2, \"org\": _2 } }, \"tc\": { \"$\": 1, \"succ\": { \"ch\": _4, \"me\": _4, \"we\": _4 } }, \"td\": _5, \"tel\": _2, \"tf\": _2, \"tg\": _2, \"th\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"go\": _2, \"in\": _2, \"mi\": _2, \"net\": _2, \"or\": _2, \"online\": _4, \"shop\": _4 } }, \"tj\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"go\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"nic\": _2, \"org\": _2, \"test\": _2, \"web\": _2, \"nom\": _4 } }, \"tk\": _2, \"tl\": _6, \"tm\": { \"$\": 1, \"succ\": { \"com\": _2, \"co\": _2, \"org\": _2, \"net\": _2, \"nom\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2 } }, \"tn\": { \"$\": 1, \"succ\": { \"com\": _2, \"ens\": _2, \"fin\": _2, \"gov\": _2, \"ind\": _2, \"intl\": _2, \"nat\": _2, \"net\": _2, \"org\": _2, \"info\": _2, \"perso\": _2, \"tourism\": _2, \"edunet\": _2, \"rnrt\": _2, \"rns\": _2, \"rnu\": _2, \"mincom\": _2, \"agrinet\": _2, \"defense\": _2, \"turen\": _2 } }, \"to\": { \"$\": 1, \"succ\": { \"611\": _4, \"com\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"mil\": _2, \"oya\": _4, \"vpnplus\": _4, \"quickconnect\": { \"$\": 0, \"succ\": { \"direct\": _4 } }, \"nyan\": _4 } }, \"tr\": { \"$\": 1, \"succ\": { \"av\": _2, \"bbs\": _2, \"bel\": _2, \"biz\": _2, \"com\": _5, \"dr\": _2, \"edu\": _2, \"gen\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"k12\": _2, \"kep\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pol\": _2, \"tel\": _2, \"tsk\": _2, \"tv\": _2, \"web\": _2, \"nc\": _6 } }, \"tt\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"biz\": _2, \"info\": _2, \"pro\": _2, \"int\": _2, \"coop\": _2, \"jobs\": _2, \"mobi\": _2, \"travel\": _2, \"museum\": _2, \"aero\": _2, \"name\": _2, \"gov\": _2, \"edu\": _2 } }, \"tv\": { \"$\": 1, \"succ\": { \"dyndns\": _4, \"better-than\": _4, \"on-the-web\": _4, \"worse-than\": _4 } }, \"tw\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"mil\": _2, \"com\": { \"$\": 1, \"succ\": { \"mymailer\": _4 } }, \"net\": _2, \"org\": _2, \"idv\": _2, \"game\": _2, \"ebiz\": _2, \"club\": _2, \"xn--zf0ao64a\": _2, \"網路\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--czrw28b\": _2, \"商業\": _2, \"url\": _4, \"blogspot\": _4, \"nym\": _4 } }, \"tz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"go\": _2, \"hotel\": _2, \"info\": _2, \"me\": _2, \"mil\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2, \"tv\": _2 } }, \"ua\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"net\": _2, \"org\": _2, \"cherkassy\": _2, \"cherkasy\": _2, \"chernigov\": _2, \"chernihiv\": _2, \"chernivtsi\": _2, \"chernovtsy\": _2, \"ck\": _2, \"cn\": _2, \"cr\": _2, \"crimea\": _2, \"cv\": _2, \"dn\": _2, \"dnepropetrovsk\": _2, \"dnipropetrovsk\": _2, \"donetsk\": _2, \"dp\": _2, \"if\": _2, \"ivano-frankivsk\": _2, \"kh\": _2, \"kharkiv\": _2, \"kharkov\": _2, \"kherson\": _2, \"khmelnitskiy\": _2, \"khmelnytskyi\": _2, \"kiev\": _2, \"kirovograd\": _2, \"km\": _2, \"kr\": _2, \"krym\": _2, \"ks\": _2, \"kv\": _2, \"kyiv\": _2, \"lg\": _2, \"lt\": _2, \"lugansk\": _2, \"lutsk\": _2, \"lv\": _2, \"lviv\": _2, \"mk\": _2, \"mykolaiv\": _2, \"nikolaev\": _2, \"od\": _2, \"odesa\": _2, \"odessa\": _2, \"pl\": _2, \"poltava\": _2, \"rivne\": _2, \"rovno\": _2, \"rv\": _2, \"sb\": _2, \"sebastopol\": _2, \"sevastopol\": _2, \"sm\": _2, \"sumy\": _2, \"te\": _2, \"ternopil\": _2, \"uz\": _2, \"uzhgorod\": _2, \"vinnica\": _2, \"vinnytsia\": _2, \"vn\": _2, \"volyn\": _2, \"yalta\": _2, \"zaporizhzhe\": _2, \"zaporizhzhia\": _2, \"zhitomir\": _2, \"zhytomyr\": _2, \"zp\": _2, \"zt\": _2, \"cc\": _4, \"inf\": _4, \"ltd\": _4, \"biz\": _4, \"co\": _4, \"pp\": _4, \"v\": _4 } }, \"ug\": { \"$\": 1, \"succ\": { \"co\": _2, \"or\": _2, \"ac\": _2, \"sc\": _2, \"go\": _2, \"ne\": _2, \"com\": _2, \"org\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"uk\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": { \"$\": 1, \"succ\": { \"bytemark\": { \"$\": 0, \"succ\": { \"dh\": _4, \"vm\": _4 } }, \"blogspot\": _4, \"layershift\": _17, \"barsy\": _4, \"barsyonline\": _4, \"nh-serv\": _4, \"no-ip\": _4, \"wellbeingzone\": _4, \"gwiddle\": _4 } }, \"gov\": { \"$\": 1, \"succ\": { \"service\": _4, \"homeoffice\": _4 } }, \"ltd\": _2, \"me\": _2, \"net\": _2, \"nhs\": _2, \"org\": { \"$\": 1, \"succ\": { \"glug\": _4, \"lug\": _4, \"lugs\": _4 } }, \"plc\": _2, \"police\": _2, \"sch\": _8, \"conn\": _4, \"copro\": _4, \"barsy\": _4 } }, \"us\": { \"$\": 1, \"succ\": { \"dni\": _2, \"fed\": _2, \"isa\": _2, \"kids\": _2, \"nsn\": _2, \"ak\": _30, \"al\": _30, \"ar\": _30, \"as\": _30, \"az\": _30, \"ca\": _30, \"co\": _30, \"ct\": _30, \"dc\": _30, \"de\": { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _4 } }, \"fl\": _30, \"ga\": _30, \"gu\": _30, \"hi\": _31, \"ia\": _30, \"id\": _30, \"il\": _30, \"in\": _30, \"ks\": _30, \"ky\": _30, \"la\": _30, \"ma\": { \"$\": 1, \"succ\": { \"k12\": { \"$\": 1, \"succ\": { \"pvt\": _2, \"chtr\": _2, \"paroch\": _2 } }, \"cc\": _2, \"lib\": _2 } }, \"md\": _30, \"me\": _30, \"mi\": { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _2, \"ann-arbor\": _2, \"cog\": _2, \"dst\": _2, \"eaton\": _2, \"gen\": _2, \"mus\": _2, \"tec\": _2, \"washtenaw\": _2 } }, \"mn\": _30, \"mo\": _30, \"ms\": _30, \"mt\": _30, \"nc\": _30, \"nd\": _31, \"ne\": _30, \"nh\": _30, \"nj\": _30, \"nm\": _30, \"nv\": _30, \"ny\": _30, \"oh\": _30, \"ok\": _30, \"or\": _30, \"pa\": _30, \"pr\": _30, \"ri\": _31, \"sc\": _30, \"sd\": _31, \"tn\": _30, \"tx\": _30, \"ut\": _30, \"vi\": _30, \"vt\": _30, \"va\": _30, \"wa\": _30, \"wi\": _30, \"wv\": { \"$\": 1, \"succ\": { \"cc\": _2 } }, \"wy\": _30, \"cloudns\": _4, \"drud\": _4, \"is-by\": _4, \"land-4-sale\": _4, \"stuff-4-sale\": _4, \"graphox\": _4, \"freeddns\": _4, \"golffan\": _4, \"noip\": _4, \"pointto\": _4, \"platterp\": _4 } }, \"uy\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"gub\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"nom\": _4 } }, \"uz\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"net\": _2, \"org\": _2 } }, \"va\": _2, \"vc\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2, \"gv\": { \"$\": 2, \"succ\": { \"d\": _4 } }, \"0e\": _4, \"nom\": _4 } }, \"ve\": { \"$\": 1, \"succ\": { \"arts\": _2, \"co\": _2, \"com\": _2, \"e12\": _2, \"edu\": _2, \"firm\": _2, \"gob\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"rec\": _2, \"store\": _2, \"tec\": _2, \"web\": _2 } }, \"vg\": { \"$\": 1, \"succ\": { \"nom\": _4, \"at\": _4 } }, \"vi\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"k12\": _2, \"net\": _2, \"org\": _2 } }, \"vn\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"int\": _2, \"ac\": _2, \"biz\": _2, \"info\": _2, \"name\": _2, \"pro\": _2, \"health\": _2, \"blogspot\": _4 } }, \"vu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"blog\": _4, \"dev\": _4, \"me\": _4, \"cn\": _4 } }, \"wf\": _2, \"ws\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"advisor\": _7, \"cloud66\": _4, \"dyndns\": _4, \"mypets\": _4 } }, \"yt\": _2, \"xn--mgbaam7a8h\": _2, \"امارات\": _2, \"xn--y9a3aq\": _2, \"հայ\": _2, \"xn--54b7fta0cc\": _2, \"বাংলা\": _2, \"xn--90ae\": _2, \"бг\": _2, \"xn--90ais\": _2, \"бел\": _2, \"xn--fiqs8s\": _2, \"中国\": _2, \"xn--fiqz9s\": _2, \"中國\": _2, \"xn--lgbbat1ad8j\": _2, \"الجزائر\": _2, \"xn--wgbh1c\": _2, \"مصر\": _2, \"xn--e1a4c\": _2, \"ею\": _2, \"xn--qxa6a\": _2, \"ευ\": _2, \"xn--mgbah1a3hjkrd\": _2, \"موريتانيا\": _2, \"xn--node\": _2, \"გე\": _2, \"xn--qxam\": _2, \"ελ\": _2, \"xn--j6w193g\": { \"$\": 1, \"succ\": { \"xn--55qx5d\": _2, \"xn--wcvs22d\": _2, \"xn--mxtq1m\": _2, \"xn--gmqw5a\": _2, \"xn--od0alg\": _2, \"xn--uc0atv\": _2 } }, \"香港\": { \"$\": 1, \"succ\": { \"公司\": _2, \"教育\": _2, \"政府\": _2, \"個人\": _2, \"網絡\": _2, \"組織\": _2 } }, \"xn--2scrj9c\": _2, \"ಭಾರತ\": _2, \"xn--3hcrj9c\": _2, \"ଭାରତ\": _2, \"xn--45br5cyl\": _2, \"ভাৰত\": _2, \"xn--h2breg3eve\": _2, \"भारतम्\": _2, \"xn--h2brj9c8c\": _2, \"भारोत\": _2, \"xn--mgbgu82a\": _2, \"ڀارت\": _2, \"xn--rvc1e0am3e\": _2, \"ഭാരതം\": _2, \"xn--h2brj9c\": _2, \"भारत\": _2, \"xn--mgbbh1a\": _2, \"بارت\": _2, \"xn--mgbbh1a71e\": _2, \"بھارت\": _2, \"xn--fpcrj9c3d\": _2, \"భారత్\": _2, \"xn--gecrj9c\": _2, \"ભારત\": _2, \"xn--s9brj9c\": _2, \"ਭਾਰਤ\": _2, \"xn--45brj9c\": _2, \"ভারত\": _2, \"xn--xkc2dl3a5ee0h\": _2, \"இந்தியா\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2, \"xn--mgbtx2b\": _2, \"عراق\": _2, \"xn--mgbayh7gpa\": _2, \"الاردن\": _2, \"xn--3e0b707e\": _2, \"한국\": _2, \"xn--80ao21a\": _2, \"қаз\": _2, \"xn--fzc2c9e2c\": _2, \"ලංකා\": _2, \"xn--xkc2al3hye2a\": _2, \"இலங்கை\": _2, \"xn--mgbc0a9azcg\": _2, \"المغرب\": _2, \"xn--d1alf\": _2, \"мкд\": _2, \"xn--l1acc\": _2, \"мон\": _2, \"xn--mix891f\": _2, \"澳門\": _2, \"xn--mix082f\": _2, \"澳门\": _2, \"xn--mgbx4cd0ab\": _2, \"مليسيا\": _2, \"xn--mgb9awbf\": _2, \"عمان\": _2, \"xn--mgbai9azgqp6j\": _2, \"پاکستان\": _2, \"xn--mgbai9a5eva00b\": _2, \"پاكستان\": _2, \"xn--ygbi2ammx\": _2, \"فلسطين\": _2, \"xn--90a3ac\": { \"$\": 1, \"succ\": { \"xn--o1ac\": _2, \"xn--c1avg\": _2, \"xn--90azh\": _2, \"xn--d1at\": _2, \"xn--o1ach\": _2, \"xn--80au\": _2 } }, \"срб\": { \"$\": 1, \"succ\": { \"пр\": _2, \"орг\": _2, \"обр\": _2, \"од\": _2, \"упр\": _2, \"ак\": _2 } }, \"xn--p1ai\": _2, \"рф\": _2, \"xn--wgbl6a\": _2, \"قطر\": _2, \"xn--mgberp4a5d4ar\": _2, \"السعودية\": _2, \"xn--mgberp4a5d4a87g\": _2, \"السعودیة\": _2, \"xn--mgbqly7c0a67fbc\": _2, \"السعودیۃ\": _2, \"xn--mgbqly7cvafr\": _2, \"السعوديه\": _2, \"xn--mgbpl2fh\": _2, \"سودان\": _2, \"xn--yfro4i67o\": _2, \"新加坡\": _2, \"xn--clchc0ea0b2g2a9gcd\": _2, \"சிங்கப்பூர்\": _2, \"xn--ogbpf8fl\": _2, \"سورية\": _2, \"xn--mgbtf8fl\": _2, \"سوريا\": _2, \"xn--o3cw4h\": { \"$\": 1, \"succ\": { \"xn--12c1fe0br\": _2, \"xn--12co0c3b4eva\": _2, \"xn--h3cuzk1di\": _2, \"xn--o3cyx2a\": _2, \"xn--m3ch0j3a\": _2, \"xn--12cfi8ixb8l\": _2 } }, \"ไทย\": { \"$\": 1, \"succ\": { \"ศึกษา\": _2, \"ธุรกิจ\": _2, \"รัฐบาล\": _2, \"ทหาร\": _2, \"เน็ต\": _2, \"องค์กร\": _2 } }, \"xn--pgbs0dh\": _2, \"تونس\": _2, \"xn--kpry57d\": _2, \"台灣\": _2, \"xn--kprw13d\": _2, \"台湾\": _2, \"xn--nnx388a\": _2, \"臺灣\": _2, \"xn--j1amh\": _2, \"укр\": _2, \"xn--mgb2ddes\": _2, \"اليمن\": _2, \"xxx\": _2, \"ye\": _8, \"za\": { \"$\": 0, \"succ\": { \"ac\": _2, \"agric\": _2, \"alt\": _2, \"co\": _5, \"edu\": _2, \"gov\": _2, \"grondar\": _2, \"law\": _2, \"mil\": _2, \"net\": _2, \"ngo\": _2, \"nic\": _2, \"nis\": _2, \"nom\": _2, \"org\": _2, \"school\": _2, \"tm\": _2, \"web\": _2 } }, \"zm\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sch\": _2 } }, \"zw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"gov\": _2, \"mil\": _2, \"org\": _2 } }, \"aaa\": _2, \"aarp\": _2, \"abarth\": _2, \"abb\": _2, \"abbott\": _2, \"abbvie\": _2, \"abc\": _2, \"able\": _2, \"abogado\": _2, \"abudhabi\": _2, \"academy\": { \"$\": 1, \"succ\": { \"official\": _4 } }, \"accenture\": _2, \"accountant\": _2, \"accountants\": _2, \"aco\": _2, \"actor\": _2, \"adac\": _2, \"ads\": _2, \"adult\": _2, \"aeg\": _2, \"aetna\": _2, \"afamilycompany\": _2, \"afl\": _2, \"africa\": _2, \"agakhan\": _2, \"agency\": _2, \"aig\": _2, \"airbus\": _2, \"airforce\": _2, \"airtel\": _2, \"akdn\": _2, \"alfaromeo\": _2, \"alibaba\": _2, \"alipay\": _2, \"allfinanz\": _2, \"allstate\": _2, \"ally\": _2, \"alsace\": _2, \"alstom\": _2, \"amazon\": _2, \"americanexpress\": _2, \"americanfamily\": _2, \"amex\": _2, \"amfam\": _2, \"amica\": _2, \"amsterdam\": _2, \"analytics\": _2, \"android\": _2, \"anquan\": _2, \"anz\": _2, \"aol\": _2, \"apartments\": _2, \"app\": { \"$\": 1, \"succ\": { \"wnext\": _4, \"run\": { \"$\": 2, \"succ\": { \"a\": _4 } }, \"web\": _4, \"hasura\": _4, \"loginline\": _4, \"netlify\": _4, \"telebit\": _4, \"vercel\": _4 } }, \"apple\": _2, \"aquarelle\": _2, \"arab\": _2, \"aramco\": _2, \"archi\": _2, \"army\": _2, \"art\": _2, \"arte\": _2, \"asda\": _2, \"associates\": _2, \"athleta\": _2, \"attorney\": _2, \"auction\": _2, \"audi\": _2, \"audible\": _2, \"audio\": _2, \"auspost\": _2, \"author\": _2, \"auto\": _2, \"autos\": _2, \"avianca\": _2, \"aws\": _2, \"axa\": _2, \"azure\": _2, \"baby\": _2, \"baidu\": _2, \"banamex\": _2, \"bananarepublic\": _2, \"band\": _2, \"bank\": _2, \"bar\": _2, \"barcelona\": _2, \"barclaycard\": _2, \"barclays\": _2, \"barefoot\": _2, \"bargains\": _2, \"baseball\": _2, \"basketball\": _2, \"bauhaus\": _2, \"bayern\": _2, \"bbc\": _2, \"bbt\": _2, \"bbva\": _2, \"bcg\": _2, \"bcn\": _2, \"beats\": _2, \"beauty\": _2, \"beer\": _2, \"bentley\": _2, \"berlin\": _2, \"best\": _2, \"bestbuy\": _2, \"bet\": _2, \"bharti\": _2, \"bible\": _2, \"bid\": _2, \"bike\": _2, \"bing\": _2, \"bingo\": _2, \"bio\": _2, \"black\": _2, \"blackfriday\": _2, \"blockbuster\": _2, \"blog\": _2, \"bloomberg\": _2, \"blue\": _2, \"bms\": _2, \"bmw\": _2, \"bnpparibas\": _2, \"boats\": _2, \"boehringer\": _2, \"bofa\": _2, \"bom\": _2, \"bond\": _2, \"boo\": _2, \"book\": _2, \"booking\": _2, \"bosch\": _2, \"bostik\": _2, \"boston\": _2, \"bot\": _2, \"boutique\": _2, \"box\": _2, \"bradesco\": _2, \"bridgestone\": _2, \"broadway\": _2, \"broker\": _2, \"brother\": _2, \"brussels\": _2, \"budapest\": _2, \"bugatti\": _2, \"build\": _2, \"builders\": _2, \"business\": _10, \"buy\": _2, \"buzz\": _2, \"bzh\": _2, \"cab\": _2, \"cafe\": _2, \"cal\": _2, \"call\": _2, \"calvinklein\": _2, \"cam\": _2, \"camera\": _2, \"camp\": _2, \"cancerresearch\": _2, \"canon\": _2, \"capetown\": _2, \"capital\": _2, \"capitalone\": _2, \"car\": _2, \"caravan\": _2, \"cards\": _2, \"care\": _2, \"career\": _2, \"careers\": _2, \"cars\": _2, \"casa\": { \"$\": 1, \"succ\": { \"nabu\": { \"$\": 0, \"succ\": { \"ui\": _4 } } } }, \"case\": _2, \"caseih\": _2, \"cash\": _2, \"casino\": _2, \"catering\": _2, \"catholic\": _2, \"cba\": _2, \"cbn\": _2, \"cbre\": _2, \"cbs\": _2, \"ceb\": _2, \"center\": _2, \"ceo\": _2, \"cern\": _2, \"cfa\": _2, \"cfd\": _2, \"chanel\": _2, \"channel\": _2, \"charity\": _2, \"chase\": _2, \"chat\": _2, \"cheap\": _2, \"chintai\": _2, \"christmas\": _2, \"chrome\": _2, \"church\": _2, \"cipriani\": _2, \"circle\": _2, \"cisco\": _2, \"citadel\": _2, \"citi\": _2, \"citic\": _2, \"city\": _11, \"cityeats\": _2, \"claims\": _2, \"cleaning\": _2, \"click\": _2, \"clinic\": _2, \"clinique\": _2, \"clothing\": _2, \"cloud\": { \"$\": 1, \"succ\": { \"banzai\": _7, \"statics\": _7, \"jele\": _4, \"linkyard\": _4, \"magentosite\": _7, \"perspecta\": _4, \"vapor\": _4, \"on-rancher\": _7, \"sensiosite\": _7, \"trafficplex\": _4, \"urown\": _4, \"voorloper\": _4 } }, \"club\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"jele\": _4, \"barsy\": _4, \"pony\": _4 } }, \"clubmed\": _2, \"coach\": _2, \"codes\": { \"$\": 1, \"succ\": { \"owo\": _7 } }, \"coffee\": _2, \"college\": _2, \"cologne\": _2, \"comcast\": _2, \"commbank\": _2, \"community\": { \"$\": 1, \"succ\": { \"ravendb\": _4, \"myforum\": _4 } }, \"company\": _2, \"compare\": _2, \"computer\": _2, \"comsec\": _2, \"condos\": _2, \"construction\": _2, \"consulting\": _2, \"contact\": _2, \"contractors\": _2, \"cooking\": _2, \"cookingchannel\": _2, \"cool\": { \"$\": 1, \"succ\": { \"de\": _4 } }, \"corsica\": _2, \"country\": _2, \"coupon\": _2, \"coupons\": _2, \"courses\": _2, \"cpa\": _2, \"credit\": _2, \"creditcard\": _2, \"creditunion\": _2, \"cricket\": _2, \"crown\": _2, \"crs\": _2, \"cruise\": _2, \"cruises\": _2, \"csc\": _2, \"cuisinella\": _2, \"cymru\": _2, \"cyou\": _2, \"dabur\": _2, \"dad\": _2, \"dance\": _2, \"data\": _2, \"date\": _2, \"dating\": _2, \"datsun\": _2, \"day\": _2, \"dclk\": _2, \"dds\": _2, \"deal\": _2, \"dealer\": _2, \"deals\": _2, \"degree\": _2, \"delivery\": _2, \"dell\": _2, \"deloitte\": _2, \"delta\": _2, \"democrat\": _2, \"dental\": _2, \"dentist\": _2, \"desi\": _2, \"design\": { \"$\": 1, \"succ\": { \"bss\": _4 } }, \"dev\": { \"$\": 1, \"succ\": { \"lcl\": _7, \"stg\": _7, \"workers\": _4, \"curv\": _4, \"fly\": _4, \"iserv\": _4, \"loginline\": _4, \"platter-app\": _4, \"vercel\": _4, \"webhare\": _7 } }, \"dhl\": _2, \"diamonds\": _2, \"diet\": _2, \"digital\": { \"$\": 1, \"succ\": { \"cloudapps\": { \"$\": 2, \"succ\": { \"london\": _4 } } } }, \"direct\": _2, \"directory\": _2, \"discount\": _2, \"discover\": _2, \"dish\": _2, \"diy\": _2, \"dnp\": _2, \"docs\": _2, \"doctor\": _2, \"dog\": _2, \"domains\": _2, \"dot\": _2, \"download\": _2, \"drive\": _2, \"dtv\": _2, \"dubai\": _2, \"duck\": _2, \"dunlop\": _2, \"dupont\": _2, \"durban\": _2, \"dvag\": _2, \"dvr\": _2, \"earth\": { \"$\": 1, \"succ\": { \"dapps\": { \"$\": 0, \"succ\": { \"*\": _4, \"bzz\": _7 } } } }, \"eat\": _2, \"eco\": _2, \"edeka\": _2, \"education\": _10, \"email\": _2, \"emerck\": _2, \"energy\": _2, \"engineer\": _2, \"engineering\": _2, \"enterprises\": _2, \"epson\": _2, \"equipment\": _2, \"ericsson\": _2, \"erni\": _2, \"esq\": _2, \"estate\": { \"$\": 1, \"succ\": { \"compute\": _7 } }, \"etisalat\": _2, \"eurovision\": _2, \"eus\": { \"$\": 1, \"succ\": { \"party\": _18 } }, \"events\": _10, \"exchange\": _2, \"expert\": _2, \"exposed\": _2, \"express\": _2, \"extraspace\": _2, \"fage\": _2, \"fail\": _2, \"fairwinds\": _2, \"faith\": _19, \"family\": _2, \"fan\": _2, \"fans\": _2, \"farm\": { \"$\": 1, \"succ\": { \"storj\": _4 } }, \"farmers\": _2, \"fashion\": { \"$\": 1, \"succ\": { \"of\": _4, \"on\": _4 } }, \"fast\": _2, \"fedex\": _2, \"feedback\": _2, \"ferrari\": _2, \"ferrero\": _2, \"fiat\": _2, \"fidelity\": _2, \"fido\": _2, \"film\": _2, \"final\": _2, \"finance\": _2, \"financial\": _10, \"fire\": _2, \"firestone\": _2, \"firmdale\": _2, \"fish\": _2, \"fishing\": _2, \"fit\": { \"$\": 1, \"succ\": { \"ptplus\": _4 } }, \"fitness\": _2, \"flickr\": _2, \"flights\": _2, \"flir\": _2, \"florist\": _2, \"flowers\": _2, \"fly\": _2, \"foo\": _2, \"food\": _2, \"foodnetwork\": _2, \"football\": { \"$\": 1, \"succ\": { \"of\": _4 } }, \"ford\": _2, \"forex\": _2, \"forsale\": _2, \"forum\": _2, \"foundation\": _2, \"fox\": _2, \"free\": _2, \"fresenius\": _2, \"frl\": _2, \"frogans\": _2, \"frontdoor\": _2, \"frontier\": _2, \"ftr\": _2, \"fujitsu\": _2, \"fujixerox\": _2, \"fun\": _2, \"fund\": _2, \"furniture\": _2, \"futbol\": _2, \"fyi\": _2, \"gal\": _2, \"gallery\": _2, \"gallo\": _2, \"gallup\": _2, \"game\": _2, \"games\": _2, \"gap\": _2, \"garden\": _2, \"gay\": _2, \"gbiz\": _2, \"gdn\": { \"$\": 1, \"succ\": { \"cnpy\": _4 } }, \"gea\": _2, \"gent\": _2, \"genting\": _2, \"george\": _2, \"ggee\": _2, \"gift\": _2, \"gifts\": _2, \"gives\": _2, \"giving\": _2, \"glade\": _2, \"glass\": _2, \"gle\": _2, \"global\": _2, \"globo\": _2, \"gmail\": _2, \"gmbh\": _2, \"gmo\": _2, \"gmx\": _2, \"godaddy\": _2, \"gold\": _2, \"goldpoint\": _2, \"golf\": _2, \"goo\": _2, \"goodyear\": _2, \"goog\": { \"$\": 1, \"succ\": { \"cloud\": _4 } }, \"google\": _2, \"gop\": _2, \"got\": _2, \"grainger\": _2, \"graphics\": _2, \"gratis\": _2, \"green\": _2, \"gripe\": _2, \"grocery\": _2, \"group\": { \"$\": 1, \"succ\": { \"discourse\": _4 } }, \"guardian\": _2, \"gucci\": _2, \"guge\": _2, \"guide\": _2, \"guitars\": _2, \"guru\": _2, \"hair\": _2, \"hamburg\": _2, \"hangout\": _2, \"haus\": _2, \"hbo\": _2, \"hdfc\": _2, \"hdfcbank\": _2, \"health\": _2, \"healthcare\": _2, \"help\": _2, \"helsinki\": _2, \"here\": _2, \"hermes\": _2, \"hgtv\": _2, \"hiphop\": _2, \"hisamitsu\": _2, \"hitachi\": _2, \"hiv\": _2, \"hkt\": _2, \"hockey\": _2, \"holdings\": _2, \"holiday\": _2, \"homedepot\": _2, \"homegoods\": _2, \"homes\": _2, \"homesense\": _2, \"honda\": _2, \"horse\": _2, \"hospital\": _2, \"host\": { \"$\": 1, \"succ\": { \"cloudaccess\": _4, \"freesite\": _4, \"fastvps\": _4, \"myfast\": _4, \"jele\": _4, \"mircloud\": _4, \"pcloud\": _4, \"half\": _4 } }, \"hosting\": { \"$\": 1, \"succ\": { \"opencraft\": _4 } }, \"hot\": _2, \"hoteles\": _2, \"hotels\": _2, \"hotmail\": _2, \"house\": _2, \"how\": _2, \"hsbc\": _2, \"hughes\": _2, \"hyatt\": _2, \"hyundai\": _2, \"ibm\": _2, \"icbc\": _2, \"ice\": _2, \"icu\": _2, \"ieee\": _2, \"ifm\": _2, \"ikano\": _2, \"imamat\": _2, \"imdb\": _2, \"immo\": _2, \"immobilien\": _2, \"inc\": _2, \"industries\": _2, \"infiniti\": _2, \"ing\": _2, \"ink\": _11, \"institute\": _2, \"insurance\": _2, \"insure\": _2, \"intel\": _2, \"international\": _2, \"intuit\": _2, \"investments\": _2, \"ipiranga\": _2, \"irish\": _2, \"ismaili\": _2, \"ist\": _2, \"istanbul\": _2, \"itau\": _2, \"itv\": _2, \"iveco\": _2, \"jaguar\": _2, \"java\": _2, \"jcb\": _2, \"jcp\": _2, \"jeep\": _2, \"jetzt\": _2, \"jewelry\": _2, \"jio\": _2, \"jll\": _2, \"jmp\": _2, \"jnj\": _2, \"joburg\": _2, \"jot\": _2, \"joy\": _2, \"jpmorgan\": _2, \"jprs\": _2, \"juegos\": _2, \"juniper\": _2, \"kaufen\": _2, \"kddi\": _2, \"kerryhotels\": _2, \"kerrylogistics\": _2, \"kerryproperties\": _2, \"kfh\": _2, \"kia\": _2, \"kim\": _2, \"kinder\": _2, \"kindle\": _2, \"kitchen\": _2, \"kiwi\": _2, \"koeln\": _2, \"komatsu\": _2, \"kosher\": _2, \"kpmg\": _2, \"kpn\": _2, \"krd\": { \"$\": 1, \"succ\": { \"co\": _4, \"edu\": _4 } }, \"kred\": _2, \"kuokgroup\": _2, \"kyoto\": _2, \"lacaixa\": _2, \"lamborghini\": _2, \"lamer\": _2, \"lancaster\": _2, \"lancia\": _2, \"land\": { \"$\": 1, \"succ\": { \"static\": { \"$\": 2, \"succ\": { \"dev\": _4, \"sites\": _4 } } } }, \"landrover\": _2, \"lanxess\": _2, \"lasalle\": _2, \"lat\": _2, \"latino\": _2, \"latrobe\": _2, \"law\": _2, \"lawyer\": _2, \"lds\": _2, \"lease\": _2, \"leclerc\": _2, \"lefrak\": _2, \"legal\": _2, \"lego\": _2, \"lexus\": _2, \"lgbt\": _2, \"lidl\": _2, \"life\": _2, \"lifeinsurance\": _2, \"lifestyle\": _2, \"lighting\": _2, \"like\": _2, \"lilly\": _2, \"limited\": _2, \"limo\": _2, \"lincoln\": _2, \"linde\": _2, \"link\": { \"$\": 1, \"succ\": { \"cyon\": _4, \"mypep\": _4, \"dweb\": _7 } }, \"lipsy\": _2, \"live\": _2, \"living\": _2, \"lixil\": _2, \"llc\": _2, \"llp\": _2, \"loan\": _2, \"loans\": _2, \"locker\": _2, \"locus\": _2, \"loft\": _2, \"lol\": _2, \"london\": { \"$\": 1, \"succ\": { \"in\": _4, \"of\": _4 } }, \"lotte\": _2, \"lotto\": _2, \"love\": _2, \"lpl\": _2, \"lplfinancial\": _2, \"ltd\": _2, \"ltda\": _2, \"lundbeck\": _2, \"lupin\": _2, \"luxe\": _2, \"luxury\": _2, \"macys\": _2, \"madrid\": _2, \"maif\": _2, \"maison\": _2, \"makeup\": _2, \"man\": _2, \"management\": { \"$\": 1, \"succ\": { \"router\": _4 } }, \"mango\": _2, \"map\": _2, \"market\": _2, \"marketing\": _2, \"markets\": _2, \"marriott\": _2, \"marshalls\": _2, \"maserati\": _2, \"mattel\": _2, \"mba\": _2, \"mckinsey\": _2, \"med\": _2, \"media\": _2, \"meet\": _2, \"melbourne\": _2, \"meme\": _2, \"memorial\": _2, \"men\": _24, \"menu\": _25, \"merckmsd\": _2, \"metlife\": _2, \"miami\": _2, \"microsoft\": _2, \"mini\": _2, \"mint\": _2, \"mit\": _2, \"mitsubishi\": _2, \"mlb\": _2, \"mls\": _2, \"mma\": _2, \"mobile\": _2, \"moda\": _2, \"moe\": _2, \"moi\": _2, \"mom\": { \"$\": 1, \"succ\": { \"and\": _4, \"for\": _4 } }, \"monash\": _2, \"money\": _2, \"monster\": _2, \"mormon\": _2, \"mortgage\": _2, \"moscow\": _2, \"moto\": _2, \"motorcycles\": _2, \"mov\": _2, \"movie\": _2, \"msd\": _2, \"mtn\": _2, \"mtr\": _2, \"mutual\": _2, \"nab\": _2, \"nagoya\": _2, \"nationwide\": _2, \"natura\": _2, \"navy\": _2, \"nba\": _2, \"nec\": _2, \"netbank\": _2, \"netflix\": _2, \"network\": { \"$\": 1, \"succ\": { \"alces\": _7, \"co\": _4, \"arvo\": _4, \"azimuth\": _4 } }, \"neustar\": _2, \"new\": _2, \"newholland\": _2, \"news\": _2, \"next\": _2, \"nextdirect\": _2, \"nexus\": _2, \"nfl\": _2, \"ngo\": _2, \"nhk\": _2, \"nico\": _2, \"nike\": _2, \"nikon\": _2, \"ninja\": _2, \"nissan\": _2, \"nissay\": _2, \"nokia\": _2, \"northwesternmutual\": _2, \"norton\": _2, \"now\": _2, \"nowruz\": _2, \"nowtv\": _2, \"nra\": _2, \"nrw\": _2, \"ntt\": _2, \"nyc\": _2, \"obi\": _2, \"observer\": _2, \"off\": _2, \"office\": _2, \"okinawa\": _2, \"olayan\": _2, \"olayangroup\": _2, \"oldnavy\": _2, \"ollo\": _2, \"omega\": _2, \"one\": { \"$\": 1, \"succ\": { \"onred\": { \"$\": 2, \"succ\": { \"staging\": _4 } }, \"for\": _4, \"homelink\": _4 } }, \"ong\": _2, \"onl\": _2, \"online\": _25, \"onyourside\": _2, \"ooo\": _2, \"open\": _2, \"oracle\": _2, \"orange\": _2, \"organic\": _2, \"origins\": _2, \"osaka\": _2, \"otsuka\": _2, \"ott\": _2, \"ovh\": { \"$\": 1, \"succ\": { \"nerdpol\": _4 } }, \"page\": { \"$\": 1, \"succ\": { \"pdns\": _4, \"plesk\": _4, \"prvcy\": _4 } }, \"panasonic\": _2, \"paris\": _2, \"pars\": _2, \"partners\": _2, \"parts\": _2, \"party\": _19, \"passagens\": _2, \"pay\": _2, \"pccw\": _2, \"pet\": _2, \"pfizer\": _2, \"pharmacy\": _2, \"phd\": _2, \"philips\": _2, \"phone\": _2, \"photo\": _2, \"photography\": _2, \"photos\": _2, \"physio\": _2, \"pics\": _2, \"pictet\": _2, \"pictures\": { \"$\": 1, \"succ\": { \"1337\": _4 } }, \"pid\": _2, \"pin\": _2, \"ping\": _2, \"pink\": _2, \"pioneer\": _2, \"pizza\": _2, \"place\": _10, \"play\": _2, \"playstation\": _2, \"plumbing\": _2, \"plus\": _2, \"pnc\": _2, \"pohl\": _2, \"poker\": _2, \"politie\": _2, \"porn\": { \"$\": 1, \"succ\": { \"indie\": _4 } }, \"pramerica\": _2, \"praxi\": _2, \"press\": _2, \"prime\": _2, \"prod\": _2, \"productions\": _2, \"prof\": _2, \"progressive\": _2, \"promo\": _2, \"properties\": _2, \"property\": _2, \"protection\": _2, \"pru\": _2, \"prudential\": _2, \"pub\": _25, \"pwc\": _2, \"qpon\": _2, \"quebec\": _2, \"quest\": _2, \"qvc\": _2, \"racing\": _2, \"radio\": _2, \"raid\": _2, \"read\": _2, \"realestate\": _2, \"realtor\": _2, \"realty\": _2, \"recipes\": _2, \"red\": _2, \"redstone\": _2, \"redumbrella\": _2, \"rehab\": _2, \"reise\": _2, \"reisen\": _2, \"reit\": _2, \"reliance\": _2, \"ren\": _2, \"rent\": _2, \"rentals\": _2, \"repair\": _2, \"report\": _2, \"republican\": _2, \"rest\": _2, \"restaurant\": _2, \"review\": _19, \"reviews\": _2, \"rexroth\": _2, \"rich\": _2, \"richardli\": _2, \"ricoh\": _2, \"ril\": _2, \"rio\": _2, \"rip\": { \"$\": 1, \"succ\": { \"clan\": _4 } }, \"rmit\": _2, \"rocher\": _2, \"rocks\": { \"$\": 1, \"succ\": { \"myddns\": _4, \"lima-city\": _4, \"webspace\": _4 } }, \"rodeo\": _2, \"rogers\": _2, \"room\": _2, \"rsvp\": _2, \"rugby\": _2, \"ruhr\": _2, \"run\": { \"$\": 1, \"succ\": { \"hs\": _4, \"development\": _4, \"ravendb\": _4, \"repl\": _4 } }, \"rwe\": _2, \"ryukyu\": _2, \"saarland\": _2, \"safe\": _2, \"safety\": _2, \"sakura\": _2, \"sale\": _24, \"salon\": _2, \"samsclub\": _2, \"samsung\": _2, \"sandvik\": _2, \"sandvikcoromant\": _2, \"sanofi\": _2, \"sap\": _2, \"sarl\": _2, \"sas\": _2, \"save\": _2, \"saxo\": _2, \"sbi\": _2, \"sbs\": _2, \"sca\": _2, \"scb\": _2, \"schaeffler\": _2, \"schmidt\": _2, \"scholarships\": _2, \"school\": _11, \"schule\": _2, \"schwarz\": _2, \"science\": _19, \"scjohnson\": _2, \"scot\": { \"$\": 1, \"succ\": { \"gov\": _4 } }, \"search\": _2, \"seat\": _2, \"secure\": _2, \"security\": _2, \"seek\": _2, \"select\": _2, \"sener\": _2, \"services\": { \"$\": 1, \"succ\": { \"loginline\": _4 } }, \"ses\": _2, \"seven\": _2, \"sew\": _2, \"sex\": _2, \"sexy\": _2, \"sfr\": _2, \"shangrila\": _2, \"sharp\": _2, \"shaw\": _2, \"shell\": _2, \"shia\": _2, \"shiksha\": _2, \"shoes\": _2, \"shop\": _25, \"shopping\": _2, \"shouji\": _2, \"show\": _2, \"showtime\": _2, \"shriram\": _2, \"silk\": _2, \"sina\": _2, \"singles\": _2, \"site\": { \"$\": 1, \"succ\": { \"cloudera\": _4, \"cyon\": _4, \"fastvps\": _4, \"jele\": _4, \"lelux\": _4, \"loginline\": _4, \"barsy\": _4, \"opensocial\": _4, \"platformsh\": _7, \"byen\": _4, \"mintere\": _4 } }, \"ski\": _2, \"skin\": _2, \"sky\": _2, \"skype\": _2, \"sling\": _2, \"smart\": _2, \"smile\": _2, \"sncf\": _2, \"soccer\": _2, \"social\": _2, \"softbank\": _2, \"software\": _2, \"sohu\": _2, \"solar\": _2, \"solutions\": _2, \"song\": _2, \"sony\": _2, \"soy\": _2, \"spa\": _2, \"space\": { \"$\": 1, \"succ\": { \"myfast\": _4, \"linkitools\": _4, \"uber\": _4, \"xs4all\": _4 } }, \"sport\": _2, \"spot\": _2, \"spreadbetting\": _2, \"srl\": _2, \"stada\": _2, \"staples\": _2, \"star\": _2, \"statebank\": _2, \"statefarm\": _2, \"stc\": _2, \"stcgroup\": _2, \"stockholm\": _2, \"storage\": _2, \"store\": { \"$\": 1, \"succ\": { \"shopware\": _4 } }, \"stream\": _2, \"studio\": _2, \"study\": _2, \"style\": _2, \"sucks\": _2, \"supplies\": _2, \"supply\": _2, \"support\": _25, \"surf\": _2, \"surgery\": _2, \"suzuki\": _2, \"swatch\": _2, \"swiftcover\": _2, \"swiss\": _2, \"sydney\": _2, \"systems\": { \"$\": 1, \"succ\": { \"knightpoint\": _4 } }, \"tab\": _2, \"taipei\": _2, \"talk\": _2, \"taobao\": _2, \"target\": _2, \"tatamotors\": _2, \"tatar\": _2, \"tattoo\": _2, \"tax\": _2, \"taxi\": _2, \"tci\": _2, \"tdk\": _2, \"team\": { \"$\": 1, \"succ\": { \"discourse\": _4, \"jelastic\": _4 } }, \"tech\": _2, \"technology\": _10, \"temasek\": _2, \"tennis\": _2, \"teva\": _2, \"thd\": _2, \"theater\": _2, \"theatre\": _2, \"tiaa\": _2, \"tickets\": _2, \"tienda\": _2, \"tiffany\": _2, \"tips\": _2, \"tires\": _2, \"tirol\": _2, \"tjmaxx\": _2, \"tjx\": _2, \"tkmaxx\": _2, \"tmall\": _2, \"today\": _2, \"tokyo\": _2, \"tools\": _2, \"top\": { \"$\": 1, \"succ\": { \"now-dns\": _4, \"ntdll\": _4 } }, \"toray\": _2, \"toshiba\": _2, \"total\": _2, \"tours\": _2, \"town\": _2, \"toyota\": _2, \"toys\": _2, \"trade\": _19, \"trading\": _2, \"training\": _2, \"travel\": _2, \"travelchannel\": _2, \"travelers\": _2, \"travelersinsurance\": _2, \"trust\": _2, \"trv\": _2, \"tube\": _2, \"tui\": _2, \"tunes\": _2, \"tushu\": _2, \"tvs\": _2, \"ubank\": _2, \"ubs\": _2, \"unicom\": _2, \"university\": _2, \"uno\": _2, \"uol\": _2, \"ups\": _2, \"vacations\": _2, \"vana\": _2, \"vanguard\": _2, \"vegas\": _2, \"ventures\": _2, \"verisign\": _2, \"versicherung\": _2, \"vet\": _2, \"viajes\": _2, \"video\": _2, \"vig\": _2, \"viking\": _2, \"villas\": _2, \"vin\": _2, \"vip\": _2, \"virgin\": _2, \"visa\": _2, \"vision\": _2, \"viva\": _2, \"vivo\": _2, \"vlaanderen\": _2, \"vodka\": _2, \"volkswagen\": _2, \"volvo\": _2, \"vote\": _2, \"voting\": _2, \"voto\": _2, \"voyage\": _2, \"vuelos\": _2, \"wales\": _2, \"walmart\": _2, \"walter\": _2, \"wang\": _2, \"wanggou\": _2, \"watch\": _2, \"watches\": _2, \"weather\": _2, \"weatherchannel\": _2, \"webcam\": _2, \"weber\": _2, \"website\": _2, \"wed\": _2, \"wedding\": _2, \"weibo\": _2, \"weir\": _2, \"whoswho\": _2, \"wien\": _2, \"wiki\": _2, \"williamhill\": _2, \"win\": _2, \"windows\": _2, \"wine\": _2, \"winners\": _2, \"wme\": _2, \"wolterskluwer\": _2, \"woodside\": _2, \"work\": { \"$\": 1, \"succ\": { \"of\": _4, \"to\": _4 } }, \"works\": _2, \"world\": _2, \"wow\": _2, \"wtc\": _2, \"wtf\": _2, \"xbox\": _2, \"xerox\": _2, \"xfinity\": _2, \"xihuan\": _2, \"xin\": _2, \"xn--11b4c3d\": _2, \"कॉम\": _2, \"xn--1ck2e1b\": _2, \"セール\": _2, \"xn--1qqw23a\": _2, \"佛山\": _2, \"xn--30rr7y\": _2, \"慈善\": _2, \"xn--3bst00m\": _2, \"集团\": _2, \"xn--3ds443g\": _2, \"在线\": _2, \"xn--3oq18vl8pn36a\": _2, \"大众汽车\": _2, \"xn--3pxu8k\": _2, \"点看\": _2, \"xn--42c2d9a\": _2, \"คอม\": _2, \"xn--45q11c\": _2, \"八卦\": _2, \"xn--4gbrim\": _2, \"موقع\": _2, \"xn--55qw42g\": _2, \"公益\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--5su34j936bgsg\": _2, \"香格里拉\": _2, \"xn--5tzm5g\": _2, \"网站\": _2, \"xn--6frz82g\": _2, \"移动\": _2, \"xn--6qq986b3xl\": _2, \"我爱你\": _2, \"xn--80adxhks\": _2, \"москва\": _2, \"xn--80aqecdr1a\": _2, \"католик\": _2, \"xn--80asehdb\": _2, \"онлайн\": _2, \"xn--80aswg\": _2, \"сайт\": _2, \"xn--8y0a063a\": _2, \"联通\": _2, \"xn--9dbq2a\": _2, \"קום\": _2, \"xn--9et52u\": _2, \"时尚\": _2, \"xn--9krt00a\": _2, \"微博\": _2, \"xn--b4w605ferd\": _2, \"淡马锡\": _2, \"xn--bck1b9a5dre4c\": _2, \"ファッション\": _2, \"xn--c1avg\": _2, \"орг\": _2, \"xn--c2br7g\": _2, \"नेट\": _2, \"xn--cck2b3b\": _2, \"ストア\": _2, \"xn--cckwcxetd\": _2, \"アマゾン\": _2, \"xn--cg4bki\": _2, \"삼성\": _2, \"xn--czr694b\": _2, \"商标\": _2, \"xn--czrs0t\": _2, \"商店\": _2, \"xn--czru2d\": _2, \"商城\": _2, \"xn--d1acj3b\": _2, \"дети\": _2, \"xn--eckvdtc9d\": _2, \"ポイント\": _2, \"xn--efvy88h\": _2, \"新闻\": _2, \"xn--fct429k\": _2, \"家電\": _2, \"xn--fhbei\": _2, \"كوم\": _2, \"xn--fiq228c5hs\": _2, \"中文网\": _2, \"xn--fiq64b\": _2, \"中信\": _2, \"xn--fjq720a\": _2, \"娱乐\": _2, \"xn--flw351e\": _2, \"谷歌\": _2, \"xn--fzys8d69uvgm\": _2, \"電訊盈科\": _2, \"xn--g2xx48c\": _2, \"购物\": _2, \"xn--gckr3f0f\": _2, \"クラウド\": _2, \"xn--gk3at1e\": _2, \"通販\": _2, \"xn--hxt814e\": _2, \"网店\": _2, \"xn--i1b6b1a6a2e\": _2, \"संगठन\": _2, \"xn--imr513n\": _2, \"餐厅\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--j1aef\": _2, \"ком\": _2, \"xn--jlq480n2rg\": _2, \"亚马逊\": _2, \"xn--jlq61u9w7b\": _2, \"诺基亚\": _2, \"xn--jvr189m\": _2, \"食品\": _2, \"xn--kcrx77d1x4a\": _2, \"飞利浦\": _2, \"xn--kput3i\": _2, \"手机\": _2, \"xn--mgba3a3ejt\": _2, \"ارامكو\": _2, \"xn--mgba7c0bbn0a\": _2, \"العليان\": _2, \"xn--mgbaakc7dvf\": _2, \"اتصالات\": _2, \"xn--mgbab2bd\": _2, \"بازار\": _2, \"xn--mgbca7dzdo\": _2, \"ابوظبي\": _2, \"xn--mgbi4ecexp\": _2, \"كاثوليك\": _2, \"xn--mgbt3dhd\": _2, \"همراه\": _2, \"xn--mk1bu44c\": _2, \"닷컴\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--ngbc5azd\": _2, \"شبكة\": _2, \"xn--ngbe9e0a\": _2, \"بيتك\": _2, \"xn--ngbrx\": _2, \"عرب\": _2, \"xn--nqv7f\": _2, \"机构\": _2, \"xn--nqv7fs00ema\": _2, \"组织机构\": _2, \"xn--nyqy26a\": _2, \"健康\": _2, \"xn--otu796d\": _2, \"招聘\": _2, \"xn--p1acf\": _2, \"рус\": _2, \"xn--pssy2u\": _2, \"大拿\": _2, \"xn--q9jyb4c\": _2, \"みんな\": _2, \"xn--qcka1pmc\": _2, \"グーグル\": _2, \"xn--rhqv96g\": _2, \"世界\": _2, \"xn--rovu88b\": _2, \"書籍\": _2, \"xn--ses554g\": _2, \"网址\": _2, \"xn--t60b56a\": _2, \"닷넷\": _2, \"xn--tckwe\": _2, \"コム\": _2, \"xn--tiq49xqyj\": _2, \"天主教\": _2, \"xn--unup4y\": _2, \"游戏\": _2, \"xn--vermgensberater-ctb\": _2, \"vermögensberater\": _2, \"xn--vermgensberatung-pwb\": _2, \"vermögensberatung\": _2, \"xn--vhquv\": _2, \"企业\": _2, \"xn--vuq861b\": _2, \"信息\": _2, \"xn--w4r85el8fhu5dnra\": _2, \"嘉里大酒店\": _2, \"xn--w4rs40l\": _2, \"嘉里\": _2, \"xn--xhq521b\": _2, \"广东\": _2, \"xn--zfr164b\": _2, \"政务\": _2, \"xyz\": { \"$\": 1, \"succ\": { \"blogsite\": _4, \"fhapp\": _4, \"crafting\": _4, \"zapto\": _4, \"telebit\": _7 } }, \"yachts\": _2, \"yahoo\": _2, \"yamaxun\": _2, \"yandex\": _2, \"yodobashi\": _2, \"yoga\": _2, \"yokohama\": _2, \"you\": _2, \"youtube\": _2, \"yun\": _2, \"zappos\": _2, \"zara\": _2, \"zero\": _2, \"zip\": _2, \"zone\": { \"$\": 1, \"succ\": { \"cloud66\": _4, \"hs\": _4, \"triton\": _7, \"lima\": _4 } }, \"zuerich\": _2 } };\n return rules;\n})();\n\nfunction lookupInTrie(parts, trie, index, allowedMask) {\n let result = null;\n let node = trie;\n while (node !== undefined) {\n if ((node.$ & allowedMask) !== 0) {\n result = {\n index: index + 1,\n isIcann: node.$ === 1 ,\n isPrivate: node.$ === 2 ,\n };\n }\n if (index === -1) {\n break;\n }\n const succ = node.succ;\n node = succ && (succ[parts[index]] || succ['*']);\n index -= 1;\n }\n return result;\n}\nfunction suffixLookup(hostname, options, out) {\n if (fastPathLookup(hostname, options, out) === true) {\n return;\n }\n const hostnameParts = hostname.split('.');\n const allowedMask = (options.allowPrivateDomains === true ? 2 : 0) |\n (options.allowIcannDomains === true ? 1 : 0);\n const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1, allowedMask);\n if (exceptionMatch !== null) {\n out.isIcann = exceptionMatch.isIcann;\n out.isPrivate = exceptionMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.');\n return;\n }\n const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1, allowedMask);\n if (rulesMatch !== null) {\n out.isIcann = rulesMatch.isIcann;\n out.isPrivate = rulesMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.');\n return;\n }\n out.isIcann = false;\n out.isPrivate = false;\n out.publicSuffix = hostnameParts[hostnameParts.length - 1];\n}\n\nconst RESULT = getEmptyResult();\nfunction parse(url, options = {}) {\n return parseImpl(url, 5 , suffixLookup, options, getEmptyResult());\n}\nfunction getHostname(url, options = {}) {\n resetResult(RESULT);\n return parseImpl(url, 0 , suffixLookup, options, RESULT).hostname;\n}\nfunction getPublicSuffix(url, options = {}) {\n resetResult(RESULT);\n return parseImpl(url, 2 , suffixLookup, options, RESULT).publicSuffix;\n}\n\n/**\n * This is a helper class that is used specifically to work\n * with domains restrictions.\n *\n * There are two options how you can add a domain restriction:\n * * `$domain` modifier: https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier\n * * domains list for the cosmetic rules\n *\n * The only difference between them is that in one case we use `|` as a separator,\n * and in the other case - `,`.\n *\n * Examples:\n * * `||example.org^$domain=example.com|~sub.example.com` -- network rule\n * * `example.com,~sub.example.com##banner` -- cosmetic rule\n */\nvar DomainModifier = /** @class */ (function () {\n /**\n * Parses the `domains` string and initializes the object.\n *\n * @param domainsStr Domains string.\n * @param separator Separator — `,` or `|`.\n *\n * @throws An error if the domains string is empty or invalid\n */\n function DomainModifier(domainsStr, separator) {\n if (!domainsStr) {\n throw new SyntaxError('Modifier $domain cannot be empty');\n }\n var permittedDomains = [];\n var restrictedDomains = [];\n var parts = domainsStr.toLowerCase().split(separator);\n for (var i = 0; i < parts.length; i += 1) {\n var domain = parts[i].trim();\n var restricted = false;\n if (domain.startsWith('~')) {\n restricted = true;\n domain = domain.substring(1);\n }\n if (domain === '') {\n throw new SyntaxError(\"Empty domain specified in \\\"\".concat(domainsStr, \"\\\"\"));\n }\n if (restricted) {\n restrictedDomains.push(domain);\n }\n else {\n permittedDomains.push(domain);\n }\n }\n this.restrictedDomains = restrictedDomains.length > 0 ? restrictedDomains : null;\n this.permittedDomains = permittedDomains.length > 0 ? permittedDomains : null;\n }\n /**\n * isDomainOrSubdomainOfAny checks if `domain` is the same or a subdomain\n * of any of `domains`.\n *\n * @param domain - domain to check\n * @param domains - domains list to check against\n */\n DomainModifier.isDomainOrSubdomainOfAny = function (domain, domains) {\n for (var i = 0; i < domains.length; i += 1) {\n var d = domains[i];\n if (DomainModifier.isWildcardDomain(d)) {\n if (DomainModifier.matchAsWildcard(d, domain)) {\n return true;\n }\n }\n if (domain === d || (domain.endsWith(d) && domain.endsWith(\".\".concat(d)))) {\n return true;\n }\n }\n return false;\n };\n /**\n * Checks if domain ends with wildcard\n *\n * @param domain\n */\n DomainModifier.isWildcardDomain = function (domain) {\n return domain.endsWith('.*');\n };\n /**\n * Checks if wildcard matches domain\n *\n * @param wildcard\n * @param domainNameToCheck\n */\n DomainModifier.matchAsWildcard = function (wildcard, domainNameToCheck) {\n var wildcardedDomainToCheck = DomainModifier.genTldWildcard(domainNameToCheck);\n if (wildcardedDomainToCheck) {\n return wildcardedDomainToCheck === wildcard\n || (wildcardedDomainToCheck.endsWith(wildcard) && wildcardedDomainToCheck.endsWith(\".\".concat(wildcard)));\n }\n return false;\n };\n /**\n * Generates from domain tld wildcard e.g. google.com -> google.* ; youtube.co.uk -> youtube.*\n *\n * @param {string} domainName\n * @returns {string} string is empty if tld for provided domain name doesn't exists\n */\n DomainModifier.genTldWildcard = function (domainName) {\n var tld = getPublicSuffix(domainName);\n if (tld) {\n return \"\".concat(domainName.slice(0, domainName.indexOf(\".\".concat(tld))), \".*\");\n }\n return '';\n };\n return DomainModifier;\n}());\n/**\n * Comma separator\n */\nvar COMMA_SEPARATOR = ',';\n/**\n * Pipe separator\n */\nvar PIPE_SEPARATOR = '|';\n\nvar _a, _b;\nvar isSpecialModifierToken = function (token) { return token.type === \"specialModifier\" /* TokenType.SpecialModifier */; };\n/**\n * Array of special modifiers allow to check for modifier name more efficient\n * by avoiding Object.values(SpecialModifier) calls in custom type-guard while\n * allowing the usage of 'const enum' for SpecialModifier\n */\nvar SpecialModifiers = [\"replace\" /* SpecialModifier.Replace */, \"removeparam\" /* SpecialModifier.Removeparam */];\nvar modifiersPatterns = (_a = {},\n _a[\"replace\" /* SpecialModifier.Replace */] = [\"regexp\" /* Phase.Regexp */, \"replacement\" /* Phase.Replacement */, \"flags\" /* Phase.Flags */],\n _a[\"removeparam\" /* SpecialModifier.Removeparam */] = [\"regexp\" /* Phase.Regexp */, \"flags\" /* Phase.Flags */],\n _a);\n/**\n * Extracts modifier's plain value\n */\nvar parsePlainValue = function (string, startIndex) {\n var modifierValue = '';\n var modifierEndIndex = -1;\n var chars = [];\n for (var i = startIndex; i < string.length; i += 1) {\n var c = string[i];\n var isLastChar = i === (string.length - 1);\n var isUnescapedChar = i > 0 && !(string[i - 1] === \"\\\\\" /* SpecialCharacter.OptionEscape */);\n if ((c === \",\" /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) {\n if (isLastChar) {\n chars.push(c);\n }\n modifierValue = chars.join('');\n modifierEndIndex = i;\n break;\n }\n else {\n chars.push(c);\n }\n }\n return {\n modifierValue: modifierValue,\n modifierEndIndex: modifierEndIndex,\n };\n};\n/**\n * Extract modifier's regexp(-like) value\n *\n * @throws on invalid special modifier value\n */\nvar parseRegexpValue = function (string, startIndex, pattern) {\n var currentPhase;\n var nextPhase = (function () {\n var i = 0;\n return function () {\n if (i < pattern.length) {\n currentPhase = pattern[i];\n i += 1;\n return;\n }\n // Undefined phase indicates that there were more Regexp delimiters\n // than pattern implies and that makes modifier value invalid\n throw new Error('Invalid pattern for regexp modifier value.');\n };\n })();\n var modifierValue = '';\n var modifierEndIndex = -1;\n var chars = [];\n for (var i = startIndex; i < string.length; i += 1) {\n var c = string[i];\n var isLastChar = i === (string.length - 1);\n var isUnescapedChar = i > 0 && !(string[i - 1] === \"\\\\\" /* SpecialCharacter.OptionEscape */);\n if (c === \"/\" /* SpecialCharacter.RegexpDelimiter */ && isUnescapedChar) {\n // Step into the next pattern phase\n // currentPhase = phaseGenerator.next().value;\n nextPhase();\n }\n if ((c === \",\" /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) {\n // Skip unescaped commas that are part of regexp\n if (currentPhase === \"regexp\" /* Phase.Regexp */) {\n chars.push(c);\n continue;\n }\n if (isLastChar) {\n chars.push(c);\n }\n // Unescaped delimiter and/or last character indicates\n // the end of the modifier value, if current phase is the last one\n if (currentPhase === pattern[pattern.length - 1]) {\n modifierValue = chars.join('');\n modifierEndIndex = i;\n break;\n }\n else {\n throw new Error('Unexpected options delimiter or end of options string.');\n }\n }\n else if (currentPhase === \"regexp\" /* Phase.Regexp */\n && (c === \",\" /* SpecialCharacter.OptionDelimiter */)\n && !isUnescapedChar) {\n /**\n * Unescape ',' and '$' for regexp parts of pattern,\n * as escapes are forced by modifiers syntax,\n * e.g https://adguard.com/kb/ru/general/ad-filtering/create-own-filters/#replace-modifier\n */\n chars.splice(chars.length - 1, 1);\n chars.push(c);\n }\n else {\n chars.push(c);\n }\n }\n return {\n modifierValue: modifierValue,\n modifierEndIndex: modifierEndIndex,\n };\n};\nvar modifierValueParsers = (_b = {},\n _b[\"regexp\" /* ModifierValueType.Regexp */] = parseRegexpValue,\n _b[\"plain\" /* ModifierValueType.Plain */] = parsePlainValue,\n _b);\n/**\n * Processes raw tokens by splitting token values by delimiter\n *\n * @param preprocessedTokens array of preprocessed tokens (of TokenType.SpecialModifier | TokenType.Raw type)\n * @param delimiter - delimiter\n * @param escapeCharacter - escape character\n * @param unescape if true, remove escape characters from string\n * @returns array of processed tokens\n */\nvar tokenize = function (preprocessedTokens, delimiter, escapeCharacter, unescape) {\n // Split raw tokens\n var nestedProcessedTokens = preprocessedTokens\n .map(function (token) {\n // Modifier tokens are already concrete tokens and are being passed down the pipeline here\n if (isSpecialModifierToken(token)) {\n return token;\n }\n var tokenValue = token.value;\n var tokens = [];\n var chars = [];\n var makeToken = function (type) {\n tokens.push({\n type: type,\n value: chars.join(''),\n });\n chars = [];\n };\n for (var i = 0; i < tokenValue.length; i += 1) {\n var c = tokenValue[i];\n if (c === delimiter) {\n var isEscaped = i > 0 && tokenValue[i - 1] === escapeCharacter;\n if (isEscaped) {\n if (unescape) {\n chars.splice(chars.length - 1, 1);\n }\n chars.push(c);\n }\n else {\n // Don't make token with '' value\n // when raw token starts with a delimiter\n if (chars.length !== 0) {\n makeToken(\"string\" /* TokenType.String */);\n }\n chars.push(c);\n makeToken(\"delim\" /* TokenType.Delimiter */);\n }\n }\n else {\n chars.push(c);\n // Last character case\n if (i === (tokenValue.length - 1)) {\n makeToken(\"string\" /* TokenType.String */);\n }\n }\n }\n return tokens;\n });\n // Flatten the result\n var processedTokens = [];\n for (var i = 0; i < nestedProcessedTokens.length; i += 1) {\n var currentVal = nestedProcessedTokens[i];\n if (Array.isArray(currentVal)) {\n processedTokens.push.apply(processedTokens, currentVal);\n }\n else {\n processedTokens.push(currentVal);\n }\n }\n return processedTokens;\n};\n/**\n * Converts arrays of tokens into array of their values\n *\n * @param tokens array of arbitrary tokens\n * @returns array of tokens' values\n */\nvar makeWords = function (tokens) {\n var words = [];\n for (var i = 0; i < tokens.length; i += 1) {\n var token = tokens[i];\n if (token.type !== \"delim\" /* TokenType.Delimiter */) {\n words.push(token.value);\n }\n }\n return words;\n};\n/**\n * Parses special modifier value\n *\n * @param modifierName name of modifier to be parsed\n * @param string options string\n * @returns object with Modifier token value and next index to keep iterating from\n */\nfunction parseSpecialModifier(modifierName, string) {\n var tokenValue = \"\".concat(modifierName).concat(\"=\" /* SpecialCharacter.ModifierValueMarker */);\n var modifierValueStartIndex = string.indexOf(tokenValue) + tokenValue.length;\n // Define modifier value type\n var valueType = string[modifierValueStartIndex] === \"/\" /* SpecialCharacter.RegexpDelimiter */\n ? \"regexp\" /* ModifierValueType.Regexp */\n : \"plain\" /* ModifierValueType.Plain */;\n // Pick parser for specific type of modifier value\n var parser = modifierValueParsers[valueType];\n // Get pattern of current modifier\n var pattern = modifiersPatterns[modifierName];\n var _a = parser(string, modifierValueStartIndex, pattern), modifierValue = _a.modifierValue, modifierEndIndex = _a.modifierEndIndex;\n if (modifierEndIndex === -1) {\n throw new Error(\"Invalid $\".concat(modifierName, \" modifier value.\"));\n }\n tokenValue += modifierValue;\n var nextIndex = modifierEndIndex;\n return {\n tokenValue: tokenValue,\n nextIndex: nextIndex,\n };\n}\n/**\n * Converts options string into array of Raw and Modifier tokens\n *\n * @param string options string\n * @returns array of preprocessed tokens\n */\nfunction splitBySpecialModifierTokens(string) {\n var tokens = [];\n var chars = [];\n var makeToken = function (tokenType, tokenValue) {\n tokens.push({\n type: tokenType,\n value: tokenValue,\n });\n chars = [];\n };\n for (var i = 0; i < string.length; i += 1) {\n var c = string[i];\n var isUnescapedChar = i > 0 && !(string[i - 1] === \"\\\\\" /* SpecialCharacter.OptionEscape */);\n if (c === \"=\" /* SpecialCharacter.ModifierValueMarker */ && isUnescapedChar) {\n // Parse current chars array to get modifier name\n // Assume that modifier name is everything after last ',' and before current '='\n var charsStr = chars.join('');\n var lastCommaIndex = charsStr.lastIndexOf(\",\" /* SpecialCharacter.OptionDelimiter */, i);\n // Assertion is used to avoid type-guard for SpecialModifier, making it faster,\n // and reduce call stack size\n var modifierName = charsStr.substring(lastCommaIndex + 1);\n // Check if this is modifier that requires custom parsing logic\n if (!SpecialModifiers.includes(modifierName)) {\n chars.push(c);\n // Last character case\n if (i === (string.length - 1)) {\n makeToken(\"raw\" /* TokenType.Raw */, charsStr);\n }\n continue;\n }\n // Remove modifier name from char stack,\n // make token from whats left and empty chars\n makeToken(\"raw\" /* TokenType.Raw */, charsStr.substring(0, charsStr.lastIndexOf(modifierName)));\n // Extract predefined token value and next iteration index\n // Token value includes both name, separator('=') and value of modifier\n var _a = parseSpecialModifier(modifierName, string), tokenValue = _a.tokenValue, nextIndex = _a.nextIndex;\n makeToken(\"specialModifier\" /* TokenType.SpecialModifier */, tokenValue);\n i = nextIndex;\n }\n else {\n chars.push(c);\n // Last character case\n if (i === (string.length - 1)) {\n makeToken(\"raw\" /* TokenType.Raw */, chars.join(''));\n }\n }\n }\n return tokens;\n}\n/**\n * Splits options string into array of modifier=value pairs\n *\n * @param string - string to split\n * @param unescape - if true, remove escape characters from string\n * @return array of string parts\n * @throws on invalid special modifier value\n */\nfunction parseOptionsString(string, unescape) {\n if (unescape === void 0) { unescape = true; }\n if (!string) {\n return [];\n }\n if (string.startsWith(\",\" /* SpecialCharacter.OptionDelimiter */)) {\n // eslint-disable-next-line no-param-reassign\n string = string.substring(1);\n }\n /**\n * Extract modifier tokens for modifiers that require custom parsing\n * https://github.com/AdguardTeam/tsurlfilter/issues/79\n */\n var preprocessedTokens = splitBySpecialModifierTokens(string);\n /**\n * Split raw tokens by delimiter\n */\n var tokens = tokenize(preprocessedTokens, \",\" /* SpecialCharacter.OptionDelimiter */, \"\\\\\" /* SpecialCharacter.OptionEscape */, unescape);\n /**\n * Join tokens into words\n */\n return makeWords(tokens);\n}\n\n/**\n * Replace modifier class\n */\nvar ReplaceModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function ReplaceModifier(value) {\n var parsed = ReplaceModifier.parseReplaceOption(value);\n this.replaceOption = parsed.optionText;\n this.replaceApply = parsed.apply;\n }\n /**\n *\n * @param option\n */\n ReplaceModifier.parseReplaceOption = function (option) {\n if (!option) {\n return {\n apply: function (x) { return x; },\n optionText: '',\n };\n }\n var parts = splitByDelimiterWithEscapeCharacter(option, '/', '\\\\', true);\n var modifiers = (parts[2] || '');\n if (modifiers.indexOf('g') < 0) {\n modifiers += 'g';\n }\n var pattern = new RegExp(parts[0], modifiers);\n // unescape replacement alias\n var replacement = parts[1].replace(/\\\\\\$/g, '$');\n replacement = SimpleRegex.unescapeSpecials(replacement);\n var apply = function (input) { return input.replace(pattern, replacement); };\n return {\n apply: apply,\n optionText: option,\n };\n };\n /**\n * Replace content\n */\n ReplaceModifier.prototype.getValue = function () {\n return this.replaceOption;\n };\n /**\n * Replace apply function\n */\n ReplaceModifier.prototype.getApplyFunc = function () {\n return this.replaceApply;\n };\n return ReplaceModifier;\n}());\n\n/**\n * Csp modifier class\n */\nvar CspModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n * @param isAllowlist\n */\n function CspModifier(value, isAllowlist) {\n this.cspDirective = value;\n this.isAllowlist = isAllowlist;\n this.validateCspDirective();\n }\n /**\n * Csp directive\n */\n CspModifier.prototype.getValue = function () {\n return this.cspDirective;\n };\n /**\n * Validates CSP rule\n */\n CspModifier.prototype.validateCspDirective = function () {\n /**\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685\n * CSP directive may be empty in case of allowlist rule,\n * it means to disable all $csp rules matching the allowlist rule\n */\n if (!this.isAllowlist && !this.cspDirective) {\n throw new Error('Invalid $CSP rule: CSP directive must not be empty');\n }\n if (this.cspDirective) {\n /**\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685#issue-228287090\n * Forbids report-to and report-uri directives\n */\n var cspDirective = this.cspDirective.toLowerCase();\n if (cspDirective.indexOf('report-') >= 0) {\n throw new Error(\"Forbidden CSP directive: \".concat(cspDirective));\n }\n }\n };\n return CspModifier;\n}());\n\n/**\n * Cookie modifier class\n *\n * Learn more about it here:\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/961\n */\nvar CookieModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function CookieModifier(value) {\n // Save the source text of the option modifier\n this.optionValue = value || '';\n this.regex = null;\n this.cookieName = null;\n this.sameSite = null;\n this.maxAge = null;\n // Parse cookie name/regex\n var parts = this.optionValue.split(/;/);\n if (parts.length < 1) {\n throw new Error(\"Cannot parse \".concat(this.optionValue));\n }\n var cookieName = parts[0];\n if (cookieName.startsWith('/') && cookieName.endsWith('/')) {\n var pattern = cookieName.substring(1, cookieName.length - 1);\n // Save regex to be used further for matching cookies\n this.regex = new RegExp(pattern);\n }\n else {\n // Match by cookie name\n this.cookieName = cookieName;\n }\n // Parse other cookie options\n if (parts.length > 1) {\n for (var i = 1; i < parts.length; i += 1) {\n var nameValue = parts[i].split('=');\n var optionName = nameValue[0];\n var optionValue = nameValue[1];\n if (optionName === CookieModifier.MAX_AGE) {\n this.maxAge = parseInt(optionValue, 10);\n }\n else if (optionName === CookieModifier.SAME_SITE) {\n this.sameSite = optionValue;\n }\n else {\n throw new Error(\"Unknown $cookie option: \".concat(optionName));\n }\n }\n }\n }\n /**\n * Modifier value\n */\n CookieModifier.prototype.getValue = function () {\n return this.optionValue;\n };\n /**\n * First cookie name\n */\n CookieModifier.prototype.getCookieName = function () {\n return this.cookieName;\n };\n /**\n * Max age cookie value\n */\n CookieModifier.prototype.getMaxAge = function () {\n return this.maxAge;\n };\n /**\n * Same site cookie value\n */\n CookieModifier.prototype.getSameSite = function () {\n return this.sameSite;\n };\n /**\n * Checks if cookie with the specified name matches this option\n *\n * @param {string} name Cookie name\n * @return {boolean} true if it does\n */\n CookieModifier.prototype.matches = function (name) {\n if (!name) {\n return false;\n }\n if (this.regex) {\n return this.regex.test(name);\n }\n if (this.cookieName) {\n return this.cookieName === name;\n }\n // Empty regex and cookieName means that we must match all cookies\n return true;\n };\n /**\n * Checks if cookie rule has an empty $cookie option\n *\n * @return {boolean} True if $cookie option is empty\n */\n CookieModifier.prototype.isEmpty = function () {\n return !this.regex && !this.cookieName;\n };\n /**\n * Cookie name maxAge\n */\n CookieModifier.MAX_AGE = 'maxAge';\n /**\n * Cookie name sameSite\n */\n CookieModifier.SAME_SITE = 'sameSite';\n return CookieModifier;\n}());\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction getAugmentedNamespace(n) {\n var f = n.default;\n\tif (typeof f == \"function\") {\n\t\tvar a = function () {\n\t\t\treturn f.apply(this, arguments);\n\t\t};\n\t\ta.prototype = f.prototype;\n } else a = {};\n Object.defineProperty(a, '__esModule', {value: true});\n\tObject.keys(n).forEach(function (k) {\n\t\tvar d = Object.getOwnPropertyDescriptor(n, k);\n\t\tObject.defineProperty(a, k, d.get ? d : {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn n[k];\n\t\t\t}\n\t\t});\n\t});\n\treturn a;\n}\n\nvar scriptlets_umd = {exports: {}};\n\n(function (factory) {\n factory();\n})((function () {\n function attachDependencies(scriptlet) {\n const _scriptlet$injections = scriptlet.injections,\n injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections;\n return injections.reduce(function (accum, dep) {\n return \"\".concat(accum, \"\\n\").concat(dep.toString());\n }, scriptlet.toString());\n }\n function addCall(scriptlet, code) {\n return \"\".concat(code, \"\\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\\n try {\\n \").concat(scriptlet.name, \".apply(this, updatedArgs);\\n } catch (e) {\\n console.log(e);\\n }\");\n }\n function passSourceAndProps(source, code) {\n let redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (source.hit) {\n source.hit = source.hit.toString();\n }\n const sourceString = JSON.stringify(source);\n const argsString = source.args ? \"[\".concat(source.args.map(JSON.stringify), \"]\") : undefined;\n const params = argsString ? \"\".concat(sourceString, \", \").concat(argsString) : sourceString;\n if (redirect) {\n return \"(function(source, args){\\n\".concat(code, \"\\n})(\").concat(params, \");\");\n }\n return \"(\".concat(code, \")(\").concat(params, \");\");\n }\n function wrapInNonameFunc(code) {\n return \"function(source, args){\\n\".concat(code, \"\\n}\");\n }\n const getObjectEntries = function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n };\n const getObjectFromEntries = function getObjectFromEntries(entries) {\n const output = entries.reduce(function (acc, el) {\n const key = el[0];\n const value = el[1];\n acc[key] = value;\n return acc;\n }, {});\n return output;\n };\n const isEmptyObject = function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n };\n const safeGetDescriptor = function safeGetDescriptor(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n };\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n const nativeIsNaN = function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n };\n const nativeIsFinite = function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n };\n const getNumberFromString = function getNumberFromString(rawString) {\n const parsedDelay = parseInt(rawString, 10);\n const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n };\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n const replaceAll = function replaceAll(input, substr, newSubstr) {\n return input.split(substr).join(newSubstr);\n };\n const escapeRegExp = function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n const toRegExp = function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n const DEFAULT_VALUE = '.?';\n const FORWARD_SLASH = '/';\n if (input === '') {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(escaped);\n };\n const isValidStrPattern = function isValidStrPattern(input) {\n const FORWARD_SLASH = '/';\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n };\n const getBeforeRegExp = function getBeforeRegExp(str, rx) {\n const index = str.search(rx);\n return str.substring(0, index);\n };\n const startsWith$1 = function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n };\n const endsWith = function endsWith(str, ending) {\n return !!str && str.lastIndexOf(ending) === str.length - ending.length;\n };\n const substringAfter$1 = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n const substringBefore = function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n };\n const wrapInSingleQuotes = function wrapInSingleQuotes(str) {\n if (str[0] === '\\'' && str[str.length - 1] === '\\'' || str[0] === '\"' && str[str.length - 1] === '\"') {\n str = str.substring(1, str.length - 1);\n }\n str = str.replace(/\\'/g, '\"');\n return \"'\".concat(str, \"'\");\n };\n const getStringInBraces = function getStringInBraces(str) {\n const firstIndex = str.indexOf('(');\n const lastIndex = str.lastIndexOf(')');\n return str.substring(firstIndex + 1, lastIndex);\n };\n const convertRtcConfigToString = function convertRtcConfigToString(config) {\n const UNDEF_STR = 'undefined';\n let str = UNDEF_STR;\n if (config === null) {\n str = 'null';\n } else if (config instanceof Object) {\n const SERVERS_PROP_NAME = 'iceServers';\n const URLS_PROP_NAME = 'urls';\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n };\n const isValidMatchStr = function isValidMatchStr(match) {\n const INVERT_MARKER = '!';\n let str = match;\n if (startsWith$1(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n };\n const isValidMatchNumber = function isValidMatchNumber(match) {\n const INVERT_MARKER = '!';\n let str = match;\n if (startsWith$1(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n const num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n };\n const parseMatchArg = function parseMatchArg(match) {\n const INVERT_MARKER = '!';\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch,\n matchRegexp,\n matchValue\n };\n };\n const parseDelayArg = function parseDelayArg(delay) {\n const INVERT_MARKER = '!';\n const isInvertedDelayMatch = startsWith$1(delay, INVERT_MARKER);\n let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n delayValue = parseInt(delayValue, 10);\n const delayMatch = nativeIsNaN(delayValue) ? null : delayValue;\n return {\n isInvertedDelayMatch,\n delayMatch\n };\n };\n const objectToString = function objectToString(obj) {\n if (!obj || typeof obj !== 'object') {\n return String(obj);\n }\n return isEmptyObject(obj) ? '{}' : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, \":\\\"\").concat(recordValueStr, \"\\\"\");\n }).join(' ');\n };\n const convertTypeToString = function convertTypeToString(value) {\n let output;\n if (typeof value === 'undefined') {\n output = 'undefined';\n } else if (typeof value === 'object') {\n if (value === null) {\n output = 'null';\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n };\n function getRandomStrByLength(length) {\n let result = '';\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~';\n const charactersLength = characters.length;\n for (let i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n function generateRandomResponse(customResponseText) {\n let customResponse = customResponseText;\n if (customResponse === 'true') {\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace('length:', '');\n const rangeRegex = /^\\d+-\\d+$/;\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n let rangeMin = getNumberFromString(customResponse.split('-')[0]);\n let rangeMax = getNumberFromString(customResponse.split('-')[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n if (rangeMin > rangeMax) {\n const temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n const LENGTH_RANGE_LIMIT = 500 * 1000;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n const length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n function inferValue(value) {\n if (value === 'undefined') {\n return undefined;\n }\n if (value === 'false') {\n return false;\n }\n if (value === 'true') {\n return true;\n }\n if (value === 'null') {\n return null;\n }\n if (value === 'NaN') {\n return NaN;\n }\n const MAX_ALLOWED_NUM = 32767;\n const numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error('number values bigger than 32767 are not allowed');\n }\n return numVal;\n }\n let errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n const parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === 'string') {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n function iterateWithTransitions(iterable, transitions, init, args) {\n let state = init || Object.keys(transitions)[0];\n for (let i = 0; i < iterable.length; i += 1) {\n state = transitions[state](iterable, i, args);\n }\n return state;\n }\n const ADG_SCRIPTLET_MASK = '#//scriptlet';\n const wordSaver = function wordSaver() {\n let str = '';\n const strings = [];\n const saveSymb = function saveSymb(s) {\n str += s;\n return str;\n };\n const saveStr = function saveStr() {\n strings.push(str);\n str = '';\n };\n const getAll = function getAll() {\n return [...strings];\n };\n return {\n saveSymb,\n saveStr,\n getAll\n };\n };\n const substringAfter = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n const parseRule = function parseRule(ruleText) {\n ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK);\n const TRANSITION = {\n OPENED: 'opened',\n PARAM: 'param',\n CLOSED: 'closed'\n };\n const opened = function opened(rule, index, _ref) {\n let sep = _ref.sep;\n const char = rule[index];\n let transition;\n switch (char) {\n case ' ':\n case '(':\n case ',':\n {\n transition = TRANSITION.OPENED;\n break;\n }\n case '\\'':\n case '\"':\n {\n sep.symb = char;\n transition = TRANSITION.PARAM;\n break;\n }\n case ')':\n {\n transition = index === rule.length - 1 ? TRANSITION.CLOSED : TRANSITION.OPENED;\n break;\n }\n default:\n {\n throw new Error('The rule is not a scriptlet');\n }\n }\n return transition;\n };\n const param = function param(rule, index, _ref2) {\n let saver = _ref2.saver,\n sep = _ref2.sep;\n const char = rule[index];\n switch (char) {\n case '\\'':\n case '\"':\n {\n const preIndex = index - 1;\n const before = rule[preIndex];\n if (char === sep.symb && before !== '\\\\') {\n sep.symb = null;\n saver.saveStr();\n return TRANSITION.OPENED;\n }\n }\n default:\n {\n saver.saveSymb(char);\n return TRANSITION.PARAM;\n }\n }\n };\n const transitions = {\n [TRANSITION.OPENED]: opened,\n [TRANSITION.PARAM]: param,\n [TRANSITION.CLOSED]: function () {}\n };\n const sep = {\n symb: null\n };\n const saver = wordSaver();\n const state = iterateWithTransitions(ruleText, transitions, TRANSITION.OPENED, {\n sep,\n saver\n });\n if (state !== 'closed') {\n throw new Error(\"Invalid scriptlet rule \".concat(ruleText));\n }\n const args = saver.getAll();\n return {\n name: args[0],\n args: args.slice(1)\n };\n };\n const validateType = function validateType(type) {\n return typeof type !== 'undefined';\n };\n const validateListener = function validateListener(listener) {\n return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object'\n && listener !== null && typeof listener.handleEvent === 'function');\n };\n const listenerToString = function listenerToString(listener) {\n return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString();\n };\n const shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) {\n return delay === '*';\n };\n const getMatchDelay = function getMatchDelay(delay) {\n const DEFAULT_DELAY = 1000;\n const parsedDelay = parseInt(delay, 10);\n const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY\n : parsedDelay;\n return delayMatch;\n };\n const isDelayMatched = function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n };\n const getBoostMultiplier = function getBoostMultiplier(boost) {\n const DEFAULT_MULTIPLIER = 0.05;\n const MIN_MULTIPLIER = 0.001;\n const MAX_MULTIPLIER = 50;\n const parsedBoost = parseFloat(boost);\n let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER\n : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n };\n const flatten = function flatten(input) {\n const stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n const res = [];\n while (stack.length) {\n const next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n };\n const isExisting = function isExisting(item) {\n return !!item;\n };\n const isValidCookiePath = function isValidCookiePath(rawPath) {\n return rawPath === '/' || rawPath === 'none';\n };\n const getCookiePath = function getCookiePath(rawPath) {\n if (rawPath === '/') {\n return 'path=/';\n }\n return '';\n };\n const concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n };\n const getLimitedCookieValue = function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n let validValue;\n if (value === 'true') {\n validValue = 'true';\n } else if (value === 'True') {\n validValue = 'True';\n } else if (value === 'false') {\n validValue = 'false';\n } else if (value === 'False') {\n validValue = 'False';\n } else if (value === 'yes') {\n validValue = 'yes';\n } else if (value === 'Yes') {\n validValue = 'Yes';\n } else if (value === 'Y') {\n validValue = 'Y';\n } else if (value === 'no') {\n validValue = 'no';\n } else if (value === 'ok') {\n validValue = 'ok';\n } else if (value === 'OK') {\n validValue = 'OK';\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n };\n const parseCookieString = function parseCookieString(cookieString) {\n const COOKIE_DELIMITER = '=';\n const COOKIE_PAIRS_DELIMITER = ';';\n const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n const cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n let cookieKey;\n let cookieValue;\n const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n };\n const isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(';').some(function (cookieStr) {\n const pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return false;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n };\n const getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) {\n const ONE_YEAR_EXPIRATION_KEYWORD = '1year';\n const ONE_DAY_EXPIRATION_KEYWORD = '1day';\n const MS_IN_SEC = 1000;\n const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n const SECONDS_IN_DAY = 24 * 60 * 60;\n let parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n };\n const noopFunc = function noopFunc() {};\n const noopCallbackFunc = function noopCallbackFunc() {\n return noopFunc;\n };\n const noopNull = function noopNull() {\n return null;\n };\n const trueFunc = function trueFunc() {\n return true;\n };\n const falseFunc = function falseFunc() {\n return false;\n };\n function noopThis() {\n return this;\n }\n const noopStr = function noopStr() {\n return '';\n };\n const noopArray = function noopArray() {\n return [];\n };\n const noopObject = function noopObject() {\n return {};\n };\n const throwFunc = function throwFunc() {\n throw new Error();\n };\n const noopPromiseReject = function noopPromiseReject() {\n return Promise.reject();\n };\n const noopPromiseResolve = function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}';\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default';\n if (typeof Response === 'undefined') {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: 'OK'\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n };\n const shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = 'inlineScript';\n const INJECTED_SCRIPT_STRING = 'injectedScript';\n const INJECTED_SCRIPT_MARKER = '';\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf('#');\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split('\\n').slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith$1(stackURL, '(')) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith$1(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith$1(stackFunction, 'at')) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith$1(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n };\n const findHostElements = function findHostElements(rootElement) {\n const hosts = [];\n const domElems = rootElement.querySelectorAll('*');\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n return hosts;\n };\n const pierceShadowDom = function pierceShadowDom(selector, hostElements) {\n let targets = [];\n const innerHostsAcc = [];\n hostElements.forEach(function (host) {\n const simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n const shadowRootElem = host.shadowRoot;\n const shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n const innerHosts = flatten(innerHostsAcc);\n return {\n targets,\n innerHosts\n };\n };\n const isValidCallback = function isValidCallback(callback) {\n return callback instanceof Function\n || typeof callback === 'string';\n };\n const parseRawDelay = function parseRawDelay(delay) {\n const parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n };\n const isPreventionNeeded = function isPreventionNeeded(_ref) {\n let callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n const _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n const parsedDelay = parseRawDelay(delay);\n let shouldPrevent = false;\n const callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n };\n const handleOldReplacement = function handleOldReplacement(replacement) {\n let result;\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === 'trueFunc') {\n result = trueFunc;\n } else if (replacement.indexOf('=') > -1) {\n const isProp = startsWith$1(replacement, '{') && endsWith(replacement, '}');\n if (isProp) {\n const propertyPart = replacement.slice(1, -1);\n const propertyName = substringBefore(propertyPart, '=');\n const propertyValue = substringAfter$1(propertyPart, '=');\n if (propertyValue === 'noopFunc') {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n };\n const createDecoy = function createDecoy(args) {\n const OBJECT_TAG_NAME = 'object';\n const OBJECT_URL_PROP_NAME = 'data';\n const IFRAME_TAG_NAME = 'iframe';\n const IFRAME_URL_PROP_NAME = 'src';\n const replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n let tag;\n let urlProp;\n if (replacement === 'obj') {\n tag = OBJECT_TAG_NAME;\n urlProp = OBJECT_URL_PROP_NAME;\n } else {\n tag = IFRAME_TAG_NAME;\n urlProp = IFRAME_URL_PROP_NAME;\n }\n const decoy = document.createElement(tag);\n decoy[urlProp] = url;\n decoy.style.setProperty('height', '1px', 'important');\n decoy.style.setProperty('position', 'fixed', 'important');\n decoy.style.setProperty('top', '-1px', 'important');\n decoy.style.setProperty('width', '1px', 'important');\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1000);\n return decoy;\n };\n const getPreventGetter = function getPreventGetter(nativeGetter) {\n const preventGetter = function preventGetter(target, prop) {\n if (prop && prop === 'closed') {\n return false;\n }\n if (typeof nativeGetter === 'function') {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n };\n const getNativeRegexpTest = function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, 'test').value;\n };\n const getRequestProps = function getRequestProps() {\n return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal'];\n };\n const getRequestData = function getRequestData(request) {\n const requestInitOptions = getRequestProps();\n const entries = requestInitOptions.map(function (key) {\n const value = request[key];\n return [key, value];\n });\n return getObjectFromEntries(entries);\n };\n const getFetchData = function getFetchData(args) {\n const fetchPropsObj = {};\n let fetchUrl;\n let fetchInit;\n if (args[0] instanceof Request) {\n const requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n Object.keys(fetchInit).forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n };\n const getXhrData = function getXhrData(method, url, async, user, password) {\n return {\n method,\n url,\n async,\n user,\n password\n };\n };\n const parseMatchProps = function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = ' ';\n const PAIRS_MARKER = ':';\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n };\n const validateParsedData = function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n };\n const getMatchPropsData = function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n };\n const logMessage = function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = '#%#//scriptlet';\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n };\n const setStorageItem = function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n };\n const getLimitedStorageItemValue = function getLimitedStorageItemValue(value) {\n if (typeof value !== 'string') {\n throw new Error('Invalid value');\n }\n let validValue;\n if (value === 'undefined') {\n validValue = undefined;\n } else if (value === 'false') {\n validValue = false;\n } else if (value === 'true') {\n validValue = true;\n } else if (value === 'null') {\n validValue = null;\n } else if (value === 'emptyArr') {\n validValue = '[]';\n } else if (value === 'emptyObj') {\n validValue = '{}';\n } else if (value === '') {\n validValue = '';\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error('Invalid value');\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error('Invalid value');\n }\n } else if (value === 'yes') {\n validValue = 'yes';\n } else if (value === 'no') {\n validValue = 'no';\n } else {\n throw new Error('Invalid value');\n }\n return validValue;\n };\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === 'string' && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n const result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n const rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf('.');\n if (pos === -1) {\n return {\n base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base,\n prop,\n chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase === null) {\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base,\n prop,\n chain\n };\n }\n function getWildcardPropertyInChain(base, chain) {\n let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n const pos = chain.indexOf('.');\n if (pos === -1) {\n if (chain === '*' || chain === '[]') {\n for (const key in base) {\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base,\n prop: chain\n });\n }\n return output;\n }\n const prop = chain.slice(0, pos);\n const shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object;\n if (shouldLookThrough) {\n const nextProp = chain.slice(pos + 1);\n const baseKeys = Object.keys(base);\n baseKeys.forEach(function (key) {\n const item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n const hit = function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || '';\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = '#%#//';\n const UBO_SCRIPTLET_MARKER = '##+js';\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {\n }\n if (typeof window.__debug === 'function') {\n window.__debug(source);\n }\n };\n const matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === '' || propsToMatch === '*') {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n };\n const matchStackTrace = function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === '') {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split('\\n').slice(2)\n .map(function (line) {\n return line.trim();\n })\n .join('\\n');\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n };\n const throttle = function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n };\n const observeDOMChanges = function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n };\n const parseFlags = function parseFlags(flags) {\n const FLAGS_DIVIDER = ' ';\n const ASAP_FLAG = 'asap';\n const COMPLETE_FLAG = 'complete';\n const STAY_FLAG = 'stay';\n const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.indexOf(f) !== -1;\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.indexOf(flag) !== -1;\n }\n };\n };\n const parseKeywordValue = function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = '$now$';\n const CURRENT_DATE_KEYWORD = '$currentDate$';\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n };\n const hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) {\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || '*')) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n const attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n };\n function trustedClickElement$1(source, selectors) {\n let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n const OBSERVER_TIMEOUT_MS = 10000;\n const THROTTLE_DELAY_MS = 20;\n const STATIC_CLICK_DELAY_MS = 150;\n const COOKIE_MATCH_MARKER = 'cookie:';\n const LOCAL_STORAGE_MATCH_MARKER = 'localStorage:';\n const SELECTORS_DELIMITER = ',';\n const COOKIE_STRING_DELIMITER = ';';\n const EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n const sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n let parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n const message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n let canClick = !parsedDelay;\n const cookieMatches = [];\n const localStorageMatches = [];\n let isInvertedMatchCookie = false;\n let isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) {\n const _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, '');\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) {\n const _parseMatchArg2 = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = isInvertedMatch;\n const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, '');\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n const parsedCookies = parseCookieString(document.cookie);\n const cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n const keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n const keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n const shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n const localStorageMatched = localStorageMatches.every(function (str) {\n const itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === '';\n });\n const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!shouldRun) {\n return;\n }\n }\n let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n const createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n const elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n const clickElementsBySequence = async function clickElementsBySequence() {\n for (let i = 0; i < elementsSequence.length; i += 1) {\n const elementObj = elementsSequence[i];\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n if (!elementObj.element) {\n break;\n }\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n const allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n hit(source);\n }\n };\n const handleElement = function handleElement(element, i) {\n const elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n const findElements = function findElements(mutations, observer) {\n const fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n const element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.indexOf(selector) === -1 ? selector : null;\n });\n const allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n trustedClickElement$1.names = ['trusted-click-element'\n ];\n trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage, parseMatchArg];\n function abortOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyRead$1.names = ['abort-on-property-read',\n 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read'];\n abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n function abortOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyWrite$1.names = ['abort-on-property-write',\n 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write'];\n abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n function preventSetTimeout$1(source, matchCallback, matchDelay) {\n const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n preventSetTimeout$1.names = ['prevent-setTimeout',\n 'no-setTimeout-if.js',\n 'ubo-no-setTimeout-if.js', 'nostif.js',\n 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif',\n 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std'];\n preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n parseMatchArg, parseDelayArg, toRegExp, startsWith$1, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n function preventSetInterval$1(source, matchCallback, matchDelay) {\n const shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n preventSetInterval$1.names = ['prevent-setInterval',\n 'no-setInterval-if.js',\n 'ubo-no-setInterval-if.js', 'setInterval-defuser.js',\n 'ubo-setInterval-defuser.js', 'nosiif.js',\n 'ubo-nosiif.js', 'sid.js',\n 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid'];\n preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n toRegExp, startsWith$1, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n function preventWindowOpen$1(source) {\n let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*';\n let delay = arguments.length > 2 ? arguments[2] : undefined;\n let replacement = arguments.length > 3 ? arguments[3] : undefined;\n const nativeOpen = window.open;\n const isNewSyntax = match !== '0' && match !== '1';\n const oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n const searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n const newOpenWrapper = function newOpenWrapper(url) {\n const shouldLog = replacement && replacement.indexOf('log') > -1;\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n const argsStr = args && args.length > 0 ? \", \".concat(args.join(', ')) : '';\n const message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n let shouldPrevent = false;\n if (match === '*') {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n const parsedDelay = parseInt(delay, 10);\n let result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n const decoyArgs = {\n replacement,\n url,\n delay: parsedDelay\n };\n const decoy = createDecoy(decoyArgs);\n let popup = decoy.contentWindow;\n if (typeof popup === 'object' && popup !== null) {\n Object.defineProperty(popup, 'closed', {\n value: false\n });\n Object.defineProperty(popup, 'opener', {\n value: window\n });\n Object.defineProperty(popup, 'frameElement', {\n value: null\n });\n } else {\n const nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, 'contentWindow', {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n preventWindowOpen$1.names = ['prevent-window-open',\n 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif'];\n preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith$1, endsWith, substringBefore, substringAfter$1];\n function abortCurrentInlineScript$1(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const SRC_DATA_MARKER = 'data:text/javascript;base64,';\n const getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith$1(scriptEl.src, SRC_DATA_MARKER)) {\n const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n const props = property.split('.');\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n let origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortCurrentInlineScript$1.names = ['abort-current-inline-script',\n 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js',\n 'ubo-abort-current-script', 'ubo-acs',\n 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script'];\n abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith$1, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon];\n function setConstant$1(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const emptyArr = noopArray();\n const emptyObj = noopObject();\n let constantValue;\n if (value === 'undefined') {\n constantValue = undefined;\n } else if (value === 'false') {\n constantValue = false;\n } else if (value === 'true') {\n constantValue = true;\n } else if (value === 'null') {\n constantValue = null;\n } else if (value === 'emptyArr') {\n constantValue = emptyArr;\n } else if (value === 'emptyObj') {\n constantValue = emptyObj;\n } else if (value === 'noopFunc') {\n constantValue = noopFunc;\n } else if (value === 'noopCallbackFunc') {\n constantValue = noopCallbackFunc;\n } else if (value === 'trueFunc') {\n constantValue = trueFunc;\n } else if (value === 'falseFunc') {\n constantValue = falseFunc;\n } else if (value === 'throwFunc') {\n constantValue = throwFunc;\n } else if (value === 'noopPromiseResolve') {\n constantValue = noopPromiseResolve;\n } else if (value === 'noopPromiseReject') {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === '-1') {\n constantValue = -1;\n } else if (value === '') {\n constantValue = '';\n } else if (value === 'yes') {\n constantValue = 'yes';\n } else if (value === 'no') {\n constantValue = 'no';\n } else {\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n setConstant$1.names = ['set-constant',\n 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read'];\n setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest,\n shouldAbortInlineOrInjectedScript];\n function removeCookie$1(source, match) {\n const matchRegexp = toRegExp(match);\n const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n const cookieSpec = \"\".concat(cookieName, \"=\");\n const domain1 = \"; domain=\".concat(hostName);\n const domain2 = \"; domain=.\".concat(hostName);\n const path = '; path=/';\n const expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n const rmCookie = function rmCookie() {\n document.cookie.split(';').forEach(function (cookieStr) {\n const pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n const hostParts = document.location.hostname.split('.');\n for (let i = 0; i <= hostParts.length - 1; i += 1) {\n const hostName = hostParts.slice(i).join('.');\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener('beforeunload', rmCookie);\n }\n removeCookie$1.names = ['remove-cookie',\n 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover'];\n removeCookie$1.injections = [toRegExp, hit];\n function preventAddEventListener$1(source, typeSearch, listenerSearch) {\n const typeSearchRegexp = toRegExp(typeSearch);\n const listenerSearchRegexp = toRegExp(listenerSearch);\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n let shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n preventAddEventListener$1.names = ['prevent-addEventListener',\n 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld'];\n preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString];\n function preventBab$2(source) {\n const nativeSetTimeout = window.setTimeout;\n const babRegex = /\\.bab_elementid.$/;\n const timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== 'string' || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n const signatures = [['blockadblock'], ['babasbm'], [/getItem\\('babn'\\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']];\n const check = function check(str) {\n if (typeof str !== 'string') {\n return false;\n }\n for (let i = 0; i < signatures.length; i += 1) {\n const tokens = signatures[i];\n let match = 0;\n for (let j = 0; j < tokens.length; j += 1) {\n const token = tokens[j];\n const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1;\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= 0.8) {\n return true;\n }\n }\n return false;\n };\n const nativeEval = window.eval;\n const evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n const bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty('visibility');\n }\n const el = document.getElementById('babasbmsgx');\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n preventBab$2.names = ['prevent-bab'\n ];\n preventBab$2.injections = [hit];\n function nowebrtc$1(source) {\n let propertyName = '';\n if (window.RTCPeerConnection) {\n propertyName = 'RTCPeerConnection';\n } else if (window.webkitRTCPeerConnection) {\n propertyName = 'webkitRTCPeerConnection';\n }\n if (propertyName === '') {\n return;\n }\n const rtcReplacement = function rtcReplacement(config) {\n const message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n const rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n nowebrtc$1.names = ['nowebrtc',\n 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc'];\n nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString];\n function logAddEventListener$1(source) {\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n const message = \"addEventListener(\\\"\".concat(type, \"\\\", \").concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n }\n const message = \"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type), \"\\nlistener: \").concat(convertTypeToString(listener));\n logMessage(source, message, true);\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n logAddEventListener$1.names = ['log-addEventListener',\n 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell'];\n logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject, getObjectEntries];\n function logEval$1(source) {\n const nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, \"eval(\\\"\".concat(str, \"\\\")\"), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n const nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(', '), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n logEval$1.names = ['log-eval'];\n logEval$1.injections = [hit, logMessage];\n function log$1() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args);\n }\n log$1.names = ['log'];\n function noeval$1(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n noeval$1.names = ['noeval',\n 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval'];\n noeval$1.injections = [hit, logMessage];\n function preventEvalIf$1(source, search) {\n const searchRegexp = toRegExp(search);\n const nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n preventEvalIf$1.names = ['prevent-eval-if',\n 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if'];\n preventEvalIf$1.injections = [toRegExp, hit];\n function preventFab$1(source) {\n hit(source);\n const Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n const fab = new Fab();\n const getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n const getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) {\n window.FuckAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'FuckAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'BlockAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'SniffAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, 'fuckAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, 'blockAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, 'sniffAdBlock', getsetfab);\n }\n }\n preventFab$1.names = ['prevent-fab-3.2.0',\n 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab'];\n preventFab$1.injections = [hit, noopFunc, noopThis];\n function setPopadsDummy$1(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n setPopadsDummy$1.names = ['set-popads-dummy',\n 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy'];\n setPopadsDummy$1.injections = [hit];\n function preventPopadsNet$1(source) {\n const rid = randomId();\n const throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n preventPopadsNet$1.names = ['prevent-popads-net',\n 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net'];\n preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit];\n function preventAdfly$1(source) {\n const isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n const handler = function handler(encodedURL) {\n let evenChars = '';\n let oddChars = '';\n for (let i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n let data = (evenChars + oddChars).split('');\n for (let i = 0; i < data.length; i += 1) {\n if (isDigit(data[i])) {\n for (let ii = i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[i] = temp.toString();\n }\n i = ii;\n break;\n }\n }\n }\n }\n data = data.join('');\n const decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n let val;\n let applyHandler = true;\n const result = setPropertyAccess(window, 'ysmm', {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === 'string') {\n handler(value);\n }\n } catch (err) {}\n }\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, 'Failed to set up prevent-adfly scriptlet');\n }\n }\n preventAdfly$1.names = ['prevent-adfly',\n 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser'];\n preventAdfly$1.injections = [setPropertyAccess, hit, logMessage];\n function debugOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyRead$1.names = ['debug-on-property-read'];\n debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject];\n function debugOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyWrite$1.names = ['debug-on-property-write'];\n debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n function debugCurrentInlineScript$1(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger;\n }\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n const props = property.split('.');\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugCurrentInlineScript$1.names = ['debug-current-inline-script'];\n debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject];\n function removeAttr$1(source, attrs, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join('],['), \"]\");\n }\n const rmattr = function rmattr() {\n let nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n let removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const flags = parseFlags(applying);\n const run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.indexOf(' ') !== -1) {\n rmattr();\n }\n observeDOMChanges(rmattr, true);\n }\n }\n removeAttr$1.names = ['remove-attr',\n 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra'];\n removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage,\n throttle];\n function setAttr$1(source, selector, attr) {\n let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n if (!selector || !attr) {\n return;\n }\n const allowedValues = ['true', 'false'];\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n const setAttr = function setAttr() {\n const nodes = [].slice.call(document.querySelectorAll(selector));\n let set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n setAttr$1.names = ['set-attr'];\n setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN,\n throttle];\n function removeClass$1(source, classNames, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n let selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n const removeClassHandler = function removeClassHandler() {\n const nodes = new Set();\n if (selector) {\n let foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n const elements = document.querySelectorAll(s);\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n nodes.add(element);\n }\n });\n }\n let removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const CLASS_ATTR_NAME = ['class'];\n const flags = parseFlags(applying);\n const run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.indexOf(' ') !== -1) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n removeClass$1.names = ['remove-class',\n 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc'];\n removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags,\n throttle];\n function disableNewtabLinks$1(source) {\n document.addEventListener('click', function (ev) {\n let target = ev.target;\n while (target !== null) {\n if (target.localName === 'a' && target.hasAttribute('target')) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n disableNewtabLinks$1.names = ['disable-newtab-links',\n 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links'];\n disableNewtabLinks$1.injections = [hit];\n function adjustSetInterval$1(source, matchCallback, matchDelay, boost) {\n const nativeSetInterval = window.setInterval;\n const matchRegexp = toRegExp(matchCallback);\n const intervalWrapper = function intervalWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n adjustSetInterval$1.names = ['adjust-setInterval',\n 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib'];\n adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) {\n const nativeSetTimeout = window.setTimeout;\n const matchRegexp = toRegExp(matchCallback);\n const timeoutWrapper = function timeoutWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n adjustSetTimeout$1.names = ['adjust-setTimeout',\n 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb'];\n adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n function dirString$1(source, times) {\n const _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === 'function') {\n dir.call(this, object);\n }\n hit(source);\n }\n console.dir = dirWrapper;\n }\n dirString$1.names = ['dir-string', 'abp-dir-string'];\n dirString$1.injections = [hit];\n function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : [];\n const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : [];\n function isPruningNeeded(root) {\n if (!root) {\n return false;\n }\n let shouldProcess;\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n const rootString = JSON.stringify(root);\n const matchRegex = toRegExp(requiredPaths.join(''));\n const shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n for (let i = 0; i < requiredPaths.length; i += 1) {\n const requiredPath = requiredPaths[i];\n const lastNestedPropName = requiredPath.split('.').pop();\n const hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1;\n const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n shouldProcess = !hasWildcard;\n for (let i = 0; i < details.length; i += 1) {\n if (hasWildcard) {\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess;\n } else {\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess;\n }\n }\n }\n return shouldProcess;\n }\n const jsonPruner = function jsonPruner(root) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(root) === false) {\n return root;\n }\n prunePaths.forEach(function (path) {\n const ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n };\n const nativeJSONParse = JSON.parse;\n const jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n const root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(root);\n };\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n const nativeResponseJson = Response.prototype.json;\n const responseJsonWrapper = function responseJsonWrapper() {\n const promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(obj);\n });\n };\n if (typeof Response === 'undefined') {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n jsonPrune$1.names = ['json-prune',\n 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune'];\n jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage,\n toRegExp, getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n function preventRequestAnimationFrame$1(source, match) {\n const nativeRequestAnimationFrame = window.requestAnimationFrame;\n const shouldLog = typeof match === 'undefined';\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const rafWrapper = function rafWrapper(callback) {\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame',\n 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif'];\n preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage,\n escapeRegExp, toRegExp, startsWith$1];\n function setCookie$1(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n setCookie$1.names = ['set-cookie'];\n setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n function setCookieReload$1(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n setCookieReload$1.names = ['set-cookie-reload'];\n setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n function hideInShadowDom$1(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n const hideElement = function hideElement(targetElement) {\n const DISPLAY_NONE_CSS = 'display:none!important;';\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n const hideHandler = function hideHandler() {\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n while (hostElements.length !== 0) {\n let isHidden = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n hostElements = innerHosts;\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n hideInShadowDom$1.names = ['hide-in-shadow-dom'];\n hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n flatten, throttle];\n function removeInShadowDom$1(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n const removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n const removeHandler = function removeHandler() {\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n while (hostElements.length !== 0) {\n let isRemoved = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n hostElements = innerHosts;\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n removeInShadowDom$1.names = ['remove-in-shadow-dom'];\n removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n flatten, throttle];\n function preventFetch$1(source, propsToMatch) {\n let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj';\n let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default';\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n let strResponseBody;\n if (responseBody === '' || responseBody === 'emptyObj') {\n strResponseBody = '{}';\n } else if (responseBody === 'emptyArr') {\n strResponseBody = '[]';\n } else {\n return;\n }\n if (!(responseType === 'default' || responseType === 'opaque')) {\n logMessage(source, \"Invalid parameter: \".concat(responseType));\n return;\n }\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n let shouldPrevent = false;\n const fetchData = getFetchData(args);\n if (typeof propsToMatch === 'undefined') {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n preventFetch$1.names = ['prevent-fetch',\n 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if'];\n preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData];\n function setLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, validValue);\n hit(source);\n }\n setLocalStorageItem$1.names = ['set-local-storage-item'];\n setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue];\n function setSessionStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n sessionStorage = _window.sessionStorage;\n setStorageItem(source, sessionStorage, key, validValue);\n hit(source);\n }\n setSessionStorageItem$1.names = ['set-session-storage-item'];\n setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue];\n function abortOnStackTrace$1(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnStackTrace$1.names = ['abort-on-stack-trace',\n 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace'];\n abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith$1, shouldAbortInlineOrInjectedScript];\n function logOnStacktrace$1(source, property) {\n if (!property) {\n return;\n }\n const refineStackTrace = function refineStackTrace(stackString) {\n const stackSteps = stackString.split('\\n').slice(2).map(function (line) {\n return line.replace(/ {4}at /, '');\n });\n const logInfoArray = stackSteps.map(function (line) {\n let funcName;\n let funcFullPath;\n const reg = /\\(([^\\)]+)\\)/;\n const regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(' ').slice(0, -1).join(' ');\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split('@').slice(0, -1).join(' ');\n funcFullPath = line.match(regFirefox)[2];\n } else {\n funcName = 'function name is not available';\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n const logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let value = base[prop];\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n };\n setChainPropAccess(window, property);\n }\n logOnStacktrace$1.names = ['log-on-stack-trace'];\n logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject];\n function preventXHR$1(source, propsToMatch, customResponseText) {\n if (typeof Proxy === 'undefined') {\n return;\n }\n let response = '';\n let responseText = '';\n let responseUrl;\n const openWrapper = function openWrapper(target, thisArg, args) {\n const xhrData = {\n method: args[0],\n url: args[1]\n };\n responseUrl = xhrData.url;\n if (typeof propsToMatch === 'undefined') {\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === 'blob') {\n response = new Blob();\n }\n if (thisArg.responseType === 'arraybuffer') {\n response = new ArrayBuffer();\n }\n if (customResponseText) {\n const randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n responseText = randomText;\n } else {\n logMessage(source, \"Invalid range: \".concat(customResponseText));\n }\n }\n Object.defineProperties(thisArg, {\n readyState: {\n value: 4,\n writable: false\n },\n response: {\n value: response,\n writable: false\n },\n responseText: {\n value: responseText,\n writable: false\n },\n responseURL: {\n value: responseUrl,\n writable: false\n },\n responseXML: {\n value: '',\n writable: false\n },\n status: {\n value: 200,\n writable: false\n },\n statusText: {\n value: 'OK',\n writable: false\n }\n });\n setTimeout(function () {\n const stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n preventXHR$1.names = ['prevent-xhr',\n 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if'];\n preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength];\n function forceWindowClose$1(source) {\n let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n if (typeof window.close !== 'function') {\n const message = 'window.close() is not a function so \\'close-window\\' scriptlet is unavailable';\n logMessage(source, message);\n return;\n }\n const closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n logMessage(source, e);\n }\n };\n const closeByExtension = function closeByExtension() {\n const extCall = function extCall() {\n dispatchEvent(new Event('adguard:scriptlet-close-window'));\n };\n window.addEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n }, 5000);\n };\n const shouldClose = function shouldClose() {\n if (path === '') {\n return true;\n }\n const pathRegexp = toRegExp(path);\n const currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.indexOf('Chrome') > -1) {\n closeByExtension();\n }\n }\n }\n forceWindowClose$1.names = ['close-window', 'window-close-if.js', 'ubo-window-close-if.js', 'ubo-window-close-if'];\n forceWindowClose$1.injections = [hit, toRegExp, logMessage];\n function preventRefresh$1(source, delaySec) {\n const getMetaElements = function getMetaElements() {\n let metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n const getMetaContentDelay = function getMetaContentDelay(metaElements) {\n const delays = metaElements.map(function (meta) {\n const contentString = meta.getAttribute('content');\n if (contentString.length === 0) {\n return null;\n }\n let contentDelay;\n const limiterIndex = contentString.indexOf(';');\n if (limiterIndex !== -1) {\n const delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n if (!delays.length) {\n return null;\n }\n const minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n return minDelay;\n };\n const stop = function stop() {\n const metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n let secondsToRun = getNumberFromString(delaySec);\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n if (secondsToRun === null) {\n return;\n }\n const delayMs = secondsToRun * 1000;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n preventRefresh$1.names = ['prevent-refresh',\n 'refresh-defuser.js', 'refresh-defuser',\n 'ubo-refresh-defuser.js', 'ubo-refresh-defuser'];\n preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN];\n function preventElementSrcLoading$1(source, tagName, match) {\n if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n const srcMockData = {\n script: 'data:text/javascript;base64,KCk9Pnt9',\n img: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4='\n };\n let instance;\n if (tagName === 'script') {\n instance = HTMLScriptElement;\n } else if (tagName === 'img') {\n instance = HTMLImageElement;\n } else if (tagName === 'iframe') {\n instance = HTMLIFrameElement;\n } else {\n return;\n }\n const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function';\n let policy;\n if (hasTrustedTypes) {\n policy = window.trustedTypes.createPolicy('AGPolicy', {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n const SOURCE_PROPERTY_NAME = 'src';\n const ONERROR_PROPERTY_NAME = 'onerror';\n const searchRegexp = toRegExp(match);\n const setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, 'matched');\n };\n const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n const nodeName = thisArg.nodeName.toLowerCase();\n const attrName = args[0].toLowerCase();\n const attrValue = args[1];\n const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n const setAttributeHandler = {\n apply: setAttributeWrapper\n };\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n const nodeName = this.nodeName.toLowerCase();\n const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n if (policy && urlValue instanceof TrustedScriptURL) {\n const trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n const isMatched = this.getAttribute(source.name) === 'matched';\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n const eventName = args[0];\n const isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error';\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n }\n preventElementSrcLoading$1.names = ['prevent-element-src-loading'];\n preventElementSrcLoading$1.injections = [hit, toRegExp, safeGetDescriptor, noopFunc];\n function noTopics$1(source) {\n const TOPICS_PROPERTY_NAME = 'browsingTopics';\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve('[]');\n };\n hit(source);\n }\n noTopics$1.names = ['no-topics'];\n noTopics$1.injections = [hit, noopPromiseResolve];\n function trustedReplaceXhrResponse$1(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n if (typeof Proxy === 'undefined') {\n return;\n }\n if (pattern === '' && replacement !== '') {\n const message = 'Pattern argument should not be empty string.';\n logMessage(source, message);\n return;\n }\n const shouldLog = pattern === '' && replacement === '';\n const nativeOpen = window.XMLHttpRequest.prototype.open;\n const nativeSend = window.XMLHttpRequest.prototype.send;\n let xhrData;\n const openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n const message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n const setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n const forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n const readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n const content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n const patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedContent = content.replace(patternRegexp, replacement);\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState\n },\n response: {\n value: modifiedContent\n },\n responseText: {\n value: modifiedContent\n },\n responseURL: {\n value: responseURL\n },\n responseXML: {\n value: responseXML\n },\n status: {\n value: status\n },\n statusText: {\n value: statusText\n }\n });\n setTimeout(function () {\n const stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n const name = header[0];\n const value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response'\n ];\n trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries];\n function xmlPrune$1(source, propsToRemove) {\n var _this = this;\n let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let urlToMatch = arguments.length > 3 ? arguments[3] : undefined;\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n let shouldPruneResponse = true;\n if (!propsToRemove) {\n shouldPruneResponse = false;\n }\n const urlMatchRegexp = toRegExp(urlToMatch);\n const isXML = function isXML(text) {\n if (typeof text === 'string') {\n const trimedText = text.trim();\n if (trimedText.startsWith('<') && trimedText.endsWith('>')) {\n return true;\n }\n }\n return false;\n };\n const createXMLDocument = function createXMLDocument(text) {\n const xmlParser = new DOMParser();\n const xmlDocument = xmlParser.parseFromString(text, 'text/xml');\n return xmlDocument;\n };\n const pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n const xmlDoc = createXMLDocument(text);\n const errorNode = xmlDoc.querySelector('parsererror');\n if (errorNode) {\n return text;\n }\n if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n const elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n const serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== 'string' || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener('readystatechange', function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener('readystatechange', pruneResponse);\n if (!shouldPruneResponse) {\n if (isXML(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n const prunedResponseContent = pruneXML(response);\n if (shouldPruneResponse) {\n Object.defineProperty(thisArg, 'response', {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, 'responseText', {\n value: prunedResponseContent\n });\n hit(source);\n }\n shouldPruneResponse = true;\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n return nativeFetch.apply(_this, args).then(function (response) {\n return response.text().then(function (text) {\n if (!shouldPruneResponse) {\n if (isXML(text)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(text);\n logMessage(source, message);\n logMessage(source, createXMLDocument(text), true, false);\n }\n return Reflect.apply(target, thisArg, args);\n }\n const prunedText = pruneXML(text);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n shouldPruneResponse = true;\n return Reflect.apply(target, thisArg, args);\n });\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n xmlPrune$1.names = ['xml-prune',\n 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune'];\n xmlPrune$1.injections = [hit, logMessage, toRegExp];\n function m3uPrune$1(source, propsToRemove, urlToMatch) {\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n let shouldPruneResponse = false;\n const urlMatchRegexp = toRegExp(urlToMatch);\n const SEGMENT_MARKER = '#';\n const AD_MARKER = {\n ASSET: '#EXT-X-ASSET:',\n CUE: '#EXT-X-CUE:',\n CUE_IN: '#EXT-X-CUE-IN',\n DISCONTINUITY: '#EXT-X-DISCONTINUITY',\n EXTINF: '#EXTINF',\n EXTM3U: '#EXTM3U',\n SCTE35: '#EXT-X-SCTE35:'\n };\n const COMCAST_AD_MARKER = {\n AD: '-AD-',\n VAST: '-VAST-',\n VMAP_AD: '-VMAP-AD-',\n VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:'\n };\n const TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START'];\n const isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n let array = lines.slice();\n let index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array,\n index\n };\n };\n const pruneVmapBlock = function pruneVmapBlock(lines) {\n let array = lines.slice();\n for (let i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n const removeM3ULineRegexp = toRegExp(propsToRemove);\n const pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n const pruneSegments = function pruneSegments(lines) {\n for (let i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n const segmentName = lines[i].substring(0, lines[i].indexOf(':'));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (let j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n const isM3U = function isM3U(text) {\n if (typeof text === 'string') {\n const trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n const isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n const pruneM3U = function pruneM3U(text) {\n let lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join('\\n');\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === 'undefined') {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== 'undefined') {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join('\\n');\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== 'string' || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener('readystatechange', function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener('readystatechange', pruneResponse);\n if (!propsToRemove) {\n if (isM3U(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n if (shouldPruneResponse) {\n const prunedResponseContent = pruneM3U(response);\n Object.defineProperty(thisArg, 'response', {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, 'responseText', {\n value: prunedResponseContent\n });\n hit(source);\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n const response = await nativeFetch(...args);\n const responseText = await response.text();\n if (!propsToRemove && isM3U(responseText)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n const prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return Reflect.apply(target, thisArg, args);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n m3uPrune$1.names = ['m3u-prune',\n 'm3u-prune.js', 'ubo-m3u-prune.js', 'ubo-m3u-prune'];\n m3uPrune$1.injections = [hit, toRegExp, logMessage];\n function trustedSetCookie$1(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n trustedSetCookie$1.names = ['trusted-set-cookie'\n ];\n trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath];\n function trustedSetCookieReload$1(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n trustedSetCookieReload$1.names = ['trusted-set-cookie-reload'\n ];\n trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath];\n function trustedReplaceFetchResponse$1(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n if (pattern === '' && replacement !== '') {\n logMessage(source, 'Pattern argument should not be empty string');\n return;\n }\n const shouldLog = pattern === '' && replacement === '';\n const nativeFetch = fetch;\n let shouldReplace = false;\n let fetchData;\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n const forgeResponse = function forgeResponse(response, textContent) {\n const bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n const forgedResponse = new Response(textContent, {\n status,\n statusText,\n headers\n });\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n const patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n const forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n const fetchDataStr = objectToString(fetchData);\n const message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response'];\n trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData];\n function trustedSetLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Item value should be specified');\n return;\n }\n const parsedValue = parseKeywordValue(value);\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item'\n ];\n trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue];\n function trustedSetConstant$1(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n let constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n trustedSetConstant$1.names = ['trusted-set-constant'\n ];\n trustedSetConstant$1.injections = [hit, inferValue, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest,\n shouldAbortInlineOrInjectedScript];\n function injectCssInShadowDom$1(source, cssRule) {\n let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n if (!Element.prototype.attachShadow || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n const callback = function callback(shadowRoot) {\n try {\n const stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n const styleTag = document.createElement('style');\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n injectCssInShadowDom$1.names = ['inject-css-in-shadow-dom'];\n injectCssInShadowDom$1.injections = [hit, logMessage, hijackAttachShadow];\n var scriptletList = Object.freeze({\n __proto__: null,\n trustedClickElement: trustedClickElement$1,\n abortOnPropertyRead: abortOnPropertyRead$1,\n abortOnPropertyWrite: abortOnPropertyWrite$1,\n preventSetTimeout: preventSetTimeout$1,\n preventSetInterval: preventSetInterval$1,\n preventWindowOpen: preventWindowOpen$1,\n abortCurrentInlineScript: abortCurrentInlineScript$1,\n setConstant: setConstant$1,\n removeCookie: removeCookie$1,\n preventAddEventListener: preventAddEventListener$1,\n preventBab: preventBab$2,\n nowebrtc: nowebrtc$1,\n logAddEventListener: logAddEventListener$1,\n logEval: logEval$1,\n log: log$1,\n noeval: noeval$1,\n preventEvalIf: preventEvalIf$1,\n preventFab: preventFab$1,\n setPopadsDummy: setPopadsDummy$1,\n preventPopadsNet: preventPopadsNet$1,\n preventAdfly: preventAdfly$1,\n debugOnPropertyRead: debugOnPropertyRead$1,\n debugOnPropertyWrite: debugOnPropertyWrite$1,\n debugCurrentInlineScript: debugCurrentInlineScript$1,\n removeAttr: removeAttr$1,\n setAttr: setAttr$1,\n removeClass: removeClass$1,\n disableNewtabLinks: disableNewtabLinks$1,\n adjustSetInterval: adjustSetInterval$1,\n adjustSetTimeout: adjustSetTimeout$1,\n dirString: dirString$1,\n jsonPrune: jsonPrune$1,\n preventRequestAnimationFrame: preventRequestAnimationFrame$1,\n setCookie: setCookie$1,\n setCookieReload: setCookieReload$1,\n hideInShadowDom: hideInShadowDom$1,\n removeInShadowDom: removeInShadowDom$1,\n preventFetch: preventFetch$1,\n setLocalStorageItem: setLocalStorageItem$1,\n setSessionStorageItem: setSessionStorageItem$1,\n abortOnStackTrace: abortOnStackTrace$1,\n logOnStacktrace: logOnStacktrace$1,\n preventXHR: preventXHR$1,\n forceWindowClose: forceWindowClose$1,\n preventRefresh: preventRefresh$1,\n preventElementSrcLoading: preventElementSrcLoading$1,\n noTopics: noTopics$1,\n trustedReplaceXhrResponse: trustedReplaceXhrResponse$1,\n xmlPrune: xmlPrune$1,\n m3uPrune: m3uPrune$1,\n trustedSetCookie: trustedSetCookie$1,\n trustedSetCookieReload: trustedSetCookieReload$1,\n trustedReplaceFetchResponse: trustedReplaceFetchResponse$1,\n trustedSetLocalStorageItem: trustedSetLocalStorageItem$1,\n trustedSetConstant: trustedSetConstant$1,\n injectCssInShadowDom: injectCssInShadowDom$1\n });\n const redirects$1 = [{\n adg: '1x1-transparent.gif',\n ubo: '1x1.gif',\n abp: '1x1-transparent-gif'\n }, {\n adg: '2x2-transparent.png',\n ubo: '2x2.png',\n abp: '2x2-transparent-png'\n }, {\n adg: '3x2-transparent.png',\n ubo: '3x2.png',\n abp: '3x2-transparent-png'\n }, {\n adg: '32x32-transparent.png',\n ubo: '32x32.png',\n abp: '32x32-transparent-png'\n }, {\n adg: 'amazon-apstag',\n ubo: 'amazon_apstag.js'\n }, {\n adg: 'ati-smarttag'\n }, {\n adg: 'didomi-loader'\n }, {\n adg: 'click2load.html',\n ubo: 'click2load.html'\n }, {\n adg: 'fingerprintjs2',\n ubo: 'fingerprint2.js'\n }, {\n adg: 'fingerprintjs3',\n ubo: 'fingerprint3.js'\n }, {\n adg: 'google-analytics',\n ubo: 'google-analytics_analytics.js'\n }, {\n adg: 'google-analytics-ga',\n ubo: 'google-analytics_ga.js'\n }, {\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication_adsbygoogle.js'\n }, {\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication.com/adsbygoogle.js'\n }, {\n adg: 'googletagmanager-gtm',\n ubo: 'google-analytics_ga.js'\n }, {\n adg: 'googletagmanager-gtm',\n ubo: 'googletagmanager_gtm.js'\n }, {\n adg: 'googletagservices-gpt',\n ubo: 'googletagservices_gpt.js'\n }, {\n adg: 'google-ima3',\n ubo: 'google-ima.js'\n }, {\n adg: 'gemius'\n }, {\n adg: 'matomo'\n }, {\n adg: 'metrika-yandex-watch'\n }, {\n adg: 'metrika-yandex-tag'\n }, {\n adg: 'naver-wcslog'\n }, {\n adg: 'noeval',\n ubo: 'noeval-silent.js'\n }, {\n adg: 'noopcss',\n ubo: 'noop.css',\n abp: 'blank-css'\n }, {\n adg: 'noopframe',\n ubo: 'noop.html',\n abp: 'blank-html'\n }, {\n adg: 'noopjs',\n ubo: 'noop.js',\n abp: 'blank-js'\n }, {\n adg: 'noopjson'\n }, {\n adg: 'nooptext',\n ubo: 'noop.txt',\n abp: 'blank-text'\n }, {\n adg: 'noopmp3-0.1s',\n ubo: 'noop-0.1s.mp3',\n abp: 'blank-mp3'\n }, {\n adg: 'noopmp4-1s',\n ubo: 'noop-1s.mp4',\n abp: 'blank-mp4'\n }, {\n adg: 'noopvmap-1.0',\n ubo: 'noop-vmap1.0.xml'\n }, {\n adg: 'noopvast-2.0'\n }, {\n adg: 'noopvast-3.0'\n }, {\n adg: 'noopvast-4.0'\n }, {\n adg: 'prebid'\n }, {\n adg: 'pardot-1.0'\n }, {\n adg: 'prevent-bab',\n ubo: 'nobab.js'\n }, {\n adg: 'prevent-bab2',\n ubo: 'nobab2.js'\n }, {\n adg: 'prevent-fab-3.2.0',\n ubo: 'nofab.js'\n }, {\n adg: 'prevent-fab-3.2.0',\n ubo: 'fuckadblock.js-3.2.0'\n }, {\n adg: 'prevent-popads-net',\n ubo: 'popads.js'\n }, {\n adg: 'scorecardresearch-beacon',\n ubo: 'scorecardresearch_beacon.js'\n }, {\n adg: 'set-popads-dummy',\n ubo: 'popads-dummy.js'\n }, {\n adg: 'empty',\n ubo: 'empty'\n }, {\n adg: 'prebid-ads',\n ubo: 'prebid-ads.js'\n }];\n const JS_RULE_MARKER = '#%#';\n const COMMENT_MARKER = '!';\n const isComment = function isComment(rule) {\n return startsWith$1(rule, COMMENT_MARKER);\n };\n const UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\\s*\\+js/;\n const UBO_SCRIPTLET_MASK_1 = '##+js';\n const UBO_SCRIPTLET_MASK_2 = '##script:inject';\n const UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js';\n const UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject';\n const ABP_SCRIPTLET_MASK = '#$#';\n const ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#';\n const ADG_CSS_MASK_REG = /#@?\\$#.+?\\s*\\{.*\\}\\s*$/g;\n const isAdgScriptletRule = function isAdgScriptletRule(rule) {\n return !isComment(rule) && rule.indexOf(ADG_SCRIPTLET_MASK) > -1;\n };\n const isUboScriptletRule = function isUboScriptletRule(rule) {\n return (rule.indexOf(UBO_SCRIPTLET_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_MASK_2) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_2) > -1) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule);\n };\n const isAbpSnippetRule = function isAbpSnippetRule(rule) {\n return (rule.indexOf(ABP_SCRIPTLET_MASK) > -1 || rule.indexOf(ABP_SCRIPTLET_EXCEPTION_MASK) > -1) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule);\n };\n const getScriptletsObjList = function getScriptletsObjList() {\n return Object.values(scriptletList);\n };\n const getScriptletByName = function getScriptletByName(name, scriptlets) {\n if (!scriptlets) {\n scriptlets = getScriptletsObjList();\n }\n return scriptlets.find(function (s) {\n return s.names\n && (s.names.indexOf(name) > -1\n || !endsWith(name, '.js') && s.names.indexOf(\"\".concat(name, \".js\")) > -1);\n });\n };\n const scriptletObjects = getScriptletsObjList();\n const isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) {\n if (!name) {\n return false;\n }\n const scriptlet = getScriptletByName(name, scriptletObjects);\n if (!scriptlet) {\n return false;\n }\n return true;\n };\n const scriptletNameValidationCache = new Map();\n const isValidScriptletName = function isValidScriptletName(name) {\n if (!name) {\n return false;\n }\n if (!scriptletNameValidationCache.has(name)) {\n const isValid = isValidScriptletNameNotCached(name);\n scriptletNameValidationCache.set(name, isValid);\n return isValid;\n }\n return scriptletNameValidationCache.get(name);\n };\n const ADG_UBO_REDIRECT_MARKER = 'redirect=';\n const ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule=';\n const ABP_REDIRECT_MARKER = 'rewrite=abp-resource:';\n const EMPTY_REDIRECT_MARKER = 'empty';\n const VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other'];\n const ABSENT_SOURCE_TYPE_REPLACEMENT = [{\n NAME: 'nooptext',\n TYPES: VALID_SOURCE_TYPES\n }, {\n NAME: 'noopcss',\n TYPES: ['stylesheet']\n }, {\n NAME: 'noopjs',\n TYPES: ['script']\n }, {\n NAME: 'noopframe',\n TYPES: ['subdocument']\n }, {\n NAME: '1x1-transparent.gif',\n TYPES: ['image']\n }, {\n NAME: 'noopmp3-0.1s',\n TYPES: ['media']\n }, {\n NAME: 'noopmp4-1s',\n TYPES: ['media']\n }, {\n NAME: 'googlesyndication-adsbygoogle',\n TYPES: ['xmlhttprequest', 'script']\n }, {\n NAME: 'google-analytics',\n TYPES: ['script']\n }, {\n NAME: 'googletagservices-gpt',\n TYPES: ['script']\n }];\n const validAdgRedirects = redirects$1.filter(function (el) {\n return el.adg;\n });\n const uboToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) {\n return el.ubo;\n }).map(function (el) {\n return [el.ubo, el.adg];\n }));\n const abpToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) {\n return el.abp;\n }).map(function (el) {\n return [el.abp, el.adg];\n }));\n const adgToUboCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) {\n return el.ubo;\n }).map(function (el) {\n return [el.adg, el.ubo];\n }));\n const validAdgCompatibility = getObjectFromEntries(validAdgRedirects.map(function (el) {\n return [el.adg, 'valid adg redirect'];\n }));\n const REDIRECT_RULE_TYPES = {\n VALID_ADG: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER,\n compatibility: validAdgCompatibility\n },\n ADG: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER,\n compatibility: adgToUboCompatibility\n },\n UBO: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER,\n compatibility: uboToAdgCompatibility\n },\n ABP: {\n redirectMarker: ABP_REDIRECT_MARKER,\n compatibility: abpToAdgCompatibility\n }\n };\n const parseModifiers = function parseModifiers(rule) {\n return substringAfter$1(rule, '$').split(',');\n };\n const getRedirectName = function getRedirectName(rule, marker) {\n const ruleModifiers = parseModifiers(rule);\n const redirectNamePart = ruleModifiers.find(function (el) {\n return el.includes(marker);\n });\n return substringAfter$1(redirectNamePart, marker);\n };\n const isAdgRedirectRule = function isAdgRedirectRule(rule) {\n const MARKER_IN_BASE_PART_MASK = '/((?!\\\\$|\\\\,).{1})redirect((-rule)?)=(.{0,}?)\\\\$(popup)?/';\n return !isComment(rule) && (rule.includes(REDIRECT_RULE_TYPES.ADG.redirectMarker) || rule.includes(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker))\n && !rule.includes(JS_RULE_MARKER)\n && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule);\n };\n const isRedirectRuleByType = function isRedirectRuleByType(rule, type) {\n const _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[type],\n redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker,\n redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker,\n compatibility = _REDIRECT_RULE_TYPES$.compatibility;\n if (rule && !isComment(rule)) {\n let marker;\n let markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1;\n if (markerIndex > -1) {\n marker = redirectRuleMarker;\n } else {\n markerIndex = rule.indexOf(redirectMarker);\n if (markerIndex > -1) {\n marker = redirectMarker;\n } else {\n return false;\n }\n }\n const redirectName = getRedirectName(rule, marker);\n if (!redirectName) {\n return false;\n }\n return redirectName === Object.keys(compatibility).find(function (el) {\n return el === redirectName;\n });\n }\n return false;\n };\n const isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) {\n return isRedirectRuleByType(rule, 'VALID_ADG');\n };\n const isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) {\n return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, 'ADG');\n };\n const isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, 'UBO');\n };\n const isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, 'ABP');\n };\n const hasValidContentType = function hasValidContentType(rule) {\n const ruleModifiers = parseModifiers(rule);\n const sourceTypes = ruleModifiers.filter(function (el) {\n return VALID_SOURCE_TYPES.includes(el);\n });\n const isSourceTypeSpecified = sourceTypes.length > 0;\n const isEmptyRedirect = ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER));\n if (isEmptyRedirect) {\n return true;\n }\n return isSourceTypeSpecified;\n };\n const validator = {\n UBO_SCRIPTLET_MASK_REG,\n ABP_SCRIPTLET_MASK,\n ABP_SCRIPTLET_EXCEPTION_MASK,\n isComment,\n isAdgScriptletRule,\n isUboScriptletRule,\n isAbpSnippetRule,\n getScriptletByName,\n isValidScriptletName,\n ADG_UBO_REDIRECT_RULE_MARKER,\n REDIRECT_RULE_TYPES,\n ABSENT_SOURCE_TYPE_REPLACEMENT,\n isAdgRedirectRule,\n isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg,\n parseModifiers,\n getRedirectName,\n hasValidContentType\n };\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n var arrayWithHoles = _arrayWithHoles;\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n }\n var iterableToArray = _iterableToArray;\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n }\n var arrayLikeToArray = _arrayLikeToArray;\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n }\n var unsupportedIterableToArray = _unsupportedIterableToArray;\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n var nonIterableRest = _nonIterableRest;\n function _toArray(arr) {\n return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest();\n }\n var toArray$1 = _toArray;\n const ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\\/\\/scriptlet\\(.+\\)/;\n const ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})';\n const ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})';\n const UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})';\n const UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})';\n const UBO_ALIAS_NAME_MARKER = 'ubo-';\n const UBO_SCRIPTLET_JS_ENDING = '.js';\n const UBO_XHR_TYPE = 'xhr';\n const ADG_XHR_TYPE = 'xmlhttprequest';\n const ADG_SET_CONSTANT_NAME = 'set-constant';\n const ADG_SET_CONSTANT_EMPTY_STRING = '';\n const ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr';\n const ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj';\n const UBO_SET_CONSTANT_EMPTY_STRING = '\\'\\'';\n const UBO_SET_CONSTANT_EMPTY_ARRAY = '[]';\n const UBO_SET_CONSTANT_EMPTY_OBJECT = '{}';\n const ADG_PREVENT_FETCH_NAME = 'prevent-fetch';\n const ADG_PREVENT_FETCH_EMPTY_STRING = '';\n const ADG_PREVENT_FETCH_WILDCARD = '*';\n const UBO_NO_FETCH_IF_WILDCARD = '/^/';\n const ESCAPED_COMMA_SEPARATOR = '\\\\,';\n const COMMA_SEPARATOR = ',';\n const REMOVE_ATTR_METHOD = 'removeAttr';\n const REMOVE_CLASS_METHOD = 'removeClass';\n const REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names;\n const REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names;\n const ADG_REMOVE_ATTR_NAME = REMOVE_ATTR_ALIASES[0];\n const ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0];\n const REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete'];\n const getSentences = function getSentences(str) {\n const reg = /'.*?'|\".*?\"|\\S+/g;\n return str.match(reg);\n };\n const replacePlaceholders = function replacePlaceholders(str, data) {\n return Object.keys(data).reduce(function (acc, key) {\n const reg = new RegExp(\"\\\\$\\\\{\".concat(key, \"\\\\}\"), 'g');\n acc = acc.replace(reg, data[key]);\n return acc;\n }, str);\n };\n const splitArgs = function splitArgs(str) {\n const args = [];\n let prevArgStart = 0;\n for (let i = 0; i < str.length; i += 1) {\n if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\\\') {\n args.push(str.slice(prevArgStart, i).trim());\n prevArgStart = i + 1;\n }\n }\n args.push(str.slice(prevArgStart, str.length).trim());\n return args;\n };\n const validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) {\n const _parsedArgs = toArray$1(parsedArgs),\n name = _parsedArgs[0],\n value = _parsedArgs[1],\n restArgs = _parsedArgs.slice(2);\n if (restArgs.length === 0) {\n return [name, value];\n }\n const lastArg = restArgs.pop();\n let applying;\n if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) {\n return lastArg.indexOf(el) > -1;\n })) {\n applying = lastArg;\n } else {\n restArgs.push(lastArg);\n }\n const selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR);\n if (selector.length > 0 && typeof document !== 'undefined') {\n document.querySelectorAll(selector);\n }\n const validArgs = applying ? [name, value, selector, applying] : [name, value, selector];\n return validArgs;\n };\n const convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) {\n const domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG);\n const mask = rule.match(validator.UBO_SCRIPTLET_MASK_REG)[0];\n let template;\n if (mask.indexOf('@') > -1) {\n template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = ADGUARD_SCRIPTLET_TEMPLATE;\n }\n const argsStr = getStringInBraces(rule);\n let parsedArgs = splitArgs(argsStr);\n const scriptletName = parsedArgs[0].indexOf(UBO_SCRIPTLET_JS_ENDING) > -1 ? \"ubo-\".concat(parsedArgs[0]) : \"ubo-\".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING);\n if (REMOVE_ATTR_ALIASES.indexOf(scriptletName) > -1 || REMOVE_CLASS_ALIASES.indexOf(scriptletName) > -1) {\n parsedArgs = validateRemoveAttrClassArgs(parsedArgs);\n }\n const args = parsedArgs.map(function (arg, index) {\n let outputArg = arg;\n if (index === 0) {\n outputArg = scriptletName;\n }\n if (arg === '$') {\n outputArg = '$$';\n }\n return outputArg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n const adgRule = replacePlaceholders(template, {\n domains,\n args\n });\n return [adgRule];\n };\n const convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) {\n const SEMICOLON_DIVIDER = /;(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/g;\n const mask = rule.indexOf(validator.ABP_SCRIPTLET_MASK) > -1 ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK;\n const template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n const domains = substringBefore(rule, mask);\n const args = substringAfter$1(rule, mask);\n return args.split(SEMICOLON_DIVIDER)\n .filter(isExisting).map(function (args) {\n return getSentences(args).map(function (arg, index) {\n return index === 0 ? \"abp-\".concat(arg) : arg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n }).map(function (args) {\n return replacePlaceholders(template, {\n domains,\n args\n });\n });\n };\n const isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) {\n if (!adgRuleText) {\n return false;\n }\n if (!validator.isAdgScriptletRule(adgRuleText)) {\n return false;\n }\n let parsedRule;\n try {\n parsedRule = parseRule(adgRuleText);\n return validator.isValidScriptletName(parsedRule.name);\n } catch (e) {\n return false;\n }\n };\n const convertScriptletToAdg = function convertScriptletToAdg(rule) {\n let result;\n if (validator.isUboScriptletRule(rule)) {\n result = convertUboScriptletToAdg(rule);\n } else if (validator.isAbpSnippetRule(rule)) {\n result = convertAbpSnippetToAdg(rule);\n } else if (validator.isAdgScriptletRule(rule)) {\n if (isValidAdgScriptletRuleSyntax(rule)) {\n result = [rule];\n } else {\n console.log(\"Invalid AdGuard scriptlet rule: \".concat(rule));\n result = [];\n }\n } else if (validator.isComment(rule)) {\n result = [rule];\n }\n return result;\n };\n const convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) {\n let res;\n if (validator.isAdgScriptletRule(rule)) {\n const _parseRule = parseRule(rule),\n parsedName = _parseRule.name,\n parsedParams = _parseRule.args;\n let preparedParams;\n if (parsedName === ADG_SET_CONSTANT_NAME\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING];\n } else if (parsedName === ADG_SET_CONSTANT_NAME\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY];\n } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT];\n } else if (parsedName === ADG_PREVENT_FETCH_NAME\n && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) {\n preparedParams = [UBO_NO_FETCH_IF_WILDCARD];\n } else if ((parsedName === ADG_REMOVE_ATTR_NAME || parsedName === ADG_REMOVE_CLASS_NAME) && parsedParams[1] && parsedParams[1].indexOf(COMMA_SEPARATOR) > -1) {\n preparedParams = [parsedParams[0], replaceAll(parsedParams[1], COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR)];\n } else {\n preparedParams = parsedParams;\n }\n const adgScriptletObject = Object.keys(scriptletList).map(function (el) {\n return scriptletList[el];\n }).map(function (s) {\n const _s$names = toArray$1(s.names),\n name = _s$names[0],\n aliases = _s$names.slice(1);\n return {\n name,\n aliases\n };\n }).find(function (el) {\n return el.name === parsedName || el.aliases.indexOf(parsedName) >= 0;\n });\n const aliases = adgScriptletObject.aliases;\n if (aliases.length > 0) {\n const uboAlias = adgScriptletObject.aliases\n .find(function (alias) {\n return alias.includes(UBO_ALIAS_NAME_MARKER);\n });\n if (uboAlias) {\n const mask = rule.match(ADGUARD_SCRIPTLET_MASK_REG)[0];\n let template;\n if (mask.indexOf('@') > -1) {\n template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = UBO_SCRIPTLET_TEMPLATE;\n }\n const domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG);\n const uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '')\n .replace(UBO_SCRIPTLET_JS_ENDING, '');\n const args = preparedParams.length > 0 ? \"\".concat(uboName, \", \").concat(preparedParams.join(\"\".concat(COMMA_SEPARATOR, \" \"))) : uboName;\n const uboRule = replacePlaceholders(template, {\n domains,\n args\n });\n res = uboRule;\n }\n }\n }\n return res;\n };\n const getAdgScriptletName = function getAdgScriptletName(rule) {\n let buffer = substringAfter$1(rule, \"\".concat(ADG_SCRIPTLET_MASK, \"(\"));\n if (!buffer) {\n return null;\n }\n const nameQuote = buffer[0];\n buffer = buffer.slice(1);\n if (!buffer) {\n return null;\n }\n const name = substringBefore(buffer, nameQuote);\n return name === buffer ? null : name;\n };\n const isValidScriptletRule = function isValidScriptletRule(ruleText) {\n if (!ruleText) {\n return false;\n }\n const rulesArray = convertScriptletToAdg(ruleText);\n if (rulesArray.length === 0) {\n return false;\n }\n const isValid = rulesArray.every(function (rule) {\n const name = getAdgScriptletName(rule);\n return validator.isValidScriptletName(name);\n });\n return isValid;\n };\n const getMarkerData = function getMarkerData(modifiers, redirectsData, rule) {\n let marker;\n let index = modifiers.findIndex(function (m) {\n return m.indexOf(redirectsData.redirectRuleMarker) > -1;\n });\n if (index > -1) {\n marker = redirectsData.redirectRuleMarker;\n } else {\n index = modifiers.findIndex(function (m) {\n return m.indexOf(redirectsData.redirectMarker) > -1;\n });\n if (index > -1) {\n marker = redirectsData.redirectMarker;\n } else {\n throw new Error(\"No redirect resource modifier found in rule: \".concat(rule));\n }\n }\n return {\n index,\n marker\n };\n };\n const convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) {\n const firstPartOfRule = substringBefore(rule, '$');\n const uboModifiers = validator.parseModifiers(rule);\n const uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule);\n const adgModifiers = uboModifiers.map(function (modifier, index) {\n if (index === uboMarkerData.index) {\n const uboName = substringAfter$1(modifier, uboMarkerData.marker);\n const adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName];\n const adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker;\n return \"\".concat(adgMarker).concat(adgName);\n }\n if (modifier === UBO_XHR_TYPE) {\n return ADG_XHR_TYPE;\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n const convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) {\n const firstPartOfRule = substringBefore(rule, '$');\n const abpModifiers = validator.parseModifiers(rule);\n const adgModifiers = abpModifiers.map(function (modifier) {\n if (modifier.indexOf(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker) > -1) {\n const abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker);\n const adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName];\n return \"\".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName);\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n const convertRedirectToAdg = function convertRedirectToAdg(rule) {\n let result;\n if (validator.isUboRedirectCompatibleWithAdg(rule)) {\n result = convertUboRedirectToAdg(rule);\n } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) {\n result = convertAbpRedirectToAdg(rule);\n } else if (validator.isValidAdgRedirectRule(rule)) {\n result = rule;\n }\n return result;\n };\n const convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) {\n if (!validator.isAdgRedirectCompatibleWithUbo(rule)) {\n throw new Error(\"Unable to convert for uBO - unsupported redirect in rule: \".concat(rule));\n }\n const basePart = substringBefore(rule, '$');\n const adgModifiers = validator.parseModifiers(rule);\n const adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule);\n const adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length);\n if (!validator.hasValidContentType(rule)) {\n const sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) {\n return el.NAME === adgRedirectName;\n });\n if (typeof sourceTypesData === 'undefined') {\n throw new Error(\"Unable to convert for uBO - no types to add for specific redirect in rule: \".concat(rule));\n }\n const additionModifiers = sourceTypesData.TYPES;\n adgModifiers.push(...additionModifiers);\n }\n const uboModifiers = adgModifiers.map(function (el, index) {\n if (index === adgMarkerData.index) {\n const uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker;\n const uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName];\n return \"\".concat(uboMarker).concat(uboRedirectName);\n }\n return el;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(basePart, \"$\").concat(uboModifiers);\n };\n function GoogleAnalytics(source) {\n const Tracker = function Tracker() {};\n const proto = Tracker.prototype;\n proto.get = noopFunc;\n proto.set = noopFunc;\n proto.send = noopFunc;\n const googleAnalyticsName = window.GoogleAnalyticsObject || 'ga';\n function ga(a) {\n const len = arguments.length;\n if (len === 0) {\n return;\n }\n const lastArg = arguments[len - 1];\n let replacer;\n if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') {\n replacer = lastArg.hitCallback;\n } else if (typeof lastArg === 'function') {\n replacer = function replacer() {\n lastArg(ga.create());\n };\n }\n try {\n setTimeout(replacer, 1);\n } catch (ex) {}\n }\n ga.create = function () {\n return new Tracker();\n };\n ga.getByName = function () {\n return new Tracker();\n };\n ga.getAll = function () {\n return [new Tracker()];\n };\n ga.remove = noopFunc;\n ga.loaded = true;\n window[googleAnalyticsName] = ga;\n const _window = window,\n dataLayer = _window.dataLayer,\n google_optimize = _window.google_optimize;\n if (dataLayer instanceof Object === false) {\n return;\n }\n if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') {\n dataLayer.hide.end();\n }\n const handleCallback = function handleCallback(dataObj, funcName) {\n if (dataObj && typeof dataObj[funcName] === 'function') {\n setTimeout(dataObj[funcName]);\n }\n };\n if (typeof dataLayer.push === 'function') {\n dataLayer.push = function (data) {\n if (data instanceof Object) {\n handleCallback(data, 'eventCallback');\n for (const key in data) {\n handleCallback(data[key], 'event_callback');\n }\n if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) {\n [].push.call(window.dataLayer, data);\n }\n }\n if (Array.isArray(data)) {\n data.forEach(function (arg) {\n handleCallback(arg, 'callback');\n });\n }\n return noopFunc;\n };\n }\n if (google_optimize instanceof Object && typeof google_optimize.get === 'function') {\n const googleOptimizeWrapper = {\n get: noopFunc\n };\n window.google_optimize = googleOptimizeWrapper;\n }\n hit(source);\n }\n GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js',\n 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js'];\n GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray];\n function GoogleAnalyticsGa(source) {\n function Gaq() {}\n Gaq.prototype.Na = noopFunc;\n Gaq.prototype.O = noopFunc;\n Gaq.prototype.Sa = noopFunc;\n Gaq.prototype.Ta = noopFunc;\n Gaq.prototype.Va = noopFunc;\n Gaq.prototype._createAsyncTracker = noopFunc;\n Gaq.prototype._getAsyncTracker = noopFunc;\n Gaq.prototype._getPlugin = noopFunc;\n Gaq.prototype.push = function (data) {\n if (typeof data === 'function') {\n data();\n return;\n }\n if (Array.isArray(data) === false) {\n return;\n }\n if (typeof data[0] === 'string' && /(^|\\.)_link$/.test(data[0]) && typeof data[1] === 'string') {\n window.location.assign(data[1]);\n }\n if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') {\n data[2]();\n }\n };\n const gaq = new Gaq();\n const asyncTrackers = window._gaq || [];\n if (Array.isArray(asyncTrackers)) {\n while (asyncTrackers[0]) {\n gaq.push(asyncTrackers.shift());\n }\n }\n window._gaq = gaq.qf = gaq;\n function Gat() {}\n const api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode'];\n const tracker = api.reduce(function (res, funcName) {\n res[funcName] = noopFunc;\n return res;\n }, {});\n tracker._getLinkerUrl = function (a) {\n return a;\n };\n tracker._link = function (url) {\n if (typeof url !== 'string') {\n return;\n }\n try {\n window.location.assign(url);\n } catch (e) {\n logMessage(source, e);\n }\n };\n Gat.prototype._anonymizeIP = noopFunc;\n Gat.prototype._createTracker = noopFunc;\n Gat.prototype._forceSSL = noopFunc;\n Gat.prototype._getPlugin = noopFunc;\n Gat.prototype._getTracker = function () {\n return tracker;\n };\n Gat.prototype._getTrackerByName = function () {\n return tracker;\n };\n Gat.prototype._getTrackers = noopFunc;\n Gat.prototype.aa = noopFunc;\n Gat.prototype.ab = noopFunc;\n Gat.prototype.hb = noopFunc;\n Gat.prototype.la = noopFunc;\n Gat.prototype.oa = noopFunc;\n Gat.prototype.pa = noopFunc;\n Gat.prototype.u = noopFunc;\n const gat = new Gat();\n window._gat = gat;\n hit(source);\n }\n GoogleAnalyticsGa.names = ['google-analytics-ga', 'ubo-google-analytics_ga.js', 'google-analytics_ga.js'];\n GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage];\n function GoogleSyndicationAdsByGoogle(source) {\n window.adsbygoogle = {\n loaded: true,\n push(arg) {\n if (typeof this.length === 'undefined') {\n this.length = 0;\n this.length += 1;\n }\n if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') {\n for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) {\n const key = _Object$keys[_i];\n if (typeof arg[key] === 'function') {\n try {\n arg[key].call(this, {});\n } catch (_unused) {\n }\n }\n }\n }\n }\n };\n const adElems = document.querySelectorAll('.adsbygoogle');\n const css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;';\n const statusAttrName = 'data-adsbygoogle-status';\n const ASWIFT_IFRAME_MARKER = 'aswift_';\n const GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_';\n let executed = false;\n for (let i = 0; i < adElems.length; i += 1) {\n const adElemChildNodes = adElems[i].childNodes;\n const childNodesQuantity = adElemChildNodes.length;\n let areIframesDefined = false;\n if (childNodesQuantity > 0) {\n areIframesDefined = childNodesQuantity === 2\n && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1\n && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.indexOf(GOOGLE_ADS_IFRAME_MARKER) > -1;\n }\n if (!areIframesDefined) {\n adElems[i].setAttribute(statusAttrName, 'done');\n const aswiftIframe = document.createElement('iframe');\n aswiftIframe.id = \"\".concat(ASWIFT_IFRAME_MARKER).concat(i);\n aswiftIframe.style = css;\n adElems[i].appendChild(aswiftIframe);\n const innerAswiftIframe = document.createElement('iframe');\n aswiftIframe.contentWindow.document.body.appendChild(innerAswiftIframe);\n const googleadsIframe = document.createElement('iframe');\n googleadsIframe.id = \"\".concat(GOOGLE_ADS_IFRAME_MARKER).concat(i);\n googleadsIframe.style = css;\n adElems[i].appendChild(googleadsIframe);\n const innerGoogleadsIframe = document.createElement('iframe');\n googleadsIframe.contentWindow.document.body.appendChild(innerGoogleadsIframe);\n executed = true;\n }\n }\n if (executed) {\n hit(source);\n }\n }\n GoogleSyndicationAdsByGoogle.names = ['googlesyndication-adsbygoogle', 'ubo-googlesyndication_adsbygoogle.js', 'googlesyndication_adsbygoogle.js'];\n GoogleSyndicationAdsByGoogle.injections = [hit];\n function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n var iterableToArrayLimit = _iterableToArrayLimit;\n function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n }\n var slicedToArray = _slicedToArray;\n function GoogleTagServicesGpt(source) {\n const slots = new Map();\n const slotsById = new Map();\n const slotsPerPath = new Map();\n const slotCreatives = new Map();\n const eventCallbacks = new Map();\n const gTargeting = new Map();\n const addEventListener = function addEventListener(name, listener) {\n if (!eventCallbacks.has(name)) {\n eventCallbacks.set(name, new Set());\n }\n eventCallbacks.get(name).add(listener);\n return this;\n };\n const removeEventListener = function removeEventListener(name, listener) {\n if (eventCallbacks.has(name)) {\n return eventCallbacks.get(name).delete(listener);\n }\n return false;\n };\n const fireSlotEvent = function fireSlotEvent(name, slot) {\n return new Promise(function (resolve) {\n requestAnimationFrame(function () {\n const size = [0, 0];\n const callbacksSet = eventCallbacks.get(name) || [];\n const callbackArray = Array.from(callbacksSet);\n for (let i = 0; i < callbackArray.length; i += 1) {\n callbackArray[i]({\n isEmpty: true,\n size,\n slot\n });\n }\n resolve();\n });\n });\n };\n const emptySlotElement = function emptySlotElement(slot) {\n const node = document.getElementById(slot.getSlotElementId());\n while (node !== null && node !== void 0 && node.lastChild) {\n node.lastChild.remove();\n }\n };\n const recreateIframeForSlot = function recreateIframeForSlot(slot) {\n var _document$getElementB;\n const eid = \"google_ads_iframe_\".concat(slot.getId());\n (_document$getElementB = document.getElementById(eid)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();\n const node = document.getElementById(slot.getSlotElementId());\n if (node) {\n const f = document.createElement('iframe');\n f.id = eid;\n f.srcdoc = '';\n f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0';\n f.setAttribute('width', 0);\n f.setAttribute('height', 0);\n f.setAttribute('data-load-complete', true);\n f.setAttribute('data-google-container-id', true);\n f.setAttribute('sandbox', true);\n node.appendChild(f);\n }\n };\n const displaySlot = function displaySlot(slot) {\n if (!slot) {\n return;\n }\n const id = slot.getSlotElementId();\n if (!document.getElementById(id)) {\n return;\n }\n const parent = document.getElementById(id);\n if (parent) {\n parent.appendChild(document.createElement('div'));\n }\n emptySlotElement(slot);\n recreateIframeForSlot(slot);\n fireSlotEvent('slotRenderEnded', slot);\n fireSlotEvent('slotRequested', slot);\n fireSlotEvent('slotResponseReceived', slot);\n fireSlotEvent('slotOnload', slot);\n fireSlotEvent('impressionViewable', slot);\n };\n const companionAdsService = {\n addEventListener,\n removeEventListener,\n enableSyncLoading: noopFunc,\n setRefreshUnfilledSlots: noopFunc,\n getSlots: noopArray\n };\n const contentService = {\n addEventListener,\n removeEventListener,\n setContent: noopFunc\n };\n function PassbackSlot() {}\n PassbackSlot.prototype.display = noopFunc;\n PassbackSlot.prototype.get = noopNull;\n PassbackSlot.prototype.set = noopThis;\n PassbackSlot.prototype.setClickUrl = noopThis;\n PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis;\n PassbackSlot.prototype.setTargeting = noopThis;\n PassbackSlot.prototype.updateTargetingFromMap = noopThis;\n function SizeMappingBuilder() {}\n SizeMappingBuilder.prototype.addSize = noopThis;\n SizeMappingBuilder.prototype.build = noopNull;\n const getTargetingValue = function getTargetingValue(v) {\n if (typeof v === 'string') {\n return [v];\n }\n try {\n return [Array.prototype.flat.call(v)[0]];\n } catch (_unused) {\n }\n return [];\n };\n const updateTargeting = function updateTargeting(targeting, map) {\n if (typeof map === 'object') {\n const entries = Object.entries(map || {});\n for (var _i = 0, _entries = entries; _i < _entries.length; _i++) {\n const _entries$_i = slicedToArray(_entries[_i], 2),\n k = _entries$_i[0],\n v = _entries$_i[1];\n targeting.set(k, getTargetingValue(v));\n }\n }\n };\n const defineSlot = function defineSlot(adUnitPath, creatives, optDiv) {\n if (slotsById.has(optDiv)) {\n var _document$getElementB2;\n (_document$getElementB2 = document.getElementById(optDiv)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.remove();\n return slotsById.get(optDiv);\n }\n const attributes = new Map();\n const targeting = new Map();\n const exclusions = new Set();\n const response = {\n advertiserId: undefined,\n campaignId: undefined,\n creativeId: undefined,\n creativeTemplateId: undefined,\n lineItemId: undefined\n };\n const sizes = [{\n getHeight: function getHeight() {\n return 2;\n },\n getWidth: function getWidth() {\n return 2;\n }\n }];\n const num = (slotsPerPath.get(adUnitPath) || 0) + 1;\n slotsPerPath.set(adUnitPath, num);\n const id = \"\".concat(adUnitPath, \"_\").concat(num);\n let clickUrl = '';\n let collapseEmptyDiv = null;\n const services = new Set();\n const slot = {\n addService(e) {\n services.add(e);\n return slot;\n },\n clearCategoryExclusions: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n targeting.clear();\n } else {\n targeting.delete(k);\n }\n },\n defineSizeMapping(mapping) {\n slotCreatives.set(optDiv, mapping);\n return this;\n },\n get: function get(k) {\n return attributes.get(k);\n },\n getAdUnitPath: function getAdUnitPath() {\n return adUnitPath;\n },\n getAttributeKeys: function getAttributeKeys() {\n return Array.from(attributes.keys());\n },\n getCategoryExclusions: function getCategoryExclusions() {\n return Array.from(exclusions);\n },\n getClickUrl: function getClickUrl() {\n return clickUrl;\n },\n getCollapseEmptyDiv: function getCollapseEmptyDiv() {\n return collapseEmptyDiv;\n },\n getContentUrl: function getContentUrl() {\n return '';\n },\n getDivStartsCollapsed: function getDivStartsCollapsed() {\n return null;\n },\n getDomId: function getDomId() {\n return optDiv;\n },\n getEscapedQemQueryId: function getEscapedQemQueryId() {\n return '';\n },\n getFirstLook: function getFirstLook() {\n return 0;\n },\n getId: function getId() {\n return id;\n },\n getHtml: function getHtml() {\n return '';\n },\n getName: function getName() {\n return id;\n },\n getOutOfPage: function getOutOfPage() {\n return false;\n },\n getResponseInformation: function getResponseInformation() {\n return response;\n },\n getServices: function getServices() {\n return Array.from(services);\n },\n getSizes: function getSizes() {\n return sizes;\n },\n getSlotElementId: function getSlotElementId() {\n return optDiv;\n },\n getSlotId: function getSlotId() {\n return slot;\n },\n getTargeting: function getTargeting(k) {\n return targeting.get(k) || gTargeting.get(k) || [];\n },\n getTargetingKeys: function getTargetingKeys() {\n return Array.from(new Set(Array.of(...gTargeting.keys(), ...targeting.keys())));\n },\n getTargetingMap: function getTargetingMap() {\n return Object.assign(Object.fromEntries(gTargeting.entries()), Object.fromEntries(targeting.entries()));\n },\n set(k, v) {\n attributes.set(k, v);\n return slot;\n },\n setCategoryExclusion(e) {\n exclusions.add(e);\n return slot;\n },\n setClickUrl(u) {\n clickUrl = u;\n return slot;\n },\n setCollapseEmptyDiv(v) {\n collapseEmptyDiv = !!v;\n return slot;\n },\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting(k, v) {\n targeting.set(k, getTargetingValue(v));\n return slot;\n },\n toString: function toString() {\n return id;\n },\n updateTargetingFromMap(map) {\n updateTargeting(targeting, map);\n return slot;\n }\n };\n slots.set(adUnitPath, slot);\n slotsById.set(optDiv, slot);\n slotCreatives.set(optDiv, creatives);\n return slot;\n };\n const pubAdsService = {\n addEventListener,\n removeEventListener,\n clear: noopFunc,\n clearCategoryExclusions: noopThis,\n clearTagForChildDirectedTreatment: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n gTargeting.clear();\n } else {\n gTargeting.delete(k);\n }\n },\n collapseEmptyDivs: noopFunc,\n defineOutOfPagePassback() {\n return new PassbackSlot();\n },\n definePassback() {\n return new PassbackSlot();\n },\n disableInitialLoad: noopFunc,\n display: noopFunc,\n enableAsyncRendering: noopFunc,\n enableLazyLoad: noopFunc,\n enableSingleRequest: noopFunc,\n enableSyncRendering: noopFunc,\n enableVideoAds: noopFunc,\n get: noopNull,\n getAttributeKeys: noopArray,\n getTargeting: noopArray,\n getTargetingKeys: noopArray,\n getSlots: noopArray,\n isInitialLoadDisabled: trueFunc,\n refresh: noopFunc,\n set: noopThis,\n setCategoryExclusion: noopThis,\n setCentering: noopFunc,\n setCookieOptions: noopThis,\n setForceSafeFrame: noopThis,\n setLocation: noopThis,\n setPublisherProvidedId: noopThis,\n setRequestNonPersonalizedAds: noopThis,\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting: noopThis,\n setVideoContent: noopThis,\n updateCorrelator: noopFunc\n };\n const _window = window,\n _window$googletag = _window.googletag,\n googletag = _window$googletag === void 0 ? {} : _window$googletag;\n const _googletag$cmd = googletag.cmd,\n cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd;\n googletag.apiReady = true;\n googletag.cmd = [];\n googletag.cmd.push = function (a) {\n try {\n a();\n } catch (ex) {}\n return 1;\n };\n googletag.companionAds = function () {\n return companionAdsService;\n };\n googletag.content = function () {\n return contentService;\n };\n googletag.defineOutOfPageSlot = defineSlot;\n googletag.defineSlot = defineSlot;\n googletag.destroySlots = function () {\n slots.clear();\n slotsById.clear();\n };\n googletag.disablePublisherConsole = noopFunc;\n googletag.display = function (arg) {\n let id;\n if (arg !== null && arg !== void 0 && arg.getSlotElementId) {\n id = arg.getSlotElementId();\n } else if (arg !== null && arg !== void 0 && arg.nodeType) {\n id = arg.id;\n } else {\n id = String(arg);\n }\n displaySlot(slotsById.get(id));\n };\n googletag.enableServices = noopFunc;\n googletag.getVersion = noopStr;\n googletag.pubads = function () {\n return pubAdsService;\n };\n googletag.pubadsReady = true;\n googletag.setAdIframeTitle = noopFunc;\n googletag.sizeMapping = function () {\n return new SizeMappingBuilder();\n };\n window.googletag = googletag;\n while (cmd.length !== 0) {\n googletag.cmd.push(cmd.shift());\n }\n hit(source);\n }\n GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js'];\n GoogleTagServicesGpt.injections = [hit, noopFunc, noopThis, noopNull, noopArray, noopStr, trueFunc];\n function ScoreCardResearchBeacon(source) {\n window.COMSCORE = {\n purge() {\n window._comscore = [];\n },\n beacon() {}\n };\n hit(source);\n }\n ScoreCardResearchBeacon.names = ['scorecardresearch-beacon', 'ubo-scorecardresearch_beacon.js', 'scorecardresearch_beacon.js'];\n ScoreCardResearchBeacon.injections = [hit];\n function metrikaYandexTag(source) {\n const asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let callback = options.callback;\n const ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n const addFileExtension = noopFunc;\n const extLink = asyncCallbackFromOptions;\n const file = asyncCallbackFromOptions;\n const getClientID = function getClientID(id, cb) {\n if (!cb) {\n return;\n }\n setTimeout(cb(null));\n };\n const hitFunc = asyncCallbackFromOptions;\n const notBounce = asyncCallbackFromOptions;\n const params = noopFunc;\n const reachGoal = function reachGoal(id, target, params, callback, ctx) {\n asyncCallbackFromOptions(null, null, {\n callback,\n ctx\n });\n };\n const setUserID = noopFunc;\n const userParams = noopFunc;\n const destruct = noopFunc;\n const api = {\n addFileExtension,\n extLink,\n file,\n getClientID,\n hit: hitFunc,\n notBounce,\n params,\n reachGoal,\n setUserID,\n userParams,\n destruct\n };\n function ym(id, funcName) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return api[funcName] && api[funcName](id, ...args);\n }\n function init(id) {\n window[\"yaCounter\".concat(id)] = api;\n document.dispatchEvent(new Event(\"yacounter\".concat(id, \"inited\")));\n }\n if (typeof window.ym === 'undefined') {\n window.ym = ym;\n ym.a = [];\n } else if (window.ym && window.ym.a) {\n ym.a = window.ym.a;\n window.ym = ym;\n window.ym.a.forEach(function (params) {\n const id = params[0];\n init(id);\n });\n }\n hit(source);\n }\n metrikaYandexTag.names = ['metrika-yandex-tag'];\n metrikaYandexTag.injections = [hit, noopFunc];\n function metrikaYandexWatch(source) {\n const cbName = 'yandex_metrika_callbacks';\n const asyncCallbackFromOptions = function asyncCallbackFromOptions() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = options.callback;\n const ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n function Metrika() {}\n Metrika.counters = noopArray;\n Metrika.prototype.addFileExtension = noopFunc;\n Metrika.prototype.getClientID = noopFunc;\n Metrika.prototype.setUserID = noopFunc;\n Metrika.prototype.userParams = noopFunc;\n Metrika.prototype.params = noopFunc;\n Metrika.prototype.counters = noopArray;\n Metrika.prototype.extLink = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.file = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.hit = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.reachGoal = function (target, params, cb, ctx) {\n asyncCallbackFromOptions({\n callback: cb,\n ctx\n });\n };\n Metrika.prototype.notBounce = asyncCallbackFromOptions;\n if (window.Ya) {\n window.Ya.Metrika = Metrika;\n } else {\n window.Ya = {\n Metrika\n };\n }\n if (window[cbName] && Array.isArray(window[cbName])) {\n window[cbName].forEach(function (func) {\n if (typeof func === 'function') {\n func();\n }\n });\n }\n hit(source);\n }\n metrikaYandexWatch.names = ['metrika-yandex-watch'];\n metrikaYandexWatch.injections = [hit, noopFunc, noopArray];\n function Pardot(source) {\n window.piVersion = '1.0.2';\n window.piScriptNum = 0;\n window.piScriptObj = [];\n window.checkNamespace = noopFunc;\n window.getPardotUrl = noopStr;\n window.piGetParameter = noopNull;\n window.piSetCookie = noopFunc;\n window.piGetCookie = noopStr;\n function piTracker() {\n window.pi = {\n tracker: {\n visitor_id: '',\n visitor_id_sign: '',\n pi_opt_in: '',\n campaign_id: ''\n }\n };\n window.piScriptNum += 1;\n }\n window.piResponse = noopFunc;\n window.piTracker = piTracker;\n piTracker();\n hit(source);\n }\n Pardot.names = ['pardot-1.0'];\n Pardot.injections = [hit, noopFunc, noopStr, noopNull];\n const preventBab$1 = preventBab$2;\n preventBab$1.names = ['prevent-bab',\n 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser'];\n function AmazonApstag(source) {\n const apstagWrapper = {\n fetchBids(a, b) {\n if (typeof b === 'function') {\n b([]);\n }\n },\n init: noopFunc,\n setDisplayBids: noopFunc,\n targetingKeys: noopFunc\n };\n window.apstag = apstagWrapper;\n hit(source);\n }\n AmazonApstag.names = ['amazon-apstag', 'ubo-amazon_apstag.js', 'amazon_apstag.js'];\n AmazonApstag.injections = [hit, noopFunc];\n function Matomo(source) {\n const Tracker = function Tracker() {};\n Tracker.prototype.setDoNotTrack = noopFunc;\n Tracker.prototype.setDomains = noopFunc;\n Tracker.prototype.setCustomDimension = noopFunc;\n Tracker.prototype.trackPageView = noopFunc;\n const AsyncTracker = function AsyncTracker() {};\n AsyncTracker.prototype.addListener = noopFunc;\n const matomoWrapper = {\n getTracker: Tracker,\n getAsyncTracker: AsyncTracker\n };\n window.Piwik = matomoWrapper;\n hit(source);\n }\n Matomo.names = ['matomo'];\n Matomo.injections = [hit, noopFunc];\n function Fingerprintjs2(source) {\n let browserId = '';\n for (let i = 0; i < 8; i += 1) {\n browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n const Fingerprint2 = function Fingerprint2() {};\n Fingerprint2.get = function (options, callback) {\n if (!callback) {\n callback = options;\n }\n setTimeout(function () {\n if (callback) {\n callback(browserId, []);\n }\n }, 1);\n };\n Fingerprint2.prototype = {\n get: Fingerprint2.get\n };\n window.Fingerprint2 = Fingerprint2;\n hit(source);\n }\n Fingerprintjs2.names = ['fingerprintjs2',\n 'ubo-fingerprint2.js',\n 'fingerprint2.js'];\n Fingerprintjs2.injections = [hit];\n function Fingerprintjs3(source) {\n const visitorId = function () {\n let id = '';\n for (let i = 0; i < 8; i += 1) {\n id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n return id;\n }();\n const FingerprintJS = function FingerprintJS() {};\n FingerprintJS.prototype = {\n load() {\n return Promise.resolve(new FingerprintJS());\n },\n get() {\n return Promise.resolve({\n visitorId\n });\n },\n hashComponents: noopStr\n };\n window.FingerprintJS = new FingerprintJS();\n hit(source);\n }\n Fingerprintjs3.names = ['fingerprintjs3',\n 'ubo-fingerprint3.js',\n 'fingerprint3.js'];\n Fingerprintjs3.injections = [hit, noopStr];\n function Gemius(source) {\n const GemiusPlayer = function GemiusPlayer() {};\n GemiusPlayer.prototype = {\n setVideoObject: noopFunc,\n newProgram: noopFunc,\n programEvent: noopFunc,\n newAd: noopFunc,\n adEvent: noopFunc\n };\n window.GemiusPlayer = GemiusPlayer;\n hit(source);\n }\n Gemius.names = ['gemius'];\n Gemius.injections = [hit, noopFunc];\n function ATInternetSmartTag(source) {\n const setNoopFuncWrapper = {\n set: noopFunc\n };\n const sendNoopFuncWrapper = {\n send: noopFunc\n };\n const ecommerceWrapper = {\n displayCart: {\n products: setNoopFuncWrapper,\n cart: setNoopFuncWrapper\n },\n updateCart: {\n cart: setNoopFuncWrapper\n },\n displayProduct: {\n products: setNoopFuncWrapper\n },\n displayPageProduct: {\n products: setNoopFuncWrapper\n },\n addProduct: {\n products: setNoopFuncWrapper\n },\n removeProduct: {\n products: setNoopFuncWrapper\n }\n };\n const tag = function tag() {};\n tag.prototype = {\n setConfig: noopFunc,\n setParam: noopFunc,\n dispatch: noopFunc,\n customVars: setNoopFuncWrapper,\n publisher: setNoopFuncWrapper,\n order: setNoopFuncWrapper,\n click: sendNoopFuncWrapper,\n clickListener: sendNoopFuncWrapper,\n internalSearch: {\n set: noopFunc,\n send: noopFunc\n },\n ecommerce: ecommerceWrapper,\n identifiedVisitor: {\n unset: noopFunc\n },\n page: {\n set: noopFunc,\n send: noopFunc\n },\n selfPromotion: {\n add: noopFunc,\n send: noopFunc\n },\n privacy: {\n setVisitorMode: noopFunc,\n getVisitorMode: noopFunc,\n hit: noopFunc\n },\n richMedia: {\n add: noopFunc,\n send: noopFunc,\n remove: noopFunc,\n removeAll: noopFunc\n }\n };\n const smartTagWrapper = {\n Tracker: {\n Tag: tag\n }\n };\n window.ATInternet = smartTagWrapper;\n hit(source);\n }\n ATInternetSmartTag.names = ['ati-smarttag'];\n ATInternetSmartTag.injections = [hit, noopFunc];\n function preventBab2(source) {\n const script = document.currentScript;\n if (script === null) {\n return;\n }\n const url = script.src;\n if (typeof url !== 'string') {\n return;\n }\n const domainsStr = ['adclixx\\\\.net', 'adnetasia\\\\.com', 'adtrackers\\\\.net', 'bannertrack\\\\.net'].join('|');\n const matchStr = \"^https?://[\\\\w-]+\\\\.(\".concat(domainsStr, \")/.\");\n const domainsRegex = new RegExp(matchStr);\n if (domainsRegex.test(url) === false) {\n return;\n }\n window.nH7eXzOsG = 858;\n hit(source);\n }\n preventBab2.names = ['prevent-bab2',\n 'nobab2.js'];\n preventBab2.injections = [hit];\n function GoogleIma3(source) {\n const VERSION = '3.453.0';\n const ima = {};\n const AdDisplayContainer = function AdDisplayContainer() {};\n AdDisplayContainer.prototype.destroy = noopFunc;\n AdDisplayContainer.prototype.initialize = noopFunc;\n const ImaSdkSettings = function ImaSdkSettings() {};\n ImaSdkSettings.CompanionBackfillMode = {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n };\n ImaSdkSettings.VpaidMode = {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n };\n ImaSdkSettings.prototype = {\n c: true,\n f: {},\n i: false,\n l: '',\n p: '',\n r: 0,\n t: '',\n v: '',\n getCompanionBackfill: noopFunc,\n getDisableCustomPlaybackForIOS10Plus() {\n return this.i;\n },\n getDisabledFlashAds: function getDisabledFlashAds() {\n return true;\n },\n getFeatureFlags() {\n return this.f;\n },\n getLocale() {\n return this.l;\n },\n getNumRedirects() {\n return this.r;\n },\n getPlayerType() {\n return this.t;\n },\n getPlayerVersion() {\n return this.v;\n },\n getPpid() {\n return this.p;\n },\n getVpaidMode() {\n return this.C;\n },\n isCookiesEnabled() {\n return this.c;\n },\n isVpaidAdapter() {\n return this.M;\n },\n setCompanionBackfill: noopFunc,\n setAutoPlayAdBreaks(a) {\n this.K = a;\n },\n setCookiesEnabled(c) {\n this.c = !!c;\n },\n setDisableCustomPlaybackForIOS10Plus(i) {\n this.i = !!i;\n },\n setDisableFlashAds: noopFunc,\n setFeatureFlags(f) {\n this.f = !!f;\n },\n setIsVpaidAdapter(a) {\n this.M = a;\n },\n setLocale(l) {\n this.l = !!l;\n },\n setNumRedirects(r) {\n this.r = !!r;\n },\n setPageCorrelator(a) {\n this.R = a;\n },\n setPlayerType(t) {\n this.t = !!t;\n },\n setPlayerVersion(v) {\n this.v = !!v;\n },\n setPpid(p) {\n this.p = !!p;\n },\n setVpaidMode(a) {\n this.C = a;\n },\n setSessionId: noopFunc,\n setStreamCorrelator: noopFunc,\n setVpaidAllowed: noopFunc,\n CompanionBackfillMode: {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n },\n VpaidMode: {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n }\n };\n const EventHandler = function EventHandler() {\n this.listeners = new Map();\n this._dispatch = function (e) {\n const listeners = this.listeners.get(e.type) || [];\n for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) {\n const listener = _Array$from[_i];\n try {\n listener(e);\n } catch (r) {\n logMessage(source, r);\n }\n }\n };\n this.addEventListener = function (t, c) {\n if (!this.listeners.has(t)) {\n this.listeners.set(t, new Set());\n }\n this.listeners.get(t).add(c);\n };\n this.removeEventListener = function (t, c) {\n var _this$listeners$get;\n (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c);\n };\n };\n const AdsManager = new EventHandler();\n AdsManager.volume = 1;\n AdsManager.collapse = noopFunc;\n AdsManager.configureAdsManager = noopFunc;\n AdsManager.destroy = noopFunc;\n AdsManager.discardAdBreak = noopFunc;\n AdsManager.expand = noopFunc;\n AdsManager.focus = noopFunc;\n AdsManager.getAdSkippableState = function () {\n return false;\n };\n AdsManager.getCuePoints = function () {\n return [0];\n };\n AdsManager.getCurrentAd = function () {\n return currentAd;\n };\n AdsManager.getCurrentAdCuePoints = function () {\n return [];\n };\n AdsManager.getRemainingTime = function () {\n return 0;\n };\n AdsManager.getVolume = function () {\n return this.volume;\n };\n AdsManager.init = noopFunc;\n AdsManager.isCustomClickTrackingUsed = function () {\n return false;\n };\n AdsManager.isCustomPlaybackUsed = function () {\n return false;\n };\n AdsManager.pause = noopFunc;\n AdsManager.requestNextAdBreak = noopFunc;\n AdsManager.resize = noopFunc;\n AdsManager.resume = noopFunc;\n AdsManager.setVolume = function (v) {\n this.volume = v;\n };\n AdsManager.skip = noopFunc;\n AdsManager.start = function () {\n for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) {\n const type = _arr[_i2];\n try {\n this._dispatch(new ima.AdEvent(type));\n } catch (e) {\n logMessage(source, e);\n }\n }\n };\n AdsManager.stop = noopFunc;\n AdsManager.updateAdsRenderingSettings = noopFunc;\n const manager = Object.create(AdsManager);\n const AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) {\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n };\n AdsManagerLoadedEvent.prototype = {\n getAdsManager: function getAdsManager() {\n return manager;\n },\n getUserRequestContext() {\n if (this.userRequestContext) {\n return this.userRequestContext;\n }\n return {};\n }\n };\n AdsManagerLoadedEvent.Type = {\n ADS_MANAGER_LOADED: 'adsManagerLoaded'\n };\n const AdsLoader = EventHandler;\n AdsLoader.prototype.settings = new ImaSdkSettings();\n AdsLoader.prototype.contentComplete = noopFunc;\n AdsLoader.prototype.destroy = noopFunc;\n AdsLoader.prototype.getSettings = function () {\n return this.settings;\n };\n AdsLoader.prototype.getVersion = function () {\n return VERSION;\n };\n AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) {\n var _this = this;\n requestAnimationFrame(function () {\n const ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED;\n const event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext);\n _this._dispatch(event);\n });\n const e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext);\n requestAnimationFrame(function () {\n _this._dispatch(new ima.AdErrorEvent(e));\n });\n };\n const AdsRenderingSettings = noopFunc;\n const AdsRequest = function AdsRequest() {};\n AdsRequest.prototype = {\n setAdWillAutoPlay: noopFunc,\n setAdWillPlayMuted: noopFunc,\n setContinuousPlayback: noopFunc\n };\n const AdPodInfo = function AdPodInfo() {};\n AdPodInfo.prototype = {\n getAdPosition: function getAdPosition() {\n return 1;\n },\n getIsBumper: function getIsBumper() {\n return false;\n },\n getMaxDuration: function getMaxDuration() {\n return -1;\n },\n getPodIndex: function getPodIndex() {\n return 1;\n },\n getTimeOffset: function getTimeOffset() {\n return 0;\n },\n getTotalAds: function getTotalAds() {\n return 1;\n }\n };\n const Ad = function Ad() {};\n Ad.prototype = {\n pi: new AdPodInfo(),\n getAdId: function getAdId() {\n return '';\n },\n getAdPodInfo() {\n return this.pi;\n },\n getAdSystem: function getAdSystem() {\n return '';\n },\n getAdvertiserName: function getAdvertiserName() {\n return '';\n },\n getApiFramework: function getApiFramework() {\n return null;\n },\n getCompanionAds: function getCompanionAds() {\n return [];\n },\n getContentType: function getContentType() {\n return '';\n },\n getCreativeAdId: function getCreativeAdId() {\n return '';\n },\n getDealId: function getDealId() {\n return '';\n },\n getDescription: function getDescription() {\n return '';\n },\n getDuration: function getDuration() {\n return 8.5;\n },\n getHeight: function getHeight() {\n return 0;\n },\n getMediaUrl: function getMediaUrl() {\n return null;\n },\n getMinSuggestedDuration: function getMinSuggestedDuration() {\n return -2;\n },\n getSkipTimeOffset: function getSkipTimeOffset() {\n return -1;\n },\n getSurveyUrl: function getSurveyUrl() {\n return null;\n },\n getTitle: function getTitle() {\n return '';\n },\n getTraffickingParametersString: function getTraffickingParametersString() {\n return '';\n },\n getUiElements: function getUiElements() {\n return [''];\n },\n getUniversalAdIdRegistry: function getUniversalAdIdRegistry() {\n return 'unknown';\n },\n getUniversalAdIds: function getUniversalAdIds() {\n return [''];\n },\n getUniversalAdIdValue: function getUniversalAdIdValue() {\n return 'unknown';\n },\n getVastMediaBitrate: function getVastMediaBitrate() {\n return 0;\n },\n getVastMediaHeight: function getVastMediaHeight() {\n return 0;\n },\n getVastMediaWidth: function getVastMediaWidth() {\n return 0;\n },\n getWidth: function getWidth() {\n return 0;\n },\n getWrapperAdIds: function getWrapperAdIds() {\n return [''];\n },\n getWrapperAdSystems: function getWrapperAdSystems() {\n return [''];\n },\n getWrapperCreativeIds: function getWrapperCreativeIds() {\n return [''];\n },\n isLinear: function isLinear() {\n return true;\n },\n isSkippable() {\n return true;\n }\n };\n const CompanionAd = function CompanionAd() {};\n CompanionAd.prototype = {\n getAdSlotId: function getAdSlotId() {\n return '';\n },\n getContent: function getContent() {\n return '';\n },\n getContentType: function getContentType() {\n return '';\n },\n getHeight: function getHeight() {\n return 1;\n },\n getWidth: function getWidth() {\n return 1;\n }\n };\n const AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) {\n this.errorCode = code;\n this.message = message;\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n this.getErrorCode = function () {\n return this.errorCode;\n };\n this.getInnerError = function () {};\n this.getMessage = function () {\n return this.message;\n };\n this.getType = function () {\n return this.type;\n };\n this.getVastErrorCode = function () {\n return this.vastErrorCode;\n };\n this.toString = function () {\n return \"AdError \".concat(this.errorCode, \": \").concat(this.message);\n };\n };\n AdError.ErrorCode = {};\n AdError.Type = {};\n const isEngadget = function isEngadget() {\n try {\n for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) {\n var _ctx$getPlayer, _ctx$getPlayer$div;\n const ctx = _Object$values[_i3];\n if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) {\n return true;\n }\n }\n } catch (e) {}\n return false;\n };\n const currentAd = isEngadget() ? undefined : new Ad();\n const AdEvent = function AdEvent(type) {\n this.type = type;\n };\n AdEvent.prototype = {\n getAd: function getAd() {\n return currentAd;\n },\n getAdData: function getAdData() {}\n };\n AdEvent.Type = {\n AD_BREAK_READY: 'adBreakReady',\n AD_BUFFERING: 'adBuffering',\n AD_CAN_PLAY: 'adCanPlay',\n AD_METADATA: 'adMetadata',\n AD_PROGRESS: 'adProgress',\n ALL_ADS_COMPLETED: 'allAdsCompleted',\n CLICK: 'click',\n COMPLETE: 'complete',\n CONTENT_PAUSE_REQUESTED: 'contentPauseRequested',\n CONTENT_RESUME_REQUESTED: 'contentResumeRequested',\n DURATION_CHANGE: 'durationChange',\n EXPANDED_CHANGED: 'expandedChanged',\n FIRST_QUARTILE: 'firstQuartile',\n IMPRESSION: 'impression',\n INTERACTION: 'interaction',\n LINEAR_CHANGE: 'linearChange',\n LINEAR_CHANGED: 'linearChanged',\n LOADED: 'loaded',\n LOG: 'log',\n MIDPOINT: 'midpoint',\n PAUSED: 'pause',\n RESUMED: 'resume',\n SKIPPABLE_STATE_CHANGED: 'skippableStateChanged',\n SKIPPED: 'skip',\n STARTED: 'start',\n THIRD_QUARTILE: 'thirdQuartile',\n USER_CLOSE: 'userClose',\n VIDEO_CLICKED: 'videoClicked',\n VIDEO_ICON_CLICKED: 'videoIconClicked',\n VIEWABLE_IMPRESSION: 'viewable_impression',\n VOLUME_CHANGED: 'volumeChange',\n VOLUME_MUTED: 'mute'\n };\n const AdErrorEvent = function AdErrorEvent(error) {\n this.error = error;\n this.type = 'adError';\n this.getError = function () {\n return this.error;\n };\n this.getUserRequestContext = function () {\n var _this$error;\n if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) {\n return this.error.userRequestContext;\n }\n return {};\n };\n };\n AdErrorEvent.Type = {\n AD_ERROR: 'adError'\n };\n const CustomContentLoadedEvent = function CustomContentLoadedEvent() {};\n CustomContentLoadedEvent.Type = {\n CUSTOM_CONTENT_LOADED: 'deprecated-event'\n };\n const CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {};\n CompanionAdSelectionSettings.CreativeType = {\n ALL: 'All',\n FLASH: 'Flash',\n IMAGE: 'Image'\n };\n CompanionAdSelectionSettings.ResourceType = {\n ALL: 'All',\n HTML: 'Html',\n IFRAME: 'IFrame',\n STATIC: 'Static'\n };\n CompanionAdSelectionSettings.SizeCriteria = {\n IGNORE: 'IgnoreSize',\n SELECT_EXACT_MATCH: 'SelectExactMatch',\n SELECT_NEAR_MATCH: 'SelectNearMatch'\n };\n const AdCuePoints = function AdCuePoints() {};\n AdCuePoints.prototype = {\n getCuePoints: function getCuePoints() {\n return [];\n },\n getAdIdRegistry: function getAdIdRegistry() {\n return '';\n },\n getAdIsValue: function getAdIsValue() {\n return '';\n }\n };\n const AdProgressData = noopFunc;\n const UniversalAdIdInfo = function UniversalAdIdInfo() {};\n Object.assign(ima, {\n AdCuePoints,\n AdDisplayContainer,\n AdError,\n AdErrorEvent,\n AdEvent,\n AdPodInfo,\n AdProgressData,\n AdsLoader,\n AdsManager: manager,\n AdsManagerLoadedEvent,\n AdsRenderingSettings,\n AdsRequest,\n CompanionAd,\n CompanionAdSelectionSettings,\n CustomContentLoadedEvent,\n gptProxyInstance: {},\n ImaSdkSettings,\n OmidAccessMode: {\n DOMAIN: 'domain',\n FULL: 'full',\n LIMITED: 'limited'\n },\n settings: new ImaSdkSettings(),\n UiElements: {\n AD_ATTRIBUTION: 'adAttribution',\n COUNTDOWN: 'countdown'\n },\n UniversalAdIdInfo,\n VERSION,\n ViewMode: {\n FULLSCREEN: 'fullscreen',\n NORMAL: 'normal'\n }\n });\n if (!window.google) {\n window.google = {};\n }\n window.google.ima = ima;\n hit(source);\n }\n GoogleIma3.names = ['google-ima3',\n 'ubo-google-ima.js',\n 'google-ima.js'];\n GoogleIma3.injections = [hit, noopFunc, logMessage];\n function DidomiLoader(source) {\n function UserConsentStatusForVendorSubscribe() {}\n UserConsentStatusForVendorSubscribe.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc;\n function UserConsentStatusForVendor() {}\n UserConsentStatusForVendor.prototype.first = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.subscribe = noopFunc;\n const DidomiWrapper = {\n isConsentRequired: falseFunc,\n getUserConsentStatusForPurpose: trueFunc,\n getUserConsentStatus: trueFunc,\n getUserStatus: noopFunc,\n getRequiredPurposes: noopArray,\n getUserConsentStatusForVendor: trueFunc,\n Purposes: {\n Cookies: 'cookies'\n },\n notice: {\n configure: noopFunc,\n hide: noopFunc,\n isVisible: falseFunc,\n show: noopFunc,\n showDataProcessing: trueFunc\n },\n isUserConsentStatusPartial: falseFunc,\n on() {\n return {\n actions: {},\n emitter: {},\n services: {},\n store: {}\n };\n },\n shouldConsentBeCollected: falseFunc,\n getUserConsentStatusForAll: noopFunc,\n getObservableOnUserConsentStatusForVendor() {\n return new UserConsentStatusForVendor();\n }\n };\n window.Didomi = DidomiWrapper;\n const didomiStateWrapper = {\n didomiExperimentId: '',\n didomiExperimentUserGroup: '',\n didomiGDPRApplies: 1,\n didomiIABConsent: '',\n didomiPurposesConsent: '',\n didomiPurposesConsentDenied: '',\n didomiPurposesConsentUnknown: '',\n didomiVendorsConsent: '',\n didomiVendorsConsentDenied: '',\n didomiVendorsConsentUnknown: '',\n didomiVendorsRawConsent: '',\n didomiVendorsRawConsentDenied: '',\n didomiVendorsRawConsentUnknown: ''\n };\n window.didomiState = didomiStateWrapper;\n const tcData = {\n eventStatus: 'tcloaded',\n gdprApplies: false,\n listenerId: noopFunc,\n vendor: {\n consents: []\n },\n purpose: {\n consents: []\n }\n };\n const __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) {\n if (typeof callback !== 'function' || command === 'removeEventListener') {\n return;\n }\n callback(tcData, true);\n };\n window.__tcfapi = __tcfapiWrapper;\n const didomiEventListenersWrapper = {\n stub: true,\n push: noopFunc\n };\n window.didomiEventListeners = didomiEventListenersWrapper;\n const didomiOnReadyWrapper = {\n stub: true,\n push(arg) {\n if (typeof arg !== 'function') {\n return;\n }\n if (document.readyState !== 'complete') {\n window.addEventListener('load', function () {\n setTimeout(arg(window.Didomi));\n });\n } else {\n setTimeout(arg(window.Didomi));\n }\n }\n };\n window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper;\n if (Array.isArray(window.didomiOnReady)) {\n window.didomiOnReady.forEach(function (arg) {\n if (typeof arg === 'function') {\n try {\n setTimeout(arg(window.Didomi));\n } catch (e) {\n }\n }\n });\n }\n hit(source);\n }\n DidomiLoader.names = ['didomi-loader'];\n DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc];\n function Prebid(source) {\n const pushFunction = function pushFunction(arg) {\n if (typeof arg === 'function') {\n try {\n arg.call();\n } catch (ex) {\n }\n }\n };\n const pbjsWrapper = {\n addAdUnits() {},\n adServers: {\n dfp: {\n buildVideoUrl: noopStr\n }\n },\n adUnits: [],\n aliasBidder() {},\n cmd: [],\n enableAnalytics() {},\n getHighestCpmBids: noopArray,\n libLoaded: true,\n que: [],\n requestBids(arg) {\n if (arg instanceof Object && arg.bidsBackHandler) {\n try {\n arg.bidsBackHandler.call();\n } catch (ex) {\n }\n }\n },\n removeAdUnit() {},\n setBidderConfig() {},\n setConfig() {},\n setTargetingForGPTAsync() {}\n };\n pbjsWrapper.cmd.push = pushFunction;\n pbjsWrapper.que.push = pushFunction;\n window.pbjs = pbjsWrapper;\n hit(source);\n }\n Prebid.names = ['prebid'];\n Prebid.injections = [hit, noopFunc, noopStr, noopArray];\n function prebidAds(source) {\n window.canRunAds = true;\n window.isAdBlockActive = false;\n hit(source);\n }\n prebidAds.names = ['prebid-ads', 'ubo-prebid-ads.js', 'prebid-ads.js'];\n prebidAds.injections = [hit];\n function NaverWcslog(source) {\n window.wcs_add = {};\n window.wcs_do = noopFunc;\n window.wcs = {\n inflow: noopFunc\n };\n hit(source);\n }\n NaverWcslog.names = ['naver-wcslog'];\n NaverWcslog.injections = [hit, noopFunc];\n var redirectsList = Object.freeze({\n __proto__: null,\n noeval: noeval$1,\n GoogleAnalytics: GoogleAnalytics,\n GoogleAnalyticsGa: GoogleAnalyticsGa,\n GoogleSyndicationAdsByGoogle: GoogleSyndicationAdsByGoogle,\n GoogleTagServicesGpt: GoogleTagServicesGpt,\n ScoreCardResearchBeacon: ScoreCardResearchBeacon,\n metrikaYandexTag: metrikaYandexTag,\n metrikaYandexWatch: metrikaYandexWatch,\n Pardot: Pardot,\n preventFab: preventFab$1,\n preventBab: preventBab$1,\n setPopadsDummy: setPopadsDummy$1,\n preventPopadsNet: preventPopadsNet$1,\n AmazonApstag: AmazonApstag,\n Matomo: Matomo,\n Fingerprintjs2: Fingerprintjs2,\n Fingerprintjs3: Fingerprintjs3,\n Gemius: Gemius,\n ATInternetSmartTag: ATInternetSmartTag,\n preventBab2: preventBab2,\n GoogleIma3: GoogleIma3,\n DidomiLoader: DidomiLoader,\n Prebid: Prebid,\n prebidAds: prebidAds,\n NaverWcslog: NaverWcslog\n });\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n var defineProperty = _defineProperty;\n function isNothing(subject) {\n return typeof subject === 'undefined' || subject === null;\n }\n function isObject(subject) {\n return typeof subject === 'object' && subject !== null;\n }\n function toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return [];\n return [sequence];\n }\n function extend(target, source) {\n var index, length, key, sourceKeys;\n if (source) {\n sourceKeys = Object.keys(source);\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n return target;\n }\n function repeat(string, count) {\n var result = '',\n cycle;\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n return result;\n }\n function isNegativeZero(number) {\n return number === 0 && Number.NEGATIVE_INFINITY === 1 / number;\n }\n var isNothing_1 = isNothing;\n var isObject_1 = isObject;\n var toArray_1 = toArray;\n var repeat_1 = repeat;\n var isNegativeZero_1 = isNegativeZero;\n var extend_1 = extend;\n var common = {\n isNothing: isNothing_1,\n isObject: isObject_1,\n toArray: toArray_1,\n repeat: repeat_1,\n isNegativeZero: isNegativeZero_1,\n extend: extend_1\n };\n function YAMLException$1(reason, mark) {\n Error.call(this);\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error().stack || '';\n }\n }\n YAMLException$1.prototype = Object.create(Error.prototype);\n YAMLException$1.prototype.constructor = YAMLException$1;\n YAMLException$1.prototype.toString = function toString(compact) {\n var result = this.name + ': ';\n result += this.reason || '(unknown reason)';\n if (!compact && this.mark) {\n result += ' ' + this.mark.toString();\n }\n return result;\n };\n var exception = YAMLException$1;\n function Mark(name, buffer, position, line, column) {\n this.name = name;\n this.buffer = buffer;\n this.position = position;\n this.line = line;\n this.column = column;\n }\n Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {\n var head, start, tail, end, snippet;\n if (!this.buffer) return null;\n indent = indent || 4;\n maxLength = maxLength || 75;\n head = '';\n start = this.position;\n while (start > 0 && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(start - 1)) === -1) {\n start -= 1;\n if (this.position - start > maxLength / 2 - 1) {\n head = ' ... ';\n start += 5;\n break;\n }\n }\n tail = '';\n end = this.position;\n while (end < this.buffer.length && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(end)) === -1) {\n end += 1;\n if (end - this.position > maxLength / 2 - 1) {\n tail = ' ... ';\n end -= 5;\n break;\n }\n }\n snippet = this.buffer.slice(start, end);\n return common.repeat(' ', indent) + head + snippet + tail + '\\n' + common.repeat(' ', indent + this.position - start + head.length) + '^';\n };\n Mark.prototype.toString = function toString(compact) {\n var snippet,\n where = '';\n if (this.name) {\n where += 'in \"' + this.name + '\" ';\n }\n where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);\n if (!compact) {\n snippet = this.getSnippet();\n if (snippet) {\n where += ':\\n' + snippet;\n }\n }\n return where;\n };\n var mark = Mark;\n var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases'];\n var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping'];\n function compileStyleAliases(map) {\n var result = {};\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n return result;\n }\n function Type$1(tag, options) {\n options = options || {};\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () {\n return true;\n };\n this.construct = options['construct'] || function (data) {\n return data;\n };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n }\n var type = Type$1;\n function compileList(schema, name, result) {\n var exclude = [];\n schema.include.forEach(function (includedSchema) {\n result = compileList(includedSchema, name, result);\n });\n schema[name].forEach(function (currentType) {\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {\n exclude.push(previousIndex);\n }\n });\n result.push(currentType);\n });\n return result.filter(function (type, index) {\n return exclude.indexOf(index) === -1;\n });\n }\n function compileMap(\n ) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {}\n },\n index,\n length;\n function collectType(type) {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n }\n function Schema$1(definition) {\n this.include = definition.include || [];\n this.implicit = definition.implicit || [];\n this.explicit = definition.explicit || [];\n this.implicit.forEach(function (type) {\n if (type.loadKind && type.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n });\n this.compiledImplicit = compileList(this, 'implicit', []);\n this.compiledExplicit = compileList(this, 'explicit', []);\n this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);\n }\n Schema$1.DEFAULT = null;\n Schema$1.create = function createSchema() {\n var schemas, types;\n switch (arguments.length) {\n case 1:\n schemas = Schema$1.DEFAULT;\n types = arguments[0];\n break;\n case 2:\n schemas = arguments[0];\n types = arguments[1];\n break;\n default:\n throw new exception('Wrong number of arguments for Schema.create function');\n }\n schemas = common.toArray(schemas);\n types = common.toArray(types);\n if (!schemas.every(function (schema) {\n return schema instanceof Schema$1;\n })) {\n throw new exception('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');\n }\n if (!types.every(function (type$1) {\n return type$1 instanceof type;\n })) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n return new Schema$1({\n include: schemas,\n explicit: types\n });\n };\n var schema = Schema$1;\n var str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function construct(data) {\n return data !== null ? data : '';\n }\n });\n var seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function construct(data) {\n return data !== null ? data : [];\n }\n });\n var map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function construct(data) {\n return data !== null ? data : {};\n }\n });\n var failsafe = new schema({\n explicit: [str, seq, map]\n });\n function resolveYamlNull(data) {\n if (data === null) return true;\n var max = data.length;\n return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL');\n }\n function constructYamlNull() {\n return null;\n }\n function isNull(object) {\n return object === null;\n }\n var _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function canonical() {\n return '~';\n },\n lowercase: function lowercase() {\n return 'null';\n },\n uppercase: function uppercase() {\n return 'NULL';\n },\n camelcase: function camelcase() {\n return 'Null';\n }\n },\n defaultStyle: 'lowercase'\n });\n function resolveYamlBoolean(data) {\n if (data === null) return false;\n var max = data.length;\n return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE');\n }\n function constructYamlBoolean(data) {\n return data === 'true' || data === 'True' || data === 'TRUE';\n }\n function isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n }\n var bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function lowercase(object) {\n return object ? 'true' : 'false';\n },\n uppercase: function uppercase(object) {\n return object ? 'TRUE' : 'FALSE';\n },\n camelcase: function camelcase(object) {\n return object ? 'True' : 'False';\n }\n },\n defaultStyle: 'lowercase'\n });\n function isHexCode(c) {\n return 0x30 <= c && c <= 0x39 || 0x41 <= c && c <= 0x46 || 0x61 <= c && c <= 0x66 ;\n }\n function isOctCode(c) {\n return 0x30 <= c && c <= 0x37 ;\n }\n function isDecCode(c) {\n return 0x30 <= c && c <= 0x39 ;\n }\n function resolveYamlInteger(data) {\n if (data === null) return false;\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n if (!max) return false;\n ch = data[index];\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n if (ch === '0') {\n if (index + 1 === max) return true;\n ch = data[++index];\n if (ch === 'b') {\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n if (ch === 'x') {\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n if (ch === '_') return false;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch === ':') break;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n if (!hasDigits || ch === '_') return false;\n if (ch !== ':') return true;\n return /^(:[0-5]?[0-9])+$/.test(data.slice(index));\n }\n function constructYamlInteger(data) {\n var value = data,\n sign = 1,\n ch,\n base,\n digits = [];\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n ch = value[0];\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n if (value === '0') return 0;\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value, 16);\n return sign * parseInt(value, 8);\n }\n if (value.indexOf(':') !== -1) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseInt(v, 10));\n });\n value = 0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseInt(value, 10);\n }\n function isInteger(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common.isNegativeZero(object);\n }\n var int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function binary(obj) {\n return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1);\n },\n octal: function octal(obj) {\n return obj >= 0 ? '0' + obj.toString(8) : '-0' + obj.toString(8).slice(1);\n },\n decimal: function decimal(obj) {\n return obj.toString(10);\n },\n hexadecimal: function hexadecimal(obj) {\n return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1);\n }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [2, 'bin'],\n octal: [8, 'oct'],\n decimal: [10, 'dec'],\n hexadecimal: [16, 'hex']\n }\n });\n var YAML_FLOAT_PATTERN = new RegExp(\n '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n '|\\\\.(?:nan|NaN|NAN))$');\n function resolveYamlFloat(data) {\n if (data === null) return false;\n if (!YAML_FLOAT_PATTERN.test(data) ||\n data[data.length - 1] === '_') {\n return false;\n }\n return true;\n }\n function constructYamlFloat(data) {\n var value, sign, base, digits;\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n digits = [];\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n if (value === '.inf') {\n return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n } else if (value === '.nan') {\n return NaN;\n } else if (value.indexOf(':') >= 0) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseFloat(v, 10));\n });\n value = 0.0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseFloat(value, 10);\n }\n var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n function representYamlFloat(object, style) {\n var res;\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase':\n return '.nan';\n case 'uppercase':\n return '.NAN';\n case 'camelcase':\n return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '.inf';\n case 'uppercase':\n return '.INF';\n case 'camelcase':\n return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '-.inf';\n case 'uppercase':\n return '-.INF';\n case 'camelcase':\n return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n res = object.toString(10);\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n }\n function isFloat(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common.isNegativeZero(object));\n }\n var float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n });\n var json = new schema({\n include: [failsafe],\n implicit: [_null, bool, int, float]\n });\n var core = new schema({\n include: [json]\n });\n var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n '-([0-9][0-9])' +\n '-([0-9][0-9])$');\n var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n '-([0-9][0-9]?)' +\n '-([0-9][0-9]?)' +\n '(?:[Tt]|[ \\\\t]+)' +\n '([0-9][0-9]?)' +\n ':([0-9][0-9])' +\n ':([0-9][0-9])' +\n '(?:\\\\.([0-9]*))?' +\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' +\n '(?::([0-9][0-9]))?))?$');\n function resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n }\n function constructYamlTimestamp(data) {\n var match,\n year,\n month,\n day,\n hour,\n minute,\n second,\n fraction = 0,\n delta = null,\n tz_hour,\n tz_minute,\n date;\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n if (match === null) throw new Error('Date resolve error');\n year = +match[1];\n month = +match[2] - 1;\n day = +match[3];\n if (!match[4]) {\n return new Date(Date.UTC(year, month, day));\n }\n hour = +match[4];\n minute = +match[5];\n second = +match[6];\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) {\n fraction += '0';\n }\n fraction = +fraction;\n }\n if (match[9]) {\n tz_hour = +match[10];\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000;\n if (match[9] === '-') delta = -delta;\n }\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n if (delta) date.setTime(date.getTime() - delta);\n return date;\n }\n function representYamlTimestamp(object ) {\n return object.toISOString();\n }\n var timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n });\n function resolveYamlMerge(data) {\n return data === '<<' || data === null;\n }\n var merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n });\n function commonjsRequire (target) {\n \tthrow new Error('Could not dynamically require \"' + target + '\". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.');\n }\n var NodeBuffer;\n try {\n var _require$1 = commonjsRequire;\n NodeBuffer = _require$1('buffer').Buffer;\n } catch (__) {}\n var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n function resolveYamlBinary(data) {\n if (data === null) return false;\n var code,\n idx,\n bitlen = 0,\n max = data.length,\n map = BASE64_MAP;\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n if (code > 64) continue;\n if (code < 0) return false;\n bitlen += 6;\n }\n return bitlen % 8 === 0;\n }\n function constructYamlBinary(data) {\n var idx,\n tailbits,\n input = data.replace(/[\\r\\n=]/g, ''),\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n for (idx = 0; idx < max; idx++) {\n if (idx % 4 === 0 && idx) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n }\n bits = bits << 6 | map.indexOf(input.charAt(idx));\n }\n tailbits = max % 4 * 6;\n if (tailbits === 0) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push(bits >> 10 & 0xFF);\n result.push(bits >> 2 & 0xFF);\n } else if (tailbits === 12) {\n result.push(bits >> 4 & 0xFF);\n }\n if (NodeBuffer) {\n return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);\n }\n return result;\n }\n function representYamlBinary(object ) {\n var result = '',\n bits = 0,\n idx,\n tail,\n max = object.length,\n map = BASE64_MAP;\n for (idx = 0; idx < max; idx++) {\n if (idx % 3 === 0 && idx) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n }\n bits = (bits << 8) + object[idx];\n }\n tail = max % 3;\n if (tail === 0) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[bits >> 10 & 0x3F];\n result += map[bits >> 4 & 0x3F];\n result += map[bits << 2 & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[bits >> 2 & 0x3F];\n result += map[bits << 4 & 0x3F];\n result += map[64];\n result += map[64];\n }\n return result;\n }\n function isBinary(object) {\n return NodeBuffer && NodeBuffer.isBuffer(object);\n }\n var binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n });\n var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\n var _toString$2 = Object.prototype.toString;\n function resolveYamlOmap(data) {\n if (data === null) return true;\n var objectKeys = [],\n index,\n length,\n pair,\n pairKey,\n pairHasKey,\n object = data;\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n if (_toString$2.call(pair) !== '[object Object]') return false;\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;else return false;\n }\n }\n if (!pairHasKey) return false;\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false;\n }\n return true;\n }\n function constructYamlOmap(data) {\n return data !== null ? data : [];\n }\n var omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n });\n var _toString$1 = Object.prototype.toString;\n function resolveYamlPairs(data) {\n if (data === null) return true;\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n if (_toString$1.call(pair) !== '[object Object]') return false;\n keys = Object.keys(pair);\n if (keys.length !== 1) return false;\n result[index] = [keys[0], pair[keys[0]]];\n }\n return true;\n }\n function constructYamlPairs(data) {\n if (data === null) return [];\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n keys = Object.keys(pair);\n result[index] = [keys[0], pair[keys[0]]];\n }\n return result;\n }\n var pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n });\n var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n function resolveYamlSet(data) {\n if (data === null) return true;\n var key,\n object = data;\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n return true;\n }\n function constructYamlSet(data) {\n return data !== null ? data : {};\n }\n var set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n });\n var default_safe = new schema({\n include: [core],\n implicit: [timestamp, merge],\n explicit: [binary, omap, pairs, set]\n });\n function resolveJavascriptUndefined() {\n return true;\n }\n function constructJavascriptUndefined() {\n return undefined;\n }\n function representJavascriptUndefined() {\n return '';\n }\n function isUndefined(object) {\n return typeof object === 'undefined';\n }\n var _undefined = new type('tag:yaml.org,2002:js/undefined', {\n kind: 'scalar',\n resolve: resolveJavascriptUndefined,\n construct: constructJavascriptUndefined,\n predicate: isUndefined,\n represent: representJavascriptUndefined\n });\n function resolveJavascriptRegExp(data) {\n if (data === null) return false;\n if (data.length === 0) return false;\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n if (modifiers.length > 3) return false;\n if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;\n }\n return true;\n }\n function constructJavascriptRegExp(data) {\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n regexp = regexp.slice(1, regexp.length - modifiers.length - 1);\n }\n return new RegExp(regexp, modifiers);\n }\n function representJavascriptRegExp(object ) {\n var result = '/' + object.source + '/';\n if (object.global) result += 'g';\n if (object.multiline) result += 'm';\n if (object.ignoreCase) result += 'i';\n return result;\n }\n function isRegExp(object) {\n return Object.prototype.toString.call(object) === '[object RegExp]';\n }\n var regexp = new type('tag:yaml.org,2002:js/regexp', {\n kind: 'scalar',\n resolve: resolveJavascriptRegExp,\n construct: constructJavascriptRegExp,\n predicate: isRegExp,\n represent: representJavascriptRegExp\n });\n var esprima;\n try {\n var _require = commonjsRequire;\n esprima = _require('esprima');\n } catch (_) {\n if (typeof window !== 'undefined') esprima = window.esprima;\n }\n function resolveJavascriptFunction(data) {\n if (data === null) return false;\n try {\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n });\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n return false;\n }\n return true;\n } catch (err) {\n return false;\n }\n }\n function constructJavascriptFunction(data) {\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n }),\n params = [],\n body;\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n throw new Error('Failed to resolve function');\n }\n ast.body[0].expression.params.forEach(function (param) {\n params.push(param.name);\n });\n body = ast.body[0].expression.body.range;\n if (ast.body[0].expression.body.type === 'BlockStatement') {\n return new Function(params, source.slice(body[0] + 1, body[1] - 1));\n }\n return new Function(params, 'return ' + source.slice(body[0], body[1]));\n }\n function representJavascriptFunction(object ) {\n return object.toString();\n }\n function isFunction(object) {\n return Object.prototype.toString.call(object) === '[object Function]';\n }\n var _function = new type('tag:yaml.org,2002:js/function', {\n kind: 'scalar',\n resolve: resolveJavascriptFunction,\n construct: constructJavascriptFunction,\n predicate: isFunction,\n represent: representJavascriptFunction\n });\n var default_full = schema.DEFAULT = new schema({\n include: [default_safe],\n explicit: [_undefined, regexp, _function]\n });\n var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n var CONTEXT_FLOW_IN = 1;\n var CONTEXT_FLOW_OUT = 2;\n var CONTEXT_BLOCK_IN = 3;\n var CONTEXT_BLOCK_OUT = 4;\n var CHOMPING_CLIP = 1;\n var CHOMPING_STRIP = 2;\n var CHOMPING_KEEP = 3;\n var PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\n var PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\n var PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\n var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\n var PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n function _class(obj) {\n return Object.prototype.toString.call(obj);\n }\n function is_EOL(c) {\n return c === 0x0A || c === 0x0D ;\n }\n function is_WHITE_SPACE(c) {\n return c === 0x09 || c === 0x20 ;\n }\n function is_WS_OR_EOL(c) {\n return c === 0x09 || c === 0x20 || c === 0x0A || c === 0x0D ;\n }\n function is_FLOW_INDICATOR(c) {\n return c === 0x2C || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D ;\n }\n function fromHexCode(c) {\n var lc;\n if (0x30 <= c && c <= 0x39 ) {\n return c - 0x30;\n }\n lc = c | 0x20;\n if (0x61 <= lc && lc <= 0x66 ) {\n return lc - 0x61 + 10;\n }\n return -1;\n }\n function escapedHexLen(c) {\n if (c === 0x78 ) {\n return 2;\n }\n if (c === 0x75 ) {\n return 4;\n }\n if (c === 0x55 ) {\n return 8;\n }\n return 0;\n }\n function fromDecimalCode(c) {\n if (0x30 <= c && c <= 0x39 ) {\n return c - 0x30;\n }\n return -1;\n }\n function simpleEscapeSequence(c) {\n return c === 0x30 ? '\\x00' : c === 0x61 ? '\\x07' : c === 0x62 ? '\\x08' : c === 0x74 ? '\\x09' : c === 0x09 ? '\\x09' : c === 0x6E ? '\\x0A' : c === 0x76 ? '\\x0B' : c === 0x66 ? '\\x0C' : c === 0x72 ? '\\x0D' : c === 0x65 ? '\\x1B' : c === 0x20 ? ' ' : c === 0x22 ? '\\x22' : c === 0x2F ? '/' : c === 0x5C ? '\\x5C' : c === 0x4E ? '\\x85' : c === 0x5F ? '\\xA0' : c === 0x4C ? \"\\u2028\" : c === 0x50 ? \"\\u2029\" : '';\n }\n function charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00);\n }\n var simpleEscapeCheck = new Array(256);\n var simpleEscapeMap = new Array(256);\n for (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n }\n function State$1(input, options) {\n this.input = input;\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || default_full;\n this.onWarning = options['onWarning'] || null;\n this.legacy = options['legacy'] || false;\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n this.documents = [];\n }\n function generateError(state, message) {\n return new exception(message, new mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart));\n }\n function throwError(state, message) {\n throw generateError(state, message);\n }\n function throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n }\n var directiveHandlers = {\n YAML: function handleYamlDirective(state, name, args) {\n var match, major, minor;\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n state.version = args[0];\n state.checkLineBreaks = minor < 2;\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n TAG: function handleTagDirective(state, name, args) {\n var handle, prefix;\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n handle = args[0];\n prefix = args[1];\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n state.tagMap[handle] = prefix;\n }\n };\n function captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n if (start < end) {\n _result = state.input.slice(start, end);\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n state.result += _result;\n }\n }\n function mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n sourceKeys = Object.keys(source);\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n if (!_hasOwnProperty$1.call(destination, key)) {\n destination[key] = source[key];\n overridableKeys[key] = true;\n }\n }\n }\n function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {\n var index, quantity;\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n keyNode = String(keyNode);\n if (_result === null) {\n _result = {};\n }\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n _result[keyNode] = valueNode;\n delete overridableKeys[keyNode];\n }\n return _result;\n }\n function readLineBreak(state) {\n var ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x0A ) {\n state.position++;\n } else if (ch === 0x0D ) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A ) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n state.line += 1;\n state.lineStart = state.position;\n }\n function skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (allowComments && ch === 0x23 ) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A && ch !== 0x0D && ch !== 0);\n }\n if (is_EOL(ch)) {\n readLineBreak(state);\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n while (ch === 0x20 ) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n return lineBreaks;\n }\n function testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n ch = state.input.charCodeAt(_position);\n if ((ch === 0x2D || ch === 0x2E ) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) {\n _position += 3;\n ch = state.input.charCodeAt(_position);\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n return false;\n }\n function writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n }\n function readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 || ch === 0x26 || ch === 0x2A || ch === 0x21 || ch === 0x7C || ch === 0x3E || ch === 0x27 || ch === 0x22 || ch === 0x25 || ch === 0x40 || ch === 0x60 ) {\n return false;\n }\n if (ch === 0x3F || ch === 0x2D ) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n while (ch !== 0) {\n if (ch === 0x3A ) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n } else if (ch === 0x23 ) {\n preceding = state.input.charCodeAt(state.position - 1);\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, captureEnd, false);\n if (state.result) {\n return true;\n }\n state.kind = _kind;\n state.result = _result;\n return false;\n }\n function readSingleQuotedScalar(state, nodeIndent) {\n var ch, captureStart, captureEnd;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x27 ) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27 ) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x27 ) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n }\n function readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart, captureEnd, hexLength, hexResult, tmp, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x22 ) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22 ) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n } else if (ch === 0x5C ) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n state.result += charFromCodepoint(hexResult);\n state.position++;\n } else {\n throwError(state, 'unknown escape sequence');\n }\n captureStart = captureEnd = state.position;\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n }\n function readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = {},\n keyNode,\n keyTag,\n valueNode,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x5B ) {\n terminator = 0x5D;\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B ) {\n terminator = 0x7D;\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(++state.position);\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n }\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n if (ch === 0x3F ) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if ((isExplicitPair || state.line === _line) && ch === 0x3A ) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));\n } else {\n _result.push(keyNode);\n }\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x2C ) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n throwError(state, 'unexpected end of the stream within a flow collection');\n }\n function readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x7C ) {\n folding = false;\n } else if (ch === 0x3E ) {\n folding = true;\n } else {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x2B || ch === 0x2D ) {\n if (CHOMPING_CLIP === chomping) {\n chomping = ch === 0x2B ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n } else {\n break;\n }\n }\n if (is_WHITE_SPACE(ch)) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (is_WHITE_SPACE(ch));\n if (ch === 0x23 ) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (!is_EOL(ch) && ch !== 0);\n }\n }\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n ch = state.input.charCodeAt(state.position);\n while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 ) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n if (state.lineIndent < textIndent) {\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) {\n state.result += '\\n';\n }\n }\n break;\n }\n if (folding) {\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n } else if (emptyLines === 0) {\n if (didReadContent) {\n state.result += ' ';\n }\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n } else {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n while (!is_EOL(ch) && ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, state.position, false);\n }\n return true;\n }\n function readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n if (ch !== 0x2D ) {\n break;\n }\n following = state.input.charCodeAt(state.position + 1);\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n detected = true;\n state.position++;\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n }\n function readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _pos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = {},\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line;\n _pos = state.position;\n if ((ch === 0x3F || ch === 0x3A ) && is_WS_OR_EOL(following)) {\n if (ch === 0x3F ) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n } else if (atExplicitKey) {\n atExplicitKey = false;\n allowCompact = true;\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n state.position += 1;\n ch = following;\n } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x3A ) {\n ch = state.input.charCodeAt(++state.position);\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true;\n }\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true;\n }\n } else {\n break;\n }\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);\n keyTag = keyNode = valueNode = null;\n }\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n if (state.lineIndent > nodeIndent && ch !== 0) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n }\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n return detected;\n }\n function readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x21 ) return false;\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x3C ) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n } else if (ch === 0x21 ) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n } else {\n tagHandle = '!';\n }\n _position = state.position;\n if (isVerbatim) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && ch !== 0x3E );\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n if (ch === 0x21 ) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n ch = state.input.charCodeAt(++state.position);\n }\n tagName = state.input.slice(_position, state.position);\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n if (isVerbatim) {\n state.tag = tagName;\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n return true;\n }\n function readAnchorProperty(state) {\n var _position, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x26 ) return false;\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n state.anchor = state.input.slice(_position, state.position);\n return true;\n }\n function readAlias(state) {\n var _position, alias, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x2A ) return false;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n alias = state.input.slice(_position, state.position);\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n }\n function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1,\n atNewLine = false,\n hasContent = false,\n typeIndex,\n typeQuantity,\n type,\n flowIndent,\n blockIndent;\n if (state.listener !== null) {\n state.listener('open', state);\n }\n state.tag = null;\n state.anchor = null;\n state.kind = null;\n state.result = null;\n allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext;\n if (allowToSeek) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n blockIndent = state.position - state.lineStart;\n if (indentStatus === 1) {\n if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n } else if (readAlias(state)) {\n hasContent = true;\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n if (state.tag !== null && state.tag !== '!') {\n if (state.tag === '?') {\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n if (type.resolve(state.result)) {\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n if (!type.resolve(state.result)) {\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n }\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n }\n function readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = {};\n state.anchorMap = {};\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if (state.lineIndent > 0 || ch !== 0x25 ) {\n break;\n }\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x23 ) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && !is_EOL(ch));\n break;\n }\n if (is_EOL(ch)) break;\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n if (ch !== 0) readLineBreak(state);\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n skipSeparationSpace(state, true, -1);\n if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D && state.input.charCodeAt(state.position + 1) === 0x2D && state.input.charCodeAt(state.position + 2) === 0x2D ) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n state.documents.push(state.result);\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n if (state.input.charCodeAt(state.position) === 0x2E ) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n if (state.position < state.length - 1) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n }\n function loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n if (input.length !== 0) {\n if (input.charCodeAt(input.length - 1) !== 0x0A && input.charCodeAt(input.length - 1) !== 0x0D ) {\n input += '\\n';\n }\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n var state = new State$1(input, options);\n var nullpos = input.indexOf('\\0');\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n state.input += '\\0';\n while (state.input.charCodeAt(state.position) === 0x20 ) {\n state.lineIndent += 1;\n state.position += 1;\n }\n while (state.position < state.length - 1) {\n readDocument(state);\n }\n return state.documents;\n }\n function loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n var documents = loadDocuments(input, options);\n if (typeof iterator !== 'function') {\n return documents;\n }\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n }\n function load$1(input, options) {\n var documents = loadDocuments(input, options);\n if (documents.length === 0) {\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n }\n function safeLoadAll$1(input, iterator, options) {\n if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n return loadAll$1(input, iterator, common.extend({\n schema: default_safe\n }, options));\n }\n function safeLoad$1(input, options) {\n return load$1(input, common.extend({\n schema: default_safe\n }, options));\n }\n var loadAll_1 = loadAll$1;\n var load_1 = load$1;\n var safeLoadAll_1 = safeLoadAll$1;\n var safeLoad_1 = safeLoad$1;\n var loader = {\n loadAll: loadAll_1,\n load: load_1,\n safeLoadAll: safeLoadAll_1,\n safeLoad: safeLoad_1\n };\n var _toString = Object.prototype.toString;\n var _hasOwnProperty = Object.prototype.hasOwnProperty;\n var CHAR_TAB = 0x09;\n var CHAR_LINE_FEED = 0x0A;\n var CHAR_CARRIAGE_RETURN = 0x0D;\n var CHAR_SPACE = 0x20;\n var CHAR_EXCLAMATION = 0x21;\n var CHAR_DOUBLE_QUOTE = 0x22;\n var CHAR_SHARP = 0x23;\n var CHAR_PERCENT = 0x25;\n var CHAR_AMPERSAND = 0x26;\n var CHAR_SINGLE_QUOTE = 0x27;\n var CHAR_ASTERISK = 0x2A;\n var CHAR_COMMA = 0x2C;\n var CHAR_MINUS = 0x2D;\n var CHAR_COLON = 0x3A;\n var CHAR_EQUALS = 0x3D;\n var CHAR_GREATER_THAN = 0x3E;\n var CHAR_QUESTION = 0x3F;\n var CHAR_COMMERCIAL_AT = 0x40;\n var CHAR_LEFT_SQUARE_BRACKET = 0x5B;\n var CHAR_RIGHT_SQUARE_BRACKET = 0x5D;\n var CHAR_GRAVE_ACCENT = 0x60;\n var CHAR_LEFT_CURLY_BRACKET = 0x7B;\n var CHAR_VERTICAL_LINE = 0x7C;\n var CHAR_RIGHT_CURLY_BRACKET = 0x7D;\n var ESCAPE_SEQUENCES = {};\n ESCAPE_SEQUENCES[0x00] = '\\\\0';\n ESCAPE_SEQUENCES[0x07] = '\\\\a';\n ESCAPE_SEQUENCES[0x08] = '\\\\b';\n ESCAPE_SEQUENCES[0x09] = '\\\\t';\n ESCAPE_SEQUENCES[0x0A] = '\\\\n';\n ESCAPE_SEQUENCES[0x0B] = '\\\\v';\n ESCAPE_SEQUENCES[0x0C] = '\\\\f';\n ESCAPE_SEQUENCES[0x0D] = '\\\\r';\n ESCAPE_SEQUENCES[0x1B] = '\\\\e';\n ESCAPE_SEQUENCES[0x22] = '\\\\\"';\n ESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\n ESCAPE_SEQUENCES[0x85] = '\\\\N';\n ESCAPE_SEQUENCES[0xA0] = '\\\\_';\n ESCAPE_SEQUENCES[0x2028] = '\\\\L';\n ESCAPE_SEQUENCES[0x2029] = '\\\\P';\n var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'];\n function compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n if (map === null) return {};\n result = {};\n keys = Object.keys(map);\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n result[tag] = style;\n }\n return result;\n }\n function encodeHex(character) {\n var string, handle, length;\n string = character.toString(16).toUpperCase();\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n }\n function State(options) {\n this.schema = options['schema'] || default_full;\n this.indent = Math.max(1, options['indent'] || 2);\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = common.isNothing(options['flowLevel']) ? -1 : options['flowLevel'];\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n this.tag = null;\n this.result = '';\n this.duplicates = [];\n this.usedDuplicates = null;\n }\n function indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n if (line.length && line !== '\\n') result += ind;\n result += line;\n }\n return result;\n }\n function generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n }\n function testImplicitResolving(state, str) {\n var index, length, type;\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n if (type.resolve(str)) {\n return true;\n }\n }\n return false;\n }\n function isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n }\n function isPrintable(c) {\n return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF || 0x10000 <= c && c <= 0x10FFFF;\n }\n function isNsChar(c) {\n return isPrintable(c) && !isWhitespace(c)\n && c !== 0xFEFF\n && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED;\n }\n function isPlainSafe(c, prev) {\n return isPrintable(c) && c !== 0xFEFF\n && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev));\n }\n function isPlainSafeFirst(c) {\n return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c)\n && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE\n && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT;\n }\n function needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n }\n var STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {\n var i;\n var char, prev_char;\n var hasLineBreak = false;\n var hasFoldableLine = false;\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1;\n var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1));\n if (singleLineOnly) {\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n } else {\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n }\n if (!hasLineBreak && !hasFoldableLine) {\n return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE;\n }\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n function writeScalar(state, string, level, iskey) {\n state.dump = function () {\n if (string.length === 0) {\n return \"''\";\n }\n if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {\n return \"'\" + string + \"'\";\n }\n var indent = state.indent * Math.max(1, level);\n var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n var singleLineOnly = iskey\n || state.flowLevel > -1 && level >= state.flowLevel;\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }();\n }\n function blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : clip ? '' : '-';\n return indentIndicator + chomp + '\\n';\n }\n function dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n }\n function foldString(string, width) {\n var lineRe = /(\\n+)([^\\n]*)/g;\n var result = function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }();\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n var match;\n while (match = lineRe.exec(string)) {\n var prefix = match[1],\n line = match[2];\n moreIndented = line[0] === ' ';\n result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\\n' : '') + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n return result;\n }\n function foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n var breakRe = / [^ ]/g;\n var match;\n var start = 0,\n end,\n curr = 0,\n next = 0;\n var result = '';\n while (match = breakRe.exec(line)) {\n next = match.index;\n if (next - start > width) {\n end = curr > start ? curr : next;\n result += '\\n' + line.slice(start, end);\n start = end + 1;\n }\n curr = next;\n }\n result += '\\n';\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n return result.slice(1);\n }\n function escapeString(string) {\n var result = '';\n var char, nextChar;\n var escapeSeq;\n for (var i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (char >= 0xD800 && char <= 0xDBFF ) {\n nextChar = string.charCodeAt(i + 1);\n if (nextChar >= 0xDC00 && nextChar <= 0xDFFF ) {\n result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);\n i++;\n continue;\n }\n }\n escapeSeq = ESCAPE_SEQUENCES[char];\n result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char);\n }\n return result;\n }\n function writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n if (writeNode(state, level, object[index], false, false)) {\n if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n }\n function writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n if (writeNode(state, level + 1, object[index], true, true)) {\n if (!compact || index !== 0) {\n _result += generateNextLine(state, level);\n }\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = _result || '[]';\n }\n function writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (index !== 0) pairBuffer += ', ';\n if (state.condenseFlow) pairBuffer += '\"';\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level, objectKey, false, false)) {\n continue;\n }\n if (state.dump.length > 1024) pairBuffer += '? ';\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n if (!writeNode(state, level, objectValue, false, false)) {\n continue;\n }\n pairBuffer += state.dump;\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n }\n function writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n if (state.sortKeys === true) {\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n throw new exception('sortKeys must be a boolean or a function');\n }\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (!compact || index !== 0) {\n pairBuffer += generateNextLine(state, level);\n }\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue;\n }\n explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024;\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n pairBuffer += state.dump;\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue;\n }\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n pairBuffer += state.dump;\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = _result || '{}';\n }\n function detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) {\n state.tag = explicit ? type.tag : '?';\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n state.dump = _result;\n }\n return true;\n }\n }\n return false;\n }\n function writeNode(state, level, object, block, compact, iskey) {\n state.tag = null;\n state.dump = object;\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n var type = _toString.call(state.dump);\n if (block) {\n block = state.flowLevel < 0 || state.flowLevel > level;\n }\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) {\n compact = false;\n }\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && Object.keys(state.dump).length !== 0) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level;\n if (block && state.dump.length !== 0) {\n writeBlockSequence(state, arrayLevel, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, arrayLevel, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey);\n }\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n if (state.tag !== null && state.tag !== '?') {\n state.dump = '!<' + state.tag + '> ' + state.dump;\n }\n }\n return true;\n }\n function getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n inspectNode(object, objects, duplicatesIndexes);\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n }\n function inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList, index, length;\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n }\n function dump$1(input, options) {\n options = options || {};\n var state = new State(options);\n if (!state.noRefs) getDuplicateReferences(input, state);\n if (writeNode(state, 0, input, true, true)) return state.dump + '\\n';\n return '';\n }\n function safeDump$1(input, options) {\n return dump$1(input, common.extend({\n schema: default_safe\n }, options));\n }\n var dump_1 = dump$1;\n var safeDump_1 = safeDump$1;\n var dumper = {\n dump: dump_1,\n safeDump: safeDump_1\n };\n function deprecated(name) {\n return function () {\n throw new Error('Function ' + name + ' is deprecated and cannot be used.');\n };\n }\n var Type = type;\n var Schema = schema;\n var FAILSAFE_SCHEMA = failsafe;\n var JSON_SCHEMA = json;\n var CORE_SCHEMA = core;\n var DEFAULT_SAFE_SCHEMA = default_safe;\n var DEFAULT_FULL_SCHEMA = default_full;\n var load = loader.load;\n var loadAll = loader.loadAll;\n var safeLoad = loader.safeLoad;\n var safeLoadAll = loader.safeLoadAll;\n var dump = dumper.dump;\n var safeDump = dumper.safeDump;\n var YAMLException = exception;\n var MINIMAL_SCHEMA = failsafe;\n var SAFE_SCHEMA = default_safe;\n var DEFAULT_SCHEMA = default_full;\n var scan = deprecated('scan');\n var parse = deprecated('parse');\n var compose = deprecated('compose');\n var addConstructor = deprecated('addConstructor');\n var jsYaml$1 = {\n Type: Type,\n Schema: Schema,\n FAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n JSON_SCHEMA: JSON_SCHEMA,\n CORE_SCHEMA: CORE_SCHEMA,\n DEFAULT_SAFE_SCHEMA: DEFAULT_SAFE_SCHEMA,\n DEFAULT_FULL_SCHEMA: DEFAULT_FULL_SCHEMA,\n load: load,\n loadAll: loadAll,\n safeLoad: safeLoad,\n safeLoadAll: safeLoadAll,\n dump: dump,\n safeDump: safeDump,\n YAMLException: YAMLException,\n MINIMAL_SCHEMA: MINIMAL_SCHEMA,\n SAFE_SCHEMA: SAFE_SCHEMA,\n DEFAULT_SCHEMA: DEFAULT_SCHEMA,\n scan: scan,\n parse: parse,\n compose: compose,\n addConstructor: addConstructor\n };\n var jsYaml = jsYaml$1;\n function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n class Redirects {\n constructor(rawYaml) {\n try {\n const arrOfRedirects = jsYaml.safeLoad(rawYaml);\n this.redirects = arrOfRedirects.reduce(function (acc, redirect) {\n return _objectSpread(_objectSpread({}, acc), {}, {\n [redirect.title]: redirect\n });\n }, {});\n } catch (e) {\n console.log(\"Was unable to load YAML into JS due to: \".concat(e.message));\n throw e;\n }\n }\n getRedirect(title) {\n var _this = this;\n if (Object.prototype.hasOwnProperty.call(this.redirects, title)) {\n return this.redirects[title];\n }\n const values = Object.keys(this.redirects).map(function (key) {\n return _this.redirects[key];\n });\n return values.find(function (redirect) {\n const aliases = redirect.aliases;\n if (!aliases) {\n return false;\n }\n return aliases.indexOf(title) > -1;\n });\n }\n isBlocking(title) {\n const redirect = this.redirects[title];\n if (redirect) {\n return !!redirect.isBlocking;\n }\n return false;\n }\n }\n const redirectsMap = {\n \"1x1-transparent.gif\": \"1x1-transparent.gif\",\n \"1x1.gif\": \"1x1-transparent.gif\",\n \"1x1-transparent-gif\": \"1x1-transparent.gif\",\n \"2x2-transparent.png\": \"2x2-transparent.png\",\n \"2x2.png\": \"2x2-transparent.png\",\n \"2x2-transparent-png\": \"2x2-transparent.png\",\n \"3x2-transparent.png\": \"3x2-transparent.png\",\n \"3x2.png\": \"3x2-transparent.png\",\n \"3x2-transparent-png\": \"3x2-transparent.png\",\n \"32x32-transparent.png\": \"32x32-transparent.png\",\n \"32x32.png\": \"32x32-transparent.png\",\n \"32x32-transparent-png\": \"32x32-transparent.png\",\n noopframe: \"noopframe.html\",\n \"noop.html\": \"noopframe.html\",\n \"blank-html\": \"noopframe.html\",\n noopcss: \"noopcss.css\",\n \"noop.css\": \"noopcss.css\",\n \"blank-css\": \"noopcss.css\",\n noopjs: \"noopjs.js\",\n \"noop.js\": \"noopjs.js\",\n \"blank-js\": \"noopjs.js\",\n noopjson: \"noopjson.json\",\n nooptext: \"nooptext.js\",\n \"noop.txt\": \"nooptext.js\",\n \"blank-text\": \"nooptext.js\",\n empty: \"nooptext.js\",\n \"noopvmap-1.0\": \"noopvmap01.xml\",\n \"noop-vmap1.0.xml\": \"noopvmap01.xml\",\n \"noopvast-2.0\": \"noopvast02.xml\",\n \"noopvast-3.0\": \"noopvast03.xml\",\n \"noopvast-4.0\": \"noopvast04.xml\",\n \"noopmp3-0.1s\": \"noopmp3.mp3\",\n \"blank-mp3\": \"noopmp3.mp3\",\n \"noopmp4-1s\": \"noopmp4.mp4\",\n \"noop-1s.mp4\": \"noopmp4.mp4\",\n \"blank-mp4\": \"noopmp4.mp4\",\n \"click2load.html\": \"click2load.html\",\n \"ubo-click2load.html\": \"click2load.html\",\n \"amazon-apstag\": \"amazon-apstag.js\",\n \"ubo-amazon_apstag.js\": \"amazon-apstag.js\",\n \"amazon_apstag.js\": \"amazon-apstag.js\",\n \"ati-smarttag\": \"ati-smarttag.js\",\n \"didomi-loader\": \"didomi-loader.js\",\n fingerprintjs2: \"fingerprintjs2.js\",\n \"ubo-fingerprint2.js\": \"fingerprintjs2.js\",\n \"fingerprint2.js\": \"fingerprintjs2.js\",\n fingerprintjs3: \"fingerprintjs3.js\",\n \"ubo-fingerprint3.js\": \"fingerprintjs3.js\",\n \"fingerprint3.js\": \"fingerprintjs3.js\",\n gemius: \"gemius.js\",\n \"google-analytics-ga\": \"google-analytics-ga.js\",\n \"ubo-google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics\": \"google-analytics.js\",\n \"ubo-google-analytics_analytics.js\": \"google-analytics.js\",\n \"google-analytics_analytics.js\": \"google-analytics.js\",\n \"googletagmanager-gtm\": \"google-analytics.js\",\n \"ubo-googletagmanager_gtm.js\": \"google-analytics.js\",\n \"googletagmanager_gtm.js\": \"google-analytics.js\",\n \"google-ima3\": \"google-ima3.js\",\n \"ubo-google-ima.js\": \"google-ima3.js\",\n \"google-ima.js\": \"google-ima3.js\",\n \"googlesyndication-adsbygoogle\": \"googlesyndication-adsbygoogle.js\",\n \"ubo-googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googletagservices-gpt\": \"googletagservices-gpt.js\",\n \"ubo-googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n \"googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n matomo: \"matomo.js\",\n \"metrika-yandex-tag\": \"metrika-yandex-tag.js\",\n \"metrika-yandex-watch\": \"metrika-yandex-watch.js\",\n \"naver-wcslog\": \"naver-wcslog.js\",\n noeval: \"noeval.js\",\n \"noeval.js\": \"noeval.js\",\n \"silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval.js\": \"noeval.js\",\n \"ubo-silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval\": \"noeval.js\",\n \"ubo-silent-noeval\": \"noeval.js\",\n \"pardot-1.0\": \"pardot-1.0.js\",\n \"prebid-ads\": \"prebid-ads.js\",\n \"ubo-prebid-ads.js\": \"prebid-ads.js\",\n \"prebid-ads.js\": \"prebid-ads.js\",\n prebid: \"prebid.js\",\n \"prevent-bab\": \"prevent-bab.js\",\n \"nobab.js\": \"prevent-bab.js\",\n \"ubo-nobab.js\": \"prevent-bab.js\",\n \"bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-nobab\": \"prevent-bab.js\",\n \"ubo-bab-defuser\": \"prevent-bab.js\",\n \"prevent-bab2\": \"prevent-bab2.js\",\n \"nobab2.js\": \"prevent-bab2.js\",\n \"prevent-fab-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"nofab.js\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab.js\": \"prevent-fab-3.2.0.js\",\n \"fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab\": \"prevent-fab-3.2.0.js\",\n \"prevent-popads-net\": \"prevent-popads-net.js\",\n \"popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net\": \"prevent-popads-net.js\",\n \"scorecardresearch-beacon\": \"scorecardresearch-beacon.js\",\n \"ubo-scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"set-popads-dummy\": \"set-popads-dummy.js\",\n \"popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy\": \"set-popads-dummy.js\"\n };\n const getRedirectByName = function getRedirectByName(name) {\n const redirects = Object.keys(redirectsList).map(function (key) {\n return redirectsList[key];\n });\n return redirects.find(function (r) {\n return r.names && r.names.indexOf(name) > -1;\n });\n };\n const getRedirectCode = function getRedirectCode(source) {\n const redirect = getRedirectByName(source.name);\n let result = attachDependencies(redirect);\n result = addCall(redirect, result);\n result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true);\n return result;\n };\n const getRedirectFilename = function getRedirectFilename(name) {\n return redirectsMap[name];\n };\n const redirects = {\n Redirects,\n getRedirectFilename,\n getCode: getRedirectCode,\n isAdgRedirectRule: validator.isAdgRedirectRule,\n isValidAdgRedirectRule: validator.isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo: validator.isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg: validator.isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg: validator.isAbpRedirectCompatibleWithAdg,\n convertUboRedirectToAdg,\n convertAbpRedirectToAdg,\n convertRedirectToAdg,\n convertAdgRedirectToUbo\n };\n function abortCurrentInlineScript(source, args) {\n function abortCurrentInlineScript(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const SRC_DATA_MARKER = \"data:text/javascript;base64,\";\n const getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (content.length === 0 && typeof scriptEl.src !== \"undefined\" && startsWith(scriptEl.src, SRC_DATA_MARKER)) {\n const encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n const props = property.split(\".\");\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n let origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue: currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n const result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n const rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyRead(source, args) {\n function abortOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyWrite(source, args) {\n function abortOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnStackTrace(source, args) {\n function abortOnStackTrace(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n const descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n const result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n const rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnStackTrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetInterval(source, args) {\n function adjustSetInterval(source, matchCallback, matchDelay, boost) {\n const nativeSetInterval = window.setInterval;\n const matchRegexp = toRegExp(matchCallback);\n const intervalWrapper = function intervalWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n const DEFAULT_MULTIPLIER = .05;\n const MIN_MULTIPLIER = .001;\n const MAX_MULTIPLIER = 50;\n const parsedBoost = parseFloat(boost);\n let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n const DEFAULT_DELAY = 1e3;\n const parsedDelay = parseInt(delay, 10);\n const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetTimeout(source, args) {\n function adjustSetTimeout(source, matchCallback, matchDelay, boost) {\n const nativeSetTimeout = window.setTimeout;\n const matchRegexp = toRegExp(matchCallback);\n const timeoutWrapper = function timeoutWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n const message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n const DEFAULT_MULTIPLIER = .05;\n const MIN_MULTIPLIER = .001;\n const MAX_MULTIPLIER = 50;\n const parsedBoost = parseFloat(boost);\n let boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n const DEFAULT_DELAY = 1e3;\n const parsedDelay = parseInt(delay, 10);\n const delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugCurrentInlineScript(source, args) {\n function debugCurrentInlineScript(source, property, search) {\n const searchRegexp = toRegExp(search);\n const rid = randomId();\n const getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n const scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n const ourScript = getCurrentScript();\n const abort = function abort() {\n const scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n let content = scriptEl.textContent;\n try {\n const textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger;\n }\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n const props = property.split(\".\");\n const propIndex = props.indexOf(prop);\n const baseName = props[propIndex - 1];\n const message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyRead(source, args) {\n function debugOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyWrite(source, args) {\n function debugOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n const rid = randomId();\n const abort = function abort() {\n hit(source);\n debugger;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function dirString(source, args) {\n function dirString(source, times) {\n const _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === \"function\") {\n dir.call(this, object);\n }\n hit(source);\n }\n console.dir = dirWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n dirString.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function disableNewtabLinks(source, args) {\n function disableNewtabLinks(source) {\n document.addEventListener(\"click\", function (ev) {\n let target = ev.target;\n while (target !== null) {\n if (target.localName === \"a\" && target.hasAttribute(\"target\")) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n disableNewtabLinks.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function forceWindowClose(source, args) {\n function forceWindowClose(source) {\n let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n if (typeof window.close !== \"function\") {\n const message = \"window.close() is not a function so 'close-window' scriptlet is unavailable\";\n logMessage(source, message);\n return;\n }\n const closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n logMessage(source, e);\n }\n };\n const closeByExtension = function closeByExtension() {\n const extCall = function extCall() {\n dispatchEvent(new Event(\"adguard:scriptlet-close-window\"));\n };\n window.addEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n }, 5e3);\n };\n const shouldClose = function shouldClose() {\n if (path === \"\") {\n return true;\n }\n const pathRegexp = toRegExp(path);\n const currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.indexOf(\"Chrome\") > -1) {\n closeByExtension();\n }\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n forceWindowClose.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function hideInShadowDom(source, args) {\n function hideInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n const hideElement = function hideElement(targetElement) {\n const DISPLAY_NONE_CSS = \"display:none!important;\";\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n const hideHandler = function hideHandler() {\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n while (hostElements.length !== 0) {\n let isHidden = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n hostElements = innerHosts;\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n const hosts = [];\n const domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n let targets = [];\n const innerHostsAcc = [];\n hostElements.forEach(function (host) {\n const simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n const shadowRootElem = host.shadowRoot;\n const shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n const innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n const stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n const res = [];\n while (stack.length) {\n const next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n hideInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function injectCssInShadowDom(source, args) {\n function injectCssInShadowDom(source, cssRule) {\n let hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n if (!Element.prototype.attachShadow || typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n const callback = function callback(shadowRoot) {\n try {\n const stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n const styleTag = document.createElement(\"style\");\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function hijackAttachShadow(context, hostSelector, callback) {\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || \"*\")) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n const attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n injectCssInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function jsonPrune(source, args) {\n function jsonPrune(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const prunePaths = propsToRemove !== undefined && propsToRemove !== \"\" ? propsToRemove.split(/ +/) : [];\n const requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== \"\" ? requiredInitialProps.split(/ +/) : [];\n function isPruningNeeded(root) {\n if (!root) {\n return false;\n }\n let shouldProcess;\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n const rootString = JSON.stringify(root);\n const matchRegex = toRegExp(requiredPaths.join(\"\"));\n const shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n for (let i = 0; i < requiredPaths.length; i += 1) {\n const requiredPath = requiredPaths[i];\n const lastNestedPropName = requiredPath.split(\".\").pop();\n const hasWildcard = requiredPath.indexOf(\".*.\") > -1 || requiredPath.indexOf(\"*.\") > -1 || requiredPath.indexOf(\".*\") > -1 || requiredPath.indexOf(\".[].\") > -1 || requiredPath.indexOf(\"[].\") > -1 || requiredPath.indexOf(\".[]\") > -1;\n const details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n shouldProcess = !hasWildcard;\n for (let i = 0; i < details.length; i += 1) {\n if (hasWildcard) {\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) || shouldProcess;\n } else {\n shouldProcess = !(details[i].base[lastNestedPropName] === undefined) && shouldProcess;\n }\n }\n }\n return shouldProcess;\n }\n const jsonPruner = function jsonPruner(root) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(root) === false) {\n return root;\n }\n prunePaths.forEach(function (path) {\n const ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n };\n const nativeJSONParse = JSON.parse;\n const jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n const root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(root);\n };\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n const nativeResponseJson = Response.prototype.json;\n const responseJsonWrapper = function responseJsonWrapper() {\n const promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(obj);\n });\n };\n if (typeof Response === \"undefined\") {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getWildcardPropertyInChain(base, chain) {\n let lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n if (chain === \"*\" || chain === \"[]\") {\n for (const key in base) {\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base: base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base: base,\n prop: chain\n });\n }\n return output;\n }\n const prop = chain.slice(0, pos);\n const shouldLookThrough = prop === \"[]\" && Array.isArray(base) || prop === \"*\" && base instanceof Object;\n if (shouldLookThrough) {\n const nextProp = chain.slice(pos + 1);\n const baseKeys = Object.keys(base);\n baseKeys.forEach(function (key) {\n const item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n jsonPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function log(source, args) {\n function log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n log.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logAddEventListener(source, args) {\n function logAddEventListener(source) {\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n const message = 'addEventListener(\"'.concat(type, '\", ').concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n }\n const message = \"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type), \"\\nlistener: \").concat(convertTypeToString(listener));\n logMessage(source, message, true);\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n function convertTypeToString(value) {\n let output;\n if (typeof value === \"undefined\") {\n output = \"undefined\";\n } else if (typeof value === \"object\") {\n if (value === null) {\n output = \"null\";\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logEval(source, args) {\n function logEval(source) {\n const nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, 'eval(\"'.concat(str, '\")'), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n const nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(\", \"), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logEval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logOnStacktrace(source, args) {\n function logOnStacktrace(source, property) {\n if (!property) {\n return;\n }\n const refineStackTrace = function refineStackTrace(stackString) {\n const stackSteps = stackString.split(\"\\n\").slice(2).map(function (line) {\n return line.replace(/ {4}at /, \"\");\n });\n const logInfoArray = stackSteps.map(function (line) {\n let funcName;\n let funcFullPath;\n const reg = /\\(([^\\)]+)\\)/;\n const regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(\" \").slice(0, -1).join(\" \");\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split(\"@\").slice(0, -1).join(\" \");\n funcFullPath = line.match(regFirefox)[2];\n } else {\n funcName = \"function name is not available\";\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n const logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n let base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n const setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n let value = base[prop];\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n };\n setChainPropAccess(window, property);\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logOnStacktrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function m3uPrune(source, args) {\n function m3uPrune(source, propsToRemove, urlToMatch) {\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n let shouldPruneResponse = false;\n const urlMatchRegexp = toRegExp(urlToMatch);\n const SEGMENT_MARKER = \"#\";\n const AD_MARKER = {\n ASSET: \"#EXT-X-ASSET:\",\n CUE: \"#EXT-X-CUE:\",\n CUE_IN: \"#EXT-X-CUE-IN\",\n DISCONTINUITY: \"#EXT-X-DISCONTINUITY\",\n EXTINF: \"#EXTINF\",\n EXTM3U: \"#EXTM3U\",\n SCTE35: \"#EXT-X-SCTE35:\"\n };\n const COMCAST_AD_MARKER = {\n AD: \"-AD-\",\n VAST: \"-VAST-\",\n VMAP_AD: \"-VMAP-AD-\",\n VMAP_AD_BREAK: \"#EXT-X-VMAP-AD-BREAK:\"\n };\n const TAGS_ALLOWLIST = [\"#EXT-X-TARGETDURATION\", \"#EXT-X-MEDIA-SEQUENCE\", \"#EXT-X-DISCONTINUITY-SEQUENCE\", \"#EXT-X-ENDLIST\", \"#EXT-X-PLAYLIST-TYPE\", \"#EXT-X-I-FRAMES-ONLY\", \"#EXT-X-MEDIA\", \"#EXT-X-STREAM-INF\", \"#EXT-X-I-FRAME-STREAM-INF\", \"#EXT-X-SESSION-DATA\", \"#EXT-X-SESSION-KEY\", \"#EXT-X-INDEPENDENT-SEGMENTS\", \"#EXT-X-START\"];\n const isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n const pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n let array = lines.slice();\n let index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array: array,\n index: index\n };\n };\n const pruneVmapBlock = function pruneVmapBlock(lines) {\n let array = lines.slice();\n for (let i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n const prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n const pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n const removeM3ULineRegexp = toRegExp(propsToRemove);\n const pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n const pruneSegments = function pruneSegments(lines) {\n for (let i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n const segmentName = lines[i].substring(0, lines[i].indexOf(\":\"));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (let j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n const isM3U = function isM3U(text) {\n if (typeof text === \"string\") {\n const trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n const isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n const pruneM3U = function pruneM3U(text) {\n let lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === \"undefined\") {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== \"undefined\") {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== \"string\" || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener(\"readystatechange\", function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener(\"readystatechange\", pruneResponse);\n if (!propsToRemove) {\n if (isM3U(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n if (shouldPruneResponse) {\n const prunedResponseContent = pruneM3U(response);\n Object.defineProperty(thisArg, \"response\", {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, \"responseText\", {\n value: prunedResponseContent\n });\n hit(source);\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n const response = await nativeFetch(...args);\n const responseText = await response.text();\n if (!propsToRemove && isM3U(responseText)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n const prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return Reflect.apply(target, thisArg, args);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n m3uPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noTopics(source, args) {\n function noTopics(source) {\n const TOPICS_PROPERTY_NAME = \"browsingTopics\";\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve(\"[]\");\n };\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noTopics.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noeval(source, args) {\n function noeval(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noeval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function nowebrtc(source, args) {\n function nowebrtc(source) {\n let propertyName = \"\";\n if (window.RTCPeerConnection) {\n propertyName = \"RTCPeerConnection\";\n } else if (window.webkitRTCPeerConnection) {\n propertyName = \"webkitRTCPeerConnection\";\n }\n if (propertyName === \"\") {\n return;\n }\n const rtcReplacement = function rtcReplacement(config) {\n const message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n const rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function convertRtcConfigToString(config) {\n const UNDEF_STR = \"undefined\";\n let str = UNDEF_STR;\n if (config === null) {\n str = \"null\";\n } else if (config instanceof Object) {\n const SERVERS_PROP_NAME = \"iceServers\";\n const URLS_PROP_NAME = \"urls\";\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n nowebrtc.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAddEventListener(source, args) {\n function preventAddEventListener(source, typeSearch, listenerSearch) {\n const typeSearchRegexp = toRegExp(typeSearch);\n const listenerSearchRegexp = toRegExp(listenerSearch);\n const nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n let shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n let context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n const descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAdfly(source, args) {\n function preventAdfly(source) {\n const isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n const handler = function handler(encodedURL) {\n let evenChars = \"\";\n let oddChars = \"\";\n for (let i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n let data = (evenChars + oddChars).split(\"\");\n for (let i = 0; i < data.length; i += 1) {\n if (isDigit(data[i])) {\n for (let ii = i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n const temp = parseInt(data[i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[i] = temp.toString();\n }\n i = ii;\n break;\n }\n }\n }\n }\n data = data.join(\"\");\n const decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n let val;\n let applyHandler = true;\n const result = setPropertyAccess(window, \"ysmm\", {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === \"string\") {\n handler(value);\n }\n } catch (err) {}\n }\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, \"Failed to set up prevent-adfly scriptlet\");\n }\n }\n function setPropertyAccess(object, property, descriptor) {\n const currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAdfly.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventBab(source, args) {\n function preventBab(source) {\n const nativeSetTimeout = window.setTimeout;\n const babRegex = /\\.bab_elementid.$/;\n const timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== \"string\" || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n const signatures = [[\"blockadblock\"], [\"babasbm\"], [/getItem\\('babn'\\)/], [\"getElementById\", \"String.fromCharCode\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\", \"charAt\", \"DOMContentLoaded\", \"AdBlock\", \"addEventListener\", \"doScroll\", \"fromCharCode\", \"<<2|r>>4\", \"sessionStorage\", \"clientWidth\", \"localStorage\", \"Math\", \"random\"]];\n const check = function check(str) {\n if (typeof str !== \"string\") {\n return false;\n }\n for (let i = 0; i < signatures.length; i += 1) {\n const tokens = signatures[i];\n let match = 0;\n for (let j = 0; j < tokens.length; j += 1) {\n const token = tokens[j];\n const found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1;\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= .8) {\n return true;\n }\n }\n return false;\n };\n const nativeEval = window.eval;\n const evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n const bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty(\"visibility\");\n }\n const el = document.getElementById(\"babasbmsgx\");\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventBab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventElementSrcLoading(source, args) {\n function preventElementSrcLoading(source, tagName, match) {\n if (typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n const srcMockData = {\n script: \"data:text/javascript;base64,KCk9Pnt9\",\n img: \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",\n iframe: \"data:text/html;base64, PGRpdj48L2Rpdj4=\"\n };\n let instance;\n if (tagName === \"script\") {\n instance = HTMLScriptElement;\n } else if (tagName === \"img\") {\n instance = HTMLImageElement;\n } else if (tagName === \"iframe\") {\n instance = HTMLIFrameElement;\n } else {\n return;\n }\n const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === \"function\";\n let policy;\n if (hasTrustedTypes) {\n policy = window.trustedTypes.createPolicy(\"AGPolicy\", {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n const SOURCE_PROPERTY_NAME = \"src\";\n const ONERROR_PROPERTY_NAME = \"onerror\";\n const searchRegexp = toRegExp(match);\n const setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, \"matched\");\n };\n const setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n const nodeName = thisArg.nodeName.toLowerCase();\n const attrName = args[0].toLowerCase();\n const attrValue = args[1];\n const isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n const setAttributeHandler = {\n apply: setAttributeWrapper\n };\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n const origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n const nodeName = this.nodeName.toLowerCase();\n const isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n if (policy && urlValue instanceof TrustedScriptURL) {\n const trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n const origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n const isMatched = this.getAttribute(source.name) === \"matched\";\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n const addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n const eventName = args[0];\n const isMatched = typeof thisArg.getAttribute === \"function\" && thisArg.getAttribute(source.name) === \"matched\" && eventName === \"error\";\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function safeGetDescriptor(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n }\n function noopFunc() {}\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventElementSrcLoading.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventEvalIf(source, args) {\n function preventEvalIf(source, search) {\n const searchRegexp = toRegExp(search);\n const nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventEvalIf.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFab(source, args) {\n function preventFab(source) {\n hit(source);\n const Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n const fab = new Fab();\n const getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n const getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n if (Object.prototype.hasOwnProperty.call(window, \"FuckAdBlock\")) {\n window.FuckAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"FuckAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"BlockAdBlock\")) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"BlockAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"SniffAdBlock\")) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"SniffAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"fuckAdBlock\")) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, \"fuckAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"blockAdBlock\")) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, \"blockAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"sniffAdBlock\")) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, \"sniffAdBlock\", getsetfab);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function noopThis() {\n return this;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFetch(source, args) {\n function preventFetch(source, propsToMatch) {\n let responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"emptyObj\";\n let responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"default\";\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n let strResponseBody;\n if (responseBody === \"\" || responseBody === \"emptyObj\") {\n strResponseBody = \"{}\";\n } else if (responseBody === \"emptyArr\") {\n strResponseBody = \"[]\";\n } else {\n return;\n }\n if (!(responseType === \"default\" || responseType === \"opaque\")) {\n logMessage(source, \"Invalid parameter: \".concat(responseType));\n return;\n }\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n let shouldPrevent = false;\n const fetchData = getFetchData(args);\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getFetchData(args) {\n const fetchPropsObj = {};\n let fetchUrl;\n let fetchInit;\n if (args[0] instanceof Request) {\n const requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n Object.keys(fetchInit).forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n const requestInitOptions = getRequestProps();\n const entries = requestInitOptions.map(function (key) {\n const value = request[key];\n return [key, value];\n });\n return getObjectFromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n function getObjectFromEntries(entries) {\n const output = entries.reduce(function (acc, el) {\n const key = el[0];\n const value = el[1];\n acc[key] = value;\n return acc;\n }, {});\n return output;\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFetch.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventPopadsNet(source, args) {\n function preventPopadsNet(source) {\n const rid = randomId();\n const throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n function createOnErrorHandler(rid) {\n const nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.indexOf(rid) !== -1) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(this, [error, ...args]);\n }\n return false;\n };\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventPopadsNet.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRefresh(source, args) {\n function preventRefresh(source, delaySec) {\n const getMetaElements = function getMetaElements() {\n let metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n const getMetaContentDelay = function getMetaContentDelay(metaElements) {\n const delays = metaElements.map(function (meta) {\n const contentString = meta.getAttribute(\"content\");\n if (contentString.length === 0) {\n return null;\n }\n let contentDelay;\n const limiterIndex = contentString.indexOf(\";\");\n if (limiterIndex !== -1) {\n const delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n if (!delays.length) {\n return null;\n }\n const minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n return minDelay;\n };\n const stop = function stop() {\n const metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n let secondsToRun = getNumberFromString(delaySec);\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n if (secondsToRun === null) {\n return;\n }\n const delayMs = secondsToRun * 1e3;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getNumberFromString(rawString) {\n const parsedDelay = parseInt(rawString, 10);\n const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRefresh.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRequestAnimationFrame(source, args) {\n function preventRequestAnimationFrame(source, match) {\n const nativeRequestAnimationFrame = window.requestAnimationFrame;\n const shouldLog = typeof match === \"undefined\";\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const rafWrapper = function rafWrapper(callback) {\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRequestAnimationFrame.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetInterval(source, args) {\n function preventSetInterval(source, matchCallback, matchDelay) {\n const shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n let callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n const _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n const parsedDelay = parseRawDelay(delay);\n let shouldPrevent = false;\n const callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n const INVERT_MARKER = \"!\";\n const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER);\n let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n delayValue = parseInt(delayValue, 10);\n const delayMatch = nativeIsNaN(delayValue) ? null : delayValue;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n const num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n const parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetTimeout(source, args) {\n function preventSetTimeout(source, matchCallback, matchDelay) {\n const shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n const callback = args[0];\n const delay = args[1];\n let shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n const setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n let callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n const _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n const _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n const parsedDelay = parseRawDelay(delay);\n let shouldPrevent = false;\n const callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n const INVERT_MARKER = \"!\";\n const isInvertedDelayMatch = startsWith(delay, INVERT_MARKER);\n let delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n delayValue = parseInt(delayValue, 10);\n const delayMatch = nativeIsNaN(delayValue) ? null : delayValue;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n const num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n const parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventWindowOpen(source, args) {\n function preventWindowOpen(source) {\n let match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"*\";\n let delay = arguments.length > 2 ? arguments[2] : undefined;\n let replacement = arguments.length > 3 ? arguments[3] : undefined;\n const nativeOpen = window.open;\n const isNewSyntax = match !== \"0\" && match !== \"1\";\n const oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n const searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n const newOpenWrapper = function newOpenWrapper(url) {\n const shouldLog = replacement && replacement.indexOf(\"log\") > -1;\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n const argsStr = args && args.length > 0 ? \", \".concat(args.join(\", \")) : \"\";\n const message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n let shouldPrevent = false;\n if (match === \"*\") {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n const _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n const parsedDelay = parseInt(delay, 10);\n let result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n const decoyArgs = {\n replacement: replacement,\n url: url,\n delay: parsedDelay\n };\n const decoy = createDecoy(decoyArgs);\n let popup = decoy.contentWindow;\n if (typeof popup === \"object\" && popup !== null) {\n Object.defineProperty(popup, \"closed\", {\n value: false\n });\n Object.defineProperty(popup, \"opener\", {\n value: window\n });\n Object.defineProperty(popup, \"frameElement\", {\n value: null\n });\n } else {\n const nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, \"contentWindow\", {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidMatchStr(match) {\n const INVERT_MARKER = \"!\";\n let str = match;\n if (startsWith(match, INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function handleOldReplacement(replacement) {\n let result;\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === \"trueFunc\") {\n result = trueFunc;\n } else if (replacement.indexOf(\"=\") > -1) {\n const isProp = startsWith(replacement, \"{\") && endsWith(replacement, \"}\");\n if (isProp) {\n const propertyPart = replacement.slice(1, -1);\n const propertyName = substringBefore(propertyPart, \"=\");\n const propertyValue = substringAfter(propertyPart, \"=\");\n if (propertyValue === \"noopFunc\") {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n }\n function createDecoy(args) {\n const OBJECT_TAG_NAME = \"object\";\n const OBJECT_URL_PROP_NAME = \"data\";\n const IFRAME_TAG_NAME = \"iframe\";\n const IFRAME_URL_PROP_NAME = \"src\";\n const replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n let tag;\n let urlProp;\n if (replacement === \"obj\") {\n tag = OBJECT_TAG_NAME;\n urlProp = OBJECT_URL_PROP_NAME;\n } else {\n tag = IFRAME_TAG_NAME;\n urlProp = IFRAME_URL_PROP_NAME;\n }\n const decoy = document.createElement(tag);\n decoy[urlProp] = url;\n decoy.style.setProperty(\"height\", \"1px\", \"important\");\n decoy.style.setProperty(\"position\", \"fixed\", \"important\");\n decoy.style.setProperty(\"top\", \"-1px\", \"important\");\n decoy.style.setProperty(\"width\", \"1px\", \"important\");\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1e3);\n return decoy;\n }\n function getPreventGetter(nativeGetter) {\n const preventGetter = function preventGetter(target, prop) {\n if (prop && prop === \"closed\") {\n return false;\n }\n if (typeof nativeGetter === \"function\") {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n }\n function noopNull() {\n return null;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function noopFunc() {}\n function trueFunc() {\n return true;\n }\n function startsWith(str, prefix) {\n return !!str && str.indexOf(prefix) === 0;\n }\n function endsWith(str, ending) {\n return !!str && str.lastIndexOf(ending) === str.length - ending.length;\n }\n function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n }\n function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n const index = str.indexOf(separator);\n return index < 0 ? \"\" : str.substring(index + separator.length);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventWindowOpen.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventXHR(source, args) {\n function preventXHR(source, propsToMatch, customResponseText) {\n if (typeof Proxy === \"undefined\") {\n return;\n }\n let response = \"\";\n let responseText = \"\";\n let responseUrl;\n const openWrapper = function openWrapper(target, thisArg, args) {\n const xhrData = {\n method: args[0],\n url: args[1]\n };\n responseUrl = xhrData.url;\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === \"blob\") {\n response = new Blob();\n }\n if (thisArg.responseType === \"arraybuffer\") {\n response = new ArrayBuffer();\n }\n if (customResponseText) {\n const randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n responseText = randomText;\n } else {\n logMessage(source, \"Invalid range: \".concat(customResponseText));\n }\n }\n Object.defineProperties(thisArg, {\n readyState: {\n value: 4,\n writable: false\n },\n response: {\n value: response,\n writable: false\n },\n responseText: {\n value: responseText,\n writable: false\n },\n responseURL: {\n value: responseUrl,\n writable: false\n },\n responseXML: {\n value: \"\",\n writable: false\n },\n status: {\n value: 200,\n writable: false\n },\n statusText: {\n value: \"OK\",\n writable: false\n }\n });\n setTimeout(function () {\n const stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function generateRandomResponse(customResponseText) {\n let customResponse = customResponseText;\n if (customResponse === \"true\") {\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace(\"length:\", \"\");\n const rangeRegex = /^\\d+-\\d+$/;\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n let rangeMin = getNumberFromString(customResponse.split(\"-\")[0]);\n let rangeMax = getNumberFromString(customResponse.split(\"-\")[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n if (rangeMin > rangeMax) {\n const temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n const LENGTH_RANGE_LIMIT = 500 * 1e3;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n const length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n function getNumberFromString(rawString) {\n const parsedDelay = parseInt(rawString, 10);\n const validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function nativeIsFinite(num) {\n const native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n function getRandomStrByLength(length) {\n let result = \"\";\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\";\n const charactersLength = characters.length;\n for (let i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventXHR.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeAttr(source, args) {\n function removeAttr(source, attrs, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join(\"],[\"), \"]\");\n }\n const rmattr = function rmattr() {\n let nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n let removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const flags = parseFlags(applying);\n const run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.indexOf(\" \") !== -1) {\n rmattr();\n }\n observeDOMChanges(rmattr, true);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n const FLAGS_DIVIDER = \" \";\n const ASAP_FLAG = \"asap\";\n const COMPLETE_FLAG = \"complete\";\n const STAY_FLAG = \"stay\";\n const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.indexOf(f) !== -1;\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.indexOf(flag) !== -1;\n }\n };\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeClass(source, args) {\n function removeClass(source, classNames, selector) {\n let applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n let selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n const removeClassHandler = function removeClassHandler() {\n const nodes = new Set();\n if (selector) {\n let foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n const elements = document.querySelectorAll(s);\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n nodes.add(element);\n }\n });\n }\n let removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n const CLASS_ATTR_NAME = [\"class\"];\n const flags = parseFlags(applying);\n const run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.indexOf(\" \") !== -1) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n const FLAGS_DIVIDER = \" \";\n const ASAP_FLAG = \"asap\";\n const COMPLETE_FLAG = \"complete\";\n const STAY_FLAG = \"stay\";\n const VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n const passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.indexOf(f) !== -1;\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.indexOf(flag) !== -1;\n }\n };\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeClass.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeCookie(source, args) {\n function removeCookie(source, match) {\n const matchRegexp = toRegExp(match);\n const removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n const cookieSpec = \"\".concat(cookieName, \"=\");\n const domain1 = \"; domain=\".concat(hostName);\n const domain2 = \"; domain=.\".concat(hostName);\n const path = \"; path=/\";\n const expiration = \"; expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n const rmCookie = function rmCookie() {\n document.cookie.split(\";\").forEach(function (cookieStr) {\n const pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n const hostParts = document.location.hostname.split(\".\");\n for (let i = 0; i <= hostParts.length - 1; i += 1) {\n const hostName = hostParts.slice(i).join(\".\");\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener(\"beforeunload\", rmCookie);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeInShadowDom(source, args) {\n function removeInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n const removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n const removeHandler = function removeHandler() {\n let hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n while (hostElements.length !== 0) {\n let isRemoved = false;\n const _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n hostElements = innerHosts;\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n const hosts = [];\n const domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n let targets = [];\n const innerHostsAcc = [];\n hostElements.forEach(function (host) {\n const simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n const shadowRootElem = host.shadowRoot;\n const shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n const innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n const stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n const res = [];\n while (stack.length) {\n const next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setAttr(source, args) {\n function setAttr(source, selector, attr) {\n let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (!selector || !attr) {\n return;\n }\n const allowedValues = [\"true\", \"false\"];\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n const setAttr = function setAttr() {\n const nodes = [].slice.call(document.querySelectorAll(selector));\n let set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n let observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n let attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const THROTTLE_DELAY_MS = 20;\n const observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n const connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n const disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setConstant(source, args) {\n function setConstant(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n const emptyArr = noopArray();\n const emptyObj = noopObject();\n let constantValue;\n if (value === \"undefined\") {\n constantValue = undefined;\n } else if (value === \"false\") {\n constantValue = false;\n } else if (value === \"true\") {\n constantValue = true;\n } else if (value === \"null\") {\n constantValue = null;\n } else if (value === \"emptyArr\") {\n constantValue = emptyArr;\n } else if (value === \"emptyObj\") {\n constantValue = emptyObj;\n } else if (value === \"noopFunc\") {\n constantValue = noopFunc;\n } else if (value === \"noopCallbackFunc\") {\n constantValue = noopCallbackFunc;\n } else if (value === \"trueFunc\") {\n constantValue = trueFunc;\n } else if (value === \"falseFunc\") {\n constantValue = falseFunc;\n } else if (value === \"throwFunc\") {\n constantValue = throwFunc;\n } else if (value === \"noopPromiseResolve\") {\n constantValue = noopPromiseResolve;\n } else if (value === \"noopPromiseReject\") {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === \"-1\") {\n constantValue = -1;\n } else if (value === \"\") {\n constantValue = \"\";\n } else if (value === \"yes\") {\n constantValue = \"yes\";\n } else if (value === \"no\") {\n constantValue = \"no\";\n } else {\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function noopArray() {\n return [];\n }\n function noopObject() {\n return {};\n }\n function noopFunc() {}\n function noopCallbackFunc() {\n return noopFunc;\n }\n function trueFunc() {\n return true;\n }\n function falseFunc() {\n return false;\n }\n function throwFunc() {\n throw new Error();\n }\n function noopPromiseReject() {\n return Promise.reject();\n }\n function noopPromiseResolve() {\n let responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n let responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n const response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookie(source, args) {\n function setCookie(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n let validValue;\n if (value === \"true\") {\n validValue = \"true\";\n } else if (value === \"True\") {\n validValue = \"True\";\n } else if (value === \"false\") {\n validValue = \"false\";\n } else if (value === \"False\") {\n validValue = \"False\";\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"Yes\") {\n validValue = \"Yes\";\n } else if (value === \"Y\") {\n validValue = \"Y\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"ok\") {\n validValue = \"ok\";\n } else if (value === \"OK\") {\n validValue = \"OK\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookieReload(source, args) {\n function setCookieReload(source, name, value) {\n let path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n const cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n const pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n let validValue;\n if (value === \"true\") {\n validValue = \"true\";\n } else if (value === \"True\") {\n validValue = \"True\";\n } else if (value === \"false\") {\n validValue = \"false\";\n } else if (value === \"False\") {\n validValue = \"False\";\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"Yes\") {\n validValue = \"Yes\";\n } else if (value === \"Y\") {\n validValue = \"Y\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"ok\") {\n validValue = \"ok\";\n } else if (value === \"OK\") {\n validValue = \"OK\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setLocalStorageItem(source, args) {\n function setLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, validValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n let validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setPopadsDummy(source, args) {\n function setPopadsDummy(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setPopadsDummy.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setSessionStorageItem(source, args) {\n function setSessionStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n let validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n const _window = window,\n sessionStorage = _window.sessionStorage;\n setStorageItem(source, sessionStorage, key, validValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n let validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setSessionStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedClickElement(source, args) {\n function trustedClickElement(source, selectors) {\n let extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n const OBSERVER_TIMEOUT_MS = 1e4;\n const THROTTLE_DELAY_MS = 20;\n const STATIC_CLICK_DELAY_MS = 150;\n const COOKIE_MATCH_MARKER = \"cookie:\";\n const LOCAL_STORAGE_MATCH_MARKER = \"localStorage:\";\n const SELECTORS_DELIMITER = \",\";\n const COOKIE_STRING_DELIMITER = \";\";\n const EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n const sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n let parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n const isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n const message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n let canClick = !parsedDelay;\n const cookieMatches = [];\n const localStorageMatches = [];\n let isInvertedMatchCookie = false;\n let isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n const parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) {\n const _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n const cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, \"\");\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) {\n const _parseMatchArg2 = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = isInvertedMatch;\n const localStorageMatch = matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, \"\");\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n const parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n const parsedCookies = parseCookieString(document.cookie);\n const cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n const cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n const valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n const keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n const keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n const shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n const localStorageMatched = localStorageMatches.every(function (str) {\n const itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === \"\";\n });\n const shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!shouldRun) {\n return;\n }\n }\n let selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n const createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n const elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n const clickElementsBySequence = async function clickElementsBySequence() {\n for (let i = 0; i < elementsSequence.length; i += 1) {\n const elementObj = elementsSequence[i];\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n if (!elementObj.element) {\n break;\n }\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n const allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n hit(source);\n }\n };\n const handleElement = function handleElement(element, i) {\n const elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n const findElements = function findElements(mutations, observer) {\n const fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n const element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.indexOf(selector) === -1 ? selector : null;\n });\n const allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n const observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function parseCookieString(cookieString) {\n const COOKIE_DELIMITER = \"=\";\n const COOKIE_PAIRS_DELIMITER = \";\";\n const cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n const cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n let cookieKey;\n let cookieValue;\n const delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n }\n function throttle(cb, delay) {\n let wait = false;\n let savedArgs;\n const wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function parseMatchArg(match) {\n const INVERT_MARKER = \"!\";\n const isInvertedMatch = match ? match.startsWith(INVERT_MARKER) : false;\n const matchValue = isInvertedMatch ? match.slice(1) : match;\n const matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedClickElement.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceFetchResponse(source, args) {\n function trustedReplaceFetchResponse(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n logMessage(source, \"Pattern argument should not be empty string\");\n return;\n }\n const shouldLog = pattern === \"\" && replacement === \"\";\n const nativeFetch = fetch;\n let shouldReplace = false;\n let fetchData;\n const handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n const forgeResponse = function forgeResponse(response, textContent) {\n const bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n const forgedResponse = new Response(textContent, {\n status: status,\n statusText: statusText,\n headers: headers\n });\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n const patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n const forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n const fetchDataStr = objectToString(fetchData);\n const message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n const fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function getFetchData(args) {\n const fetchPropsObj = {};\n let fetchUrl;\n let fetchInit;\n if (args[0] instanceof Request) {\n const requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n Object.keys(fetchInit).forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n const requestInitOptions = getRequestProps();\n const entries = requestInitOptions.map(function (key) {\n const value = request[key];\n return [key, value];\n });\n return getObjectFromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n function getObjectFromEntries(entries) {\n const output = entries.reduce(function (acc, el) {\n const key = el[0];\n const value = el[1];\n acc[key] = value;\n return acc;\n }, {});\n return output;\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceFetchResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceXhrResponse(source, args) {\n function trustedReplaceXhrResponse(source) {\n let pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n let replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof Proxy === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n const message = \"Pattern argument should not be empty string.\";\n logMessage(source, message);\n return;\n }\n const shouldLog = pattern === \"\" && replacement === \"\";\n const nativeOpen = window.XMLHttpRequest.prototype.open;\n const nativeSend = window.XMLHttpRequest.prototype.send;\n let xhrData;\n const openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n const message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n const setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n const setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n const sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n const forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n const readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n const content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n const patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n const modifiedContent = content.replace(patternRegexp, replacement);\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState\n },\n response: {\n value: modifiedContent\n },\n responseText: {\n value: modifiedContent\n },\n responseURL: {\n value: responseURL\n },\n responseXML: {\n value: responseXML\n },\n status: {\n value: status\n },\n statusText: {\n value: statusText\n }\n });\n setTimeout(function () {\n const stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n const loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n const loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n const name = header[0];\n const value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n const openHandler = {\n apply: openWrapper\n };\n const sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : getObjectEntries(obj).map(function (pair) {\n const key = pair[0];\n const value = pair[1];\n let recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n let isMatched;\n const parsedData = parseMatchProps(propsToMatch);\n if (!validateParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n const matchData = getMatchPropsData(parsedData);\n isMatched = Object.keys(matchData).every(function (matchKey) {\n const matchValue = matchData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]);\n });\n }\n return isMatched;\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function getMatchPropsData(data) {\n const matchData = {};\n Object.keys(data).forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"mode\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\"];\n }\n function validateParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n const PROPS_DIVIDER = \" \";\n const PAIRS_MARKER = \":\";\n const LEGAL_MATCH_PROPS = getRequestProps();\n const propsObj = {};\n const props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n const dividerInd = prop.indexOf(PAIRS_MARKER);\n const key = prop.slice(0, dividerInd);\n const hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1;\n if (hasLegalMatchProp) {\n const value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n const FORWARD_SLASH = \"/\";\n let str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n let isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getObjectEntries(object) {\n const keys = Object.keys(object);\n const entries = [];\n keys.forEach(function (key) {\n return entries.push([key, object[key]]);\n });\n return entries;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceXhrResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetConstant(source, args) {\n function trustedSetConstant(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n let constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n let canceled = false;\n const mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n const trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n const origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n let prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n const message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n const setChainPropAccess = function setChainPropAccess(owner, property) {\n const chainInfo = getPropertyInChain(owner, property);\n const base = chainInfo.base;\n const prop = chainInfo.prop,\n chain = chainInfo.chain;\n const inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n const endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n const isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n const propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function inferValue(value) {\n if (value === \"undefined\") {\n return undefined;\n }\n if (value === \"false\") {\n return false;\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"null\") {\n return null;\n }\n if (value === \"NaN\") {\n return NaN;\n }\n const MAX_ALLOWED_NUM = 32767;\n const numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error(\"number values bigger than 32767 are not allowed\");\n }\n return numVal;\n }\n let errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n const parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === \"string\") {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function getPropertyInChain(base, chain) {\n const pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n const prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n const nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n const stackRegexp = toRegExp(stackMatch);\n const refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n const native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n return Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\").value;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n const INLINE_SCRIPT_STRING = \"inlineScript\";\n const INJECTED_SCRIPT_STRING = \"injectedScript\";\n const INJECTED_SCRIPT_MARKER = \"\";\n const isInlineScript = function isInlineScript(stackMatch) {\n return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1;\n };\n const isInjectedScript = function isInjectedScript(stackMatch) {\n return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1;\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n let documentURL = window.location.href;\n const pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n const stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n const stackLines = stackSteps.map(function (line) {\n let stack;\n const getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n let stackURL = getStackTraceURL[2];\n if (startsWith(stackURL, \"(\")) {\n stackURL = stackURL.slice(1);\n }\n if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) {\n stackURL = INJECTED_SCRIPT_STRING;\n let stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if (startsWith(stackFunction, \"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (let index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookie(source, args) {\n function trustedSetCookie(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n const ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n const ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n const MS_IN_SEC = 1e3;\n const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n const SECONDS_IN_DAY = 24 * 60 * 60;\n let parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = \"$now$\";\n const CURRENT_DATE_KEYWORD = \"$currentDate$\";\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookieReload(source, args) {\n function trustedSetCookieReload(source, name, value) {\n let offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n let path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n const parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n let cookieToSet = concatCookieNameValuePath(name, parsedValue, path);\n if (!cookieToSet) {\n return;\n }\n if (offsetExpiresSec) {\n const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n const expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n const pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n return \"\".concat(encodeURIComponent(rawName), \"=\").concat(encodeURIComponent(rawValue), \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n const ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n const ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n const MS_IN_SEC = 1e3;\n const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n const SECONDS_IN_DAY = 24 * 60 * 60;\n let parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = \"$now$\";\n const CURRENT_DATE_KEYWORD = \"$currentDate$\";\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetLocalStorageItem(source, args) {\n function trustedSetLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Item value should be specified\");\n return;\n }\n const parsedValue = parseKeywordValue(value);\n const _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n const message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function parseKeywordValue(rawValue) {\n const NOW_VALUE_KEYWORD = \"$now$\";\n const CURRENT_DATE_KEYWORD = \"$currentDate$\";\n let parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function xmlPrune(source, args) {\n function xmlPrune(source, propsToRemove) {\n var _this = this;\n let optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n let urlToMatch = arguments.length > 3 ? arguments[3] : undefined;\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n let shouldPruneResponse = true;\n if (!propsToRemove) {\n shouldPruneResponse = false;\n }\n const urlMatchRegexp = toRegExp(urlToMatch);\n const isXML = function isXML(text) {\n if (typeof text === \"string\") {\n const trimedText = text.trim();\n if (trimedText.startsWith(\"<\") && trimedText.endsWith(\">\")) {\n return true;\n }\n }\n return false;\n };\n const createXMLDocument = function createXMLDocument(text) {\n const xmlParser = new DOMParser();\n const xmlDocument = xmlParser.parseFromString(text, \"text/xml\");\n return xmlDocument;\n };\n const pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n const xmlDoc = createXMLDocument(text);\n const errorNode = xmlDoc.querySelector(\"parsererror\");\n if (errorNode) {\n return text;\n }\n if (optionalProp !== \"\" && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n const elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n const serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n const xhrWrapper = function xhrWrapper(target, thisArg, args) {\n const xhrURL = args[1];\n if (typeof xhrURL !== \"string\" || xhrURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(xhrURL)) {\n thisArg.addEventListener(\"readystatechange\", function pruneResponse() {\n if (thisArg.readyState === 4) {\n const response = thisArg.response;\n thisArg.removeEventListener(\"readystatechange\", pruneResponse);\n if (!shouldPruneResponse) {\n if (isXML(response)) {\n const message = \"XMLHttpRequest.open() URL: \".concat(xhrURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n const prunedResponseContent = pruneXML(response);\n if (shouldPruneResponse) {\n Object.defineProperty(thisArg, \"response\", {\n value: prunedResponseContent\n });\n Object.defineProperty(thisArg, \"responseText\", {\n value: prunedResponseContent\n });\n hit(source);\n }\n shouldPruneResponse = true;\n }\n }\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const xhrHandler = {\n apply: xhrWrapper\n };\n window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler);\n const nativeFetch = window.fetch;\n const fetchWrapper = function fetchWrapper(target, thisArg, args) {\n const fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n return nativeFetch.apply(_this, args).then(function (response) {\n return response.text().then(function (text) {\n if (!shouldPruneResponse) {\n if (isXML(text)) {\n const message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(text);\n logMessage(source, message);\n logMessage(source, createXMLDocument(text), true, false);\n }\n return Reflect.apply(target, thisArg, args);\n }\n const prunedText = pruneXML(text);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n shouldPruneResponse = true;\n return Reflect.apply(target, thisArg, args);\n });\n });\n }\n return Reflect.apply(target, thisArg, args);\n };\n const fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n const log = console.log.bind(console);\n const trace = console.trace.bind(console);\n let prefix = source.ruleText || \"\";\n if (source.domainName) {\n const AG_SCRIPTLET_MARKER = \"#%#//\";\n const UBO_SCRIPTLET_MARKER = \"##+js\";\n let ruleStartIndex;\n if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n const rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n let forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n const name = source.name,\n ruleText = source.ruleText,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n const nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n let messageStr = \"\".concat(name, \": \").concat(message);\n if (ruleText) {\n const RULE_MARKER = \"#%#//scriptlet\";\n const markerIdx = ruleText.indexOf(RULE_MARKER);\n if (markerIdx > -1) {\n const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length);\n messageStr += \"; cannot apply rule: \".concat(ruleWithoutDomains);\n }\n }\n nativeConsole(messageStr);\n }\n function toRegExp() {\n let input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n const DEFAULT_VALUE = \".?\";\n const FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n return new RegExp(input.slice(1, -1));\n }\n const escaped = input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n xmlPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n const scriptletsMap = {\n \"abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-current-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script.js\": abortCurrentInlineScript,\n \"acs.js\": abortCurrentInlineScript,\n \"ubo-acs.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script\": abortCurrentInlineScript,\n \"ubo-acs\": abortCurrentInlineScript,\n \"abort-current-inline-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script.js\": abortCurrentInlineScript,\n \"acis.js\": abortCurrentInlineScript,\n \"ubo-acis.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script\": abortCurrentInlineScript,\n \"ubo-acis\": abortCurrentInlineScript,\n \"abp-abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-read.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read.js\": abortOnPropertyRead,\n \"aopr.js\": abortOnPropertyRead,\n \"ubo-aopr.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read\": abortOnPropertyRead,\n \"ubo-aopr\": abortOnPropertyRead,\n \"abp-abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-property-write.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write.js\": abortOnPropertyWrite,\n \"aopw.js\": abortOnPropertyWrite,\n \"ubo-aopw.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write\": abortOnPropertyWrite,\n \"ubo-aopw\": abortOnPropertyWrite,\n \"abp-abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-stack-trace\": abortOnStackTrace,\n \"abort-on-stack-trace.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace.js\": abortOnStackTrace,\n \"aost.js\": abortOnStackTrace,\n \"ubo-aost.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace\": abortOnStackTrace,\n \"ubo-aost\": abortOnStackTrace,\n \"abp-abort-on-stack-trace\": abortOnStackTrace,\n \"adjust-setInterval\": adjustSetInterval,\n \"nano-setInterval-booster.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster.js\": adjustSetInterval,\n \"nano-sib.js\": adjustSetInterval,\n \"ubo-nano-sib.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster\": adjustSetInterval,\n \"ubo-nano-sib\": adjustSetInterval,\n \"adjust-setTimeout\": adjustSetTimeout,\n \"nano-setTimeout-booster.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster.js\": adjustSetTimeout,\n \"nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster\": adjustSetTimeout,\n \"ubo-nano-stb\": adjustSetTimeout,\n \"debug-current-inline-script\": debugCurrentInlineScript,\n \"debug-on-property-read\": debugOnPropertyRead,\n \"debug-on-property-write\": debugOnPropertyWrite,\n \"dir-string\": dirString,\n \"abp-dir-string\": dirString,\n \"disable-newtab-links\": disableNewtabLinks,\n \"disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links\": disableNewtabLinks,\n \"close-window\": forceWindowClose,\n \"window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if\": forceWindowClose,\n \"hide-in-shadow-dom\": hideInShadowDom,\n \"inject-css-in-shadow-dom\": injectCssInShadowDom,\n \"json-prune\": jsonPrune,\n \"json-prune.js\": jsonPrune,\n \"ubo-json-prune.js\": jsonPrune,\n \"ubo-json-prune\": jsonPrune,\n \"abp-json-prune\": jsonPrune,\n log: log,\n \"log-addEventListener\": logAddEventListener,\n \"addEventListener-logger.js\": logAddEventListener,\n \"ubo-addEventListener-logger.js\": logAddEventListener,\n \"aell.js\": logAddEventListener,\n \"ubo-aell.js\": logAddEventListener,\n \"ubo-addEventListener-logger\": logAddEventListener,\n \"ubo-aell\": logAddEventListener,\n \"log-eval\": logEval,\n \"log-on-stack-trace\": logOnStacktrace,\n \"m3u-prune\": m3uPrune,\n \"m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune\": m3uPrune,\n \"no-topics\": noTopics,\n noeval: noeval,\n \"noeval.js\": noeval,\n \"silent-noeval.js\": noeval,\n \"ubo-noeval.js\": noeval,\n \"ubo-silent-noeval.js\": noeval,\n \"ubo-noeval\": noeval,\n \"ubo-silent-noeval\": noeval,\n nowebrtc: nowebrtc,\n \"nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc\": nowebrtc,\n \"prevent-addEventListener\": preventAddEventListener,\n \"addEventListener-defuser.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser.js\": preventAddEventListener,\n \"aeld.js\": preventAddEventListener,\n \"ubo-aeld.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser\": preventAddEventListener,\n \"ubo-aeld\": preventAddEventListener,\n \"prevent-adfly\": preventAdfly,\n \"adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser\": preventAdfly,\n \"prevent-bab\": preventBab,\n \"prevent-element-src-loading\": preventElementSrcLoading,\n \"prevent-eval-if\": preventEvalIf,\n \"noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if\": preventEvalIf,\n \"prevent-fab-3.2.0\": preventFab,\n \"nofab.js\": preventFab,\n \"ubo-nofab.js\": preventFab,\n \"fuckadblock.js-3.2.0\": preventFab,\n \"ubo-fuckadblock.js-3.2.0\": preventFab,\n \"ubo-nofab\": preventFab,\n \"prevent-fetch\": preventFetch,\n \"no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if\": preventFetch,\n \"prevent-popads-net\": preventPopadsNet,\n \"popads.net.js\": preventPopadsNet,\n \"ubo-popads.net.js\": preventPopadsNet,\n \"ubo-popads.net\": preventPopadsNet,\n \"prevent-refresh\": preventRefresh,\n \"refresh-defuser.js\": preventRefresh,\n \"refresh-defuser\": preventRefresh,\n \"ubo-refresh-defuser.js\": preventRefresh,\n \"ubo-refresh-defuser\": preventRefresh,\n \"prevent-requestAnimationFrame\": preventRequestAnimationFrame,\n \"no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"norafif.js\": preventRequestAnimationFrame,\n \"ubo-norafif.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if\": preventRequestAnimationFrame,\n \"ubo-norafif\": preventRequestAnimationFrame,\n \"prevent-setInterval\": preventSetInterval,\n \"no-setInterval-if.js\": preventSetInterval,\n \"ubo-no-setInterval-if.js\": preventSetInterval,\n \"setInterval-defuser.js\": preventSetInterval,\n \"ubo-setInterval-defuser.js\": preventSetInterval,\n \"nosiif.js\": preventSetInterval,\n \"ubo-nosiif.js\": preventSetInterval,\n \"sid.js\": preventSetInterval,\n \"ubo-sid.js\": preventSetInterval,\n \"ubo-no-setInterval-if\": preventSetInterval,\n \"ubo-setInterval-defuser\": preventSetInterval,\n \"ubo-nosiif\": preventSetInterval,\n \"ubo-sid\": preventSetInterval,\n \"prevent-setTimeout\": preventSetTimeout,\n \"no-setTimeout-if.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if.js\": preventSetTimeout,\n \"nostif.js\": preventSetTimeout,\n \"ubo-nostif.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if\": preventSetTimeout,\n \"ubo-nostif\": preventSetTimeout,\n \"setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser\": preventSetTimeout,\n \"std.js\": preventSetTimeout,\n \"ubo-std.js\": preventSetTimeout,\n \"ubo-std\": preventSetTimeout,\n \"prevent-window-open\": preventWindowOpen,\n \"window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser\": preventWindowOpen,\n \"nowoif.js\": preventWindowOpen,\n \"ubo-nowoif.js\": preventWindowOpen,\n \"ubo-nowoif\": preventWindowOpen,\n \"prevent-xhr\": preventXHR,\n \"no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if\": preventXHR,\n \"remove-attr\": removeAttr,\n \"remove-attr.js\": removeAttr,\n \"ubo-remove-attr.js\": removeAttr,\n \"ra.js\": removeAttr,\n \"ubo-ra.js\": removeAttr,\n \"ubo-remove-attr\": removeAttr,\n \"ubo-ra\": removeAttr,\n \"remove-class\": removeClass,\n \"remove-class.js\": removeClass,\n \"ubo-remove-class.js\": removeClass,\n \"rc.js\": removeClass,\n \"ubo-rc.js\": removeClass,\n \"ubo-remove-class\": removeClass,\n \"ubo-rc\": removeClass,\n \"remove-cookie\": removeCookie,\n \"cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover\": removeCookie,\n \"remove-in-shadow-dom\": removeInShadowDom,\n \"set-attr\": setAttr,\n \"set-constant\": setConstant,\n \"set-constant.js\": setConstant,\n \"ubo-set-constant.js\": setConstant,\n \"set.js\": setConstant,\n \"ubo-set.js\": setConstant,\n \"ubo-set-constant\": setConstant,\n \"ubo-set\": setConstant,\n \"abp-override-property-read\": setConstant,\n \"set-cookie\": setCookie,\n \"set-cookie-reload\": setCookieReload,\n \"set-local-storage-item\": setLocalStorageItem,\n \"set-popads-dummy\": setPopadsDummy,\n \"popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy\": setPopadsDummy,\n \"set-session-storage-item\": setSessionStorageItem,\n \"trusted-click-element\": trustedClickElement,\n \"trusted-replace-fetch-response\": trustedReplaceFetchResponse,\n \"trusted-replace-xhr-response\": trustedReplaceXhrResponse,\n \"trusted-set-constant\": trustedSetConstant,\n \"trusted-set-cookie\": trustedSetCookie,\n \"trusted-set-cookie-reload\": trustedSetCookieReload,\n \"trusted-set-local-storage-item\": trustedSetLocalStorageItem,\n \"xml-prune\": xmlPrune,\n \"xml-prune.js\": xmlPrune,\n \"ubo-xml-prune.js\": xmlPrune,\n \"ubo-xml-prune\": xmlPrune\n };\n var getScriptletFunction = function getScriptletFunction(name) {\n return scriptletsMap[name];\n };\n function getScriptletCode(source) {\n if (!validator.isValidScriptletName(source.name)) {\n return null;\n }\n const scriptletFunction = getScriptletFunction(source.name);\n if (typeof scriptletFunction !== 'function') {\n throw new Error(\"Error: cannot invoke scriptlet with name: '\".concat(source.name, \"'\"));\n }\n const scriptletFunctionString = scriptletFunction.toString();\n const result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString);\n return result;\n }\n const scriptletsObject = function () {\n return {\n invoke: getScriptletCode,\n getScriptletFunction,\n isValidScriptletName: validator.isValidScriptletName,\n isValidScriptletRule,\n isAdgScriptletRule: validator.isAdgScriptletRule,\n isUboScriptletRule: validator.isUboScriptletRule,\n isAbpSnippetRule: validator.isAbpSnippetRule,\n convertUboToAdg: convertUboScriptletToAdg,\n convertAbpToAdg: convertAbpSnippetToAdg,\n convertScriptletToAdg,\n convertAdgToUbo: convertAdgScriptletToUbo,\n redirects\n };\n }();\n scriptlets_umd.exports = scriptletsObject;\n}));\n\n/**\n * Redirect modifier class\n */\nvar RedirectModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n * @param ruleText\n * @param isAllowlist\n * @param isRedirectingOnlyBlocked is redirect-rule modifier\n */\n function RedirectModifier(value, ruleText, isAllowlist, isRedirectingOnlyBlocked) {\n if (isRedirectingOnlyBlocked === void 0) { isRedirectingOnlyBlocked = false; }\n /**\n * Is redirecting only blocked requests\n * See $redirect-rule options\n */\n this.isRedirectingOnlyBlocked = false;\n RedirectModifier.validate(ruleText, value, isAllowlist);\n this.redirectTitle = value;\n this.isRedirectingOnlyBlocked = isRedirectingOnlyBlocked;\n }\n /**\n * Redirect title\n */\n RedirectModifier.prototype.getValue = function () {\n return this.redirectTitle;\n };\n /**\n * Validates redirect rule\n *\n * @param ruleText\n * @param redirectTitle\n * @param isAllowlist\n */\n RedirectModifier.validate = function (ruleText, redirectTitle, isAllowlist) {\n if (isAllowlist && !redirectTitle) {\n return;\n }\n if (!redirectTitle) {\n throw new SyntaxError('Invalid $redirect rule, redirect value must not be empty');\n }\n var redirects = scriptlets_umd.exports.redirects;\n var ruleTextToValidate = ruleText.replace(NETWORK_RULE_OPTIONS.REDIRECTRULE, NETWORK_RULE_OPTIONS.REDIRECT);\n if (!redirects.isAdgRedirectRule(ruleTextToValidate) || !redirects.isValidAdgRedirectRule(ruleTextToValidate)) {\n throw new SyntaxError('$redirect modifier is invalid');\n }\n };\n return RedirectModifier;\n}());\n\n/**\n * Splits url into parts\n *\n * @param url\n */\nfunction splitUrl(url) {\n var strippedUrl = url;\n var hash = '';\n var hashIndex = url.indexOf('#');\n if (hashIndex >= 0) {\n hash = url.slice(hashIndex);\n strippedUrl = url.slice(0, hashIndex);\n }\n var query = '';\n var queryIndex = url.indexOf('?');\n if (queryIndex >= 0) {\n query = strippedUrl.slice(queryIndex + 1);\n strippedUrl = strippedUrl.slice(0, queryIndex);\n }\n return {\n path: strippedUrl,\n query: query,\n hash: hash,\n };\n}\n/**\n * Normalizes url query parameters\n *\n * @param query\n */\nfunction normalizeQuery(query) {\n // Cleanup empty params (p0=0&=2&=3)\n var result = query\n .split('&')\n .filter(function (x) { return x && !x.startsWith('='); })\n .join('&');\n // If we've collapsed the URL to the point where there's an '&' against the '?'\n // then we need to get rid of that.\n while (result.charAt(0) === '&') {\n result = result.substr(1);\n }\n return result;\n}\n/**\n * Removes query params from url by regexp\n *\n * @param url\n * @param regExp\n * @param invert remove every parameter in url except the ones matched regexp\n */\nfunction cleanUrlParamByRegExp(url, regExp, invert) {\n if (invert === void 0) { invert = false; }\n var searchIndex = url.indexOf('?');\n // If no params, nothing to modify\n if (searchIndex === -1) {\n return url;\n }\n var split = splitUrl(url);\n var modifiedQuery;\n if (invert) {\n modifiedQuery = split.query\n .split('&')\n .filter(function (x) { return x; })\n .filter(function (x) { return x && x.match(regExp); })\n .join('&');\n }\n else {\n modifiedQuery = split.query\n .split('&')\n .filter(function (x) {\n var test = x.includes('=') ? x : \"\".concat(x, \"=\");\n return !test.match(regExp);\n })\n .join('&');\n }\n // Do not normalize if regexp is not applied\n if (modifiedQuery === split.query) {\n return url;\n }\n modifiedQuery = normalizeQuery(modifiedQuery);\n var result = split.path;\n if (modifiedQuery) {\n result += \"?\".concat(modifiedQuery);\n }\n return result + split.hash;\n}\nvar DOMAIN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+$/;\n/**\n * Check if the string could be a domain name\n *\n * @param text\n */\nvar isDomainName = function (text) {\n if (text.indexOf('.') < 0 || text.endsWith('.')) {\n return false;\n }\n return DOMAIN_REGEX.test(text);\n};\n/**\n * Extract relative part from hierarchical structured URL\n * @param url\n */\nvar getRelativeUrl = function (url) {\n var i = url.indexOf('/', url.indexOf('://') + 3);\n return i !== -1 ? url.substr(i) : null;\n};\n\n/**\n * Query parameters filtering modifier class\n * Works with '$removeparam' modifier\n */\nvar RemoveParamModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function RemoveParamModifier(value) {\n /**\n * Is modifier valid for MV3 or not\n */\n this.mv3Valid = true;\n this.value = value;\n var rawValue = value;\n // TODO: Seems like negation not using in valueRegExp\n if (value.startsWith('~')) {\n rawValue = value.substring(1);\n this.mv3Valid = false;\n }\n if (rawValue.startsWith('/')) {\n this.valueRegExp = SimpleRegex.patternFromString(rawValue);\n this.mv3Valid = false;\n }\n else {\n if (rawValue.includes('|')) {\n throw new Error('Unsupported option in $removeparam: multiple values are not allowed');\n }\n this.valueRegExp = new RegExp(\"((^|&)(\".concat(SimpleRegex.escapeRegexSpecials(rawValue), \")=[^&#]*)\"), 'g');\n }\n }\n /**\n * Modifier value\n */\n RemoveParamModifier.prototype.getValue = function () {\n return this.value;\n };\n /**\n * Is modifier valid for MV3 or not\n */\n RemoveParamModifier.prototype.getMV3Validity = function () {\n return this.mv3Valid;\n };\n /**\n * Removes query parameters from url\n *\n * @param url\n */\n RemoveParamModifier.prototype.removeParameters = function (url) {\n var sepIndex = url.indexOf('?');\n if (sepIndex < 0) {\n return url;\n }\n if (!this.value) {\n return url.substring(0, sepIndex);\n }\n if (sepIndex === url.length - 1) {\n return url;\n }\n if (this.value.startsWith('~')) {\n return cleanUrlParamByRegExp(url, this.valueRegExp, true);\n }\n return cleanUrlParamByRegExp(url, this.valueRegExp);\n };\n return RemoveParamModifier;\n}());\n\n/**\n * Headers filtering modifier class.\n * Rules with $removeheader modifier are intended to remove headers from HTTP requests and responses.\n */\nvar RemoveHeaderModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n * @param isAllowlist\n */\n function RemoveHeaderModifier(value, isAllowlist) {\n this.value = value.toLowerCase();\n if (!isAllowlist && !this.value) {\n throw new SyntaxError('Invalid $removeheader rule, removeheader value must not be empty');\n }\n this.isRequestModifier = this.value.startsWith(RemoveHeaderModifier.REQUEST_PREFIX);\n var headerName = this.isRequestModifier\n ? this.value.substring(RemoveHeaderModifier.REQUEST_PREFIX.length) : this.value;\n this.applicableHeaderName = RemoveHeaderModifier.isAllowedHeader(headerName) ? headerName : null;\n }\n /**\n * Modifier value\n */\n RemoveHeaderModifier.prototype.getValue = function () {\n return this.value;\n };\n /**\n * Returns effective header name to be removed\n *\n * @param isRequestHeaders\n */\n RemoveHeaderModifier.prototype.getApplicableHeaderName = function (isRequestHeaders) {\n if (!this.applicableHeaderName) {\n return null;\n }\n if (isRequestHeaders !== this.isRequestModifier) {\n return null;\n }\n return this.applicableHeaderName;\n };\n /**\n * Some headers are forbidden to remove\n *\n * @param headerName\n */\n RemoveHeaderModifier.isAllowedHeader = function (headerName) {\n return !this.FORBIDDEN_HEADERS.includes(headerName);\n };\n /**\n * List of forbidden headers\n */\n RemoveHeaderModifier.FORBIDDEN_HEADERS = [\n 'access-control-allow-origin',\n 'access-control-allow-credentials',\n 'access-control-allow-headers',\n 'access-control-allow-methods',\n 'access-control-expose-headers',\n 'access-control-max-age',\n 'access-control-request-headers',\n 'access-control-request-method',\n 'origin',\n 'timing-allow-origin',\n 'allow',\n 'cross-origin-embedder-policy',\n 'cross-origin-opener-policy',\n 'cross-origin-resource-policy',\n 'content-security-policy',\n 'content-security-policy-report-only',\n 'expect-ct',\n 'feature-policy',\n 'origin-isolation',\n 'strict-transport-security',\n 'upgrade-insecure-requests',\n 'x-content-type-options',\n 'x-download-options',\n 'x-frame-options',\n 'x-permitted-cross-domain-policies',\n 'x-powered-by',\n 'x-xss-protection',\n 'public-key-pins',\n 'public-key-pins-report-only',\n 'sec-websocket-key',\n 'sec-websocket-extensions',\n 'sec-websocket-accept',\n 'sec-websocket-protocol',\n 'sec-websocket-version',\n 'p3p',\n 'sec-fetch-mode',\n 'sec-fetch-dest',\n 'sec-fetch-site',\n 'sec-fetch-user',\n 'referrer-policy',\n 'content-type',\n 'content-length',\n 'accept',\n 'accept-encoding',\n 'host',\n 'connection',\n 'transfer-encoding',\n 'upgrade',\n ];\n /**\n * Request prefix\n */\n RemoveHeaderModifier.REQUEST_PREFIX = 'request:';\n return RemoveHeaderModifier;\n}());\n\nvar ErrorStatusCodes;\n(function (ErrorStatusCodes) {\n ErrorStatusCodes[ErrorStatusCodes[\"ComplexRegex\"] = 1001] = \"ComplexRegex\";\n ErrorStatusCodes[ErrorStatusCodes[\"RuleLimit\"] = 1002] = \"RuleLimit\";\n ErrorStatusCodes[ErrorStatusCodes[\"RegexpRuleLimit\"] = 1003] = \"RegexpRuleLimit\";\n ErrorStatusCodes[ErrorStatusCodes[\"RemoveparamRegexpIsNotSupported\"] = 1004] = \"RemoveparamRegexpIsNotSupported\";\n ErrorStatusCodes[ErrorStatusCodes[\"RemoveparamInversionIsNotSupported\"] = 1005] = \"RemoveparamInversionIsNotSupported\";\n})(ErrorStatusCodes || (ErrorStatusCodes = {}));\nvar SEPARATOR = '|';\n\n/**\n * This is a helper class that is used specifically to work with app restrictions.\n *\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app\n *\n * Examples:\n * ||baddomain.com^$app=org.example.app\n * ||baddomain.com^$app=org.example.app1|org.example.app2\n */\nvar AppModifier = /** @class */ (function () {\n /**\n * Parses the `apps` string\n *\n * @param apps - apps string\n *\n * @throws an error if the app string is empty or invalid\n */\n function AppModifier(apps) {\n if (!apps) {\n throw new SyntaxError('$app modifier cannot be empty');\n }\n var permittedApps = [];\n var restrictedApps = [];\n var parts = apps.split(SEPARATOR);\n for (var i = 0; i < parts.length; i += 1) {\n var app = parts[i];\n var restricted = false;\n if (app.startsWith('~')) {\n restricted = true;\n app = app.substring(1).trim();\n }\n if (app === '') {\n throw new SyntaxError(\"Empty app specified in \\\"\".concat(apps, \"\\\"\"));\n }\n if (restricted) {\n restrictedApps.push(app);\n }\n else {\n permittedApps.push(app);\n }\n }\n this.restrictedApps = restrictedApps.length > 0 ? restrictedApps : null;\n this.permittedApps = permittedApps.length > 0 ? permittedApps : null;\n }\n return AppModifier;\n}());\n\n/**\n * Checks if error has message.\n *\n * @param error Error object.\n * @returns If param is error.\n */\nfunction isErrorWithMessage(error) {\n return (typeof error === 'object'\n && error !== null\n && 'message' in error\n && typeof error.message === 'string');\n}\n/**\n * Converts error to the error with message.\n *\n * @param maybeError Possible error.\n * @returns Error with message.\n */\nfunction toErrorWithMessage(maybeError) {\n if (isErrorWithMessage(maybeError)) {\n return maybeError;\n }\n try {\n return new Error(JSON.stringify(maybeError));\n }\n catch (_a) {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n/**\n * Converts error object to error with message. This method might be helpful to handle thrown errors.\n *\n * @param error Error object.\n *\n * @returns Message of the error.\n */\nfunction getErrorMessage(error) {\n return toErrorWithMessage(error).message;\n}\n\nvar isCidr = {exports: {}};\n\nvar cidrRegex = {exports: {}};\n\nconst word = '[a-fA-F\\\\d:]';\nconst b = options => options && options.includeBoundaries ?\n\t`(?:(?<=\\\\s|^)(?=${word})|(?<=${word})(?=\\\\s|$))` :\n\t'';\nconst v4$1 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\nconst v6seg = '[a-fA-F\\\\d]{1,4}';\nconst v6$1 = `\n(?:\n(?:${v6seg}:){7}(?:${v6seg}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:${v6seg}:){6}(?:${v4$1}|:${v6seg}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:${v6seg}:){5}(?::${v4$1}|(?::${v6seg}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:${v6seg}:){4}(?:(?::${v6seg}){0,1}:${v4$1}|(?::${v6seg}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:${v6seg}:){3}(?:(?::${v6seg}){0,2}:${v4$1}|(?::${v6seg}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:${v6seg}:){2}(?:(?::${v6seg}){0,3}:${v4$1}|(?::${v6seg}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:${v6seg}:){1}(?:(?::${v6seg}){0,4}:${v4$1}|(?::${v6seg}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::${v6seg}){0,5}:${v4$1}|(?::${v6seg}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n`.replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim();\nconst v46Exact = new RegExp(`(?:^${v4$1}$)|(?:^${v6$1}$)`);\nconst v4exact$1 = new RegExp(`^${v4$1}$`);\nconst v6exact$1 = new RegExp(`^${v6$1}$`);\nconst ip = options => options && options.exact ?\n\tv46Exact :\n\tnew RegExp(`(?:${b(options)}${v4$1}${b(options)})|(?:${b(options)}${v6$1}${b(options)})`, 'g');\nip.v4 = options => options && options.exact ? v4exact$1 : new RegExp(`${b(options)}${v4$1}${b(options)}`, 'g');\nip.v6 = options => options && options.exact ? v6exact$1 : new RegExp(`${b(options)}${v6$1}${b(options)}`, 'g');\nvar ipRegex$2 = ip;\n\nconst ipRegex$1 = ipRegex$2;\nconst defaultOpts = {exact: false};\nconst v4str = `${ipRegex$1.v4().source}\\\\/(3[0-2]|[12]?[0-9])`;\nconst v6str = `${ipRegex$1.v6().source}\\\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])`;\nconst v4exact = new RegExp(`^${v4str}$`);\nconst v6exact = new RegExp(`^${v6str}$`);\nconst v46exact = new RegExp(`(?:^${v4str}$)|(?:^${v6str}$)`);\ncidrRegex.exports = ({exact} = defaultOpts) => exact ? v46exact : new RegExp(`(?:${v4str})|(?:${v6str})`, \"g\");\ncidrRegex.exports.v4 = ({exact} = defaultOpts) => exact ? v4exact : new RegExp(v4str, \"g\");\ncidrRegex.exports.v6 = ({exact} = defaultOpts) => exact ? v6exact : new RegExp(v6str, \"g\");\n\nconst {v4, v6} = cidrRegex.exports;\nconst re4 = v4({exact: true});\nconst re6 = v6({exact: true});\nisCidr.exports = str => re4.test(str) ? 4 : (re6.test(str) ? 6 : 0);\nisCidr.exports.v4 = str => re4.test(str);\nisCidr.exports.v6 = str => re6.test(str);\n\nconst ipRegex = ipRegex$2;\nconst isIp = string => ipRegex({exact: true}).test(string);\nisIp.v4 = string => ipRegex.v4({exact: true}).test(string);\nisIp.v6 = string => ipRegex.v6({exact: true}).test(string);\nisIp.version = string => isIp(string) ? (isIp.v4(string) ? 4 : 6) : undefined;\nvar isIp_1 = isIp;\n\nvar Netmask_1;\n(function() {\n var Netmask, atob, chr, chr0, chrA, chra, ip2long, long2ip;\n long2ip = function(long) {\n var a, b, c, d;\n a = (long & (0xff << 24)) >>> 24;\n b = (long & (0xff << 16)) >>> 16;\n c = (long & (0xff << 8)) >>> 8;\n d = long & 0xff;\n return [a, b, c, d].join('.');\n };\n ip2long = function(ip) {\n var b, c, i, j, n, ref;\n b = [];\n for (i = j = 0; j <= 3; i = ++j) {\n if (ip.length === 0) {\n break;\n }\n if (i > 0) {\n if (ip[0] !== '.') {\n throw new Error('Invalid IP');\n }\n ip = ip.substring(1);\n }\n ref = atob(ip), n = ref[0], c = ref[1];\n ip = ip.substring(c);\n b.push(n);\n }\n if (ip.length !== 0) {\n throw new Error('Invalid IP');\n }\n switch (b.length) {\n case 1:\n if (b[0] > 0xFFFFFFFF) {\n throw new Error('Invalid IP');\n }\n return b[0] >>> 0;\n case 2:\n if (b[0] > 0xFF || b[1] > 0xFFFFFF) {\n throw new Error('Invalid IP');\n }\n return (b[0] << 24 | b[1]) >>> 0;\n case 3:\n if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFFFF) {\n throw new Error('Invalid IP');\n }\n return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0;\n case 4:\n if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFF || b[3] > 0xFF) {\n throw new Error('Invalid IP');\n }\n return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0;\n default:\n throw new Error('Invalid IP');\n }\n };\n chr = function(b) {\n return b.charCodeAt(0);\n };\n chr0 = chr('0');\n chra = chr('a');\n chrA = chr('A');\n atob = function(s) {\n var base, dmax, i, n, start;\n n = 0;\n base = 10;\n dmax = '9';\n i = 0;\n if (s.length > 1 && s[i] === '0') {\n if (s[i + 1] === 'x' || s[i + 1] === 'X') {\n i += 2;\n base = 16;\n } else if ('0' <= s[i + 1] && s[i + 1] <= '9') {\n i++;\n base = 8;\n dmax = '7';\n }\n }\n start = i;\n while (i < s.length) {\n if ('0' <= s[i] && s[i] <= dmax) {\n n = (n * base + (chr(s[i]) - chr0)) >>> 0;\n } else if (base === 16) {\n if ('a' <= s[i] && s[i] <= 'f') {\n n = (n * base + (10 + chr(s[i]) - chra)) >>> 0;\n } else if ('A' <= s[i] && s[i] <= 'F') {\n n = (n * base + (10 + chr(s[i]) - chrA)) >>> 0;\n } else {\n break;\n }\n } else {\n break;\n }\n if (n > 0xFFFFFFFF) {\n throw new Error('too large');\n }\n i++;\n }\n if (i === start) {\n throw new Error('empty octet');\n }\n return [n, i];\n };\n Netmask = (function() {\n function Netmask(net, mask) {\n var i, j, ref;\n if (typeof net !== 'string') {\n throw new Error(\"Missing `net' parameter\");\n }\n if (!mask) {\n ref = net.split('/', 2), net = ref[0], mask = ref[1];\n }\n if (!mask) {\n mask = 32;\n }\n if (typeof mask === 'string' && mask.indexOf('.') > -1) {\n try {\n this.maskLong = ip2long(mask);\n } catch (error1) {\n throw new Error(\"Invalid mask: \" + mask);\n }\n for (i = j = 32; j >= 0; i = --j) {\n if (this.maskLong === (0xffffffff << (32 - i)) >>> 0) {\n this.bitmask = i;\n break;\n }\n }\n } else if (mask || mask === 0) {\n this.bitmask = parseInt(mask, 10);\n this.maskLong = 0;\n if (this.bitmask > 0) {\n this.maskLong = (0xffffffff << (32 - this.bitmask)) >>> 0;\n }\n } else {\n throw new Error(\"Invalid mask: empty\");\n }\n try {\n this.netLong = (ip2long(net) & this.maskLong) >>> 0;\n } catch (error1) {\n throw new Error(\"Invalid net address: \" + net);\n }\n if (!(this.bitmask <= 32)) {\n throw new Error(\"Invalid mask for ip4: \" + mask);\n }\n this.size = Math.pow(2, 32 - this.bitmask);\n this.base = long2ip(this.netLong);\n this.mask = long2ip(this.maskLong);\n this.hostmask = long2ip(~this.maskLong);\n this.first = this.bitmask <= 30 ? long2ip(this.netLong + 1) : this.base;\n this.last = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 2) : long2ip(this.netLong + this.size - 1);\n this.broadcast = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 1) : void 0;\n }\n Netmask.prototype.contains = function(ip) {\n if (typeof ip === 'string' && (ip.indexOf('/') > 0 || ip.split('.').length !== 4)) {\n ip = new Netmask(ip);\n }\n if (ip instanceof Netmask) {\n return this.contains(ip.base) && this.contains(ip.broadcast || ip.last);\n } else {\n return (ip2long(ip) & this.maskLong) >>> 0 === (this.netLong & this.maskLong) >>> 0;\n }\n };\n Netmask.prototype.next = function(count) {\n if (count == null) {\n count = 1;\n }\n return new Netmask(long2ip(this.netLong + (this.size * count)), this.mask);\n };\n Netmask.prototype.forEach = function(fn) {\n var index, lastLong, long;\n long = ip2long(this.first);\n lastLong = ip2long(this.last);\n index = 0;\n while (long <= lastLong) {\n fn(long2ip(long), long, index);\n index++;\n long++;\n }\n };\n Netmask.prototype.toString = function() {\n return this.base + \"/\" + this.bitmask;\n };\n return Netmask;\n })();\n Netmask_1 = Netmask;\n}).call(commonjsGlobal);\n\nvar global$2 = (typeof global !== \"undefined\" ? global :\n typeof self !== \"undefined\" ? self :\n typeof window !== \"undefined\" ? window : {});\n\nvar lookup$1 = [];\nvar revLookup$1 = [];\nvar Arr$1 = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;\nvar inited$1 = false;\nfunction init$1 () {\n inited$1 = true;\n var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n for (var i = 0, len = code.length; i < len; ++i) {\n lookup$1[i] = code[i];\n revLookup$1[code.charCodeAt(i)] = i;\n }\n revLookup$1['-'.charCodeAt(0)] = 62;\n revLookup$1['_'.charCodeAt(0)] = 63;\n}\nfunction toByteArray$1 (b64) {\n if (!inited$1) {\n init$1();\n }\n var i, j, l, tmp, placeHolders, arr;\n var len = b64.length;\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0;\n arr = new Arr$1(len * 3 / 4 - placeHolders);\n l = placeHolders > 0 ? len - 4 : len;\n var L = 0;\n for (i = 0, j = 0; i < l; i += 4, j += 3) {\n tmp = (revLookup$1[b64.charCodeAt(i)] << 18) | (revLookup$1[b64.charCodeAt(i + 1)] << 12) | (revLookup$1[b64.charCodeAt(i + 2)] << 6) | revLookup$1[b64.charCodeAt(i + 3)];\n arr[L++] = (tmp >> 16) & 0xFF;\n arr[L++] = (tmp >> 8) & 0xFF;\n arr[L++] = tmp & 0xFF;\n }\n if (placeHolders === 2) {\n tmp = (revLookup$1[b64.charCodeAt(i)] << 2) | (revLookup$1[b64.charCodeAt(i + 1)] >> 4);\n arr[L++] = tmp & 0xFF;\n } else if (placeHolders === 1) {\n tmp = (revLookup$1[b64.charCodeAt(i)] << 10) | (revLookup$1[b64.charCodeAt(i + 1)] << 4) | (revLookup$1[b64.charCodeAt(i + 2)] >> 2);\n arr[L++] = (tmp >> 8) & 0xFF;\n arr[L++] = tmp & 0xFF;\n }\n return arr\n}\nfunction tripletToBase64$1 (num) {\n return lookup$1[num >> 18 & 0x3F] + lookup$1[num >> 12 & 0x3F] + lookup$1[num >> 6 & 0x3F] + lookup$1[num & 0x3F]\n}\nfunction encodeChunk$1 (uint8, start, end) {\n var tmp;\n var output = [];\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);\n output.push(tripletToBase64$1(tmp));\n }\n return output.join('')\n}\nfunction fromByteArray$1 (uint8) {\n if (!inited$1) {\n init$1();\n }\n var tmp;\n var len = uint8.length;\n var extraBytes = len % 3;\n var output = '';\n var parts = [];\n var maxChunkLength = 16383;\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk$1(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));\n }\n if (extraBytes === 1) {\n tmp = uint8[len - 1];\n output += lookup$1[tmp >> 2];\n output += lookup$1[(tmp << 4) & 0x3F];\n output += '==';\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + (uint8[len - 1]);\n output += lookup$1[tmp >> 10];\n output += lookup$1[(tmp >> 4) & 0x3F];\n output += lookup$1[(tmp << 2) & 0x3F];\n output += '=';\n }\n parts.push(output);\n return parts.join('')\n}\n\nfunction read$1 (buffer, offset, isLE, mLen, nBytes) {\n var e, m;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = -7;\n var i = isLE ? (nBytes - 1) : 0;\n var d = isLE ? -1 : 1;\n var s = buffer[offset + i];\n i += d;\n e = s & ((1 << (-nBits)) - 1);\n s >>= (-nBits);\n nBits += eLen;\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n m = e & ((1 << (-nBits)) - 1);\n e >>= (-nBits);\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen);\n e = e - eBias;\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\nfunction write$1 (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);\n var i = isLE ? 0 : (nBytes - 1);\n var d = isLE ? 1 : -1;\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;\n value = Math.abs(value);\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0;\n e = eMax;\n } else {\n e = Math.floor(Math.log(value) / Math.LN2);\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * Math.pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n e = (e << mLen) | m;\n eLen += mLen;\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n buffer[offset + i - d] |= s * 128;\n}\n\nvar toString$1 = {}.toString;\nvar isArray$3 = Array.isArray || function (arr) {\n return toString$1.call(arr) == '[object Array]';\n};\n\nvar INSPECT_MAX_BYTES$1 = 50;\nBuffer$1.TYPED_ARRAY_SUPPORT = global$2.TYPED_ARRAY_SUPPORT !== undefined\n ? global$2.TYPED_ARRAY_SUPPORT\n : true;\nkMaxLength$1();\nfunction kMaxLength$1 () {\n return Buffer$1.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\nfunction createBuffer$1 (that, length) {\n if (kMaxLength$1() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n that = new Uint8Array(length);\n that.__proto__ = Buffer$1.prototype;\n } else {\n if (that === null) {\n that = new Buffer$1(length);\n }\n that.length = length;\n }\n return that\n}\nfunction Buffer$1 (arg, encodingOrOffset, length) {\n if (!Buffer$1.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer$1)) {\n return new Buffer$1(arg, encodingOrOffset, length)\n }\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe$1(this, arg)\n }\n return from$1(this, arg, encodingOrOffset, length)\n}\nBuffer$1.poolSize = 8192;\nBuffer$1._augment = function (arr) {\n arr.__proto__ = Buffer$1.prototype;\n return arr\n};\nfunction from$1 (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer$1(that, value, encodingOrOffset, length)\n }\n if (typeof value === 'string') {\n return fromString$1(that, value, encodingOrOffset)\n }\n return fromObject$1(that, value)\n}\nBuffer$1.from = function (value, encodingOrOffset, length) {\n return from$1(null, value, encodingOrOffset, length)\n};\nif (Buffer$1.TYPED_ARRAY_SUPPORT) {\n Buffer$1.prototype.__proto__ = Uint8Array.prototype;\n Buffer$1.__proto__ = Uint8Array;\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer$1[Symbol.species] === Buffer$1) ;\n}\nfunction assertSize$1 (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\nfunction alloc$1 (that, size, fill, encoding) {\n assertSize$1(size);\n if (size <= 0) {\n return createBuffer$1(that, size)\n }\n if (fill !== undefined) {\n return typeof encoding === 'string'\n ? createBuffer$1(that, size).fill(fill, encoding)\n : createBuffer$1(that, size).fill(fill)\n }\n return createBuffer$1(that, size)\n}\nBuffer$1.alloc = function (size, fill, encoding) {\n return alloc$1(null, size, fill, encoding)\n};\nfunction allocUnsafe$1 (that, size) {\n assertSize$1(size);\n that = createBuffer$1(that, size < 0 ? 0 : checked$1(size) | 0);\n if (!Buffer$1.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0;\n }\n }\n return that\n}\nBuffer$1.allocUnsafe = function (size) {\n return allocUnsafe$1(null, size)\n};\nBuffer$1.allocUnsafeSlow = function (size) {\n return allocUnsafe$1(null, size)\n};\nfunction fromString$1 (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8';\n }\n if (!Buffer$1.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n var length = byteLength$1(string, encoding) | 0;\n that = createBuffer$1(that, length);\n var actual = that.write(string, encoding);\n if (actual !== length) {\n that = that.slice(0, actual);\n }\n return that\n}\nfunction fromArrayLike$1 (that, array) {\n var length = array.length < 0 ? 0 : checked$1(array.length) | 0;\n that = createBuffer$1(that, length);\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255;\n }\n return that\n}\nfunction fromArrayBuffer$1 (that, array, byteOffset, length) {\n array.byteLength;\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array);\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset);\n } else {\n array = new Uint8Array(array, byteOffset, length);\n }\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n that = array;\n that.__proto__ = Buffer$1.prototype;\n } else {\n that = fromArrayLike$1(that, array);\n }\n return that\n}\nfunction fromObject$1 (that, obj) {\n if (internalIsBuffer$1(obj)) {\n var len = checked$1(obj.length) | 0;\n that = createBuffer$1(that, len);\n if (that.length === 0) {\n return that\n }\n obj.copy(that, 0, 0, len);\n return that\n }\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan$1(obj.length)) {\n return createBuffer$1(that, 0)\n }\n return fromArrayLike$1(that, obj)\n }\n if (obj.type === 'Buffer' && isArray$3(obj.data)) {\n return fromArrayLike$1(that, obj.data)\n }\n }\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\nfunction checked$1 (length) {\n if (length >= kMaxLength$1()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength$1().toString(16) + ' bytes')\n }\n return length | 0\n}\nBuffer$1.isBuffer = isBuffer$2;\nfunction internalIsBuffer$1 (b) {\n return !!(b != null && b._isBuffer)\n}\nBuffer$1.compare = function compare (a, b) {\n if (!internalIsBuffer$1(a) || !internalIsBuffer$1(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n if (a === b) return 0\n var x = a.length;\n var y = b.length;\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break\n }\n }\n if (x < y) return -1\n if (y < x) return 1\n return 0\n};\nBuffer$1.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n};\nBuffer$1.concat = function concat (list, length) {\n if (!isArray$3(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n if (list.length === 0) {\n return Buffer$1.alloc(0)\n }\n var i;\n if (length === undefined) {\n length = 0;\n for (i = 0; i < list.length; ++i) {\n length += list[i].length;\n }\n }\n var buffer = Buffer$1.allocUnsafe(length);\n var pos = 0;\n for (i = 0; i < list.length; ++i) {\n var buf = list[i];\n if (!internalIsBuffer$1(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos);\n pos += buf.length;\n }\n return buffer\n};\nfunction byteLength$1 (string, encoding) {\n if (internalIsBuffer$1(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string;\n }\n var len = string.length;\n if (len === 0) return 0\n var loweredCase = false;\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes$1(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes$1(string).length\n default:\n if (loweredCase) return utf8ToBytes$1(string).length\n encoding = ('' + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n}\nBuffer$1.byteLength = byteLength$1;\nfunction slowToString$1 (encoding, start, end) {\n var loweredCase = false;\n if (start === undefined || start < 0) {\n start = 0;\n }\n if (start > this.length) {\n return ''\n }\n if (end === undefined || end > this.length) {\n end = this.length;\n }\n if (end <= 0) {\n return ''\n }\n end >>>= 0;\n start >>>= 0;\n if (end <= start) {\n return ''\n }\n if (!encoding) encoding = 'utf8';\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice$1(this, start, end)\n case 'utf8':\n case 'utf-8':\n return utf8Slice$1(this, start, end)\n case 'ascii':\n return asciiSlice$1(this, start, end)\n case 'latin1':\n case 'binary':\n return latin1Slice$1(this, start, end)\n case 'base64':\n return base64Slice$1(this, start, end)\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice$1(this, start, end)\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase();\n loweredCase = true;\n }\n }\n}\nBuffer$1.prototype._isBuffer = true;\nfunction swap$1 (b, n, m) {\n var i = b[n];\n b[n] = b[m];\n b[m] = i;\n}\nBuffer$1.prototype.swap16 = function swap16 () {\n var len = this.length;\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap$1(this, i, i + 1);\n }\n return this\n};\nBuffer$1.prototype.swap32 = function swap32 () {\n var len = this.length;\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap$1(this, i, i + 3);\n swap$1(this, i + 1, i + 2);\n }\n return this\n};\nBuffer$1.prototype.swap64 = function swap64 () {\n var len = this.length;\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap$1(this, i, i + 7);\n swap$1(this, i + 1, i + 6);\n swap$1(this, i + 2, i + 5);\n swap$1(this, i + 3, i + 4);\n }\n return this\n};\nBuffer$1.prototype.toString = function toString () {\n var length = this.length | 0;\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice$1(this, 0, length)\n return slowToString$1.apply(this, arguments)\n};\nBuffer$1.prototype.equals = function equals (b) {\n if (!internalIsBuffer$1(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer$1.compare(this, b) === 0\n};\nBuffer$1.prototype.inspect = function inspect () {\n var str = '';\n var max = INSPECT_MAX_BYTES$1;\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');\n if (this.length > max) str += ' ... ';\n }\n return ''\n};\nBuffer$1.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!internalIsBuffer$1(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n if (start === undefined) {\n start = 0;\n }\n if (end === undefined) {\n end = target ? target.length : 0;\n }\n if (thisStart === undefined) {\n thisStart = 0;\n }\n if (thisEnd === undefined) {\n thisEnd = this.length;\n }\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n start >>>= 0;\n end >>>= 0;\n thisStart >>>= 0;\n thisEnd >>>= 0;\n if (this === target) return 0\n var x = thisEnd - thisStart;\n var y = end - start;\n var len = Math.min(x, y);\n var thisCopy = this.slice(thisStart, thisEnd);\n var targetCopy = target.slice(start, end);\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i];\n y = targetCopy[i];\n break\n }\n }\n if (x < y) return -1\n if (y < x) return 1\n return 0\n};\nfunction bidirectionalIndexOf$1 (buffer, val, byteOffset, encoding, dir) {\n if (buffer.length === 0) return -1\n if (typeof byteOffset === 'string') {\n encoding = byteOffset;\n byteOffset = 0;\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff;\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000;\n }\n byteOffset = +byteOffset;\n if (isNaN(byteOffset)) {\n byteOffset = dir ? 0 : (buffer.length - 1);\n }\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset;\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1;\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0;\n else return -1\n }\n if (typeof val === 'string') {\n val = Buffer$1.from(val, encoding);\n }\n if (internalIsBuffer$1(val)) {\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf$1(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF;\n if (Buffer$1.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf$1(buffer, [ val ], byteOffset, encoding, dir)\n }\n throw new TypeError('val must be string, number or Buffer')\n}\nfunction arrayIndexOf$1 (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1;\n var arrLength = arr.length;\n var valLength = val.length;\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase();\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2;\n arrLength /= 2;\n valLength /= 2;\n byteOffset /= 2;\n }\n }\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n var i;\n if (dir) {\n var foundIndex = -1;\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i;\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex;\n foundIndex = -1;\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n for (i = byteOffset; i >= 0; i--) {\n var found = true;\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false;\n break\n }\n }\n if (found) return i\n }\n }\n return -1\n}\nBuffer$1.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n};\nBuffer$1.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf$1(this, val, byteOffset, encoding, true)\n};\nBuffer$1.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf$1(this, val, byteOffset, encoding, false)\n};\nfunction hexWrite$1 (buf, string, offset, length) {\n offset = Number(offset) || 0;\n var remaining = buf.length - offset;\n if (!length) {\n length = remaining;\n } else {\n length = Number(length);\n if (length > remaining) {\n length = remaining;\n }\n }\n var strLen = string.length;\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n if (length > strLen / 2) {\n length = strLen / 2;\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16);\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed;\n }\n return i\n}\nfunction utf8Write$1 (buf, string, offset, length) {\n return blitBuffer$1(utf8ToBytes$1(string, buf.length - offset), buf, offset, length)\n}\nfunction asciiWrite$1 (buf, string, offset, length) {\n return blitBuffer$1(asciiToBytes$1(string), buf, offset, length)\n}\nfunction latin1Write$1 (buf, string, offset, length) {\n return asciiWrite$1(buf, string, offset, length)\n}\nfunction base64Write$1 (buf, string, offset, length) {\n return blitBuffer$1(base64ToBytes$1(string), buf, offset, length)\n}\nfunction ucs2Write$1 (buf, string, offset, length) {\n return blitBuffer$1(utf16leToBytes$1(string, buf.length - offset), buf, offset, length)\n}\nBuffer$1.prototype.write = function write (string, offset, length, encoding) {\n if (offset === undefined) {\n encoding = 'utf8';\n length = this.length;\n offset = 0;\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset;\n length = this.length;\n offset = 0;\n } else if (isFinite(offset)) {\n offset = offset | 0;\n if (isFinite(length)) {\n length = length | 0;\n if (encoding === undefined) encoding = 'utf8';\n } else {\n encoding = length;\n length = undefined;\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n var remaining = this.length - offset;\n if (length === undefined || length > remaining) length = remaining;\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n if (!encoding) encoding = 'utf8';\n var loweredCase = false;\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite$1(this, string, offset, length)\n case 'utf8':\n case 'utf-8':\n return utf8Write$1(this, string, offset, length)\n case 'ascii':\n return asciiWrite$1(this, string, offset, length)\n case 'latin1':\n case 'binary':\n return latin1Write$1(this, string, offset, length)\n case 'base64':\n return base64Write$1(this, string, offset, length)\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write$1(this, string, offset, length)\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n};\nBuffer$1.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n};\nfunction base64Slice$1 (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return fromByteArray$1(buf)\n } else {\n return fromByteArray$1(buf.slice(start, end))\n }\n}\nfunction utf8Slice$1 (buf, start, end) {\n end = Math.min(buf.length, end);\n var res = [];\n var i = start;\n while (i < end) {\n var firstByte = buf[i];\n var codePoint = null;\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1;\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint;\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte;\n }\n break\n case 2:\n secondByte = buf[i + 1];\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F);\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint;\n }\n }\n break\n case 3:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F);\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint;\n }\n }\n break\n case 4:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n fourthByte = buf[i + 3];\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F);\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint;\n }\n }\n }\n }\n if (codePoint === null) {\n codePoint = 0xFFFD;\n bytesPerSequence = 1;\n } else if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n res.push(codePoint >>> 10 & 0x3FF | 0xD800);\n codePoint = 0xDC00 | codePoint & 0x3FF;\n }\n res.push(codePoint);\n i += bytesPerSequence;\n }\n return decodeCodePointsArray$1(res)\n}\nvar MAX_ARGUMENTS_LENGTH$1 = 0x1000;\nfunction decodeCodePointsArray$1 (codePoints) {\n var len = codePoints.length;\n if (len <= MAX_ARGUMENTS_LENGTH$1) {\n return String.fromCharCode.apply(String, codePoints)\n }\n var res = '';\n var i = 0;\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH$1)\n );\n }\n return res\n}\nfunction asciiSlice$1 (buf, start, end) {\n var ret = '';\n end = Math.min(buf.length, end);\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F);\n }\n return ret\n}\nfunction latin1Slice$1 (buf, start, end) {\n var ret = '';\n end = Math.min(buf.length, end);\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i]);\n }\n return ret\n}\nfunction hexSlice$1 (buf, start, end) {\n var len = buf.length;\n if (!start || start < 0) start = 0;\n if (!end || end < 0 || end > len) end = len;\n var out = '';\n for (var i = start; i < end; ++i) {\n out += toHex$1(buf[i]);\n }\n return out\n}\nfunction utf16leSlice$1 (buf, start, end) {\n var bytes = buf.slice(start, end);\n var res = '';\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n }\n return res\n}\nBuffer$1.prototype.slice = function slice (start, end) {\n var len = this.length;\n start = ~~start;\n end = end === undefined ? len : ~~end;\n if (start < 0) {\n start += len;\n if (start < 0) start = 0;\n } else if (start > len) {\n start = len;\n }\n if (end < 0) {\n end += len;\n if (end < 0) end = 0;\n } else if (end > len) {\n end = len;\n }\n if (end < start) end = start;\n var newBuf;\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end);\n newBuf.__proto__ = Buffer$1.prototype;\n } else {\n var sliceLen = end - start;\n newBuf = new Buffer$1(sliceLen, undefined);\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start];\n }\n }\n return newBuf\n};\nfunction checkOffset$1 (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\nBuffer$1.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset$1(offset, byteLength, this.length);\n var val = this[offset];\n var mul = 1;\n var i = 0;\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul;\n }\n return val\n};\nBuffer$1.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) {\n checkOffset$1(offset, byteLength, this.length);\n }\n var val = this[offset + --byteLength];\n var mul = 1;\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul;\n }\n return val\n};\nBuffer$1.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 1, this.length);\n return this[offset]\n};\nBuffer$1.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 2, this.length);\n return this[offset] | (this[offset + 1] << 8)\n};\nBuffer$1.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 2, this.length);\n return (this[offset] << 8) | this[offset + 1]\n};\nBuffer$1.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 4, this.length);\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n};\nBuffer$1.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 4, this.length);\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n};\nBuffer$1.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset$1(offset, byteLength, this.length);\n var val = this[offset];\n var mul = 1;\n var i = 0;\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul;\n }\n mul *= 0x80;\n if (val >= mul) val -= Math.pow(2, 8 * byteLength);\n return val\n};\nBuffer$1.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset$1(offset, byteLength, this.length);\n var i = byteLength;\n var mul = 1;\n var val = this[offset + --i];\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul;\n }\n mul *= 0x80;\n if (val >= mul) val -= Math.pow(2, 8 * byteLength);\n return val\n};\nBuffer$1.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 1, this.length);\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n};\nBuffer$1.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 2, this.length);\n var val = this[offset] | (this[offset + 1] << 8);\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n};\nBuffer$1.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 2, this.length);\n var val = this[offset + 1] | (this[offset] << 8);\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n};\nBuffer$1.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 4, this.length);\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n};\nBuffer$1.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 4, this.length);\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n};\nBuffer$1.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 4, this.length);\n return read$1(this, offset, true, 23, 4)\n};\nBuffer$1.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 4, this.length);\n return read$1(this, offset, false, 23, 4)\n};\nBuffer$1.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 8, this.length);\n return read$1(this, offset, true, 52, 8)\n};\nBuffer$1.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset$1(offset, 8, this.length);\n return read$1(this, offset, false, 52, 8)\n};\nfunction checkInt$1 (buf, value, offset, ext, max, min) {\n if (!internalIsBuffer$1(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\nBuffer$1.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1;\n checkInt$1(this, value, offset, byteLength, maxBytes, 0);\n }\n var mul = 1;\n var i = 0;\n this[offset] = value & 0xFF;\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF;\n }\n return offset + byteLength\n};\nBuffer$1.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1;\n checkInt$1(this, value, offset, byteLength, maxBytes, 0);\n }\n var i = byteLength - 1;\n var mul = 1;\n this[offset + i] = value & 0xFF;\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF;\n }\n return offset + byteLength\n};\nBuffer$1.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 1, 0xff, 0);\n if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value);\n this[offset] = (value & 0xff);\n return offset + 1\n};\nfunction objectWriteUInt16$1 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1;\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8;\n }\n}\nBuffer$1.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0);\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff);\n this[offset + 1] = (value >>> 8);\n } else {\n objectWriteUInt16$1(this, value, offset, true);\n }\n return offset + 2\n};\nBuffer$1.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0);\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8);\n this[offset + 1] = (value & 0xff);\n } else {\n objectWriteUInt16$1(this, value, offset, false);\n }\n return offset + 2\n};\nfunction objectWriteUInt32$1 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1;\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff;\n }\n}\nBuffer$1.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0);\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24);\n this[offset + 2] = (value >>> 16);\n this[offset + 1] = (value >>> 8);\n this[offset] = (value & 0xff);\n } else {\n objectWriteUInt32$1(this, value, offset, true);\n }\n return offset + 4\n};\nBuffer$1.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0);\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24);\n this[offset + 1] = (value >>> 16);\n this[offset + 2] = (value >>> 8);\n this[offset + 3] = (value & 0xff);\n } else {\n objectWriteUInt32$1(this, value, offset, false);\n }\n return offset + 4\n};\nBuffer$1.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1);\n checkInt$1(this, value, offset, byteLength, limit - 1, -limit);\n }\n var i = 0;\n var mul = 1;\n var sub = 0;\n this[offset] = value & 0xFF;\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1;\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;\n }\n return offset + byteLength\n};\nBuffer$1.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1);\n checkInt$1(this, value, offset, byteLength, limit - 1, -limit);\n }\n var i = byteLength - 1;\n var mul = 1;\n var sub = 0;\n this[offset + i] = value & 0xFF;\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1;\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;\n }\n return offset + byteLength\n};\nBuffer$1.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 1, 0x7f, -0x80);\n if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value);\n if (value < 0) value = 0xff + value + 1;\n this[offset] = (value & 0xff);\n return offset + 1\n};\nBuffer$1.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000);\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff);\n this[offset + 1] = (value >>> 8);\n } else {\n objectWriteUInt16$1(this, value, offset, true);\n }\n return offset + 2\n};\nBuffer$1.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000);\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8);\n this[offset + 1] = (value & 0xff);\n } else {\n objectWriteUInt16$1(this, value, offset, false);\n }\n return offset + 2\n};\nBuffer$1.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000);\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff);\n this[offset + 1] = (value >>> 8);\n this[offset + 2] = (value >>> 16);\n this[offset + 3] = (value >>> 24);\n } else {\n objectWriteUInt32$1(this, value, offset, true);\n }\n return offset + 4\n};\nBuffer$1.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000);\n if (value < 0) value = 0xffffffff + value + 1;\n if (Buffer$1.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24);\n this[offset + 1] = (value >>> 16);\n this[offset + 2] = (value >>> 8);\n this[offset + 3] = (value & 0xff);\n } else {\n objectWriteUInt32$1(this, value, offset, false);\n }\n return offset + 4\n};\nfunction checkIEEE754$1 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\nfunction writeFloat$1 (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754$1(buf, value, offset, 4);\n }\n write$1(buf, value, offset, littleEndian, 23, 4);\n return offset + 4\n}\nBuffer$1.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat$1(this, value, offset, true, noAssert)\n};\nBuffer$1.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat$1(this, value, offset, false, noAssert)\n};\nfunction writeDouble$1 (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754$1(buf, value, offset, 8);\n }\n write$1(buf, value, offset, littleEndian, 52, 8);\n return offset + 8\n}\nBuffer$1.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble$1(this, value, offset, true, noAssert)\n};\nBuffer$1.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble$1(this, value, offset, false, noAssert)\n};\nBuffer$1.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0;\n if (!end && end !== 0) end = this.length;\n if (targetStart >= target.length) targetStart = target.length;\n if (!targetStart) targetStart = 0;\n if (end > 0 && end < start) end = start;\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n if (end > this.length) end = this.length;\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start;\n }\n var len = end - start;\n var i;\n if (this === target && start < targetStart && targetStart < end) {\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start];\n }\n } else if (len < 1000 || !Buffer$1.TYPED_ARRAY_SUPPORT) {\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start];\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n );\n }\n return len\n};\nBuffer$1.prototype.fill = function fill (val, start, end, encoding) {\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start;\n start = 0;\n end = this.length;\n } else if (typeof end === 'string') {\n encoding = end;\n end = this.length;\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0);\n if (code < 256) {\n val = code;\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer$1.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255;\n }\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n if (end <= start) {\n return this\n }\n start = start >>> 0;\n end = end === undefined ? this.length : end >>> 0;\n if (!val) val = 0;\n var i;\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val;\n }\n } else {\n var bytes = internalIsBuffer$1(val)\n ? val\n : utf8ToBytes$1(new Buffer$1(val, encoding).toString());\n var len = bytes.length;\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len];\n }\n }\n return this\n};\nvar INVALID_BASE64_RE$1 = /[^+\\/0-9A-Za-z-_]/g;\nfunction base64clean$1 (str) {\n str = stringtrim$1(str).replace(INVALID_BASE64_RE$1, '');\n if (str.length < 2) return ''\n while (str.length % 4 !== 0) {\n str = str + '=';\n }\n return str\n}\nfunction stringtrim$1 (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\nfunction toHex$1 (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\nfunction utf8ToBytes$1 (string, units) {\n units = units || Infinity;\n var codePoint;\n var length = string.length;\n var leadSurrogate = null;\n var bytes = [];\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i);\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n if (!leadSurrogate) {\n if (codePoint > 0xDBFF) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n continue\n } else if (i + 1 === length) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n continue\n }\n leadSurrogate = codePoint;\n continue\n }\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n leadSurrogate = codePoint;\n continue\n }\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;\n } else if (leadSurrogate) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n }\n leadSurrogate = null;\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n );\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n );\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n );\n } else {\n throw new Error('Invalid code point')\n }\n }\n return bytes\n}\nfunction asciiToBytes$1 (str) {\n var byteArray = [];\n for (var i = 0; i < str.length; ++i) {\n byteArray.push(str.charCodeAt(i) & 0xFF);\n }\n return byteArray\n}\nfunction utf16leToBytes$1 (str, units) {\n var c, hi, lo;\n var byteArray = [];\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n c = str.charCodeAt(i);\n hi = c >> 8;\n lo = c % 256;\n byteArray.push(lo);\n byteArray.push(hi);\n }\n return byteArray\n}\nfunction base64ToBytes$1 (str) {\n return toByteArray$1(base64clean$1(str))\n}\nfunction blitBuffer$1 (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i];\n }\n return i\n}\nfunction isnan$1 (val) {\n return val !== val\n}\nfunction isBuffer$2(obj) {\n return obj != null && (!!obj._isBuffer || isFastBuffer$1(obj) || isSlowBuffer$1(obj))\n}\nfunction isFastBuffer$1 (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\nfunction isSlowBuffer$1 (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer$1(obj.slice(0, 0))\n}\n\nfunction defaultSetTimout$1() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout$1 () {\n throw new Error('clearTimeout has not been defined');\n}\nvar cachedSetTimeout$1 = defaultSetTimout$1;\nvar cachedClearTimeout$1 = defaultClearTimeout$1;\nif (typeof global$2.setTimeout === 'function') {\n cachedSetTimeout$1 = setTimeout;\n}\nif (typeof global$2.clearTimeout === 'function') {\n cachedClearTimeout$1 = clearTimeout;\n}\nfunction runTimeout$1(fun) {\n if (cachedSetTimeout$1 === setTimeout) {\n return setTimeout(fun, 0);\n }\n if ((cachedSetTimeout$1 === defaultSetTimout$1 || !cachedSetTimeout$1) && setTimeout) {\n cachedSetTimeout$1 = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n return cachedSetTimeout$1(fun, 0);\n } catch(e){\n try {\n return cachedSetTimeout$1.call(null, fun, 0);\n } catch(e){\n return cachedSetTimeout$1.call(this, fun, 0);\n }\n }\n}\nfunction runClearTimeout$1(marker) {\n if (cachedClearTimeout$1 === clearTimeout) {\n return clearTimeout(marker);\n }\n if ((cachedClearTimeout$1 === defaultClearTimeout$1 || !cachedClearTimeout$1) && clearTimeout) {\n cachedClearTimeout$1 = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n return cachedClearTimeout$1(marker);\n } catch (e){\n try {\n return cachedClearTimeout$1.call(null, marker);\n } catch (e){\n return cachedClearTimeout$1.call(this, marker);\n }\n }\n}\nvar queue$1 = [];\nvar draining$1 = false;\nvar currentQueue$1;\nvar queueIndex$1 = -1;\nfunction cleanUpNextTick$1() {\n if (!draining$1 || !currentQueue$1) {\n return;\n }\n draining$1 = false;\n if (currentQueue$1.length) {\n queue$1 = currentQueue$1.concat(queue$1);\n } else {\n queueIndex$1 = -1;\n }\n if (queue$1.length) {\n drainQueue$1();\n }\n}\nfunction drainQueue$1() {\n if (draining$1) {\n return;\n }\n var timeout = runTimeout$1(cleanUpNextTick$1);\n draining$1 = true;\n var len = queue$1.length;\n while(len) {\n currentQueue$1 = queue$1;\n queue$1 = [];\n while (++queueIndex$1 < len) {\n if (currentQueue$1) {\n currentQueue$1[queueIndex$1].run();\n }\n }\n queueIndex$1 = -1;\n len = queue$1.length;\n }\n currentQueue$1 = null;\n draining$1 = false;\n runClearTimeout$1(timeout);\n}\nfunction nextTick$1(fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue$1.push(new Item$1(fun, args));\n if (queue$1.length === 1 && !draining$1) {\n runTimeout$1(drainQueue$1);\n }\n}\nfunction Item$1(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem$1.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nvar title$1 = 'browser';\nvar platform$1 = 'browser';\nvar browser$2 = true;\nvar env$1 = {};\nvar argv$1 = [];\nvar version$1 = '';\nvar versions$1 = {};\nvar release$1 = {};\nvar config$1 = {};\nfunction noop$2() {}\nvar on$1 = noop$2;\nvar addListener$1 = noop$2;\nvar once$1 = noop$2;\nvar off$1 = noop$2;\nvar removeListener$1 = noop$2;\nvar removeAllListeners$1 = noop$2;\nvar emit$1 = noop$2;\nfunction binding$1(name) {\n throw new Error('process.binding is not supported');\n}\nfunction cwd$1 () { return '/' }\nfunction chdir$1 (dir) {\n throw new Error('process.chdir is not supported');\n}function umask$1() { return 0; }\nvar performance$1 = global$2.performance || {};\nvar performanceNow$1 =\n performance$1.now ||\n performance$1.mozNow ||\n performance$1.msNow ||\n performance$1.oNow ||\n performance$1.webkitNow ||\n function(){ return (new Date()).getTime() };\nfunction hrtime$1(previousTimestamp){\n var clocktime = performanceNow$1.call(performance$1)*1e-3;\n var seconds = Math.floor(clocktime);\n var nanoseconds = Math.floor((clocktime%1)*1e9);\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0];\n nanoseconds = nanoseconds - previousTimestamp[1];\n if (nanoseconds<0) {\n seconds--;\n nanoseconds += 1e9;\n }\n }\n return [seconds,nanoseconds]\n}\nvar startTime$1 = new Date();\nfunction uptime$1() {\n var currentTime = new Date();\n var dif = currentTime - startTime$1;\n return dif / 1000;\n}\nvar process = {\n nextTick: nextTick$1,\n title: title$1,\n browser: browser$2,\n env: env$1,\n argv: argv$1,\n version: version$1,\n versions: versions$1,\n on: on$1,\n addListener: addListener$1,\n once: once$1,\n off: off$1,\n removeListener: removeListener$1,\n removeAllListeners: removeAllListeners$1,\n emit: emit$1,\n binding: binding$1,\n cwd: cwd$1,\n chdir: chdir$1,\n umask: umask$1,\n hrtime: hrtime$1,\n platform: platform$1,\n release: release$1,\n config: config$1,\n uptime: uptime$1\n};\n\nvar global$1 = (typeof global !== \"undefined\" ? global :\n typeof self !== \"undefined\" ? self :\n typeof window !== \"undefined\" ? window : {});\n\nvar lookup = [];\nvar revLookup = [];\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;\nvar inited = false;\nfunction init () {\n inited = true;\n var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n for (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i];\n revLookup[code.charCodeAt(i)] = i;\n }\n\n revLookup['-'.charCodeAt(0)] = 62;\n revLookup['_'.charCodeAt(0)] = 63;\n}\n\nfunction toByteArray (b64) {\n if (!inited) {\n init();\n }\n var i, j, l, tmp, placeHolders, arr;\n var len = b64.length;\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // the number of equal signs (place holders)\n // if there are two placeholders, than the two characters before it\n // represent one byte\n // if there is only one, then the three characters before it represent 2 bytes\n // this is just a cheap hack to not do indexOf twice\n placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0;\n\n // base64 is 4/3 + up to two characters of the original data\n arr = new Arr(len * 3 / 4 - placeHolders);\n\n // if there are placeholders, only get up to the last complete 4 chars\n l = placeHolders > 0 ? len - 4 : len;\n\n var L = 0;\n\n for (i = 0, j = 0; i < l; i += 4, j += 3) {\n tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)];\n arr[L++] = (tmp >> 16) & 0xFF;\n arr[L++] = (tmp >> 8) & 0xFF;\n arr[L++] = tmp & 0xFF;\n }\n\n if (placeHolders === 2) {\n tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4);\n arr[L++] = tmp & 0xFF;\n } else if (placeHolders === 1) {\n tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2);\n arr[L++] = (tmp >> 8) & 0xFF;\n arr[L++] = tmp & 0xFF;\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp;\n var output = [];\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);\n output.push(tripletToBase64(tmp));\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n if (!inited) {\n init();\n }\n var tmp;\n var len = uint8.length;\n var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes\n var output = '';\n var parts = [];\n var maxChunkLength = 16383; // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1];\n output += lookup[tmp >> 2];\n output += lookup[(tmp << 4) & 0x3F];\n output += '==';\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + (uint8[len - 1]);\n output += lookup[tmp >> 10];\n output += lookup[(tmp >> 4) & 0x3F];\n output += lookup[(tmp << 2) & 0x3F];\n output += '=';\n }\n\n parts.push(output);\n\n return parts.join('')\n}\n\nfunction read (buffer, offset, isLE, mLen, nBytes) {\n var e, m;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = -7;\n var i = isLE ? (nBytes - 1) : 0;\n var d = isLE ? -1 : 1;\n var s = buffer[offset + i];\n\n i += d;\n\n e = s & ((1 << (-nBits)) - 1);\n s >>= (-nBits);\n nBits += eLen;\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1);\n e >>= (-nBits);\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen);\n e = e - eBias;\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nfunction write (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c;\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);\n var i = isLE ? 0 : (nBytes - 1);\n var d = isLE ? 1 : -1;\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;\n\n value = Math.abs(value);\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0;\n e = eMax;\n } else {\n e = Math.floor(Math.log(value) / Math.LN2);\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * Math.pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n e = 0;\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m;\n eLen += mLen;\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128;\n}\n\nvar toString = {}.toString;\n\nvar isArray$2 = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n\nvar INSPECT_MAX_BYTES = 50;\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined\n ? global$1.TYPED_ARRAY_SUPPORT\n : true;\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nkMaxLength();\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length);\n that.__proto__ = Buffer.prototype;\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length);\n }\n that.length = length;\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192; // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype;\n return arr\n};\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n};\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype;\n Buffer.__proto__ = Uint8Array;\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size);\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n};\n\nfunction allocUnsafe (that, size) {\n assertSize(size);\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0;\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n};\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n};\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8';\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0;\n that = createBuffer(that, length);\n\n var actual = that.write(string, encoding);\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual);\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0;\n that = createBuffer(that, length);\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255;\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength; // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array);\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset);\n } else {\n array = new Uint8Array(array, byteOffset, length);\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array;\n that.__proto__ = Buffer.prototype;\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array);\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (internalIsBuffer(obj)) {\n var len = checked(obj.length) | 0;\n that = createBuffer(that, len);\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len);\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray$2(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\nBuffer.isBuffer = isBuffer$1;\nfunction internalIsBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!internalIsBuffer(a) || !internalIsBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length;\n var y = b.length;\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n};\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n};\n\nBuffer.concat = function concat (list, length) {\n if (!isArray$2(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i;\n if (length === undefined) {\n length = 0;\n for (i = 0; i < list.length; ++i) {\n length += list[i].length;\n }\n }\n\n var buffer = Buffer.allocUnsafe(length);\n var pos = 0;\n for (i = 0; i < list.length; ++i) {\n var buf = list[i];\n if (!internalIsBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos);\n pos += buf.length;\n }\n return buffer\n};\n\nfunction byteLength (string, encoding) {\n if (internalIsBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string;\n }\n\n var len = string.length;\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false;\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n}\nBuffer.byteLength = byteLength;\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false;\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0;\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length;\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0;\n start >>>= 0;\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8';\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase();\n loweredCase = true;\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true;\n\nfunction swap (b, n, m) {\n var i = b[n];\n b[n] = b[m];\n b[m] = i;\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length;\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1);\n }\n return this\n};\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length;\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3);\n swap(this, i + 1, i + 2);\n }\n return this\n};\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length;\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7);\n swap(this, i + 1, i + 6);\n swap(this, i + 2, i + 5);\n swap(this, i + 3, i + 4);\n }\n return this\n};\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0;\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n};\n\nBuffer.prototype.equals = function equals (b) {\n if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n};\n\nBuffer.prototype.inspect = function inspect () {\n var str = '';\n var max = INSPECT_MAX_BYTES;\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');\n if (this.length > max) str += ' ... ';\n }\n return ''\n};\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!internalIsBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0;\n }\n if (end === undefined) {\n end = target ? target.length : 0;\n }\n if (thisStart === undefined) {\n thisStart = 0;\n }\n if (thisEnd === undefined) {\n thisEnd = this.length;\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0;\n end >>>= 0;\n thisStart >>>= 0;\n thisEnd >>>= 0;\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart;\n var y = end - start;\n var len = Math.min(x, y);\n\n var thisCopy = this.slice(thisStart, thisEnd);\n var targetCopy = target.slice(start, end);\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i];\n y = targetCopy[i];\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n};\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset;\n byteOffset = 0;\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff;\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000;\n }\n byteOffset = +byteOffset; // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1);\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset;\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1;\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0;\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding);\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (internalIsBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF; // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1;\n var arrLength = arr.length;\n var valLength = val.length;\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase();\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2;\n arrLength /= 2;\n valLength /= 2;\n byteOffset /= 2;\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i;\n if (dir) {\n var foundIndex = -1;\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i;\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex;\n foundIndex = -1;\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n for (i = byteOffset; i >= 0; i--) {\n var found = true;\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false;\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n};\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n};\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n};\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0;\n var remaining = buf.length - offset;\n if (!length) {\n length = remaining;\n } else {\n length = Number(length);\n if (length > remaining) {\n length = remaining;\n }\n }\n\n // must be an even number of digits\n var strLen = string.length;\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2;\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16);\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed;\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8';\n length = this.length;\n offset = 0;\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset;\n length = this.length;\n offset = 0;\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0;\n if (isFinite(length)) {\n length = length | 0;\n if (encoding === undefined) encoding = 'utf8';\n } else {\n encoding = length;\n length = undefined;\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset;\n if (length === undefined || length > remaining) length = remaining;\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8';\n\n var loweredCase = false;\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase();\n loweredCase = true;\n }\n }\n};\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n};\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return fromByteArray(buf)\n } else {\n return fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end);\n var res = [];\n\n var i = start;\n while (i < end) {\n var firstByte = buf[i];\n var codePoint = null;\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1;\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint;\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte;\n }\n break\n case 2:\n secondByte = buf[i + 1];\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F);\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint;\n }\n }\n break\n case 3:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F);\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint;\n }\n }\n break\n case 4:\n secondByte = buf[i + 1];\n thirdByte = buf[i + 2];\n fourthByte = buf[i + 3];\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F);\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint;\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD;\n bytesPerSequence = 1;\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000;\n res.push(codePoint >>> 10 & 0x3FF | 0xD800);\n codePoint = 0xDC00 | codePoint & 0x3FF;\n }\n\n res.push(codePoint);\n i += bytesPerSequence;\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000;\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length;\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = '';\n var i = 0;\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n );\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = '';\n end = Math.min(buf.length, end);\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F);\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = '';\n end = Math.min(buf.length, end);\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i]);\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length;\n\n if (!start || start < 0) start = 0;\n if (!end || end < 0 || end > len) end = len;\n\n var out = '';\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i]);\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end);\n var res = '';\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length;\n start = ~~start;\n end = end === undefined ? len : ~~end;\n\n if (start < 0) {\n start += len;\n if (start < 0) start = 0;\n } else if (start > len) {\n start = len;\n }\n\n if (end < 0) {\n end += len;\n if (end < 0) end = 0;\n } else if (end > len) {\n end = len;\n }\n\n if (end < start) end = start;\n\n var newBuf;\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end);\n newBuf.__proto__ = Buffer.prototype;\n } else {\n var sliceLen = end - start;\n newBuf = new Buffer(sliceLen, undefined);\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start];\n }\n }\n\n return newBuf\n};\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset(offset, byteLength, this.length);\n\n var val = this[offset];\n var mul = 1;\n var i = 0;\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul;\n }\n\n return val\n};\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length);\n }\n\n var val = this[offset + --byteLength];\n var mul = 1;\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul;\n }\n\n return val\n};\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length);\n return this[offset]\n};\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n return this[offset] | (this[offset + 1] << 8)\n};\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n return (this[offset] << 8) | this[offset + 1]\n};\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n};\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n};\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset(offset, byteLength, this.length);\n\n var val = this[offset];\n var mul = 1;\n var i = 0;\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul;\n }\n mul *= 0x80;\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength);\n\n return val\n};\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) checkOffset(offset, byteLength, this.length);\n\n var i = byteLength;\n var mul = 1;\n var val = this[offset + --i];\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul;\n }\n mul *= 0x80;\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength);\n\n return val\n};\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length);\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n};\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n var val = this[offset] | (this[offset + 1] << 8);\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n};\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length);\n var val = this[offset + 1] | (this[offset] << 8);\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n};\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n};\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n};\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return read(this, offset, true, 23, 4)\n};\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length);\n return read(this, offset, false, 23, 4)\n};\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length);\n return read(this, offset, true, 52, 8)\n};\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length);\n return read(this, offset, false, 52, 8)\n};\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!internalIsBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1;\n checkInt(this, value, offset, byteLength, maxBytes, 0);\n }\n\n var mul = 1;\n var i = 0;\n this[offset] = value & 0xFF;\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF;\n }\n\n return offset + byteLength\n};\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n byteLength = byteLength | 0;\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1;\n checkInt(this, value, offset, byteLength, maxBytes, 0);\n }\n\n var i = byteLength - 1;\n var mul = 1;\n this[offset + i] = value & 0xFF;\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF;\n }\n\n return offset + byteLength\n};\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);\n this[offset] = (value & 0xff);\n return offset + 1\n};\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1;\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8;\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff);\n this[offset + 1] = (value >>> 8);\n } else {\n objectWriteUInt16(this, value, offset, true);\n }\n return offset + 2\n};\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8);\n this[offset + 1] = (value & 0xff);\n } else {\n objectWriteUInt16(this, value, offset, false);\n }\n return offset + 2\n};\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1;\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff;\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24);\n this[offset + 2] = (value >>> 16);\n this[offset + 1] = (value >>> 8);\n this[offset] = (value & 0xff);\n } else {\n objectWriteUInt32(this, value, offset, true);\n }\n return offset + 4\n};\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24);\n this[offset + 1] = (value >>> 16);\n this[offset + 2] = (value >>> 8);\n this[offset + 3] = (value & 0xff);\n } else {\n objectWriteUInt32(this, value, offset, false);\n }\n return offset + 4\n};\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1);\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit);\n }\n\n var i = 0;\n var mul = 1;\n var sub = 0;\n this[offset] = value & 0xFF;\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1;\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;\n }\n\n return offset + byteLength\n};\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1);\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit);\n }\n\n var i = byteLength - 1;\n var mul = 1;\n var sub = 0;\n this[offset + i] = value & 0xFF;\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1;\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;\n }\n\n return offset + byteLength\n};\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);\n if (value < 0) value = 0xff + value + 1;\n this[offset] = (value & 0xff);\n return offset + 1\n};\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff);\n this[offset + 1] = (value >>> 8);\n } else {\n objectWriteUInt16(this, value, offset, true);\n }\n return offset + 2\n};\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8);\n this[offset + 1] = (value & 0xff);\n } else {\n objectWriteUInt16(this, value, offset, false);\n }\n return offset + 2\n};\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff);\n this[offset + 1] = (value >>> 8);\n this[offset + 2] = (value >>> 16);\n this[offset + 3] = (value >>> 24);\n } else {\n objectWriteUInt32(this, value, offset, true);\n }\n return offset + 4\n};\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value;\n offset = offset | 0;\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);\n if (value < 0) value = 0xffffffff + value + 1;\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24);\n this[offset + 1] = (value >>> 16);\n this[offset + 2] = (value >>> 8);\n this[offset + 3] = (value & 0xff);\n } else {\n objectWriteUInt32(this, value, offset, false);\n }\n return offset + 4\n};\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4);\n }\n write(buf, value, offset, littleEndian, 23, 4);\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n};\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n};\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8);\n }\n write(buf, value, offset, littleEndian, 52, 8);\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n};\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n};\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0;\n if (!end && end !== 0) end = this.length;\n if (targetStart >= target.length) targetStart = target.length;\n if (!targetStart) targetStart = 0;\n if (end > 0 && end < start) end = start;\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length;\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start;\n }\n\n var len = end - start;\n var i;\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start];\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start];\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n );\n }\n\n return len\n};\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start;\n start = 0;\n end = this.length;\n } else if (typeof end === 'string') {\n encoding = end;\n end = this.length;\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0);\n if (code < 256) {\n val = code;\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255;\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0;\n end = end === undefined ? this.length : end >>> 0;\n\n if (!val) val = 0;\n\n var i;\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val;\n }\n } else {\n var bytes = internalIsBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString());\n var len = bytes.length;\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len];\n }\n }\n\n return this\n};\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g;\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '');\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '=';\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity;\n var codePoint;\n var length = string.length;\n var leadSurrogate = null;\n var bytes = [];\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i);\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint;\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n leadSurrogate = codePoint;\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n }\n\n leadSurrogate = null;\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n );\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n );\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n );\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = [];\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF);\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo;\n var byteArray = [];\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i);\n hi = c >> 8;\n lo = c % 256;\n byteArray.push(lo);\n byteArray.push(hi);\n }\n\n return byteArray\n}\n\n\nfunction base64ToBytes (str) {\n return toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i];\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n\n\n// the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nfunction isBuffer$1(obj) {\n return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj))\n}\n\nfunction isFastBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0))\n}\n\n// shim for using process in browser\n// based off https://github.com/defunctzombie/node-process/blob/master/browser.js\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\nvar cachedSetTimeout = defaultSetTimout;\nvar cachedClearTimeout = defaultClearTimeout;\nif (typeof global$1.setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n}\nif (typeof global$1.clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n}\n\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\nfunction nextTick(fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n}\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nvar title = 'browser';\nvar platform = 'browser';\nvar browser = true;\nvar env = {};\nvar argv = [];\nvar version = ''; // empty string to avoid regexp issues\nvar versions = {};\nvar release = {};\nvar config = {};\n\nfunction noop$1() {}\n\nvar on = noop$1;\nvar addListener = noop$1;\nvar once = noop$1;\nvar off = noop$1;\nvar removeListener = noop$1;\nvar removeAllListeners = noop$1;\nvar emit = noop$1;\n\nfunction binding(name) {\n throw new Error('process.binding is not supported');\n}\n\nfunction cwd () { return '/' }\nfunction chdir (dir) {\n throw new Error('process.chdir is not supported');\n}function umask() { return 0; }\n\n// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js\nvar performance = global$1.performance || {};\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() };\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nfunction hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3;\n var seconds = Math.floor(clocktime);\n var nanoseconds = Math.floor((clocktime%1)*1e9);\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0];\n nanoseconds = nanoseconds - previousTimestamp[1];\n if (nanoseconds<0) {\n seconds--;\n nanoseconds += 1e9;\n }\n }\n return [seconds,nanoseconds]\n}\n\nvar startTime = new Date();\nfunction uptime() {\n var currentTime = new Date();\n var dif = currentTime - startTime;\n return dif / 1000;\n}\n\nvar browser$1 = {\n nextTick: nextTick,\n title: title,\n browser: browser,\n env: env,\n argv: argv,\n version: version,\n versions: versions,\n on: on,\n addListener: addListener,\n once: once,\n off: off,\n removeListener: removeListener,\n removeAllListeners: removeAllListeners,\n emit: emit,\n binding: binding,\n cwd: cwd,\n chdir: chdir,\n umask: umask,\n hrtime: hrtime,\n platform: platform,\n release: release,\n config: config,\n uptime: uptime\n};\n\nvar inherits;\nif (typeof Object.create === 'function'){\n inherits = function inherits(ctor, superCtor) {\n // implementation from standard node.js 'util' module\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n inherits = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n };\n}\nvar inherits$1 = inherits;\n\nvar formatRegExp = /%[sdj%]/g;\nfunction format(f) {\n if (!isString$1(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect$1(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull$1(x) || !isObject$1(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect$1(x);\n }\n }\n return str;\n}\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nfunction deprecate(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined$1(global$1.process)) {\n return function() {\n return deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (browser$1.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (browser$1.throwDeprecation) {\n throw new Error(msg);\n } else if (browser$1.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n}\n\nvar debugs = {};\nvar debugEnviron;\nfunction debuglog(set) {\n if (isUndefined$1(debugEnviron))\n debugEnviron = browser$1.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = 0;\n debugs[set] = function() {\n var msg = format.apply(null, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n}\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect$1(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean$1(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n _extend(ctx, opts);\n }\n // set default options\n if (isUndefined$1(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined$1(ctx.depth)) ctx.depth = 2;\n if (isUndefined$1(ctx.colors)) ctx.colors = false;\n if (isUndefined$1(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect$1.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect$1.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect$1.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect$1.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect$1.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction$1(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== inspect$1 &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString$1(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError$1(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction$1(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp$1(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate$1(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError$1(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray$1(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction$1(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp$1(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate$1(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError$1(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp$1(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined$1(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString$1(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber$1(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean$1(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull$1(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull$1(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined$1(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var length = output.reduce(function(prev, cur) {\n if (cur.indexOf('\\n') >= 0) ;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray$1(ar) {\n return Array.isArray(ar);\n}\n\nfunction isBoolean$1(arg) {\n return typeof arg === 'boolean';\n}\n\nfunction isNull$1(arg) {\n return arg === null;\n}\n\nfunction isNullOrUndefined$1(arg) {\n return arg == null;\n}\n\nfunction isNumber$1(arg) {\n return typeof arg === 'number';\n}\n\nfunction isString$1(arg) {\n return typeof arg === 'string';\n}\n\nfunction isSymbol$1(arg) {\n return typeof arg === 'symbol';\n}\n\nfunction isUndefined$1(arg) {\n return arg === void 0;\n}\n\nfunction isRegExp$1(re) {\n return isObject$1(re) && objectToString$1(re) === '[object RegExp]';\n}\n\nfunction isObject$1(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isDate$1(d) {\n return isObject$1(d) && objectToString$1(d) === '[object Date]';\n}\n\nfunction isError$1(e) {\n return isObject$1(e) &&\n (objectToString$1(e) === '[object Error]' || e instanceof Error);\n}\n\nfunction isFunction$1(arg) {\n return typeof arg === 'function';\n}\n\nfunction isPrimitive$1(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\n\nfunction isBuffer(maybeBuf) {\n return Buffer.isBuffer(maybeBuf);\n}\n\nfunction objectToString$1(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nfunction log() {\n console.log('%s - %s', timestamp(), format.apply(null, arguments));\n}\n\nfunction _extend(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject$1(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n}\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nvar _polyfillNode_util = {\n inherits: inherits$1,\n _extend: _extend,\n log: log,\n isBuffer: isBuffer,\n isPrimitive: isPrimitive$1,\n isFunction: isFunction$1,\n isError: isError$1,\n isDate: isDate$1,\n isObject: isObject$1,\n isRegExp: isRegExp$1,\n isUndefined: isUndefined$1,\n isSymbol: isSymbol$1,\n isString: isString$1,\n isNumber: isNumber$1,\n isNullOrUndefined: isNullOrUndefined$1,\n isNull: isNull$1,\n isBoolean: isBoolean$1,\n isArray: isArray$1,\n inspect: inspect$1,\n deprecate: deprecate,\n format: format,\n debuglog: debuglog\n};\n\nvar _polyfillNode_util$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n format: format,\n deprecate: deprecate,\n debuglog: debuglog,\n inspect: inspect$1,\n isArray: isArray$1,\n isBoolean: isBoolean$1,\n isNull: isNull$1,\n isNullOrUndefined: isNullOrUndefined$1,\n isNumber: isNumber$1,\n isString: isString$1,\n isSymbol: isSymbol$1,\n isUndefined: isUndefined$1,\n isRegExp: isRegExp$1,\n isObject: isObject$1,\n isDate: isDate$1,\n isError: isError$1,\n isFunction: isFunction$1,\n isPrimitive: isPrimitive$1,\n isBuffer: isBuffer,\n log: log,\n inherits: inherits$1,\n _extend: _extend,\n 'default': _polyfillNode_util\n});\n\nfunction compare(a, b) {\n if (a === b) {\n return 0;\n }\n\n var x = a.length;\n var y = b.length;\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break;\n }\n }\n\n if (x < y) {\n return -1;\n }\n if (y < x) {\n return 1;\n }\n return 0;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\n\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n if (hasOwn.call(obj, key)) keys.push(key);\n }\n return keys;\n};\nvar pSlice = Array.prototype.slice;\nvar _functionsHaveNames;\nfunction functionsHaveNames() {\n if (typeof _functionsHaveNames !== 'undefined') {\n return _functionsHaveNames;\n }\n return _functionsHaveNames = (function () {\n return function foo() {}.name === 'foo';\n }());\n}\nfunction pToString (obj) {\n return Object.prototype.toString.call(obj);\n}\nfunction isView(arrbuf) {\n if (isBuffer$1(arrbuf)) {\n return false;\n }\n if (typeof global$1.ArrayBuffer !== 'function') {\n return false;\n }\n if (typeof ArrayBuffer.isView === 'function') {\n return ArrayBuffer.isView(arrbuf);\n }\n if (!arrbuf) {\n return false;\n }\n if (arrbuf instanceof DataView) {\n return true;\n }\n if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {\n return true;\n }\n return false;\n}\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nfunction assert$2(value, message) {\n if (!value) fail(value, true, message, '==', ok);\n}\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n// actual: actual,\n// expected: expected })\n\nvar regex = /\\s*function\\s+([^\\(\\s]*)\\s*/;\n// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js\nfunction getName(func) {\n if (!isFunction$1(func)) {\n return;\n }\n if (functionsHaveNames()) {\n return func.name;\n }\n var str = func.toString();\n var match = str.match(regex);\n return match && match[1];\n}\nassert$2.AssertionError = AssertionError;\nfunction AssertionError(options) {\n this.name = 'AssertionError';\n this.actual = options.actual;\n this.expected = options.expected;\n this.operator = options.operator;\n if (options.message) {\n this.message = options.message;\n this.generatedMessage = false;\n } else {\n this.message = getMessage(this);\n this.generatedMessage = true;\n }\n var stackStartFunction = options.stackStartFunction || fail;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, stackStartFunction);\n } else {\n // non v8 browsers so we can have a stacktrace\n var err = new Error();\n if (err.stack) {\n var out = err.stack;\n\n // try to strip useless frames\n var fn_name = getName(stackStartFunction);\n var idx = out.indexOf('\\n' + fn_name);\n if (idx >= 0) {\n // once we have located the function frame\n // we need to strip out everything before it (and its line)\n var next_line = out.indexOf('\\n', idx + 1);\n out = out.substring(next_line + 1);\n }\n\n this.stack = out;\n }\n }\n}\n\n// assert.AssertionError instanceof Error\ninherits$1(AssertionError, Error);\n\nfunction truncate(s, n) {\n if (typeof s === 'string') {\n return s.length < n ? s : s.slice(0, n);\n } else {\n return s;\n }\n}\nfunction inspect(something) {\n if (functionsHaveNames() || !isFunction$1(something)) {\n return inspect$1(something);\n }\n var rawname = getName(something);\n var name = rawname ? ': ' + rawname : '';\n return '[Function' + name + ']';\n}\nfunction getMessage(self) {\n return truncate(inspect(self.actual), 128) + ' ' +\n self.operator + ' ' +\n truncate(inspect(self.expected), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided. All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n throw new AssertionError({\n message: message,\n actual: actual,\n expected: expected,\n operator: operator,\n stackStartFunction: stackStartFunction\n });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert$2.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n if (!value) fail(value, true, message, '==', ok);\n}\nassert$2.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\nassert$2.equal = equal;\nfunction equal(actual, expected, message) {\n if (actual != expected) fail(actual, expected, message, '==', equal);\n}\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\nassert$2.notEqual = notEqual;\nfunction notEqual(actual, expected, message) {\n if (actual == expected) {\n fail(actual, expected, message, '!=', notEqual);\n }\n}\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\nassert$2.deepEqual = deepEqual$1;\nfunction deepEqual$1(actual, expected, message) {\n if (!_deepEqual(actual, expected, false)) {\n fail(actual, expected, message, 'deepEqual', deepEqual$1);\n }\n}\nassert$2.deepStrictEqual = deepStrictEqual;\nfunction deepStrictEqual(actual, expected, message) {\n if (!_deepEqual(actual, expected, true)) {\n fail(actual, expected, message, 'deepStrictEqual', deepStrictEqual);\n }\n}\n\nfunction _deepEqual(actual, expected, strict, memos) {\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n } else if (isBuffer$1(actual) && isBuffer$1(expected)) {\n return compare(actual, expected) === 0;\n\n // 7.2. If the expected value is a Date object, the actual value is\n // equivalent if it is also a Date object that refers to the same time.\n } else if (isDate$1(actual) && isDate$1(expected)) {\n return actual.getTime() === expected.getTime();\n\n // 7.3 If the expected value is a RegExp object, the actual value is\n // equivalent if it is also a RegExp object with the same source and\n // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n } else if (isRegExp$1(actual) && isRegExp$1(expected)) {\n return actual.source === expected.source &&\n actual.global === expected.global &&\n actual.multiline === expected.multiline &&\n actual.lastIndex === expected.lastIndex &&\n actual.ignoreCase === expected.ignoreCase;\n\n // 7.4. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if ((actual === null || typeof actual !== 'object') &&\n (expected === null || typeof expected !== 'object')) {\n return strict ? actual === expected : actual == expected;\n\n // If both values are instances of typed arrays, wrap their underlying\n // ArrayBuffers in a Buffer each to increase performance\n // This optimization requires the arrays to have the same type as checked by\n // Object.prototype.toString (aka pToString). Never perform binary\n // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their\n // bit patterns are not identical.\n } else if (isView(actual) && isView(expected) &&\n pToString(actual) === pToString(expected) &&\n !(actual instanceof Float32Array ||\n actual instanceof Float64Array)) {\n return compare(new Uint8Array(actual.buffer),\n new Uint8Array(expected.buffer)) === 0;\n\n // 7.5 For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else if (isBuffer$1(actual) !== isBuffer$1(expected)) {\n return false;\n } else {\n memos = memos || {actual: [], expected: []};\n\n var actualIndex = memos.actual.indexOf(actual);\n if (actualIndex !== -1) {\n if (actualIndex === memos.expected.indexOf(expected)) {\n return true;\n }\n }\n\n memos.actual.push(actual);\n memos.expected.push(expected);\n\n return objEquiv(actual, expected, strict, memos);\n }\n}\n\nfunction isArguments(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b, strict, actualVisitedObjects) {\n if (a === null || a === undefined || b === null || b === undefined)\n return false;\n // if one is a primitive, the other must be same\n if (isPrimitive$1(a) || isPrimitive$1(b))\n return a === b;\n if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))\n return false;\n var aIsArgs = isArguments(a);\n var bIsArgs = isArguments(b);\n if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n return false;\n if (aIsArgs) {\n a = pSlice.call(a);\n b = pSlice.call(b);\n return _deepEqual(a, b, strict);\n }\n var ka = objectKeys(a);\n var kb = objectKeys(b);\n var key, i;\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length !== kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] !== kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))\n return false;\n }\n return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\nassert$2.notDeepEqual = notDeepEqual;\nfunction notDeepEqual(actual, expected, message) {\n if (_deepEqual(actual, expected, false)) {\n fail(actual, expected, message, 'notDeepEqual', notDeepEqual);\n }\n}\n\nassert$2.notDeepStrictEqual = notDeepStrictEqual;\nfunction notDeepStrictEqual(actual, expected, message) {\n if (_deepEqual(actual, expected, true)) {\n fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);\n }\n}\n\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\nassert$2.strictEqual = strictEqual;\nfunction strictEqual(actual, expected, message) {\n if (actual !== expected) {\n fail(actual, expected, message, '===', strictEqual);\n }\n}\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==. assert.notStrictEqual(actual, expected, message_opt);\nassert$2.notStrictEqual = notStrictEqual;\nfunction notStrictEqual(actual, expected, message) {\n if (actual === expected) {\n fail(actual, expected, message, '!==', notStrictEqual);\n }\n}\n\nfunction expectedException(actual, expected) {\n if (!actual || !expected) {\n return false;\n }\n\n if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n return expected.test(actual);\n }\n\n try {\n if (actual instanceof expected) {\n return true;\n }\n } catch (e) {\n // Ignore. The instanceof check doesn't work for arrow functions.\n }\n\n if (Error.isPrototypeOf(expected)) {\n return false;\n }\n\n return expected.call({}, actual) === true;\n}\n\nfunction _tryBlock(block) {\n var error;\n try {\n block();\n } catch (e) {\n error = e;\n }\n return error;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n var actual;\n\n if (typeof block !== 'function') {\n throw new TypeError('\"block\" argument must be a function');\n }\n\n if (typeof expected === 'string') {\n message = expected;\n expected = null;\n }\n\n actual = _tryBlock(block);\n\n message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n (message ? ' ' + message : '.');\n\n if (shouldThrow && !actual) {\n fail(actual, expected, 'Missing expected exception' + message);\n }\n\n var userProvidedMessage = typeof message === 'string';\n var isUnwantedException = !shouldThrow && isError$1(actual);\n var isUnexpectedException = !shouldThrow && actual && !expected;\n\n if ((isUnwantedException &&\n userProvidedMessage &&\n expectedException(actual, expected)) ||\n isUnexpectedException) {\n fail(actual, expected, 'Got unwanted exception' + message);\n }\n\n if ((shouldThrow && actual && expected &&\n !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n throw actual;\n }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\nassert$2.throws = throws;\nfunction throws(block, /*optional*/error, /*optional*/message) {\n _throws(true, block, error, message);\n}\n\n// EXTENSION! This is annoying to write outside this module.\nassert$2.doesNotThrow = doesNotThrow;\nfunction doesNotThrow(block, /*optional*/error, /*optional*/message) {\n _throws(false, block, error, message);\n}\n\nassert$2.ifError = ifError;\nfunction ifError(err) {\n if (err) throw err;\n}\n\nvar _polyfillNode_assert = /*#__PURE__*/Object.freeze({\n __proto__: null,\n 'default': assert$2,\n AssertionError: AssertionError,\n fail: fail,\n ok: ok,\n assert: ok,\n equal: equal,\n notEqual: notEqual,\n deepEqual: deepEqual$1,\n deepStrictEqual: deepStrictEqual,\n notDeepEqual: notDeepEqual,\n notDeepStrictEqual: notDeepStrictEqual,\n strictEqual: strictEqual,\n notStrictEqual: notStrictEqual,\n throws: throws,\n doesNotThrow: doesNotThrow,\n ifError: ifError\n});\n\nvar require$$0 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_assert);\n\nvar domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active ) ;\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n \n// Alias for removeListener added in NodeJS 10.0\n// https://nodejs.org/api/events.html#events_emitter_off_eventname_listener\nEventEmitter.prototype.off = function(type, listener){\n return this.removeListener(type, listener);\n};\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount$1.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount$1;\nfunction listenerCount$1(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction BufferList() {\n this.head = null;\n this.tail = null;\n this.length = 0;\n}\n\nBufferList.prototype.push = function (v) {\n var entry = { data: v, next: null };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n};\n\nBufferList.prototype.unshift = function (v) {\n var entry = { data: v, next: this.head };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n};\n\nBufferList.prototype.shift = function () {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n};\n\nBufferList.prototype.clear = function () {\n this.head = this.tail = null;\n this.length = 0;\n};\n\nBufferList.prototype.join = function (s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n while (p = p.next) {\n ret += s + p.data;\n }return ret;\n};\n\nBufferList.prototype.concat = function (n) {\n if (this.length === 0) return Buffer.alloc(0);\n if (this.length === 1) return this.head.data;\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n while (p) {\n p.data.copy(ret, i);\n i += p.data.length;\n p = p.next;\n }\n return ret;\n};\n\n// Copyright Joyent, Inc. and other Node contributors.\nvar isBufferEncoding = Buffer.isEncoding\n || function(encoding) {\n switch (encoding && encoding.toLowerCase()) {\n case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n default: return false;\n }\n };\n\n\nfunction assertEncoding(encoding) {\n if (encoding && !isBufferEncoding(encoding)) {\n throw new Error('Unknown encoding: ' + encoding);\n }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nfunction StringDecoder(encoding) {\n this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n assertEncoding(encoding);\n switch (this.encoding) {\n case 'utf8':\n // CESU-8 represents each of Surrogate Pair by 3-bytes\n this.surrogateSize = 3;\n break;\n case 'ucs2':\n case 'utf16le':\n // UTF-16 represents each of Surrogate Pair by 2-bytes\n this.surrogateSize = 2;\n this.detectIncompleteChar = utf16DetectIncompleteChar;\n break;\n case 'base64':\n // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n this.surrogateSize = 3;\n this.detectIncompleteChar = base64DetectIncompleteChar;\n break;\n default:\n this.write = passThroughWrite;\n return;\n }\n\n // Enough space to store all bytes of a single character. UTF-8 needs 4\n // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n this.charBuffer = new Buffer(6);\n // Number of bytes received for the current incomplete multi-byte character.\n this.charReceived = 0;\n // Number of bytes expected for the current incomplete multi-byte character.\n this.charLength = 0;\n}\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n var charStr = '';\n // if our last write ended with an incomplete multibyte character\n while (this.charLength) {\n // determine how many remaining bytes this buffer has to offer for this char\n var available = (buffer.length >= this.charLength - this.charReceived) ?\n this.charLength - this.charReceived :\n buffer.length;\n\n // add the new bytes to the char buffer\n buffer.copy(this.charBuffer, this.charReceived, 0, available);\n this.charReceived += available;\n\n if (this.charReceived < this.charLength) {\n // still not enough chars in this buffer? wait for more ...\n return '';\n }\n\n // remove bytes belonging to the current character from the buffer\n buffer = buffer.slice(available, buffer.length);\n\n // get the character that was split\n charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n var charCode = charStr.charCodeAt(charStr.length - 1);\n if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n this.charLength += this.surrogateSize;\n charStr = '';\n continue;\n }\n this.charReceived = this.charLength = 0;\n\n // if there are no more bytes in this buffer, just emit our char\n if (buffer.length === 0) {\n return charStr;\n }\n break;\n }\n\n // determine and set charLength / charReceived\n this.detectIncompleteChar(buffer);\n\n var end = buffer.length;\n if (this.charLength) {\n // buffer the incomplete character bytes we got\n buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n end -= this.charReceived;\n }\n\n charStr += buffer.toString(this.encoding, 0, end);\n\n var end = charStr.length - 1;\n var charCode = charStr.charCodeAt(end);\n // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n var size = this.surrogateSize;\n this.charLength += size;\n this.charReceived += size;\n this.charBuffer.copy(this.charBuffer, size, 0, size);\n buffer.copy(this.charBuffer, 0, 0, size);\n return charStr.substring(0, end);\n }\n\n // or just emit the charStr\n return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n // determine how many bytes we have to check at the end of this buffer\n var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n // Figure out if one of the last i bytes of our buffer announces an\n // incomplete char.\n for (; i > 0; i--) {\n var c = buffer[buffer.length - i];\n\n // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n // 110XXXXX\n if (i == 1 && c >> 5 == 0x06) {\n this.charLength = 2;\n break;\n }\n\n // 1110XXXX\n if (i <= 2 && c >> 4 == 0x0E) {\n this.charLength = 3;\n break;\n }\n\n // 11110XXX\n if (i <= 3 && c >> 3 == 0x1E) {\n this.charLength = 4;\n break;\n }\n }\n this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n var res = '';\n if (buffer && buffer.length)\n res = this.write(buffer);\n\n if (this.charReceived) {\n var cr = this.charReceived;\n var buf = this.charBuffer;\n var enc = this.encoding;\n res += buf.slice(0, cr).toString(enc);\n }\n\n return res;\n};\n\nfunction passThroughWrite(buffer) {\n return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n this.charReceived = buffer.length % 2;\n this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n this.charReceived = buffer.length % 3;\n this.charLength = this.charReceived ? 3 : 0;\n}\n\nReadable.ReadableState = ReadableState;\n\nvar debug = debuglog('stream');\ninherits$1(Readable, EventEmitter);\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') {\n return emitter.prependListener(event, fn);\n } else {\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event])\n emitter.on(event, fn);\n else if (Array.isArray(emitter._events[event]))\n emitter._events[event].unshift(fn);\n else\n emitter._events[event] = [fn, emitter._events[event]];\n }\n}\nfunction listenerCount (emitter, type) {\n return emitter.listeners(type).length;\n}\nfunction ReadableState(options, stream) {\n\n options = options || {};\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n\n if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n var hwm = options.highWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n // cast to ints.\n this.highWaterMark = ~ ~this.highWaterMark;\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // when piping, we only care about 'readable' events that happen\n // after read()ing all the bytes and not getting any pushback.\n this.ranOut = false;\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\nfunction Readable(options) {\n\n if (!(this instanceof Readable)) return new Readable(options);\n\n this._readableState = new ReadableState(options, this);\n\n // legacy\n this.readable = true;\n\n if (options && typeof options.read === 'function') this._read = options.read;\n\n EventEmitter.call(this);\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n\n if (!state.objectMode && typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n }\n\n return readableAddChunk(this, state, chunk, encoding, false);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n var state = this._readableState;\n return readableAddChunk(this, state, chunk, '', true);\n};\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\nfunction readableAddChunk(stream, state, chunk, encoding, addToFront) {\n var er = chunkInvalid(state, chunk);\n if (er) {\n stream.emit('error', er);\n } else if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (state.ended && !addToFront) {\n var e = new Error('stream.push() after EOF');\n stream.emit('error', e);\n } else if (state.endEmitted && addToFront) {\n var _e = new Error('stream.unshift() after end event');\n stream.emit('error', _e);\n } else {\n var skipAdd;\n if (state.decoder && !addToFront && !encoding) {\n chunk = state.decoder.write(chunk);\n skipAdd = !state.objectMode && chunk.length === 0;\n }\n\n if (!addToFront) state.reading = false;\n\n // Don't add to the buffer if we've decoded to an empty string chunk and\n // we're not in object mode\n if (!skipAdd) {\n // if we want the data now, just emit it.\n if (state.flowing && state.length === 0 && !state.sync) {\n stream.emit('data', chunk);\n stream.read(0);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n if (state.needReadable) emitReadable(stream);\n }\n }\n\n maybeReadMore(stream, state);\n }\n } else if (!addToFront) {\n state.reading = false;\n }\n\n return needMoreData(state);\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes. This is to work around cases where hwm=0,\n// such as the repl. Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n this._readableState.decoder = new StringDecoder(enc);\n this._readableState.encoding = enc;\n return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = true;\n n = 0;\n } else {\n state.length -= n;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n\n return ret;\n};\n\nfunction chunkInvalid(state, chunk) {\n var er = null;\n if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n return er;\n}\n\nfunction onEofChunk(stream, state) {\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n\n // emit 'readable' now to make sure it gets picked up.\n emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream);\n }\n}\n\nfunction emitReadable_(stream) {\n debug('emit readable');\n stream.emit('readable');\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n var len = state.length;\n while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;else len = state.length;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n this.emit('error', new Error('not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n var doEnd = (!pipeOpts || pipeOpts.end !== false);\n\n var endFn = doEnd ? onend : cleanup;\n if (state.endEmitted) nextTick(endFn);else src.once('end', endFn);\n\n dest.on('unpipe', onunpipe);\n function onunpipe(readable) {\n debug('onunpipe');\n if (readable === src) {\n cleanup();\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', cleanup);\n src.removeListener('data', ondata);\n\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n // If the user pushes more data while we're writing to dest then we'll end up\n // in ondata again. However, we only want to increase awaitDrain once because\n // dest will only emit one 'drain' event for the multiple writes.\n // => Introduce a guard on increasing awaitDrain.\n var increasedAwaitDrain = false;\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n increasedAwaitDrain = false;\n var ret = dest.write(chunk);\n if (false === ret && !increasedAwaitDrain) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', src._readableState.awaitDrain);\n src._readableState.awaitDrain++;\n increasedAwaitDrain = true;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (listenerCount(dest, 'error') === 0) dest.emit('error', er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function () {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && src.listeners('data').length) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var _i = 0; _i < len; _i++) {\n dests[_i].emit('unpipe', this);\n }return this;\n }\n\n // try to find the right one.\n var i = indexOf(state.pipes, dest);\n if (i === -1) return this;\n\n state.pipes.splice(i, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n dest.emit('unpipe', this);\n\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = EventEmitter.prototype.on.call(this, ev, fn);\n\n if (ev === 'data') {\n // Start flowing on next tick if stream isn't explicitly paused\n if (this._readableState.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n var state = this._readableState;\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.emittedReadable = false;\n if (!state.reading) {\n nextTick(nReadingNextTick, this);\n } else if (state.length) {\n emitReadable(this);\n }\n }\n }\n\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n state.flowing = true;\n resume(this, state);\n }\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n if (!state.reading) {\n debug('resume read 0');\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n state.awaitDrain = 0;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (false !== this._readableState.flowing) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var state = this._readableState;\n var paused = false;\n\n var self = this;\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) self.push(chunk);\n }\n\n self.push(null);\n });\n\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = self.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function (method) {\n return function () {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n var events = ['error', 'close', 'destroy', 'pause', 'resume'];\n forEach(events, function (ev) {\n stream.on(ev, self.emit.bind(self, ev));\n });\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n self._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return self;\n};\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = fromListPartial(n, state.buffer, state.decoder);\n }\n\n return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n var ret;\n if (n < list.head.data.length) {\n // slice is the same for buffers and strings\n ret = list.head.data.slice(0, n);\n list.head.data = list.head.data.slice(n);\n } else if (n === list.head.data.length) {\n // first chunk is a perfect match\n ret = list.shift();\n } else {\n // result spans more than one buffer\n ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n }\n return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n var p = list.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = str.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n var ret = Buffer.allocUnsafe(n);\n var p = list.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) list.head = p.next;else list.head = list.tail = null;\n } else {\n list.head = p;\n p.data = buf.slice(nb);\n }\n break;\n }\n ++c;\n }\n list.length -= c;\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n\n // If we get here before consuming all the bytes, then that is a\n // bug in node. Should never happen.\n if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n if (!state.endEmitted) {\n state.ended = true;\n nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n }\n}\n\nfunction forEach(xs, f) {\n for (var i = 0, l = xs.length; i < l; i++) {\n f(xs[i], i);\n }\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}\n\n// A bit simpler than readable streams.\nWritable.WritableState = WritableState;\ninherits$1(Writable, EventEmitter);\n\nfunction nop() {}\n\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\nfunction WritableState(options, stream) {\n Object.defineProperty(this, 'buffer', {\n get: deprecate(function () {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')\n });\n options = options || {};\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n\n if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n var hwm = options.highWaterMark;\n var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n // cast to ints.\n this.highWaterMark = ~ ~this.highWaterMark;\n\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function writableStateGetBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\nfunction Writable(options) {\n\n // Writable ctor is applied to Duplexes, though they're not\n // instanceof Writable, they're instanceof Readable.\n if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);\n\n this._writableState = new WritableState(options, this);\n\n // legacy.\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n\n if (typeof options.writev === 'function') this._writev = options.writev;\n }\n\n EventEmitter.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new Error('write after end');\n // TODO: defer error events consistently everywhere, not just the cb\n stream.emit('error', er);\n nextTick(cb, er);\n}\n\n// If we get something that is not a buffer, string, null, or undefined,\n// and we're not in objectMode, then that's an error.\n// Otherwise stream chunks are all considered to be of length=1, and the\n// watermarks determine how many objects to keep in the buffer, rather than\n// how many bytes or characters.\nfunction validChunk(stream, state, chunk, cb) {\n var valid = true;\n var er = false;\n // Always throw error if a null is written\n // if we are not in object mode then throw\n // if it is not a buffer, string, or undefined.\n if (chunk === null) {\n er = new TypeError('May not write null values to stream');\n } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new TypeError('Invalid non-string/buffer chunk');\n }\n if (er) {\n stream.emit('error', er);\n nextTick(cb, er);\n valid = false;\n }\n return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n if (typeof cb !== 'function') cb = nop;\n\n if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, chunk, encoding, cb);\n }\n\n return ret;\n};\n\nWritable.prototype.cork = function () {\n var state = this._writableState;\n\n state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n\n if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, chunk, encoding, cb) {\n chunk = decodeChunk(state, chunk, encoding);\n\n if (Buffer.isBuffer(chunk)) encoding = 'buffer';\n var len = state.objectMode ? 1 : chunk.length;\n\n state.length += len;\n\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n if (sync) nextTick(cb, er);else cb(er);\n\n stream._writableState.errorEmitted = true;\n stream.emit('error', er);\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n\n onwriteStateUpdate(state);\n\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state);\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n /**/\n nextTick(afterWrite, stream, state, finished, cb);\n /**/\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n\n var count = 0;\n while (entry) {\n buffer[count] = entry;\n entry = entry.next;\n count += 1;\n }\n\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequestCount = 0;\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new Error('not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction prefinish(stream, state) {\n if (!state.prefinished) {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n if (state.pendingcb === 0) {\n prefinish(stream, state);\n state.finished = true;\n stream.emit('finish');\n } else {\n prefinish(stream, state);\n }\n }\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n\n this.finish = function (err) {\n var entry = _this.entry;\n _this.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n if (state.corkedRequestsFree) {\n state.corkedRequestsFree.next = _this;\n } else {\n state.corkedRequestsFree = _this;\n }\n };\n}\n\ninherits$1(Duplex, Readable);\n\nvar keys = Object.keys(Writable.prototype);\nfor (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n}\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n\n Readable.call(this, options);\n Writable.call(this, options);\n\n if (options && options.readable === false) this.readable = false;\n\n if (options && options.writable === false) this.writable = false;\n\n this.allowHalfOpen = true;\n if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n this.once('end', onend);\n}\n\n// the no-half-open enforcer\nfunction onend() {\n // if we allow half-open state, or if the writable side ended,\n // then we're ok.\n if (this.allowHalfOpen || this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\n// a transform stream is a readable/writable stream where you do\ninherits$1(Transform, Duplex);\n\nfunction TransformState(stream) {\n this.afterTransform = function (er, data) {\n return afterTransform(stream, er, data);\n };\n\n this.needTransform = false;\n this.transforming = false;\n this.writecb = null;\n this.writechunk = null;\n this.writeencoding = null;\n}\n\nfunction afterTransform(stream, er, data) {\n var ts = stream._transformState;\n ts.transforming = false;\n\n var cb = ts.writecb;\n\n if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));\n\n ts.writechunk = null;\n ts.writecb = null;\n\n if (data !== null && data !== undefined) stream.push(data);\n\n cb(er);\n\n var rs = stream._readableState;\n rs.reading = false;\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n stream._read(rs.highWaterMark);\n }\n}\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n\n Duplex.call(this, options);\n\n this._transformState = new TransformState(this);\n\n // when the writable side finishes, then flush out anything remaining.\n var stream = this;\n\n // start out asking for a readable event once data is transformed.\n this._readableState.needReadable = true;\n\n // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n\n if (typeof options.flush === 'function') this._flush = options.flush;\n }\n\n this.once('prefinish', function () {\n if (typeof this._flush === 'function') this._flush(function (er) {\n done(stream, er);\n });else done(stream);\n });\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n throw new Error('Not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n ts.transforming = true;\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nfunction done(stream, er) {\n if (er) return stream.emit('error', er);\n\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n var ws = stream._writableState;\n var ts = stream._transformState;\n\n if (ws.length) throw new Error('Calling transform done when ws.length != 0');\n\n if (ts.transforming) throw new Error('Calling transform done when still transforming');\n\n return stream.push(null);\n}\n\ninherits$1(PassThrough, Transform);\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};\n\ninherits$1(Stream$1, EventEmitter);\nStream$1.Readable = Readable;\nStream$1.Writable = Writable;\nStream$1.Duplex = Duplex;\nStream$1.Transform = Transform;\nStream$1.PassThrough = PassThrough;\n\n// Backwards-compat with node 0.4.x\nStream$1.Stream = Stream$1;\n\n// old-style streams. Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream$1() {\n EventEmitter.call(this);\n}\n\nStream$1.prototype.pipe = function(dest, options) {\n var source = this;\n\n function ondata(chunk) {\n if (dest.writable) {\n if (false === dest.write(chunk) && source.pause) {\n source.pause();\n }\n }\n }\n\n source.on('data', ondata);\n\n function ondrain() {\n if (source.readable && source.resume) {\n source.resume();\n }\n }\n\n dest.on('drain', ondrain);\n\n // If the 'end' option is not supplied, dest.end() will be called when\n // source gets the 'end' or 'close' events. Only dest.end() once.\n if (!dest._isStdio && (!options || options.end !== false)) {\n source.on('end', onend);\n source.on('close', onclose);\n }\n\n var didOnEnd = false;\n function onend() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n dest.end();\n }\n\n\n function onclose() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n if (typeof dest.destroy === 'function') dest.destroy();\n }\n\n // don't leave dangling pipes when there are errors.\n function onerror(er) {\n cleanup();\n if (EventEmitter.listenerCount(this, 'error') === 0) {\n throw er; // Unhandled stream error in pipe.\n }\n }\n\n source.on('error', onerror);\n dest.on('error', onerror);\n\n // remove all the event listeners that were added.\n function cleanup() {\n source.removeListener('data', ondata);\n dest.removeListener('drain', ondrain);\n\n source.removeListener('end', onend);\n source.removeListener('close', onclose);\n\n source.removeListener('error', onerror);\n dest.removeListener('error', onerror);\n\n source.removeListener('end', cleanup);\n source.removeListener('close', cleanup);\n\n dest.removeListener('close', cleanup);\n }\n\n source.on('end', cleanup);\n source.on('close', cleanup);\n\n dest.on('close', cleanup);\n\n dest.emit('pipe', source);\n\n // Allow for unix-like usage: A.pipe(B).pipe(C)\n return dest;\n};\n\nvar _polyfillNode_stream = /*#__PURE__*/Object.freeze({\n __proto__: null,\n 'default': Stream$1,\n Readable: Readable,\n Writable: Writable,\n Duplex: Duplex,\n Transform: Transform,\n PassThrough: PassThrough,\n Stream: Stream$1\n});\n\nvar require$$1 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_stream);\n\nvar require$$2 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_util$1);\n\nvar assert$1 = require$$0;\nvar Stream = require$$1.Stream;\nvar util$2 = require$$2;\nvar UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;\nfunction _capitalize(str) {\n return (str.charAt(0).toUpperCase() + str.slice(1));\n}\nfunction _toss(name, expected, oper, arg, actual) {\n throw new assert$1.AssertionError({\n message: util$2.format('%s (%s) is required', name, expected),\n actual: (actual === undefined) ? typeof (arg) : actual(arg),\n expected: expected,\n operator: oper || '===',\n stackStartFunction: _toss.caller\n });\n}\nfunction _getClass(arg) {\n return (Object.prototype.toString.call(arg).slice(8, -1));\n}\nfunction noop() {\n}\nvar types = {\n bool: {\n check: function (arg) { return typeof (arg) === 'boolean'; }\n },\n func: {\n check: function (arg) { return typeof (arg) === 'function'; }\n },\n string: {\n check: function (arg) { return typeof (arg) === 'string'; }\n },\n object: {\n check: function (arg) {\n return typeof (arg) === 'object' && arg !== null;\n }\n },\n number: {\n check: function (arg) {\n return typeof (arg) === 'number' && !isNaN(arg);\n }\n },\n finite: {\n check: function (arg) {\n return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg);\n }\n },\n buffer: {\n check: function (arg) { return isBuffer$2(arg); },\n operator: 'Buffer.isBuffer'\n },\n array: {\n check: function (arg) { return Array.isArray(arg); },\n operator: 'Array.isArray'\n },\n stream: {\n check: function (arg) { return arg instanceof Stream; },\n operator: 'instanceof',\n actual: _getClass\n },\n date: {\n check: function (arg) { return arg instanceof Date; },\n operator: 'instanceof',\n actual: _getClass\n },\n regexp: {\n check: function (arg) { return arg instanceof RegExp; },\n operator: 'instanceof',\n actual: _getClass\n },\n uuid: {\n check: function (arg) {\n return typeof (arg) === 'string' && UUID_REGEXP.test(arg);\n },\n operator: 'isUUID'\n }\n};\nfunction _setExports(ndebug) {\n var keys = Object.keys(types);\n var out;\n if (process.env.NODE_NDEBUG) {\n out = noop;\n } else {\n out = function (arg, msg) {\n if (!arg) {\n _toss(msg, 'true', arg);\n }\n };\n }\n keys.forEach(function (k) {\n if (ndebug) {\n out[k] = noop;\n return;\n }\n var type = types[k];\n out[k] = function (arg, msg) {\n if (!type.check(arg)) {\n _toss(msg, k, type.operator, arg, type.actual);\n }\n };\n });\n keys.forEach(function (k) {\n var name = 'optional' + _capitalize(k);\n if (ndebug) {\n out[name] = noop;\n return;\n }\n var type = types[k];\n out[name] = function (arg, msg) {\n if (arg === undefined || arg === null) {\n return;\n }\n if (!type.check(arg)) {\n _toss(msg, k, type.operator, arg, type.actual);\n }\n };\n });\n keys.forEach(function (k) {\n var name = 'arrayOf' + _capitalize(k);\n if (ndebug) {\n out[name] = noop;\n return;\n }\n var type = types[k];\n var expected = '[' + k + ']';\n out[name] = function (arg, msg) {\n if (!Array.isArray(arg)) {\n _toss(msg, expected, type.operator, arg, type.actual);\n }\n var i;\n for (i = 0; i < arg.length; i++) {\n if (!type.check(arg[i])) {\n _toss(msg, expected, type.operator, arg, type.actual);\n }\n }\n };\n });\n keys.forEach(function (k) {\n var name = 'optionalArrayOf' + _capitalize(k);\n if (ndebug) {\n out[name] = noop;\n return;\n }\n var type = types[k];\n var expected = '[' + k + ']';\n out[name] = function (arg, msg) {\n if (arg === undefined || arg === null) {\n return;\n }\n if (!Array.isArray(arg)) {\n _toss(msg, expected, type.operator, arg, type.actual);\n }\n var i;\n for (i = 0; i < arg.length; i++) {\n if (!type.check(arg[i])) {\n _toss(msg, expected, type.operator, arg, type.actual);\n }\n }\n };\n });\n Object.keys(assert$1).forEach(function (k) {\n if (k === 'AssertionError') {\n out[k] = assert$1[k];\n return;\n }\n if (ndebug) {\n out[k] = noop;\n return;\n }\n out[k] = assert$1[k];\n });\n out._setExports = _setExports;\n return out;\n}\nvar assert_1 = _setExports(process.env.NODE_NDEBUG);\n\nvar jsprim$1 = {};\n\nvar extsprintf$1 = {};\n\nvar mod_assert$2 = require$$0;\nvar mod_util$2 = require$$2;\nextsprintf$1.sprintf = jsSprintf$1;\nextsprintf$1.printf = jsPrintf$1;\nextsprintf$1.fprintf = jsFprintf$1;\nfunction jsSprintf$1(fmt)\n{\n\tvar regex = [\n\t '([^%]*)',\n\t '%',\n\t '([\\'\\\\-+ #0]*?)',\n\t '([1-9]\\\\d*)?',\n\t '(\\\\.([1-9]\\\\d*))?',\n\t '[lhjztL]*?',\n\t '([diouxXfFeEgGaAcCsSp%jr])'\n\t].join('');\n\tvar re = new RegExp(regex);\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\tvar flags, width, precision, conversion;\n\tvar left, pad, sign, arg, match;\n\tvar ret = '';\n\tvar argn = 1;\n\tmod_assert$2.equal('string', typeof (fmt));\n\twhile ((match = re.exec(fmt)) !== null) {\n\t\tret += match[1];\n\t\tfmt = fmt.substring(match[0].length);\n\t\tflags = match[2] || '';\n\t\twidth = match[3] || 0;\n\t\tprecision = match[4] || '';\n\t\tconversion = match[6];\n\t\tleft = false;\n\t\tsign = false;\n\t\tpad = ' ';\n\t\tif (conversion == '%') {\n\t\t\tret += '%';\n\t\t\tcontinue;\n\t\t}\n\t\tif (args.length === 0)\n\t\t\tthrow (new Error('too few args to sprintf'));\n\t\targ = args.shift();\n\t\targn++;\n\t\tif (flags.match(/[\\' #]/))\n\t\t\tthrow (new Error(\n\t\t\t 'unsupported flags: ' + flags));\n\t\tif (precision.length > 0)\n\t\t\tthrow (new Error(\n\t\t\t 'non-zero precision not supported'));\n\t\tif (flags.match(/-/))\n\t\t\tleft = true;\n\t\tif (flags.match(/0/))\n\t\t\tpad = '0';\n\t\tif (flags.match(/\\+/))\n\t\t\tsign = true;\n\t\tswitch (conversion) {\n\t\tcase 's':\n\t\t\tif (arg === undefined || arg === null)\n\t\t\t\tthrow (new Error('argument ' + argn +\n\t\t\t\t ': attempted to print undefined or null ' +\n\t\t\t\t 'as a string'));\n\t\t\tret += doPad$1(pad, width, left, arg.toString());\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\targ = Math.floor(arg);\n\t\tcase 'f':\n\t\t\tsign = sign && arg > 0 ? '+' : '';\n\t\t\tret += sign + doPad$1(pad, width, left,\n\t\t\t arg.toString());\n\t\t\tbreak;\n\t\tcase 'x':\n\t\t\tret += doPad$1(pad, width, left, arg.toString(16));\n\t\t\tbreak;\n\t\tcase 'j':\n\t\t\tif (width === 0)\n\t\t\t\twidth = 10;\n\t\t\tret += mod_util$2.inspect(arg, false, width);\n\t\t\tbreak;\n\t\tcase 'r':\n\t\t\tret += dumpException$1(arg);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (new Error('unsupported conversion: ' +\n\t\t\t conversion));\n\t\t}\n\t}\n\tret += fmt;\n\treturn (ret);\n}\nfunction jsPrintf$1() {\n\tvar args = Array.prototype.slice.call(arguments);\n\targs.unshift(process.stdout);\n\tjsFprintf$1.apply(null, args);\n}\nfunction jsFprintf$1(stream) {\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\treturn (stream.write(jsSprintf$1.apply(this, args)));\n}\nfunction doPad$1(chr, width, left, str)\n{\n\tvar ret = str;\n\twhile (ret.length < width) {\n\t\tif (left)\n\t\t\tret += chr;\n\t\telse\n\t\t\tret = chr + ret;\n\t}\n\treturn (ret);\n}\nfunction dumpException$1(ex)\n{\n\tvar ret;\n\tif (!(ex instanceof Error))\n\t\tthrow (new Error(jsSprintf$1('invalid type for %%r: %j', ex)));\n\tret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack;\n\tif (ex.cause && typeof (ex.cause) === 'function') {\n\t\tvar cex = ex.cause();\n\t\tif (cex) {\n\t\t\tret += '\\nCaused by: ' + dumpException$1(cex);\n\t\t}\n\t}\n\treturn (ret);\n}\n\nvar extsprintf = {};\n\nvar mod_assert$1 = require$$0;\nvar mod_util$1 = require$$2;\nextsprintf.sprintf = jsSprintf;\nextsprintf.printf = jsPrintf;\nextsprintf.fprintf = jsFprintf;\nfunction jsSprintf(ofmt)\n{\n\tvar regex = [\n\t '([^%]*)',\n\t '%',\n\t '([\\'\\\\-+ #0]*?)',\n\t '([1-9]\\\\d*)?',\n\t '(\\\\.([1-9]\\\\d*))?',\n\t '[lhjztL]*?',\n\t '([diouxXfFeEgGaAcCsSp%jr])'\n\t].join('');\n\tvar re = new RegExp(regex);\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\tvar fmt = ofmt;\n\tvar flags, width, precision, conversion;\n\tvar left, pad, sign, arg, match;\n\tvar ret = '';\n\tvar argn = 1;\n\tvar posn = 0;\n\tvar convposn;\n\tvar curconv;\n\tmod_assert$1.equal('string', typeof (fmt),\n\t 'first argument must be a format string');\n\twhile ((match = re.exec(fmt)) !== null) {\n\t\tret += match[1];\n\t\tfmt = fmt.substring(match[0].length);\n\t\tcurconv = match[0].substring(match[1].length);\n\t\tconvposn = posn + match[1].length + 1;\n\t\tposn += match[0].length;\n\t\tflags = match[2] || '';\n\t\twidth = match[3] || 0;\n\t\tprecision = match[4] || '';\n\t\tconversion = match[6];\n\t\tleft = false;\n\t\tsign = false;\n\t\tpad = ' ';\n\t\tif (conversion == '%') {\n\t\t\tret += '%';\n\t\t\tcontinue;\n\t\t}\n\t\tif (args.length === 0) {\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t 'has no matching argument ' +\n\t\t\t '(too few arguments passed)'));\n\t\t}\n\t\targ = args.shift();\n\t\targn++;\n\t\tif (flags.match(/[\\' #]/)) {\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t 'uses unsupported flags'));\n\t\t}\n\t\tif (precision.length > 0) {\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t 'uses non-zero precision (not supported)'));\n\t\t}\n\t\tif (flags.match(/-/))\n\t\t\tleft = true;\n\t\tif (flags.match(/0/))\n\t\t\tpad = '0';\n\t\tif (flags.match(/\\+/))\n\t\t\tsign = true;\n\t\tswitch (conversion) {\n\t\tcase 's':\n\t\t\tif (arg === undefined || arg === null) {\n\t\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t\t 'attempted to print undefined or null ' +\n\t\t\t\t 'as a string (argument ' + argn + ' to ' +\n\t\t\t\t 'sprintf)'));\n\t\t\t}\n\t\t\tret += doPad(pad, width, left, arg.toString());\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\targ = Math.floor(arg);\n\t\tcase 'f':\n\t\t\tsign = sign && arg > 0 ? '+' : '';\n\t\t\tret += sign + doPad(pad, width, left,\n\t\t\t arg.toString());\n\t\t\tbreak;\n\t\tcase 'x':\n\t\t\tret += doPad(pad, width, left, arg.toString(16));\n\t\t\tbreak;\n\t\tcase 'j':\n\t\t\tif (width === 0)\n\t\t\t\twidth = 10;\n\t\t\tret += mod_util$1.inspect(arg, false, width);\n\t\t\tbreak;\n\t\tcase 'r':\n\t\t\tret += dumpException(arg);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t 'is not supported'));\n\t\t}\n\t}\n\tret += fmt;\n\treturn (ret);\n}\nfunction jsError(fmtstr, convposn, curconv, reason) {\n\tmod_assert$1.equal(typeof (fmtstr), 'string');\n\tmod_assert$1.equal(typeof (curconv), 'string');\n\tmod_assert$1.equal(typeof (convposn), 'number');\n\tmod_assert$1.equal(typeof (reason), 'string');\n\treturn (new Error('format string \"' + fmtstr +\n\t '\": conversion specifier \"' + curconv + '\" at character ' +\n\t convposn + ' ' + reason));\n}\nfunction jsPrintf() {\n\tvar args = Array.prototype.slice.call(arguments);\n\targs.unshift(process.stdout);\n\tjsFprintf.apply(null, args);\n}\nfunction jsFprintf(stream) {\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\treturn (stream.write(jsSprintf.apply(this, args)));\n}\nfunction doPad(chr, width, left, str)\n{\n\tvar ret = str;\n\twhile (ret.length < width) {\n\t\tif (left)\n\t\t\tret += chr;\n\t\telse\n\t\t\tret = chr + ret;\n\t}\n\treturn (ret);\n}\nfunction dumpException(ex)\n{\n\tvar ret;\n\tif (!(ex instanceof Error))\n\t\tthrow (new Error(jsSprintf('invalid type for %%r: %j', ex)));\n\tret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack;\n\tif (ex.cause && typeof (ex.cause) === 'function') {\n\t\tvar cex = ex.cause();\n\t\tif (cex) {\n\t\t\tret += '\\nCaused by: ' + dumpException(cex);\n\t\t}\n\t}\n\treturn (ret);\n}\n\nvar util$1 = {};\n\nfunction isArray(arg) {\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return objectToString(arg) === '[object Array]';\n}\nutil$1.isArray = isArray;\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nutil$1.isBoolean = isBoolean;\nfunction isNull(arg) {\n return arg === null;\n}\nutil$1.isNull = isNull;\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nutil$1.isNullOrUndefined = isNullOrUndefined;\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nutil$1.isNumber = isNumber;\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nutil$1.isString = isString;\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nutil$1.isSymbol = isSymbol;\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nutil$1.isUndefined = isUndefined;\nfunction isRegExp(re) {\n return objectToString(re) === '[object RegExp]';\n}\nutil$1.isRegExp = isRegExp;\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nutil$1.isObject = isObject;\nfunction isDate(d) {\n return objectToString(d) === '[object Date]';\n}\nutil$1.isDate = isDate;\nfunction isError(e) {\n return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nutil$1.isError = isError;\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nutil$1.isFunction = isFunction;\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' ||\n typeof arg === 'undefined';\n}\nutil$1.isPrimitive = isPrimitive;\nutil$1.isBuffer = isBuffer$2;\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\nvar mod_assertplus = assert_1;\nvar mod_util = require$$2;\nvar mod_extsprintf$1 = extsprintf;\nvar mod_isError = util$1.isError;\nvar sprintf = mod_extsprintf$1.sprintf;\nvar verror = VError;\nVError.VError = VError;\nVError.SError = SError;\nVError.WError = WError;\nVError.MultiError = MultiError;\nfunction parseConstructorArguments(args)\n{\n\tvar argv, options, sprintf_args, shortmessage, k;\n\tmod_assertplus.object(args, 'args');\n\tmod_assertplus.bool(args.strict, 'args.strict');\n\tmod_assertplus.array(args.argv, 'args.argv');\n\targv = args.argv;\n\tif (argv.length === 0) {\n\t\toptions = {};\n\t\tsprintf_args = [];\n\t} else if (mod_isError(argv[0])) {\n\t\toptions = { 'cause': argv[0] };\n\t\tsprintf_args = argv.slice(1);\n\t} else if (typeof (argv[0]) === 'object') {\n\t\toptions = {};\n\t\tfor (k in argv[0]) {\n\t\t\toptions[k] = argv[0][k];\n\t\t}\n\t\tsprintf_args = argv.slice(1);\n\t} else {\n\t\tmod_assertplus.string(argv[0],\n\t\t 'first argument to VError, SError, or WError ' +\n\t\t 'constructor must be a string, object, or Error');\n\t\toptions = {};\n\t\tsprintf_args = argv;\n\t}\n\tmod_assertplus.object(options);\n\tif (!options.strict && !args.strict) {\n\t\tsprintf_args = sprintf_args.map(function (a) {\n\t\t\treturn (a === null ? 'null' :\n\t\t\t a === undefined ? 'undefined' : a);\n\t\t});\n\t}\n\tif (sprintf_args.length === 0) {\n\t\tshortmessage = '';\n\t} else {\n\t\tshortmessage = sprintf.apply(null, sprintf_args);\n\t}\n\treturn ({\n\t 'options': options,\n\t 'shortmessage': shortmessage\n\t});\n}\nfunction VError()\n{\n\tvar args, obj, parsed, cause, ctor, message, k;\n\targs = Array.prototype.slice.call(arguments, 0);\n\tif (!(this instanceof VError)) {\n\t\tobj = Object.create(VError.prototype);\n\t\tVError.apply(obj, arguments);\n\t\treturn (obj);\n\t}\n\tparsed = parseConstructorArguments({\n\t 'argv': args,\n\t 'strict': false\n\t});\n\tif (parsed.options.name) {\n\t\tmod_assertplus.string(parsed.options.name,\n\t\t 'error\\'s \"name\" must be a string');\n\t\tthis.name = parsed.options.name;\n\t}\n\tthis.jse_shortmsg = parsed.shortmessage;\n\tmessage = parsed.shortmessage;\n\tcause = parsed.options.cause;\n\tif (cause) {\n\t\tmod_assertplus.ok(mod_isError(cause), 'cause is not an Error');\n\t\tthis.jse_cause = cause;\n\t\tif (!parsed.options.skipCauseMessage) {\n\t\t\tmessage += ': ' + cause.message;\n\t\t}\n\t}\n\tthis.jse_info = {};\n\tif (parsed.options.info) {\n\t\tfor (k in parsed.options.info) {\n\t\t\tthis.jse_info[k] = parsed.options.info[k];\n\t\t}\n\t}\n\tthis.message = message;\n\tError.call(this, message);\n\tif (Error.captureStackTrace) {\n\t\tctor = parsed.options.constructorOpt || this.constructor;\n\t\tError.captureStackTrace(this, ctor);\n\t}\n\treturn (this);\n}\nmod_util.inherits(VError, Error);\nVError.prototype.name = 'VError';\nVError.prototype.toString = function ve_toString()\n{\n\tvar str = (this.hasOwnProperty('name') && this.name ||\n\t\tthis.constructor.name || this.constructor.prototype.name);\n\tif (this.message)\n\t\tstr += ': ' + this.message;\n\treturn (str);\n};\nVError.prototype.cause = function ve_cause()\n{\n\tvar cause = VError.cause(this);\n\treturn (cause === null ? undefined : cause);\n};\nVError.cause = function (err)\n{\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\treturn (mod_isError(err.jse_cause) ? err.jse_cause : null);\n};\nVError.info = function (err)\n{\n\tvar rv, cause, k;\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\tcause = VError.cause(err);\n\tif (cause !== null) {\n\t\trv = VError.info(cause);\n\t} else {\n\t\trv = {};\n\t}\n\tif (typeof (err.jse_info) == 'object' && err.jse_info !== null) {\n\t\tfor (k in err.jse_info) {\n\t\t\trv[k] = err.jse_info[k];\n\t\t}\n\t}\n\treturn (rv);\n};\nVError.findCauseByName = function (err, name)\n{\n\tvar cause;\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\tmod_assertplus.string(name, 'name');\n\tmod_assertplus.ok(name.length > 0, 'name cannot be empty');\n\tfor (cause = err; cause !== null; cause = VError.cause(cause)) {\n\t\tmod_assertplus.ok(mod_isError(cause));\n\t\tif (cause.name == name) {\n\t\t\treturn (cause);\n\t\t}\n\t}\n\treturn (null);\n};\nVError.hasCauseWithName = function (err, name)\n{\n\treturn (VError.findCauseByName(err, name) !== null);\n};\nVError.fullStack = function (err)\n{\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\tvar cause = VError.cause(err);\n\tif (cause) {\n\t\treturn (err.stack + '\\ncaused by: ' + VError.fullStack(cause));\n\t}\n\treturn (err.stack);\n};\nVError.errorFromList = function (errors)\n{\n\tmod_assertplus.arrayOfObject(errors, 'errors');\n\tif (errors.length === 0) {\n\t\treturn (null);\n\t}\n\terrors.forEach(function (e) {\n\t\tmod_assertplus.ok(mod_isError(e));\n\t});\n\tif (errors.length == 1) {\n\t\treturn (errors[0]);\n\t}\n\treturn (new MultiError(errors));\n};\nVError.errorForEach = function (err, func)\n{\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\tmod_assertplus.func(func, 'func');\n\tif (err instanceof MultiError) {\n\t\terr.errors().forEach(function iterError(e) { func(e); });\n\t} else {\n\t\tfunc(err);\n\t}\n};\nfunction SError()\n{\n\tvar args, obj, parsed, options;\n\targs = Array.prototype.slice.call(arguments, 0);\n\tif (!(this instanceof SError)) {\n\t\tobj = Object.create(SError.prototype);\n\t\tSError.apply(obj, arguments);\n\t\treturn (obj);\n\t}\n\tparsed = parseConstructorArguments({\n\t 'argv': args,\n\t 'strict': true\n\t});\n\toptions = parsed.options;\n\tVError.call(this, options, '%s', parsed.shortmessage);\n\treturn (this);\n}\nmod_util.inherits(SError, VError);\nfunction MultiError(errors)\n{\n\tmod_assertplus.array(errors, 'list of errors');\n\tmod_assertplus.ok(errors.length > 0, 'must be at least one error');\n\tthis.ase_errors = errors;\n\tVError.call(this, {\n\t 'cause': errors[0]\n\t}, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's');\n}\nmod_util.inherits(MultiError, VError);\nMultiError.prototype.name = 'MultiError';\nMultiError.prototype.errors = function me_errors()\n{\n\treturn (this.ase_errors.slice(0));\n};\nfunction WError()\n{\n\tvar args, obj, parsed, options;\n\targs = Array.prototype.slice.call(arguments, 0);\n\tif (!(this instanceof WError)) {\n\t\tobj = Object.create(WError.prototype);\n\t\tWError.apply(obj, args);\n\t\treturn (obj);\n\t}\n\tparsed = parseConstructorArguments({\n\t 'argv': args,\n\t 'strict': false\n\t});\n\toptions = parsed.options;\n\toptions['skipCauseMessage'] = true;\n\tVError.call(this, options, '%s', parsed.shortmessage);\n\treturn (this);\n}\nmod_util.inherits(WError, VError);\nWError.prototype.name = 'WError';\nWError.prototype.toString = function we_toString()\n{\n\tvar str = (this.hasOwnProperty('name') && this.name ||\n\t\tthis.constructor.name || this.constructor.prototype.name);\n\tif (this.message)\n\t\tstr += ': ' + this.message;\n\tif (this.jse_cause && this.jse_cause.message)\n\t\tstr += '; caused by ' + this.jse_cause.toString();\n\treturn (str);\n};\nWError.prototype.cause = function we_cause(c)\n{\n\tif (mod_isError(c))\n\t\tthis.jse_cause = c;\n\treturn (this.jse_cause);\n};\n\nvar validate = {exports: {}};\n\n(function (module) {\n\t(function (root, factory) {\n\t if (module.exports) {\n\t module.exports = factory();\n\t } else {\n\t root.jsonSchema = factory();\n\t }\n\t}(commonjsGlobal, function () {\n\tvar exports = validate;\n\texports.Integer = {type:\"integer\"};\n\tvar primitiveConstructors = {\n\t\tString: String,\n\t\tBoolean: Boolean,\n\t\tNumber: Number,\n\t\tObject: Object,\n\t\tArray: Array,\n\t\tDate: Date\n\t};\n\texports.validate = validate;\n\tfunction validate(instance,schema) {\n\t\t\treturn validate(instance, schema, {changing: false});\n\t\t}\texports.checkPropertyChange = function(value,schema, property) {\n\t\t\treturn validate(value, schema, {changing: property || \"property\"});\n\t\t};\n\tvar validate = exports._validate = function(instance,schema,options) {\n\t\tif (!options) options = {};\n\t\tvar _changing = options.changing;\n\t\tfunction getType(schema){\n\t\t\treturn schema.type || (primitiveConstructors[schema.name] == schema && schema.name.toLowerCase());\n\t\t}\n\t\tvar errors = [];\n\t\tfunction checkProp(value, schema, path,i){\n\t\t\tvar l;\n\t\t\tpath += path ? typeof i == 'number' ? '[' + i + ']' : typeof i == 'undefined' ? '' : '.' + i : i;\n\t\t\tfunction addError(message){\n\t\t\t\terrors.push({property:path,message:message});\n\t\t\t}\n\t\t\tif((typeof schema != 'object' || schema instanceof Array) && (path || typeof schema != 'function') && !(schema && getType(schema))){\n\t\t\t\tif(typeof schema == 'function'){\n\t\t\t\t\tif(!(value instanceof schema)){\n\t\t\t\t\t\taddError(\"is not an instance of the class/constructor \" + schema.name);\n\t\t\t\t\t}\n\t\t\t\t}else if(schema){\n\t\t\t\t\taddError(\"Invalid schema/property definition \" + schema);\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif(_changing && schema.readonly){\n\t\t\t\taddError(\"is a readonly field, it can not be changed\");\n\t\t\t}\n\t\t\tif(schema['extends']){\n\t\t\t\tcheckProp(value,schema['extends'],path,i);\n\t\t\t}\n\t\t\tfunction checkType(type,value){\n\t\t\t\tif(type){\n\t\t\t\t\tif(typeof type == 'string' && type != 'any' &&\n\t\t\t\t\t\t\t(type == 'null' ? value !== null : typeof value != type) &&\n\t\t\t\t\t\t\t!(value instanceof Array && type == 'array') &&\n\t\t\t\t\t\t\t!(value instanceof Date && type == 'date') &&\n\t\t\t\t\t\t\t!(type == 'integer' && value%1===0)){\n\t\t\t\t\t\treturn [{property:path,message:value + \" - \" + (typeof value) + \" value found, but a \" + type + \" is required\"}];\n\t\t\t\t\t}\n\t\t\t\t\tif(type instanceof Array){\n\t\t\t\t\t\tvar unionErrors=[];\n\t\t\t\t\t\tfor(var j = 0; j < type.length; j++){\n\t\t\t\t\t\t\tif(!(unionErrors=checkType(type[j],value)).length){\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(unionErrors.length){\n\t\t\t\t\t\t\treturn unionErrors;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(typeof type == 'object'){\n\t\t\t\t\t\tvar priorErrors = errors;\n\t\t\t\t\t\terrors = [];\n\t\t\t\t\t\tcheckProp(value,type,path);\n\t\t\t\t\t\tvar theseErrors = errors;\n\t\t\t\t\t\terrors = priorErrors;\n\t\t\t\t\t\treturn theseErrors;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tif(value === undefined){\n\t\t\t\tif(schema.required){\n\t\t\t\t\taddError(\"is missing and it is required\");\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\terrors = errors.concat(checkType(getType(schema),value));\n\t\t\t\tif(schema.disallow && !checkType(schema.disallow,value).length){\n\t\t\t\t\taddError(\" disallowed value was matched\");\n\t\t\t\t}\n\t\t\t\tif(value !== null){\n\t\t\t\t\tif(value instanceof Array){\n\t\t\t\t\t\tif(schema.items){\n\t\t\t\t\t\t\tvar itemsIsArray = schema.items instanceof Array;\n\t\t\t\t\t\t\tvar propDef = schema.items;\n\t\t\t\t\t\t\tfor (i = 0, l = value.length; i < l; i += 1) {\n\t\t\t\t\t\t\t\tif (itemsIsArray)\n\t\t\t\t\t\t\t\t\tpropDef = schema.items[i];\n\t\t\t\t\t\t\t\tif (options.coerce)\n\t\t\t\t\t\t\t\t\tvalue[i] = options.coerce(value[i], propDef);\n\t\t\t\t\t\t\t\terrors.concat(checkProp(value[i],propDef,path,i));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(schema.minItems && value.length < schema.minItems){\n\t\t\t\t\t\t\taddError(\"There must be a minimum of \" + schema.minItems + \" in the array\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(schema.maxItems && value.length > schema.maxItems){\n\t\t\t\t\t\t\taddError(\"There must be a maximum of \" + schema.maxItems + \" in the array\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(schema.properties || schema.additionalProperties){\n\t\t\t\t\t\terrors.concat(checkObj(value, schema.properties, path, schema.additionalProperties));\n\t\t\t\t\t}\n\t\t\t\t\tif(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){\n\t\t\t\t\t\taddError(\"does not match the regex pattern \" + schema.pattern);\n\t\t\t\t\t}\n\t\t\t\t\tif(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){\n\t\t\t\t\t\taddError(\"may only be \" + schema.maxLength + \" characters long\");\n\t\t\t\t\t}\n\t\t\t\t\tif(schema.minLength && typeof value == 'string' && value.length < schema.minLength){\n\t\t\t\t\t\taddError(\"must be at least \" + schema.minLength + \" characters long\");\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof schema.minimum !== 'undefined' && typeof value == typeof schema.minimum &&\n\t\t\t\t\t\t\tschema.minimum > value){\n\t\t\t\t\t\taddError(\"must have a minimum value of \" + schema.minimum);\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof schema.maximum !== 'undefined' && typeof value == typeof schema.maximum &&\n\t\t\t\t\t\t\tschema.maximum < value){\n\t\t\t\t\t\taddError(\"must have a maximum value of \" + schema.maximum);\n\t\t\t\t\t}\n\t\t\t\t\tif(schema['enum']){\n\t\t\t\t\t\tvar enumer = schema['enum'];\n\t\t\t\t\t\tl = enumer.length;\n\t\t\t\t\t\tvar found;\n\t\t\t\t\t\tfor(var j = 0; j < l; j++){\n\t\t\t\t\t\t\tif(enumer[j]===value){\n\t\t\t\t\t\t\t\tfound=1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!found){\n\t\t\t\t\t\t\taddError(\"does not have a value in the enumeration \" + enumer.join(\", \"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(typeof schema.maxDecimal == 'number' &&\n\t\t\t\t\t\t(value.toString().match(new RegExp(\"\\\\.[0-9]{\" + (schema.maxDecimal + 1) + \",}\")))){\n\t\t\t\t\t\taddError(\"may only have \" + schema.maxDecimal + \" digits of decimal places\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tfunction checkObj(instance,objTypeDef,path,additionalProp){\n\t\t\tif(typeof objTypeDef =='object'){\n\t\t\t\tif(typeof instance != 'object' || instance instanceof Array){\n\t\t\t\t\terrors.push({property:path,message:\"an object is required\"});\n\t\t\t\t}\n\t\t\t\tfor(var i in objTypeDef){\n\t\t\t\t\tif(objTypeDef.hasOwnProperty(i) && i != '__proto__' && i != 'constructor'){\n\t\t\t\t\t\tvar value = instance.hasOwnProperty(i) ? instance[i] : undefined;\n\t\t\t\t\t\tif (value === undefined && options.existingOnly) continue;\n\t\t\t\t\t\tvar propDef = objTypeDef[i];\n\t\t\t\t\t\tif(value === undefined && propDef[\"default\"]){\n\t\t\t\t\t\t\tvalue = instance[i] = propDef[\"default\"];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(options.coerce && i in instance){\n\t\t\t\t\t\t\tvalue = instance[i] = options.coerce(value, propDef);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcheckProp(value,propDef,path,i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(i in instance){\n\t\t\t\tif(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){\n\t\t\t\t\tif (options.filter) {\n\t\t\t\t\t\tdelete instance[i];\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors.push({property:path,message:\"The property \" + i +\n\t\t\t\t\t\t\t\" is not defined in the schema and the schema does not allow additional properties\"});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires;\n\t\t\t\tif(requires && !(requires in instance)){\n\t\t\t\t\terrors.push({property:path,message:\"the presence of the property \" + i + \" requires that \" + requires + \" also be present\"});\n\t\t\t\t}\n\t\t\t\tvalue = instance[i];\n\t\t\t\tif(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){\n\t\t\t\t\tif(options.coerce){\n\t\t\t\t\t\tvalue = instance[i] = options.coerce(value, additionalProp);\n\t\t\t\t\t}\n\t\t\t\t\tcheckProp(value,additionalProp,path,i);\n\t\t\t\t}\n\t\t\t\tif(!_changing && value && value.$schema){\n\t\t\t\t\terrors = errors.concat(checkProp(value,value.$schema,path,i));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn errors;\n\t\t}\n\t\tif(schema){\n\t\t\tcheckProp(instance,schema,'',_changing || '');\n\t\t}\n\t\tif(!_changing && instance && instance.$schema){\n\t\t\tcheckProp(instance,instance.$schema,'','');\n\t\t}\n\t\treturn {valid:!errors.length,errors:errors};\n\t};\n\texports.mustBeValid = function(result){\n\t\tif(!result.valid){\n\t\t\tthrow new TypeError(result.errors.map(function(error){return \"for property \" + error.property + ': ' + error.message;}).join(\", \\n\"));\n\t\t}\n\t};\n\treturn exports;\n\t}));\n} (validate));\n\nvar mod_assert = assert_1;\nvar mod_extsprintf = extsprintf$1;\nvar mod_verror = verror;\nvar mod_jsonschema = validate.exports;\njsprim$1.deepCopy = deepCopy;\njsprim$1.deepEqual = deepEqual;\njsprim$1.isEmpty = isEmpty;\njsprim$1.hasKey = hasKey;\njsprim$1.forEachKey = forEachKey;\njsprim$1.pluck = pluck;\njsprim$1.flattenObject = flattenObject;\njsprim$1.flattenIter = flattenIter;\njsprim$1.validateJsonObject = validateJsonObjectJS;\njsprim$1.validateJsonObjectJS = validateJsonObjectJS;\njsprim$1.randElt = randElt;\njsprim$1.extraProperties = extraProperties;\njsprim$1.mergeObjects = mergeObjects;\njsprim$1.startsWith = startsWith$1;\njsprim$1.endsWith = endsWith;\njsprim$1.parseInteger = parseInteger;\njsprim$1.iso8601 = iso8601;\njsprim$1.rfc1123 = rfc1123;\njsprim$1.parseDateTime = parseDateTime;\njsprim$1.hrtimediff = hrtimeDiff;\njsprim$1.hrtimeDiff = hrtimeDiff;\njsprim$1.hrtimeAccum = hrtimeAccum;\njsprim$1.hrtimeAdd = hrtimeAdd;\njsprim$1.hrtimeNanosec = hrtimeNanosec;\njsprim$1.hrtimeMicrosec = hrtimeMicrosec;\njsprim$1.hrtimeMillisec = hrtimeMillisec;\nfunction deepCopy(obj)\n{\n\tvar ret, key;\n\tvar marker = '__deepCopy';\n\tif (obj && obj[marker])\n\t\tthrow (new Error('attempted deep copy of cyclic object'));\n\tif (obj && obj.constructor == Object) {\n\t\tret = {};\n\t\tobj[marker] = true;\n\t\tfor (key in obj) {\n\t\t\tif (key == marker)\n\t\t\t\tcontinue;\n\t\t\tret[key] = deepCopy(obj[key]);\n\t\t}\n\t\tdelete (obj[marker]);\n\t\treturn (ret);\n\t}\n\tif (obj && obj.constructor == Array) {\n\t\tret = [];\n\t\tobj[marker] = true;\n\t\tfor (key = 0; key < obj.length; key++)\n\t\t\tret.push(deepCopy(obj[key]));\n\t\tdelete (obj[marker]);\n\t\treturn (ret);\n\t}\n\treturn (obj);\n}\nfunction deepEqual(obj1, obj2)\n{\n\tif (typeof (obj1) != typeof (obj2))\n\t\treturn (false);\n\tif (obj1 === null || obj2 === null || typeof (obj1) != 'object')\n\t\treturn (obj1 === obj2);\n\tif (obj1.constructor != obj2.constructor)\n\t\treturn (false);\n\tvar k;\n\tfor (k in obj1) {\n\t\tif (!obj2.hasOwnProperty(k))\n\t\t\treturn (false);\n\t\tif (!deepEqual(obj1[k], obj2[k]))\n\t\t\treturn (false);\n\t}\n\tfor (k in obj2) {\n\t\tif (!obj1.hasOwnProperty(k))\n\t\t\treturn (false);\n\t}\n\treturn (true);\n}\nfunction isEmpty(obj)\n{\n\tvar key;\n\tfor (key in obj)\n\t\treturn (false);\n\treturn (true);\n}\nfunction hasKey(obj, key)\n{\n\tmod_assert.equal(typeof (key), 'string');\n\treturn (Object.prototype.hasOwnProperty.call(obj, key));\n}\nfunction forEachKey(obj, callback)\n{\n\tfor (var key in obj) {\n\t\tif (hasKey(obj, key)) {\n\t\t\tcallback(key, obj[key]);\n\t\t}\n\t}\n}\nfunction pluck(obj, key)\n{\n\tmod_assert.equal(typeof (key), 'string');\n\treturn (pluckv(obj, key));\n}\nfunction pluckv(obj, key)\n{\n\tif (obj === null || typeof (obj) !== 'object')\n\t\treturn (undefined);\n\tif (obj.hasOwnProperty(key))\n\t\treturn (obj[key]);\n\tvar i = key.indexOf('.');\n\tif (i == -1)\n\t\treturn (undefined);\n\tvar key1 = key.substr(0, i);\n\tif (!obj.hasOwnProperty(key1))\n\t\treturn (undefined);\n\treturn (pluckv(obj[key1], key.substr(i + 1)));\n}\nfunction flattenIter(data, depth, callback)\n{\n\tdoFlattenIter(data, depth, [], callback);\n}\nfunction doFlattenIter(data, depth, accum, callback)\n{\n\tvar each;\n\tvar key;\n\tif (depth === 0) {\n\t\teach = accum.slice(0);\n\t\teach.push(data);\n\t\tcallback(each);\n\t\treturn;\n\t}\n\tmod_assert.ok(data !== null);\n\tmod_assert.equal(typeof (data), 'object');\n\tmod_assert.equal(typeof (depth), 'number');\n\tmod_assert.ok(depth >= 0);\n\tfor (key in data) {\n\t\teach = accum.slice(0);\n\t\teach.push(key);\n\t\tdoFlattenIter(data[key], depth - 1, each, callback);\n\t}\n}\nfunction flattenObject(data, depth)\n{\n\tif (depth === 0)\n\t\treturn ([ data ]);\n\tmod_assert.ok(data !== null);\n\tmod_assert.equal(typeof (data), 'object');\n\tmod_assert.equal(typeof (depth), 'number');\n\tmod_assert.ok(depth >= 0);\n\tvar rv = [];\n\tvar key;\n\tfor (key in data) {\n\t\tflattenObject(data[key], depth - 1).forEach(function (p) {\n\t\t\trv.push([ key ].concat(p));\n\t\t});\n\t}\n\treturn (rv);\n}\nfunction startsWith$1(str, prefix)\n{\n\treturn (str.substr(0, prefix.length) == prefix);\n}\nfunction endsWith(str, suffix)\n{\n\treturn (str.substr(\n\t str.length - suffix.length, suffix.length) == suffix);\n}\nfunction iso8601(d)\n{\n\tif (typeof (d) == 'number')\n\t\td = new Date(d);\n\tmod_assert.ok(d.constructor === Date);\n\treturn (mod_extsprintf.sprintf('%4d-%02d-%02dT%02d:%02d:%02d.%03dZ',\n\t d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(),\n\t d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(),\n\t d.getUTCMilliseconds()));\n}\nvar RFC1123_MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nvar RFC1123_DAYS = [\n 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nfunction rfc1123(date) {\n\treturn (mod_extsprintf.sprintf('%s, %02d %s %04d %02d:%02d:%02d GMT',\n\t RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(),\n\t RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(),\n\t date.getUTCHours(), date.getUTCMinutes(),\n\t date.getUTCSeconds()));\n}\nfunction parseDateTime(str)\n{\n\tvar numeric = +str;\n\tif (!isNaN(numeric)) {\n\t\treturn (new Date(numeric));\n\t} else {\n\t\treturn (new Date(str));\n\t}\n}\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\nvar MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\nvar PI_DEFAULTS = {\n\tbase: 10,\n\tallowSign: true,\n\tallowPrefix: false,\n\tallowTrailing: false,\n\tallowImprecise: false,\n\ttrimWhitespace: false,\n\tleadingZeroIsOctal: false\n};\nvar CP_0 = 0x30;\nvar CP_9 = 0x39;\nvar CP_A = 0x41;\nvar CP_B = 0x42;\nvar CP_O = 0x4f;\nvar CP_T = 0x54;\nvar CP_X = 0x58;\nvar CP_Z = 0x5a;\nvar CP_a = 0x61;\nvar CP_b = 0x62;\nvar CP_o = 0x6f;\nvar CP_t = 0x74;\nvar CP_x = 0x78;\nvar CP_z = 0x7a;\nvar PI_CONV_DEC = 0x30;\nvar PI_CONV_UC = 0x37;\nvar PI_CONV_LC = 0x57;\nfunction parseInteger(str, uopts)\n{\n\tmod_assert.string(str, 'str');\n\tmod_assert.optionalObject(uopts, 'options');\n\tvar baseOverride = false;\n\tvar options = PI_DEFAULTS;\n\tif (uopts) {\n\t\tbaseOverride = hasKey(uopts, 'base');\n\t\toptions = mergeObjects(options, uopts);\n\t\tmod_assert.number(options.base, 'options.base');\n\t\tmod_assert.ok(options.base >= 2, 'options.base >= 2');\n\t\tmod_assert.ok(options.base <= 36, 'options.base <= 36');\n\t\tmod_assert.bool(options.allowSign, 'options.allowSign');\n\t\tmod_assert.bool(options.allowPrefix, 'options.allowPrefix');\n\t\tmod_assert.bool(options.allowTrailing,\n\t\t 'options.allowTrailing');\n\t\tmod_assert.bool(options.allowImprecise,\n\t\t 'options.allowImprecise');\n\t\tmod_assert.bool(options.trimWhitespace,\n\t\t 'options.trimWhitespace');\n\t\tmod_assert.bool(options.leadingZeroIsOctal,\n\t\t 'options.leadingZeroIsOctal');\n\t\tif (options.leadingZeroIsOctal) {\n\t\t\tmod_assert.ok(!baseOverride,\n\t\t\t '\"base\" and \"leadingZeroIsOctal\" are ' +\n\t\t\t 'mutually exclusive');\n\t\t}\n\t}\n\tvar c;\n\tvar pbase = -1;\n\tvar base = options.base;\n\tvar start;\n\tvar mult = 1;\n\tvar value = 0;\n\tvar idx = 0;\n\tvar len = str.length;\n\tif (options.trimWhitespace) {\n\t\twhile (idx < len && isSpace(str.charCodeAt(idx))) {\n\t\t\t++idx;\n\t\t}\n\t}\n\tif (options.allowSign) {\n\t\tif (str[idx] === '-') {\n\t\t\tidx += 1;\n\t\t\tmult = -1;\n\t\t} else if (str[idx] === '+') {\n\t\t\tidx += 1;\n\t\t}\n\t}\n\tif (str[idx] === '0') {\n\t\tif (options.allowPrefix) {\n\t\t\tpbase = prefixToBase(str.charCodeAt(idx + 1));\n\t\t\tif (pbase !== -1 && (!baseOverride || pbase === base)) {\n\t\t\t\tbase = pbase;\n\t\t\t\tidx += 2;\n\t\t\t}\n\t\t}\n\t\tif (pbase === -1 && options.leadingZeroIsOctal) {\n\t\t\tbase = 8;\n\t\t}\n\t}\n\tfor (start = idx; idx < len; ++idx) {\n\t\tc = translateDigit(str.charCodeAt(idx));\n\t\tif (c !== -1 && c < base) {\n\t\t\tvalue *= base;\n\t\t\tvalue += c;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (start === idx) {\n\t\treturn (new Error('invalid number: ' + JSON.stringify(str)));\n\t}\n\tif (options.trimWhitespace) {\n\t\twhile (idx < len && isSpace(str.charCodeAt(idx))) {\n\t\t\t++idx;\n\t\t}\n\t}\n\tif (idx < len && !options.allowTrailing) {\n\t\treturn (new Error('trailing characters after number: ' +\n\t\t JSON.stringify(str.slice(idx))));\n\t}\n\tif (value === 0) {\n\t\treturn (0);\n\t}\n\tvar result = value * mult;\n\tif (!options.allowImprecise &&\n\t (value > MAX_SAFE_INTEGER || result < MIN_SAFE_INTEGER)) {\n\t\treturn (new Error('number is outside of the supported range: ' +\n\t\t JSON.stringify(str.slice(start, idx))));\n\t}\n\treturn (result);\n}\nfunction translateDigit(d)\n{\n\tif (d >= CP_0 && d <= CP_9) {\n\t\treturn (d - PI_CONV_DEC);\n\t} else if (d >= CP_A && d <= CP_Z) {\n\t\treturn (d - PI_CONV_UC);\n\t} else if (d >= CP_a && d <= CP_z) {\n\t\treturn (d - PI_CONV_LC);\n\t} else {\n\t\treturn (-1);\n\t}\n}\nfunction isSpace(c)\n{\n\treturn (c === 0x20) ||\n\t (c >= 0x0009 && c <= 0x000d) ||\n\t (c === 0x00a0) ||\n\t (c === 0x1680) ||\n\t (c === 0x180e) ||\n\t (c >= 0x2000 && c <= 0x200a) ||\n\t (c === 0x2028) ||\n\t (c === 0x2029) ||\n\t (c === 0x202f) ||\n\t (c === 0x205f) ||\n\t (c === 0x3000) ||\n\t (c === 0xfeff);\n}\nfunction prefixToBase(c)\n{\n\tif (c === CP_b || c === CP_B) {\n\t\treturn (2);\n\t} else if (c === CP_o || c === CP_O) {\n\t\treturn (8);\n\t} else if (c === CP_t || c === CP_T) {\n\t\treturn (10);\n\t} else if (c === CP_x || c === CP_X) {\n\t\treturn (16);\n\t} else {\n\t\treturn (-1);\n\t}\n}\nfunction validateJsonObjectJS(schema, input)\n{\n\tvar report = mod_jsonschema.validate(input, schema);\n\tif (report.errors.length === 0)\n\t\treturn (null);\n\tvar error = report.errors[0];\n\tvar propname = error['property'];\n\tvar reason = error['message'].toLowerCase();\n\tvar i, j;\n\tif ((i = reason.indexOf('the property ')) != -1 &&\n\t (j = reason.indexOf(' is not defined in the schema and the ' +\n\t 'schema does not allow additional properties')) != -1) {\n\t\ti += 'the property '.length;\n\t\tif (propname === '')\n\t\t\tpropname = reason.substr(i, j - i);\n\t\telse\n\t\t\tpropname = propname + '.' + reason.substr(i, j - i);\n\t\treason = 'unsupported property';\n\t}\n\tvar rv = new mod_verror.VError('property \"%s\": %s', propname, reason);\n\trv.jsv_details = error;\n\treturn (rv);\n}\nfunction randElt(arr)\n{\n\tmod_assert.ok(Array.isArray(arr) && arr.length > 0,\n\t 'randElt argument must be a non-empty array');\n\treturn (arr[Math.floor(Math.random() * arr.length)]);\n}\nfunction assertHrtime(a)\n{\n\tmod_assert.ok(a[0] >= 0 && a[1] >= 0,\n\t 'negative numbers not allowed in hrtimes');\n\tmod_assert.ok(a[1] < 1e9, 'nanoseconds column overflow');\n}\nfunction hrtimeDiff(a, b)\n{\n\tassertHrtime(a);\n\tassertHrtime(b);\n\tmod_assert.ok(a[0] > b[0] || (a[0] == b[0] && a[1] >= b[1]),\n\t 'negative differences not allowed');\n\tvar rv = [ a[0] - b[0], 0 ];\n\tif (a[1] >= b[1]) {\n\t\trv[1] = a[1] - b[1];\n\t} else {\n\t\trv[0]--;\n\t\trv[1] = 1e9 - (b[1] - a[1]);\n\t}\n\treturn (rv);\n}\nfunction hrtimeNanosec(a)\n{\n\tassertHrtime(a);\n\treturn (Math.floor(a[0] * 1e9 + a[1]));\n}\nfunction hrtimeMicrosec(a)\n{\n\tassertHrtime(a);\n\treturn (Math.floor(a[0] * 1e6 + a[1] / 1e3));\n}\nfunction hrtimeMillisec(a)\n{\n\tassertHrtime(a);\n\treturn (Math.floor(a[0] * 1e3 + a[1] / 1e6));\n}\nfunction hrtimeAccum(a, b)\n{\n\tassertHrtime(a);\n\tassertHrtime(b);\n\ta[1] += b[1];\n\tif (a[1] >= 1e9) {\n\t\ta[0]++;\n\t\ta[1] -= 1e9;\n\t}\n\ta[0] += b[0];\n\treturn (a);\n}\nfunction hrtimeAdd(a, b)\n{\n\tassertHrtime(a);\n\tvar rv = [ a[0], a[1] ];\n\treturn (hrtimeAccum(rv, b));\n}\nfunction extraProperties(obj, allowed)\n{\n\tmod_assert.ok(typeof (obj) === 'object' && obj !== null,\n\t 'obj argument must be a non-null object');\n\tmod_assert.ok(Array.isArray(allowed),\n\t 'allowed argument must be an array of strings');\n\tfor (var i = 0; i < allowed.length; i++) {\n\t\tmod_assert.ok(typeof (allowed[i]) === 'string',\n\t\t 'allowed argument must be an array of strings');\n\t}\n\treturn (Object.keys(obj).filter(function (key) {\n\t\treturn (allowed.indexOf(key) === -1);\n\t}));\n}\nfunction mergeObjects(provided, overrides, defaults)\n{\n\tvar rv, k;\n\trv = {};\n\tif (defaults) {\n\t\tfor (k in defaults)\n\t\t\trv[k] = defaults[k];\n\t}\n\tif (provided) {\n\t\tfor (k in provided)\n\t\t\trv[k] = provided[k];\n\t}\n\tif (overrides) {\n\t\tfor (k in overrides)\n\t\t\trv[k] = overrides[k];\n\t}\n\treturn (rv);\n}\n\nvar assert = assert_1;\nvar jsprim = jsprim$1;\nvar util = require$$2;\nfunction ParseError(input, message, index) {\n if (Error.captureStackTrace)\n Error.captureStackTrace(this, ParseError);\n this.input = input;\n this.message = message;\n if (index !== undefined) {\n this.message += ' at index ' + index;\n }\n}\nutil.inherits(ParseError, Error);\nfunction modulo(a, n) {\n return (n + (a % n)) % n;\n}\nfunction _arrayToOctetString(input) {\n var out;\n out = (input[0] >> 8) + '.' + (input[0] & 0xff) + '.';\n out += (input[1] >> 8) + '.' + (input[1] & 0xff);\n return out;\n}\nfunction _isAddr(addr) {\n if (typeof (addr) === 'object') {\n if (Array.isArray(addr._fields) && typeof (addr._attrs) === 'object') {\n return true;\n }\n }\n return false;\n}\nfunction _toAddr(input) {\n if (typeof (input) === 'string') {\n return ip6addrParse(input);\n } else if (_isAddr(input)) {\n return input;\n } else {\n throw new Error('Invalid argument: Addr or parsable string expected');\n }\n}\nfunction _arrayToHex(input, zeroElide, zeroPad) {\n var i;\n var elStart = null;\n var elLen = 0;\n if (zeroElide) {\n var start = null;\n var len = null;\n for (i = 0; i < input.length; i++) {\n if (input[i] === 0) {\n if (start === null) {\n start = i;\n len = 1;\n } else {\n len++;\n }\n } else if (start !== null) {\n if (len > elLen) {\n elStart = start;\n elLen = len;\n }\n start = null;\n }\n }\n if (start !== null && len > elLen) {\n elStart = start;\n elLen = len;\n }\n }\n var output = [];\n var num;\n for (i = 0; i < input.length; i++) {\n if (elStart !== null) {\n if (i === elStart) {\n if (elLen === 8) {\n return ['::'];\n } else if (elStart === 0 || elStart + elLen === input.length) {\n output.push(':');\n } else {\n output.push('');\n }\n }\n if (i >= elStart && i < elStart + elLen) {\n continue;\n }\n }\n num = input[i].toString(16);\n if (zeroPad && num.length != 4) {\n num = '0000'.slice(num.length) + num;\n }\n output.push(num);\n }\n return output;\n}\nfunction _ipv4Mapped(input) {\n var comp = [0, 0, 0, 0, 0, 0xffff];\n var i;\n for (i = 0; i < 6; i++) {\n if (input[i] != comp[i])\n return false;\n }\n return true;\n}\nfunction _prefixToAddr(len) {\n assert.number(len);\n len = len | 0;\n assert.ok(len <= 128);\n assert.ok(len >= 0);\n var output = new Addr();\n var i;\n for (i = 0; len > 16; i++, len -= 16) {\n output._fields[i] = 0xffff;\n }\n if (len > 0) {\n output._fields[i] = 0xffff - ((1 << (16 - len)) - 1);\n }\n return output;\n}\nfunction _toCIDR(input) {\n if (typeof (input) === 'string') {\n return new CIDR(input);\n } else if (input instanceof CIDR) {\n return input;\n } else {\n throw new Error('Invalid argument: CIDR or parsable string expected');\n }\n}\nvar strDefaults = {\n format: 'auto',\n zeroElide: true,\n zeroPad: false\n};\nfunction getStrOpt(opts, name) {\n if (opts && opts.hasOwnProperty(name)) {\n return opts[name];\n } else {\n return strDefaults[name];\n }\n}\nfunction Addr() {\n this._fields = [0, 0, 0, 0, 0, 0, 0, 0];\n this._attrs = {};\n}\nAddr.prototype.kind = function getKind() {\n if (v4subnet.contains(this)) {\n return 'ipv4';\n } else {\n return 'ipv6';\n }\n};\nAddr.prototype.toString = function toString(opts) {\n assert.optionalObject(opts, 'opts');\n var format = getStrOpt(opts, 'format');\n var zeroElide = getStrOpt(opts, 'zeroElide');\n var zeroPad = getStrOpt(opts, 'zeroPad');\n assert.string(format, 'opts.format');\n assert.bool(zeroElide, 'opts.zeroElide');\n assert.bool(zeroPad, 'opts.zeroPad');\n if (format === 'auto') {\n if (this._attrs.ipv4Bare) {\n format = 'v4';\n } else if (this._attrs.ipv4Mapped) {\n format = 'v4-mapped';\n } else {\n format = 'v6';\n }\n }\n switch (format) {\n case 'v4':\n if (!v4subnet.contains(this)) {\n throw new Error('cannot print non-v4 address in dotted quad notation');\n }\n return _arrayToOctetString(this._fields.slice(6));\n case 'v4-mapped':\n if (!v4subnet.contains(this)) {\n throw new Error('cannot print non-v4 address as a v4-mapped address');\n }\n var output = _arrayToHex(this._fields.slice(0, 6), zeroElide, zeroPad);\n output.push(_arrayToOctetString(this._fields.slice(6)));\n return output.join(':');\n case 'v6':\n return _arrayToHex(this._fields, zeroElide, zeroPad).join(':');\n default:\n throw new Error('unrecognized format method \"' + format + '\"');\n }\n};\nAddr.prototype.toBuffer = function toBuffer(buf) {\n if (buf !== undefined) {\n if (!isBuffer$2(buf)) {\n throw new Error('optional arg must be Buffer');\n }\n } else {\n buf = new Buffer$1(16);\n }\n var i;\n for (i = 0; i < 8; i++) {\n buf.writeUInt16BE(this._fields[i], i*2);\n }\n return buf;\n};\nAddr.prototype.toLong = function toLong() {\n if (!v4subnet.contains(this)) {\n throw new Error('only possible for ipv4-mapped addresses');\n }\n return ((this._fields[6] << 16) >>> 0) + this._fields[7];\n};\nAddr.prototype.clone = function cloneAddr() {\n var out = new Addr();\n out._fields = this._fields.slice();\n for (var k in this._attrs) {\n out._attrs[k] = this._attrs[k];\n }\n return out;\n};\nAddr.prototype.offset = function offset(num) {\n if (num < -4294967295 || num > 4294967295) {\n throw new Error('offsets should be between -4294967295 and 4294967295');\n }\n var out = this.clone();\n var i, moved;\n for (i = 7; i >= 0; i--) {\n moved = out._fields[i] + num;\n if (moved > 65535) {\n num = moved >>> 16;\n moved = moved & 0xffff;\n } else if (moved < 0) {\n num = Math.floor(moved / (1 << 16));\n moved = modulo(moved, 1 << 16);\n } else {\n num = 0;\n }\n out._fields[i] = moved;\n if (num !== 0) {\n if ((i === 0) || (i === 6 && this._attrs.ipv4Mapped)) {\n return null;\n }\n } else {\n break;\n }\n }\n return out;\n};\nAddr.prototype.and = function addrAnd(input) {\n input = _toAddr(input);\n var i;\n var output = this.clone();\n for (i = 0; i < 8; i++) {\n output._fields[i] = output._fields[i] & input._fields[i];\n }\n return output;\n};\nAddr.prototype.or = function addrOr(input) {\n input = _toAddr(input);\n var i;\n var output = this.clone();\n for (i = 0; i < 8; i++) {\n output._fields[i] = output._fields[i] | input._fields[i];\n }\n return output;\n};\nAddr.prototype.not = function addrNot() {\n var i;\n var output = this.clone();\n for (i = 0; i < 8; i++) {\n output._fields[i] = (~ output._fields[i]) & 0xffff;\n }\n return output;\n};\nAddr.prototype.compare = function compareMember(addr) {\n return ip6addrCompare(this, addr);\n};\nfunction CIDR(addr, prefixLen) {\n if (prefixLen === undefined) {\n assert.string(addr);\n var fields = addr.match(/^([a-fA-F0-9:.]+)\\/([0-9]+)$/);\n if (fields === null) {\n throw new Error('Invalid argument: / expected');\n }\n addr = fields[1];\n prefixLen = parseInt(fields[2], 10);\n }\n assert.number(prefixLen);\n prefixLen = prefixLen | 0;\n addr = _toAddr(addr);\n if (addr._attrs.ipv4Bare) {\n prefixLen += 96;\n }\n if (prefixLen < 0 || prefixLen > 128) {\n throw new Error('Invalid prefix length');\n }\n this._prefix = prefixLen;\n this._mask = _prefixToAddr(prefixLen);\n this._addr = addr.and(this._mask);\n}\nCIDR.prototype.contains = function cidrContains(input) {\n input = _toAddr(input);\n return (this._addr.compare(input.and(this._mask)) === 0);\n};\nCIDR.prototype.first = function cidrFirst() {\n if (this._prefix >= 127) {\n return this._addr;\n } else {\n return this._addr.offset(1);\n }\n};\nCIDR.prototype.last = function cidrLast() {\n var ending = this._addr.or(this._mask.not());\n if (this._prefix >= 127) {\n return ending;\n } else {\n if (this._addr._attrs.ipv4Mapped) {\n return ending.offset(-1);\n } else {\n return ending;\n }\n }\n};\nCIDR.prototype.broadcast = function getBroadcast() {\n if (!v4subnet.contains(this._addr)) {\n throw new Error('Only IPv4 networks have broadcast addresses');\n }\n return this._addr.or(this._mask.not());\n};\nCIDR.prototype.compare = function compareCIDR(cidr) {\n return ip6cidrCompare(this, cidr);\n};\nCIDR.prototype.prefixLength = function getPrefixLength(format) {\n assert.optionalString(format, 'format');\n if (format === undefined || format === 'auto') {\n format = this._addr._attrs.ipv4Bare ? 'v4' : 'v6';\n }\n switch (format) {\n case 'v4':\n if (!v4subnet.contains(this._addr)) {\n throw new Error('cannot return v4 prefix length for non-v4 address');\n }\n return this._prefix - 96;\n case 'v6':\n return this._prefix;\n default:\n throw new Error('unrecognized format method \"' + format + '\"');\n }\n};\nCIDR.prototype.address = function getAddressComponent() {\n return this._addr;\n};\nCIDR.prototype.toString = function cidrString(opts) {\n assert.optionalObject(opts, 'opts');\n var format = getStrOpt(opts, 'format');\n if (format === 'v4-mapped') {\n format = 'v6';\n }\n return this._addr.toString(opts) + '/' + this.prefixLength(format);\n};\nvar v4subnet = new CIDR('::ffff:0:0', 96);\nfunction ip6cidrCompare(a, b) {\n a = _toCIDR(a);\n b = _toCIDR(b);\n var cmp = ip6addrCompare(a._addr, b._addr);\n return cmp === 0 ? b._prefix - a._prefix : cmp;\n}\nfunction AddrRange(begin, end) {\n begin = _toAddr(begin);\n end = _toAddr(end);\n if (begin.compare(end) > 0) {\n throw new Error('begin address must be <= end address');\n }\n this._begin = begin;\n this._end = end;\n}\nAddrRange.prototype.contains = function addrRangeContains(input) {\n input = _toAddr(input);\n return (this._begin.compare(input) <= 0 && this._end.compare(input) >= 0);\n};\nAddrRange.prototype.first = function addrRangeFirst() {\n return this._begin;\n};\nAddrRange.prototype.last = function addrRangeLast() {\n return this._end;\n};\nfunction ip6addrParse(input) {\n if (typeof (input) === 'string') {\n return parseString(input);\n } else if (typeof (input) === 'number') {\n return parseLong(input);\n } else if (typeof (input) === 'object' && _isAddr(input)) {\n return input;\n } else {\n throw new Error('Invalid argument: only string|number allowed');\n }\n}\nfunction parseString(input) {\n assert.string(input);\n input = input.toLowerCase();\n var result = new Addr();\n var ip6Fields = [];\n var ip4Fields = [];\n var expIndex = null;\n var value = '';\n var i, c;\n if (input.length > 40) {\n throw new ParseError(input, 'Input too long');\n }\n for (i = 0; i < input.length; i++) {\n c = input[i];\n if (c === ':') {\n if ((i+1) < input.length && input[i+1] === ':') {\n if (expIndex !== null) {\n throw new ParseError(input, 'Multiple :: delimiters', i);\n }\n if (value !== '') {\n ip6Fields.push(value);\n value = '';\n }\n expIndex = ip6Fields.length;\n i++;\n } else {\n if (value === '') {\n throw new ParseError(input, 'illegal delimiter', i);\n }\n ip6Fields.push(value);\n value = '';\n }\n } else if (c === '.') {\n ip4Fields.push(value);\n value = '';\n } else {\n value = value + c;\n }\n }\n if (value !== '') {\n if (ip4Fields.length !== 0) {\n ip4Fields.push(value);\n } else {\n ip6Fields.push(value);\n }\n value = '';\n } else {\n if (expIndex !== ip6Fields.length || ip4Fields.length > 0) {\n throw new ParseError(input, 'Cannot end with delimiter besides ::');\n }\n }\n if (ip4Fields.length === 0) {\n if (ip6Fields.length > 8) {\n throw new ParseError(input, 'Too many fields');\n } else if (ip6Fields.length < 8 && expIndex === null) {\n throw new ParseError(input, 'Too few fields');\n }\n } else {\n if (ip4Fields.length !== 4) {\n throw new ParseError(input, 'IPv4 portion must have 4 fields');\n }\n if (ip6Fields.length === 0 && expIndex === null) {\n result._attrs.ipv4Bare = true;\n ip6Fields = ['ffff'];\n expIndex = 0;\n }\n if (ip6Fields.length > 6) {\n throw new ParseError(input, 'Too many fields');\n } else if (ip6Fields.length < 6 && expIndex === null) {\n throw new ParseError(input, 'Too few fields');\n }\n }\n var field, num;\n for (i = 0; i < ip6Fields.length; i++) {\n field = ip6Fields[i];\n num = jsprim.parseInteger(field, { base: 16, allowSign: false });\n if (num instanceof Error || num < 0 || num > 65535) {\n throw new ParseError(input, 'Invalid field value: ' + field);\n }\n ip6Fields[i] = num;\n }\n for (i = 0; i < ip4Fields.length; i++) {\n field = ip4Fields[i];\n num = jsprim.parseInteger(field, { base: 10, allowSign: false });\n if (num instanceof Error || num < 0 || num > 255) {\n throw new ParseError(input, 'Invalid field value: ' + field);\n }\n ip4Fields[i] = num;\n }\n if (ip4Fields.length !== 0) {\n ip6Fields.push((ip4Fields[0]*256) + ip4Fields[1]);\n ip6Fields.push((ip4Fields[2]*256) + ip4Fields[3]);\n }\n if (ip6Fields.length < 8 && expIndex !== null) {\n var filler = [];\n for (i = 0; i < (8 - ip6Fields.length); i++) {\n filler.push(0);\n }\n ip6Fields = Array.prototype.concat(\n ip6Fields.slice(0, expIndex),\n filler,\n ip6Fields.slice(expIndex)\n );\n }\n if (ip4Fields.length !== 0) {\n if (!_ipv4Mapped(ip6Fields)) {\n throw new ParseError(input, 'invalid dotted-quad notation');\n } else {\n result._attrs.ipv4Mapped = true;\n }\n }\n result._fields = ip6Fields;\n return result;\n}\nfunction parseLong(input) {\n assert.number(input);\n if (input !== Math.floor(input)) {\n throw new Error('Value must be integer');\n }\n if (input < 0 || input > 0xffffffff) {\n throw new Error('Value must be 32 bit');\n }\n var out = new Addr();\n out._fields[7] = input & 0xffff;\n out._fields[6] = (input >>> 16);\n out._fields[5] = 0xffff;\n out._attrs.ipv4Bare = true;\n out._attrs.ipv4Mapped = true;\n return out;\n}\nfunction ip6addrCompare(a, b) {\n a = _toAddr(a);\n b = _toAddr(b);\n var i;\n for (i = 0; i < 8; i++) {\n if (a._fields[i] < b._fields[i]) {\n return -1;\n } else if (a._fields[i] > b._fields[i]) {\n return 1;\n }\n }\n return 0;\n}\nvar ip6addr = {\n parse: ip6addrParse,\n compare: ip6addrCompare,\n createCIDR: function (addr, len) {\n return new CIDR(addr, len);\n },\n compareCIDR: ip6cidrCompare,\n createAddrRange: function (begin, end) {\n return new AddrRange(begin, end);\n }\n};\n\n/**\n * This is the base class representing double values modifiers\n */\nvar BaseValuesModifier = /** @class */ (function () {\n /**\n * Parses the values string\n *\n * @param values - values string\n *\n * @throws an error if the string is empty or invalid\n */\n function BaseValuesModifier(values) {\n if (!values) {\n throw new SyntaxError('Modifier cannot be empty');\n }\n this.value = values;\n var permittedValues = [];\n var restrictedValues = [];\n var parts = values.split(SEPARATOR);\n for (var i = 0; i < parts.length; i += 1) {\n var app = parts[i];\n var restricted = false;\n if (app.startsWith('~')) {\n restricted = true;\n app = app.substring(1).trim();\n }\n if (app === '') {\n throw new SyntaxError(\"Empty values specified in \\\"\".concat(values, \"\\\"\"));\n }\n if (restricted) {\n restrictedValues.push(app);\n }\n else {\n permittedValues.push(app);\n }\n }\n this.restricted = restrictedValues.length > 0 ? restrictedValues : null;\n this.permitted = permittedValues.length > 0 ? permittedValues : null;\n }\n BaseValuesModifier.prototype.getPermitted = function () {\n return this.permitted;\n };\n BaseValuesModifier.prototype.getRestricted = function () {\n return this.restricted;\n };\n BaseValuesModifier.prototype.getValue = function () {\n return this.value;\n };\n BaseValuesModifier.prototype.match = function (value) {\n if (!this.restricted && !this.permitted) {\n return true;\n }\n if (this.restricted && this.restricted.includes(value)) {\n return false;\n }\n if (this.permitted) {\n return this.permitted.includes(value);\n }\n return true;\n };\n return BaseValuesModifier;\n}());\n\n/**\n * Netmasks class\n */\nvar NetmasksCollection = /** @class */ (function () {\n function NetmasksCollection() {\n this.ipv4Masks = [];\n this.ipv6Masks = [];\n }\n /**\n * Returns true if any of the containing masks contains provided value\n *\n * @param value\n */\n NetmasksCollection.prototype.contains = function (value) {\n if (isIp_1.v4(value)) {\n return this.ipv4Masks.some(function (x) { return x.contains(value); });\n }\n return this.ipv6Masks.some(function (x) { return x.contains(value); });\n };\n return NetmasksCollection;\n}());\n/**\n * The client modifier allows specifying clients this rule will be working for.\n * It accepts client names (not ClientIDs), IP addresses, or CIDR ranges.\n */\nvar ClientModifier = /** @class */ (function (_super) {\n __extends(ClientModifier, _super);\n /**\n * Constructor\n *\n * @param value\n */\n function ClientModifier(value) {\n var _this = _super.call(this, value) || this;\n var permitted = _this.getPermitted();\n if (permitted) {\n _this.permitted = ClientModifier.stripValues(permitted);\n _this.permittedNetmasks = ClientModifier.parseNetmasks(_this.permitted);\n }\n var restricted = _this.getRestricted();\n if (restricted) {\n _this.restricted = ClientModifier.stripValues(restricted);\n _this.restrictedNetmasks = ClientModifier.parseNetmasks(_this.restricted);\n }\n return _this;\n }\n /**\n * Unquotes and unescapes string\n *\n * @param values\n */\n ClientModifier.stripValues = function (values) {\n return values.map(function (v) {\n if ((v.startsWith('\"') && v.endsWith('\"'))\n || (v.startsWith('\\'') && v.endsWith('\\''))) {\n // eslint-disable-next-line no-param-reassign\n v = v.substr(1, v.length - 2);\n }\n return v.replace(/\\\\/ig, '');\n });\n };\n /**\n * Checks if this modifier matches provided params\n *\n * @param clientName\n * @param clientIP\n */\n ClientModifier.prototype.matchAny = function (clientName, clientIP) {\n if (this.restricted) {\n if (clientName && this.restricted.includes(clientName)) {\n return false;\n }\n if (clientIP && this.restricted.includes(clientIP)) {\n return false;\n }\n return true;\n }\n if (this.restrictedNetmasks) {\n if (clientIP && this.restrictedNetmasks.contains(clientIP)) {\n return false;\n }\n return true;\n }\n if (this.permitted) {\n if (clientName && this.permitted.includes(clientName)) {\n return true;\n }\n if (clientIP && this.permitted.includes(clientIP)) {\n return true;\n }\n }\n if (this.permittedNetmasks) {\n if (clientIP && this.permittedNetmasks.contains(clientIP)) {\n return true;\n }\n }\n return false;\n };\n /**\n * Parses netmasks from client's strings\n *\n * @param values\n */\n ClientModifier.parseNetmasks = function (values) {\n var result = new NetmasksCollection();\n values.forEach(function (x) {\n var cidrVersion = isCidr.exports(x);\n if (cidrVersion === 4) {\n result.ipv4Masks.push(new Netmask_1(x));\n }\n else if (cidrVersion === 6) {\n result.ipv6Masks.push(ip6addr.createCIDR(x));\n }\n });\n return result;\n };\n return ClientModifier;\n}(BaseValuesModifier));\n\n/**\n * The dnsrewrite response modifier allows replacing the content of the response\n * to the DNS request for the matching hosts.\n *\n * TODO: This modifier is not yet implemented\n * https://github.com/AdguardTeam/AdGuardHome/wiki/Hosts-Blocklists#dnsrewrite\n */\nvar DnsRewriteModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function DnsRewriteModifier(value) {\n this.value = value;\n }\n /**\n * Modifier value\n */\n DnsRewriteModifier.prototype.getValue = function () {\n return this.value;\n };\n return DnsRewriteModifier;\n}());\n\n/**\n * The dnstype modifier allows specifying DNS request type on which this rule will be triggered.\n */\nvar DnsTypeModifier = /** @class */ (function (_super) {\n __extends(DnsTypeModifier, _super);\n /**\n * Constructor\n *\n * @param value\n */\n function DnsTypeModifier(value) {\n var _this = _super.call(this, value) || this;\n if (_this.permitted) {\n _this.restricted = null;\n }\n return _this;\n }\n return DnsTypeModifier;\n}(BaseValuesModifier));\n\n/**\n * The ctag modifier allows to block domains only for specific types of DNS client tags.\n */\nvar CtagModifier = /** @class */ (function (_super) {\n __extends(CtagModifier, _super);\n /**\n * Constructor\n *\n * @param value\n */\n function CtagModifier(value) {\n var _this = _super.call(this, value) || this;\n _this.validate();\n return _this;\n }\n /**\n * Validates tag values\n */\n CtagModifier.prototype.validate = function () {\n if (!this.getValue()) {\n throw new Error('Invalid rule: Ctag modifier must not be empty');\n }\n var tags = this.permitted ? this.permitted : this.restricted;\n if (tags && tags.some(function (x) { return !CtagModifier.ALLOWED_TAGS.includes(x); })) {\n throw new Error('Invalid rule: Invalid ctag modifier');\n }\n };\n /**\n * The list of allowed tags\n */\n CtagModifier.ALLOWED_TAGS = [\n // By device type:\n 'device_audio',\n 'device_camera',\n 'device_gameconsole',\n 'device_laptop',\n 'device_nas',\n 'device_pc',\n 'device_phone',\n 'device_printer',\n 'device_securityalarm',\n 'device_tablet',\n 'device_tv',\n 'device_other',\n // By operating system:\n 'os_android',\n 'os_ios',\n 'os_linux',\n 'os_macos',\n 'os_windows',\n 'os_other',\n // By user group:\n 'user_admin',\n 'user_regular',\n 'user_child',\n ];\n return CtagModifier;\n}(BaseValuesModifier));\n\n/**\n * Rule pattern class\n *\n * This class parses rule pattern text to simple fields.\n */\nvar Pattern = /** @class */ (function () {\n /**\n * Constructor\n * @param pattern\n * @param matchcase\n */\n function Pattern(pattern, matchcase) {\n if (matchcase === void 0) { matchcase = false; }\n this.pattern = pattern;\n this.shortcut = SimpleRegex.extractShortcut(this.pattern);\n this.matchcase = matchcase;\n }\n /**\n * Checks if this rule pattern matches the specified request.\n *\n * @param request - request to check\n * @param shortcutMatched if true, it means that the request already matches\n * this pattern's shortcut and we don't need to match it again.\n * @returns true if pattern matches\n */\n Pattern.prototype.matchPattern = function (request, shortcutMatched) {\n this.prepare();\n if (this.patternShortcut) {\n return shortcutMatched || this.matchShortcut(request.urlLowercase);\n }\n if (this.hostname) {\n // If we have a `||example.org^` rule, it's easier to match\n // against the request's hostname only without matching\n // a regular expression.\n return request.hostname === this.hostname\n || ( // First light check without new string memory allocation\n request.hostname.endsWith(this.hostname)\n // Strict check\n && request.hostname.endsWith(\".\".concat(this.hostname)));\n }\n // If the regular expression is invalid, just return false right away.\n if (this.regexInvalid || !this.regex) {\n return false;\n }\n // This is needed for DNS filtering only, not used in browser blocking.\n if (this.shouldMatchHostname(request)) {\n return this.regex.test(request.hostname);\n }\n return this.regex.test(request.url);\n };\n /**\n * Checks if this rule pattern matches the specified relative path string.\n * This method is used in cosmetic rules to implement the $path modifier matching logic.\n *\n * @param path - path to check\n * @returns true if pattern matches\n */\n Pattern.prototype.matchPathPattern = function (path) {\n this.prepare();\n if (this.hostname) {\n return false;\n }\n var pathIsEmptyString = this.pattern === '';\n // No-value $path should match root URL\n if (pathIsEmptyString && path === '/') {\n return true;\n }\n if (!pathIsEmptyString && this.patternShortcut) {\n return this.matchShortcut(path);\n }\n // If the regular expression is invalid, just return false right away.\n if (this.regexInvalid || !this.regex) {\n return false;\n }\n return this.regex.test(path);\n };\n /**\n * matchShortcut simply checks if shortcut is a substring of the URL.\n * @param request - request to check.\n */\n Pattern.prototype.matchShortcut = function (str) {\n return str.indexOf(this.shortcut) >= 0;\n };\n /**\n * Prepares this pattern\n */\n Pattern.prototype.prepare = function () {\n if (this.prepared) {\n return;\n }\n this.prepared = true;\n // If shortcut and pattern are the same, we don't need to actually compile\n // a regex and can simply use matchShortcut instead,\n // except for the $match-case modifier\n if (this.pattern === this.shortcut && !this.matchcase) {\n this.patternShortcut = true;\n return;\n }\n // Rules like `/example/*` are rather often in the real-life filters,\n // we might want to process them.\n if (this.pattern.startsWith(this.shortcut)\n && this.pattern.length === this.shortcut.length + 1\n && this.pattern.endsWith('*')) {\n this.patternShortcut = true;\n return;\n }\n if (this.pattern.startsWith(SimpleRegex.MASK_START_URL)\n && this.pattern.endsWith(SimpleRegex.MASK_SEPARATOR)\n && this.pattern.indexOf('*') < 0\n && this.pattern.indexOf('/') < 0) {\n this.hostname = this.pattern.slice(2, this.pattern.length - 1);\n return;\n }\n this.compileRegex();\n };\n /**\n * Compiles this pattern regex\n */\n Pattern.prototype.compileRegex = function () {\n var regexText = SimpleRegex.patternToRegexp(this.pattern);\n try {\n var flags = 'i';\n if (this.matchcase) {\n flags = '';\n }\n this.regex = new RegExp(regexText, flags);\n }\n catch (e) {\n this.regexInvalid = true;\n }\n };\n /**\n * Checks if we should match hostnames and not the URL\n * this is important for the cases when we use urlfilter for DNS-level blocking\n * Note, that even though we may work on a DNS-level, we should still sometimes match full URL instead\n *\n * @param request\n */\n Pattern.prototype.shouldMatchHostname = function (request) {\n if (!request.isHostnameRequest) {\n return false;\n }\n return !this.isPatternDomainSpecific();\n };\n /**\n * In case pattern starts with the following it targets some specific domain\n */\n Pattern.prototype.isPatternDomainSpecific = function () {\n if (this.patternDomainSpecific === undefined) {\n this.patternDomainSpecific = this.pattern.startsWith(SimpleRegex.MASK_START_URL)\n || this.pattern.startsWith('http://')\n || this.pattern.startsWith('https:/')\n || this.pattern.startsWith('://');\n }\n return this.patternDomainSpecific;\n };\n return Pattern;\n}());\n\n/**\n * NetworkRuleOption is the enumeration of various rule options.\n * In order to save memory, we store some options as a flag.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#modifiers\n */\nvar NetworkRuleOption;\n(function (NetworkRuleOption) {\n /** $third-party modifier */\n NetworkRuleOption[NetworkRuleOption[\"ThirdParty\"] = 1] = \"ThirdParty\";\n /** $match-case modifier */\n NetworkRuleOption[NetworkRuleOption[\"MatchCase\"] = 2] = \"MatchCase\";\n /** $important modifier */\n NetworkRuleOption[NetworkRuleOption[\"Important\"] = 4] = \"Important\";\n // Allowlist rules modifiers\n // Each of them can disable part of the functionality\n /** $elemhide modifier */\n NetworkRuleOption[NetworkRuleOption[\"Elemhide\"] = 8] = \"Elemhide\";\n /** $generichide modifier */\n NetworkRuleOption[NetworkRuleOption[\"Generichide\"] = 16] = \"Generichide\";\n /** $specifichide modifier */\n NetworkRuleOption[NetworkRuleOption[\"Specifichide\"] = 32] = \"Specifichide\";\n /** $genericblock modifier */\n NetworkRuleOption[NetworkRuleOption[\"Genericblock\"] = 64] = \"Genericblock\";\n /** $jsinject modifier */\n NetworkRuleOption[NetworkRuleOption[\"Jsinject\"] = 128] = \"Jsinject\";\n /** $urlblock modifier */\n NetworkRuleOption[NetworkRuleOption[\"Urlblock\"] = 256] = \"Urlblock\";\n /** $content modifier */\n NetworkRuleOption[NetworkRuleOption[\"Content\"] = 512] = \"Content\";\n /** $extension modifier */\n NetworkRuleOption[NetworkRuleOption[\"Extension\"] = 1024] = \"Extension\";\n /** $stealth modifier */\n NetworkRuleOption[NetworkRuleOption[\"Stealth\"] = 2048] = \"Stealth\";\n // Content modifying\n // $empty modifier\n NetworkRuleOption[NetworkRuleOption[\"Empty\"] = 4096] = \"Empty\";\n // $mp4 modifier\n NetworkRuleOption[NetworkRuleOption[\"Mp4\"] = 8192] = \"Mp4\";\n // Other modifiers\n /** $popup modifier */\n NetworkRuleOption[NetworkRuleOption[\"Popup\"] = 16384] = \"Popup\";\n /** $csp modifier */\n NetworkRuleOption[NetworkRuleOption[\"Csp\"] = 32768] = \"Csp\";\n /** $replace modifier */\n NetworkRuleOption[NetworkRuleOption[\"Replace\"] = 65536] = \"Replace\";\n /** $cookie modifier */\n NetworkRuleOption[NetworkRuleOption[\"Cookie\"] = 131072] = \"Cookie\";\n /** $redirect modifier */\n NetworkRuleOption[NetworkRuleOption[\"Redirect\"] = 262144] = \"Redirect\";\n /** $badfilter modifier */\n NetworkRuleOption[NetworkRuleOption[\"Badfilter\"] = 524288] = \"Badfilter\";\n /** $removeparam modifier */\n NetworkRuleOption[NetworkRuleOption[\"RemoveParam\"] = 1048576] = \"RemoveParam\";\n /** $removeheader modifier */\n NetworkRuleOption[NetworkRuleOption[\"RemoveHeader\"] = 2097152] = \"RemoveHeader\";\n /** $jsonprune modifier */\n NetworkRuleOption[NetworkRuleOption[\"JsonPrune\"] = 4194304] = \"JsonPrune\";\n /** $hls modifier */\n NetworkRuleOption[NetworkRuleOption[\"Hls\"] = 8388608] = \"Hls\";\n // Compatibility dependent\n /** $network modifier */\n NetworkRuleOption[NetworkRuleOption[\"Network\"] = 16777216] = \"Network\";\n /** dns modifiers */\n NetworkRuleOption[NetworkRuleOption[\"Client\"] = 33554432] = \"Client\";\n NetworkRuleOption[NetworkRuleOption[\"DnsRewrite\"] = 67108864] = \"DnsRewrite\";\n NetworkRuleOption[NetworkRuleOption[\"DnsType\"] = 134217728] = \"DnsType\";\n NetworkRuleOption[NetworkRuleOption[\"Ctag\"] = 268435456] = \"Ctag\";\n // Document\n NetworkRuleOption[NetworkRuleOption[\"Document\"] = 536870912] = \"Document\";\n // Groups (for validation)\n /** Blacklist-only modifiers */\n NetworkRuleOption[NetworkRuleOption[\"BlacklistOnly\"] = 12288] = \"BlacklistOnly\";\n /** Allowlist-only modifiers */\n NetworkRuleOption[NetworkRuleOption[\"AllowlistOnly\"] = 4088] = \"AllowlistOnly\";\n /** Options supported by host-level network rules * */\n NetworkRuleOption[NetworkRuleOption[\"OptionHostLevelRules\"] = 503840772] = \"OptionHostLevelRules\";\n /**\n * Removeparam compatible modifiers\n *\n * $removeparam rules are compatible only with content type modifiers ($script, $stylesheet, etc)\n * and this list of modifiers:\n */\n NetworkRuleOption[NetworkRuleOption[\"RemoveParamCompatibleOptions\"] = 538443783] = \"RemoveParamCompatibleOptions\";\n /**\n * Removeheader compatible modifiers\n *\n * $removeheader rules are compatible only with content type modifiers ($script, $stylesheet, etc)\n * and this list of modifiers:\n */\n NetworkRuleOption[NetworkRuleOption[\"RemoveHeaderCompatibleOptions\"] = 539492359] = \"RemoveHeaderCompatibleOptions\";\n})(NetworkRuleOption || (NetworkRuleOption = {}));\n/**\n * Helper class that is used for passing {@link NetworkRule.parseRuleText}\n * result to the caller. Should not be used outside of this file.\n */\nvar BasicRuleParts = /** @class */ (function () {\n function BasicRuleParts() {\n }\n return BasicRuleParts;\n}());\n// Flag that indicates that permitted ALL request types.\nvar PermittedAllRequestTypes = 0;\n// Flag that indicates that restricted ALL request types.\nvar RestrictedAllRequestTypes = 0;\n/**\n * Basic network filtering rule.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules\n */\nvar NetworkRule = /** @class */ (function () {\n /**\n * Creates an instance of the {@link NetworkRule}.\n * It parses this rule and extracts the rule pattern (see {@link SimpleRegex}),\n * and rule modifiers.\n *\n * @param ruleText - original rule text.\n * @param filterListId - ID of the filter list this rule belongs to.\n *\n * @throws error if it fails to parse the rule.\n */\n function NetworkRule(ruleText, filterListId) {\n this.permittedDomains = null;\n this.restrictedDomains = null;\n /**\n * Domains in denyallow modifier providing exceptions for permitted domains\n * https://github.com/AdguardTeam/CoreLibs/issues/1304\n */\n this.denyAllowDomains = null;\n /** Flag with all enabled rule options */\n this.enabledOptions = 0;\n /** Flag with all disabled rule options */\n this.disabledOptions = 0;\n /** Flag with all permitted request types. */\n this.permittedRequestTypes = PermittedAllRequestTypes;\n /** Flag with all restricted request types. */\n this.restrictedRequestTypes = RestrictedAllRequestTypes;\n /**\n * Rule Advanced modifier\n */\n this.advancedModifier = null;\n /**\n * Rule App modifier\n */\n this.appModifier = null;\n /**\n * Priority weight\n * Used in rules priority comparision\n */\n this.priorityWeight = 0;\n this.ruleText = ruleText;\n this.filterListId = filterListId;\n var ruleParts = NetworkRule.parseRuleText(ruleText);\n this.allowlist = !!ruleParts.allowlist;\n var pattern = ruleParts.pattern;\n if (pattern && NetworkRule.hasSpaces(pattern)) {\n throw new SyntaxError('Rule has spaces, seems to be an host rule');\n }\n if (ruleParts.options) {\n this.loadOptions(ruleParts.options);\n }\n if (pattern === SimpleRegex.MASK_START_URL\n || pattern === SimpleRegex.MASK_ANY_CHARACTER\n || pattern === ''\n || pattern.length < SimpleRegex.MIN_GENERIC_RULE_LENGTH) {\n // Except cookie, removeparam rules and dns compatible rules, they have their own atmosphere\n var hasCookieModifier = this.advancedModifier instanceof CookieModifier;\n var hasRemoveParamModifier = this.advancedModifier instanceof RemoveParamModifier;\n // https://github.com/AdguardTeam/tsurlfilter/issues/56\n var isDnsCompatible = isCompatibleWith(CompatibilityTypes.Dns);\n if (!hasCookieModifier && !hasRemoveParamModifier && !isDnsCompatible) {\n if (!(this.hasPermittedDomains() || this.hasPermittedApps())) {\n // Rule matches too much and does not have any domain restriction\n // We should not allow this kind of rules\n // eslint-disable-next-line max-len\n throw new SyntaxError('The rule is too wide, add domain restriction or make the pattern more specific');\n }\n }\n }\n this.pattern = new Pattern(pattern, this.isOptionEnabled(NetworkRuleOption.MatchCase));\n }\n NetworkRule.prototype.getText = function () {\n return this.ruleText;\n };\n NetworkRule.prototype.getFilterListId = function () {\n return this.filterListId;\n };\n /**\n * Returns rule pattern,\n * which currently is used only in the rule validator module\n */\n NetworkRule.prototype.getPattern = function () {\n return this.pattern.pattern;\n };\n /**\n * Returns `true` if the rule is \"allowlist\", e.g. if it disables other\n * rules when the pattern matches the request.\n */\n NetworkRule.prototype.isAllowlist = function () {\n return this.allowlist;\n };\n /**\n * Checks if the rule is a document-level allowlist rule\n * This means that the rule is supposed to disable or modify blocking\n * of the page subrequests.\n * For instance, `@@||example.org^$urlblock` unblocks all sub-requests.\n */\n NetworkRule.prototype.isDocumentLevelAllowlistRule = function () {\n if (!this.isAllowlist()) {\n return false;\n }\n return this.isOptionEnabled(NetworkRuleOption.Urlblock)\n || this.isOptionEnabled(NetworkRuleOption.Genericblock)\n || this.isOptionEnabled(NetworkRuleOption.Content);\n };\n /**\n * Checks if the rule is a document allowlist rule.\n * For instance,\n * \"@@||example.org^$document\"\n * completely disables filtering on all pages at example.com and all subdomains.\n */\n NetworkRule.prototype.isDocumentAllowlistRule = function () {\n if (!this.isAllowlist()) {\n return false;\n }\n return this.isOptionEnabled(NetworkRuleOption.Document);\n };\n /**\n * The longest part of pattern without any special characters.\n * It is used to improve the matching performance.\n */\n NetworkRule.prototype.getShortcut = function () {\n return this.pattern.shortcut;\n };\n /**\n * Gets list of permitted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier\n */\n NetworkRule.prototype.getPermittedDomains = function () {\n return this.permittedDomains;\n };\n /**\n * Gets list of denyAllow domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#denyallow-modifier\n */\n NetworkRule.prototype.getDenyAllowDomains = function () {\n return this.denyAllowDomains;\n };\n /**\n * Gets list of restricted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier\n */\n NetworkRule.prototype.getRestrictedDomains = function () {\n return this.restrictedDomains;\n };\n /**\n * Gets list of permitted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app\n */\n NetworkRule.prototype.getPermittedApps = function () {\n if (this.appModifier) {\n return this.appModifier.permittedApps;\n }\n return null;\n };\n /**\n * Gets list of restricted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app\n */\n NetworkRule.prototype.getRestrictedApps = function () {\n if (this.appModifier) {\n return this.appModifier.restrictedApps;\n }\n return null;\n };\n /** Flag with all permitted request types. 'PermittedAll' means ALL. */\n NetworkRule.prototype.getPermittedRequestTypes = function () {\n return this.permittedRequestTypes;\n };\n /** Flag with all restricted request types. 'RestrictedAll' means NONE. */\n NetworkRule.prototype.getRestrictedRequestTypes = function () {\n return this.restrictedRequestTypes;\n };\n /**\n * Advanced modifier\n */\n NetworkRule.prototype.getAdvancedModifier = function () {\n return this.advancedModifier;\n };\n /**\n * Advanced modifier value\n */\n NetworkRule.prototype.getAdvancedModifierValue = function () {\n return this.advancedModifier && this.advancedModifier.getValue();\n };\n /**\n * isRegexRule returns true if rule's pattern is a regular expression.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#regexp-support\n */\n NetworkRule.prototype.isRegexRule = function () {\n return (this.getPattern().startsWith(SimpleRegex.MASK_REGEX_RULE)\n && this.getPattern().endsWith(SimpleRegex.MASK_REGEX_RULE));\n };\n NetworkRule.prototype.matchesPermittedDomains = function (hostname) {\n if (this.hasPermittedDomains()\n && DomainModifier.isDomainOrSubdomainOfAny(hostname, this.permittedDomains)) {\n return true;\n }\n return false;\n };\n /**\n * Checks if this filtering rule matches the specified request.\n * @param request - request to check.\n * @param useShortcut - the flag to use this rule shortcut\n *\n * In case we use Trie in lookup table, we don't need to use shortcut cause we already check if request's url\n * includes full rule shortcut.\n */\n NetworkRule.prototype.match = function (request, useShortcut) {\n if (useShortcut === void 0) { useShortcut = true; }\n // Regex rules should not be tested by shortcut\n if (useShortcut && !this.matchShortcut(request)) {\n return false;\n }\n if (this.isOptionEnabled(NetworkRuleOption.ThirdParty) && !request.thirdParty) {\n return false;\n }\n if (this.isOptionDisabled(NetworkRuleOption.ThirdParty) && request.thirdParty) {\n return false;\n }\n if (!this.matchRequestType(request.requestType)) {\n return false;\n }\n if (!this.matchDomainModifier(request)) {\n return false;\n }\n if (this.isOptionEnabled(NetworkRuleOption.RemoveParam)) {\n if (!this.matchRequestTypeExplicit(request.requestType)) {\n return false;\n }\n }\n if (!this.matchDenyAllowDomains(request.hostname)) {\n return false;\n }\n if (!this.matchDnsType(request.dnsType)) {\n return false;\n }\n if (!this.matchClientTags(request.clientTags)) {\n return false;\n }\n if (!this.matchClient(request.clientName, request.clientIP)) {\n return false;\n }\n return this.pattern.matchPattern(request, true);\n };\n /**\n * matchShortcut simply checks if shortcut is a substring of the URL.\n * @param request - request to check.\n */\n NetworkRule.prototype.matchShortcut = function (request) {\n return request.urlLowercase.indexOf(this.getShortcut()) >= 0;\n };\n /**\n * matchDomain checks if the filtering rule is allowed on this domain.\n * @param domain - domain to check.\n */\n NetworkRule.prototype.matchDomain = function (domain) {\n if (this.hasRestrictedDomains()) {\n if (DomainModifier.isDomainOrSubdomainOfAny(domain, this.restrictedDomains)) {\n // Domain or host is restricted\n // i.e. $domain=~example.org\n return false;\n }\n }\n if (this.hasPermittedDomains()) {\n if (!DomainModifier.isDomainOrSubdomainOfAny(domain, this.permittedDomains)) {\n // Domain is not among permitted\n // i.e. $domain=example.org and we're checking example.com\n return false;\n }\n }\n return true;\n };\n /**\n * Check if request matches domain modifier by request referrer (general case) or by request target\n *\n * In some cases the $domain modifier can match not only the referrer domain, but also the target domain.\n * This happens when the following is true (1 AND ((2 AND 3) OR 4):\n *\n * 1) The request has document type\n * 2) The rule's pattern doesn't match any particular domain(s)\n * 3) The rule's pattern doesn't contain regular expressions\n * 4) The $domain modifier contains only excluded domains (e.g., $domain=~example.org|~example.com)\n *\n * When all these conditions are met, the domain modifier will match both the referrer domain and the target domain.\n * https://github.com/AdguardTeam/tsurlfilter/issues/45\n * @param request\n */\n NetworkRule.prototype.matchDomainModifier = function (request) {\n if (!this.permittedDomains && !this.restrictedDomains) {\n return true;\n }\n var isDocumentType = request.requestType === RequestType.Document\n || request.requestType === RequestType.SubDocument;\n var hasOnlyExcludedDomains = (!this.permittedDomains || this.permittedDomains.length === 0)\n && this.restrictedDomains\n && this.restrictedDomains.length > 0;\n var patternIsRegex = this.isRegexRule();\n var patternIsDomainSpecific = this.pattern.isPatternDomainSpecific();\n var matchesTargetByPatternCondition = !patternIsRegex && !patternIsDomainSpecific;\n if (isDocumentType && (hasOnlyExcludedDomains || matchesTargetByPatternCondition)) {\n // check if matches source hostname if exists or if matches target hostname\n return (request.sourceHostname && this.matchDomain(request.sourceHostname))\n || this.matchDomain(request.hostname);\n }\n return this.matchDomain(request.sourceHostname || '');\n };\n /**\n * checks if the filtering rule is allowed on this domain.\n * @param domain\n */\n NetworkRule.prototype.matchDenyAllowDomains = function (domain) {\n if (!this.denyAllowDomains) {\n return true;\n }\n if (this.denyAllowDomains.length > 0) {\n if (DomainModifier.isDomainOrSubdomainOfAny(domain, this.denyAllowDomains)) {\n return false;\n }\n }\n return true;\n };\n /**\n * Return TRUE if this rule matches with the tags associated with a client\n *\n * @param clientTags\n */\n NetworkRule.prototype.matchClientTags = function (clientTags) {\n var advancedModifier = this.getAdvancedModifier();\n if (!advancedModifier || !(advancedModifier instanceof CtagModifier)) {\n return true;\n }\n if (!clientTags) {\n return false;\n }\n var cTagsModifier = advancedModifier;\n return clientTags.every(function (x) { return cTagsModifier.match(x); });\n };\n /**\n * returns TRUE if the rule matches with the specified client\n *\n * @param clientName\n * @param clientIP\n */\n NetworkRule.prototype.matchClient = function (clientName, clientIP) {\n var advancedModifier = this.getAdvancedModifier();\n if (!advancedModifier || !(advancedModifier instanceof ClientModifier)) {\n return true;\n }\n if (!clientName && !clientIP) {\n return false;\n }\n var modifier = advancedModifier;\n return modifier.matchAny(clientName, clientIP);\n };\n /**\n * Return TRUE if this rule matches with the request dnstype\n *\n * @param dnstype\n */\n NetworkRule.prototype.matchDnsType = function (dnstype) {\n var advancedModifier = this.getAdvancedModifier();\n if (!advancedModifier || !(advancedModifier instanceof DnsTypeModifier)) {\n return true;\n }\n if (!dnstype) {\n return false;\n }\n var modifier = advancedModifier;\n return modifier.match(dnstype);\n };\n /**\n * Checks if rule has permitted domains\n */\n NetworkRule.prototype.hasPermittedDomains = function () {\n return this.permittedDomains != null && this.permittedDomains.length > 0;\n };\n /**\n * Checks if rule has restricted domains\n */\n NetworkRule.prototype.hasRestrictedDomains = function () {\n return this.restrictedDomains != null && this.restrictedDomains.length > 0;\n };\n /**\n * Checks if rule has permitted apps\n */\n NetworkRule.prototype.hasPermittedApps = function () {\n if (!this.appModifier) {\n return false;\n }\n return this.appModifier.permittedApps !== null && this.appModifier.permittedApps.length > 0;\n };\n /**\n * matchRequestType checks if the request's type matches the rule properties\n * @param requestType - request type to check.\n */\n NetworkRule.prototype.matchRequestType = function (requestType) {\n if (this.permittedRequestTypes !== PermittedAllRequestTypes) {\n if ((this.permittedRequestTypes & requestType) !== requestType) {\n return false;\n }\n }\n if (this.restrictedRequestTypes !== RestrictedAllRequestTypes) {\n if ((this.restrictedRequestTypes & requestType) === requestType) {\n return false;\n }\n }\n return true;\n };\n /**\n * In case of $removeparam modifier,\n * we only allow it to target other content types if the rule has an explicit content-type modifier.\n */\n NetworkRule.prototype.matchRequestTypeExplicit = function (requestType) {\n if (this.permittedRequestTypes === PermittedAllRequestTypes\n && this.restrictedRequestTypes === RestrictedAllRequestTypes\n && requestType !== RequestType.Document\n && requestType !== RequestType.SubDocument) {\n return false;\n }\n return this.matchRequestType(requestType);\n };\n /**\n * Checks if pattern has spaces\n * Used in order to do not create network rules from host rules\n * @param pattern\n * @private\n */\n NetworkRule.hasSpaces = function (pattern) {\n return pattern.indexOf(' ') > -1;\n };\n /**\n * Parses the options string and saves them.\n * More on the rule modifiers:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules-modifiers\n *\n * @param options - string with the rule modifiers\n *\n * @throws an error if there is an unsupported modifier\n */\n NetworkRule.prototype.loadOptions = function (options) {\n var optionParts;\n try {\n optionParts = parseOptionsString(options);\n }\n catch (e) {\n var errorMessage = getErrorMessage(e);\n throw new Error(\"Cannot parse \".concat(options, \": \").concat(errorMessage));\n }\n for (var i = 0; i < optionParts.length; i += 1) {\n var option = optionParts[i];\n var valueIndex = option.indexOf('=');\n var optionName = option;\n var optionValue = '';\n if (valueIndex > 0) {\n optionName = option.substring(0, valueIndex);\n optionValue = option.substring(valueIndex + 1);\n }\n this.loadOption(optionName, optionValue);\n }\n // More specified rule has more priority\n this.priorityWeight = optionParts.length;\n this.validateOptions();\n // In the case of allowlist rules $document implicitly includes all other modifiers:\n // `$content`, `$elemhide`, `$jsinject`, `$urlblock`.\n if (this.isAllowlist() && this.isOptionEnabled(NetworkRuleOption.Document)) {\n this.setOptionEnabled(NetworkRuleOption.Elemhide, true, true);\n this.setOptionEnabled(NetworkRuleOption.Jsinject, true, true);\n this.setOptionEnabled(NetworkRuleOption.Urlblock, true, true);\n this.setOptionEnabled(NetworkRuleOption.Content, true, true);\n this.priorityWeight += 4;\n }\n // $popup should work accumulatively with requestType modifiers\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1992\n if (this.isOptionEnabled(NetworkRuleOption.Popup) && this.permittedRequestTypes !== PermittedAllRequestTypes) {\n this.permittedRequestTypes |= RequestType.Document;\n }\n else if (this.isOptionEnabled(NetworkRuleOption.Popup)) {\n this.permittedRequestTypes = RequestType.Document;\n }\n // Rules of these types can be applied to documents only\n // $jsinject, $elemhide, $urlblock, $genericblock, $generichide and $content for allowlist rules.\n if (this.isOptionEnabled(NetworkRuleOption.Jsinject)\n || this.isOptionEnabled(NetworkRuleOption.Elemhide)\n || this.isOptionEnabled(NetworkRuleOption.Content)\n || this.isOptionEnabled(NetworkRuleOption.Urlblock)\n || this.isOptionEnabled(NetworkRuleOption.Genericblock)\n || this.isOptionEnabled(NetworkRuleOption.Generichide)) {\n this.permittedRequestTypes = RequestType.Document;\n }\n };\n /**\n * Returns true if the specified option is enabled.\n * Please note, that options have three state: enabled, disabled, undefined.\n *\n * @param option - rule option to check.\n */\n NetworkRule.prototype.isOptionEnabled = function (option) {\n return (this.enabledOptions & option) === option;\n };\n /**\n * Returns true if one and only option is enabled\n *\n * @param option\n */\n NetworkRule.prototype.isSingleOptionEnabled = function (option) {\n return this.enabledOptions === option;\n };\n /**\n * Returns true if the specified option is disabled.\n * Please note, that options have three state: enabled, disabled, undefined.\n *\n * @param option - rule option to check.\n */\n NetworkRule.prototype.isOptionDisabled = function (option) {\n return (this.disabledOptions & option) === option;\n };\n /**\n * Checks if the rule has higher priority that the specified rule\n * allowlist + $important > $important > allowlist > basic rules\n */\n NetworkRule.prototype.isHigherPriority = function (r) {\n var important = this.isOptionEnabled(NetworkRuleOption.Important);\n var rImportant = r.isOptionEnabled(NetworkRuleOption.Important);\n if (this.isAllowlist() && important && !(r.isAllowlist() && rImportant)) {\n return true;\n }\n if (r.isAllowlist() && rImportant && !(this.isAllowlist() && important)) {\n return false;\n }\n if (important && !rImportant) {\n return true;\n }\n if (rImportant && !important) {\n return false;\n }\n if (this.isAllowlist() && !r.isAllowlist()) {\n return true;\n }\n if (r.isAllowlist() && !this.isAllowlist()) {\n return false;\n }\n var generic = this.isGeneric();\n var rGeneric = r.isGeneric();\n if (!generic && rGeneric) {\n // specific rules have priority over generic rules\n return true;\n }\n return this.priorityWeight > r.priorityWeight;\n };\n /**\n * Returns true if the rule is considered \"generic\"\n * \"generic\" means that the rule is not restricted to a limited set of domains\n * Please note that it might be forbidden on some domains, though.\n *\n * @return {boolean}\n */\n NetworkRule.prototype.isGeneric = function () {\n return !this.hasPermittedDomains();\n };\n /**\n * Returns true if this rule negates the specified rule\n * Only makes sense when this rule has a `badfilter` modifier\n */\n NetworkRule.prototype.negatesBadfilter = function (specifiedRule) {\n if (!this.isOptionEnabled(NetworkRuleOption.Badfilter)) {\n return false;\n }\n if (this.allowlist !== specifiedRule.allowlist) {\n return false;\n }\n if (this.pattern.pattern !== specifiedRule.pattern.pattern) {\n return false;\n }\n if (this.permittedRequestTypes !== specifiedRule.permittedRequestTypes) {\n return false;\n }\n if (this.restrictedRequestTypes !== specifiedRule.restrictedRequestTypes) {\n return false;\n }\n if ((this.enabledOptions ^ NetworkRuleOption.Badfilter) !== specifiedRule.enabledOptions) {\n return false;\n }\n if (this.disabledOptions !== specifiedRule.disabledOptions) {\n return false;\n }\n if (!stringArraysEquals(this.restrictedDomains, specifiedRule.restrictedDomains)) {\n return false;\n }\n if (!stringArraysHaveIntersection(this.permittedDomains, specifiedRule.permittedDomains)) {\n return false;\n }\n return true;\n };\n /**\n * Checks if this rule can be used for hosts-level blocking\n */\n NetworkRule.prototype.isHostLevelNetworkRule = function () {\n if (this.hasPermittedDomains() || this.hasRestrictedDomains()) {\n return false;\n }\n if (this.permittedRequestTypes !== 0 && this.restrictedRequestTypes !== 0) {\n return false;\n }\n if (this.disabledOptions !== 0) {\n return false;\n }\n if (this.enabledOptions !== 0) {\n return ((this.enabledOptions\n & NetworkRuleOption.OptionHostLevelRules)\n | (this.enabledOptions\n ^ NetworkRuleOption.OptionHostLevelRules)) === NetworkRuleOption.OptionHostLevelRules;\n }\n return true;\n };\n /**\n * Enables or disables the specified option.\n *\n * @param option - option to enable or disable.\n * @param enabled - true to enable, false to disable.\n * @param skipRestrictions - skip options allowlist/blacklist restrictions\n *\n * @throws an error if the option we're trying to enable cannot be.\n * For instance, you cannot enable $elemhide for blacklist rules.\n */\n NetworkRule.prototype.setOptionEnabled = function (option, enabled, skipRestrictions) {\n if (skipRestrictions === void 0) { skipRestrictions = false; }\n if (!skipRestrictions) {\n if (this.allowlist && (option & NetworkRuleOption.BlacklistOnly) === option) {\n throw new SyntaxError(\"Modifier \".concat(NetworkRuleOption[option], \" cannot be used in allowlist rule\"));\n }\n if (!this.allowlist && (option & NetworkRuleOption.AllowlistOnly) === option) {\n throw new SyntaxError(\"Modifier \".concat(NetworkRuleOption[option], \" cannot be used in blacklist rule\"));\n }\n }\n if (enabled) {\n this.enabledOptions |= option;\n }\n else {\n this.disabledOptions |= option;\n }\n };\n /**\n * Permits or forbids the specified request type.\n * \"Permits\" means that the rule will match **only** the types that are permitted.\n * \"Restricts\" means that the rule will match **all but restricted**.\n *\n * @param requestType - request type.\n * @param permitted - true if it's permitted (whic)\n */\n NetworkRule.prototype.setRequestType = function (requestType, permitted) {\n if (permitted) {\n this.permittedRequestTypes |= requestType;\n }\n else {\n this.restrictedRequestTypes |= requestType;\n }\n };\n /**\n * Sets and validates exceptionally allowed domains presented in $denyallow modifier\n *\n * @param optionValue\n */\n NetworkRule.prototype.setDenyAllowDomains = function (optionValue) {\n var domainModifier = new DomainModifier(optionValue, PIPE_SEPARATOR);\n if (domainModifier.restrictedDomains && domainModifier.restrictedDomains.length > 0) {\n throw new SyntaxError('Invalid modifier: $denyallow domains cannot be negated');\n }\n if (domainModifier.permittedDomains\n && domainModifier.permittedDomains.some(function (x) { return x.includes(SimpleRegex.MASK_ANY_CHARACTER); })) {\n throw new SyntaxError('Invalid modifier: $denyallow domains wildcards are not supported');\n }\n this.denyAllowDomains = domainModifier.permittedDomains;\n };\n /**\n * Loads the specified modifier:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules-modifiers\n *\n * @param optionName - modifier name.\n * @param optionValue - modifier value.\n *\n * @throws an error if there is an unsupported modifier\n */\n NetworkRule.prototype.loadOption = function (optionName, optionValue) {\n var OPTIONS = NetworkRule.OPTIONS;\n if (optionName.startsWith(OPTIONS.NOOP)) {\n /**\n * A noop modifier does nothing and can be used to increase some rules readability.\n * It consists of the sequence of underscore characters (_) of any length\n * and can appear in a rule as many times as it's needed.\n */\n if (!optionName.split(OPTIONS.NOOP).some(function (s) { return !!s; })) {\n return;\n }\n }\n switch (optionName) {\n // General options\n case OPTIONS.THIRD_PARTY:\n case NOT_MARK + OPTIONS.FIRST_PARTY:\n this.setOptionEnabled(NetworkRuleOption.ThirdParty, true);\n break;\n case NOT_MARK + OPTIONS.THIRD_PARTY:\n case OPTIONS.FIRST_PARTY:\n this.setOptionEnabled(NetworkRuleOption.ThirdParty, false);\n break;\n case OPTIONS.MATCH_CASE:\n this.setOptionEnabled(NetworkRuleOption.MatchCase, true);\n break;\n case NOT_MARK + OPTIONS.MATCH_CASE:\n this.setOptionEnabled(NetworkRuleOption.MatchCase, false);\n break;\n case OPTIONS.IMPORTANT:\n this.setOptionEnabled(NetworkRuleOption.Important, true);\n break;\n // $domain modifier\n case OPTIONS.DOMAIN: {\n var domainModifier = new DomainModifier(optionValue, PIPE_SEPARATOR);\n this.permittedDomains = domainModifier.permittedDomains;\n this.restrictedDomains = domainModifier.restrictedDomains;\n break;\n }\n case OPTIONS.DENYALLOW: {\n this.setDenyAllowDomains(optionValue);\n break;\n }\n // Document-level allowlist rules\n case OPTIONS.ELEMHIDE:\n this.setOptionEnabled(NetworkRuleOption.Elemhide, true);\n break;\n case OPTIONS.GENERICHIDE:\n this.setOptionEnabled(NetworkRuleOption.Generichide, true);\n break;\n case OPTIONS.SPECIFICHIDE:\n this.setOptionEnabled(NetworkRuleOption.Specifichide, true);\n break;\n case OPTIONS.GENERICBLOCK:\n this.setOptionEnabled(NetworkRuleOption.Genericblock, true);\n break;\n case OPTIONS.JSINJECT:\n this.setOptionEnabled(NetworkRuleOption.Jsinject, true);\n break;\n case OPTIONS.URLBLOCK:\n this.setOptionEnabled(NetworkRuleOption.Urlblock, true);\n break;\n case OPTIONS.CONTENT:\n this.setOptionEnabled(NetworkRuleOption.Content, true);\n break;\n // $document\n case OPTIONS.DOCUMENT:\n case OPTIONS.DOC:\n this.setOptionEnabled(NetworkRuleOption.Document, true);\n this.setRequestType(RequestType.Document, true);\n break;\n case NOT_MARK + OPTIONS.DOCUMENT:\n case NOT_MARK + OPTIONS.DOC:\n this.setOptionEnabled(NetworkRuleOption.Document, false);\n this.setRequestType(RequestType.Document, false);\n break;\n // Stealth mode $stealth\n case OPTIONS.STEALTH:\n this.setOptionEnabled(NetworkRuleOption.Stealth, true);\n break;\n // $popup blocking option\n case OPTIONS.POPUP:\n this.setOptionEnabled(NetworkRuleOption.Popup, true);\n break;\n // $empty and $mp4\n // Deprecated in favor of $redirect\n case OPTIONS.EMPTY:\n this.setOptionEnabled(NetworkRuleOption.Empty, true);\n break;\n case OPTIONS.MP4:\n this.setOptionEnabled(NetworkRuleOption.Mp4, true);\n break;\n // Content type options\n case OPTIONS.SCRIPT:\n this.setRequestType(RequestType.Script, true);\n break;\n case NOT_MARK + OPTIONS.SCRIPT:\n this.setRequestType(RequestType.Script, false);\n break;\n case OPTIONS.STYLESHEET:\n this.setRequestType(RequestType.Stylesheet, true);\n break;\n case NOT_MARK + OPTIONS.STYLESHEET:\n this.setRequestType(RequestType.Stylesheet, false);\n break;\n case OPTIONS.SUBDOCUMENT:\n this.setRequestType(RequestType.SubDocument, true);\n break;\n case NOT_MARK + OPTIONS.SUBDOCUMENT:\n this.setRequestType(RequestType.SubDocument, false);\n break;\n case OPTIONS.OBJECT:\n this.setRequestType(RequestType.Object, true);\n break;\n case NOT_MARK + OPTIONS.OBJECT:\n this.setRequestType(RequestType.Object, false);\n break;\n case OPTIONS.IMAGE:\n this.setRequestType(RequestType.Image, true);\n break;\n case NOT_MARK + OPTIONS.IMAGE:\n this.setRequestType(RequestType.Image, false);\n break;\n case OPTIONS.XMLHTTPREQUEST:\n this.setRequestType(RequestType.XmlHttpRequest, true);\n break;\n case NOT_MARK + OPTIONS.XMLHTTPREQUEST:\n this.setRequestType(RequestType.XmlHttpRequest, false);\n break;\n case OPTIONS.MEDIA:\n this.setRequestType(RequestType.Media, true);\n break;\n case NOT_MARK + OPTIONS.MEDIA:\n this.setRequestType(RequestType.Media, false);\n break;\n case OPTIONS.FONT:\n this.setRequestType(RequestType.Font, true);\n break;\n case NOT_MARK + OPTIONS.FONT:\n this.setRequestType(RequestType.Font, false);\n break;\n case OPTIONS.WEBSOCKET:\n this.setRequestType(RequestType.WebSocket, true);\n break;\n case NOT_MARK + OPTIONS.WEBSOCKET:\n this.setRequestType(RequestType.WebSocket, false);\n break;\n case OPTIONS.OTHER:\n this.setRequestType(RequestType.Other, true);\n break;\n case NOT_MARK + OPTIONS.OTHER:\n this.setRequestType(RequestType.Other, false);\n break;\n case OPTIONS.PING:\n this.setRequestType(RequestType.Ping, true);\n break;\n case NOT_MARK + OPTIONS.PING:\n this.setRequestType(RequestType.Ping, false);\n break;\n // Special modifiers\n case OPTIONS.BADFILTER:\n this.setOptionEnabled(NetworkRuleOption.Badfilter, true);\n break;\n case OPTIONS.CSP:\n this.setOptionEnabled(NetworkRuleOption.Csp, true);\n this.advancedModifier = new CspModifier(optionValue, this.isAllowlist());\n break;\n case OPTIONS.REPLACE:\n this.setOptionEnabled(NetworkRuleOption.Replace, true);\n this.advancedModifier = new ReplaceModifier(optionValue);\n break;\n case OPTIONS.COOKIE:\n this.setOptionEnabled(NetworkRuleOption.Cookie, true);\n this.advancedModifier = new CookieModifier(optionValue);\n break;\n case OPTIONS.REDIRECT:\n this.setOptionEnabled(NetworkRuleOption.Redirect, true);\n this.advancedModifier = new RedirectModifier(optionValue, this.ruleText, this.isAllowlist());\n break;\n case OPTIONS.REDIRECTRULE:\n this.setOptionEnabled(NetworkRuleOption.Redirect, true);\n this.advancedModifier = new RedirectModifier(optionValue, this.ruleText, this.isAllowlist(), true);\n break;\n case OPTIONS.REMOVEPARAM:\n this.setOptionEnabled(NetworkRuleOption.RemoveParam, true);\n this.advancedModifier = new RemoveParamModifier(optionValue);\n break;\n case OPTIONS.REMOVEHEADER:\n this.setOptionEnabled(NetworkRuleOption.RemoveHeader, true);\n this.advancedModifier = new RemoveHeaderModifier(optionValue, this.isAllowlist());\n break;\n // simple validation of jsonprune rules for compiler\n // https://github.com/AdguardTeam/FiltersCompiler/issues/168\n case OPTIONS.JSONPRUNE: {\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension does not support $jsonprune modifier yet');\n }\n this.setOptionEnabled(NetworkRuleOption.JsonPrune, true);\n // TODO: should be properly implemented later\n // https://github.com/AdguardTeam/tsurlfilter/issues/71\n break;\n }\n // simple validation of hls rules for compiler\n // https://github.com/AdguardTeam/FiltersCompiler/issues/169\n case OPTIONS.HLS: {\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension does not support $hls modifier yet');\n }\n this.setOptionEnabled(NetworkRuleOption.Hls, true);\n // TODO: should be properly implemented later\n // https://github.com/AdguardTeam/tsurlfilter/issues/72\n break;\n }\n // Dns modifiers\n case OPTIONS.CLIENT: {\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $client modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Client, true);\n this.advancedModifier = new ClientModifier(optionValue);\n break;\n }\n case OPTIONS.DNSREWRITE: {\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $dnsrewrite modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.DnsRewrite, true);\n this.advancedModifier = new DnsRewriteModifier(optionValue);\n break;\n }\n case OPTIONS.DNSTYPE: {\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $dnstype modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.DnsType, true);\n this.advancedModifier = new DnsTypeModifier(optionValue);\n break;\n }\n case OPTIONS.CTAG: {\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $ctag modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Ctag, true);\n this.advancedModifier = new CtagModifier(optionValue);\n break;\n }\n case OPTIONS.APP: {\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $app modifier');\n }\n this.appModifier = new AppModifier(optionValue);\n break;\n }\n case OPTIONS.NETWORK:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $network modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Network, true);\n break;\n case OPTIONS.EXTENSION:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $extension modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Extension, true);\n break;\n case NOT_MARK + OPTIONS.EXTENSION:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $extension modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Extension, false);\n break;\n default: {\n // clear empty values\n var modifierView = [optionName, optionValue]\n .filter(function (i) { return i; })\n .join('=');\n throw new SyntaxError(\"Unknown modifier: \".concat(modifierView));\n }\n }\n };\n /**\n * Validates rule options\n */\n NetworkRule.prototype.validateOptions = function () {\n if (this.advancedModifier instanceof RemoveParamModifier) {\n this.validateRemoveParamRule();\n }\n else if (this.advancedModifier instanceof RemoveHeaderModifier) {\n this.validateRemoveHeaderRule();\n }\n };\n /**\n * $removeparam rules are not compatible with any other modifiers except $domain,\n * $third-party, $app, $important, $match-case and permitted content type modifiers ($script, $stylesheet, etc).\n * The rules with any other modifiers are considered invalid and will be discarded.\n */\n NetworkRule.prototype.validateRemoveParamRule = function () {\n if ((this.enabledOptions | NetworkRuleOption.RemoveParamCompatibleOptions)\n !== NetworkRuleOption.RemoveParamCompatibleOptions) {\n throw new SyntaxError('$removeparam rules are not compatible with some other modifiers');\n }\n };\n /**\n * $removeheader rules are not compatible with any other modifiers except $domain,\n * $third-party, $app, $important, $match-case and permitted content type modifiers ($script, $stylesheet, etc).\n * The rules with any other modifiers are considered invalid and will be discarded.\n */\n NetworkRule.prototype.validateRemoveHeaderRule = function () {\n if ((this.enabledOptions | NetworkRuleOption.RemoveHeaderCompatibleOptions)\n !== NetworkRuleOption.RemoveHeaderCompatibleOptions) {\n throw new SyntaxError('$removeheader rules are not compatible with some other modifiers');\n }\n };\n /**\n * parseRuleText splits the rule text into multiple parts.\n * @param ruleText - original rule text\n * @returns basic rule parts\n *\n * @throws error if the rule is empty (for instance, empty string or `@@`)\n */\n NetworkRule.parseRuleText = function (ruleText) {\n var ruleParts = new BasicRuleParts();\n ruleParts.allowlist = false;\n var startIndex = 0;\n if (ruleText.startsWith(NetworkRule.MASK_ALLOWLIST)) {\n ruleParts.allowlist = true;\n startIndex = NetworkRule.MASK_ALLOWLIST.length;\n }\n if (ruleText.length <= startIndex) {\n throw new SyntaxError('Rule is too short');\n }\n // Setting pattern to rule text (for the case of empty options)\n ruleParts.pattern = ruleText.substring(startIndex);\n // Avoid parsing options inside of a regex rule\n if (ruleParts.pattern.startsWith(SimpleRegex.MASK_REGEX_RULE)\n && ruleParts.pattern.endsWith(SimpleRegex.MASK_REGEX_RULE)\n && !ruleParts.pattern.includes(\"\".concat(NetworkRule.OPTIONS.REPLACE, \"=\"))) {\n return ruleParts;\n }\n var removeParamIndex = ruleText.lastIndexOf(\"\".concat(NetworkRule.OPTIONS.REMOVEPARAM, \"=\"));\n var endIndex = removeParamIndex >= 0 ? removeParamIndex : ruleText.length - 2;\n var foundEscaped = false;\n for (var i = endIndex; i >= startIndex; i -= 1) {\n var c = ruleText.charAt(i);\n if (c === NetworkRule.OPTIONS_DELIMITER) {\n if (i > startIndex && ruleText.charAt(i - 1) === NetworkRule.ESCAPE_CHARACTER) {\n foundEscaped = true;\n }\n else {\n ruleParts.pattern = ruleText.substring(startIndex, i);\n ruleParts.options = ruleText.substring(i + 1);\n if (foundEscaped) {\n // Find and replace escaped options delimiter\n ruleParts.options = ruleParts.options.replace(NetworkRule.RE_ESCAPED_OPTIONS_DELIMITER, NetworkRule.OPTIONS_DELIMITER);\n // Reset the regexp state\n NetworkRule.RE_ESCAPED_OPTIONS_DELIMITER.lastIndex = 0;\n }\n // Options delimiter was found, exiting loop\n break;\n }\n }\n }\n return ruleParts;\n };\n /**\n * Separates the rule pattern from the list of modifiers.\n *\n * ```\n * rule = [\"@@\"] pattern [ \"$\" modifiers ]\n * modifiers = [modifier0, modifier1[, ...[, modifierN]]]\n * ```\n */\n NetworkRule.OPTIONS_DELIMITER = OPTIONS_DELIMITER;\n /**\n * This character is used to escape special characters in modifiers values\n */\n NetworkRule.ESCAPE_CHARACTER = ESCAPE_CHARACTER;\n // eslint-disable-next-line max-len\n NetworkRule.RE_ESCAPED_OPTIONS_DELIMITER = new RegExp(\"\".concat(NetworkRule.ESCAPE_CHARACTER).concat(NetworkRule.OPTIONS_DELIMITER), 'g');\n /**\n * A marker that is used in rules of exception.\n * To turn off filtering for a request, start your rule with this marker.\n */\n NetworkRule.MASK_ALLOWLIST = MASK_ALLOWLIST;\n /**\n * Mark that negates options\n */\n NetworkRule.NOT_MARK = NOT_MARK;\n /**\n * Rule options\n */\n NetworkRule.OPTIONS = NETWORK_RULE_OPTIONS;\n return NetworkRule;\n}());\n\n/**\n * Implements a host rule.\n *\n * HostRule is a structure for simple host-level rules (i.e. /etc/hosts syntax).\n * http://man7.org/linux/man-pages/man5/hosts.5.html\n * It also supports \"just domain\" syntax. In this case, the IP will be set to 0.0.0.0.\n *\n * Rules syntax looks like this:\n * ```\n * IP_address canonical_hostname [aliases...]\n * ```\n *\n * Examples:\n * * `192.168.1.13 bar.mydomain.org bar` -- ipv4\n * * `ff02::1 ip6-allnodes` -- ipv6\n * * `::1 localhost ip6-localhost ip6-loopback` -- ipv6 aliases\n * * `example.org` -- \"just domain\" syntax\n */\nvar HostRule = /** @class */ (function () {\n /**\n * Constructor\n *\n * Parses the rule and creates a new HostRule instance\n *\n * @param ruleText - original rule text.\n * @param filterListId - ID of the filter list this rule belongs to.\n *\n * @throws error if it fails to parse the rule.\n */\n function HostRule(ruleText, filterListId) {\n this.hostnames = [];\n this.ip = '';\n this.invalid = false;\n this.ruleText = ruleText;\n this.filterListId = filterListId;\n var commentIndex = ruleText.indexOf('#');\n var stripped = commentIndex >= 0 ? ruleText.substring(0, commentIndex) : ruleText;\n var parts = stripped.trim().split(' ');\n if (parts.length >= 2) {\n if (!isIp_1(parts[0])) {\n this.invalid = true;\n return;\n }\n // eslint-disable-next-line prefer-destructuring\n this.ip = parts[0];\n this.hostnames = parts.slice(1).filter(function (x) { return !!x; });\n }\n else if (parts.length === 1 && isDomainName(parts[0])) {\n this.hostnames = [parts[0]];\n this.ip = '0.0.0.0';\n }\n else {\n this.invalid = true;\n }\n }\n /**\n * Match returns true if this rule can be used on the specified hostname.\n *\n * @param hostname - hostname to check\n */\n HostRule.prototype.match = function (hostname) {\n return this.hostnames.includes(hostname);\n };\n /**\n * Returns list id\n */\n HostRule.prototype.getFilterListId = function () {\n return this.filterListId;\n };\n /**\n * Return rule text\n */\n HostRule.prototype.getText = function () {\n return this.ruleText;\n };\n /**\n * Returns ip address\n */\n HostRule.prototype.getIp = function () {\n return this.ip;\n };\n /**\n * Returns hostnames\n */\n HostRule.prototype.getHostnames = function () {\n return this.hostnames;\n };\n /**\n * Is invalid rule\n */\n HostRule.prototype.isInvalid = function () {\n return this.invalid;\n };\n return HostRule;\n}());\n\n/**\n * MatchingResult contains all the rules matching a web request, and provides methods\n * that define how a web request should be processed\n */\nvar MatchingResult = /** @class */ (function () {\n /**\n * Creates an instance of the MatchingResult struct and fills it with the rules.\n *\n * @param rules network rules\n * @param sourceRule source rule\n */\n function MatchingResult(rules, sourceRule) {\n this.basicRule = null;\n this.documentRule = null;\n this.cspRules = null;\n this.cookieRules = null;\n this.replaceRules = null;\n this.removeParamRules = null;\n this.removeHeaderRules = null;\n this.redirectRules = null;\n this.cspRules = null;\n this.stealthRule = null;\n // eslint-disable-next-line no-param-reassign\n rules = MatchingResult.removeBadfilterRules(rules);\n if (sourceRule) {\n this.documentRule = sourceRule;\n }\n // Second - check if blocking rules (generic or all of them) are allowed\n // generic blocking rules are allowed by default\n var genericAllowed = true;\n // basic blocking rules are allowed by default\n var basicAllowed = true;\n if (this.documentRule) {\n var documentRule = this.documentRule;\n if (documentRule.isOptionEnabled(NetworkRuleOption.Urlblock)) {\n basicAllowed = false;\n }\n else if (documentRule.isOptionEnabled(NetworkRuleOption.Genericblock)) {\n genericAllowed = false;\n }\n }\n // Iterate through the list of rules and fill the MatchingResult\n for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) {\n var rule = rules_1[_i];\n if (rule.isOptionEnabled(NetworkRuleOption.Cookie)) {\n if (!this.cookieRules) {\n this.cookieRules = [];\n }\n this.cookieRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Replace)) {\n if (!this.replaceRules) {\n this.replaceRules = [];\n }\n this.replaceRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.RemoveParam)) {\n if (!this.removeParamRules) {\n this.removeParamRules = [];\n }\n this.removeParamRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.RemoveHeader)) {\n if (!this.removeHeaderRules) {\n this.removeHeaderRules = [];\n }\n this.removeHeaderRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Redirect)) {\n if (!this.redirectRules) {\n this.redirectRules = [];\n }\n this.redirectRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Csp)) {\n if (!this.cspRules) {\n this.cspRules = [];\n }\n this.cspRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Stealth)) {\n this.stealthRule = rule;\n continue;\n }\n // Check blocking rules against $genericblock / $urlblock\n if (!rule.isAllowlist()) {\n if (!basicAllowed) {\n continue;\n }\n if (!genericAllowed && rule.isGeneric()) {\n continue;\n }\n }\n if (!this.basicRule || rule.isHigherPriority(this.basicRule)) {\n this.basicRule = rule;\n }\n }\n }\n /**\n * GetBasicResult returns a rule that should be applied to the web request.\n * Possible outcomes are:\n * returns nil -- bypass the request.\n * returns a allowlist rule -- bypass the request.\n * returns a blocking rule -- block the request.\n *\n * @return {NetworkRule | null} basic result rule\n */\n MatchingResult.prototype.getBasicResult = function () {\n var basic = this.basicRule;\n if (!basic) {\n // Only document-level frame rule would be returned as a basic result,\n // cause only those rules could block or modify page subrequests.\n // Other frame rules (generichide, elemhide etc) will be used in getCosmeticOption function.\n if (this.documentRule && this.documentRule.isDocumentLevelAllowlistRule()) {\n basic = this.documentRule;\n }\n }\n // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#replace-modifier\n // 1. $replace rules have a higher priority than other basic rules (including exception rules).\n // So if a request corresponds to two different rules one of which has the $replace modifier,\n // this rule will be applied.\n // 2. $document exception rules and rules with $content or $replace modifiers do disable $replace rules\n // for requests matching them.\n if (this.replaceRules) {\n if (basic && basic.isAllowlist()) {\n if (basic.isDocumentAllowlistRule()) {\n return basic;\n }\n if (basic.isOptionEnabled(NetworkRuleOption.Replace)\n || basic.isOptionEnabled(NetworkRuleOption.Content)) {\n return basic;\n }\n }\n return null;\n }\n // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#redirect-modifier\n // Redirect rules have a high priority\n var redirectRule = this.getRedirectRule();\n if (redirectRule) {\n if (!basic || !basic.isHigherPriority(redirectRule)) {\n return redirectRule;\n }\n }\n return basic;\n };\n /**\n * Returns a bit-flag with the list of cosmetic options\n *\n * @return {CosmeticOption} mask\n */\n MatchingResult.prototype.getCosmeticOption = function () {\n var _a, _b;\n if (((_a = this.basicRule) === null || _a === void 0 ? void 0 : _a.isDocumentAllowlistRule()) || ((_b = this.documentRule) === null || _b === void 0 ? void 0 : _b.isDocumentAllowlistRule())) {\n return CosmeticOption.CosmeticOptionNone;\n }\n if (!this.basicRule || !this.basicRule.isAllowlist()) {\n return CosmeticOption.CosmeticOptionAll;\n }\n var option = CosmeticOption.CosmeticOptionAll;\n if (this.basicRule.isOptionEnabled(NetworkRuleOption.Elemhide)) {\n option ^= CosmeticOption.CosmeticOptionGenericCSS;\n option ^= CosmeticOption.CosmeticOptionSpecificCSS;\n }\n if (this.basicRule.isOptionEnabled(NetworkRuleOption.Generichide)) {\n option ^= CosmeticOption.CosmeticOptionGenericCSS;\n }\n if (this.basicRule.isOptionEnabled(NetworkRuleOption.Specifichide)) {\n option ^= CosmeticOption.CosmeticOptionSpecificCSS;\n }\n if (this.basicRule.isOptionEnabled(NetworkRuleOption.Jsinject)) {\n option ^= CosmeticOption.CosmeticOptionJS;\n }\n if (this.basicRule.isOptionEnabled(NetworkRuleOption.Content)) {\n option ^= CosmeticOption.CosmeticOptionHtml;\n }\n return option;\n };\n /**\n * Return an array of replace rules\n */\n MatchingResult.prototype.getReplaceRules = function () {\n if (!this.replaceRules) {\n return [];\n }\n // TODO: Look up for allowlist $content rule\n return MatchingResult.filterAdvancedModifierRules(this.replaceRules, function (rule) { return (function (x) { return x.getAdvancedModifierValue() === rule.getAdvancedModifierValue(); }); });\n };\n /**\n * Filters array of rules according to allowlist rules contained.\n * Empty advanced modifier allowlists everything.\n *\n * @param rules\n * @param allowlistPredicate allowlist criteria\n * This function result will be called for testing if rule `x` allowlists rule `r`\n */\n MatchingResult.filterAdvancedModifierRules = function (rules, allowlistPredicate) {\n var _this = this;\n var blockingRules = [];\n var allowlistRules = [];\n for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) {\n var rule = rules_2[_i];\n if (rule.isAllowlist()) {\n allowlistRules.push(rule);\n }\n else {\n blockingRules.push(rule);\n }\n }\n if (blockingRules.length === 0) {\n return [];\n }\n if (allowlistRules.length === 0) {\n return blockingRules;\n }\n if (allowlistRules.length > 0) {\n var allowlistRuleWithEmptyOption_1 = allowlistRules\n .find(function (allowlistRule) { return allowlistRule.getAdvancedModifierValue() === ''; });\n var result_1 = [];\n blockingRules.forEach(function (blockRule) {\n if (allowlistRuleWithEmptyOption_1\n && !blockRule.isHigherPriority(allowlistRuleWithEmptyOption_1)) {\n result_1.push(allowlistRuleWithEmptyOption_1);\n return;\n }\n var allowlistingRule = allowlistRules.find(function (a) {\n return !blockRule.isHigherPriority(a) && allowlistPredicate.call(_this, blockRule)(a);\n });\n if (allowlistingRule) {\n result_1.push(allowlistingRule);\n }\n else {\n result_1.push(blockRule);\n }\n });\n return result_1.filter(function (item, pos) { return result_1.indexOf(item) === pos; });\n }\n return blockingRules;\n };\n /**\n * Returns an array of csp rules\n */\n MatchingResult.prototype.getCspRules = function () {\n if (!this.cspRules) {\n return [];\n }\n var blockingRules = [];\n var allowlistedRulesByDirective = new Map();\n for (var _i = 0, _a = this.cspRules; _i < _a.length; _i++) {\n var rule = _a[_i];\n if (rule.isAllowlist()) {\n if (!rule.getAdvancedModifierValue()) { // Global allowlist rule\n return [rule];\n }\n MatchingResult.putWithPriority(rule, undefined, allowlistedRulesByDirective);\n }\n else {\n blockingRules.push(rule);\n }\n }\n var rulesByDirective = new Map();\n // Collect allowlist and blocking CSP rules in one array\n blockingRules.forEach(function (rule) {\n if (rule.getAdvancedModifierValue()) {\n var allowlistRule = allowlistedRulesByDirective.get(rule.getAdvancedModifierValue());\n MatchingResult.putWithPriority(rule, allowlistRule, rulesByDirective);\n }\n });\n return Array.from(rulesByDirective.values());\n };\n /**\n * Returns a redirect rule\n */\n MatchingResult.prototype.getRedirectRule = function () {\n if (!this.redirectRules) {\n return null;\n }\n var result = MatchingResult.filterAdvancedModifierRules(this.redirectRules, function (rule) { return (function (x) { return x.getAdvancedModifierValue() === rule.getAdvancedModifierValue(); }); });\n result = result.filter(function (r) { return !r.isAllowlist(); });\n var conditionalRedirectRules = result.filter(function (x) {\n var redirectModifier = x.getAdvancedModifier();\n return redirectModifier.isRedirectingOnlyBlocked;\n });\n var allWeatherRedirectRules = result.filter(function (x) { return !conditionalRedirectRules.includes(x); });\n if (allWeatherRedirectRules.length > 0) {\n return allWeatherRedirectRules.sort(function (a, b) { return (b.isOptionEnabled(NetworkRuleOption.Important)\n && !a.isOptionEnabled(NetworkRuleOption.Important) ? 1 : -1); })[0];\n }\n if (conditionalRedirectRules.length === 0) {\n return null;\n }\n var resultRule = conditionalRedirectRules.sort(function (a, b) { return (b.isOptionEnabled(NetworkRuleOption.Important)\n && !a.isOptionEnabled(NetworkRuleOption.Important) ? 1 : -1); })[0];\n var redirectModifier = resultRule.getAdvancedModifier();\n if (redirectModifier && redirectModifier.isRedirectingOnlyBlocked) {\n if (!(this.basicRule && !this.basicRule.isAllowlist())) {\n return null;\n }\n }\n return resultRule;\n };\n /**\n * Returns an array of cookie rules\n */\n MatchingResult.prototype.getCookieRules = function () {\n if (!this.cookieRules) {\n return [];\n }\n var basic = this.getBasicResult();\n if (basic === null || basic === void 0 ? void 0 : basic.isDocumentAllowlistRule()) {\n return [];\n }\n var allowlistPredicate = function (rule) { return (function (allowlistRule) {\n var allowlistRuleCookieModifier = allowlistRule.getAdvancedModifier();\n var ruleCookieModifier = rule.getAdvancedModifier();\n if (allowlistRule.getAdvancedModifierValue() === rule.getAdvancedModifierValue()) {\n return true;\n }\n // Matches by cookie name\n if (allowlistRuleCookieModifier.matches(ruleCookieModifier.getCookieName())) {\n return true;\n }\n return false;\n }); };\n var filtered = MatchingResult.filterAdvancedModifierRules(this.cookieRules, allowlistPredicate);\n return filtered.concat(__spreadArray([], this.cookieRules.filter(function (r) { return r.isAllowlist(); }), true));\n };\n /**\n * Returns an array of removeparam rules\n */\n MatchingResult.prototype.getRemoveParamRules = function () {\n if (!this.removeParamRules) {\n return [];\n }\n return MatchingResult.filterAdvancedModifierRules(this.removeParamRules, \n // eslint-disable-next-line arrow-body-style\n function (rule) { return (function (x) {\n return x.isHigherPriority(rule) && x.getAdvancedModifierValue() === rule.getAdvancedModifierValue();\n }); });\n };\n /**\n * Returns an array of removeheader rules\n */\n MatchingResult.prototype.getRemoveHeaderRules = function () {\n if (!this.removeHeaderRules) {\n return [];\n }\n if (this.basicRule\n && this.basicRule.isAllowlist()\n && this.basicRule.isOptionEnabled(NetworkRuleOption.Urlblock)) {\n return [];\n }\n return MatchingResult.filterAdvancedModifierRules(this.removeHeaderRules, function (rule) { return (function (x) { return x.getAdvancedModifierValue() === rule.getAdvancedModifierValue(); }); });\n };\n /**\n * Decides which rule should be put into the given map.\n * Compares priorities of the two given rules with the equal CSP directive and the rule that may already in the map.\n *\n * @param rule CSP rule (not null)\n * @param allowlistRule CSP allowlist rule (may be null)\n * @param map Rules mapped by csp directive\n */\n // eslint-disable-next-line max-len\n MatchingResult.putWithPriority = function (rule, allowlistRule, map) {\n var cspDirective = rule.getAdvancedModifierValue();\n var currentRule = cspDirective ? map.get(cspDirective) : null;\n var newRule = rule;\n if (currentRule && !rule.isHigherPriority(currentRule)) {\n newRule = currentRule;\n }\n if (allowlistRule && allowlistRule.isHigherPriority(newRule)) {\n newRule = allowlistRule;\n }\n map.set(cspDirective, newRule);\n };\n /**\n * Looks if there are any matching $badfilter rules and removes\n * matching bad filters from the array (see the $badfilter description for more info)\n *\n * @param rules to filter\n * @return filtered rules\n */\n MatchingResult.removeBadfilterRules = function (rules) {\n var badfilterRules = [];\n for (var _i = 0, rules_3 = rules; _i < rules_3.length; _i++) {\n var rule = rules_3[_i];\n if (rule.isOptionEnabled(NetworkRuleOption.Badfilter)) {\n badfilterRules.push(rule);\n }\n }\n if (badfilterRules.length > 0) {\n return rules.filter(function (rule) {\n if (rule.isOptionEnabled(NetworkRuleOption.Badfilter)) {\n return false;\n }\n var isRuleNegated = badfilterRules.some(function (badfilter) { return badfilter.negatesBadfilter(rule); });\n return !isRuleNegated;\n });\n }\n return rules;\n };\n return MatchingResult;\n}());\n\n/**\n * Scanner types enum\n */\nvar ScannerType;\n(function (ScannerType) {\n /**\n * Scanning for network rules\n */\n ScannerType[ScannerType[\"NetworkRules\"] = 0] = \"NetworkRules\";\n /**\n * Scanning for cosmetic rules\n */\n ScannerType[ScannerType[\"CosmeticRules\"] = 2] = \"CosmeticRules\";\n /**\n * Scanning for host rules\n */\n ScannerType[ScannerType[\"HostRules\"] = 4] = \"HostRules\";\n /**\n * All\n */\n ScannerType[ScannerType[\"All\"] = 6] = \"All\";\n})(ScannerType || (ScannerType = {}));\n\n/**\n * Prefix tree implementation\n */\nvar TrieNode = /** @class */ (function () {\n /**\n * Creates an instance of a TrieNode with the specified char code.\n *\n * @param code\n */\n function TrieNode(code) {\n this.code = code;\n }\n /**\n * Attaches data to this TrieNode.\n *\n * @param data\n */\n TrieNode.prototype.attach = function (data) {\n if (!this.data) {\n this.data = [];\n }\n this.data.push(data);\n };\n /**\n * Adds the specified string to the Trie and attaches data to it.\n *\n * @param str string to add.\n * @param data data to attach to the leaf node.\n */\n TrieNode.prototype.add = function (str, data) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var root = this;\n for (var i = 0; i < str.length; i += 1) {\n var c = str.charCodeAt(i);\n var next = root.getChild(c);\n if (!next) {\n next = root.addChild(c);\n }\n root = next;\n }\n root.attach(data);\n };\n /**\n * Traverses this TrieNode and it's children using the specified search string.\n * This method collects all the data that's attached on the way and returns as\n * a result.\n *\n * @param str string to check.\n * @param start index in str where to start traversing from.\n */\n TrieNode.prototype.traverse = function (str, start) {\n var result = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var current = this;\n for (var i = start; i < str.length; i += 1) {\n var c = str.charCodeAt(i);\n var next = current.getChild(c);\n if (!next) {\n break;\n }\n if (next.data) {\n result.push.apply(result, next.data);\n }\n current = next;\n }\n return result;\n };\n /**\n * Traverses this TrieNode and it's children using the specified search string and all substrings.\n *\n * @param str string to check\n * @param len max length to check\n */\n TrieNode.prototype.traverseAll = function (str, len) {\n var data = [];\n for (var i = 0; i <= len; i += 1) {\n var result = this.traverse(str, i);\n if (result) {\n data.push.apply(data, result);\n }\n }\n return data;\n };\n /**\n * Returns a child node with the specified character code or\n * undefined if not found.\n *\n * @param code character code\n * @returns child node or undefined.\n */\n TrieNode.prototype.getChild = function (code) {\n var children = this.children;\n if (!children) {\n return undefined;\n }\n if (children instanceof TrieNode) {\n if (children.code === code) {\n return children;\n }\n return undefined;\n }\n return children.get(code);\n };\n /**\n * Adds a new child node with the specified character code.\n *\n * @param code character code.\n * @returns the newly created TrieNode.\n */\n TrieNode.prototype.addChild = function (code) {\n var node = new TrieNode(code);\n if (!this.children) {\n this.children = node;\n }\n else if (this.children instanceof TrieNode) {\n var oldNode = this.children;\n this.children = new Map();\n this.children.set(oldNode.code, oldNode);\n this.children.set(code, node);\n }\n else {\n this.children.set(code, node);\n }\n return node;\n };\n return TrieNode;\n}());\n\n/**\n * Look up table with underlying prefix tree\n */\nvar TrieLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance of the TrieLookupTable.\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function TrieLookupTable(storage) {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n this.ruleStorage = storage;\n this.trie = new TrieNode(0);\n }\n /**\n * Finds all matching rules from the shortcuts lookup table\n *\n * @param request to check\n * @return array of matching rules\n */\n TrieLookupTable.prototype.matchAll = function (request) {\n var rulesIndexes = this.traverse(request);\n return this.matchRules(request, rulesIndexes);\n };\n /**\n * Tries to add the rule to the lookup table.\n * returns true if it was added\n *\n * @param rule to add\n * @param storageIdx index\n * @return {boolean} true if the rule been added\n */\n TrieLookupTable.prototype.addRule = function (rule, storageIdx) {\n var shortcut = rule.getShortcut();\n if (!shortcut || TrieLookupTable.isAnyURLShortcut(shortcut)\n || shortcut.length < SimpleRegex.MIN_SHORTCUT_LENGTH) {\n return false;\n }\n this.trie.add(shortcut, storageIdx);\n this.rulesCount += 1;\n return true;\n };\n /**\n * @return total rules count\n */\n TrieLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * For specified request finds matching rules from rules indexes array\n *\n * @param request\n * @param rulesIndexes\n */\n TrieLookupTable.prototype.matchRules = function (request, rulesIndexes) {\n if (!rulesIndexes) {\n return [];\n }\n var result = [];\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var idx = rulesIndexes[j];\n var rule = this.ruleStorage.retrieveNetworkRule(idx);\n if (rule && rule.match(request, false)) {\n result.push(rule);\n }\n }\n return result;\n };\n /**\n * Traverses trie\n *\n * @param request\n */\n TrieLookupTable.prototype.traverse = function (request) {\n return this.trie.traverseAll(request.urlLowercase, request.urlLowercase.length);\n };\n /**\n * Checks if the rule potentially matches too many URLs.\n * We'd better use another type of lookup table for this kind of rules.\n *\n * @param shortcut to check\n * @return check result\n */\n TrieLookupTable.isAnyURLShortcut = function (shortcut) {\n // The numbers are basically (\"PROTO://\".length + 1)\n if (shortcut.length < 6 && shortcut.indexOf('ws:') === 0) {\n return true;\n }\n if (shortcut.length < 7 && shortcut.indexOf('|ws') === 0) {\n return true;\n }\n if (shortcut.length < 9 && shortcut.indexOf('http') === 0) {\n return true;\n }\n return !!(shortcut.length < 10 && shortcut.indexOf('|http') === 0);\n };\n return TrieLookupTable;\n}());\n\n/**\n * Domain lookup table. Key is the domain name hash.\n */\nvar DomainsLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function DomainsLookupTable(storage) {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n /**\n * Domain lookup table. Key is the domain name hash.\n */\n this.domainsLookupTable = new Map();\n this.ruleStorage = storage;\n }\n /**\n * addRule implements the ILookupTable interface for DomainsLookupTable.\n * @param rule\n * @param storageIdx\n */\n DomainsLookupTable.prototype.addRule = function (rule, storageIdx) {\n var _this = this;\n var permittedDomains = rule.getPermittedDomains();\n if (!permittedDomains || permittedDomains.length === 0) {\n return false;\n }\n var hasWildcardDomain = permittedDomains.some(function (d) { return DomainModifier.isWildcardDomain(d); });\n if (hasWildcardDomain) {\n return false;\n }\n permittedDomains.forEach(function (domain) {\n var hash = fastHash(domain);\n // Add the rule to the lookup table\n var rulesIndexes = _this.domainsLookupTable.get(hash);\n if (!rulesIndexes) {\n rulesIndexes = [];\n }\n rulesIndexes.push(storageIdx);\n _this.domainsLookupTable.set(hash, rulesIndexes);\n });\n this.rulesCount += 1;\n return true;\n };\n /**\n * Implements the ILookupTable interface method.\n */\n DomainsLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * Implements the ILookupTable interface method.\n * @param request\n */\n DomainsLookupTable.prototype.matchAll = function (request) {\n var result = [];\n if (!request.sourceHostname) {\n return result;\n }\n var domains = request.subdomains;\n if (request.hostname !== request.sourceHostname) {\n domains.push.apply(domains, request.sourceSubdomains);\n }\n for (var i = 0; i < domains.length; i += 1) {\n var hash = fastHash(domains[i]);\n var rulesIndexes = this.domainsLookupTable.get(hash);\n if (rulesIndexes) {\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this.ruleStorage.retrieveNetworkRule(rulesIndexes[j]);\n if (rule && rule.match(request)) {\n result.push(rule);\n }\n }\n }\n }\n return result;\n };\n return DomainsLookupTable;\n}());\n\n/**\n * Hostname lookup table.\n * For specific kind of rules like '||hostname^' and '||hostname/path' more simple algorithm with hashes is faster.\n */\nvar HostnameLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function HostnameLookupTable(storage) {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n /**\n * Domain lookup table. Key is the domain name hash.\n */\n this.hostnameLookupTable = new Map();\n this.ruleStorage = storage;\n }\n /**\n * addRule implements the ILookupTable interface for DomainsLookupTable.\n * @param rule\n * @param storageIdx\n */\n HostnameLookupTable.prototype.addRule = function (rule, storageIdx) {\n var pattern = rule.getPattern();\n var hostname = '';\n // Pattern: '||example.org^'\n if (pattern.startsWith(SimpleRegex.MASK_START_URL) && pattern.endsWith(SimpleRegex.MASK_SEPARATOR)) {\n hostname = pattern.slice(SimpleRegex.MASK_START_URL.length, pattern.length - SimpleRegex.MASK_SEPARATOR.length);\n }\n // Pattern: '||example.org/path'\n if (pattern.startsWith(SimpleRegex.MASK_START_URL) && pattern.indexOf(SimpleRegex.MASK_BACKSLASH) !== -1) {\n var end = pattern.indexOf(SimpleRegex.MASK_BACKSLASH);\n hostname = pattern.slice(SimpleRegex.MASK_START_URL.length, end);\n }\n if (!HostnameLookupTable.isValidHostname(hostname)) {\n return false;\n }\n var hash = fastHash(hostname);\n var rulesIndexes = this.hostnameLookupTable.get(hash);\n if (!rulesIndexes) {\n rulesIndexes = new Array();\n this.hostnameLookupTable.set(hash, rulesIndexes);\n }\n rulesIndexes.push(storageIdx);\n this.rulesCount += 1;\n return true;\n };\n /**\n * Implements the ILookupTable interface method.\n */\n HostnameLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * Implements the ILookupTable interface method.\n * @param request\n */\n HostnameLookupTable.prototype.matchAll = function (request) {\n var result = [];\n var domains = request.subdomains;\n for (var i = 0; i < domains.length; i += 1) {\n var hash = fastHash(domains[i]);\n var rulesIndexes = this.hostnameLookupTable.get(hash);\n if (rulesIndexes) {\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this.ruleStorage.retrieveNetworkRule(rulesIndexes[j]);\n if (rule && rule.match(request)) {\n result.push(rule);\n }\n }\n }\n }\n return result;\n };\n /**\n * Checks if this hostname string is valid\n *\n * @param hostname\n */\n HostnameLookupTable.isValidHostname = function (hostname) {\n if (!hostname) {\n return false;\n }\n if (hostname.indexOf(SimpleRegex.MASK_ANY_CHARACTER) !== -1) {\n return false;\n }\n if (hostname.indexOf('.') < 0 || hostname.endsWith('.')) {\n return false;\n }\n return true;\n };\n return HostnameLookupTable;\n}());\n\n/**\n * Sequence scan lookup table of rules for which we could not find a shortcut\n * and could not place it to the shortcuts lookup table.\n * In common case of rule there is always a way to just check a rule.match().\n */\nvar SeqScanLookupTable = /** @class */ (function () {\n function SeqScanLookupTable() {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n /**\n * Rules for which we could not find a shortcut and could not place it to the shortcuts lookup table.\n */\n this.rules = [];\n }\n /**\n * addRule implements the ILookupTable interface for SeqScanLookupTable.\n * @param rule\n */\n SeqScanLookupTable.prototype.addRule = function (rule) {\n if (!this.rules.includes(rule)) {\n this.rules.push(rule);\n this.rulesCount += 1;\n return true;\n }\n return false;\n };\n /**\n * Implements the ILookupTable interface method.\n */\n SeqScanLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * Implements the ILookupTable interface method.\n * @param request\n */\n SeqScanLookupTable.prototype.matchAll = function (request) {\n var result = [];\n for (var i = 0; i < this.rules.length; i += 1) {\n var r = this.rules[i];\n if (r.match(request)) {\n result.push(r);\n }\n }\n return result;\n };\n return SeqScanLookupTable;\n}());\n\n/**\n * NetworkEngine is the engine that supports quick search over network rules\n */\nvar NetworkEngine = /** @class */ (function () {\n /**\n * Builds an instance of the network engine\n *\n * @param storage an object for a rules storage.\n * @param skipStorageScan create an instance without storage scanning.\n */\n function NetworkEngine(storage, skipStorageScan) {\n if (skipStorageScan === void 0) { skipStorageScan = false; }\n this.ruleStorage = storage;\n this.rulesCount = 0;\n this.domainsLookupTable = new DomainsLookupTable(storage);\n this.hostnameLookupTable = new HostnameLookupTable(storage);\n this.shortcutsLookupTable = new TrieLookupTable(storage);\n this.seqScanLookupTable = new SeqScanLookupTable();\n if (skipStorageScan) {\n return;\n }\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.NetworkRules);\n while (scanner.scan()) {\n var indexedRule = scanner.getRule();\n if (indexedRule\n && indexedRule.rule instanceof NetworkRule) {\n this.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n }\n /**\n * Match searches over all filtering rules loaded to the engine\n * It returns rule if a match was found alongside the matching rule\n *\n * @param request to check\n * @return rule matching request or null\n */\n NetworkEngine.prototype.match = function (request) {\n var networkRules = this.matchAll(request);\n if (networkRules.length === 0) {\n return null;\n }\n var result = new MatchingResult(networkRules, null);\n return result.getBasicResult();\n };\n /**\n * Finds all rules matching the specified request regardless of the rule types\n * It will find both allowlist and blacklist rules\n *\n * @param request to check\n * @return array of matching rules\n */\n NetworkEngine.prototype.matchAll = function (request) {\n // First check by shortcuts\n var result = this.hostnameLookupTable.matchAll(request);\n result.push.apply(result, (this.shortcutsLookupTable.matchAll(request)));\n result.push.apply(result, (this.domainsLookupTable.matchAll(request)));\n result.push.apply(result, (this.seqScanLookupTable.matchAll(request)));\n return result;\n };\n /**\n * Adds rule to the network engine\n *\n * @param rule\n * @param storageIdx\n */\n NetworkEngine.prototype.addRule = function (rule, storageIdx) {\n if (!this.hostnameLookupTable.addRule(rule, storageIdx)) {\n if (!this.shortcutsLookupTable.addRule(rule, storageIdx)) {\n if (!this.domainsLookupTable.addRule(rule, storageIdx)) {\n this.seqScanLookupTable.addRule(rule, storageIdx);\n }\n }\n }\n this.rulesCount += 1;\n };\n return NetworkEngine;\n}());\n\n/**\n * Request represents a web request with all it's necessary properties\n */\nvar Request$1 = /** @class */ (function () {\n /**\n * Creates an instance of a Request\n *\n * @param url - request URL\n * @param sourceUrl - source URL\n * @param requestType - request type\n *\n * @throws\n */\n function Request(url, sourceUrl, requestType) {\n /**\n * the request is for a given Hostname, and not for a URL, and we don't really know what protocol it is.\n * This can be true for DNS requests, or for HTTP CONNECT, or SNI matching.\n */\n this.isHostnameRequest = false;\n this.url = url;\n this.requestType = requestType;\n this.urlLowercase = Request.compactUrl(url).toLowerCase();\n this.sourceUrl = Request.compactUrl(sourceUrl);\n var tldResult = parse(url);\n this.hostname = tldResult.hostname;\n this.domain = tldResult.domain;\n this.subdomains = Request.getSubdomains(tldResult);\n var sourceTldResult;\n if (sourceUrl) {\n sourceTldResult = parse(sourceUrl);\n this.sourceHostname = sourceTldResult.hostname;\n this.sourceDomain = sourceTldResult.domain;\n this.sourceSubdomains = Request.getSubdomains(sourceTldResult);\n }\n else {\n this.sourceHostname = null;\n this.sourceDomain = null;\n this.sourceSubdomains = [];\n }\n if (this.sourceDomain) {\n this.thirdParty = this.domain !== this.sourceDomain;\n }\n else if (sourceTldResult && sourceTldResult.isIp) {\n this.thirdParty = this.hostname !== this.sourceHostname;\n }\n else {\n this.thirdParty = null;\n }\n }\n /**\n * We cut the url in performance purposes\n * @param url\n */\n Request.compactUrl = function (url) {\n var compacted = url;\n if (compacted && compacted.length > Request.MAX_URL_MATCH_LENGTH) {\n compacted = compacted.substring(0, Request.MAX_URL_MATCH_LENGTH);\n }\n return compacted;\n };\n /**\n * Splits subdomains and returns all subdomains (including the hostname itself)\n *\n * @param tldResult\n * @returns array of subdomains\n */\n Request.getSubdomains = function (tldResult) {\n var domain = tldResult.domain, hostname = tldResult.hostname, subdomain = tldResult.subdomain, publicSuffix = tldResult.publicSuffix;\n var subdomainsResult = [];\n if (!domain) {\n if (hostname) {\n subdomainsResult.push(hostname);\n return subdomainsResult;\n }\n return [];\n }\n if (publicSuffix) {\n subdomainsResult.push(publicSuffix);\n // Extract subdomains from complex suffixes\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2037\n // https://github.com/AdguardTeam/tsurlfilter/issues/57\n for (var i = 0; i < publicSuffix.length; i += 1) {\n if (publicSuffix[i] === '.') {\n subdomainsResult.push(publicSuffix.slice(i + 1));\n }\n }\n }\n subdomainsResult.push(domain);\n if (!subdomain) {\n return subdomainsResult;\n }\n var parts = subdomain.split('.');\n var incrementDomain = domain;\n for (var i = parts.length - 1; i >= 0; i -= 1) {\n incrementDomain = \"\".concat(parts[i], \".\").concat(incrementDomain);\n subdomainsResult.push(incrementDomain);\n }\n return subdomainsResult;\n };\n /**\n * Max url length for matching\n * Some urls are really long and slow down matching, so we cut them to this length.\n */\n Request.MAX_URL_MATCH_LENGTH = 2000;\n return Request;\n}());\n\n/**\n * DnsResult contains a network rule and host rules matching request\n */\nvar DnsResult = /** @class */ (function () {\n function DnsResult() {\n /**\n * BasicRule - a network rule matching the request.\n */\n this.basicRule = null;\n /**\n * Host rules\n */\n this.hostRules = [];\n }\n return DnsResult;\n}());\n\n/**\n * DNSEngine combines host rules and network rules and is supposed to quickly find\n * matching rules for hostnames.\n * First, it looks over network rules and returns first rule found.\n * Then, if nothing found, it looks up the host rules.\n */\nvar DnsEngine = /** @class */ (function () {\n /**\n * Builds an instance of dns engine\n *\n * @param storage\n */\n function DnsEngine(storage) {\n this.ruleStorage = storage;\n this.rulesCount = 0;\n this.lookupTable = new Map();\n this.networkEngine = new NetworkEngine(storage, true);\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.HostRules);\n while (scanner.scan()) {\n var indexedRule = scanner.getRule();\n if (indexedRule) {\n if (indexedRule.rule instanceof HostRule) {\n this.addRule(indexedRule.rule, indexedRule.index);\n }\n else if (indexedRule.rule instanceof NetworkRule\n && indexedRule.rule.isHostLevelNetworkRule()) {\n this.networkEngine.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n }\n }\n /**\n * Match searches over all filtering and host rules loaded to the engine\n *\n * @param hostname to check\n * @return dns result object\n */\n DnsEngine.prototype.match = function (hostname) {\n var result = new DnsResult();\n if (!hostname) {\n return result;\n }\n var url = \"http://\".concat(hostname, \"/\");\n var request = new Request$1(url, url, RequestType.Document);\n request.isHostnameRequest = true;\n var networkRule = this.networkEngine.match(request);\n if (networkRule) {\n // Network rules always have higher priority\n result.basicRule = networkRule;\n return result;\n }\n var hash = fastHash(hostname);\n var rulesIndexes = this.lookupTable.get(hash);\n if (rulesIndexes) {\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this.ruleStorage.retrieveHostRule(rulesIndexes[j]);\n if (rule && rule.match(hostname)) {\n result.hostRules.push(rule);\n }\n }\n }\n return result;\n };\n /**\n * Adds rule to engine\n *\n * @param rule\n * @param storageIdx\n */\n DnsEngine.prototype.addRule = function (rule, storageIdx) {\n var _this = this;\n rule.getHostnames().forEach(function (hostname) {\n var hash = fastHash(hostname);\n // Add the rule to the lookup table\n var rulesIndexes = _this.lookupTable.get(hash);\n if (!rulesIndexes) {\n rulesIndexes = [];\n }\n rulesIndexes.push(storageIdx);\n _this.lookupTable.set(hash, rulesIndexes);\n });\n this.rulesCount += 1;\n };\n return DnsEngine;\n}());\n\nvar lru = {exports: {}};\n\n(function (module, exports) {\n\t!function(g,c){c(exports);}(commonjsGlobal,function(g){const c=Symbol(\"newer\"),e=Symbol(\"older\");class n{constructor(a,b){typeof a!==\"number\"&&(b=a,a=0),this.size=0,this.limit=a,this.oldest=this.newest=void 0,this._keymap=new Map(),b&&(this.assign(b),a<1&&(this.limit=this.size));}_markEntryAsUsed(a){if(a===this.newest)return;a[c]&&(a===this.oldest&&(this.oldest=a[c]),a[c][e]=a[e]),a[e]&&(a[e][c]=a[c]),a[c]=void 0,a[e]=this.newest,this.newest&&(this.newest[c]=a),this.newest=a;}assign(a){let b,d=this.limit||Number.MAX_VALUE;this._keymap.clear();let m=a[Symbol.iterator]();for(let h=m.next();!h.done;h=m.next()){let f=new l(h.value[0],h.value[1]);this._keymap.set(f.key,f),b?(b[c]=f,f[e]=b):this.oldest=f,b=f;if(d--==0)throw new Error(\"overflow\")}this.newest=b,this.size=this._keymap.size;}get(a){var b=this._keymap.get(a);return b?(this._markEntryAsUsed(b),b.value):void 0}set(a,b){var d=this._keymap.get(a);return d?(d.value=b,this._markEntryAsUsed(d),this):(this._keymap.set(a,d=new l(a,b)),this.newest?(this.newest[c]=d,d[e]=this.newest):this.oldest=d,this.newest=d,++this.size,this.size>this.limit&&this.shift(),this)}shift(){var a=this.oldest;if(a)return this.oldest[c]?(this.oldest=this.oldest[c],this.oldest[e]=void 0):(this.oldest=void 0,this.newest=void 0),a[c]=a[e]=void 0,this._keymap.delete(a.key),--this.size,[a.key,a.value]}find(a){let b=this._keymap.get(a);return b?b.value:void 0}has(a){return this._keymap.has(a)}delete(a){var b=this._keymap.get(a);return b?(this._keymap.delete(b.key),b[c]&&b[e]?(b[e][c]=b[c],b[c][e]=b[e]):b[c]?(b[c][e]=void 0,this.oldest=b[c]):b[e]?(b[e][c]=void 0,this.newest=b[e]):this.oldest=this.newest=void 0,this.size--,b.value):void 0}clear(){this.oldest=this.newest=void 0,this.size=0,this._keymap.clear();}keys(){return new j(this.oldest)}values(){return new k(this.oldest)}entries(){return this}[Symbol.iterator](){return new i(this.oldest)}forEach(a,b){typeof b!==\"object\"&&(b=this);let d=this.oldest;for(;d;)a.call(b,d.value,d.key,this),d=d[c];}toJSON(){for(var a=new Array(this.size),b=0,d=this.oldest;d;)a[b++]={key:d.key,value:d.value},d=d[c];return a}toString(){for(var a=\"\",b=this.oldest;b;)a+=String(b.key)+\":\"+b.value,b=b[c],b&&(a+=\" < \");return a}}g.LRUMap=n;function l(a,b){this.key=a,this.value=b,this[c]=void 0,this[e]=void 0;}function i(a){this.entry=a;}i.prototype[Symbol.iterator]=function(){return this},i.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:[a.key,a.value]}):{done:!0,value:void 0}};function j(a){this.entry=a;}j.prototype[Symbol.iterator]=function(){return this},j.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.key}):{done:!0,value:void 0}};function k(a){this.entry=a;}k.prototype[Symbol.iterator]=function(){return this},k.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.value}):{done:!0,value:void 0}};});\n\t\n} (lru, lru.exports));\n\n/**\n * CosmeticLookupTable lets quickly lookup cosmetic rules for the specified hostname.\n * It is primarily used by the {@see CosmeticEngine}.\n */\nvar CosmeticLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function CosmeticLookupTable(storage) {\n this.byHostname = new Map();\n this.wildcardRules = [];\n this.genericRules = [];\n this.allowlist = new Map();\n this.ruleStorage = storage;\n }\n /**\n * Adds rule to the appropriate collection\n * @param rule\n * @param storageIdx\n */\n CosmeticLookupTable.prototype.addRule = function (rule, storageIdx) {\n if (rule.isAllowlist()) {\n var key = rule.getContent();\n var existingRules = this.allowlist.get(key) || [];\n existingRules.push(storageIdx);\n this.allowlist.set(key, existingRules);\n return;\n }\n if (rule.isGeneric()) {\n this.genericRules.push(rule);\n return;\n }\n var domains = rule.getPermittedDomains();\n if (domains) {\n var hasWildcardDomain = domains.some(function (d) { return DomainModifier.isWildcardDomain(d); });\n if (hasWildcardDomain) {\n this.wildcardRules.push(rule);\n return;\n }\n for (var _i = 0, domains_1 = domains; _i < domains_1.length; _i++) {\n var domain = domains_1[_i];\n var tldResult = parse(domain);\n // tldResult.domain equals to eTLD domain,\n // e.g. sub.example.uk.org would result in example.uk.org\n var parsedDomain = tldResult.domain || domain;\n var key = fastHash(parsedDomain);\n var rules = this.byHostname.get(key) || [];\n rules.push(storageIdx);\n this.byHostname.set(key, rules);\n }\n }\n };\n /**\n * Finds rules by hostname\n * @param request\n * @param subdomains\n */\n CosmeticLookupTable.prototype.findByHostname = function (request) {\n var result = [];\n var subdomains = request.subdomains;\n var _loop_1 = function (i) {\n var subdomain = subdomains[i];\n var rulesIndexes = this_1.byHostname.get(fastHash(subdomain));\n if (rulesIndexes) {\n // Filtering out duplicates\n rulesIndexes = rulesIndexes.filter(function (v, index) { return rulesIndexes.indexOf(v) === index; });\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this_1.ruleStorage.retrieveRule(rulesIndexes[j]);\n if (rule && rule.match(request)) {\n result.push(rule);\n }\n }\n }\n };\n var this_1 = this;\n // Iterate over all sub-domains\n for (var i = 0; i < subdomains.length; i += 1) {\n _loop_1(i);\n }\n result.push.apply(result, this.wildcardRules.filter(function (r) { return r.match(request); }));\n return result.filter(function (rule) { return !rule.isAllowlist(); });\n };\n /**\n * Checks if the rule is disabled on the specified hostname.\n * @param request\n * @param rule\n */\n CosmeticLookupTable.prototype.isAllowlisted = function (request, rule) {\n var rulesIndexes = this.allowlist.get(rule.getContent());\n if (!rulesIndexes) {\n return false;\n }\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var r = this.ruleStorage.retrieveRule(rulesIndexes[j]);\n if (r && r.match(request)) {\n return true;\n }\n }\n return false;\n };\n return CosmeticLookupTable;\n}());\n\nvar CosmeticRuleModifiers;\n(function (CosmeticRuleModifiers) {\n CosmeticRuleModifiers[\"Path\"] = \"path\";\n CosmeticRuleModifiers[\"Domain\"] = \"domain\";\n})(CosmeticRuleModifiers || (CosmeticRuleModifiers = {}));\nvar CosmeticRuleModifiersSyntax = {\n OpenBracket: '[',\n CloseBracket: ']',\n SpecialSymbol: '$',\n Delimiter: ',',\n Assigner: '=',\n EscapeCharacter: '\\\\',\n};\n\nvar cosmeticRuleModifiersList = Object.values(CosmeticRuleModifiers);\n/**\n * Helper class for parsing text of cosmetic rules\n * used by CosmeticRule and [Filter compiler](https://github.com/AdguardTeam/FiltersCompiler)\n *\n *\n * The cosmetic rule contains of the following parts:\n *\n * `pattern##content`\n *\n * `pattern` contains the list of the rule modifiers and domains.\n *\n * `##` is a marker (might be a different marker depending on the rule type).\n * You can find the list of markers in the CosmeticRuleMarker enumeration.\n *\n * `content` might be a CSS selector, a scriptlet or something else, depending on the rule type.\n */\nvar CosmeticRuleParser = /** @class */ (function () {\n function CosmeticRuleParser() {\n }\n /**\n * Parse the rule's pattern, cosmetic marker and the content parts from the rule text.\n * If the content is empty, throws a SyntaxError.\n *\n * @param ruleText\n * @returns Object with pattern, marker and content text parts\n */\n CosmeticRuleParser.parseRuleTextByMarker = function (ruleText) {\n var _a = findCosmeticRuleMarker(ruleText), markerIndex = _a[0], marker = _a[1];\n if (marker === null) {\n throw new SyntaxError('Not a cosmetic rule');\n }\n var content = ruleText.substring(markerIndex + marker.length).trim();\n if (!content) {\n throw new SyntaxError('Rule content is empty');\n }\n var pattern;\n if (markerIndex > 0) {\n pattern = ruleText.substring(0, markerIndex);\n }\n return {\n pattern: pattern,\n marker: marker,\n content: content,\n };\n };\n /**\n * Extracts the rule modifiers and domains from the rule pattern.\n * @param rulePattern\n * @returns Object with modifiers and domains text parts\n */\n CosmeticRuleParser.parseRulePatternText = function (rulePattern) {\n var OpenBracket = CosmeticRuleModifiersSyntax.OpenBracket, CloseBracket = CosmeticRuleModifiersSyntax.CloseBracket, SpecialSymbol = CosmeticRuleModifiersSyntax.SpecialSymbol, EscapeCharacter = CosmeticRuleModifiersSyntax.EscapeCharacter;\n if (!rulePattern.startsWith(\"\".concat(OpenBracket + SpecialSymbol))) {\n return { domainsText: rulePattern };\n }\n var closeBracketIndex;\n // The first two characters cannot be closing brackets\n for (var i = 2; i < rulePattern.length; i += 1) {\n if (rulePattern[i] === CloseBracket && rulePattern[i - 1] !== EscapeCharacter) {\n closeBracketIndex = i;\n break;\n }\n }\n if (!closeBracketIndex) {\n throw new SyntaxError('Can\\'t parse modifiers list');\n }\n // Handle this case: `[$]`\n if (closeBracketIndex === 2) {\n throw new SyntaxError('Modifiers list can\\'t be empty');\n }\n var modifiersText = rulePattern.slice(2, closeBracketIndex);\n var domainsText;\n if (closeBracketIndex < rulePattern.length - 1) {\n domainsText = rulePattern.slice(closeBracketIndex + 1);\n }\n return {\n modifiersText: modifiersText,\n domainsText: domainsText,\n };\n };\n /**\n * Parses the list of modifiers. Parsing is done in the same way as it's done in the NetworkRule, i.e.\n * we have a comma-separated list of modifier-value pairs.\n * If we encounter an invalid modifier, this method throws a SyntaxError.\n *\n * @param modifiersText - list of modifiers splited by comma\n * @returns - modifiers collection object\n */\n CosmeticRuleParser.parseRuleModifiers = function (modifiersText) {\n if (!modifiersText) {\n return null;\n }\n var Assigner = CosmeticRuleModifiersSyntax.Assigner;\n var modifiersTextArray = parseOptionsString(modifiersText, false);\n var modifiers = Object.create(null);\n for (var i = 0; i < modifiersTextArray.length; i += 1) {\n var modifierText = modifiersTextArray[i];\n var assignerIndex = modifierText.indexOf(Assigner);\n if (modifierText === 'path') {\n // Empty path modifier without assigner and value will match only main page\n modifiers[modifierText] = '';\n continue;\n }\n if (assignerIndex === -1) {\n throw new SyntaxError('Modifier must have assigned value');\n }\n var modifierKey = modifierText.substring(0, assignerIndex);\n if (cosmeticRuleModifiersList.includes(modifierKey)) {\n var modifierValue = modifierText.substring(assignerIndex + 1);\n modifiers[modifierKey] = modifierValue;\n }\n else {\n throw new SyntaxError(\"'\".concat(modifierKey, \"' is not valid modifier\"));\n }\n }\n return modifiers;\n };\n /**\n * Parses the rule pattern and extracts the permitted/restricted domains and the unescaped path modifier value,\n * If domains are declared through $domain modifier and pattern domain list, this method throws a SyntaxError.\n * @param rulePattern - rule pattern text\n *\n * @returns Object with permitted/restricted domains list and the path modifier string value\n */\n CosmeticRuleParser.parseRulePattern = function (rulePattern) {\n var _a = CosmeticRuleParser.parseRulePatternText(rulePattern), domainsText = _a.domainsText, modifiersText = _a.modifiersText;\n var domains = domainsText;\n var path;\n var modifiers = CosmeticRuleParser.parseRuleModifiers(modifiersText);\n if (modifiers) {\n if (modifiers.path || modifiers.path === '') {\n path = modifiers.path;\n if (SimpleRegex.isRegexPattern(path)) {\n path = SimpleRegex.unescapeRegexSpecials(path, SimpleRegex.reModifierPatternEscapedSpecialCharacters);\n }\n }\n if (modifiers.domain) {\n if (domains) {\n throw new SyntaxError('The $domain modifier is not allowed in a domain-specific rule');\n }\n else {\n domains = modifiers.domain;\n }\n }\n }\n var permittedDomains;\n var restrictedDomains;\n // Skip wildcard domain\n if (domains && domains !== SimpleRegex.MASK_ANY_CHARACTER) {\n var separator = (modifiers === null || modifiers === void 0 ? void 0 : modifiers.domain) ? PIPE_SEPARATOR : COMMA_SEPARATOR;\n var domainModifier = new DomainModifier(domains, separator);\n if (domainModifier.permittedDomains) {\n permittedDomains = domainModifier.permittedDomains;\n }\n if (domainModifier.restrictedDomains) {\n restrictedDomains = domainModifier.restrictedDomains;\n }\n }\n return {\n path: path,\n permittedDomains: permittedDomains,\n restrictedDomains: restrictedDomains,\n };\n };\n return CosmeticRuleParser;\n}());\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Scriptlets helper class\n */\n// eslint-disable-next-line max-classes-per-file\nvar ScriptletParser = /** @class */ (function () {\n function ScriptletParser() {\n }\n /**\n * Iterate over iterable argument and evaluate current state with transitions\n *\n * @param {Array|Collection|string} iterable\n * @param {Object} transitions transition functions\n * @param {string} initState first transition name\n * @param {any} args arguments which should be passed to transition functions\n * @returns {string} transition\n */\n ScriptletParser.iterateWithTransitions = function (iterable, transitions, initState, args) {\n var state = initState;\n for (var i = 0; i < iterable.length; i += 1) {\n state = transitions[state](iterable, i, args);\n }\n return state;\n };\n /**\n * Parse and validate scriptlet rule\n * @param {*} ruleContent\n * @returns {{name: string, args: Array}}\n */\n ScriptletParser.parseRule = function (ruleContent) {\n var _a;\n var transitions = (_a = {},\n _a[ScriptletParser.TRANSITION.OPENED] = ScriptletParser.opened,\n _a[ScriptletParser.TRANSITION.PARAM] = ScriptletParser.param,\n _a[ScriptletParser.TRANSITION.CLOSED] = function () { },\n _a);\n var sep = { symb: null };\n var saver = new ScriptletParser.WordSaver();\n var state = ScriptletParser.iterateWithTransitions(ruleContent, transitions, ScriptletParser.TRANSITION.OPENED, { sep: sep, saver: saver });\n if (state !== 'closed') {\n throw new Error(\"Invalid scriptlet \".concat(ruleContent));\n }\n var args = saver.getAll();\n return {\n name: args[0],\n args: args.slice(1),\n };\n };\n /**\n * Helper class to accumulate an array of strings char by char\n */\n ScriptletParser.WordSaver = /** @class */ (function () {\n function class_1() {\n /**\n * String cursor\n */\n this.str = '';\n /**\n * Strings array\n */\n this.collectedStrings = [];\n }\n /**\n * Saves symbol to cursor\n *\n * @param s\n */\n class_1.prototype.saveSymbol = function (s) {\n this.str += s;\n };\n /**\n * Saves cursor to strings\n */\n class_1.prototype.saveStr = function () {\n this.collectedStrings.push(this.str);\n this.str = '';\n };\n /**\n * Returns collected strings\n */\n class_1.prototype.getAll = function () {\n return __spreadArray([], this.collectedStrings, true);\n };\n return class_1;\n }());\n /**\n * Transition names\n */\n ScriptletParser.TRANSITION = {\n OPENED: 'opened',\n PARAM: 'param',\n CLOSED: 'closed',\n };\n /**\n * Transition function: the current index position in start, end or between params\n * @param {string} rule\n * @param {number} index\n * @param {Object} Object\n * @property {Object} Object.sep contains prop symb with current separator char\n * @returns {string} transition\n */\n ScriptletParser.opened = function (rule, index, _a) {\n var sep = _a.sep;\n var char = rule[index];\n switch (char) {\n case ' ':\n case '(':\n case ',':\n return ScriptletParser.TRANSITION.OPENED;\n case '\\'':\n case '\"':\n // eslint-disable-next-line no-param-reassign\n sep.symb = char;\n return ScriptletParser.TRANSITION.PARAM;\n case ')':\n return index === rule.length - 1\n ? ScriptletParser.TRANSITION.CLOSED\n : ScriptletParser.TRANSITION.OPENED;\n }\n return undefined;\n };\n /**\n * Transition function: the current index position inside param\n *\n * @param {string} rule\n * @param {number} index\n * @param {Object} Object\n * @property {Object} Object.sep contains prop `symb` with current separator char\n * @property {Object} Object.saver helper which allow to save strings by car by char\n * @returns {string} transition\n */\n ScriptletParser.param = function (rule, index, _a) {\n var saver = _a.saver, sep = _a.sep;\n var char = rule[index];\n switch (char) {\n case '\\'':\n case '\"':\n if (char === sep.symb && rule[index - 1] !== '\\\\') {\n // eslint-disable-next-line no-param-reassign\n sep.symb = null;\n saver.saveStr();\n return ScriptletParser.TRANSITION.OPENED;\n }\n saver.saveSymbol(char);\n return ScriptletParser.TRANSITION.PARAM;\n default:\n saver.saveSymbol(char);\n return ScriptletParser.TRANSITION.PARAM;\n }\n };\n return ScriptletParser;\n}());\n\n/**\n * CosmeticRuleType is an enumeration of the possible\n * cosmetic rule types.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-rules\n */\nvar CosmeticRuleType;\n(function (CosmeticRuleType) {\n /**\n * Cosmetic rules that just hide page elements.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#element-hiding-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"ElementHiding\"] = 0] = \"ElementHiding\";\n /**\n * Cosmetic rules that allow adding custom CSS styles.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"Css\"] = 1] = \"Css\";\n /**\n * Cosmetic rules that allow executing custom JS scripts.\n * Some restrictions are applied to this type of rules by default.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"Js\"] = 2] = \"Js\";\n /**\n * Special type of rules that allows filtering HTML code of web pages.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"Html\"] = 3] = \"Html\";\n})(CosmeticRuleType || (CosmeticRuleType = {}));\n/**\n * Pseudo class indicators. They are used to detect if rule is extended or not even if rule does not\n * have extended css marker\n */\nvar EXT_CSS_PSEUDO_INDICATORS = [\n /**\n * Pseudo-classes :is(), and :not() may use native implementation\n * so they are not listed here\n * https://github.com/AdguardTeam/ExtendedCss#extended-css-is\n * https://github.com/AdguardTeam/ExtendedCss#extended-css-not\n */\n /**\n * :has() should also be conditionally considered as extended and should not be in this list\n * https://github.com/AdguardTeam/ExtendedCss#extended-css-has\n * but there is a bug with content blocker in safari\n * https://bugs.webkit.org/show_bug.cgi?id=248868\n *\n * TODO: remove ':has(' later\n */\n ':has(',\n ':contains(',\n ':matches-css(',\n ':matches-attr(',\n ':matches-property(',\n ':xpath(',\n ':upward(',\n ':nth-ancestor(',\n ':remove(',\n // aliases for :has()\n ':-abp-has(',\n // aliases for :contains()\n ':has-text(',\n ':-abp-contains(',\n // old syntax\n '[-ext-has=',\n '[-ext-contains=',\n '[-ext-has-text=',\n '[-ext-matches-css=',\n '[-ext-matches-css-before=',\n '[-ext-matches-css-after=',\n // obsolete since ExtendedCss v2.0.2 but still compatible\n // https://github.com/AdguardTeam/ExtendedCss/releases/tag/v2.0.2\n ':matches-css-before(',\n ':matches-css-after(',\n];\n/**\n * Implements a basic cosmetic rule.\n *\n * Cosmetic rules syntax are almost similar and looks like this:\n * ```\n * rule = [domains] \"marker\" content\n * domains = [domain0, domain1[, ...[, domainN]]]\n * ```\n *\n * The rule type is defined by the `marker` value, you can find the list of them\n * in the {@see CosmeticRuleMarker} enumeration.\n *\n * What matters, though, is what's in the `content` part of it.\n *\n * Examples:\n * * `example.org##.banner` -- element hiding rule\n * * `example.org#$#.banner { display: block; }` -- CSS rule\n * * `example.org#%#window.x=1;` -- JS rule\n * * `example.org#%#//scriptlet('scriptlet-name')` -- Scriptlet rule\n * * `example.org$$div[id=\"test\"]` -- HTML filtering rule\n */\nvar CosmeticRule = /** @class */ (function () {\n /**\n * Creates an instance of the {@link CosmeticRule}.\n * It parses the rule and extracts the permitted/restricted domains,\n * and also the cosmetic rule's content.\n *\n * Depending on the rule type, the content might be transformed in\n * one of the helper classes, or kept as string when it's appropriate.\n *\n * @param ruleText - original rule text.\n * @param filterListId - ID of the filter list this rule belongs to.\n *\n * @throws error if it fails to parse the rule.\n */\n function CosmeticRule(ruleText, filterListId) {\n this.allowlist = false;\n this.extendedCss = false;\n this.permittedDomains = undefined;\n this.restrictedDomains = undefined;\n /**\n * Js script to execute\n */\n this.script = undefined;\n /**\n * Object with script code ready to execute and debug, domain values\n * @private\n */\n this.scriptData = null;\n /**\n * Object with scriptlet function and params\n * @private\n */\n this.scriptletData = null;\n /**\n * If the rule contains scriptlet content\n */\n this.isScriptlet = false;\n this.ruleText = ruleText;\n this.filterListId = filterListId;\n var _a = CosmeticRuleParser.parseRuleTextByMarker(ruleText), pattern = _a.pattern, marker = _a.marker, content = _a.content;\n this.content = content;\n this.type = CosmeticRule.parseType(marker);\n this.extendedCss = isExtCssMarker(marker);\n if (!this.extendedCss\n && (this.type === CosmeticRuleType.ElementHiding\n || this.type === CosmeticRuleType.Css)) {\n // additional check if rule is extended css rule by pseudo class indicators\n for (var i = 0; i < EXT_CSS_PSEUDO_INDICATORS.length; i += 1) {\n if (this.content.indexOf(EXT_CSS_PSEUDO_INDICATORS[i]) !== -1) {\n this.extendedCss = true;\n break;\n }\n }\n }\n CosmeticRule.validate(ruleText, this.type, content, this.extendedCss);\n if (pattern) {\n // This means that the marker is preceded by the list of domains and modifiers\n // Now it's a good time to parse them.\n var _b = CosmeticRuleParser.parseRulePattern(pattern), path = _b.path, permittedDomains = _b.permittedDomains, restrictedDomains = _b.restrictedDomains;\n if (path || path === '') {\n this.pathModifier = new Pattern(path);\n }\n if (permittedDomains) {\n this.permittedDomains = permittedDomains;\n }\n if (restrictedDomains) {\n this.restrictedDomains = restrictedDomains;\n }\n }\n this.allowlist = CosmeticRule.parseAllowlist(marker);\n this.isScriptlet = this.content.startsWith(ADG_SCRIPTLET_MASK);\n }\n /**\n * Parses first pseudo class from the specified CSS selector\n *\n * @param selector\n * @returns pseudo class name if found or null\n */\n CosmeticRule.parsePseudoClass = function (selector) {\n var beginIndex = 0;\n var nameStartIndex = -1;\n var squareBracketIndex = 0;\n while (squareBracketIndex >= 0) {\n nameStartIndex = selector.indexOf(':', beginIndex);\n if (nameStartIndex < 0) {\n return null;\n }\n if (nameStartIndex > 0 && selector.charAt(nameStartIndex - 1) === '\\\\') {\n // Escaped colon character\n return null;\n }\n squareBracketIndex = selector.indexOf('[', beginIndex);\n while (squareBracketIndex >= 0) {\n if (nameStartIndex > squareBracketIndex) {\n var squareEndBracketIndex = selector.indexOf(']', squareBracketIndex + 1);\n beginIndex = squareEndBracketIndex + 1;\n if (nameStartIndex < squareEndBracketIndex) {\n // Means that colon character is somewhere inside attribute selector\n // Something like a[src^=\"http://domain.com\"]\n break;\n }\n if (squareEndBracketIndex > 0) {\n squareBracketIndex = selector.indexOf('[', beginIndex);\n }\n else {\n // bad rule, example: a[src=\"http:\n return null;\n }\n }\n else {\n squareBracketIndex = -1;\n break;\n }\n }\n }\n var nameEndIndex = indexOfAny(selector, [' ', ',', '\\t', '>', '(', '[', '.', '#', ':', '+', '~', '\"', '\\''], nameStartIndex + 1);\n if (nameEndIndex < 0) {\n nameEndIndex = selector.length;\n }\n var name = selector.substring(nameStartIndex, nameEndIndex);\n if (name.length <= 1) {\n // Either empty name or a pseudo element (like ::content)\n return null;\n }\n return name;\n };\n CosmeticRule.prototype.getText = function () {\n return this.ruleText;\n };\n CosmeticRule.prototype.getFilterListId = function () {\n return this.filterListId;\n };\n /**\n * Cosmetic rule type (always present)\n */\n CosmeticRule.prototype.getType = function () {\n return this.type;\n };\n /**\n * Allowlist means that this rule is meant to disable other rules.\n * For instance, https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#elemhide-exceptions\n */\n CosmeticRule.prototype.isAllowlist = function () {\n return this.allowlist;\n };\n /**\n * Gets the rule content. The meaning of this field depends on the rule type.\n * For instance, for an element hiding rule, this is just a CSS selector.\n * While, for a CSS rule, this is a CSS selector + style.\n */\n CosmeticRule.prototype.getContent = function () {\n return this.content;\n };\n /**\n * Returns script ready to execute or null\n * Rebuilds scriptlet script if debug or domain params change\n * @param options\n */\n CosmeticRule.prototype.getScript = function (options) {\n var _a, _b;\n if (options === void 0) { options = {}; }\n var _c = options.debug, debug = _c === void 0 ? false : _c, _d = options.request, request = _d === void 0 ? null : _d;\n var scriptData = this.scriptData;\n if (scriptData && !this.isScriptlet) {\n return scriptData.code;\n }\n if (scriptData && scriptData.debug === debug) {\n if (request) {\n if (request.domain === scriptData.domain) {\n return scriptData.code;\n }\n }\n else {\n return scriptData.code;\n }\n }\n this.initScript(options);\n return (_b = (_a = this.scriptData) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : null;\n };\n /**\n * Gets list of permitted domains.\n */\n CosmeticRule.prototype.getPermittedDomains = function () {\n return this.permittedDomains;\n };\n /**\n * Returns true if the rule is considered \"generic\"\n * \"generic\" means that the rule is not restricted to a limited set of domains\n * Please note that it might be forbidden on some domains, though.\n *\n * @return {boolean}\n */\n CosmeticRule.prototype.isGeneric = function () {\n return !this.permittedDomains || this.permittedDomains.length === 0;\n };\n /**\n * Gets list of restricted domains.\n */\n CosmeticRule.prototype.getRestrictedDomains = function () {\n return this.restrictedDomains;\n };\n CosmeticRule.prototype.isExtendedCss = function () {\n return this.extendedCss;\n };\n /**\n * Match returns true if this rule can be used on the specified request.\n *\n * @param request - request to check\n */\n CosmeticRule.prototype.match = function (request) {\n if (!this.permittedDomains && !this.restrictedDomains && !this.pathModifier) {\n return true;\n }\n if (this.matchesRestrictedDomains(request.hostname)) {\n /**\n * Domain or host is restricted\n * i.e. ~example.org##rule\n */\n return false;\n }\n if (this.hasPermittedDomains()) {\n if (!DomainModifier.isDomainOrSubdomainOfAny(request.hostname, this.permittedDomains)) {\n /**\n * Domain is not among permitted\n * i.e. example.org##rule and we're checking example.org\n */\n return false;\n }\n }\n if (this.pathModifier) {\n var path = getRelativeUrl(request.urlLowercase);\n if (path) {\n return this.pathModifier.matchPathPattern(path);\n }\n return false;\n }\n return true;\n };\n CosmeticRule.parseType = function (marker) {\n switch (marker) {\n case CosmeticRuleMarker.ElementHiding:\n case CosmeticRuleMarker.ElementHidingExtCSS:\n return CosmeticRuleType.ElementHiding;\n case CosmeticRuleMarker.ElementHidingException:\n case CosmeticRuleMarker.ElementHidingExtCSSException:\n return CosmeticRuleType.ElementHiding;\n case CosmeticRuleMarker.Css:\n case CosmeticRuleMarker.CssExtCSS:\n return CosmeticRuleType.Css;\n case CosmeticRuleMarker.CssException:\n case CosmeticRuleMarker.CssExtCSSException:\n return CosmeticRuleType.Css;\n case CosmeticRuleMarker.Js:\n return CosmeticRuleType.Js;\n case CosmeticRuleMarker.JsException:\n return CosmeticRuleType.Js;\n case CosmeticRuleMarker.Html:\n return CosmeticRuleType.Html;\n case CosmeticRuleMarker.HtmlException:\n return CosmeticRuleType.Html;\n default:\n throw new SyntaxError('Unsupported rule type');\n }\n };\n /**\n * Determines if rule is allowlist rule\n * @param marker\n * @private\n */\n CosmeticRule.parseAllowlist = function (marker) {\n switch (marker) {\n case CosmeticRuleMarker.ElementHidingException:\n case CosmeticRuleMarker.ElementHidingExtCSSException:\n case CosmeticRuleMarker.CssException:\n case CosmeticRuleMarker.CssExtCSSException:\n case CosmeticRuleMarker.JsException:\n case CosmeticRuleMarker.HtmlException:\n return true;\n default:\n return false;\n }\n };\n /**\n * Validate pseudo-classes\n *\n * @param ruleText\n * @param ruleContent\n * @throws SyntaxError\n */\n CosmeticRule.validatePseudoClasses = function (ruleText, ruleContent) {\n var pseudoClass = CosmeticRule.parsePseudoClass(ruleContent);\n if (pseudoClass !== null) {\n if (CosmeticRule.SUPPORTED_PSEUDO_CLASSES.indexOf(pseudoClass) < 0) {\n throw new SyntaxError(\"Unknown pseudo-class '\".concat(pseudoClass, \"' in selector: '\").concat(ruleContent, \"'\"));\n }\n }\n };\n /**\n * Simple validation for elemhide rules\n *\n * @param ruleText\n * @param ruleContent\n * @throws SyntaxError\n */\n CosmeticRule.validateElemhideRule = function (ruleText, ruleContent) {\n if (ruleText.startsWith(SimpleRegex.MASK_START_URL)) {\n throw new SyntaxError('Element hiding rule shouldn\\'t start with \"||\"');\n }\n if (CosmeticRule.ELEMHIDE_VALIDATION_REGEX.test(ruleContent)) {\n throw new SyntaxError('Invalid elemhide rule, style presented');\n }\n };\n CosmeticRule.validateJsRules = function (ruleText, ruleContent) {\n if (ruleContent.startsWith(ADG_SCRIPTLET_MASK)) {\n if (!scriptlets_umd.exports.isValidScriptletRule(ruleText)) {\n throw new SyntaxError('Invalid scriptlet');\n }\n }\n };\n /**\n * Validates css injection rules\n *\n * @param ruleText\n * @param ruleContent\n * @throws SyntaxError\n */\n CosmeticRule.validateCssRules = function (ruleText, ruleContent) {\n // Simple validation for css injection rules\n if (!/{.+}/.test(ruleContent)) {\n throw new SyntaxError('Invalid CSS modifying rule, no style presented');\n }\n // discard css inject rules containing \"url\"\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1196\n if (/{.*url\\(.*\\)/gi.test(ruleContent)) {\n throw new SyntaxError('CSS modifying rule with \\'url\\' was omitted');\n }\n // discard css inject rules containing other unsafe selectors\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1920\n if (/{.*image-set\\(.*\\)/gi.test(ruleContent)\n || /{.*image\\(.*\\)/gi.test(ruleContent)\n || /{.*cross-fade\\(.*\\)/gi.test(ruleContent)) {\n throw new SyntaxError('CSS modifying rule with unsafe style was omitted');\n }\n // Prohibit \"\\\" character in style of CSS injection rules\n // Check slash character only after the index of last opening curly brackets\n if (ruleContent.indexOf('\\\\', ruleContent.lastIndexOf('{')) > -1) {\n throw new SyntaxError('CSS injection rule with \\'\\\\\\' was omitted');\n }\n };\n /**\n * Checks if the rule has permitted domains\n */\n CosmeticRule.prototype.hasPermittedDomains = function () {\n return this.permittedDomains != null && this.permittedDomains.length > 0;\n };\n /**\n * Checks if the rule has restricted domains\n */\n CosmeticRule.prototype.hasRestrictedDomains = function () {\n return this.restrictedDomains != null && this.restrictedDomains.length > 0;\n };\n /**\n * Checks if the hostname matches permitted domains\n * @param hostname\n */\n CosmeticRule.prototype.matchesPermittedDomains = function (hostname) {\n return this.hasPermittedDomains() && DomainModifier.isDomainOrSubdomainOfAny(hostname, this.permittedDomains);\n };\n /**\n * Checks if the hostname matches the restricted domains.\n * @param hostname\n */\n CosmeticRule.prototype.matchesRestrictedDomains = function (hostname) {\n return this.hasRestrictedDomains()\n && DomainModifier.isDomainOrSubdomainOfAny(hostname, this.restrictedDomains);\n };\n /**\n * Validates cosmetic rule text\n * @param ruleText\n * @param type\n * @param content\n * @param isExtCss\n * @private\n */\n CosmeticRule.validate = function (ruleText, type, content, isExtCss) {\n if (type !== CosmeticRuleType.Css\n && type !== CosmeticRuleType.Js\n && type !== CosmeticRuleType.Html) {\n CosmeticRule.validatePseudoClasses(ruleText, content);\n if (hasUnquotedSubstring(content, '{')) {\n throw new SyntaxError('Invalid cosmetic rule, wrong brackets');\n }\n }\n if (type === CosmeticRuleType.ElementHiding) {\n CosmeticRule.validateElemhideRule(ruleText, content);\n }\n if (type === CosmeticRuleType.Css) {\n CosmeticRule.validateCssRules(ruleText, content);\n }\n if (type === CosmeticRuleType.Js) {\n CosmeticRule.validateJsRules(ruleText, content);\n }\n if ((!isExtCss && hasUnquotedSubstring(content, '/*'))\n || hasUnquotedSubstring(content, ' /*')\n || hasUnquotedSubstring(content, ' //')) {\n throw new SyntaxError('Cosmetic rule should not contain comments');\n }\n };\n /**\n * Returns the scriptlet's data consisting of the scriptlet function and its arguments.\n * This method is supposed to be used in the manifest V3 extension.\n */\n CosmeticRule.prototype.getScriptletData = function () {\n if (this.scriptletData) {\n return this.scriptletData;\n }\n this.initScript();\n return this.scriptletData;\n };\n /**\n * Updates this.scriptData and if scriptlet this.scriptletData with js ready to execute\n *\n * @param options\n */\n CosmeticRule.prototype.initScript = function (options) {\n var _a;\n if (options === void 0) { options = {}; }\n var _b = options.debug, debug = _b === void 0 ? false : _b, _c = options.request, request = _c === void 0 ? null : _c;\n var ruleContent = this.getContent();\n if (!this.isScriptlet) {\n this.scriptData = {\n code: ruleContent,\n };\n return;\n }\n var scriptletContent = ruleContent.substring(ADG_SCRIPTLET_MASK.length);\n var scriptletParams = ScriptletParser.parseRule(scriptletContent);\n var params = {\n args: scriptletParams.args,\n engine: config$2.engine || '',\n name: scriptletParams.name,\n ruleText: this.getText(),\n verbose: debug,\n domainName: request === null || request === void 0 ? void 0 : request.domain,\n version: config$2.version || '',\n };\n this.scriptData = {\n code: (_a = scriptlets_umd.exports.invoke(params)) !== null && _a !== void 0 ? _a : null,\n debug: debug,\n domain: request === null || request === void 0 ? void 0 : request.domain,\n };\n this.scriptletData = {\n func: scriptlets_umd.exports.getScriptletFunction(params.name),\n params: params,\n };\n };\n /**\n * The problem with pseudo-classes is that any unknown pseudo-class makes browser ignore the whole CSS rule,\n * which contains a lot more selectors. So, if CSS selector contains a pseudo-class, we should try to validate it.\n *

\n * One more problem with pseudo-classes is that they are actively used in uBlock, hence it may mess AG styles.\n */\n CosmeticRule.SUPPORTED_PSEUDO_CLASSES = [':active',\n ':checked', ':contains', ':disabled', ':empty', ':enabled', ':first-child', ':first-of-type',\n ':focus', ':has', ':has-text', ':hover', ':if', ':if-not', ':in-range', ':invalid', ':lang',\n ':last-child', ':last-of-type', ':link', ':matches-css', ':matches-css-before', ':matches-css-after',\n ':not', ':nth-child', ':nth-last-child', ':nth-last-of-type', ':nth-of-type',\n ':only-child', ':only-of-type', ':optional', ':out-of-range', ':read-only',\n ':read-write', ':required', ':root', ':target', ':valid', ':visited',\n ':-abp-has', ':-abp-contains', ':xpath', ':nth-ancestor', ':upward', ':remove',\n ':matches-attr', ':matches-property', ':is', ':where'];\n CosmeticRule.ELEMHIDE_VALIDATION_REGEX = / {.+}/;\n return CosmeticRule;\n}());\n\n/**\n * CosmeticEngine combines all the cosmetic rules and allows to quickly\n * find all rules matching this or that hostname\n * It is primarily used by the {@see Engine}\n */\nvar CosmeticEngine = /** @class */ (function () {\n /**\n * Builds instance of cosmetic engine\n *\n * @param ruleStorage\n * @param skipStorageScan create an instance without storage scanning\n */\n function CosmeticEngine(ruleStorage, skipStorageScan) {\n if (skipStorageScan === void 0) { skipStorageScan = false; }\n this.ruleStorage = ruleStorage;\n this.rulesCount = 0;\n this.elementHidingLookupTable = new CosmeticLookupTable(ruleStorage);\n this.cssLookupTable = new CosmeticLookupTable(ruleStorage);\n this.jsLookupTable = new CosmeticLookupTable(ruleStorage);\n this.htmlLookupTable = new CosmeticLookupTable(ruleStorage);\n if (skipStorageScan) {\n return;\n }\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.CosmeticRules);\n while (scanner.scan()) {\n var indexedRule = scanner.getRule();\n if (indexedRule\n && indexedRule.rule instanceof CosmeticRule) {\n this.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n }\n /**\n * Adds rules into appropriate tables\n * @param rule\n * @param storageIdx\n */\n CosmeticEngine.prototype.addRule = function (rule, storageIdx) {\n switch (rule.getType()) {\n case CosmeticRuleType.ElementHiding: {\n this.elementHidingLookupTable.addRule(rule, storageIdx);\n break;\n }\n case CosmeticRuleType.Css: {\n this.cssLookupTable.addRule(rule, storageIdx);\n break;\n }\n case CosmeticRuleType.Js: {\n this.jsLookupTable.addRule(rule, storageIdx);\n break;\n }\n case CosmeticRuleType.Html: {\n this.htmlLookupTable.addRule(rule, storageIdx);\n break;\n }\n }\n this.rulesCount += 1;\n };\n /**\n * Checks if bitwise mask matches option\n * @param option\n * @param targetOption\n */\n CosmeticEngine.matchOption = function (option, targetOption) {\n return (option & targetOption) === targetOption;\n };\n /**\n * Prepares cosmetic result by request\n *\n * @param request - request to match\n * @param option mask of enabled cosmetic types\n * @return CosmeticResult\n */\n CosmeticEngine.prototype.match = function (request, option) {\n var includeGeneric = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionGenericCSS);\n var includeSpecific = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionSpecificCSS);\n var includeJs = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionJS);\n var includeHtml = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionHtml);\n var cosmeticResult = new CosmeticResult();\n if (includeGeneric) {\n CosmeticEngine.appendGenericRules(cosmeticResult.elementHiding, this.elementHidingLookupTable, request);\n CosmeticEngine.appendGenericRules(cosmeticResult.CSS, this.cssLookupTable, request);\n }\n if (includeSpecific) {\n CosmeticEngine.appendSpecificRules(cosmeticResult.elementHiding, this.elementHidingLookupTable, request);\n CosmeticEngine.appendSpecificRules(cosmeticResult.CSS, this.cssLookupTable, request);\n }\n if (includeJs) {\n CosmeticEngine.appendGenericRules(cosmeticResult.JS, this.jsLookupTable, request);\n CosmeticEngine.appendSpecificRules(cosmeticResult.JS, this.jsLookupTable, request);\n }\n if (includeHtml) {\n if (includeGeneric) {\n CosmeticEngine.appendGenericRules(cosmeticResult.Html, this.htmlLookupTable, request);\n }\n CosmeticEngine.appendSpecificRules(cosmeticResult.Html, this.htmlLookupTable, request);\n }\n return cosmeticResult;\n };\n /**\n * Selects generic rules and appends rules content to cosmetic result\n * @param cosmeticResult\n * @param lookupTable\n * @param request\n */\n CosmeticEngine.appendGenericRules = function (cosmeticResult, lookupTable, request) {\n for (var _i = 0, _a = lookupTable.genericRules; _i < _a.length; _i++) {\n var genericRule = _a[_i];\n if (!lookupTable.isAllowlisted(request, genericRule)\n && genericRule.match(request)) {\n cosmeticResult.append(genericRule, request);\n }\n }\n };\n /**\n * Selects specific rules and appends rules content to cosmetic result\n * @param cosmeticResult\n * @param lookupTable\n * @param request\n */\n CosmeticEngine.appendSpecificRules = function (cosmeticResult, lookupTable, request) {\n var hostnameRules = lookupTable.findByHostname(request);\n if (hostnameRules.length > 0) {\n for (var _i = 0, hostnameRules_1 = hostnameRules; _i < hostnameRules_1.length; _i++) {\n var rule = hostnameRules_1[_i];\n if (!lookupTable.isAllowlisted(request, rule)) {\n cosmeticResult.append(rule, request);\n }\n }\n }\n };\n return CosmeticEngine;\n}());\n\n/**\n * Engine represents the filtering engine with all the loaded rules\n */\nvar Engine = /** @class */ (function () {\n /**\n * Creates an instance of an Engine\n * Parses the filtering rules and creates a filtering engine of them\n *\n * @param ruleStorage storage\n * @param skipStorageScan create an instance without storage scanning\n * @throws\n */\n function Engine(ruleStorage, skipStorageScan) {\n if (skipStorageScan === void 0) { skipStorageScan = false; }\n this.ruleStorage = ruleStorage;\n this.networkEngine = new NetworkEngine(ruleStorage, skipStorageScan);\n this.cosmeticEngine = new CosmeticEngine(ruleStorage, skipStorageScan);\n this.resultCache = new lru.exports.LRUMap(Engine.REQUEST_CACHE_SIZE);\n }\n /**\n * Loads rules to engine\n */\n Engine.prototype.loadRules = function () {\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.NetworkRules | ScannerType.CosmeticRules);\n while (scanner.scan()) {\n this.addRule(scanner.getRule());\n }\n };\n /**\n * Async loads rules to engine\n *\n * @param chunkSize size of rules chunk to load at a time\n */\n Engine.prototype.loadRulesAsync = function (chunkSize) {\n return __awaiter(this, void 0, void 0, function () {\n var scanner, counter;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.NetworkRules | ScannerType.CosmeticRules);\n counter = 0;\n _a.label = 1;\n case 1:\n if (!scanner.scan()) return [3 /*break*/, 4];\n counter += 1;\n if (!(counter >= chunkSize)) return [3 /*break*/, 3];\n counter = 0;\n /**\n * In some cases UI thread becomes blocked while adding rules to engine,\n * that't why we create filter rules using chunks of the specified length\n * Rules creation is rather slow operation so we should\n * use setTimeout calls to give UI thread some time.\n */\n return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1); })];\n case 2:\n /**\n * In some cases UI thread becomes blocked while adding rules to engine,\n * that't why we create filter rules using chunks of the specified length\n * Rules creation is rather slow operation so we should\n * use setTimeout calls to give UI thread some time.\n */\n _a.sent();\n _a.label = 3;\n case 3:\n this.addRule(scanner.getRule());\n return [3 /*break*/, 1];\n case 4: return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Matches the specified request against the filtering engine and returns the matching result.\n *\n * @param request - request to check\n * @param frameRule - source document rule or null\n * @return matching result\n */\n Engine.prototype.matchRequest = function (request, frameRule) {\n if (frameRule === void 0) { frameRule = null; }\n var cacheKey = \"\".concat(request.url, \"#\").concat(request.sourceHostname, \"#\").concat(request.requestType);\n /**\n * Add frame url text to the key to avoid caching,\n * because allowlist rules are not stored in the engine\n * AG-12694\n */\n if (frameRule) {\n cacheKey += \"#\".concat(frameRule.getText());\n }\n var res = this.resultCache.get(cacheKey);\n if (res) {\n return res;\n }\n var networkRules = this.networkEngine.matchAll(request);\n var result = new MatchingResult(networkRules, frameRule);\n this.resultCache.set(cacheKey, result);\n return result;\n };\n /**\n * Matches current frame and returns document-level allowlist rule if found.\n *\n * @param frameUrl\n */\n Engine.prototype.matchFrame = function (frameUrl) {\n var sourceRequest = new Request$1(frameUrl, '', RequestType.Document);\n var sourceRules = this.networkEngine.matchAll(sourceRequest);\n sourceRules = MatchingResult.removeBadfilterRules(sourceRules);\n var result = null;\n sourceRules.forEach(function (r) {\n if (r.isDocumentLevelAllowlistRule()) {\n if (!result || r.isHigherPriority(result)) {\n result = r;\n }\n }\n });\n return result;\n };\n /**\n * Gets cosmetic result for the specified hostname and cosmetic options\n *\n * @param request host to check\n * @param option mask of enabled cosmetic types\n * @return cosmetic result\n */\n Engine.prototype.getCosmeticResult = function (request, option) {\n return this.cosmeticEngine.match(request, option);\n };\n /**\n * Gets rules count\n */\n Engine.prototype.getRulesCount = function () {\n return this.networkEngine.rulesCount + this.cosmeticEngine.rulesCount;\n };\n /**\n * Adds rules to engines\n *\n * @param indexedRule\n */\n Engine.prototype.addRule = function (indexedRule) {\n if (indexedRule) {\n if (indexedRule.rule instanceof NetworkRule) {\n this.networkEngine.addRule(indexedRule.rule, indexedRule.index);\n }\n else if (indexedRule.rule instanceof CosmeticRule) {\n this.cosmeticEngine.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n };\n /**\n * Request's cache size\n * Used as both source rules and others limit.\n * The value is based on benchmark runs.\n */\n Engine.REQUEST_CACHE_SIZE = 500;\n return Engine;\n}());\n\n/**\n * Rule with index\n */\nvar IndexedRule = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param rule\n * @param index\n */\n function IndexedRule(rule, index) {\n this.rule = rule;\n this.index = index;\n }\n return IndexedRule;\n}());\n/**\n * Rule with storage index\n */\nvar IndexedStorageRule = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param rule\n * @param index\n */\n function IndexedStorageRule(rule, index) {\n this.rule = rule;\n this.index = index;\n }\n return IndexedStorageRule;\n}());\n\n/**\n * Export logger implementation\n */\nvar logger = console;\n/**\n * Set logger implementation\n *\n * @param loggerImpl\n */\nfunction setLogger(loggerImpl) {\n logger = loggerImpl;\n}\n\n/**\n * Rule builder class\n */\nvar RuleFactory = /** @class */ (function () {\n function RuleFactory() {\n }\n /**\n * Creates rule of suitable class from text string\n * It returns null if the line is empty or if it is a comment\n *\n * @param text rule string\n * @param filterListId list id\n * @param ignoreNetwork do not create network rules\n * @param ignoreCosmetic do not create cosmetic rules\n * @param ignoreHost do not create host rules\n * @return IRule object or null\n */\n RuleFactory.createRule = function (text, filterListId, ignoreNetwork, ignoreCosmetic, ignoreHost) {\n if (ignoreNetwork === void 0) { ignoreNetwork = false; }\n if (ignoreCosmetic === void 0) { ignoreCosmetic = false; }\n if (ignoreHost === void 0) { ignoreHost = true; }\n if (!text || RuleFactory.isComment(text)) {\n return null;\n }\n if (RuleFactory.isShort(text)) {\n logger.info(\"The rule is too short: \".concat(text));\n }\n var line = text.trim();\n try {\n if (RuleFactory.isCosmetic(line)) {\n if (ignoreCosmetic) {\n return null;\n }\n return new CosmeticRule(line, filterListId);\n }\n if (!ignoreHost) {\n var hostRule = RuleFactory.createHostRule(line, filterListId);\n if (hostRule) {\n return hostRule;\n }\n }\n if (!ignoreNetwork) {\n return new NetworkRule(line, filterListId);\n }\n }\n catch (e) {\n // TODO: Throw error\n logger.info(\"Error: \\\"\".concat(e.message, \"\\\" in the rule: \\\"\").concat(line, \"\\\"\"));\n }\n return null;\n };\n /**\n * Creates host rule from text\n *\n * @param ruleText\n * @param filterListId\n */\n RuleFactory.createHostRule = function (ruleText, filterListId) {\n var rule = new HostRule(ruleText, filterListId);\n return rule.isInvalid() ? null : rule;\n };\n /**\n * Checks if rule is short\n */\n RuleFactory.isShort = function (rule) {\n if (!rule) {\n return true;\n }\n return !!(rule && rule.length <= 3);\n };\n /**\n * Checks if the rule is cosmetic or not.\n * @param ruleText - rule text to check.\n */\n RuleFactory.isCosmetic = function (ruleText) {\n var marker = findCosmeticRuleMarker(ruleText);\n return marker[0] !== -1;\n };\n /**\n * If text is comment\n *\n * @param text\n */\n RuleFactory.isComment = function (text) {\n if (text.charAt(0) === '!') {\n return true;\n }\n if (text.charAt(0) === '#') {\n if (text.length === 1) {\n return true;\n }\n // Now we should check that this is not a cosmetic rule\n return !RuleFactory.isCosmetic(text);\n }\n return false;\n };\n return RuleFactory;\n}());\n\n/**\n * Rule scanner implements an interface for reading filtering rules.\n */\nvar RuleScanner = /** @class */ (function () {\n /**\n * NewRuleScanner returns a new RuleScanner to read from r.\n *\n * @param reader source of the filtering rules\n * @param listId filter list ID\n * @param configuration config object\n */\n function RuleScanner(reader, listId, configuration) {\n /**\n * Current rule\n */\n this.currentRule = null;\n /**\n * Index of the beginning of the current rule\n */\n this.currentRuleIndex = 0;\n /**\n * Current position in the reader\n */\n this.currentPos = 0;\n this.reader = reader;\n this.listId = listId;\n this.ignoreCosmetic = !!configuration.ignoreCosmetic\n || ((configuration.scannerType & ScannerType.CosmeticRules) !== ScannerType.CosmeticRules);\n this.ignoreNetwork = (configuration.scannerType & ScannerType.NetworkRules) !== ScannerType.NetworkRules;\n this.ignoreHost = (configuration.scannerType & ScannerType.HostRules) !== ScannerType.HostRules;\n this.ignoreJS = !!configuration.ignoreJS;\n this.ignoreUnsafe = !!configuration.ignoreUnsafe;\n }\n /**\n * Scan advances the RuleScanner to the next rule, which will then be available\n * through the Rule method.\n *\n * @return false when the scan stops, either by\n * reaching the end of the input or an error.\n */\n RuleScanner.prototype.scan = function () {\n while (true) {\n var lineIndex = this.currentPos;\n var line = this.readNextLine();\n if (line === null) {\n return false;\n }\n if (line) {\n var rule = RuleFactory.createRule(line, this.listId, this.ignoreNetwork, this.ignoreCosmetic, this.ignoreHost);\n if (rule && !this.isIgnored(rule)) {\n this.currentRule = rule;\n this.currentRuleIndex = lineIndex;\n return true;\n }\n }\n }\n };\n /**\n * @return the most recent rule generated by a call to Scan, and the index of this rule's text.\n */\n RuleScanner.prototype.getRule = function () {\n if (this.currentRule) {\n return new IndexedRule(this.currentRule, this.currentRuleIndex);\n }\n return null;\n };\n /**\n * Reads the next line and returns it\n *\n * @return next line string or null\n */\n RuleScanner.prototype.readNextLine = function () {\n var line = this.reader.readLine();\n if (line != null) {\n this.currentPos += line.length + 1;\n return line.trim();\n }\n return null;\n };\n /**\n * Checks if the rule should be ignored by this scanner\n *\n * @param rule to check\n * @return is rule ignored\n */\n RuleScanner.prototype.isIgnored = function (rule) {\n if (!this.ignoreCosmetic && !this.ignoreJS && !this.ignoreUnsafe) {\n return false;\n }\n if (rule instanceof CosmeticRule) {\n if (this.ignoreCosmetic) {\n return true;\n }\n // Ignore JS type rules\n // TODO: in the future we may allow CSS rules and Scriptlets (except for \"trusted\" scriptlets)\n return (this.ignoreJS && rule.getType() === CosmeticRuleType.Js);\n }\n if (this.ignoreUnsafe) {\n if (rule instanceof NetworkRule) {\n if (rule.getAdvancedModifier() && (rule.getAdvancedModifier() instanceof RemoveHeaderModifier)) {\n return true;\n }\n }\n }\n return false;\n };\n return RuleScanner;\n}());\n\n/**\n * Reads string line by line\n */\nvar StringLineReader = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param text\n */\n function StringLineReader(text) {\n /**\n * Current position\n */\n this.currentIndex = 0;\n this.text = text;\n }\n /**\n * Reads next line\n *\n * @return text or null on end\n */\n StringLineReader.prototype.readLine = function () {\n if (this.currentIndex === -1) {\n return null;\n }\n var startIndex = this.currentIndex;\n this.currentIndex = this.text.indexOf('\\n', startIndex);\n if (this.currentIndex === -1) {\n return this.text.substring(startIndex);\n }\n this.currentIndex += 1;\n // - 1 in order to exclude EOL\n return this.text.substring(startIndex, this.currentIndex - 1);\n };\n return StringLineReader;\n}());\n\n/**\n * List identifier max value.\n * We use \"number\" type for storage indexes, so we have some limits for list identifiers,\n * We line number for rule index, so if we save 11 ranks for rules, then we have 6 ranks left for list ids.\n * Check RuleStorageScanner class for more info.\n */\nvar LIST_ID_MAX_VALUE = Math.pow(10, 6);\n/**\n * StringRuleList represents a string-based rule list\n */\nvar StringRuleList = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param listId\n * @param ruleText\n * @param ignoreCosmetic (Optional) default false\n * @param ignoreJS (Optional) default false\n * @param ignoreUnsafe (Optional) default false\n */\n function StringRuleList(listId, ruleText, ignoreCosmetic, ignoreJS, ignoreUnsafe) {\n if (listId >= LIST_ID_MAX_VALUE) {\n throw new Error(\"Invalid list identifier, it must be less than \".concat(LIST_ID_MAX_VALUE));\n }\n this.id = listId;\n this.rulesText = ruleText;\n this.ignoreCosmetic = !!ignoreCosmetic;\n this.ignoreJS = !!ignoreJS;\n this.ignoreUnsafe = !!ignoreUnsafe;\n }\n /**\n * Close does nothing as here's nothing to close in the StringRuleList\n */\n // eslint-disable-next-line class-methods-use-this\n StringRuleList.prototype.close = function () {\n // Empty\n };\n /**\n * @return the rule list identifier\n */\n StringRuleList.prototype.getId = function () {\n return this.id;\n };\n /**\n * Creates a new rules scanner that reads the list contents\n * @return scanner object\n */\n StringRuleList.prototype.newScanner = function (scannerType) {\n var reader = new StringLineReader(this.rulesText);\n return new RuleScanner(reader, this.id, {\n scannerType: scannerType,\n ignoreCosmetic: this.ignoreCosmetic,\n ignoreJS: this.ignoreJS,\n ignoreUnsafe: this.ignoreUnsafe,\n });\n };\n /**\n * Finds rule text by its index.\n * If there's no rule by that index or rule is invalid, it will return null\n *\n * @param ruleIdx\n * @return rule text or null\n */\n StringRuleList.prototype.retrieveRuleText = function (ruleIdx) {\n if (ruleIdx < 0 || ruleIdx >= this.rulesText.length) {\n return null;\n }\n var endOfLine = this.rulesText.indexOf('\\n', ruleIdx);\n if (endOfLine === -1) {\n endOfLine = this.rulesText.length;\n }\n var line = this.rulesText.substring(ruleIdx, endOfLine).trim();\n if (!line) {\n return null;\n }\n return line;\n };\n return StringRuleList;\n}());\n\n/**\n * RuleStorageScanner scans multiple RuleScanner instances\n * The rule index is built from the rule index in the list + the list ID\n * In the index number we consider decimal part as listId and integer part as ruleId\n*/\nvar RuleStorageScanner = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param scanners\n */\n function RuleStorageScanner(scanners) {\n /**\n * Current scanner\n */\n this.currentScanner = null;\n /**\n * Index of the current scanner\n */\n this.currentScannerIdx = -1;\n this.scanners = scanners;\n }\n /**\n * Scan advances the RuleStorageScanner to the next rule, which will then be available\n * through the Rule method. It returns false when the scan stops, either by\n * reaching the end of the input or an error.\n *\n * @return true if there is some result\n */\n RuleStorageScanner.prototype.scan = function () {\n if (this.scanners.length === 0) {\n return false;\n }\n if (!this.currentScanner) {\n this.currentScannerIdx = 0;\n this.currentScanner = this.scanners[this.currentScannerIdx];\n }\n while (true) {\n if (this.currentScanner.scan()) {\n return true;\n }\n // Take the next scanner or just return false if there's nothing more\n if (this.currentScannerIdx === (this.scanners.length - 1)) {\n return false;\n }\n this.currentScannerIdx += 1;\n this.currentScanner = this.scanners[this.currentScannerIdx];\n }\n };\n /**\n * Rule returns the most recent rule generated by a call to Scan, and the index of this rule.\n * See ruleListIdxToStorageIdx for more information on what this index is.\n */\n RuleStorageScanner.prototype.getRule = function () {\n if (!this.currentScanner) {\n return null;\n }\n var rule = this.currentScanner.getRule();\n if (!rule) {\n return null;\n }\n var index = RuleStorageScanner.ruleListIdxToStorageIdx(rule.rule.getFilterListId(), rule.index);\n return new IndexedStorageRule(rule.rule, index);\n };\n /**\n * ruleListIdxToStorageIdx converts pair of listID and rule list index\n * to \"storage index\" number\n *\n * @param listId\n * @param ruleIdx\n */\n RuleStorageScanner.ruleListIdxToStorageIdx = function (listId, ruleIdx) {\n return listId / LIST_ID_MAX_VALUE + ruleIdx;\n };\n /**\n * Converts the \"storage index\" to two integers:\n * listID -- rule list identifier\n * ruleIdx -- index of the rule in the list\n *\n * @param storageIdx\n * @return [listId, ruleIdx]\n */\n RuleStorageScanner.storageIdxToRuleListIdx = function (storageIdx) {\n var listId = Math.round((storageIdx % 1) * LIST_ID_MAX_VALUE);\n var ruleIdx = Math.trunc(storageIdx);\n return [listId, ruleIdx];\n };\n return RuleStorageScanner;\n}());\n\n/**\n * Rule list's cache\n */\nvar ListCache = /** @class */ (function () {\n /**\n * Constructor\n */\n function ListCache() {\n this.cache = new Map();\n }\n /**\n * @param key\n * @return rule for specified key\n */\n ListCache.prototype.get = function (key) {\n return this.cache.get(key);\n };\n /**\n * Sets rule for specified key\n *\n * @param key\n * @param rule\n */\n ListCache.prototype.set = function (key, rule) {\n this.cache.set(key, rule);\n };\n return ListCache;\n}());\n\n/**\n * RuleStorage is an abstraction that combines several rule lists\n * It can be scanned using RuleStorageScanner, and also it allows\n * retrieving rules by its index\n\n * The idea is to keep rules in a serialized format (even original format in the case of FileRuleList)\n * and create them in a lazy manner only when we really need them. When the filtering engine is\n * being initialized, we need to scan the rule lists once in order to fill up the lookup tables.\n * We use rule indexes as a unique rule identifier instead of the rule itself.\n * The rule is created (see RetrieveRule) only when there's a chance that it's needed.\n\n * Rule index is an int64 value that actually consists of two int32 values:\n * One is the rule list identifier, and the second is the index of the rule inside of that list.\n*/\nvar RuleStorage = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param lists rule lists array\n *\n * @throws on duplicate lists\n */\n function RuleStorage(lists) {\n var _this = this;\n this.lists = lists;\n this.listsMap = new Map();\n this.cache = new Map();\n this.lists.forEach(function (list) {\n var filterListId = list.getId();\n if (_this.listsMap.get(filterListId)) {\n throw new Error(\"Duplicate list ID: \".concat(filterListId));\n }\n _this.listsMap.set(filterListId, list);\n });\n }\n /**\n * Creates a new instance of RuleStorageScanner.\n * It can be used to read and parse all the storage contents.\n *\n * @return scanner instance\n */\n RuleStorage.prototype.createRuleStorageScanner = function (scannerType) {\n var scanners = this.lists.map(function (list) { return list.newScanner(scannerType); });\n return new RuleStorageScanner(scanners);\n };\n /**\n * Looks for the filtering rule in this storage\n *\n * @param storageIdx the lookup index that you can get from the rule storage scanner\n * @param ignoreHost rules could be retrieved as host rules\n */\n RuleStorage.prototype.retrieveRule = function (storageIdx, ignoreHost) {\n if (ignoreHost === void 0) { ignoreHost = true; }\n var _a = RuleStorageScanner.storageIdxToRuleListIdx(storageIdx), listId = _a[0], ruleIdx = _a[1];\n var rule = this.getFromCache(listId, ruleIdx);\n if (rule) {\n return rule;\n }\n var list = this.listsMap.get(listId);\n if (!list) {\n // List doesn't exist\n return null;\n }\n var ruleText = list.retrieveRuleText(ruleIdx);\n if (!ruleText) {\n return null;\n }\n var result = RuleFactory.createRule(ruleText, listId, false, false, ignoreHost);\n if (result) {\n this.saveToCache(listId, ruleIdx, result);\n }\n return result;\n };\n /**\n * RetrieveNetworkRule is a helper method that retrieves a network rule from the storage\n *\n * @param storageIdx\n * @return the rule or nil in any other case (not found or error)\n */\n RuleStorage.prototype.retrieveNetworkRule = function (storageIdx) {\n var rule = this.retrieveRule(storageIdx);\n if (!rule) {\n return null;\n }\n if (rule instanceof NetworkRule) {\n return rule;\n }\n return null;\n };\n /**\n * RetrieveHostRule is a helper method that retrieves a host rule from the storage\n *\n * @param storageIdx\n * @return the rule or nil in any other case (not found or error)\n */\n RuleStorage.prototype.retrieveHostRule = function (storageIdx) {\n var rule = this.retrieveRule(storageIdx, false);\n if (!rule) {\n return null;\n }\n if (rule instanceof HostRule) {\n return rule;\n }\n return null;\n };\n /**\n * Saves rule to cache\n *\n * @param listId\n * @param ruleIdx\n * @param rule\n */\n RuleStorage.prototype.saveToCache = function (listId, ruleIdx, rule) {\n var listCache = this.cache.get(listId);\n if (!listCache) {\n listCache = new ListCache();\n this.cache.set(listId, listCache);\n }\n listCache.set(ruleIdx, rule);\n };\n /**\n * Retrieves rule form cache\n *\n * @param listId\n * @param ruleIdx\n */\n RuleStorage.prototype.getFromCache = function (listId, ruleIdx) {\n var listCache = this.cache.get(listId);\n if (!listCache) {\n return undefined;\n }\n return listCache.get(ruleIdx);\n };\n return RuleStorage;\n}());\n\n/**\n * Rule converter class\n */\nvar RuleConverter = /** @class */ (function () {\n function RuleConverter() {\n }\n /**\n * Converts rules text\n *\n * @param rulesText\n * @param conversionOptions\n */\n RuleConverter.convertRules = function (rulesText, conversionOptions) {\n if (conversionOptions === void 0) { conversionOptions = {}; }\n var result = [];\n var lines = rulesText.split(/\\r?\\n/);\n for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {\n var line = lines_1[_i];\n try {\n result.push.apply(result, RuleConverter.convertRule(line, conversionOptions));\n }\n catch (e) {\n logger.warn(e.message);\n }\n }\n return result.join('\\n');\n };\n /**\n * TODO for more efficient conversion build AST. And then use the modified AST for creating a\n * rule object.\n * Convert external scriptlet rule to AdGuard scriptlet syntax\n *\n * @param rawRule\n * @param conversionOptions\n */\n RuleConverter.convertRule = function (rawRule, conversionOptions) {\n if (conversionOptions === void 0) { conversionOptions = {}; }\n var rule = rawRule.trim();\n if (rule.startsWith(SimpleRegex.MASK_COMMENT) || rule === '') {\n return [rule];\n }\n var comment = RuleConverter.convertUboComments(rule);\n if (comment) {\n return [comment];\n }\n var converted = rule;\n if (RuleFactory.isCosmetic(rule)) {\n converted = RuleConverter.convertCssInjection(converted);\n converted = RuleConverter.convertPseudoElements(converted);\n converted = RuleConverter.convertRemoveRule(converted);\n converted = RuleConverter.convertScriptHasTextToScriptTagContent(converted);\n converted = RuleConverter.convertUboMatchesPathRule(converted);\n // special case for ubo response header rule, it looks like cosmetic rule, but is converted to network rule\n var removeHeaderRule = RuleConverter.convertUboResponseHeaderRule(converted);\n if (removeHeaderRule) {\n return [removeHeaderRule];\n }\n }\n else {\n var domainAndOptions = RuleConverter.splitIntoDomainAndOptions(converted);\n var domain = domainAndOptions[0];\n var optionsParts = domainAndOptions[1];\n if (optionsParts) {\n optionsParts = RuleConverter.replaceOptions(optionsParts);\n var ruleWithConvertedOptions = RuleConverter.convertOptions(domain, optionsParts, conversionOptions);\n if (ruleWithConvertedOptions) {\n return ruleWithConvertedOptions;\n }\n converted = \"\".concat(domain, \"$\").concat(optionsParts.join(','));\n }\n }\n var scriptletRules = scriptlets_umd.exports.convertScriptletToAdg(converted);\n // TODO Check if isValidScriptletRule call is needed here, looks like convertScriptletToAdg\n // should already return a valid scriptlet.\n if (scriptletRules && scriptletRules.every(function (x) { return RuleConverter.isValidScriptletRule(x); })) {\n return scriptletRules;\n }\n var adgRedirectRule = RuleConverter.convertUboAndAbpRedirectsToAdg(converted);\n if (adgRedirectRule) {\n return [adgRedirectRule];\n }\n if (converted.includes(RuleConverter.UBO_HTML_RULE_MASK)) {\n throw new SyntaxError(\"Invalid UBO script rule: \".concat(converted));\n }\n return [converted];\n };\n /**\n * Validates AdGuard syntax scriptlet rule.\n *\n * @param ruleText AdGuard scriptlet rule.\n */\n RuleConverter.isValidScriptletRule = function (ruleText) {\n try {\n // checks whether the ADG scriptlet rule name is valid\n return scriptlets_umd.exports.isValidScriptletRule(ruleText);\n }\n catch (e) {\n return false;\n }\n };\n /**\n * Converts UBO Script rule\n *\n * @param {string} ruleText rule text\n * @returns {string} converted rule\n */\n RuleConverter.convertScriptHasTextToScriptTagContent = function (ruleText) {\n if (ruleText.startsWith(SimpleRegex.MASK_COMMENT)\n || !RuleConverter.SCRIPT_HAS_TEXT_REGEX.test(ruleText)\n || RuleConverter.CSS_COMBINATORS_REGEX.test(ruleText)) {\n return ruleText;\n }\n var convertedRuleText = ruleText;\n var attributeStrings = [];\n // Cut all attributes substrings from rule text into array\n // https://github.com/AdguardTeam/tsurlfilter/issues/55\n if (RuleConverter.ATTRIBUTE_REGEX.test(ruleText)) {\n var globalAttributeRegExp = new RegExp(RuleConverter.ATTRIBUTE_REGEX, 'gi');\n attributeStrings = ruleText.match(globalAttributeRegExp);\n attributeStrings === null || attributeStrings === void 0 ? void 0 : attributeStrings.forEach(function (attrStr) {\n convertedRuleText = convertedRuleText.replace(attrStr, '');\n });\n }\n // Convert base of the rule ##^script:has-text(text) to $$script[tag-content='text']\n convertedRuleText = \"\".concat(convertedRuleText\n .replace(RuleConverter.SCRIPT_HAS_TEXT_REGEX_SHORT, RuleConverter.SCRIPT_HAS_TEXT_REPLACEMENT)\n .slice(0, -1), \"\\\"][max-length=\\\"262144\\\"]\");\n // Escape double quotes inside tag-content, like it is required by AdGuard syntax\n // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#tag-content\n convertedRuleText = convertedRuleText.replace(RuleConverter.TAG_CONTENT_VALUE_REGEX, function (match, group) {\n return \"[tag-content=\\\"\".concat(group.replace(/\"/g, '\"\"'), \"\\\"]\");\n });\n // Return attributes if there were any\n attributeStrings === null || attributeStrings === void 0 ? void 0 : attributeStrings.forEach(function (attrStr) {\n convertedRuleText += attrStr;\n });\n return convertedRuleText;\n };\n /**\n * Converts UBO and ABP redirect rules to AdGuard redirect rules\n * @param rule\n * @return {string} convertedRule\n */\n RuleConverter.convertUboAndAbpRedirectsToAdg = function (rule) {\n var redirects = scriptlets_umd.exports.redirects;\n if (redirects.isUboRedirectCompatibleWithAdg(rule) || redirects.isAbpRedirectCompatibleWithAdg(rule)) {\n return redirects.convertRedirectToAdg(rule);\n }\n return null;\n };\n /**\n * Converts the rule options according to the conversion map and handles special cases.\n * @param domainPart - The domain part of the rule.\n * @param optionsParts - The options part of the rule as an array of strings.\n * @param conversionOptions - Optional conversion options object.\n * @private\n */\n RuleConverter.convertOptions = function (domainPart, optionsParts, conversionOptions) {\n if (conversionOptions === void 0) { conversionOptions = {}; }\n var NAME_VALUE_SPLITTER = '=';\n var areOptionsConverted = false;\n var updatedOptionsParts = optionsParts.map(function (optionsPart) {\n var convertedOptionsPart = RuleConverter.OPTIONS_CONVERSION_MAP.get(optionsPart);\n // If option is $mp4, then it should go with $media option together\n if (optionsPart === 'mp4') {\n // Check if media is not already among options\n if (!optionsParts.some(function (option) { return option === 'media'; })) {\n convertedOptionsPart = \"\".concat(convertedOptionsPart, \",media\");\n }\n }\n if (convertedOptionsPart) {\n areOptionsConverted = true;\n return convertedOptionsPart;\n }\n return optionsPart;\n });\n // If options have more than one csp modifiers, we merge them into one;\n var cspParts = updatedOptionsParts.filter(function (optionsPart) { return optionsPart.startsWith('csp'); });\n if (cspParts.length > 1) {\n var allButCsp = updatedOptionsParts.filter(function (optionsPart) { return !optionsPart.startsWith('csp'); });\n var cspValues = cspParts.map(function (cspPart) { return cspPart.split(NAME_VALUE_SPLITTER)[1]; });\n var updatedCspOption = \"csp\".concat(NAME_VALUE_SPLITTER).concat(cspValues.join('; '));\n updatedOptionsParts = allButCsp.concat(updatedCspOption);\n }\n // Options without all modifier\n var hasAllOption = updatedOptionsParts.indexOf('all') > -1;\n if (hasAllOption && !conversionOptions.ignoreAllModifier) {\n // $all modifier should be converted in 4 rules:\n // ||example.org^$document,popup\n // ||example.org^\n // ||example.org^$inline-font\n // ||example.org^$inline-script\n var allOptionReplacers = [\n ['document', 'popup'],\n ['inline-script'],\n ['inline-font'],\n [''],\n ];\n return allOptionReplacers.map(function (replacers) {\n // Remove replacer and all option from the list\n var optionsButAllAndReplacer = updatedOptionsParts\n .filter(function (option) { return !(replacers.includes(option) || option === 'all'); });\n // Try get converted values, used for INLINE_SCRIPT_OPTION, INLINE_FONT_OPTION\n var convertedReplacers = replacers.map(function (replacer) {\n return RuleConverter.OPTIONS_CONVERSION_MAP.get(replacer) || replacer;\n });\n // Add replacer to the list of options\n var updatedOptionsString = __spreadArray(__spreadArray([], convertedReplacers, true), optionsButAllAndReplacer, true).filter(function (entity) { return entity; })\n .join(',');\n // Create a new rule\n return updatedOptionsString.length < 1 ? domainPart : \"\".concat(domainPart, \"$\").concat(updatedOptionsString);\n });\n }\n if (areOptionsConverted) {\n var updatedOptions = updatedOptionsParts.join(',');\n return [\"\".concat(domainPart, \"$\").concat(updatedOptions)];\n }\n return null;\n };\n /**\n * Converts ubo syntax comments (rules starting with #)\n * Note: It's not possible to detect 100% cause rules starting with ## are valid elemhide rules\n *\n * @param rule\n * @return {string}\n */\n RuleConverter.convertUboComments = function (rule) {\n if (rule.startsWith('# ') || rule.startsWith('####')) {\n return \"! \".concat(rule);\n }\n return null;\n };\n /**\n * Executes rule css conversion\n *\n * @param rule\n * @param parts\n * @param ruleMark\n */\n RuleConverter.executeConversion = function (rule, parts, ruleMark) {\n var result = rule;\n var domain = parts[0];\n if (domain) {\n var rulePart = parts[1];\n if (rulePart.match(RuleConverter.CSS_RULE_REPLACE_PATTERN)) {\n var groups = RuleConverter.CSS_RULE_REPLACE_PATTERN.exec(rulePart);\n if (groups != null) {\n if (groups.length === 3) {\n result = domain + ruleMark;\n result += \"\".concat(groups[1], \" { \").concat(groups[2], \" }\");\n }\n }\n }\n }\n return result;\n };\n /**\n * Adds colon to the pseudo elements written with one colon (:before, :after);\n * e.g.\n * \"hotline.ua##.reset-scroll:before\" -> \"hotline.ua##.reset-scroll::before\"\n * @param rule\n * @private\n */\n RuleConverter.convertPseudoElements = function (rule) {\n var BEFORE = 'before';\n var AFTER = 'after';\n var SINGLE_COLON = ':';\n // does not have parts to convert\n if (!(rule.includes(SINGLE_COLON + BEFORE) || rule.includes(SINGLE_COLON + AFTER))) {\n return rule;\n }\n // not an css rule\n if (!(rule.includes(RuleConverter.MASK_ELEMENT_HIDING)\n || rule.includes(RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION)\n || rule.includes(RuleConverter.MASK_CSS)\n || rule.includes(RuleConverter.MASK_CSS_EXCEPTION))) {\n return rule;\n }\n var modifiedRule = '';\n for (var i = 0; i < rule.length; i += 1) {\n if (rule[i] !== SINGLE_COLON) {\n modifiedRule += rule[i];\n continue;\n }\n if ((rule.indexOf(BEFORE, i) === i + 1\n || rule.indexOf(AFTER, i) === i + 1)\n && rule[i - 1] !== SINGLE_COLON) {\n modifiedRule += SINGLE_COLON;\n modifiedRule += rule[i];\n continue;\n }\n modifiedRule += rule[i];\n }\n return modifiedRule;\n };\n /**\n * Converts CSS injection\n * example.com##h1:style(background-color: blue !important)\n * into\n * example.com#$#h1 { background-color: blue !important }\n *

\n * OR (for exceptions):\n * example.com#@#h1:style(background-color: blue !important)\n * into\n * example.com#@$#h1 { background-color: blue !important }\n *\n * @param {string} rule\n * @return {string} convertedRule\n */\n RuleConverter.convertCssInjection = function (rule) {\n if (rule.includes(':style')) {\n var parts = void 0;\n var resultMask = void 0;\n var resultRule = rule;\n var isExtendedCss = false;\n for (var i = 0; i < EXT_CSS_PSEUDO_INDICATORS.length; i += 1) {\n isExtendedCss = rule.indexOf(EXT_CSS_PSEUDO_INDICATORS[i]) !== -1;\n if (isExtendedCss) {\n break;\n }\n }\n if (rule.includes(RuleConverter.MASK_CSS_EXTENDED_CSS_RULE)) {\n parts = rule.split(RuleConverter.MASK_CSS_EXTENDED_CSS_RULE, 2);\n resultMask = RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE;\n }\n else if (rule.includes(RuleConverter.MASK_CSS_EXCEPTION_EXTENDED_CSS_RULE)) {\n parts = rule.split(RuleConverter.MASK_CSS_EXCEPTION_EXTENDED_CSS_RULE, 2);\n resultMask = RuleConverter.MASK_CSS_EXCEPTION_INJECT_EXTENDED_CSS_RULE;\n // firstly we check for exception rule in order not to confuse with id selectors\n // e.g. yourconroenews.com#@##siteNav:style(transform: none !important;)\n }\n else if (rule.includes(RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION)) {\n parts = rule.split(RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION, 2);\n if (isExtendedCss) {\n resultMask = RuleConverter.MASK_CSS_EXCEPTION_INJECT_EXTENDED_CSS_RULE;\n }\n else {\n resultMask = RuleConverter.MASK_CSS_EXCEPTION;\n }\n }\n else if (rule.includes(RuleConverter.MASK_ELEMENT_HIDING)) {\n parts = rule.split(RuleConverter.MASK_ELEMENT_HIDING, 2);\n if (isExtendedCss) {\n resultMask = RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE;\n }\n else {\n resultMask = RuleConverter.MASK_CSS;\n }\n }\n if (parts && resultMask) {\n resultRule = RuleConverter.executeConversion(rule, parts, resultMask);\n }\n return resultRule;\n }\n return rule;\n };\n /**\n * Converts ':remove()' rule to AdGuard extended css rule\n * example.com###banner:remove() -> example.com#$?##banner { remove: true; }\n * @param {string} rule\n * @return {string} rule or converted rule\n */\n RuleConverter.convertRemoveRule = function (rule) {\n // if rule is already extended css, do not convert it\n if (rule.includes(RuleConverter.MASK_CSS_EXTENDED_CSS_RULE)) {\n return rule;\n }\n if (rule.includes(RuleConverter.MASK_ELEMENT_HIDING) && rule.endsWith(RuleConverter.REMOVE_RULE_PATTERN)) {\n return rule\n .replace(RuleConverter.MASK_ELEMENT_HIDING, RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE)\n .replace(RuleConverter.REMOVE_RULE_PATTERN, RuleConverter.REMOVE_RULE_REPLACER);\n }\n return rule;\n };\n /**\n * Converts '^responseheader()' rule to AdGuard's $removeheader modifier\n * \"ya.ru##^responseheader(header-name)\" -> \"||ya.ru^$removeheader=header-name\"\n *\n * @param {string} ruleText\n * @return {string} ruleText or converted rule\n */\n RuleConverter.convertUboResponseHeaderRule = function (ruleText) {\n if (ruleText.startsWith(SimpleRegex.MASK_COMMENT) || !ruleText.includes(RuleConverter.UBO_RESPONSE_HEADER)) {\n return null;\n }\n if (RuleConverter.UBO_RESPONSE_HEADER_REGEX.test(ruleText)) {\n return \"||\".concat(ruleText.replace(RuleConverter.UBO_RESPONSE_HEADER_REGEX, RuleConverter.UBO_RESPONSE_HEADER_REPLACEMENT)\n .slice(0, -1));\n }\n if (RuleConverter.UBO_RESPONSE_HEADER_EXCEPTION_REGEX.test(ruleText)) {\n return \"@@||\".concat(ruleText.replace(RuleConverter.UBO_RESPONSE_HEADER_EXCEPTION_REGEX, RuleConverter.UBO_RESPONSE_HEADER_REPLACEMENT).slice(0, -1));\n }\n return ruleText;\n };\n /**\n * Converts cosmetic 'matches-path()' rule to AdGuard's $path modifier\n * \"ya.ru##:matches-path(/page) p\" -> \"[$path=/page]ya.ru##p\"\n *\n * @param {string} ruleText\n * @return {string} ruleText or converted rule\n */\n RuleConverter.convertUboMatchesPathRule = function (ruleText) {\n if (ruleText.startsWith(SimpleRegex.MASK_COMMENT)) {\n return ruleText;\n }\n var _a = findCosmeticRuleMarker(ruleText), markerIndex = _a[0], marker = _a[1];\n if (!marker) {\n return ruleText;\n }\n var expressionStartIndex = markerIndex + marker.length;\n var matchesPathStartIndex = ruleText.indexOf(RuleConverter.UBO_MATCHES_PATH, expressionStartIndex);\n if (matchesPathStartIndex === -1) {\n return ruleText;\n }\n var reversedMatchesPathStartIndex = ruleText.indexOf(RuleConverter.UBO_REVERSED_MATCHES_PATH, expressionStartIndex);\n var isReversed = reversedMatchesPathStartIndex !== -1;\n var pathStartIndex = isReversed\n ? reversedMatchesPathStartIndex + RuleConverter.UBO_REVERSED_MATCHES_PATH.length\n : matchesPathStartIndex + RuleConverter.UBO_MATCHES_PATH.length;\n var matchPathOperatorCloseBracketIndex;\n var openBracketCounter = 1;\n var closeBracketCounter = 0;\n for (var i = pathStartIndex; i < ruleText.length; i += 1) {\n if (ruleText[i - 1] !== '\\\\') {\n if (ruleText[i] === '(') {\n openBracketCounter += 1;\n }\n else if (ruleText[i] === ')') {\n closeBracketCounter += 1;\n if (openBracketCounter === closeBracketCounter) {\n matchPathOperatorCloseBracketIndex = i;\n break;\n }\n }\n }\n }\n if (!matchPathOperatorCloseBracketIndex) {\n return ruleText;\n }\n var domains = ruleText.slice(0, markerIndex);\n var expressionMiddle = ruleText.slice(expressionStartIndex, isReversed ? reversedMatchesPathStartIndex : matchesPathStartIndex);\n var expressionTail = ruleText\n .slice(matchPathOperatorCloseBracketIndex + (isReversed ? 2 : 1))\n .trim();\n var path = ruleText.slice(pathStartIndex, matchPathOperatorCloseBracketIndex);\n var isRegex = SimpleRegex.isRegexPattern(path);\n if (isReversed) {\n path = \"/^((?!\".concat(isRegex ? path.slice(1, path.length - 1) : SimpleRegex.patternToRegexp(path), \").)*$/\");\n }\n if (isRegex) {\n path = SimpleRegex.escapeRegexSpecials(path, SimpleRegex.reModifierPatternSpecialCharacters);\n }\n return \"[$path=\".concat(path, \"]\").concat(domains).concat(marker).concat(expressionMiddle).concat(expressionTail);\n };\n /**\n * Substitutes option aliases in the provided options array with their corresponding aliases.\n *\n * @param optionsParts - An array of options to replace aliases in.\n * @returns - An array of options with aliases replaced.\n */\n RuleConverter.replaceOptions = function (optionsParts) {\n var resultOptions = optionsParts.map(function (option) {\n var _a = option.split('=', 2), optionNameRaw = _a[0], optionValue = _a[1];\n var isNegated = optionNameRaw.startsWith('~');\n var optionName = isNegated ? optionNameRaw.slice(1) : optionNameRaw;\n var convertedOptionName = RuleConverter.OPTIONS_ALIASES[optionName];\n if (!convertedOptionName) {\n return option;\n }\n var negationPrefix = isNegated ? '~' : '';\n return optionValue\n ? \"\".concat(negationPrefix).concat(convertedOptionName, \"=\").concat(optionValue)\n : \"\".concat(negationPrefix).concat(convertedOptionName);\n });\n return resultOptions;\n };\n RuleConverter.CSS_RULE_REPLACE_PATTERN = /(.*):style\\((.*)\\)/g;\n // eslint-disable-next-line max-len\n RuleConverter.SCRIPT_HAS_TEXT_REGEX = /##\\^(script(\\[[{a-z0-9-_.:}]*(=\"[{a-z0-9-_.:}]*\")*\\])*:(has-text|contains))\\((?!\\/.+\\/\\))/i;\n RuleConverter.SCRIPT_HAS_TEXT_REGEX_SHORT = /(##\\^script:(has-text|contains))\\((?!\\/.+\\/\\))/i;\n RuleConverter.TAG_CONTENT_VALUE_REGEX = /\\[tag-content=\"(.*?)\"]/g;\n RuleConverter.ATTRIBUTE_REGEX = /(\\[[{a-z0-9-_.:}]*(=\"[{a-z0-9-_.:}]*\")*\\])/i;\n RuleConverter.CSS_COMBINATORS_REGEX = />|\\+|~/;\n RuleConverter.SCRIPT_HAS_TEXT_REPLACEMENT = '$$$$script[tag-content=\"';\n RuleConverter.UBO_RESPONSE_HEADER = '#^responseheader(';\n RuleConverter.UBO_RESPONSE_HEADER_REGEX = /##\\^responseheader\\((?!\\/.+\\/\\))/i;\n RuleConverter.UBO_RESPONSE_HEADER_EXCEPTION_REGEX = /#@#\\^responseheader\\((?!\\/.+\\/\\))/i;\n RuleConverter.UBO_RESPONSE_HEADER_REPLACEMENT = '^$removeheader=';\n RuleConverter.UBO_MATCHES_PATH = ':matches-path(';\n RuleConverter.UBO_REVERSED_MATCHES_PATH = ':not(:matches-path(';\n /**\n * Rule masks\n */\n RuleConverter.MASK_ELEMENT_HIDING = '##';\n RuleConverter.UBO_HTML_RULE_MASK = '##^';\n RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION = '#@#';\n RuleConverter.MASK_CSS = '#$#';\n RuleConverter.MASK_CSS_EXCEPTION = '#@$#';\n RuleConverter.MASK_CSS_EXTENDED_CSS_RULE = '#?#';\n RuleConverter.MASK_CSS_EXCEPTION_EXTENDED_CSS_RULE = '#@?#';\n RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE = '#$?#';\n RuleConverter.MASK_CSS_EXCEPTION_INJECT_EXTENDED_CSS_RULE = '#@$?#';\n RuleConverter.REMOVE_RULE_PATTERN = ':remove()';\n RuleConverter.REMOVE_RULE_REPLACER = ' { remove: true; }';\n /**\n * Splits the given rule text into domain and options parts using the options delimiter ($).\n * Returns the domain part and an array of options, or null if no options are present.\n * @param ruleText - The rule text to be split.\n */\n RuleConverter.splitIntoDomainAndOptions = function (ruleText) {\n var optionsDelimiterIdx = -1;\n for (var i = ruleText.length - 1; i >= 0; i -= 1) {\n if (ruleText[i] === OPTIONS_DELIMITER\n && ruleText[i + 1] !== '/' // not an end of regex /^bla$/\n && ruleText[i - 1] !== '\\\\' // not a escaped delimiter\n ) {\n optionsDelimiterIdx = i;\n }\n }\n if (optionsDelimiterIdx === -1) {\n return [ruleText, null];\n }\n var domainPart = ruleText.slice(0, optionsDelimiterIdx);\n var optionsPart = ruleText.slice(optionsDelimiterIdx + 1);\n var optionsParts = parseOptionsString(optionsPart);\n return [domainPart, optionsParts];\n };\n /**\n * These option shortcuts will be converted to a more wordy AdGuard options.\n * @private\n */\n RuleConverter.OPTIONS_CONVERSION_MAP = new Map([\n ['empty', 'redirect=nooptext'],\n ['mp4', 'redirect=noopmp4-1s'],\n ['inline-script', \"csp=script-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:\"],\n ['inline-font', \"csp=font-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:\"],\n ]);\n /**\n * Options aliases, used to convert non-AdGuard options to AdGuard options\n */\n RuleConverter.OPTIONS_ALIASES = {\n 'first-party': '~third-party',\n xhr: 'xmlhttprequest',\n css: 'stylesheet',\n frame: 'subdocument',\n queryprune: 'removeparam',\n doc: 'document',\n '1p': '~third-party',\n '3p': 'third-party',\n ghide: 'generichide',\n ehide: 'elemhide',\n shide: 'specifichide',\n };\n return RuleConverter;\n}());\n\n/**\n * Module, which can be used to validate filter rules in other libraries\n */\nvar RuleValidator = /** @class */ (function () {\n function RuleValidator() {\n }\n /**\n * Creates validation result\n * @param valid\n * @param error\n * @private\n */\n RuleValidator.createValidationResult = function (valid, error) {\n if (error) {\n return { valid: valid, error: error };\n }\n return { valid: valid, error: null };\n };\n RuleValidator.validateRegexp = function (pattern, ruleText) {\n if (pattern.startsWith(SimpleRegex.MASK_REGEX_RULE)\n && pattern.endsWith(SimpleRegex.MASK_REGEX_RULE)) {\n try {\n new RegExp(pattern.slice(1, -1));\n }\n catch (e) {\n throw new SyntaxError(\"Rule has invalid regex pattern: \\\"\".concat(ruleText, \"\\\"\"));\n }\n }\n };\n /**\n * Validates raw rule string\n * @param rawRule\n */\n RuleValidator.validate = function (rawRule) {\n var ruleText = rawRule.trim();\n if (!ruleText || RuleFactory.isComment(ruleText)) {\n return RuleValidator.createValidationResult(true);\n }\n if (RuleFactory.isShort(ruleText)) {\n return RuleValidator.createValidationResult(false, \"Rule is too short: \".concat(ruleText));\n }\n try {\n // Validate cosmetic rules\n if (RuleFactory.isCosmetic(ruleText)) {\n new CosmeticRule(ruleText, 0);\n return RuleValidator.createValidationResult(true);\n }\n // Validate network rules\n var rule = new NetworkRule(ruleText, 0);\n RuleValidator.validateRegexp(rule.getPattern(), rule.getText());\n }\n catch (e) {\n var errorMessage = \"Error: \\\"\".concat(e.message, \"\\\" in the rule: \\\"\").concat(ruleText, \"\\\"\");\n return RuleValidator.createValidationResult(false, errorMessage);\n }\n return RuleValidator.createValidationResult(true);\n // TODO validate host rules\n };\n return RuleValidator;\n}());\n\n/**\n * Module with miscellaneous syntax utils exposed in API\n */\nvar RuleSyntaxUtils = /** @class */ (function () {\n function RuleSyntaxUtils() {\n }\n /**\n * Checks if rule can be matched by domain\n * @param ruleText\n * @param domain\n */\n RuleSyntaxUtils.isRuleForDomain = function (ruleText, domain) {\n var rule = RuleFactory.createRule(ruleText, this.DUMMY_FILTER_ID);\n if (!rule) {\n return false;\n }\n return rule.matchesPermittedDomains(domain);\n };\n /**\n * Checks if rule can be matched by url\n * @param ruleText\n * @param url\n */\n RuleSyntaxUtils.isRuleForUrl = function (ruleText, url) {\n var domain = getHostname(url);\n if (!domain) {\n return false;\n }\n return this.isRuleForDomain(ruleText, domain);\n };\n RuleSyntaxUtils.DUMMY_FILTER_ID = 0;\n return RuleSyntaxUtils;\n}());\n\nexport { CompatibilityTypes, CookieModifier, CosmeticOption, CosmeticResult, CosmeticRule, CosmeticRuleParser, CosmeticRuleType, DnsEngine, DnsResult, EXT_CSS_PSEUDO_INDICATORS, Engine, HostRule, IndexedRule, IndexedStorageRule, LIST_ID_MAX_VALUE, MatchingResult, NetworkRule, NetworkRuleOption, PermittedAllRequestTypes, RemoveHeaderModifier, RemoveParamModifier, ReplaceModifier, Request$1 as Request, RestrictedAllRequestTypes, RuleConverter, RuleFactory, RuleStorage, RuleSyntaxUtils, RuleValidator, StringRuleList, cleanUrlParamByRegExp, config$2 as config, getRelativeUrl, isCompatibleWith, isDomainName, logger, setConfiguration, setLogger };\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n get errors() {\n return this.issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be greater than ${issue.inclusive ? `or equal to ` : ``}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be greater than ${issue.inclusive ? `or equal to ` : ``}${new Date(issue.minimum)}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be less than ${issue.inclusive ? `or equal to ` : ``}${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be smaller than ${issue.inclusive ? `or equal to ` : ``}${new Date(issue.maximum)}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message || errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n syncPairs.push({\n key: await pair.key,\n value: await pair.value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (typeof value.value !== \"undefined\" || pair.alwaysSet) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== undefined && x instanceof Promise;\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n return this._path.concat(this._key);\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n const error = new ZodError(ctx.common.issues);\n return { success: false, error };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n if (typeof ctx.data === \"undefined\") {\n return { message: required_error !== null && required_error !== void 0 ? required_error : ctx.defaultError };\n }\n return { message: invalid_type_error !== null && invalid_type_error !== void 0 ? invalid_type_error : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this.superRefine = this._refinement;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.default = this.default.bind(this);\n this.describe = this.describe.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n }\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: [], parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n optional() {\n return ZodOptional.create(this);\n }\n nullable() {\n return ZodNullable.create(this);\n }\n nullish() {\n return this.optional().nullable();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this);\n }\n or(option) {\n return ZodUnion.create([this, option]);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming);\n }\n transform(transform) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(undefined),\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n// eslint-disable-next-line\nconst emailRegex = /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\nclass ZodString extends ZodType {\n constructor() {\n super(...arguments);\n this._regex = (regex, validation, message) => this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n /**\n * @deprecated Use z.string().min(1) instead.\n * @see {@link ZodString.min}\n */\n this.nonempty = (message) => this.min(1, errorUtil.errToObj(message));\n this.trim = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n }\n //\n );\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this.min(len, message).max(len, message);\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\");\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all(ctx.data.map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = ctx.data.map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return this.min(len, message).max(len, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////\n/////////////////////////////////////////\n////////// //////////\n////////// ZodObject //////////\n////////// //////////\n/////////////////////////////////////////\n/////////////////////////////////////////\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second,\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst AugmentFactory = (def) => (augmentation) => {\n return new ZodObject({\n ...def,\n shape: () => ({\n ...def.shape(),\n ...augmentation,\n }),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return ZodArray.create(deepPartialify(schema.element));\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n this.augment = AugmentFactory(this._def);\n this.extend = AugmentFactory(this._def);\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n syncPairs.push({\n key,\n value: await pair.value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n // const mergedShape = objectUtil.mergeShapes(\n // this._def.shape(),\n // merging._def.shape()\n // );\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).map((key) => {\n // only add to shape if key corresponds to an element of the current shape\n if (this.shape[key])\n shape[key] = this.shape[key];\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).map((key) => {\n if (util.objectKeys(mask).indexOf(key) === -1) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n if (mask) {\n util.objectKeys(this.shape).map((key) => {\n if (util.objectKeys(mask).indexOf(key) === -1) {\n newShape[key] = this.shape[key];\n }\n else {\n newShape[key] = this.shape[key].optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n else {\n for (const key in this.shape) {\n const fieldSchema = this.shape[key];\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required() {\n const newShape = {};\n for (const key in this.shape) {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.options.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: this.validDiscriminatorValues,\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get validDiscriminatorValues() {\n return Array.from(this.options.keys());\n }\n get options() {\n return this._def.options;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, types, params) {\n // Get all the valid discriminator values\n const options = new Map();\n try {\n types.forEach((type) => {\n const discriminatorValue = type.shape[discriminator].value;\n options.set(discriminatorValue, type);\n });\n }\n catch (e) {\n throw new Error(\"The discriminator value could not be extracted from all the provided schemas\");\n }\n // Assert that all the discriminator values are unique\n if (options.size !== types.length) {\n throw new Error(\"Some of the discriminator values are not unique\");\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n type: \"array\",\n });\n status.dirty();\n }\n const items = ctx.data\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n return OK(async (...args) => {\n const error = new ZodError([]);\n const parsedArgs = await this._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await fn(...parsedArgs);\n const parsedReturns = await this._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n return OK((...args) => {\n const parsedArgs = this._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = fn(...parsedArgs.data);\n const parsedReturns = this._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (this._def.values.indexOf(input.data) === -1) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n}\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (nativeEnumValues.indexOf(input.data) === -1) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data);\n if (ctx.common.async) {\n return Promise.resolve(processed).then((processed) => {\n return this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n });\n }\n else {\n return this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc\n // effect: RefinementEffect\n ) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n // if (base.status === \"aborted\") return INVALID;\n // if (base.status === \"dirty\") {\n // return { status: \"dirty\", value: base.value };\n // }\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n // if (base.status === \"aborted\") return INVALID;\n // if (base.status === \"dirty\") {\n // return { status: \"dirty\", value: base.value };\n // }\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nconst custom = (check, params = {}, fatal) => {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n if (!check(data)) {\n const p = typeof params === \"function\" ? params(data) : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal });\n }\n });\n return ZodAny.create();\n};\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// new approach that works for abstract classes\n// but required TS 4.4+\n// abstract class Class {\n// constructor(..._: any[]) {}\n// }\n// const instanceOfType = (\nconst instanceOfType = (cls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params, true);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst NEVER = INVALID;\n\nvar mod = /*#__PURE__*/Object.freeze({\n __proto__: null,\n getParsedType: getParsedType,\n ZodParsedType: ZodParsedType,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n ZodType: ZodType,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n get objectUtil () { return objectUtil; },\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPromise, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, custom, dateType as date, mod as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, mod as z };\n","/**\n * Check if `vhost` is a valid suffix of `hostname` (top-domain)\n *\n * It means that `vhost` needs to be a suffix of `hostname` and we then need to\n * make sure that: either they are equal, or the character preceding `vhost` in\n * `hostname` is a '.' (it should not be a partial label).\n *\n * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok\n * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok\n * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok\n */\nfunction shareSameDomainSuffix(hostname, vhost) {\n if (hostname.endsWith(vhost)) {\n return (hostname.length === vhost.length ||\n hostname[hostname.length - vhost.length - 1] === '.');\n }\n return false;\n}\n/**\n * Given a hostname and its public suffix, extract the general domain.\n */\nfunction extractDomainWithSuffix(hostname, publicSuffix) {\n // Locate the index of the last '.' in the part of the `hostname` preceding\n // the public suffix.\n //\n // examples:\n // 1. not.evil.co.uk => evil.co.uk\n // ^ ^\n // | | start of public suffix\n // | index of the last dot\n //\n // 2. example.co.uk => example.co.uk\n // ^ ^\n // | | start of public suffix\n // |\n // | (-1) no dot found before the public suffix\n const publicSuffixIndex = hostname.length - publicSuffix.length - 2;\n const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex);\n // No '.' found, then `hostname` is the general domain (no sub-domain)\n if (lastDotBeforeSuffixIndex === -1) {\n return hostname;\n }\n // Extract the part between the last '.'\n return hostname.slice(lastDotBeforeSuffixIndex + 1);\n}\n/**\n * Detects the domain based on rules and upon and a host string\n */\nexport default function getDomain(suffix, hostname, options) {\n // Check if `hostname` ends with a member of `validHosts`.\n if (options.validHosts !== null) {\n const validHosts = options.validHosts;\n for (let i = 0; i < validHosts.length; i += 1) {\n const vhost = validHosts[i];\n if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost) === true) {\n return vhost;\n }\n }\n }\n // If `hostname` is a valid public suffix, then there is no domain to return.\n // Since we already know that `getPublicSuffix` returns a suffix of `hostname`\n // there is no need to perform a string comparison and we only compare the\n // size.\n if (suffix.length === hostname.length) {\n return null;\n }\n // To extract the general domain, we start by identifying the public suffix\n // (if any), then consider the domain to be the public suffix with one added\n // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix:\n // `co.uk`, then we take one more level: `evil`, giving the final result:\n // `evil.co.uk`).\n return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix);\n}\n//# sourceMappingURL=domain.js.map","/**\n * Return the part of domain without suffix.\n *\n * Example: for domain 'foo.com', the result would be 'foo'.\n */\nexport default function getDomainWithoutSuffix(domain, suffix) {\n // Note: here `domain` and `suffix` cannot have the same length because in\n // this case we set `domain` to `null` instead. It is thus safe to assume\n // that `suffix` is shorter than `domain`.\n return domain.slice(0, -suffix.length - 1);\n}\n//# sourceMappingURL=domain-without-suffix.js.map","/**\n * @param url - URL we want to extract a hostname from.\n * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname.\n */\nexport default function extractHostname(url, urlIsValidHostname) {\n let start = 0;\n let end = url.length;\n let hasUpper = false;\n // If url is not already a valid hostname, then try to extract hostname.\n if (urlIsValidHostname === false) {\n // Special handling of data URLs\n if (url.startsWith('data:') === true) {\n return null;\n }\n // Trim leading spaces\n while (start < url.length && url.charCodeAt(start) <= 32) {\n start += 1;\n }\n // Trim trailing spaces\n while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {\n end -= 1;\n }\n // Skip scheme.\n if (url.charCodeAt(start) === 47 /* '/' */ &&\n url.charCodeAt(start + 1) === 47 /* '/' */) {\n start += 2;\n }\n else {\n const indexOfProtocol = url.indexOf(':/', start);\n if (indexOfProtocol !== -1) {\n // Implement fast-path for common protocols. We expect most protocols\n // should be one of these 4 and thus we will not need to perform the\n // more expansive validity check most of the time.\n const protocolSize = indexOfProtocol - start;\n const c0 = url.charCodeAt(start);\n const c1 = url.charCodeAt(start + 1);\n const c2 = url.charCodeAt(start + 2);\n const c3 = url.charCodeAt(start + 3);\n const c4 = url.charCodeAt(start + 4);\n if (protocolSize === 5 &&\n c0 === 104 /* 'h' */ &&\n c1 === 116 /* 't' */ &&\n c2 === 116 /* 't' */ &&\n c3 === 112 /* 'p' */ &&\n c4 === 115 /* 's' */) {\n // https\n }\n else if (protocolSize === 4 &&\n c0 === 104 /* 'h' */ &&\n c1 === 116 /* 't' */ &&\n c2 === 116 /* 't' */ &&\n c3 === 112 /* 'p' */) {\n // http\n }\n else if (protocolSize === 3 &&\n c0 === 119 /* 'w' */ &&\n c1 === 115 /* 's' */ &&\n c2 === 115 /* 's' */) {\n // wss\n }\n else if (protocolSize === 2 &&\n c0 === 119 /* 'w' */ &&\n c1 === 115 /* 's' */) {\n // ws\n }\n else {\n // Check that scheme is valid\n for (let i = start; i < indexOfProtocol; i += 1) {\n const lowerCaseCode = url.charCodeAt(i) | 32;\n if (((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z]\n (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9]\n lowerCaseCode === 46 || // '.'\n lowerCaseCode === 45 || // '-'\n lowerCaseCode === 43) === false // '+'\n ) {\n return null;\n }\n }\n }\n // Skip 0, 1 or more '/' after ':/'\n start = indexOfProtocol + 2;\n while (url.charCodeAt(start) === 47 /* '/' */) {\n start += 1;\n }\n }\n }\n // Detect first occurrence of '/', '?' or '#'. We also keep track of the\n // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of\n // (respectively), identifier, ipv6 or port.\n let indexOfIdentifier = -1;\n let indexOfClosingBracket = -1;\n let indexOfPort = -1;\n for (let i = start; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 35 || // '#'\n code === 47 || // '/'\n code === 63 // '?'\n ) {\n end = i;\n break;\n }\n else if (code === 64) {\n // '@'\n indexOfIdentifier = i;\n }\n else if (code === 93) {\n // ']'\n indexOfClosingBracket = i;\n }\n else if (code === 58) {\n // ':'\n indexOfPort = i;\n }\n else if (code >= 65 && code <= 90) {\n hasUpper = true;\n }\n }\n // Detect identifier: '@'\n if (indexOfIdentifier !== -1 &&\n indexOfIdentifier > start &&\n indexOfIdentifier < end) {\n start = indexOfIdentifier + 1;\n }\n // Handle ipv6 addresses\n if (url.charCodeAt(start) === 91 /* '[' */) {\n if (indexOfClosingBracket !== -1) {\n return url.slice(start + 1, indexOfClosingBracket).toLowerCase();\n }\n return null;\n }\n else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) {\n // Detect port: ':'\n end = indexOfPort;\n }\n }\n // Trim trailing dots\n while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) {\n end -= 1;\n }\n const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;\n if (hasUpper) {\n return hostname.toLowerCase();\n }\n return hostname;\n}\n//# sourceMappingURL=extract-hostname.js.map","/**\n * Check if a hostname is an IP. You should be aware that this only works\n * because `hostname` is already garanteed to be a valid hostname!\n */\nfunction isProbablyIpv4(hostname) {\n // Cannot be shorted than 1.1.1.1\n if (hostname.length < 7) {\n return false;\n }\n // Cannot be longer than: 255.255.255.255\n if (hostname.length > 15) {\n return false;\n }\n let numberOfDots = 0;\n for (let i = 0; i < hostname.length; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n numberOfDots += 1;\n }\n else if (code < 48 /* '0' */ || code > 57 /* '9' */) {\n return false;\n }\n }\n return (numberOfDots === 3 &&\n hostname.charCodeAt(0) !== 46 /* '.' */ &&\n hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */);\n}\n/**\n * Similar to isProbablyIpv4.\n */\nfunction isProbablyIpv6(hostname) {\n if (hostname.length < 3) {\n return false;\n }\n let start = hostname[0] === '[' ? 1 : 0;\n let end = hostname.length;\n if (hostname[end - 1] === ']') {\n end -= 1;\n }\n // We only consider the maximum size of a normal IPV6. Note that this will\n // fail on so-called \"IPv4 mapped IPv6 addresses\" but this is a corner-case\n // and a proper validation library should be used for these.\n if (end - start > 39) {\n return false;\n }\n let hasColon = false;\n for (; start < end; start += 1) {\n const code = hostname.charCodeAt(start);\n if (code === 58 /* ':' */) {\n hasColon = true;\n }\n else if (((code >= 48 && code <= 57) || // 0-9\n (code >= 97 && code <= 102) || // a-f\n (code >= 65 && code <= 90)) === // A-F\n false) {\n return false;\n }\n }\n return hasColon;\n}\n/**\n * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4).\n * This *will not* work on any string. We need `hostname` to be a valid\n * hostname.\n */\nexport default function isIp(hostname) {\n return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);\n}\n//# sourceMappingURL=is-ip.js.map","/**\n * Implements fast shallow verification of hostnames. This does not perform a\n * struct check on the content of labels (classes of Unicode characters, etc.)\n * but instead check that the structure is valid (number of labels, length of\n * labels, etc.).\n *\n * If you need stricter validation, consider using an external library.\n */\nfunction isValidAscii(code) {\n return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127);\n}\n/**\n * Check if a hostname string is valid. It's usually a preliminary check before\n * trying to use getDomain or anything else.\n *\n * Beware: it does not check if the TLD exists.\n */\nexport default function (hostname) {\n if (hostname.length > 255) {\n return false;\n }\n if (hostname.length === 0) {\n return false;\n }\n if ( /*@__INLINE__*/isValidAscii(hostname.charCodeAt(0)) === false) {\n return false;\n }\n // Validate hostname according to RFC\n let lastDotIndex = -1;\n let lastCharCode = -1;\n const len = hostname.length;\n for (let i = 0; i < len; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n if (\n // Check that previous label is < 63 bytes long (64 = 63 + '.')\n i - lastDotIndex > 64 ||\n // Check that previous character was not already a '.'\n lastCharCode === 46 ||\n // Check that the previous label does not end with a '-' (dash)\n lastCharCode === 45 ||\n // Check that the previous label does not end with a '_' (underscore)\n lastCharCode === 95) {\n return false;\n }\n lastDotIndex = i;\n }\n else if (( /*@__INLINE__*/isValidAscii(code) || code === 45 || code === 95) ===\n false) {\n // Check if there is a forbidden character in the label\n return false;\n }\n lastCharCode = code;\n }\n return (\n // Check that last label is shorter than 63 chars\n len - lastDotIndex - 1 <= 63 &&\n // Check that the last character is an allowed trailing label character.\n // Since we already checked that the char is a valid hostname character,\n // we only need to check that it's different from '-'.\n lastCharCode !== 45);\n}\n//# sourceMappingURL=is-valid.js.map","function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) {\n return {\n allowIcannDomains,\n allowPrivateDomains,\n detectIp,\n extractHostname,\n mixedInputs,\n validHosts,\n validateHostname,\n };\n}\nconst DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({});\nexport function setDefaults(options) {\n if (options === undefined) {\n return DEFAULT_OPTIONS;\n }\n return /*@__INLINE__*/ setDefaultsImpl(options);\n}\n//# sourceMappingURL=options.js.map","/**\n * Returns the subdomain of a hostname string\n */\nexport default function getSubdomain(hostname, domain) {\n // If `hostname` and `domain` are the same, then there is no sub-domain\n if (domain.length === hostname.length) {\n return '';\n }\n return hostname.slice(0, -domain.length - 1);\n}\n//# sourceMappingURL=subdomain.js.map","/**\n * Implement a factory allowing to plug different implementations of suffix\n * lookup (e.g.: using a trie or the packed hashes datastructures). This is used\n * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints.\n */\nimport getDomain from './domain';\nimport getDomainWithoutSuffix from './domain-without-suffix';\nimport extractHostname from './extract-hostname';\nimport isIp from './is-ip';\nimport isValidHostname from './is-valid';\nimport { setDefaults } from './options';\nimport getSubdomain from './subdomain';\nexport function getEmptyResult() {\n return {\n domain: null,\n domainWithoutSuffix: null,\n hostname: null,\n isIcann: null,\n isIp: null,\n isPrivate: null,\n publicSuffix: null,\n subdomain: null,\n };\n}\nexport function resetResult(result) {\n result.domain = null;\n result.domainWithoutSuffix = null;\n result.hostname = null;\n result.isIcann = null;\n result.isIp = null;\n result.isPrivate = null;\n result.publicSuffix = null;\n result.subdomain = null;\n}\nexport function parseImpl(url, step, suffixLookup, partialOptions, result) {\n const options = /*@__INLINE__*/ setDefaults(partialOptions);\n // Very fast approximate check to make sure `url` is a string. This is needed\n // because the library will not necessarily be used in a typed setup and\n // values of arbitrary types might be given as argument.\n if (typeof url !== 'string') {\n return result;\n }\n // Extract hostname from `url` only if needed. This can be made optional\n // using `options.extractHostname`. This option will typically be used\n // whenever we are sure the inputs to `parse` are already hostnames and not\n // arbitrary URLs.\n //\n // `mixedInput` allows to specify if we expect a mix of URLs and hostnames\n // as input. If only hostnames are expected then `extractHostname` can be\n // set to `false` to speed-up parsing. If only URLs are expected then\n // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint\n // and will not change the behavior of the library.\n if (options.extractHostname === false) {\n result.hostname = url;\n }\n else if (options.mixedInputs === true) {\n result.hostname = extractHostname(url, isValidHostname(url));\n }\n else {\n result.hostname = extractHostname(url, false);\n }\n if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) {\n return result;\n }\n // Check if `hostname` is a valid ip address\n if (options.detectIp === true) {\n result.isIp = isIp(result.hostname);\n if (result.isIp === true) {\n return result;\n }\n }\n // Perform optional hostname validation. If hostname is not valid, no need to\n // go further as there will be no valid domain or sub-domain.\n if (options.validateHostname === true &&\n options.extractHostname === true &&\n isValidHostname(result.hostname) === false) {\n result.hostname = null;\n return result;\n }\n // Extract public suffix\n suffixLookup(result.hostname, options, result);\n if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) {\n return result;\n }\n // Extract domain\n result.domain = getDomain(result.publicSuffix, result.hostname, options);\n if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) {\n return result;\n }\n // Extract subdomain\n result.subdomain = getSubdomain(result.hostname, result.domain);\n if (step === 4 /* FLAG.SUB_DOMAIN */) {\n return result;\n }\n // Extract domain without suffix\n result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix);\n return result;\n}\n//# sourceMappingURL=factory.js.map","export default function (hostname, options, out) {\n // Fast path for very popular suffixes; this allows to by-pass lookup\n // completely as well as any extra allocation or string manipulation.\n if (options.allowPrivateDomains === false && hostname.length > 3) {\n const last = hostname.length - 1;\n const c3 = hostname.charCodeAt(last);\n const c2 = hostname.charCodeAt(last - 1);\n const c1 = hostname.charCodeAt(last - 2);\n const c0 = hostname.charCodeAt(last - 3);\n if (c3 === 109 /* 'm' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 99 /* 'c' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'com';\n return true;\n }\n else if (c3 === 103 /* 'g' */ &&\n c2 === 114 /* 'r' */ &&\n c1 === 111 /* 'o' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'org';\n return true;\n }\n else if (c3 === 117 /* 'u' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 101 /* 'e' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'edu';\n return true;\n }\n else if (c3 === 118 /* 'v' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 103 /* 'g' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'gov';\n return true;\n }\n else if (c3 === 116 /* 't' */ &&\n c2 === 101 /* 'e' */ &&\n c1 === 110 /* 'n' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'net';\n return true;\n }\n else if (c3 === 101 /* 'e' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'de';\n return true;\n }\n }\n return false;\n}\n//# sourceMappingURL=fast-path.js.map","export { parseImpl, getEmptyResult, resetResult } from './src/factory';\nexport { default as fastPathLookup } from './src/lookup/fast-path';\nexport { setDefaults } from './src/options';\n//# sourceMappingURL=index.js.map","export const exceptions = (function () {\n const _0 = { \"$\": 1, \"succ\": {} }, _1 = { \"$\": 0, \"succ\": { \"city\": _0 } };\n const exceptions = { \"$\": 0, \"succ\": { \"ck\": { \"$\": 0, \"succ\": { \"www\": _0 } }, \"jp\": { \"$\": 0, \"succ\": { \"kawasaki\": _1, \"kitakyushu\": _1, \"kobe\": _1, \"nagoya\": _1, \"sapporo\": _1, \"sendai\": _1, \"yokohama\": _1 } } } };\n ;\n return exceptions;\n})();\nexport const rules = (function () {\n const _2 = { \"$\": 1, \"succ\": {} }, _3 = { \"$\": 2, \"succ\": {} }, _4 = { \"$\": 1, \"succ\": { \"gov\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2 } }, _5 = { \"$\": 0, \"succ\": { \"*\": _3 } }, _6 = { \"$\": 1, \"succ\": { \"blogspot\": _3 } }, _7 = { \"$\": 1, \"succ\": { \"gov\": _2 } }, _8 = { \"$\": 0, \"succ\": { \"*\": _2 } }, _9 = { \"$\": 0, \"succ\": { \"cloud\": _3 } }, _10 = { \"$\": 1, \"succ\": { \"co\": _3 } }, _11 = { \"$\": 2, \"succ\": { \"nodes\": _3 } }, _12 = { \"$\": 0, \"succ\": { \"s3\": _3 } }, _13 = { \"$\": 0, \"succ\": { \"direct\": _3 } }, _14 = { \"$\": 2, \"succ\": { \"id\": _3 } }, _15 = { \"$\": 0, \"succ\": { \"vfs\": _3, \"webview-assets\": _3 } }, _16 = { \"$\": 0, \"succ\": { \"cloud9\": _15 } }, _17 = { \"$\": 0, \"succ\": { \"dualstack\": _12, \"cloud9\": _15 } }, _18 = { \"$\": 0, \"succ\": { \"dualstack\": _12, \"s3\": _3, \"s3-website\": _3, \"cloud9\": _15 } }, _19 = { \"$\": 0, \"succ\": { \"apps\": _3 } }, _20 = { \"$\": 0, \"succ\": { \"paas\": _3 } }, _21 = { \"$\": 0, \"succ\": { \"app\": _3 } }, _22 = { \"$\": 2, \"succ\": { \"eu\": _3 } }, _23 = { \"$\": 0, \"succ\": { \"site\": _3 } }, _24 = { \"$\": 0, \"succ\": { \"pages\": _3 } }, _25 = { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2 } }, _26 = { \"$\": 0, \"succ\": { \"j\": _3 } }, _27 = { \"$\": 0, \"succ\": { \"jelastic\": _3 } }, _28 = { \"$\": 0, \"succ\": { \"user\": _3 } }, _29 = { \"$\": 1, \"succ\": { \"ybo\": _3 } }, _30 = { \"$\": 0, \"succ\": { \"cust\": _3, \"reservd\": _3 } }, _31 = { \"$\": 0, \"succ\": { \"cust\": _3 } }, _32 = { \"$\": 1, \"succ\": { \"gov\": _2, \"edu\": _2, \"mil\": _2, \"com\": _2, \"org\": _2, \"net\": _2 } }, _33 = { \"$\": 1, \"succ\": { \"edu\": _2, \"biz\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"info\": _2, \"com\": _2 } }, _34 = { \"$\": 1, \"succ\": { \"gov\": _2, \"blogspot\": _3 } }, _35 = { \"$\": 1, \"succ\": { \"framer\": _3 } }, _36 = { \"$\": 1, \"succ\": { \"barsy\": _3 } }, _37 = { \"$\": 0, \"succ\": { \"forgot\": _3 } }, _38 = { \"$\": 1, \"succ\": { \"gs\": _2 } }, _39 = { \"$\": 0, \"succ\": { \"nes\": _2 } }, _40 = { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _2 } }, _41 = { \"$\": 1, \"succ\": { \"cc\": _2, \"lib\": _2 } };\n const rules = { \"$\": 0, \"succ\": { \"ac\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"mil\": _2, \"org\": _2, \"drr\": _3 } }, \"ad\": { \"$\": 1, \"succ\": { \"nom\": _2 } }, \"ae\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"ac\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _3 } }, \"aero\": { \"$\": 1, \"succ\": { \"accident-investigation\": _2, \"accident-prevention\": _2, \"aerobatic\": _2, \"aeroclub\": _2, \"aerodrome\": _2, \"agents\": _2, \"aircraft\": _2, \"airline\": _2, \"airport\": _2, \"air-surveillance\": _2, \"airtraffic\": _2, \"air-traffic-control\": _2, \"ambulance\": _2, \"amusement\": _2, \"association\": _2, \"author\": _2, \"ballooning\": _2, \"broker\": _2, \"caa\": _2, \"cargo\": _2, \"catering\": _2, \"certification\": _2, \"championship\": _2, \"charter\": _2, \"civilaviation\": _2, \"club\": _2, \"conference\": _2, \"consultant\": _2, \"consulting\": _2, \"control\": _2, \"council\": _2, \"crew\": _2, \"design\": _2, \"dgca\": _2, \"educator\": _2, \"emergency\": _2, \"engine\": _2, \"engineer\": _2, \"entertainment\": _2, \"equipment\": _2, \"exchange\": _2, \"express\": _2, \"federation\": _2, \"flight\": _2, \"fuel\": _2, \"gliding\": _2, \"government\": _2, \"groundhandling\": _2, \"group\": _2, \"hanggliding\": _2, \"homebuilt\": _2, \"insurance\": _2, \"journal\": _2, \"journalist\": _2, \"leasing\": _2, \"logistics\": _2, \"magazine\": _2, \"maintenance\": _2, \"media\": _2, \"microlight\": _2, \"modelling\": _2, \"navigation\": _2, \"parachuting\": _2, \"paragliding\": _2, \"passenger-association\": _2, \"pilot\": _2, \"press\": _2, \"production\": _2, \"recreation\": _2, \"repbody\": _2, \"res\": _2, \"research\": _2, \"rotorcraft\": _2, \"safety\": _2, \"scientist\": _2, \"services\": _2, \"show\": _2, \"skydiving\": _2, \"software\": _2, \"student\": _2, \"trader\": _2, \"trading\": _2, \"trainer\": _2, \"union\": _2, \"workinggroup\": _2, \"works\": _2 } }, \"af\": _4, \"ag\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"co\": _2, \"nom\": _2 } }, \"ai\": { \"$\": 1, \"succ\": { \"off\": _2, \"com\": _2, \"net\": _2, \"org\": _2, \"uwu\": _3 } }, \"al\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _3 } }, \"am\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"commune\": _2, \"net\": _2, \"org\": _2, \"radio\": _3, \"blogspot\": _3, \"neko\": _3, \"nyaa\": _3 } }, \"ao\": { \"$\": 1, \"succ\": { \"ed\": _2, \"gv\": _2, \"og\": _2, \"co\": _2, \"pb\": _2, \"it\": _2 } }, \"aq\": _2, \"ar\": { \"$\": 1, \"succ\": { \"bet\": _2, \"com\": _6, \"coop\": _2, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"musica\": _2, \"mutual\": _2, \"net\": _2, \"org\": _2, \"senasa\": _2, \"tur\": _2 } }, \"arpa\": { \"$\": 1, \"succ\": { \"e164\": _2, \"in-addr\": _2, \"ip6\": _2, \"iris\": _2, \"uri\": _2, \"urn\": _2 } }, \"as\": _7, \"asia\": { \"$\": 1, \"succ\": { \"cloudns\": _3 } }, \"at\": { \"$\": 1, \"succ\": { \"ac\": { \"$\": 1, \"succ\": { \"sth\": _2 } }, \"co\": _6, \"gv\": _2, \"or\": _2, \"funkfeuer\": { \"$\": 0, \"succ\": { \"wien\": _3 } }, \"futurecms\": { \"$\": 0, \"succ\": { \"*\": _3, \"ex\": _5, \"in\": _5 } }, \"futurehosting\": _3, \"futuremailing\": _3, \"ortsinfo\": { \"$\": 0, \"succ\": { \"ex\": _5, \"kunden\": _5 } }, \"biz\": _3, \"info\": _3, \"123webseite\": _3, \"priv\": _3, \"myspreadshop\": _3, \"12hp\": _3, \"2ix\": _3, \"4lima\": _3, \"lima-city\": _3 } }, \"au\": { \"$\": 1, \"succ\": { \"com\": { \"$\": 1, \"succ\": { \"blogspot\": _3, \"cloudlets\": { \"$\": 0, \"succ\": { \"mel\": _3 } }, \"myspreadshop\": _3 } }, \"net\": _2, \"org\": _2, \"edu\": { \"$\": 1, \"succ\": { \"act\": _2, \"catholic\": _2, \"nsw\": { \"$\": 1, \"succ\": { \"schools\": _2 } }, \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"gov\": { \"$\": 1, \"succ\": { \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"asn\": _2, \"id\": _2, \"info\": _2, \"conf\": _2, \"oz\": _2, \"act\": _2, \"nsw\": _2, \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"aw\": { \"$\": 1, \"succ\": { \"com\": _2 } }, \"ax\": { \"$\": 1, \"succ\": { \"be\": _3, \"cat\": _3, \"es\": _3, \"eu\": _3, \"gg\": _3, \"mc\": _3, \"us\": _3, \"xy\": _3 } }, \"az\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"int\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"info\": _2, \"pp\": _2, \"mil\": _2, \"name\": _2, \"pro\": _2, \"biz\": _2 } }, \"ba\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"rs\": _3, \"blogspot\": _3 } }, \"bb\": { \"$\": 1, \"succ\": { \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"store\": _2, \"tv\": _2 } }, \"bd\": _8, \"be\": { \"$\": 1, \"succ\": { \"ac\": _2, \"webhosting\": _3, \"blogspot\": _3, \"interhostsolutions\": _9, \"kuleuven\": { \"$\": 0, \"succ\": { \"ezproxy\": _3 } }, \"123website\": _3, \"myspreadshop\": _3, \"transurl\": _5 } }, \"bf\": _7, \"bg\": { \"$\": 1, \"succ\": { \"0\": _2, \"1\": _2, \"2\": _2, \"3\": _2, \"4\": _2, \"5\": _2, \"6\": _2, \"7\": _2, \"8\": _2, \"9\": _2, \"a\": _2, \"b\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"j\": _2, \"k\": _2, \"l\": _2, \"m\": _2, \"n\": _2, \"o\": _2, \"p\": _2, \"q\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"u\": _2, \"v\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"blogspot\": _3, \"barsy\": _3 } }, \"bh\": _4, \"bi\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"or\": _2, \"org\": _2 } }, \"biz\": { \"$\": 1, \"succ\": { \"activetrail\": _3, \"cloudns\": _3, \"jozi\": _3, \"dyndns\": _3, \"for-better\": _3, \"for-more\": _3, \"for-some\": _3, \"for-the\": _3, \"selfip\": _3, \"webhop\": _3, \"orx\": _3, \"mmafan\": _3, \"myftp\": _3, \"no-ip\": _3, \"dscloud\": _3 } }, \"bj\": { \"$\": 1, \"succ\": { \"africa\": _2, \"agro\": _2, \"architectes\": _2, \"assur\": _2, \"avocats\": _2, \"co\": _2, \"com\": _2, \"eco\": _2, \"econo\": _2, \"edu\": _2, \"info\": _2, \"loisirs\": _2, \"money\": _2, \"net\": _2, \"org\": _2, \"ote\": _2, \"resto\": _2, \"restaurant\": _2, \"tourism\": _2, \"univ\": _2, \"blogspot\": _3 } }, \"bm\": _4, \"bn\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"co\": _3 } }, \"bo\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"int\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"tv\": _2, \"web\": _2, \"academia\": _2, \"agro\": _2, \"arte\": _2, \"blog\": _2, \"bolivia\": _2, \"ciencia\": _2, \"cooperativa\": _2, \"democracia\": _2, \"deporte\": _2, \"ecologia\": _2, \"economia\": _2, \"empresa\": _2, \"indigena\": _2, \"industria\": _2, \"info\": _2, \"medicina\": _2, \"movimiento\": _2, \"musica\": _2, \"natural\": _2, \"nombre\": _2, \"noticias\": _2, \"patria\": _2, \"politica\": _2, \"profesional\": _2, \"plurinacional\": _2, \"pueblo\": _2, \"revista\": _2, \"salud\": _2, \"tecnologia\": _2, \"tksat\": _2, \"transporte\": _2, \"wiki\": _2 } }, \"br\": { \"$\": 1, \"succ\": { \"9guacu\": _2, \"abc\": _2, \"adm\": _2, \"adv\": _2, \"agr\": _2, \"aju\": _2, \"am\": _2, \"anani\": _2, \"aparecida\": _2, \"app\": _2, \"arq\": _2, \"art\": _2, \"ato\": _2, \"b\": _2, \"barueri\": _2, \"belem\": _2, \"bhz\": _2, \"bib\": _2, \"bio\": _2, \"blog\": _2, \"bmd\": _2, \"boavista\": _2, \"bsb\": _2, \"campinagrande\": _2, \"campinas\": _2, \"caxias\": _2, \"cim\": _2, \"cng\": _2, \"cnt\": _2, \"com\": { \"$\": 1, \"succ\": { \"blogspot\": _3, \"virtualcloud\": { \"$\": 0, \"succ\": { \"scale\": { \"$\": 0, \"succ\": { \"users\": _3 } } } }, \"simplesite\": _3 } }, \"contagem\": _2, \"coop\": _2, \"coz\": _2, \"cri\": _2, \"cuiaba\": _2, \"curitiba\": _2, \"def\": _2, \"des\": _2, \"det\": _2, \"dev\": _2, \"ecn\": _2, \"eco\": _2, \"edu\": _2, \"emp\": _2, \"enf\": _2, \"eng\": _2, \"esp\": _2, \"etc\": _2, \"eti\": _2, \"far\": _2, \"feira\": _2, \"flog\": _2, \"floripa\": _2, \"fm\": _2, \"fnd\": _2, \"fortal\": _2, \"fot\": _2, \"foz\": _2, \"fst\": _2, \"g12\": _2, \"geo\": _2, \"ggf\": _2, \"goiania\": _2, \"gov\": { \"$\": 1, \"succ\": { \"ac\": _2, \"al\": _2, \"am\": _2, \"ap\": _2, \"ba\": _2, \"ce\": _2, \"df\": _2, \"es\": _2, \"go\": _2, \"ma\": _2, \"mg\": _2, \"ms\": _2, \"mt\": _2, \"pa\": _2, \"pb\": _2, \"pe\": _2, \"pi\": _2, \"pr\": _2, \"rj\": _2, \"rn\": _2, \"ro\": _2, \"rr\": _2, \"rs\": _2, \"sc\": _2, \"se\": _2, \"sp\": _2, \"to\": _2 } }, \"gru\": _2, \"imb\": _2, \"ind\": _2, \"inf\": _2, \"jab\": _2, \"jampa\": _2, \"jdf\": _2, \"joinville\": _2, \"jor\": _2, \"jus\": _2, \"leg\": { \"$\": 1, \"succ\": { \"ac\": _3, \"al\": _3, \"am\": _3, \"ap\": _3, \"ba\": _3, \"ce\": _3, \"df\": _3, \"es\": _3, \"go\": _3, \"ma\": _3, \"mg\": _3, \"ms\": _3, \"mt\": _3, \"pa\": _3, \"pb\": _3, \"pe\": _3, \"pi\": _3, \"pr\": _3, \"rj\": _3, \"rn\": _3, \"ro\": _3, \"rr\": _3, \"rs\": _3, \"sc\": _3, \"se\": _3, \"sp\": _3, \"to\": _3 } }, \"lel\": _2, \"log\": _2, \"londrina\": _2, \"macapa\": _2, \"maceio\": _2, \"manaus\": _2, \"maringa\": _2, \"mat\": _2, \"med\": _2, \"mil\": _2, \"morena\": _2, \"mp\": _2, \"mus\": _2, \"natal\": _2, \"net\": _2, \"niteroi\": _2, \"nom\": _8, \"not\": _2, \"ntr\": _2, \"odo\": _2, \"ong\": _2, \"org\": _2, \"osasco\": _2, \"palmas\": _2, \"poa\": _2, \"ppg\": _2, \"pro\": _2, \"psc\": _2, \"psi\": _2, \"pvh\": _2, \"qsl\": _2, \"radio\": _2, \"rec\": _2, \"recife\": _2, \"rep\": _2, \"ribeirao\": _2, \"rio\": _2, \"riobranco\": _2, \"riopreto\": _2, \"salvador\": _2, \"sampa\": _2, \"santamaria\": _2, \"santoandre\": _2, \"saobernardo\": _2, \"saogonca\": _2, \"seg\": _2, \"sjc\": _2, \"slg\": _2, \"slz\": _2, \"sorocaba\": _2, \"srv\": _2, \"taxi\": _2, \"tc\": _2, \"tec\": _2, \"teo\": _2, \"the\": _2, \"tmp\": _2, \"trd\": _2, \"tur\": _2, \"tv\": _2, \"udi\": _2, \"vet\": _2, \"vix\": _2, \"vlog\": _2, \"wiki\": _2, \"zlg\": _2 } }, \"bs\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"we\": _3 } }, \"bt\": _4, \"bv\": _2, \"bw\": { \"$\": 1, \"succ\": { \"co\": _2, \"org\": _2 } }, \"by\": { \"$\": 1, \"succ\": { \"gov\": _2, \"mil\": _2, \"com\": _6, \"of\": _2, \"mycloud\": _3, \"mediatech\": _3 } }, \"bz\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"za\": _3, \"gsj\": _3 } }, \"ca\": { \"$\": 1, \"succ\": { \"ab\": _2, \"bc\": _2, \"mb\": _2, \"nb\": _2, \"nf\": _2, \"nl\": _2, \"ns\": _2, \"nt\": _2, \"nu\": _2, \"on\": _2, \"pe\": _2, \"qc\": _2, \"sk\": _2, \"yk\": _2, \"gc\": _2, \"barsy\": _3, \"awdev\": _5, \"co\": _3, \"blogspot\": _3, \"no-ip\": _3, \"myspreadshop\": _3 } }, \"cat\": _2, \"cc\": { \"$\": 1, \"succ\": { \"cloudns\": _3, \"ftpaccess\": _3, \"game-server\": _3, \"myphotos\": _3, \"scrapping\": _3, \"twmail\": _3, \"csx\": _3, \"fantasyleague\": _3, \"spawn\": { \"$\": 0, \"succ\": { \"instances\": _3 } } } }, \"cd\": _7, \"cf\": _6, \"cg\": _2, \"ch\": { \"$\": 1, \"succ\": { \"square7\": _3, \"blogspot\": _3, \"flow\": { \"$\": 0, \"succ\": { \"ae\": { \"$\": 0, \"succ\": { \"alp1\": _3 } }, \"appengine\": _3 } }, \"linkyard-cloud\": _3, \"dnsking\": _3, \"gotdns\": _3, \"123website\": _3, \"myspreadshop\": _3, \"firenet\": { \"$\": 0, \"succ\": { \"*\": _3, \"svc\": _5 } }, \"12hp\": _3, \"2ix\": _3, \"4lima\": _3, \"lima-city\": _3 } }, \"ci\": { \"$\": 1, \"succ\": { \"org\": _2, \"or\": _2, \"com\": _2, \"co\": _2, \"edu\": _2, \"ed\": _2, \"ac\": _2, \"net\": _2, \"go\": _2, \"asso\": _2, \"xn--aroport-bya\": _2, \"aéroport\": _2, \"int\": _2, \"presse\": _2, \"md\": _2, \"gouv\": _2, \"fin\": _3, \"nl\": _3 } }, \"ck\": _8, \"cl\": { \"$\": 1, \"succ\": { \"co\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _3 } }, \"cm\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"gov\": _2, \"net\": _2 } }, \"cn\": { \"$\": 1, \"succ\": { \"ac\": _2, \"com\": { \"$\": 1, \"succ\": { \"amazonaws\": { \"$\": 0, \"succ\": { \"compute\": _5, \"cn-north-1\": _12, \"eb\": { \"$\": 0, \"succ\": { \"cn-north-1\": _3, \"cn-northwest-1\": _3 } }, \"elb\": _5 } } } }, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"mil\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"ah\": _2, \"bj\": _2, \"cq\": _2, \"fj\": _2, \"gd\": _2, \"gs\": _2, \"gz\": _2, \"gx\": _2, \"ha\": _2, \"hb\": _2, \"he\": _2, \"hi\": _2, \"hl\": _2, \"hn\": _2, \"jl\": _2, \"js\": _2, \"jx\": _2, \"ln\": _2, \"nm\": _2, \"nx\": _2, \"qh\": _2, \"sc\": _2, \"sd\": _2, \"sh\": _2, \"sn\": _2, \"sx\": _2, \"tj\": _2, \"xj\": _2, \"xz\": _2, \"yn\": _2, \"zj\": _2, \"hk\": _2, \"mo\": _2, \"tw\": _2, \"canva-apps\": _3, \"instantcloud\": _3, \"quickconnect\": _13 } }, \"co\": { \"$\": 1, \"succ\": { \"arts\": _2, \"com\": _6, \"edu\": _2, \"firm\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"rec\": _2, \"web\": _2, \"carrd\": _3, \"crd\": _3, \"otap\": _5, \"leadpages\": _3, \"lpages\": _3, \"mypi\": _3, \"n4t\": _3, \"firewalledreplit\": _14, \"repl\": _14, \"supabase\": _3 } }, \"com\": { \"$\": 1, \"succ\": { \"devcdnaccesso\": _5, \"adobeaemcloud\": { \"$\": 2, \"succ\": { \"dev\": _5 } }, \"airkitapps\": _3, \"airkitapps-au\": _3, \"aivencloud\": _3, \"kasserver\": _3, \"amazonaws\": { \"$\": 0, \"succ\": { \"compute\": _5, \"compute-1\": _5, \"us-east-1\": { \"$\": 2, \"succ\": { \"dualstack\": _12, \"cloud9\": _15 } }, \"ap-northeast-1\": _17, \"ap-northeast-2\": _18, \"ap-south-1\": _18, \"ap-southeast-1\": _17, \"ap-southeast-2\": _17, \"ca-central-1\": _18, \"eu-central-1\": _18, \"eu-west-1\": _17, \"eu-west-2\": _18, \"eu-west-3\": _18, \"s3\": _3, \"s3-ap-northeast-1\": _3, \"s3-ap-northeast-2\": _3, \"s3-ap-south-1\": _3, \"s3-ap-southeast-1\": _3, \"s3-ap-southeast-2\": _3, \"s3-ca-central-1\": _3, \"s3-eu-central-1\": _3, \"s3-eu-west-1\": _3, \"s3-eu-west-2\": _3, \"s3-eu-west-3\": _3, \"s3-external-1\": _3, \"s3-fips-us-gov-west-1\": _3, \"s3-sa-east-1\": _3, \"s3-us-east-2\": _3, \"s3-us-gov-west-1\": _3, \"s3-us-west-1\": _3, \"s3-us-west-2\": _3, \"s3-website-ap-northeast-1\": _3, \"s3-website-ap-southeast-1\": _3, \"s3-website-ap-southeast-2\": _3, \"s3-website-eu-west-1\": _3, \"s3-website-sa-east-1\": _3, \"s3-website-us-east-1\": _3, \"s3-website-us-west-1\": _3, \"s3-website-us-west-2\": _3, \"sa-east-1\": _17, \"us-east-2\": _18, \"af-south-1\": _16, \"ap-east-1\": _16, \"ap-northeast-3\": _16, \"eu-north-1\": _16, \"eu-south-1\": _16, \"me-south-1\": _16, \"us-west-1\": _16, \"us-west-2\": _16, \"elb\": _5 } }, \"elasticbeanstalk\": { \"$\": 2, \"succ\": { \"ap-northeast-1\": _3, \"ap-northeast-2\": _3, \"ap-northeast-3\": _3, \"ap-south-1\": _3, \"ap-southeast-1\": _3, \"ap-southeast-2\": _3, \"ca-central-1\": _3, \"eu-central-1\": _3, \"eu-west-1\": _3, \"eu-west-2\": _3, \"eu-west-3\": _3, \"sa-east-1\": _3, \"us-east-1\": _3, \"us-east-2\": _3, \"us-gov-west-1\": _3, \"us-west-1\": _3, \"us-west-2\": _3 } }, \"awsglobalaccelerator\": _3, \"siiites\": _3, \"appspacehosted\": _3, \"appspaceusercontent\": _3, \"on-aptible\": _3, \"myasustor\": _3, \"balena-devices\": _3, \"betainabox\": _3, \"boutir\": _3, \"bplaced\": _3, \"cafjs\": _3, \"canva-apps\": _3, \"br\": _3, \"cn\": _3, \"de\": _3, \"eu\": _3, \"jpn\": _3, \"mex\": _3, \"ru\": _3, \"sa\": _3, \"uk\": _3, \"us\": _3, \"za\": _3, \"ar\": _3, \"hu\": _3, \"kr\": _3, \"no\": _3, \"qc\": _3, \"uy\": _3, \"africa\": _3, \"gr\": _3, \"co\": _3, \"jdevcloud\": _3, \"wpdevcloud\": _3, \"cloudcontrolled\": _3, \"cloudcontrolapp\": _3, \"cf-ipfs\": _3, \"cloudflare-ipfs\": _3, \"trycloudflare\": _3, \"customer-oci\": { \"$\": 0, \"succ\": { \"*\": _3, \"oci\": _5, \"ocp\": _5, \"ocs\": _5 } }, \"dattolocal\": _3, \"dattorelay\": _3, \"dattoweb\": _3, \"mydatto\": _3, \"builtwithdark\": _3, \"datadetect\": { \"$\": 0, \"succ\": { \"demo\": _3, \"instance\": _3 } }, \"ddns5\": _3, \"discordsays\": _3, \"discordsez\": _3, \"drayddns\": _3, \"dreamhosters\": _3, \"mydrobo\": _3, \"dyndns-at-home\": _3, \"dyndns-at-work\": _3, \"dyndns-blog\": _3, \"dyndns-free\": _3, \"dyndns-home\": _3, \"dyndns-ip\": _3, \"dyndns-mail\": _3, \"dyndns-office\": _3, \"dyndns-pics\": _3, \"dyndns-remote\": _3, \"dyndns-server\": _3, \"dyndns-web\": _3, \"dyndns-wiki\": _3, \"dyndns-work\": _3, \"blogdns\": _3, \"cechire\": _3, \"dnsalias\": _3, \"dnsdojo\": _3, \"doesntexist\": _3, \"dontexist\": _3, \"doomdns\": _3, \"dyn-o-saur\": _3, \"dynalias\": _3, \"est-a-la-maison\": _3, \"est-a-la-masion\": _3, \"est-le-patron\": _3, \"est-mon-blogueur\": _3, \"from-ak\": _3, \"from-al\": _3, \"from-ar\": _3, \"from-ca\": _3, \"from-ct\": _3, \"from-dc\": _3, \"from-de\": _3, \"from-fl\": _3, \"from-ga\": _3, \"from-hi\": _3, \"from-ia\": _3, \"from-id\": _3, \"from-il\": _3, \"from-in\": _3, \"from-ks\": _3, \"from-ky\": _3, \"from-ma\": _3, \"from-md\": _3, \"from-mi\": _3, \"from-mn\": _3, \"from-mo\": _3, \"from-ms\": _3, \"from-mt\": _3, \"from-nc\": _3, \"from-nd\": _3, \"from-ne\": _3, \"from-nh\": _3, \"from-nj\": _3, \"from-nm\": _3, \"from-nv\": _3, \"from-oh\": _3, \"from-ok\": _3, \"from-or\": _3, \"from-pa\": _3, \"from-pr\": _3, \"from-ri\": _3, \"from-sc\": _3, \"from-sd\": _3, \"from-tn\": _3, \"from-tx\": _3, \"from-ut\": _3, \"from-va\": _3, \"from-vt\": _3, \"from-wa\": _3, \"from-wi\": _3, \"from-wv\": _3, \"from-wy\": _3, \"getmyip\": _3, \"gotdns\": _3, \"hobby-site\": _3, \"homelinux\": _3, \"homeunix\": _3, \"iamallama\": _3, \"is-a-anarchist\": _3, \"is-a-blogger\": _3, \"is-a-bookkeeper\": _3, \"is-a-bulls-fan\": _3, \"is-a-caterer\": _3, \"is-a-chef\": _3, \"is-a-conservative\": _3, \"is-a-cpa\": _3, \"is-a-cubicle-slave\": _3, \"is-a-democrat\": _3, \"is-a-designer\": _3, \"is-a-doctor\": _3, \"is-a-financialadvisor\": _3, \"is-a-geek\": _3, \"is-a-green\": _3, \"is-a-guru\": _3, \"is-a-hard-worker\": _3, \"is-a-hunter\": _3, \"is-a-landscaper\": _3, \"is-a-lawyer\": _3, \"is-a-liberal\": _3, \"is-a-libertarian\": _3, \"is-a-llama\": _3, \"is-a-musician\": _3, \"is-a-nascarfan\": _3, \"is-a-nurse\": _3, \"is-a-painter\": _3, \"is-a-personaltrainer\": _3, \"is-a-photographer\": _3, \"is-a-player\": _3, \"is-a-republican\": _3, \"is-a-rockstar\": _3, \"is-a-socialist\": _3, \"is-a-student\": _3, \"is-a-teacher\": _3, \"is-a-techie\": _3, \"is-a-therapist\": _3, \"is-an-accountant\": _3, \"is-an-actor\": _3, \"is-an-actress\": _3, \"is-an-anarchist\": _3, \"is-an-artist\": _3, \"is-an-engineer\": _3, \"is-an-entertainer\": _3, \"is-certified\": _3, \"is-gone\": _3, \"is-into-anime\": _3, \"is-into-cars\": _3, \"is-into-cartoons\": _3, \"is-into-games\": _3, \"is-leet\": _3, \"is-not-certified\": _3, \"is-slick\": _3, \"is-uberleet\": _3, \"is-with-theband\": _3, \"isa-geek\": _3, \"isa-hockeynut\": _3, \"issmarterthanyou\": _3, \"likes-pie\": _3, \"likescandy\": _3, \"neat-url\": _3, \"saves-the-whales\": _3, \"selfip\": _3, \"sells-for-less\": _3, \"sells-for-u\": _3, \"servebbs\": _3, \"simple-url\": _3, \"space-to-rent\": _3, \"teaches-yoga\": _3, \"writesthisblog\": _3, \"digitaloceanspaces\": _5, \"ddnsfree\": _3, \"ddnsgeek\": _3, \"giize\": _3, \"gleeze\": _3, \"kozow\": _3, \"loseyourip\": _3, \"ooguy\": _3, \"theworkpc\": _3, \"mytuleap\": _3, \"tuleap-partners\": _3, \"encoreapi\": _3, \"evennode\": { \"$\": 0, \"succ\": { \"eu-1\": _3, \"eu-2\": _3, \"eu-3\": _3, \"eu-4\": _3, \"us-1\": _3, \"us-2\": _3, \"us-3\": _3, \"us-4\": _3 } }, \"onfabrica\": _3, \"fbsbx\": _19, \"fastly-edge\": _3, \"fastly-terrarium\": _3, \"fastvps-server\": _3, \"mydobiss\": _3, \"firebaseapp\": _3, \"fldrv\": _3, \"forgeblocks\": _3, \"framercanvas\": _3, \"freebox-os\": _3, \"freeboxos\": _3, \"freemyip\": _3, \"gentapps\": _3, \"gentlentapis\": _3, \"githubusercontent\": _3, \"0emm\": _5, \"appspot\": { \"$\": 2, \"succ\": { \"r\": _5 } }, \"codespot\": _3, \"googleapis\": _3, \"googlecode\": _3, \"pagespeedmobilizer\": _3, \"publishproxy\": _3, \"withgoogle\": _3, \"withyoutube\": _3, \"blogspot\": _3, \"awsmppl\": _3, \"herokuapp\": _3, \"herokussl\": _3, \"impertrixcdn\": _3, \"impertrix\": _3, \"smushcdn\": _3, \"wphostedmail\": _3, \"wpmucdn\": _3, \"pixolino\": _3, \"amscompute\": _3, \"clicketcloud\": _3, \"dopaas\": _3, \"hidora\": _3, \"hosted-by-previder\": _20, \"hosteur\": { \"$\": 0, \"succ\": { \"rag-cloud\": _3, \"rag-cloud-ch\": _3 } }, \"ik-server\": { \"$\": 0, \"succ\": { \"jcloud\": _3, \"jcloud-ver-jpc\": _3 } }, \"jelastic\": { \"$\": 0, \"succ\": { \"demo\": _3 } }, \"kilatiron\": _3, \"massivegrid\": _20, \"wafaicloud\": { \"$\": 0, \"succ\": { \"jed\": _3, \"lon\": _3, \"ryd\": _3 } }, \"joyent\": { \"$\": 0, \"succ\": { \"cns\": _5 } }, \"ktistory\": _3, \"lpusercontent\": _3, \"lmpm\": _21, \"linode\": { \"$\": 0, \"succ\": { \"members\": _3, \"nodebalancer\": _5 } }, \"linodeobjects\": _5, \"linodeusercontent\": { \"$\": 0, \"succ\": { \"ip\": _3 } }, \"barsycenter\": _3, \"barsyonline\": _3, \"mazeplay\": _3, \"miniserver\": _3, \"meteorapp\": _22, \"hostedpi\": _3, \"mythic-beasts\": { \"$\": 0, \"succ\": { \"customer\": _3, \"caracal\": _3, \"fentiger\": _3, \"lynx\": _3, \"ocelot\": _3, \"oncilla\": _3, \"onza\": _3, \"sphinx\": _3, \"vs\": _3, \"x\": _3, \"yali\": _3 } }, \"nospamproxy\": _9, \"4u\": _3, \"nfshost\": _3, \"001www\": _3, \"ddnslive\": _3, \"myiphost\": _3, \"blogsyte\": _3, \"ciscofreak\": _3, \"damnserver\": _3, \"ditchyourip\": _3, \"dnsiskinky\": _3, \"dynns\": _3, \"geekgalaxy\": _3, \"health-carereform\": _3, \"homesecuritymac\": _3, \"homesecuritypc\": _3, \"myactivedirectory\": _3, \"mysecuritycamera\": _3, \"net-freaks\": _3, \"onthewifi\": _3, \"point2this\": _3, \"quicksytes\": _3, \"securitytactics\": _3, \"serveexchange\": _3, \"servehumour\": _3, \"servep2p\": _3, \"servesarcasm\": _3, \"stufftoread\": _3, \"unusualperson\": _3, \"workisboring\": _3, \"3utilities\": _3, \"ddnsking\": _3, \"myvnc\": _3, \"servebeer\": _3, \"servecounterstrike\": _3, \"serveftp\": _3, \"servegame\": _3, \"servehalflife\": _3, \"servehttp\": _3, \"serveirc\": _3, \"servemp3\": _3, \"servepics\": _3, \"servequake\": _3, \"observableusercontent\": { \"$\": 0, \"succ\": { \"static\": _3 } }, \"simplesite\": _3, \"orsites\": _3, \"operaunite\": _3, \"authgear-staging\": _3, \"authgearapps\": _3, \"skygearapp\": _3, \"outsystemscloud\": _3, \"ownprovider\": _3, \"pgfog\": _3, \"pagefrontapp\": _3, \"pagexl\": _3, \"paywhirl\": _5, \"gotpantheon\": _3, \"platter-app\": _3, \"pleskns\": _3, \"postman-echo\": _3, \"prgmr\": { \"$\": 0, \"succ\": { \"xen\": _3 } }, \"pythonanywhere\": _22, \"qualifioapp\": _3, \"qbuser\": _3, \"qa2\": _3, \"dev-myqnapcloud\": _3, \"alpha-myqnapcloud\": _3, \"myqnapcloud\": _3, \"quipelements\": _5, \"rackmaze\": _3, \"rhcloud\": _3, \"render\": _21, \"onrender\": _3, \"180r\": _3, \"dojin\": _3, \"sakuratan\": _3, \"sakuraweb\": _3, \"x0\": _3, \"code\": { \"$\": 0, \"succ\": { \"builder\": _5, \"dev-builder\": _5, \"stg-builder\": _5 } }, \"logoip\": _3, \"scrysec\": _3, \"firewall-gateway\": _3, \"myshopblocks\": _3, \"myshopify\": _3, \"shopitsite\": _3, \"1kapp\": _3, \"appchizi\": _3, \"applinzi\": _3, \"sinaapp\": _3, \"vipsinaapp\": _3, \"bounty-full\": { \"$\": 2, \"succ\": { \"alpha\": _3, \"beta\": _3 } }, \"streamlitapp\": _3, \"try-snowplow\": _3, \"stackhero-network\": _3, \"playstation-cloud\": _3, \"myspreadshop\": _3, \"stdlib\": { \"$\": 0, \"succ\": { \"api\": _3 } }, \"temp-dns\": _3, \"dsmynas\": _3, \"familyds\": _3, \"mytabit\": _3, \"tb-hosting\": _23, \"reservd\": _3, \"thingdustdata\": _3, \"bloxcms\": _3, \"townnews-staging\": _3, \"typeform\": { \"$\": 0, \"succ\": { \"pro\": _3 } }, \"hk\": _3, \"it\": _3, \"vultrobjects\": _5, \"wafflecell\": _3, \"reserve-online\": _3, \"hotelwithflight\": _3, \"remotewd\": _3, \"wiardweb\": _24, \"messwithdns\": _3, \"woltlab-demo\": _3, \"wpenginepowered\": { \"$\": 2, \"succ\": { \"js\": _3 } }, \"wixsite\": _3, \"xnbay\": { \"$\": 2, \"succ\": { \"u2\": _3, \"u2-local\": _3 } }, \"yolasite\": _3 } }, \"coop\": _2, \"cr\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"ed\": _2, \"fi\": _2, \"go\": _2, \"or\": _2, \"sa\": _2 } }, \"cu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"gov\": _2, \"inf\": _2 } }, \"cv\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"int\": _2, \"nome\": _2, \"org\": _2, \"blogspot\": _3 } }, \"cw\": _25, \"cx\": { \"$\": 1, \"succ\": { \"gov\": _2, \"ath\": _3, \"info\": _3 } }, \"cy\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"com\": { \"$\": 1, \"succ\": { \"blogspot\": _3, \"scaleforce\": _26 } }, \"ekloges\": _2, \"gov\": _2, \"ltd\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"press\": _2, \"pro\": _2, \"tm\": _2 } }, \"cz\": { \"$\": 1, \"succ\": { \"co\": _3, \"realm\": _3, \"e4\": _3, \"blogspot\": _3, \"metacentrum\": { \"$\": 0, \"succ\": { \"cloud\": _5, \"custom\": _3 } }, \"muni\": { \"$\": 0, \"succ\": { \"cloud\": { \"$\": 0, \"succ\": { \"flt\": _3, \"usr\": _3 } } } } } }, \"de\": { \"$\": 1, \"succ\": { \"bplaced\": _3, \"square7\": _3, \"com\": _3, \"cosidns\": { \"$\": 0, \"succ\": { \"dyn\": _3 } }, \"dynamisches-dns\": _3, \"dnsupdater\": _3, \"internet-dns\": _3, \"l-o-g-i-n\": _3, \"dnshome\": _3, \"fuettertdasnetz\": _3, \"isteingeek\": _3, \"istmein\": _3, \"lebtimnetz\": _3, \"leitungsen\": _3, \"traeumtgerade\": _3, \"ddnss\": { \"$\": 2, \"succ\": { \"dyn\": _3, \"dyndns\": _3 } }, \"dyndns1\": _3, \"dyn-ip24\": _3, \"home-webserver\": { \"$\": 2, \"succ\": { \"dyn\": _3 } }, \"myhome-server\": _3, \"frusky\": _5, \"goip\": _3, \"blogspot\": _3, \"xn--gnstigbestellen-zvb\": _3, \"günstigbestellen\": _3, \"xn--gnstigliefern-wob\": _3, \"günstigliefern\": _3, \"hs-heilbronn\": { \"$\": 0, \"succ\": { \"it\": _24 } }, \"dyn-berlin\": _3, \"in-berlin\": _3, \"in-brb\": _3, \"in-butter\": _3, \"in-dsl\": _3, \"in-vpn\": _3, \"iservschule\": _3, \"mein-iserv\": _3, \"schulplattform\": _3, \"schulserver\": _3, \"test-iserv\": _3, \"keymachine\": _3, \"git-repos\": _3, \"lcube-server\": _3, \"svn-repos\": _3, \"barsy\": _3, \"123webseite\": _3, \"logoip\": _3, \"firewall-gateway\": _3, \"my-gateway\": _3, \"my-router\": _3, \"spdns\": _3, \"speedpartner\": { \"$\": 0, \"succ\": { \"customer\": _3 } }, \"myspreadshop\": _3, \"taifun-dns\": _3, \"12hp\": _3, \"2ix\": _3, \"4lima\": _3, \"lima-city\": _3, \"dd-dns\": _3, \"dray-dns\": _3, \"draydns\": _3, \"dyn-vpn\": _3, \"dynvpn\": _3, \"mein-vigor\": _3, \"my-vigor\": _3, \"my-wan\": _3, \"syno-ds\": _3, \"synology-diskstation\": _3, \"synology-ds\": _3, \"uberspace\": _5, \"virtualuser\": _3, \"virtual-user\": _3, \"community-pro\": _3, \"diskussionsbereich\": _3 } }, \"dj\": _2, \"dk\": { \"$\": 1, \"succ\": { \"biz\": _3, \"co\": _3, \"firm\": _3, \"reg\": _3, \"store\": _3, \"blogspot\": _3, \"123hjemmeside\": _3, \"myspreadshop\": _3 } }, \"dm\": _4, \"do\": { \"$\": 1, \"succ\": { \"art\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sld\": _2, \"web\": _2 } }, \"dz\": { \"$\": 1, \"succ\": { \"art\": _2, \"asso\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"net\": _2, \"pol\": _2, \"soc\": _2, \"tm\": _2 } }, \"ec\": { \"$\": 1, \"succ\": { \"com\": _2, \"info\": _2, \"net\": _2, \"fin\": _2, \"k12\": _2, \"med\": _2, \"pro\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"gob\": _2, \"mil\": _2, \"base\": _3, \"official\": _3 } }, \"edu\": { \"$\": 1, \"succ\": { \"rit\": { \"$\": 0, \"succ\": { \"git-pages\": _3 } } } }, \"ee\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"riik\": _2, \"lib\": _2, \"med\": _2, \"com\": _6, \"pri\": _2, \"aip\": _2, \"org\": _2, \"fie\": _2 } }, \"eg\": { \"$\": 1, \"succ\": { \"com\": _6, \"edu\": _2, \"eun\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sci\": _2 } }, \"er\": _8, \"es\": { \"$\": 1, \"succ\": { \"com\": _6, \"nom\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2, \"123miweb\": _3, \"myspreadshop\": _3 } }, \"et\": { \"$\": 1, \"succ\": { \"com\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"biz\": _2, \"name\": _2, \"info\": _2, \"net\": _2 } }, \"eu\": { \"$\": 1, \"succ\": { \"airkitapps\": _3, \"mycd\": _3, \"cloudns\": _3, \"dogado\": _27, \"barsy\": _3, \"wellbeingzone\": _3, \"spdns\": _3, \"transurl\": _5, \"diskstation\": _3 } }, \"fi\": { \"$\": 1, \"succ\": { \"aland\": _2, \"dy\": _3, \"blogspot\": _3, \"xn--hkkinen-5wa\": _3, \"häkkinen\": _3, \"iki\": _3, \"cloudplatform\": { \"$\": 0, \"succ\": { \"fi\": _3 } }, \"datacenter\": { \"$\": 0, \"succ\": { \"demo\": _3, \"paas\": _3 } }, \"kapsi\": _3, \"123kotisivu\": _3, \"myspreadshop\": _3 } }, \"fj\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"com\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"fk\": _8, \"fm\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"radio\": _3, \"user\": _5 } }, \"fo\": _2, \"fr\": { \"$\": 1, \"succ\": { \"asso\": _2, \"com\": _2, \"gouv\": _2, \"nom\": _2, \"prd\": _2, \"tm\": _2, \"aeroport\": _2, \"avocat\": _2, \"avoues\": _2, \"cci\": _2, \"chambagri\": _2, \"chirurgiens-dentistes\": _2, \"experts-comptables\": _2, \"geometre-expert\": _2, \"greta\": _2, \"huissier-justice\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmacien\": _2, \"port\": _2, \"veterinaire\": _2, \"en-root\": _3, \"fbx-os\": _3, \"fbxos\": _3, \"freebox-os\": _3, \"freeboxos\": _3, \"blogspot\": _3, \"goupile\": _3, \"123siteweb\": _3, \"on-web\": _3, \"chirurgiens-dentistes-en-france\": _3, \"dedibox\": _3, \"myspreadshop\": _3, \"ynh\": _3 } }, \"ga\": _2, \"gb\": _2, \"gd\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2 } }, \"ge\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"net\": _2, \"pvt\": _2 } }, \"gf\": _2, \"gg\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"kaas\": _3, \"cya\": _3, \"panel\": { \"$\": 2, \"succ\": { \"daemon\": _3 } } } }, \"gh\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2 } }, \"gi\": { \"$\": 1, \"succ\": { \"com\": _2, \"ltd\": _2, \"gov\": _2, \"mod\": _2, \"edu\": _2, \"org\": _2 } }, \"gl\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"biz\": _3, \"xx\": _3 } }, \"gm\": _2, \"gn\": { \"$\": 1, \"succ\": { \"ac\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"net\": _2 } }, \"gov\": _2, \"gp\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"mobi\": _2, \"edu\": _2, \"org\": _2, \"asso\": _2, \"app\": _3 } }, \"gq\": _2, \"gr\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"blogspot\": _3, \"simplesite\": _3 } }, \"gs\": _2, \"gt\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"ind\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blog\": _3, \"de\": _3, \"to\": _3 } }, \"gu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"guam\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"web\": _2 } }, \"gw\": _2, \"gy\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"be\": _3 } }, \"hk\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"idv\": _2, \"net\": _2, \"org\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--wcvs22d\": _2, \"教育\": _2, \"xn--lcvr32d\": _2, \"敎育\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--gmqw5a\": _2, \"個人\": _2, \"xn--ciqpn\": _2, \"个人\": _2, \"xn--gmq050i\": _2, \"箇人\": _2, \"xn--zf0avx\": _2, \"網络\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--mk0axi\": _2, \"组織\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"xn--od0aq3b\": _2, \"网絡\": _2, \"xn--tn0ag\": _2, \"组织\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--uc0ay4a\": _2, \"組织\": _2, \"blogspot\": _3, \"secaas\": _3, \"ltd\": _3, \"inc\": _3 } }, \"hm\": _2, \"hn\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"gob\": _2, \"cc\": _3 } }, \"hr\": { \"$\": 1, \"succ\": { \"iz\": _2, \"from\": _2, \"name\": _2, \"com\": _2, \"blogspot\": _3, \"free\": _3 } }, \"ht\": { \"$\": 1, \"succ\": { \"com\": _2, \"shop\": _2, \"firm\": _2, \"info\": _2, \"adult\": _2, \"net\": _2, \"pro\": _2, \"org\": _2, \"med\": _2, \"art\": _2, \"coop\": _2, \"pol\": _2, \"asso\": _2, \"edu\": _2, \"rel\": _2, \"gouv\": _2, \"perso\": _2 } }, \"hu\": { \"$\": 1, \"succ\": { \"2000\": _2, \"co\": _2, \"info\": _2, \"org\": _2, \"priv\": _2, \"sport\": _2, \"tm\": _2, \"agrar\": _2, \"bolt\": _2, \"casino\": _2, \"city\": _2, \"erotica\": _2, \"erotika\": _2, \"film\": _2, \"forum\": _2, \"games\": _2, \"hotel\": _2, \"ingatlan\": _2, \"jogasz\": _2, \"konyvelo\": _2, \"lakas\": _2, \"media\": _2, \"news\": _2, \"reklam\": _2, \"sex\": _2, \"shop\": _2, \"suli\": _2, \"szex\": _2, \"tozsde\": _2, \"utazas\": _2, \"video\": _2, \"blogspot\": _3 } }, \"id\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _6, \"desa\": _2, \"go\": _2, \"mil\": _2, \"my\": { \"$\": 1, \"succ\": { \"rss\": _5 } }, \"net\": _2, \"or\": _2, \"ponpes\": _2, \"sch\": _2, \"web\": _2, \"flap\": _3, \"forte\": _3 } }, \"ie\": { \"$\": 1, \"succ\": { \"gov\": _2, \"blogspot\": _3, \"myspreadshop\": _3 } }, \"il\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": { \"$\": 1, \"succ\": { \"ravpage\": _3, \"blogspot\": _3, \"tabitorder\": _3, \"mytabit\": _3 } }, \"gov\": _2, \"idf\": _2, \"k12\": _2, \"muni\": _2, \"net\": _2, \"org\": _2 } }, \"xn--4dbrk0ce\": { \"$\": 1, \"succ\": { \"xn--4dbgdty6c\": _2, \"xn--5dbhl8d\": _2, \"xn--8dbq2a\": _2, \"xn--hebda8b\": _2 } }, \"ישראל\": { \"$\": 1, \"succ\": { \"אקדמיה\": _2, \"ישוב\": _2, \"צהל\": _2, \"ממשל\": _2 } }, \"im\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": { \"$\": 1, \"succ\": { \"ltd\": _2, \"plc\": _2 } }, \"com\": _2, \"net\": _2, \"org\": _2, \"tt\": _2, \"tv\": _2, \"ro\": _3 } }, \"in\": { \"$\": 1, \"succ\": { \"5g\": _2, \"6g\": _2, \"ac\": _2, \"ai\": _2, \"am\": _2, \"bihar\": _2, \"biz\": _2, \"business\": _2, \"ca\": _2, \"cn\": _2, \"co\": _2, \"com\": _2, \"coop\": _2, \"cs\": _2, \"delhi\": _2, \"dr\": _2, \"edu\": _2, \"er\": _2, \"firm\": _2, \"gen\": _2, \"gov\": _2, \"gujarat\": _2, \"ind\": _2, \"info\": _2, \"int\": _2, \"internet\": _2, \"io\": _2, \"me\": _2, \"mil\": _2, \"net\": _2, \"nic\": _2, \"org\": _2, \"pg\": _2, \"post\": _2, \"pro\": _2, \"res\": _2, \"travel\": _2, \"tv\": _2, \"uk\": _2, \"up\": _2, \"us\": _2, \"web\": _3, \"cloudns\": _3, \"blogspot\": _3, \"barsy\": _3, \"supabase\": _3 } }, \"info\": { \"$\": 1, \"succ\": { \"cloudns\": _3, \"dynamic-dns\": _3, \"dyndns\": _3, \"barrel-of-knowledge\": _3, \"barrell-of-knowledge\": _3, \"for-our\": _3, \"groks-the\": _3, \"groks-this\": _3, \"here-for-more\": _3, \"knowsitall\": _3, \"selfip\": _3, \"webhop\": _3, \"barsy\": _3, \"mayfirst\": _3, \"forumz\": _3, \"nsupdate\": _3, \"dvrcam\": _3, \"ilovecollege\": _3, \"no-ip\": _3, \"dnsupdate\": _3, \"v-info\": _3 } }, \"int\": { \"$\": 1, \"succ\": { \"eu\": _2 } }, \"io\": { \"$\": 1, \"succ\": { \"2038\": _3, \"com\": _2, \"on-acorn\": _5, \"apigee\": _3, \"b-data\": _3, \"backplaneapp\": _3, \"banzaicloud\": { \"$\": 0, \"succ\": { \"app\": _3, \"backyards\": _5 } }, \"beagleboard\": _3, \"bitbucket\": _3, \"bluebite\": _3, \"boxfuse\": _3, \"browsersafetymark\": _3, \"bigv\": { \"$\": 0, \"succ\": { \"uk0\": _3 } }, \"cleverapps\": _3, \"dappnode\": { \"$\": 0, \"succ\": { \"dyndns\": _3 } }, \"dedyn\": _3, \"drud\": _3, \"definima\": _3, \"fh-muenster\": _3, \"shw\": _3, \"forgerock\": { \"$\": 0, \"succ\": { \"id\": _3 } }, \"ghost\": _3, \"github\": _3, \"gitlab\": _3, \"lolipop\": _3, \"hasura-app\": _3, \"hostyhosting\": _3, \"moonscale\": _5, \"beebyte\": _20, \"beebyteapp\": { \"$\": 0, \"succ\": { \"sekd1\": _3 } }, \"jele\": _3, \"unispace\": { \"$\": 0, \"succ\": { \"cloud-fr1\": _3 } }, \"webthings\": _3, \"loginline\": _3, \"barsy\": _3, \"azurecontainer\": _5, \"ngrok\": { \"$\": 2, \"succ\": { \"ap\": _3, \"au\": _3, \"eu\": _3, \"in\": _3, \"jp\": _3, \"sa\": _3, \"us\": _3 } }, \"nodeart\": { \"$\": 0, \"succ\": { \"stage\": _3 } }, \"nid\": _3, \"pantheonsite\": _3, \"dyn53\": _3, \"pstmn\": { \"$\": 2, \"succ\": { \"mock\": _3 } }, \"protonet\": _3, \"qoto\": _3, \"qcx\": { \"$\": 2, \"succ\": { \"sys\": _5 } }, \"vaporcloud\": _3, \"vbrplsbx\": { \"$\": 0, \"succ\": { \"g\": _3 } }, \"on-k3s\": _5, \"on-rio\": _5, \"readthedocs\": _3, \"resindevice\": _3, \"resinstaging\": { \"$\": 0, \"succ\": { \"devices\": _3 } }, \"hzc\": _3, \"sandcats\": _3, \"shiftcrypto\": _3, \"shiftedit\": _3, \"mo-siemens\": _3, \"musician\": _3, \"lair\": _19, \"stolos\": _5, \"spacekit\": _3, \"utwente\": _3, \"s5y\": _5, \"edugit\": _3, \"telebit\": _3, \"thingdust\": { \"$\": 0, \"succ\": { \"dev\": _30, \"disrec\": _30, \"prod\": _31, \"testing\": _30 } }, \"tickets\": _3, \"upli\": _3, \"wedeploy\": _3, \"editorx\": _3, \"basicserver\": _3, \"virtualserver\": _3 } }, \"iq\": _32, \"ir\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"gov\": _2, \"id\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2 } }, \"is\": { \"$\": 1, \"succ\": { \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"int\": _2, \"cupcake\": _3, \"blogspot\": _3 } }, \"it\": { \"$\": 1, \"succ\": { \"gov\": _2, \"edu\": _2, \"abr\": _2, \"abruzzo\": _2, \"aosta-valley\": _2, \"aostavalley\": _2, \"bas\": _2, \"basilicata\": _2, \"cal\": _2, \"calabria\": _2, \"cam\": _2, \"campania\": _2, \"emilia-romagna\": _2, \"emiliaromagna\": _2, \"emr\": _2, \"friuli-v-giulia\": _2, \"friuli-ve-giulia\": _2, \"friuli-vegiulia\": _2, \"friuli-venezia-giulia\": _2, \"friuli-veneziagiulia\": _2, \"friuli-vgiulia\": _2, \"friuliv-giulia\": _2, \"friulive-giulia\": _2, \"friulivegiulia\": _2, \"friulivenezia-giulia\": _2, \"friuliveneziagiulia\": _2, \"friulivgiulia\": _2, \"fvg\": _2, \"laz\": _2, \"lazio\": _2, \"lig\": _2, \"liguria\": _2, \"lom\": _2, \"lombardia\": _2, \"lombardy\": _2, \"lucania\": _2, \"mar\": _2, \"marche\": _2, \"mol\": _2, \"molise\": _2, \"piedmont\": _2, \"piemonte\": _2, \"pmn\": _2, \"pug\": _2, \"puglia\": _2, \"sar\": _2, \"sardegna\": _2, \"sardinia\": _2, \"sic\": _2, \"sicilia\": _2, \"sicily\": _2, \"taa\": _2, \"tos\": _2, \"toscana\": _2, \"trentin-sud-tirol\": _2, \"xn--trentin-sd-tirol-rzb\": _2, \"trentin-süd-tirol\": _2, \"trentin-sudtirol\": _2, \"xn--trentin-sdtirol-7vb\": _2, \"trentin-südtirol\": _2, \"trentin-sued-tirol\": _2, \"trentin-suedtirol\": _2, \"trentino-a-adige\": _2, \"trentino-aadige\": _2, \"trentino-alto-adige\": _2, \"trentino-altoadige\": _2, \"trentino-s-tirol\": _2, \"trentino-stirol\": _2, \"trentino-sud-tirol\": _2, \"xn--trentino-sd-tirol-c3b\": _2, \"trentino-süd-tirol\": _2, \"trentino-sudtirol\": _2, \"xn--trentino-sdtirol-szb\": _2, \"trentino-südtirol\": _2, \"trentino-sued-tirol\": _2, \"trentino-suedtirol\": _2, \"trentino\": _2, \"trentinoa-adige\": _2, \"trentinoaadige\": _2, \"trentinoalto-adige\": _2, \"trentinoaltoadige\": _2, \"trentinos-tirol\": _2, \"trentinostirol\": _2, \"trentinosud-tirol\": _2, \"xn--trentinosd-tirol-rzb\": _2, \"trentinosüd-tirol\": _2, \"trentinosudtirol\": _2, \"xn--trentinosdtirol-7vb\": _2, \"trentinosüdtirol\": _2, \"trentinosued-tirol\": _2, \"trentinosuedtirol\": _2, \"trentinsud-tirol\": _2, \"xn--trentinsd-tirol-6vb\": _2, \"trentinsüd-tirol\": _2, \"trentinsudtirol\": _2, \"xn--trentinsdtirol-nsb\": _2, \"trentinsüdtirol\": _2, \"trentinsued-tirol\": _2, \"trentinsuedtirol\": _2, \"tuscany\": _2, \"umb\": _2, \"umbria\": _2, \"val-d-aosta\": _2, \"val-daosta\": _2, \"vald-aosta\": _2, \"valdaosta\": _2, \"valle-aosta\": _2, \"valle-d-aosta\": _2, \"valle-daosta\": _2, \"valleaosta\": _2, \"valled-aosta\": _2, \"valledaosta\": _2, \"vallee-aoste\": _2, \"xn--valle-aoste-ebb\": _2, \"vallée-aoste\": _2, \"vallee-d-aoste\": _2, \"xn--valle-d-aoste-ehb\": _2, \"vallée-d-aoste\": _2, \"valleeaoste\": _2, \"xn--valleaoste-e7a\": _2, \"valléeaoste\": _2, \"valleedaoste\": _2, \"xn--valledaoste-ebb\": _2, \"valléedaoste\": _2, \"vao\": _2, \"vda\": _2, \"ven\": _2, \"veneto\": _2, \"ag\": _2, \"agrigento\": _2, \"al\": _2, \"alessandria\": _2, \"alto-adige\": _2, \"altoadige\": _2, \"an\": _2, \"ancona\": _2, \"andria-barletta-trani\": _2, \"andria-trani-barletta\": _2, \"andriabarlettatrani\": _2, \"andriatranibarletta\": _2, \"ao\": _2, \"aosta\": _2, \"aoste\": _2, \"ap\": _2, \"aq\": _2, \"aquila\": _2, \"ar\": _2, \"arezzo\": _2, \"ascoli-piceno\": _2, \"ascolipiceno\": _2, \"asti\": _2, \"at\": _2, \"av\": _2, \"avellino\": _2, \"ba\": _2, \"balsan-sudtirol\": _2, \"xn--balsan-sdtirol-nsb\": _2, \"balsan-südtirol\": _2, \"balsan-suedtirol\": _2, \"balsan\": _2, \"bari\": _2, \"barletta-trani-andria\": _2, \"barlettatraniandria\": _2, \"belluno\": _2, \"benevento\": _2, \"bergamo\": _2, \"bg\": _2, \"bi\": _2, \"biella\": _2, \"bl\": _2, \"bn\": _2, \"bo\": _2, \"bologna\": _2, \"bolzano-altoadige\": _2, \"bolzano\": _2, \"bozen-sudtirol\": _2, \"xn--bozen-sdtirol-2ob\": _2, \"bozen-südtirol\": _2, \"bozen-suedtirol\": _2, \"bozen\": _2, \"br\": _2, \"brescia\": _2, \"brindisi\": _2, \"bs\": _2, \"bt\": _2, \"bulsan-sudtirol\": _2, \"xn--bulsan-sdtirol-nsb\": _2, \"bulsan-südtirol\": _2, \"bulsan-suedtirol\": _2, \"bulsan\": _2, \"bz\": _2, \"ca\": _2, \"cagliari\": _2, \"caltanissetta\": _2, \"campidano-medio\": _2, \"campidanomedio\": _2, \"campobasso\": _2, \"carbonia-iglesias\": _2, \"carboniaiglesias\": _2, \"carrara-massa\": _2, \"carraramassa\": _2, \"caserta\": _2, \"catania\": _2, \"catanzaro\": _2, \"cb\": _2, \"ce\": _2, \"cesena-forli\": _2, \"xn--cesena-forl-mcb\": _2, \"cesena-forlì\": _2, \"cesenaforli\": _2, \"xn--cesenaforl-i8a\": _2, \"cesenaforlì\": _2, \"ch\": _2, \"chieti\": _2, \"ci\": _2, \"cl\": _2, \"cn\": _2, \"co\": _2, \"como\": _2, \"cosenza\": _2, \"cr\": _2, \"cremona\": _2, \"crotone\": _2, \"cs\": _2, \"ct\": _2, \"cuneo\": _2, \"cz\": _2, \"dell-ogliastra\": _2, \"dellogliastra\": _2, \"en\": _2, \"enna\": _2, \"fc\": _2, \"fe\": _2, \"fermo\": _2, \"ferrara\": _2, \"fg\": _2, \"fi\": _2, \"firenze\": _2, \"florence\": _2, \"fm\": _2, \"foggia\": _2, \"forli-cesena\": _2, \"xn--forl-cesena-fcb\": _2, \"forlì-cesena\": _2, \"forlicesena\": _2, \"xn--forlcesena-c8a\": _2, \"forlìcesena\": _2, \"fr\": _2, \"frosinone\": _2, \"ge\": _2, \"genoa\": _2, \"genova\": _2, \"go\": _2, \"gorizia\": _2, \"gr\": _2, \"grosseto\": _2, \"iglesias-carbonia\": _2, \"iglesiascarbonia\": _2, \"im\": _2, \"imperia\": _2, \"is\": _2, \"isernia\": _2, \"kr\": _2, \"la-spezia\": _2, \"laquila\": _2, \"laspezia\": _2, \"latina\": _2, \"lc\": _2, \"le\": _2, \"lecce\": _2, \"lecco\": _2, \"li\": _2, \"livorno\": _2, \"lo\": _2, \"lodi\": _2, \"lt\": _2, \"lu\": _2, \"lucca\": _2, \"macerata\": _2, \"mantova\": _2, \"massa-carrara\": _2, \"massacarrara\": _2, \"matera\": _2, \"mb\": _2, \"mc\": _2, \"me\": _2, \"medio-campidano\": _2, \"mediocampidano\": _2, \"messina\": _2, \"mi\": _2, \"milan\": _2, \"milano\": _2, \"mn\": _2, \"mo\": _2, \"modena\": _2, \"monza-brianza\": _2, \"monza-e-della-brianza\": _2, \"monza\": _2, \"monzabrianza\": _2, \"monzaebrianza\": _2, \"monzaedellabrianza\": _2, \"ms\": _2, \"mt\": _2, \"na\": _2, \"naples\": _2, \"napoli\": _2, \"no\": _2, \"novara\": _2, \"nu\": _2, \"nuoro\": _2, \"og\": _2, \"ogliastra\": _2, \"olbia-tempio\": _2, \"olbiatempio\": _2, \"or\": _2, \"oristano\": _2, \"ot\": _2, \"pa\": _2, \"padova\": _2, \"padua\": _2, \"palermo\": _2, \"parma\": _2, \"pavia\": _2, \"pc\": _2, \"pd\": _2, \"pe\": _2, \"perugia\": _2, \"pesaro-urbino\": _2, \"pesarourbino\": _2, \"pescara\": _2, \"pg\": _2, \"pi\": _2, \"piacenza\": _2, \"pisa\": _2, \"pistoia\": _2, \"pn\": _2, \"po\": _2, \"pordenone\": _2, \"potenza\": _2, \"pr\": _2, \"prato\": _2, \"pt\": _2, \"pu\": _2, \"pv\": _2, \"pz\": _2, \"ra\": _2, \"ragusa\": _2, \"ravenna\": _2, \"rc\": _2, \"re\": _2, \"reggio-calabria\": _2, \"reggio-emilia\": _2, \"reggiocalabria\": _2, \"reggioemilia\": _2, \"rg\": _2, \"ri\": _2, \"rieti\": _2, \"rimini\": _2, \"rm\": _2, \"rn\": _2, \"ro\": _2, \"roma\": _2, \"rome\": _2, \"rovigo\": _2, \"sa\": _2, \"salerno\": _2, \"sassari\": _2, \"savona\": _2, \"si\": _2, \"siena\": _2, \"siracusa\": _2, \"so\": _2, \"sondrio\": _2, \"sp\": _2, \"sr\": _2, \"ss\": _2, \"suedtirol\": _2, \"xn--sdtirol-n2a\": _2, \"südtirol\": _2, \"sv\": _2, \"ta\": _2, \"taranto\": _2, \"te\": _2, \"tempio-olbia\": _2, \"tempioolbia\": _2, \"teramo\": _2, \"terni\": _2, \"tn\": _2, \"to\": _2, \"torino\": _2, \"tp\": _2, \"tr\": _2, \"trani-andria-barletta\": _2, \"trani-barletta-andria\": _2, \"traniandriabarletta\": _2, \"tranibarlettaandria\": _2, \"trapani\": _2, \"trento\": _2, \"treviso\": _2, \"trieste\": _2, \"ts\": _2, \"turin\": _2, \"tv\": _2, \"ud\": _2, \"udine\": _2, \"urbino-pesaro\": _2, \"urbinopesaro\": _2, \"va\": _2, \"varese\": _2, \"vb\": _2, \"vc\": _2, \"ve\": _2, \"venezia\": _2, \"venice\": _2, \"verbania\": _2, \"vercelli\": _2, \"verona\": _2, \"vi\": _2, \"vibo-valentia\": _2, \"vibovalentia\": _2, \"vicenza\": _2, \"viterbo\": _2, \"vr\": _2, \"vs\": _2, \"vt\": _2, \"vv\": _2, \"blogspot\": _3, \"ibxos\": _3, \"iliadboxos\": _3, \"neen\": { \"$\": 0, \"succ\": { \"jc\": _3 } }, \"tim\": { \"$\": 0, \"succ\": { \"open\": { \"$\": 0, \"succ\": { \"jelastic\": _9 } } } }, \"16-b\": _3, \"32-b\": _3, \"64-b\": _3, \"123homepage\": _3, \"myspreadshop\": _3, \"syncloud\": _3 } }, \"je\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"of\": _3 } }, \"jm\": _8, \"jo\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"sch\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2 } }, \"jobs\": _2, \"jp\": { \"$\": 1, \"succ\": { \"ac\": _2, \"ad\": _2, \"co\": _2, \"ed\": _2, \"go\": _2, \"gr\": _2, \"lg\": _2, \"ne\": { \"$\": 1, \"succ\": { \"aseinet\": _28, \"gehirn\": _3, \"ivory\": _3, \"mail-box\": _3, \"mints\": _3, \"mokuren\": _3, \"opal\": _3, \"sakura\": _3, \"sumomo\": _3, \"topaz\": _3 } }, \"or\": _2, \"aichi\": { \"$\": 1, \"succ\": { \"aisai\": _2, \"ama\": _2, \"anjo\": _2, \"asuke\": _2, \"chiryu\": _2, \"chita\": _2, \"fuso\": _2, \"gamagori\": _2, \"handa\": _2, \"hazu\": _2, \"hekinan\": _2, \"higashiura\": _2, \"ichinomiya\": _2, \"inazawa\": _2, \"inuyama\": _2, \"isshiki\": _2, \"iwakura\": _2, \"kanie\": _2, \"kariya\": _2, \"kasugai\": _2, \"kira\": _2, \"kiyosu\": _2, \"komaki\": _2, \"konan\": _2, \"kota\": _2, \"mihama\": _2, \"miyoshi\": _2, \"nishio\": _2, \"nisshin\": _2, \"obu\": _2, \"oguchi\": _2, \"oharu\": _2, \"okazaki\": _2, \"owariasahi\": _2, \"seto\": _2, \"shikatsu\": _2, \"shinshiro\": _2, \"shitara\": _2, \"tahara\": _2, \"takahama\": _2, \"tobishima\": _2, \"toei\": _2, \"togo\": _2, \"tokai\": _2, \"tokoname\": _2, \"toyoake\": _2, \"toyohashi\": _2, \"toyokawa\": _2, \"toyone\": _2, \"toyota\": _2, \"tsushima\": _2, \"yatomi\": _2 } }, \"akita\": { \"$\": 1, \"succ\": { \"akita\": _2, \"daisen\": _2, \"fujisato\": _2, \"gojome\": _2, \"hachirogata\": _2, \"happou\": _2, \"higashinaruse\": _2, \"honjo\": _2, \"honjyo\": _2, \"ikawa\": _2, \"kamikoani\": _2, \"kamioka\": _2, \"katagami\": _2, \"kazuno\": _2, \"kitaakita\": _2, \"kosaka\": _2, \"kyowa\": _2, \"misato\": _2, \"mitane\": _2, \"moriyoshi\": _2, \"nikaho\": _2, \"noshiro\": _2, \"odate\": _2, \"oga\": _2, \"ogata\": _2, \"semboku\": _2, \"yokote\": _2, \"yurihonjo\": _2 } }, \"aomori\": { \"$\": 1, \"succ\": { \"aomori\": _2, \"gonohe\": _2, \"hachinohe\": _2, \"hashikami\": _2, \"hiranai\": _2, \"hirosaki\": _2, \"itayanagi\": _2, \"kuroishi\": _2, \"misawa\": _2, \"mutsu\": _2, \"nakadomari\": _2, \"noheji\": _2, \"oirase\": _2, \"owani\": _2, \"rokunohe\": _2, \"sannohe\": _2, \"shichinohe\": _2, \"shingo\": _2, \"takko\": _2, \"towada\": _2, \"tsugaru\": _2, \"tsuruta\": _2 } }, \"chiba\": { \"$\": 1, \"succ\": { \"abiko\": _2, \"asahi\": _2, \"chonan\": _2, \"chosei\": _2, \"choshi\": _2, \"chuo\": _2, \"funabashi\": _2, \"futtsu\": _2, \"hanamigawa\": _2, \"ichihara\": _2, \"ichikawa\": _2, \"ichinomiya\": _2, \"inzai\": _2, \"isumi\": _2, \"kamagaya\": _2, \"kamogawa\": _2, \"kashiwa\": _2, \"katori\": _2, \"katsuura\": _2, \"kimitsu\": _2, \"kisarazu\": _2, \"kozaki\": _2, \"kujukuri\": _2, \"kyonan\": _2, \"matsudo\": _2, \"midori\": _2, \"mihama\": _2, \"minamiboso\": _2, \"mobara\": _2, \"mutsuzawa\": _2, \"nagara\": _2, \"nagareyama\": _2, \"narashino\": _2, \"narita\": _2, \"noda\": _2, \"oamishirasato\": _2, \"omigawa\": _2, \"onjuku\": _2, \"otaki\": _2, \"sakae\": _2, \"sakura\": _2, \"shimofusa\": _2, \"shirako\": _2, \"shiroi\": _2, \"shisui\": _2, \"sodegaura\": _2, \"sosa\": _2, \"tako\": _2, \"tateyama\": _2, \"togane\": _2, \"tohnosho\": _2, \"tomisato\": _2, \"urayasu\": _2, \"yachimata\": _2, \"yachiyo\": _2, \"yokaichiba\": _2, \"yokoshibahikari\": _2, \"yotsukaido\": _2 } }, \"ehime\": { \"$\": 1, \"succ\": { \"ainan\": _2, \"honai\": _2, \"ikata\": _2, \"imabari\": _2, \"iyo\": _2, \"kamijima\": _2, \"kihoku\": _2, \"kumakogen\": _2, \"masaki\": _2, \"matsuno\": _2, \"matsuyama\": _2, \"namikata\": _2, \"niihama\": _2, \"ozu\": _2, \"saijo\": _2, \"seiyo\": _2, \"shikokuchuo\": _2, \"tobe\": _2, \"toon\": _2, \"uchiko\": _2, \"uwajima\": _2, \"yawatahama\": _2 } }, \"fukui\": { \"$\": 1, \"succ\": { \"echizen\": _2, \"eiheiji\": _2, \"fukui\": _2, \"ikeda\": _2, \"katsuyama\": _2, \"mihama\": _2, \"minamiechizen\": _2, \"obama\": _2, \"ohi\": _2, \"ono\": _2, \"sabae\": _2, \"sakai\": _2, \"takahama\": _2, \"tsuruga\": _2, \"wakasa\": _2 } }, \"fukuoka\": { \"$\": 1, \"succ\": { \"ashiya\": _2, \"buzen\": _2, \"chikugo\": _2, \"chikuho\": _2, \"chikujo\": _2, \"chikushino\": _2, \"chikuzen\": _2, \"chuo\": _2, \"dazaifu\": _2, \"fukuchi\": _2, \"hakata\": _2, \"higashi\": _2, \"hirokawa\": _2, \"hisayama\": _2, \"iizuka\": _2, \"inatsuki\": _2, \"kaho\": _2, \"kasuga\": _2, \"kasuya\": _2, \"kawara\": _2, \"keisen\": _2, \"koga\": _2, \"kurate\": _2, \"kurogi\": _2, \"kurume\": _2, \"minami\": _2, \"miyako\": _2, \"miyama\": _2, \"miyawaka\": _2, \"mizumaki\": _2, \"munakata\": _2, \"nakagawa\": _2, \"nakama\": _2, \"nishi\": _2, \"nogata\": _2, \"ogori\": _2, \"okagaki\": _2, \"okawa\": _2, \"oki\": _2, \"omuta\": _2, \"onga\": _2, \"onojo\": _2, \"oto\": _2, \"saigawa\": _2, \"sasaguri\": _2, \"shingu\": _2, \"shinyoshitomi\": _2, \"shonai\": _2, \"soeda\": _2, \"sue\": _2, \"tachiarai\": _2, \"tagawa\": _2, \"takata\": _2, \"toho\": _2, \"toyotsu\": _2, \"tsuiki\": _2, \"ukiha\": _2, \"umi\": _2, \"usui\": _2, \"yamada\": _2, \"yame\": _2, \"yanagawa\": _2, \"yukuhashi\": _2 } }, \"fukushima\": { \"$\": 1, \"succ\": { \"aizubange\": _2, \"aizumisato\": _2, \"aizuwakamatsu\": _2, \"asakawa\": _2, \"bandai\": _2, \"date\": _2, \"fukushima\": _2, \"furudono\": _2, \"futaba\": _2, \"hanawa\": _2, \"higashi\": _2, \"hirata\": _2, \"hirono\": _2, \"iitate\": _2, \"inawashiro\": _2, \"ishikawa\": _2, \"iwaki\": _2, \"izumizaki\": _2, \"kagamiishi\": _2, \"kaneyama\": _2, \"kawamata\": _2, \"kitakata\": _2, \"kitashiobara\": _2, \"koori\": _2, \"koriyama\": _2, \"kunimi\": _2, \"miharu\": _2, \"mishima\": _2, \"namie\": _2, \"nango\": _2, \"nishiaizu\": _2, \"nishigo\": _2, \"okuma\": _2, \"omotego\": _2, \"ono\": _2, \"otama\": _2, \"samegawa\": _2, \"shimogo\": _2, \"shirakawa\": _2, \"showa\": _2, \"soma\": _2, \"sukagawa\": _2, \"taishin\": _2, \"tamakawa\": _2, \"tanagura\": _2, \"tenei\": _2, \"yabuki\": _2, \"yamato\": _2, \"yamatsuri\": _2, \"yanaizu\": _2, \"yugawa\": _2 } }, \"gifu\": { \"$\": 1, \"succ\": { \"anpachi\": _2, \"ena\": _2, \"gifu\": _2, \"ginan\": _2, \"godo\": _2, \"gujo\": _2, \"hashima\": _2, \"hichiso\": _2, \"hida\": _2, \"higashishirakawa\": _2, \"ibigawa\": _2, \"ikeda\": _2, \"kakamigahara\": _2, \"kani\": _2, \"kasahara\": _2, \"kasamatsu\": _2, \"kawaue\": _2, \"kitagata\": _2, \"mino\": _2, \"minokamo\": _2, \"mitake\": _2, \"mizunami\": _2, \"motosu\": _2, \"nakatsugawa\": _2, \"ogaki\": _2, \"sakahogi\": _2, \"seki\": _2, \"sekigahara\": _2, \"shirakawa\": _2, \"tajimi\": _2, \"takayama\": _2, \"tarui\": _2, \"toki\": _2, \"tomika\": _2, \"wanouchi\": _2, \"yamagata\": _2, \"yaotsu\": _2, \"yoro\": _2 } }, \"gunma\": { \"$\": 1, \"succ\": { \"annaka\": _2, \"chiyoda\": _2, \"fujioka\": _2, \"higashiagatsuma\": _2, \"isesaki\": _2, \"itakura\": _2, \"kanna\": _2, \"kanra\": _2, \"katashina\": _2, \"kawaba\": _2, \"kiryu\": _2, \"kusatsu\": _2, \"maebashi\": _2, \"meiwa\": _2, \"midori\": _2, \"minakami\": _2, \"naganohara\": _2, \"nakanojo\": _2, \"nanmoku\": _2, \"numata\": _2, \"oizumi\": _2, \"ora\": _2, \"ota\": _2, \"shibukawa\": _2, \"shimonita\": _2, \"shinto\": _2, \"showa\": _2, \"takasaki\": _2, \"takayama\": _2, \"tamamura\": _2, \"tatebayashi\": _2, \"tomioka\": _2, \"tsukiyono\": _2, \"tsumagoi\": _2, \"ueno\": _2, \"yoshioka\": _2 } }, \"hiroshima\": { \"$\": 1, \"succ\": { \"asaminami\": _2, \"daiwa\": _2, \"etajima\": _2, \"fuchu\": _2, \"fukuyama\": _2, \"hatsukaichi\": _2, \"higashihiroshima\": _2, \"hongo\": _2, \"jinsekikogen\": _2, \"kaita\": _2, \"kui\": _2, \"kumano\": _2, \"kure\": _2, \"mihara\": _2, \"miyoshi\": _2, \"naka\": _2, \"onomichi\": _2, \"osakikamijima\": _2, \"otake\": _2, \"saka\": _2, \"sera\": _2, \"seranishi\": _2, \"shinichi\": _2, \"shobara\": _2, \"takehara\": _2 } }, \"hokkaido\": { \"$\": 1, \"succ\": { \"abashiri\": _2, \"abira\": _2, \"aibetsu\": _2, \"akabira\": _2, \"akkeshi\": _2, \"asahikawa\": _2, \"ashibetsu\": _2, \"ashoro\": _2, \"assabu\": _2, \"atsuma\": _2, \"bibai\": _2, \"biei\": _2, \"bifuka\": _2, \"bihoro\": _2, \"biratori\": _2, \"chippubetsu\": _2, \"chitose\": _2, \"date\": _2, \"ebetsu\": _2, \"embetsu\": _2, \"eniwa\": _2, \"erimo\": _2, \"esan\": _2, \"esashi\": _2, \"fukagawa\": _2, \"fukushima\": _2, \"furano\": _2, \"furubira\": _2, \"haboro\": _2, \"hakodate\": _2, \"hamatonbetsu\": _2, \"hidaka\": _2, \"higashikagura\": _2, \"higashikawa\": _2, \"hiroo\": _2, \"hokuryu\": _2, \"hokuto\": _2, \"honbetsu\": _2, \"horokanai\": _2, \"horonobe\": _2, \"ikeda\": _2, \"imakane\": _2, \"ishikari\": _2, \"iwamizawa\": _2, \"iwanai\": _2, \"kamifurano\": _2, \"kamikawa\": _2, \"kamishihoro\": _2, \"kamisunagawa\": _2, \"kamoenai\": _2, \"kayabe\": _2, \"kembuchi\": _2, \"kikonai\": _2, \"kimobetsu\": _2, \"kitahiroshima\": _2, \"kitami\": _2, \"kiyosato\": _2, \"koshimizu\": _2, \"kunneppu\": _2, \"kuriyama\": _2, \"kuromatsunai\": _2, \"kushiro\": _2, \"kutchan\": _2, \"kyowa\": _2, \"mashike\": _2, \"matsumae\": _2, \"mikasa\": _2, \"minamifurano\": _2, \"mombetsu\": _2, \"moseushi\": _2, \"mukawa\": _2, \"muroran\": _2, \"naie\": _2, \"nakagawa\": _2, \"nakasatsunai\": _2, \"nakatombetsu\": _2, \"nanae\": _2, \"nanporo\": _2, \"nayoro\": _2, \"nemuro\": _2, \"niikappu\": _2, \"niki\": _2, \"nishiokoppe\": _2, \"noboribetsu\": _2, \"numata\": _2, \"obihiro\": _2, \"obira\": _2, \"oketo\": _2, \"okoppe\": _2, \"otaru\": _2, \"otobe\": _2, \"otofuke\": _2, \"otoineppu\": _2, \"oumu\": _2, \"ozora\": _2, \"pippu\": _2, \"rankoshi\": _2, \"rebun\": _2, \"rikubetsu\": _2, \"rishiri\": _2, \"rishirifuji\": _2, \"saroma\": _2, \"sarufutsu\": _2, \"shakotan\": _2, \"shari\": _2, \"shibecha\": _2, \"shibetsu\": _2, \"shikabe\": _2, \"shikaoi\": _2, \"shimamaki\": _2, \"shimizu\": _2, \"shimokawa\": _2, \"shinshinotsu\": _2, \"shintoku\": _2, \"shiranuka\": _2, \"shiraoi\": _2, \"shiriuchi\": _2, \"sobetsu\": _2, \"sunagawa\": _2, \"taiki\": _2, \"takasu\": _2, \"takikawa\": _2, \"takinoue\": _2, \"teshikaga\": _2, \"tobetsu\": _2, \"tohma\": _2, \"tomakomai\": _2, \"tomari\": _2, \"toya\": _2, \"toyako\": _2, \"toyotomi\": _2, \"toyoura\": _2, \"tsubetsu\": _2, \"tsukigata\": _2, \"urakawa\": _2, \"urausu\": _2, \"uryu\": _2, \"utashinai\": _2, \"wakkanai\": _2, \"wassamu\": _2, \"yakumo\": _2, \"yoichi\": _2 } }, \"hyogo\": { \"$\": 1, \"succ\": { \"aioi\": _2, \"akashi\": _2, \"ako\": _2, \"amagasaki\": _2, \"aogaki\": _2, \"asago\": _2, \"ashiya\": _2, \"awaji\": _2, \"fukusaki\": _2, \"goshiki\": _2, \"harima\": _2, \"himeji\": _2, \"ichikawa\": _2, \"inagawa\": _2, \"itami\": _2, \"kakogawa\": _2, \"kamigori\": _2, \"kamikawa\": _2, \"kasai\": _2, \"kasuga\": _2, \"kawanishi\": _2, \"miki\": _2, \"minamiawaji\": _2, \"nishinomiya\": _2, \"nishiwaki\": _2, \"ono\": _2, \"sanda\": _2, \"sannan\": _2, \"sasayama\": _2, \"sayo\": _2, \"shingu\": _2, \"shinonsen\": _2, \"shiso\": _2, \"sumoto\": _2, \"taishi\": _2, \"taka\": _2, \"takarazuka\": _2, \"takasago\": _2, \"takino\": _2, \"tamba\": _2, \"tatsuno\": _2, \"toyooka\": _2, \"yabu\": _2, \"yashiro\": _2, \"yoka\": _2, \"yokawa\": _2 } }, \"ibaraki\": { \"$\": 1, \"succ\": { \"ami\": _2, \"asahi\": _2, \"bando\": _2, \"chikusei\": _2, \"daigo\": _2, \"fujishiro\": _2, \"hitachi\": _2, \"hitachinaka\": _2, \"hitachiomiya\": _2, \"hitachiota\": _2, \"ibaraki\": _2, \"ina\": _2, \"inashiki\": _2, \"itako\": _2, \"iwama\": _2, \"joso\": _2, \"kamisu\": _2, \"kasama\": _2, \"kashima\": _2, \"kasumigaura\": _2, \"koga\": _2, \"miho\": _2, \"mito\": _2, \"moriya\": _2, \"naka\": _2, \"namegata\": _2, \"oarai\": _2, \"ogawa\": _2, \"omitama\": _2, \"ryugasaki\": _2, \"sakai\": _2, \"sakuragawa\": _2, \"shimodate\": _2, \"shimotsuma\": _2, \"shirosato\": _2, \"sowa\": _2, \"suifu\": _2, \"takahagi\": _2, \"tamatsukuri\": _2, \"tokai\": _2, \"tomobe\": _2, \"tone\": _2, \"toride\": _2, \"tsuchiura\": _2, \"tsukuba\": _2, \"uchihara\": _2, \"ushiku\": _2, \"yachiyo\": _2, \"yamagata\": _2, \"yawara\": _2, \"yuki\": _2 } }, \"ishikawa\": { \"$\": 1, \"succ\": { \"anamizu\": _2, \"hakui\": _2, \"hakusan\": _2, \"kaga\": _2, \"kahoku\": _2, \"kanazawa\": _2, \"kawakita\": _2, \"komatsu\": _2, \"nakanoto\": _2, \"nanao\": _2, \"nomi\": _2, \"nonoichi\": _2, \"noto\": _2, \"shika\": _2, \"suzu\": _2, \"tsubata\": _2, \"tsurugi\": _2, \"uchinada\": _2, \"wajima\": _2 } }, \"iwate\": { \"$\": 1, \"succ\": { \"fudai\": _2, \"fujisawa\": _2, \"hanamaki\": _2, \"hiraizumi\": _2, \"hirono\": _2, \"ichinohe\": _2, \"ichinoseki\": _2, \"iwaizumi\": _2, \"iwate\": _2, \"joboji\": _2, \"kamaishi\": _2, \"kanegasaki\": _2, \"karumai\": _2, \"kawai\": _2, \"kitakami\": _2, \"kuji\": _2, \"kunohe\": _2, \"kuzumaki\": _2, \"miyako\": _2, \"mizusawa\": _2, \"morioka\": _2, \"ninohe\": _2, \"noda\": _2, \"ofunato\": _2, \"oshu\": _2, \"otsuchi\": _2, \"rikuzentakata\": _2, \"shiwa\": _2, \"shizukuishi\": _2, \"sumita\": _2, \"tanohata\": _2, \"tono\": _2, \"yahaba\": _2, \"yamada\": _2 } }, \"kagawa\": { \"$\": 1, \"succ\": { \"ayagawa\": _2, \"higashikagawa\": _2, \"kanonji\": _2, \"kotohira\": _2, \"manno\": _2, \"marugame\": _2, \"mitoyo\": _2, \"naoshima\": _2, \"sanuki\": _2, \"tadotsu\": _2, \"takamatsu\": _2, \"tonosho\": _2, \"uchinomi\": _2, \"utazu\": _2, \"zentsuji\": _2 } }, \"kagoshima\": { \"$\": 1, \"succ\": { \"akune\": _2, \"amami\": _2, \"hioki\": _2, \"isa\": _2, \"isen\": _2, \"izumi\": _2, \"kagoshima\": _2, \"kanoya\": _2, \"kawanabe\": _2, \"kinko\": _2, \"kouyama\": _2, \"makurazaki\": _2, \"matsumoto\": _2, \"minamitane\": _2, \"nakatane\": _2, \"nishinoomote\": _2, \"satsumasendai\": _2, \"soo\": _2, \"tarumizu\": _2, \"yusui\": _2 } }, \"kanagawa\": { \"$\": 1, \"succ\": { \"aikawa\": _2, \"atsugi\": _2, \"ayase\": _2, \"chigasaki\": _2, \"ebina\": _2, \"fujisawa\": _2, \"hadano\": _2, \"hakone\": _2, \"hiratsuka\": _2, \"isehara\": _2, \"kaisei\": _2, \"kamakura\": _2, \"kiyokawa\": _2, \"matsuda\": _2, \"minamiashigara\": _2, \"miura\": _2, \"nakai\": _2, \"ninomiya\": _2, \"odawara\": _2, \"oi\": _2, \"oiso\": _2, \"sagamihara\": _2, \"samukawa\": _2, \"tsukui\": _2, \"yamakita\": _2, \"yamato\": _2, \"yokosuka\": _2, \"yugawara\": _2, \"zama\": _2, \"zushi\": _2 } }, \"kochi\": { \"$\": 1, \"succ\": { \"aki\": _2, \"geisei\": _2, \"hidaka\": _2, \"higashitsuno\": _2, \"ino\": _2, \"kagami\": _2, \"kami\": _2, \"kitagawa\": _2, \"kochi\": _2, \"mihara\": _2, \"motoyama\": _2, \"muroto\": _2, \"nahari\": _2, \"nakamura\": _2, \"nankoku\": _2, \"nishitosa\": _2, \"niyodogawa\": _2, \"ochi\": _2, \"okawa\": _2, \"otoyo\": _2, \"otsuki\": _2, \"sakawa\": _2, \"sukumo\": _2, \"susaki\": _2, \"tosa\": _2, \"tosashimizu\": _2, \"toyo\": _2, \"tsuno\": _2, \"umaji\": _2, \"yasuda\": _2, \"yusuhara\": _2 } }, \"kumamoto\": { \"$\": 1, \"succ\": { \"amakusa\": _2, \"arao\": _2, \"aso\": _2, \"choyo\": _2, \"gyokuto\": _2, \"kamiamakusa\": _2, \"kikuchi\": _2, \"kumamoto\": _2, \"mashiki\": _2, \"mifune\": _2, \"minamata\": _2, \"minamioguni\": _2, \"nagasu\": _2, \"nishihara\": _2, \"oguni\": _2, \"ozu\": _2, \"sumoto\": _2, \"takamori\": _2, \"uki\": _2, \"uto\": _2, \"yamaga\": _2, \"yamato\": _2, \"yatsushiro\": _2 } }, \"kyoto\": { \"$\": 1, \"succ\": { \"ayabe\": _2, \"fukuchiyama\": _2, \"higashiyama\": _2, \"ide\": _2, \"ine\": _2, \"joyo\": _2, \"kameoka\": _2, \"kamo\": _2, \"kita\": _2, \"kizu\": _2, \"kumiyama\": _2, \"kyotamba\": _2, \"kyotanabe\": _2, \"kyotango\": _2, \"maizuru\": _2, \"minami\": _2, \"minamiyamashiro\": _2, \"miyazu\": _2, \"muko\": _2, \"nagaokakyo\": _2, \"nakagyo\": _2, \"nantan\": _2, \"oyamazaki\": _2, \"sakyo\": _2, \"seika\": _2, \"tanabe\": _2, \"uji\": _2, \"ujitawara\": _2, \"wazuka\": _2, \"yamashina\": _2, \"yawata\": _2 } }, \"mie\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"inabe\": _2, \"ise\": _2, \"kameyama\": _2, \"kawagoe\": _2, \"kiho\": _2, \"kisosaki\": _2, \"kiwa\": _2, \"komono\": _2, \"kumano\": _2, \"kuwana\": _2, \"matsusaka\": _2, \"meiwa\": _2, \"mihama\": _2, \"minamiise\": _2, \"misugi\": _2, \"miyama\": _2, \"nabari\": _2, \"shima\": _2, \"suzuka\": _2, \"tado\": _2, \"taiki\": _2, \"taki\": _2, \"tamaki\": _2, \"toba\": _2, \"tsu\": _2, \"udono\": _2, \"ureshino\": _2, \"watarai\": _2, \"yokkaichi\": _2 } }, \"miyagi\": { \"$\": 1, \"succ\": { \"furukawa\": _2, \"higashimatsushima\": _2, \"ishinomaki\": _2, \"iwanuma\": _2, \"kakuda\": _2, \"kami\": _2, \"kawasaki\": _2, \"marumori\": _2, \"matsushima\": _2, \"minamisanriku\": _2, \"misato\": _2, \"murata\": _2, \"natori\": _2, \"ogawara\": _2, \"ohira\": _2, \"onagawa\": _2, \"osaki\": _2, \"rifu\": _2, \"semine\": _2, \"shibata\": _2, \"shichikashuku\": _2, \"shikama\": _2, \"shiogama\": _2, \"shiroishi\": _2, \"tagajo\": _2, \"taiwa\": _2, \"tome\": _2, \"tomiya\": _2, \"wakuya\": _2, \"watari\": _2, \"yamamoto\": _2, \"zao\": _2 } }, \"miyazaki\": { \"$\": 1, \"succ\": { \"aya\": _2, \"ebino\": _2, \"gokase\": _2, \"hyuga\": _2, \"kadogawa\": _2, \"kawaminami\": _2, \"kijo\": _2, \"kitagawa\": _2, \"kitakata\": _2, \"kitaura\": _2, \"kobayashi\": _2, \"kunitomi\": _2, \"kushima\": _2, \"mimata\": _2, \"miyakonojo\": _2, \"miyazaki\": _2, \"morotsuka\": _2, \"nichinan\": _2, \"nishimera\": _2, \"nobeoka\": _2, \"saito\": _2, \"shiiba\": _2, \"shintomi\": _2, \"takaharu\": _2, \"takanabe\": _2, \"takazaki\": _2, \"tsuno\": _2 } }, \"nagano\": { \"$\": 1, \"succ\": { \"achi\": _2, \"agematsu\": _2, \"anan\": _2, \"aoki\": _2, \"asahi\": _2, \"azumino\": _2, \"chikuhoku\": _2, \"chikuma\": _2, \"chino\": _2, \"fujimi\": _2, \"hakuba\": _2, \"hara\": _2, \"hiraya\": _2, \"iida\": _2, \"iijima\": _2, \"iiyama\": _2, \"iizuna\": _2, \"ikeda\": _2, \"ikusaka\": _2, \"ina\": _2, \"karuizawa\": _2, \"kawakami\": _2, \"kiso\": _2, \"kisofukushima\": _2, \"kitaaiki\": _2, \"komagane\": _2, \"komoro\": _2, \"matsukawa\": _2, \"matsumoto\": _2, \"miasa\": _2, \"minamiaiki\": _2, \"minamimaki\": _2, \"minamiminowa\": _2, \"minowa\": _2, \"miyada\": _2, \"miyota\": _2, \"mochizuki\": _2, \"nagano\": _2, \"nagawa\": _2, \"nagiso\": _2, \"nakagawa\": _2, \"nakano\": _2, \"nozawaonsen\": _2, \"obuse\": _2, \"ogawa\": _2, \"okaya\": _2, \"omachi\": _2, \"omi\": _2, \"ookuwa\": _2, \"ooshika\": _2, \"otaki\": _2, \"otari\": _2, \"sakae\": _2, \"sakaki\": _2, \"saku\": _2, \"sakuho\": _2, \"shimosuwa\": _2, \"shinanomachi\": _2, \"shiojiri\": _2, \"suwa\": _2, \"suzaka\": _2, \"takagi\": _2, \"takamori\": _2, \"takayama\": _2, \"tateshina\": _2, \"tatsuno\": _2, \"togakushi\": _2, \"togura\": _2, \"tomi\": _2, \"ueda\": _2, \"wada\": _2, \"yamagata\": _2, \"yamanouchi\": _2, \"yasaka\": _2, \"yasuoka\": _2 } }, \"nagasaki\": { \"$\": 1, \"succ\": { \"chijiwa\": _2, \"futsu\": _2, \"goto\": _2, \"hasami\": _2, \"hirado\": _2, \"iki\": _2, \"isahaya\": _2, \"kawatana\": _2, \"kuchinotsu\": _2, \"matsuura\": _2, \"nagasaki\": _2, \"obama\": _2, \"omura\": _2, \"oseto\": _2, \"saikai\": _2, \"sasebo\": _2, \"seihi\": _2, \"shimabara\": _2, \"shinkamigoto\": _2, \"togitsu\": _2, \"tsushima\": _2, \"unzen\": _2 } }, \"nara\": { \"$\": 1, \"succ\": { \"ando\": _2, \"gose\": _2, \"heguri\": _2, \"higashiyoshino\": _2, \"ikaruga\": _2, \"ikoma\": _2, \"kamikitayama\": _2, \"kanmaki\": _2, \"kashiba\": _2, \"kashihara\": _2, \"katsuragi\": _2, \"kawai\": _2, \"kawakami\": _2, \"kawanishi\": _2, \"koryo\": _2, \"kurotaki\": _2, \"mitsue\": _2, \"miyake\": _2, \"nara\": _2, \"nosegawa\": _2, \"oji\": _2, \"ouda\": _2, \"oyodo\": _2, \"sakurai\": _2, \"sango\": _2, \"shimoichi\": _2, \"shimokitayama\": _2, \"shinjo\": _2, \"soni\": _2, \"takatori\": _2, \"tawaramoto\": _2, \"tenkawa\": _2, \"tenri\": _2, \"uda\": _2, \"yamatokoriyama\": _2, \"yamatotakada\": _2, \"yamazoe\": _2, \"yoshino\": _2 } }, \"niigata\": { \"$\": 1, \"succ\": { \"aga\": _2, \"agano\": _2, \"gosen\": _2, \"itoigawa\": _2, \"izumozaki\": _2, \"joetsu\": _2, \"kamo\": _2, \"kariwa\": _2, \"kashiwazaki\": _2, \"minamiuonuma\": _2, \"mitsuke\": _2, \"muika\": _2, \"murakami\": _2, \"myoko\": _2, \"nagaoka\": _2, \"niigata\": _2, \"ojiya\": _2, \"omi\": _2, \"sado\": _2, \"sanjo\": _2, \"seiro\": _2, \"seirou\": _2, \"sekikawa\": _2, \"shibata\": _2, \"tagami\": _2, \"tainai\": _2, \"tochio\": _2, \"tokamachi\": _2, \"tsubame\": _2, \"tsunan\": _2, \"uonuma\": _2, \"yahiko\": _2, \"yoita\": _2, \"yuzawa\": _2 } }, \"oita\": { \"$\": 1, \"succ\": { \"beppu\": _2, \"bungoono\": _2, \"bungotakada\": _2, \"hasama\": _2, \"hiji\": _2, \"himeshima\": _2, \"hita\": _2, \"kamitsue\": _2, \"kokonoe\": _2, \"kuju\": _2, \"kunisaki\": _2, \"kusu\": _2, \"oita\": _2, \"saiki\": _2, \"taketa\": _2, \"tsukumi\": _2, \"usa\": _2, \"usuki\": _2, \"yufu\": _2 } }, \"okayama\": { \"$\": 1, \"succ\": { \"akaiwa\": _2, \"asakuchi\": _2, \"bizen\": _2, \"hayashima\": _2, \"ibara\": _2, \"kagamino\": _2, \"kasaoka\": _2, \"kibichuo\": _2, \"kumenan\": _2, \"kurashiki\": _2, \"maniwa\": _2, \"misaki\": _2, \"nagi\": _2, \"niimi\": _2, \"nishiawakura\": _2, \"okayama\": _2, \"satosho\": _2, \"setouchi\": _2, \"shinjo\": _2, \"shoo\": _2, \"soja\": _2, \"takahashi\": _2, \"tamano\": _2, \"tsuyama\": _2, \"wake\": _2, \"yakage\": _2 } }, \"okinawa\": { \"$\": 1, \"succ\": { \"aguni\": _2, \"ginowan\": _2, \"ginoza\": _2, \"gushikami\": _2, \"haebaru\": _2, \"higashi\": _2, \"hirara\": _2, \"iheya\": _2, \"ishigaki\": _2, \"ishikawa\": _2, \"itoman\": _2, \"izena\": _2, \"kadena\": _2, \"kin\": _2, \"kitadaito\": _2, \"kitanakagusuku\": _2, \"kumejima\": _2, \"kunigami\": _2, \"minamidaito\": _2, \"motobu\": _2, \"nago\": _2, \"naha\": _2, \"nakagusuku\": _2, \"nakijin\": _2, \"nanjo\": _2, \"nishihara\": _2, \"ogimi\": _2, \"okinawa\": _2, \"onna\": _2, \"shimoji\": _2, \"taketomi\": _2, \"tarama\": _2, \"tokashiki\": _2, \"tomigusuku\": _2, \"tonaki\": _2, \"urasoe\": _2, \"uruma\": _2, \"yaese\": _2, \"yomitan\": _2, \"yonabaru\": _2, \"yonaguni\": _2, \"zamami\": _2 } }, \"osaka\": { \"$\": 1, \"succ\": { \"abeno\": _2, \"chihayaakasaka\": _2, \"chuo\": _2, \"daito\": _2, \"fujiidera\": _2, \"habikino\": _2, \"hannan\": _2, \"higashiosaka\": _2, \"higashisumiyoshi\": _2, \"higashiyodogawa\": _2, \"hirakata\": _2, \"ibaraki\": _2, \"ikeda\": _2, \"izumi\": _2, \"izumiotsu\": _2, \"izumisano\": _2, \"kadoma\": _2, \"kaizuka\": _2, \"kanan\": _2, \"kashiwara\": _2, \"katano\": _2, \"kawachinagano\": _2, \"kishiwada\": _2, \"kita\": _2, \"kumatori\": _2, \"matsubara\": _2, \"minato\": _2, \"minoh\": _2, \"misaki\": _2, \"moriguchi\": _2, \"neyagawa\": _2, \"nishi\": _2, \"nose\": _2, \"osakasayama\": _2, \"sakai\": _2, \"sayama\": _2, \"sennan\": _2, \"settsu\": _2, \"shijonawate\": _2, \"shimamoto\": _2, \"suita\": _2, \"tadaoka\": _2, \"taishi\": _2, \"tajiri\": _2, \"takaishi\": _2, \"takatsuki\": _2, \"tondabayashi\": _2, \"toyonaka\": _2, \"toyono\": _2, \"yao\": _2 } }, \"saga\": { \"$\": 1, \"succ\": { \"ariake\": _2, \"arita\": _2, \"fukudomi\": _2, \"genkai\": _2, \"hamatama\": _2, \"hizen\": _2, \"imari\": _2, \"kamimine\": _2, \"kanzaki\": _2, \"karatsu\": _2, \"kashima\": _2, \"kitagata\": _2, \"kitahata\": _2, \"kiyama\": _2, \"kouhoku\": _2, \"kyuragi\": _2, \"nishiarita\": _2, \"ogi\": _2, \"omachi\": _2, \"ouchi\": _2, \"saga\": _2, \"shiroishi\": _2, \"taku\": _2, \"tara\": _2, \"tosu\": _2, \"yoshinogari\": _2 } }, \"saitama\": { \"$\": 1, \"succ\": { \"arakawa\": _2, \"asaka\": _2, \"chichibu\": _2, \"fujimi\": _2, \"fujimino\": _2, \"fukaya\": _2, \"hanno\": _2, \"hanyu\": _2, \"hasuda\": _2, \"hatogaya\": _2, \"hatoyama\": _2, \"hidaka\": _2, \"higashichichibu\": _2, \"higashimatsuyama\": _2, \"honjo\": _2, \"ina\": _2, \"iruma\": _2, \"iwatsuki\": _2, \"kamiizumi\": _2, \"kamikawa\": _2, \"kamisato\": _2, \"kasukabe\": _2, \"kawagoe\": _2, \"kawaguchi\": _2, \"kawajima\": _2, \"kazo\": _2, \"kitamoto\": _2, \"koshigaya\": _2, \"kounosu\": _2, \"kuki\": _2, \"kumagaya\": _2, \"matsubushi\": _2, \"minano\": _2, \"misato\": _2, \"miyashiro\": _2, \"miyoshi\": _2, \"moroyama\": _2, \"nagatoro\": _2, \"namegawa\": _2, \"niiza\": _2, \"ogano\": _2, \"ogawa\": _2, \"ogose\": _2, \"okegawa\": _2, \"omiya\": _2, \"otaki\": _2, \"ranzan\": _2, \"ryokami\": _2, \"saitama\": _2, \"sakado\": _2, \"satte\": _2, \"sayama\": _2, \"shiki\": _2, \"shiraoka\": _2, \"soka\": _2, \"sugito\": _2, \"toda\": _2, \"tokigawa\": _2, \"tokorozawa\": _2, \"tsurugashima\": _2, \"urawa\": _2, \"warabi\": _2, \"yashio\": _2, \"yokoze\": _2, \"yono\": _2, \"yorii\": _2, \"yoshida\": _2, \"yoshikawa\": _2, \"yoshimi\": _2 } }, \"shiga\": { \"$\": 1, \"succ\": { \"aisho\": _2, \"gamo\": _2, \"higashiomi\": _2, \"hikone\": _2, \"koka\": _2, \"konan\": _2, \"kosei\": _2, \"koto\": _2, \"kusatsu\": _2, \"maibara\": _2, \"moriyama\": _2, \"nagahama\": _2, \"nishiazai\": _2, \"notogawa\": _2, \"omihachiman\": _2, \"otsu\": _2, \"ritto\": _2, \"ryuoh\": _2, \"takashima\": _2, \"takatsuki\": _2, \"torahime\": _2, \"toyosato\": _2, \"yasu\": _2 } }, \"shimane\": { \"$\": 1, \"succ\": { \"akagi\": _2, \"ama\": _2, \"gotsu\": _2, \"hamada\": _2, \"higashiizumo\": _2, \"hikawa\": _2, \"hikimi\": _2, \"izumo\": _2, \"kakinoki\": _2, \"masuda\": _2, \"matsue\": _2, \"misato\": _2, \"nishinoshima\": _2, \"ohda\": _2, \"okinoshima\": _2, \"okuizumo\": _2, \"shimane\": _2, \"tamayu\": _2, \"tsuwano\": _2, \"unnan\": _2, \"yakumo\": _2, \"yasugi\": _2, \"yatsuka\": _2 } }, \"shizuoka\": { \"$\": 1, \"succ\": { \"arai\": _2, \"atami\": _2, \"fuji\": _2, \"fujieda\": _2, \"fujikawa\": _2, \"fujinomiya\": _2, \"fukuroi\": _2, \"gotemba\": _2, \"haibara\": _2, \"hamamatsu\": _2, \"higashiizu\": _2, \"ito\": _2, \"iwata\": _2, \"izu\": _2, \"izunokuni\": _2, \"kakegawa\": _2, \"kannami\": _2, \"kawanehon\": _2, \"kawazu\": _2, \"kikugawa\": _2, \"kosai\": _2, \"makinohara\": _2, \"matsuzaki\": _2, \"minamiizu\": _2, \"mishima\": _2, \"morimachi\": _2, \"nishiizu\": _2, \"numazu\": _2, \"omaezaki\": _2, \"shimada\": _2, \"shimizu\": _2, \"shimoda\": _2, \"shizuoka\": _2, \"susono\": _2, \"yaizu\": _2, \"yoshida\": _2 } }, \"tochigi\": { \"$\": 1, \"succ\": { \"ashikaga\": _2, \"bato\": _2, \"haga\": _2, \"ichikai\": _2, \"iwafune\": _2, \"kaminokawa\": _2, \"kanuma\": _2, \"karasuyama\": _2, \"kuroiso\": _2, \"mashiko\": _2, \"mibu\": _2, \"moka\": _2, \"motegi\": _2, \"nasu\": _2, \"nasushiobara\": _2, \"nikko\": _2, \"nishikata\": _2, \"nogi\": _2, \"ohira\": _2, \"ohtawara\": _2, \"oyama\": _2, \"sakura\": _2, \"sano\": _2, \"shimotsuke\": _2, \"shioya\": _2, \"takanezawa\": _2, \"tochigi\": _2, \"tsuga\": _2, \"ujiie\": _2, \"utsunomiya\": _2, \"yaita\": _2 } }, \"tokushima\": { \"$\": 1, \"succ\": { \"aizumi\": _2, \"anan\": _2, \"ichiba\": _2, \"itano\": _2, \"kainan\": _2, \"komatsushima\": _2, \"matsushige\": _2, \"mima\": _2, \"minami\": _2, \"miyoshi\": _2, \"mugi\": _2, \"nakagawa\": _2, \"naruto\": _2, \"sanagochi\": _2, \"shishikui\": _2, \"tokushima\": _2, \"wajiki\": _2 } }, \"tokyo\": { \"$\": 1, \"succ\": { \"adachi\": _2, \"akiruno\": _2, \"akishima\": _2, \"aogashima\": _2, \"arakawa\": _2, \"bunkyo\": _2, \"chiyoda\": _2, \"chofu\": _2, \"chuo\": _2, \"edogawa\": _2, \"fuchu\": _2, \"fussa\": _2, \"hachijo\": _2, \"hachioji\": _2, \"hamura\": _2, \"higashikurume\": _2, \"higashimurayama\": _2, \"higashiyamato\": _2, \"hino\": _2, \"hinode\": _2, \"hinohara\": _2, \"inagi\": _2, \"itabashi\": _2, \"katsushika\": _2, \"kita\": _2, \"kiyose\": _2, \"kodaira\": _2, \"koganei\": _2, \"kokubunji\": _2, \"komae\": _2, \"koto\": _2, \"kouzushima\": _2, \"kunitachi\": _2, \"machida\": _2, \"meguro\": _2, \"minato\": _2, \"mitaka\": _2, \"mizuho\": _2, \"musashimurayama\": _2, \"musashino\": _2, \"nakano\": _2, \"nerima\": _2, \"ogasawara\": _2, \"okutama\": _2, \"ome\": _2, \"oshima\": _2, \"ota\": _2, \"setagaya\": _2, \"shibuya\": _2, \"shinagawa\": _2, \"shinjuku\": _2, \"suginami\": _2, \"sumida\": _2, \"tachikawa\": _2, \"taito\": _2, \"tama\": _2, \"toshima\": _2 } }, \"tottori\": { \"$\": 1, \"succ\": { \"chizu\": _2, \"hino\": _2, \"kawahara\": _2, \"koge\": _2, \"kotoura\": _2, \"misasa\": _2, \"nanbu\": _2, \"nichinan\": _2, \"sakaiminato\": _2, \"tottori\": _2, \"wakasa\": _2, \"yazu\": _2, \"yonago\": _2 } }, \"toyama\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"fuchu\": _2, \"fukumitsu\": _2, \"funahashi\": _2, \"himi\": _2, \"imizu\": _2, \"inami\": _2, \"johana\": _2, \"kamiichi\": _2, \"kurobe\": _2, \"nakaniikawa\": _2, \"namerikawa\": _2, \"nanto\": _2, \"nyuzen\": _2, \"oyabe\": _2, \"taira\": _2, \"takaoka\": _2, \"tateyama\": _2, \"toga\": _2, \"tonami\": _2, \"toyama\": _2, \"unazuki\": _2, \"uozu\": _2, \"yamada\": _2 } }, \"wakayama\": { \"$\": 1, \"succ\": { \"arida\": _2, \"aridagawa\": _2, \"gobo\": _2, \"hashimoto\": _2, \"hidaka\": _2, \"hirogawa\": _2, \"inami\": _2, \"iwade\": _2, \"kainan\": _2, \"kamitonda\": _2, \"katsuragi\": _2, \"kimino\": _2, \"kinokawa\": _2, \"kitayama\": _2, \"koya\": _2, \"koza\": _2, \"kozagawa\": _2, \"kudoyama\": _2, \"kushimoto\": _2, \"mihama\": _2, \"misato\": _2, \"nachikatsuura\": _2, \"shingu\": _2, \"shirahama\": _2, \"taiji\": _2, \"tanabe\": _2, \"wakayama\": _2, \"yuasa\": _2, \"yura\": _2 } }, \"yamagata\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"funagata\": _2, \"higashine\": _2, \"iide\": _2, \"kahoku\": _2, \"kaminoyama\": _2, \"kaneyama\": _2, \"kawanishi\": _2, \"mamurogawa\": _2, \"mikawa\": _2, \"murayama\": _2, \"nagai\": _2, \"nakayama\": _2, \"nanyo\": _2, \"nishikawa\": _2, \"obanazawa\": _2, \"oe\": _2, \"oguni\": _2, \"ohkura\": _2, \"oishida\": _2, \"sagae\": _2, \"sakata\": _2, \"sakegawa\": _2, \"shinjo\": _2, \"shirataka\": _2, \"shonai\": _2, \"takahata\": _2, \"tendo\": _2, \"tozawa\": _2, \"tsuruoka\": _2, \"yamagata\": _2, \"yamanobe\": _2, \"yonezawa\": _2, \"yuza\": _2 } }, \"yamaguchi\": { \"$\": 1, \"succ\": { \"abu\": _2, \"hagi\": _2, \"hikari\": _2, \"hofu\": _2, \"iwakuni\": _2, \"kudamatsu\": _2, \"mitou\": _2, \"nagato\": _2, \"oshima\": _2, \"shimonoseki\": _2, \"shunan\": _2, \"tabuse\": _2, \"tokuyama\": _2, \"toyota\": _2, \"ube\": _2, \"yuu\": _2 } }, \"yamanashi\": { \"$\": 1, \"succ\": { \"chuo\": _2, \"doshi\": _2, \"fuefuki\": _2, \"fujikawa\": _2, \"fujikawaguchiko\": _2, \"fujiyoshida\": _2, \"hayakawa\": _2, \"hokuto\": _2, \"ichikawamisato\": _2, \"kai\": _2, \"kofu\": _2, \"koshu\": _2, \"kosuge\": _2, \"minami-alps\": _2, \"minobu\": _2, \"nakamichi\": _2, \"nanbu\": _2, \"narusawa\": _2, \"nirasaki\": _2, \"nishikatsura\": _2, \"oshino\": _2, \"otsuki\": _2, \"showa\": _2, \"tabayama\": _2, \"tsuru\": _2, \"uenohara\": _2, \"yamanakako\": _2, \"yamanashi\": _2 } }, \"xn--4pvxs\": _2, \"栃木\": _2, \"xn--vgu402c\": _2, \"愛知\": _2, \"xn--c3s14m\": _2, \"愛媛\": _2, \"xn--f6qx53a\": _2, \"兵庫\": _2, \"xn--8pvr4u\": _2, \"熊本\": _2, \"xn--uist22h\": _2, \"茨城\": _2, \"xn--djrs72d6uy\": _2, \"北海道\": _2, \"xn--mkru45i\": _2, \"千葉\": _2, \"xn--0trq7p7nn\": _2, \"和歌山\": _2, \"xn--8ltr62k\": _2, \"長崎\": _2, \"xn--2m4a15e\": _2, \"長野\": _2, \"xn--efvn9s\": _2, \"新潟\": _2, \"xn--32vp30h\": _2, \"青森\": _2, \"xn--4it797k\": _2, \"静岡\": _2, \"xn--1lqs71d\": _2, \"東京\": _2, \"xn--5rtp49c\": _2, \"石川\": _2, \"xn--5js045d\": _2, \"埼玉\": _2, \"xn--ehqz56n\": _2, \"三重\": _2, \"xn--1lqs03n\": _2, \"京都\": _2, \"xn--qqqt11m\": _2, \"佐賀\": _2, \"xn--kbrq7o\": _2, \"大分\": _2, \"xn--pssu33l\": _2, \"大阪\": _2, \"xn--ntsq17g\": _2, \"奈良\": _2, \"xn--uisz3g\": _2, \"宮城\": _2, \"xn--6btw5a\": _2, \"宮崎\": _2, \"xn--1ctwo\": _2, \"富山\": _2, \"xn--6orx2r\": _2, \"山口\": _2, \"xn--rht61e\": _2, \"山形\": _2, \"xn--rht27z\": _2, \"山梨\": _2, \"xn--djty4k\": _2, \"岩手\": _2, \"xn--nit225k\": _2, \"岐阜\": _2, \"xn--rht3d\": _2, \"岡山\": _2, \"xn--klty5x\": _2, \"島根\": _2, \"xn--kltx9a\": _2, \"広島\": _2, \"xn--kltp7d\": _2, \"徳島\": _2, \"xn--uuwu58a\": _2, \"沖縄\": _2, \"xn--zbx025d\": _2, \"滋賀\": _2, \"xn--ntso0iqx3a\": _2, \"神奈川\": _2, \"xn--elqq16h\": _2, \"福井\": _2, \"xn--4it168d\": _2, \"福岡\": _2, \"xn--klt787d\": _2, \"福島\": _2, \"xn--rny31h\": _2, \"秋田\": _2, \"xn--7t0a264c\": _2, \"群馬\": _2, \"xn--5rtq34k\": _2, \"香川\": _2, \"xn--k7yn95e\": _2, \"高知\": _2, \"xn--tor131o\": _2, \"鳥取\": _2, \"xn--d5qv7z876c\": _2, \"鹿児島\": _2, \"kawasaki\": _8, \"kitakyushu\": _8, \"kobe\": _8, \"nagoya\": _8, \"sapporo\": _8, \"sendai\": _8, \"yokohama\": _8, \"buyshop\": _3, \"fashionstore\": _3, \"handcrafted\": _3, \"kawaiishop\": _3, \"supersale\": _3, \"theshop\": _3, \"usercontent\": _3, \"angry\": _3, \"babyblue\": _3, \"babymilk\": _3, \"backdrop\": _3, \"bambina\": _3, \"bitter\": _3, \"blush\": _3, \"boo\": _3, \"boy\": _3, \"boyfriend\": _3, \"but\": _3, \"candypop\": _3, \"capoo\": _3, \"catfood\": _3, \"cheap\": _3, \"chicappa\": _3, \"chillout\": _3, \"chips\": _3, \"chowder\": _3, \"chu\": _3, \"ciao\": _3, \"cocotte\": _3, \"coolblog\": _3, \"cranky\": _3, \"cutegirl\": _3, \"daa\": _3, \"deca\": _3, \"deci\": _3, \"digick\": _3, \"egoism\": _3, \"fakefur\": _3, \"fem\": _3, \"flier\": _3, \"floppy\": _3, \"fool\": _3, \"frenchkiss\": _3, \"girlfriend\": _3, \"girly\": _3, \"gloomy\": _3, \"gonna\": _3, \"greater\": _3, \"hacca\": _3, \"heavy\": _3, \"her\": _3, \"hiho\": _3, \"hippy\": _3, \"holy\": _3, \"hungry\": _3, \"icurus\": _3, \"itigo\": _3, \"jellybean\": _3, \"kikirara\": _3, \"kill\": _3, \"kilo\": _3, \"kuron\": _3, \"littlestar\": _3, \"lolipopmc\": _3, \"lolitapunk\": _3, \"lomo\": _3, \"lovepop\": _3, \"lovesick\": _3, \"main\": _3, \"mods\": _3, \"mond\": _3, \"mongolian\": _3, \"moo\": _3, \"namaste\": _3, \"nikita\": _3, \"nobushi\": _3, \"noor\": _3, \"oops\": _3, \"parallel\": _3, \"parasite\": _3, \"pecori\": _3, \"peewee\": _3, \"penne\": _3, \"pepper\": _3, \"perma\": _3, \"pigboat\": _3, \"pinoko\": _3, \"punyu\": _3, \"pupu\": _3, \"pussycat\": _3, \"pya\": _3, \"raindrop\": _3, \"readymade\": _3, \"sadist\": _3, \"schoolbus\": _3, \"secret\": _3, \"staba\": _3, \"stripper\": _3, \"sub\": _3, \"sunnyday\": _3, \"thick\": _3, \"tonkotsu\": _3, \"under\": _3, \"upper\": _3, \"velvet\": _3, \"verse\": _3, \"versus\": _3, \"vivian\": _3, \"watson\": _3, \"weblike\": _3, \"whitesnow\": _3, \"zombie\": _3, \"blogspot\": _3, \"2-d\": _3, \"bona\": _3, \"crap\": _3, \"daynight\": _3, \"eek\": _3, \"flop\": _3, \"halfmoon\": _3, \"jeez\": _3, \"matrix\": _3, \"mimoza\": _3, \"netgamers\": _3, \"nyanta\": _3, \"o0o0\": _3, \"rdy\": _3, \"rgr\": _3, \"rulez\": _3, \"sakurastorage\": { \"$\": 0, \"succ\": { \"isk01\": _12, \"isk02\": _12 } }, \"saloon\": _3, \"sblo\": _3, \"skr\": _3, \"tank\": _3, \"uh-oh\": _3, \"undo\": _3, \"webaccel\": { \"$\": 0, \"succ\": { \"rs\": _3, \"user\": _3 } }, \"websozai\": _3, \"xii\": _3 } }, \"ke\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _6, \"go\": _2, \"info\": _2, \"me\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2 } }, \"kg\": { \"$\": 1, \"succ\": { \"org\": _2, \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"blog\": _3, \"io\": _3, \"jp\": _3, \"tv\": _3, \"uk\": _3, \"us\": _3 } }, \"kh\": _8, \"ki\": _33, \"km\": { \"$\": 1, \"succ\": { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"ass\": _2, \"com\": _2, \"coop\": _2, \"asso\": _2, \"presse\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmaciens\": _2, \"veterinaire\": _2, \"gouv\": _2 } }, \"kn\": { \"$\": 1, \"succ\": { \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2 } }, \"kp\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"rep\": _2, \"tra\": _2 } }, \"kr\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"es\": _2, \"go\": _2, \"hs\": _2, \"kg\": _2, \"mil\": _2, \"ms\": _2, \"ne\": _2, \"or\": _2, \"pe\": _2, \"re\": _2, \"sc\": _2, \"busan\": _2, \"chungbuk\": _2, \"chungnam\": _2, \"daegu\": _2, \"daejeon\": _2, \"gangwon\": _2, \"gwangju\": _2, \"gyeongbuk\": _2, \"gyeonggi\": _2, \"gyeongnam\": _2, \"incheon\": _2, \"jeju\": _2, \"jeonbuk\": _2, \"jeonnam\": _2, \"seoul\": _2, \"ulsan\": _2, \"blogspot\": _3 } }, \"kw\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"emb\": _2, \"gov\": _2, \"ind\": _2, \"net\": _2, \"org\": _2 } }, \"ky\": _25, \"kz\": { \"$\": 1, \"succ\": { \"org\": _2, \"edu\": _2, \"net\": _2, \"gov\": _2, \"mil\": _2, \"com\": _2, \"jcloud\": _3, \"kazteleport\": { \"$\": 0, \"succ\": { \"upaas\": _3 } } } }, \"la\": { \"$\": 1, \"succ\": { \"int\": _2, \"net\": _2, \"info\": _2, \"edu\": _2, \"gov\": _2, \"per\": _2, \"com\": _2, \"org\": _2, \"bnr\": _3, \"c\": _3 } }, \"lb\": _4, \"lc\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"oy\": _3 } }, \"li\": { \"$\": 1, \"succ\": { \"blogspot\": _3, \"caa\": _3 } }, \"lk\": { \"$\": 1, \"succ\": { \"gov\": _2, \"sch\": _2, \"net\": _2, \"int\": _2, \"com\": _2, \"org\": _2, \"edu\": _2, \"ngo\": _2, \"soc\": _2, \"web\": _2, \"ltd\": _2, \"assn\": _2, \"grp\": _2, \"hotel\": _2, \"ac\": _2 } }, \"lr\": _4, \"ls\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"sc\": _2, \"de\": _3 } }, \"lt\": _34, \"lu\": { \"$\": 1, \"succ\": { \"blogspot\": _3, \"123website\": _3 } }, \"lv\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"id\": _2, \"net\": _2, \"asn\": _2, \"conf\": _2 } }, \"ly\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"gov\": _2, \"plc\": _2, \"edu\": _2, \"sch\": _2, \"med\": _2, \"org\": _2, \"id\": _2 } }, \"ma\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"ac\": _2, \"press\": _2 } }, \"mc\": { \"$\": 1, \"succ\": { \"tm\": _2, \"asso\": _2 } }, \"md\": { \"$\": 1, \"succ\": { \"blogspot\": _3, \"at\": _3, \"de\": _3, \"jp\": _3, \"to\": _3 } }, \"me\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"ac\": _2, \"gov\": _2, \"its\": _2, \"priv\": _2, \"c66\": _3, \"daplie\": { \"$\": 2, \"succ\": { \"localhost\": _3 } }, \"edgestack\": _3, \"filegear\": _3, \"filegear-au\": _3, \"filegear-de\": _3, \"filegear-gb\": _3, \"filegear-ie\": _3, \"filegear-jp\": _3, \"filegear-sg\": _3, \"glitch\": _3, \"ravendb\": _3, \"lohmus\": _3, \"barsy\": _3, \"mcpe\": _3, \"mcdir\": _3, \"soundcast\": _3, \"tcp4\": _3, \"brasilia\": _3, \"ddns\": _3, \"dnsfor\": _3, \"hopto\": _3, \"loginto\": _3, \"noip\": _3, \"webhop\": _3, \"vp4\": _3, \"diskstation\": _3, \"dscloud\": _3, \"i234\": _3, \"myds\": _3, \"synology\": _3, \"transip\": _23, \"wedeploy\": _3, \"yombo\": _3, \"nohost\": _3 } }, \"mg\": { \"$\": 1, \"succ\": { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"com\": _2, \"co\": _2 } }, \"mh\": _2, \"mil\": _2, \"mk\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"gov\": _2, \"inf\": _2, \"name\": _2, \"blogspot\": _3 } }, \"ml\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gouv\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"presse\": _2 } }, \"mm\": _8, \"mn\": { \"$\": 1, \"succ\": { \"gov\": _2, \"edu\": _2, \"org\": _2, \"nyc\": _3 } }, \"mo\": _4, \"mobi\": { \"$\": 1, \"succ\": { \"barsy\": _3, \"dscloud\": _3 } }, \"mp\": { \"$\": 1, \"succ\": { \"ju\": _3 } }, \"mq\": _2, \"mr\": _34, \"ms\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"lab\": _3, \"minisite\": _3 } }, \"mt\": { \"$\": 1, \"succ\": { \"com\": _6, \"edu\": _2, \"net\": _2, \"org\": _2 } }, \"mu\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"ac\": _2, \"co\": _2, \"or\": _2 } }, \"museum\": { \"$\": 1, \"succ\": { \"academy\": _2, \"agriculture\": _2, \"air\": _2, \"airguard\": _2, \"alabama\": _2, \"alaska\": _2, \"amber\": _2, \"ambulance\": _2, \"american\": _2, \"americana\": _2, \"americanantiques\": _2, \"americanart\": _2, \"amsterdam\": _2, \"and\": _2, \"annefrank\": _2, \"anthro\": _2, \"anthropology\": _2, \"antiques\": _2, \"aquarium\": _2, \"arboretum\": _2, \"archaeological\": _2, \"archaeology\": _2, \"architecture\": _2, \"art\": _2, \"artanddesign\": _2, \"artcenter\": _2, \"artdeco\": _2, \"arteducation\": _2, \"artgallery\": _2, \"arts\": _2, \"artsandcrafts\": _2, \"asmatart\": _2, \"assassination\": _2, \"assisi\": _2, \"association\": _2, \"astronomy\": _2, \"atlanta\": _2, \"austin\": _2, \"australia\": _2, \"automotive\": _2, \"aviation\": _2, \"axis\": _2, \"badajoz\": _2, \"baghdad\": _2, \"bahn\": _2, \"bale\": _2, \"baltimore\": _2, \"barcelona\": _2, \"baseball\": _2, \"basel\": _2, \"baths\": _2, \"bauern\": _2, \"beauxarts\": _2, \"beeldengeluid\": _2, \"bellevue\": _2, \"bergbau\": _2, \"berkeley\": _2, \"berlin\": _2, \"bern\": _2, \"bible\": _2, \"bilbao\": _2, \"bill\": _2, \"birdart\": _2, \"birthplace\": _2, \"bonn\": _2, \"boston\": _2, \"botanical\": _2, \"botanicalgarden\": _2, \"botanicgarden\": _2, \"botany\": _2, \"brandywinevalley\": _2, \"brasil\": _2, \"bristol\": _2, \"british\": _2, \"britishcolumbia\": _2, \"broadcast\": _2, \"brunel\": _2, \"brussel\": _2, \"brussels\": _2, \"bruxelles\": _2, \"building\": _2, \"burghof\": _2, \"bus\": _2, \"bushey\": _2, \"cadaques\": _2, \"california\": _2, \"cambridge\": _2, \"can\": _2, \"canada\": _2, \"capebreton\": _2, \"carrier\": _2, \"cartoonart\": _2, \"casadelamoneda\": _2, \"castle\": _2, \"castres\": _2, \"celtic\": _2, \"center\": _2, \"chattanooga\": _2, \"cheltenham\": _2, \"chesapeakebay\": _2, \"chicago\": _2, \"children\": _2, \"childrens\": _2, \"childrensgarden\": _2, \"chiropractic\": _2, \"chocolate\": _2, \"christiansburg\": _2, \"cincinnati\": _2, \"cinema\": _2, \"circus\": _2, \"civilisation\": _2, \"civilization\": _2, \"civilwar\": _2, \"clinton\": _2, \"clock\": _2, \"coal\": _2, \"coastaldefence\": _2, \"cody\": _2, \"coldwar\": _2, \"collection\": _2, \"colonialwilliamsburg\": _2, \"coloradoplateau\": _2, \"columbia\": _2, \"columbus\": _2, \"communication\": _2, \"communications\": _2, \"community\": _2, \"computer\": _2, \"computerhistory\": _2, \"xn--comunicaes-v6a2o\": _2, \"comunicações\": _2, \"contemporary\": _2, \"contemporaryart\": _2, \"convent\": _2, \"copenhagen\": _2, \"corporation\": _2, \"xn--correios-e-telecomunicaes-ghc29a\": _2, \"correios-e-telecomunicações\": _2, \"corvette\": _2, \"costume\": _2, \"countryestate\": _2, \"county\": _2, \"crafts\": _2, \"cranbrook\": _2, \"creation\": _2, \"cultural\": _2, \"culturalcenter\": _2, \"culture\": _2, \"cyber\": _2, \"cymru\": _2, \"dali\": _2, \"dallas\": _2, \"database\": _2, \"ddr\": _2, \"decorativearts\": _2, \"delaware\": _2, \"delmenhorst\": _2, \"denmark\": _2, \"depot\": _2, \"design\": _2, \"detroit\": _2, \"dinosaur\": _2, \"discovery\": _2, \"dolls\": _2, \"donostia\": _2, \"durham\": _2, \"eastafrica\": _2, \"eastcoast\": _2, \"education\": _2, \"educational\": _2, \"egyptian\": _2, \"eisenbahn\": _2, \"elburg\": _2, \"elvendrell\": _2, \"embroidery\": _2, \"encyclopedic\": _2, \"england\": _2, \"entomology\": _2, \"environment\": _2, \"environmentalconservation\": _2, \"epilepsy\": _2, \"essex\": _2, \"estate\": _2, \"ethnology\": _2, \"exeter\": _2, \"exhibition\": _2, \"family\": _2, \"farm\": _2, \"farmequipment\": _2, \"farmers\": _2, \"farmstead\": _2, \"field\": _2, \"figueres\": _2, \"filatelia\": _2, \"film\": _2, \"fineart\": _2, \"finearts\": _2, \"finland\": _2, \"flanders\": _2, \"florida\": _2, \"force\": _2, \"fortmissoula\": _2, \"fortworth\": _2, \"foundation\": _2, \"francaise\": _2, \"frankfurt\": _2, \"franziskaner\": _2, \"freemasonry\": _2, \"freiburg\": _2, \"fribourg\": _2, \"frog\": _2, \"fundacio\": _2, \"furniture\": _2, \"gallery\": _2, \"garden\": _2, \"gateway\": _2, \"geelvinck\": _2, \"gemological\": _2, \"geology\": _2, \"georgia\": _2, \"giessen\": _2, \"glas\": _2, \"glass\": _2, \"gorge\": _2, \"grandrapids\": _2, \"graz\": _2, \"guernsey\": _2, \"halloffame\": _2, \"hamburg\": _2, \"handson\": _2, \"harvestcelebration\": _2, \"hawaii\": _2, \"health\": _2, \"heimatunduhren\": _2, \"hellas\": _2, \"helsinki\": _2, \"hembygdsforbund\": _2, \"heritage\": _2, \"histoire\": _2, \"historical\": _2, \"historicalsociety\": _2, \"historichouses\": _2, \"historisch\": _2, \"historisches\": _2, \"history\": _2, \"historyofscience\": _2, \"horology\": _2, \"house\": _2, \"humanities\": _2, \"illustration\": _2, \"imageandsound\": _2, \"indian\": _2, \"indiana\": _2, \"indianapolis\": _2, \"indianmarket\": _2, \"intelligence\": _2, \"interactive\": _2, \"iraq\": _2, \"iron\": _2, \"isleofman\": _2, \"jamison\": _2, \"jefferson\": _2, \"jerusalem\": _2, \"jewelry\": _2, \"jewish\": _2, \"jewishart\": _2, \"jfk\": _2, \"journalism\": _2, \"judaica\": _2, \"judygarland\": _2, \"juedisches\": _2, \"juif\": _2, \"karate\": _2, \"karikatur\": _2, \"kids\": _2, \"koebenhavn\": _2, \"koeln\": _2, \"kunst\": _2, \"kunstsammlung\": _2, \"kunstunddesign\": _2, \"labor\": _2, \"labour\": _2, \"lajolla\": _2, \"lancashire\": _2, \"landes\": _2, \"lans\": _2, \"xn--lns-qla\": _2, \"läns\": _2, \"larsson\": _2, \"lewismiller\": _2, \"lincoln\": _2, \"linz\": _2, \"living\": _2, \"livinghistory\": _2, \"localhistory\": _2, \"london\": _2, \"losangeles\": _2, \"louvre\": _2, \"loyalist\": _2, \"lucerne\": _2, \"luxembourg\": _2, \"luzern\": _2, \"mad\": _2, \"madrid\": _2, \"mallorca\": _2, \"manchester\": _2, \"mansion\": _2, \"mansions\": _2, \"manx\": _2, \"marburg\": _2, \"maritime\": _2, \"maritimo\": _2, \"maryland\": _2, \"marylhurst\": _2, \"media\": _2, \"medical\": _2, \"medizinhistorisches\": _2, \"meeres\": _2, \"memorial\": _2, \"mesaverde\": _2, \"michigan\": _2, \"midatlantic\": _2, \"military\": _2, \"mill\": _2, \"miners\": _2, \"mining\": _2, \"minnesota\": _2, \"missile\": _2, \"missoula\": _2, \"modern\": _2, \"moma\": _2, \"money\": _2, \"monmouth\": _2, \"monticello\": _2, \"montreal\": _2, \"moscow\": _2, \"motorcycle\": _2, \"muenchen\": _2, \"muenster\": _2, \"mulhouse\": _2, \"muncie\": _2, \"museet\": _2, \"museumcenter\": _2, \"museumvereniging\": _2, \"music\": _2, \"national\": _2, \"nationalfirearms\": _2, \"nationalheritage\": _2, \"nativeamerican\": _2, \"naturalhistory\": _2, \"naturalhistorymuseum\": _2, \"naturalsciences\": _2, \"nature\": _2, \"naturhistorisches\": _2, \"natuurwetenschappen\": _2, \"naumburg\": _2, \"naval\": _2, \"nebraska\": _2, \"neues\": _2, \"newhampshire\": _2, \"newjersey\": _2, \"newmexico\": _2, \"newport\": _2, \"newspaper\": _2, \"newyork\": _2, \"niepce\": _2, \"norfolk\": _2, \"north\": _2, \"nrw\": _2, \"nyc\": _2, \"nyny\": _2, \"oceanographic\": _2, \"oceanographique\": _2, \"omaha\": _2, \"online\": _2, \"ontario\": _2, \"openair\": _2, \"oregon\": _2, \"oregontrail\": _2, \"otago\": _2, \"oxford\": _2, \"pacific\": _2, \"paderborn\": _2, \"palace\": _2, \"paleo\": _2, \"palmsprings\": _2, \"panama\": _2, \"paris\": _2, \"pasadena\": _2, \"pharmacy\": _2, \"philadelphia\": _2, \"philadelphiaarea\": _2, \"philately\": _2, \"phoenix\": _2, \"photography\": _2, \"pilots\": _2, \"pittsburgh\": _2, \"planetarium\": _2, \"plantation\": _2, \"plants\": _2, \"plaza\": _2, \"portal\": _2, \"portland\": _2, \"portlligat\": _2, \"posts-and-telecommunications\": _2, \"preservation\": _2, \"presidio\": _2, \"press\": _2, \"project\": _2, \"public\": _2, \"pubol\": _2, \"quebec\": _2, \"railroad\": _2, \"railway\": _2, \"research\": _2, \"resistance\": _2, \"riodejaneiro\": _2, \"rochester\": _2, \"rockart\": _2, \"roma\": _2, \"russia\": _2, \"saintlouis\": _2, \"salem\": _2, \"salvadordali\": _2, \"salzburg\": _2, \"sandiego\": _2, \"sanfrancisco\": _2, \"santabarbara\": _2, \"santacruz\": _2, \"santafe\": _2, \"saskatchewan\": _2, \"satx\": _2, \"savannahga\": _2, \"schlesisches\": _2, \"schoenbrunn\": _2, \"schokoladen\": _2, \"school\": _2, \"schweiz\": _2, \"science\": _2, \"scienceandhistory\": _2, \"scienceandindustry\": _2, \"sciencecenter\": _2, \"sciencecenters\": _2, \"science-fiction\": _2, \"sciencehistory\": _2, \"sciences\": _2, \"sciencesnaturelles\": _2, \"scotland\": _2, \"seaport\": _2, \"settlement\": _2, \"settlers\": _2, \"shell\": _2, \"sherbrooke\": _2, \"sibenik\": _2, \"silk\": _2, \"ski\": _2, \"skole\": _2, \"society\": _2, \"sologne\": _2, \"soundandvision\": _2, \"southcarolina\": _2, \"southwest\": _2, \"space\": _2, \"spy\": _2, \"square\": _2, \"stadt\": _2, \"stalbans\": _2, \"starnberg\": _2, \"state\": _2, \"stateofdelaware\": _2, \"station\": _2, \"steam\": _2, \"steiermark\": _2, \"stjohn\": _2, \"stockholm\": _2, \"stpetersburg\": _2, \"stuttgart\": _2, \"suisse\": _2, \"surgeonshall\": _2, \"surrey\": _2, \"svizzera\": _2, \"sweden\": _2, \"sydney\": _2, \"tank\": _2, \"tcm\": _2, \"technology\": _2, \"telekommunikation\": _2, \"television\": _2, \"texas\": _2, \"textile\": _2, \"theater\": _2, \"time\": _2, \"timekeeping\": _2, \"topology\": _2, \"torino\": _2, \"touch\": _2, \"town\": _2, \"transport\": _2, \"tree\": _2, \"trolley\": _2, \"trust\": _2, \"trustee\": _2, \"uhren\": _2, \"ulm\": _2, \"undersea\": _2, \"university\": _2, \"usa\": _2, \"usantiques\": _2, \"usarts\": _2, \"uscountryestate\": _2, \"usculture\": _2, \"usdecorativearts\": _2, \"usgarden\": _2, \"ushistory\": _2, \"ushuaia\": _2, \"uslivinghistory\": _2, \"utah\": _2, \"uvic\": _2, \"valley\": _2, \"vantaa\": _2, \"versailles\": _2, \"viking\": _2, \"village\": _2, \"virginia\": _2, \"virtual\": _2, \"virtuel\": _2, \"vlaanderen\": _2, \"volkenkunde\": _2, \"wales\": _2, \"wallonie\": _2, \"war\": _2, \"washingtondc\": _2, \"watchandclock\": _2, \"watch-and-clock\": _2, \"western\": _2, \"westfalen\": _2, \"whaling\": _2, \"wildlife\": _2, \"williamsburg\": _2, \"windmill\": _2, \"workshop\": _2, \"york\": _2, \"yorkshire\": _2, \"yosemite\": _2, \"youth\": _2, \"zoological\": _2, \"zoology\": _2, \"xn--9dbhblg6di\": _2, \"ירושלים\": _2, \"xn--h1aegh\": _2, \"иком\": _2 } }, \"mv\": { \"$\": 1, \"succ\": { \"aero\": _2, \"biz\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"museum\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"mw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"int\": _2, \"museum\": _2, \"net\": _2, \"org\": _2 } }, \"mx\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2, \"net\": _2, \"blogspot\": _3 } }, \"my\": { \"$\": 1, \"succ\": { \"biz\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _3 } }, \"mz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"adv\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"na\": { \"$\": 1, \"succ\": { \"info\": _2, \"pro\": _2, \"name\": _2, \"school\": _2, \"or\": _2, \"dr\": _2, \"us\": _2, \"mx\": _2, \"ca\": _2, \"in\": _2, \"cc\": _2, \"tv\": _2, \"ws\": _2, \"mobi\": _2, \"co\": _2, \"com\": _2, \"org\": _2 } }, \"name\": { \"$\": 1, \"succ\": { \"her\": _37, \"his\": _37 } }, \"nc\": { \"$\": 1, \"succ\": { \"asso\": _2, \"nom\": _2 } }, \"ne\": _2, \"net\": { \"$\": 1, \"succ\": { \"adobeaemcloud\": _3, \"adobeio-static\": _3, \"adobeioruntime\": _3, \"akadns\": _3, \"akamai\": _3, \"akamai-staging\": _3, \"akamaiedge\": _3, \"akamaiedge-staging\": _3, \"akamaihd\": _3, \"akamaihd-staging\": _3, \"akamaiorigin\": _3, \"akamaiorigin-staging\": _3, \"akamaized\": _3, \"akamaized-staging\": _3, \"edgekey\": _3, \"edgekey-staging\": _3, \"edgesuite\": _3, \"edgesuite-staging\": _3, \"alwaysdata\": _3, \"myamaze\": _3, \"cloudfront\": _3, \"t3l3p0rt\": _3, \"appudo\": _3, \"atlassian-dev\": { \"$\": 0, \"succ\": { \"prod\": { \"$\": 0, \"succ\": { \"cdn\": _3 } } } }, \"myfritz\": _3, \"onavstack\": _3, \"shopselect\": _3, \"blackbaudcdn\": _3, \"boomla\": _3, \"bplaced\": _3, \"square7\": _3, \"gb\": _3, \"hu\": _3, \"jp\": _3, \"se\": _3, \"uk\": _3, \"in\": _3, \"clickrising\": _3, \"cloudaccess\": _3, \"cdn77-ssl\": _3, \"cdn77\": { \"$\": 0, \"succ\": { \"r\": _3 } }, \"feste-ip\": _3, \"knx-server\": _3, \"static-access\": _3, \"cryptonomic\": _5, \"dattolocal\": _3, \"mydatto\": _3, \"debian\": _3, \"bitbridge\": _3, \"at-band-camp\": _3, \"blogdns\": _3, \"broke-it\": _3, \"buyshouses\": _3, \"dnsalias\": _3, \"dnsdojo\": _3, \"does-it\": _3, \"dontexist\": _3, \"dynalias\": _3, \"dynathome\": _3, \"endofinternet\": _3, \"from-az\": _3, \"from-co\": _3, \"from-la\": _3, \"from-ny\": _3, \"gets-it\": _3, \"ham-radio-op\": _3, \"homeftp\": _3, \"homeip\": _3, \"homelinux\": _3, \"homeunix\": _3, \"in-the-band\": _3, \"is-a-chef\": _3, \"is-a-geek\": _3, \"isa-geek\": _3, \"kicks-ass\": _3, \"office-on-the\": _3, \"podzone\": _3, \"scrapper-site\": _3, \"selfip\": _3, \"sells-it\": _3, \"servebbs\": _3, \"serveftp\": _3, \"thruhere\": _3, \"webhop\": _3, \"definima\": _3, \"casacam\": _3, \"dynu\": _3, \"dynv6\": _3, \"twmail\": _3, \"ru\": _3, \"channelsdvr\": { \"$\": 2, \"succ\": { \"u\": _3 } }, \"fastlylb\": { \"$\": 2, \"succ\": { \"map\": _3 } }, \"fastly\": { \"$\": 0, \"succ\": { \"freetls\": _3, \"map\": _3, \"prod\": { \"$\": 0, \"succ\": { \"a\": _3, \"global\": _3 } }, \"ssl\": { \"$\": 0, \"succ\": { \"a\": _3, \"b\": _3, \"global\": _3 } } } }, \"edgeapp\": _3, \"flynnhosting\": _3, \"cdn-edges\": _3, \"heteml\": _3, \"cloudfunctions\": _3, \"moonscale\": _3, \"in-dsl\": _3, \"in-vpn\": _3, \"ipifony\": _3, \"iobb\": _3, \"cloudjiffy\": { \"$\": 2, \"succ\": { \"fra1-de\": _3, \"west1-us\": _3 } }, \"elastx\": { \"$\": 0, \"succ\": { \"jls-sto1\": _3, \"jls-sto2\": _3, \"jls-sto3\": _3 } }, \"faststacks\": _3, \"massivegrid\": { \"$\": 0, \"succ\": { \"paas\": { \"$\": 0, \"succ\": { \"fr-1\": _3, \"lon-1\": _3, \"lon-2\": _3, \"ny-1\": _3, \"ny-2\": _3, \"sg-1\": _3 } } } }, \"saveincloud\": { \"$\": 0, \"succ\": { \"jelastic\": _3, \"nordeste-idc\": _3 } }, \"scaleforce\": _26, \"tsukaeru\": _27, \"kinghost\": _3, \"uni5\": _3, \"krellian\": _3, \"barsy\": _3, \"memset\": _3, \"azurewebsites\": _3, \"azure-mobile\": _3, \"cloudapp\": _3, \"azurestaticapps\": { \"$\": 2, \"succ\": { \"1\": _3, \"2\": _3, \"3\": _3, \"centralus\": _3, \"eastasia\": _3, \"eastus2\": _3, \"westeurope\": _3, \"westus2\": _3 } }, \"dnsup\": _3, \"hicam\": _3, \"now-dns\": _3, \"ownip\": _3, \"vpndns\": _3, \"eating-organic\": _3, \"mydissent\": _3, \"myeffect\": _3, \"mymediapc\": _3, \"mypsx\": _3, \"mysecuritycamera\": _3, \"nhlfan\": _3, \"no-ip\": _3, \"pgafan\": _3, \"privatizehealthinsurance\": _3, \"bounceme\": _3, \"ddns\": _3, \"redirectme\": _3, \"serveblog\": _3, \"serveminecraft\": _3, \"sytes\": _3, \"cloudycluster\": _3, \"ovh\": { \"$\": 0, \"succ\": { \"webpaas\": _5, \"hosting\": _5 } }, \"bar0\": _3, \"bar1\": _3, \"bar2\": _3, \"rackmaze\": _3, \"squares\": _3, \"schokokeks\": _3, \"firewall-gateway\": _3, \"seidat\": _3, \"senseering\": _3, \"siteleaf\": _3, \"vps-host\": { \"$\": 2, \"succ\": { \"jelastic\": { \"$\": 0, \"succ\": { \"atl\": _3, \"njs\": _3, \"ric\": _3 } } } }, \"myspreadshop\": _3, \"srcf\": { \"$\": 0, \"succ\": { \"soc\": _3, \"user\": _3 } }, \"supabase\": _3, \"dsmynas\": _3, \"familyds\": _3, \"tailscale\": { \"$\": 0, \"succ\": { \"beta\": _3 } }, \"ts\": _3, \"torproject\": { \"$\": 2, \"succ\": { \"pages\": _3 } }, \"reserve-online\": _3, \"community-pro\": _3, \"meinforum\": _3, \"yandexcloud\": { \"$\": 2, \"succ\": { \"storage\": _3, \"website\": _3 } }, \"za\": _3 } }, \"nf\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"per\": _2, \"rec\": _2, \"web\": _2, \"arts\": _2, \"firm\": _2, \"info\": _2, \"other\": _2, \"store\": _2 } }, \"ng\": { \"$\": 1, \"succ\": { \"com\": _6, \"edu\": _2, \"gov\": _2, \"i\": _2, \"mil\": _2, \"mobi\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"col\": _3, \"firm\": _3, \"gen\": _3, \"ltd\": _3, \"ngo\": _3 } }, \"ni\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"in\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"web\": _2 } }, \"nl\": { \"$\": 1, \"succ\": { \"co\": _3, \"hosting-cluster\": _3, \"blogspot\": _3, \"gov\": _3, \"khplay\": _3, \"123website\": _3, \"myspreadshop\": _3, \"transurl\": _5, \"cistron\": _3, \"demon\": _3 } }, \"no\": { \"$\": 1, \"succ\": { \"fhs\": _2, \"vgs\": _2, \"fylkesbibl\": _2, \"folkebibl\": _2, \"museum\": _2, \"idrett\": _2, \"priv\": _2, \"mil\": _2, \"stat\": _2, \"dep\": _2, \"kommune\": _2, \"herad\": _2, \"aa\": _38, \"ah\": _38, \"bu\": _38, \"fm\": _38, \"hl\": _38, \"hm\": _38, \"jan-mayen\": _38, \"mr\": _38, \"nl\": _38, \"nt\": _38, \"of\": _38, \"ol\": _38, \"oslo\": _38, \"rl\": _38, \"sf\": _38, \"st\": _38, \"svalbard\": _38, \"tm\": _38, \"tr\": _38, \"va\": _38, \"vf\": _38, \"akrehamn\": _2, \"xn--krehamn-dxa\": _2, \"åkrehamn\": _2, \"algard\": _2, \"xn--lgrd-poac\": _2, \"ålgård\": _2, \"arna\": _2, \"brumunddal\": _2, \"bryne\": _2, \"bronnoysund\": _2, \"xn--brnnysund-m8ac\": _2, \"brønnøysund\": _2, \"drobak\": _2, \"xn--drbak-wua\": _2, \"drøbak\": _2, \"egersund\": _2, \"fetsund\": _2, \"floro\": _2, \"xn--flor-jra\": _2, \"florø\": _2, \"fredrikstad\": _2, \"hokksund\": _2, \"honefoss\": _2, \"xn--hnefoss-q1a\": _2, \"hønefoss\": _2, \"jessheim\": _2, \"jorpeland\": _2, \"xn--jrpeland-54a\": _2, \"jørpeland\": _2, \"kirkenes\": _2, \"kopervik\": _2, \"krokstadelva\": _2, \"langevag\": _2, \"xn--langevg-jxa\": _2, \"langevåg\": _2, \"leirvik\": _2, \"mjondalen\": _2, \"xn--mjndalen-64a\": _2, \"mjøndalen\": _2, \"mo-i-rana\": _2, \"mosjoen\": _2, \"xn--mosjen-eya\": _2, \"mosjøen\": _2, \"nesoddtangen\": _2, \"orkanger\": _2, \"osoyro\": _2, \"xn--osyro-wua\": _2, \"osøyro\": _2, \"raholt\": _2, \"xn--rholt-mra\": _2, \"råholt\": _2, \"sandnessjoen\": _2, \"xn--sandnessjen-ogb\": _2, \"sandnessjøen\": _2, \"skedsmokorset\": _2, \"slattum\": _2, \"spjelkavik\": _2, \"stathelle\": _2, \"stavern\": _2, \"stjordalshalsen\": _2, \"xn--stjrdalshalsen-sqb\": _2, \"stjørdalshalsen\": _2, \"tananger\": _2, \"tranby\": _2, \"vossevangen\": _2, \"afjord\": _2, \"xn--fjord-lra\": _2, \"åfjord\": _2, \"agdenes\": _2, \"al\": _2, \"xn--l-1fa\": _2, \"ål\": _2, \"alesund\": _2, \"xn--lesund-hua\": _2, \"ålesund\": _2, \"alstahaug\": _2, \"alta\": _2, \"xn--lt-liac\": _2, \"áltá\": _2, \"alaheadju\": _2, \"xn--laheadju-7ya\": _2, \"álaheadju\": _2, \"alvdal\": _2, \"amli\": _2, \"xn--mli-tla\": _2, \"åmli\": _2, \"amot\": _2, \"xn--mot-tla\": _2, \"åmot\": _2, \"andebu\": _2, \"andoy\": _2, \"xn--andy-ira\": _2, \"andøy\": _2, \"andasuolo\": _2, \"ardal\": _2, \"xn--rdal-poa\": _2, \"årdal\": _2, \"aremark\": _2, \"arendal\": _2, \"xn--s-1fa\": _2, \"ås\": _2, \"aseral\": _2, \"xn--seral-lra\": _2, \"åseral\": _2, \"asker\": _2, \"askim\": _2, \"askvoll\": _2, \"askoy\": _2, \"xn--asky-ira\": _2, \"askøy\": _2, \"asnes\": _2, \"xn--snes-poa\": _2, \"åsnes\": _2, \"audnedaln\": _2, \"aukra\": _2, \"aure\": _2, \"aurland\": _2, \"aurskog-holand\": _2, \"xn--aurskog-hland-jnb\": _2, \"aurskog-høland\": _2, \"austevoll\": _2, \"austrheim\": _2, \"averoy\": _2, \"xn--avery-yua\": _2, \"averøy\": _2, \"balestrand\": _2, \"ballangen\": _2, \"balat\": _2, \"xn--blt-elab\": _2, \"bálát\": _2, \"balsfjord\": _2, \"bahccavuotna\": _2, \"xn--bhccavuotna-k7a\": _2, \"báhccavuotna\": _2, \"bamble\": _2, \"bardu\": _2, \"beardu\": _2, \"beiarn\": _2, \"bajddar\": _2, \"xn--bjddar-pta\": _2, \"bájddar\": _2, \"baidar\": _2, \"xn--bidr-5nac\": _2, \"báidár\": _2, \"berg\": _2, \"bergen\": _2, \"berlevag\": _2, \"xn--berlevg-jxa\": _2, \"berlevåg\": _2, \"bearalvahki\": _2, \"xn--bearalvhki-y4a\": _2, \"bearalváhki\": _2, \"bindal\": _2, \"birkenes\": _2, \"bjarkoy\": _2, \"xn--bjarky-fya\": _2, \"bjarkøy\": _2, \"bjerkreim\": _2, \"bjugn\": _2, \"bodo\": _2, \"xn--bod-2na\": _2, \"bodø\": _2, \"badaddja\": _2, \"xn--bdddj-mrabd\": _2, \"bådåddjå\": _2, \"budejju\": _2, \"bokn\": _2, \"bremanger\": _2, \"bronnoy\": _2, \"xn--brnny-wuac\": _2, \"brønnøy\": _2, \"bygland\": _2, \"bykle\": _2, \"barum\": _2, \"xn--brum-voa\": _2, \"bærum\": _2, \"telemark\": { \"$\": 0, \"succ\": { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2 } }, \"nordland\": { \"$\": 0, \"succ\": { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2, \"heroy\": _2, \"xn--hery-ira\": _2, \"herøy\": _2 } }, \"bievat\": _2, \"xn--bievt-0qa\": _2, \"bievát\": _2, \"bomlo\": _2, \"xn--bmlo-gra\": _2, \"bømlo\": _2, \"batsfjord\": _2, \"xn--btsfjord-9za\": _2, \"båtsfjord\": _2, \"bahcavuotna\": _2, \"xn--bhcavuotna-s4a\": _2, \"báhcavuotna\": _2, \"dovre\": _2, \"drammen\": _2, \"drangedal\": _2, \"dyroy\": _2, \"xn--dyry-ira\": _2, \"dyrøy\": _2, \"donna\": _2, \"xn--dnna-gra\": _2, \"dønna\": _2, \"eid\": _2, \"eidfjord\": _2, \"eidsberg\": _2, \"eidskog\": _2, \"eidsvoll\": _2, \"eigersund\": _2, \"elverum\": _2, \"enebakk\": _2, \"engerdal\": _2, \"etne\": _2, \"etnedal\": _2, \"evenes\": _2, \"evenassi\": _2, \"xn--eveni-0qa01ga\": _2, \"evenášši\": _2, \"evje-og-hornnes\": _2, \"farsund\": _2, \"fauske\": _2, \"fuossko\": _2, \"fuoisku\": _2, \"fedje\": _2, \"fet\": _2, \"finnoy\": _2, \"xn--finny-yua\": _2, \"finnøy\": _2, \"fitjar\": _2, \"fjaler\": _2, \"fjell\": _2, \"flakstad\": _2, \"flatanger\": _2, \"flekkefjord\": _2, \"flesberg\": _2, \"flora\": _2, \"fla\": _2, \"xn--fl-zia\": _2, \"flå\": _2, \"folldal\": _2, \"forsand\": _2, \"fosnes\": _2, \"frei\": _2, \"frogn\": _2, \"froland\": _2, \"frosta\": _2, \"frana\": _2, \"xn--frna-woa\": _2, \"fræna\": _2, \"froya\": _2, \"xn--frya-hra\": _2, \"frøya\": _2, \"fusa\": _2, \"fyresdal\": _2, \"forde\": _2, \"xn--frde-gra\": _2, \"førde\": _2, \"gamvik\": _2, \"gangaviika\": _2, \"xn--ggaviika-8ya47h\": _2, \"gáŋgaviika\": _2, \"gaular\": _2, \"gausdal\": _2, \"gildeskal\": _2, \"xn--gildeskl-g0a\": _2, \"gildeskål\": _2, \"giske\": _2, \"gjemnes\": _2, \"gjerdrum\": _2, \"gjerstad\": _2, \"gjesdal\": _2, \"gjovik\": _2, \"xn--gjvik-wua\": _2, \"gjøvik\": _2, \"gloppen\": _2, \"gol\": _2, \"gran\": _2, \"grane\": _2, \"granvin\": _2, \"gratangen\": _2, \"grimstad\": _2, \"grong\": _2, \"kraanghke\": _2, \"xn--kranghke-b0a\": _2, \"kråanghke\": _2, \"grue\": _2, \"gulen\": _2, \"hadsel\": _2, \"halden\": _2, \"halsa\": _2, \"hamar\": _2, \"hamaroy\": _2, \"habmer\": _2, \"xn--hbmer-xqa\": _2, \"hábmer\": _2, \"hapmir\": _2, \"xn--hpmir-xqa\": _2, \"hápmir\": _2, \"hammerfest\": _2, \"hammarfeasta\": _2, \"xn--hmmrfeasta-s4ac\": _2, \"hámmárfeasta\": _2, \"haram\": _2, \"hareid\": _2, \"harstad\": _2, \"hasvik\": _2, \"aknoluokta\": _2, \"xn--koluokta-7ya57h\": _2, \"ákŋoluokta\": _2, \"hattfjelldal\": _2, \"aarborte\": _2, \"haugesund\": _2, \"hemne\": _2, \"hemnes\": _2, \"hemsedal\": _2, \"more-og-romsdal\": { \"$\": 0, \"succ\": { \"heroy\": _2, \"sande\": _2 } }, \"xn--mre-og-romsdal-qqb\": { \"$\": 0, \"succ\": { \"xn--hery-ira\": _2, \"sande\": _2 } }, \"møre-og-romsdal\": { \"$\": 0, \"succ\": { \"herøy\": _2, \"sande\": _2 } }, \"hitra\": _2, \"hjartdal\": _2, \"hjelmeland\": _2, \"hobol\": _2, \"xn--hobl-ira\": _2, \"hobøl\": _2, \"hof\": _2, \"hol\": _2, \"hole\": _2, \"holmestrand\": _2, \"holtalen\": _2, \"xn--holtlen-hxa\": _2, \"holtålen\": _2, \"hornindal\": _2, \"horten\": _2, \"hurdal\": _2, \"hurum\": _2, \"hvaler\": _2, \"hyllestad\": _2, \"hagebostad\": _2, \"xn--hgebostad-g3a\": _2, \"hægebostad\": _2, \"hoyanger\": _2, \"xn--hyanger-q1a\": _2, \"høyanger\": _2, \"hoylandet\": _2, \"xn--hylandet-54a\": _2, \"høylandet\": _2, \"ha\": _2, \"xn--h-2fa\": _2, \"hå\": _2, \"ibestad\": _2, \"inderoy\": _2, \"xn--indery-fya\": _2, \"inderøy\": _2, \"iveland\": _2, \"jevnaker\": _2, \"jondal\": _2, \"jolster\": _2, \"xn--jlster-bya\": _2, \"jølster\": _2, \"karasjok\": _2, \"karasjohka\": _2, \"xn--krjohka-hwab49j\": _2, \"kárášjohka\": _2, \"karlsoy\": _2, \"galsa\": _2, \"xn--gls-elac\": _2, \"gálsá\": _2, \"karmoy\": _2, \"xn--karmy-yua\": _2, \"karmøy\": _2, \"kautokeino\": _2, \"guovdageaidnu\": _2, \"klepp\": _2, \"klabu\": _2, \"xn--klbu-woa\": _2, \"klæbu\": _2, \"kongsberg\": _2, \"kongsvinger\": _2, \"kragero\": _2, \"xn--krager-gya\": _2, \"kragerø\": _2, \"kristiansand\": _2, \"kristiansund\": _2, \"krodsherad\": _2, \"xn--krdsherad-m8a\": _2, \"krødsherad\": _2, \"kvalsund\": _2, \"rahkkeravju\": _2, \"xn--rhkkervju-01af\": _2, \"ráhkkerávju\": _2, \"kvam\": _2, \"kvinesdal\": _2, \"kvinnherad\": _2, \"kviteseid\": _2, \"kvitsoy\": _2, \"xn--kvitsy-fya\": _2, \"kvitsøy\": _2, \"kvafjord\": _2, \"xn--kvfjord-nxa\": _2, \"kvæfjord\": _2, \"giehtavuoatna\": _2, \"kvanangen\": _2, \"xn--kvnangen-k0a\": _2, \"kvænangen\": _2, \"navuotna\": _2, \"xn--nvuotna-hwa\": _2, \"návuotna\": _2, \"kafjord\": _2, \"xn--kfjord-iua\": _2, \"kåfjord\": _2, \"gaivuotna\": _2, \"xn--givuotna-8ya\": _2, \"gáivuotna\": _2, \"larvik\": _2, \"lavangen\": _2, \"lavagis\": _2, \"loabat\": _2, \"xn--loabt-0qa\": _2, \"loabát\": _2, \"lebesby\": _2, \"davvesiida\": _2, \"leikanger\": _2, \"leirfjord\": _2, \"leka\": _2, \"leksvik\": _2, \"lenvik\": _2, \"leangaviika\": _2, \"xn--leagaviika-52b\": _2, \"leaŋgaviika\": _2, \"lesja\": _2, \"levanger\": _2, \"lier\": _2, \"lierne\": _2, \"lillehammer\": _2, \"lillesand\": _2, \"lindesnes\": _2, \"lindas\": _2, \"xn--linds-pra\": _2, \"lindås\": _2, \"lom\": _2, \"loppa\": _2, \"lahppi\": _2, \"xn--lhppi-xqa\": _2, \"láhppi\": _2, \"lund\": _2, \"lunner\": _2, \"luroy\": _2, \"xn--lury-ira\": _2, \"lurøy\": _2, \"luster\": _2, \"lyngdal\": _2, \"lyngen\": _2, \"ivgu\": _2, \"lardal\": _2, \"lerdal\": _2, \"xn--lrdal-sra\": _2, \"lærdal\": _2, \"lodingen\": _2, \"xn--ldingen-q1a\": _2, \"lødingen\": _2, \"lorenskog\": _2, \"xn--lrenskog-54a\": _2, \"lørenskog\": _2, \"loten\": _2, \"xn--lten-gra\": _2, \"løten\": _2, \"malvik\": _2, \"masoy\": _2, \"xn--msy-ula0h\": _2, \"måsøy\": _2, \"muosat\": _2, \"xn--muost-0qa\": _2, \"muosát\": _2, \"mandal\": _2, \"marker\": _2, \"marnardal\": _2, \"masfjorden\": _2, \"meland\": _2, \"meldal\": _2, \"melhus\": _2, \"meloy\": _2, \"xn--mely-ira\": _2, \"meløy\": _2, \"meraker\": _2, \"xn--merker-kua\": _2, \"meråker\": _2, \"moareke\": _2, \"xn--moreke-jua\": _2, \"moåreke\": _2, \"midsund\": _2, \"midtre-gauldal\": _2, \"modalen\": _2, \"modum\": _2, \"molde\": _2, \"moskenes\": _2, \"moss\": _2, \"mosvik\": _2, \"malselv\": _2, \"xn--mlselv-iua\": _2, \"målselv\": _2, \"malatvuopmi\": _2, \"xn--mlatvuopmi-s4a\": _2, \"málatvuopmi\": _2, \"namdalseid\": _2, \"aejrie\": _2, \"namsos\": _2, \"namsskogan\": _2, \"naamesjevuemie\": _2, \"xn--nmesjevuemie-tcba\": _2, \"nååmesjevuemie\": _2, \"laakesvuemie\": _2, \"nannestad\": _2, \"narvik\": _2, \"narviika\": _2, \"naustdal\": _2, \"nedre-eiker\": _2, \"akershus\": _39, \"buskerud\": _39, \"nesna\": _2, \"nesodden\": _2, \"nesseby\": _2, \"unjarga\": _2, \"xn--unjrga-rta\": _2, \"unjárga\": _2, \"nesset\": _2, \"nissedal\": _2, \"nittedal\": _2, \"nord-aurdal\": _2, \"nord-fron\": _2, \"nord-odal\": _2, \"norddal\": _2, \"nordkapp\": _2, \"davvenjarga\": _2, \"xn--davvenjrga-y4a\": _2, \"davvenjárga\": _2, \"nordre-land\": _2, \"nordreisa\": _2, \"raisa\": _2, \"xn--risa-5na\": _2, \"ráisa\": _2, \"nore-og-uvdal\": _2, \"notodden\": _2, \"naroy\": _2, \"xn--nry-yla5g\": _2, \"nærøy\": _2, \"notteroy\": _2, \"xn--nttery-byae\": _2, \"nøtterøy\": _2, \"odda\": _2, \"oksnes\": _2, \"xn--ksnes-uua\": _2, \"øksnes\": _2, \"oppdal\": _2, \"oppegard\": _2, \"xn--oppegrd-ixa\": _2, \"oppegård\": _2, \"orkdal\": _2, \"orland\": _2, \"xn--rland-uua\": _2, \"ørland\": _2, \"orskog\": _2, \"xn--rskog-uua\": _2, \"ørskog\": _2, \"orsta\": _2, \"xn--rsta-fra\": _2, \"ørsta\": _2, \"hedmark\": { \"$\": 0, \"succ\": { \"os\": _2, \"valer\": _2, \"xn--vler-qoa\": _2, \"våler\": _2 } }, \"hordaland\": { \"$\": 0, \"succ\": { \"os\": _2 } }, \"osen\": _2, \"osteroy\": _2, \"xn--ostery-fya\": _2, \"osterøy\": _2, \"ostre-toten\": _2, \"xn--stre-toten-zcb\": _2, \"østre-toten\": _2, \"overhalla\": _2, \"ovre-eiker\": _2, \"xn--vre-eiker-k8a\": _2, \"øvre-eiker\": _2, \"oyer\": _2, \"xn--yer-zna\": _2, \"øyer\": _2, \"oygarden\": _2, \"xn--ygarden-p1a\": _2, \"øygarden\": _2, \"oystre-slidre\": _2, \"xn--ystre-slidre-ujb\": _2, \"øystre-slidre\": _2, \"porsanger\": _2, \"porsangu\": _2, \"xn--porsgu-sta26f\": _2, \"porsáŋgu\": _2, \"porsgrunn\": _2, \"radoy\": _2, \"xn--rady-ira\": _2, \"radøy\": _2, \"rakkestad\": _2, \"rana\": _2, \"ruovat\": _2, \"randaberg\": _2, \"rauma\": _2, \"rendalen\": _2, \"rennebu\": _2, \"rennesoy\": _2, \"xn--rennesy-v1a\": _2, \"rennesøy\": _2, \"rindal\": _2, \"ringebu\": _2, \"ringerike\": _2, \"ringsaker\": _2, \"rissa\": _2, \"risor\": _2, \"xn--risr-ira\": _2, \"risør\": _2, \"roan\": _2, \"rollag\": _2, \"rygge\": _2, \"ralingen\": _2, \"xn--rlingen-mxa\": _2, \"rælingen\": _2, \"rodoy\": _2, \"xn--rdy-0nab\": _2, \"rødøy\": _2, \"romskog\": _2, \"xn--rmskog-bya\": _2, \"rømskog\": _2, \"roros\": _2, \"xn--rros-gra\": _2, \"røros\": _2, \"rost\": _2, \"xn--rst-0na\": _2, \"røst\": _2, \"royken\": _2, \"xn--ryken-vua\": _2, \"røyken\": _2, \"royrvik\": _2, \"xn--ryrvik-bya\": _2, \"røyrvik\": _2, \"rade\": _2, \"xn--rde-ula\": _2, \"råde\": _2, \"salangen\": _2, \"siellak\": _2, \"saltdal\": _2, \"salat\": _2, \"xn--slt-elab\": _2, \"sálát\": _2, \"xn--slat-5na\": _2, \"sálat\": _2, \"samnanger\": _2, \"vestfold\": { \"$\": 0, \"succ\": { \"sande\": _2 } }, \"sandefjord\": _2, \"sandnes\": _2, \"sandoy\": _2, \"xn--sandy-yua\": _2, \"sandøy\": _2, \"sarpsborg\": _2, \"sauda\": _2, \"sauherad\": _2, \"sel\": _2, \"selbu\": _2, \"selje\": _2, \"seljord\": _2, \"sigdal\": _2, \"siljan\": _2, \"sirdal\": _2, \"skaun\": _2, \"skedsmo\": _2, \"ski\": _2, \"skien\": _2, \"skiptvet\": _2, \"skjervoy\": _2, \"xn--skjervy-v1a\": _2, \"skjervøy\": _2, \"skierva\": _2, \"xn--skierv-uta\": _2, \"skiervá\": _2, \"skjak\": _2, \"xn--skjk-soa\": _2, \"skjåk\": _2, \"skodje\": _2, \"skanland\": _2, \"xn--sknland-fxa\": _2, \"skånland\": _2, \"skanit\": _2, \"xn--sknit-yqa\": _2, \"skánit\": _2, \"smola\": _2, \"xn--smla-hra\": _2, \"smøla\": _2, \"snillfjord\": _2, \"snasa\": _2, \"xn--snsa-roa\": _2, \"snåsa\": _2, \"snoasa\": _2, \"snaase\": _2, \"xn--snase-nra\": _2, \"snåase\": _2, \"sogndal\": _2, \"sokndal\": _2, \"sola\": _2, \"solund\": _2, \"songdalen\": _2, \"sortland\": _2, \"spydeberg\": _2, \"stange\": _2, \"stavanger\": _2, \"steigen\": _2, \"steinkjer\": _2, \"stjordal\": _2, \"xn--stjrdal-s1a\": _2, \"stjørdal\": _2, \"stokke\": _2, \"stor-elvdal\": _2, \"stord\": _2, \"stordal\": _2, \"storfjord\": _2, \"omasvuotna\": _2, \"strand\": _2, \"stranda\": _2, \"stryn\": _2, \"sula\": _2, \"suldal\": _2, \"sund\": _2, \"sunndal\": _2, \"surnadal\": _2, \"sveio\": _2, \"svelvik\": _2, \"sykkylven\": _2, \"sogne\": _2, \"xn--sgne-gra\": _2, \"søgne\": _2, \"somna\": _2, \"xn--smna-gra\": _2, \"sømna\": _2, \"sondre-land\": _2, \"xn--sndre-land-0cb\": _2, \"søndre-land\": _2, \"sor-aurdal\": _2, \"xn--sr-aurdal-l8a\": _2, \"sør-aurdal\": _2, \"sor-fron\": _2, \"xn--sr-fron-q1a\": _2, \"sør-fron\": _2, \"sor-odal\": _2, \"xn--sr-odal-q1a\": _2, \"sør-odal\": _2, \"sor-varanger\": _2, \"xn--sr-varanger-ggb\": _2, \"sør-varanger\": _2, \"matta-varjjat\": _2, \"xn--mtta-vrjjat-k7af\": _2, \"mátta-várjjat\": _2, \"sorfold\": _2, \"xn--srfold-bya\": _2, \"sørfold\": _2, \"sorreisa\": _2, \"xn--srreisa-q1a\": _2, \"sørreisa\": _2, \"sorum\": _2, \"xn--srum-gra\": _2, \"sørum\": _2, \"tana\": _2, \"deatnu\": _2, \"time\": _2, \"tingvoll\": _2, \"tinn\": _2, \"tjeldsund\": _2, \"dielddanuorri\": _2, \"tjome\": _2, \"xn--tjme-hra\": _2, \"tjøme\": _2, \"tokke\": _2, \"tolga\": _2, \"torsken\": _2, \"tranoy\": _2, \"xn--trany-yua\": _2, \"tranøy\": _2, \"tromso\": _2, \"xn--troms-zua\": _2, \"tromsø\": _2, \"tromsa\": _2, \"romsa\": _2, \"trondheim\": _2, \"troandin\": _2, \"trysil\": _2, \"trana\": _2, \"xn--trna-woa\": _2, \"træna\": _2, \"trogstad\": _2, \"xn--trgstad-r1a\": _2, \"trøgstad\": _2, \"tvedestrand\": _2, \"tydal\": _2, \"tynset\": _2, \"tysfjord\": _2, \"divtasvuodna\": _2, \"divttasvuotna\": _2, \"tysnes\": _2, \"tysvar\": _2, \"xn--tysvr-vra\": _2, \"tysvær\": _2, \"tonsberg\": _2, \"xn--tnsberg-q1a\": _2, \"tønsberg\": _2, \"ullensaker\": _2, \"ullensvang\": _2, \"ulvik\": _2, \"utsira\": _2, \"vadso\": _2, \"xn--vads-jra\": _2, \"vadsø\": _2, \"cahcesuolo\": _2, \"xn--hcesuolo-7ya35b\": _2, \"čáhcesuolo\": _2, \"vaksdal\": _2, \"valle\": _2, \"vang\": _2, \"vanylven\": _2, \"vardo\": _2, \"xn--vard-jra\": _2, \"vardø\": _2, \"varggat\": _2, \"xn--vrggt-xqad\": _2, \"várggát\": _2, \"vefsn\": _2, \"vaapste\": _2, \"vega\": _2, \"vegarshei\": _2, \"xn--vegrshei-c0a\": _2, \"vegårshei\": _2, \"vennesla\": _2, \"verdal\": _2, \"verran\": _2, \"vestby\": _2, \"vestnes\": _2, \"vestre-slidre\": _2, \"vestre-toten\": _2, \"vestvagoy\": _2, \"xn--vestvgy-ixa6o\": _2, \"vestvågøy\": _2, \"vevelstad\": _2, \"vik\": _2, \"vikna\": _2, \"vindafjord\": _2, \"volda\": _2, \"voss\": _2, \"varoy\": _2, \"xn--vry-yla5g\": _2, \"værøy\": _2, \"vagan\": _2, \"xn--vgan-qoa\": _2, \"vågan\": _2, \"voagat\": _2, \"vagsoy\": _2, \"xn--vgsy-qoa0j\": _2, \"vågsøy\": _2, \"vaga\": _2, \"xn--vg-yiab\": _2, \"vågå\": _2, \"ostfold\": { \"$\": 0, \"succ\": { \"valer\": _2 } }, \"xn--stfold-9xa\": { \"$\": 0, \"succ\": { \"xn--vler-qoa\": _2 } }, \"østfold\": { \"$\": 0, \"succ\": { \"våler\": _2 } }, \"co\": _3, \"blogspot\": _3, \"123hjemmeside\": _3, \"myspreadshop\": _3 } }, \"np\": _8, \"nr\": _33, \"nu\": { \"$\": 1, \"succ\": { \"merseine\": _3, \"mine\": _3, \"shacknet\": _3, \"enterprisecloud\": _3 } }, \"nz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _6, \"cri\": _2, \"geek\": _2, \"gen\": _2, \"govt\": _2, \"health\": _2, \"iwi\": _2, \"kiwi\": _2, \"maori\": _2, \"mil\": _2, \"xn--mori-qsa\": _2, \"māori\": _2, \"net\": _2, \"org\": _2, \"parliament\": _2, \"school\": _2 } }, \"om\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"med\": _2, \"museum\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"onion\": _2, \"org\": { \"$\": 1, \"succ\": { \"altervista\": _3, \"amune\": { \"$\": 0, \"succ\": { \"tele\": _3 } }, \"pimienta\": _3, \"poivron\": _3, \"potager\": _3, \"sweetpepper\": _3, \"ae\": _3, \"us\": _3, \"certmgr\": _3, \"cdn77\": { \"$\": 0, \"succ\": { \"c\": _3, \"rsc\": _3 } }, \"cdn77-secure\": { \"$\": 0, \"succ\": { \"origin\": { \"$\": 0, \"succ\": { \"ssl\": _3 } } } }, \"cloudns\": _3, \"duckdns\": _3, \"tunk\": _3, \"dyndns\": { \"$\": 2, \"succ\": { \"go\": _3, \"home\": _3 } }, \"blogdns\": _3, \"blogsite\": _3, \"boldlygoingnowhere\": _3, \"dnsalias\": _3, \"dnsdojo\": _3, \"doesntexist\": _3, \"dontexist\": _3, \"doomdns\": _3, \"dvrdns\": _3, \"dynalias\": _3, \"endofinternet\": _3, \"endoftheinternet\": _3, \"from-me\": _3, \"game-host\": _3, \"gotdns\": _3, \"hobby-site\": _3, \"homedns\": _3, \"homeftp\": _3, \"homelinux\": _3, \"homeunix\": _3, \"is-a-bruinsfan\": _3, \"is-a-candidate\": _3, \"is-a-celticsfan\": _3, \"is-a-chef\": _3, \"is-a-geek\": _3, \"is-a-knight\": _3, \"is-a-linux-user\": _3, \"is-a-patsfan\": _3, \"is-a-soxfan\": _3, \"is-found\": _3, \"is-lost\": _3, \"is-saved\": _3, \"is-very-bad\": _3, \"is-very-evil\": _3, \"is-very-good\": _3, \"is-very-nice\": _3, \"is-very-sweet\": _3, \"isa-geek\": _3, \"kicks-ass\": _3, \"misconfused\": _3, \"podzone\": _3, \"readmyblog\": _3, \"selfip\": _3, \"sellsyourhome\": _3, \"servebbs\": _3, \"serveftp\": _3, \"servegame\": _3, \"stuff-4-sale\": _3, \"webhop\": _3, \"ddnss\": _3, \"accesscam\": _3, \"camdvr\": _3, \"freeddns\": _3, \"mywire\": _3, \"webredirect\": _3, \"eu\": { \"$\": 2, \"succ\": { \"al\": _3, \"asso\": _3, \"at\": _3, \"au\": _3, \"be\": _3, \"bg\": _3, \"ca\": _3, \"cd\": _3, \"ch\": _3, \"cn\": _3, \"cy\": _3, \"cz\": _3, \"de\": _3, \"dk\": _3, \"edu\": _3, \"ee\": _3, \"es\": _3, \"fi\": _3, \"fr\": _3, \"gr\": _3, \"hr\": _3, \"hu\": _3, \"ie\": _3, \"il\": _3, \"in\": _3, \"int\": _3, \"is\": _3, \"it\": _3, \"jp\": _3, \"kr\": _3, \"lt\": _3, \"lu\": _3, \"lv\": _3, \"mc\": _3, \"me\": _3, \"mk\": _3, \"mt\": _3, \"my\": _3, \"net\": _3, \"ng\": _3, \"nl\": _3, \"no\": _3, \"nz\": _3, \"paris\": _3, \"pl\": _3, \"pt\": _3, \"q-a\": _3, \"ro\": _3, \"ru\": _3, \"se\": _3, \"si\": _3, \"sk\": _3, \"tr\": _3, \"uk\": _3, \"us\": _3 } }, \"twmail\": _3, \"fedorainfracloud\": _3, \"fedorapeople\": _3, \"fedoraproject\": { \"$\": 0, \"succ\": { \"cloud\": _3, \"os\": _21, \"stg\": { \"$\": 0, \"succ\": { \"os\": _21 } } } }, \"freedesktop\": _3, \"hepforge\": _3, \"in-dsl\": _3, \"in-vpn\": _3, \"js\": _3, \"barsy\": _3, \"mayfirst\": _3, \"mozilla-iot\": _3, \"bmoattachments\": _3, \"dynserv\": _3, \"now-dns\": _3, \"cable-modem\": _3, \"collegefan\": _3, \"couchpotatofries\": _3, \"mlbfan\": _3, \"mysecuritycamera\": _3, \"nflfan\": _3, \"read-books\": _3, \"ufcfan\": _3, \"hopto\": _3, \"myftp\": _3, \"no-ip\": _3, \"zapto\": _3, \"httpbin\": _3, \"pubtls\": _3, \"jpn\": _3, \"my-firewall\": _3, \"myfirewall\": _3, \"spdns\": _3, \"small-web\": _3, \"dsmynas\": _3, \"familyds\": _3, \"teckids\": _12, \"tuxfamily\": _3, \"diskstation\": _3, \"hk\": _3, \"wmflabs\": _3, \"toolforge\": _3, \"wmcloud\": _3, \"za\": _3 } }, \"pa\": { \"$\": 1, \"succ\": { \"ac\": _2, \"gob\": _2, \"com\": _2, \"org\": _2, \"sld\": _2, \"edu\": _2, \"net\": _2, \"ing\": _2, \"abo\": _2, \"med\": _2, \"nom\": _2 } }, \"pe\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gob\": _2, \"nom\": _2, \"mil\": _2, \"org\": _2, \"com\": _2, \"net\": _2, \"blogspot\": _3 } }, \"pf\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"edu\": _2 } }, \"pg\": _8, \"ph\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"ngo\": _2, \"mil\": _2, \"i\": _2 } }, \"pk\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"edu\": _2, \"org\": _2, \"fam\": _2, \"biz\": _2, \"web\": _2, \"gov\": _2, \"gob\": _2, \"gok\": _2, \"gon\": _2, \"gop\": _2, \"gos\": _2, \"info\": _2 } }, \"pl\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"aid\": _2, \"agro\": _2, \"atm\": _2, \"auto\": _2, \"biz\": _2, \"edu\": _2, \"gmina\": _2, \"gsm\": _2, \"info\": _2, \"mail\": _2, \"miasta\": _2, \"media\": _2, \"mil\": _2, \"nieruchomosci\": _2, \"nom\": _2, \"pc\": _2, \"powiat\": _2, \"priv\": _2, \"realestate\": _2, \"rel\": _2, \"sex\": _2, \"shop\": _2, \"sklep\": _2, \"sos\": _2, \"szkola\": _2, \"targi\": _2, \"tm\": _2, \"tourism\": _2, \"travel\": _2, \"turystyka\": _2, \"gov\": { \"$\": 1, \"succ\": { \"ap\": _2, \"ic\": _2, \"is\": _2, \"us\": _2, \"kmpsp\": _2, \"kppsp\": _2, \"kwpsp\": _2, \"psp\": _2, \"wskr\": _2, \"kwp\": _2, \"mw\": _2, \"ug\": _2, \"um\": _2, \"umig\": _2, \"ugim\": _2, \"upow\": _2, \"uw\": _2, \"starostwo\": _2, \"pa\": _2, \"po\": _2, \"psse\": _2, \"pup\": _2, \"rzgw\": _2, \"sa\": _2, \"so\": _2, \"sr\": _2, \"wsa\": _2, \"sko\": _2, \"uzs\": _2, \"wiih\": _2, \"winb\": _2, \"pinb\": _2, \"wios\": _2, \"witd\": _2, \"wzmiuw\": _2, \"piw\": _2, \"wiw\": _2, \"griw\": _2, \"wif\": _2, \"oum\": _2, \"sdn\": _2, \"zp\": _2, \"uppo\": _2, \"mup\": _2, \"wuoz\": _2, \"konsulat\": _2, \"oirm\": _2 } }, \"augustow\": _2, \"babia-gora\": _2, \"bedzin\": _2, \"beskidy\": _2, \"bialowieza\": _2, \"bialystok\": _2, \"bielawa\": _2, \"bieszczady\": _2, \"boleslawiec\": _2, \"bydgoszcz\": _2, \"bytom\": _2, \"cieszyn\": _2, \"czeladz\": _2, \"czest\": _2, \"dlugoleka\": _2, \"elblag\": _2, \"elk\": _2, \"glogow\": _2, \"gniezno\": _2, \"gorlice\": _2, \"grajewo\": _2, \"ilawa\": _2, \"jaworzno\": _2, \"jelenia-gora\": _2, \"jgora\": _2, \"kalisz\": _2, \"kazimierz-dolny\": _2, \"karpacz\": _2, \"kartuzy\": _2, \"kaszuby\": _2, \"katowice\": _2, \"kepno\": _2, \"ketrzyn\": _2, \"klodzko\": _2, \"kobierzyce\": _2, \"kolobrzeg\": _2, \"konin\": _2, \"konskowola\": _2, \"kutno\": _2, \"lapy\": _2, \"lebork\": _2, \"legnica\": _2, \"lezajsk\": _2, \"limanowa\": _2, \"lomza\": _2, \"lowicz\": _2, \"lubin\": _2, \"lukow\": _2, \"malbork\": _2, \"malopolska\": _2, \"mazowsze\": _2, \"mazury\": _2, \"mielec\": _2, \"mielno\": _2, \"mragowo\": _2, \"naklo\": _2, \"nowaruda\": _2, \"nysa\": _2, \"olawa\": _2, \"olecko\": _2, \"olkusz\": _2, \"olsztyn\": _2, \"opoczno\": _2, \"opole\": _2, \"ostroda\": _2, \"ostroleka\": _2, \"ostrowiec\": _2, \"ostrowwlkp\": _2, \"pila\": _2, \"pisz\": _2, \"podhale\": _2, \"podlasie\": _2, \"polkowice\": _2, \"pomorze\": _2, \"pomorskie\": _2, \"prochowice\": _2, \"pruszkow\": _2, \"przeworsk\": _2, \"pulawy\": _2, \"radom\": _2, \"rawa-maz\": _2, \"rybnik\": _2, \"rzeszow\": _2, \"sanok\": _2, \"sejny\": _2, \"slask\": _2, \"slupsk\": _2, \"sosnowiec\": _2, \"stalowa-wola\": _2, \"skoczow\": _2, \"starachowice\": _2, \"stargard\": _2, \"suwalki\": _2, \"swidnica\": _2, \"swiebodzin\": _2, \"swinoujscie\": _2, \"szczecin\": _2, \"szczytno\": _2, \"tarnobrzeg\": _2, \"tgory\": _2, \"turek\": _2, \"tychy\": _2, \"ustka\": _2, \"walbrzych\": _2, \"warmia\": _2, \"warszawa\": _2, \"waw\": _2, \"wegrow\": _2, \"wielun\": _2, \"wlocl\": _2, \"wloclawek\": _2, \"wodzislaw\": _2, \"wolomin\": _2, \"wroclaw\": _2, \"zachpomor\": _2, \"zagan\": _2, \"zarow\": _2, \"zgora\": _2, \"zgorzelec\": _2, \"beep\": _3, \"ecommerce-shop\": _3, \"shoparena\": _3, \"homesklep\": _3, \"sdscloud\": _3, \"unicloud\": _3, \"krasnik\": _3, \"leczna\": _3, \"lubartow\": _3, \"lublin\": _3, \"poniatowa\": _3, \"swidnik\": _3, \"co\": _3, \"simplesite\": _3, \"art\": _3, \"gliwice\": _3, \"krakow\": _3, \"poznan\": _3, \"wroc\": _3, \"zakopane\": _3, \"myspreadshop\": _3, \"gda\": _3, \"gdansk\": _3, \"gdynia\": _3, \"med\": _3, \"sopot\": _3 } }, \"pm\": { \"$\": 1, \"succ\": { \"own\": _3, \"name\": _3 } }, \"pn\": { \"$\": 1, \"succ\": { \"gov\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"net\": _2 } }, \"post\": _2, \"pr\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"isla\": _2, \"pro\": _2, \"biz\": _2, \"info\": _2, \"name\": _2, \"est\": _2, \"prof\": _2, \"ac\": _2 } }, \"pro\": { \"$\": 1, \"succ\": { \"aaa\": _2, \"aca\": _2, \"acct\": _2, \"avocat\": _2, \"bar\": _2, \"cpa\": _2, \"eng\": _2, \"jur\": _2, \"law\": _2, \"med\": _2, \"recht\": _2, \"cloudns\": _3, \"dnstrace\": { \"$\": 0, \"succ\": { \"bci\": _3 } }, \"barsy\": _3 } }, \"ps\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"sec\": _2, \"plo\": _2, \"com\": _2, \"org\": _2, \"net\": _2 } }, \"pt\": { \"$\": 1, \"succ\": { \"net\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"int\": _2, \"publ\": _2, \"com\": _2, \"nome\": _2, \"blogspot\": _3, \"123paginaweb\": _3 } }, \"pw\": { \"$\": 1, \"succ\": { \"co\": _2, \"ne\": _2, \"or\": _2, \"ed\": _2, \"go\": _2, \"belau\": _2, \"cloudns\": _3, \"x443\": _3 } }, \"py\": { \"$\": 1, \"succ\": { \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"qa\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"blogspot\": _3 } }, \"re\": { \"$\": 1, \"succ\": { \"asso\": _2, \"com\": _2, \"nom\": _2, \"blogspot\": _3 } }, \"ro\": { \"$\": 1, \"succ\": { \"arts\": _2, \"com\": _2, \"firm\": _2, \"info\": _2, \"nom\": _2, \"nt\": _2, \"org\": _2, \"rec\": _2, \"store\": _2, \"tm\": _2, \"www\": _2, \"co\": _3, \"shop\": _3, \"blogspot\": _3, \"barsy\": _3 } }, \"rs\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"org\": _2, \"brendly\": { \"$\": 0, \"succ\": { \"shop\": _3 } }, \"blogspot\": _3, \"ua\": _3, \"ox\": _3 } }, \"ru\": { \"$\": 1, \"succ\": { \"ac\": _3, \"edu\": _3, \"gov\": _3, \"int\": _3, \"mil\": _3, \"test\": _3, \"eurodir\": _3, \"adygeya\": _3, \"bashkiria\": _3, \"bir\": _3, \"cbg\": _3, \"com\": _3, \"dagestan\": _3, \"grozny\": _3, \"kalmykia\": _3, \"kustanai\": _3, \"marine\": _3, \"mordovia\": _3, \"msk\": _3, \"mytis\": _3, \"nalchik\": _3, \"nov\": _3, \"pyatigorsk\": _3, \"spb\": _3, \"vladikavkaz\": _3, \"vladimir\": _3, \"blogspot\": _3, \"na4u\": _3, \"mircloud\": _3, \"regruhosting\": _27, \"myjino\": { \"$\": 2, \"succ\": { \"hosting\": _5, \"landing\": _5, \"spectrum\": _5, \"vps\": _5 } }, \"cldmail\": { \"$\": 0, \"succ\": { \"hb\": _3 } }, \"mcdir\": { \"$\": 2, \"succ\": { \"vps\": _3 } }, \"mcpre\": _3, \"net\": _3, \"org\": _3, \"pp\": _3, \"123sait\": _3, \"lk3\": _3, \"ras\": _3 } }, \"rw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"coop\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"sa\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"med\": _2, \"pub\": _2, \"edu\": _2, \"sch\": _2 } }, \"sb\": _4, \"sc\": _4, \"sd\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"med\": _2, \"tv\": _2, \"gov\": _2, \"info\": _2 } }, \"se\": { \"$\": 1, \"succ\": { \"a\": _2, \"ac\": _2, \"b\": _2, \"bd\": _2, \"brand\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"fh\": _2, \"fhsk\": _2, \"fhv\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"k\": _2, \"komforb\": _2, \"kommunalforbund\": _2, \"komvux\": _2, \"l\": _2, \"lanbib\": _2, \"m\": _2, \"n\": _2, \"naturbruksgymn\": _2, \"o\": _2, \"org\": _2, \"p\": _2, \"parti\": _2, \"pp\": _2, \"press\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"tm\": _2, \"u\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"com\": _3, \"blogspot\": _3, \"conf\": _3, \"iopsys\": _3, \"123minsida\": _3, \"itcouldbewor\": _3, \"myspreadshop\": _3, \"paba\": { \"$\": 0, \"succ\": { \"su\": _3 } } } }, \"sg\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"per\": _2, \"blogspot\": _3, \"enscaled\": _3 } }, \"sh\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"bip\": _3, \"hashbang\": _3, \"platform\": { \"$\": 0, \"succ\": { \"bc\": _3, \"ent\": _3, \"eu\": _3, \"us\": _3 } }, \"now\": _3, \"vxl\": _3, \"wedeploy\": _3 } }, \"si\": { \"$\": 1, \"succ\": { \"gitapp\": _3, \"gitpage\": _3, \"blogspot\": _3 } }, \"sj\": _2, \"sk\": _6, \"sl\": _4, \"sm\": _2, \"sn\": { \"$\": 1, \"succ\": { \"art\": _2, \"com\": _2, \"edu\": _2, \"gouv\": _2, \"org\": _2, \"perso\": _2, \"univ\": _2, \"blogspot\": _3 } }, \"so\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"me\": _2, \"net\": _2, \"org\": _2, \"sch\": _3 } }, \"sr\": _2, \"ss\": { \"$\": 1, \"succ\": { \"biz\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"me\": _2, \"net\": _2, \"org\": _2, \"sch\": _2 } }, \"st\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"consulado\": _2, \"edu\": _2, \"embaixada\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"principe\": _2, \"saotome\": _2, \"store\": _2, \"kirara\": _3, \"noho\": _3 } }, \"su\": { \"$\": 1, \"succ\": { \"abkhazia\": _3, \"adygeya\": _3, \"aktyubinsk\": _3, \"arkhangelsk\": _3, \"armenia\": _3, \"ashgabad\": _3, \"azerbaijan\": _3, \"balashov\": _3, \"bashkiria\": _3, \"bryansk\": _3, \"bukhara\": _3, \"chimkent\": _3, \"dagestan\": _3, \"east-kazakhstan\": _3, \"exnet\": _3, \"georgia\": _3, \"grozny\": _3, \"ivanovo\": _3, \"jambyl\": _3, \"kalmykia\": _3, \"kaluga\": _3, \"karacol\": _3, \"karaganda\": _3, \"karelia\": _3, \"khakassia\": _3, \"krasnodar\": _3, \"kurgan\": _3, \"kustanai\": _3, \"lenug\": _3, \"mangyshlak\": _3, \"mordovia\": _3, \"msk\": _3, \"murmansk\": _3, \"nalchik\": _3, \"navoi\": _3, \"north-kazakhstan\": _3, \"nov\": _3, \"obninsk\": _3, \"penza\": _3, \"pokrovsk\": _3, \"sochi\": _3, \"spb\": _3, \"tashkent\": _3, \"termez\": _3, \"togliatti\": _3, \"troitsk\": _3, \"tselinograd\": _3, \"tula\": _3, \"tuva\": _3, \"vladikavkaz\": _3, \"vladimir\": _3, \"vologda\": _3 } }, \"sv\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"org\": _2, \"red\": _2 } }, \"sx\": _7, \"sy\": _32, \"sz\": { \"$\": 1, \"succ\": { \"co\": _2, \"ac\": _2, \"org\": _2 } }, \"tc\": { \"$\": 1, \"succ\": { \"ch\": _3, \"me\": _3, \"we\": _3 } }, \"td\": _6, \"tel\": _2, \"tf\": { \"$\": 1, \"succ\": { \"sch\": _3 } }, \"tg\": _2, \"th\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"go\": _2, \"in\": _2, \"mi\": _2, \"net\": _2, \"or\": _2, \"online\": _3, \"shop\": _3 } }, \"tj\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"go\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"nic\": _2, \"org\": _2, \"test\": _2, \"web\": _2 } }, \"tk\": _2, \"tl\": _7, \"tm\": { \"$\": 1, \"succ\": { \"com\": _2, \"co\": _2, \"org\": _2, \"net\": _2, \"nom\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2 } }, \"tn\": { \"$\": 1, \"succ\": { \"com\": _2, \"ens\": _2, \"fin\": _2, \"gov\": _2, \"ind\": _2, \"info\": _2, \"intl\": _2, \"mincom\": _2, \"nat\": _2, \"net\": _2, \"org\": _2, \"perso\": _2, \"tourism\": _2, \"orangecloud\": _3 } }, \"to\": { \"$\": 1, \"succ\": { \"611\": _3, \"com\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"mil\": _2, \"oya\": _3, \"rdv\": _3, \"x0\": _3, \"vpnplus\": _3, \"quickconnect\": _13, \"nyan\": _3 } }, \"tr\": { \"$\": 1, \"succ\": { \"av\": _2, \"bbs\": _2, \"bel\": _2, \"biz\": _2, \"com\": _6, \"dr\": _2, \"edu\": _2, \"gen\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"k12\": _2, \"kep\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pol\": _2, \"tel\": _2, \"tsk\": _2, \"tv\": _2, \"web\": _2, \"nc\": _7 } }, \"tt\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"biz\": _2, \"info\": _2, \"pro\": _2, \"int\": _2, \"coop\": _2, \"jobs\": _2, \"mobi\": _2, \"travel\": _2, \"museum\": _2, \"aero\": _2, \"name\": _2, \"gov\": _2, \"edu\": _2 } }, \"tv\": { \"$\": 1, \"succ\": { \"dyndns\": _3, \"better-than\": _3, \"on-the-web\": _3, \"worse-than\": _3, \"from\": _3, \"sakura\": _3 } }, \"tw\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"mil\": _2, \"com\": { \"$\": 1, \"succ\": { \"mymailer\": _3 } }, \"net\": _2, \"org\": _2, \"idv\": _2, \"game\": _2, \"ebiz\": _2, \"club\": _2, \"xn--zf0ao64a\": _2, \"網路\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--czrw28b\": _2, \"商業\": _2, \"url\": _3, \"blogspot\": _3 } }, \"tz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"go\": _2, \"hotel\": _2, \"info\": _2, \"me\": _2, \"mil\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2, \"tv\": _2 } }, \"ua\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"net\": _2, \"org\": _2, \"cherkassy\": _2, \"cherkasy\": _2, \"chernigov\": _2, \"chernihiv\": _2, \"chernivtsi\": _2, \"chernovtsy\": _2, \"ck\": _2, \"cn\": _2, \"cr\": _2, \"crimea\": _2, \"cv\": _2, \"dn\": _2, \"dnepropetrovsk\": _2, \"dnipropetrovsk\": _2, \"donetsk\": _2, \"dp\": _2, \"if\": _2, \"ivano-frankivsk\": _2, \"kh\": _2, \"kharkiv\": _2, \"kharkov\": _2, \"kherson\": _2, \"khmelnitskiy\": _2, \"khmelnytskyi\": _2, \"kiev\": _2, \"kirovograd\": _2, \"km\": _2, \"kr\": _2, \"krym\": _2, \"ks\": _2, \"kv\": _2, \"kyiv\": _2, \"lg\": _2, \"lt\": _2, \"lugansk\": _2, \"lutsk\": _2, \"lv\": _2, \"lviv\": _2, \"mk\": _2, \"mykolaiv\": _2, \"nikolaev\": _2, \"od\": _2, \"odesa\": _2, \"odessa\": _2, \"pl\": _2, \"poltava\": _2, \"rivne\": _2, \"rovno\": _2, \"rv\": _2, \"sb\": _2, \"sebastopol\": _2, \"sevastopol\": _2, \"sm\": _2, \"sumy\": _2, \"te\": _2, \"ternopil\": _2, \"uz\": _2, \"uzhgorod\": _2, \"vinnica\": _2, \"vinnytsia\": _2, \"vn\": _2, \"volyn\": _2, \"yalta\": _2, \"zaporizhzhe\": _2, \"zaporizhzhia\": _2, \"zhitomir\": _2, \"zhytomyr\": _2, \"zp\": _2, \"zt\": _2, \"cc\": _3, \"inf\": _3, \"ltd\": _3, \"cx\": _3, \"ie\": _3, \"biz\": _3, \"co\": _3, \"pp\": _3, \"v\": _3 } }, \"ug\": { \"$\": 1, \"succ\": { \"co\": _2, \"or\": _2, \"ac\": _2, \"sc\": _2, \"go\": _2, \"ne\": _2, \"com\": _2, \"org\": _2, \"blogspot\": _3 } }, \"uk\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": { \"$\": 1, \"succ\": { \"bytemark\": { \"$\": 0, \"succ\": { \"dh\": _3, \"vm\": _3 } }, \"blogspot\": _3, \"layershift\": _26, \"barsy\": _3, \"barsyonline\": _3, \"retrosnub\": _31, \"nh-serv\": _3, \"no-ip\": _3, \"wellbeingzone\": _3, \"adimo\": _3, \"myspreadshop\": _3 } }, \"gov\": { \"$\": 1, \"succ\": { \"campaign\": _3, \"service\": _3, \"api\": _3, \"homeoffice\": _3 } }, \"ltd\": _2, \"me\": _2, \"net\": _2, \"nhs\": _2, \"org\": { \"$\": 1, \"succ\": { \"glug\": _3, \"lug\": _3, \"lugs\": _3, \"affinitylottery\": _3, \"raffleentry\": _3, \"weeklylottery\": _3 } }, \"plc\": _2, \"police\": _2, \"sch\": _8, \"conn\": _3, \"copro\": _3, \"hosp\": _3, \"independent-commission\": _3, \"independent-inquest\": _3, \"independent-inquiry\": _3, \"independent-panel\": _3, \"independent-review\": _3, \"public-inquiry\": _3, \"royal-commission\": _3, \"pymnt\": _3, \"barsy\": _3 } }, \"us\": { \"$\": 1, \"succ\": { \"dni\": _2, \"fed\": _2, \"isa\": _2, \"kids\": _2, \"nsn\": _2, \"ak\": _40, \"al\": _40, \"ar\": _40, \"as\": _40, \"az\": _40, \"ca\": _40, \"co\": _40, \"ct\": _40, \"dc\": _40, \"de\": { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _3 } }, \"fl\": _40, \"ga\": _40, \"gu\": _40, \"hi\": _41, \"ia\": _40, \"id\": _40, \"il\": _40, \"in\": _40, \"ks\": _40, \"ky\": _40, \"la\": _40, \"ma\": { \"$\": 1, \"succ\": { \"k12\": { \"$\": 1, \"succ\": { \"pvt\": _2, \"chtr\": _2, \"paroch\": _2 } }, \"cc\": _2, \"lib\": _2 } }, \"md\": _40, \"me\": _40, \"mi\": { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _2, \"ann-arbor\": _2, \"cog\": _2, \"dst\": _2, \"eaton\": _2, \"gen\": _2, \"mus\": _2, \"tec\": _2, \"washtenaw\": _2 } }, \"mn\": _40, \"mo\": _40, \"ms\": _40, \"mt\": _40, \"nc\": _40, \"nd\": _41, \"ne\": _40, \"nh\": _40, \"nj\": _40, \"nm\": _40, \"nv\": _40, \"ny\": _40, \"oh\": _40, \"ok\": _40, \"or\": _40, \"pa\": _40, \"pr\": _40, \"ri\": _41, \"sc\": _40, \"sd\": _41, \"tn\": _40, \"tx\": _40, \"ut\": _40, \"vi\": _40, \"vt\": _40, \"va\": _40, \"wa\": _40, \"wi\": _40, \"wv\": { \"$\": 1, \"succ\": { \"cc\": _2 } }, \"wy\": _40, \"graphox\": _3, \"cloudns\": _3, \"drud\": _3, \"is-by\": _3, \"land-4-sale\": _3, \"stuff-4-sale\": _3, \"enscaled\": { \"$\": 0, \"succ\": { \"phx\": _3 } }, \"mircloud\": _3, \"freeddns\": _3, \"golffan\": _3, \"noip\": _3, \"pointto\": _3, \"platterp\": _3 } }, \"uy\": { \"$\": 1, \"succ\": { \"com\": _6, \"edu\": _2, \"gub\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"uz\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"net\": _2, \"org\": _2 } }, \"va\": _2, \"vc\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2, \"gv\": { \"$\": 2, \"succ\": { \"d\": _3 } }, \"0e\": _3 } }, \"ve\": { \"$\": 1, \"succ\": { \"arts\": _2, \"bib\": _2, \"co\": _2, \"com\": _2, \"e12\": _2, \"edu\": _2, \"firm\": _2, \"gob\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"rar\": _2, \"rec\": _2, \"store\": _2, \"tec\": _2, \"web\": _2 } }, \"vg\": { \"$\": 1, \"succ\": { \"at\": _3 } }, \"vi\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"k12\": _2, \"net\": _2, \"org\": _2 } }, \"vn\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"int\": _2, \"ac\": _2, \"biz\": _2, \"info\": _2, \"name\": _2, \"pro\": _2, \"health\": _2, \"blogspot\": _3 } }, \"vu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"cn\": _3, \"blog\": _3, \"dev\": _3, \"me\": _3 } }, \"wf\": { \"$\": 1, \"succ\": { \"biz\": _3, \"sch\": _3 } }, \"ws\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"advisor\": _5, \"cloud66\": _3, \"dyndns\": _3, \"mypets\": _3 } }, \"yt\": { \"$\": 1, \"succ\": { \"org\": _3 } }, \"xn--mgbaam7a8h\": _2, \"امارات\": _2, \"xn--y9a3aq\": _2, \"հայ\": _2, \"xn--54b7fta0cc\": _2, \"বাংলা\": _2, \"xn--90ae\": _2, \"бг\": _2, \"xn--mgbcpq6gpa1a\": _2, \"البحرين\": _2, \"xn--90ais\": _2, \"бел\": _2, \"xn--fiqs8s\": _2, \"中国\": _2, \"xn--fiqz9s\": _2, \"中國\": _2, \"xn--lgbbat1ad8j\": _2, \"الجزائر\": _2, \"xn--wgbh1c\": _2, \"مصر\": _2, \"xn--e1a4c\": _2, \"ею\": _2, \"xn--qxa6a\": _2, \"ευ\": _2, \"xn--mgbah1a3hjkrd\": _2, \"موريتانيا\": _2, \"xn--node\": _2, \"გე\": _2, \"xn--qxam\": _2, \"ελ\": _2, \"xn--j6w193g\": { \"$\": 1, \"succ\": { \"xn--55qx5d\": _2, \"xn--wcvs22d\": _2, \"xn--mxtq1m\": _2, \"xn--gmqw5a\": _2, \"xn--od0alg\": _2, \"xn--uc0atv\": _2 } }, \"香港\": { \"$\": 1, \"succ\": { \"公司\": _2, \"教育\": _2, \"政府\": _2, \"個人\": _2, \"網絡\": _2, \"組織\": _2 } }, \"xn--2scrj9c\": _2, \"ಭಾರತ\": _2, \"xn--3hcrj9c\": _2, \"ଭାରତ\": _2, \"xn--45br5cyl\": _2, \"ভাৰত\": _2, \"xn--h2breg3eve\": _2, \"भारतम्\": _2, \"xn--h2brj9c8c\": _2, \"भारोत\": _2, \"xn--mgbgu82a\": _2, \"ڀارت\": _2, \"xn--rvc1e0am3e\": _2, \"ഭാരതം\": _2, \"xn--h2brj9c\": _2, \"भारत\": _2, \"xn--mgbbh1a\": _2, \"بارت\": _2, \"xn--mgbbh1a71e\": _2, \"بھارت\": _2, \"xn--fpcrj9c3d\": _2, \"భారత్\": _2, \"xn--gecrj9c\": _2, \"ભારત\": _2, \"xn--s9brj9c\": _2, \"ਭਾਰਤ\": _2, \"xn--45brj9c\": _2, \"ভারত\": _2, \"xn--xkc2dl3a5ee0h\": _2, \"இந்தியா\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2, \"xn--mgbtx2b\": _2, \"عراق\": _2, \"xn--mgbayh7gpa\": _2, \"الاردن\": _2, \"xn--3e0b707e\": _2, \"한국\": _2, \"xn--80ao21a\": _2, \"қаз\": _2, \"xn--q7ce6a\": _2, \"ລາວ\": _2, \"xn--fzc2c9e2c\": _2, \"ලංකා\": _2, \"xn--xkc2al3hye2a\": _2, \"இலங்கை\": _2, \"xn--mgbc0a9azcg\": _2, \"المغرب\": _2, \"xn--d1alf\": _2, \"мкд\": _2, \"xn--l1acc\": _2, \"мон\": _2, \"xn--mix891f\": _2, \"澳門\": _2, \"xn--mix082f\": _2, \"澳门\": _2, \"xn--mgbx4cd0ab\": _2, \"مليسيا\": _2, \"xn--mgb9awbf\": _2, \"عمان\": _2, \"xn--mgbai9azgqp6j\": _2, \"پاکستان\": _2, \"xn--mgbai9a5eva00b\": _2, \"پاكستان\": _2, \"xn--ygbi2ammx\": _2, \"فلسطين\": _2, \"xn--90a3ac\": { \"$\": 1, \"succ\": { \"xn--o1ac\": _2, \"xn--c1avg\": _2, \"xn--90azh\": _2, \"xn--d1at\": _2, \"xn--o1ach\": _2, \"xn--80au\": _2 } }, \"срб\": { \"$\": 1, \"succ\": { \"пр\": _2, \"орг\": _2, \"обр\": _2, \"од\": _2, \"упр\": _2, \"ак\": _2 } }, \"xn--p1ai\": _2, \"рф\": _2, \"xn--wgbl6a\": _2, \"قطر\": _2, \"xn--mgberp4a5d4ar\": _2, \"السعودية\": _2, \"xn--mgberp4a5d4a87g\": _2, \"السعودیة\": _2, \"xn--mgbqly7c0a67fbc\": _2, \"السعودیۃ\": _2, \"xn--mgbqly7cvafr\": _2, \"السعوديه\": _2, \"xn--mgbpl2fh\": _2, \"سودان\": _2, \"xn--yfro4i67o\": _2, \"新加坡\": _2, \"xn--clchc0ea0b2g2a9gcd\": _2, \"சிங்கப்பூர்\": _2, \"xn--ogbpf8fl\": _2, \"سورية\": _2, \"xn--mgbtf8fl\": _2, \"سوريا\": _2, \"xn--o3cw4h\": { \"$\": 1, \"succ\": { \"xn--12c1fe0br\": _2, \"xn--12co0c3b4eva\": _2, \"xn--h3cuzk1di\": _2, \"xn--o3cyx2a\": _2, \"xn--m3ch0j3a\": _2, \"xn--12cfi8ixb8l\": _2 } }, \"ไทย\": { \"$\": 1, \"succ\": { \"ศึกษา\": _2, \"ธุรกิจ\": _2, \"รัฐบาล\": _2, \"ทหาร\": _2, \"เน็ต\": _2, \"องค์กร\": _2 } }, \"xn--pgbs0dh\": _2, \"تونس\": _2, \"xn--kpry57d\": _2, \"台灣\": _2, \"xn--kprw13d\": _2, \"台湾\": _2, \"xn--nnx388a\": _2, \"臺灣\": _2, \"xn--j1amh\": _2, \"укр\": _2, \"xn--mgb2ddes\": _2, \"اليمن\": _2, \"xxx\": _2, \"ye\": _32, \"za\": { \"$\": 0, \"succ\": { \"ac\": _2, \"agric\": _2, \"alt\": _2, \"co\": _6, \"edu\": _2, \"gov\": _2, \"grondar\": _2, \"law\": _2, \"mil\": _2, \"net\": _2, \"ngo\": _2, \"nic\": _2, \"nis\": _2, \"nom\": _2, \"org\": _2, \"school\": _2, \"tm\": _2, \"web\": _2 } }, \"zm\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sch\": _2 } }, \"zw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"gov\": _2, \"mil\": _2, \"org\": _2 } }, \"aaa\": _2, \"aarp\": _2, \"abarth\": _2, \"abb\": _2, \"abbott\": _2, \"abbvie\": _2, \"abc\": _2, \"able\": _2, \"abogado\": _2, \"abudhabi\": _2, \"academy\": { \"$\": 1, \"succ\": { \"official\": _3 } }, \"accenture\": _2, \"accountant\": _2, \"accountants\": _2, \"aco\": _2, \"actor\": _2, \"ads\": _2, \"adult\": _2, \"aeg\": _2, \"aetna\": _2, \"afl\": _2, \"africa\": _2, \"agakhan\": _2, \"agency\": _2, \"aig\": _2, \"airbus\": _2, \"airforce\": _2, \"airtel\": _2, \"akdn\": _2, \"alfaromeo\": _2, \"alibaba\": _2, \"alipay\": _2, \"allfinanz\": _2, \"allstate\": _2, \"ally\": _2, \"alsace\": _2, \"alstom\": _2, \"amazon\": _2, \"americanexpress\": _2, \"americanfamily\": _2, \"amex\": _2, \"amfam\": _2, \"amica\": _2, \"amsterdam\": _2, \"analytics\": _2, \"android\": _2, \"anquan\": _2, \"anz\": _2, \"aol\": _2, \"apartments\": _2, \"app\": { \"$\": 1, \"succ\": { \"beget\": _5, \"clerk\": _3, \"clerkstage\": _3, \"wnext\": _3, \"platform0\": _3, \"deta\": _3, \"ondigitalocean\": _3, \"easypanel\": _3, \"encr\": _3, \"edgecompute\": _3, \"fireweb\": _3, \"onflashdrive\": _3, \"framer\": _3, \"run\": { \"$\": 2, \"succ\": { \"a\": _3 } }, \"web\": _3, \"hasura\": _3, \"loginline\": _3, \"messerli\": _3, \"netlify\": _3, \"ngrok\": _3, \"ngrok-free\": _3, \"developer\": _5, \"noop\": _3, \"northflank\": _5, \"snowflake\": { \"$\": 2, \"succ\": { \"privatelink\": _3 } }, \"streamlit\": _3, \"telebit\": _3, \"typedream\": _3, \"vercel\": _3, \"bookonline\": _3 } }, \"apple\": _2, \"aquarelle\": _2, \"arab\": _2, \"aramco\": _2, \"archi\": _2, \"army\": _2, \"art\": _2, \"arte\": _2, \"asda\": _2, \"associates\": _2, \"athleta\": _2, \"attorney\": _2, \"auction\": _2, \"audi\": _2, \"audible\": _2, \"audio\": _2, \"auspost\": _2, \"author\": _2, \"auto\": _2, \"autos\": _2, \"avianca\": _2, \"aws\": _2, \"axa\": _2, \"azure\": _2, \"baby\": _2, \"baidu\": _2, \"banamex\": _2, \"bananarepublic\": _2, \"band\": _2, \"bank\": _2, \"bar\": _2, \"barcelona\": _2, \"barclaycard\": _2, \"barclays\": _2, \"barefoot\": _2, \"bargains\": _2, \"baseball\": _2, \"basketball\": { \"$\": 1, \"succ\": { \"aus\": _3, \"nz\": _3 } }, \"bauhaus\": _2, \"bayern\": _2, \"bbc\": _2, \"bbt\": _2, \"bbva\": _2, \"bcg\": _2, \"bcn\": _2, \"beats\": _2, \"beauty\": _2, \"beer\": _2, \"bentley\": _2, \"berlin\": _2, \"best\": _2, \"bestbuy\": _2, \"bet\": _2, \"bharti\": _2, \"bible\": _2, \"bid\": _2, \"bike\": _2, \"bing\": _2, \"bingo\": _2, \"bio\": _2, \"black\": _2, \"blackfriday\": _2, \"blockbuster\": _2, \"blog\": _2, \"bloomberg\": _2, \"blue\": _2, \"bms\": _2, \"bmw\": _2, \"bnpparibas\": _2, \"boats\": _2, \"boehringer\": _2, \"bofa\": _2, \"bom\": _2, \"bond\": _2, \"boo\": _2, \"book\": _2, \"booking\": _2, \"bosch\": _2, \"bostik\": _2, \"boston\": _2, \"bot\": _2, \"boutique\": _2, \"box\": _2, \"bradesco\": _2, \"bridgestone\": _2, \"broadway\": _2, \"broker\": _2, \"brother\": _2, \"brussels\": _2, \"build\": _2, \"builders\": { \"$\": 1, \"succ\": { \"cloudsite\": _3 } }, \"business\": _10, \"buy\": _2, \"buzz\": _2, \"bzh\": _2, \"cab\": _2, \"cafe\": _2, \"cal\": _2, \"call\": _2, \"calvinklein\": _2, \"cam\": _2, \"camera\": _2, \"camp\": _2, \"canon\": _2, \"capetown\": _2, \"capital\": _2, \"capitalone\": _2, \"car\": _2, \"caravan\": _2, \"cards\": _2, \"care\": _2, \"career\": _2, \"careers\": _2, \"cars\": _2, \"casa\": { \"$\": 1, \"succ\": { \"nabu\": { \"$\": 0, \"succ\": { \"ui\": _3 } } } }, \"case\": _2, \"cash\": _2, \"casino\": _2, \"catering\": _2, \"catholic\": _2, \"cba\": _2, \"cbn\": _2, \"cbre\": _2, \"cbs\": _2, \"center\": _2, \"ceo\": _2, \"cern\": _2, \"cfa\": _2, \"cfd\": _2, \"chanel\": _2, \"channel\": _2, \"charity\": _2, \"chase\": _2, \"chat\": _2, \"cheap\": _2, \"chintai\": _2, \"christmas\": _2, \"chrome\": _2, \"church\": _2, \"cipriani\": _2, \"circle\": _2, \"cisco\": _2, \"citadel\": _2, \"citi\": _2, \"citic\": _2, \"city\": _2, \"cityeats\": _2, \"claims\": _2, \"cleaning\": _2, \"click\": _2, \"clinic\": _2, \"clinique\": _2, \"clothing\": _2, \"cloud\": { \"$\": 1, \"succ\": { \"banzai\": _5, \"elementor\": _3, \"encoway\": { \"$\": 0, \"succ\": { \"eu\": _3 } }, \"statics\": _5, \"ravendb\": _3, \"axarnet\": { \"$\": 0, \"succ\": { \"es-1\": _3 } }, \"diadem\": _3, \"jelastic\": { \"$\": 0, \"succ\": { \"vip\": _3 } }, \"jele\": _3, \"jenv-aruba\": { \"$\": 0, \"succ\": { \"aruba\": { \"$\": 0, \"succ\": { \"eur\": { \"$\": 0, \"succ\": { \"it1\": _3 } } } }, \"it1\": _3 } }, \"keliweb\": { \"$\": 2, \"succ\": { \"cs\": _3 } }, \"oxa\": { \"$\": 2, \"succ\": { \"tn\": _3, \"uk\": _3 } }, \"primetel\": { \"$\": 2, \"succ\": { \"uk\": _3 } }, \"reclaim\": { \"$\": 0, \"succ\": { \"ca\": _3, \"uk\": _3, \"us\": _3 } }, \"trendhosting\": { \"$\": 0, \"succ\": { \"ch\": _3, \"de\": _3 } }, \"jotelulu\": _3, \"kuleuven\": _3, \"linkyard\": _3, \"magentosite\": _5, \"perspecta\": _3, \"vapor\": _3, \"on-rancher\": _5, \"scw\": { \"$\": 0, \"succ\": { \"baremetal\": { \"$\": 0, \"succ\": { \"fr-par-1\": _3, \"fr-par-2\": _3, \"nl-ams-1\": _3 } }, \"fr-par\": { \"$\": 0, \"succ\": { \"fnc\": { \"$\": 2, \"succ\": { \"functions\": _3 } }, \"k8s\": _11, \"s3\": _3, \"s3-website\": _3, \"whm\": _3 } }, \"instances\": { \"$\": 0, \"succ\": { \"priv\": _3, \"pub\": _3 } }, \"k8s\": _3, \"nl-ams\": { \"$\": 0, \"succ\": { \"k8s\": _11, \"s3\": _3, \"s3-website\": _3, \"whm\": _3 } }, \"pl-waw\": { \"$\": 0, \"succ\": { \"k8s\": _11, \"s3\": _3, \"s3-website\": _3 } }, \"scalebook\": _3, \"smartlabeling\": _3 } }, \"sensiosite\": _5, \"trafficplex\": _3, \"urown\": _3, \"voorloper\": _3 } }, \"club\": { \"$\": 1, \"succ\": { \"cloudns\": _3, \"jele\": _3, \"barsy\": _3 } }, \"clubmed\": _2, \"coach\": _2, \"codes\": { \"$\": 1, \"succ\": { \"owo\": _5 } }, \"coffee\": _2, \"college\": _2, \"cologne\": _2, \"comcast\": _2, \"commbank\": _2, \"community\": { \"$\": 1, \"succ\": { \"nog\": _3, \"ravendb\": _3, \"myforum\": _3 } }, \"company\": _2, \"compare\": _2, \"computer\": _2, \"comsec\": _2, \"condos\": _2, \"construction\": _2, \"consulting\": _2, \"contact\": _2, \"contractors\": _2, \"cooking\": _2, \"cookingchannel\": _2, \"cool\": { \"$\": 1, \"succ\": { \"elementor\": _3, \"de\": _3 } }, \"corsica\": _2, \"country\": _2, \"coupon\": _2, \"coupons\": _2, \"courses\": _2, \"cpa\": _2, \"credit\": _2, \"creditcard\": _2, \"creditunion\": _2, \"cricket\": _2, \"crown\": _2, \"crs\": _2, \"cruise\": _2, \"cruises\": _2, \"cuisinella\": _2, \"cymru\": _2, \"cyou\": _2, \"dabur\": _2, \"dad\": _2, \"dance\": _2, \"data\": _2, \"date\": _2, \"dating\": _2, \"datsun\": _2, \"day\": _2, \"dclk\": _2, \"dds\": _2, \"deal\": _2, \"dealer\": _2, \"deals\": _2, \"degree\": _2, \"delivery\": _2, \"dell\": _2, \"deloitte\": _2, \"delta\": _2, \"democrat\": _2, \"dental\": _2, \"dentist\": _2, \"desi\": _2, \"design\": { \"$\": 1, \"succ\": { \"bss\": _3 } }, \"dev\": { \"$\": 1, \"succ\": { \"autocode\": _3, \"lcl\": _5, \"lclstage\": _5, \"stg\": _5, \"stgstage\": _5, \"pages\": _3, \"r2\": _3, \"workers\": _3, \"curv\": _3, \"deno\": _3, \"deno-staging\": _3, \"deta\": _3, \"fly\": _3, \"githubpreview\": _3, \"gateway\": _5, \"iserv\": _3, \"localcert\": { \"$\": 0, \"succ\": { \"user\": _5 } }, \"loginline\": _3, \"mediatech\": _3, \"ngrok\": _3, \"ngrok-free\": _3, \"platter-app\": _3, \"shiftcrypto\": _3, \"vercel\": _3, \"webhare\": _5 } }, \"dhl\": _2, \"diamonds\": _2, \"diet\": _2, \"digital\": { \"$\": 1, \"succ\": { \"cloudapps\": { \"$\": 2, \"succ\": { \"london\": _3 } } } }, \"direct\": _2, \"directory\": _2, \"discount\": _2, \"discover\": _2, \"dish\": _2, \"diy\": _2, \"dnp\": _2, \"docs\": _2, \"doctor\": _2, \"dog\": _2, \"domains\": _2, \"dot\": _2, \"download\": _2, \"drive\": _2, \"dtv\": _2, \"dubai\": _2, \"dunlop\": _2, \"dupont\": _2, \"durban\": _2, \"dvag\": _2, \"dvr\": _2, \"earth\": { \"$\": 1, \"succ\": { \"dapps\": { \"$\": 0, \"succ\": { \"*\": _3, \"bzz\": _5 } } } }, \"eat\": _2, \"eco\": _2, \"edeka\": _2, \"education\": _10, \"email\": _2, \"emerck\": _2, \"energy\": _2, \"engineer\": _2, \"engineering\": _2, \"enterprises\": _2, \"epson\": _2, \"equipment\": _2, \"ericsson\": _2, \"erni\": _2, \"esq\": _2, \"estate\": { \"$\": 1, \"succ\": { \"compute\": _5 } }, \"etisalat\": _2, \"eurovision\": _2, \"eus\": { \"$\": 1, \"succ\": { \"party\": _28 } }, \"events\": { \"$\": 1, \"succ\": { \"koobin\": _3, \"co\": _3 } }, \"exchange\": _2, \"expert\": _2, \"exposed\": _2, \"express\": _2, \"extraspace\": _2, \"fage\": _2, \"fail\": _2, \"fairwinds\": _2, \"faith\": _29, \"family\": _2, \"fan\": _2, \"fans\": _2, \"farm\": { \"$\": 1, \"succ\": { \"storj\": _3 } }, \"farmers\": _2, \"fashion\": _2, \"fast\": _2, \"fedex\": _2, \"feedback\": _2, \"ferrari\": _2, \"ferrero\": _2, \"fiat\": _2, \"fidelity\": _2, \"fido\": _2, \"film\": _2, \"final\": _2, \"finance\": _2, \"financial\": _10, \"fire\": _2, \"firestone\": _2, \"firmdale\": _2, \"fish\": _2, \"fishing\": _2, \"fit\": _2, \"fitness\": _2, \"flickr\": _2, \"flights\": _2, \"flir\": _2, \"florist\": _2, \"flowers\": _2, \"fly\": _2, \"foo\": _2, \"food\": _2, \"foodnetwork\": _2, \"football\": _2, \"ford\": _2, \"forex\": _2, \"forsale\": _2, \"forum\": _2, \"foundation\": _2, \"fox\": _2, \"free\": _2, \"fresenius\": _2, \"frl\": _2, \"frogans\": _2, \"frontdoor\": _2, \"frontier\": _2, \"ftr\": _2, \"fujitsu\": _2, \"fun\": _2, \"fund\": _2, \"furniture\": _2, \"futbol\": _2, \"fyi\": _2, \"gal\": _2, \"gallery\": _2, \"gallo\": _2, \"gallup\": _2, \"game\": _2, \"games\": _2, \"gap\": _2, \"garden\": _2, \"gay\": _2, \"gbiz\": _2, \"gdn\": { \"$\": 1, \"succ\": { \"cnpy\": _3 } }, \"gea\": _2, \"gent\": _2, \"genting\": _2, \"george\": _2, \"ggee\": _2, \"gift\": _2, \"gifts\": _2, \"gives\": _2, \"giving\": _2, \"glass\": _2, \"gle\": _2, \"global\": _2, \"globo\": _2, \"gmail\": _2, \"gmbh\": _2, \"gmo\": _2, \"gmx\": _2, \"godaddy\": _2, \"gold\": _2, \"goldpoint\": _2, \"golf\": _2, \"goo\": _2, \"goodyear\": _2, \"goog\": { \"$\": 1, \"succ\": { \"cloud\": _3, \"translate\": _3, \"usercontent\": _5 } }, \"google\": _2, \"gop\": _2, \"got\": _2, \"grainger\": _2, \"graphics\": _2, \"gratis\": _2, \"green\": _2, \"gripe\": _2, \"grocery\": _2, \"group\": { \"$\": 1, \"succ\": { \"discourse\": _3 } }, \"guardian\": _2, \"gucci\": _2, \"guge\": _2, \"guide\": _2, \"guitars\": _2, \"guru\": _2, \"hair\": _2, \"hamburg\": _2, \"hangout\": _2, \"haus\": _2, \"hbo\": _2, \"hdfc\": _2, \"hdfcbank\": _2, \"health\": { \"$\": 1, \"succ\": { \"hra\": _3 } }, \"healthcare\": _2, \"help\": _2, \"helsinki\": _2, \"here\": _2, \"hermes\": _2, \"hgtv\": _2, \"hiphop\": _2, \"hisamitsu\": _2, \"hitachi\": _2, \"hiv\": _2, \"hkt\": _2, \"hockey\": _2, \"holdings\": _2, \"holiday\": _2, \"homedepot\": _2, \"homegoods\": _2, \"homes\": _2, \"homesense\": _2, \"honda\": _2, \"horse\": _2, \"hospital\": _2, \"host\": { \"$\": 1, \"succ\": { \"cloudaccess\": _3, \"freesite\": _3, \"easypanel\": _3, \"fastvps\": _3, \"myfast\": _3, \"tempurl\": _3, \"wpmudev\": _3, \"jele\": _3, \"mircloud\": _3, \"pcloud\": _3, \"half\": _3 } }, \"hosting\": { \"$\": 1, \"succ\": { \"opencraft\": _3 } }, \"hot\": _2, \"hoteles\": _2, \"hotels\": _2, \"hotmail\": _2, \"house\": _2, \"how\": _2, \"hsbc\": _2, \"hughes\": _2, \"hyatt\": _2, \"hyundai\": _2, \"ibm\": _2, \"icbc\": _2, \"ice\": _2, \"icu\": _2, \"ieee\": _2, \"ifm\": _2, \"ikano\": _2, \"imamat\": _2, \"imdb\": _2, \"immo\": _2, \"immobilien\": _2, \"inc\": _2, \"industries\": _2, \"infiniti\": _2, \"ing\": _2, \"ink\": _2, \"institute\": _2, \"insurance\": _2, \"insure\": _2, \"international\": _2, \"intuit\": _2, \"investments\": _2, \"ipiranga\": _2, \"irish\": _2, \"ismaili\": _2, \"ist\": _2, \"istanbul\": _2, \"itau\": _2, \"itv\": _2, \"jaguar\": _2, \"java\": _2, \"jcb\": _2, \"jeep\": _2, \"jetzt\": _2, \"jewelry\": _2, \"jio\": _2, \"jll\": _2, \"jmp\": _2, \"jnj\": _2, \"joburg\": _2, \"jot\": _2, \"joy\": _2, \"jpmorgan\": _2, \"jprs\": _2, \"juegos\": _2, \"juniper\": _2, \"kaufen\": _2, \"kddi\": _2, \"kerryhotels\": _2, \"kerrylogistics\": _2, \"kerryproperties\": _2, \"kfh\": _2, \"kia\": _2, \"kids\": _2, \"kim\": _2, \"kinder\": _2, \"kindle\": _2, \"kitchen\": _2, \"kiwi\": _2, \"koeln\": _2, \"komatsu\": _2, \"kosher\": _2, \"kpmg\": _2, \"kpn\": _2, \"krd\": { \"$\": 1, \"succ\": { \"co\": _3, \"edu\": _3 } }, \"kred\": _2, \"kuokgroup\": _2, \"kyoto\": _2, \"lacaixa\": _2, \"lamborghini\": _2, \"lamer\": _2, \"lancaster\": _2, \"lancia\": _2, \"land\": { \"$\": 1, \"succ\": { \"static\": { \"$\": 2, \"succ\": { \"dev\": _3, \"sites\": _3 } } } }, \"landrover\": _2, \"lanxess\": _2, \"lasalle\": _2, \"lat\": _2, \"latino\": _2, \"latrobe\": _2, \"law\": _2, \"lawyer\": _2, \"lds\": _2, \"lease\": _2, \"leclerc\": _2, \"lefrak\": _2, \"legal\": _2, \"lego\": _2, \"lexus\": _2, \"lgbt\": _2, \"lidl\": _2, \"life\": _2, \"lifeinsurance\": _2, \"lifestyle\": _2, \"lighting\": _2, \"like\": _2, \"lilly\": _2, \"limited\": _2, \"limo\": _2, \"lincoln\": _2, \"link\": { \"$\": 1, \"succ\": { \"cyon\": _3, \"mypep\": _3, \"dweb\": _5 } }, \"lipsy\": _2, \"live\": { \"$\": 1, \"succ\": { \"hlx\": _3 } }, \"living\": _2, \"llc\": _2, \"llp\": _2, \"loan\": _2, \"loans\": _2, \"locker\": _2, \"locus\": _2, \"lol\": { \"$\": 1, \"succ\": { \"omg\": _3 } }, \"london\": _2, \"lotte\": _2, \"lotto\": _2, \"love\": _2, \"lpl\": _2, \"lplfinancial\": _2, \"ltd\": _2, \"ltda\": _2, \"lundbeck\": _2, \"luxe\": _2, \"luxury\": _2, \"madrid\": _2, \"maif\": _2, \"maison\": _2, \"makeup\": _2, \"man\": _2, \"management\": { \"$\": 1, \"succ\": { \"router\": _3 } }, \"mango\": _2, \"map\": _2, \"market\": _2, \"marketing\": _2, \"markets\": _2, \"marriott\": _2, \"marshalls\": _2, \"maserati\": _2, \"mattel\": _2, \"mba\": _2, \"mckinsey\": _2, \"med\": _2, \"media\": _35, \"meet\": _2, \"melbourne\": _2, \"meme\": _2, \"memorial\": _2, \"men\": _2, \"menu\": _36, \"merckmsd\": _2, \"miami\": _2, \"microsoft\": _2, \"mini\": _2, \"mint\": _2, \"mit\": _2, \"mitsubishi\": _2, \"mlb\": _2, \"mls\": _2, \"mma\": _2, \"mobile\": _2, \"moda\": _2, \"moe\": _2, \"moi\": _2, \"mom\": _2, \"monash\": _2, \"money\": _2, \"monster\": _2, \"mormon\": _2, \"mortgage\": _2, \"moscow\": _2, \"moto\": _2, \"motorcycles\": _2, \"mov\": _2, \"movie\": _2, \"msd\": _2, \"mtn\": _2, \"mtr\": _2, \"music\": _2, \"mutual\": _2, \"nab\": _2, \"nagoya\": _2, \"natura\": _2, \"navy\": _2, \"nba\": _2, \"nec\": _2, \"netbank\": _2, \"netflix\": _2, \"network\": { \"$\": 1, \"succ\": { \"alces\": _5, \"co\": _3, \"arvo\": _3, \"azimuth\": _3, \"tlon\": _3 } }, \"neustar\": _2, \"new\": _2, \"news\": { \"$\": 1, \"succ\": { \"noticeable\": _3 } }, \"next\": _2, \"nextdirect\": _2, \"nexus\": _2, \"nfl\": _2, \"ngo\": _2, \"nhk\": _2, \"nico\": _2, \"nike\": _2, \"nikon\": _2, \"ninja\": _2, \"nissan\": _2, \"nissay\": _2, \"nokia\": _2, \"northwesternmutual\": _2, \"norton\": _2, \"now\": _2, \"nowruz\": _2, \"nowtv\": _2, \"nra\": _2, \"nrw\": _2, \"ntt\": _2, \"nyc\": _2, \"obi\": _2, \"observer\": _2, \"office\": _2, \"okinawa\": _2, \"olayan\": _2, \"olayangroup\": _2, \"oldnavy\": _2, \"ollo\": _2, \"omega\": _2, \"one\": { \"$\": 1, \"succ\": { \"onred\": { \"$\": 2, \"succ\": { \"staging\": _3 } }, \"service\": _3, \"homelink\": _3 } }, \"ong\": _2, \"onl\": _2, \"online\": { \"$\": 1, \"succ\": { \"eero\": _3, \"eero-stage\": _3, \"barsy\": _3 } }, \"ooo\": _2, \"open\": _2, \"oracle\": _2, \"orange\": { \"$\": 1, \"succ\": { \"tech\": _3 } }, \"organic\": _2, \"origins\": _2, \"osaka\": _2, \"otsuka\": _2, \"ott\": _2, \"ovh\": { \"$\": 1, \"succ\": { \"nerdpol\": _3 } }, \"page\": { \"$\": 1, \"succ\": { \"hlx\": _3, \"hlx3\": _3, \"translated\": _3, \"codeberg\": _3, \"pdns\": _3, \"plesk\": _3, \"prvcy\": _3, \"rocky\": _3, \"magnet\": _3 } }, \"panasonic\": _2, \"paris\": _2, \"pars\": _2, \"partners\": _2, \"parts\": _2, \"party\": _29, \"passagens\": _2, \"pay\": _2, \"pccw\": _2, \"pet\": _2, \"pfizer\": _2, \"pharmacy\": _2, \"phd\": _2, \"philips\": _2, \"phone\": _2, \"photo\": _2, \"photography\": _2, \"photos\": _35, \"physio\": _2, \"pics\": _2, \"pictet\": _2, \"pictures\": { \"$\": 1, \"succ\": { \"1337\": _3 } }, \"pid\": _2, \"pin\": _2, \"ping\": _2, \"pink\": _2, \"pioneer\": _2, \"pizza\": { \"$\": 1, \"succ\": { \"ngrok\": _3 } }, \"place\": _10, \"play\": _2, \"playstation\": _2, \"plumbing\": _2, \"plus\": _2, \"pnc\": _2, \"pohl\": _2, \"poker\": _2, \"politie\": _2, \"porn\": { \"$\": 1, \"succ\": { \"indie\": _3 } }, \"pramerica\": _2, \"praxi\": _2, \"press\": _2, \"prime\": _2, \"prod\": _2, \"productions\": _2, \"prof\": _2, \"progressive\": _2, \"promo\": _2, \"properties\": _2, \"property\": _2, \"protection\": _2, \"pru\": _2, \"prudential\": _2, \"pub\": _36, \"pwc\": _2, \"qpon\": _2, \"quebec\": _2, \"quest\": _2, \"racing\": _2, \"radio\": _2, \"read\": _2, \"realestate\": _2, \"realtor\": _2, \"realty\": _2, \"recipes\": _2, \"red\": _2, \"redstone\": _2, \"redumbrella\": _2, \"rehab\": _2, \"reise\": _2, \"reisen\": _2, \"reit\": _2, \"reliance\": _2, \"ren\": _2, \"rent\": _2, \"rentals\": _2, \"repair\": _2, \"report\": _2, \"republican\": _2, \"rest\": _2, \"restaurant\": _2, \"review\": _29, \"reviews\": _2, \"rexroth\": _2, \"rich\": _2, \"richardli\": _2, \"ricoh\": _2, \"ril\": _2, \"rio\": _2, \"rip\": { \"$\": 1, \"succ\": { \"clan\": _3 } }, \"rocher\": _2, \"rocks\": { \"$\": 1, \"succ\": { \"myddns\": _3, \"lima-city\": _3, \"webspace\": _3 } }, \"rodeo\": _2, \"rogers\": _2, \"room\": _2, \"rsvp\": _2, \"rugby\": _2, \"ruhr\": _2, \"run\": { \"$\": 1, \"succ\": { \"hs\": _3, \"development\": _3, \"ravendb\": _3, \"servers\": _3, \"build\": _5, \"code\": _5, \"database\": _5, \"migration\": _5, \"onporter\": _3, \"repl\": _3 } }, \"rwe\": _2, \"ryukyu\": _2, \"saarland\": _2, \"safe\": _2, \"safety\": _2, \"sakura\": _2, \"sale\": _2, \"salon\": _2, \"samsclub\": _2, \"samsung\": _2, \"sandvik\": _2, \"sandvikcoromant\": _2, \"sanofi\": _2, \"sap\": _2, \"sarl\": _2, \"sas\": _2, \"save\": _2, \"saxo\": _2, \"sbi\": _2, \"sbs\": _2, \"sca\": _2, \"scb\": _2, \"schaeffler\": _2, \"schmidt\": _2, \"scholarships\": _2, \"school\": _2, \"schule\": _2, \"schwarz\": _2, \"science\": _29, \"scot\": { \"$\": 1, \"succ\": { \"edu\": _3, \"gov\": { \"$\": 2, \"succ\": { \"service\": _3 } } } }, \"search\": _2, \"seat\": _2, \"secure\": _2, \"security\": _2, \"seek\": _2, \"select\": _2, \"sener\": _2, \"services\": { \"$\": 1, \"succ\": { \"loginline\": _3 } }, \"seven\": _2, \"sew\": _2, \"sex\": _2, \"sexy\": _2, \"sfr\": _2, \"shangrila\": _2, \"sharp\": _2, \"shaw\": _2, \"shell\": _2, \"shia\": _2, \"shiksha\": _2, \"shoes\": _2, \"shop\": { \"$\": 1, \"succ\": { \"base\": _3, \"hoplix\": _3, \"barsy\": _3 } }, \"shopping\": _2, \"shouji\": _2, \"show\": _2, \"showtime\": _2, \"silk\": _2, \"sina\": _2, \"singles\": _2, \"site\": { \"$\": 1, \"succ\": { \"cloudera\": _5, \"cyon\": _3, \"fnwk\": _3, \"folionetwork\": _3, \"fastvps\": _3, \"jele\": _3, \"lelux\": _3, \"loginline\": _3, \"barsy\": _3, \"mintere\": _3, \"omniwe\": _3, \"opensocial\": _3, \"platformsh\": _5, \"tst\": _5, \"byen\": _3, \"srht\": _3, \"novecore\": _3 } }, \"ski\": _2, \"skin\": _2, \"sky\": _2, \"skype\": _2, \"sling\": _2, \"smart\": _2, \"smile\": _2, \"sncf\": _2, \"soccer\": _2, \"social\": _2, \"softbank\": _2, \"software\": _2, \"sohu\": _2, \"solar\": _2, \"solutions\": { \"$\": 1, \"succ\": { \"diher\": _5 } }, \"song\": _2, \"sony\": _2, \"soy\": _2, \"spa\": _2, \"space\": { \"$\": 1, \"succ\": { \"myfast\": _3, \"uber\": _3, \"xs4all\": _3 } }, \"sport\": _2, \"spot\": _2, \"srl\": _2, \"stada\": _2, \"staples\": _2, \"star\": _2, \"statebank\": _2, \"statefarm\": _2, \"stc\": _2, \"stcgroup\": _2, \"stockholm\": _2, \"storage\": _2, \"store\": { \"$\": 1, \"succ\": { \"sellfy\": _3, \"shopware\": _3, \"storebase\": _3 } }, \"stream\": _2, \"studio\": _2, \"study\": _2, \"style\": _2, \"sucks\": _2, \"supplies\": _2, \"supply\": _2, \"support\": _36, \"surf\": _2, \"surgery\": _2, \"suzuki\": _2, \"swatch\": _2, \"swiss\": _2, \"sydney\": _2, \"systems\": { \"$\": 1, \"succ\": { \"knightpoint\": _3 } }, \"tab\": _2, \"taipei\": _2, \"talk\": _2, \"taobao\": _2, \"target\": _2, \"tatamotors\": _2, \"tatar\": _2, \"tattoo\": _2, \"tax\": _2, \"taxi\": _2, \"tci\": _2, \"tdk\": _2, \"team\": { \"$\": 1, \"succ\": { \"discourse\": _3, \"jelastic\": _3 } }, \"tech\": _2, \"technology\": _10, \"temasek\": _2, \"tennis\": _2, \"teva\": _2, \"thd\": _2, \"theater\": _2, \"theatre\": _2, \"tiaa\": _2, \"tickets\": _2, \"tienda\": _2, \"tiffany\": _2, \"tips\": _2, \"tires\": _2, \"tirol\": _2, \"tjmaxx\": _2, \"tjx\": _2, \"tkmaxx\": _2, \"tmall\": _2, \"today\": { \"$\": 1, \"succ\": { \"prequalifyme\": _3 } }, \"tokyo\": _2, \"tools\": _2, \"top\": { \"$\": 1, \"succ\": { \"now-dns\": _3, \"ntdll\": _3 } }, \"toray\": _2, \"toshiba\": _2, \"total\": _2, \"tours\": _2, \"town\": _2, \"toyota\": _2, \"toys\": _2, \"trade\": _29, \"trading\": _2, \"training\": _2, \"travel\": _2, \"travelchannel\": _2, \"travelers\": _2, \"travelersinsurance\": _2, \"trust\": _2, \"trv\": _2, \"tube\": _2, \"tui\": _2, \"tunes\": _2, \"tushu\": _2, \"tvs\": _2, \"ubank\": _2, \"ubs\": _2, \"unicom\": _2, \"university\": _2, \"uno\": _2, \"uol\": _2, \"ups\": _2, \"vacations\": _2, \"vana\": _2, \"vanguard\": _2, \"vegas\": _2, \"ventures\": _2, \"verisign\": _2, \"versicherung\": _2, \"vet\": _2, \"viajes\": _2, \"video\": _2, \"vig\": _2, \"viking\": _2, \"villas\": _2, \"vin\": _2, \"vip\": _2, \"virgin\": _2, \"visa\": _2, \"vision\": _2, \"viva\": _2, \"vivo\": _2, \"vlaanderen\": _2, \"vodka\": _2, \"volkswagen\": _2, \"volvo\": _2, \"vote\": _2, \"voting\": _2, \"voto\": _2, \"voyage\": _2, \"vuelos\": _2, \"wales\": _2, \"walmart\": _2, \"walter\": _2, \"wang\": _2, \"wanggou\": _2, \"watch\": _2, \"watches\": _2, \"weather\": _2, \"weatherchannel\": _2, \"webcam\": _2, \"weber\": _2, \"website\": _35, \"wedding\": _2, \"weibo\": _2, \"weir\": _2, \"whoswho\": _2, \"wien\": _2, \"wiki\": _35, \"williamhill\": _2, \"win\": _2, \"windows\": _2, \"wine\": _2, \"winners\": _2, \"wme\": _2, \"wolterskluwer\": _2, \"woodside\": _2, \"work\": _2, \"works\": _2, \"world\": _2, \"wow\": _2, \"wtc\": _2, \"wtf\": _2, \"xbox\": _2, \"xerox\": _2, \"xfinity\": _2, \"xihuan\": _2, \"xin\": _2, \"xn--11b4c3d\": _2, \"कॉम\": _2, \"xn--1ck2e1b\": _2, \"セール\": _2, \"xn--1qqw23a\": _2, \"佛山\": _2, \"xn--30rr7y\": _2, \"慈善\": _2, \"xn--3bst00m\": _2, \"集团\": _2, \"xn--3ds443g\": _2, \"在线\": _2, \"xn--3pxu8k\": _2, \"点看\": _2, \"xn--42c2d9a\": _2, \"คอม\": _2, \"xn--45q11c\": _2, \"八卦\": _2, \"xn--4gbrim\": _2, \"موقع\": _2, \"xn--55qw42g\": _2, \"公益\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--5su34j936bgsg\": _2, \"香格里拉\": _2, \"xn--5tzm5g\": _2, \"网站\": _2, \"xn--6frz82g\": _2, \"移动\": _2, \"xn--6qq986b3xl\": _2, \"我爱你\": _2, \"xn--80adxhks\": _2, \"москва\": _2, \"xn--80aqecdr1a\": _2, \"католик\": _2, \"xn--80asehdb\": _2, \"онлайн\": _2, \"xn--80aswg\": _2, \"сайт\": _2, \"xn--8y0a063a\": _2, \"联通\": _2, \"xn--9dbq2a\": _2, \"קום\": _2, \"xn--9et52u\": _2, \"时尚\": _2, \"xn--9krt00a\": _2, \"微博\": _2, \"xn--b4w605ferd\": _2, \"淡马锡\": _2, \"xn--bck1b9a5dre4c\": _2, \"ファッション\": _2, \"xn--c1avg\": _2, \"орг\": _2, \"xn--c2br7g\": _2, \"नेट\": _2, \"xn--cck2b3b\": _2, \"ストア\": _2, \"xn--cckwcxetd\": _2, \"アマゾン\": _2, \"xn--cg4bki\": _2, \"삼성\": _2, \"xn--czr694b\": _2, \"商标\": _2, \"xn--czrs0t\": _2, \"商店\": _2, \"xn--czru2d\": _2, \"商城\": _2, \"xn--d1acj3b\": _2, \"дети\": _2, \"xn--eckvdtc9d\": _2, \"ポイント\": _2, \"xn--efvy88h\": _2, \"新闻\": _2, \"xn--fct429k\": _2, \"家電\": _2, \"xn--fhbei\": _2, \"كوم\": _2, \"xn--fiq228c5hs\": _2, \"中文网\": _2, \"xn--fiq64b\": _2, \"中信\": _2, \"xn--fjq720a\": _2, \"娱乐\": _2, \"xn--flw351e\": _2, \"谷歌\": _2, \"xn--fzys8d69uvgm\": _2, \"電訊盈科\": _2, \"xn--g2xx48c\": _2, \"购物\": _2, \"xn--gckr3f0f\": _2, \"クラウド\": _2, \"xn--gk3at1e\": _2, \"通販\": _2, \"xn--hxt814e\": _2, \"网店\": _2, \"xn--i1b6b1a6a2e\": _2, \"संगठन\": _2, \"xn--imr513n\": _2, \"餐厅\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--j1aef\": _2, \"ком\": _2, \"xn--jlq480n2rg\": _2, \"亚马逊\": _2, \"xn--jvr189m\": _2, \"食品\": _2, \"xn--kcrx77d1x4a\": _2, \"飞利浦\": _2, \"xn--kput3i\": _2, \"手机\": _2, \"xn--mgba3a3ejt\": _2, \"ارامكو\": _2, \"xn--mgba7c0bbn0a\": _2, \"العليان\": _2, \"xn--mgbaakc7dvf\": _2, \"اتصالات\": _2, \"xn--mgbab2bd\": _2, \"بازار\": _2, \"xn--mgbca7dzdo\": _2, \"ابوظبي\": _2, \"xn--mgbi4ecexp\": _2, \"كاثوليك\": _2, \"xn--mgbt3dhd\": _2, \"همراه\": _2, \"xn--mk1bu44c\": _2, \"닷컴\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--ngbc5azd\": _2, \"شبكة\": _2, \"xn--ngbe9e0a\": _2, \"بيتك\": _2, \"xn--ngbrx\": _2, \"عرب\": _2, \"xn--nqv7f\": _2, \"机构\": _2, \"xn--nqv7fs00ema\": _2, \"组织机构\": _2, \"xn--nyqy26a\": _2, \"健康\": _2, \"xn--otu796d\": _2, \"招聘\": _2, \"xn--p1acf\": { \"$\": 1, \"succ\": { \"xn--90amc\": _3, \"xn--j1aef\": _3, \"xn--j1ael8b\": _3, \"xn--h1ahn\": _3, \"xn--j1adp\": _3, \"xn--c1avg\": _3, \"xn--80aaa0cvac\": _3, \"xn--h1aliz\": _3, \"xn--90a1af\": _3, \"xn--41a\": _3 } }, \"рус\": { \"$\": 1, \"succ\": { \"биз\": _3, \"ком\": _3, \"крым\": _3, \"мир\": _3, \"мск\": _3, \"орг\": _3, \"самара\": _3, \"сочи\": _3, \"спб\": _3, \"я\": _3 } }, \"xn--pssy2u\": _2, \"大拿\": _2, \"xn--q9jyb4c\": _2, \"みんな\": _2, \"xn--qcka1pmc\": _2, \"グーグル\": _2, \"xn--rhqv96g\": _2, \"世界\": _2, \"xn--rovu88b\": _2, \"書籍\": _2, \"xn--ses554g\": _2, \"网址\": _2, \"xn--t60b56a\": _2, \"닷넷\": _2, \"xn--tckwe\": _2, \"コム\": _2, \"xn--tiq49xqyj\": _2, \"天主教\": _2, \"xn--unup4y\": _2, \"游戏\": _2, \"xn--vermgensberater-ctb\": _2, \"vermögensberater\": _2, \"xn--vermgensberatung-pwb\": _2, \"vermögensberatung\": _2, \"xn--vhquv\": _2, \"企业\": _2, \"xn--vuq861b\": _2, \"信息\": _2, \"xn--w4r85el8fhu5dnra\": _2, \"嘉里大酒店\": _2, \"xn--w4rs40l\": _2, \"嘉里\": _2, \"xn--xhq521b\": _2, \"广东\": _2, \"xn--zfr164b\": _2, \"政务\": _2, \"xyz\": { \"$\": 1, \"succ\": { \"blogsite\": _3, \"localzone\": _3, \"crafting\": _3, \"zapto\": _3, \"telebit\": _5 } }, \"yachts\": _2, \"yahoo\": _2, \"yamaxun\": _2, \"yandex\": _2, \"yodobashi\": _2, \"yoga\": _2, \"yokohama\": _2, \"you\": _2, \"youtube\": _2, \"yun\": _2, \"zappos\": _2, \"zara\": _2, \"zero\": _2, \"zip\": _2, \"zone\": { \"$\": 1, \"succ\": { \"cloud66\": _3, \"hs\": _3, \"triton\": _5, \"lima\": _3 } }, \"zuerich\": _2 } };\n ;\n return rules;\n})();\n//# sourceMappingURL=trie.js.map","import { fastPathLookup, } from 'tldts-core';\nimport { exceptions, rules } from './data/trie';\n/**\n * Lookup parts of domain in Trie\n */\nfunction lookupInTrie(parts, trie, index, allowedMask) {\n let result = null;\n let node = trie;\n while (node !== undefined) {\n // We have a match!\n if ((node.$ & allowedMask) !== 0) {\n result = {\n index: index + 1,\n isIcann: node.$ === 1 /* RULE_TYPE.ICANN */,\n isPrivate: node.$ === 2 /* RULE_TYPE.PRIVATE */,\n };\n }\n // No more `parts` to look for\n if (index === -1) {\n break;\n }\n const succ = node.succ;\n node = succ && (succ[parts[index]] || succ['*']);\n index -= 1;\n }\n return result;\n}\n/**\n * Check if `hostname` has a valid public suffix in `trie`.\n */\nexport default function suffixLookup(hostname, options, out) {\n if (fastPathLookup(hostname, options, out) === true) {\n return;\n }\n const hostnameParts = hostname.split('.');\n const allowedMask = (options.allowPrivateDomains === true ? 2 /* RULE_TYPE.PRIVATE */ : 0) |\n (options.allowIcannDomains === true ? 1 /* RULE_TYPE.ICANN */ : 0);\n // Look for exceptions\n const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1, allowedMask);\n if (exceptionMatch !== null) {\n out.isIcann = exceptionMatch.isIcann;\n out.isPrivate = exceptionMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.');\n return;\n }\n // Look for a match in rules\n const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1, allowedMask);\n if (rulesMatch !== null) {\n out.isIcann = rulesMatch.isIcann;\n out.isPrivate = rulesMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.');\n return;\n }\n // No match found...\n // Prevailing rule is '*' so we consider the top-level domain to be the\n // public suffix of `hostname` (e.g.: 'example.org' => 'org').\n out.isIcann = false;\n out.isPrivate = false;\n out.publicSuffix = hostnameParts[hostnameParts.length - 1];\n}\n//# sourceMappingURL=suffix-trie.js.map","import { getEmptyResult, parseImpl, resetResult, } from 'tldts-core';\nimport suffixLookup from './src/suffix-trie';\n// For all methods but 'parse', it does not make sense to allocate an object\n// every single time to only return the value of a specific attribute. To avoid\n// this un-necessary allocation, we use a global object which is re-used.\nconst RESULT = getEmptyResult();\nexport function parse(url, options = {}) {\n return parseImpl(url, 5 /* FLAG.ALL */, suffixLookup, options, getEmptyResult());\n}\nexport function getHostname(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 0 /* FLAG.HOSTNAME */, suffixLookup, options, RESULT).hostname;\n}\nexport function getPublicSuffix(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 2 /* FLAG.PUBLIC_SUFFIX */, suffixLookup, options, RESULT)\n .publicSuffix;\n}\nexport function getDomain(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 3 /* FLAG.DOMAIN */, suffixLookup, options, RESULT).domain;\n}\nexport function getSubdomain(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 4 /* FLAG.SUB_DOMAIN */, suffixLookup, options, RESULT)\n .subdomain;\n}\nexport function getDomainWithoutSuffix(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 5 /* FLAG.ALL */, suffixLookup, options, RESULT)\n .domainWithoutSuffix;\n}\n//# sourceMappingURL=index.js.map","export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n","import { RequestType as RequestType$1, StringRuleList, NetworkRule, RuleConverter, RuleStorage, setConfiguration, CompatibilityTypes, Engine, Request, CosmeticResult, NetworkRuleOption, replaceAll, indexOfAny, CosmeticRule } from '@adguard/tsurlfilter';\nexport { CosmeticRule, CosmeticRuleType, NetworkRule, NetworkRuleOption } from '@adguard/tsurlfilter';\nimport browser from 'webextension-polyfill';\nimport { z } from 'zod';\nimport { parse, getDomain as getDomain$1 } from 'tldts';\nimport Bowser from 'bowser';\nimport { nanoid } from 'nanoid';\nimport { redirects } from '@adguard/scriptlets';\nimport { LRUMap } from 'lru_map';\n\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\n/**\n * Top level app context storage.\n *\n * This context is needed to share data between other modules without cyclic dependencies.\n */\nclass AppContext {\n constructor() {\n /**\n * Is app started.\n */\n this.isAppStarted = false;\n }\n}\nconst appContext = new AppContext();\n\nvar RequestType = {\n Document: 1,\n SubDocument: 2,\n Script: 4,\n Stylesheet: 8,\n Object: 16,\n Image: 32,\n XmlHttpRequest: 64,\n Media: 128,\n Font: 256,\n WebSocket: 512,\n Ping: 1024,\n Other: 2048,\n};\n\n/**\n * Stealth mode configuration schema.\n */\nconst stealthConfigValidator = z.object({\n /**\n * Should the application set a fixed lifetime from\n * {@link StealthConfig.selfDestructFirstPartyCookiesTime} for first-party\n * cookies.\n */\n selfDestructFirstPartyCookies: z.boolean(),\n /**\n * Time in minutes to delete first-party cookies.\n */\n selfDestructFirstPartyCookiesTime: z.number(),\n /**\n * Should the application set a fixed lifetime from\n * {@link StealthConfig.selfDestructThirdPartyCookiesTime} for third-party\n * cookies.\n */\n selfDestructThirdPartyCookies: z.boolean(),\n /**\n * Time in minutes to delete third-party cookies.\n */\n selfDestructThirdPartyCookiesTime: z.number(),\n /**\n * Should the application hide the origin referrer in third-party requests\n * by replacing the referrer url with the request url.\n */\n hideReferrer: z.boolean(),\n /**\n * Should the application hide the original referrer from the search page\n * containing the search query in third-party queries, replacing\n * the referrer url with the request url.\n */\n hideSearchQueries: z.boolean(),\n /**\n * For Google Chrome, it removes the 'X-Client-Data' header from\n * the requests, which contains information about the browser version\n * and modifications.\n */\n blockChromeClientData: z.boolean(),\n /**\n * Includes HTTP headers 'DNT' and 'Sec-GPC' in all requests.\n *\n * @see https://en.wikipedia.org/wiki/Do_Not_Track\n * @see https://globalprivacycontrol.org\n */\n sendDoNotTrack: z.boolean(),\n /**\n * Blocks the possibility of leaking your IP address through WebRTC, even if\n * you use a proxy server or VPN.\n */\n blockWebRTC: z.boolean(),\n}).strict();\n/**\n * Settings configuration schema.\n */\nconst settingsConfigValidator = z.object({\n /**\n * If this flag is true, the application will work ONLY with domains\n * from the {@link Configuration.allowlist},\n * otherwise it will work everywhere EXCLUDING domains from the list.\n */\n allowlistInverted: z.boolean(),\n /**\n * Flag specifying {@link Configuration.allowlist} enable state.\n * We don't use allowlist array length condition for calculate enable state,\n * because it's not cover case with empty list in inverted mode.\n */\n allowlistEnabled: z.boolean(),\n /**\n * Enables css hits counter if true.\n */\n collectStats: z.boolean(),\n /**\n * Enables stealth mode if true.\n */\n stealthModeEnabled: z.boolean(),\n /**\n * Enables filtering if true.\n */\n filteringEnabled: z.boolean(),\n /**\n * Redirect url for $document rules.\n */\n documentBlockingPageUrl: z.string().optional(),\n /**\n * Path to the assembled @adguard/assistant module. Necessary for lazy\n * on-demand loading of the assistant.\n */\n assistantUrl: z.string(),\n /**\n * Stealth mode options.\n */\n stealth: stealthConfigValidator,\n});\n/**\n * Generic app configuration schema.\n */\nconst configurationValidator = z.object({\n /**\n * List of hostnames or domains of sites, which should be excluded\n * from blocking or which should be included in blocking\n * depending on the value of {@link SettingsConfig.allowlistInverted} setting value.\n */\n allowlist: z.string().array(),\n /**\n * List of domain names of sites, which should be temporary excluded from document blocking.\n */\n trustedDomains: z.string().array(),\n /**\n * List of rules added by user.\n */\n userrules: z.string().array(),\n /**\n * Flag responsible for logging.\n */\n verbose: z.boolean(),\n settings: settingsConfigValidator,\n}).strict();\n\n/**\n * @file\n * This file contains constants for communication between background and content scripts.\n * This constants are separated from message.ts to reduce bundle size,\n * because rollup cannot tree-shake tswebextension library code.\n */\n/**\n * Name of the message handler.\n * It is needed for determining specific tswebextension message from other messages.\n */\nconst MESSAGE_HANDLER_NAME = 'tsWebExtension';\n/**\n * Message types for communication between background and content scripts.\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"ProcessShouldCollapse\"] = \"processShouldCollapse\";\n MessageType[\"GetCosmeticData\"] = \"getCosmeticData\";\n MessageType[\"GetCss\"] = \"getCss\";\n MessageType[\"GetCookieRules\"] = \"getCookieRules\";\n MessageType[\"SaveCookieLogEvent\"] = \"saveCookieLogEvent\";\n MessageType[\"InitAssistant\"] = \"initAssistant\";\n MessageType[\"CloseAssistant\"] = \"closeAssistant\";\n MessageType[\"AssistantCreateRule\"] = \"assistantCreateRule\";\n MessageType[\"SaveCssHitsStats\"] = \"saveCssHitsStats\";\n})(MessageType || (MessageType = {}));\n\n/**\n * @file\n * This file contains validation schemas and inferred types for message data.\n */\n/**\n * Message DTO validation schema.\n */\nconst messageValidator = z.object({\n handlerName: z.literal(MESSAGE_HANDLER_NAME),\n type: z.nativeEnum(MessageType),\n payload: z.unknown(),\n}).strict();\n/**\n * {@link MessageType.ProcessShouldCollapse} Message payload validation schema.\n */\nconst processShouldCollapsePayloadValidator = z.object({\n elementUrl: z.string(),\n documentUrl: z.string(),\n requestType: z.nativeEnum(RequestType$1),\n}).strict();\n/**\n * {@link MessageType.GetCosmeticData} Message payload validation schema.\n */\nconst getExtendedCssPayloadValidator = z.object({\n documentUrl: z.string(),\n}).strict();\n/**\n * {@link MessageType.GetCss} Message payload validation schema.\n */\nconst getCssPayloadValidator = z.object({\n url: z.string(),\n}).strict();\n/**\n * {@link MessageType.GetCookieRules} Message payload validation schema.\n */\nconst getCookieRulesPayloadValidator = z.object({\n documentUrl: z.string(),\n}).strict();\n/**\n * {@link MessageType.SaveCookieLogEvent} Message payload validation schema.\n */\nconst getSaveCookieLogEventPayloadValidator = z.object({\n cookieName: z.string(),\n cookieDomain: z.string(),\n cookieValue: z.string(),\n ruleText: z.string(),\n filterId: z.number(),\n thirdParty: z.boolean(),\n}).strict();\n/**\n * {@link MessageType.InitAssistant} Message payload validation schema.\n */\nconst getAssistantCreateRulePayloadValidator = z.object({\n ruleText: z.string(),\n}).strict();\n\n/**\n * Simple pub-sub implementation.\n */\nclass EventChannel {\n constructor() {\n this.listeners = [];\n }\n /**\n * Dispatch event.\n *\n * @param data Event data.\n */\n dispatch(data) {\n this.listeners.forEach((listener) => listener(data));\n }\n /**\n * Subscribe to events channel.\n *\n * @param listener Callback to be called on event.\n */\n subscribe(listener) {\n this.listeners.push(listener);\n }\n /**\n * Unsubscribe from events channel.\n *\n * @param listener Callback to be removed from listeners.\n */\n unsubscribe(listener) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n}\n\n/**\n * Checks if url is http request.\n *\n * @param url Request url.\n * @returns True if url starts with http{s?}.\n */\nfunction isHttpRequest(url) {\n return !!url && url.indexOf('http') === 0;\n}\n/**\n * Checks if url is http or websocket.\n *\n * @param url Request url.\n * @returns True if url starts with http{s?} or ws.\n */\nfunction isHttpOrWsRequest(url) {\n return !!url && (url.indexOf('http') === 0 || url.indexOf('ws') === 0);\n}\n/**\n * Extract host from url.\n *\n * @param url Url.\n * @returns Host of the url or null.\n */\nfunction getHost(url) {\n let firstIdx = url.indexOf('//');\n if (firstIdx === -1) {\n /**\n * It's non-hierarchical structured URL (stun: or turn:).\n *\n * @see {@link https://tools.ietf.org/html/rfc4395#section-2.2}\n * @see {@link https://tools.ietf.org/html/draft-nandakumar-rtcweb-stun-uri-08#appendix-B}\n */\n firstIdx = url.indexOf(':');\n if (firstIdx === -1) {\n return null;\n }\n firstIdx -= 1;\n }\n const nextSlashIdx = url.indexOf('/', firstIdx + 2);\n const startParamsIdx = url.indexOf('?', firstIdx + 2);\n let lastIdx = nextSlashIdx;\n if (startParamsIdx > 0 && (startParamsIdx < nextSlashIdx || nextSlashIdx < 0)) {\n lastIdx = startParamsIdx;\n }\n let host = lastIdx === -1 ? url.substring(firstIdx + 2) : url.substring(firstIdx + 2, lastIdx);\n const portIndex = host.indexOf(':');\n host = portIndex === -1 ? host : host.substring(0, portIndex);\n const lastChar = host.charAt(host.length - 1);\n if (lastChar === '.') {\n host = host.slice(0, -1);\n }\n return host;\n}\n/**\n * Extracts domain name from url.\n *\n * @param url Url.\n * @returns Domain name or null.\n */\nfunction getDomain(url) {\n const host = getHost(url);\n if (!host) {\n return null;\n }\n return host.startsWith('www.') ? host.substring(4) : host;\n}\n/**\n * If referrer of request contains full url of extension, then this request is considered as extension's own request.\n * Example: request for filter downloading.\n * Related issue: @see {@link https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1437}.\n *\n * @param url Request url.\n * @returns True if request is extension's own.\n */\nfunction isExtensionUrl(url) {\n return url.indexOf(browser.runtime.getURL('')) === 0;\n}\n/**\n * Checks third party relation.\n *\n * @param requestUrl Request url.\n * @param referrer Referrer url.\n * @returns True if request is third-party.\n */\nfunction isThirdPartyRequest(requestUrl, referrer) {\n const tldResult = parse(requestUrl);\n const sourceTldResult = parse(referrer);\n return tldResult.domain !== sourceTldResult.domain;\n}\n\n/**\n * Export logger implementation.\n */\nclass Logger {\n /**\n * Logger constructor.\n *\n * @param loggerImpl Logger implementation to set, defaults to global console.\n */\n constructor(loggerImpl = console) {\n this.verbose = false;\n this.loggerImpl = loggerImpl;\n this.setVerbose = this.setVerbose.bind(this);\n this.error = this.error.bind(this);\n this.warn = this.warn.bind(this);\n this.debug = this.debug.bind(this);\n this.info = this.info.bind(this);\n }\n /**\n * Sets verbose mode.\n *\n * @param value Boolean flag.\n */\n setVerbose(value) {\n this.verbose = value;\n }\n /**\n * Calls error method on logger implementation.\n *\n * @param message Log message.\n */\n error(message) {\n this.loggerImpl.error(message);\n }\n /**\n * Calls warn method on logger implementation.\n *\n * @param message Log message.\n */\n warn(message) {\n if (this.verbose) {\n this.loggerImpl.warn(message);\n }\n }\n /**\n * Calls debug method on logger implementation.\n *\n * @param message Log message.\n */\n debug(message) {\n if (this.verbose) {\n this.loggerImpl.debug(message);\n }\n }\n /**\n * Calls info method on logger implementation.\n *\n * @param message Log message.\n */\n info(message) {\n if (this.verbose) {\n this.loggerImpl.info(message);\n }\n }\n}\nconst logger = new Logger();\n\n/**\n * Types of filtering events that can occur during request processing.\n */\nvar FilteringEventType;\n(function (FilteringEventType) {\n FilteringEventType[\"SendRequest\"] = \"sendRequest\";\n FilteringEventType[\"TabReload\"] = \"tabReload\";\n FilteringEventType[\"ApplyBasicRule\"] = \"applyBasicRule\";\n FilteringEventType[\"ApplyCosmeticRule\"] = \"applyCosmeticRule\";\n FilteringEventType[\"ApplyCspRule\"] = \"applyCspRule\";\n FilteringEventType[\"ReceiveResponse\"] = \"receiveResponse\";\n FilteringEventType[\"Cookie\"] = \"cookie\";\n FilteringEventType[\"RemoveHeader\"] = \"removeHeader\";\n FilteringEventType[\"RemoveParam\"] = \"removeParam\";\n FilteringEventType[\"ReplaceRuleApply\"] = \"replaceRuleApply\";\n FilteringEventType[\"ContentFilteringStart\"] = \"contentFilteringStart\";\n FilteringEventType[\"ContentFilteringFinish\"] = \"contentFilteringFinish\";\n FilteringEventType[\"StealthAction\"] = \"stealthAction\";\n FilteringEventType[\"JsInject\"] = \"jsInject\";\n})(FilteringEventType || (FilteringEventType = {}));\n/**\n * {@link FilteringLogInterface} Default implementation.\n */\nclass FilteringLog {\n constructor() {\n this.onLogEvent = new EventChannel();\n this.channels = [];\n }\n /**\n * Registers listener for specified {@link FilteringLogEvent}.\n *\n * @param type Filtering log type.\n * @param listener Filtering log listener.\n */\n addEventListener(type, listener) {\n const channel = { type, listener };\n this.channels.push(channel);\n }\n /**\n * Publishes event to attached listeners.\n *\n * @param event Filtering log event.\n */\n publishEvent(event) {\n const listeners = this.channels\n .filter(({ type }) => type === event.type)\n .map(({ listener }) => listener);\n for (const listener of listeners) {\n listener(event);\n }\n this.onLogEvent.dispatch(event);\n }\n}\n/**\n * Shared {@link FilteringLog} instance.\n */\nconst defaultFilteringLog = new FilteringLog();\n\n// Disable jest coverage for this file, because it will insert\n// line comments, and code to count lines covered by tests, for example:\n// /* istanbul ignore next */\n// cov_uqm40oh03().f[0]++;\n// cov_uqm40oh03().s[2]++;\n// And we cannot test these strings correctly, because the names of these\n// functions with counters are generated at runtime\n/* istanbul ignore file */\n/**\n * This module applies stealth actions in page context.\n */\nclass StealthHelper {\n /**\n * Sends a Global Privacy Control DOM signal.\n */\n static setDomSignal() {\n try {\n if ('globalPrivacyControl' in Navigator.prototype) {\n return;\n }\n Object.defineProperty(Navigator.prototype, 'globalPrivacyControl', {\n get: () => true,\n configurable: true,\n enumerable: true,\n });\n }\n catch (ex) {\n // Ignore\n }\n }\n}\n\n// TODO check if we can return typed message here\n/**\n * Sends message to the background page.\n *\n * @param message Message to send.\n * @param message.payload Payload of the message.\n * @param message.type Message type.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst sendAppMessage = (message) => __awaiter(void 0, void 0, void 0, function* () {\n return browser.runtime.sendMessage(Object.assign({ handlerName: MESSAGE_HANDLER_NAME }, message));\n});\n\n/**\n * Request content type.\n *\n * NOTE: Do not use `const enum`,\n * because this enum is imported in extension frontend writing in js.\n */\nvar ContentType;\n(function (ContentType) {\n ContentType[\"Document\"] = \"document\";\n ContentType[\"Subdocument\"] = \"subdocument\";\n ContentType[\"Script\"] = \"script\";\n ContentType[\"Stylesheet\"] = \"stylesheet\";\n ContentType[\"Object\"] = \"object\";\n ContentType[\"Image\"] = \"image\";\n ContentType[\"XmlHttpRequest\"] = \"xmlHttpRequest\";\n ContentType[\"Media\"] = \"media\";\n ContentType[\"Font\"] = \"font\";\n ContentType[\"Websocket\"] = \"websocket\";\n ContentType[\"WebRtc\"] = \"webRtc\";\n ContentType[\"Other\"] = \"other\";\n ContentType[\"Csp\"] = \"csp\";\n ContentType[\"Cookie\"] = \"cookie\";\n ContentType[\"Ping\"] = \"ping\";\n ContentType[\"CspReport\"] = \"cspReport\";\n})(ContentType || (ContentType = {}));\n/**\n * Returns request type and content type by resource type.\n *\n * @param resourceType Resource type.\n * @returns Request type and content type.\n */\nfunction getRequestType(resourceType) {\n switch (resourceType) {\n case 'main_frame':\n return {\n contentType: ContentType.Document,\n requestType: RequestType.Document,\n };\n case 'sub_frame':\n return {\n contentType: ContentType.Subdocument,\n requestType: RequestType.SubDocument,\n };\n case 'stylesheet':\n return {\n contentType: ContentType.Stylesheet,\n requestType: RequestType.Stylesheet,\n };\n case 'script':\n return {\n contentType: ContentType.Script,\n requestType: RequestType.Script,\n };\n case 'image':\n case 'imageset':\n return {\n contentType: ContentType.Image,\n requestType: RequestType.Image,\n };\n case 'object':\n return {\n contentType: ContentType.Object,\n requestType: RequestType.Object,\n };\n case 'xmlhttprequest':\n return {\n contentType: ContentType.XmlHttpRequest,\n requestType: RequestType.XmlHttpRequest,\n };\n case 'ping':\n case 'beacon':\n return {\n contentType: ContentType.Ping,\n requestType: RequestType.Ping,\n };\n case 'font':\n return {\n contentType: ContentType.Font,\n requestType: RequestType.Font,\n };\n case 'media':\n return {\n contentType: ContentType.Media,\n requestType: RequestType.Media,\n };\n case 'websocket':\n return {\n contentType: ContentType.Websocket,\n requestType: RequestType.WebSocket,\n };\n case 'csp_report':\n return {\n contentType: ContentType.CspReport,\n requestType: RequestType.Other,\n };\n default:\n return {\n contentType: ContentType.Other,\n requestType: RequestType.Other,\n };\n }\n}\n\n/**\n * Checks if error has message.\n *\n * @param error Error object.\n * @returns If param is error.\n */\nfunction isErrorWithMessage(error) {\n return (typeof error === 'object'\n && error !== null\n && 'message' in error\n && typeof error.message === 'string');\n}\n/**\n * Converts error to the error with message.\n *\n * @param maybeError Possible error.\n * @returns Error with message.\n */\nfunction toErrorWithMessage(maybeError) {\n if (isErrorWithMessage(maybeError)) {\n return maybeError;\n }\n try {\n return new Error(JSON.stringify(maybeError));\n }\n catch (_a) {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n/**\n * Converts error object to error with message. This method might be helpful to handle thrown errors.\n *\n * @param error Error object.\n *\n * @returns Message of the error.\n */\nfunction getErrorMessage(error) {\n return toErrorWithMessage(error).message;\n}\n\n/**\n * Allowlist service.\n */\nclass AllowlistApi {\n constructor() {\n this.domains = [];\n this.inverted = false;\n this.enabled = false;\n }\n /**\n * Configures allowlist state based on app configuration.\n *\n * @param configuration App configuration.\n */\n configure(configuration) {\n const { allowlist, settings, } = configuration;\n const { allowlistEnabled, allowlistInverted, } = settings;\n this.enabled = allowlistEnabled;\n this.inverted = allowlistInverted;\n const domains = [];\n allowlist.forEach((hostname) => {\n domains.push(hostname.startsWith('www.') ? hostname.substring(4) : hostname);\n });\n this.domains = domains;\n }\n /**\n * Returns a list of rules to be loaded into the engine based on allowlist state.\n *\n * @returns List of allowlist rules or null.\n */\n getAllowlistRules() {\n if (this.enabled && !this.inverted) {\n return new StringRuleList(AllowlistApi.allowlistFilterId, this.domains.map((domain) => {\n return AllowlistApi.createAllowlistRuleString(domain);\n }).join('\\n'));\n }\n return null;\n }\n /**\n * Match frame rule based on allowlist state.\n *\n * @param frameUrl Frame url.\n * @returns Matched rule or null.\n */\n matchFrame(frameUrl) {\n /**\n * If inverted allowlist enabled, use specific matching strategy.\n */\n if (this.enabled && this.inverted) {\n return this.matchFrameInverted(frameUrl);\n }\n /**\n * If allowlist mode is default, request rule from engine.\n * If allowlist is enabled, rules have already loaded.\n */\n return engineApi.matchFrame(frameUrl);\n }\n /**\n * Creates allowlist rule for domains that are not in the inverted list.\n * In other cases returns engine matched rule.\n *\n * @param frameUrl Frame url.\n * @returns Matched rule or null.\n */\n matchFrameInverted(frameUrl) {\n const domain = getDomain(frameUrl);\n if (!domain) {\n return null;\n }\n if (!this.domains.includes(domain)) {\n return AllowlistApi.createAllowlistRule(domain);\n }\n return engineApi.matchFrame(frameUrl);\n }\n /**\n * Creates allowlist rule for domain.\n *\n * @param domain Domain name.\n * @returns Allowlist rule or null.\n */\n static createAllowlistRule(domain) {\n if (!domain) {\n return null;\n }\n const ruleString = AllowlistApi.createAllowlistRuleString(domain);\n return new NetworkRule(ruleString, AllowlistApi.allowlistFilterId);\n }\n /**\n * Creates rule string based on specified domain.\n *\n * @param domain Allowlisted domain.\n * @returns Allowlist rule string.\n */\n static createAllowlistRuleString(domain) {\n return String.raw `@@///(www\\.)?${domain}/$document,important`;\n }\n}\nAllowlistApi.allowlistFilterId = 100;\nconst allowlistApi = new AllowlistApi();\n\n/**\n * Finds header object by header name (case-insensitive).\n *\n * @param headers Headers collection.\n * @param headerName Header name.\n * @returns Found header, or null if not found.\n */\nfunction findHeaderByName(headers, headerName) {\n for (let i = 0; i < headers.length; i += 1) {\n const header = headers[i];\n if (header.name.toLowerCase() === headerName.toLowerCase()) {\n return header;\n }\n }\n return null;\n}\n/**\n * TODO: Make function pure (don't modify headers, return new object instead)\n * Removes header from headers by name.\n *\n * @param headers Headers collection.\n * @param headerName Header name.\n * @returns True if headers were removed.\n */\nfunction removeHeader(headers, headerName) {\n let removed = false;\n for (let i = headers.length - 1; i >= 0; i -= 1) {\n const header = headers[i];\n if (header.name.toLowerCase() === headerName.toLowerCase()) {\n headers.splice(i, 1);\n removed = true;\n }\n }\n return removed;\n}\n\n/**\n * Stealth action bitwise masks used on the background page and on the filtering log page.\n */\nvar StealthActions;\n(function (StealthActions) {\n StealthActions[StealthActions[\"None\"] = 0] = \"None\";\n StealthActions[StealthActions[\"HideReferrer\"] = 1] = \"HideReferrer\";\n StealthActions[StealthActions[\"HideSearchQueries\"] = 2] = \"HideSearchQueries\";\n StealthActions[StealthActions[\"BlockChromeClientData\"] = 4] = \"BlockChromeClientData\";\n StealthActions[StealthActions[\"SendDoNotTrack\"] = 8] = \"SendDoNotTrack\";\n // TODO check where this enums are used, and add comments\n StealthActions[StealthActions[\"FirstPartyCookies\"] = 16] = \"FirstPartyCookies\";\n StealthActions[StealthActions[\"ThirdPartyCookies\"] = 32] = \"ThirdPartyCookies\";\n})(StealthActions || (StealthActions = {}));\n/**\n * Stealth service module.\n */\nclass StealthService {\n /**\n * Constructor.\n *\n * @param appContext App context.\n * @param filteringLog Filtering log.\n */\n constructor(appContext, filteringLog) {\n this.appContext = appContext;\n this.filteringLog = filteringLog;\n }\n /**\n * Configuration.\n *\n * @returns App Stealth configuration or undefined.\n */\n get config() {\n var _a;\n return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth;\n }\n /**\n * Returns synthetic set of rules matching the specified request.\n *\n * @returns Strings of cookie rules.\n */\n getCookieRulesTexts() {\n var _a, _b;\n const result = [];\n if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.selfDestructFirstPartyCookies) {\n result.push(StealthService.generateCookieRuleText(this.config.selfDestructFirstPartyCookiesTime));\n }\n if ((_b = this.config) === null || _b === void 0 ? void 0 : _b.selfDestructThirdPartyCookies) {\n result.push(StealthService.generateCookieRuleText(this.config.selfDestructThirdPartyCookiesTime, true));\n }\n return result;\n }\n /**\n * Applies stealth actions to request headers.\n *\n * @param context Request context.\n * @returns Stealth actions bitmask.\n */\n processRequestHeaders(context) {\n var _a, _b, _c, _d;\n let stealthActions = StealthActions.None;\n const { requestUrl, requestType, requestHeaders } = context;\n if (!requestHeaders) {\n return stealthActions;\n }\n // Remove referrer for third-party requests\n if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.hideReferrer) {\n const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER);\n if (refHeader\n && refHeader.value\n && isThirdPartyRequest(requestUrl, refHeader.value)) {\n refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl);\n stealthActions |= StealthActions.HideReferrer;\n }\n }\n // Hide referrer in case of search engine is referrer\n const isMainFrame = requestType === RequestType.Document;\n if (((_b = this.config) === null || _b === void 0 ? void 0 : _b.hideSearchQueries) && isMainFrame) {\n const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER);\n if (refHeader\n && refHeader.value\n && StealthService.isSearchEngine(refHeader.value)\n && isThirdPartyRequest(requestUrl, refHeader.value)) {\n refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl);\n stealthActions |= StealthActions.HideSearchQueries;\n }\n }\n // Remove X-Client-Data header\n if ((_c = this.config) === null || _c === void 0 ? void 0 : _c.blockChromeClientData) {\n if (removeHeader(requestHeaders, StealthService.HEADERS.X_CLIENT_DATA)) {\n stealthActions |= StealthActions.BlockChromeClientData;\n }\n }\n // Adding Do-Not-Track (DNT) header\n if ((_d = this.config) === null || _d === void 0 ? void 0 : _d.sendDoNotTrack) {\n requestHeaders.push(StealthService.HEADER_VALUES.DO_NOT_TRACK);\n requestHeaders.push(StealthService.HEADER_VALUES.GLOBAL_PRIVACY_CONTROL);\n stealthActions |= StealthActions.SendDoNotTrack;\n }\n if (stealthActions > 0) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.StealthAction,\n data: {\n tabId: context.tabId,\n eventId: context.requestId,\n stealthActions,\n },\n });\n }\n return stealthActions;\n }\n /**\n * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string.\n *\n * @returns Dom signal script.\n */\n getSetDomSignalScript() {\n var _a;\n if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.sendDoNotTrack) {\n return `;(function ${StealthHelper.setDomSignal.toString()})();`;\n }\n return '';\n }\n /**\n * Generates rule removing cookies.\n *\n * @param maxAgeMinutes Cookie maxAge in minutes.\n * @param isThirdParty Flag for generating third-party rule texts.\n * @returns Rule text.\n */\n static generateCookieRuleText(maxAgeMinutes, isThirdParty = false) {\n const maxAgeOption = maxAgeMinutes > 0 ? `;maxAge=${maxAgeMinutes * 60}` : '';\n const thirdPartyOption = isThirdParty ? ',third-party' : '';\n const ruleText = `$cookie=/.+/${maxAgeOption}${thirdPartyOption}`;\n return ruleText;\n }\n /**\n * Crops url path.\n *\n * @param url URL.\n * @returns URL without path.\n */\n static createMockRefHeaderUrl(url) {\n const host = getHost(url);\n return `${(url.indexOf('https') === 0 ? 'https://' : 'http://') + host}/`;\n }\n /**\n * Is url search engine.\n *\n * @param url Url for check.\n * @returns True if url is search engine.\n */\n static isSearchEngine(url) {\n return StealthService.SEARCH_ENGINES.some((searchEngineRegex) => searchEngineRegex.test(url));\n }\n}\n/**\n * Headers.\n */\nStealthService.HEADERS = {\n REFERRER: 'Referer',\n X_CLIENT_DATA: 'X-Client-Data',\n DO_NOT_TRACK: 'DNT',\n};\n/**\n * Header values.\n */\nStealthService.HEADER_VALUES = {\n DO_NOT_TRACK: {\n name: 'DNT',\n value: '1',\n },\n GLOBAL_PRIVACY_CONTROL: {\n name: 'Sec-GPC',\n value: '1',\n },\n};\n/**\n * Search engines regexps.\n */\nStealthService.SEARCH_ENGINES = [\n /https?:\\/\\/(www\\.)?google\\./i,\n /https?:\\/\\/(www\\.)?yandex\\./i,\n /https?:\\/\\/(www\\.)?bing\\./i,\n /https?:\\/\\/(www\\.)?yahoo\\./i,\n /https?:\\/\\/(www\\.)?go\\.mail\\.ru/i,\n /https?:\\/\\/(www\\.)?ask\\.com/i,\n /https?:\\/\\/(www\\.)?aol\\.com/i,\n /https?:\\/\\/(www\\.)?baidu\\.com/i,\n /https?:\\/\\/(www\\.)?seznam\\.cz/i,\n];\n\n/**\n * Stealth api implementation.\n */\nclass StealthApi {\n /**\n * Stealth API constructor.\n *\n * @param appContextInstance App context.\n * @param filteringLog Filtering log.\n */\n constructor(appContextInstance, filteringLog) {\n this.appContext = appContextInstance;\n this.filteringLog = filteringLog;\n this.engine = new StealthService(this.appContext, this.filteringLog);\n }\n /**\n * Stealth configuration.\n *\n * @returns App Stealth configuration or undefined.\n */\n get configuration() {\n var _a;\n return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth;\n }\n /**\n * Gets app stealth mode status.\n *\n * @returns True if stealth mode is enabled, otherwise returns false.\n */\n get isStealthModeEnabled() {\n var _a;\n return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealthModeEnabled);\n }\n /**\n * Gets app filtering status.\n *\n * @returns True if filtering is enabled, otherwise returns false.\n */\n get isFilteringEnabled() {\n var _a;\n return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled);\n }\n /**\n * Requires privacy permissions and updates browser privacy.network\n * settings depending on blocking WebRTC or not.\n */\n updateWebRtcPrivacyPermissions() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!StealthApi.canBlockWebRTC()) {\n return;\n }\n try {\n const isPermissionsGranted = yield browser.permissions.contains(StealthApi.PRIVACY_PERMISSIONS);\n if (isPermissionsGranted) {\n yield this.handleBlockWebRTC();\n }\n }\n catch (e) {\n logger.error(getErrorMessage(e));\n }\n });\n }\n /**\n * Returns rule list with stealth mode rules.\n *\n * @returns String rule list or null.\n */\n getStealthModeRuleList() {\n if (!this.engine || !this.isStealthModeEnabled) {\n return null;\n }\n const rulesTexts = this.engine.getCookieRulesTexts().join('\\n');\n return new StringRuleList(StealthApi.STEALTH_MODE_FILTER_ID, rulesTexts, false, false);\n }\n /**\n * Stealth api onBeforeRequest handler.\n *\n * @param context Request context.\n *\n * @returns True if the headers have been changed.\n */\n onBeforeSendHeaders(context) {\n if (!context) {\n return false;\n }\n if (!this.canApplyStealthActionsToContext(context)) {\n return false;\n }\n const stealthActions = this.engine.processRequestHeaders(context);\n return stealthActions !== StealthActions.None;\n }\n /**\n * Checks if stealth actions can be applied to request context.\n *\n * @param context Request context.\n * @returns True if stealth actions can be applied to request context.\n */\n canApplyStealthActionsToContext(context) {\n if (!this.isStealthModeEnabled || !this.isFilteringEnabled) {\n return false;\n }\n const { matchingResult } = context;\n if (matchingResult) {\n if (matchingResult.documentRule || matchingResult.stealthRule) {\n return false;\n }\n }\n return true;\n }\n /**\n * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string.\n *\n * @returns Dom signal script.\n */\n getSetDomSignalScript() {\n return this.engine.getSetDomSignalScript();\n }\n /**\n * Updates browser privacy.network settings depending on blocking WebRTC or not.\n */\n handleBlockWebRTC() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.configuration) {\n return;\n }\n const webRTCDisabled = this.configuration.blockWebRTC\n && this.isStealthModeEnabled\n && this.isFilteringEnabled;\n try {\n if (webRTCDisabled) {\n yield browser.privacy.network.webRTCIPHandlingPolicy.set({\n value: 'disable_non_proxied_udp',\n scope: 'regular',\n });\n }\n else {\n yield browser.privacy.network.webRTCIPHandlingPolicy.clear({\n scope: 'regular',\n });\n }\n }\n catch (e) {\n logger.error(`Error updating privacy.network settings: ${getErrorMessage(e)}`);\n }\n // privacy.network.peerConnectionEnabled is currently only supported in Firefox\n if (typeof browser.privacy.network.peerConnectionEnabled === 'object') {\n try {\n if (webRTCDisabled) {\n yield browser.privacy.network.peerConnectionEnabled.set({\n value: false,\n scope: 'regular',\n });\n }\n else {\n yield browser.privacy.network.peerConnectionEnabled.clear({\n scope: 'regular',\n });\n }\n }\n catch (e) {\n logger.error(`Error updating privacy.network settings: ${getErrorMessage(e)}`);\n }\n }\n });\n }\n /**\n * // TODO consider deprecating this method as edge browser is built on chromium now.\n * Checks if there is browser.privacy permission is granted.\n *\n * @returns True if there is browser.privacy permission.\n */\n static canBlockWebRTC() {\n // Edge doesn't support privacy api\n // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy\n return !!browser.privacy;\n }\n}\n/**\n * Privacy permission for block webrtc stealth setting.\n */\nStealthApi.PRIVACY_PERMISSIONS = {\n permissions: ['privacy'],\n};\nconst stealthApi = new StealthApi(appContext, defaultFilteringLog);\n\nconst browserDetector = Bowser.getParser(window.navigator.userAgent);\nconst browserDetails = browserDetector.getBrowser();\nconst engineDetails = browserDetector.getEngine();\nconst isFirefox = browserDetails.name === 'Firefox';\nconst isChrome = browserDetails.name === 'Chrome';\nconst isChromium = engineDetails.name === 'Blink';\n\n/**\n * Simple finite state machine with synchronous transitions.\n */\nclass FSM {\n /**\n * Creates a new FSM instance.\n *\n * @param transitions Declarative description of the FSM transitions.\n * @param state Initial state of the FSM.\n */\n constructor(transitions, state) {\n this.transitions = transitions;\n this.state = state;\n }\n /**\n * Dispatches an event to the FSM.\n *\n * If the event is valid for the current state, the FSM will transition to the next state.\n *\n * @param event Event to dispatch.\n */\n dispatch(event) {\n // TODO: improve Transitions generic type to avoid this type assertion\n const nextState = this.transitions[this.state][event];\n if (nextState) {\n this.state = nextState;\n }\n else {\n logger.error(`Invalid state transition: ${String(this.state)} -> ${String(event)}`);\n }\n }\n}\n\n/**\n * Declarative description of the {@link InjectionFsm} transitions.\n */\nconst injectionsTransitions = {\n [\"idle\" /* InjectionState.Idle */]: {\n [\"start\" /* InjectionEvent.Start */]: \"loading\" /* InjectionState.Loading */,\n },\n [\"loading\" /* InjectionState.Loading */]: {\n [\"success\" /* InjectionEvent.Success */]: \"completed\" /* InjectionState.Completed */,\n [\"failure\" /* InjectionEvent.Failure */]: \"idle\" /* InjectionState.Idle */,\n },\n [\"completed\" /* InjectionState.Completed */]: {},\n};\n/**\n * Factory for creating a new {@link InjectionFsm}.\n *\n * @param initialState Initial state of the FSM.\n * @returns New FSM instance.\n */\nfunction createInjectionFsm(initialState = \"idle\" /* InjectionState.Idle */) {\n return new FSM(injectionsTransitions, initialState);\n}\n\n/**\n * Document level frame id.\n */\nconst MAIN_FRAME_ID = 0;\n/**\n * Frame context data.\n */\nclass Frame {\n /**\n * Creates frame instance.\n *\n * @param url Frame url.\n * @param requestId Request id.\n */\n constructor(url, requestId) {\n /**\n * FSM for managing the injection of the JS rules.\n */\n this.jsInjectionFsm = createInjectionFsm();\n /**\n * FSM for managing the injection of the Css rules.\n */\n this.cssInjectionFsm = createInjectionFsm();\n this.url = url;\n this.requestId = requestId;\n }\n}\n\n/**\n * Tab context.\n */\nclass TabContext {\n /**\n * Context constructor.\n *\n * @param info Tab info.\n */\n constructor(info) {\n /**\n * Frames context.\n */\n this.frames = new Map();\n /**\n * Blocked request count.\n */\n this.blockedRequestCount = 0;\n /**\n * Document level rule, applied to the tab.\n */\n this.mainFrameRule = null;\n /**\n * We mark these tabs as synthetic because they may not actually exist.\n */\n this.isSyntheticTab = true;\n this.info = info;\n }\n /**\n * Updates tab info.\n *\n * @param changeInfo Tab change info.\n */\n updateTabInfo(changeInfo) {\n this.info = Object.assign(this.info, changeInfo);\n // If the tab was updated it means that it wasn't used to send requests in the background\n this.isSyntheticTab = false;\n }\n /**\n * Increments blocked requests count.\n */\n incrementBlockedRequestCount() {\n this.blockedRequestCount += 1;\n }\n /**\n * Handles document or subdocument request and stores data in specified frame context.\n * If the request is a document request, will also match the main frame rule\n * and store it in the {@link mainFrameRule} property.\n * This method is called before filtering processing in WebRequest onBeforeRequest handler.\n * MatchingResult is handled in {@link handleFrameMatchingResult}.\n * CosmeticResult is handled in {@link handleFrameCosmeticResult}.\n *\n * @param requestContext Request context data.\n */\n handleFrameRequest(requestContext) {\n const { frameId, requestId, requestUrl, requestType, } = requestContext;\n if (requestType === RequestType.Document) {\n this.handleMainFrameRequest(requestContext);\n }\n else {\n this.frames.set(frameId, new Frame(requestUrl, requestId));\n }\n }\n /**\n * Handles request {@link MatchingResult} from WebRequest onBeforeRequest handler\n * and stores it in specified frame context.\n *\n * @param frameId Frame id.\n * @param matchingResult Matching result.\n */\n handleFrameMatchingResult(frameId, matchingResult) {\n const frame = this.frames.get(frameId);\n if (frame) {\n frame.matchingResult = matchingResult;\n }\n }\n /**\n * Handles frame {@link CosmeticResult} from WebRequest onBeforeRequest handler\n * and stores it in specified frame context.\n *\n * @param frameId Frame id.\n * @param cosmeticResult Cosmetic result.\n */\n handleFrameCosmeticResult(frameId, cosmeticResult) {\n const frame = this.frames.get(frameId);\n if (frame) {\n frame.cosmeticResult = cosmeticResult;\n }\n }\n /**\n * Handles document request and stores data in main frame context.\n * Also matches document level rule and store it {@link mainFrameRule}.\n * This method is called before filtering processing in WebRequest onBeforeRequest handler.\n *\n * MatchingResult handles in {@link handleFrameMatchingResult}.\n * CosmeticResult handles in {@link handleFrameCosmeticResult}.\n *\n * @param requestContext Request context data.\n */\n handleMainFrameRequest(requestContext) {\n const { requestUrl, requestId, } = requestContext;\n // clear frames data on tab reload\n this.frames.clear();\n // set new main frame data\n this.frames.set(MAIN_FRAME_ID, new Frame(requestUrl, requestId));\n // calculate new main frame rule\n this.mainFrameRule = allowlistApi.matchFrame(requestUrl);\n // reset tab blocked count\n this.blockedRequestCount = 0;\n }\n /**\n * Creates context for new tab.\n *\n * @param tab Tab info.\n * @returns Tab context for new tab.\n */\n static createNewTabContext(tab) {\n const tabContext = new TabContext(tab);\n /**\n * In some cases, tab is created while browser navigation processing.\n * For example: when you navigate outside the browser or create new empty tab.\n * `pendingUrl` represent url navigated to.\n * We check it first.\n * If server returns redirect, new main frame url will be processed in WebRequestApi.\n */\n const url = tab.pendingUrl || tab.url;\n if (url) {\n tabContext.mainFrameRule = allowlistApi.matchFrame(url);\n tabContext.frames.set(MAIN_FRAME_ID, new Frame(url));\n }\n return tabContext;\n }\n /**\n * Checks if passed {@link Tabs.Tab} details represent a browser tab.\n *\n * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab#type\n * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/TAB_ID_NONE\n *\n * @param tab Tab details.\n * @returns True if the tab is a browser tab, otherwise returns false.\n */\n static isBrowserTab(tab) {\n return typeof tab.id === 'number' && tab.id !== browser.tabs.TAB_ID_NONE;\n }\n}\n\n/**\n * Tabs API. Wrapper around browser.tabs API.\n */\nclass TabsApi {\n /**\n * Tabs API constructor.\n */\n constructor() {\n this.context = new Map();\n this.onCreate = new EventChannel();\n this.onUpdate = new EventChannel();\n this.onDelete = new EventChannel();\n this.onActivate = new EventChannel();\n this.handleTabCreate = this.handleTabCreate.bind(this);\n this.handleTabUpdate = this.handleTabUpdate.bind(this);\n this.handleTabActivate = this.handleTabActivate.bind(this);\n this.handleTabDelete = this.handleTabDelete.bind(this);\n this.handleFrameRequest = this.handleFrameRequest.bind(this);\n this.handleFrameCosmeticResult = this.handleFrameCosmeticResult.bind(this);\n this.handleFrameMatchingResult = this.handleFrameMatchingResult.bind(this);\n this.getTabContext = this.getTabContext.bind(this);\n this.getTabFrameRule = this.getTabFrameRule.bind(this);\n this.getTabFrame = this.getTabFrame.bind(this);\n this.getTabMainFrame = this.getTabMainFrame.bind(this);\n this.onWindowFocusChanged = this.onWindowFocusChanged.bind(this);\n }\n /**\n * Initializes tabs API and starts listening for tab & window events.\n */\n start() {\n return __awaiter(this, void 0, void 0, function* () {\n browser.tabs.onCreated.addListener(this.handleTabCreate);\n browser.tabs.onRemoved.addListener(this.handleTabDelete);\n browser.tabs.onUpdated.addListener(this.handleTabUpdate);\n browser.tabs.onActivated.addListener(this.handleTabActivate);\n browser.windows.onFocusChanged.addListener(this.onWindowFocusChanged);\n });\n }\n /**\n * Stops listening for tab & window events and clears tabs context.\n */\n stop() {\n browser.tabs.onCreated.removeListener(this.handleTabCreate);\n browser.tabs.onRemoved.removeListener(this.handleTabDelete);\n browser.tabs.onUpdated.removeListener(this.handleTabUpdate);\n browser.tabs.onActivated.removeListener(this.handleTabActivate);\n browser.windows.onFocusChanged.removeListener(this.onWindowFocusChanged);\n this.context.clear();\n }\n /**\n * Retrieves frame rule for the tab context.\n *\n * @param tabId Tab ID.\n * @returns Frame rule or null if not found.\n */\n getTabFrameRule(tabId) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return null;\n }\n return tabContext.mainFrameRule;\n }\n /**\n * Sets frame data for the frame in the tab context.\n *\n * @param tabId Tab ID.\n * @param frameId Frame ID.\n * @param frameData Frame data.\n */\n setTabFrame(tabId, frameId, frameData) {\n const tabContext = this.context.get(tabId);\n if (tabContext) {\n tabContext.frames.set(frameId, frameData);\n this.onUpdate.dispatch(tabContext);\n }\n }\n /**\n * Retrieves frame data for the frame in the tab context.\n *\n * @param tabId Tab ID.\n * @param frameId Frame ID.\n * @returns Frame data or null if not found.\n */\n getTabFrame(tabId, frameId) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return null;\n }\n const frame = tabContext.frames.get(frameId);\n if (!frame) {\n return null;\n }\n return frame;\n }\n /**\n * Retrieves main frame data for the tab context.\n *\n * @param tabId Tab ID.\n * @returns Frame data or null if not found.\n */\n getTabMainFrame(tabId) {\n return this.getTabFrame(tabId, TabsApi.MAIN_FRAME_ID);\n }\n /**\n * Records request context to the tab context.\n *\n * @param requestContext Tab's frame's request context.\n */\n handleFrameRequest(requestContext) {\n const { tabId } = requestContext;\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return;\n }\n tabContext.handleFrameRequest(requestContext);\n }\n /**\n * Records frame cosmetic result to the tab context.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @param cosmeticResult Frame {@link CosmeticResult}.\n */\n handleFrameCosmeticResult(tabId, frameId, cosmeticResult) {\n const tabContext = this.context.get(tabId);\n if (!tabContext || !cosmeticResult) {\n return;\n }\n tabContext.handleFrameCosmeticResult(frameId, cosmeticResult);\n }\n /**\n * Records frame matching result to the tab context.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @param matchingResult Frame {@link MatchingResult}.\n */\n handleFrameMatchingResult(tabId, frameId, matchingResult) {\n const tabContext = this.context.get(tabId);\n if (!tabContext || !matchingResult) {\n return;\n }\n tabContext.handleFrameMatchingResult(frameId, matchingResult);\n }\n /**\n * Retrieves tab context by tab ID.\n *\n * @param tabId Tab ID.\n * @returns Tab context or undefined if not found.\n */\n getTabContext(tabId) {\n return this.context.get(tabId);\n }\n /**\n * Checks whether the tab with the specified ID is open in incognito mode\n * or not.\n *\n * @param tabId Tab ID.\n * @returns True if the tab is open in incognito mode, and false\n * if otherwise.\n */\n isIncognitoTab(tabId) {\n const tabContext = this.getTabContext(tabId);\n if (!tabContext) {\n return false;\n }\n return tabContext.info.incognito;\n }\n /**\n * Increments tab context blocked request count.\n *\n * @param tabId Tab ID.\n */\n incrementTabBlockedRequestCount(tabId) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return;\n }\n tabContext.incrementBlockedRequestCount();\n }\n /**\n * Updates tab's main frame rule.\n *\n * @param tabId Tab ID.\n */\n updateTabMainFrameRule(tabId) {\n const tabContext = this.context.get(tabId);\n if (!(tabContext === null || tabContext === void 0 ? void 0 : tabContext.info.url)) {\n return;\n }\n tabContext.mainFrameRule = allowlistApi.matchFrame(tabContext.info.url);\n }\n /**\n * Updates tab context data on extension initialization.\n */\n updateCurrentTabsMainFrameRules() {\n return __awaiter(this, void 0, void 0, function* () {\n const currentTabs = yield browser.tabs.query({});\n if (!Array.isArray(currentTabs)) {\n return;\n }\n for (const tab of currentTabs) {\n if (tab.id) {\n this.updateTabMainFrameRule(tab.id);\n }\n }\n });\n }\n /**\n * Checks if tab is a new tab.\n *\n * @param tabId Tab ID.\n * @returns True if tab is a new tab.\n */\n isNewPopupTab(tabId) {\n var _a;\n const tab = this.context.get(tabId);\n if (!tab) {\n return false;\n }\n const url = (_a = tab.info) === null || _a === void 0 ? void 0 : _a.url;\n return url === undefined\n || url === ''\n || url === 'about:blank';\n }\n /**\n * Creates a new tab context.\n *\n * @param tab Tab info.\n * @param tab.id Tab id.\n *\n * @returns Created tab context, or null if tab is not browser tab.\n */\n handleTabCreate(tab) {\n if (!TabContext.isBrowserTab(tab)) {\n return null;\n }\n const tabContext = TabContext.createNewTabContext(tab);\n this.context.set(tab.id, tabContext);\n this.onCreate.dispatch(tabContext);\n return tabContext;\n }\n /**\n * Removes tab context by tab ID.\n *\n * @param tabId Tab ID.\n */\n handleTabDelete(tabId) {\n const tabContext = this.context.get(tabId);\n if (tabContext) {\n this.context.delete(tabId);\n this.onDelete.dispatch(tabContext);\n }\n }\n /**\n * Updates tab context data on tab update.\n *\n * @param tabId Tab ID.\n * @param changeInfo Tab change info.\n */\n handleTabUpdate(tabId, changeInfo) {\n // TODO: we can ignore some events (favicon url update etc.)\n const tabContext = this.context.get(tabId);\n if (tabContext) {\n tabContext.updateTabInfo(changeInfo);\n this.onUpdate.dispatch(tabContext);\n }\n }\n /**\n * Dispatches tab on activated event.\n *\n * @param info Tab activated info.\n * @param info.tabId Tab ID.\n */\n handleTabActivate({ tabId }) {\n const tabContext = this.context.get(tabId);\n if (tabContext) {\n this.onActivate.dispatch(tabContext);\n }\n }\n /**\n * Called when focus state of window changed.\n *\n * @param windowId Window ID.\n */\n onWindowFocusChanged(windowId) {\n return __awaiter(this, void 0, void 0, function* () {\n // If all browser windows have lost focus.\n if (windowId === browser.windows.WINDOW_ID_NONE) {\n return;\n }\n const [activeTab] = yield browser.tabs.query({\n active: true,\n windowId,\n });\n if (!activeTab || !activeTab.id) {\n return;\n }\n const tabContext = this.context.get(activeTab.id);\n if (tabContext) {\n this.onActivate.dispatch(tabContext);\n }\n });\n }\n /**\n * Injects script to the frame by tab id and frame id.\n *\n * @param code Script to be injected.\n * @param tabId Tab ID.\n * @param frameId Frame ID.\n */\n static injectScript(code, tabId, frameId) {\n return __awaiter(this, void 0, void 0, function* () {\n const injectDetails = {\n code,\n frameId,\n runAt: 'document_start',\n matchAboutBlank: true,\n };\n yield browser.tabs.executeScript(tabId, injectDetails);\n });\n }\n /**\n * Injects css styles to the frame by tab id and frame id.\n *\n * @param code CSS styles to be injected.\n * @param tabId Tab ID.\n * @param frameId Frame ID.\n */\n static injectCss(code, tabId, frameId) {\n return __awaiter(this, void 0, void 0, function* () {\n const injectDetails = {\n code,\n frameId,\n runAt: 'document_start',\n matchAboutBlank: true,\n cssOrigin: 'user',\n };\n yield browser.tabs.insertCSS(tabId, injectDetails);\n });\n }\n}\nTabsApi.MAIN_FRAME_ID = 0;\nconst tabsApi = new TabsApi();\n\n/**\n * This service encapsulate processing of $document modifier rules.\n *\n * Service is initialized in {@link configure} method, called from {@link EngineApi#startEngine}.\n *\n * Request rule is processed in {@link getDocumentBlockingResponse} method, called\n * from {@link RequestBlockingApi.getBlockingResponse}.\n *\n * Request rule is processed following scenario:\n * - if domain is trusted, ignore request\n * - if rule is document blocking and {@link documentBlockingPageUrl} is undefined, return\n * {@link WebRequestApi.onBeforeRequest} blocking response\n * - if rule is document blocking and {@link documentBlockingPageUrl} is defined, return redirect response with\n * required params.\n * - if browser is Firefox, update page url by {@link browser.tabs} API, because FF doesn't support redirects to\n * extension pages.\n */\nclass DocumentBlockingService {\n constructor() {\n // list of domain names of sites, which should be excluded from document blocking\n this.trustedDomains = [];\n }\n /**\n * Configures service instance {@link documentBlockingPageUrl}.\n *\n * @param configuration App {@link Configuration}.\n */\n configure(configuration) {\n const { settings, trustedDomains } = configuration;\n this.documentBlockingPageUrl = settings === null || settings === void 0 ? void 0 : settings.documentBlockingPageUrl;\n this.trustedDomains = trustedDomains;\n }\n /**\n * Processes $document modifier rule matched request in {@link RequestBlockingApi.getBlockingResponse}.\n *\n * @param requestId Request id.\n * @param requestUrl Url of processed request.\n * @param rule {@link NetworkRule} Instance of matched rule.\n * @param tabId TabId of processed request.\n * @returns Blocking response or null {@link WebRequestApi.onBeforeRequest}.\n */\n getDocumentBlockingResponse(requestId, requestUrl, rule, tabId) {\n // if request url domain is trusted, ignore document blocking rule\n if (this.isTrustedDomain(requestUrl)) {\n return undefined;\n }\n // public filtering log event\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ApplyBasicRule,\n data: {\n eventId: requestId,\n tabId,\n rule,\n },\n });\n // if documentBlockingPage is undefined, block request\n if (!this.documentBlockingPageUrl) {\n return { cancel: true };\n }\n // get document blocking url with required params\n const blockingUrl = DocumentBlockingService.createBlockingUrl(this.documentBlockingPageUrl, requestUrl, rule.getText());\n // Firefox doesn't allow redirects to extension pages\n // We set blocking page url via browser.tabs api for bypassing this limitation\n if (isFirefox) {\n DocumentBlockingService.reloadTabWithBlockingPage(tabId, blockingUrl);\n // Chrome doesn't allow to show extension pages in incognito mode\n }\n else if (isChromium && tabsApi.isIncognitoTab(tabId)) {\n // Closing tab before opening a new one may lead to browser crash (Chromium)\n browser.tabs.create({ url: blockingUrl })\n .then(() => {\n browser.tabs.remove(tabId);\n })\n .catch((e) => {\n logger.warn(`Can't open info page about blocked domain. Err: ${e}`);\n });\n }\n return { redirectUrl: blockingUrl };\n }\n /**\n * Checks if request url domain is trusted.\n *\n * @param url Request url.\n * @returns True, if request url domain is trusted, else false.\n */\n isTrustedDomain(url) {\n const domain = getDomain$1(url);\n if (domain) {\n return this.trustedDomains.includes(domain);\n }\n return false;\n }\n /**\n * Updates tab with document blocking page url.\n *\n * @param tabId Tab id.\n * @param url Blocking page url.\n */\n static reloadTabWithBlockingPage(tabId, url) {\n const tabContext = tabsApi.getTabContext(tabId);\n if (!tabContext) {\n return;\n }\n browser.tabs.update(tabId, { url });\n }\n /**\n * Sets required url and rule query params to document-blocking page url.\n *\n * @param documentBlockingPageUrl Url of document-blocking page.\n * @param requestUrl Processed request url.\n * @param ruleText Matched rule text.\n * @returns Document blocking page url with required params.\n */\n static createBlockingUrl(documentBlockingPageUrl, requestUrl, ruleText) {\n const url = new URL(documentBlockingPageUrl);\n url.searchParams.set('url', requestUrl);\n url.searchParams.set('rule', ruleText);\n return url.toString();\n }\n}\nconst documentBlockingService = new DocumentBlockingService();\n\nconst USER_FILTER_ID = 0;\n\nconst ASYNC_LOAD_CHINK_SIZE = 5000;\n/**\n * TSUrlFilter Engine wrapper.\n */\nclass EngineApi {\n /**\n * Gets app filtering status.\n *\n * @returns True if filtering is enabled, otherwise returns false.\n */\n get isFilteringEnabled() {\n var _a;\n return Boolean((_a = appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled);\n }\n /**\n * Starts engine.\n *\n * @param configuration Engine configuration.\n */\n startEngine(configuration) {\n return __awaiter(this, void 0, void 0, function* () {\n const { filters, userrules, verbose, } = configuration;\n allowlistApi.configure(configuration);\n documentBlockingService.configure(configuration);\n const lists = [];\n for (let i = 0; i < filters.length; i += 1) {\n const { filterId, content, trusted } = filters[i];\n const convertedContent = RuleConverter.convertRules(content);\n lists.push(new StringRuleList(filterId, convertedContent, false, !trusted, !trusted));\n }\n if (userrules.length > 0) {\n const convertedUserRules = RuleConverter.convertRules(userrules.join('\\n'));\n lists.push(new StringRuleList(USER_FILTER_ID, convertedUserRules));\n }\n const allowlistRules = allowlistApi.getAllowlistRules();\n if (allowlistRules) {\n lists.push(allowlistRules);\n }\n const stealthModeList = stealthApi.getStealthModeRuleList();\n if (stealthModeList) {\n lists.push(stealthModeList);\n }\n const ruleStorage = new RuleStorage(lists);\n setConfiguration({\n engine: 'extension',\n version: browser.runtime.getManifest().version,\n verbose,\n compatibility: CompatibilityTypes.Extension,\n });\n /*\n * UI thread becomes blocked on the options page while request filter is created\n * that's why we create filter rules using chunks of the specified length\n * Request filter creation is rather slow operation so we should\n * use setTimeout calls to give UI thread some time.\n */\n const engine = new Engine(ruleStorage, true);\n yield engine.loadRulesAsync(ASYNC_LOAD_CHINK_SIZE);\n this.engine = engine;\n });\n }\n /**\n * Searched for rules by match query.\n *\n * @param matchQuery Query against which the request would be matched.\n * @returns Matching result or null.\n */\n matchRequest(matchQuery) {\n if (!this.engine || !this.isFilteringEnabled) {\n return null;\n }\n const { requestUrl, frameUrl, requestType, } = matchQuery;\n let { frameRule } = matchQuery;\n const request = new Request(requestUrl, frameUrl, requestType);\n if (!frameRule) {\n frameRule = null;\n }\n return this.engine.matchRequest(request, frameRule);\n }\n /**\n * Matches current frame url and returns rule if found.\n *\n * @param frameUrl Frame url.\n * @returns NetworkRule or null.\n */\n matchFrame(frameUrl) {\n if (!this.engine || !this.isFilteringEnabled) {\n return null;\n }\n return this.engine.matchFrame(frameUrl);\n }\n /**\n * Gets cosmetic result for the specified hostname and cosmetic options.\n *\n * @param url Request url.\n * @param option Cosmetic options.\n * @returns Cosmetic result.\n */\n getCosmeticResult(url, option) {\n if (!this.engine || !this.isFilteringEnabled) {\n return new CosmeticResult();\n }\n const frameUrl = getHost(url);\n const request = new Request(url, frameUrl, RequestType$1.Document);\n return this.engine.getCosmeticResult(request, option);\n }\n /**\n * Simple getter for rules count.\n *\n * @returns Number of rules in the engine.\n */\n getRulesCount() {\n return this.engine ? this.engine.getRulesCount() : 0;\n }\n}\nconst engineApi = new EngineApi();\n\n/**\n * Taken from:\n * {@link https://github.com/seanl-adg/InlineResourceLiteral/blob/master/index.js#L136}\n * {@link https://github.com/joliss/js-string-escape/blob/master/index.js}.\n */\nconst reJsEscape = /[\"'\\\\\\n\\r\\u2028\\u2029]/g;\nconst escapeJs = (match) => {\n switch (match) {\n case '\"':\n case \"'\":\n case '\\\\':\n return `\\\\${match}`;\n case '\\n':\n /**\n * Line continuation character for ease of reading inlined resource.\n */\n return '\\\\n\\\\\\n';\n case '\\r':\n /**\n * Carriage returns won't have any semantic meaning in JS.\n */\n return '';\n case '\\u2028':\n return '\\\\u2028';\n case '\\u2029':\n return '\\\\u2029';\n default:\n return match;\n }\n};\n/**\n * We use changing variable name because global properties can be modified across isolated worlds of extension\n * content page and tab page.\n *\n * Issue: @see {@link https://bugs.chromium.org/p/project-zero/issues/detail?id=1225&desc=6}.\n */\nconst variableName = `scriptExecuted${Date.now()}`;\n/**\n * Builds script to inject in a safe way.\n *\n * @see {@link LocalScriptRulesService} for details about script source.\n * @param scriptText Script text.\n * @returns Script to inject.\n */\nconst buildScriptText = (scriptText) => {\n /**\n * Executes scripts in a scope of the page, but the `window` fields are in\n * an isolated scope, e.g. `window.${variableName}` will only be visible in\n * this scope of the script, but not in the original scope of the page.\n * In order to prevent multiple script execution checks if script was already executed.\n * Sometimes in Firefox when content-filtering is applied to the page race condition happens.\n * This causes an issue when the page doesn't have its document.head or document.documentElement at the moment of\n * injection. So script waits for them. But if a quantity of frame-requests reaches FRAME_REQUESTS_LIMIT then\n * script stops waiting with the error.\n * Description of the issue: @see {@link https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1004}.\n */\n return `(function() {\\\n if (window.${variableName}) {\\\n return;\\\n }\\\n var script = document.createElement(\"script\");\\\n script.setAttribute(\"type\", \"text/javascript\");\\\n script.textContent = \"${scriptText.replace(reJsEscape, escapeJs)}\";\\\n var FRAME_REQUESTS_LIMIT = 500;\\\n var frameRequests = 0;\\\n function waitParent () {\\\n frameRequests += 1;\\\n var parent = document.head || document.documentElement;\\\n if (parent) {\\\n try {\\\n parent.appendChild(script);\\\n parent.removeChild(script);\\\n } catch (e) {\\\n } finally {\\\n window.${variableName} = true;\\\n return true;\\\n }\\\n }\\\n if(frameRequests < FRAME_REQUESTS_LIMIT) {\\\n requestAnimationFrame(waitParent);\\\n } else {\\\n console.log(\"AdGuard: document.head or document.documentElement were unavailable too long\");\\\n }\\\n }\\\n waitParent();\\\n })()`;\n};\n\n/**\n * By the rules of AMO we cannot use remote scripts (and our JS rules can be counted as such).\n * Because of that we use the following approach (that was accepted by AMO reviewers):\n *\n * 1. We pre-build JS rules from AdGuard filters into the JSON file.\n * 2. At runtime we check every JS rule if it's included into JSON.\n * If it is included we allow this rule to work since it's pre-built. Other rules are discarded.\n * 3. We also allow \"User rules\" to work since those rules are added manually by the user.\n * This way filters maintainers can test new rules before including them in the filters.\n */\nclass LocalScriptRulesService {\n /**\n * Saves local script rules to object.\n *\n * @param json JSON object with pre-build JS rules.\n */\n setLocalScriptRules(json) {\n this.localScripts = new Set(json.rules.map((rule) => {\n const { domains, script } = rule;\n let ruleText = '';\n if (domains !== LocalScriptRulesService.JS_RULE_GENERIC_DOMAIN_TOKEN) {\n ruleText = domains;\n }\n ruleText += `${LocalScriptRulesService.JS_RULE_SEPARATOR_TOKEN}${script}`;\n return ruleText;\n }));\n }\n /**\n * Checks if ruleText is in the pre-built JSON with JS rules.\n *\n * @param ruleText Rule text.\n *\n * @returns True, if rule is local, else returns false.\n */\n isLocal(ruleText) {\n if (this.localScripts === undefined) {\n return true;\n }\n /**\n * In case of Firefox add-ons JS filtering rules are hardcoded\n * into add-on code. So, if rule is not local - we exclude these\n * rules from execution for Firefox AMO.\n *\n * Check description of {@link LocalScriptRulesService} for\n * details about script source.\n */\n return this.localScripts.has(ruleText);\n }\n}\nLocalScriptRulesService.JS_RULE_GENERIC_DOMAIN_TOKEN = '';\nLocalScriptRulesService.JS_RULE_SEPARATOR_TOKEN = '#%#';\nconst localScriptRulesService = new LocalScriptRulesService();\n\n/**\n * Cosmetic api class.\n * Used to prepare and inject javascript and css into pages.\n */\nclass CosmeticApi {\n /**\n * Applies scripts from a cosmetic result. It is possible inject a script\n * only once, because after the first inject, we set a flag in an isolated\n * copy of the window and all next calls to `buildScriptText` will return\n * nothing.\n *\n * @param scriptText Script text.\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @see {@link buildScriptText} for details about multiple injects.\n * @see {@link LocalScriptRulesService} for details about script source.\n */\n static injectScript(scriptText, tabId, frameId = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n return TabsApi.injectScript(buildScriptText(scriptText), tabId, frameId);\n });\n }\n /**\n * Applies css from cosmetic result.\n *\n * Patches rule selector adding adguard mark rule info in the content attribute.\n * Example:\n * .selector -> .selector { content: 'adguard{filterId};{ruleText} !important;}.\n *\n * @param cssText Css text.\n * @param tabId Tab id.\n * @param frameId Frame id.\n */\n static injectCss(cssText, tabId, frameId = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n return TabsApi.injectCss(cssText, tabId, frameId);\n });\n }\n /**\n * Retrieves css styles from the cosmetic result.\n *\n * @param cosmeticResult Cosmetic result.\n * @param collectingCosmeticRulesHits Flag to collect cosmetic rules hits.\n * @returns Css styles as string, or `undefined` if no styles found.\n */\n static getCssText(cosmeticResult, collectingCosmeticRulesHits = false) {\n const { elementHiding, CSS } = cosmeticResult;\n const elemhideCss = elementHiding.generic.concat(elementHiding.specific);\n const injectCss = CSS.generic.concat(CSS.specific);\n let styles;\n if (collectingCosmeticRulesHits) {\n styles = CosmeticApi.buildStyleSheetsWithHits(elemhideCss, injectCss);\n }\n else {\n styles = CosmeticApi.buildStyleSheets(elemhideCss, injectCss, true);\n }\n if (styles.length > 0) {\n return styles.join(CosmeticApi.LINE_BREAK);\n }\n return undefined;\n }\n /**\n * Builds extended css rules from cosmetic result.\n *\n * @param cosmeticResult Cosmetic result.\n * @param collectingCosmeticRulesHits Flag to collect cosmetic rules hits.\n * @returns Array of extended css rules or null.\n */\n static getExtCssRules(cosmeticResult, collectingCosmeticRulesHits = false) {\n const { elementHiding, CSS } = cosmeticResult;\n const elemhideExtCss = elementHiding.genericExtCss.concat(elementHiding.specificExtCss);\n const injectExtCss = CSS.genericExtCss.concat(CSS.specificExtCss);\n let extCssRules;\n if (collectingCosmeticRulesHits) {\n extCssRules = CosmeticApi.buildStyleSheetsWithHits(elemhideExtCss, injectExtCss);\n }\n else {\n extCssRules = CosmeticApi.buildStyleSheets(elemhideExtCss, injectExtCss, false);\n }\n return extCssRules.length > 0\n ? extCssRules\n : null;\n }\n /**\n * Builds scripts from cosmetic rules.\n *\n * @param rules Cosmetic rules.\n * @returns Scripts or undefined.\n */\n static getScriptText(rules) {\n if (rules.length === 0) {\n return undefined;\n }\n const scriptText = rules\n .filter((rule) => {\n // Scriptlets should not be excluded for remote filters\n if (rule.isScriptlet) {\n return true;\n }\n // User rules should not be excluded from remote filters\n const filterId = rule.getFilterListId();\n if (filterId === USER_FILTER_ID) {\n return true;\n }\n /**\n * @see {@link LocalScriptRulesService} for details about script source\n */\n const text = rule.getText();\n return localScriptRulesService.isLocal(text);\n })\n .map((rule) => rule.getScript())\n .join('\\n');\n if (!scriptText) {\n return undefined;\n }\n return scriptText;\n }\n /**\n * Returns content script data for applying cosmetic.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @returns Content script data for applying cosmetic.\n */\n static getContentScriptData(tabId, frameId) {\n const { isAppStarted, configuration } = appContext;\n const areHitsStatsCollected = (configuration === null || configuration === void 0 ? void 0 : configuration.settings.collectStats) || false;\n const data = {\n isAppStarted,\n areHitsStatsCollected,\n extCssRules: null,\n };\n const frame = tabsApi.getTabFrame(tabId, frameId);\n if (!(frame === null || frame === void 0 ? void 0 : frame.cosmeticResult)) {\n return data;\n }\n data.extCssRules = CosmeticApi.getExtCssRules(frame.cosmeticResult, areHitsStatsCollected);\n return data;\n }\n /**\n * Applies css rules to specific frame.\n *\n * @param params Data for css rules injecting.\n */\n static applyCssRules(params) {\n return __awaiter(this, void 0, void 0, function* () {\n const { tabId, frameId, cosmeticResult, } = params;\n const { configuration } = appContext;\n const areHitsStatsCollected = (configuration === null || configuration === void 0 ? void 0 : configuration.settings.collectStats) || false;\n const cssText = CosmeticApi.getCssText(cosmeticResult, areHitsStatsCollected);\n if (cssText) {\n yield CosmeticApi.injectCss(cssText, tabId, frameId);\n }\n });\n }\n /**\n * Applies js rules to specific frame.\n *\n * @param params Data for js rule injecting and logging.\n */\n static applyJsRules(params) {\n return __awaiter(this, void 0, void 0, function* () {\n const { tabId, frameId, cosmeticResult, url, contentType, timestamp, } = params;\n const scriptRules = cosmeticResult.getScriptRules();\n let scriptText = CosmeticApi.getScriptText(scriptRules);\n scriptText += stealthApi.getSetDomSignalScript();\n if (scriptText) {\n /**\n * We can execute injectScript only once per frame, so we need to\n * combine all the scripts into a single injection.\n *\n * @see {@link buildScriptText} for details about multiple injects.\n * @see {@link LocalScriptRulesService} for details about script source\n */\n yield CosmeticApi.injectScript(scriptText, tabId, frameId);\n for (const scriptRule of scriptRules) {\n if (!scriptRule.isGeneric()) {\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.JsInject,\n data: {\n script: true,\n tabId,\n // for proper filtering log request info rule displaying\n // event id should be unique for each event, not copied from request\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2341\n eventId: nanoid(),\n requestUrl: url,\n frameUrl: url,\n frameDomain: getDomain(url),\n requestType: contentType,\n timestamp,\n rule: scriptRule,\n },\n });\n }\n }\n }\n });\n }\n /**\n * Apply js to specified frame based on provided data and injection FSM state.\n *\n * @param params The data required for the injection.\n * @param fsm Injection finite state machine.\n * @param tries The number of tries for the operation in case of failure.\n */\n static applyFrameJsRules(params, fsm, tries = 0) {\n if (fsm.state !== \"idle\" /* InjectionState.Idle */) {\n return;\n }\n fsm.dispatch(\"start\" /* InjectionEvent.Start */);\n CosmeticApi\n .applyJsRules(params)\n .then(() => {\n fsm.dispatch(\"success\" /* InjectionEvent.Success */);\n }).catch((e) => {\n fsm.dispatch(\"failure\" /* InjectionEvent.Failure */);\n if (tries < CosmeticApi.INJECTION_MAX_TRIES) {\n setTimeout(() => {\n CosmeticApi.applyFrameJsRules(params, fsm, tries + 1);\n }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS);\n }\n else {\n logger.debug(getErrorMessage(e));\n }\n });\n }\n /**\n * Injects css to specified frame based on provided data and injection FSM state.\n *\n * @param params Data required for the injection.\n * @param fsm Injection finite state machine.\n * @param tries Number of tries for the operation in case of failure.\n */\n static applyFrameCssRules(params, fsm, tries = 0) {\n if (fsm.state !== \"idle\" /* InjectionState.Idle */) {\n return;\n }\n fsm.dispatch(\"start\" /* InjectionEvent.Start */);\n CosmeticApi\n .applyCssRules(params)\n .then(() => {\n fsm.dispatch(\"success\" /* InjectionEvent.Success */);\n }).catch((e) => {\n fsm.dispatch(\"failure\" /* InjectionEvent.Failure */);\n if (tries < CosmeticApi.INJECTION_MAX_TRIES) {\n setTimeout(() => {\n CosmeticApi.applyFrameCssRules(params, fsm, tries + 1);\n }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS);\n }\n else {\n logger.debug(getErrorMessage(e));\n }\n });\n }\n /**\n * Builds element hiding stylesheet from rules.\n * If `groupElemhideSelectors` is set,\n * selector are to be combined into selector lists of {@link CosmeticApi.CSS_SELECTORS_PER_LINE}.\n *\n * @param elemhideRules List of elemhide rules.\n * @param groupElemhideSelectors Flag for elemhide selectors grouping.\n *\n * @returns Array of styles.\n */\n static buildElemhideStyles(elemhideRules, groupElemhideSelectors) {\n // TODO: refactor constants as ELEMHIDE_CSS_STYLE and ELEMHIDE_HIT_START are duplicates partly\n const ELEMHIDE_CSS_STYLE = ' { display: none !important; }';\n const elemhideSelectors = [];\n for (const selector of elemhideRules) {\n elemhideSelectors.push(selector.getContent());\n }\n // if selector should not be grouped,\n // add element hiding style to each of them\n if (!groupElemhideSelectors) {\n return elemhideSelectors.map((selector) => {\n return `${selector}${ELEMHIDE_CSS_STYLE}`;\n });\n }\n // otherwise selectors should be grouped into selector lists\n const elemhideStyles = [];\n for (let i = 0; i < elemhideSelectors.length; i += CosmeticApi.CSS_SELECTORS_PER_LINE) {\n const selectorList = elemhideSelectors\n .slice(i, i + CosmeticApi.CSS_SELECTORS_PER_LINE)\n .join(', ');\n elemhideStyles.push(`${selectorList}${ELEMHIDE_CSS_STYLE}`);\n }\n return elemhideStyles;\n }\n /**\n * Builds stylesheets from rules.\n * If `groupElemhideSelectors` is set,\n * element hiding selector are to be combined into selector lists of {@link CosmeticApi.CSS_SELECTORS_PER_LINE}.\n *\n * @param elemhideRules List of elemhide rules.\n * @param injectRules List of inject css rules.\n * @param groupElemhideSelectors Flag for elemhide selectors grouping.\n *\n * @returns List of stylesheet expressions.\n */\n static buildStyleSheets(elemhideRules, injectRules, groupElemhideSelectors) {\n const styles = [];\n const elemHideStyles = CosmeticApi.buildElemhideStyles(elemhideRules, groupElemhideSelectors);\n if (elemHideStyles.length > 0) {\n if (groupElemhideSelectors) {\n styles.push(elemHideStyles.join(CosmeticApi.LINE_BREAK));\n }\n else {\n styles.push(...elemHideStyles);\n }\n }\n const cssStyles = injectRules.map((x) => x.getContent());\n if (cssStyles.length > 0) {\n if (groupElemhideSelectors) {\n styles.push(cssStyles.join(CosmeticApi.LINE_BREAK));\n }\n else {\n styles.push(...cssStyles);\n }\n }\n return styles;\n }\n /**\n * Encodes rule text.\n *\n * @param ruleText Rule text.\n * @returns Encoded rule text.\n */\n static escapeRule(ruleText) {\n return encodeURIComponent(ruleText).replace(/['()]/g, (match) => ({ \"'\": '%27', '(': '%28', ')': '%29' }[match]));\n }\n /**\n * Patches rule selector adding adguard mark rule info in the content attribute.\n * Example:\n * .selector -> .selector { content: 'adguard{filterId};{ruleText} !important;}.\n *\n * @param rule Elemhide cosmetic rule.\n *\n * @returns Rule with modified stylesheet, containing content marker.\n */\n static addMarkerToElemhideRule(rule) {\n const result = [];\n result.push(rule.getContent());\n result.push(CosmeticApi.ELEMHIDE_HIT_START);\n result.push(rule.getFilterListId());\n result.push(CosmeticApi.HIT_SEP);\n result.push(CosmeticApi.escapeRule(rule.getText()));\n result.push(CosmeticApi.HIT_END);\n return result.join('');\n }\n /**\n * Patches rule selector adding adguard mark and rule info in the content style attribute.\n * Example:\n * .selector { color: red } -> .selector { color: red, content: 'adguard{filterId};{ruleText} !important;}.\n *\n * @param rule Inject cosmetic rule.\n *\n * @returns Modified rule with injected content marker into stylesheet.\n */\n static addMarkerToInjectRule(rule) {\n const result = [];\n const ruleContent = rule.getContent();\n // if rule text has content attribute we don't add rule marker\n const contentAttributeRegex = /[{;\"(]\\s*content\\s*:/gi;\n if (contentAttributeRegex.test(ruleContent)) {\n return ruleContent;\n }\n // remove closing brace\n const ruleTextWithoutCloseBrace = ruleContent.slice(0, -1).trim();\n // check semicolon\n const ruleTextWithSemicolon = ruleTextWithoutCloseBrace.endsWith(';')\n ? ruleTextWithoutCloseBrace\n : `${ruleTextWithoutCloseBrace};`;\n result.push(ruleTextWithSemicolon);\n result.push(CosmeticApi.INJECT_HIT_START);\n result.push(rule.getFilterListId());\n result.push(CosmeticApi.HIT_SEP);\n result.push(CosmeticApi.escapeRule(rule.getText()));\n result.push(CosmeticApi.HIT_END);\n return result.join('');\n }\n /**\n * Builds stylesheets with css-hits marker.\n *\n * @param elemhideRules Elemhide css rules.\n * @param injectRules Inject css rules.\n *\n * @returns List of stylesheet expressions.\n */\n static buildStyleSheetsWithHits(elemhideRules, injectRules) {\n const elemhideStyles = elemhideRules.map((x) => CosmeticApi.addMarkerToElemhideRule(x));\n const injectStyles = injectRules.map((x) => CosmeticApi.addMarkerToInjectRule(x));\n return [...elemhideStyles, ...injectStyles];\n }\n}\nCosmeticApi.ELEMHIDE_HIT_START = \" { display: none !important; content: 'adguard\";\nCosmeticApi.INJECT_HIT_START = \" content: 'adguard\";\nCosmeticApi.HIT_SEP = encodeURIComponent(';');\nCosmeticApi.HIT_END = \"' !important; }\";\nCosmeticApi.LINE_BREAK = '\\r\\n';\n// Number of selectors in grouped selector list\nCosmeticApi.CSS_SELECTORS_PER_LINE = 50;\n// Timeout for cosmetic injection retry on failure.\nCosmeticApi.INJECTION_RETRY_TIMEOUT_MS = 10;\n// Max number of tries to inject cosmetic rules.\nCosmeticApi.INJECTION_MAX_TRIES = 100;\n\n/**\n * Implementation of the request context storage.\n */\nclass RequestContextStorage {\n constructor() {\n this.contextStorage = new Map();\n this.onRecord = new EventChannel();\n this.onUpdate = new EventChannel();\n }\n /**\n * Get request by requestId.\n *\n * @param requestId Request id.\n * @returns Request context.\n */\n get(requestId) {\n return this.contextStorage.get(requestId);\n }\n /**\n * Record request context. And dispatch event.\n *\n * @param requestId Request id.\n * @param data Request context.\n * @returns Request context.\n */\n record(requestId, data) {\n this.contextStorage.set(requestId, data);\n this.onRecord.dispatch({\n id: requestId,\n data,\n });\n return data;\n }\n /**\n * Update request context fields. Can be done partially.\n *\n * @param requestId Request id.\n * @param data Partial request context.\n * @returns Updated request context.\n */\n update(requestId, data) {\n const requestContext = this.contextStorage.get(requestId);\n if (requestContext) {\n const newData = Object.assign(requestContext, data);\n this.contextStorage.set(requestId, newData);\n this.onUpdate.dispatch({\n id: requestId,\n data: newData,\n });\n return newData;\n }\n this.contextStorage.set(requestId, data);\n this.onUpdate.dispatch({\n id: requestId,\n data: data,\n });\n return undefined;\n }\n /**\n * Removes request context from storage.\n *\n * @param requestId Request id.\n */\n delete(requestId) {\n if (this.contextStorage.has(requestId)) {\n this.contextStorage.delete(requestId);\n }\n }\n /**\n * Search for the request context by url and request type.\n *\n * @param requestUrl Request url.\n * @param requestType Request type.\n * @returns Request context or undefined.\n */\n find(requestUrl, requestType) {\n for (const context of this.contextStorage.values()) {\n if (context.requestUrl === requestUrl && context.requestType === requestType) {\n return context;\n }\n }\n return undefined;\n }\n /**\n * Clear context storage.\n */\n clear() {\n this.contextStorage.clear();\n }\n}\nconst requestContextStorage = new RequestContextStorage();\n\nconst BACKGROUND_TAB_ID = -1;\n/**\n * Css, injected to broken element for hiding.\n */\n// eslint-disable-next-line max-len\nconst INITIATOR_TAG_HIDDEN_STYLE = '{ display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important; }';\n/**\n * Returns network request initiator tag by request type.\n *\n * @param requestType Request type.\n * @returns Initiator tag.\n */\nfunction getRequestInitiatorTag(requestType) {\n switch (requestType) {\n case RequestType$1.SubDocument:\n return [\"iframe\" /* InitiatorTag.Iframe */, \"frame\" /* InitiatorTag.Frame */];\n case RequestType$1.Image:\n return [\"img\" /* InitiatorTag.Image */];\n default:\n return null;\n }\n}\n/**\n * Inject css for element hiding by tabs.injectCss.\n *\n * @param tabId Tab id.\n * @param requestFrameId Request frame id.\n * @param url Request url.\n * @param requestType Request type.\n * @param isThirdParty Flag telling if request is third-party.\n */\nfunction hideRequestInitiatorElement(tabId, requestFrameId, url, requestType, isThirdParty) {\n const initiatorTags = getRequestInitiatorTag(requestType);\n if (!initiatorTags || tabId === BACKGROUND_TAB_ID) {\n return;\n }\n // Strip the protocol and host name (for first-party requests) from the selector\n let srcUrlStartIndex = url.indexOf('//');\n if (!isThirdParty) {\n srcUrlStartIndex = url.indexOf('/', srcUrlStartIndex + 2);\n }\n const srcUrl = url.substring(srcUrlStartIndex);\n let code = '';\n for (let i = 0; i < initiatorTags.length; i += 1) {\n code += `${initiatorTags[i]}[src$=\"${srcUrl}\"] ${INITIATOR_TAG_HIDDEN_STYLE}\\n`;\n }\n CosmeticApi.injectCss(code, tabId, requestFrameId);\n}\n\n/**\n * RedirectsCache is used for new type of blocking redirects, like click2load.html.\n * Here we save redirected urls to check later for being able to view hidden frame after user\n * clicked on button \"click to load\".\n */\nclass RedirectsCache {\n constructor() {\n /**\n * Instance or LRUMap.\n */\n this.cache = new LRUMap(100);\n /**\n * Adds url to the cache.\n *\n * @param url Url added to cache.\n */\n this.add = (url) => {\n this.cache.set(url, true);\n };\n /**\n * Checks if url is in the cache.\n *\n * @param url Url to check.\n * @returns True if url is in the cache.\n */\n this.hasUrl = (url) => {\n return this.cache.has(url);\n };\n }\n}\nconst redirectsCache = new RedirectsCache();\n\n/**\n * Used for new type of redirects, i.e.: click2load.html.\n * This tokens are transferred to redirect and used later to unblock page after user clicked button\n * \"click to load\".\n */\nclass RedirectsTokensCache {\n constructor() {\n this.cache = new LRUMap(1000);\n /**\n * Generates random unblock token for url and saves it to cache.\n * Used for blocking redirect params creation {@link resourcesService.blockingUrlParams}.\n *\n * @returns Generated random string.\n */\n this.generateToken = () => {\n const token = nanoid();\n this.cache.set(token, true);\n return token;\n };\n /**\n * Checks whether token exist in cache.\n * Used when redirect is checked in {@link resourcesService.shouldCreateRedirectUrl}.\n *\n * @param token Some string or null.\n * @returns True if cache has such token.\n */\n this.hasToken = (token) => {\n if (!token) {\n return false;\n }\n return this.cache.has(token);\n };\n }\n}\nconst redirectsTokensCache = new RedirectsTokensCache();\n\n/**\n * Prevent web pages to identify extension through its web accessible resources.\n *\n * Inspired by:\n * https://github.com/gorhill/uBlock/blob/7f999b759fe540e457e297363f55b25d9860dd3e/platform/chromium/vapi-background.\n */\nclass ResourcesService {\n /**\n * Constructor.\n *\n * @param generateSecretKey Function to generate secret key.\n */\n constructor(generateSecretKey) {\n this.secrets = [];\n this.root = browser.runtime.getURL('/');\n this.lastSecretTime = 0;\n this.generateSecretKey = generateSecretKey;\n this.guardWar = this.guardWar.bind(this);\n }\n /**\n * Init service.\n *\n * @param warDir Web accessible resources directory.\n */\n init(warDir) {\n this.warDir = warDir;\n const filter = {\n urls: [`${this.root}${this.warDir}/*`],\n };\n const extraInfoSpec = ['blocking'];\n browser.webRequest.onBeforeRequest.addListener(this.guardWar, filter, extraInfoSpec);\n }\n /**\n * Stops service.\n */\n stop() {\n this.warDir = undefined;\n this.secrets = [];\n browser.webRequest.onBeforeRequest.removeListener(this.guardWar);\n }\n /**\n * Creates url for war file.\n *\n * @param path Resource relative path.\n * @param params Additional params appended to url, by default empty.\n * @throws Error, if web accessible resources path is not defined.\n *\n * @returns Url to resource with secret param.\n */\n createResourceUrl(path, params = new URLSearchParams()) {\n if (!this.warDir) {\n throw new Error('Resources path is not defined. Did you init the service?');\n }\n const secretParams = new URLSearchParams(this.createSecretParam());\n const resultParams = new URLSearchParams([...secretParams, ...params]);\n return browser.runtime.getURL(`/${this.warDir}/${path}?${resultParams.toString()}`);\n }\n /**\n * Loads war resource by path.\n *\n * @param path Resource relative path.\n */\n loadResource(path) {\n return __awaiter(this, void 0, void 0, function* () {\n const url = this.createResourceUrl(path);\n const response = yield fetch(url);\n return response.text();\n });\n }\n /**\n * Generates secret key, persists it in the secrets array and formats querystring.\n *\n * @returns Querystring with secret.\n */\n createSecretParam() {\n if (this.secrets.length !== 0) {\n // TODO move magic numbers to constants\n if ((Date.now() - this.lastSecretTime) > 5000) {\n this.secrets.splice(0);\n }\n else if (this.secrets.length > 256) {\n this.secrets.splice(0, this.secrets.length - 192);\n }\n }\n this.lastSecretTime = Date.now();\n const secret = this.generateSecretKey();\n this.secrets.push(secret);\n return `?secret=${secret}`;\n }\n /**\n * If secret is not found redirects to the main url of extension, otherwise removes secret from the stored values.\n *\n * @param details Web request details.\n * @returns Redirect or nothing.\n */\n guardWar(details) {\n const { url } = details;\n const pos = this.secrets.findIndex((secret) => url.lastIndexOf(`?secret=${secret}`) !== -1);\n if (pos === -1) {\n return { redirectUrl: this.root };\n }\n this.secrets.splice(pos, 1);\n return undefined;\n }\n}\nconst resourcesService = new ResourcesService(() => {\n return Math.floor(Math.random() * 982451653 + 982451653).toString(36);\n});\n\n/**\n * Service for working with redirects.\n */\nclass RedirectsService {\n constructor() {\n this.redirects = null;\n /**\n * Check whether redirect creating is needed i.e.: for click2load.html it's not needed after\n * button click.\n *\n * @param redirectTitle A name of the redirect.\n * @param requestUrl Request url.\n * @returns True if should create redirect url.\n */\n this.shouldCreateRedirectUrl = (redirectTitle, requestUrl) => {\n // if no redirects loaded we won't be able to create redirect url;\n if (!this.redirects) {\n return false;\n }\n // no further checking is needed for most of the redirects\n // except blocking redirects, i.e. click2load.html\n if (!this.redirects.isBlocking(redirectTitle)) {\n return true;\n }\n // unblock token passed to redirect by createRedirectFileUrl and returned back.\n // it should be last parameter in url\n const UNBLOCK_TOKEN_PARAM = '__unblock';\n let cleanRequestUrl = requestUrl;\n const url = new URL(requestUrl);\n const params = new URLSearchParams(url.search);\n const unblockToken = params.get(UNBLOCK_TOKEN_PARAM);\n if (unblockToken) {\n // if redirect has returned unblock token back,\n // add url to cache for no further redirecting on button click;\n // save cleaned origin url so unblock token parameter should be cut off\n params.delete(UNBLOCK_TOKEN_PARAM);\n cleanRequestUrl = `${url.origin}${url.pathname}?${params.toString()}`;\n redirectsCache.add(cleanRequestUrl);\n }\n return !redirectsCache.hasUrl(cleanRequestUrl)\n || !redirectsTokensCache.hasToken(unblockToken);\n };\n }\n /**\n * Starts redirects service.\n */\n start() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const rawYaml = yield resourcesService.loadResource('redirects.yml');\n this.redirects = new redirects.Redirects(rawYaml);\n }\n catch (e) {\n throw new Error(e.message);\n }\n });\n }\n /**\n * Builds blocking url search params.\n *\n * @param redirectTitle Title of the redirect.\n * @param requestUrl Request url.\n * @throws Error if this method called before redirects where set.\n * @returns Url search params.\n * @private\n */\n blockingUrlParams(redirectTitle, requestUrl) {\n if (!this.redirects) {\n throw new Error('This method should be called after redirects are loaded');\n }\n const params = new URLSearchParams();\n if (this.redirects.isBlocking(redirectTitle)) {\n const unblockToken = redirectsTokensCache.generateToken();\n params.set('__unblock', unblockToken);\n params.set('__origin', requestUrl);\n }\n return params;\n }\n /**\n * Returns redirect url for the specified title.\n *\n * @param title Redirect title or null.\n * @param requestUrl Request url.\n * @returns Redirect url or null if redirect is not found.\n */\n createRedirectUrl(title, requestUrl) {\n if (!title) {\n return null;\n }\n if (!this.redirects) {\n return null;\n }\n const redirectSource = this.redirects.getRedirect(title);\n if (!redirectSource) {\n logger.debug(`There is no redirect source with title: \"${title}\"`);\n return null;\n }\n const shouldRedirect = this.shouldCreateRedirectUrl(title, requestUrl);\n if (!shouldRedirect) {\n return null;\n }\n // For blocking redirects we generate additional search params.\n const params = this.blockingUrlParams(title, requestUrl);\n return resourcesService.createResourceUrl(`redirects/${redirectSource.file}`, params);\n }\n}\nconst redirectsService = new RedirectsService();\n\n/**\n * Api for processing request filtering.\n *\n * Method {@link getBlockingResponse} processes rule applying for request and computes response\n * for {@link WebRequestApi.onBeforeRequest} listener.\n *\n * Method {@link shouldCollapseElement} checks, if initializer for request should be collapsed by content-script.\n *\n * This class also provides method {@link isRequestBlockedByRule} for checking, if rule is blocking rule.\n */\nclass RequestBlockingApi {\n /**\n * In some cases request blocking breaks images and frames on page.\n * We match rule from content-script and decide if DOM element should be hidden via css.\n *\n * @param tabId Tab id.\n * @param url Request url.\n * @param referrerUrl Request initializer frame url.\n * @param requestType Type of request.\n *\n * @returns True, if element should be collapsed, else returns false.\n */\n static shouldCollapseElement(tabId, url, referrerUrl, requestType) {\n const result = engineApi.matchRequest({\n requestUrl: url,\n frameUrl: referrerUrl,\n requestType,\n frameRule: tabsApi.getTabFrameRule(tabId),\n });\n if (!result) {\n return false;\n }\n return RequestBlockingApi.isRequestBlockedByRule(result.getBasicResult());\n }\n /**\n * Checks if request rule is blocked.\n *\n * @param requestRule Request network rule or null.\n * @returns True, if rule is request blocking, else returns false.\n */\n static isRequestBlockedByRule(requestRule) {\n return !!requestRule\n && !requestRule.isAllowlist()\n && !requestRule.isOptionEnabled(NetworkRuleOption.Replace)\n && !requestRule.isOptionEnabled(NetworkRuleOption.Redirect);\n }\n /**\n * Processes rule applying for request and compute response for {@link WebRequestApi.onBeforeRequest} listener.\n *\n * @param rule Matched rule.\n * @param requestId Request id.\n * @param requestUrl Request url.\n * @param requestType Request type.\n * @param tabId Tab id.\n *\n * @returns Response for {@link WebRequestApi.onBeforeRequest} listener.\n */\n static getBlockingResponse(rule, requestId, requestUrl, requestType, tabId) {\n if (!rule) {\n return undefined;\n }\n if (rule.isAllowlist()) {\n RequestBlockingApi.logRuleApplying(requestId, rule, tabId);\n return undefined;\n }\n if (requestType === RequestType$1.Document) {\n if (rule.isOptionEnabled(NetworkRuleOption.Document)) {\n return documentBlockingService.getDocumentBlockingResponse(requestId, requestUrl, rule, tabId);\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Popup)) {\n const isNewTab = tabsApi.isNewPopupTab(tabId);\n if (isNewTab) {\n RequestBlockingApi.logRuleApplying(requestId, rule, tabId);\n browser.tabs.remove(tabId);\n return { cancel: true };\n }\n }\n // Other url blocking rules are not applicable to main frame\n return undefined;\n }\n // Replace rules are processed in content-filtering\n if (rule.isOptionEnabled(NetworkRuleOption.Replace)) {\n return undefined;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Redirect)) {\n const redirectUrl = redirectsService.createRedirectUrl(rule.getAdvancedModifierValue(), requestUrl);\n if (redirectUrl) {\n RequestBlockingApi.logRuleApplying(requestId, rule, tabId);\n return { redirectUrl };\n }\n }\n RequestBlockingApi.logRuleApplying(requestId, rule, tabId);\n return { cancel: true };\n }\n /**\n * Creates {@link FilteringLog} event of rule applying for processed request.\n *\n * @param requestId Request id.\n * @param requestRule Request rule.\n * @param tabId Tab id.\n */\n static logRuleApplying(requestId, requestRule, tabId) {\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ApplyBasicRule,\n data: {\n eventId: requestId,\n tabId,\n rule: requestRule,\n },\n });\n }\n}\n\n/**\n * Generic wrapper for browser.webRequest with custom event implementation.\n */\nclass RequestEvent {\n constructor() {\n this.listeners = [];\n }\n /**\n * Register listener for the browser.webRequest events.\n *\n * @param event Webrequest event name.\n * @param handler Handler to register.\n * @param filter Filter of the events.\n * @param extraInfoSpec Extra info spec.\n */\n init(event, handler, filter, extraInfoSpec) {\n const handleBrowserEvent = (details) => {\n const data = handler(details);\n /**\n * Execute all registered listeners one by one until a non-empty value is returned.\n */\n for (let i = 0; i < this.listeners.length; i += 1) {\n const res = this.listeners[i](data);\n if (res) {\n return res;\n }\n }\n return undefined;\n };\n if (extraInfoSpec) {\n event.addListener(handleBrowserEvent, filter, extraInfoSpec);\n }\n else {\n event.addListener(handleBrowserEvent, filter);\n }\n }\n /**\n * Register listener for the browser.webRequest events.\n *\n * @param listener Event callback.\n */\n addListener(listener) {\n this.listeners.push(listener);\n }\n /**\n * Remove listener from the browser.webRequest events.\n *\n * @param listener Event callback.\n */\n removeListener(listener) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n}\n\nconst MAX_URL_LENGTH = 1024 * 16;\n/**\n * Request events class.\n */\nclass RequestEvents {\n /**\n * Initializes request events service.\n */\n static init() {\n RequestEvents.onBeforeRequest.init(browser.webRequest.onBeforeRequest, RequestEvents.handleOnBeforeRequest, { urls: [''] }, ['blocking', 'requestBody']);\n const onBeforeSendHeadersOptions = ['requestHeaders', 'blocking'];\n if (isChrome) {\n onBeforeSendHeadersOptions.push('extraHeaders');\n }\n RequestEvents.onBeforeSendHeaders.init(browser.webRequest.onBeforeSendHeaders, RequestEvents.handleOnBeforeSendHeaders, { urls: [''] }, onBeforeSendHeadersOptions);\n RequestEvents.onSendHeaders.init(browser.webRequest.onSendHeaders, RequestEvents.handleSendHeaders, { urls: [''] });\n const onHeadersReceivedOptions = ['responseHeaders', 'blocking'];\n if (isChrome) {\n onHeadersReceivedOptions.push('extraHeaders');\n }\n RequestEvents.onHeadersReceived.init(browser.webRequest.onHeadersReceived, RequestEvents.handleOnHeadersReceived, { urls: [''] }, onHeadersReceivedOptions);\n RequestEvents.onAuthRequired.init(browser.webRequest.onAuthRequired, RequestEvents.handleOnAuthRequired, { urls: [''] });\n RequestEvents.onBeforeRedirect.init(browser.webRequest.onBeforeRedirect, RequestEvents.handleOnBeforeRedirect, { urls: [''] });\n RequestEvents.onResponseStarted.init(browser.webRequest.onResponseStarted, RequestEvents.handleOnResponseStarted, { urls: [''] });\n RequestEvents.onCompleted.init(browser.webRequest.onCompleted, RequestEvents.handleOnCompleted, { urls: [''] }, ['responseHeaders']);\n RequestEvents.onErrorOccurred.init(browser.webRequest.onErrorOccurred, RequestEvents.handleOnErrorOccurred, { urls: [''] });\n }\n /**\n * Handles onBeforeRequest event.\n *\n * @param details WebRequest details.\n * @returns Request data.\n */\n static handleOnBeforeRequest(details) {\n var _a, _b;\n const { requestId, type, frameId, tabId, parentFrameId, originUrl, initiator, method, timeStamp, } = details;\n let { url } = details;\n /**\n * Truncate too long urls.\n *\n * @see {@link https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1493}\n */\n if (url.length > MAX_URL_LENGTH) {\n url = url.slice(0, MAX_URL_LENGTH);\n }\n /**\n * FF sends http instead of ws protocol at the http-listeners layer\n * Although this is expected, as the Upgrade request is indeed an HTTP request,\n * we use a chromium based approach in this case.\n */\n if (type === 'websocket' && isHttpRequest(url)) {\n url = url.replace(/^http(s)?:/, 'ws$1:');\n }\n const { requestType, contentType } = getRequestType(type);\n let requestFrameId = type === 'main_frame' ? frameId : parentFrameId;\n // Relate request to main_frame\n if (requestFrameId === -1) {\n requestFrameId = 0;\n }\n // To mark requests started via navigation from the address bar (real\n // request or pre-render, it does not matter) as first-party requests,\n // we get only part of the request context to record only the tab and\n // frame information before calculating the request referrer.\n const tabFrameRequestContext = {\n requestUrl: url,\n requestType,\n requestId,\n frameId,\n tabId,\n };\n if (requestType === RequestType.Document || requestType === RequestType.SubDocument) {\n // Saves the current tab url to retrieve it correctly below.\n tabsApi.handleFrameRequest(tabFrameRequestContext);\n }\n const referrerUrl = originUrl\n || initiator\n // Comparison of the requested url with the tab frame url in case of\n // a navigation change from the browser address bar.\n || ((_a = tabsApi.getTabMainFrame(tabId)) === null || _a === void 0 ? void 0 : _a.url)\n || ((_b = tabsApi.getTabFrame(tabId, requestFrameId)) === null || _b === void 0 ? void 0 : _b.url)\n || url;\n // Retrieve the rest part of the request context for record all fields.\n const requestContext = Object.assign(Object.assign({}, tabFrameRequestContext), { requestFrameId, state: \"beforeRequest\" /* RequestContextState.BeforeRequest */, timestamp: timeStamp, thirdParty: isThirdPartyRequest(url, referrerUrl), referrerUrl,\n contentType,\n method });\n const context = requestContextStorage.record(requestId, requestContext);\n return { details, context };\n }\n /**\n * Handles onBeforeSendHeaders event.\n *\n * @param details WebRequest details.\n * @returns Request data.\n */\n static handleOnBeforeSendHeaders(details) {\n const { requestId, timeStamp, requestHeaders } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"beforeSendHeaders\" /* RequestContextState.BeforeSendHeaders */,\n timestamp: timeStamp,\n requestHeaders,\n });\n return { details, context };\n }\n /**\n * Handles onSendHeaders event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleSendHeaders(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"sendHeaders\" /* RequestContextState.SendHeaders */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onHeadersReceived event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnHeadersReceived(details) {\n const { requestId, responseHeaders, statusCode, } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"headersReceived\" /* RequestContextState.HeadersReceived */,\n responseHeaders,\n statusCode,\n });\n return { details, context };\n }\n /**\n * Handles onAuthRequired event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnAuthRequired(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"authRequired\" /* RequestContextState.AuthRequired */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onBeforeRedirect event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnBeforeRedirect(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"beforeRedirect\" /* RequestContextState.BeforeRedirect */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onResponseStarted event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnResponseStarted(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"responseStarted\" /* RequestContextState.ResponseStarted */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onCompleted event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnCompleted(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"completed\" /* RequestContextState.Completed */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onErrorOccurred event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnErrorOccurred(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"error\" /* RequestContextState.Error */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n}\nRequestEvents.onBeforeRequest = new RequestEvent();\nRequestEvents.onBeforeSendHeaders = new RequestEvent();\nRequestEvents.onSendHeaders = new RequestEvent();\nRequestEvents.onHeadersReceived = new RequestEvent();\nRequestEvents.onAuthRequired = new RequestEvent();\nRequestEvents.onBeforeRedirect = new RequestEvent();\nRequestEvents.onResponseStarted = new RequestEvent();\nRequestEvents.onCompleted = new RequestEvent();\nRequestEvents.onErrorOccurred = new RequestEvent();\n\n/**\n * Headers filtering service module.\n */\nclass HeadersService {\n /**\n * Constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.filteringLog = filteringLog;\n }\n /**\n * On before send headers handler.\n * Removes request headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n onBeforeSendHeaders(context) {\n const { requestHeaders, matchingResult, tabId, requestUrl, requestId, contentType, timestamp, } = context;\n if (!requestHeaders || !matchingResult) {\n return false;\n }\n const rules = matchingResult.getRemoveHeaderRules();\n if (rules.length === 0) {\n return false;\n }\n let isModified = false;\n rules.forEach((rule) => {\n if (HeadersService.applyRule(requestHeaders, rule, true)) {\n isModified = true;\n this.filteringLog.publishEvent({\n type: FilteringEventType.RemoveHeader,\n data: {\n removeHeader: true,\n headerName: rule.getAdvancedModifierValue(),\n eventId: nanoid(),\n tabId,\n requestUrl,\n frameUrl: requestUrl,\n frameDomain: getDomain(requestUrl),\n requestType: contentType,\n timestamp,\n rule,\n },\n });\n }\n });\n if (isModified) {\n requestContextStorage.update(requestId, { requestHeaders });\n }\n return isModified;\n }\n /**\n * On headers received handler.\n * Removes response headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n onHeadersReceived(context) {\n const { responseHeaders, matchingResult, tabId, requestUrl, requestId, contentType, timestamp, } = context;\n if (!responseHeaders || !matchingResult) {\n return false;\n }\n const rules = matchingResult.getRemoveHeaderRules();\n if (rules.length === 0) {\n return false;\n }\n let isModified = false;\n rules.forEach((rule) => {\n if (HeadersService.applyRule(responseHeaders, rule, false)) {\n isModified = true;\n this.filteringLog.publishEvent({\n type: FilteringEventType.RemoveHeader,\n data: {\n removeHeader: true,\n headerName: rule.getAdvancedModifierValue(),\n eventId: nanoid(),\n tabId,\n requestUrl,\n frameUrl: requestUrl,\n frameDomain: getDomain(requestUrl),\n requestType: contentType,\n timestamp,\n rule,\n },\n });\n }\n });\n if (isModified) {\n requestContextStorage.update(requestId, { responseHeaders });\n }\n return isModified;\n }\n /**\n * Applies rule to headers. Removes header from headers if rule matches.\n * Important: this method modifies headers array as they are passed by reference.\n *\n * @param headers Headers.\n * @param rule Rule to apply if it has remove header modifier.\n * @param isRequestHeaders Is request headers.\n * @returns True if headers removed by rule.\n */\n static applyRule(headers, rule, isRequestHeaders) {\n const modifier = rule.getAdvancedModifier();\n if (!modifier) {\n return false;\n }\n const headerName = modifier.getApplicableHeaderName(isRequestHeaders);\n if (!headerName) {\n return false;\n }\n return removeHeader(headers, headerName);\n }\n}\nconst headersService = new HeadersService(defaultFilteringLog);\n\n/**\n * Params filtering service module.\n */\nclass ParamsService {\n /**\n * Constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.filteringLog = filteringLog;\n }\n /**\n * Removes request params from url, stored in request context.\n *\n * @param requestId Request id.\n * @returns Modified url or null.\n */\n getPurgedUrl(requestId) {\n const context = requestContextStorage.get(requestId);\n if (!context) {\n return null;\n }\n const { matchingResult, method, requestUrl, contentType, timestamp, } = context;\n if (!matchingResult || !ParamsService.isMethodSupported(method)) {\n return null;\n }\n const removeParamRules = matchingResult.getRemoveParamRules();\n if (removeParamRules.length === 0) {\n return null;\n }\n const purgedUrl = removeParamRules.reduce((url, rule) => {\n if (rule.isAllowlist()) {\n return url;\n }\n const modifier = rule.getAdvancedModifier();\n const modifiedUrl = modifier.removeParameters(url);\n if (url !== modifiedUrl) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.RemoveParam,\n data: {\n removeParam: true,\n eventId: nanoid(),\n tabId: context.tabId,\n requestUrl: modifiedUrl,\n frameUrl: modifiedUrl,\n frameDomain: getDomain(modifiedUrl),\n requestType: contentType,\n rule,\n timestamp,\n },\n });\n }\n return modifier.removeParameters(url);\n }, requestUrl);\n if (purgedUrl === requestUrl) {\n return null;\n }\n return purgedUrl;\n }\n /**\n * Checks if we support requests for specified method.\n *\n * @param method Request method.\n * @returns True if method supported.\n */\n static isMethodSupported(method) {\n return ParamsService.SupportedMethods.includes(method.toUpperCase());\n }\n}\nParamsService.SupportedMethods = ['GET', 'OPTIONS', 'HEAD'];\nconst paramsService = new ParamsService(defaultFilteringLog);\n\n/**\n * Cookie rules manager class.\n */\nclass CookieRulesFinder {\n /**\n * Filters blocking rules.\n * Used in content scripts.\n *\n * @param url Request url.\n * @param rules List of rules.\n * @returns Blocking rules.\n */\n static getBlockingRules(url, rules) {\n return rules.filter((rule) => !CookieRulesFinder.isModifyingRule(rule));\n }\n /**\n * Finds a rule that doesn't modify cookie:\n * i.e.: this rule cancels cookie or if it's an allowlist rule.\n *\n * @param cookieName Cookie name.\n * @param rules List of network rules.\n * @param isThirdPartyCookie Flag that indicates if cookie is third-party.\n * @returns Found rule or null.\n */\n static lookupNotModifyingRule(cookieName, rules, isThirdPartyCookie) {\n const blockingRules = [];\n const allowlistRules = [];\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n if (!CookieRulesFinder.matchThirdParty(rule, isThirdPartyCookie)) {\n continue;\n }\n const cookieModifier = rule.getAdvancedModifier();\n if (cookieModifier.matches(cookieName) && !CookieRulesFinder.isModifyingRule(rule)) {\n if (rule.isAllowlist()) {\n allowlistRules.push(rule);\n }\n else {\n blockingRules.push(rule);\n }\n }\n }\n if (allowlistRules.length > 0) {\n return allowlistRules[0];\n }\n if (blockingRules.length > 0) {\n return blockingRules[0];\n }\n return null;\n }\n /**\n * Finds rules that modify cookie.\n *\n * @param cookieName Cookie name.\n * @param rules Matching rules.\n * @param isThirdPartyCookie Flag that indicates if cookie is third-party.\n * @returns Modifying rules.\n */\n static lookupModifyingRules(cookieName, rules, isThirdPartyCookie) {\n const result = [];\n const allowlistRules = [];\n if (rules && rules.length > 0) {\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n if (!CookieRulesFinder.matchThirdParty(rule, isThirdPartyCookie)) {\n continue;\n }\n const cookieModifier = rule.getAdvancedModifier();\n if (!cookieModifier.matches(cookieName)) {\n continue;\n }\n if (!rule.isAllowlist() && !CookieRulesFinder.isModifyingRule(rule)) {\n return [];\n }\n if (rule.isAllowlist()) {\n allowlistRules.push(rule);\n }\n else {\n result.push(rule);\n }\n }\n }\n if (allowlistRules.length > 0) {\n return allowlistRules;\n }\n return result;\n }\n /**\n * Checks if rule and third party flag matches.\n *\n * @param rule Rule.\n * @param isThirdParty Flag that indicates if cookie is third-party.\n * @returns True if rule and third party flag matches.\n */\n static matchThirdParty(rule, isThirdParty) {\n if (!rule.isOptionEnabled(NetworkRuleOption.ThirdParty)) {\n return true;\n }\n return isThirdParty === rule.isOptionEnabled(NetworkRuleOption.ThirdParty);\n }\n /**\n * Checks if $cookie rule is modifying.\n *\n * @param rule $cookie rule.\n * @returns True if rule is modifying.\n */\n static isModifyingRule(rule) {\n const cookieModifier = rule.getAdvancedModifier();\n return cookieModifier.getSameSite() !== null\n || (cookieModifier.getMaxAge() !== null && cookieModifier.getMaxAge() > 0);\n }\n}\n\n/**\n * Synthetic Cookie-like object parsed from headers.\n */\nclass ParsedCookie {\n /**\n * Constructor.\n *\n * @param name Cookie name.\n * @param value Cookie value.\n * @param url Url.\n */\n constructor(name, value, url) {\n /**\n * Cookie's third-party status.\n */\n this.thirdParty = false;\n this.name = name;\n this.value = value;\n this.url = url;\n this.path = new URL(url).pathname;\n }\n /**\n * Creates new {@link ParsedCookie} from provided {@link Cookies.Cookie}.\n *\n * @param cookie Item of {@link Cookies.Cookie}.\n * @param url String URL relative to this cookie.\n *\n * @returns New {@link ParsedCookie}.\n */\n static fromBrowserCookie(cookie, url) {\n const parsedCookie = new ParsedCookie(cookie.name, cookie.value, url);\n parsedCookie.thirdParty = !cookie.firstPartyDomain;\n parsedCookie.httpOnly = cookie.httpOnly;\n parsedCookie.secure = cookie.secure;\n parsedCookie.sameSite = cookie.sameSite;\n // For hostOnly cookie domain should be empty and path should be '/'.\n if (cookie.hostOnly) {\n parsedCookie.path = '/';\n }\n else {\n parsedCookie.domain = cookie.domain;\n parsedCookie.path = cookie.path;\n }\n if (cookie.expirationDate) {\n // cookie.expirationDate is a number of seconds that's why it should be multiplied\n parsedCookie.expires = new Date(cookie.expirationDate * 1000);\n }\n return parsedCookie;\n }\n}\n\n/**\n * Cookie Utils.\n */\nclass CookieUtils {\n /**\n * Parses set-cookie header from http response header.\n *\n * @param header HTTP response header.\n * @param url Request URL.\n * @returns Parsed cookie or null if it failed to parse the header.\n */\n static parseSetCookieHeader(header, url) {\n if (!header.name || header.name.toLowerCase() !== 'set-cookie') {\n return null;\n }\n if (!header.value) {\n return null;\n }\n return CookieUtils.parseSetCookie(header.value, url);\n }\n /**\n * Parses set-cookie headers for cookie objects.\n *\n * @param responseHeaders HTTP response headers.\n * @param url Request URL.\n * @returns Array of parsed cookies.\n */\n static parseSetCookieHeaders(responseHeaders, url) {\n const result = [];\n let iResponseHeaders = responseHeaders.length;\n while (iResponseHeaders > 0) {\n iResponseHeaders -= 1;\n const header = responseHeaders[iResponseHeaders];\n const setCookie = CookieUtils.parseSetCookieHeader(header, url);\n if (setCookie) {\n result.push(setCookie);\n }\n }\n return result;\n }\n /**\n * Parse an HTTP Cookie header string and return an object with all cookie name-value pairs.\n *\n * @param cookieValue HTTP Cookie value.\n * @param url Request URL.\n * @returns Array of cookie name-value pairs.\n */\n static parseCookies(cookieValue, url) {\n const cookies = [];\n // Split Cookie values\n const pairs = cookieValue.split(/; */);\n for (let i = 0; i < pairs.length; i += 1) {\n const pair = pairs[i];\n const eqIdx = pair.indexOf('=');\n // skip things that don't look like key=value\n if (eqIdx < 0) {\n continue;\n }\n const key = pair.substring(0, eqIdx).trim();\n const value = pair.substring(eqIdx + 1, pair.length).trim();\n const parsedCookie = new ParsedCookie(key, value, url);\n /**\n * Not obviously there are few special name prefixes.\n *\n * @see {@link https://developer.cdn.mozilla.net/pt-BR/docs/Web/HTTP/Headers/Set-Cookie}\n */\n if (key.startsWith('__Secure-') || key.startsWith('__Host-')) {\n parsedCookie.secure = true;\n }\n cookies.push(parsedCookie);\n }\n return cookies;\n }\n /**\n * Parses \"Set-Cookie\" header value and returns a cookie object with its properties.\n *\n * @param setCookieValue \"Set-Cookie\" header value to parse.\n * @param url Request URL.\n * @returns Parsed cookie or null if it failed to parse the value.\n */\n static parseSetCookie(setCookieValue, url) {\n const parts = setCookieValue.split(';').filter((s) => !!s);\n const nameValuePart = parts.shift();\n if (!nameValuePart) {\n logger.debug(`Cannot shift first name-value pair from Set-Cookie header '${setCookieValue}'.`);\n return null;\n }\n const nameValue = nameValuePart.split('=');\n const name = nameValue.shift();\n if (!name) {\n logger.debug(`Cannot extract name from first name-value pair from Set-Cookie header '${setCookieValue}'.`);\n return null;\n }\n // Everything after the first =, joined by a \"=\" if there was more\n // than one part.\n const value = nameValue.join('=');\n const cookie = new ParsedCookie(name, value, url);\n parts.forEach((part) => {\n const sides = part.split('=');\n const key = sides\n .shift()\n .trimStart()\n .toLowerCase();\n const optionValue = sides.join('=');\n if (key === 'expires') {\n cookie.expires = new Date(optionValue);\n }\n else if (key === 'max-age') {\n cookie.maxAge = parseInt(optionValue, 10);\n }\n else if (key === 'secure') {\n cookie.secure = true;\n }\n else if (key === 'httponly') {\n cookie.httpOnly = true;\n }\n else if (key === 'samesite') {\n cookie.sameSite = optionValue;\n }\n else if (key === 'path') {\n cookie.path = optionValue;\n }\n else if (key === 'domain') {\n cookie.domain = optionValue;\n }\n });\n return cookie;\n }\n /**\n * Updates cookie maxAge value.\n *\n * @param cookie Cookie to modify.\n * @param maxAge New maxAge value.\n * @returns True if cookie was modified.\n */\n static updateCookieMaxAge(cookie, maxAge) {\n const currentTimeSec = Date.now() / 1000;\n let cookieExpiresTimeSec = null;\n if (cookie.maxAge) {\n cookieExpiresTimeSec = currentTimeSec + cookie.maxAge;\n }\n else if (cookie.expires) {\n cookieExpiresTimeSec = cookie.expires.getTime() / 1000;\n }\n const newCookieExpiresTimeSec = currentTimeSec + maxAge;\n if (cookieExpiresTimeSec === null || cookieExpiresTimeSec > newCookieExpiresTimeSec) {\n // eslint-disable-next-line no-param-reassign\n cookie.expires = new Date(newCookieExpiresTimeSec * 1000);\n // eslint-disable-next-line no-param-reassign\n cookie.maxAge = maxAge;\n return true;\n }\n return false;\n }\n /**\n * Serializes cookie data into a string suitable for Set-Cookie header.\n *\n * @param cookie A cookie object.\n * @returns Set-Cookie string or null if it failed to serialize object.\n * @throws {TypeError} Thrown in case of invalid input data.\n */\n static serializeCookieToResponseHeader(cookie) {\n if (!cookie) {\n throw new TypeError('empty cookie data');\n }\n // 1. Validate fields\n if (!CookieUtils.FIELD_CONTENT_REGEX.test(cookie.name)) {\n throw new TypeError(`Cookie name is invalid: ${cookie.name}`);\n }\n if (cookie.value && !CookieUtils.FIELD_CONTENT_REGEX.test(cookie.value)) {\n throw new TypeError(`Cookie value is invalid: ${cookie.value}`);\n }\n if (cookie.domain && !CookieUtils.FIELD_CONTENT_REGEX.test(cookie.domain)) {\n throw new TypeError(`Cookie domain is invalid: ${cookie.domain}`);\n }\n if (cookie.path && !CookieUtils.FIELD_CONTENT_REGEX.test(cookie.path)) {\n throw new TypeError(`Cookie path is invalid: ${cookie.path}`);\n }\n if (cookie.expires && typeof cookie.expires.toUTCString !== 'function') {\n throw new TypeError(`Cookie expires is invalid: ${cookie.expires}`);\n }\n // 2. Build Set-Cookie header value\n let setCookieValue = `${cookie.name}=${cookie.value}`;\n if (typeof cookie.maxAge === 'number' && !Number.isNaN(cookie.maxAge)) {\n setCookieValue += `; Max-Age=${Math.floor(cookie.maxAge)}`;\n }\n if (cookie.domain) {\n setCookieValue += `; Domain=${cookie.domain}`;\n }\n if (cookie.path) {\n setCookieValue += `; Path=${cookie.path}`;\n }\n if (cookie.expires) {\n setCookieValue += `; Expires=${cookie.expires.toUTCString()}`;\n }\n if (cookie.httpOnly) {\n setCookieValue += '; HttpOnly';\n }\n if (cookie.secure) {\n setCookieValue += '; Secure';\n }\n if (cookie.sameSite) {\n const sameSite = cookie.sameSite.toLowerCase();\n switch (sameSite) {\n case 'lax':\n setCookieValue += '; SameSite=Lax';\n break;\n case 'strict':\n setCookieValue += '; SameSite=Strict';\n break;\n case 'none':\n setCookieValue += '; SameSite=None';\n break;\n default:\n throw new TypeError(`Cookie sameSite is invalid: ${cookie.sameSite}`);\n }\n }\n // Not affected. Let it be here just in case\n // https://bugs.chromium.org/p/chromium/issues/detail?id=232693\n if (cookie.priority) {\n setCookieValue += `; Priority=${cookie.priority}`;\n }\n return setCookieValue;\n }\n /**\n * Serializes cookie data into a string suitable for Cookie header.\n *\n * @param cookies Array with {@link ParsedCookie}.\n * @returns Cookie string or null if it failed to serialize object.\n */\n static serializeCookieToRequestHeader(cookies) {\n return cookies\n .map((cookie) => `${cookie.name}=${cookie.value}`)\n .join('; ');\n }\n}\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2.\n *\n * Example:\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF.\n */\n// eslint-disable-next-line no-control-regex\nCookieUtils.FIELD_CONTENT_REGEX = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\n/**\n * Cookie api implementation.\n */\nclass BrowserCookieApi {\n /**\n * Removes cookie.\n *\n * @param name Cookie name.\n * @param url Request url.\n * @returns True if cookie was removed.\n */\n removeCookie(name, url) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield browser.cookies.remove({ name, url });\n return true;\n }\n catch (e) {\n logger.error(e.message);\n }\n return false;\n });\n }\n /**\n * Updates cookie.\n *\n * @param cookie Cookie for update.\n */\n modifyCookie(cookie) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const update = BrowserCookieApi.convertToSetDetailsType(cookie);\n yield browser.cookies.set(update);\n return true;\n }\n catch (e) {\n logger.error(e.message);\n }\n return false;\n });\n }\n /**\n * Search for cookies that match a given pattern.\n *\n * @param pattern Pattern of cookies to find.\n *\n * @returns List of found cookies.\n */\n findCookies(pattern) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const found = yield browser.cookies.getAll(pattern);\n return found;\n }\n catch (e) {\n logger.error(e.message);\n }\n return [];\n });\n }\n /**\n * Converts cookie to SetDetailsType.\n *\n * @param cookie Cookie for convert.\n * @returns SetDetailsType.\n */\n static convertToSetDetailsType(cookie) {\n return {\n /**\n * The request-URI to associate with the setting of the cookie.\n * This value can affect the default domain and path values of the created cookie.\n * If host permissions for this URL are not specified in the manifest file, the API call will fail.\n */\n url: cookie.url,\n /**\n * The name of the cookie. Empty by default if omitted.\n */\n name: cookie.name,\n /**\n * The value of the cookie. Empty by default if omitted.\n */\n value: cookie.value,\n /**\n * The domain of the cookie. If omitted, the cookie becomes a host-only cookie.\n */\n domain: cookie.domain,\n /**\n * Whether the cookie should be marked as Secure. Defaults to false.\n */\n secure: cookie.secure,\n /**\n * Whether the cookie should be marked as HttpOnly. Defaults to false.\n */\n httpOnly: cookie.httpOnly,\n /**\n * The cookie's same-site status.\n */\n sameSite: BrowserCookieApi.getSameSiteStatus(cookie.sameSite),\n /**\n * The expiration date of the cookie as the number of seconds since the UNIX epoch.\n * If omitted, the cookie becomes a session cookie.\n */\n expirationDate: cookie.expires\n ? Math.floor(cookie.expires.getTime() / 1000)\n : undefined,\n /**\n * The path of the cookie. Defaults to the path portion of the url parameter.\n */\n path: cookie.path,\n };\n }\n /**\n * Returns same-site type.\n *\n * @param sameSite Same-site string.\n * @returns Same-site status or undefined if same-site is not specified.\n */\n static getSameSiteStatus(sameSite) {\n if (sameSite) {\n if (sameSite.toLowerCase() === 'lax') {\n return 'lax';\n }\n if (sameSite.toLowerCase() === 'strict') {\n return 'strict';\n }\n }\n return undefined;\n }\n}\n\n/**\n * Cookie filtering.\n *\n * The following public methods should be set as suitable webrequest events listeners, check sample extension in this\n * repo for an example.\n *\n * Logic introduction:\n * onBeforeSendHeaders:\n * - get all cookies for request url;\n * - store cookies (first-party);\n *\n * onHeadersReceived:\n * - parse set-cookie header, only to detect if the cookie in header will be set from third-party request;\n * - save third-party flag for this cookie cookie.thirdParty=request.thirdParty;\n * - apply rules via removing them from headers and removing them with browser.cookies api;\n * TODO Rewrite/split method for extensions on MV3, because we wont have possibility to remove rules via headers.\n *\n * onCompleted\n * - apply rules via content script\n * In content-scripts (check /src/content-script/cookie-controller.ts):\n * - get matching cookie rules\n * - apply\n */\nclass CookieFiltering {\n /**\n * Constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.browserCookieApi = new BrowserCookieApi();\n this.filteringLog = filteringLog;\n }\n /**\n * Parses cookies from headers.\n *\n * @param context Request context.\n *\n * @returns True if headers were modified.\n */\n onBeforeSendHeaders(context) {\n const { requestHeaders, requestUrl, requestId } = context;\n if (!requestHeaders || !requestUrl) {\n return false;\n }\n const cookieHeader = findHeaderByName(requestHeaders, 'Cookie');\n if (!(cookieHeader === null || cookieHeader === void 0 ? void 0 : cookieHeader.value)) {\n return false;\n }\n const cookies = CookieUtils.parseCookies(cookieHeader.value, requestUrl);\n if (cookies.length === 0) {\n return false;\n }\n // Saves cookies to context\n requestContextStorage.update(requestId, { cookies });\n // Removes cookies from browser with browser.cookies api, but not\n // removing them from context to correct process them in headers.\n // IMPORTANT: This method reads cookies from context, so it should be\n // called before method that change headers, since that method will\n // remove or change headers in context.\n this.applyRules(context)\n .catch((e) => {\n logger.error(e.message);\n });\n // Removes cookie from headers and updates context.\n // Note: this method won't work in the extension build with manifest v3.\n const headersModified = this.applyRulesToRequestCookieHeaders(context);\n return headersModified;\n }\n /**\n * Applies cookies to request headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n applyRulesToRequestCookieHeaders(context) {\n let headersModified = false;\n const { requestHeaders, cookies, matchingResult, requestUrl, thirdParty, tabId, requestId, } = context;\n if (!requestHeaders\n || !matchingResult\n || !requestUrl\n || typeof thirdParty !== 'boolean'\n || !cookies) {\n return headersModified;\n }\n const cookieRules = matchingResult.getCookieRules();\n for (let i = 0; i < cookies.length; i += 1) {\n const cookie = cookies[i];\n if (!cookie) {\n continue;\n }\n const bRule = CookieRulesFinder.lookupNotModifyingRule(cookie.name, cookieRules, thirdParty);\n if (bRule) {\n if (!bRule.isAllowlist()) {\n // Remove from cookies array.\n cookies.splice(i, 1);\n // Move the loop counter back because we removed one element\n // from the iterated array.\n i -= 1;\n headersModified = true;\n }\n this.recordCookieEvent(tabId, cookie, requestUrl, bRule, false, thirdParty);\n }\n const mRules = CookieRulesFinder.lookupModifyingRules(cookie.name, cookieRules, thirdParty);\n if (mRules.length > 0) {\n const appliedRules = CookieFiltering.applyRuleToBrowserCookie(cookie, mRules);\n if (appliedRules.length > 0) {\n headersModified = true;\n }\n appliedRules.forEach((r) => {\n this.recordCookieEvent(tabId, cookie, requestUrl, r, true, thirdParty);\n });\n }\n }\n if (headersModified) {\n const cookieHeaderIndex = requestHeaders.findIndex((header) => header.name.toLowerCase() === 'cookie');\n if (cookieHeaderIndex !== -1) {\n if (cookies.length > 0) {\n // Update \"cookie\" header before send request to server.\n requestHeaders[cookieHeaderIndex].value = CookieUtils.serializeCookieToRequestHeader(cookies);\n }\n else {\n // Empty cookies, delete header \"Cookie\".\n requestHeaders.splice(cookieHeaderIndex, 1);\n }\n }\n // Update headers and cookies in context.\n requestContextStorage.update(requestId, { requestHeaders, cookies });\n }\n return headersModified;\n }\n /**\n * Applies cookies to response headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n applyRulesToResponseCookieHeaders(context) {\n let headersModified = false;\n const { responseHeaders, matchingResult, requestUrl, thirdParty, tabId, requestId, } = context;\n if (!responseHeaders\n || !matchingResult\n || !requestUrl\n || typeof thirdParty !== 'boolean') {\n return headersModified;\n }\n const cookieRules = matchingResult.getCookieRules();\n for (let i = responseHeaders.length - 1; i >= 0; i -= 1) {\n const header = responseHeaders[i];\n const cookie = CookieUtils.parseSetCookieHeader(header, requestUrl);\n if (!cookie) {\n continue;\n }\n const bRule = CookieRulesFinder.lookupNotModifyingRule(cookie.name, cookieRules, thirdParty);\n if (bRule) {\n if (!bRule.isAllowlist()) {\n responseHeaders.splice(i, 1);\n headersModified = true;\n }\n this.recordCookieEvent(tabId, cookie, requestUrl, bRule, false, thirdParty);\n }\n const mRules = CookieRulesFinder.lookupModifyingRules(cookie.name, cookieRules, thirdParty);\n if (mRules.length > 0) {\n const appliedRules = CookieFiltering.applyRuleToBrowserCookie(cookie, mRules);\n if (appliedRules.length > 0) {\n headersModified = true;\n responseHeaders[i] = {\n name: 'set-cookie',\n value: CookieUtils.serializeCookieToResponseHeader(cookie),\n };\n appliedRules.forEach((r) => {\n this.recordCookieEvent(tabId, cookie, requestUrl, r, true, thirdParty);\n });\n }\n }\n }\n if (headersModified) {\n requestContextStorage.update(requestId, { responseHeaders });\n }\n return headersModified;\n }\n /**\n * Parses set-cookie header and looks up third-party cookies.\n * This callback won't work for mv3 extensions.\n * TODO separate or rewrite to mv2 and mv3 methods.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n onHeadersReceived(context) {\n const { responseHeaders, requestUrl, thirdParty, requestId, } = context;\n if (responseHeaders\n && requestUrl\n && typeof thirdParty === 'boolean') {\n const cookies = CookieUtils.parseSetCookieHeaders(responseHeaders, requestUrl);\n const newCookies = cookies.filter((c) => { var _a; return !((_a = context.cookies) === null || _a === void 0 ? void 0 : _a.includes(c)); });\n for (const cookie of newCookies) {\n cookie.thirdParty = thirdParty;\n }\n requestContextStorage.update(requestId, {\n cookies: context.cookies ? [...context.cookies, ...newCookies] : newCookies,\n });\n }\n // Removes cookies from browser with browser.cookies api, but not\n // removing them from context to correct process them in headers.\n // IMPORTANT: This method reads cookies from context, so it should be\n // called before method that change headers, since that method will\n // remove or change headers in context.\n this.applyRules(context)\n .catch((e) => {\n logger.error(e.message);\n });\n // Remove cookie headers.\n // This method won't work in the extension build with manifest v3.\n const headersModified = this.applyRulesToResponseCookieHeaders(context);\n return headersModified;\n }\n /**\n * TODO: Return engine startup status data to content script\n * to delay execution of cookie rules until the engine is ready\n *\n * Looks up blocking rules for content-script in frame context.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @returns List of blocking rules.\n */\n getBlockingRules(tabId, frameId) {\n const frame = tabsApi.getTabFrame(tabId, frameId);\n if (!frame || !frame.matchingResult) {\n return [];\n }\n const cookieRules = frame.matchingResult.getCookieRules();\n return CookieRulesFinder.getBlockingRules(frame.url, cookieRules);\n }\n /**\n * Applies rules.\n *\n * @param context Request context.\n */\n applyRules(context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { matchingResult, cookies, requestUrl, tabId, } = context;\n if (!matchingResult || !cookies) {\n return;\n }\n const cookieRules = matchingResult.getCookieRules();\n const promises = cookies.map((cookie) => __awaiter(this, void 0, void 0, function* () {\n yield this.applyRulesToCookie(cookie, cookieRules, requestUrl, tabId);\n }));\n yield Promise.all(promises);\n });\n }\n /**\n * Attempts to find a \"parent\" cookie with a wider \"path\" field,\n * the scope of which includes the specified cookie from\n * the function parameters.\n *\n * This needs to prevent create of multiple \"child\"-cookies\n * and only modified expiration of general \"parent\"-cookie,\n * which covered \"children\"-cookies by 'path' value.\n *\n * @param cookie Cookie, for which need to find the \"parent\" cookie.\n *\n * @returns Item of parent cookie {@link ParsedCookie} or null if not found.\n */\n findParentCookie(cookie) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const pattern = {\n url: cookie.url,\n name: cookie.name,\n domain: cookie.domain,\n secure: cookie.secure,\n };\n const parentCookies = yield this.browserCookieApi.findCookies(pattern);\n const sortedParentCookies = parentCookies.sort((a, b) => a.path.length - b.path.length);\n for (let i = 0; i < sortedParentCookies.length; i += 1) {\n const parentCookie = sortedParentCookies[i];\n if ((_a = cookie.path) === null || _a === void 0 ? void 0 : _a.startsWith(parentCookie.path)) {\n return ParsedCookie.fromBrowserCookie(parentCookie, cookie.url);\n }\n }\n return null;\n });\n }\n /**\n * Applies rules to cookie.\n *\n * @param cookie Cookie.\n * @param cookieRules Cookie rules.\n * @param requestUrl Request URL, needs to record filtering event.\n * @param tabId Tab id.\n */\n applyRulesToCookie(cookie, cookieRules, requestUrl, tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n const cookieName = cookie.name;\n const isThirdPartyCookie = cookie.thirdParty;\n const bRule = CookieRulesFinder.lookupNotModifyingRule(cookieName, cookieRules, isThirdPartyCookie);\n if (bRule) {\n if (bRule.isAllowlist() || (yield this.browserCookieApi.removeCookie(cookie.name, cookie.url))) {\n this.recordCookieEvent(tabId, cookie, requestUrl, bRule, false, isThirdPartyCookie);\n }\n return;\n }\n const mRules = CookieRulesFinder.lookupModifyingRules(cookieName, cookieRules, isThirdPartyCookie);\n if (mRules.length > 0) {\n // Try to find \"parent\" cookie and modify it instead of creating\n // \"child copy\" cookie.\n const parentCookie = yield this.findParentCookie(cookie);\n const cookieToModify = parentCookie || cookie;\n const appliedRules = CookieFiltering.applyRuleToBrowserCookie(cookieToModify, mRules);\n if (appliedRules.length > 0) {\n if (yield this.browserCookieApi.modifyCookie(cookieToModify)) {\n appliedRules.forEach((r) => {\n this.recordCookieEvent(tabId, cookieToModify, requestUrl, r, true, isThirdPartyCookie);\n });\n }\n }\n }\n });\n }\n /**\n * Modifies instance of {@link ParsedCookie} with provided rules.\n *\n * @param cookie Cookie modify.\n * @param rules Cookie matching rules.\n * @returns Applied rules.\n */\n static applyRuleToBrowserCookie(cookie, rules) {\n const appliedRules = [];\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n if (rule.isAllowlist()) {\n appliedRules.push(rule);\n continue;\n }\n const cookieModifier = rule.getAdvancedModifier();\n let modified = false;\n const sameSite = cookieModifier.getSameSite();\n if (sameSite && cookie.sameSite !== sameSite) {\n // eslint-disable-next-line no-param-reassign\n cookie.sameSite = sameSite;\n modified = true;\n }\n const maxAge = cookieModifier.getMaxAge();\n if (maxAge) {\n if (CookieUtils.updateCookieMaxAge(cookie, maxAge)) {\n modified = true;\n }\n }\n if (modified) {\n appliedRules.push(rule);\n }\n }\n return appliedRules;\n }\n /**\n * Records cookie event to filtering log.\n *\n * @param tabId Id of the tab.\n * @param cookie Item of {@link ParsedCookie}.\n * @param requestUrl URL of the request.\n * @param rule Applied modifying or deleting rule.\n * @param isModifyingCookieRule Is applied rule modifying or not.\n * @param requestThirdParty Whether request third party or not.\n */\n recordCookieEvent(tabId, cookie, requestUrl, rule, isModifyingCookieRule, requestThirdParty) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.Cookie,\n data: {\n eventId: nanoid(),\n tabId,\n cookieName: cookie.name,\n cookieValue: cookie.value,\n frameDomain: getDomain$1(requestUrl) || requestUrl,\n rule,\n isModifyingCookieRule,\n requestThirdParty,\n timestamp: Date.now(),\n requestType: ContentType.Cookie,\n },\n });\n }\n}\nconst cookieFiltering = new CookieFiltering(defaultFilteringLog);\n\n/**\n * Document parser wrapper.\n */\nclass DocumentParser {\n /**\n * Constructor.\n */\n constructor() {\n // eslint-disable-next-line no-undef\n this.parser = new DOMParser();\n const errorneousParse = this.parser.parseFromString('<', 'text/xml');\n this.parsererrorNS = errorneousParse.getElementsByTagName('parsererror')[0].namespaceURI;\n }\n /**\n * Checks for parse errors.\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMParser#Error_handling}.\n *\n * @param parsedDocument Parsed document.\n * @returns True if document cannot be parsed.\n */\n isParseError(parsedDocument) {\n if (this.parsererrorNS === 'http://www.w3.org/1999/xhtml') {\n return parsedDocument.getElementsByTagName('parsererror').length > 0;\n }\n return parsedDocument.getElementsByTagNameNS(this.parsererrorNS, 'parsererror').length > 0;\n }\n /**\n * Parse html to document.\n *\n * @param html HTML content.\n * @returns Document or null if parse error occurred.\n */\n parse(html) {\n const doc = this.parser.parseFromString(html, 'text/html');\n if (this.isParseError(doc)) {\n return null;\n }\n return doc;\n }\n}\nconst documentParser = new DocumentParser();\n\n/**\n * Html rule wildcard.\n */\nclass Wildcard {\n /**\n * Constructor.\n *\n * @param pattern Wildcard pattern.\n */\n constructor(pattern) {\n this.regexp = new RegExp(Wildcard.wildcardToRegex(pattern), 'i');\n this.shortcut = Wildcard.extractShortcut(pattern);\n }\n /**\n * Returns 'true' if input text is matching wildcard.\n * This method first checking shortcut -- if shortcut exists in input string -- than it checks regexp.\n *\n * @param input Input string.\n * @returns Boolean if input string matches wildcard.\n */\n matches(input) {\n if (!input) {\n return false;\n }\n if (input.toLowerCase().indexOf(this.shortcut) < 0) {\n return false;\n }\n return this.regexp.test(input);\n }\n /**\n * Converts wildcard to regular expression.\n *\n * @param pattern The wildcard pattern to convert.\n * @returns A regex equivalent of the given wildcard.\n */\n static wildcardToRegex(pattern) {\n const specials = [\n '\\\\', '*', '+', '?', '|', '{', '}', '[', ']', '(', ')', '^', '$', '.', '#',\n ];\n const specialsRegex = new RegExp(`[${specials.join('\\\\')}]`, 'g');\n let result = pattern.replace(specialsRegex, '\\\\$&');\n result = replaceAll(result, '\\\\*', '[\\\\s\\\\S]*');\n result = replaceAll(result, '\\\\?', '.');\n return `^${result}$`;\n }\n /**\n * Extracts the longest string that does not contain \"*\" or \"?\" symbols.\n *\n * @param pattern Wildcard pattern.\n * @returns Longest string without special symbols.\n */\n static extractShortcut(pattern) {\n const wildcardChars = ['*', '?'];\n let startIndex = 0;\n let endIndex = indexOfAny(pattern, wildcardChars);\n if (endIndex < 0) {\n return pattern.toLowerCase();\n }\n let shortcut = endIndex === startIndex ? '' : pattern.substring(startIndex, endIndex - startIndex);\n while (endIndex >= 0) {\n startIndex = startIndex + endIndex + 1;\n if (pattern.length <= startIndex) {\n break;\n }\n endIndex = indexOfAny(pattern.substring(startIndex), wildcardChars);\n // eslint-disable-next-line max-len\n const tmpShortcut = endIndex < 0 ? pattern.substring(startIndex) : pattern.substring(startIndex, endIndex + startIndex);\n if (tmpShortcut.length > shortcut.length) {\n shortcut = tmpShortcut;\n }\n }\n return shortcut.toLowerCase();\n }\n}\n\n/**\n * Html rule attributes.\n *\n * @example\n * rule = [domains] \"$$\" tagName [attributes]\n * domains = [domain0, domain1[, ...[, domainN]]]\n * attributes = \"[\" name0 = value0 \"]\" \"[\" name1 = value2 \"]\" ... \"[\" nameN = valueN \"]\"\n *\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules-syntax-1\n */\nclass HtmlRuleAttributes {\n}\n\n/**\n * Encapsulates html rule attributes parsing.\n */\nclass HtmlRuleParser {\n /**\n * Parses html rule.\n *\n * @param rule Rule to parse.\n * @returns Parsed rule attributes.\n */\n static parse(rule) {\n const result = new HtmlRuleAttributes();\n result.parentSearchLevel = HtmlRuleParser.DEFAULT_PARENT_SEARCH_LEVEL;\n result.maxLength = HtmlRuleParser.DEFAULT_MAX_LENGTH;\n const ruleContent = rule.getContent();\n let htmlAttributesStartIndex = ruleContent.indexOf(HtmlRuleParser.ATTRIBUTE_START_MARK);\n // Cutting tag name from string\n if (htmlAttributesStartIndex === -1) {\n result.tagName = ruleContent;\n }\n else {\n result.tagName = ruleContent.substring(0, htmlAttributesStartIndex);\n }\n const selector = [result.tagName];\n // Loading attributes filter\n while (htmlAttributesStartIndex !== -1) {\n const equalityIndex = ruleContent.indexOf('=', htmlAttributesStartIndex + 1);\n const quoteStartIndex = ruleContent.indexOf(HtmlRuleParser.QUOTES, equalityIndex + 1);\n const quoteEndIndex = HtmlRuleParser.getClosingQuoteIndex(ruleContent, quoteStartIndex + 1);\n if (quoteStartIndex === -1 || quoteEndIndex === -1) {\n break;\n }\n const ruleEndIndex = ruleContent.indexOf(HtmlRuleParser.ATTRIBUTE_END_MARK, quoteEndIndex + 1);\n const attributeName = ruleContent.substring(htmlAttributesStartIndex + 1, equalityIndex);\n let attributeValue = ruleContent.substring(quoteStartIndex + 1, quoteEndIndex);\n attributeValue = replaceAll(attributeValue, '\"\"', '\"');\n switch (attributeName) {\n case HtmlRuleParser.TAG_CONTENT_MASK:\n result.tagContentFilter = attributeValue;\n break;\n case HtmlRuleParser.WILDCARD_MASK:\n result.wildcard = new Wildcard(attributeValue);\n break;\n case HtmlRuleParser.TAG_CONTENT_MAX_LENGTH:\n result.maxLength = parseInt(attributeValue, 10);\n break;\n case HtmlRuleParser.TAG_CONTENT_MIN_LENGTH:\n result.minLength = parseInt(attributeValue, 10);\n break;\n case HtmlRuleParser.PARENT_ELEMENTS:\n result.parentElements = attributeValue.split(',');\n break;\n case HtmlRuleParser.PARENT_SEARCH_LEVEL:\n result.parentSearchLevel = parseInt(attributeValue, 10);\n break;\n default:\n selector.push('[');\n selector.push(attributeName);\n selector.push('*=\"');\n selector.push(attributeValue);\n selector.push('\"]');\n break;\n }\n if (ruleEndIndex === -1) {\n break;\n }\n htmlAttributesStartIndex = ruleContent.indexOf(HtmlRuleParser.ATTRIBUTE_START_MARK, ruleEndIndex + 1);\n }\n result.selector = selector.join('');\n // Validates selector immediately\n // eslint-disable-next-line no-undef\n if (typeof window !== 'undefined') {\n window.document.querySelectorAll(result.selector);\n }\n return result;\n }\n /**\n * Looks up next closing quotation starting from start index.\n * Skips double quotes in text like:\n * [tag-content=\"teas\"\"ernet\"].\n *\n * @param text Text to search.\n * @param startIndex Start index.\n * @returns Index of closing double quotation `\"` found, or `-1` if not found.\n */\n static getClosingQuoteIndex(text, startIndex) {\n let nextChar = HtmlRuleParser.QUOTES;\n let quoteIndex = startIndex - 2;\n while (nextChar === '\"') {\n quoteIndex = text.indexOf(HtmlRuleParser.QUOTES, quoteIndex + 2);\n if (quoteIndex === -1) {\n return -1;\n }\n nextChar = text.length === (quoteIndex + 1) ? '0' : text.charAt(quoteIndex + 1);\n }\n return quoteIndex;\n }\n}\nHtmlRuleParser.ATTRIBUTE_START_MARK = '[';\nHtmlRuleParser.ATTRIBUTE_END_MARK = ']';\nHtmlRuleParser.QUOTES = '\"';\nHtmlRuleParser.TAG_CONTENT_MASK = 'tag-content';\nHtmlRuleParser.WILDCARD_MASK = 'wildcard';\nHtmlRuleParser.TAG_CONTENT_MAX_LENGTH = 'max-length';\nHtmlRuleParser.TAG_CONTENT_MIN_LENGTH = 'min-length';\nHtmlRuleParser.PARENT_ELEMENTS = 'parent-elements';\nHtmlRuleParser.PARENT_SEARCH_LEVEL = 'parent-search-level';\nHtmlRuleParser.DEFAULT_PARENT_SEARCH_LEVEL = 3;\nHtmlRuleParser.DEFAULT_MAX_LENGTH = 8192;\n\n/**\n * Encapsulates document element matching.\n */\nclass HtmlRuleSelector {\n /**\n * Constructor.\n *\n * @param parsedHtmlRule Html rule attributes.\n */\n constructor(parsedHtmlRule) {\n this.ruleAttributes = parsedHtmlRule;\n }\n /**\n * Returns elements matched by provided html rule.\n *\n * @param doc Document object.\n * @returns Array of elements or null.\n */\n getMatchedElements(doc) {\n const elements = doc.querySelectorAll(this.ruleAttributes.selector);\n let result = null;\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n let elementToDelete = null;\n if (this.isFiltered(element)) {\n if (this.ruleAttributes.parentElements) {\n const parentElement = this.searchForParentElement(element);\n if (parentElement) {\n elementToDelete = parentElement;\n }\n }\n else {\n elementToDelete = element;\n }\n if (elementToDelete) {\n if (result === null) {\n result = [];\n }\n result.push(elementToDelete);\n }\n }\n }\n return result;\n }\n /**\n * Checks if element is filtered by provided rule.\n *\n * @param element Element to check.\n * @returns True if element is filtered.\n */\n isFiltered(element) {\n // Checking tag content length limits\n const content = element.innerHTML || '';\n if (this.ruleAttributes.maxLength && this.ruleAttributes.maxLength > 0) {\n // If max-length is set - checking content length (it should be lesser than max length)\n if (content.length > this.ruleAttributes.maxLength) {\n return false;\n }\n }\n if (this.ruleAttributes.minLength && this.ruleAttributes.minLength > 0) {\n // If min-length is set - checking content length (it should be greater than min length)\n if (content.length < this.ruleAttributes.minLength) {\n return false;\n }\n }\n if (!this.ruleAttributes.tagContentFilter && !this.ruleAttributes.wildcard) {\n // Rule does not depend on content\n return true;\n }\n if (!content) {\n return false;\n }\n // Checking tag content against filter\n if (this.ruleAttributes.tagContentFilter && content.indexOf(this.ruleAttributes.tagContentFilter) < 0) {\n return false;\n }\n // Checking tag content against the wildcard\n if (this.ruleAttributes.wildcard && !this.ruleAttributes.wildcard.matches(content)) {\n return false;\n }\n // All filters are passed, tag is filtered\n return true;\n }\n /**\n * Searches for parent element.\n * Suitable parent elements are set by 'parent-elements' attribute.\n * If suitable element found - returns it. Otherwise - returns null.\n *\n * @param element Element evaluated against this rule.\n * @returns Parent element.\n */\n searchForParentElement(element) {\n let parentElement = element.parentNode;\n for (let i = 0; i < this.ruleAttributes.parentSearchLevel; i += 1) {\n if (!parentElement) {\n return null;\n }\n if (this.ruleAttributes.parentElements.indexOf(parentElement.tagName.toLowerCase()) > 0) {\n return parentElement;\n }\n parentElement = parentElement.parentNode;\n }\n return null;\n }\n}\n\n/**\n * Content string filter.\n */\nclass ContentStringFilter {\n /**\n * Creates an instance of ContentStringFilter.\n *\n * @param context Request context.\n * @param htmlRules Html rules.\n * @param replaceRules Replace rules.\n * @param filteringLog Filtering log.\n */\n constructor(context, htmlRules, replaceRules, filteringLog) {\n this.context = context;\n this.htmlRules = htmlRules;\n this.replaceRules = replaceRules;\n this.filteringLog = filteringLog;\n }\n /**\n * Applies Html and Replace rules to content string.\n *\n * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#html-filtering-rules}\n * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#replace-modifier}\n *\n * @param content Content string.\n * @returns Modified content string.\n */\n applyRules(content) {\n if (this.htmlRules && this.htmlRules.length > 0) {\n content = this.applyHtmlRules(content);\n }\n if (this.replaceRules\n && this.replaceRules.length > 0\n // response content is over 3MB, ignore it\n && content.length <= 3 * 1024 * 1024) {\n content = this.applyReplaceRules(content);\n }\n return content;\n }\n /**\n * Applies Html rules to content string.\n *\n * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#html-filtering-rules}\n *\n * @param content Content string.\n * @returns Modified content string.\n */\n applyHtmlRules(content) {\n const doc = documentParser.parse(content);\n if (!doc) {\n return content;\n }\n const deleted = [];\n for (let i = 0; i < this.htmlRules.length; i += 1) {\n const rule = this.htmlRules[i];\n const parsed = HtmlRuleParser.parse(rule);\n const elements = new HtmlRuleSelector(parsed).getMatchedElements(doc);\n if (elements) {\n for (let j = 0; j < elements.length; j += 1) {\n const element = elements[j];\n if (element.parentNode && deleted.indexOf(element) < 0) {\n element.parentNode.removeChild(element);\n const { tabId, requestId, requestUrl, timestamp, contentType, } = this.context;\n this.filteringLog.publishEvent({\n type: FilteringEventType.ApplyCosmeticRule,\n data: {\n tabId,\n eventId: requestId,\n element: element.innerHTML,\n frameUrl: requestUrl,\n rule,\n frameDomain: getDomain(requestUrl),\n requestType: contentType,\n timestamp,\n },\n });\n deleted.push(element);\n }\n }\n }\n }\n // Add \n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/959\n // XMLSerializer is used to serialize doctype object\n // eslint-disable-next-line no-undef\n const doctype = doc.doctype ? `${new XMLSerializer().serializeToString(doc.doctype)}\\r\\n` : '';\n if (deleted.length > 0) {\n return doctype + doc.documentElement.outerHTML;\n }\n return content;\n }\n /**\n * Applies \"replace\" rules to content string.\n *\n * @param content Content string.\n * @returns Modified content string.\n */\n applyReplaceRules(content) {\n const appliedRules = [];\n let modifiedContent = content;\n for (let i = 0; i < this.replaceRules.length; i += 1) {\n const replaceRule = this.replaceRules[i];\n if (replaceRule.isAllowlist()) {\n appliedRules.push(replaceRule);\n }\n else {\n const advancedModifier = replaceRule.getAdvancedModifier();\n modifiedContent = advancedModifier.getApplyFunc()(modifiedContent);\n appliedRules.push(replaceRule);\n }\n }\n const { tabId, requestId } = this.context;\n if (appliedRules.length > 0) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.ReplaceRuleApply,\n data: {\n tabId,\n eventId: requestId,\n rules: appliedRules,\n },\n });\n }\n return modifiedContent;\n }\n}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar encoding$1 = {exports: {}};\n\nvar encodingIndexes = {exports: {}};\n\nvar hasRequiredEncodingIndexes;\n\nfunction requireEncodingIndexes () {\n\tif (hasRequiredEncodingIndexes) return encodingIndexes.exports;\n\thasRequiredEncodingIndexes = 1;\n\t(function (module) {\n\t\t(function(global) {\n\t\t if (module.exports) {\n\t\t module.exports = global;\n\t\t }\n\t\t global[\"encoding-indexes\"] =\n\t\t{\n\t\t \"big5\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188],\n\t\t \"euc-kr\":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"gb18030\":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565],\n\t\t \"gb18030-ranges\":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]],\n\t\t \"jis0208\":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"jis0212\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"ibm866\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160],\n\t\t \"iso-8859-2\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n\t\t \"iso-8859-3\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729],\n\t\t \"iso-8859-4\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729],\n\t\t \"iso-8859-5\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119],\n\t\t \"iso-8859-6\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"iso-8859-7\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n\t\t \"iso-8859-8\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n\t\t \"iso-8859-10\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312],\n\t\t \"iso-8859-13\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217],\n\t\t \"iso-8859-14\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255],\n\t\t \"iso-8859-15\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n\t\t \"iso-8859-16\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255],\n\t\t \"koi8-r\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n\t\t \"koi8-u\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n\t\t \"macintosh\":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711],\n\t\t \"windows-874\":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null],\n\t\t \"windows-1250\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n\t\t \"windows-1251\":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103],\n\t\t \"windows-1252\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n\t\t \"windows-1253\":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n\t\t \"windows-1254\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255],\n\t\t \"windows-1255\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n\t\t \"windows-1256\":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746],\n\t\t \"windows-1257\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729],\n\t\t \"windows-1258\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255],\n\t\t \"x-mac-cyrillic\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364]\n\t\t};\n\t\t}(commonjsGlobal || {}));\n} (encodingIndexes));\n\treturn encodingIndexes.exports;\n}\n\n(function (module) {\n\t(function(global) {\n\t if (module.exports &&\n\t !global[\"encoding-indexes\"]) {\n\t global[\"encoding-indexes\"] =\n\t requireEncodingIndexes()[\"encoding-indexes\"];\n\t }\n\t function inRange(a, min, max) {\n\t return min <= a && a <= max;\n\t }\n\t function includes(array, item) {\n\t return array.indexOf(item) !== -1;\n\t }\n\t var floor = Math.floor;\n\t function ToDictionary(o) {\n\t if (o === undefined) return {};\n\t if (o === Object(o)) return o;\n\t throw TypeError('Could not convert argument to dictionary');\n\t }\n\t function stringToCodePoints(string) {\n\t var s = String(string);\n\t var n = s.length;\n\t var i = 0;\n\t var u = [];\n\t while (i < n) {\n\t var c = s.charCodeAt(i);\n\t if (c < 0xD800 || c > 0xDFFF) {\n\t u.push(c);\n\t }\n\t else if (0xDC00 <= c && c <= 0xDFFF) {\n\t u.push(0xFFFD);\n\t }\n\t else if (0xD800 <= c && c <= 0xDBFF) {\n\t if (i === n - 1) {\n\t u.push(0xFFFD);\n\t }\n\t else {\n\t var d = s.charCodeAt(i + 1);\n\t if (0xDC00 <= d && d <= 0xDFFF) {\n\t var a = c & 0x3FF;\n\t var b = d & 0x3FF;\n\t u.push(0x10000 + (a << 10) + b);\n\t i += 1;\n\t }\n\t else {\n\t u.push(0xFFFD);\n\t }\n\t }\n\t }\n\t i += 1;\n\t }\n\t return u;\n\t }\n\t function codePointsToString(code_points) {\n\t var s = '';\n\t for (var i = 0; i < code_points.length; ++i) {\n\t var cp = code_points[i];\n\t if (cp <= 0xFFFF) {\n\t s += String.fromCharCode(cp);\n\t } else {\n\t cp -= 0x10000;\n\t s += String.fromCharCode((cp >> 10) + 0xD800,\n\t (cp & 0x3FF) + 0xDC00);\n\t }\n\t }\n\t return s;\n\t }\n\t function isASCIIByte(a) {\n\t return 0x00 <= a && a <= 0x7F;\n\t }\n\t var isASCIICodePoint = isASCIIByte;\n\t var end_of_stream = -1;\n\t function Stream(tokens) {\n\t this.tokens = [].slice.call(tokens);\n\t this.tokens.reverse();\n\t }\n\t Stream.prototype = {\n\t endOfStream: function() {\n\t return !this.tokens.length;\n\t },\n\t read: function() {\n\t if (!this.tokens.length)\n\t return end_of_stream;\n\t return this.tokens.pop();\n\t },\n\t prepend: function(token) {\n\t if (Array.isArray(token)) {\n\t var tokens = (token);\n\t while (tokens.length)\n\t this.tokens.push(tokens.pop());\n\t } else {\n\t this.tokens.push(token);\n\t }\n\t },\n\t push: function(token) {\n\t if (Array.isArray(token)) {\n\t var tokens = (token);\n\t while (tokens.length)\n\t this.tokens.unshift(tokens.shift());\n\t } else {\n\t this.tokens.unshift(token);\n\t }\n\t }\n\t };\n\t var finished = -1;\n\t function decoderError(fatal, opt_code_point) {\n\t if (fatal)\n\t throw TypeError('Decoder error');\n\t return opt_code_point || 0xFFFD;\n\t }\n\t function encoderError(code_point) {\n\t throw TypeError('The code point ' + code_point + ' could not be encoded.');\n\t }\n\t function getEncoding(label) {\n\t label = String(label).trim().toLowerCase();\n\t if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {\n\t return label_to_encoding[label];\n\t }\n\t return null;\n\t }\n\t var encodings = [\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"unicode-1-1-utf-8\",\n\t \"utf-8\",\n\t \"utf8\"\n\t ],\n\t \"name\": \"UTF-8\"\n\t }\n\t ],\n\t \"heading\": \"The Encoding\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"866\",\n\t \"cp866\",\n\t \"csibm866\",\n\t \"ibm866\"\n\t ],\n\t \"name\": \"IBM866\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin2\",\n\t \"iso-8859-2\",\n\t \"iso-ir-101\",\n\t \"iso8859-2\",\n\t \"iso88592\",\n\t \"iso_8859-2\",\n\t \"iso_8859-2:1987\",\n\t \"l2\",\n\t \"latin2\"\n\t ],\n\t \"name\": \"ISO-8859-2\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin3\",\n\t \"iso-8859-3\",\n\t \"iso-ir-109\",\n\t \"iso8859-3\",\n\t \"iso88593\",\n\t \"iso_8859-3\",\n\t \"iso_8859-3:1988\",\n\t \"l3\",\n\t \"latin3\"\n\t ],\n\t \"name\": \"ISO-8859-3\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin4\",\n\t \"iso-8859-4\",\n\t \"iso-ir-110\",\n\t \"iso8859-4\",\n\t \"iso88594\",\n\t \"iso_8859-4\",\n\t \"iso_8859-4:1988\",\n\t \"l4\",\n\t \"latin4\"\n\t ],\n\t \"name\": \"ISO-8859-4\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatincyrillic\",\n\t \"cyrillic\",\n\t \"iso-8859-5\",\n\t \"iso-ir-144\",\n\t \"iso8859-5\",\n\t \"iso88595\",\n\t \"iso_8859-5\",\n\t \"iso_8859-5:1988\"\n\t ],\n\t \"name\": \"ISO-8859-5\"\n\t },\n\t {\n\t \"labels\": [\n\t \"arabic\",\n\t \"asmo-708\",\n\t \"csiso88596e\",\n\t \"csiso88596i\",\n\t \"csisolatinarabic\",\n\t \"ecma-114\",\n\t \"iso-8859-6\",\n\t \"iso-8859-6-e\",\n\t \"iso-8859-6-i\",\n\t \"iso-ir-127\",\n\t \"iso8859-6\",\n\t \"iso88596\",\n\t \"iso_8859-6\",\n\t \"iso_8859-6:1987\"\n\t ],\n\t \"name\": \"ISO-8859-6\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatingreek\",\n\t \"ecma-118\",\n\t \"elot_928\",\n\t \"greek\",\n\t \"greek8\",\n\t \"iso-8859-7\",\n\t \"iso-ir-126\",\n\t \"iso8859-7\",\n\t \"iso88597\",\n\t \"iso_8859-7\",\n\t \"iso_8859-7:1987\",\n\t \"sun_eu_greek\"\n\t ],\n\t \"name\": \"ISO-8859-7\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csiso88598e\",\n\t \"csisolatinhebrew\",\n\t \"hebrew\",\n\t \"iso-8859-8\",\n\t \"iso-8859-8-e\",\n\t \"iso-ir-138\",\n\t \"iso8859-8\",\n\t \"iso88598\",\n\t \"iso_8859-8\",\n\t \"iso_8859-8:1988\",\n\t \"visual\"\n\t ],\n\t \"name\": \"ISO-8859-8\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csiso88598i\",\n\t \"iso-8859-8-i\",\n\t \"logical\"\n\t ],\n\t \"name\": \"ISO-8859-8-I\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin6\",\n\t \"iso-8859-10\",\n\t \"iso-ir-157\",\n\t \"iso8859-10\",\n\t \"iso885910\",\n\t \"l6\",\n\t \"latin6\"\n\t ],\n\t \"name\": \"ISO-8859-10\"\n\t },\n\t {\n\t \"labels\": [\n\t \"iso-8859-13\",\n\t \"iso8859-13\",\n\t \"iso885913\"\n\t ],\n\t \"name\": \"ISO-8859-13\"\n\t },\n\t {\n\t \"labels\": [\n\t \"iso-8859-14\",\n\t \"iso8859-14\",\n\t \"iso885914\"\n\t ],\n\t \"name\": \"ISO-8859-14\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin9\",\n\t \"iso-8859-15\",\n\t \"iso8859-15\",\n\t \"iso885915\",\n\t \"iso_8859-15\",\n\t \"l9\"\n\t ],\n\t \"name\": \"ISO-8859-15\"\n\t },\n\t {\n\t \"labels\": [\n\t \"iso-8859-16\"\n\t ],\n\t \"name\": \"ISO-8859-16\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cskoi8r\",\n\t \"koi\",\n\t \"koi8\",\n\t \"koi8-r\",\n\t \"koi8_r\"\n\t ],\n\t \"name\": \"KOI8-R\"\n\t },\n\t {\n\t \"labels\": [\n\t \"koi8-ru\",\n\t \"koi8-u\"\n\t ],\n\t \"name\": \"KOI8-U\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csmacintosh\",\n\t \"mac\",\n\t \"macintosh\",\n\t \"x-mac-roman\"\n\t ],\n\t \"name\": \"macintosh\"\n\t },\n\t {\n\t \"labels\": [\n\t \"dos-874\",\n\t \"iso-8859-11\",\n\t \"iso8859-11\",\n\t \"iso885911\",\n\t \"tis-620\",\n\t \"windows-874\"\n\t ],\n\t \"name\": \"windows-874\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1250\",\n\t \"windows-1250\",\n\t \"x-cp1250\"\n\t ],\n\t \"name\": \"windows-1250\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1251\",\n\t \"windows-1251\",\n\t \"x-cp1251\"\n\t ],\n\t \"name\": \"windows-1251\"\n\t },\n\t {\n\t \"labels\": [\n\t \"ansi_x3.4-1968\",\n\t \"ascii\",\n\t \"cp1252\",\n\t \"cp819\",\n\t \"csisolatin1\",\n\t \"ibm819\",\n\t \"iso-8859-1\",\n\t \"iso-ir-100\",\n\t \"iso8859-1\",\n\t \"iso88591\",\n\t \"iso_8859-1\",\n\t \"iso_8859-1:1987\",\n\t \"l1\",\n\t \"latin1\",\n\t \"us-ascii\",\n\t \"windows-1252\",\n\t \"x-cp1252\"\n\t ],\n\t \"name\": \"windows-1252\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1253\",\n\t \"windows-1253\",\n\t \"x-cp1253\"\n\t ],\n\t \"name\": \"windows-1253\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1254\",\n\t \"csisolatin5\",\n\t \"iso-8859-9\",\n\t \"iso-ir-148\",\n\t \"iso8859-9\",\n\t \"iso88599\",\n\t \"iso_8859-9\",\n\t \"iso_8859-9:1989\",\n\t \"l5\",\n\t \"latin5\",\n\t \"windows-1254\",\n\t \"x-cp1254\"\n\t ],\n\t \"name\": \"windows-1254\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1255\",\n\t \"windows-1255\",\n\t \"x-cp1255\"\n\t ],\n\t \"name\": \"windows-1255\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1256\",\n\t \"windows-1256\",\n\t \"x-cp1256\"\n\t ],\n\t \"name\": \"windows-1256\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1257\",\n\t \"windows-1257\",\n\t \"x-cp1257\"\n\t ],\n\t \"name\": \"windows-1257\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1258\",\n\t \"windows-1258\",\n\t \"x-cp1258\"\n\t ],\n\t \"name\": \"windows-1258\"\n\t },\n\t {\n\t \"labels\": [\n\t \"x-mac-cyrillic\",\n\t \"x-mac-ukrainian\"\n\t ],\n\t \"name\": \"x-mac-cyrillic\"\n\t }\n\t ],\n\t \"heading\": \"Legacy single-byte encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"chinese\",\n\t \"csgb2312\",\n\t \"csiso58gb231280\",\n\t \"gb2312\",\n\t \"gb_2312\",\n\t \"gb_2312-80\",\n\t \"gbk\",\n\t \"iso-ir-58\",\n\t \"x-gbk\"\n\t ],\n\t \"name\": \"GBK\"\n\t },\n\t {\n\t \"labels\": [\n\t \"gb18030\"\n\t ],\n\t \"name\": \"gb18030\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Chinese (simplified) encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"big5\",\n\t \"big5-hkscs\",\n\t \"cn-big5\",\n\t \"csbig5\",\n\t \"x-x-big5\"\n\t ],\n\t \"name\": \"Big5\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Chinese (traditional) encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"cseucpkdfmtjapanese\",\n\t \"euc-jp\",\n\t \"x-euc-jp\"\n\t ],\n\t \"name\": \"EUC-JP\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csiso2022jp\",\n\t \"iso-2022-jp\"\n\t ],\n\t \"name\": \"ISO-2022-JP\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csshiftjis\",\n\t \"ms932\",\n\t \"ms_kanji\",\n\t \"shift-jis\",\n\t \"shift_jis\",\n\t \"sjis\",\n\t \"windows-31j\",\n\t \"x-sjis\"\n\t ],\n\t \"name\": \"Shift_JIS\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Japanese encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"cseuckr\",\n\t \"csksc56011987\",\n\t \"euc-kr\",\n\t \"iso-ir-149\",\n\t \"korean\",\n\t \"ks_c_5601-1987\",\n\t \"ks_c_5601-1989\",\n\t \"ksc5601\",\n\t \"ksc_5601\",\n\t \"windows-949\"\n\t ],\n\t \"name\": \"EUC-KR\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Korean encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"csiso2022kr\",\n\t \"hz-gb-2312\",\n\t \"iso-2022-cn\",\n\t \"iso-2022-cn-ext\",\n\t \"iso-2022-kr\"\n\t ],\n\t \"name\": \"replacement\"\n\t },\n\t {\n\t \"labels\": [\n\t \"utf-16be\"\n\t ],\n\t \"name\": \"UTF-16BE\"\n\t },\n\t {\n\t \"labels\": [\n\t \"utf-16\",\n\t \"utf-16le\"\n\t ],\n\t \"name\": \"UTF-16LE\"\n\t },\n\t {\n\t \"labels\": [\n\t \"x-user-defined\"\n\t ],\n\t \"name\": \"x-user-defined\"\n\t }\n\t ],\n\t \"heading\": \"Legacy miscellaneous encodings\"\n\t }\n\t ];\n\t var label_to_encoding = {};\n\t encodings.forEach(function(category) {\n\t category.encodings.forEach(function(encoding) {\n\t encoding.labels.forEach(function(label) {\n\t label_to_encoding[label] = encoding;\n\t });\n\t });\n\t });\n\t var encoders = {};\n\t var decoders = {};\n\t function indexCodePointFor(pointer, index) {\n\t if (!index) return null;\n\t return index[pointer] || null;\n\t }\n\t function indexPointerFor(code_point, index) {\n\t var pointer = index.indexOf(code_point);\n\t return pointer === -1 ? null : pointer;\n\t }\n\t function index(name) {\n\t if (!('encoding-indexes' in global)) {\n\t throw Error(\"Indexes missing.\" +\n\t \" Did you forget to include encoding-indexes.js first?\");\n\t }\n\t return global['encoding-indexes'][name];\n\t }\n\t function fallbackReplacement(name) {\n\t var fallbackConfiguration = global['encode-fallback-replacement'];\n\t if (fallbackConfiguration) {\n\t var fallback = fallbackConfiguration[name];\n\t if (fallback) {\n\t return {\n\t \"replacement\": fallback.replacement,\n\t \"index\": index(fallback.index)\n\t }\n\t }\n\t }\n\t return null;\n\t }\n\t function indexGB18030RangesCodePointFor(pointer) {\n\t if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))\n\t return null;\n\t if (pointer === 7457) return 0xE7C7;\n\t var offset = 0;\n\t var code_point_offset = 0;\n\t var idx = index('gb18030-ranges');\n\t var i;\n\t for (i = 0; i < idx.length; ++i) {\n\t var entry = idx[i];\n\t if (entry[0] <= pointer) {\n\t offset = entry[0];\n\t code_point_offset = entry[1];\n\t } else {\n\t break;\n\t }\n\t }\n\t return code_point_offset + pointer - offset;\n\t }\n\t function indexGB18030RangesPointerFor(code_point) {\n\t if (code_point === 0xE7C7) return 7457;\n\t var offset = 0;\n\t var pointer_offset = 0;\n\t var idx = index('gb18030-ranges');\n\t var i;\n\t for (i = 0; i < idx.length; ++i) {\n\t var entry = idx[i];\n\t if (entry[1] <= code_point) {\n\t offset = entry[1];\n\t pointer_offset = entry[0];\n\t } else {\n\t break;\n\t }\n\t }\n\t return pointer_offset + code_point - offset;\n\t }\n\t function indexShiftJISPointerFor(code_point) {\n\t shift_jis_index = shift_jis_index ||\n\t index('jis0208').map(function(code_point, pointer) {\n\t return inRange(pointer, 8272, 8835) ? null : code_point;\n\t });\n\t var index_ = shift_jis_index;\n\t return index_.indexOf(code_point);\n\t }\n\t var shift_jis_index;\n\t function indexBig5PointerFor(code_point) {\n\t big5_index_no_hkscs = big5_index_no_hkscs ||\n\t index('big5').map(function(code_point, pointer) {\n\t return (pointer < (0xA1 - 0x81) * 157) ? null : code_point;\n\t });\n\t var index_ = big5_index_no_hkscs;\n\t if (code_point === 0x2550 || code_point === 0x255E ||\n\t code_point === 0x2561 || code_point === 0x256A ||\n\t code_point === 0x5341 || code_point === 0x5345) {\n\t return index_.lastIndexOf(code_point);\n\t }\n\t return indexPointerFor(code_point, index_);\n\t }\n\t var big5_index_no_hkscs;\n\t var DEFAULT_ENCODING = 'utf-8';\n\t function TextDecoder(label, options) {\n\t if (!(this instanceof TextDecoder))\n\t throw TypeError('Called as a function. Did you forget \\'new\\'?');\n\t label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n\t options = ToDictionary(options);\n\t this._encoding = null;\n\t this._decoder = null;\n\t this._ignoreBOM = false;\n\t this._BOMseen = false;\n\t this._error_mode = 'replacement';\n\t this._do_not_flush = false;\n\t var encoding = getEncoding(label);\n\t if (encoding === null || encoding.name === 'replacement')\n\t throw RangeError('Unknown encoding: ' + label);\n\t if (!decoders[encoding.name]) {\n\t throw Error('Decoder not present.' +\n\t ' Did you forget to include encoding-indexes.js first?');\n\t }\n\t var dec = this;\n\t dec._encoding = encoding;\n\t if (Boolean(options['fatal']))\n\t dec._error_mode = 'fatal';\n\t if (Boolean(options['ignoreBOM']))\n\t dec._ignoreBOM = true;\n\t if (!Object.defineProperty) {\n\t this.encoding = dec._encoding.name.toLowerCase();\n\t this.fatal = dec._error_mode === 'fatal';\n\t this.ignoreBOM = dec._ignoreBOM;\n\t }\n\t return dec;\n\t }\n\t if (Object.defineProperty) {\n\t Object.defineProperty(TextDecoder.prototype, 'encoding', {\n\t get: function() { return this._encoding.name.toLowerCase(); }\n\t });\n\t Object.defineProperty(TextDecoder.prototype, 'fatal', {\n\t get: function() { return this._error_mode === 'fatal'; }\n\t });\n\t Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', {\n\t get: function() { return this._ignoreBOM; }\n\t });\n\t }\n\t TextDecoder.prototype.decode = function decode(input, options) {\n\t var bytes;\n\t if (typeof input === 'object' && input instanceof ArrayBuffer) {\n\t bytes = new Uint8Array(input);\n\t } else if (typeof input === 'object' && 'buffer' in input &&\n\t input.buffer instanceof ArrayBuffer) {\n\t bytes = new Uint8Array(input.buffer,\n\t input.byteOffset,\n\t input.byteLength);\n\t } else if (typeof input === 'object' && input instanceof Uint8Array) {\n\t bytes = input;\n\t } else {\n\t bytes = new Uint8Array(0);\n\t }\n\t options = ToDictionary(options);\n\t if (!this._do_not_flush) {\n\t this._decoder = decoders[this._encoding.name]({\n\t fatal: this._error_mode === 'fatal'});\n\t this._BOMseen = false;\n\t }\n\t this._do_not_flush = Boolean(options['stream']);\n\t var input_stream = new Stream(bytes);\n\t var output = [];\n\t var result;\n\t while (true) {\n\t var token = input_stream.read();\n\t if (token === end_of_stream)\n\t break;\n\t result = this._decoder.handler(input_stream, token);\n\t if (result === finished)\n\t break;\n\t if (result !== null) {\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t }\n\t }\n\t if (!this._do_not_flush) {\n\t do {\n\t result = this._decoder.handler(input_stream, input_stream.read());\n\t if (result === finished)\n\t break;\n\t if (result === null)\n\t continue;\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t } while (!input_stream.endOfStream());\n\t this._decoder = null;\n\t }\n\t function serializeStream(stream) {\n\t if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) &&\n\t !this._ignoreBOM && !this._BOMseen) {\n\t if (stream.length > 0 && stream[0] === 0xFEFF) {\n\t this._BOMseen = true;\n\t stream.shift();\n\t } else if (stream.length > 0) {\n\t this._BOMseen = true;\n\t } else ;\n\t }\n\t return codePointsToString(stream);\n\t }\n\t return serializeStream.call(this, output);\n\t };\n\t function TextEncoder(label, options) {\n\t if (!(this instanceof TextEncoder))\n\t throw TypeError('Called as a function. Did you forget \\'new\\'?');\n\t options = ToDictionary(options);\n\t this._encoding = null;\n\t this._encoder = null;\n\t this._do_not_flush = false;\n\t this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement';\n\t var enc = this;\n\t if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {\n\t label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n\t var encoding = getEncoding(label);\n\t if (encoding === null || encoding.name === 'replacement')\n\t throw RangeError('Unknown encoding: ' + label);\n\t if (!encoders[encoding.name]) {\n\t throw Error('Encoder not present.' +\n\t ' Did you forget to include encoding-indexes.js first?');\n\t }\n\t enc._encoding = encoding;\n\t } else {\n\t enc._encoding = getEncoding('utf-8');\n\t if (label !== undefined && 'console' in global) {\n\t console.warn('TextEncoder constructor called with encoding label, '\n\t + 'which is ignored.');\n\t }\n\t }\n\t if (!Object.defineProperty)\n\t this.encoding = enc._encoding.name.toLowerCase();\n\t return enc;\n\t }\n\t if (Object.defineProperty) {\n\t Object.defineProperty(TextEncoder.prototype, 'encoding', {\n\t get: function() { return this._encoding.name.toLowerCase(); }\n\t });\n\t }\n\t TextEncoder.prototype.encode = function encode(opt_string, options) {\n\t opt_string = opt_string === undefined ? '' : String(opt_string);\n\t options = ToDictionary(options);\n\t if (!this._do_not_flush)\n\t this._encoder = encoders[this._encoding.name]({\n\t fatal: this._fatal === 'fatal'});\n\t this._do_not_flush = Boolean(options['stream']);\n\t var input = new Stream(stringToCodePoints(opt_string));\n\t var output = [];\n\t var result;\n\t while (true) {\n\t var token = input.read();\n\t if (token === end_of_stream)\n\t break;\n\t result = this._encoder.handler(input, token);\n\t if (result === finished)\n\t break;\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t }\n\t if (!this._do_not_flush) {\n\t while (true) {\n\t result = this._encoder.handler(input, input.read());\n\t if (result === finished)\n\t break;\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t }\n\t this._encoder = null;\n\t }\n\t return new Uint8Array(output);\n\t };\n\t function UTF8Decoder(options) {\n\t var fatal = options.fatal;\n\t var utf8_code_point = 0,\n\t utf8_bytes_seen = 0,\n\t utf8_bytes_needed = 0,\n\t utf8_lower_boundary = 0x80,\n\t utf8_upper_boundary = 0xBF;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && utf8_bytes_needed !== 0) {\n\t utf8_bytes_needed = 0;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream)\n\t return finished;\n\t if (utf8_bytes_needed === 0) {\n\t if (inRange(bite, 0x00, 0x7F)) {\n\t return bite;\n\t }\n\t else if (inRange(bite, 0xC2, 0xDF)) {\n\t utf8_bytes_needed = 1;\n\t utf8_code_point = bite & 0x1F;\n\t }\n\t else if (inRange(bite, 0xE0, 0xEF)) {\n\t if (bite === 0xE0)\n\t utf8_lower_boundary = 0xA0;\n\t if (bite === 0xED)\n\t utf8_upper_boundary = 0x9F;\n\t utf8_bytes_needed = 2;\n\t utf8_code_point = bite & 0xF;\n\t }\n\t else if (inRange(bite, 0xF0, 0xF4)) {\n\t if (bite === 0xF0)\n\t utf8_lower_boundary = 0x90;\n\t if (bite === 0xF4)\n\t utf8_upper_boundary = 0x8F;\n\t utf8_bytes_needed = 3;\n\t utf8_code_point = bite & 0x7;\n\t }\n\t else {\n\t return decoderError(fatal);\n\t }\n\t return null;\n\t }\n\t if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) {\n\t utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n\t utf8_lower_boundary = 0x80;\n\t utf8_upper_boundary = 0xBF;\n\t stream.prepend(bite);\n\t return decoderError(fatal);\n\t }\n\t utf8_lower_boundary = 0x80;\n\t utf8_upper_boundary = 0xBF;\n\t utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F);\n\t utf8_bytes_seen += 1;\n\t if (utf8_bytes_seen !== utf8_bytes_needed)\n\t return null;\n\t var code_point = utf8_code_point;\n\t utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n\t return code_point;\n\t };\n\t }\n\t function UTF8Encoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var count, offset;\n\t if (inRange(code_point, 0x0080, 0x07FF)) {\n\t count = 1;\n\t offset = 0xC0;\n\t }\n\t else if (inRange(code_point, 0x0800, 0xFFFF)) {\n\t count = 2;\n\t offset = 0xE0;\n\t }\n\t else if (inRange(code_point, 0x10000, 0x10FFFF)) {\n\t count = 3;\n\t offset = 0xF0;\n\t }\n\t var bytes = [(code_point >> (6 * count)) + offset];\n\t while (count > 0) {\n\t var temp = code_point >> (6 * (count - 1));\n\t bytes.push(0x80 | (temp & 0x3F));\n\t count -= 1;\n\t }\n\t return bytes;\n\t };\n\t }\n\t encoders['UTF-8'] = function(options) {\n\t return new UTF8Encoder(options);\n\t };\n\t decoders['UTF-8'] = function(options) {\n\t return new UTF8Decoder(options);\n\t };\n\t function SingleByteDecoder(index, options) {\n\t var fatal = options.fatal;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream)\n\t return finished;\n\t if (isASCIIByte(bite))\n\t return bite;\n\t var code_point = index[bite - 0x80];\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t };\n\t }\n\t function SingleByteEncoder(index, options, fallback) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var pointer = indexPointerFor(code_point, index);\n\t if (pointer == null && fallback && fallback.index) {\n\t pointer = indexPointerFor(code_point, fallback.index);\n\t }\n\t if (pointer == null && fallback) {\n\t return fallback.replacement;\n\t }\n\t if (pointer === null)\n\t encoderError(code_point);\n\t return pointer + 0x80;\n\t };\n\t }\n\t (function() {\n\t if (!('encoding-indexes' in global))\n\t return;\n\t encodings.forEach(function(category) {\n\t if (category.heading !== 'Legacy single-byte encodings')\n\t return;\n\t category.encodings.forEach(function(encoding) {\n\t var name = encoding.name;\n\t var idx = index(name.toLowerCase());\n\t var fallback = fallbackReplacement(name.toLowerCase());\n\t decoders[name] = function(options) {\n\t return new SingleByteDecoder(idx, options);\n\t };\n\t encoders[name] = function(options) {\n\t return new SingleByteEncoder(idx, options, fallback);\n\t };\n\t });\n\t });\n\t }());\n\t decoders['GBK'] = function(options) {\n\t return new GB18030Decoder(options);\n\t };\n\t encoders['GBK'] = function(options) {\n\t return new GB18030Encoder(options, true);\n\t };\n\t function GB18030Decoder(options) {\n\t var fatal = options.fatal;\n\t var gb18030_first = 0x00,\n\t gb18030_second = 0x00,\n\t gb18030_third = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && gb18030_first === 0x00 &&\n\t gb18030_second === 0x00 && gb18030_third === 0x00) {\n\t return finished;\n\t }\n\t if (bite === end_of_stream &&\n\t (gb18030_first !== 0x00 || gb18030_second !== 0x00 ||\n\t gb18030_third !== 0x00)) {\n\t gb18030_first = 0x00;\n\t gb18030_second = 0x00;\n\t gb18030_third = 0x00;\n\t decoderError(fatal);\n\t }\n\t var code_point;\n\t if (gb18030_third !== 0x00) {\n\t code_point = null;\n\t if (inRange(bite, 0x30, 0x39)) {\n\t code_point = indexGB18030RangesCodePointFor(\n\t (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 +\n\t gb18030_third - 0x81) * 10 + bite - 0x30);\n\t }\n\t var buffer = [gb18030_second, gb18030_third, bite];\n\t gb18030_first = 0x00;\n\t gb18030_second = 0x00;\n\t gb18030_third = 0x00;\n\t if (code_point === null) {\n\t stream.prepend(buffer);\n\t return decoderError(fatal);\n\t }\n\t return code_point;\n\t }\n\t if (gb18030_second !== 0x00) {\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t gb18030_third = bite;\n\t return null;\n\t }\n\t stream.prepend([gb18030_second, bite]);\n\t gb18030_first = 0x00;\n\t gb18030_second = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (gb18030_first !== 0x00) {\n\t if (inRange(bite, 0x30, 0x39)) {\n\t gb18030_second = bite;\n\t return null;\n\t }\n\t var lead = gb18030_first;\n\t var pointer = null;\n\t gb18030_first = 0x00;\n\t var offset = bite < 0x7F ? 0x40 : 0x41;\n\t if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE))\n\t pointer = (lead - 0x81) * 190 + (bite - offset);\n\t code_point = pointer === null ? null :\n\t indexCodePointFor(pointer, index('gb18030'));\n\t if (code_point === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (bite === 0x80)\n\t return 0x20AC;\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t gb18030_first = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function GB18030Encoder(options, gbk_flag) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (code_point === 0xE5E5)\n\t return encoderError(code_point);\n\t if (gbk_flag && code_point === 0x20AC)\n\t return 0x80;\n\t var pointer = indexPointerFor(code_point, index('gb18030'));\n\t if (pointer !== null) {\n\t var lead = floor(pointer / 190) + 0x81;\n\t var trail = pointer % 190;\n\t var offset = trail < 0x3F ? 0x40 : 0x41;\n\t return [lead, trail + offset];\n\t }\n\t if (gbk_flag)\n\t return encoderError(code_point);\n\t pointer = indexGB18030RangesPointerFor(code_point);\n\t var byte1 = floor(pointer / 10 / 126 / 10);\n\t pointer = pointer - byte1 * 10 * 126 * 10;\n\t var byte2 = floor(pointer / 10 / 126);\n\t pointer = pointer - byte2 * 10 * 126;\n\t var byte3 = floor(pointer / 10);\n\t var byte4 = pointer - byte3 * 10;\n\t return [byte1 + 0x81,\n\t byte2 + 0x30,\n\t byte3 + 0x81,\n\t byte4 + 0x30];\n\t };\n\t }\n\t encoders['gb18030'] = function(options) {\n\t return new GB18030Encoder(options);\n\t };\n\t decoders['gb18030'] = function(options) {\n\t return new GB18030Decoder(options);\n\t };\n\t function Big5Decoder(options) {\n\t var fatal = options.fatal;\n\t var Big5_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && Big5_lead !== 0x00) {\n\t Big5_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && Big5_lead === 0x00)\n\t return finished;\n\t if (Big5_lead !== 0x00) {\n\t var lead = Big5_lead;\n\t var pointer = null;\n\t Big5_lead = 0x00;\n\t var offset = bite < 0x7F ? 0x40 : 0x62;\n\t if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE))\n\t pointer = (lead - 0x81) * 157 + (bite - offset);\n\t switch (pointer) {\n\t case 1133: return [0x00CA, 0x0304];\n\t case 1135: return [0x00CA, 0x030C];\n\t case 1164: return [0x00EA, 0x0304];\n\t case 1166: return [0x00EA, 0x030C];\n\t }\n\t var code_point = (pointer === null) ? null :\n\t indexCodePointFor(pointer, index('big5'));\n\t if (code_point === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t Big5_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function Big5Encoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var pointer = indexBig5PointerFor(code_point);\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 157) + 0x81;\n\t if (lead < 0xA1)\n\t return encoderError(code_point);\n\t var trail = pointer % 157;\n\t var offset = trail < 0x3F ? 0x40 : 0x62;\n\t return [lead, trail + offset];\n\t };\n\t }\n\t encoders['Big5'] = function(options) {\n\t return new Big5Encoder(options);\n\t };\n\t decoders['Big5'] = function(options) {\n\t return new Big5Decoder(options);\n\t };\n\t function EUCJPDecoder(options) {\n\t var fatal = options.fatal;\n\t var eucjp_jis0212_flag = false,\n\t eucjp_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && eucjp_lead !== 0x00) {\n\t eucjp_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && eucjp_lead === 0x00)\n\t return finished;\n\t if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) {\n\t eucjp_lead = 0x00;\n\t return 0xFF61 - 0xA1 + bite;\n\t }\n\t if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) {\n\t eucjp_jis0212_flag = true;\n\t eucjp_lead = bite;\n\t return null;\n\t }\n\t if (eucjp_lead !== 0x00) {\n\t var lead = eucjp_lead;\n\t eucjp_lead = 0x00;\n\t var code_point = null;\n\t if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {\n\t code_point = indexCodePointFor(\n\t (lead - 0xA1) * 94 + (bite - 0xA1),\n\t index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212'));\n\t }\n\t eucjp_jis0212_flag = false;\n\t if (!inRange(bite, 0xA1, 0xFE))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) {\n\t eucjp_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function EUCJPEncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (code_point === 0x00A5)\n\t return 0x5C;\n\t if (code_point === 0x203E)\n\t return 0x7E;\n\t if (inRange(code_point, 0xFF61, 0xFF9F))\n\t return [0x8E, code_point - 0xFF61 + 0xA1];\n\t if (code_point === 0x2212)\n\t code_point = 0xFF0D;\n\t var pointer = indexPointerFor(code_point, index('jis0208'));\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 94) + 0xA1;\n\t var trail = pointer % 94 + 0xA1;\n\t return [lead, trail];\n\t };\n\t }\n\t encoders['EUC-JP'] = function(options) {\n\t return new EUCJPEncoder(options);\n\t };\n\t decoders['EUC-JP'] = function(options) {\n\t return new EUCJPDecoder(options);\n\t };\n\t function ISO2022JPDecoder(options) {\n\t var fatal = options.fatal;\n\t var states = {\n\t ASCII: 0,\n\t Roman: 1,\n\t Katakana: 2,\n\t LeadByte: 3,\n\t TrailByte: 4,\n\t EscapeStart: 5,\n\t Escape: 6\n\t };\n\t var iso2022jp_decoder_state = states.ASCII,\n\t iso2022jp_decoder_output_state = states.ASCII,\n\t iso2022jp_lead = 0x00,\n\t iso2022jp_output_flag = false;\n\t this.handler = function(stream, bite) {\n\t switch (iso2022jp_decoder_state) {\n\t default:\n\t case states.ASCII:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E\n\t && bite !== 0x0F && bite !== 0x1B) {\n\t iso2022jp_output_flag = false;\n\t return bite;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.Roman:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (bite === 0x5C) {\n\t iso2022jp_output_flag = false;\n\t return 0x00A5;\n\t }\n\t if (bite === 0x7E) {\n\t iso2022jp_output_flag = false;\n\t return 0x203E;\n\t }\n\t if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F\n\t && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) {\n\t iso2022jp_output_flag = false;\n\t return bite;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.Katakana:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (inRange(bite, 0x21, 0x5F)) {\n\t iso2022jp_output_flag = false;\n\t return 0xFF61 - 0x21 + bite;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.LeadByte:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (inRange(bite, 0x21, 0x7E)) {\n\t iso2022jp_output_flag = false;\n\t iso2022jp_lead = bite;\n\t iso2022jp_decoder_state = states.TrailByte;\n\t return null;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.TrailByte:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return decoderError(fatal);\n\t }\n\t if (inRange(bite, 0x21, 0x7E)) {\n\t iso2022jp_decoder_state = states.LeadByte;\n\t var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;\n\t var code_point = indexCodePointFor(pointer, index('jis0208'));\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (bite === end_of_stream) {\n\t iso2022jp_decoder_state = states.LeadByte;\n\t stream.prepend(bite);\n\t return decoderError(fatal);\n\t }\n\t iso2022jp_decoder_state = states.LeadByte;\n\t return decoderError(fatal);\n\t case states.EscapeStart:\n\t if (bite === 0x24 || bite === 0x28) {\n\t iso2022jp_lead = bite;\n\t iso2022jp_decoder_state = states.Escape;\n\t return null;\n\t }\n\t stream.prepend(bite);\n\t iso2022jp_output_flag = false;\n\t iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n\t return decoderError(fatal);\n\t case states.Escape:\n\t var lead = iso2022jp_lead;\n\t iso2022jp_lead = 0x00;\n\t var state = null;\n\t if (lead === 0x28 && bite === 0x42)\n\t state = states.ASCII;\n\t if (lead === 0x28 && bite === 0x4A)\n\t state = states.Roman;\n\t if (lead === 0x28 && bite === 0x49)\n\t state = states.Katakana;\n\t if (lead === 0x24 && (bite === 0x40 || bite === 0x42))\n\t state = states.LeadByte;\n\t if (state !== null) {\n\t iso2022jp_decoder_state = iso2022jp_decoder_state = state;\n\t var output_flag = iso2022jp_output_flag;\n\t iso2022jp_output_flag = true;\n\t return !output_flag ? null : decoderError(fatal);\n\t }\n\t stream.prepend([lead, bite]);\n\t iso2022jp_output_flag = false;\n\t iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n\t return decoderError(fatal);\n\t }\n\t };\n\t }\n\t function ISO2022JPEncoder(options) {\n\t options.fatal;\n\t var states = {\n\t ASCII: 0,\n\t Roman: 1,\n\t jis0208: 2\n\t };\n\t var iso2022jp_state = states.ASCII;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream &&\n\t iso2022jp_state !== states.ASCII) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.ASCII;\n\t return [0x1B, 0x28, 0x42];\n\t }\n\t if (code_point === end_of_stream && iso2022jp_state === states.ASCII)\n\t return finished;\n\t if ((iso2022jp_state === states.ASCII ||\n\t iso2022jp_state === states.Roman) &&\n\t (code_point === 0x000E || code_point === 0x000F ||\n\t code_point === 0x001B)) {\n\t return encoderError(0xFFFD);\n\t }\n\t if (iso2022jp_state === states.ASCII &&\n\t isASCIICodePoint(code_point))\n\t return code_point;\n\t if (iso2022jp_state === states.Roman &&\n\t ((isASCIICodePoint(code_point) &&\n\t code_point !== 0x005C && code_point !== 0x007E) ||\n\t (code_point == 0x00A5 || code_point == 0x203E))) {\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (code_point === 0x00A5)\n\t return 0x5C;\n\t if (code_point === 0x203E)\n\t return 0x7E;\n\t }\n\t if (isASCIICodePoint(code_point) &&\n\t iso2022jp_state !== states.ASCII) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.ASCII;\n\t return [0x1B, 0x28, 0x42];\n\t }\n\t if ((code_point === 0x00A5 || code_point === 0x203E) &&\n\t iso2022jp_state !== states.Roman) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.Roman;\n\t return [0x1B, 0x28, 0x4A];\n\t }\n\t if (code_point === 0x2212)\n\t code_point = 0xFF0D;\n\t var pointer = indexPointerFor(code_point, index('jis0208'));\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t if (iso2022jp_state !== states.jis0208) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.jis0208;\n\t return [0x1B, 0x24, 0x42];\n\t }\n\t var lead = floor(pointer / 94) + 0x21;\n\t var trail = pointer % 94 + 0x21;\n\t return [lead, trail];\n\t };\n\t }\n\t encoders['ISO-2022-JP'] = function(options) {\n\t return new ISO2022JPEncoder(options);\n\t };\n\t decoders['ISO-2022-JP'] = function(options) {\n\t return new ISO2022JPDecoder(options);\n\t };\n\t function ShiftJISDecoder(options) {\n\t var fatal = options.fatal;\n\t var Shift_JIS_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && Shift_JIS_lead !== 0x00) {\n\t Shift_JIS_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && Shift_JIS_lead === 0x00)\n\t return finished;\n\t if (Shift_JIS_lead !== 0x00) {\n\t var lead = Shift_JIS_lead;\n\t var pointer = null;\n\t Shift_JIS_lead = 0x00;\n\t var offset = (bite < 0x7F) ? 0x40 : 0x41;\n\t var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;\n\t if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC))\n\t pointer = (lead - lead_offset) * 188 + bite - offset;\n\t if (inRange(pointer, 8836, 10715))\n\t return 0xE000 - 8836 + pointer;\n\t var code_point = (pointer === null) ? null :\n\t indexCodePointFor(pointer, index('jis0208'));\n\t if (code_point === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite) || bite === 0x80)\n\t return bite;\n\t if (inRange(bite, 0xA1, 0xDF))\n\t return 0xFF61 - 0xA1 + bite;\n\t if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {\n\t Shift_JIS_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function ShiftJISEncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point) || code_point === 0x0080)\n\t return code_point;\n\t if (code_point === 0x00A5)\n\t return 0x5C;\n\t if (code_point === 0x203E)\n\t return 0x7E;\n\t if (inRange(code_point, 0xFF61, 0xFF9F))\n\t return code_point - 0xFF61 + 0xA1;\n\t if (code_point === 0x2212)\n\t code_point = 0xFF0D;\n\t var pointer = indexShiftJISPointerFor(code_point);\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 188);\n\t var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1;\n\t var trail = pointer % 188;\n\t var offset = (trail < 0x3F) ? 0x40 : 0x41;\n\t return [lead + lead_offset, trail + offset];\n\t };\n\t }\n\t encoders['Shift_JIS'] = function(options) {\n\t return new ShiftJISEncoder(options);\n\t };\n\t decoders['Shift_JIS'] = function(options) {\n\t return new ShiftJISDecoder(options);\n\t };\n\t function EUCKRDecoder(options) {\n\t var fatal = options.fatal;\n\t var euckr_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && euckr_lead !== 0) {\n\t euckr_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && euckr_lead === 0)\n\t return finished;\n\t if (euckr_lead !== 0x00) {\n\t var lead = euckr_lead;\n\t var pointer = null;\n\t euckr_lead = 0x00;\n\t if (inRange(bite, 0x41, 0xFE))\n\t pointer = (lead - 0x81) * 190 + (bite - 0x41);\n\t var code_point = (pointer === null)\n\t ? null : indexCodePointFor(pointer, index('euc-kr'));\n\t if (pointer === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t euckr_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function EUCKREncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var pointer = indexPointerFor(code_point, index('euc-kr'));\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 190) + 0x81;\n\t var trail = (pointer % 190) + 0x41;\n\t return [lead, trail];\n\t };\n\t }\n\t encoders['EUC-KR'] = function(options) {\n\t return new EUCKREncoder(options);\n\t };\n\t decoders['EUC-KR'] = function(options) {\n\t return new EUCKRDecoder(options);\n\t };\n\t function convertCodeUnitToBytes(code_unit, utf16be) {\n\t var byte1 = code_unit >> 8;\n\t var byte2 = code_unit & 0x00FF;\n\t if (utf16be)\n\t return [byte1, byte2];\n\t return [byte2, byte1];\n\t }\n\t function UTF16Decoder(utf16_be, options) {\n\t var fatal = options.fatal;\n\t var utf16_lead_byte = null,\n\t utf16_lead_surrogate = null;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && (utf16_lead_byte !== null ||\n\t utf16_lead_surrogate !== null)) {\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && utf16_lead_byte === null &&\n\t utf16_lead_surrogate === null) {\n\t return finished;\n\t }\n\t if (utf16_lead_byte === null) {\n\t utf16_lead_byte = bite;\n\t return null;\n\t }\n\t var code_unit;\n\t if (utf16_be) {\n\t code_unit = (utf16_lead_byte << 8) + bite;\n\t } else {\n\t code_unit = (bite << 8) + utf16_lead_byte;\n\t }\n\t utf16_lead_byte = null;\n\t if (utf16_lead_surrogate !== null) {\n\t var lead_surrogate = utf16_lead_surrogate;\n\t utf16_lead_surrogate = null;\n\t if (inRange(code_unit, 0xDC00, 0xDFFF)) {\n\t return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +\n\t (code_unit - 0xDC00);\n\t }\n\t stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be));\n\t return decoderError(fatal);\n\t }\n\t if (inRange(code_unit, 0xD800, 0xDBFF)) {\n\t utf16_lead_surrogate = code_unit;\n\t return null;\n\t }\n\t if (inRange(code_unit, 0xDC00, 0xDFFF))\n\t return decoderError(fatal);\n\t return code_unit;\n\t };\n\t }\n\t function UTF16Encoder(utf16_be, options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (inRange(code_point, 0x0000, 0xFFFF))\n\t return convertCodeUnitToBytes(code_point, utf16_be);\n\t var lead = convertCodeUnitToBytes(\n\t ((code_point - 0x10000) >> 10) + 0xD800, utf16_be);\n\t var trail = convertCodeUnitToBytes(\n\t ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be);\n\t return lead.concat(trail);\n\t };\n\t }\n\t encoders['UTF-16BE'] = function(options) {\n\t return new UTF16Encoder(true, options);\n\t };\n\t decoders['UTF-16BE'] = function(options) {\n\t return new UTF16Decoder(true, options);\n\t };\n\t encoders['UTF-16LE'] = function(options) {\n\t return new UTF16Encoder(false, options);\n\t };\n\t decoders['UTF-16LE'] = function(options) {\n\t return new UTF16Decoder(false, options);\n\t };\n\t function XUserDefinedDecoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream)\n\t return finished;\n\t if (isASCIIByte(bite))\n\t return bite;\n\t return 0xF780 + bite - 0x80;\n\t };\n\t }\n\t function XUserDefinedEncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (inRange(code_point, 0xF780, 0xF7FF))\n\t return code_point - 0xF780 + 0x80;\n\t return encoderError(code_point);\n\t };\n\t }\n\t encoders['x-user-defined'] = function(options) {\n\t return new XUserDefinedEncoder(options);\n\t };\n\t decoders['x-user-defined'] = function(options) {\n\t return new XUserDefinedDecoder(options);\n\t };\n\t if (!global['TextEncoder'])\n\t global['TextEncoder'] = TextEncoder;\n\t if (!global['TextDecoder'])\n\t global['TextDecoder'] = TextDecoder;\n\t if (module.exports) {\n\t module.exports = {\n\t TextEncoder: TextEncoder,\n\t TextDecoder: global['TextDecoder'],\n\t EncodingIndexes: global[\"encoding-indexes\"]\n\t };\n\t }\n\t}(commonjsGlobal || {}));\n} (encoding$1));\n\nvar encoding = encoding$1.exports;\nvar textEncoding = {\n TextEncoder: encoding.TextEncoder,\n TextDecoder: encoding.TextDecoder,\n};\n\nconst DEFAULT_CHARSET = 'utf-8';\nconst LATIN_1 = 'iso-8859-1';\nconst WIN_1251 = 'windows-1251';\nconst WIN_1252 = 'windows-1252';\n/**\n * Supported charsets array.\n */\nconst SUPPORTED_CHARSETS = [DEFAULT_CHARSET, WIN_1251, WIN_1252, LATIN_1];\n/**\n * Parses charset from content-type header.\n *\n * @param contentType Content-type header.\n * @returns Charset string or null.\n */\nfunction parseCharsetFromHeader(contentType) {\n if (!contentType) {\n return null;\n }\n const match = /charset=\"?(.*?)\"?$/.exec(contentType.toLowerCase());\n if (match && match.length > 1) {\n return match[1].toLowerCase();\n }\n return null;\n}\n/**\n * Parses charset from html, looking for:\n * \n * \n * \n * \n * .\n *\n * @param text Html content.\n * @returns Charset string or null.\n */\nfunction parseCharsetFromHtml(text) {\n let match = //.exec(text.toLowerCase());\n if (match && match.length > 1) {\n return match[1].trim().toLowerCase();\n }\n // eslint-disable-next-line max-len\n match = / 1) {\n return match[1].trim().toLowerCase();\n }\n // eslint-disable-next-line max-len\n match = / 1) {\n return match[1].trim().toLowerCase();\n }\n return null;\n}\n/**\n * Parses charset from css.\n *\n * @param text Css content.\n * @returns Charset string or null.\n */\nfunction parseCharsetFromCss(text) {\n const match = /^@charset\\s*['\"](.*?)['\"]/.exec(text.toLowerCase());\n if (match && match.length > 1) {\n return match[1].trim().toLowerCase();\n }\n return null;\n}\n\n/**\n * Content Stream Filter class.\n *\n * Encapsulates response data stream filtering logic\n * https://mail.mozilla.org/pipermail/dev-addons/2017-April/002729.html.\n */\nclass ContentStream {\n /**\n * Content stream constructor.\n *\n * @param context Request context.\n * @param contentStringFilter Content filter.\n * @param streamFilterCreator Stream filter creator.\n * @param filteringLog Filtering log.\n */\n constructor(context, contentStringFilter, streamFilterCreator, filteringLog) {\n /**\n * Contains collection of accepted content types for stream filtering.\n */\n this.allowedContentTypes = [\n 'text/',\n 'application/json',\n 'application/xml',\n 'application/xhtml+xml',\n 'application/javascript',\n 'application/x-javascript',\n ];\n this.content = '';\n this.context = context;\n this.contentStringFilter = contentStringFilter;\n this.filteringLog = filteringLog;\n this.filter = streamFilterCreator(context.requestId);\n this.onResponseData = this.onResponseData.bind(this);\n this.onResponseFinish = this.onResponseFinish.bind(this);\n this.onResponseError = this.onResponseError.bind(this);\n }\n /**\n * Initializes encoders and filter.\n */\n init() {\n this.initEncoders();\n this.initFilter();\n }\n /**\n * Writes data to stream.\n *\n * @param content Content to write.\n */\n write(content) {\n this.filter.write(this.encoder.encode(content));\n this.filter.close();\n }\n /**\n * Sets charset.\n *\n * @param charset Charset.\n */\n setCharset(charset) {\n if (charset) {\n this.charset = charset;\n this.initEncoders();\n }\n }\n /**\n * Disconnects filter from stream.\n *\n * @param data Data to write.\n */\n disconnect(data) {\n this.filter.write(data);\n this.filter.disconnect();\n }\n /**\n * Initializes encoders.\n */\n initEncoders() {\n let set = this.charset ? this.charset : DEFAULT_CHARSET;\n // Redefining it as TextDecoder does not understand the iso- name\n if (set === LATIN_1) {\n set = WIN_1252;\n }\n this.decoder = new textEncoding.TextDecoder(set);\n if (set === DEFAULT_CHARSET) {\n this.encoder = new textEncoding.TextEncoder();\n }\n else {\n this.encoder = new textEncoding.TextEncoder(set, { NONSTANDARD_allowLegacyEncoding: true });\n }\n }\n /**\n * Initializes filter.\n */\n initFilter() {\n this.filter.ondata = this.onResponseData;\n this.filter.onstop = this.onResponseFinish;\n this.filter.onerror = this.onResponseError;\n }\n /**\n * We do not support stream filtering for some content types.\n *\n * @returns True if content type is supported.\n */\n shouldProcessFiltering() {\n const { requestType, contentTypeHeader } = this.context;\n if (requestType === RequestType$1.Other || requestType === RequestType$1.XmlHttpRequest) {\n return !!contentTypeHeader && this.allowedContentTypes.some((contentType) => {\n return contentTypeHeader.indexOf(contentType) === 0;\n });\n }\n return true;\n }\n /**\n * Handler for response data.\n *\n * @param event Stream filter event.\n */\n onResponseData(event) {\n if (!this.shouldProcessFiltering()) {\n this.disconnect(event.data);\n return;\n }\n if (!this.charset) {\n try {\n let charset;\n /**\n * If this.charset is undefined and requestType is Document or Subdocument, we try to detect charset\n * from page tags.\n */\n if (this.context.requestType === RequestType$1.SubDocument\n || this.context.requestType === RequestType$1.Document) {\n charset = ContentStream.parseHtmlCharset(event.data);\n }\n /**\n * If this.charset is undefined and requestType is Stylesheet, we try to detect charset from css\n * directive.\n */\n if (this.context.requestType === RequestType$1.Stylesheet) {\n charset = ContentStream.parseCssCharset(event.data);\n }\n if (!charset) {\n charset = DEFAULT_CHARSET;\n }\n if (charset && SUPPORTED_CHARSETS.indexOf(charset) >= 0) {\n this.charset = charset;\n this.initEncoders();\n this.content += this.decoder.decode(event.data, { stream: true });\n }\n else {\n // Charset is not supported\n this.disconnect(event.data);\n }\n }\n catch (e) {\n logger.warn(e.message);\n // on error we disconnect the filter from the request\n this.disconnect(event.data);\n }\n }\n else {\n this.content += this.decoder.decode(event.data, { stream: true });\n }\n }\n /**\n * Handler for response error.\n */\n onResponseError() {\n if (this.filter.error && this.filter.error) {\n logger.info(this.filter.error);\n }\n }\n /**\n * Handler for the end of response data.\n */\n onResponseFinish() {\n this.content += this.decoder.decode(); // finish stream\n this.filteringLog.publishEvent({\n type: FilteringEventType.ContentFilteringStart,\n data: {\n requestId: this.context.requestId,\n },\n });\n const { contentTypeHeader, statusCode } = this.context;\n if (statusCode !== 200) {\n this.write(this.content);\n return;\n }\n const charset = parseCharsetFromHeader(contentTypeHeader);\n if (charset) {\n if (SUPPORTED_CHARSETS.indexOf(charset) < 0) {\n // Charset is detected and it is not supported\n // eslint-disable-next-line max-len\n logger.warn(`Skipping request ${this.context.requestId} with Content-Type ${this.context.contentTypeHeader}`);\n this.write(this.content);\n return;\n }\n this.setCharset(charset);\n }\n this.content = this.contentStringFilter.applyRules(this.content);\n this.write(this.content);\n this.filteringLog.publishEvent({\n type: FilteringEventType.ContentFilteringFinish,\n data: {\n requestId: this.context.requestId,\n },\n });\n }\n /**\n * Parses charset from html.\n *\n * @param data Data to parse.\n * @returns Parsed charset or null.\n */\n static parseHtmlCharset(data) {\n const decoded = new textEncoding.TextDecoder('utf-8').decode(data).toLowerCase();\n return parseCharsetFromHtml(decoded);\n }\n /**\n * Parses charset from css.\n *\n * @param data Data to parse.\n * @returns Parsed charset or null.\n */\n static parseCssCharset(data) {\n const decoded = new textEncoding.TextDecoder('utf-8').decode(data).toLowerCase();\n return parseCharsetFromCss(decoded);\n }\n}\n\n/**\n * Content filtering module.\n * Handles Html filtering and replace rules.\n */\nclass ContentFiltering {\n /**\n * Retrieves html rules.\n *\n * @param context Request context.\n * @returns Html rules or null.\n */\n static getHtmlRules(context) {\n const { cosmeticResult } = context;\n /**\n * \"cosmeticResult\" is defined only for Document and Subdocument request types\n * do not need extra request type checking.\n */\n if (!cosmeticResult) {\n return null;\n }\n const htmlRules = cosmeticResult.Html.getRules();\n if (htmlRules.length === 0) {\n return null;\n }\n return htmlRules;\n }\n /**\n * Retrieves replace rules and sorts them alphabetically.\n *\n * @param context Request context.\n * @returns Replace rules or null.\n */\n static getReplaceRules(context) {\n const { requestType, matchingResult } = context;\n if (!requestType\n || !matchingResult\n || !ContentFiltering.supportedReplaceRulesRequestTypes.includes(requestType)) {\n return null;\n }\n const replaceRules = matchingResult.getReplaceRules();\n if (replaceRules.length === 0) {\n return null;\n }\n // Sort replace rules alphabetically as noted here\n // https://github.com/AdguardTeam/CoreLibs/issues/45\n return replaceRules.sort((prev, next) => {\n if (prev.getText() > next.getText()) {\n return 1;\n }\n if (prev.getText() < next.getText()) {\n return -1;\n }\n return 0;\n });\n }\n /**\n * Checks if request content filtering disabled by exception rule with $content modifier.\n *\n * @param context Request context.\n *\n * @returns `true`, if content filtering disabled by exception rule with $content modifier,\n * overwise returns `false`.\n */\n static hasContentExceptionRule(context) {\n const { matchingResult } = context;\n if (!matchingResult) {\n return false;\n }\n const rule = matchingResult.getBasicResult();\n if (!rule) {\n return false;\n }\n // The $content modifier only applies with the exception rule.\n // We don't need additional `rule.isAllowlist()` check.\n return rule.isOptionEnabled(NetworkRuleOption.Content);\n }\n /**\n * Checks if request method is supported.\n *\n * @param context Request context.\n * @returns `true`, if request method is supported,\n * overwise returns `false`.\n */\n static isRequestMethodSupported(context) {\n const { method } = context;\n return method === 'GET' || method === 'POST';\n }\n /**\n * On before request event handler.\n *\n * @param context Request context.\n */\n static onBeforeRequest(context) {\n if (!browser.webRequest.filterResponseData\n || !ContentFiltering.isRequestMethodSupported(context)\n || ContentFiltering.hasContentExceptionRule(context)) {\n return;\n }\n const htmlRules = ContentFiltering.getHtmlRules(context);\n const replaceRules = ContentFiltering.getReplaceRules(context);\n if (htmlRules || replaceRules) {\n const contentStringFilter = new ContentStringFilter(context, htmlRules, replaceRules, defaultFilteringLog);\n const contentStream = new ContentStream(context, contentStringFilter, browser.webRequest.filterResponseData, defaultFilteringLog);\n contentStream.init();\n }\n }\n}\n/**\n * Contains collection of supported request types for replace rules.\n */\nContentFiltering.supportedReplaceRulesRequestTypes = [\n RequestType$1.Document,\n RequestType$1.SubDocument,\n RequestType$1.Script,\n RequestType$1.Stylesheet,\n RequestType$1.XmlHttpRequest,\n RequestType$1.Other,\n];\n\nconst CSP_HEADER_NAME = 'Content-Security-Policy';\n/**\n * Content Security Policy Headers filtering service module.\n */\nclass CspService {\n /**\n * Applies CSP rules to response headers and returns modified headers.\n * It is applied when webRequest.onHeadersReceived event is fired.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n static onHeadersReceived(context) {\n const { matchingResult, responseHeaders, requestId, tabId, requestUrl, referrerUrl, } = context;\n if (!matchingResult) {\n return false;\n }\n const cspHeaders = [];\n const cspRules = matchingResult.getCspRules();\n for (let i = 0; i < cspRules.length; i += 1) {\n const rule = cspRules[i];\n // Don't forget: getCspRules returns all $csp rules, we must directly check that the rule is blocking.\n if (RequestBlockingApi.isRequestBlockedByRule(rule)) {\n const cspHeaderValue = rule.getAdvancedModifierValue();\n if (cspHeaderValue) {\n cspHeaders.push({\n name: CSP_HEADER_NAME,\n value: cspHeaderValue,\n });\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ApplyCspRule,\n data: {\n tabId,\n eventId: requestId,\n requestUrl,\n frameUrl: referrerUrl,\n frameDomain: getDomain$1(referrerUrl),\n requestType: ContentType.Csp,\n rule,\n timestamp: Date.now(),\n },\n });\n }\n }\n }\n if (cspHeaders.length > 0) {\n requestContextStorage.update(requestId, {\n responseHeaders: responseHeaders ? [...responseHeaders, ...cspHeaders] : cspHeaders,\n });\n return true;\n }\n return false;\n }\n}\n\n/**\n * This API is used to remove traceable data from requests initiated by the background extension.\n */\nclass SanitizeApi {\n /**\n * Removes Cookie headers from background extension's requests.\n *\n * @param context Request context.\n * @returns Blocking response or null.\n */\n static onBeforeSendHeaders(context) {\n const { requestHeaders, referrerUrl, tabId, } = context;\n if (tabId !== BACKGROUND_TAB_ID || !requestHeaders) {\n return null;\n }\n // removeHeader modifies 'context.requestHeaders'\n if (isExtensionUrl(referrerUrl) && removeHeader(requestHeaders, 'Cookie')) {\n return { requestHeaders };\n }\n return null;\n }\n}\n\n/**\n * API for applying rules from background service by handling\n * Web Request API and web navigation events.\n */\nclass WebRequestApi {\n /**\n * Adds listeners to web request events.\n */\n static start() {\n // browser.webRequest Events\n RequestEvents.onBeforeRequest.addListener(WebRequestApi.onBeforeRequest);\n RequestEvents.onBeforeSendHeaders.addListener(WebRequestApi.onBeforeSendHeaders);\n RequestEvents.onHeadersReceived.addListener(WebRequestApi.onHeadersReceived);\n RequestEvents.onResponseStarted.addListener(WebRequestApi.onResponseStarted);\n RequestEvents.onErrorOccurred.addListener(WebRequestApi.onErrorOccurred);\n RequestEvents.onCompleted.addListener(WebRequestApi.onCompleted);\n // browser.webNavigation Events\n browser.webNavigation.onCommitted.addListener(WebRequestApi.onCommitted);\n browser.webNavigation.onDOMContentLoaded.addListener(WebRequestApi.onDomContentLoaded);\n }\n /**\n * Removes web request event handlers.\n */\n static stop() {\n RequestEvents.onBeforeRequest.removeListener(WebRequestApi.onBeforeRequest);\n RequestEvents.onBeforeSendHeaders.removeListener(WebRequestApi.onBeforeSendHeaders);\n RequestEvents.onHeadersReceived.removeListener(WebRequestApi.onHeadersReceived);\n RequestEvents.onResponseStarted.removeListener(WebRequestApi.onResponseStarted);\n RequestEvents.onErrorOccurred.removeListener(WebRequestApi.onErrorOccurred);\n RequestEvents.onCompleted.removeListener(WebRequestApi.onCompleted);\n browser.webNavigation.onCommitted.removeListener(WebRequestApi.onCommitted);\n browser.webNavigation.onDOMContentLoaded.removeListener(WebRequestApi.onDomContentLoaded);\n }\n /**\n * Flush browser in-memory cache.\n *\n * This function is called after an engine update or filtering switch to ensure\n * that new rules are applied to requests that may have been cached by the browser.\n */\n static flushMemoryCache() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield browser.webRequest.handlerBehaviorChanged();\n }\n catch (e) {\n // TODO: use getErrorMessage instead\n const message = e instanceof Error ? e.message : String(e);\n logger.error(message);\n }\n });\n }\n /**\n * On before request event handler. This is the earliest event in the chain of the web request events.\n *\n * @param details Request details.\n * @param details.context Request context.\n * @returns Web request response or void if there is nothing to do.\n */\n static onBeforeRequest({ context }) {\n if (!context) {\n return undefined;\n }\n const { requestType, tabId, frameId, requestUrl, referrerUrl, requestId, contentType, timestamp, thirdParty, method, requestFrameId, } = context;\n if (requestType === RequestType.Document || requestType === RequestType.SubDocument) {\n tabsApi.handleFrameRequest(context);\n if (requestType === RequestType.Document) {\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.TabReload,\n data: {\n tabId,\n },\n });\n }\n }\n if (!isHttpOrWsRequest(requestUrl)) {\n return undefined;\n }\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.SendRequest,\n data: {\n tabId,\n eventId: requestId,\n requestUrl,\n requestDomain: getDomain(requestUrl),\n frameUrl: referrerUrl,\n frameDomain: getDomain(referrerUrl),\n requestType: contentType,\n timestamp,\n requestThirdParty: thirdParty,\n method,\n },\n });\n const result = engineApi.matchRequest({\n requestUrl,\n frameUrl: referrerUrl,\n requestType,\n frameRule: tabsApi.getTabFrameRule(tabId),\n });\n if (!result) {\n return undefined;\n }\n requestContextStorage.update(requestId, {\n matchingResult: result,\n });\n if (requestType === RequestType.Document || requestType === RequestType.SubDocument) {\n tabsApi.handleFrameMatchingResult(tabId, frameId, result);\n const cosmeticOption = result.getCosmeticOption();\n const cosmeticResult = engineApi.getCosmeticResult(requestUrl, cosmeticOption);\n tabsApi.handleFrameCosmeticResult(tabId, frameId, cosmeticResult);\n requestContextStorage.update(requestId, {\n cosmeticResult,\n });\n }\n const basicResult = result.getBasicResult();\n const response = RequestBlockingApi.getBlockingResponse(basicResult, requestId, requestUrl, requestType, tabId);\n if (!response) {\n /*\n Strip url by $removeparam rules\n $removeparam rules are applied after URL blocking rules\n https://github.com/AdguardTeam/CoreLibs/issues/1462\n */\n const purgedUrl = paramsService.getPurgedUrl(requestId);\n if (purgedUrl) {\n return { redirectUrl: purgedUrl };\n }\n }\n if (response === null || response === void 0 ? void 0 : response.cancel) {\n tabsApi.incrementTabBlockedRequestCount(tabId);\n hideRequestInitiatorElement(tabId, requestFrameId, requestUrl, requestType, thirdParty);\n }\n else {\n ContentFiltering.onBeforeRequest(context);\n }\n return response;\n }\n /**\n * On before send headers event handler.\n *\n * !IMPORTANT! This method modifies headers in the context. This non-pure action needs\n * to increase performance: exclude copying of headers for each service.\n *\n * @param details On before send headers details.\n * @param details.context Details context.\n * @returns Web request event response.\n */\n static onBeforeSendHeaders({ context, }) {\n if (!context) {\n return undefined;\n }\n // If current request from the background - we don't need to modify headers,\n // only remove Cookie and immediately return modified headers\n const sanitizedRequest = SanitizeApi.onBeforeSendHeaders(context);\n if (sanitizedRequest) {\n return sanitizedRequest;\n }\n let requestHeadersModified = false;\n if (stealthApi.onBeforeSendHeaders(context)) {\n requestHeadersModified = true;\n }\n // If the current request does not comply with any rules - we do not\n // need to call any other processing services (e.g. cookie, header)\n if (context === null || context === void 0 ? void 0 : context.matchingResult) {\n if (cookieFiltering.onBeforeSendHeaders(context)) {\n requestHeadersModified = true;\n }\n if (headersService.onBeforeSendHeaders(context)) {\n requestHeadersModified = true;\n }\n }\n if (requestHeadersModified) {\n return { requestHeaders: context.requestHeaders };\n }\n return undefined;\n }\n /**\n * On headers received event handler.\n *\n * @param event On headers received event.\n * @param event.context Event context.\n * @param event.details On headers received details.\n * @returns Web request event response.\n */\n static onHeadersReceived({ context, details, }) {\n var _a;\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ReceiveResponse,\n data: {\n tabId: details.tabId,\n eventId: details.requestId,\n statusCode: details.statusCode,\n },\n });\n if (!(context === null || context === void 0 ? void 0 : context.matchingResult)) {\n return undefined;\n }\n const { requestId, requestUrl, requestType, responseHeaders, } = context;\n const contentTypeHeader = (_a = findHeaderByName(responseHeaders, 'content-type')) === null || _a === void 0 ? void 0 : _a.value;\n if (contentTypeHeader) {\n requestContextStorage.update(requestId, { contentTypeHeader });\n }\n let responseHeadersModified = false;\n if (requestUrl && (requestType === RequestType.Document || requestType === RequestType.SubDocument)) {\n if (CspService.onHeadersReceived(context)) {\n responseHeadersModified = true;\n }\n }\n if (cookieFiltering.onHeadersReceived(context)) {\n responseHeadersModified = true;\n }\n if (headersService.onHeadersReceived(context)) {\n responseHeadersModified = true;\n }\n if (responseHeadersModified) {\n return { responseHeaders: context.responseHeaders };\n }\n return undefined;\n }\n /**\n * On response started event handler.\n *\n * @param event On response started event.\n * @param event.context Event context.\n */\n static onResponseStarted({ context, }) {\n if (!context) {\n return;\n }\n const { requestId, tabId, frameId, requestType, contentType, timestamp, } = context;\n if (requestType !== RequestType.Document && requestType !== RequestType.SubDocument) {\n return;\n }\n const tabContext = tabsApi.getTabContext(tabId);\n if (!tabContext) {\n return;\n }\n const frame = tabContext.frames.get(frameId);\n if (!frame || !frame.cosmeticResult) {\n return;\n }\n /**\n * Actual tab url may not be committed by navigation event during response processing.\n * If {@link tabContext.info.url} and {@link url} are not the same, this means\n * that tab navigation steel is being processed and js injection may be causing the error.\n * In this case, js will be injected in the {@link WebNavigation.onCommitted} event.\n */\n if (requestType === RequestType.Document && frame.url !== tabContext.info.url) {\n return;\n }\n const { cosmeticResult, url, jsInjectionFsm, } = frame;\n const injectionParams = {\n requestId,\n url,\n tabId,\n frameId,\n cosmeticResult,\n timestamp,\n contentType,\n };\n CosmeticApi.applyFrameJsRules(injectionParams, jsInjectionFsm);\n }\n /**\n * This is handler for the last event from the request lifecycle.\n *\n * @param event On completed event.\n * @param event.context Request context.\n * @private\n */\n static onCompleted({ context, }) {\n if (!context) {\n return;\n }\n const { requestId, requestType, tabId, frameId, requestUrl, timestamp, } = context;\n /**\n * If the request is a subdocument request in Firefox, try injecting frame cosmetic result into frame,\n * because {@link WebRequestApi.onCommitted} can be not triggered.\n */\n if (isFirefox || requestType === RequestType.SubDocument) {\n WebRequestApi.injectCosmetic({\n frameId,\n tabId,\n timestamp,\n url: requestUrl,\n });\n }\n requestContextStorage.delete(requestId);\n }\n /**\n * Event handler for onErrorOccurred event. It fires when an error occurs.\n *\n * @param event On error occurred event.\n * @param event.details On error occurred event details.\n */\n static onErrorOccurred({ details, }) {\n requestContextStorage.delete(details.requestId);\n }\n /**\n * Checks if iframe has same source as main frame or if src is about:blank, javascript:, etc.\n * We don't include frames with 'src=data:' because Chrome and Firefox\n * do not allow data to be injected into frames with this type of src,\n * this bug is reported here https://bugs.chromium.org/p/chromium/issues/detail?id=55084.\n *\n * @param frameUrl Frame url.\n * @param frameId Unique id of frame in the tab.\n * @param mainFrameUrl Url of tab where iframe exists.\n * @returns True if frame without src, else returns false.\n */\n static isLocalFrame(frameUrl, frameId, mainFrameUrl) {\n return frameId !== MAIN_FRAME_ID\n && (frameUrl === mainFrameUrl\n || frameUrl === 'about:blank'\n || frameUrl === 'about:srcdoc'\n // eslint-disable-next-line no-script-url\n || frameUrl.indexOf('javascript:') > -1);\n }\n /**\n * Injects cosmetic rules to specified frame based on data from frame and response context.\n *\n * If cosmetic result does not exist or it has been already applied, ignore injection.\n *\n * @param params Data required for rule injection.\n */\n static injectCosmetic(params) {\n const { frameId, tabId, timestamp, url, } = params;\n const frame = tabsApi.getTabFrame(tabId, frameId);\n if (!frame\n || !frame.cosmeticResult\n || !frame.requestId) {\n return;\n }\n const { cosmeticResult, requestId, cssInjectionFsm, jsInjectionFsm, } = frame;\n const cssInjectionParams = {\n tabId,\n frameId,\n cosmeticResult,\n };\n const jsInjectionParams = {\n requestId,\n url,\n tabId,\n frameId,\n cosmeticResult,\n timestamp,\n contentType: frameId === MAIN_FRAME_ID\n ? ContentType.Document\n : ContentType.Subdocument,\n };\n CosmeticApi.applyFrameCssRules(cssInjectionParams, cssInjectionFsm);\n CosmeticApi.applyFrameJsRules(jsInjectionParams, jsInjectionFsm);\n }\n /**\n * On committed web navigation event handler.\n *\n * Injects necessary CSS and scripts into the web page.\n *\n * @param details Event details.\n */\n static onCommitted(details) {\n const { frameId, tabId, timeStamp, url, } = details;\n WebRequestApi.injectCosmetic({\n frameId,\n tabId,\n timestamp: timeStamp,\n url,\n });\n }\n /**\n * On DOM content loaded web navigation event handler.\n *\n * This method injects css and js code in iframes without remote source.\n * Usual webRequest callbacks don't fire for iframes without remote source.\n * Also urls in these iframes may be \"about:blank\", \"about:srcdoc\", etc.\n * Due to this reason we prepare injections for them as for mainframe\n * and inject them only when onDOMContentLoaded fires.\n *\n * @see https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1046\n * @param details Event details.\n */\n static onDomContentLoaded(details) {\n const { tabId, frameId, url, timeStamp, } = details;\n const mainFrame = tabsApi.getTabMainFrame(tabId);\n if (!mainFrame\n || !mainFrame.cosmeticResult\n || !mainFrame.requestId\n || !WebRequestApi.isLocalFrame(url, frameId, mainFrame.url)) {\n return;\n }\n const { cosmeticResult, requestId } = mainFrame;\n CosmeticApi\n .applyCssRules({\n tabId,\n frameId,\n cosmeticResult,\n })\n .catch(logger.debug);\n CosmeticApi\n .applyJsRules({\n requestId,\n url: mainFrame.url,\n tabId,\n frameId,\n cosmeticResult,\n timestamp: timeStamp,\n contentType: ContentType.Subdocument,\n })\n .catch(logger.debug);\n }\n}\n\n/**\n * Event channel wrapper for sending messages to assistant.\n */\nclass Assistant {\n /**\n * Sends message to assistant to open it on the page.\n *\n * @param tabId Tab id.\n */\n static openAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n // Lazy load assistant\n yield browser.tabs.executeScript(tabId, { file: this.assistantUrl });\n yield messagesApi.sendMessage(tabId, {\n type: MessageType.InitAssistant,\n tabId,\n assistantUrl: this.assistantUrl,\n });\n });\n }\n /**\n * Sends message to assistant to close it on the page.\n *\n * @param tabId Tab id.\n */\n static closeAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n yield messagesApi.sendMessage(tabId, {\n type: MessageType.CloseAssistant,\n });\n });\n }\n}\nAssistant.onCreateRule = new EventChannel();\n/**\n * Path to assembled @adguard/assistant module. Necessary for lazy on-demand\n * loading of the assistant.\n */\nAssistant.assistantUrl = '';\n\n// TODO: add long live connection\n// TODO: CollectHitStats\n/**\n * Messages API implementation. It is used to communicate with content scripts.\n */\nclass MessagesApi {\n /**\n * Messages API constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.filteringLog = filteringLog;\n this.handleMessage = this.handleMessage.bind(this);\n }\n /**\n * Sends message to the specified tab.\n *\n * @param tabId Tab ID.\n * @param message Message.\n */\n sendMessage(tabId, message) {\n return __awaiter(this, void 0, void 0, function* () {\n yield browser.tabs.sendMessage(tabId, message);\n });\n }\n /**\n * Messages handler.\n *\n * @param message Message object.\n * @param sender Tab which sent the message.\n */\n // TODO remove the rule bellow, and any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMessage(message, sender) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n message = messageValidator.parse(message);\n }\n catch (e) {\n // ignore\n return undefined;\n }\n const { type } = message;\n switch (type) {\n case MessageType.ProcessShouldCollapse: {\n return this.handleProcessShouldCollapseMessage(sender, message.payload);\n }\n case MessageType.GetCosmeticData: {\n return this.handleContentScriptDataMessage(sender, message.payload);\n }\n case MessageType.GetCookieRules: {\n return this.handleGetCookieRulesMessage(sender, message.payload);\n }\n case MessageType.SaveCookieLogEvent: {\n return this.handleSaveCookieLogEvent(sender, message.payload);\n }\n case MessageType.AssistantCreateRule: {\n return this.handleAssistantCreateRuleMessage(sender, message.payload);\n }\n case MessageType.SaveCssHitsStats: {\n return this.handleSaveCssHitsStats(sender, message.payload);\n }\n }\n return undefined;\n });\n }\n /**\n * Handles should collapse element message.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns True if element should be collapsed.\n */\n handleProcessShouldCollapseMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = processShouldCollapsePayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const tabId = sender.tab.id;\n const { elementUrl, documentUrl, requestType } = res.data;\n return RequestBlockingApi.shouldCollapseElement(tabId, elementUrl, documentUrl, requestType);\n }\n /**\n * Handles get extended css message.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns Extended css string or false or undefined.\n */\n handleContentScriptDataMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return null;\n }\n const res = getExtendedCssPayloadValidator.safeParse(payload);\n if (!res.success) {\n return null;\n }\n const tabId = sender.tab.id;\n let { frameId } = sender;\n if (!frameId) {\n frameId = 0;\n }\n // TODO check rules for parent/grandparent frames\n if (!tabsApi.getTabFrame(tabId, frameId)) {\n frameId = 0;\n }\n return CosmeticApi.getContentScriptData(tabId, frameId);\n }\n /**\n * Handles messages.\n * Returns cookie rules data for content script.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns Cookie rules data.\n */\n handleGetCookieRulesMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = getCookieRulesPayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const tabId = sender.tab.id;\n let { frameId } = sender;\n if (!frameId) {\n frameId = 0;\n }\n // TODO check rules for parent/grandparent frames\n if (!tabsApi.getTabFrame(tabId, frameId)) {\n frameId = 0;\n }\n const cookieRules = cookieFiltering.getBlockingRules(tabId, frameId);\n return cookieRules.map((rule) => ({\n ruleText: rule.getText(),\n match: rule.getAdvancedModifierValue(),\n isThirdParty: rule.isOptionEnabled(NetworkRuleOption.ThirdParty),\n filterId: rule.getFilterListId(),\n isAllowlist: rule.isAllowlist(),\n }));\n }\n /**\n * Calls filtering to add an event from cookie-controller content-script.\n *\n * @param sender Tab which sent the message.\n * @param payload Message payload.\n * @returns True if event was published to filtering log.\n */\n handleSaveCookieLogEvent(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = getSaveCookieLogEventPayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const { data } = res;\n this.filteringLog.publishEvent({\n type: FilteringEventType.Cookie,\n data: {\n eventId: nanoid(),\n tabId: sender.tab.id,\n cookieName: data.cookieName,\n frameDomain: data.cookieDomain,\n cookieValue: data.cookieValue,\n rule: new NetworkRule(data.ruleText, data.filterId),\n isModifyingCookieRule: false,\n requestThirdParty: data.thirdParty,\n timestamp: Date.now(),\n requestType: ContentType.Cookie,\n },\n });\n return true;\n }\n /**\n * Handles message with new rule from assistant content script.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns True if rule was dispatched.\n */\n handleAssistantCreateRuleMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = getAssistantCreateRulePayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const { ruleText } = res.data;\n Assistant.onCreateRule.dispatch(ruleText);\n return true;\n }\n /**\n * Handle message about saving css hits stats.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns True if stats was saved.\n */\n handleSaveCssHitsStats(sender, \n // TODO add payload type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const tabId = sender.tab.id;\n const frame = tabsApi.getTabMainFrame(tabId);\n if (!(frame === null || frame === void 0 ? void 0 : frame.url)) {\n return false;\n }\n const { url } = frame;\n let published = false;\n for (let i = 0; i < payload.length; i += 1) {\n const stat = payload[i];\n const rule = new CosmeticRule(stat.ruleText, stat.filterId);\n this.filteringLog.publishEvent({\n type: FilteringEventType.ApplyCosmeticRule,\n data: {\n tabId,\n eventId: nanoid(),\n rule,\n element: stat.element,\n frameUrl: url,\n frameDomain: getDomain(url),\n requestType: ContentType.Document,\n timestamp: Date.now(),\n },\n });\n published = true;\n }\n return published;\n }\n}\nconst messagesApi = new MessagesApi(defaultFilteringLog);\n\n/**\n * Filter list configuration validator for MV2.\n */\nconst filterMV2Validator = z.object({\n /**\n * Filter identifier.\n */\n filterId: z.number(),\n /**\n * Filter list text content.\n */\n content: z.string(),\n /**\n * Filter trusted flag. If true, js rules from list can be executed.\n */\n trusted: z.boolean(),\n});\n/**\n * Configuration validator for MV2.\n */\nconst configurationMV2Validator = configurationValidator.extend({\n filters: filterMV2Validator.array(),\n});\n\n/**\n * Injects cosmetic rules into tabs, opened before app initialization.\n */\nclass TabsCosmeticInjector {\n /**\n * Creates contexts for tabs opened before api initialization and\n * applies cosmetic rules for each frame.\n */\n static processOpenTabs() {\n return __awaiter(this, void 0, void 0, function* () {\n const currentTabs = yield browser.tabs.query({});\n const tasks = currentTabs.map((tab) => TabsCosmeticInjector.processOpenTab(tab));\n const promises = yield Promise.allSettled(tasks);\n // Handles errors\n promises.forEach((promise) => {\n if (promise.status === 'rejected') {\n logger.error(promise.reason);\n }\n });\n });\n }\n /**\n * Creates context for tab opened before api initialization and\n * applies cosmetic rules for each frame.\n *\n * @param tab Tab details.\n */\n static processOpenTab(tab) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!TabContext.isBrowserTab(tab)) {\n return;\n }\n const tabContext = new TabContext(tab);\n const tabId = tab.id;\n tabsApi.context.set(tabId, tabContext);\n if (tab.url) {\n tabContext.mainFrameRule = allowlistApi.matchFrame(tab.url);\n }\n const frames = yield browser.webNavigation.getAllFrames({ tabId });\n if (!frames) {\n return;\n }\n frames.forEach(({ frameId, url }) => {\n const frame = new Frame(url);\n tabContext.frames.set(frameId, frame);\n if (!isHttpOrWsRequest(url)) {\n return;\n }\n const isDocumentFrame = frameId === MAIN_FRAME_ID;\n frame.matchingResult = engineApi.matchRequest({\n requestUrl: url,\n frameUrl: url,\n requestType: isDocumentFrame ? RequestType.Document : RequestType.SubDocument,\n frameRule: tabContext.mainFrameRule,\n });\n if (!frame.matchingResult) {\n return;\n }\n const cosmeticOption = frame.matchingResult.getCosmeticOption();\n frame.cosmeticResult = engineApi.getCosmeticResult(url, cosmeticOption);\n const { cosmeticResult, cssInjectionFsm, jsInjectionFsm, } = frame;\n const cssInjectionParams = {\n tabId,\n frameId,\n cosmeticResult,\n };\n const jsInjectionParams = {\n url,\n tabId,\n frameId,\n cosmeticResult,\n requestId: TabsCosmeticInjector.generateFrameRequestId(),\n timestamp: Date.now(),\n contentType: isDocumentFrame\n ? ContentType.Document\n : ContentType.Subdocument,\n };\n CosmeticApi.applyFrameCssRules(cssInjectionParams, cssInjectionFsm);\n CosmeticApi.applyFrameJsRules(jsInjectionParams, jsInjectionFsm);\n });\n });\n }\n /**\n * Generates synthetic request id for frame, opened before extension initialization.\n * Used for logging js rule apply.\n *\n * @returns Request id.\n */\n static generateFrameRequestId() {\n return `${TabsCosmeticInjector.SYNTHETIC_REQUEST_ID_PREFIX}-${nanoid(7)}`;\n }\n}\n/**\n * Synthetic request id prefix for frames, opened before extension initialization.\n * Used in filtering log for displaying cosmetic rule events.\n */\nTabsCosmeticInjector.SYNTHETIC_REQUEST_ID_PREFIX = 'synthetic';\n\n/**\n * App implementation for MV2.\n */\nclass TsWebExtension {\n /**\n * Constructor.\n *\n * @param webAccessibleResourcesPath Path to web accessible resources for {@link resourcesService}.\n */\n constructor(webAccessibleResourcesPath) {\n /**\n * Fires on filtering log event.\n */\n this.onFilteringLogEvent = defaultFilteringLog.onLogEvent;\n /**\n * Fires when a rule has been created from the helper.\n */\n this.onAssistantCreateRule = Assistant.onCreateRule;\n resourcesService.init(webAccessibleResourcesPath);\n }\n /**\n * Gets app running status.\n *\n * @returns True if app started, else false.\n */\n get isStarted() {\n return appContext.isAppStarted;\n }\n /**\n * Sets app running status.\n *\n * @param value Status value.\n */\n set isStarted(value) {\n appContext.isAppStarted = value;\n }\n /**\n * Gets app configuration context.\n *\n * @throws Error if value not set.\n * @returns True if app started, else false.\n */\n get configuration() {\n if (!appContext.configuration) {\n throw new Error('Configuration not set!');\n }\n return appContext.configuration;\n }\n /**\n * Sets app configuration context.\n *\n * @param value Status value.\n */\n set configuration(value) {\n appContext.configuration = value;\n }\n /**\n * Initializes {@link EngineApi} with passed {@link configuration}.\n * Starts request processing via {@link WebRequestApi} and tab tracking via {@link tabsApi}.\n *\n * Also updates webRTC privacy.network settings on demand and flushes browser in-memory request cache.\n *\n * @param configuration App configuration.\n *\n * @throws Error if configuration is not valid.\n */\n start(configuration) {\n return __awaiter(this, void 0, void 0, function* () {\n configurationMV2Validator.parse(configuration);\n this.configuration = TsWebExtension.createConfigurationMV2Context(configuration);\n logger.setVerbose(configuration.verbose);\n RequestEvents.init();\n yield redirectsService.start();\n yield engineApi.startEngine(configuration);\n yield TabsCosmeticInjector.processOpenTabs();\n yield tabsApi.start();\n WebRequestApi.start();\n Assistant.assistantUrl = configuration.settings.assistantUrl;\n yield WebRequestApi.flushMemoryCache();\n yield stealthApi.updateWebRtcPrivacyPermissions();\n this.isStarted = true;\n });\n }\n /**\n * Fully stop request and tab processing.\n */\n stop() {\n return __awaiter(this, void 0, void 0, function* () {\n WebRequestApi.stop();\n tabsApi.stop();\n this.isStarted = false;\n });\n }\n /**\n * Re-initializes {@link EngineApi} with passed {@link configuration}\n * and update tabs main frame rules based on new engine state.\n *\n * Also updates webRTC privacy.network settings on demand and flushes browser in-memory request cache.\n *\n * Requires app is started.\n *\n * @param configuration App configuration.\n *\n * @throws Error if app is not started or configuration is not valid.\n */\n configure(configuration) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.isStarted) {\n throw new Error('App is not started!');\n }\n configurationMV2Validator.parse(configuration);\n this.configuration = TsWebExtension.createConfigurationMV2Context(configuration);\n logger.setVerbose(configuration.verbose);\n yield engineApi.startEngine(configuration);\n yield tabsApi.updateCurrentTabsMainFrameRules();\n yield WebRequestApi.flushMemoryCache();\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Opens assistant in the tab.\n *\n * @param tabId Tab id where assistant will be opened.\n */\n openAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n yield Assistant.openAssistant(tabId);\n });\n }\n /**\n * Close assistant in the required tab.\n *\n * @param tabId Tab id.\n */\n closeAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n yield Assistant.closeAssistant(tabId);\n });\n }\n /**\n * Return rules count for current configuration.\n *\n * @returns Rules count.\n */\n getRulesCount() {\n return engineApi.getRulesCount();\n }\n /**\n * Returns a message handler that will listen to internal messages,\n * for example: message for get computed css for content-script.\n *\n * @returns Messages handler.\n */\n getMessageHandler() {\n return messagesApi.handleMessage;\n }\n /**\n * Sets prebuild local script rules.\n *\n * @see {@link LocalScriptRulesService}\n *\n * @param localScriptRules JSON object with pre-build JS rules. @see {@link LocalScriptRulesService}.\n */\n setLocalScriptRules(localScriptRules) {\n localScriptRulesService.setLocalScriptRules(localScriptRules);\n }\n /**\n * Updates `filteringEnabled` configuration value without re-initialization of engine.\n *\n * Also updates webRTC privacy.network settings on demand and flushes browser in-memory request cache.\n *\n * @throws Error if {@link configuration} not set.\n * @param isFilteringEnabled `filteringEnabled` config value.\n */\n setFilteringEnabled(isFilteringEnabled) {\n return __awaiter(this, void 0, void 0, function* () {\n this.configuration.settings.filteringEnabled = isFilteringEnabled;\n yield WebRequestApi.flushMemoryCache();\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Updates `collectStats` configuration value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isCollectStats `collectStats` config value.\n */\n setCollectHitStats(isCollectStats) {\n this.configuration.settings.collectStats = isCollectStats;\n }\n /**\n * Updates `stealthModeEnabled` configuration value without re-initialization of engine.\n * Also updates webRTC privacy.network settings on demand.\n *\n * @throws Error if {@link configuration} not set.\n * @param isStealthModeEnabled `stealthModeEnabled` config value.\n */\n setStealthModeEnabled(isStealthModeEnabled) {\n return __awaiter(this, void 0, void 0, function* () {\n this.configuration.settings.stealthModeEnabled = isStealthModeEnabled;\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Updates `selfDestructFirstPartyCookies` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isSelfDestructFirstPartyCookies `selfDestructFirstPartyCookies` stealth config value.\n */\n setSelfDestructFirstPartyCookies(isSelfDestructFirstPartyCookies) {\n this.configuration.settings.stealth.selfDestructFirstPartyCookies = isSelfDestructFirstPartyCookies;\n }\n /**\n * Updates `selfDestructThirdPartyCookies` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isSelfDestructThirdPartyCookies `selfDestructThirdPartyCookies` stealth config value.\n */\n setSelfDestructThirdPartyCookies(isSelfDestructThirdPartyCookies) {\n this.configuration.settings.stealth.selfDestructThirdPartyCookies = isSelfDestructThirdPartyCookies;\n }\n /**\n * Updates `selfDestructFirstPartyCookiesTime` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param selfDestructFirstPartyCookiesTime `selfDestructFirstPartyCookiesTime` stealth config value.\n */\n setSelfDestructFirstPartyCookiesTime(selfDestructFirstPartyCookiesTime) {\n this.configuration.settings.stealth.selfDestructFirstPartyCookiesTime = selfDestructFirstPartyCookiesTime;\n }\n /**\n * Updates `selfDestructThirdPartyCookiesTime` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param selfDestructThirdPartyCookiesTime `selfDestructThirdPartyCookiesTime` stealth config value.\n */\n setSelfDestructThirdPartyCookiesTime(selfDestructThirdPartyCookiesTime) {\n this.configuration.settings.stealth.selfDestructThirdPartyCookiesTime = selfDestructThirdPartyCookiesTime;\n }\n /**\n * Updates `hideReferrer` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isHideReferrer `isHideReferrer` stealth config value.\n */\n setHideReferrer(isHideReferrer) {\n this.configuration.settings.stealth.hideReferrer = isHideReferrer;\n }\n /**\n * Updates `hideSearchQueries` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isHideSearchQueries `hideSearchQueries` stealth config value.\n */\n setHideSearchQueries(isHideSearchQueries) {\n this.configuration.settings.stealth.hideSearchQueries = isHideSearchQueries;\n }\n /**\n * Updates `blockChromeClientData` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isBlockChromeClientData `blockChromeClientData` stealth config value.\n */\n setBlockChromeClientData(isBlockChromeClientData) {\n this.configuration.settings.stealth.blockChromeClientData = isBlockChromeClientData;\n }\n /**\n * Updates `sendDoNotTrack` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isSendDoNotTrack `sendDoNotTrack` stealth config value.\n */\n setSendDoNotTrack(isSendDoNotTrack) {\n this.configuration.settings.stealth.sendDoNotTrack = isSendDoNotTrack;\n }\n /**\n * Updates `blockWebRTC` stealth config value without re-initialization of engine.\n * Also updates webRTC privacy.network settings on demand.\n *\n * @throws Error if {@link configuration} not set.\n * @param isBlockWebRTC `blockWebRTC` stealth config value.\n */\n setBlockWebRTC(isBlockWebRTC) {\n return __awaiter(this, void 0, void 0, function* () {\n this.configuration.settings.stealth.blockWebRTC = isBlockWebRTC;\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Creates configuration context.\n *\n * @param configuration Configuration.\n * @returns Configuration context.\n */\n static createConfigurationMV2Context(configuration) {\n const { filters, verbose, settings } = configuration;\n return {\n filters: filters.map(({ filterId }) => filterId),\n verbose,\n settings,\n };\n }\n}\n\nexport { BACKGROUND_TAB_ID, ContentType, EventChannel, FilteringEventType, FilteringLog, Frame, INITIATOR_TAG_HIDDEN_STYLE, Logger, MAIN_FRAME_ID, MESSAGE_HANDLER_NAME, MessageType, RequestBlockingApi, RequestContextStorage, RequestEvent, RequestEvents, StealthActions, StealthHelper, TabContext, TabsApi, TsWebExtension, configurationMV2Validator, configurationValidator, createInjectionFsm, defaultFilteringLog, filterMV2Validator, getAssistantCreateRulePayloadValidator, getCookieRulesPayloadValidator, getCssPayloadValidator, getDomain, getErrorMessage, getExtendedCssPayloadValidator, getHost, getRequestType, getSaveCookieLogEventPayloadValidator, hideRequestInitiatorElement, isExtensionUrl, isHttpOrWsRequest, isHttpRequest, isThirdPartyRequest, logger, messageValidator, processShouldCollapsePayloadValidator, requestContextStorage, sendAppMessage, settingsConfigValidator, stealthConfigValidator, tabsApi };\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n/**\n * Helper class for work with semver\n *\n * Parsed semver string saves in {@link data} property.\n * We save first {@link MAX_LENGTH} parts of parsed string.\n * If there are less than {@link MAX_LENGTH} parts in the version, the missing ones are filled with zeros\n * For example, entry string `1.1` will be parsed as `[1, 1, 0, 0]`.\n *\n * @param version - semver string\n * @class\n * @throws error, if passed string cannot be parsed\n */\nexport class Version {\n private static MAX_LENGTH = 4;\n\n // splitted semver\n public data: number[] = [];\n\n constructor(version: string) {\n const parts = String(version || \"\").split(\".\", Version.MAX_LENGTH);\n\n for (let i = 0; i < Version.MAX_LENGTH; i += 1) {\n if (parts[i] === \"\") {\n throw new Error(`Found empty part in string '${version}'`);\n }\n\n const part = parts[i] || \"0\";\n\n if (Number.isNaN(Number.parseInt(part, 10))) {\n throw new Error(`Can not parse '${version}' string`);\n }\n\n this.data[i] = Math.max(Number(part), 0);\n }\n }\n\n /**\n * Compare current semver with passed\n *\n * @param version - {@link Version} instance\n * @returns number, indicates the result of the comparison (1 - greater, -1 - less, 0 - equals).\n * @throws error, if some version data is invalid\n */\n public compare(version: Version): number {\n for (let i = 0; i < Version.MAX_LENGTH; i += 1) {\n const leftPart = this?.data?.[i];\n const rightPart = version?.data?.[i];\n\n if (typeof leftPart !== \"number\" || typeof rightPart !== \"number\") {\n throw new Error(\"Can not compare versions\");\n }\n\n if (leftPart > rightPart) {\n return 1;\n }\n if (leftPart < rightPart) {\n return -1;\n }\n }\n return 0;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Version } from \"./version\";\n\n/**\n * Helper class for working with browser extension context\n */\nexport class BrowserUtils {\n /**\n * Checks if left version is greater than the right version or equals\n *\n * @param leftVersion - semver string\n * @param rightVersion - semver string\n * @returns true, if left version is greater than the right version or equals, else returns false\n */\n public static isGreaterOrEqualsVersion(leftVersion: string, rightVersion: string): boolean {\n const left = new Version(leftVersion);\n const right = new Version(rightVersion);\n return left.compare(right) >= 0;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// typing for navigator UA client data API\n\n// WICG Spec: https://wicg.github.io/ua-client-hints\n// https://wicg.github.io/ua-client-hints/#navigatorua\ndeclare global {\n interface Navigator {\n readonly userAgentData?: NavigatorUAData;\n }\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-navigatoruabrandversion\ninterface NavigatorUABrandVersion {\n readonly brand: string;\n readonly version: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-uadatavalues\ninterface UADataValues {\n readonly brands?: NavigatorUABrandVersion[];\n readonly mobile?: boolean;\n readonly platform?: string;\n readonly architecture?: string;\n readonly bitness?: string;\n readonly model?: string;\n readonly platformVersion?: string;\n /** @deprecated in favour of fullVersionList */\n readonly uaFullVersion?: string;\n readonly fullVersionList?: NavigatorUABrandVersion[];\n readonly wow64?: boolean;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-ualowentropyjson\ninterface UALowEntropyJSON {\n readonly brands: NavigatorUABrandVersion[];\n readonly mobile: boolean;\n readonly platform: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#navigatoruadata\ninterface NavigatorUAData extends UALowEntropyJSON {\n getHighEntropyValues(hints: string[]): Promise;\n toJSON(): UALowEntropyJSON;\n}\n\ntype BrowserData = {\n uaStringName: string;\n brand?: string;\n};\n\n/**\n * Helper class for user agent data\n */\nexport class UserAgent {\n private static browserDataMap: Record = {\n Chrome: {\n brand: \"Google Chrome\",\n uaStringName: \"Chrome\",\n },\n Firefox: {\n uaStringName: \"Firefox\",\n },\n Safari: {\n uaStringName: \"Safari\",\n },\n Opera: {\n brand: \"Opera\",\n uaStringName: \"OPR\",\n },\n YaBrowser: {\n brand: \"Yandex\",\n uaStringName: \"YaBrowser\",\n },\n Edge: {\n uaStringName: \"edge\",\n },\n EdgeChromium: {\n brand: \"Microsoft Edge\",\n uaStringName: \"edg\",\n },\n };\n\n public static isChrome = UserAgent.isTargetBrowser(\"Chrome\");\n\n public static isFirefox = UserAgent.isTargetBrowser(\"Firefox\");\n\n public static isOpera = UserAgent.isTargetBrowser(\"Opera\");\n\n public static isEdge = UserAgent.isTargetBrowser(\"Edge\");\n\n /**\n * Check if current browser is as given\n *\n * @param browserName - Browser Name\n * @returns true, if current browser has specified name\n */\n private static isTargetBrowser(browserName: string): boolean {\n const brand = UserAgent.browserDataMap[browserName]?.brand;\n const uaStringName = UserAgent.browserDataMap[browserName]?.uaStringName;\n\n const brandsData = navigator?.userAgentData?.brands;\n\n if (!brandsData || !brand) {\n return uaStringName ? navigator.userAgent.indexOf(uaStringName) >= 0 : false;\n }\n\n for (let i = 0; i < brandsData.length; i += 1) {\n const data = brandsData[i];\n\n if (data && data.brand === brand) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n/**\n * Helper class for working with i18n locales\n */\nexport class I18n {\n /**\n * Gets matched locale from locales list\n *\n * @param locales - list of i18n locales\n * @param locale - target locale\n * @returns matched locale or null, if locale is not found\n */\n public static find(locales: string[], locale: string): string | null {\n const lang = locale.replace(\"-\", \"_\");\n\n if (locales.includes(lang)) {\n return lang;\n }\n\n const [localePart] = lang.split(\"_\");\n\n if (localePart && locales.includes(localePart)) {\n return localePart;\n }\n\n return null;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Entry point for API helper classes\n\n// Helper class for working with browser extension context\nexport { BrowserUtils } from \"./browser-utils\";\n\n// Helper class for user agent data\nexport { UserAgent } from \"./user-agent\";\n\n// Helper class for working with i18n locales\nexport { I18n } from \"./i18n\";\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n get errors() {\n return this.issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message || errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n syncPairs.push({\n key: await pair.key,\n value: await pair.value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (typeof value.value !== \"undefined\" || pair.alwaysSet) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n if (typeof ctx.data === \"undefined\") {\n return { message: required_error !== null && required_error !== void 0 ? required_error : ctx.defaultError };\n }\n return { message: invalid_type_error !== null && invalid_type_error !== void 0 ? invalid_type_error : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n }\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this, this._def);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[a-z][a-z0-9]*$/;\nconst ulidRegex = /[0-9A-HJKMNP-TV-Z]{26}/;\nconst uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\nconst emailRegex = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst emojiRegex = /^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$/u;\nconst ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/;\nconst ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\n// Adapted from https://stackoverflow.com/a/3143231\nconst datetimeRegex = (args) => {\n if (args.precision) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}Z$`);\n }\n }\n else if (args.precision === 0) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}Z$`);\n }\n }\n else {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?Z$`);\n }\n }\n};\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n constructor() {\n super(...arguments);\n this._regex = (regex, validation, message) => this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n /**\n * @deprecated Use z.string().min(1) instead.\n * @see {@link ZodString.min}\n */\n this.nonempty = (message) => this.min(1, errorUtil.errToObj(message));\n this.trim = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n this.toLowerCase = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n this.toUpperCase = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n }\n //\n );\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = BigInt(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n syncPairs.push({\n key,\n value: await pair.value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return Object.keys(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else {\n return null;\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n return OK(async (...args) => {\n const error = new ZodError([]);\n const parsedArgs = await this._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await fn(...parsedArgs);\n const parsedReturns = await this._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n return OK((...args) => {\n const parsedArgs = this._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = fn(...parsedArgs.data);\n const parsedReturns = this._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (this._def.values.indexOf(input.data) === -1) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values) {\n return ZodEnum.create(values);\n }\n exclude(values) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)));\n }\n}\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (nativeEnumValues.indexOf(input.data) === -1) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data);\n if (ctx.common.async) {\n return Promise.resolve(processed).then((processed) => {\n return this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n });\n }\n else {\n return this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc\n // effect: RefinementEffect\n ) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nconst custom = (check, params = {}, \n/*\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) => {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n};\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * {@link AdguardApi} configuration runtime validator\n */\nexport const configurationValidator = zod.object({\n /**\n * An array of filters identifiers.\n *\n * You can look for possible filters identifiers in the filters metadata file.\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\n filters: zod.number().array(),\n\n /**\n * An array of domains, for which AdGuard won't work.\n */\n allowlist: zod.string().array().optional(),\n\n /**\n * This property completely changes AdGuard behavior.\n *\n * If it is defined, Adguard will work for domains from the {@link blocklist} only.\n *\n * All other domains will be ignored. If {@link blocklist} is defined, {@link allowlist} will be ignored.\n */\n blocklist: zod.string().array().optional(),\n\n /**\n * An array of custom filtering rules.\n *\n * These custom rules might be created by a user via AdGuard Assistant UI.\n *\n * @see https://adguard.com/en/filterrules.html\n */\n rules: zod.string().array().optional(),\n\n /**\n * An absolute path to a file, containing filters metadata.\n *\n * Once started, AdGuard will periodically check filters updates by downloading this file.\n *\n * Example: `https://filters.adtidy.org/extension/chromium/filters.json`.\n */\n filtersMetadataUrl: zod.string(),\n\n /**\n * URL mask used for fetching filters rules.\n * `{filter_id}` parameter will be replaced with an actual filter identifier.\n *\n * Example: `https://filters.adtidy.org/extension/chromium/filters/{filter_id}.txt`\n *\n * English filter (filter id = 2) will be loaded from: `https://filters.adtidy.org/extension/chromium/2.txt`.\n */\n filterRulesUrl: zod.string(),\n});\n\nexport type Configuration = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Configuration schema entry point\n\n// AdguardApi configuration type and runtime validator\nexport * from \"./configuration\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod, { z } from \"zod\";\n\n/**\n * Filter metadata item runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const filterMetadataValidator = zod.object({\n description: zod.string(),\n displayNumber: zod.number(),\n expires: zod.number(),\n filterId: zod.number(),\n groupId: zod.number(),\n homepage: zod.string(),\n languages: zod.string().array(),\n name: zod.string(),\n subscriptionUrl: zod.string(),\n tags: zod.number().array(),\n timeAdded: zod.string(),\n timeUpdated: zod.string(),\n trustLevel: zod.string(),\n version: zod.string(),\n});\n\nexport type FilterMetadata = z.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * Filter tag metadata item runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const tagMetadataValidator = zod.object({\n tagId: zod.number(),\n keyword: zod.string(),\n description: zod.string().optional(),\n name: zod.string().optional(),\n});\n\nexport type TagMetadata = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * Filter group metadata item runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const groupMetadataValidator = zod.object({\n displayNumber: zod.number(),\n groupId: zod.number(),\n groupName: zod.string(),\n});\n\nexport type GroupMetadata = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\nimport { filterMetadataValidator } from \"./filter\";\nimport { tagMetadataValidator } from \"./tag\";\nimport { groupMetadataValidator } from \"./group\";\n\n/**\n * Metadata runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const metadataValidator = zod.object({\n filters: filterMetadataValidator.array(),\n groups: groupMetadataValidator.array(),\n tags: tagMetadataValidator.array(),\n});\n\nexport type Metadata = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Metadata schema entry point\n\n// Metadata runtime validator and types\nexport * from \"./metadata\";\n\n// Filter metadata item runtime validator and types\nexport * from \"./filter\";\n\n// Filter tag metadata item runtime validator and types\nexport * from \"./tag\";\n\n// Filter group metadata item runtime validator and types\nexport * from \"./group\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * In some cases we want to preprocessing input before validation\n * For example, cast loaded filter metadata item id field from string to number before validation:\n *\n * { filterId: \"1\", ... } -> { filterId: 1, ... }\n */\nexport class SchemaPreprocessor {\n /**\n * {@link zod} runtime validator with {@link castStringToBoolean} preprocessor\n */\n public static booleanValidator = zod.preprocess(SchemaPreprocessor.castStringToBoolean, zod.boolean());\n\n /**\n * {@link zod} runtime validator with {@link castStringToNumber} preprocessor\n */\n public static numberValidator = zod.preprocess(SchemaPreprocessor.castStringToNumber, zod.number());\n\n /**\n * If {@link value} is string, cast it to number, else returns original value.\n *\n * @param value - preprocessed value\n * @returns number value, if string passed, else returns original value\n */\n private static castStringToNumber(value: unknown): number | unknown {\n if (typeof value === \"string\") {\n return Number(value);\n }\n\n return value;\n }\n\n /**\n * If {@link value} is string, cast it to boolean, else returns original value.\n *\n * @param value - preprocessed value\n * @returns boolean value, if string passed, else returns original value\n */\n private static castStringToBoolean(value: unknown): boolean | unknown {\n if (typeof value === \"string\") {\n try {\n return Boolean(JSON.parse(value));\n } catch (e) {\n return value;\n }\n }\n\n return value;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\nimport { SchemaPreprocessor } from \"../preprocessor\";\n\n/**\n * Runtime validator for persistent filter version data\n */\nexport const filterVersionDataValidator = zod.object({\n version: zod.string(),\n lastCheckTime: zod.number(),\n lastUpdateTime: zod.number(),\n expires: zod.number(),\n});\n\nexport type FilterVersionData = zod.infer;\n\n/**\n * Runtime validator for persistent key value storage of filter version data.\n *\n * Key is filter metadata id.\n * Value is {@link FilterVersionData}.\n */\nexport const filterVersionStorageDataValidator = zod.record(\n SchemaPreprocessor.numberValidator,\n filterVersionDataValidator\n);\n\nexport type FilterVersionStorageData = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Filter version schema entry point\n\n// Filter version validators and types\nexport * from \"./filter-version\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Schemas entry point\n\n// Api Configuration schema entry point\nexport * from \"./configuration\";\n\n// Metadata schema entry point\nexport * from \"./metadata\";\n\n// Filter version data entry point\nexport * from \"./filter-version\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport FiltersDownloader, { DefinedExpressions } from \"@adguard/filters-downloader/browser\";\n\nimport { UserAgent } from \"./utils\";\nimport { metadataValidator, Metadata, Configuration } from \"./schemas\";\n\n/**\n * Network requests API\n *\n * This class provides methods for downloading {@link Metadata} and filter rules from remote source\n */\nexport class Network {\n // FiltersDownloader constants\n private filterCompilerConditionsConstants: DefinedExpressions = {\n adguard: true,\n adguard_ext_chromium: UserAgent.isChrome,\n adguard_ext_firefox: UserAgent.isFirefox,\n adguard_ext_edge: UserAgent.isEdge,\n adguard_ext_safari: false,\n adguard_ext_opera: UserAgent.isOpera,\n };\n\n // Cached filters metadata url\n private filtersMetadataUrl: string | undefined;\n\n // Cached filter rules url template\n private filterRulesUrl: string | undefined;\n\n /**\n * Apply network {@link Configuration} options\n *\n * @param configuration - api {@link Configuration}\n */\n public configure(configuration: Configuration): void {\n const { filtersMetadataUrl, filterRulesUrl } = configuration;\n\n this.filtersMetadataUrl = filtersMetadataUrl;\n this.filterRulesUrl = filterRulesUrl;\n }\n\n /**\n * Downloads filter rules by filter ID via {@link FiltersDownloader} module\n *\n * @param filterId - Filter id\n * @returns promise, resolved with filter rules string\n * @throws error, if {@link filterRulesUrl} is not defined or response data is not valid\n */\n public async downloadFilterRules(filterId: number): Promise {\n if (!this.filterRulesUrl) {\n throw new Error(\"filterRulesUrl option is not set\");\n }\n\n const url = this.filterRulesUrl.replace(\"{filter_id}\", String(filterId));\n\n return FiltersDownloader.download(url, this.filterCompilerConditionsConstants);\n }\n\n /**\n * Downloads and validate {@link Metadata}\n *\n * @returns promise, resolved with downloaded metadata\n * @throws error, if {@link filtersMetadataUrl} is not defined, or response data is not valid\n */\n public async downloadFiltersMetadata(): Promise {\n if (!this.filtersMetadataUrl) {\n throw new Error(\"filtersMetadataUrl option is not set\");\n }\n\n const response = await fetch(this.filtersMetadataUrl);\n\n const metadata = await response.json();\n\n if (!metadata) {\n throw new Error(`Invalid response: ${response}`);\n }\n\n return metadataValidator.parse(metadata);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport browser from \"webextension-polyfill\";\n\n/**\n * Dev-friendly API for key-value extension storage\n */\nexport class Storage {\n // Storage instance\n private storage = browser.storage.local;\n\n /**\n * Save {@link value} for {@link key}\n *\n * @param key - storage key\n * @param value - storage value\n */\n public async set(key: string, value: unknown): Promise {\n await this.storage.set({ [key]: value });\n }\n\n /**\n * Get storage value by {@link key}\n *\n * @param key - storage key\n * @returns storage value or undefined, if value was not found\n */\n public async get(key: string): Promise {\n return (await this.storage.get(key))?.[key];\n }\n\n /**\n * Remove value for {@link key}\n *\n * @param key - storage key\n */\n public async remove(key: string): Promise {\n await this.storage.remove(key);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Network } from \"../network\";\nimport { Storage } from \"../storage\";\nimport { metadataValidator, Metadata, FilterMetadata } from \"../schemas\";\nimport { Logger } from \"../logger\";\n\n// Metadata storage key for browser.storage.local\nexport const METADATA_STORAGE_KEY = \"metadata\";\n\n/**\n * Metadata Api provides methods for managing app {@link Metadata}\n */\nexport class MetadataApi {\n // Cached app metadata\n private metadata: Metadata | undefined;\n\n // Network requests API\n private network: Network;\n\n // Dev-friendly API for key-value extension storage\n private storage: Storage;\n\n // Simple Api for logging\n private logger: Logger;\n\n constructor(network: Network, storage: Storage, logger: Logger) {\n this.storage = storage;\n this.network = network;\n this.logger = logger;\n }\n\n /**\n * Reads and parses {@link Metadata} from extension storage.\n *\n * If metadata is invalid or not exist, try to load it form backend\n */\n public async init(): Promise {\n const storageData = await this.storage.get(METADATA_STORAGE_KEY);\n\n if (typeof storageData !== \"string\") {\n await this.loadMetadata();\n return;\n }\n\n try {\n const metadata = JSON.parse(storageData);\n this.metadata = metadataValidator.parse(metadata);\n } catch (e) {\n this.logger.warn(\"Can`t parse data from metadata storage, load it from backend\", e);\n await this.loadMetadata();\n }\n }\n\n /**\n * Downloads app {@link Metadata} from backend and save it in extension storage\n */\n public async loadMetadata(): Promise {\n try {\n const metadata = await this.network.downloadFiltersMetadata();\n await this.storage.set(METADATA_STORAGE_KEY, JSON.stringify(metadata));\n this.metadata = metadata;\n } catch (e) {\n this.logger.error(\"Can`t download metadata\", e);\n }\n }\n\n /**\n * Gets persisted {@link FilterMetadata} for all known filter\n *\n * @returns list of {@link FilterMetadata}\n * @throws error, if metadata is not loaded in memory\n */\n public getFiltersMetadata(): FilterMetadata[] {\n if (!this.metadata) {\n throw new Error(\"Metadata is not loaded!\");\n }\n return this.metadata.filters;\n }\n\n /**\n * Gets persisted {@link FilterMetadata} for specified filter\n *\n * @param filterId - filter id\n * @returns filter metadata for specified filter or undefined, if metadata is not found\n */\n public getFilterMetadata(filterId: number): FilterMetadata | undefined {\n return this.getFiltersMetadata().find((el) => el.filterId === filterId);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Storage } from \"../storage\";\nimport { filterVersionStorageDataValidator, FilterVersionData, FilterVersionStorageData } from \"../schemas\";\nimport { Logger } from \"../logger\";\n\n// Filters versions data storage key for browser.storage.local\nexport const FILTERS_VERSIONS_KEY = \"versions\";\n\n/**\n * Api for managing filter version data\n */\nexport class VersionsApi {\n // Cached filter version data\n private versions: FilterVersionStorageData | undefined;\n\n // Dev-friendly API for key-value extension storage\n private storage: Storage;\n\n // Simple Api for logging\n private logger: Logger;\n\n constructor(storage: Storage, logger: Logger) {\n this.logger = logger;\n this.storage = storage;\n }\n\n /**\n * Reads and parses {@link FilterVersionStorageData} from extension storage.\n *\n * If data is invalid or not exist, load default data\n */\n public async init(): Promise {\n const storageData = await this.storage.get(FILTERS_VERSIONS_KEY);\n\n if (typeof storageData !== \"string\") {\n this.loadDefaultData();\n return;\n }\n\n try {\n const versions = JSON.parse(storageData);\n this.versions = filterVersionStorageDataValidator.parse(versions);\n } catch (e) {\n this.logger.warn(\"Can`t parse data from versions storage, load default data\", e);\n this.loadDefaultData();\n }\n }\n\n /**\n * Gets installed filters ids.\n *\n * A filter is considered installed if its version data is saved\n *\n * @returns list of filters ids\n * @throws error if filter version storage data is not loaded\n */\n public getInstalledFilters(): number[] {\n if (!this.versions) {\n throw new Error(\"Filter versions are not initialized\");\n }\n return Object.keys(this.versions).map((id) => Number(id));\n }\n\n /**\n * Gets version data for specified filter\n *\n * @param filterId - filter id\n * @returns filter version data\n * @throws error if filter version storage data is not loaded\n */\n public get(filterId: number): FilterVersionData | undefined {\n if (!this.versions) {\n throw new Error(\"Filter versions are not initialized\");\n }\n\n return this.versions[filterId];\n }\n\n /**\n * Sets version data for specified filter\n *\n * @param filterId - filter id\n * @param data - filter version data\n * @throws error if filter version storage data is not loaded\n */\n public async set(filterId: number, data: FilterVersionData): Promise {\n if (!this.versions) {\n throw new Error(\"Filter versions are not initialized\");\n }\n\n this.versions[filterId] = data;\n await this.saveData();\n }\n\n /**\n * Save data in extension storage\n */\n private async saveData(): Promise {\n await this.storage.set(FILTERS_VERSIONS_KEY, JSON.stringify(this.versions));\n }\n\n /**\n * Load default empty filter storage data\n */\n private async loadDefaultData(): Promise {\n this.versions = {};\n await this.saveData();\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Storage } from \"../storage\";\n\n/**\n * Api for write and read filters rules from extension storage\n */\nexport class FilterRulesApi {\n // Dev-friendly API for key-value extension storage\n storage: Storage;\n\n constructor(storage: Storage) {\n this.storage = storage;\n }\n\n /**\n * Gets specified filter rules lines from extension storage\n *\n * @param filterId - Filter id\n * @returns specified filter rules lines\n */\n async get(filterId: number): Promise {\n return this.storage.get(FilterRulesApi.getFilterKey(filterId)) as Promise;\n }\n\n /**\n * Sets specified filter rules lines to extension storage\n *\n * @param filterId - Filter id\n * @param rules - Filter rules lines\n */\n async set(filterId: number, rules: string[]): Promise {\n await this.storage.set(FilterRulesApi.getFilterKey(filterId), rules);\n }\n\n /**\n * Generates {@link Storage} key for specified filter rules\n *\n * @param filterId - Filter Id\n * @returns storage key\n */\n private static getFilterKey(filterId: number): string {\n return `filterrules_${filterId}.txt`;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nexport enum NotifierEventType {\n DetectFilters = \"DetectFilters\",\n UpdateFilters = \"UpdateFilters\",\n}\n\nexport type DetectFiltersEvent = {\n type: NotifierEventType.DetectFilters;\n data: {\n filtersIds: number[];\n };\n};\n\nexport type UpdateFiltersEvent = {\n type: NotifierEventType.UpdateFilters;\n};\n\nexport type NotifierEvent = DetectFiltersEvent | UpdateFiltersEvent;\n\nexport type ExtractedNotifierEvent = Extract;\n\nexport type NotifierListener = (value: ExtractedNotifierEvent) => void | Promise;\n\nexport type NotifierListenersMap = { [K in NotifierEventType]: NotifierListener[] };\n\n/**\n * Type-safe mediator for app events\n *\n * Used for reduce modules coupling\n */\nexport class Notifier {\n // registered listeners mapping\n private listenersMap: NotifierListenersMap = {\n [NotifierEventType.DetectFilters]: [],\n [NotifierEventType.UpdateFilters]: [],\n };\n\n /**\n * Register listener for specified event.\n *\n * @param type - event type\n * @param listener - listener function\n */\n public addListener(type: T, listener: NotifierListener): void {\n this.listenersMap[type].push(listener);\n }\n\n /**\n * Unregister listener for specified event.\n *\n * @param type - event type\n * @param listener - listener function\n */\n public removeListener(type: T, listener: NotifierListener): void {\n const listeners = this.listenersMap[type];\n\n this.listenersMap[type] = listeners.filter((el) => el !== listener) as NotifierListenersMap[T];\n }\n\n /**\n * Execute all registered listeners for specified event type with passed data.\n *\n * @param event - event data\n */\n public publishEvent(event: T): void {\n const listeners = this.listenersMap[event.type] as NotifierListener[];\n\n listeners.forEach((listener) => {\n listener(event);\n });\n }\n}\n\nexport const notifier = new Notifier();\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\nimport { Network } from \"../network\";\nimport { Storage } from \"../storage\";\nimport { MetadataApi } from \"./metadata\";\nimport { VersionsApi } from \"./versions\";\nimport { FilterRulesApi } from \"./rules\";\nimport { BrowserUtils, I18n } from \"../utils\";\nimport { FilterMetadata } from \"../schemas\";\nimport { notifier, NotifierEventType } from \"../notifier\";\nimport { Logger } from \"../logger\";\n\n/**\n * Filter Api provides methods for managing filters data\n */\nexport class FiltersApi {\n // Api for managing app Metadata\n private metadataApi: MetadataApi;\n\n // Api for managing filter version data\n private versionsApi: VersionsApi;\n\n // Api for write and read filters rules from extension storage\n private filterRulesApi: FilterRulesApi;\n\n // Network requests Api\n private network: Network;\n\n // Simple Api for logging\n private logger: Logger;\n\n constructor(network: Network, storage: Storage, logger: Logger) {\n this.logger = logger;\n this.metadataApi = new MetadataApi(network, storage, this.logger);\n this.versionsApi = new VersionsApi(storage, this.logger);\n this.filterRulesApi = new FilterRulesApi(storage);\n this.network = network;\n }\n\n /**\n * Initializes linked APIs\n */\n public async init(): Promise {\n await this.metadataApi.init();\n await this.versionsApi.init();\n }\n\n /**\n * Gets filter rules lists for specified filters ids.\n *\n * @param filterIds - list of filter ids\n * @returns filters data for {@link TsWebExtension} configuration\n */\n public async getFilters(filterIds: number[]): Promise<\n {\n content: string;\n filterId: number;\n trusted: boolean;\n }[]\n > {\n const tasks = filterIds.map((id) => this.getFilter(id));\n\n return Promise.all(tasks);\n }\n\n /**\n * Gets filter rules for specified filter id.\n *\n * Try to load rules from extension storage.\n * If rules is not found, download it from backend.\n *\n * @param filterId - filter id\n * @returns filters data item for {@link TsWebExtension} configuration\n */\n private async getFilter(filterId: number): Promise<{\n content: string;\n filterId: number;\n trusted: boolean;\n }> {\n let rules = await this.filterRulesApi.get(filterId);\n\n if (!Array.isArray(rules)) {\n rules = await this.loadFilterRules(filterId);\n }\n\n return {\n filterId,\n content: (rules || []).join(\"\\n\"),\n trusted: true,\n };\n }\n\n /**\n * Update filters rules lists based on {@link FilterMetadata}.\n *\n * Downloads fresh {@link Metadata} from backend\n * and match filter versions with persisted {@link FilterVersionStorageData} for each installed filter.\n * If filter version in metadata is higher, downloads and saves new rules content\n *\n * Dispatches {@link NotifierEventType.UpdateFilters} event, if at least one filter has been updated\n */\n public async updateFilters(): Promise {\n this.logger.info(\"Update filters\");\n /**\n * Reload filters metadata from backend for correct\n * version matching on update check.\n */\n await this.metadataApi.loadMetadata();\n\n const ids = this.versionsApi.getInstalledFilters();\n\n const updateTasks = ids.map(async (id) => this.updateFilter(id));\n\n const updatedFilters = await Promise.all(updateTasks);\n\n if (updatedFilters.some((filterData) => !!filterData?.filterId)) {\n notifier.publishEvent({ type: NotifierEventType.UpdateFilters });\n }\n }\n\n /**\n * Update filter rules list based on {@link FilterMetadata}\n *\n * Match filter version from {@link Metadata} with persisted filter version from {@link VersionsApi}.\n * If version in metadata is higher, downloads and saves new filter rules.\n *\n * Note: you must update {@link Metadata} first.\n *\n * @param filterId - filter id\n * @returns updated filter metadata or null, if update is not required\n */\n private async updateFilter(filterId: number): Promise {\n /* eslint-disable no-console */\n this.logger.info(`Update filter ${filterId}`);\n\n const filterMetadata = this.metadataApi.getFilterMetadata(filterId);\n\n if (!filterMetadata) {\n console.error(`Can't find filter ${filterId} metadata`);\n return null;\n }\n\n if (!this.isFilterNeedUpdate(filterMetadata)) {\n this.logger.info(`Filter ${filterId} is already updated`);\n return null;\n }\n\n try {\n await this.loadFilterRules(filterId);\n this.logger.info(`Successfully update filter ${filterId}`);\n return filterMetadata;\n } catch (e) {\n console.error(e);\n return null;\n }\n /* eslint-enable no-console */\n }\n\n /**\n * Checks if filter need update.\n * Matches version from updated metadata with data in filter version storage.\n *\n * @param filterMetadata - updated filter metadata\n * @returns true, if filter update is required, else returns false.\n */\n private isFilterNeedUpdate(filterMetadata: FilterMetadata): boolean {\n this.logger.info(`Check if filter ${filterMetadata.filterId} need to update`);\n\n const filterVersion = this.versionsApi.get(filterMetadata.filterId);\n\n // filter is not installed\n if (!filterVersion) {\n return false;\n }\n\n return !BrowserUtils.isGreaterOrEqualsVersion(filterVersion.version, filterMetadata.version);\n }\n\n /**\n * Download filter rules from backend\n *\n * @param filterId - filter Id\n * @returns list of downloaded rules lines\n */\n private async loadFilterRules(filterId: number): Promise {\n this.logger.info(`Download rules for filter ${filterId}`);\n\n const filterMetadata = this.metadataApi.getFilterMetadata(filterId);\n\n if (!filterMetadata) {\n throw new Error(`filter ${filterId} metadata is not found`);\n }\n\n const rules = await this.network.downloadFilterRules(filterId);\n await this.filterRulesApi.set(filterId, rules);\n\n const { version, expires, timeUpdated } = filterMetadata;\n\n this.versionsApi.set(filterId, {\n version,\n expires,\n lastUpdateTime: new Date(timeUpdated).getTime(),\n lastCheckTime: Date.now(),\n });\n\n return rules;\n }\n\n /**\n * Gets list of filters for the specified language\n *\n * @param locale - page locale\n * @returns list of filters ids for the specified language\n */\n public getFilterIdsForLanguage(locale: string): number[] {\n const filters = this.metadataApi.getFiltersMetadata();\n\n const filterIds: number[] = [];\n\n filters.forEach(({ languages, filterId }) => {\n const language = I18n.find(languages, locale);\n if (language) {\n filterIds.push(filterId);\n }\n });\n\n return filterIds;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { FiltersApi } from \"./api\";\n\n/**\n * Service for scheduling filters rules updates\n */\nexport class FiltersUpdateService {\n // update checking initialization delay\n private static initDelay = 1000 * 60 * 5; // 5 min\n\n // update checking period\n private static checkPeriodMs = 1000 * 60 * 30; // 30 min\n\n // current update timer\n private updateTimerId: number | undefined;\n\n // current initialization delay timer\n private delayTimerId: number | undefined;\n\n // API for managing filters data\n private api: FiltersApi;\n\n constructor(api: FiltersApi) {\n this.api = api;\n }\n\n /**\n * Initialize update scheduler with {@link initDelay}\n */\n public start(): void {\n this.delayTimerId = window.setTimeout(async () => {\n await this.scheduleUpdate();\n }, FiltersUpdateService.initDelay);\n }\n\n /**\n * Clear current timers\n */\n public stop(): void {\n if (this.delayTimerId) {\n window.clearTimeout(this.delayTimerId);\n }\n\n if (this.updateTimerId) {\n window.clearTimeout(this.updateTimerId);\n }\n }\n\n /**\n * Schedule filter data update after {@link checkPeriodMs}\n */\n private async scheduleUpdate(): Promise {\n if (this.updateTimerId) {\n window.clearTimeout(this.updateTimerId);\n }\n\n await this.api.updateFilters();\n\n this.updateTimerId = window.setTimeout(async () => {\n await this.scheduleUpdate();\n }, FiltersUpdateService.checkPeriodMs);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport browser, { Tabs } from \"webextension-polyfill\";\nimport { isHttpRequest, getDomain } from \"@adguard/tswebextension\";\n\nimport { UserAgent } from \"../utils\";\nimport { Configuration } from \"../schemas\";\nimport { FiltersApi } from \"./api\";\nimport { notifier, NotifierEventType } from \"../notifier\";\n\nexport type BrowsingLanguage = {\n language: string;\n time: number;\n};\n\n/**\n *\n * This service is used to auto-enable language-specific filters.\n *\n * Tracks page language, reading data on browser tab update.\n *\n * If language hits some times, checks if language filter\n * is disabled and dispatches {@link NotifierEventType.DetectFilters} event with detected filter ids.\n */\nexport class LocaleDetectService {\n // Language hits threshold\n private static SUCCESS_HIT_COUNT = 3;\n\n // Max count of hits, stored in memory\n private static MAX_HISTORY_LENGTH = 10;\n\n // Page locale to filter language data mapping\n private static domainToLanguagesMap: Record = {\n // Russian\n ru: \"ru\",\n ua: \"ru\",\n by: \"ru\",\n kz: \"ru\",\n // English\n com: \"en\",\n au: \"en\",\n uk: \"en\",\n nz: \"en\",\n // German\n de: \"de\",\n at: \"de\",\n // Japanese\n jp: \"ja\",\n // Dutch\n nl: \"nl\",\n // French\n fr: \"fr\",\n // Spanish\n es: \"es\",\n // Italian\n it: \"it\",\n // Portuguese\n pt: \"pt\",\n // Polish\n pl: \"pl\",\n // Czech\n cz: \"cs\",\n // Bulgarian\n bg: \"bg\",\n // Lithuanian\n lt: \"lt\",\n // Latvian\n lv: \"lv\",\n // Arabic\n eg: \"ar\",\n dz: \"ar\",\n kw: \"ar\",\n ae: \"ar\",\n // Slovakian\n sk: \"sk\",\n // Romanian\n ro: \"ro\",\n // Suomi\n fi: \"fi\",\n // Icelandic\n is: \"is\",\n // Norwegian\n no: \"no\",\n // Greek\n gr: \"el\",\n // Hungarian\n hu: \"hu\",\n // Hebrew\n il: \"he\",\n // Chinese\n cn: \"zh\",\n // Indonesian\n id: \"id\",\n // Turkish\n tr: \"tr\",\n };\n\n // Memory storage for language hits\n private browsingLanguages: BrowsingLanguage[] = [];\n\n // Api for managing filters data\n private filtersApi: FiltersApi;\n\n // list of enabled filters ids\n private enabledFilters: number[] = [];\n\n constructor(filtersApi: FiltersApi) {\n this.filtersApi = filtersApi;\n this.onTabUpdated = this.onTabUpdated.bind(this);\n }\n\n /**\n * Add tab updates listener\n */\n public start(): void {\n browser.tabs.onUpdated.addListener(this.onTabUpdated);\n }\n\n /**\n * Remove tab updates listener\n */\n public stop(): void {\n browser.tabs.onUpdated.removeListener(this.onTabUpdated);\n }\n\n /**\n * Set enabled filters ids on {@link Configuration} load\n *\n * @param configuration - loaded {@link Configuration}\n */\n public configure(configuration: Configuration): void {\n this.enabledFilters = configuration.filters;\n }\n\n /**\n * Handles tab data on update\n *\n * @param _tabId - Tab id\n * @param _changeInfo - Tab change info\n * @param tab - Tab details record\n */\n private onTabUpdated(_tabId: number, _changeInfo: Tabs.OnUpdatedChangeInfoType, tab: Tabs.Tab): void {\n if (tab.status === \"complete\") {\n this.detectTabLanguage(tab);\n }\n }\n\n /**\n * Detects language for the specified tab\n *\n * @param tab - {@link Tabs.Tab} data\n */\n private async detectTabLanguage(tab: Tabs.Tab): Promise {\n if (\n !tab.url ||\n // Check language only for http://... tabs\n !isHttpRequest(tab.url)\n ) {\n return;\n }\n\n // tabs.detectLanguage doesn't work in Opera\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/997\n if (!UserAgent.isOpera) {\n if (tab.id && browser.tabs && browser.tabs.detectLanguage) {\n // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/detectLanguage\n try {\n const language = await browser.tabs.detectLanguage(tab.id);\n this.detectLanguage(language);\n } catch (e) {\n // do nothing\n }\n return;\n }\n }\n\n // Detecting language by top-level domain if extension API language detection is unavailable\n // Ignore hostnames which length is less or equal to 8\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1354\n const host = getDomain(tab.url);\n if (host && host.length > 8) {\n const parts = host.split(\".\");\n const tld = parts.at(-1);\n\n if (!tld) {\n return;\n }\n\n const lang = LocaleDetectService.domainToLanguagesMap[tld];\n\n if (!lang) {\n return;\n }\n\n this.detectLanguage(lang);\n }\n }\n\n /**\n * Stores language in the special array containing languages of the last visited pages.\n * If user has visited enough pages with a specified language we call special callback\n * to auto-enable filter for this language\n *\n * @param language - Page language\n */\n private detectLanguage(language: string): void {\n /**\n * For an unknown language \"und\" will be returned\n * https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/detectLanguage\n */\n if (!language || language === \"und\") {\n return;\n }\n\n this.browsingLanguages.push({\n language,\n time: Date.now(),\n });\n\n if (this.browsingLanguages.length > LocaleDetectService.MAX_HISTORY_LENGTH) {\n this.browsingLanguages.shift();\n }\n\n const history = this.browsingLanguages.filter((h) => {\n return h.language === language;\n });\n\n if (history.length >= LocaleDetectService.SUCCESS_HIT_COUNT) {\n const filterIds = this.filtersApi.getFilterIdsForLanguage(language);\n this.onFilterDetectedByLocale(filterIds);\n }\n }\n\n /**\n * Called when LocaleDetector has detected language-specific filters we can enable.\n *\n * @param filterIds - list of detected language-specific filters identifiers\n */\n private onFilterDetectedByLocale(filterIds: number[]): void {\n if (!filterIds || filterIds.length === 0) {\n return;\n }\n\n const filtersIds = filterIds.filter((filterId) => !this.enabledFilters.includes(filterId));\n\n notifier.publishEvent({\n type: NotifierEventType.DetectFilters,\n data: {\n filtersIds,\n },\n });\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Entry point for filter management modules\n\n// Filters data management API\nexport { FiltersApi } from \"./api\";\n\n// Service for scheduling filters rules updates\nexport { FiltersUpdateService } from \"./update\";\n\n// Service for auto-enabling language filters\nexport { LocaleDetectService } from \"./locale-detect\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport {\n ApplyBasicRuleEvent,\n ContentType,\n defaultFilteringLog,\n EventChannel,\n EventChannelListener,\n FilteringEventType,\n requestContextStorage,\n} from \"@adguard/tswebextension\";\n\nexport type RequestBlockingEvent = {\n // Tab identifier.\n tabId: number;\n // Blocked request URL.\n requestUrl: string;\n // Referrer URL.\n referrerUrl: string;\n // Filtering rule, which has blocked this request.\n rule: string;\n // Rule's filter identifier.\n filterId: number;\n // Request mime type.\n requestType: ContentType;\n};\n\nexport interface RequestBlockingLoggerInterface {\n addListener(listener: EventChannelListener): void;\n removeListener(listener: EventChannelListener): void;\n}\n\n/**\n * API for adding and removing listeners for request blocking events.\n *\n * Wraps {@link defaultFilteringLog} {@link EventChannel} for {@link ApplyBasicRuleEvent}\n */\nexport class RequestBlockingLogger implements RequestBlockingLoggerInterface {\n private channel = new EventChannel();\n\n constructor() {\n this.onBasicRuleApply = this.onBasicRuleApply.bind(this);\n defaultFilteringLog.addEventListener(FilteringEventType.ApplyBasicRule, this.onBasicRuleApply);\n }\n\n // map public API to event channel\n\n public addListener(listener: EventChannelListener): void {\n this.channel.subscribe(listener);\n }\n\n public removeListener(listener: EventChannelListener): void {\n this.channel.unsubscribe(listener);\n }\n\n /**\n * Handles {@link ApplyBasicRuleEvent}, gets extra data for {@link requestContextStorage}\n * and dispatch new {@link RequestBlockingEvent}\n *\n * @param event - {@link ApplyBasicRuleEvent}\n */\n private onBasicRuleApply(event: ApplyBasicRuleEvent): void {\n const { eventId, rule, tabId } = event.data;\n\n // exclude allowlist rules\n if (rule.isAllowlist()) {\n return;\n }\n\n const requestContext = requestContextStorage.get(eventId);\n\n if (!requestContext) {\n return;\n }\n\n const { requestUrl, contentType, referrerUrl } = requestContext;\n\n this.channel.dispatch({\n tabId,\n rule: rule.getText(),\n filterId: rule.getFilterListId(),\n requestUrl,\n referrerUrl,\n requestType: contentType,\n });\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n/**\n * Simple API for logging\n */\nexport class Logger {\n private api = console;\n\n public info(...args: unknown[]): void {\n this.api.log(...args);\n }\n\n public error(...args: unknown[]): void {\n this.api.error(...args);\n }\n\n public warn(...args: unknown[]): void {\n this.api.warn(...args);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\nexport const API_OUTPUT = \"adguard-api\";\nexport const CONTENT_SCRIPT_OUTPUT = \"adguard-content\";\nexport const ASSISTANT_OUTPUT = \"adguard-assistant\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport browser, { Runtime } from \"webextension-polyfill\";\nimport {\n TsWebExtension,\n ConfigurationMV2 as TsWebExtensionConfiguration,\n EventChannel,\n MESSAGE_HANDLER_NAME,\n Message,\n} from \"@adguard/tswebextension\";\n\nimport { Network } from \"./network\";\nimport { Storage } from \"./storage\";\nimport { FiltersApi, FiltersUpdateService, LocaleDetectService } from \"./filters\";\nimport { Configuration, configurationValidator } from \"./schemas\";\nimport { DetectFiltersEvent, notifier, NotifierEventType } from \"./notifier\";\nimport { RequestBlockingLogger } from \"./request-blocking-logger\";\nimport { Logger } from \"./logger\";\n\nimport { ASSISTANT_OUTPUT } from \"../../constants\";\n\n/**\n * By the rules of Firefox AMO we cannot use remote scripts (and our JS rules can be counted as such).\n * Because of that we use the following approach (that was accepted by AMO reviewers):\n *\n * 1. We pre-build JS rules from AdGuard filters into the JSON file.\n * 2. At runtime we check every JS rule if it's included into JSON.\n * If it is included we allow this rule to work since it's pre-built. Other rules are discarded.\n * 3. We also allow \"User rules\" to work since those rules are added manually by the user.\n * This way filters maintainers can test new rules before including them in the filters.\n */\nimport localScriptRules from \"../local_script_rules.json\";\n\nexport const WEB_ACCESSIBLE_RESOURCES_PATH = \"adguard\";\n\n/**\n * AdGuard API is filtering library, provided following features:\n * - request and content filtering, using {@link TsWebExtension}\n * - filters rules downloading and caching via {@link FiltersApi}\n * - filters rules auto updates via {@link filtersUpdateService}\n * - content blocking via AdGuard Assistant UI, provided by {@link TsWebExtension}\n * - auto detecting language filters via {@link localeDetectService}\n * - logging request processing via filtering events api, provided by {@link TsWebExtension}\n */\nexport class AdguardApi {\n // Engine instance\n private tswebextension: TsWebExtension;\n\n // Network requests API\n private network: Network;\n\n // API for managing filters data\n private filtersApi: FiltersApi;\n\n // Service for scheduling filters rules updates\n private filtersUpdateService: FiltersUpdateService;\n\n // Service for auto-enabling language-specific filters.\n private localeDetectService: LocaleDetectService;\n\n // AdguardApi configuration\n private configuration: Configuration | undefined;\n\n // Simple Api for logging\n private logger: Logger;\n\n /**\n * {@link TsWebExtension} {@link EventChannel}, which fires event on assistant rule creation.\n */\n public onAssistantCreateRule: EventChannel;\n\n /**\n * API for adding and removing listeners for request blocking events.\n *\n */\n public onRequestBlocked = new RequestBlockingLogger();\n\n constructor() {\n this.tswebextension = new TsWebExtension(WEB_ACCESSIBLE_RESOURCES_PATH);\n\n // TODO: load only in ff\n this.tswebextension.setLocalScriptRules(localScriptRules);\n\n this.onAssistantCreateRule = this.tswebextension.onAssistantCreateRule;\n\n this.network = new Network();\n\n const storage = new Storage();\n\n this.logger = new Logger();\n\n this.filtersApi = new FiltersApi(this.network, storage, this.logger);\n\n this.filtersUpdateService = new FiltersUpdateService(this.filtersApi);\n\n this.localeDetectService = new LocaleDetectService(this.filtersApi);\n\n this.handleMessage = this.handleMessage.bind(this);\n this.openAssistant = this.openAssistant.bind(this);\n this.handleDetectFilters = this.handleDetectFilters.bind(this);\n this.handleUpdateFilters = this.handleUpdateFilters.bind(this);\n }\n\n /**\n * Initializes AdGuard with specified {@link Configuration} and starts it immediately.\n *\n * @param configuration - api {@link Configuration}\n * @returns applied {@link Configuration} promise\n */\n public async start(configuration: Configuration): Promise {\n this.configuration = configurationValidator.parse(configuration);\n\n this.network.configure(this.configuration);\n\n browser.runtime.onMessage.addListener(this.handleMessage);\n\n await this.filtersApi.init();\n this.filtersUpdateService.start();\n this.localeDetectService.start();\n\n notifier.addListener(NotifierEventType.UpdateFilters, this.handleUpdateFilters);\n notifier.addListener(NotifierEventType.DetectFilters, this.handleDetectFilters);\n\n const tsWebExtensionConfiguration = await this.createTsWebExtensionConfiguration();\n\n await this.tswebextension.start(tsWebExtensionConfiguration);\n\n return configuration;\n }\n\n /**\n * Completely stops AdGuard\n */\n public async stop(): Promise {\n await this.tswebextension.stop();\n this.filtersUpdateService.stop();\n this.localeDetectService.stop();\n\n browser.runtime.onMessage.removeListener(this.handleMessage);\n }\n\n /**\n * Modifies AdGuard {@link Configuration}. Please note, that Adguard must be already started.\n *\n * @param configuration - api {@link Configuration}\n * @returns applied {@link Configuration} promise\n */\n public async configure(configuration: Configuration): Promise {\n this.configuration = configurationValidator.parse(configuration);\n\n this.network.configure(this.configuration);\n\n const tsWebExtensionConfiguration = await this.createTsWebExtensionConfiguration();\n\n await this.tswebextension.configure(tsWebExtensionConfiguration);\n\n return configuration;\n }\n\n /**\n * Opens the AdGuard assistant UI in the specified tab.\n * You should also subscribe on {@link onAssistantCreateRule} event channel for applying rules,\n * which are created by the Adguard assistant.\n *\n * @param tabId - {@link browser.tabs.Tab } id. @see https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab\n */\n public async openAssistant(tabId: number): Promise {\n await this.tswebextension.openAssistant(tabId);\n }\n\n /**\n * Closes AdGuard assistant in the specified tab.\n *\n * @param tabId - {@link browser.tabs.Tab } id. @see https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab\n */\n public async closeAssistant(tabId: number): Promise {\n await this.tswebextension.closeAssistant(tabId);\n }\n\n /**\n * Gets current loaded rules count\n *\n * @returns rules count number\n */\n public getRulesCount(): number {\n return this.tswebextension.getRulesCount();\n }\n\n /**\n * Creates {@link TsWebExtension} configuration based on current API {@link configuration}.\n *\n * @returns - {@link TsWebExtension} configuration\n */\n private async createTsWebExtensionConfiguration(): Promise {\n if (!this.configuration) {\n throw new Error(\"Api configuration is not set\");\n }\n\n let allowlistInverted = false;\n let allowlist: string[] = [];\n\n if (this.configuration.blocklist) {\n allowlist = this.configuration.blocklist;\n allowlistInverted = true;\n } else if (this.configuration.allowlist) {\n allowlist = this.configuration.allowlist;\n }\n\n const userrules = this.configuration.rules || [];\n\n const filters = await this.filtersApi.getFilters(this.configuration.filters);\n\n return {\n filters,\n allowlist,\n trustedDomains: [],\n userrules,\n verbose: false,\n settings: {\n assistantUrl: `${ASSISTANT_OUTPUT}.js`,\n filteringEnabled: true,\n stealthModeEnabled: true,\n collectStats: false,\n allowlistInverted,\n allowlistEnabled: true,\n stealth: {\n blockChromeClientData: false,\n hideReferrer: false,\n hideSearchQueries: false,\n sendDoNotTrack: false,\n blockWebRTC: false,\n selfDestructThirdPartyCookies: true,\n selfDestructThirdPartyCookiesTime: 3600,\n selfDestructFirstPartyCookies: true,\n selfDestructFirstPartyCookiesTime: 3600,\n },\n },\n };\n }\n\n /**\n * Handles messages from {@link TsWebExtension} content-script\n *\n * @param message - {@link TsWebExtension} extension {@link Message}\n * @param sender - extension {@link Runtime.MessageSender}\n * @returns TsWebExtension message handler response\n */\n // eslint-disable-next-line consistent-return\n private async handleMessage(message: Message, sender: Runtime.MessageSender): Promise {\n if (message?.handlerName === MESSAGE_HANDLER_NAME) {\n const handler = this.tswebextension.getMessageHandler();\n\n return handler(message, sender);\n }\n }\n\n /**\n * Handles fired {@link UpdateFiltersEvent}\n */\n private async handleUpdateFilters(): Promise {\n const tsWebExtensionConfig = await this.createTsWebExtensionConfiguration();\n\n await this.tswebextension.configure(tsWebExtensionConfig);\n\n this.logger.info(\"Reload engine with updated filter ids list\");\n }\n\n /**\n * Handles fired {@link DetectFiltersEvent}\n *\n * @param event - fired {@link DetectFiltersEvent}\n */\n private async handleDetectFilters(event: DetectFiltersEvent): Promise {\n if (!this.configuration) {\n throw new Error(\"Api configuration is not set\");\n }\n\n const { filters: currentFilters } = this.configuration;\n\n const filtersIds = event.data.filtersIds.filter((id) => !currentFilters.includes(id));\n\n if (filtersIds.length === 0) {\n return;\n }\n\n this.configuration.filters = [...this.configuration.filters, ...filtersIds];\n\n this.logger.info(`Add language filters ids: ${filtersIds}`);\n\n await this.handleUpdateFilters();\n }\n\n /**\n * Creates new adguardApi instance\n *\n * @returns AdguardApi instance\n */\n public static create(): AdguardApi {\n return new AdguardApi();\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// API entry point\n\n// API Configuration type\nexport type { Configuration } from \"./schemas\";\n\n// Request blocking event type\nexport type { RequestBlockingEvent } from \"./request-blocking-logger\";\n\n// Public interface\nexport { AdguardApi } from \"./main\";\n"],"names":["Version","compare","version","i","MAX_LENGTH","leftPart","data","rightPart","Error","constructor","parts","String","split","part","Number","isNaN","parseInt","Math","max","BrowserUtils","isGreaterOrEqualsVersion","leftVersion","rightVersion","left","right","UserAgent","isTargetBrowser","browserName","navigator","brand","browserDataMap","uaStringName","brandsData","userAgentData","brands","userAgent","indexOf","length","Chrome","Firefox","Safari","Opera","YaBrowser","Edge","EdgeChromium","isChrome","isFirefox","isOpera","isEdge","I18n","find","locales","locale","lang","replace","includes","localePart","zod","configurationValidator","object","filters","number","array","allowlist","string","optional","blocklist","rules","filtersMetadataUrl","filterRulesUrl","filterMetadataValidator","description","displayNumber","expires","filterId","groupId","homepage","languages","name","subscriptionUrl","tags","timeAdded","timeUpdated","trustLevel","tagMetadataValidator","tagId","keyword","groupMetadataValidator","groupName","metadataValidator","groups","SchemaPreprocessor","castStringToNumber","value","castStringToBoolean","Boolean","JSON","parse","e","booleanValidator","preprocess","boolean","numberValidator","filterVersionDataValidator","lastCheckTime","lastUpdateTime","filterVersionStorageDataValidator","record","FiltersDownloader","Network","configure","configuration","downloadFilterRules","url","download","filterCompilerConditionsConstants","downloadFiltersMetadata","response","fetch","metadata","json","adguard","adguard_ext_chromium","adguard_ext_firefox","adguard_ext_edge","adguard_ext_safari","adguard_ext_opera","browser","Storage","set","key","storage","get","remove","local","METADATA_STORAGE_KEY","MetadataApi","init","storageData","loadMetadata","logger","warn","network","stringify","error","getFiltersMetadata","getFilterMetadata","el","FILTERS_VERSIONS_KEY","VersionsApi","loadDefaultData","versions","getInstalledFilters","Object","keys","map","id","saveData","FilterRulesApi","getFilterKey","NotifierEventType","DetectFilters","UpdateFilters","Notifier","addListener","type","listener","listenersMap","push","removeListener","listeners","filter","publishEvent","event","forEach","notifier","FiltersApi","metadataApi","versionsApi","getFilters","filterIds","tasks","getFilter","Promise","all","filterRulesApi","Array","isArray","loadFilterRules","content","join","trusted","updateFilters","info","ids","updateTasks","updateFilter","updatedFilters","some","filterData","filterMetadata","console","isFilterNeedUpdate","filterVersion","Date","getTime","now","getFilterIdsForLanguage","language","FiltersUpdateService","start","delayTimerId","window","setTimeout","scheduleUpdate","initDelay","stop","clearTimeout","updateTimerId","api","checkPeriodMs","isHttpRequest","getDomain","LocaleDetectService","tabs","onUpdated","onTabUpdated","enabledFilters","_tabId","_changeInfo","tab","status","detectTabLanguage","detectLanguage","host","tld","at","domainToLanguagesMap","browsingLanguages","time","MAX_HISTORY_LENGTH","shift","history","h","SUCCESS_HIT_COUNT","filtersApi","onFilterDetectedByLocale","filtersIds","bind","ru","ua","by","kz","com","au","uk","nz","de","jp","nl","fr","es","it","pt","pl","cz","bg","lt","lv","eg","dz","kw","ae","sk","ro","fi","is","no","gr","hu","il","cn","tr","defaultFilteringLog","EventChannel","FilteringEventType","requestContextStorage","RequestBlockingLogger","channel","subscribe","unsubscribe","onBasicRuleApply","eventId","rule","tabId","isAllowlist","requestContext","requestUrl","contentType","referrerUrl","dispatch","getText","getFilterListId","requestType","addEventListener","ApplyBasicRule","Logger","args","log","API_OUTPUT","CONTENT_SCRIPT_OUTPUT","ASSISTANT_OUTPUT","TsWebExtension","MESSAGE_HANDLER_NAME","localScriptRules","WEB_ACCESSIBLE_RESOURCES_PATH","AdguardApi","runtime","onMessage","handleMessage","filtersUpdateService","localeDetectService","handleUpdateFilters","handleDetectFilters","tsWebExtensionConfiguration","createTsWebExtensionConfiguration","tswebextension","openAssistant","closeAssistant","getRulesCount","allowlistInverted","userrules","trustedDomains","verbose","settings","assistantUrl","filteringEnabled","stealthModeEnabled","collectStats","allowlistEnabled","stealth","blockChromeClientData","hideReferrer","hideSearchQueries","sendDoNotTrack","blockWebRTC","selfDestructThirdPartyCookies","selfDestructThirdPartyCookiesTime","selfDestructFirstPartyCookies","selfDestructFirstPartyCookiesTime","message","sender","handlerName","handler","getMessageHandler","tsWebExtensionConfig","currentFilters","create","onAssistantCreateRule","onRequestBlocked","setLocalScriptRules"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"adguard-api.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,uDAAuD,KAAK,cAAc,gBAAgB;AAC1F;;AAEA;AACA;AACA;AACA;AACA;AACA,qEAAqE,YAAY;AACjF;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,gEAAgE,KAAK,cAAc,gBAAgB;AACnG;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,8EAA8E,YAAY;AAC1F;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,0CAA0C;AAC9H,kGAAkG,mBAAmB;AACrH,kGAAkG,mBAAmB;;AAErH;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS,wBAAwB,QAAQ,iCAAiC,OAAO;AAClG;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS,wBAAwB,QAAQ,iCAAiC,OAAO;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;ACzJD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,kBAAkB;AACnD;;AAEA;AACA;;AAEA,cAAc;AACd;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wBAAwB,kBAAkB;AAC1C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,eAAe,SAAS;AACxB,iBAAiB,SAAS,wBAAwB,QAAQ,iCAAiC,OAAO;AAClG;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AA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ACA,CAAC;;AAED;AACA;AACA,IAAI,+CAA+C;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;ACzBD;AACA,MAAM,IAA0C;AAChD,IAAI,iCAAgC,CAAC,MAAQ,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AACxD,IAAI,KAAK,YAQN;AACH,CAAC;AACD;;AAEA,sCAAsC;;AAEtC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wHAAwH;AACxH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB,SAAS;AAC5B;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA,iDAAiD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC5I;;AAEA;AACA,gDAAgD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC3I;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB,gCAAgC,MAAM;AACtC,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA,6DAA6D,gBAAgB;AAC7E;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,mBAAmB;AACnB;;AAEA,+CAA+C,eAAe;AAC9D;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA,eAAe;AACf;AACA;;AAEA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA,WAAW;;AAEX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oCAAoC;AACrD;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;;AAGA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,GAAG;AACtB;AACA,mBAAmB,QAAQ;AAC3B;AACA,mBAAmB,aAAa;AAChC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA,0EAA0E;AAC1E;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA,aAAa;AACb,aAAa;AACb;AACA;;;AAGA;AACA;AACA,YAAY;AACZ;AACA,YAAY;;;AAGZ;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,+CAA+C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC1I;;AAEA;AACA,8CAA8C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AACzI;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,IAAI;AACJ;AACA;AACA,CAAC;AACD;;;;;;;;;ACnvCA;AACA;AACA;AACA;;AAEA;AACA,IAAI,KAA0C,GAAG,oCAAO,OAAO;AAAA;AAAA;AAAA;AAAA,kGAAC;AAChE,IAAI,CAAS;AACb,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,WAAW,+DAA+D,QAAQ,WAAW,yBAAyB,OAAO;AACtO;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,iBAAiB,yBAAyB;AAC/F;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,UAAU,wCAAwC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,wCAAwC,qBAAqB,uBAAuB;AACpF;AACA,sDAAsD;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,8BAA8B,mCAAmC;AACjE;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,oCAAoC;AACvF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,8CAA8C,6BAA6B;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,GAAG;AACV;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,4BAA4B;AAC5B,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,wBAAwB;AACxB,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wJAAwJ,IAAI;AAC5J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,0CAA0C,EAAE;AAC5C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,kBAAkB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,yBAAyB;AACzB,sBAAsB;AACtB,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,aAAa;AACvF;AACA;AACA,yBAAyB;AACzB;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA,kCAAkC,kBAAkB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;;AAEvB;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,OAAO;AAClE;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,eAAe;AAC1E;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B,iBAAiB,gBAAgB;AACjC,iBAAiB,UAAU;AAC3B;AACA,mBAAmB,aAAa;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B,iBAAiB,gBAAgB;AACjC;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,sCAAsC;AACtC;AACA,6BAA6B;AAC7B;AACA,gCAAgC;AAChC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,iBAAiB,QAAQ;AACzB,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B,mBAAmB,QAAQ;AAC3B,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F,6BAA6B;AACzH;AACA;AACA;AACA,sFAAsF,sCAAsC;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,iBAAiB,gBAAgB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,2BAA2B;AAC9G;AACA;AACA;AACA;AACA;AACA,6EAA6E,2BAA2B;AACxG;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,aAAa;AACjH;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,OAAO;AAClE;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,eAAe;AAC1E;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0CAA0C,IAAI;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,EAAE,uBAAuB,GAAG;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ,iBAAiB,KAAK;AACtE;AACA,kDAAkD,QAAQ,kBAAkB,KAAK;;AAEjF;AACA;AACA;AACA;AACA,oCAAoC,QAAQ,QAAQ,KAAK;AACzD;AACA,8CAA8C,QAAQ,SAAS,KAAK;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB,EAAE;AACnD;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAI;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA;AACA;AACA;AACA,iCAAiC;AACjC,wCAAwC;AACxC,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB,wBAAwB,oBAAoB;AAC3G;AACA;AACA;AACA;AACA,sBAAsB,oBAAoB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,UAAU,QAAQ,SAAS,YAAY;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,UAAU;AAC3B,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,yBAAyB;AACzF;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,mBAAmB;AAC7H;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F,6BAA6B;AACxH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,uBAAuB;AACvB,uBAAuB;AACvB,wBAAwB;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB;AACxB;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,yBAAyB;AACzB,4BAA4B;AAC5B,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,oBAAoB;AACpB,sBAAsB;AACtB,qBAAqB;AACrB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,WAAW;AAC/B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,8CAA8C,iBAAiB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,EAAE;AAC7C;AACA,0CAA0C,EAAE,eAAe,EAAE,YAAY;AACzE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+FAA+F,sBAAsB;AACrH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,qBAAqB;AAC7E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,kBAAkB;AACzE;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,QAAQ,0BAA0B;AAClC,2BAA2B,KAAK;AAChC;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA,iFAAiF;AACjF,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ,iEAAiE,sBAAsB;AACvF;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,wEAAwE;AACxE,cAAc;AACd;AACA;AACA,2BAA2B;AAC3B;AACA,YAAY;AACZ,mEAAmE;AACnE,YAAY;AACZ;AACA;AACA,yBAAyB;AACzB;AACA,UAAU;AACV,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA,yEAAyE,0BAA0B;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,+BAA+B;AAC/B,qCAAqC;AACrC,2BAA2B;AAC3B,iCAAiC;AACjC,kCAAkC;AAClC,2BAA2B;AAC3B,6BAA6B;AAC7B,+BAA+B;AAC/B,kCAAkC;AAClC,8BAA8B;AAC9B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,4BAA4B;AAC5B,kCAAkC;AAClC,8BAA8B;AAC9B,mCAAmC;AACnC,yCAAyC;AACzC,0CAA0C;AAC1C,kCAAkC;AAClC,wCAAwC,KAAK;AAC7C,mCAAmC;AACnC,yCAAyC,KAAK;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,gBAAgB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA,2BAA2B;AAC3B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,GAAG;AACpC;;AAEA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA,YAAY;AACZ;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+CAA+C,gCAAgC,oCAAoC,oDAAoD,6DAA6D,iEAAiE,sCAAsC;AAC3U,qCAAqC,gBAAgB,sBAAsB,OAAO,uDAAuD,6DAA6D,4CAA4C,oKAAoK,mFAAmF,KAAK;;AAE9e;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,SAAS;AAC3B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,UAAU;AAC3D;AACA,aAAa;AACb,WAAW,IAAI;AACf,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,eAAe;AACjC,kBAAkB,oBAAoB;AACtC;AACA,kBAAkB,SAAS;AAC3B;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kBAAkB;AAChD;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,+BAA+B;AAC/B,kCAAkC;AAClC,iCAAiC;AACjC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,eAAe;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV,gDAAgD,6BAA6B;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,GAAG;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,wBAAwB;AACxB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6BAA6B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,aAAa;AACnH;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,eAAe;AACjC,kBAAkB,+BAA+B;AACjD,k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C;AACA;;AAEA;;AAEA;AACA;;AAEA;;;;;;;;;ACzIA;AACA;AACA;AACA;;AAEA;AACA,IAAI,KAA0C,GAAG,oCAAO,OAAO;AAAA;AAAA;AAAA;AAAA,kGAAC;AAChE,IAAI,CAAS;AACb,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yGAAyG,WAAW,+DAA+D,QAAQ,WAAW,yBAAyB,OAAO;AACtO;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,iBAAiB,yBAAyB;AAC/F;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,UAAU,wCAAwC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,wCAAwC,qBAAqB,uBAAuB;AACpF;AACA,sDAAsD;AACtD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,8BAA8B,mCAAmC;AACjE;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,oCAAoC;AACvF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG;AAChG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,8CAA8C,6BAA6B;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,GAAG;AACV;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,4BAA4B;AAC5B,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR,wBAAwB;AACxB,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wJAAwJ,IAAI;AAC5J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,0CAA0C,EAAE;AAC5C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,kBAAkB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,aAAa;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,yBAAyB;AACzB,sBAAsB;AACtB,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,aAAa;AACvF;AACA;AACA,yBAAyB;AACzB;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA,kCAAkC,kBAAkB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,eAAe;AAC7B;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;;AAEvB;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,OAAO;AAClE;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,eAAe;AAC1E;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE;AACnC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B,iBAAiB,gBAAgB;AACjC,iBAAiB,UAAU;AAC3B;AACA,mBAAmB,aAAa;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B,iBAAiB,gBAAgB;AACjC;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,sCAAsC;AACtC;AACA,6BAA6B;AAC7B;AACA,gCAAgC;AAChC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,iBAAiB,QAAQ;AACzB,mBAAmB,UAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB,mBAAmB;AACnB;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,UAAU;AAC7B,mBAAmB,QAAQ;AAC3B,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F,6BAA6B;AACzH;AACA;AACA;AACA,sFAAsF,sCAAsC;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D;AAC3D,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,iBAAiB,gBAAgB;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,SAAS;AAC1B,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,2BAA2B;AAC9G;AACA;AACA;AACA;AACA;AACA,6EAA6E,2BAA2B;AACxG;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,aAAa;AACjH;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,OAAO;AAClE;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,eAAe;AAC1E;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0CAA0C,IAAI;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,EAAE,uBAAuB,GAAG;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ,iBAAiB,KAAK;AACtE;AACA,kDAAkD,QAAQ,kBAAkB,KAAK;;AAEjF;AACA;AACA;AACA;AACA,oCAAoC,QAAQ,QAAQ,KAAK;AACzD;AACA,8CAA8C,QAAQ,SAAS,KAAK;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,aAAa;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB,EAAE;AACnD;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,cAAc;AAC/B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAI;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA;AACA;AACA;AACA,iCAAiC;AACjC,wCAAwC;AACxC,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB,wBAAwB,oBAAoB;AAC3G;AACA;AACA;AACA;AACA,sBAAsB,oBAAoB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS,UAAU,QAAQ,SAAS,YAAY;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,iBAAiB,UAAU;AAC3B,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,yBAAyB;AACzF;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0G,mBAAmB;AAC7H;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F,6BAA6B;AACxH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,uBAAuB;AACvB,uBAAuB;AACvB,wBAAwB;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wBAAwB;AACxB;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,yBAAyB;AACzB,4BAA4B;AAC5B,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,oBAAoB;AACpB,sBAAsB;AACtB,qBAAqB;AACrB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,WAAW;AAC/B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oBAAoB,WAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,8CAA8C,iBAAiB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,EAAE;AAC7C;AACA,0CAA0C,EAAE,eAAe,EAAE,YAAY;AACzE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+FAA+F,sBAAsB;AACrH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,qBAAqB;AAC7E;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,oDAAoD,kBAAkB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,kBAAkB;AACzE;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,mBAAmB,eAAe;AAClC;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,QAAQ,0BAA0B;AAClC,2BAA2B,KAAK;AAChC;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA,iFAAiF;AACjF,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,YAAY;AACZ,iEAAiE,sBAAsB;AACvF;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,wEAAwE;AACxE,cAAc;AACd;AACA;AACA,2BAA2B;AAC3B;AACA,YAAY;AACZ,mEAAmE;AACnE,YAAY;AACZ;AACA;AACA,yBAAyB;AACzB;AACA,UAAU;AACV,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA,yEAAyE,0BAA0B;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,+BAA+B;AAC/B,qCAAqC;AACrC,2BAA2B;AAC3B,iCAAiC;AACjC,kCAAkC;AAClC,2BAA2B;AAC3B,6BAA6B;AAC7B,+BAA+B;AAC/B,kCAAkC;AAClC,8BAA8B;AAC9B,2BAA2B;AAC3B,2BAA2B;AAC3B,2BAA2B;AAC3B,4BAA4B;AAC5B,kCAAkC;AAClC,8BAA8B;AAC9B,mCAAmC;AACnC,yCAAyC;AACzC,0CAA0C;AAC1C,kCAAkC;AAClC,wCAAwC,KAAK;AAC7C,mCAAmC;AACnC,yCAAyC,KAAK;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,gBAAgB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,MAAM;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA,2BAA2B;AAC3B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,8BAA8B;AAC9B;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,qDAAqD,gBAAgB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,GAAG;AACpC;;AAEA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,oDAAoD,gBAAgB;AACpE;AACA;AACA,YAAY;AACZ;AACA,2DAA2D,gBAAgB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+CAA+C,gCAAgC,oCAAoC,oDAAoD,6DAA6D,iEAAiE,sCAAsC;AAC3U,qCAAqC,gBAAgB,sBAAsB,OAAO,uDAAuD,6DAA6D,4CAA4C,oKAAoK,mFAAmF,KAAK;;AAE9e;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,SAAS;AAC3B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,UAAU;AAC3D;AACA,aAAa;AACb,WAAW,IAAI;AACf,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,eAAe;AACjC,kBAAkB,oBAAoB;AACtC;AACA,kBAAkB,SAAS;AAC3B;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,aAAa;AAClH;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,4EAA4E,aAAa;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kBAAkB;AAChD;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,+BAA+B;AAC/B,kCAAkC;AAClC,iCAAiC;AACjC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAmG,aAAa;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG,aAAa;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,eAAe;AACpH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV,gDAAgD,6BAA6B;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,GAAG;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,2BAA2B;AAC3B,wBAAwB;AACxB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kGAAkG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV,0BAA0B;AAC1B,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6BAA6B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,aAAa;AACnH;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,SAAS;AACT;AACA,8BAA8B,2BAA2B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,qDAAqD,oCAAoC;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ;AACzB,kBAAkB,QAAQ;AAC1B,kBAAkB,eAAe;AACjC,kBAAkB,+BAA+B;AACjD,kBAAkB,QAAQ;AAC1B,kBAAkB,SAAS;AAC3B,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7g2BA,eAAe,KAAiD,oBAAoB,CAA2G,CAAC,kBAAkB,mBAAmB,SAAS,cAAc,4BAA4B,YAAY,qBAAqB,2DAA2D,uCAAuC,qCAAqC,oBAAoB,EAAE,iBAAiB,4FAA4F,eAAe,wCAAwC,SAAS,EAAE,mBAAmB,8BAA8B,qDAAqD,0BAA0B,6CAA6C,sBAAsB,6DAA6D,YAAY,eAAe,SAAS,iBAAiB,iCAAiC,iBAAiB,YAA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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB,SAAS;AAC5B;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA,iDAAiD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC5I;;AAEA;AACA,gDAAgD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC3I;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB,gCAAgC,MAAM;AACtC,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA,6DAA6D,gBAAgB;AAC7E;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,mBAAmB;AACnB;;AAEA,+CAA+C,eAAe;AAC9D;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA,eAAe;AACf;AACA;;AAEA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA,WAAW;;AAEX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oCAAoC;AACrD;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;;AAGA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,GAAG;AACtB;AACA,mBAAmB,QAAQ;AAC3B;AACA,mBAAmB,aAAa;AAChC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA,0EAA0E;AAC1E;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA,aAAa;AACb,aAAa;AACb;AACA;;;AAGA;AACA;AACA,YAAY;AACZ;AACA,YAAY;;;AAGZ;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,+CAA+C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC1I;;AAEA;AACA,8CAA8C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AACzI;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,IAAI;AACJ;AACA;AACA,CAAC;AACD;;;;;;;;ACpvCA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gBAAgB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC;AACrC;AACA,+CAA+C,KAAK;AACpD;AACA,wCAAwC;AACxC,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,6DAA6D,4BAA4B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2P;;;ACvf5P;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe;AACf;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACe;AACf;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA,iDAAiD;AACjD;AACe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe;AACf;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAAe,SAAS,SAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA,2BAA2B,iKAAiK;AAC5L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AACnD;AACP;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACiC;AAC4B;AACZ;AACtB;AACc;AACD;AACD;AAChC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,mBAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAS;AACzB,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,eAAe,MAAM,QAAe;AAC9D;AACA;AACA,0BAA0B,eAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,IAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,QAAe;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA,uBAAuB,YAAY;AACnC;AACA;AACA;AACA;AACA,iCAAiC,sBAAsB;AACvD;AACA;AACA;;AClGA,6BAAe,SAAS,UAAC;AACzB,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEuE;AACJ;AACvB;AAC5C;;ACHO;AACP,iBAAiB,oBAAoB,SAAS,kBAAkB;AAChE,yBAAyB,kBAAkB,QAAQ,kBAAkB,aAAa,UAAU,kBAAkB;AAC9G;AACA;AACA,CAAC;AACM;AACP,iBAAiB,oBAAoB,SAAS,kBAAkB,oEAAoE,SAAS,oBAAoB,SAAS,kBAAkB,kBAAkB,SAAS,kBAAkB,aAAa,SAAS,kBAAkB,WAAW,SAAS,kBAAkB,WAAW,SAAS,kBAAkB,yDAAyD,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,YAAY,UAAU,kBAAkB,oBAAoB,UAAU,kBAAkB,gDAAgD,UAAU,kBAAkB,cAAc,UAAU,kBAAkB,aAAa,UAAU,kBAAkB,WAAW,UAAU,kBAAkB,cAAc,UAAU,kBAAkB,aAAa,UAAU,kBAAkB,wCAAwC,UAAU,kBAAkB,cAAc,UAAU,kB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AACA;AACA;AACA,uDAAuD,UAAU;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,KAAK;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DoE;AACvB;AAC7C;AACA;AACA;AACA,eAAe,cAAc;AACtB,gCAAgC;AACvC,WAAW,iBAAS,mBAAmB,wBAAY,WAAW,cAAc;AAC5E;AACO,sCAAsC;AAC7C,IAAI,mBAAW;AACf,WAAW,iBAAS,wBAAwB,wBAAY;AACxD;AACO,0CAA0C;AACjD,IAAI,mBAAW;AACf,WAAW,iBAAS,6BAA6B,wBAAY;AAC7D;AACO,SAAS,aAAS,kBAAkB;AAC3C;AACA;AACA;AACO,SAAS,gBAAY,kBAAkB;AAC9C;AACA;AACA;AACO,SAAS,0BAAsB,kBAAkB;AACxD;AACA;AACA;AACA;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+F;;;AC1D/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEuB;;;;;;;;;AClCvB;;AAEA;AACA,sBAAsB,KAAK,QAAQ,KAAK;AACxC;;AAEA,wGAAwG,EAAE;;AAE1G,+BAA+B,IAAI;;AAEnC;AACA;AACA,KAAK,UAAU,GAAG,EAAE,KAAK,UAAU;AACnC,KAAK,UAAU,GAAG,EAAE,KAAK,GAAG,IAAI,UAAU;AAC1C,KAAK,UAAU,GAAG,EAAE,MAAM,GAAG,OA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AChE,IAAI;AACJ,8BAA8B,iBAAiB;AAC/C;AACA;;AAEO,SAAS,gBAAK;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB,IAAI,GAAG,SAAS,QAAQ,GAAG;AAClD;AACA;AACA,MAAM;AACN,sDAAsD,IAAI;AAC1D;AACA;;AAEA;AACA;AACA,SAAS,iBAAiB,EAAE,OAAO;AACnC,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA,6BAA6B,UAAU,EAAE,sBAAsB;AAC/D,2BAA2B,UAAU,EAAE,sBAAsB;AAC7D;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA,qCAAqC;;AAErC;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA,mCAAmC;;AAEnC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8BAA8B;AAC9C;;AAEA;AACA;AACA;AACA;AACA,OAAO,kCAAkC;AACzC,OAAO,8BAA8B;AACrC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,mCAAmC,GAAG,+BAA+B;AACpF,MAAM;AACN,eAAe,iCAAiC;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA,gBAAgB,WAAW;;AAE3B;AACA;AACA,mCAAmC,mCAAmC;AACtE;;AAEA;AACA;AACA,mCAAmC,+BAA+B;AAClE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB,WAAW;AAClC;AACA;AACA,GAAG;AACH;AACA;AACA,YAAY,GAAG,GAAG,OAAO;AACzB;;AAEA;AACA,gBAAgB,MAAM;AACtB,cAAc,qBAAqB;AACnC,kBAAkB,QAAQ;;AAE1B;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEO;AACP,wDAAwD,gBAAK;AAC7D;;AAEA,kBAAkB;AAClB,iBAAiB;AACjB,eAAe;;AAEf;AACA,8CAA8C,eAAc;AAC5D;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oCAAoC,6BAA6B;AACjE;AACA;AACA;AACA;AACA,QAAQ;AACR,oCAAoC,6BAA6B;AACjE;AACA;AACA;AACA;AACA;;AAEA,4BAA4B,eAAc,qBAAqB,eAAc;AAC7E;;AAEO;AACP;AACA;;AAEA;AACA;;AAEA,iBAAiB;AACjB,iBAAiB;;AAEjB;AACA,cAAc,gBAAgB;AAC9B;;AAEA;AACA,cAAc,gBAAgB;AAC9B;;AAEA;AACA;AACA;AACA,qBAAqB,gBAAK;AAC1B,qBAAqB,gBAAK;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;;AAEA;AACA;AACA,WAAW,qBAAqB,EAAE,gBAAK;AACvC,6BAA6B,eAAe;AAC5C,eAAe,WAAW,EAAE,gBAAgB;AAC5C;AACA;AACA;AACA;;AAEO;AACP;AACA;;AAEA;AACA,oBAAoB,gBAAK;AACzB;AACA,sBAAsB,gBAAK;;AAE3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,gBAAK;AACzB;AACA,sBAAsB,gBAAK;;AAE3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iDAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,CAAC,EAAC;;;ACxZF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iDAAiD;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,uCAAuC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE0F;;;ACzJqI;AAC+D;AAClO;AACf;AACmF;AAC5C;AACpC;AACA;AACnB;AACJ;AACa;AACqF;AAC5D;;AAE/D;AACA;AACA,WAAW,gBAAgB,sCAAsC,kBAAkB;AACnF,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACA,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,kCAAkC;AAClC;AACA;AACA,UAAU,YAAY,aAAa,SAAS,UAAU;AACtD,oCAAoC,SAAS;AAC7C;AACA;AACA;AACA,6EAA6E,OAAO;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wBAAwB;AACpC;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,6BAA6B,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,WAAW;AACjD;AACA;AACA;AACA,oBAAoB,mCAAmC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4BAA4B;AAClD,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoB;AAC5C,kDAAkD,iCAAiC,EAAE,6BAA6B;AAClH;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iCAAiC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,WAAW;AAC9C,mCAAmC,8BAA8B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,KAAK,yBAAyB,GAAG;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,+BAA+B;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,kBAAO;AACnB,sDAAsD,OAAO,QAAQ,aAAa;AAClF;AACA,kDAAkD,OAAO,QAAQ,aAAa;AAC9E;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,iBAAM;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,gDAAgD;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,0BAA0B;AAC9D,qCAAqC,0BAA0B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,0BAA0B;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB;AACrD,+DAA+D,kBAAkB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kBAAkB;AACvD;AACA;AACA;AACA,sCAAsC,kBAAkB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,8BAA8B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD,2BAA2B,8BAA8B;AACzD;AACA,gCAAgC,mCAAmC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,0BAA0B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,0BAA0B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,2BAA2B;AACxE,0CAA0C,2BAA2B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,oBAAoB;AACzE,uCAAuC,uBAAuB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,gCAAgC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,kBAAkB;AAC7D;AACA;AACA;AACA;AACA,4CAA4C,kBAAkB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,kBAAkB;AAC7D,+CAA+C,kBAAkB;AACjE,+BAA+B,oBAAoB;AACnD,+BAA+B,uBAAuB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,kBAAkB;AAC/B;AACA;AACA,aAAa,4BAA4B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,kBAAkB,8BAA8B,IAAI;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,aAAa;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,iBAAiB,QAAQ;AACzB,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,kBAAkB;AACtD;AACA;AACA;AACA,oCAAoC,sBAAsB;AAC1D;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,sBAAsB;AAC1D;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,kBAAkB;AACtD;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA,oCAAoC,0BAA0B;AAC9D;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,0BAA0B;AAC9D;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA,oCAAoC,gBAAgB;AACpD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,gBAAgB;AACpD;AACA;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA,oCAAoC,gBAAgB;AACpD;AACA;AACA,iBAAiB,QAAQ;AACzB,oCAAoC,gBAAgB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,WAAW;AACzC;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,WAAW;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kBAAkB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,kBAAkB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,2BAA2B;AACpE,0CAA0C,2BAA2B;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,+BAA+B;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,+BAA+B;AACnE;AACA;AACA;AACA;AACA;AACA,+BAA+B,uBAAuB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,+BAA+B;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gCAAgC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,+BAA+B;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,eAAI;AACrB;AACA;AACA;AACA;AACA;AACA,kEAAkE,aAAa;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,uBAAuB,0EAA0E,IAAI;AACpM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,yDAAyD;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,0DAA0D,wCAAwC;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,gBAAgB;AAC7D;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sGAAsG,uBAAuB,0EAA0E,IAAI;AAC3M;AACA,8CAA8C,0BAA0B;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,wCAAwC,0CAA0C;AAClF;AACA;AACA;AACA,wCAAwC,0CAA0C;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wFAAwF,yBAAyB;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,SAAS,IAAI;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,uBAAuB,0EAA0E,IAAI;AACzM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,0CAA0C;AACzH;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,4CAA4C;AACjH;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C,uBAAuB,QAAQ;AAC/B;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,0BAA0B,sBAAsB,0BAA0B;AACzG,qCAAqC,iCAAiC,mBAAmB,iCAAiC;AAC1H;AACA;AACA,+BAA+B,0BAA0B,qBAAqB,0BAA0B;AACxG,sCAAsC,0BAA0B;AAChE,qCAAqC,iCAAiC;AACtE;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C,uBAAuB,QAAQ;AAC/B;AACA;AACA,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8BAA8B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK;AAC7B;AACA;AACA;AACA;AACA;AACA,8BAA8B,KAAK;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,oBAAoB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,CAAC;;AAED,sHAAsH,qBAAM,mBAAmB,qBAAM;;AAErJ,WAAW;;AAEX;AACA,gBAAgB,YAAY,4BAA4B,0CAA0C,QAAQ,iBAAiB,+JAA+J,oBAAoB,0BAA0B,0JAA0J,UAAU,qCAAqC,qBAAqB,2BAA2B,mBAAmB,QAAQ,YAAY,mCAAmC,8DAA8D,sCAAsC,2CAA2C,OAAO,0BAA0B,mDAAmD,SAAS,0BAA0B,sNAAsN,QAAQ,kBAAkB,8LAA8L,QAAQ,0BAA0B,wBAAwB,OAAO,2BAA2B,UAAU,0BAA0B,qNAAqN,QAAQ,iEAAiE,OAAO,0BAA0B,SAAS,0BAA0B,UAAU,YAAY,oBAAoB,0BAA0B,aAAa,8BAA8B,kBAAkB,KAAK,EAAE,sCAAsC,SAAS,iDAAiD,EAAE,SAAS,wBAAwB,QAAQ,SAAS,WAAW,2BAA2B,EAAE,mDAAmD,UAAU,WAAW,gBAAgB,uDAAuD,cAAc,cAAc,wCAAwC,YAAY,6BAA6B,iBAAiB,2BAA2B,8BAA8B,GAAG,uBAAuB,cAAc,cAAc,wCAAwC,YAAY,6BAA6B,iBAAiB,2BAA2B,oBAAoB,GAAG,uBAAuB,cAAc,cAAc,wCAAwC,YAAY,6BAA6B,iBAAiB,2BAA2B,sBAAsB,GAAG,wBAAwB;AACt1F;AACA,EAAE;;AAEF;AACA;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,4CAA4C;AAC5G;AACA;AACA;AACA;AACA,kDAAkD,uBAAuB;AACzE;AACA,gCAAgC,KAAK;AACrC;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,QAAQ;AAC7D;AACA;AACA,yEAAyE,2CAA2C;AACpH,gCAAgC,yBAAyB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA,2EAA2E,0BAA0B;AACrG,+CAA+C,6BAA6B;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C,2BAA2B,iCAAiC,OAAO,qDAAqD;AACxH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,8BAA8B;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yBAAyB;AACxC,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,KAAK;AACpB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,kBAAkB;AAClB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,mEAAmE;AACnE;AACA,oBAAoB;AACpB;AACA,0HAA0H,wBAAwB;AAClJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,kBAAkB,QAAQ;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC;AACA;AACA;AACA;AACA;AACA,8BAA8B,iBAAiB;AAC/C,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,mCAAmC,mBAAmB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gCAAgC;AACjD,iBAAiB,sCAAsC;AACvD;AACA,iBAAiB,yCAAyC;AAC1D,iBAAiB,+CAA+C;AAChE;AACA,iBAAiB,sBAAsB;AACvC,iBAAiB,4BAA4B;AAC7C;AACA,iBAAiB,+BAA+B;AAChD,iBAAiB,qCAAqC;AACtD;AACA,iBAAiB,qBAAqB;AACtC;AACA,iBAAiB,8BAA8B;AAC/C;AACA,iBAAiB,uBAAuB;AACxC;AACA,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,yCAAyC;AAC1D,iBAAiB,+CAA+C;AAChE,iBAAiB,+BAA+B;AAChD,iBAAiB,qCAAqC;AACtD,iBAAiB,8BAA8B;AAC/C,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,kBAAkB;AACrD,iBAAiB,6CAA+B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd,iBAAiB;AACjB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C,eAAe,oBAAoB;AACnC,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,yBAAyB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+BAAiB;AACzC;AACA;AACA;AACA;AACA,kBAAkB,6CAA+B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,GAAG;AACnD;AACA,CAAC;;AAED;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,gBAAgB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,6BAA6B;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,gCAAgC;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,yCAAyC;AACzC,qCAAqC;AACrC,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,sCAAsC;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,8CAAgC;AAC7D;AACA;AACA,kEAAkE,+CAA+C;AACjH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6CAA+B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA,wBAAwB,oCAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,4BAA4B;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,2EAA2E,uCAAuC;AAClH;AACA,gFAAgF,wCAAwC;AACxH,8DAA8D,+CAA+C;AAC7G,8FAA8F;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,wBAAwB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sCAAsC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA,gCAAgC,wBAAwB;AACxD;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0BAA0B;AAChD;AACA,8EAA8E,2BAA2B;AACzG;AACA;AACA,mBAAmB,+BAA+B,OAAO,8CAA8C;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,WAAW,OAAO,WAAW;AACxF;AACA;AACA,0CAA0C,WAAW,OAAO,WAAW;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,eAAe;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD,6CAA6C,iBAAiB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,+BAA+B,2BAA2B;AAC1D,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAEskB;;;;;;AC5xOvkB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,4BAAqB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,8BAAuB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,gBAAS;AACjC;AACA;AACA;AACA;AACA,gCAAgC,4BAAqB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,8BAAuB;AAClD;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACe,SAAS,4CAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA,iDAAiD;AACjD;AACe,SAAS,gCAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA,SAAS,oBAAc;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAc;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,UAAI;AAC5B,WAAW,oBAAc,cAAc,oBAAc;AACrD;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qBAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAAe,SAAS,aAAC;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qBAAY;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA,SAAS,uBAAe,GAAG,iKAAiK;AAC5L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uBAAe,mBAAmB,uBAAe,GAAG;AACnD,SAAS,mBAAW;AAC3B;AACA,eAAe,uBAAe;AAC9B;AACA,2BAA2B,uBAAe;AAC1C;AACA;;AClBA;AACA;AACA;AACe,SAAS,sBAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACiC;AAC4B;AACZ;AACtB;AACc;AACD;AACD;AAChC,SAAS,sBAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,uBAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAS;AACzB,oCAAoC,mBAAW;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gCAAe,MAAM,YAAe;AAC9D;AACA;AACA,0BAA0B,gCAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,UAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,YAAe;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAS;AAC7B;AACA;AACA;AACA;AACA,uBAAuB,sBAAY;AACnC;AACA;AACA;AACA;AACA,iCAAiC,4CAAsB;AACvD;AACA;AACA;;AClGA,6BAAe,SAAS,iBAAC;AACzB,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEwE;AACL;AACvB;AAC5C;;ACHO,MAAM,eAAU;AACvB,qBAAqB,cAAc,YAAY;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,uBAAuB,wBAAY,gBAAgB,UAAK;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DqE;AACxB;AAC7C;AACA;AACA;AACA,MAAM,UAAM,GAAG,sBAAc;AACtB,SAAS,SAAK,kBAAkB;AACvC,WAAW,qBAAS,wBAAwB,4BAAY,WAAW,sBAAc;AACjF;AACO,SAAS,eAAW,kBAAkB;AAC7C,gCAAgC,UAAM;AACtC,wEAAwE,UAAM;AAC9E;AACO,SAAS,mBAAe,kBAAkB;AACjD,gCAAgC,UAAM;AACtC,6EAA6E,UAAM;AACnF;AACA;AACO,SAAS,kBAAS,kBAAkB;AAC3C,oBAAoB,uBAAW,CAAC,UAAM;AACtC,WAAW,qBAAS,2BAA2B,4BAAY,WAAW,UAAM;AAC5E;AACO,SAAS,qBAAY,kBAAkB;AAC9C,gCAAgC,UAAM;AACtC,0EAA0E,UAAM;AAChF;AACA;AACO,SAAS,+BAAsB,kBAAkB;AACxD,gCAAgC,UAAM;AACtC,mEAAmE,UAAM;AACzE;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oBAAoB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA;AACA,yDAAyD,2DAA2D;AACpH;AACA;AACA,wDAAwD,kCAAkC;AAC1F;AACA;AACA;AACA;AACA;AACA,+DAA+D,+BAA+B;AAC9F;AACA;AACA,sDAAsD,+BAA+B,cAAc,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,wBAAwB;AACpD,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;;AAEA;AACA;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,8BAA8B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mCAAmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mCAAmC;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,GAAG;AAC/B;AACA,sCAAsC,GAAG;AACzC,8BAA8B,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACtF;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA,qCAAqC,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACnoB;AACA,yBAAyB,sBAAsB,IAAI,gBAAgB;AACnE,sDAAsD,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC7H,+BAA+B,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC3Y;AACA;AACA;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,UAAU,EAAE,OAAO,EAAE;AACvH;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB;AAClG;AACA;AACA;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE;AAC9F;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACzE;AACA;AACA;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE;AACxG;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,+CAA+C;AAC/E;AACA;AACA,gCAAgC,8CAA8C;AAC9E;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,wDAAwD;AACjF,SAAS;AACT;AACA;AACA;AACA;AACA,2BAA2B,kDAAkD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iCAAiC;AACjC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA,uBAAuB,sDAAsD;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kBAAkB,2CAA2C;AAC7D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA,sCAAsC,SAAS;AAC/C,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,sBAAsB;AAC/D,yCAAyC,sBAAsB;AAC/D;AACA;AACA;AACA,KAAK;AACL,yCAAyC,sBAAsB;AAC/D,qCAAqC,sBAAsB;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,cAAc;AAChC,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,+BAA+B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE+pD;;;ACh3H3mD;AAC9C;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;;;;;;;;;;AChC0P;AACvJ;AAC1D;AACY;AAChC;AACQ;AACJ;AACoB;AACf;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,OAAO;AACjD;AACA;;AAEA,SAAS,YAAS;AAClB,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,yCAAyC,GAAG;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,IAAI;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAS;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yEAAyE;AACjG;AACA;AACA;AACA;AACA;AACA,uBAAuB,8CAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAK;AAC3B,4BAA4B,SAAK;AACjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,+BAA+B;AACnD;AACA;AACA,4BAA4B,oBAAoB;AAChD,wBAAwB,6BAA6B;AACrD,yCAAyC,0BAA0B;AACnE,+BAA+B,cAAc;AAC7C;AACA;AACA,2CAA2C,0BAA0B;AACrE,+BAA+B,cAAc;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C,YAAY,gBAAgB;AAC5B;AACA,yBAAyB,mDAA2B;AACpD;AACA,+BAA+B,4BAA4B;AAC3D,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,MAAM;AACrC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6CAA6C;AAC7D,cAAc,YAAY;AAC1B,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA,4BAA4B,OAAO,gBAAgB,oBAAsB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB,iBAAiB,kBAAkB,iBAAiB;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAI,gBAAW;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,SAAM;AAC3B;AACA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;AACA,mCAAmC,SAAS;AAC5C;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA,QAAQ,uDAAuD;AAC/D;AACA;AACA,mCAAmC,SAAS;AAC5C;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;AACA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA,2BAA2B,SAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B,CAAC;AACD;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA,iBAAiB,8BAA8B;AAC/C;AACA;AACA,uBAAuB,SAAS;AAChC;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA,kCAAkC,wCAAwC;AAC1E;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,YAAY,8BAA8B;AAC1C;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,2BAA2B;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAM;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA,IAAI,6BAA6B;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,wBAAwB;AACjE;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,MAAM;AAC7B,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA,qCAAqC,gCAAgC;AACrE,qCAAqC,gCAAgC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+CAA+C;AAC/D,4BAA4B,gBAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB;AAC1E;AACA,kCAAkC,gCAAgC;AAClE,kCAAkC,gCAAgC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,kDAAwB;AAChF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,YAAY,0DAAkC;AAC9C,YAAY,0DAAkC;AAC9C,YAAY,0DAAkC;AAC9C,YAAY,4DAAoC;AAChD,YAAY,kEAA0C;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,6DAAqC;AAC7C,QAAQ,6DAAqC;AAC7C,QAAQ,6DAAqC;AAC7C,QAAQ,+DAAuC;AAC/C,QAAQ,qEAA6C;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,sCAAsC,0CAAkB,GAAG;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,6BAA6B,wDAA8B;AAC3D;AACA;AACA,sCAAsC,0CAAkB;AACxD;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kDAA0B;AAC5C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,8CAAsB;AACxC,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0CAA0C;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,gBAAW;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,YAAY,sCAAsC,IAAI;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,SAAS,mBAAmB;AAC/E;AACA,wCAAwC,aAAa,EAAE,iBAAiB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,6DAA6D;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC,iBAAiB,SAAS;AAC1B,UAAU,YAAY;AACtB,aAAa,SAAS;AACtB,CAAC;AACD;AACA,IAAI,yCAAyC;AAC7C;AACA,8CAA8C,QAAQ;AACtD,gBAAgB,QAAQ;AACxB,iBAAiB,QAAQ;AACzB,iBAAiB,YAAY,CAAC,WAAa;AAC3C,CAAC;AACD;AACA,IAAI,mCAAmC;AACvC;AACA,uCAAuC,QAAQ;AAC/C,iBAAiB,QAAQ;AACzB,CAAC;AACD;AACA,IAAI,0BAA0B;AAC9B;AACA,+BAA+B,QAAQ;AACvC,SAAS,QAAQ;AACjB,cAAc,QAAQ;AACtB,CAAC;AACD;AACA,IAAI,kCAAkC;AACtC;AACA,uCAAuC,QAAQ;AAC/C,iBAAiB,QAAQ;AACzB,CAAC;AACD;AACA,IAAI,sCAAsC;AAC1C;AACA,8CAA8C,QAAQ;AACtD,gBAAgB,QAAQ;AACxB,kBAAkB,QAAQ;AAC1B,iBAAiB,QAAQ;AACzB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,gBAAgB,SAAS;AACzB,CAAC;AACD;AACA,IAAI,iCAAiC;AACrC;AACA,+CAA+C,QAAQ;AACvD,cAAc,QAAQ;AACtB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAS;AAC7C,uDAAuD,mCAAmC;AAC1F,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;AACA;AACA,6BAA6B,gBAAW;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uBAAkB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uBAAkB;AAC3B,QAAQ,uBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAe;AACxB,WAAW,uBAAkB;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA,mDAAmD,oDAA4B;AAC/E;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAM,OAAO,oBAAe;AAC5C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,cAAc;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0EAAkD;AAC5E;AACA;AACA,qBAAqB;AACrB;AACA;AACA,0BAA0B,4EAAoD;AAC9E;AACA,qBAAqB;AACrB;AACA;AACA;AACA,gBAAgB,WAAM,mDAAmD,oBAAe,IAAI;AAC5F;AACA;AACA,uBAAuB,uEAA6C;AACpE;AACA;AACA,8BAA8B,yEAAiD;AAC/E;AACA;AACA,yBAAyB;AACzB;AACA;AACA,8BAA8B,2EAAmD;AACjF;AACA,yBAAyB;AACzB;AACA;AACA;AACA,oBAAoB,WAAM,mDAAmD,oBAAe,IAAI;AAChG;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,yCAAe;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,IAAI,sEAAsE;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,MAAM;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA4E;AAC5F;AACA,sCAAsC,WAAW;AACjD;AACA;AACA;AACA,SAAS,+BAA+B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,aAAa;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,yEAAyE;AAChH;AACA,yBAAyB;AACzB,6BAA6B,aAAa,GAAG;AAC7C,2BAA2B;AAC3B,iBAAiB;AACjB,8DAA8D;AAC9D,+DAA+D;AAC/D,wCAAwC,yCAAyC,EAAE;AACnF,+CAA+C;AAC/C,sCAAsC;AACtC,wCAAwC;AACxC,uCAAuC;AACvC,2EAA2E;AAC3E,iCAAiC;AACjC,6BAA6B;AAC7B,uDAAuD;AACvD,uDAAuD;AACvD,0BAA0B,WAAW;AACrC,0BAA0B,SAAS;AACnC,qCAAqC,cAAc,OAAO;AAC1D,wCAAwC;AACxC,yBAAyB;AACzB,qBAAqB;AACrB,8DAA8D;AAC9D,0DAA0D;AAC1D,sBAAsB,MAAM;AAC5B,oHAAoH;AACpH,qBAAqB;AACrB,iBAAiB;AACjB,6BAA6B;AAC7B,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA,2BAA2B,gDAAgD,EAAE,OAAO;AACpF;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,uBAAuB;AACpC,aAAa,+BAA+B;AAC5C;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB,WAAW,UAAU,YAAY;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8BAA8B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAW,YAAY,gBAAW;AAC3F;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,kCAAkC;AACtD,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,kCAAkC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,uBAAuB;AAChD,yBAAyB,+BAA+B;AACxD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,qCAAqC;AACjD;AACA;AACA;AACA;AACA,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA,qCAAqC,cAAS;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,oBAAoB,WAAM,OAAO,oBAAe;AAChD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,oBAAoB,WAAM,OAAO,oBAAe;AAChD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,2DAA2D,yCAAyC;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,2BAA2B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,SAAS,EAAE,mBAAmB;AACxD,aAAa;AACb;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA,mCAAmC,aAAa,EAAE,mBAAmB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,yCAAyC;AACnH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E,oCAAoC;AAChH;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB,WAAW,UAAU,YAAY;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa,eAAe,8BAA8B,WAAW,UAAU,YAAY;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA,iBAAiB,2BAA2B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0BAA0B;AAC/D;AACA,2CAA2C;AAC3C,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,SAAS,MAAM,IAAI;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB,8BAA8B,uBAAuB,4BAA4B;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI,MAAM,SAAS,GAAG,IAAI,KAAK,aAAa;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uEAAuE;AAC3F;AACA;AACA;AACA;AACA,sCAAsC,KAAK;AAC3C;AACA;AACA;AACA,2BAA2B,sBAAsB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,gBAAW;AACxB;AACA,aAAa,gBAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;;AAEA,wBAAwB,uBAAgB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,iBAAiB,qBAAqB,4BAA4B;AAChG;AACA,iCAAiC,mCAAmC;AACpE,SAAS,6CAA6C;AACtD;AACA;AACA;AACA,uCAAuC,+BAA+B;AACtE,IAAI,qCAAqC;AACzC,uCAAuC,+BAA+B;AACtE;AACA,gDAAgD,oBAAoB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,8BAA8B;AAClE;AACA,iCAAiC,oBAAoB;AACrD;AACA;AACA,gBAAgB,2BAA2B;AAC3C;AACA;AACA;AACA;AACA,6DAA6D,6CAA6C;AAC1G;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA,2CAA2C,oCAAoC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2CAAmB,GAAG,kBAAkB;AACpD;AACA,gBAAgB,2CAAmB;AACnC,aAAa;AACb;AACA,gBAAgB,WAAM,yDAAyD,EAAE;AACjF,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAW;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,2CAAmB,UAAU,KAAK;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,eAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,eAAM;AAC/B;AACA;AACA,uDAAuD,yCAAyC;AAChG;AACA;AACA;AACA;AACA,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA,6CAA6C,+CAA+C;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,8CAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,UAAU,EAAE,YAAY;AAC9C;AACA;AACA,QAAQ,sEAA8C;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,yEAAiD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,8CAAsB,KAAK,YAAY,GAAG,KAAK,GAAG,wBAAwB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB,kFAAkF,OAAO;AACzF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,WAAW,EAAE,aAAa,GAAG,kBAAkB;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,qCAAqC,sCAAmB;AACxD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM,mDAAmD,MAAM;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,oBAAoB;AACnF;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,2BAA2B;AACtC,QAAQ,qCAAqC;AAC7C;AACA,WAAW,6BAA6B;AACxC;AACA,oCAAoC,8BAA8B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,yBAAyB;AACrE,4CAA4C,0BAA0B;AACtE;AACA;AACA,qEAAqE,qCAAqC;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,qCAAqC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAsB;AAClD;AACA;AACA,mDAAmD,oBAAsB,MAAM,oBAAsB;AACrG;AACA;AACA;AACA;AACA;AACA,qCAAqC,uBAAuB;AAC5D;AACA;AACA;AACA,oBAAoB,2CAAmB;AACvC,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,0BAA0B;AAC3D;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,sCAAsC,0CAAkB,GAAG;AAC3D;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAM;AAC1B;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,0DAAkC,GAAG,OAAO;AAC7E;AACA;AACA;AACA,8BAA8B,cAAc;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAW,YAAY,gBAAW;AACrF;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,4DAAkC,yCAAyC,sBAAsB;AAC5I;AACA,+CAA+C,uEAA6C;AAC5F;AACA;AACA;AACA;AACA,+CAA+C,gEAAsC,6CAA6C,sBAAsB;AACxJ,yCAAyC,0DAAgC,qCAAqC,sBAAsB;AACpI;AACA,6CAA6C,qEAA2C;AACxF;AACA;AACA;AACA;AACA,6CAA6C,8DAAoC,2CAA2C,sBAAsB;AAClJ,0CAA0C,2DAAiC,wCAAwC,sBAAsB;AACzI,4CAA4C,6DAAmC,0CAA0C,sBAAsB;AAC/I,6CAA6C,8DAAoC,2CAA2C,sBAAsB;AAClJ,uCAAuC,wDAA8B,qCAAqC,sBAAsB;AAChI,2CAA2C,4DAAkC,yCAAyC,sBAAsB;AAC5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kFAAkF;AAClG,cAAc,eAAe;AAC7B;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,2BAA2B;AAC3C,kDAAkD,gBAAW;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAW;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,6BAA6B;AAClI,yCAAyC;AACzC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,0CAA0C;AAC1D;AACA;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA,SAAS;AACT,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wFAAwF;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,qCAAqC,cAAS;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,SAAS;AACT;AACA,sDAAsD,gBAAgB;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yFAAyF;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,qCAAqC,cAAS;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,SAAS;AACT;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8DAA8D;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM;AACvC;AACA;AACA;AACA,qCAAqC,cAAS;AAC9C;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4BAA4B;AAC9D;AACA;AACA,qDAAqD,4BAA4B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB,eAAe,qBAAqB;AAC5E;AACA,8BAA8B,qBAAqB;AACnD;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA,YAAY,WAAM,qEAAqE,eAAe;AACtG;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM,iFAAiF,eAAe;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,YAAY;AACvE;AACA;AACA,4DAA4D,aAAa;AACzE;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA,2DAA2D,YAAY;AACvE;AACA;AACA,8DAA8D,eAAe;AAC7E;AACA;AACA,gCAAgC,YAAY,GAAG,aAAa;AAC5D;AACA,iCAAiC,UAAU,0BAA0B;AACrE;AACA;AACA,iCAAiC,SAAS,cAAc;AACxD;AACA;AACA,iCAAiC,OAAO,YAAY;AACpD;AACA;AACA,iCAAiC,UAAU,6BAA6B;AACxE;AACA;AACA,iCAAiC;AACjC;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA,yCAAyC;AACzC;AACA;AACA,yCAAyC;AACzC;AACA;AACA,uEAAuE,gBAAgB;AACvF;AACA;AACA;AACA;AACA;AACA,iCAAiC,WAAW,gBAAgB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD;AACA;AACA;AACA;AACA,gCAAgC,YAAY,GAAG,aAAa;AAC5D,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,sBAAsB,8CAAsB,GAAG,WAAW;AAC1D;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,sBAAsB,2CAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAM;AAC1B;AACA;AACA,oBAAoB,WAAM;AAC1B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,oCAAoC,8CAAsB;AAC1D;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wCAAwC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM;AAClB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qFAAqF;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,yBAAyB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6EAA6E;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,QAAQ;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,sDAAsD,iBAAiB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sDAAsD;AACtE;AACA;AACA;AACA;AACA,uDAAuD,QAAQ,uFAAuF;AACtJ;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM;AAClB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,oBAAoB,8CAA8C;AAClE;AACA;AACA;AACA;AACA,qDAAqD,YAAS;AAC9D;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,6BAA6B,oBAAoB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mBAAmB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA,6BAA6B,kBAAW;AACxC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gFAAgF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C;AACA,6CAA6C,oBAAoB;AACjE;AACA,iBAAiB,UAAU;AAC3B,iBAAiB,UAAU;AAC3B,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,UAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2CAA2C;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA,gCAAgC,qBAAqB;AACrD;AACA;AACA;AACA,gCAAgC,6CAA6C;AAC7E;AACA;AACA;AACA;AACA,yCAAyC,MAAM;AAC/C;AACA;AACA;AACA,6CAA6C,cAAS;AACtD;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mDAAmD;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,8BAA8B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;;AAEA,IAAI,mBAAc,oGAAoG,qBAAM,mBAAmB,qBAAM;;AAErJ,kBAAkB;;AAElB,uBAAuB;;AAEvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,CAAC,mBAAc,MAAM;AACxB,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,MAAM;AACN;AACA,yBAAyB;AACzB,MAAM;AACN;AACA,yBAAyB;AACzB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC,mBAAc,MAAM;AACvB,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uCAAuC;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iCAAiC;AACjD,4BAA4B,iBAAmB,oBAAoB,0BAA4B;AAC/F;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,uBAAyB;AAC1E,oDAAoD,oBAAsB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,sBAAwB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,cAAc;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA;AACA;AACA;AACA;AACA,8DAA8D,cAAc;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,WAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,gBAAgB,gCAAgC;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAM,0BAA0B,wBAAwB,oBAAoB,+BAA+B;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8BAA8B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,+DAAqC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,+DAAqC;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,oBAAsB;AAC1B,IAAI,uBAAyB;AAC7B,IAAI,kBAAoB;AACxB,IAAI,sBAAwB;AAC5B,IAAI,0BAA4B;AAChC,IAAI,iBAAmB;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,8EAA8E;AAC9F;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qCAAqC,MAAM;AAC3C;AACA;AACA,yCAAyC,kBAAW;AACpD;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,sCAAsC;AACtD;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,qEAA6C;AACrD,QAAQ,4EAAoD;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wEAAgD;AACxD,QAAQ,+EAAuD;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,sBAAsB,iEAAyC;AAC/D;AACA;AACA;AACA;AACA,gBAAgB,WAAM;AACtB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,SAAS;AACtC;AACA;AACA;AACA;AACA,gBAAgB,wIAAwI;AACxJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,cAAS;AACxC;AACA,6BAA6B,cAAS;AACtC;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4BAA4B,gBAAW,6BAA6B,gBAAW;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,UAAU;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,gBAAgB,uDAAuD;AACvE;AACA;AACA,sDAAsD,mBAAmB;AACzE;AACA;AACA,2CAA2C,gBAAW,6BAA6B,gBAAW;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,UAAU;AACzC;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C,4BAA4B,gBAAW,6BAA6B,gBAAW;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2BAA2B,KAAK,WAAW;AAC1D;AACA,qDAAqD,iCAAiC;AACtF;AACA,4BAA4B,gBAAW;AACvC;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA,gBAAgB,8FAA8F;AAC9G;AACA;AACA,oBAAoB,iCAAiC;AACrD;AACA,yCAAyC,gBAAW;AACpD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gCAAgC,gBAAW,6BAA6B,gBAAW;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,UAAU;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gBAAW,YAAY,gBAAW;AAC3F;AACA,aAAa;AACb;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uBAAuB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,WAAM;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,WAAM;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,kBAAkB,kDAA0B,UAAU,yBAAyB;AAC/E;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB,kBAAkB,gDAAwB;AAC1C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,uCAAuC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,4BAA4B;AAC3E;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,yBAAyB,MAAM;AAC/B;AACA;AACA;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA,wBAAwB,oBAAoB;AAC5C;AACA,6BAA6B,YAAY;AACzC;AACA;AACA;AACA;AACA,6BAA6B,MAAM;AACnC;AACA;AACA;AACA,iCAAiC,cAAS;AAC1C;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B,QAAQ;AACnC;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA,aAAa,SAAS;AACtB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,uBAAuB;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB,aAAa,oBAAoB;AACtE,sCAAsC,qBAAqB,sBAAsB,cAAc;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uBAAuB,iBAAiB,aAAa;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,0EAA0E,8BAA8B;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,qBAAqB;AAC9C;AACA;AACA;AACA,eAAe,YAAS;AACxB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wCAAwC;AACxD;AACA,oCAAoC,UAAU;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEg+B;;;;;;ACpzQh+B;;;;;;;;;;;;;;;;CAgBC,GAED;;;;;;;;;;;CAWC;;;;;;;;;;;;;AAkDA;AAjDM,MAAMA;IAwBT;;;;;;KAMC,GACD,QAAeE,OAAgB,EAAU;QACrC,IAAK,IAAIC,IAAI,GAAGA,IAAIH,QAAQI,YAAYD,KAAK,EAAG;gBAC3B,mBACCD;YADlB,MAAMG,WAAW,aAAI,cAAJ,gDAAMC,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AAW,GAAGH,KAAKzC,MAAM;QAEhC,IAAI4C,cAAcL,QAAQI,SAASC,aAAa;YAC5C,OAAOA;QACX;QAEA,OAAO;IACX;AACJ;;;AC5CA;;;;;;;;;;;;;;;;CAgBC,GAED,qCAAqC;AAErC,0DAA0D;AACX;AAE/C,mCAAmC;AACM;AAEzC,6CAA6C;AACf;;;AC3B9B,IAAI,QAAI;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,IAAI;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE,QAAI,KAAK,QAAI,KAAK;AACrB,IAAI,cAAU;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAE,cAAU,KAAK,cAAU,KAAK;AACjC,MAAM,iBAAa,GAAG,QAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAa;AACnB;AACA;AACA;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA,iCAAiC,iBAAa,OAAO,iBAAa;AAClE;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA;AACA,uBAAuB,iBAAa;AACpC;AACA,mBAAmB,iBAAa;AAChC;AACA,mBAAmB,iBAAa;AAChC;AACA;;AAEA,MAAM,gBAAY,GAAG,QAAI;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAa;AACnB;AACA;AACA;AACA,MAAM,YAAQ;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA,0DAA0D;AAC1D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAI;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,YAAQ;AACR,sBAAsB,YAAQ;AAC9B;AACA;;AAEA,MAAM,YAAQ;AACd;AACA;AACA,aAAa,gBAAY;AACzB,mCAAmC,iBAAa;AAChD;AACA;AACA;AACA,sCAAsC,eAAe,aAAa,eAAe;AACjF;AACA;AACA,aAAa,gBAAY;AACzB,yDAAyD,+BAA+B,QAAI,wBAAwB;AACpH;AACA,aAAa,gBAAY;AACzB,wDAAwD,QAAI,8BAA8B;AAC1F;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB,+DAA+D,QAAI,2BAA2B;AAC9F;AACA,aAAa,gBAAY;AACzB,sDAAsD,QAAI,2BAA2B,cAAc,eAAe;AAClH;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,8DAA8D,0BAA0B;AACxF;AACA,qCAAqC,SAAS,oDAAoD,0BAA0B;AAC5H;AACA;AACA;AACA,iEAAiE,4BAA4B;AAC7F;AACA;AACA,+DAA+D,0BAA0B;AACzF;AACA;AACA,oBAAoB,QAAI;AACxB;AACA;AACA;AACA,qCAAqC,iBAAiB;AACtD;AACA;AACA;AACA;AACA;AACA,aAAa,gBAAY;AACzB;AACA,gDAAgD,sEAAsE,EAAE,eAAe;AACvI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,0CAA0C,EAAE,cAAc;AAC1D;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA,aAAa,gBAAY;AACzB;AACA,gDAAgD,qEAAqE,EAAE,eAAe;AACtI;AACA,iDAAiD,iEAAiE,EAAE,eAAe;AACnI;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,uCAAuC,EAAE,cAAc;AACvD;AACA,0CAA0C;AAC1C;AACA;AACA;AACA,0CAA0C,EAAE,gCAAgC;AAC5E;AACA;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB;AACA;AACA,aAAa,gBAAY;AACzB,sDAAsD,iBAAiB;AACvE;AACA,aAAa,gBAAY;AACzB;AACA;AACA;AACA;AACA,YAAY,QAAI;AAChB;AACA,aAAa;AACb;;AAEA,IAAI,oBAAgB,GAAG,YAAQ;AAC/B,SAAS,eAAW;AACpB,IAAI,oBAAgB;AACpB;AACA,SAAS,eAAW;AACpB,WAAW,oBAAgB;AAC3B;;AAEA,MAAM,aAAS;AACf,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kCAAkC;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,cAAU;AAChB,SAAS,qBAAiB;AAC1B,kBAAkB,aAAS;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,eAAW;AACvB,YAAY,YAAQ;AACpB;AACA,KAAK;AACL;AACA;AACA,MAAM,eAAW;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAO;AAC9B;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,eAAe,eAAW;AAC1B;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA,uBAAuB,WAAO;AAC9B;AACA,uBAAuB,WAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,MAAM,WAAO;AACb;AACA,CAAC;AACD,MAAM,SAAK,iBAAiB,wBAAwB;AACpD,MAAM,MAAE,iBAAiB,wBAAwB;AACjD,MAAM,aAAS;AACf,MAAM,WAAO;AACb,MAAM,WAAO;AACb,MAAM,WAAO;;AAEb,IAAI,aAAS;AACb;AACA,sEAAsE,UAAU;AAChF;AACA,CAAC,EAAE,aAAS,KAAK,aAAS,KAAK;;AAE/B,MAAM,sBAAkB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,gBAAY;AAClB,QAAQ,WAAO;AACf,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,YAAQ;AAC1C;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS,uBAAmB;AAC5B;AACA;AACA,YAAY,4DAA4D;AACxE;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA,MAAM,WAAO;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAa;AAC5B;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAa;AACrC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,wBAAwB,eAAW;AACnC;AACA;AACA;AACA,4BAA4B,iBAAa;AACzC;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,YAAY,WAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,wBAAwB,iBAAa;AACrC;AACA,yCAAyC,mCAAmC;AAC5E,eAAe,gBAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,wBAAwB,iBAAa;AACrC;AACA,+CAA+C,mCAAmC;AAClF,8BAA8B,WAAO;AACrC;AACA;AACA,eAAe,gBAAY;AAC3B;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mBAAmB,cAAU;AAC7B;AACA,sBAAsB,yBAAqB;AAC3C,sBAAsB,gCAAgC;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,eAAW;AAC1B;AACA;AACA,eAAe,eAAW;AAC1B;AACA;AACA;AACA;AACA;AACA,eAAe,YAAQ;AACvB;AACA;AACA,eAAe,cAAU;AACzB;AACA;AACA,eAAe,YAAQ;AACvB;AACA;AACA,eAAe,mBAAe;AAC9B;AACA;AACA,mBAAmB,cAAU;AAC7B,eAAe,uBAAmB;AAClC;AACA,sBAAsB,yBAAqB;AAC3C,sBAAsB,8BAA8B;AACpD,SAAS;AACT;AACA;AACA;AACA,mBAAmB,cAAU;AAC7B,eAAe,uBAAmB;AAClC;AACA;AACA,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA,mBAAmB,cAAU;AAC7B,sBAAsB,yBAAqB;AAC3C;AACA,eAAe,uBAAmB;AAClC,SAAS;AACT;AACA;AACA;AACA,mBAAmB,YAAQ;AAC3B,eAAe,uBAAmB;AAClC;AACA;AACA,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,eAAW;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAS,aAAa,GAAG;AAC/B,MAAM,cAAU;AAChB,MAAM,aAAS,uBAAuB,GAAG;AACzC,MAAM,aAAS,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG;AACtF;AACA;AACA,4DAA4D,GAAG,mFAAmF,GAAG;AACrJ;AACA,sCAAsC,sBAAsB,sCAAsC,uBAAuB,OAAO,GAAG,cAAc;AACjJ;AACA,MAAM,cAAU,qBAAqB,yBAAyB,4DAA4D,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,yBAAyB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI,0DAA0D,GAAG;AACnoB;AACA,MAAM,cAAU,SAAS,sBAAsB,IAAI,gBAAgB;AACnE,MAAM,aAAS,uCAAuC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC7H,MAAM,aAAS,gBAAgB,IAAI,GAAG,EAAE,aAAa,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,GAAG,EAAE,WAAW,IAAI,GAAG,IAAI,WAAW,IAAI,mCAAmC,EAAE,SAAS,IAAI,MAAM,EAAE,iCAAiC,EAAE,SAAS,IAAI;AAC3Y;AACA,MAAM,iBAAa;AACnB;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,UAAU,EAAE,OAAO,EAAE;AACvH;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB;AAClG;AACA;AACA;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE;AAC9F;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACzE;AACA;AACA;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE;AACxG;AACA;AACA,oCAAoC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACzE;AACA;AACA;AACA,SAAS,aAAS;AAClB,0CAA0C,aAAS;AACnD;AACA;AACA,0CAA0C,aAAS;AACnD;AACA;AACA;AACA;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA;AACA;AACA,kBAAkB,gBAAY;AAC9B,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA,iBAAiB;AACjB;AACA,iDAAiD,aAAS;AAC1D,8BAA8B,aAAS;AACvC;AACA,4CAA4C,cAAc;AAC1D,SAAS;AACT,qCAAqC,aAAS;AAC9C;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT,qCAAqC,aAAS;AAC9C;AACA,4CAA4C,qBAAqB;AACjE,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA;AACA;AACA;AACA,mBAAmB,WAAO;AAC1B;AACA,2BAA2B,eAAW;AACtC;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAiB;AACzC,kCAAkC,gBAAY;AAC9C;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,wBAAwB,qBAAiB;AACzC,kCAAkC,gBAAY;AAC9C;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,qBAAqB,cAAU;AAC/B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,cAAU;AAC/B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,cAAU;AAC/B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C,sCAAsC,iDAAiD;AACvF;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C,sCAAsC,yBAAyB;AAC/D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C,sCAAsC,uBAAuB;AAC7D;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,8BAA8B,iBAAa;AAC3C;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B;AACA,oBAAoB,qBAAiB;AACrC;AACA,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,QAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA,gCAAgC,kBAAkB,aAAS,oBAAoB;AAC/E;AACA;AACA,gCAAgC,gBAAgB,aAAS,oBAAoB;AAC7E;AACA;AACA,gCAAgC,kBAAkB,aAAS,oBAAoB;AAC/E;AACA;AACA,gCAAgC,iBAAiB,aAAS,oBAAoB;AAC9E;AACA;AACA,gCAAgC,iBAAiB,aAAS,oBAAoB;AAC9E;AACA;AACA,gCAAgC,kBAAkB,aAAS,oBAAoB;AAC/E;AACA;AACA,gCAAgC,iBAAiB,aAAS,oBAAoB;AAC9E;AACA;AACA,gCAAgC,eAAe,aAAS,oBAAoB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,aAAS;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAS;AACT;AACA,eAAe,aAAS;AACxB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA;AACA,SAAS,sBAAkB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA,2BAA2B,eAAW;AACtC;AACA;AACA,qBAAqB,QAAI;AACzB;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,oBAAoB,sBAAkB;AACtC;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,QAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,aAAS;AACtC,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,QAAI;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA,2BAA2B,eAAW;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,QAAI;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,iDAAiD,aAAS;AAC1D;AACA;AACA,kDAAkD,aAAS;AAC3D;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,aAAS;AACtC,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAS;AACT;AACA,eAAe,aAAS;AACxB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,eAAe,MAAE;AACjB;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,WAAO,SAAS,WAAO;AAC7B;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,2BAA2B,eAAW;AACtC;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,gBAAgB,QAAI;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAO;AAC1B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,qBAAqB,aAAS;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAO;AACP,eAAe,WAAO;AACtB;AACA;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,eAAe,MAAE;AACjB;AACA;AACA,aAAS;AACT,eAAe,aAAS;AACxB,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,gBAAY,SAAS,WAAO;AAClC;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,eAAe,MAAE;AACjB;AACA;AACA,gBAAY;AACZ,eAA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hD;AACA,+BAA+B,YAAQ;AACvC,eAAe,YAAQ,mCAAmC,kBAAc;AACxE;AACA;AACA;AACA;AACA;AACA,MAAM,aAAS,SAAS,WAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,QAAI;AACzB,iCAAiC,aAAa;AAC9C;AACA;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,gBAAgB,cAAc;AAC9B,gBAAgB,yBAAyB;AACzC;AACA,4CAA4C,YAAQ;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD,+CAA+C,sBAAkB;AACjE;AACA,aAAa;AACb;AACA,0CAA0C,YAAQ;AAClD;AACA;AACA;AACA;AACA,+BAA+B,6BAA6B;AAC5D,iCAAiC,uCAAuC;AACxE,qBAAqB;AACrB;AACA;AACA;AACA;AACA,oBAAoB,qBAAiB;AACrC,8BAA8B,gBAAY;AAC1C;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD,+CAA+C,sBAAkB;AACjE;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA,uBAAuB,eAAW;AAClC,aAAa;AACb;AACA;AACA,mBAAmB,eAAW;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,aAAS;AACjB,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,aAAS;AACxD;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,oBAAoB;AACpB,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,aAAS;AACpC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,QAAI;AACZ;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,QAAI;AACZ;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAc;AAC7B;AACA;AACA;AACA,QAAQ,QAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ,QAAI;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,eAAW;AACtD;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,aAAS;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,iBAAa,CAAC,QAAI;AACjC;AACA;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA;AACA,kBAAkB,YAAQ;AAC1B,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA;AACA,kBAAkB,YAAQ;AAC1B,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,aAAS;AACT,eAAe,aAAS;AACxB;AACA;AACA,kBAAkB,YAAQ;AAC1B,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,YAAQ,SAAS,WAAO;AAC9B;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,YAAQ;AACpE,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,YAAQ;AACnE,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,YAAQ;AACR,eAAe,YAAQ;AACvB;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oBAAgB;AACtB,wBAAwB,WAAO;AAC/B,eAAe,oBAAgB;AAC/B;AACA,6BAA6B,cAAU;AACvC,eAAe,oBAAgB;AAC/B;AACA,6BAA6B,cAAU;AACvC;AACA;AACA,6BAA6B,WAAO;AACpC;AACA;AACA,6BAA6B,iBAAa;AAC1C;AACA;AACA;AACA,6BAA6B,cAAU;AACvC,eAAe,oBAAgB;AAC/B;AACA,6BAA6B,gBAAY;AACzC;AACA;AACA,6BAA6B,WAAO;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,yBAAqB,SAAS,WAAO;AAC3C;AACA,gBAAgB,MAAM;AACtB,+BAA+B,iBAAa;AAC5C,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC;AACA;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,oBAAgB;AACxD;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA,8DAA8D,uBAAuB,sBAAsB,cAAc;AACzH;AACA;AACA;AACA;AACA,mBAAmB,yBAAqB;AACxC,sBAAsB,yBAAqB;AAC3C;AACA;AACA;AACA,eAAe,uBAAmB;AAClC,SAAS;AACT;AACA;AACA,SAAS,eAAW;AACpB,kBAAkB,iBAAa;AAC/B,kBAAkB,iBAAa;AAC/B;AACA,iBAAiB;AACjB;AACA,uBAAuB,iBAAa,q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+BAA+B,WAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,UAAM;AACN,eAAe,UAAM;AACrB;AACA;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,UAAM,SAAS,WAAO;AAC5B;AACA,gBAAgB,cAAc;AAC9B,+BAA+B,iBAAa;AAC5C,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA;AACA;AACA;AACA,gBAAgB,qBAAiB;AACjC,0BAA0B,gBAAY;AACtC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAiB;AACjC,0BAA0B,gBAAY;AACtC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAO;AAClC;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,sFAAsF,sBAAkB;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,UAAM;AACzB;AACA,uBAAuB,yBAAyB,aAAS,oBAAoB;AAC7E,SAAS;AACT;AACA;AACA,mBAAmB,UAAM;AACzB;AACA,uBAAuB,yBAAyB,aAAS,oBAAoB;AAC7E,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAM;AACN,eAAe,UAAM;AACrB;AACA;AACA;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,eAAW,SAAS,WAAO;AACjC;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB,+BAA+B,iBAAa;AAC5C,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC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ACA,gBAAgB,MAAM;AACtB,+BAA+B,iBAAa;AAC5C;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,+CAA+C,iBAAa;AAC5D;AACA;AACA,eAAe,MAAE;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA;AACA;AACA;AACA,kDAAkD,yBAAqB;AACvE;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gBAAgB,qBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,2BAA2B,WAAO;AAClC;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA;AACA,+BAA+B,WAAO;AACtC;AACA;AACA;AACA,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,qBAAqB,WAAO;AAC5B;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,mCAAmC,6CAA6C;AAChF;AACA,yBAAyB,WAAO;AAChC;AACA,uGAAuG,qCAAqC;AAC5I,iBAAiB;AACjB;AACA;AACA,QAAQ,QAAI;AACZ;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,2CAA2C;AAC7D,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,eAAW,SAAS,WAAO;AACjC;AACA;AACA,2BAA2B,iBAAa;AACxC,mBAAmB,MAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAW;AACX,eAAe,eAAW;AAC1B;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,eAAW,SAAS,WAAO;AACjC;AACA;AACA,2BAA2B,iBAAa;AACxC,mBAAmB,MAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAW;AACX,eAAe,eAAW;AAC1B;AACA,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,cAAU,SAAS,WAAO;AAChC;AACA,gBAAgB,MAAM;AACtB;AACA,+BAA+B,iBAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,cAAU;AACV,eAAe,cAAU;AACzB;AACA,kBAAkB,yBAAqB;AACvC;AACA;AACA;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,YAAQ,SAAS,WAAO;AAC9B;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,YAAY,WAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,YAAQ;AACnD,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,YAAQ;AAC/C,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAQ;AACR,eAAe,YAAQ;AACvB;AACA,kBAAkB,yBAAqB;AACvC;AACA,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,UAAM,SAAS,WAAO;AAC5B;AACA;AACA,2BAA2B,iBAAa;AACxC;AACA,YAAY,qBAAiB;AAC7B,sBAAsB,gBAAY;AAClC,0BAA0B,iBAAa;AACvC;AACA,aAAa;AACb,mBAAmB,WAAO;AAC1B;AACA,iBAAiB;AACjB;AACA;AACA,UAAM;AACN,eAAe,UAAM;AACrB,kBAAkB,yBAAqB;AACvC,WAAW,uBAAmB;AAC9B,KAAK;AACL;AACA,MAAM,SAAK;AACX,MAAM,cAAU,SAAS,WAAO;AAChC;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,MAAM,eAAW,SAAS,WAAO;AACjC;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,2BAA2B,WAAO;AAClC;AACA;AACA,2BAA2B,SAAK;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,uBAAuB,WAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB,eAAW;AAC9B;AACA;AACA,sBAAsB,yBAAqB;AAC3C,SAAS;AACT;AACA;AACA,MAAM,UAAM,sBAAsB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA,eAAe,UAAM;AACrB;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,qDAAqD,aAAa;AAClE,+BAA+B,sCAAsC;AACrE;AACA,SAAS;AACT,WAAW,UAAM;AACjB;AACA,MAAM,QAAI;AACV,YAAY,aAAS;AACrB;AACA,IAAI,yBAAqB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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","sources":["webpack://@adguard/api/webpack/universalModuleDefinition","webpack://@adguard/api/./node_modules/@adguard/filters-downloader/src/browser/file-download-wrapper.js","webpack://@adguard/api/./node_modules/@adguard/filters-downloader/src/filters-downloader-creator.js","webpack://@adguard/api/./node_modules/@adguard/filters-downloader/src/index.browser.js","webpack://@adguard/api/./node_modules/core-js/internals/a-callable.js","webpack://@adguard/api/./node_modules/core-js/internals/a-possible-prototype.js","webpack://@adguard/api/./node_modules/core-js/internals/add-to-unscopables.js","webpack://@adguard/api/./node_modules/core-js/internals/an-object.js","webpack://@adguard/api/./node_modules/core-js/internals/array-includes.js","webpack://@adguard/api/./node_modules/core-js/internals/array-set-length.js","webpack://@adguard/api/./node_modules/core-js/internals/classof-raw.js","webpack://@adguard/api/./node_modules/core-js/internals/classof.js","webpack://@adguard/api/./node_modules/core-js/internals/copy-constructor-properties.js","webpack://@adguard/api/./node_modules/core-js/internals/create-non-enumerable-property.js","webpack://@adguard/api/./node_modules/core-js/internals/create-property-descriptor.js","webpack://@adguard/api/./node_modules/core-js/internals/define-built-in.js","webpack://@adguard/api/./node_modules/core-js/internals/define-global-property.js","webpack://@adguard/api/./node_modules/core-js/internals/descriptors.js","webpack://@adguard/api/./node_modules/core-js/internals/document-all.js","webpack://@adguard/api/./node_modules/core-js/internals/document-create-element.js","webpack://@adguard/api/./node_modules/core-js/internals/does-not-exceed-safe-integer.js","webpack://@adguard/api/./node_modules/core-js/internals/engine-user-agent.js","webpack://@adguard/api/./node_modules/core-js/internals/engine-v8-version.js","webpack://@adguard/api/./node_modules/core-js/internals/enum-bug-keys.js","webpack://@adguard/api/./node_modules/core-js/internals/error-stack-clear.js","webpack://@adguard/api/./node_modules/core-js/internals/error-stack-install.js","webpack://@adguard/api/./node_modules/core-js/internals/error-stack-installable.js","webpack://@adguard/api/./node_modules/core-js/internals/export.js","webpack://@adguard/api/./node_modules/core-js/internals/fails.js","webpack://@adguard/api/./node_modules/core-js/internals/function-apply.js","webpack://@adguard/api/./node_modules/core-js/internals/function-bind-native.js","webpack://@adguard/api/./node_modules/core-js/internals/function-call.js","webpack://@adguard/api/./node_modules/core-js/internals/function-name.js","webpack://@adguard/api/./node_modules/core-js/internals/function-uncurry-this-accessor.js","webpack://@adguard/api/./node_modules/core-js/internals/function-uncurry-this.js","webpack://@adguard/api/./node_modules/core-js/internals/get-built-in.js","webpack://@adguard/api/./node_modules/core-js/internals/get-method.js","webpack://@adguard/api/./node_modules/core-js/internals/global.js","webpack://@adguard/api/./node_modules/core-js/internals/has-own-property.js","webpack://@adguard/api/./node_modules/core-js/internals/hidden-keys.js","webpack://@adguard/api/./node_modules/core-js/internals/html.js","webpack://@adguard/api/./node_modules/core-js/internals/ie8-dom-define.js","webpack://@adguard/api/./node_modules/core-js/internals/indexed-object.js","webpack://@adguard/api/./node_modules/core-js/internals/inherit-if-required.js","webpack://@adguard/api/./node_modules/core-js/internals/inspect-source.js","webpack://@adguard/api/./node_modules/core-js/internals/install-error-cause.js","webpack://@adguard/api/./node_modules/core-js/internals/internal-state.js","webpack://@adguard/api/./node_modules/core-js/internals/is-array.js","webpack://@adguard/api/./node_modules/core-js/internals/is-callable.js","webpack://@adguard/api/./node_modules/core-js/internals/is-forced.js","webpack://@adguard/api/./node_modules/core-js/internals/is-null-or-undefined.js","webpack://@adguard/api/./node_modules/core-js/internals/is-object.js","webpack://@adguard/api/./node_modules/core-js/internals/is-pure.js","webpack://@adguard/api/./node_modules/core-js/internals/is-symbol.js","webpack://@adguard/api/./node_modules/core-js/internals/length-of-array-like.js","webpack://@adguard/api/./node_modules/core-js/internals/make-built-in.js","webpack://@adguard/api/./node_modules/core-js/internals/math-trunc.js","webpack://@adguard/api/./node_modules/core-js/internals/normalize-string-argument.js","webpack://@adguard/api/./node_modules/core-js/internals/object-create.js","webpack://@adguard/api/./node_modules/core-js/internals/object-define-properties.js","webpack://@adguard/api/./node_modules/core-js/internals/object-define-property.js","webpack://@adguard/api/./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://@adguard/api/./node_modules/core-js/internals/object-get-own-property-names.js","webpack://@adguard/api/./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://@adguard/api/./node_modules/core-js/internals/object-is-prototype-of.js","webpack://@adguard/api/./node_modules/core-js/internals/object-keys-internal.js","webpack://@adguard/api/./node_modules/core-js/internals/object-keys.js","webpack://@adguard/api/./node_modules/core-js/internals/object-property-is-enumerable.js","webpack://@adguard/api/./node_modules/core-js/internals/object-set-prototype-of.js","webpack://@adguard/api/./node_modules/core-js/internals/ordinary-to-primitive.js","webpack://@adguard/api/./node_modules/core-js/internals/own-keys.js","webpack://@adguard/api/./node_modules/core-js/internals/proxy-accessor.js","webpack://@adguard/api/./node_modules/core-js/internals/require-object-coercible.js","webpack://@adguard/api/./node_modules/core-js/internals/shared-key.js","webpack://@adguard/api/./node_modules/core-js/internals/shared-store.js","webpack://@adguard/api/./node_modules/core-js/internals/shared.js","webpack://@adguard/api/./node_modules/core-js/internals/symbol-constructor-detection.js","webpack://@adguard/api/./node_modules/core-js/internals/to-absolute-index.js","webpack://@adguard/api/./node_modules/core-js/internals/to-indexed-object.js","webpack://@adguard/api/./node_modules/core-js/internals/to-integer-or-infinity.js","webpack://@adguard/api/./node_modules/core-js/internals/to-length.js","webpack://@adguard/api/./node_modules/core-js/internals/to-object.js","webpack://@adguard/api/./node_modules/core-js/internals/to-primitive.js","webpack://@adguard/api/./node_modules/core-js/internals/to-property-key.js","webpack://@adguard/api/./node_modules/core-js/internals/to-string-tag-support.js","webpack://@adguard/api/./node_modules/core-js/internals/to-string.js","webpack://@adguard/api/./node_modules/core-js/internals/try-to-string.js","webpack://@adguard/api/./node_modules/core-js/internals/uid.js","webpack://@adguard/api/./node_modules/core-js/internals/use-symbol-as-uid.js","webpack://@adguard/api/./node_modules/core-js/internals/v8-prototype-define-bug.js","webpack://@adguard/api/./node_modules/core-js/internals/weak-map-basic-detection.js","webpack://@adguard/api/./node_modules/core-js/internals/well-known-symbol.js","webpack://@adguard/api/./node_modules/core-js/internals/wrap-error-constructor-with-cause.js","webpack://@adguard/api/./node_modules/core-js/modules/es.array.at.js","webpack://@adguard/api/./node_modules/core-js/modules/es.array.includes.js","webpack://@adguard/api/./node_modules/core-js/modules/es.array.push.js","webpack://@adguard/api/./node_modules/core-js/modules/es.error.cause.js","webpack://@adguard/api/./node_modules/core-js/modules/es.string.at-alternative.js","webpack://@adguard/api/./node_modules/webextension-polyfill/dist/browser-polyfill.js","webpack://@adguard/api/../tsurlfilter/node_modules/@adguard/scriptlets/dist/umd/scriptlets.umd.js","webpack://@adguard/api/../tsurlfilter/node_modules/ip-regex/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/is-cidr/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/is-cidr/node_modules/cidr-regex/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/is-ip/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/string-natural-compare/natural-compare.js","webpack://@adguard/api/../tswebextension/node_modules/@adguard/scriptlets/dist/umd/scriptlets.umd.js","webpack://@adguard/api/../tswebextension/node_modules/bowser/es5.js","webpack://@adguard/api/../tswebextension/node_modules/lru_map/dist/lru.js","webpack://@adguard/api/../tswebextension/node_modules/webextension-polyfill/dist/browser-polyfill.js","webpack://@adguard/api/ignored|/Volumes/work/tsurlfilter/packages/adguard-api/node_modules/@adguard/filters-downloader/src|url","webpack://@adguard/api/webpack/bootstrap","webpack://@adguard/api/webpack/runtime/compat get default export","webpack://@adguard/api/webpack/runtime/define property getters","webpack://@adguard/api/webpack/runtime/global","webpack://@adguard/api/webpack/runtime/hasOwnProperty shorthand","webpack://@adguard/api/webpack/runtime/make namespace object","webpack://@adguard/api/../tsurlfilter/dist/es/simple-regex-40f65170.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/domain.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/domain-without-suffix.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/extract-hostname.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/is-ip.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/is-valid.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/options.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/subdomain.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/factory.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/src/lookup/fast-path.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts-core/dist/es6/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts/dist/es6/src/data/trie.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts/dist/es6/src/suffix-trie.js","webpack://@adguard/api/../tsurlfilter/node_modules/tldts/dist/es6/index.js","webpack://@adguard/api/../tsurlfilter/dist/es/network-rule-options.js","webpack://@adguard/api/../tsurlfilter/dist/es/request-type.js","webpack://@adguard/api/../tsurlfilter/node_modules/cidr-tools/node_modules/ip-regex/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/cidr-regex/node_modules/ip-regex/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/cidr-regex/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/ip-bigint/index.js","webpack://@adguard/api/../tsurlfilter/node_modules/cidr-tools/index.js","webpack://@adguard/api/../tsurlfilter/dist/es/cosmetic-rule-marker.js","webpack://@adguard/api/../tsurlfilter/dist/es/index.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/domain.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/domain-without-suffix.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/extract-hostname.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/is-ip.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/is-valid.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/options.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/subdomain.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/factory.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/src/lookup/fast-path.js","webpack://@adguard/api/../tswebextension/node_modules/tldts-core/dist/es6/index.js","webpack://@adguard/api/../tswebextension/node_modules/tldts/dist/es6/src/data/trie.js","webpack://@adguard/api/../tswebextension/node_modules/tldts/dist/es6/src/suffix-trie.js","webpack://@adguard/api/../tswebextension/node_modules/tldts/dist/es6/index.js","webpack://@adguard/api/../tswebextension/node_modules/zod/lib/index.mjs","webpack://@adguard/api/../tswebextension/node_modules/nanoid/index.browser.js","webpack://@adguard/api/../tswebextension/dist/index.js","webpack://@adguard/api/./src/background/utils/version.ts","webpack://@adguard/api/./src/background/utils/browser-utils.ts","webpack://@adguard/api/./src/background/utils/user-agent.ts","webpack://@adguard/api/./src/background/utils/i18n.ts","webpack://@adguard/api/./src/background/utils/index.ts","webpack://@adguard/api/./node_modules/zod/lib/index.mjs","webpack://@adguard/api/./src/background/schemas/configuration/configuration.ts","webpack://@adguard/api/./src/background/schemas/configuration/index.ts","webpack://@adguard/api/./src/background/schemas/metadata/filter.ts","webpack://@adguard/api/./src/background/schemas/metadata/tag.ts","webpack://@adguard/api/./src/background/schemas/metadata/group.ts","webpack://@adguard/api/./src/background/schemas/metadata/metadata.ts","webpack://@adguard/api/./src/background/schemas/metadata/index.ts","webpack://@adguard/api/./src/background/schemas/preprocessor.ts","webpack://@adguard/api/./src/background/schemas/filter-version/filter-version.ts","webpack://@adguard/api/./src/background/schemas/filter-version/index.ts","webpack://@adguard/api/./src/background/schemas/index.ts","webpack://@adguard/api/./src/background/network.ts","webpack://@adguard/api/./src/background/storage.ts","webpack://@adguard/api/./src/background/filters/metadata.ts","webpack://@adguard/api/./src/background/filters/versions.ts","webpack://@adguard/api/./src/background/filters/rules.ts","webpack://@adguard/api/./src/background/notifier.ts","webpack://@adguard/api/./src/background/filters/api.ts","webpack://@adguard/api/./src/background/filters/update.ts","webpack://@adguard/api/./src/background/filters/locale-detect.ts","webpack://@adguard/api/./src/background/filters/index.ts","webpack://@adguard/api/./src/background/request-blocking-logger.ts","webpack://@adguard/api/./src/background/logger.ts","webpack://@adguard/api/./constants.ts","webpack://@adguard/api/./src/background/main.ts","webpack://@adguard/api/./src/background/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/**\n * This file is part of Adguard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension).\n *\n * Adguard Browser Extension is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard Browser Extension is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with Adguard Browser Extension. If not, see .\n */\n\n/**\n * As it is not possible to use one library in node and browser environments,\n * we have to implementation of simple file download interface.\n * The one for node uses axios, the one for browser XMLHttpRequest.\n *\n * @type {{getLocalFile, getExternalFile}}\n */\nmodule.exports = (() => {\n 'use strict';\n\n /**\n * If url protocol is not http or https return true, else false\n * @param url\n * @returns {boolean}\n */\n const isLocal = (url) => {\n const parsedUrl = new URL(url);\n const protocols = ['http:', 'https:'];\n return !protocols.includes(parsedUrl.protocol);\n };\n\n /**\n * Executes async request via fetch\n * fetch doesn't allow to download urls with file:// scheme\n *\n * @param url Url\n * @param contentType Content type\n * @returns {Promise}\n */\n const executeRequestAsyncFetch = async (url, contentType) => {\n const response = await fetch(url, {\n cache: 'no-cache',\n headers: {\n Pragma: 'no-cache',\n 'Content-Type': contentType,\n }\n });\n\n if (response.status !== 200 && response.status !== 0) {\n throw new Error(`Response status for url ${url} is invalid: ${response.status}`);\n }\n\n // Don't check response headers if url is local,\n // because edge extension doesn't provide headers for such url\n if (!isLocal(response.url)) {\n const responseContentType = response.headers.get('Content-Type');\n if (!responseContentType || !responseContentType.includes(contentType)) {\n throw new Error(`Response content type should be: \"${contentType}\"`);\n }\n }\n\n const responseText = await response.text();\n\n return responseText.trim().split(/[\\r\\n]+/);\n };\n\n /**\n * Executes async request via XMLHttpRequest\n * XMLHttpRequest is undefined in the service worker\n *\n * @param {string} url Url\n * @param {string} contentType Content type\n * @returns {Promise}\n */\n const executeRequestAsyncXhr = (url, contentType) => {\n return new Promise((resolve, reject) => {\n const onRequestLoad = (response) => {\n if (response.status !== 200 && response.status !== 0) {\n reject(new Error(`Response status for url ${url} is invalid: ${response.status}`));\n }\n\n const responseText = response.responseText ? response.responseText : response.data;\n\n // Don't check response headers if url is local,\n // because edge extension doesn't provide headers for such url\n if (!isLocal(response.responseURL)) {\n const responseContentType = response.getResponseHeader('Content-Type');\n if (!responseContentType || !responseContentType.includes(contentType)) {\n reject(new Error(`Response content type should be: \"${contentType}\"`));\n }\n }\n const lines = responseText.trim().split(/[\\r\\n]+/);\n resolve(lines);\n };\n\n const request = new XMLHttpRequest();\n\n try {\n request.open('GET', url);\n request.setRequestHeader('Pragma', 'no-cache');\n request.overrideMimeType(contentType);\n request.mozBackgroundRequest = true;\n request.onload = function () {\n onRequestLoad(request);\n };\n request.onerror = () => reject(new Error(`Request error happened: ${request.statusText || 'status text empty'}`));\n request.onabort = () => reject(new Error(`Request was aborted with status text: ${request.statusText}`));\n request.ontimeout = () => reject(new Error(`Request timed out with status text: ${request.statusText}`));\n\n request.send(null);\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n /**\n * Downloads filter rules from external url\n *\n * @param {string} url Filter file absolute URL or relative path\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const getExternalFile = (url) => {\n return executeRequestAsyncFetch(url, 'text/plain');\n };\n\n /**\n * Get filter rules from local path\n *\n * @param {string} url local path\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const getLocalFile = (url) => {\n if (typeof XMLHttpRequest !== 'undefined') {\n return executeRequestAsyncXhr(url, 'text/plain');\n }\n if (typeof fetch !== 'undefined') {\n return executeRequestAsyncFetch(url, 'text/plain');\n }\n throw new Error('XMLHttpRequest or fetch are undefined, getting local files inside service worker is not working');\n };\n\n return {\n getLocalFile: getLocalFile,\n getExternalFile: getExternalFile,\n };\n})();\n","/**\n * This file is part of Adguard Browser Extension (https://github.com/AdguardTeam/AdguardBrowserExtension).\n *\n * Adguard Browser Extension is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard Browser Extension is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with Adguard Browser Extension. If not, see .\n */\n\n/**\n * The utility tool resolves preprocessor directives in filter content.\n *\n * Directives syntax:\n * !#if, !#endif - filters maintainers can use these conditions to supply different rules depending on the ad blocker type.\n * condition - just like in some popular programming languages, pre-processor conditions are based on constants declared by ad blockers. Ad blocker authors define on their own what exact constants do they declare.\n * !#include - this directive allows to include contents of a specified file into the filter.\n *\n * Condition constants should be declared in FilterCompilerConditionsConstants\n *\n * More details:\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/917\n */\nconst FiltersDownloaderCreator = (FileDownloadWrapper) => {\n \"use strict\";\n\n const CONDITION_DIRECTIVE_START = \"!#if\";\n const CONDITION_DIRECTIVE_END = \"!#endif\";\n\n const CONDITION_OPERATOR_NOT = \"!\";\n const CONDITION_OPERATOR_AND = \"&&\";\n const CONDITION_OPERATOR_OR = \"||\";\n const CONDITION_BRACKET_OPEN_CHAR = \"(\";\n const CONDITION_BRACKET_CLOSE_CHAR = \")\";\n\n const INCLUDE_DIRECTIVE = \"!#include\";\n\n const REGEXP_ABSOLUTE_URL = /^([a-z]+:\\/\\/|\\/\\/)/i;\n const REGEXP_EXTERNAL_ABSOLUTE_URL = /^((?!file)[a-z]+:\\/\\/|\\/\\/)/i;\n\n /**\n * Checks brackets in string\n *\n * @param str\n */\n const checkBracketsBalance = (str) => {\n let depth = 0;\n for (let i in str) {\n if (str[i] === CONDITION_BRACKET_OPEN_CHAR) {\n // if the char is an opening parenthesis then we increase the depth\n depth++;\n } else if (str[i] === CONDITION_BRACKET_CLOSE_CHAR) {\n // if the char is an closing parenthesis then we decrease the depth\n depth--;\n }\n // if the depth is negative we have a closing parenthesis\n // before any matching opening parenthesis\n if (depth < 0) {\n return false;\n }\n }\n // If the depth is not null then a closing parenthesis is missing\n if (depth > 0) {\n return false;\n }\n\n return true;\n };\n\n /**\n * Finds end of condition block started with startIndex\n *\n * @param rules\n * @param startIndex\n */\n const findConditionEnd = (rules, startIndex) => {\n const stack = [];\n for (let j = startIndex; j < rules.length; j++) {\n let internalRule = rules[j];\n\n if (internalRule.startsWith(CONDITION_DIRECTIVE_START)) {\n stack.push(CONDITION_DIRECTIVE_START);\n\n } else if (internalRule.startsWith(CONDITION_DIRECTIVE_END)) {\n if (stack.length > 0) {\n stack.pop();\n } else {\n return j;\n }\n }\n }\n\n return -1;\n };\n\n /**\n * Resolves constant expression\n *\n * @param expression\n * @param definedProperties\n */\n const resolveConditionConstant = (expression, definedProperties) => {\n if (!expression) {\n throw new Error('Invalid directives: Empty condition');\n }\n\n let trim = expression.trim();\n return trim === \"true\" || definedProperties[trim];\n };\n\n /**\n * Calculates conditional expression\n *\n * @param expression\n * @param definedProperties\n */\n const resolveExpression = (expression, definedProperties) => {\n if (!expression) {\n throw new Error('Invalid directives: Empty condition');\n }\n\n expression = expression.trim();\n\n if (!checkBracketsBalance(expression)) {\n throw new Error('Invalid directives: Incorrect brackets: ' + expression);\n }\n\n //Replace bracketed expressions\n const openBracketIndex = expression.lastIndexOf(CONDITION_BRACKET_OPEN_CHAR);\n if (openBracketIndex !== -1) {\n const endBracketIndex = expression.indexOf(CONDITION_BRACKET_CLOSE_CHAR, openBracketIndex);\n const innerExpression = expression.substring(openBracketIndex + 1, endBracketIndex);\n const innerResult = resolveExpression(innerExpression, definedProperties);\n const resolvedInner = expression.substring(0, openBracketIndex) +\n innerResult + expression.substring(endBracketIndex + 1);\n\n return resolveExpression(resolvedInner, definedProperties);\n }\n\n let result;\n\n // Resolve logical operators\n const indexOfAndOperator = expression.indexOf(CONDITION_OPERATOR_AND);\n const indexOfOrOperator = expression.indexOf(CONDITION_OPERATOR_OR);\n const indexOfNotOperator = expression.indexOf(CONDITION_OPERATOR_NOT);\n\n if (indexOfOrOperator !== -1) {\n result = resolveExpression(expression.substring(0, indexOfOrOperator - 1), definedProperties) ||\n resolveExpression(expression.substring(indexOfOrOperator + CONDITION_OPERATOR_OR.length, expression.length), definedProperties);\n } else if (indexOfAndOperator !== -1) {\n result = resolveExpression(expression.substring(0, indexOfAndOperator - 1), definedProperties) &&\n resolveExpression(expression.substring(indexOfAndOperator + CONDITION_OPERATOR_AND.length, expression.length), definedProperties);\n } else if (indexOfNotOperator === 0) {\n result = !resolveExpression(expression.substring(CONDITION_OPERATOR_NOT.length), definedProperties);\n } else {\n result = resolveConditionConstant(expression, definedProperties);\n }\n\n return result;\n };\n\n /**\n * Validates and resolves condition directive\n *\n * @param directive\n * @param definedProperties\n */\n const resolveCondition = (directive, definedProperties) => {\n const expression = directive.substring(CONDITION_DIRECTIVE_START.length).trim();\n\n return resolveExpression(expression, definedProperties);\n };\n\n /**\n * Resolves conditions directives\n *\n * @param rules\n * @param definedProperties\n */\n const resolveConditions = (rules, definedProperties) => {\n if (!definedProperties) {\n return rules;\n }\n\n let result = [];\n\n for (let i = 0; i < rules.length; i++) {\n let rule = rules[i];\n\n if (rule.indexOf(CONDITION_DIRECTIVE_START) === 0) {\n let endLineIndex = findConditionEnd(rules, i + 1);\n if (endLineIndex === -1) {\n throw new Error('Invalid directives: Condition end not found: ' + rule);\n }\n\n let conditionValue = resolveCondition(rule, definedProperties);\n if (conditionValue) {\n let rulesUnderCondition = rules.slice(i + 1, endLineIndex);\n // Resolve inner conditions in recursion\n result = result.concat(resolveConditions(rulesUnderCondition, definedProperties));\n }\n\n // Skip to the end of block\n i = endLineIndex;\n } else if (rule.indexOf(CONDITION_DIRECTIVE_END) === 0) {\n // Found condition end without start\n throw new Error('Invalid directives: Found unexpected condition end: ' + rule);\n } else {\n result.push(rule);\n }\n }\n\n return result;\n };\n\n /**\n * Validates url to be the same origin with original filterUrl\n *\n * @param url\n * @param filterUrlOrigin\n */\n const validateUrl = function (url, filterUrlOrigin) {\n if (filterUrlOrigin) {\n if (REGEXP_ABSOLUTE_URL.test(url)) {\n\n // Include url is absolute\n const urlOrigin = parseURL(url).origin;\n const filterOrigin = parseURL(filterUrlOrigin).origin;\n if (urlOrigin !== filterOrigin) {\n throw new Error('Include url is rejected with origin: ' + urlOrigin);\n }\n }\n }\n };\n\n /**\n * Validates and resolves include directive\n *\n * @param {string} line\n * @param {?string} filterOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const resolveInclude = function (line, filterOrigin, definedProperties) {\n if (line.indexOf(INCLUDE_DIRECTIVE) !== 0) {\n return Promise.resolve(line);\n } else {\n const url = line.substring(INCLUDE_DIRECTIVE.length).trim();\n validateUrl(url, filterOrigin);\n return downloadFilterRules(url, filterOrigin, definedProperties);\n }\n };\n\n /**\n * Resolves include directives\n *\n * @param {Array} rules array of rules\n * @param {?string} filterOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const resolveIncludes = async (rules, filterOrigin, definedProperties) => {\n const promises = rules.map(rule => {\n return resolveInclude(rule, filterOrigin, definedProperties);\n });\n\n let result = [];\n // We do not use here Promise.all because it freezes the chromium browsers and electron built on it, if there\n // are more than 1_100_00 promises. Also, we consider that wa can afford promises to be resolved sequentially.\n for (let i = 0; i < promises.length; i++) {\n const resolved = await promises[i];\n if (Array.isArray(resolved)) {\n result = result.concat(resolved);\n } else {\n result.push(resolved);\n }\n }\n\n return result;\n };\n\n /**\n * Compiles filter content\n *\n * @param {Array} rules Array of strings\n * @param {?string} filterOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const compile = (rules, filterOrigin, definedProperties) => {\n try {\n // Resolve 'if' conditions\n const resolvedConditionsResult = resolveConditions(rules, definedProperties);\n\n // Resolve 'includes' directives\n return resolveIncludes(resolvedConditionsResult, filterOrigin, definedProperties);\n } catch (ex) {\n return Promise.reject(ex);\n }\n };\n\n /**\n * Downloads filter rules from url\n *\n * @param {string} url Filter file URL\n * @param {?string} filterUrlOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const downloadFilterRules = (url, filterUrlOrigin, definedProperties) => {\n if (REGEXP_EXTERNAL_ABSOLUTE_URL.test(url) || REGEXP_EXTERNAL_ABSOLUTE_URL.test(filterUrlOrigin)) {\n return externalDownload(url, filterUrlOrigin, definedProperties);\n } else {\n return getLocalFile(url, filterUrlOrigin, definedProperties);\n }\n };\n\n /**\n * Downloads filter rules from external url\n *\n * @param {string} url Filter file absolute URL or relative path\n * @param {?string} filterUrlOrigin Filter file URL origin or null\n * @param {?object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const externalDownload = (url, filterUrlOrigin, definedProperties) => {\n\n // getting absolute url for external file with relative url\n if (!REGEXP_ABSOLUTE_URL.test(url) && REGEXP_ABSOLUTE_URL.test(filterUrlOrigin)) {\n url = `${filterUrlOrigin}/${url}`;\n }\n\n return FileDownloadWrapper.getExternalFile(url, filterUrlOrigin, definedProperties).then((lines) => {\n // Filter origin could change in case url contains subdirectories\n // https://github.com/AdguardTeam/FiltersRegistry/pull/256\n filterUrlOrigin = getFilterUrlOrigin(url, null);\n\n // Resolve 'if' conditions and 'includes' directives\n const resolvedConditionsResult = resolveConditions(lines, definedProperties);\n return resolveIncludes(resolvedConditionsResult, filterUrlOrigin, definedProperties);\n });\n };\n\n /**\n * Get filter rules from local path\n *\n * @param {string} url local path\n * @param {?string} filterUrlOrigin origin path\n * @param {?object} definedProperties An object with the defined properties\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const getLocalFile = (url, filterUrlOrigin, definedProperties) => {\n if (filterUrlOrigin) {\n url = `${filterUrlOrigin}/${url}`;\n }\n\n filterUrlOrigin = getFilterUrlOrigin(url, filterUrlOrigin);\n\n return FileDownloadWrapper.getLocalFile(url, filterUrlOrigin, definedProperties).then((lines) => {\n filterUrlOrigin = getFilterUrlOrigin(url, null);\n\n // Resolve 'if' conditions and 'includes' directives\n const resolvedConditionsResult = resolveConditions(lines, definedProperties);\n return resolveIncludes(resolvedConditionsResult, filterUrlOrigin, definedProperties);\n });\n };\n\n /**\n * Get the `filterUrlOrigin` from url for relative path resolve\n *\n * @param {string} url Filter file URL\n * @param {string|null} [filterUrlOrigin] existing origin url\n * @returns {string} valid origin url\n */\n const getFilterUrlOrigin = (url, filterUrlOrigin) => {\n if (filterUrlOrigin) {\n return filterUrlOrigin;\n } else {\n return url.substring(0, url.lastIndexOf('/'));\n }\n };\n\n /**\n * Downloads a specified filter and interpretes all the pre-processor directives from there.\n *\n * @param {string} url Filter file URL\n * @param {Object} definedProperties An object with the defined properties. These properties might be used in pre-processor directives (`#if`, etc)\n * @returns {Promise} A promise that returns {string} with rules when if resolved and {Error} if rejected.\n */\n const download = async (url, definedProperties) => {\n try {\n let filterUrlOrigin;\n if (url && REGEXP_EXTERNAL_ABSOLUTE_URL.test(url)) {\n filterUrlOrigin = getFilterUrlOrigin(url)\n }\n\n const response = await downloadFilterRules(url, filterUrlOrigin, definedProperties);\n\n // only included filters can be empty\n if (response && response.join().trim() == '') {\n throw new Error(\"Response is empty\");\n }\n\n return response;\n } catch (ex) {\n return Promise.reject(ex);\n }\n };\n\n /**\n * Parse url\n *\n * @param {string} url\n * @returns {object} parsed url data\n */\n const parseURL = (url) => {\n if (typeof URL !== 'undefined') {\n return new URL(url);\n } else {\n let URL = require('url').URL;\n return new URL(url);\n }\n };\n\n return {\n compile: compile,\n download: download,\n resolveConditions: resolveConditions,\n resolveIncludes: resolveIncludes,\n getFilterUrlOrigin: getFilterUrlOrigin\n };\n};\n\nmodule.exports = FiltersDownloaderCreator;\n","// This file replaces `index.js` in bundlers like webpack or Rollup,\n// according to `browser` config in `package.json`.\n\nconst filtersDownloaderCreator = require('./filters-downloader-creator');\nconst FileDownloadWrapper = require('./browser/file-download-wrapper');\n\nconst FiltersDownloader = filtersDownloaderCreator(FileDownloadWrapper);\n\nmodule.exports = FiltersDownloader;\n","var isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw $TypeError(tryToString(argument) + ' is not a function');\n};\n","var isCallable = require('../internals/is-callable');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (typeof argument == 'object' || isCallable(argument)) return argument;\n throw $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw $TypeError($String(argument) + ' is not an object');\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar isArray = require('../internals/is-array');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Safari < 13 does not throw an error in this case\nvar SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {\n // makes no sense without proper strict mode support\n if (this !== undefined) return true;\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).length = 1;\n } catch (error) {\n return error instanceof TypeError;\n }\n}();\n\nmodule.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {\n if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {\n throw $TypeError('Cannot set read only .length');\n } return O.length = length;\n} : function (O, length) {\n return O.length = length;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","var hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","var global = require('../internals/global');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(global, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var documentAll = typeof document == 'object' && document.all;\n\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nvar IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined;\n\nmodule.exports = {\n all: documentAll,\n IS_HTMLDDA: IS_HTMLDDA\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n","module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar $Error = Error;\nvar replace = uncurryThis(''.replace);\n\nvar TEST = (function (arg) { return String($Error(arg).stack); })('zxcasd');\n// eslint-disable-next-line redos/no-vulnerable -- safe\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\n\nmodule.exports = function (stack, dropEntries) {\n if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {\n while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n } return stack;\n};\n","var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar clearErrorStack = require('../internals/error-stack-clear');\nvar ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');\n\n// non-standard V8\nvar captureStackTrace = Error.captureStackTrace;\n\nmodule.exports = function (error, C, stack, dropEntries) {\n if (ERROR_STACK_INSTALLABLE) {\n if (captureStackTrace) captureStackTrace(error, C);\n else createNonEnumerableProperty(error, 'stack', clearErrorStack(stack, dropEntries));\n }\n};\n","var fails = require('../internals/fails');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = !fails(function () {\n var error = Error('a');\n if (!('stack' in error)) return true;\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));\n return error.stack !== 7;\n});\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","var aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || this || Function('return this')();\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","module.exports = {};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","var isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\n// `InstallErrorCause` abstract operation\n// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause\nmodule.exports = function (O, options) {\n if (isObject(options) && 'cause' in options) {\n createNonEnumerableProperty(O, 'cause', options.cause);\n }\n};\n","var NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) == 'Array';\n};\n","var $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = $documentAll.IS_HTMLDDA ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","var isCallable = require('../internals/is-callable');\nvar $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\nmodule.exports = $documentAll.IS_HTMLDDA ? function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll;\n} : function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","module.exports = false;\n","var getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","var toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","var toString = require('../internals/to-string');\n\nmodule.exports = function (argument, $default) {\n return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n","/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw $TypeError(\"Can't convert object to primitive value\");\n};\n","var getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","var defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (Target, Source, key) {\n key in Target || defineProperty(Target, key, {\n configurable: true,\n get: function () { return Source[key]; },\n set: function (it) { Source[key] = it; }\n });\n};\n","var isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || defineGlobalProperty(SHARED, {});\n\nmodule.exports = store;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.30.2',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar $String = global.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","var call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","var $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype != 42;\n});\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = global.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar hasOwn = require('../internals/has-own-property');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar proxyAccessor = require('../internals/proxy-accessor');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar normalizeStringArgument = require('../internals/normalize-string-argument');\nvar installErrorCause = require('../internals/install-error-cause');\nvar installErrorStack = require('../internals/error-stack-install');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nmodule.exports = function (FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) {\n var STACK_TRACE_LIMIT = 'stackTraceLimit';\n var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1;\n var path = FULL_NAME.split('.');\n var ERROR_NAME = path[path.length - 1];\n var OriginalError = getBuiltIn.apply(null, path);\n\n if (!OriginalError) return;\n\n var OriginalErrorPrototype = OriginalError.prototype;\n\n // V8 9.3- bug https://bugs.chromium.org/p/v8/issues/detail?id=12006\n if (!IS_PURE && hasOwn(OriginalErrorPrototype, 'cause')) delete OriginalErrorPrototype.cause;\n\n if (!FORCED) return OriginalError;\n\n var BaseError = getBuiltIn('Error');\n\n var WrappedError = wrapper(function (a, b) {\n var message = normalizeStringArgument(IS_AGGREGATE_ERROR ? b : a, undefined);\n var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError();\n if (message !== undefined) createNonEnumerableProperty(result, 'message', message);\n installErrorStack(result, WrappedError, result.stack, 2);\n if (this && isPrototypeOf(OriginalErrorPrototype, this)) inheritIfRequired(result, this, WrappedError);\n if (arguments.length > OPTIONS_POSITION) installErrorCause(result, arguments[OPTIONS_POSITION]);\n return result;\n });\n\n WrappedError.prototype = OriginalErrorPrototype;\n\n if (ERROR_NAME !== 'Error') {\n if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError);\n else copyConstructorProperties(WrappedError, BaseError, { name: true });\n } else if (DESCRIPTORS && STACK_TRACE_LIMIT in OriginalError) {\n proxyAccessor(WrappedError, OriginalError, STACK_TRACE_LIMIT);\n proxyAccessor(WrappedError, OriginalError, 'prepareStackTrace');\n }\n\n copyConstructorProperties(WrappedError, OriginalError);\n\n if (!IS_PURE) try {\n // Safari 13- bug: WebAssembly errors does not have a proper `.name`\n if (OriginalErrorPrototype.name !== ERROR_NAME) {\n createNonEnumerableProperty(OriginalErrorPrototype, 'name', ERROR_NAME);\n }\n OriginalErrorPrototype.constructor = WrappedError;\n } catch (error) { /* empty */ }\n\n return WrappedError;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.at` method\n// https://github.com/tc39/proposal-relative-indexing-method\n$({ target: 'Array', proto: true }, {\n at: function at(index) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var relativeIndex = toIntegerOrInfinity(index);\n var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;\n return (k < 0 || k >= len) ? undefined : O[k];\n }\n});\n\naddToUnscopables('at');\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar setArrayLength = require('../internals/array-set-length');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar fails = require('../internals/fails');\n\nvar INCORRECT_TO_LENGTH = fails(function () {\n return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;\n});\n\n// V8 and Safari <= 15.4, FF < 23 throws InternalError\n// https://bugs.chromium.org/p/v8/issues/detail?id=12681\nvar properErrorOnNonWritableLength = function () {\n try {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty([], 'length', { writable: false }).push();\n } catch (error) {\n return error instanceof TypeError;\n }\n};\n\nvar FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();\n\n// `Array.prototype.push` method\n// https://tc39.es/ecma262/#sec-array.prototype.push\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n push: function push(item) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n var argCount = arguments.length;\n doesNotExceedSafeInteger(len + argCount);\n for (var i = 0; i < argCount; i++) {\n O[len] = arguments[i];\n len++;\n }\n setArrayLength(O, len);\n return len;\n }\n});\n","/* eslint-disable no-unused-vars -- required for functions `.length` */\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar apply = require('../internals/function-apply');\nvar wrapErrorConstructorWithCause = require('../internals/wrap-error-constructor-with-cause');\n\nvar WEB_ASSEMBLY = 'WebAssembly';\nvar WebAssembly = global[WEB_ASSEMBLY];\n\nvar FORCED = Error('e', { cause: 7 }).cause !== 7;\n\nvar exportGlobalErrorCauseWrapper = function (ERROR_NAME, wrapper) {\n var O = {};\n O[ERROR_NAME] = wrapErrorConstructorWithCause(ERROR_NAME, wrapper, FORCED);\n $({ global: true, constructor: true, arity: 1, forced: FORCED }, O);\n};\n\nvar exportWebAssemblyErrorCauseWrapper = function (ERROR_NAME, wrapper) {\n if (WebAssembly && WebAssembly[ERROR_NAME]) {\n var O = {};\n O[ERROR_NAME] = wrapErrorConstructorWithCause(WEB_ASSEMBLY + '.' + ERROR_NAME, wrapper, FORCED);\n $({ target: WEB_ASSEMBLY, stat: true, constructor: true, arity: 1, forced: FORCED }, O);\n }\n};\n\n// https://tc39.es/ecma262/#sec-nativeerror\n// https://github.com/tc39/proposal-error-cause\nexportGlobalErrorCauseWrapper('Error', function (init) {\n return function Error(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('EvalError', function (init) {\n return function EvalError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('RangeError', function (init) {\n return function RangeError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('ReferenceError', function (init) {\n return function ReferenceError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('SyntaxError', function (init) {\n return function SyntaxError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('TypeError', function (init) {\n return function TypeError(message) { return apply(init, this, arguments); };\n});\nexportGlobalErrorCauseWrapper('URIError', function (init) {\n return function URIError(message) { return apply(init, this, arguments); };\n});\nexportWebAssemblyErrorCauseWrapper('CompileError', function (init) {\n return function CompileError(message) { return apply(init, this, arguments); };\n});\nexportWebAssemblyErrorCauseWrapper('LinkError', function (init) {\n return function LinkError(message) { return apply(init, this, arguments); };\n});\nexportWebAssemblyErrorCauseWrapper('RuntimeError', function (init) {\n return function RuntimeError(message) { return apply(init, this, arguments); };\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\n\nvar charAt = uncurryThis(''.charAt);\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line es/no-array-string-prototype-at -- safe\n return '𠮷'.at(-2) !== '\\uD842';\n});\n\n// `String.prototype.at` method\n// https://github.com/tc39/proposal-relative-indexing-method\n$({ target: 'String', proto: true, forced: FORCED }, {\n at: function at(index) {\n var S = toString(requireObjectCoercible(this));\n var len = S.length;\n var relativeIndex = toIntegerOrInfinity(index);\n var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;\n return (k < 0 || k >= len) ? undefined : charAt(S, k);\n }\n});\n","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */\n\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n\n /* vim: set sts=2 sw=2 et tw=80: */\n\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!globalThis.chrome?.runtime?.id) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n\n if (typeof globalThis.browser === \"undefined\" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n\n\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n\n return super.get(key);\n }\n\n }\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n\n\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n\n\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n\n\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args); // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n\n\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n\n });\n };\n\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy}\n */\n\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n\n if (!(prop in target)) {\n return undefined;\n }\n\n let value = target[prop];\n\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n\n get() {\n return target[prop];\n },\n\n set(value) {\n target[prop] = value;\n }\n\n });\n return value;\n }\n\n cache[prop] = value;\n return value;\n },\n\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n\n return true;\n },\n\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n\n }; // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n\n\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n\n });\n\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n\n\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {}\n /* wrappers */\n , {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n\n\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n\n const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n } // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n\n\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n }; // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n\n\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n } // Let Chrome know that the listener is replying.\n\n\n return true;\n };\n });\n\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n }; // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n\n\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","\n/**\n * AdGuard Scriptlets\n * Version 1.9.62\n */\n\n(function (factory) {\n typeof define === 'function' && define.amd ? define(factory) :\n factory();\n})((function () {\n /**\n * Concat dependencies to scriptlet code\n *\n * @param scriptlet scriptlet or redirect function\n * @returns string view of scriptlet with attached dependencies\n */\n function attachDependencies(scriptlet) {\n var _scriptlet$injections = scriptlet.injections,\n injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections;\n return injections.reduce(function (accum, dep) {\n return \"\".concat(accum, \"\\n\").concat(dep.toString());\n }, scriptlet.toString());\n }\n\n /**\n * Add scriptlet call to existing code\n *\n * @param scriptlet scriptlet func\n * @param code scriptlet's string representation\n * @returns wrapped scriptlet call\n */\n function addCall(scriptlet, code) {\n return \"\".concat(code, \"\\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\\n try {\\n \").concat(scriptlet.name, \".apply(this, updatedArgs);\\n } catch (e) {\\n console.log(e);\\n }\");\n }\n\n /**\n * Wrap function into IIFE (Immediately invoked function expression)\n *\n * @example\n * const source = {\n * args: [\"aaa\", \"bbb\"],\n * name: 'noeval',\n * };\n * const code = \"function noeval(source, args) { alert(source); } noeval.apply(this, args);\"\n * const result = wrapInIIFE(source, code);\n *\n * // result\n * `(function(source, args) {\n * function noeval(source) { alert(source); }\n * noeval.apply(this, args);\n * )({\"args\": [\"aaa\", \"bbb\"], \"name\":\"noeval\"}, [\"aaa\", \"bbb\"])`\n * @param source - object with scriptlet properties\n * @param code - scriptlet source code with dependencies\n * @param redirect if function is redirect\n * @returns full scriptlet code\n */\n function passSourceAndProps(source, code) {\n var redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var sourceString = JSON.stringify(source);\n var argsString = source.args ? \"[\".concat(source.args.map(function (arg) {\n return JSON.stringify(arg);\n }), \"]\") : undefined;\n var params = argsString ? \"\".concat(sourceString, \", \").concat(argsString) : sourceString;\n if (redirect) {\n return \"(function(source, args){\\n\".concat(code, \"\\n})(\").concat(params, \");\");\n }\n return \"(\".concat(code, \")(\").concat(params, \");\");\n }\n\n /**\n * Wrap code in no name function\n *\n * @param code which must be wrapped\n * @returns wrapped code\n */\n function wrapInNonameFunc(code) {\n return \"function(source, args){\\n\".concat(code, \"\\n}\");\n }\n\n /**\n * Checks whether the obj is an empty object\n *\n * @param obj arbitrary object\n * @returns if object is empty\n */\n var isEmptyObject = function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n };\n\n /**\n * Safely retrieve property descriptor\n *\n * @param obj target object\n * @param prop target property\n * @returns descriptor or null if it's not available or non-configurable\n */\n var safeGetDescriptor = function safeGetDescriptor(obj, prop) {\n var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n };\n\n /**\n * Set getter and setter to property if it's configurable\n *\n * @param object target object with property\n * @param property property name\n * @param descriptor contains getter and setter functions\n * @returns is operation successful\n */\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n\n /**\n * Determines whether the passed value is NaN\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN\n *\n * @param num arbitrary value\n * @returns if provided value is NaN\n */\n var nativeIsNaN = function nativeIsNaN(num) {\n // eslint-disable-next-line no-restricted-properties\n var native = Number.isNaN || window.isNaN;\n return native(num);\n };\n /**\n * Determines whether the passed value is a finite number\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite\n *\n * @param num arbitrary value\n * @returns if provided value is finite\n */\n var nativeIsFinite = function nativeIsFinite(num) {\n // eslint-disable-next-line no-restricted-properties\n var native = Number.isFinite || window.isFinite;\n return native(num);\n };\n\n /**\n * Parses string for a number, if possible, otherwise returns null.\n *\n * @param rawString arbitrary string\n * @returns number or null if string not parsable\n */\n var getNumberFromString = function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n };\n\n /**\n * Generate a random integer between two values, inclusive\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive\n *\n * @param min range minimum\n * @param max range maximum\n * @returns random number\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n\n /**\n * A literal string or regexp pattern wrapped in forward slashes.\n * For example, 'simpleStr' or '/adblock|_0x/'.\n */\n\n /**\n * String.prototype.replaceAll polyfill\n *\n * @param input input string\n * @param substr to look for\n * @param newSubstr replacement\n * @returns result string\n */\n var replaceAll = function replaceAll(input, substr, newSubstr) {\n return input.split(substr).join(newSubstr);\n };\n\n /**\n * Escapes special chars in string\n *\n * @param str raw string\n * @returns string with escaped special characters\n */\n var escapeRegExp = function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n\n /**\n * Converts string to the regexp,\n * if string contains valid regexp flags it will be converted to regexp with flags\n * TODO think about nested dependencies, but be careful with dependency loops\n *\n * @param input literal string or regexp pattern; defaults to '' (empty string)\n * @returns regular expression; defaults to /.?/\n */\n var toRegExp = function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var DEFAULT_VALUE = '.?';\n var FORWARD_SLASH = '/';\n if (input === '') {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n\n /**\n * Checks whether the string is a valid regexp flag\n *\n * @param flag string\n * @returns True if regexp flag is valid, otherwise false.\n */\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n // eslint-disable-next-line no-new\n new RegExp('', flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n\n /**\n * Checks whether the text string contains valid regexp flags,\n * and returns `flagsStr` if valid, otherwise empty string.\n *\n * @param regExpStr string\n * @param flagsStr string\n * @returns `flagsStr` if it is valid, otherwise empty string.\n */\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH)\n // Not a correct regex if ends with '\\\\/'\n && !regExpStr.endsWith('\\\\/') && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return '';\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input\n // remove quotes' escapes for cases where scriptlet rule argument has own escaped quotes\n // e.g #%#//scriptlet('prevent-setTimeout', '.css(\\'display\\',\\'block\\');')\n .replace(/\\\\'/g, '\\'').replace(/\\\\\"/g, '\"')\n // escape special characters for following RegExp construction\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(escaped);\n };\n\n /**\n * Checks whether the input string can be converted to regexp\n *\n * @param input literal string or regexp pattern\n * @returns if input can be converted to regexp\n */\n var isValidStrPattern = function isValidStrPattern(input) {\n var FORWARD_SLASH = '/';\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n };\n\n /**\n * Get string before regexp first match\n *\n * @param str input string\n * @param rx find pattern\n * @returns result string\n */\n var getBeforeRegExp = function getBeforeRegExp(str, rx) {\n var index = str.search(rx);\n return str.substring(0, index);\n };\n var substringAfter$1 = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n var substringBefore = function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n };\n\n /**\n * Wrap str in single quotes and replaces single quotes to double one\n *\n * @param str input string\n * @returns string with swapped quotes\n */\n var wrapInSingleQuotes = function wrapInSingleQuotes(str) {\n if (str[0] === '\\'' && str[str.length - 1] === '\\'' || str[0] === '\"' && str[str.length - 1] === '\"') {\n str = str.substring(1, str.length - 1);\n }\n // eslint-disable-next-line no-useless-escape\n str = str.replace(/\\'/g, '\"');\n return \"'\".concat(str, \"'\");\n };\n\n /**\n * Returns substring enclosed in the widest braces\n *\n * @param str input string\n * @returns substring\n */\n var getStringInBraces = function getStringInBraces(str) {\n var firstIndex = str.indexOf('(');\n var lastIndex = str.lastIndexOf(')');\n return str.substring(firstIndex + 1, lastIndex);\n };\n\n /**\n * Prepares RTCPeerConnection config as string for proper logging\n *\n * @param config RTC config\n * @returns stringified config\n */\n var convertRtcConfigToString = function convertRtcConfigToString(config) {\n var UNDEF_STR = 'undefined';\n var str = UNDEF_STR;\n if (config === null) {\n str = 'null';\n } else if (config instanceof Object) {\n var SERVERS_PROP_NAME = 'iceServers';\n var URLS_PROP_NAME = 'urls';\n /*\n const exampleConfig = {\n 'iceServers': [\n 'urls': ['stun:35.66.206.188:443'],\n ],\n };\n */\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n };\n\n /**\n * Checks whether the match input string can be converted to regexp,\n * used for match inputs with possible negation\n *\n * @param match literal string or regexp pattern\n * @returns true if input can be converted to regexp\n */\n var isValidMatchStr = function isValidMatchStr(match) {\n var INVERT_MARKER = '!';\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n };\n\n /**\n * Validates the match input number,\n * used for match inputs with possible negation\n *\n * @param match string of match number\n * @returns if match number is valid\n */\n var isValidMatchNumber = function isValidMatchNumber(match) {\n var INVERT_MARKER = '!';\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n var num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n };\n\n /**\n * Parses match arg with possible negation for no matching.\n * Needed for prevent-setTimeout, prevent-setInterval,\n * prevent-requestAnimationFrame and prevent-window-open\n *\n * @param match matching arg\n * @returns data prepared for matching\n */\n var parseMatchArg = function parseMatchArg(match) {\n var INVERT_MARKER = '!';\n // In case if \"match\" is \"undefined\" return \"false\"\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch,\n matchRegexp,\n matchValue\n };\n };\n\n /**\n * Parses delay arg with possible negation for no matching.\n * Needed for prevent-setTimeout and prevent-setInterval\n *\n * @param delay scriptlet's delay arg\n * @returns parsed delay data\n */\n var parseDelayArg = function parseDelayArg(delay) {\n var INVERT_MARKER = '!';\n var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER);\n var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n var parsedDelay = parseInt(delayValue, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return {\n isInvertedDelayMatch,\n delayMatch\n };\n };\n\n /**\n * Converts object to string for logging\n *\n * @param obj data object\n * @returns object's string representation\n */\n var objectToString = function objectToString(obj) {\n // In case if the type of passed obj is different than Object\n // https://github.com/AdguardTeam/Scriptlets/issues/282\n if (!obj || typeof obj !== 'object') {\n return String(obj);\n }\n return isEmptyObject(obj) ? '{}' : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, \":\\\"\").concat(recordValueStr, \"\\\"\");\n }).join(' ');\n };\n\n /**\n * Converts types into a string\n *\n * @param value input value type\n * @returns type's string representation\n */\n var convertTypeToString = function convertTypeToString(value) {\n var output;\n if (typeof value === 'undefined') {\n output = 'undefined';\n } else if (typeof value === 'object') {\n if (value === null) {\n output = 'null';\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n };\n\n /**\n * Generate a random string, a length of the string is provided as an argument\n *\n * @param length output's length\n * @returns random string\n */\n function getRandomStrByLength(length) {\n var result = '';\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~';\n var charactersLength = characters.length;\n for (var i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n\n /**\n * Generate a random string\n *\n * @param customResponseText response text to include in output\n * @returns random string or null if passed argument is invalid\n */\n function generateRandomResponse(customResponseText) {\n var customResponse = customResponseText;\n if (customResponse === 'true') {\n // Generate random alphanumeric string of 10 symbols\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace('length:', '');\n var rangeRegex = /^\\d+-\\d+$/;\n // Return empty string if range is invalid\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n var rangeMin = getNumberFromString(customResponse.split('-')[0]);\n var rangeMax = getNumberFromString(customResponse.split('-')[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n\n // If rangeMin > rangeMax, swap variables\n if (rangeMin > rangeMax) {\n var temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n var LENGTH_RANGE_LIMIT = 500 * 1000;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n var length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n\n /**\n * Infers value from string argument\n * Inferring goes from more specific to more ambiguous options\n * Arrays, objects and strings are parsed via JSON.parse\n *\n * @param value arbitrary string\n * @returns converted value\n * @throws an error on unexpected input\n */\n function inferValue(value) {\n if (value === 'undefined') {\n return undefined;\n }\n if (value === 'false') {\n return false;\n }\n if (value === 'true') {\n return true;\n }\n if (value === 'null') {\n return null;\n }\n if (value === 'NaN') {\n return NaN;\n }\n\n // Number class constructor works 2 times faster than JSON.parse\n // and wont interpret mixed inputs like '123asd' as parseFloat would\n var MAX_ALLOWED_NUM = 32767;\n var numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error('number values bigger than 32767 are not allowed');\n }\n return numVal;\n }\n var errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n // Parse strings, arrays and objects represented as JSON strings\n // '[1,2,3,\"string\"]' > [1, 2, 3, 'string']\n // '\"arbitrary string\"' > 'arbitrary string'\n var parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === 'string') {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n\n /**\n * Transition names\n */\n\n /**\n * Iterate over iterable argument and evaluate current state with transitions\n *\n * @param iterable rule or list or rules\n * @param transitions helper object with transition functions\n * @param init first transition name\n * @param args arguments which should be passed to transition functions\n * @returns state\n */\n function iterateWithTransitions(iterable, transitions, init, args) {\n var state = init || Object.keys(transitions)[0];\n for (var i = 0; i < iterable.length; i += 1) {\n state = transitions[state](iterable, i, args);\n }\n return state;\n }\n\n /**\n * AdGuard scriptlet rule mask\n */\n var ADG_SCRIPTLET_MASK = '#//scriptlet';\n\n /**\n * Helper to accumulate an array of strings char by char\n *\n * @returns object with helper methods\n */\n var wordSaver = function wordSaver() {\n var str = '';\n var strings = [];\n var saveSymb = function saveSymb(s) {\n str += s;\n return str;\n };\n var saveStr = function saveStr() {\n strings.push(str);\n str = '';\n };\n var getAll = function getAll() {\n return [...strings];\n };\n return {\n saveSymb,\n saveStr,\n getAll\n };\n };\n var substringAfter = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n\n /**\n * Parses scriptlet rule and validates its syntax.\n *\n * @param ruleText Rule string\n *\n * @returns Parsed rule data.\n * @throws An error on invalid rule syntax.\n */\n var parseRule = function parseRule(ruleText) {\n ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK);\n /**\n * Transition function: the current index position in start, end or between params\n *\n * @param rule rule string\n * @param index index\n * @param Object helper object that contains prop symb with current separator char\n * @param Object.sep contains prop `symb` with current separator char\n * @throws throws if given rule is not a scriptlet\n * @returns transition\n */\n var opened = function opened(rule, index, _ref) {\n var sep = _ref.sep;\n var char = rule[index];\n var transition;\n switch (char) {\n case ' ':\n case '(':\n case ',':\n {\n transition = \"opened\";\n break;\n }\n case '\\'':\n case '\"':\n {\n sep.symb = char;\n transition = \"param\";\n break;\n }\n case ')':\n {\n transition = index === rule.length - 1 ? \"closed\" : \"opened\";\n break;\n }\n default:\n {\n throw new Error('The rule is not a scriptlet');\n }\n }\n return transition;\n };\n\n /**\n * Transition function: the current index position inside param\n *\n * @param rule rule string\n * @param index index\n * @param Object helper object\n * @param Object.sep contains prop `symb` with current separator char\n * @param Object.saver helper which allow to save strings by car by cha\n * @returns transition\n */\n var param = function param(rule, index, _ref2) {\n var saver = _ref2.saver,\n sep = _ref2.sep;\n var char = rule[index];\n switch (char) {\n case '\\'':\n case '\"':\n {\n var preIndex = index - 1;\n var before = rule[preIndex];\n if (char === sep.symb && before !== '\\\\') {\n sep.symb = null;\n saver.saveStr();\n return \"opened\";\n }\n }\n // eslint-disable-next-line no-fallthrough\n default:\n {\n saver.saveSymb(char);\n return \"param\";\n }\n }\n };\n var transitions = {\n [\"opened\"]: opened,\n [\"param\"]: param,\n [\"closed\"]: function () {}\n };\n var sep = {\n symb: null\n };\n var saver = wordSaver();\n var state = iterateWithTransitions(ruleText, transitions, \"opened\", {\n sep,\n saver\n });\n if (state !== \"closed\") {\n throw new Error(\"Invalid scriptlet rule \".concat(ruleText));\n }\n var args = saver.getAll();\n return {\n name: args[0],\n args: args.slice(1)\n };\n };\n\n /**\n * Validates event type\n *\n * @param type event type\n * @returns true if type is valid\n */\n var validateType = function validateType(type) {\n // https://github.com/AdguardTeam/Scriptlets/issues/125\n return typeof type !== 'undefined';\n };\n\n /**\n * Validates event listener\n *\n * @param listener event listener\n * @returns true if listener callback is valid\n */\n var validateListener = function validateListener(listener) {\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters\n return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object'\n // https://github.com/AdguardTeam/Scriptlets/issues/76\n && listener !== null && 'handleEvent' in listener && typeof listener.handleEvent === 'function');\n };\n\n /**\n * Serialize valid event listener\n * https://developer.mozilla.org/en-US/docs/Web/API/EventListener\n *\n * @param listener valid listener\n * @returns listener string\n */\n var listenerToString = function listenerToString(listener) {\n return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString();\n };\n\n var shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) {\n return delay === '*';\n };\n\n /**\n * Handles input delay value\n *\n * @param delay matchDelay argument of adjust-* scriptlets\n * @returns proper number delay value\n */\n var getMatchDelay = function getMatchDelay(delay) {\n var DEFAULT_DELAY = 1000;\n var parsedDelay = parseInt(delay, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY // default scriptlet value\n : parsedDelay;\n return delayMatch;\n };\n\n /**\n * Checks delay match condition\n *\n * @param inputDelay matchDelay argument of adjust-* scriptlets\n * @param realDelay delay argument of setTimeout/setInterval\n * @returns if given delays match\n */\n var isDelayMatched = function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n };\n\n /**\n * Handles input boost value\n *\n * @param boost boost argument of adjust-* scriptlets\n * @returns proper number boost multiplier value\n */\n var getBoostMultiplier = function getBoostMultiplier(boost) {\n var DEFAULT_MULTIPLIER = 0.05;\n // https://github.com/AdguardTeam/Scriptlets/issues/262\n var MIN_MULTIPLIER = 0.001;\n var MAX_MULTIPLIER = 50;\n var parsedBoost = parseFloat(boost);\n var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value\n : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n };\n\n /**\n * Some browsers do not support Array.prototype.flat()\n * for example, Opera 42 which is used for browserstack tests\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n *\n * @param input arbitrary array\n * @returns flattened array\n */\n var flatten = function flatten(input) {\n var stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n var res = [];\n while (stack.length) {\n // pop value from stack\n var next = stack.pop();\n if (Array.isArray(next)) {\n // push back array items, won't modify the original input\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n // reverse to restore input order\n return res.reverse();\n };\n\n /**\n * Predicate method to check if the array item exists\n *\n * @param item arbitrary\n * @returns if item is truthy or not\n */\n var isExisting = function isExisting(item) {\n return !!item;\n };\n\n /**\n * Converts NodeList to array\n *\n * @param {NodeList} nodeList arbitrary NodeList\n * @returns {Node[Array]} array of nodes\n */\n var nodeListToArray = function nodeListToArray(nodeList) {\n var nodes = [];\n for (var i = 0; i < nodeList.length; i += 1) {\n nodes.push(nodeList[i]);\n }\n return nodes;\n };\n\n /**\n * Checks whether the input path is supported\n *\n * @param rawPath input path\n * @returns if cookie path is valid\n */\n var isValidCookiePath = function isValidCookiePath(rawPath) {\n return rawPath === '/' || rawPath === 'none';\n };\n\n /**\n * Returns 'path=/' if rawPath is '/'\n * or empty string '' for other cases, `rawPath === 'none'` included\n *\n * @param rawPath path argument of *set-cookie-* scriptlets\n * @returns cookie path\n */\n var getCookiePath = function getCookiePath(rawPath) {\n if (rawPath === '/') {\n return 'path=/';\n }\n // otherwise do not set path as invalid\n // the same for pathArg === 'none'\n return '';\n };\n\n /**\n * Combines input cookie name, value, and path into string.\n *\n * @param rawName name argument of *set-cookie-* scriptlets\n * @param rawValue value argument of *set-cookie-* scriptlets\n * @param rawPath path argument of *set-cookie-* scriptlets\n * @param shouldEncode if cookie's name and value should be encoded\n * @returns string OR `null` if name or value is invalid\n */\n var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = ';';\n // semicolon will cause the cookie to break\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n };\n\n /**\n * Gets supported cookie value\n *\n * @param value input cookie value\n * @returns valid cookie string if ok OR null if not\n */\n var getLimitedCookieValue = function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n var allowedCookieValues = new Set(['true', 'false', 'yes', 'y', 'no', 'n', 'ok', 'accept', 'reject', 'allow', 'deny']);\n var validValue;\n if (allowedCookieValues.has(value.toLowerCase())) {\n validValue = value;\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n };\n\n /**\n * Object to represent document.cookie-like string\n */\n\n /**\n * Parses cookie string into object\n *\n * @param cookieString string that conforms to document.cookie format\n * @returns key:value object that corresponds with incoming cookies keys and values\n */\n var parseCookieString = function parseCookieString(cookieString) {\n var COOKIE_DELIMITER = '=';\n var COOKIE_PAIRS_DELIMITER = ';';\n\n // Get raw cookies\n var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n var cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n var cookieKey;\n var cookieValue = '';\n var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n // Save cookie key=value data with null instead of empty ('') values\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n };\n\n /**\n * Check if cookie with specified name and value is present in a cookie string\n *\n * @param cookieString 'document.cookie'-like string\n * @param name name argument of *set-cookie-* scriptlets\n * @param value value argument of *set-cookie-* scriptlets\n * @returns if cookie is already set\n */\n var isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(';').some(function (cookieStr) {\n var pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return false;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n var cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n };\n\n /**\n * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid\n *\n * @param offsetExpiresSec input offset param in seconds\n * @returns number is milliseconds OR null\n */\n var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) {\n var ONE_YEAR_EXPIRATION_KEYWORD = '1year';\n var ONE_DAY_EXPIRATION_KEYWORD = '1day';\n var MS_IN_SEC = 1000;\n var SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n var SECONDS_IN_DAY = 24 * 60 * 60;\n var parsedSec;\n // Set predefined expire value if corresponding keyword was passed\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n // If offsetExpiresSec has been parsed to NaN - do not set cookie at all\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n };\n\n /**\n * Noop function\n */\n var noopFunc = function noopFunc() {};\n\n /**\n * Function returns noopFunc\n *\n * @returns noopFunc\n */\n var noopCallbackFunc = function noopCallbackFunc() {\n return noopFunc;\n };\n\n /**\n * Function returns null\n *\n * @returns null\n */\n var noopNull = function noopNull() {\n return null;\n };\n\n /**\n * Function returns true\n *\n * @returns true\n */\n var trueFunc = function trueFunc() {\n return true;\n };\n\n /**\n * Function returns false\n *\n * @returns false\n */\n var falseFunc = function falseFunc() {\n return false;\n };\n\n /**\n * Function returns this\n *\n * @returns this object\n */\n function noopThis() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return this;\n }\n\n /**\n * Function returns empty string\n *\n * @returns empty string\n */\n var noopStr = function noopStr() {\n return '';\n };\n\n /**\n * Function returns empty array\n *\n * @returns empty array\n */\n var noopArray = function noopArray() {\n return [];\n };\n\n /**\n * Function returns empty object\n *\n * @returns empty object\n */\n var noopObject = function noopObject() {\n return {};\n };\n\n /**\n * Function throws an error\n *\n * @throws\n */\n var throwFunc = function throwFunc() {\n throw new Error();\n };\n\n /**\n * Function returns Promise.reject()\n *\n * @returns rejected Promise\n */\n var noopPromiseReject = function noopPromiseReject() {\n return Promise.reject();\n };\n\n /**\n * Returns Promise object that is resolved with specified props\n *\n * @param responseBody value to set as responseBody\n * @param responseUrl value to set as responseUrl\n * @param responseType value to set as responseType\n * @returns resolved Promise or undefined if Response interface is not available\n */\n var noopPromiseResolve = function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}';\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default';\n if (typeof Response === 'undefined') {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: 'OK'\n });\n\n // Mock response' url & type to avoid adb checks\n // https://github.com/AdguardTeam/Scriptlets/issues/216\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n\n // eslint-disable-next-line consistent-return\n return Promise.resolve(response);\n };\n\n /**\n * Determines if type of script is inline or injected\n * and when it's one of them then return true, otherwise false\n * https://github.com/AdguardTeam/Scriptlets/issues/201\n *\n * @param stackMatch input stack value to match\n * @param stackTrace script error stack trace\n * @returns if stacks match\n */\n var shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = 'inlineScript';\n var INJECTED_SCRIPT_STRING = 'injectedScript';\n var INJECTED_SCRIPT_MARKER = '';\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf('#');\n // Remove URL hash\n // in Chrome, URL in stackTrace doesn't contain hash\n // so, it's necessary to remove it, otherwise location.href\n // will not match with location from stackTrace\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split('\\n').slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n // Get stack trace URL\n // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20\n // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16)\n // so, first group \"(.*?@)\" is required for Firefox, second group contains URL\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith('(')) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith('at')) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n };\n\n /**\n * Finds shadow-dom host (elements with shadowRoot property) in DOM of rootElement.\n *\n * @param rootElement shadow dom root\n * @returns shadow-dom hosts\n */\n var findHostElements = function findHostElements(rootElement) {\n var hosts = [];\n if (rootElement) {\n // Element.querySelectorAll() returns list of elements\n // which are defined in DOM of Element.\n // Meanwhile, inner DOM of the element with shadowRoot property\n // is absolutely another DOM and which can not be reached by querySelectorAll('*')\n var domElems = rootElement.querySelectorAll('*');\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n }\n return hosts;\n };\n\n /**\n * A collection of nodes.\n *\n * @external NodeList\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/NodeList NodeList}\n */\n\n /**\n * Pierces open shadow-dom in order to find:\n * - elements by 'selector' matching\n * - inner shadow-dom hosts\n *\n * @param selector DOM elements selector\n * @param hostElements shadow-dom hosts\n * @returns object with found elements and shadow-dom hosts\n */\n var pierceShadowDom = function pierceShadowDom(selector, hostElements) {\n var targets = [];\n var innerHostsAcc = [];\n\n // it's possible to get a few hostElements found by baseSelector on the page\n hostElements.forEach(function (host) {\n // check presence of selector element inside base element if it's not in shadow-dom\n var simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n var shadowRootElem = host.shadowRoot;\n var shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n\n // find inner shadow-dom hosts inside processing shadow-dom\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n\n // if there were more than one host element,\n // innerHostsAcc is an array of arrays and should be flatten\n var innerHosts = flatten(innerHostsAcc);\n return {\n targets,\n innerHosts\n };\n };\n\n /**\n * Checks whether the passed arg is proper callback\n *\n * @param callback arbitrary callback\n * @returns if callback is valid\n */\n var isValidCallback = function isValidCallback(callback) {\n return callback instanceof Function\n // passing string as 'code' arg is not recommended\n // but it is possible and not restricted\n // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters\n || typeof callback === 'string';\n };\n\n /**\n * Parses delay argument of setTimeout / setInterval methods into\n * rounded down number for number/string values or passes on for other types.\n * Needed for prevent-setTimeout and prevent-setInterval\n *\n * @param delay native method delay arg\n * @returns number as parsed delay or any input type if `delay` is not parsable\n */\n var parseRawDelay = function parseRawDelay(delay) {\n var parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n };\n /**\n * Checks whether 'callback' and 'delay' are matching\n * by given parameters 'matchCallback' and 'matchDelay'.\n * Used for prevent-setTimeout and prevent-setInterval.\n *\n * @param preventData set of data to determine if scriptlet should match\n * @param preventData.callback method's callback arg\n * @param preventData.delay method's delay arg\n * @param preventData.matchCallback scriptlets's callback arg\n * @param preventData.matchDelay scriptlets's delay arg\n * @returns if scriptlet should match\n */\n var isPreventionNeeded = function isPreventionNeeded(_ref) {\n var callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n // if callback is has not valid type\n // scriptlet can not prevent it\n // so no need for more checking and do not call hit() later\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n var _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n\n // Parse delay for decimal, string and non-number values\n // https://github.com/AdguardTeam/Scriptlets/issues/247\n var parsedDelay = parseRawDelay(delay);\n var shouldPrevent = false;\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n var callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n };\n\n var handleOldReplacement = function handleOldReplacement(replacement) {\n var result;\n // defaults to return noopFunc instead of window.open\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === 'trueFunc') {\n result = trueFunc;\n } else if (replacement.includes('=')) {\n // We should return noopFunc instead of window.open\n // but with some property if website checks it (examples 5, 6)\n // https://github.com/AdguardTeam/Scriptlets/issues/71\n var isProp = replacement.startsWith('{') && replacement.endsWith('}');\n if (isProp) {\n var propertyPart = replacement.slice(1, -1);\n var propertyName = substringBefore(propertyPart, '=');\n var propertyValue = substringAfter$1(propertyPart, '=');\n if (propertyValue === 'noopFunc') {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n };\n /**\n * Creates a decoy HTML element with a specified URL and delay before removal\n *\n * @param args an object with `replacement`, `url`, and `delay` properties\n * @returns the decoy element that was created and added to the document body\n */\n var createDecoy = function createDecoy(args) {\n var UrlPropNameOf = /*#__PURE__*/function (UrlPropNameOf) {\n UrlPropNameOf[\"Object\"] = \"data\";\n UrlPropNameOf[\"Iframe\"] = \"src\";\n return UrlPropNameOf;\n }({});\n var replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n var tag;\n if (replacement === 'obj') {\n tag = \"object\";\n } else {\n tag = \"iframe\";\n }\n var decoy = document.createElement(tag);\n if (decoy instanceof HTMLObjectElement) {\n decoy[UrlPropNameOf.Object] = url;\n } else if (decoy instanceof HTMLIFrameElement) {\n decoy[UrlPropNameOf.Iframe] = url;\n }\n decoy.style.setProperty('height', '1px', 'important');\n decoy.style.setProperty('position', 'fixed', 'important');\n decoy.style.setProperty('top', '-1px', 'important');\n decoy.style.setProperty('width', '1px', 'important');\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1000);\n return decoy;\n };\n var getPreventGetter = function getPreventGetter(nativeGetter) {\n var preventGetter = function preventGetter(target, prop) {\n if (prop && prop === 'closed') {\n return false;\n }\n if (typeof nativeGetter === 'function') {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n };\n\n /* eslint-disable no-console, no-underscore-dangle */\n\n /**\n * Hit used only for debug purposes now\n *\n * @param source scriptlet properties\n * use LOG_MARKER = 'log: ' at the start of a message\n * for logging scriptlets\n */\n var hit = function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || '';\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = '#%#//';\n var UBO_SCRIPTLET_MARKER = '##+js';\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n // delete all domains from ruleText and leave just rule part\n var rulePart = source.ruleText.slice(ruleStartIndex);\n // prepare applied scriptlet rule for specific domain\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {\n // try catch for Edge 15\n // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/\n // console.log throws an error\n }\n\n // This is necessary for unit-tests only!\n if (typeof window.__debug === 'function') {\n window.__debug(source);\n }\n };\n\n /**\n * Check if the property exists in the base object (recursively).\n * Similar to getPropertyInChain but upgraded for json-prune:\n * handle wildcard properties and does not define nonexistent base property as 'undefined'\n *\n * @param base object that owns chain\n * @param chain chain of owner properties\n * @param lookThrough should the method look through it's props in order to find wildcard\n * @param output result acc\n * @returns list of ChainInfo objects\n */\n function getWildcardPropertyInChain(base, chain) {\n var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n var pos = chain.indexOf('.');\n if (pos === -1) {\n // for paths like 'a.b.*' every final nested prop should be processed\n if (chain === '*' || chain === '[]') {\n // eslint-disable-next-line no-restricted-syntax\n for (var key in base) {\n // to process each key in base except inherited ones\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base,\n prop: chain\n });\n }\n return output;\n }\n var prop = chain.slice(0, pos);\n var shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object;\n if (shouldLookThrough) {\n var nextProp = chain.slice(pos + 1);\n var baseKeys = Object.keys(base);\n\n // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'),\n // each one of base keys should be considered as a potential chain prop in final path\n baseKeys.forEach(function (key) {\n var item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n\n /**\n * Conditionally logs message to console.\n * Convention is to log messages by source.verbose if such log\n * is not a part of scriptlet's functionality, eg on invalid input,\n * and use 'forced' argument otherwise.\n *\n * @param source required, scriptlet properties\n * @param message required, message to log\n * @param forced to log message unconditionally\n * @param convertMessageToString to convert message to string\n */\n var logMessage = function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n\n // eslint-disable-next-line no-console\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n // Template literals convert object to string,\n // so 'message' should not be passed to template literals\n // as it will not be logged correctly\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n };\n\n /**\n * Checks if prunning is required\n *\n * @param source required, scriptlet properties\n * @param root object which should be pruned or logged\n * @param prunePaths array with string of space-separated property chains to remove\n * @param requiredPaths array with string of space-separated propertiy chains\n * which must be all present for the pruning to occur\n * @returns true if prunning is required\n */\n function isPruningNeeded(source, root, prunePaths, requiredPaths) {\n if (!root) {\n return false;\n }\n var shouldProcess;\n\n // Only log hostname and matched JSON payload if only second argument is present\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n var rootString = JSON.stringify(root);\n var matchRegex = toRegExp(requiredPaths.join(''));\n var shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n var wildcardSymbols = ['.*.', '*.', '.*', '.[].', '[].', '.[]'];\n var _loop = function _loop() {\n var requiredPath = requiredPaths[i];\n var lastNestedPropName = requiredPath.split('.').pop();\n var hasWildcard = wildcardSymbols.some(function (symbol) {\n return requiredPath.includes(symbol);\n });\n\n // if the path has wildcard, getPropertyInChain should 'look through' chain props\n var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n\n // start value of 'shouldProcess' due to checking below\n shouldProcess = !hasWildcard;\n for (var j = 0; j < details.length; j += 1) {\n var hasRequiredProp = typeof lastNestedPropName === 'string' && details[j].base[lastNestedPropName] !== undefined;\n if (hasWildcard) {\n // if there is a wildcard,\n // at least one (||) of props chain should be present in object\n shouldProcess = hasRequiredProp || shouldProcess;\n } else {\n // otherwise each one (&&) of them should be there\n shouldProcess = hasRequiredProp && shouldProcess;\n }\n }\n };\n for (var i = 0; i < requiredPaths.length; i += 1) {\n _loop();\n }\n return shouldProcess;\n }\n\n /**\n * Prunes properties of 'root' object\n *\n * @param source required, scriptlet properties\n * @param root object which should be pruned or logged\n * @param prunePaths array with string of space-separated properties to remove\n * @param requiredPaths array with string of space-separated properties\n * which must be all present for the pruning to occur\n * @returns pruned root\n */\n var jsonPruner = function jsonPruner(source, root, prunePaths, requiredPaths) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) {\n return root;\n }\n\n // if pruning is needed, we check every input pathToRemove\n // and delete it if root has it\n prunePaths.forEach(function (path) {\n var ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n };\n\n /**\n * Returns the native `RegExp.prototype.test` method if it exists.\n *\n * @returns The native `RegExp.prototype.test` method.\n * @throws If `RegExp.prototype.test` is not a function.\n */\n var getNativeRegexpTest = function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'test');\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === 'function') {\n return nativeRegexTest;\n }\n throw new Error('RegExp.prototype.test is not a function');\n };\n\n /**\n * Modifies original response with the given replacement data.\n *\n * @param origResponse Original response.\n * @param replacement Replacement data for response with possible keys:\n * - `body`: optional, string, default to '{}';\n * - `type`: optional, string, original response type is used if not specified.\n *\n * @returns Modified response.\n */\n var modifyResponse = function modifyResponse(origResponse) {\n var _origResponse$headers;\n var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n body: '{}'\n };\n var headers = {};\n origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) {\n headers[key] = value;\n });\n var modifiedResponse = new Response(replacement.body, {\n status: origResponse.status,\n statusText: origResponse.statusText,\n headers\n });\n\n // Mock response url and type to avoid adblocker detection\n // https://github.com/AdguardTeam/Scriptlets/issues/216\n Object.defineProperties(modifiedResponse, {\n url: {\n value: origResponse.url\n },\n type: {\n value: replacement.type || origResponse.type\n }\n });\n return modifiedResponse;\n };\n\n /**\n * Aggregates fetch and XMLHttpRequest.open arguments\n * to operate on arbitrary request data objects\n */\n\n /**\n * Object which is populated with request data from scriptlet arguments\n */\n\n /**\n * Derivative of ParsedMatchProps with its values being\n * converted to RegExp\n */\n\n /**\n * Fetch and xhr.open options that are valid props\n * to match for (trusted-)prevent-(fetch|xhr) scriptlets\n *\n * This type is being derived from getRequestProps return type\n * as enums would be lost at build time disregarding 'const'\n */\n\n /**\n * Returns array of request props that are supported by fetch/xhr scriptlets.\n * Includes common 'url' and 'method' props and all other fetch-specific props\n *\n * @returns list of request props\n */\n var getRequestProps = function getRequestProps() {\n return ['url', 'method', 'headers', 'body', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal', 'mode'];\n };\n\n /**\n * Collects Request options to object\n *\n * @param request Request instance to collect properties from\n * @returns data object\n */\n var getRequestData = function getRequestData(request) {\n var requestInitOptions = getRequestProps();\n var entries = requestInitOptions.map(function (key) {\n // if request has no such option, value will be undefined\n var value = request[key];\n return [key, value];\n });\n return Object.fromEntries(entries);\n };\n\n /**\n * Collects fetch args to object\n *\n * @param args fetch args\n * @returns data object\n */\n var getFetchData = function getFetchData(args) {\n var fetchPropsObj = {};\n var fetchUrl;\n var fetchInit;\n if (args[0] instanceof Request) {\n // if Request passed to fetch, it will be in array\n var requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0]; // eslint-disable-line prefer-destructuring\n fetchInit = args[1]; // eslint-disable-line prefer-destructuring\n }\n\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n var props = Object.keys(fetchInit);\n props.forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n };\n\n /**\n * Collect xhr.open arguments to object\n *\n * @param method request method\n * @param url request url\n * @param async request async prop\n * @param user request user prop\n * @param password request password prop\n * @returns aggregated request data\n */\n var getXhrData = function getXhrData(method, url, async, user, password) {\n return {\n method,\n url,\n async,\n user,\n password\n };\n };\n\n /**\n * Parse propsToMatch input string into object;\n * used for prevent-fetch and prevent-xhr\n *\n * @param propsToMatchStr string of space-separated request properties to match\n * @returns object where 'key' is prop name and 'value' is prop value\n */\n var parseMatchProps = function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = ' ';\n var PAIRS_MARKER = ':';\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n // Escape multiple colons in prop\n // i.e regex value and/or url with protocol specified, with or without 'url:' match prop\n // https://github.com/AdguardTeam/Scriptlets/issues/216#issuecomment-1178591463\n propsObj.url = prop;\n }\n });\n return propsObj;\n };\n\n /**\n * Validates parsed data values\n *\n * @param data request data\n * @returns if data is valid\n */\n var isValidParsedData = function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n };\n\n /**\n * Converts valid parsed data to data obj for further matching\n *\n * @param data parsed request data\n * @returns data obj ready for matching\n */\n var getMatchPropsData = function getMatchPropsData(data) {\n var matchData = {};\n // Assertion is required, as Object.keys always returns string[]\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n };\n\n /**\n * Sets item to a specified storage, if storage isn't full.\n *\n * @param source scriptlet's configuration\n * @param storage storage instance to set item into\n * @param key storage key\n * @param value staroge value\n */\n var setStorageItem = function setStorageItem(source, storage, key, value) {\n // setItem() may throw an exception if the storage is full.\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n };\n\n /**\n * Removes the key/value pair with the given `key` from the `storage`.\n * If unable to remove, logs the reason to console in debug mode.\n *\n * @param source scriptlet's configuration\n * @param storage storage instance from which item has to be removed\n * @param key storage key\n */\n var removeStorageItem = function removeStorageItem(source, storage, key) {\n try {\n storage.removeItem(key);\n } catch (e) {\n var message = \"Unable to remove storage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n };\n\n /**\n * Gets supported storage item value\n *\n * @param value input item value\n * @returns valid item value if ok OR null if not\n */\n var getLimitedStorageItemValue = function getLimitedStorageItemValue(value) {\n if (typeof value !== 'string') {\n throw new Error('Invalid value');\n }\n var validValue;\n if (value === 'undefined') {\n validValue = undefined;\n } else if (value === 'false') {\n validValue = false;\n } else if (value === 'true') {\n validValue = true;\n } else if (value === 'null') {\n validValue = null;\n } else if (value === 'emptyArr') {\n validValue = '[]';\n } else if (value === 'emptyObj') {\n validValue = '{}';\n } else if (value === '') {\n validValue = '';\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error('Invalid value');\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error('Invalid value');\n }\n } else if (value === 'yes') {\n validValue = 'yes';\n } else if (value === 'no') {\n validValue = 'no';\n } else if (value === '$remove$') {\n validValue = '$remove$';\n } else {\n throw new Error('Invalid value');\n }\n return validValue;\n };\n\n /**\n * Generates function which silents global errors on page generated by scriptlet\n * If error doesn't belong to our error we transfer it to the native onError handler\n *\n * @param rid - unique identifier of scriptlet\n * @returns window.onerror handler\n */\n function createOnErrorHandler(rid) {\n // eslint-disable-next-line consistent-return\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === 'string' && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n\n /**\n * Generate random seven symbols id\n *\n * @returns randomized id\n */\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n\n /**\n * Prevents infinite loops when trapping props that could be used by scriptlet's own helpers\n * Example: window.RegExp, that is used by matchStackTrace > toRegExp\n *\n * https://github.com/AdguardTeam/Scriptlets/issues/251\n * https://github.com/AdguardTeam/Scriptlets/issues/226\n * https://github.com/AdguardTeam/Scriptlets/issues/232\n *\n * @returns descriptor addon\n */\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n // try...catch is required in case there are more than one inline scripts\n // which should be aborted,\n // so after the first successful abortion, `cb(...args);` will throw error,\n // and we should not stop on that and continue to abort other scripts\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n var rid = randomId();\n this.isAbortingSuspended = false;\n // It's necessary to throw error\n // otherwise script will be not aborted\n throw new ReferenceError(rid);\n }\n }\n };\n }\n\n /**\n * Check if the property exists in the base object (recursively)\n *\n * If property doesn't exist in base object,\n * defines this property as 'undefined'\n * and returns base, property name and remaining part of property chain\n *\n * @param base object that owns chain\n * @param chain chain of owner properties\n * @returns chain info object\n */\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf('.');\n if (pos === -1) {\n return {\n base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n\n // https://github.com/AdguardTeam/Scriptlets/issues/128\n if (base === null) {\n // if base is null, return 'null' as base.\n // it's needed for triggering the reason logging while debugging\n return {\n base,\n prop,\n chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n // for empty objects in chain\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase === null) {\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base,\n prop,\n chain\n };\n }\n\n /**\n * Checks if given propsToMatch string matches with given request data\n * This is used by prevent-xhr, prevent-fetch, trusted-replace-xhr-response\n * and trusted-replace-fetch-response scriptlets\n *\n * @param source scriptlet properties\n * @param propsToMatch string of space-separated request properties to match\n * @param requestData object with standard properties of fetch/xhr like url, method etc\n * @returns if request properties match\n */\n var matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === '' || propsToMatch === '*') {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n // prevent only if all props match\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === 'string' && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n };\n\n /**\n * Checks if the stackTrace contains stackRegexp\n * https://github.com/AdguardTeam/Scriptlets/issues/82\n *\n * @param stackMatch - input stack value to match\n * @param stackTrace - script error stack trace\n * @returns if the stackTrace contains stackRegexp\n */\n var matchStackTrace = function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === '') {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split('\\n').slice(2) // get rid of our own functions in the stack trace\n .map(function (line) {\n return line.trim();\n }) // trim the lines\n .join('\\n');\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n };\n\n /**\n * Returns a wrapper, passing the call to 'method' at maximum once per 'delay' milliseconds.\n * Those calls that fall into the \"cooldown\" period, are ignored\n *\n * @param cb callback\n * @param delay - milliseconds\n * @returns throttled callback\n */\n var throttle = function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n // \"savedArgs\" might contains few arguments, so it's necessary to use spread operator\n // https://github.com/AdguardTeam/Scriptlets/issues/284#issuecomment-1419464354\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n };\n\n /**\n * DOM tree changes observer. Used for 'remove-attr' and 'remove-class' scriptlets\n *\n * @param callback function to call on each mutation\n * @param observeAttrs if observer should observe attributes changes\n * @param attrsToObserve list of attributes to observe\n */\n var observeDOMChanges = function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n /**\n * 'delay' in milliseconds for 'throttle' method\n */\n var THROTTLE_DELAY_MS = 20;\n /**\n * Used for remove-class\n */\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n\n /**\n * Callback wrapper to prevent loops\n * when callback tinkers with attributes\n */\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n };\n\n /**\n * Returns the list of added nodes from the list of mutations\n *\n * @param mutations list of mutations\n * @returns list of added nodes\n */\n var getAddedNodes = function getAddedNodes(mutations) {\n var nodes = [];\n for (var i = 0; i < mutations.length; i += 1) {\n var addedNodes = mutations[i].addedNodes;\n for (var j = 0; j < addedNodes.length; j += 1) {\n nodes.push(addedNodes[j]);\n }\n }\n return nodes;\n };\n\n /**\n * Creates and runs a MutationObserver on the document element with optional\n * throttling and disconnect timeout.\n *\n * @param {Function} callback MutationObserver callback\n * @param {object} options MutationObserver options\n * @param timeout Disconnect timeout in ms\n */\n var observeDocumentWithTimeout = function observeDocumentWithTimeout(callback, options) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10000;\n var documentObserver = new MutationObserver(function (mutations, observer) {\n observer.disconnect();\n callback(mutations, observer);\n observer.observe(document.documentElement, options);\n });\n documentObserver.observe(document.documentElement, options);\n if (typeof timeout === 'number') {\n setTimeout(function () {\n return documentObserver.disconnect();\n }, timeout);\n }\n };\n\n /**\n * Behaviour flags string parser\n *\n * @param flags required, 'applying' argument string\n * @returns object with parsed flags\n */\n var parseFlags = function parseFlags(flags) {\n var FLAGS_DIVIDER = ' ';\n var ASAP_FLAG = 'asap';\n var COMPLETE_FLAG = 'complete';\n var STAY_FLAG = 'stay';\n var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.includes(f);\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.includes(flag);\n }\n };\n };\n\n /**\n * Modifies passed keyword value according to its purpose.\n * Returns initial value if it's not a keyword.\n *\n * Supported keywords:\n * - '$now$' - returns current time in ms, e.g 1667915146503\n * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n *\n * @param rawValue keyword\n * @returns parsed value\n */\n var parseKeywordValue = function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = '$now$';\n var CURRENT_DATE_KEYWORD = '$currentDate$';\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n // Set to current time in ms, e.g 1667915146503\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n parsedValue = Date();\n }\n return parsedValue;\n };\n\n /**\n * Makes arbitrary operations on shadow root element,\n * to be passed as callback to hijackAttachShadow\n */\n\n /**\n * Overrides attachShadow method of Element API on a given context\n * to pass retrieved shadowRoots to callback\n *\n * @param context e.g global window object or contentWindow of an iframe\n * @param hostSelector selector to determine if callback should be called on current shadow subtree\n * @param callback callback to call on shadow root\n */\n var hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) {\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || '*')) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n var attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n };\n\n /**\n * Grabs existing nodes and passes them to a given handler.\n *\n * @param selector CSS selector to find nodes by\n * @param handler handler to pass nodes to\n */\n var handleExistingNodes = function handleExistingNodes(selector, handler) {\n var nodeList = document.querySelectorAll(selector);\n var nodes = nodeListToArray(nodeList);\n handler(nodes);\n };\n\n /**\n * Extracts added nodes from mutations and passes them to a given handler.\n *\n * @param mutations mutations to find eligible nodes in\n * @param handler handler to pass eligible nodes to\n */\n var handleMutations = function handleMutations(mutations, handler) {\n var addedNodes = getAddedNodes(mutations);\n handler(addedNodes);\n };\n\n /**\n * Checks if given node's text content should be replaced\n *\n * @param node node to check\n * @param nodeNameMatch regexp or string to match node name\n * @param textContentMatch regexp or string to match node's text content\n * @returns true if node's text content should be replaced\n */\n var isTargetNode = function isTargetNode(node, nodeNameMatch, textContentMatch) {\n var nodeName = node.nodeName,\n textContent = node.textContent;\n var nodeNameLowerCase = nodeName.toLowerCase();\n return textContent !== null && textContent !== '' && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch));\n };\n\n /**\n * Replaces given node's text content with a given replacement.\n *\n * @param source source of the scriptlet\n * @param node node to replace text content in\n * @param pattern pattern to match text content\n * @param replacement replacement for matched text content\n */\n var replaceNodeText = function replaceNodeText(source, node, pattern, replacement) {\n var textContent = node.textContent;\n if (textContent) {\n node.textContent = textContent.replace(pattern, replacement);\n hit(source);\n }\n };\n\n /**\n * Modifies arguments for trusted-replace-node-text and remove-node-text scriptlets\n *\n * @param nodeName string or stringified regexp to match node name\n * @param textMatch string or stringified regexp to match node's text content\n * @param pattern string or stringified regexp to match replace pattern\n * @returns derivative params\n */\n var parseNodeTextParams = function parseNodeTextParams(nodeName, textMatch) {\n var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var REGEXP_START_MARKER = '/';\n var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER));\n var selector = isStringNameMatch ? nodeName : '*';\n var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName);\n var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch);\n var patternMatch;\n if (pattern) {\n patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern);\n }\n return {\n selector,\n nodeNameMatch,\n textContentMatch,\n patternMatch\n };\n };\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-click-element\n *\n * @description\n * Clicks selected elements in a strict sequence, ordered by selectors passed,\n * and waiting for them to render in the DOM first.\n * Deactivates after all elements have been clicked or by 10s timeout.\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('trusted-click-element', selectors[, extraMatch[, delay]])\n * ```\n *\n * - `selectors` — required, string with query selectors delimited by comma\n * - `extraMatch` — optional, extra condition to check on a page; allows to match `cookie` and `localStorage`;\n * can be set as `name:key[=value]` where `value` is optional.\n * If `cookie`/`localStorage` starts with `!` then the element will only be clicked\n * if specified cookie/localStorage item does not exist.\n * Multiple conditions are allowed inside one `extraMatch` but they should be delimited by comma\n * and each of them should match the syntax. Possible `name`s:\n * - `cookie` — test string or regex against cookies on a page\n * - `localStorage` — check if localStorage item is present\n * - `delay` — optional, time in ms to delay scriptlet execution, defaults to instant execution.\n *\n * ### Examples\n *\n * 1. Click single element by selector\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]')\n * ```\n *\n * 1. Delay click execution by 500ms\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '', '500')\n * ```\n *\n * 1. Click multiple elements by selector with a delay\n *\n * \n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"], button[name=\"check\"], input[type=\"submit\"][value=\"akkoord\"]', '', '500')\n * ```\n *\n * 1. Match cookies by keys using regex and string\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'cookie:userConsentCommunity, cookie:/cmpconsent|cmp/')\n * ```\n *\n * 1. Match by cookie key=value pairs using regex and string\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'cookie:userConsentCommunity=true, cookie:/cmpconsent|cmp/=/[a-z]{1,5}/')\n * ```\n *\n * 1. Match by localStorage item 'promo' key\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'localStorage:promo')\n * ```\n *\n * 1. Click multiple elements with delay and matching by both cookie string and localStorage item\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"], input[type=\"submit\"][value=\"akkoord\"]', 'cookie:cmpconsent, localStorage:promo', '250')\n * ```\n *\n * \n *\n * 1. Click element only if cookie with name `cmpconsent` does not exist\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '!cookie:cmpconsent')\n * ```\n *\n * 1. Click element only if specified cookie string and localStorage item does not exist\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '!cookie:consent, !localStorage:promo')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n function trustedClickElement$1(source, selectors) {\n var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n var OBSERVER_TIMEOUT_MS = 10000;\n var THROTTLE_DELAY_MS = 20;\n var STATIC_CLICK_DELAY_MS = 150;\n var COOKIE_MATCH_MARKER = 'cookie:';\n var LOCAL_STORAGE_MATCH_MARKER = 'localStorage:';\n var SELECTORS_DELIMITER = ',';\n var COOKIE_STRING_DELIMITER = ';';\n // Regex to split match pairs by commas, avoiding the ones included in regexes\n var EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n var sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n var parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n // eslint-disable-next-line max-len\n var message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n var canClick = !parsedDelay;\n var cookieMatches = [];\n var localStorageMatches = [];\n var isInvertedMatchCookie = false;\n var isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n // Get all match marker:value pairs from argument\n var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n\n // Filter match pairs by marker\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.includes(COOKIE_MATCH_MARKER)) {\n var _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, '');\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) {\n var _parseMatchArg2 = parseMatchArg(matchStr),\n _isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n _matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = _isInvertedMatch;\n var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, '');\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n var parsedCookies = parseCookieString(document.cookie);\n var cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n // Avoid getting /.?/ result from toRegExp on undefined\n // as cookie may be set without value,\n // on which cookie parsing will return cookieKey:undefined pair\n var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n var keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n var keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n\n // Key matching is enough if cookie value match is not specified\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n var shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n var localStorageMatched = localStorageMatches.every(function (str) {\n var itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === '';\n });\n var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!_shouldRun) {\n return;\n }\n }\n\n /**\n * Create selectors array and swap selectors to null on finding it's element\n *\n * Selectors / nulls should not be (re)moved from array to:\n * - keep track of selectors order\n * - always know on what index corresponding element should be put\n * - prevent selectors from being queried multiple times\n */\n var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n var createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n var elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n\n /**\n * Go through elementsSequence from left to right, clicking on found elements\n *\n * Element should not be clicked if it is already clicked,\n * or a previous element is not found or clicked yet\n */\n var clickElementsBySequence = async function clickElementsBySequence() {\n for (var i = 0; i < elementsSequence.length; i += 1) {\n var elementObj = elementsSequence[i];\n // Add a delay between clicks to every element except the first one\n // https://github.com/AdguardTeam/Scriptlets/issues/284\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n // Stop clicking if that pos element is not found yet\n if (!elementObj.element) {\n break;\n }\n // Skip already clicked elements\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n var allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n // At this stage observer is already disconnected\n hit(source);\n }\n };\n var handleElement = function handleElement(element, i) {\n var elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n\n /**\n * Query all selectors from queue on each mutation\n * Each selector is swapped to null in selectorsSequence on founding corresponding element\n *\n * We start looking for elements before possible delay is over, to avoid cases\n * when delay is getting off after the last mutation took place.\n *\n */\n var findElements = function findElements(mutations, observer) {\n var fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n var element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n\n // selectorsSequence should be modified after the loop to not break loop indexation\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.includes(selector) ? null : selector;\n });\n\n // Disconnect observer after finding all elements\n var allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n // Click previously collected elements\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n trustedClickElement$1.names = ['trusted-click-element'\n // trusted scriptlets support no aliases\n ];\n\n trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage, parseMatchArg];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-property-read\n *\n * @description\n * Aborts a script when it attempts to **read** the specified property.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-readjs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-read.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('abort-on-property-read', property)\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to access `window.alert`\n * example.org#%#//scriptlet('abort-on-property-read', 'alert')\n *\n * ! Aborts script when it tries to access `navigator.language`\n * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function abortOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyRead$1.names = ['abort-on-property-read',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read'];\n abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-property-write\n *\n * @description\n * Aborts a script when it attempts to **write** the specified property.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-writejs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-write.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('abort-on-property-write', property)\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed).\n * The property must be attached to `window`\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to set `window.adblock` value\n * example.org#%#//scriptlet('abort-on-property-write', 'adblock')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function abortOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyWrite$1.names = ['abort-on-property-write',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write'];\n abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-setTimeout\n *\n * @description\n * Prevents a `setTimeout` call if:\n *\n * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`;\n * otherwise mismatched calls should be defused.\n * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-settimeout-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-setTimeout'[, matchCallback[, matchDelay]])\n * ```\n *\n * > Call with no arguments will log all setTimeout calls (`log-setTimeout` superseding),\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * - `matchCallback` — optional, string or regular expression;\n * invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * If not set, prevents all `setTimeout` calls due to specified `matchDelay`.\n * - `matchDelay` — optional, must be an integer.\n * If starts with `!`, scriptlet will not match the delay but all other will be defused.\n * If do not start with `!`, the delay passed to the `setTimeout` call will be matched.\n * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`.\n *\n * > If `prevent-setTimeout` log looks like `setTimeout(undefined, 1000)`,\n * > it means that no callback was passed to setTimeout() and that's not scriptlet issue\n * > and obviously it can not be matched by `matchCallback`.\n *\n * ### Examples\n *\n * 1. Prevents `setTimeout` calls if the callback matches `/\\.test/` regardless of the delay\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 100);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback does not contain `value`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', '!value')\n * ```\n *\n * For instance, only the first of the following calls will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"test -- prevented\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setTimeout(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback contains `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', 'value', '!300')\n * ```\n *\n * For instance, only the first of the following calls will not be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value 1 -- executed\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value 2 -- prevented\";\n * }, 400);\n * setTimeout(function () {\n * window.test = \"value 3 -- prevented\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback does not contain `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', '!value', '!300')\n * ```\n *\n * For instance, only the second of the following calls will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"test -- executed\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"test -- prevented\";\n * }, 400);\n * setTimeout(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setTimeout(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback contains `value` and delay is a decimal\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', 'value', '300')\n * ```\n *\n * For instance, the following calls will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 300 + Math.random());\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventSetTimeout$1(source, matchCallback, matchDelay) {\n // logs setTimeouts to console if no arguments have been specified\n var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n preventSetTimeout$1.names = ['prevent-setTimeout',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-setTimeout-if.js',\n // new implementation of setTimeout-defuser.js\n 'ubo-no-setTimeout-if.js', 'nostif.js',\n // new short name of no-setTimeout-if\n 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif',\n // old scriptlet names which should be supported as well.\n // should be removed eventually.\n // do not remove until other filter lists maintainers use them\n 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std'];\n preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n // following helpers should be injected as helpers above use them\n parseMatchArg, parseDelayArg, toRegExp, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-setInterval\n *\n * @description\n * Prevents a `setInterval` call if:\n *\n * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`;\n * otherwise mismatched calls should be defused.\n * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-setinterval-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-setInterval'[, matchCallback[, matchDelay]])\n * ```\n *\n * > Call with no arguments will log all setInterval calls (`log-setInterval` superseding),\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * - `matchCallback` — optional, string or regular expression;\n * invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * If not set, prevents all `setInterval` calls due to specified `matchDelay`.\n * - `matchDelay` — optional, must be an integer.\n * If starts with `!`, scriptlet will not match the delay but all other will be defused.\n * If do not start with `!`, the delay passed to the `setInterval` call will be matched.\n * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`.\n *\n * > If `prevent-setInterval` log looks like `setInterval(undefined, 1000)`,\n * > it means that no callback was passed to setInterval() and that's not scriptlet issue\n * > and obviously it can not be matched by `matchCallback`.\n *\n * ### Examples\n *\n * 1. Prevents `setInterval` calls if the callback matches `/\\.test/` regardless of the delay\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"value\";\n * }, 100);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback does not contain `value`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', '!value')\n * ```\n *\n * For instance, only the first of the following calls will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"test -- prevented\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setInterval(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback contains `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', 'value', '!300')\n * ```\n *\n * For instance, only the first of the following calls will not be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"value 1 -- executed\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value 2 -- prevented\";\n * }, 400);\n * setInterval(function () {\n * window.test = \"value 3 -- prevented\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback does not contain `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', '!value', '!300')\n * ```\n *\n * For instance, only the second of the following calls will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"test -- executed\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"test -- prevented\";\n * }, 400);\n * setInterval(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setInterval(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback contains `value` and delay is a decimal number\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', 'value', '300')\n * ```\n *\n * For instance, the following calls will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"value\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value\";\n * }, 300 + Math.random());\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventSetInterval$1(source, matchCallback, matchDelay) {\n // logs setIntervals to console if no arguments have been specified\n var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n preventSetInterval$1.names = ['prevent-setInterval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-setInterval-if.js',\n // new implementation of setInterval-defuser.js\n 'ubo-no-setInterval-if.js', 'setInterval-defuser.js',\n // old name should be supported as well\n 'ubo-setInterval-defuser.js', 'nosiif.js',\n // new short name of no-setInterval-if\n 'ubo-nosiif.js', 'sid.js',\n // old short scriptlet name\n 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid'];\n preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n // following helpers should be injected as helpers above use them\n toRegExp, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-window-open\n *\n * @description\n * Prevents `window.open` calls when URL either matches or not matches the specified string/regexp.\n * Using it without parameters prevents all `window.open` calls.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#windowopen-defuserjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-window-open'[, match[, delay[, replacement]]])\n * ```\n *\n * - `match` — optional, string or regular expression.\n * If not set or regular expression is invalid, all window.open calls will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * - `delay` — optional, number of seconds. If not set, scriptlet will return `null`,\n * otherwise valid sham window object as injected `iframe` will be returned\n * for accessing its methods (blur(), focus() etc.) and will be removed after the delay.\n * - `replacement` — optional, string; one of the predefined constants:\n * - `obj` — for returning an object instead of default iframe;\n * for cases when the page requires a valid `window` instance to be returned\n * - `log` — for logging window.open calls; not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Prevent all `window.open` calls\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open')\n * ```\n *\n * 1. Prevent `window.open` for all URLs containing `example`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', 'example')\n * ```\n *\n * 1. Prevent `window.open` for all URLs matching RegExp `/example\\./`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', '/example\\./')\n * ```\n *\n * 1. Prevent `window.open` for all URLs **NOT** containing `example`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', '!example')\n * ```\n *\n * ### Old syntax of prevent-window-open parameters\n *\n * - `match` — optional, defaults to \"matching\", any positive number or nothing for \"matching\",\n * 0 or empty string for \"not matching\"\n * - `search` — optional, string or regexp for matching the URL passed to `window.open` call;\n * defaults to search all `window.open` call\n * - `replacement` — optional, string to return prop value or property instead of window.open;\n * defaults to return noopFunc.\n *\n * ### Examples of old syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', '1', '/example\\./')\n * example.org#%#//scriptlet('prevent-window-open', '0', 'example')\n * example.org#%#//scriptlet('prevent-window-open', '', '', 'trueFunc')\n * example.org#%#//scriptlet('prevent-window-open', '1', '', '{propName=noopFunc}')\n * ```\n *\n * > For better compatibility with uBO, old syntax is not recommended to use.\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventWindowOpen$1(source) {\n var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*';\n var delay = arguments.length > 2 ? arguments[2] : undefined;\n var replacement = arguments.length > 3 ? arguments[3] : undefined;\n // default match value is needed for preventing all window.open calls\n // if scriptlet runs without args\n var nativeOpen = window.open;\n var isNewSyntax = match !== '0' && match !== '1';\n var oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n // 'delay' was 'search' prop for matching in old syntax\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n var searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n var newOpenWrapper = function newOpenWrapper(url) {\n var shouldLog = replacement && replacement.includes('log');\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n var argsStr = args && args.length > 0 ? \", \".concat(args.join(', ')) : '';\n var message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n var shouldPrevent = false;\n if (match === '*') {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n var parsedDelay = parseInt(delay, 10);\n var result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n var decoyArgs = {\n replacement,\n url,\n delay: parsedDelay\n };\n var decoy = createDecoy(decoyArgs);\n var popup = decoy.contentWindow;\n if (typeof popup === 'object' && popup !== null) {\n Object.defineProperty(popup, 'closed', {\n value: false\n });\n Object.defineProperty(popup, 'opener', {\n value: window\n });\n Object.defineProperty(popup, 'frameElement', {\n value: null\n });\n } else {\n var nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, 'contentWindow', {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n\n // Protect window.open from native code check\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n preventWindowOpen$1.names = ['prevent-window-open',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif'];\n preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, substringBefore, substringAfter$1];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-current-inline-script\n *\n * @description\n * Aborts an inline script when it attempts to **read** or **write to** the specified property\n * AND when the contents of the `\n * ```\n *\n * 1. Aborts inline scripts which are trying to access `window.alert` and match regexp `/Hello.+world/`\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-current-inline-script', 'alert', '/Hello.+world/')\n * ```\n *\n * For instance, the following scripts will be aborted:\n *\n * ```html\n * \n * ```\n *\n * ```html\n * \n * ```\n *\n * And this script will not be aborted:\n *\n * ```html\n * \n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function abortCurrentInlineScript$1(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var SRC_DATA_MARKER = 'data:text/javascript;base64,';\n var getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var _scriptEl$src;\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n\n // We are using Node.prototype.textContent property descriptor\n // to get the real script content\n // even when document.currentScript.textContent is replaced.\n // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {} // eslint-disable-line no-empty\n\n // https://github.com/AdguardTeam/Scriptlets/issues/130\n if (content.length === 0 && typeof scriptEl.src !== 'undefined' && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) {\n var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // The scriptlet might be executed before the chain property has been created\n // (for instance, document.body before the HTML body was loaded).\n // In this case we're checking whether the base element exists or not\n // and if not, we simply exit without overriding anything.\n // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092\n if (base instanceof Object === false && base === null) {\n var props = property.split('.');\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortCurrentInlineScript$1.names = ['abort-current-inline-script',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js',\n // \"ubo\"-aliases with no \"js\"-ending\n 'ubo-abort-current-script', 'ubo-acs',\n // obsolete but supported aliases\n 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script'];\n abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-constant\n *\n * @description\n * Creates a constant property and assigns it one of the values from the predefined list.\n *\n * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type.\n *\n * > If empty object is present in chain it will be trapped until chain leftovers appear.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#set-constantjs-\n *\n * Related ABP snippet:\n * https://github.com/adblockplus/adblockpluscore/blob/adblockpluschrome-3.9.4/lib/content/snippets.js#L1361\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-constant', property, value[, stack])\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`.\n * - `value` — required. Possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `noopFunc` — function with empty body\n * - `noopCallbackFunc` — function returning noopFunc\n * - `trueFunc` — function returning true\n * - `falseFunc` — function returning false\n * - `throwFunc` — function throwing an error\n * - `noopPromiseResolve` — function returning Promise object that is resolved with an empty response\n * - `noopPromiseReject` — function returning Promise.reject()\n * - `''` — empty string\n * - `-1` — number value `-1`\n * - `yes`\n * - `no`\n * - `stack` — string or regular expression that must match the current function call stack trace,\n * defaults to matching every call; if regular expression is invalid, it will be skipped\n * - `valueWrapper` – optional, string to modify a value to be set. Possible wrappers:\n * - `asFunction` – function returning value\n * - `asCallback` – function returning callback, that would return value\n * - `asResolved` – Promise that would resolve with value\n * - `asRejected` – Promise that would reject with value\n *\n * ### Examples\n *\n * ```adblock\n * ! Any access to `window.first` will return `false`\n * example.org#%#//scriptlet('set-constant', 'first', 'false')\n *\n * ✔ window.first === false\n * ```\n *\n * ```adblock\n * ! Any call to `window.second()` will return `true`\n * example.org#%#//scriptlet('set-constant', 'second', 'trueFunc')\n *\n * ✔ window.second() === true\n * ✔ window.second.toString() === \"function trueFunc() {return true;}\"\n * ```\n *\n * ```adblock\n * ! Any call to `document.third()` will return `true` if the method is related to `checking.js`\n * example.org#%#//scriptlet('set-constant', 'document.third', 'trueFunc', 'checking.js')\n *\n * ✔ document.third() === true // if the condition described above is met\n * ```\n *\n * ```adblock\n * ! Any call to `document.fourth()` will return `yes`\n * example.org#%#//scriptlet('set-constant', 'document.fourth', 'yes', '', 'asFunction')\n *\n * ✔ document.fourth() === 'yes'\n * ```\n *\n * ```adblock\n * ! Any call to `document.fifth()` will return `yes`\n * example.org#%#//scriptlet('set-constant', 'document.fifth', '42', '', 'asRejected')\n *\n * ✔ document.fifth.catch((reason) => reason === 42) // promise rejects with specified number\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function setConstant$1(source, property, value) {\n var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';\n var uboAliases = ['set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set'];\n\n /**\n * UBO set-constant analog has it's own args sequence:\n * (property, value, defer | wrapper)\n * 'defer' – a stringified number, which defines execution time, or\n * 'wrapper' - string which defines value wrapper name\n *\n * joysound.com##+js(set, document.body.oncopy, null, 3)\n * kompetent.de##+js(set, Object.keys, 42, asFunction)\n */\n if (uboAliases.includes(source.name)) {\n /**\n * Check that third argument was intended as 'valueWrapper' argument,\n * by excluding 'defer' single digits case, and move it to 'valueWrapper'\n */\n if (stack.length !== 1 && !getNumberFromString(stack)) {\n valueWrapper = stack;\n }\n /**\n * ubo doesn't support 'stack', while adg doesn't support 'defer'\n * that goes in the same spot, so we discard it\n */\n stack = undefined;\n }\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var emptyArr = noopArray();\n var emptyObj = noopObject();\n var constantValue;\n if (value === 'undefined') {\n constantValue = undefined;\n } else if (value === 'false') {\n constantValue = false;\n } else if (value === 'true') {\n constantValue = true;\n } else if (value === 'null') {\n constantValue = null;\n } else if (value === 'emptyArr') {\n constantValue = emptyArr;\n } else if (value === 'emptyObj') {\n constantValue = emptyObj;\n } else if (value === 'noopFunc') {\n constantValue = noopFunc;\n } else if (value === 'noopCallbackFunc') {\n constantValue = noopCallbackFunc;\n } else if (value === 'trueFunc') {\n constantValue = trueFunc;\n } else if (value === 'falseFunc') {\n constantValue = falseFunc;\n } else if (value === 'throwFunc') {\n constantValue = throwFunc;\n } else if (value === 'noopPromiseResolve') {\n constantValue = noopPromiseResolve;\n } else if (value === 'noopPromiseReject') {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === '-1') {\n constantValue = -1;\n } else if (value === '') {\n constantValue = '';\n } else if (value === 'yes') {\n constantValue = 'yes';\n } else if (value === 'no') {\n constantValue = 'no';\n } else {\n return;\n }\n var valueWrapperNames = ['asFunction', 'asCallback', 'asResolved', 'asRejected'];\n if (valueWrapperNames.includes(valueWrapper)) {\n var valueWrappersMap = {\n asFunction(v) {\n return function () {\n return v;\n };\n },\n asCallback(v) {\n return function () {\n return function () {\n return v;\n };\n };\n },\n asResolved(v) {\n return Promise.resolve(v);\n },\n asRejected(v) {\n return Promise.reject(v);\n }\n };\n constantValue = valueWrappersMap[valueWrapper](constantValue);\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n\n /**\n * Safely sets property on a given object\n *\n * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} base arbitrary reachable object\n * @param {string} prop property name\n * @param {boolean} configurable if set property should be configurable\n * @param {object} handler custom property descriptor object\n * @returns {boolean} true if prop was trapped successfully\n */\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n // This is required to prevent scriptlets overwrite each over\n if (origDescriptor instanceof Object) {\n // This check is required to avoid defining non-configurable props\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n\n /**\n * Traverses given chain to set constant value to its end prop\n * Chains that yet include non-object values (e.g null) are valid and will be\n * traversed when appropriate chain member is set by an external script\n *\n * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} owner object that owns chain\n * @param {string} property chain of owner properties\n */\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // Handler method init is used to keep track of factual value\n // and apply mustCancel() check only on end prop\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n // Prevent breakage due to loop assignments like win.obj = win.obj\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n\n // End prop case\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n\n // Null prop in chain\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n\n // Empty object prop in chain\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n\n // Defined prop in chain\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n\n // Undefined prop in chain\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n setConstant$1.names = ['set-constant',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read'];\n setConstant$1.injections = [hit, logMessage, getNumberFromString, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, matchStackTrace, nativeIsNaN, isEmptyObject,\n // following helpers should be imported and injected\n // because they are used by helpers above\n shouldAbortInlineOrInjectedScript, getNativeRegexpTest, setPropertyAccess, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-cookie\n *\n * @description\n * Removes current page cookies by passed string matching with name. For current domain and subdomains.\n * Runs on load and before unload.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#cookie-removerjs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/cookie-remover.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-cookie'[, match])\n * ```\n *\n * - `match` — optional, string or regex matching the cookie name.\n * If not specified all accessible cookies will be removed.\n *\n * ### Examples\n *\n * 1. Removes all cookies\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-cookie')\n * ```\n *\n * 1. Removes cookies which name contains `example` string\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-cookie', 'example')\n * ```\n *\n * For instance this cookie will be removed:\n *\n * ```javascript\n * document.cookie = '__example=randomValue';\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function removeCookie$1(source, match) {\n var matchRegexp = toRegExp(match);\n var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n var cookieSpec = \"\".concat(cookieName, \"=\");\n var domain1 = \"; domain=\".concat(hostName);\n var domain2 = \"; domain=.\".concat(hostName);\n var path = '; path=/';\n var expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n var rmCookie = function rmCookie() {\n document.cookie.split(';').forEach(function (cookieStr) {\n var pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n var hostParts = document.location.hostname.split('.');\n for (var i = 0; i <= hostParts.length - 1; i += 1) {\n var hostName = hostParts.slice(i).join('.');\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener('beforeunload', rmCookie);\n }\n removeCookie$1.names = ['remove-cookie',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover'];\n removeCookie$1.injections = [toRegExp, hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-addEventListener\n *\n * @description\n * Prevents adding event listeners for the specified events and callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-defuserjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-addEventListener'[, typeSearch[, listenerSearch]])\n * ```\n *\n * - `typeSearch` — optional, string or regular expression matching the type (event name);\n * defaults to match all types; invalid regular expression will cause exit and rule will not work\n * - `listenerSearch` — optional, string or regular expression matching the listener function body;\n * defaults to match all listeners; invalid regular expression will cause exit and rule will not work\n *\n * ### Examples\n *\n * 1. Prevent all `click` listeners\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-addEventListener', 'click')\n * ```\n *\n * 1. Prevent 'click' listeners with the callback body containing `searchString`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-addEventListener', 'click', 'searchString')\n * ```\n *\n * For instance, this listener will not be called:\n *\n * ```javascript\n * el.addEventListener('click', () => {\n * window.test = 'searchString';\n * });\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventAddEventListener$1(source, typeSearch, listenerSearch) {\n var typeSearchRegexp = toRegExp(typeSearch);\n var listenerSearchRegexp = toRegExp(listenerSearch);\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n var shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n\n // Avoid illegal invocations due to lost context\n // https://github.com/AdguardTeam/Scriptlets/issues/271\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/215\n // https://github.com/AdguardTeam/Scriptlets/issues/143\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n preventAddEventListener$1.names = ['prevent-addEventListener',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld'];\n preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString];\n\n /* eslint-disable consistent-return, no-eval */\n\n /**\n * @scriptlet prevent-bab\n *\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#bab-defuserjs-\n *\n * It also can be used as `$redirect` sometimes.\n * See [redirect description](../wiki/about-redirects.md#prevent-bab).\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-bab')\n * ```\n *\n * @added v1.0.4.\n */\n function preventBab$2(source) {\n var nativeSetTimeout = window.setTimeout;\n var babRegex = /\\.bab_elementid.$/;\n var timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== 'string' || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n var signatures = [['blockadblock'], ['babasbm'], [/getItem\\('babn'\\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']];\n var check = function check(str) {\n if (typeof str !== 'string') {\n return false;\n }\n for (var i = 0; i < signatures.length; i += 1) {\n var tokens = signatures[i];\n var match = 0;\n for (var j = 0; j < tokens.length; j += 1) {\n var token = tokens[j];\n var found = token instanceof RegExp ? token.test(str) : str.includes(token);\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= 0.8) {\n return true;\n }\n }\n return false;\n };\n var nativeEval = window.eval;\n var evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n var bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty('visibility');\n }\n var el = document.getElementById('babasbmsgx');\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n preventBab$2.names = ['prevent-bab'\n // there is no aliases for this scriptlet\n ];\n\n preventBab$2.injections = [hit];\n\n /* eslint-disable no-unused-vars, no-extra-bind, func-names */\n\n /* eslint-disable max-len */\n /**\n * @scriptlet nowebrtc\n *\n * @description\n * Disables WebRTC by overriding `RTCPeerConnection`.\n * The overridden function will log every attempt to create a new connection.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nowebrtcjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('nowebrtc')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function nowebrtc$1(source) {\n var propertyName = '';\n if (window.RTCPeerConnection) {\n propertyName = 'RTCPeerConnection';\n } else if (window.webkitRTCPeerConnection) {\n propertyName = 'webkitRTCPeerConnection';\n }\n if (propertyName === '') {\n return;\n }\n var rtcReplacement = function rtcReplacement(config) {\n // eslint-disable-next-line max-len\n var message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n var rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n nowebrtc$1.names = ['nowebrtc',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc'];\n nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString];\n\n /**\n * @scriptlet log-addEventListener\n *\n * @description\n * Logs all addEventListener calls to the console.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-loggerjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('log-addEventListener')\n * ```\n *\n * @added v1.0.4.\n */\n function logAddEventListener$1(source) {\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n var message = \"addEventListener(\\\"\".concat(type, \"\\\", \").concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n } else {\n // logging while debugging\n var _message = \"Invalid event type or listener passed to addEventListener:\\n type: \".concat(convertTypeToString(type), \"\\n listener: \").concat(convertTypeToString(listener));\n logMessage(source, _message, true);\n }\n\n // Avoid illegal invocations due to lost context\n // https://github.com/AdguardTeam/Scriptlets/issues/271\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/215\n // https://github.com/AdguardTeam/Scriptlets/issues/143\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n logAddEventListener$1.names = ['log-addEventListener',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell'];\n logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject];\n\n /* eslint-disable no-eval */\n\n /**\n * @scriptlet log-eval\n *\n * @description\n * Logs all `eval()` or `new Function()` calls to the console.\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('log-eval')\n * ```\n *\n * @added v1.0.4.\n */\n function logEval$1(source) {\n // wrap eval function\n var nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, \"eval(\\\"\".concat(str, \"\\\")\"), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n\n // wrap new Function\n var nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(', '), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n logEval$1.names = ['log-eval'];\n logEval$1.injections = [hit, logMessage];\n\n /**\n * @scriptlet log\n *\n * @description\n * A simple scriptlet which only purpose is to print arguments to console.\n * This scriptlet can be helpful for debugging and troubleshooting other scriptlets.\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('log', 'arg1', 'arg2')\n * ```\n *\n * @added v1.0.4.\n */\n function log$1() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args); // eslint-disable-line no-console\n }\n\n log$1.names = ['log'];\n\n /* eslint-disable no-eval, no-extra-bind */\n\n /**\n * @scriptlet noeval\n *\n * @description\n * Prevents page to use eval.\n * Notifies about attempts in the console\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#noevaljs-\n *\n * It also can be used as `$redirect` rules sometimes.\n * See [redirect description](../wiki/about-redirects.md#noeval).\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('noeval')\n * ```\n *\n * @added v1.0.4.\n */\n function noeval$1(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n noeval$1.names = ['noeval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval'];\n noeval$1.injections = [hit, logMessage];\n\n /* eslint-disable no-eval, no-extra-bind, func-names */\n\n\n /**\n * @scriptlet prevent-eval-if\n *\n * @description\n * Prevents page to use eval matching payload.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#noeval-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-eval-if'[, search])\n * ```\n *\n * - `search` — optional, string or regular expression matching the stringified eval payload;\n * defaults to match all stringified eval payloads;\n * invalid regular expression will cause exit and rule will not work\n *\n * ### Examples\n *\n * ```adblock\n * ! Prevents eval if it matches 'test'\n * example.org#%#//scriptlet('prevent-eval-if', 'test')\n * ```\n *\n * @added v1.0.4.\n */\n function preventEvalIf$1(source, search) {\n var searchRegexp = toRegExp(search);\n var nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n preventEvalIf$1.names = ['prevent-eval-if',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if'];\n preventEvalIf$1.injections = [toRegExp, hit];\n\n /* eslint-disable func-names, no-multi-assign */\n\n /**\n * @scriptlet prevent-fab-3.2.0\n *\n * @description\n * Prevents execution of the FAB script v3.2.0.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#fuckadblockjs-320-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fab-3.2.0')\n * ```\n *\n * @added v1.0.4.\n */\n function preventFab$1(source) {\n hit(source);\n\n // redefines Fab function for adblock detection\n var Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n var fab = new Fab();\n var getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n var getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n\n // redefined Fab data properties which if 'FuckAdBlock' variable exists\n if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) {\n window.FuckAdBlock = Fab;\n } else {\n // or redefined Fab accessor properties\n Object.defineProperty(window, 'FuckAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'BlockAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'SniffAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, 'fuckAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, 'blockAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, 'sniffAdBlock', getsetfab);\n }\n }\n preventFab$1.names = ['prevent-fab-3.2.0',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab'];\n preventFab$1.injections = [hit, noopFunc, noopThis];\n\n /* eslint-disable func-names, no-multi-assign */\n\n /**\n * @scriptlet set-popads-dummy\n *\n * @description\n * Sets static properties PopAds and popns.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#popads-dummyjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('set-popads-dummy')\n * ```\n *\n * @added v1.0.4.\n */\n function setPopadsDummy$1(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n setPopadsDummy$1.names = ['set-popads-dummy',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy'];\n setPopadsDummy$1.injections = [hit];\n\n /**\n * @scriptlet prevent-popads-net\n *\n * @description\n * Aborts on property write (PopAds, popns), throws reference error with random id.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#popadsnetjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-popads-net')\n * ```\n *\n * @added v1.0.4.\n */\n function preventPopadsNet$1(source) {\n var rid = randomId();\n var throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n preventPopadsNet$1.names = ['prevent-popads-net',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net'];\n preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit];\n\n /* eslint-disable func-names */\n\n /**\n * @scriptlet prevent-adfly\n *\n * @description\n * Prevents anti-adblock scripts on adfly short links.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#adfly-defuserjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-adfly')\n * ```\n *\n * @added v1.0.4.\n */\n function preventAdfly$1(source) {\n var isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n var handler = function handler(encodedURL) {\n var evenChars = '';\n var oddChars = '';\n for (var i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n var data = (evenChars + oddChars).split('');\n for (var _i = 0; _i < data.length; _i += 1) {\n if (isDigit(data[_i])) {\n for (var ii = _i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n // eslint-disable-next-line no-bitwise\n var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[_i] = temp.toString();\n }\n _i = ii;\n break;\n }\n }\n }\n }\n data = data.join('');\n var decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n var val;\n // Do not apply handler more than one time\n var applyHandler = true;\n var result = setPropertyAccess(window, 'ysmm', {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === 'string') {\n handler(value);\n }\n } catch (err) {} // eslint-disable-line no-empty\n }\n\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, 'Failed to set up prevent-adfly scriptlet');\n }\n }\n preventAdfly$1.names = ['prevent-adfly',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser'];\n preventAdfly$1.injections = [setPropertyAccess, hit, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-on-property-read\n *\n * @description\n * This scriptlet is basically the same as [abort-on-property-read](#abort-on-property-read),\n * but instead of aborting it starts the debugger.\n *\n * > It is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * ```adblock\n * ! Debug script if it tries to access `window.alert`\n * example.org#%#//scriptlet('debug-on-property-read', 'alert')\n *\n * ! or `window.open`\n * example.org#%#//scriptlet('debug-on-property-read', 'open')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function debugOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n };\n\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyRead$1.names = ['debug-on-property-read'];\n debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-on-property-write\n *\n * @description\n * This scriptlet is basically the same as [abort-on-property-write](#abort-on-property-write),\n * but instead of aborting it starts the debugger.\n *\n * > It is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to write in property `window.test`\n * example.org#%#//scriptlet('debug-on-property-write', 'test')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function debugOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n };\n\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyWrite$1.names = ['debug-on-property-write'];\n debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-current-inline-script\n *\n * @description\n * This scriptlet is basically the same as [abort-current-inline-script](#abort-current-inline-script),\n * but instead of aborting it starts the debugger.\n *\n * > It is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to access `window.alert`\n * example.org#%#//scriptlet('debug-current-inline-script', 'alert')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function debugCurrentInlineScript$1(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n\n // We are using Node.prototype.textContent property descriptor\n // to get the real script content\n // even when document.currentScript.textContent is replaced.\n // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {} // eslint-disable-line no-empty\n\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n }\n };\n\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // The scriptlet might be executed before the chain property has been created\n // (for instance, document.body before the HTML body was loaded).\n // In this case we're checking whether the base element exists or not\n // and if not, we simply exit without overriding anything.\n // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092\n if (base instanceof Object === false && base === null) {\n var props = property.split('.');\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugCurrentInlineScript$1.names = ['debug-current-inline-script'];\n debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-attr\n *\n * @description\n * Removes the specified attributes from DOM nodes. This scriptlet runs once when the page loads\n * and after that periodically in order to DOM tree changes by default,\n * or as specified by applying argument.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-attrjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-attr', attrs[, selector, applying])\n * ```\n *\n * - `attrs` — required, attribute or list of attributes joined by '|'\n * - `selector` — optional, CSS selector, specifies DOM nodes from which the attributes will be removed\n * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply,\n * defaults to 'asap stay'; possible flags:\n * - `asap` — runs as fast as possible **once**\n * - `complete` — runs **once** after the whole page has been loaded\n * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes\n *\n * ### Examples\n *\n * 1. Removes by attribute\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-attr', 'example|test')\n * ```\n *\n * ```html\n * \n *
Some text
\n *\n * \n *
Some text
\n * ```\n *\n * 1. Removes with specified selector\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-attr', 'example', 'div[class=\"inner\"]')\n * ```\n *\n * ```html\n * \n *
\n *
Some text
\n *
\n *\n * \n *
\n *
Some text
\n *
\n * ```\n *\n * 1. Using flags\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function removeAttr$1(source, attrs, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join('],['), \"]\");\n }\n var rmattr = function rmattr() {\n var nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n var removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var flags = parseFlags(applying);\n var run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n // 'true' for observing attributes\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n // https://github.com/AdguardTeam/Scriptlets/issues/245\n // Call rmattr on DOM content loaded\n // to ensure that target node is present on the page\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n // Only call rmattr for single 'stay' flag\n if (!applying.includes(' ')) {\n rmattr();\n }\n // 'true' for observing attributes\n observeDOMChanges(rmattr, true);\n }\n }\n removeAttr$1.names = ['remove-attr',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra'];\n removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-attr\n *\n * @description\n * Sets the specified attribute on the specified elements. This scriptlet runs once when the page loads\n * and after that and after that on DOM tree changes.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-attr', selector, attr[, value])\n * ```\n *\n * - `selector` — required, CSS selector, specifies DOM nodes to set attributes on\n * - `attr` — required, attribute to be set\n * - `value` — the value to assign to the attribute, defaults to ''. Possible values:\n * - `''` — empty string\n * - positive decimal integer `<= 32767`\n * - `true` / `false` in any case variation\n *\n * ### Examples\n *\n * 1. Set attribute by selector\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', '0')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n *\n * 1. Set attribute without value\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n *\n * 1. Set attribute value to `TRUE`\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'TRUE')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n *\n * 1. Set attribute value to `fAlse`\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'fAlse')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function setAttr$1(source, selector, attr) {\n var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n if (!selector || !attr) {\n return;\n }\n var allowedValues = ['true', 'false'];\n\n // Drop strings that cant be parsed into number, negative numbers and numbers below 32767\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n var setAttr = function setAttr() {\n var nodes = [].slice.call(document.querySelectorAll(selector));\n var set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n setAttr$1.names = ['set-attr'];\n setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-class\n *\n * @description\n * Removes the specified classes from DOM nodes. This scriptlet runs once after the page loads\n * and after that periodically in order to DOM tree changes.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-classjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-class', classes[, selector, applying])\n * ```\n *\n * - `classes` — required, class or list of classes separated by '|'\n * - `selector` — optional, CSS selector, specifies DOM nodes from which the classes will be removed.\n * If there is no `selector`, each class of `classes` independently will be removed from all nodes which has one\n * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply,\n * defaults to 'asap stay'; possible flags:\n * - `asap` — runs as fast as possible **once**\n * - `complete` — runs **once** after the whole page has been loaded\n * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes\n *\n * ### Examples\n *\n * 1. Removes by classes\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-class', 'example|test')\n * ```\n *\n * ```html\n * \n *
Some text
\n *
Some text
\n *
Some text
\n *\n * \n *
Some text
\n *
Some text
\n *
Some text
\n * ```\n *\n * 1. Removes with specified selector\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^=\"inner\"]')\n * ```\n *\n * ```html\n * \n *
\n *
Some text
\n *
\n *\n * \n *
\n *
Some text
\n *
\n * ```\n *\n * 1. Using flags\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^=\"inner\"]', 'asap complete')\n * ```\n *\n * @added v1.1.1.\n */\n /* eslint-enable max-len */\n\n function removeClass$1(source, classNames, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n var selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n var removeClassHandler = function removeClassHandler() {\n var nodes = new Set();\n if (selector) {\n var foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n var elements = document.querySelectorAll(s);\n for (var i = 0; i < elements.length; i += 1) {\n var element = elements[i];\n nodes.add(element);\n }\n });\n }\n var removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var CLASS_ATTR_NAME = ['class'];\n var flags = parseFlags(applying);\n var run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n // 'true' for observing attributes\n // 'class' for observing only classes\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n // https://github.com/AdguardTeam/Scriptlets/issues/245\n // Call removeClassHandler on DOM content loaded\n // to ensure that target node is present on the page\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n // Only call removeClassHandler for single 'stay' flag\n if (!applying.includes(' ')) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n removeClass$1.names = ['remove-class',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc'];\n removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /**\n * @scriptlet disable-newtab-links\n *\n * @description\n * Prevents opening new tabs and windows if there is `target` attribute in element.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#disable-newtab-linksjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('disable-newtab-links')\n * ```\n *\n * @added v1.0.4.\n */\n function disableNewtabLinks$1(source) {\n document.addEventListener('click', function (ev) {\n var target = ev.target;\n while (target !== null) {\n if (target.localName === 'a' && target.hasAttribute('target')) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n disableNewtabLinks$1.names = ['disable-newtab-links',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links'];\n disableNewtabLinks$1.injections = [hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet adjust-setInterval\n *\n * @description\n * Adjusts delay for specified setInterval() callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-setinterval-boosterjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('adjust-setInterval'[, matchCallback [, matchDelay[, boost]]])\n * ```\n *\n * - `matchCallback` — optional, string or regular expression for stringified callback matching;\n * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work\n * - `matchDelay` — optional, defaults to 1000, matching setInterval delay; decimal integer OR '*' for any delay\n * - `boost` — optional, default to 0.05, float,\n * capped at 1000 times for up and 50 for down (0.001...50), setInterval delay multiplier\n *\n * ### Examples\n *\n * 1. Adjust all setInterval() x20 times where delay equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval')\n * ```\n *\n * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', 'example')\n * ```\n *\n * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 400ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', 'example', '400')\n * ```\n *\n * 1. Slow down setInterval() x2 times where callback matched with `example` and delay equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', 'example', '', '2')\n * ```\n *\n * 1. Adjust all setInterval() x50 times where delay equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.02')\n * ```\n *\n * 1. Adjust all setInterval() x1000 times where delay equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.001')\n * ```\n *\n * 1. Adjust all setInterval() x50 times where delay is randomized\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function adjustSetInterval$1(source, matchCallback, matchDelay, boost) {\n var nativeSetInterval = window.setInterval;\n var matchRegexp = toRegExp(matchCallback);\n var intervalWrapper = function intervalWrapper(callback, delay) {\n // https://github.com/AdguardTeam/Scriptlets/issues/221\n if (!isValidCallback(callback)) {\n // eslint-disable-next-line max-len\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n adjustSetInterval$1.names = ['adjust-setInterval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib'];\n adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n // following helpers should be injected as helpers above use them\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet adjust-setTimeout\n *\n * @description\n * Adjusts delay for specified setTimeout() callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-settimeout-boosterjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('adjust-setTimeout'[, matchCallback [, matchDelay[, boost]]])\n * ```\n *\n * - `matchCallback` — optional, string or regular expression for stringified callback matching;\n * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work\n * - `matchDelay` — optional, defaults to 1000, matching setTimeout delay; decimal integer OR '*' for any delay\n * - `boost` — optional, default to 0.05, float,\n * capped at 1000 times for up and 50 for down (0.001...50), setTimeout delay multiplier\n *\n * ### Examples\n *\n * 1. Adjust all setTimeout() x20 times where timeout equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout')\n * ```\n *\n * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'example')\n * ```\n *\n * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 400ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'example', '400')\n * ```\n *\n * 1. Slow down setTimeout() x2 times where callback matched with `example` and timeout equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'example', '', '2')\n * ```\n *\n * 1. Adjust all setTimeout() x50 times where timeout equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.02')\n * ```\n *\n * 1. Adjust all setTimeout() x1000 times where timeout equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.001')\n * ```\n *\n * 1. Adjust all setTimeout() x20 times where callback matched with `test` and timeout is randomized\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) {\n var nativeSetTimeout = window.setTimeout;\n var matchRegexp = toRegExp(matchCallback);\n var timeoutWrapper = function timeoutWrapper(callback, delay) {\n // https://github.com/AdguardTeam/Scriptlets/issues/221\n if (!isValidCallback(callback)) {\n // eslint-disable-next-line max-len\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n adjustSetTimeout$1.names = ['adjust-setTimeout',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb'];\n adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n // following helpers should be injected as helpers above use them\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet dir-string\n *\n * @description\n * Wraps the `console.dir` API to call the `toString` method of the argument.\n * There are several adblock circumvention systems that detect browser devtools\n * and hide themselves. Therefore, if we force them to think\n * that devtools are open (using this scriptlet),\n * it will automatically disable the adblock circumvention script.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('dir-string'[, times])\n * ```\n *\n * - `times` — optional, the number of times to call the `toString` method of the argument to `console.dir`\n *\n * ### Examples\n *\n * ```adblock\n * ! Run 2 times\n * example.org#%#//scriptlet('dir-string', '2')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function dirString$1(source, times) {\n var _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === 'function') {\n dir.call(this, object);\n }\n hit(source);\n }\n // eslint-disable-next-line no-console\n console.dir = dirWrapper;\n }\n dirString$1.names = ['dir-string'];\n dirString$1.injections = [hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet json-prune\n *\n * @description\n * Removes specified properties from the result of calling JSON.parse and returns the caller.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#json-prunejs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/json-prune.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('json-prune'[, propsToRemove [, obligatoryProps [, stack]]])\n * ```\n *\n * - `propsToRemove` — optional, string of space-separated properties to remove\n * - `obligatoryProps` — optional, string of space-separated properties\n * which must be all present for the pruning to occur\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * > Note please that you can use wildcard `*` for chain property name,\n * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`.\n *\n * ### Examples\n *\n * 1. Removes property `example` from the results of JSON.parse call\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'example')\n * ```\n *\n * For instance, the following call will return `{ one: 1}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"example\":true}')\n * ```\n *\n * 1. If there are no specified properties in the result of JSON.parse call, pruning will NOT occur\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'one', 'obligatoryProp')\n * ```\n *\n * For instance, the following call will return `{ one: 1, two: 2}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"two\":2}')\n * ```\n *\n * 1. A property in a list of properties can be a chain of properties\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'a.b', 'ads.url.first')\n * ```\n *\n * 1. Removes property `content.ad` from the results of JSON.parse call if its error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'content.ad', '', 'test.js')\n * ```\n *\n * 1. A property in a list of properties can be a chain of properties with wildcard in it\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'content.*.media.src', 'content.*.media.ad')\n * ```\n *\n * 1. Call with no arguments will log the current hostname and json payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune')\n * ```\n *\n * 1. Call with only second argument will log the current hostname and matched json payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', '', '\"id\":\"117458\"')\n * ```\n *\n * @added v1.1.0.\n */\n /* eslint-enable max-len */\n function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : [];\n var nativeJSONParse = JSON.parse;\n var jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n // dealing with stringified json in args, which should be parsed.\n // so we call nativeJSONParse as JSON.parse which is bound to JSON object\n var root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(source, root, prunePaths, requiredPaths);\n };\n\n // JSON.parse mocking\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n var nativeResponseJson = Response.prototype.json;\n // eslint-disable-next-line func-names\n var responseJsonWrapper = function responseJsonWrapper() {\n var promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(source, obj, prunePaths, requiredPaths);\n });\n };\n\n // do nothing if browser does not support Response (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/Response\n if (typeof Response === 'undefined') {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n jsonPrune$1.names = ['json-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune'];\n jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, isPruningNeeded, jsonPruner,\n // following helpers are needed for helpers above\n toRegExp, getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-requestAnimationFrame\n *\n * @description\n * Prevents a `requestAnimationFrame` call\n * if the text of the callback is matching the specified search string which does not start with `!`;\n * otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-requestanimationframe-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-requestAnimationFrame'[, search])\n * ```\n *\n * - `search` — optional, string or regular expression;\n * invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n *\n * > Call with no argument will log all requestAnimationFrame calls,\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Prevents `requestAnimationFrame` calls if the callback matches `/\\.test/`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-requestAnimationFrame', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n *\n * ```javascript\n * var times = 0;\n * requestAnimationFrame(function change() {\n * window.test = 'new value';\n * if (times < 2) {\n * times += 1;\n * requestAnimationFrame(change);\n * }\n * });\n * ```\n *\n * 1. Prevents `requestAnimationFrame` calls if **does not match** 'check'\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-requestAnimationFrame', '!check')\n * ```\n *\n * For instance, only the first call will be prevented:\n *\n * ```javascript\n * var timesFirst = 0;\n * requestAnimationFrame(function changeFirst() {\n * window.check = 'should not be prevented';\n * if (timesFirst < 2) {\n * timesFirst += 1;\n * requestAnimationFrame(changeFirst);\n * }\n * });\n *\n * var timesSecond = 0;\n * requestAnimationFrame(function changeSecond() {\n * window.second = 'should be prevented';\n * if (timesSecond < 2) {\n * timesSecond += 1;\n * requestAnimationFrame(changeSecond);\n * }\n * });\n * ```\n *\n * @added v1.1.15.\n */\n /* eslint-enable max-len */\n\n function preventRequestAnimationFrame$1(source, match) {\n var nativeRequestAnimationFrame = window.requestAnimationFrame;\n\n // logs requestAnimationFrame to console if no arguments have been specified\n var shouldLog = typeof match === 'undefined';\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var rafWrapper = function rafWrapper(callback) {\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif'];\n preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage,\n // following helpers should be injected as helpers above use them\n escapeRegExp, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-cookie\n *\n * @description\n * Sets a cookie with the specified name, value, and path.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-cookie', name, value[, path])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value; possible values:\n * - number `>= 0 && <= 15`\n * - one of the predefined constants in any case variation:\n * - `true`\n * - `false`\n * - `yes` / `y`\n * - `no` / `n`\n * - `ok`\n * - `accept`/ `reject`\n * - `allow` / `deny`\n * - `path` — optional, cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet encodes cookie names and values,\n * > e.g value `\"{ test: 'value'}\"` becomes `%7B%20test%3A%20'value'%7D`.\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-cookie', 'CookieConsent', '1')\n *\n * example.org#%#//scriptlet('set-cookie', 'gdpr-settings-cookie', 'true')\n *\n * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none')\n * ```\n *\n * @added v1.2.3.\n */\n /* eslint-enable max-len */\n function setCookie$1(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n setCookie$1.names = ['set-cookie'];\n setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n\n /**\n * @scriptlet set-cookie-reload\n *\n * @description\n * Sets a cookie with the specified name and value, and path,\n * and reloads the current page after the cookie setting.\n * If reloading option is not needed, use [set-cookie](#set-cookie) scriptlet.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-cookie-reload', name, value[, path])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value; possible values:\n * - number `>= 0 && <= 15`\n * - one of the predefined constants in any case variation:\n * - `true`\n * - `false`\n * - `yes` / `y`\n * - `no` / `n`\n * - `ok`\n * - `accept`/ `reject`\n * - `allow` / `deny`\n * - `path` — optional, cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet encodes cookie names and values,\n * > e.g value `\"{ test: 'value'}\"` becomes `%7B%20test%3A%20'value'%7D`.\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-cookie-reload', 'checking', 'ok')\n *\n * example.org#%#//scriptlet('set-cookie-reload', 'gdpr-settings-cookie', '1')\n *\n * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none')\n * ```\n *\n * @added v1.3.14.\n */\n function setCookieReload$1(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n\n // Only reload the page if cookie was set\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n setCookieReload$1.names = ['set-cookie-reload'];\n setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n\n /**\n * @scriptlet hide-in-shadow-dom\n *\n * @description\n * Hides elements inside open shadow DOM elements.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('hide-in-shadow-dom', selector[, baseSelector])\n * ```\n *\n * - `selector` — required, CSS selector of element in shadow-dom to hide\n * - `baseSelector` — optional, selector of specific page DOM element,\n * narrows down the part of the page DOM where shadow-dom host supposed to be,\n * defaults to document.documentElement\n *\n * > `baseSelector` should match element of the page DOM, but not of shadow DOM.\n *\n * ### Examples\n *\n * ```adblock\n * ! hides menu bar\n * example.com#%#//scriptlet('hide-in-shadow-dom', '.storyAd', '#app')\n *\n * ! hides floating element\n * example.com#%#//scriptlet('hide-in-shadow-dom', '.contact-fab')\n * ```\n *\n * @added v1.3.0.\n */\n function hideInShadowDom$1(source, selector, baseSelector) {\n // do nothing if browser does not support ShadowRoot\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow) {\n return;\n }\n var hideElement = function hideElement(targetElement) {\n var DISPLAY_NONE_CSS = 'display:none!important;';\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n\n /**\n * Handles shadow-dom piercing and hiding of found elements\n */\n var hideHandler = function hideHandler() {\n // start value of shadow-dom hosts for the page dom\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n\n // if there is shadow-dom host, they should be explored\n var _loop = function _loop() {\n var isHidden = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n\n // continue to pierce for inner shadow-dom hosts\n // and search inside them while the next iteration\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n hideInShadowDom$1.names = ['hide-in-shadow-dom'];\n hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n // following helpers should be imported and injected\n // because they are used by helpers above\n flatten, throttle];\n\n /**\n * @scriptlet remove-in-shadow-dom\n *\n * @description\n * Removes elements inside open shadow DOM elements.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-in-shadow-dom', selector[, baseSelector])\n * ```\n *\n * - `selector` — required, CSS selector of element in shadow-dom to remove\n * - `baseSelector` — optional, selector of specific page DOM element,\n * narrows down the part of the page DOM where shadow-dom host supposed to be,\n * defaults to document.documentElement\n *\n * > `baseSelector` should match element of the page DOM, but not of shadow DOM.\n *\n * ### Examples\n *\n * ```adblock\n * ! removes menu bar\n * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'iron-pages', 'vt-virustotal-app')\n *\n * ! removes floating element\n * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab')\n * ```\n *\n * @added v1.3.14.\n */\n function removeInShadowDom$1(source, selector, baseSelector) {\n // do nothing if browser does not support ShadowRoot\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow) {\n return;\n }\n var removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n\n /**\n * Handles shadow-dom piercing and removing of found elements\n */\n var removeHandler = function removeHandler() {\n // start value of shadow-dom hosts for the page dom\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n\n // if there is shadow-dom host, they should be explored\n var _loop = function _loop() {\n var isRemoved = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n\n // continue to pierce for inner shadow-dom hosts\n // and search inside them while the next iteration\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n removeInShadowDom$1.names = ['remove-in-shadow-dom'];\n removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n // following helpers should be imported and injected\n // because they are used by helpers above\n flatten, throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-fetch\n *\n * @description\n * Prevents `fetch` calls if **all** given parameters match.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-fetch-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-fetch'[, propsToMatch[, responseBody[, responseType]]])\n * ```\n *\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to fetch call;\n * empty string, wildcard `*` or invalid regular expression will match all fetch calls\n * - colon-separated pairs `name:value` where\n * \n * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters)\n * - `value` is string or regular expression for matching the value of the option passed to fetch call;\n * invalid regular expression will cause any value matching\n * - `responseBody` — optional, string for defining response body value,\n * defaults to `emptyObj`. Possible values:\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `responseType` — optional, string for defining response type,\n * original response type is used if not specified. Possible values:\n * - `default`\n * - `opaque`\n *\n * > Usage with no arguments will log fetch calls to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Log all fetch calls\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch')\n * ```\n *\n * 1. Prevent all fetch calls\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '*')\n * ! or\n * example.org#%#//scriptlet('prevent-fetch', '')\n * ```\n *\n * 1. Prevent fetch call for specific url\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '/url\\\\.part/')\n * ```\n *\n * 1. Prevent fetch call for specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', 'method:HEAD')\n * ```\n *\n * 1. Prevent fetch call for specific url and request method\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/')\n * ```\n *\n * 1. Prevent fetch call and specify response body value\n *\n * ```adblock\n * ! Specify response body for fetch call to a specific url\n * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/', 'emptyArr')\n *\n * ! Specify response body for all fetch calls\n * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr')\n * ```\n *\n * 1. Prevent all fetch calls and specify response type value\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque')\n * ```\n *\n * @added v1.3.18.\n */\n /* eslint-enable max-len */\n function preventFetch$1(source, propsToMatch) {\n var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj';\n var responseType = arguments.length > 3 ? arguments[3] : undefined;\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n var strResponseBody;\n if (responseBody === '' || responseBody === 'emptyObj') {\n strResponseBody = '{}';\n } else if (responseBody === 'emptyArr') {\n strResponseBody = '[]';\n } else {\n logMessage(source, \"Invalid responseBody parameter: '\".concat(responseBody, \"'\"));\n return;\n }\n var isResponseTypeSpecified = typeof responseType !== 'undefined';\n var isResponseTypeSupported = function isResponseTypeSupported(responseType) {\n var SUPPORTED_TYPES = ['default', 'opaque'];\n return SUPPORTED_TYPES.includes(responseType);\n };\n // Skip disallowed response types,\n // specified responseType has limited list of possible values\n if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) {\n logMessage(source, \"Invalid responseType parameter: '\".concat(responseType, \"'\"));\n return;\n }\n var handlerWrapper = async function handlerWrapper(target, thisArg, args) {\n var shouldPrevent = false;\n var fetchData = getFetchData(args);\n if (typeof propsToMatch === 'undefined') {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n try {\n var origResponse = await Reflect.apply(target, thisArg, args);\n // In the case of apps, the blocked request has status 500\n // and no error is thrown, so it's necessary to check response.ok\n // https://github.com/AdguardTeam/Scriptlets/issues/334\n if (!origResponse.ok) {\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return modifyResponse(origResponse, {\n body: strResponseBody,\n type: responseType\n });\n } catch (ex) {\n // https://github.com/AdguardTeam/Scriptlets/issues/334\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign\n }\n\n preventFetch$1.names = ['prevent-fetch',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if'];\n preventFetch$1.injections = [hit, getFetchData, objectToString, matchRequestProps, logMessage, noopPromiseResolve, modifyResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-local-storage-item\n *\n * @description\n * Adds specified key and its value to localStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * To remove item from localStorage use `$remove$` as a value.\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('set-local-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `''` — empty string\n * - `yes`\n * - `no`\n * - `$remove$` — remove specific item from localStorage\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-local-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1')\n *\n * ! Removes the item with key 'foo' from local storage\n * example.org#%#//scriptlet('set-local-storage-item', 'foo', '$remove$')\n * ```\n *\n * @added v1.4.3.\n */\n /* eslint-enable max-len */\n\n function setLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n localStorage = _window.localStorage;\n if (validValue === '$remove$') {\n removeStorageItem(source, localStorage, key);\n } else {\n setStorageItem(source, localStorage, key, validValue);\n }\n hit(source);\n }\n setLocalStorageItem$1.names = ['set-local-storage-item'];\n setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-session-storage-item\n *\n * @description\n * Adds specified key and its value to sessionStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * To remove item from sessionStorage use `$remove$` as a value.\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('set-session-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `''` — empty string\n * - `yes`\n * - `no`\n * - `$remove$` — remove specific item from sessionStorage\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-session-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1')\n *\n * ! Removes the item with key 'foo' from session storage\n * example.org#%#//scriptlet('set-session-storage-item', 'foo', '$remove$')\n * ```\n *\n * @added v1.4.3.\n */\n /* eslint-enable max-len */\n\n function setSessionStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n sessionStorage = _window.sessionStorage;\n if (validValue === '$remove$') {\n removeStorageItem(source, sessionStorage, key);\n } else {\n setStorageItem(source, sessionStorage, key, validValue);\n }\n hit(source);\n }\n setSessionStorageItem$1.names = ['set-session-storage-item'];\n setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-stack-trace\n *\n * @description\n * Aborts a script when it attempts to utilize (read or write to) the specified property\n * and it's error stack trace contains given value.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock-for-firefox-legacy/commit/7099186ae54e70b588d5e99554a05d783cabc8ff\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('abort-on-stack-trace', property, stack)\n * ```\n *\n * - `property` — required, path to a property. The property must be attached to window.\n * - `stack` — required, string that must match the current function call stack trace.\n * - values to abort inline or injected script, accordingly:\n * - `inlineScript`\n * - `injectedScript`\n *\n * ### Examples\n *\n * 1. Aborts script when it tries to access `window.Ya` and it's error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'test.js')\n * ```\n *\n * 1. Aborts script when it tries to access `window.Ya.videoAd` and it's error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya.videoAd', 'test.js')\n * ```\n *\n * 1. Aborts script when stack trace matches with any of these parameters\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexFuncName')\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexScriptName')\n * ```\n *\n * 1. Aborts script when it tries to access `window.Ya` and it's an inline script\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'inlineScript')\n * ```\n *\n * 1. Aborts script when it tries to access `window.Ya` and it's an injected script\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript')\n * ```\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function abortOnStackTrace$1(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n\n // Prevent infinite loops when trapping prop used by helpers in getter/setter\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnStackTrace$1.names = ['abort-on-stack-trace',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace'];\n abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet log-on-stack-trace\n *\n * @description\n * This scriptlet is basically the same as [abort-on-stack-trace](#abort-on-stack-trace),\n * but instead of aborting it logs:\n *\n * - function and source script names pairs that access the given property\n * - was that get or set attempt\n * - script being injected or inline\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('log-on-stack-trace', 'property')\n * ```\n *\n * - `property` — required, path to a property. The property must be attached to window.\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function logOnStacktrace$1(source, property) {\n if (!property) {\n return;\n }\n var refineStackTrace = function refineStackTrace(stackString) {\n // Split stack trace string by lines and remove first two elements ('Error' and getter call)\n // Remove ' at ' at the start of each string\n var stackSteps = stackString.split('\\n').slice(2).map(function (line) {\n return line.replace(/ {4}at /, '');\n });\n // Trim each line extracting funcName : fullPath pair\n var logInfoArray = stackSteps.map(function (line) {\n var funcName;\n var funcFullPath;\n /* eslint-disable-next-line no-useless-escape */\n var reg = /\\(([^\\)]+)\\)/;\n var regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(' ').slice(0, -1).join(' ');\n /* eslint-disable-next-line prefer-destructuring */\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split('@').slice(0, -1).join(' ');\n /* eslint-disable-next-line prefer-destructuring */\n funcFullPath = line.match(regFirefox)[2];\n } else {\n // For when func name is not available\n funcName = 'function name is not available';\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n // Convert array into object for better display using console.table\n var logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n /* eslint-disable-next-line prefer-destructuring */\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var value = base[prop];\n /* eslint-disable no-console */\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n /* eslint-enable no-console */\n };\n\n setChainPropAccess(window, property);\n }\n logOnStacktrace$1.names = ['log-on-stack-trace'];\n logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-xhr\n *\n * @description\n * Prevents `xhr` calls if **all** given parameters match.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-xhr-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-xhr'[, propsToMatch[, randomize]])\n * ```\n *\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call;\n * empty string or wildcard `*` for all `XMLHttpRequest.open()` calls match\n * - colon-separated pairs `name:value` where\n * - `name` is XMLHttpRequest object property name\n * - `value` is string or regular expression for matching the value of the option\n * passed to `XMLHttpRequest.open()` call\n * - `randomize` — defaults to `false` for empty responseText,\n * optional argument to randomize responseText of matched XMLHttpRequest's response; possible values:\n * - `true` to randomize responseText, random alphanumeric string of 10 symbols\n * - colon-separated pair `name:value` string value to customize responseText data where\n * - `name` — only `length` supported for now\n * - `value` — range on numbers, for example `100-300`, limited to 500000 characters\n *\n * > Usage with no arguments will log XMLHttpRequest objects to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Log all XMLHttpRequests\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr')\n * ```\n *\n * 1. Prevent all XMLHttpRequests\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', '*')\n * example.org#%#//scriptlet('prevent-xhr', '')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'method:HEAD')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url and specified request methods\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org method:/HEAD|GET/')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url and randomize it's response text\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'true')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url and randomize it's response text with range\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300')\n * ```\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function preventXHR$1(source, propsToMatch, customResponseText) {\n // do nothing if browser does not support Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof Proxy === 'undefined') {\n return;\n }\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader;\n var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders;\n var xhrData;\n var modifiedResponse = '';\n var modifiedResponseText = '';\n var openWrapper = function openWrapper(target, thisArg, args) {\n // Get original request properties\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (typeof propsToMatch === 'undefined') {\n // Log if no propsToMatch given\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n // Add xhrData to thisArg to keep original values in case of multiple requests\n // https://github.com/AdguardTeam/Scriptlets/issues/347\n thisArg.xhrData = xhrData;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later;\n // needed for getResponseHeader() and getAllResponseHeaders() methods\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n // setRequestHeader() can only be called on xhr.open(),\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === 'blob') {\n modifiedResponse = new Blob();\n }\n if (thisArg.responseType === 'arraybuffer') {\n modifiedResponse = new ArrayBuffer();\n }\n if (customResponseText) {\n var randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n modifiedResponseText = randomText;\n } else {\n logMessage(source, \"Invalid randomize parameter: '\".concat(customResponseText, \"'\"));\n }\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n statusText = forgedRequest.statusText;\n\n // Mock response object\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // If the request is blocked, responseURL is an empty string\n responseURL: {\n value: responseURL || thisArg.xhrData.url,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n // modified values\n status: {\n value: 200,\n writable: false\n },\n response: {\n value: modifiedResponse,\n writable: false\n },\n responseText: {\n value: modifiedResponseText,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n\n /**\n * Mock XMLHttpRequest.prototype.getHeaderHandler() to avoid adblocker detection.\n *\n * @param {Function} target XMLHttpRequest.prototype.getHeaderHandler().\n * @param {XMLHttpRequest} thisArg The request.\n * @param {string[]} args Header name is passed as first argument.\n *\n * @returns {string|null} Header value or null if header is not set.\n */\n var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetResponseHeader.apply(thisArg, args);\n }\n if (!thisArg.collectedHeaders.length) {\n return null;\n }\n // The search for the header name is case-insensitive\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getResponseHeader\n var searchHeaderName = args[0].toLowerCase();\n var matchedHeader = thisArg.collectedHeaders.find(function (header) {\n var headerName = header[0].toLowerCase();\n return headerName === searchHeaderName;\n });\n return matchedHeader ? matchedHeader[1] : null;\n };\n\n /**\n * Mock XMLHttpRequest.prototype.getAllResponseHeaders() to avoid adblocker detection.\n *\n * @param {Function} target XMLHttpRequest.prototype.getAllResponseHeaders().\n * @param {XMLHttpRequest} thisArg The request.\n *\n * @returns {string} All headers as a string. For no headers an empty string is returned.\n */\n var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetAllResponseHeaders.call(thisArg);\n }\n if (!thisArg.collectedHeaders.length) {\n return '';\n }\n var allHeadersStr = thisArg.collectedHeaders.map(function (header) {\n /**\n * TODO: array destructuring may be used here\n * after the typescript implementation and bundling refactoring\n * as now there is an error: slicedToArray is not defined\n */\n var headerName = header[0];\n var headerValue = header[1];\n // In modern browsers, the header names are returned in all lower case, as per the latest spec.\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders\n return \"\".concat(headerName.toLowerCase(), \": \").concat(headerValue);\n }).join('\\r\\n');\n return allHeadersStr;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n var getHeaderHandler = {\n apply: getHeaderWrapper\n };\n var getAllHeadersHandler = {\n apply: getAllHeadersWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler);\n XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler);\n }\n preventXHR$1.names = ['prevent-xhr',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if'];\n preventXHR$1.injections = [hit, objectToString, generateRandomResponse, matchRequestProps, getXhrData, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, isValidParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength];\n\n /**\n * @scriptlet close-window\n *\n * @description\n * Closes the browser tab immediately.\n *\n * > `window.close()` usage is restricted in the Chrome browser.\n * > In this case tab will only be closed when using AdGuard Browser extension.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('close-window'[, path])\n * ```\n *\n * - `path` — optional, string or regular expression\n * matching the current location's path: `window.location.pathname` + `window.location.search`.\n * Defaults to execute on every page.\n *\n * ### Examples\n *\n * ```adblock\n * ! closes any example.org tab\n * example.org#%#//scriptlet('close-window')\n *\n * ! closes specific example.org tab\n * example.org#%#//scriptlet('close-window', '/example-page.html')\n * ```\n *\n * @added v1.5.0.\n */\n function forceWindowClose$1(source) {\n var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036\n if (typeof window.close !== 'function') {\n var message = 'window.close() is not a function so \\'close-window\\' scriptlet is unavailable';\n logMessage(source, message);\n return;\n }\n var closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n // log the error if window closing is impossible\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/close\n logMessage(source, e);\n }\n };\n var closeByExtension = function closeByExtension() {\n var extCall = function extCall() {\n dispatchEvent(new Event('adguard:scriptlet-close-window'));\n };\n window.addEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n }, 5000);\n };\n var shouldClose = function shouldClose() {\n if (path === '') {\n return true;\n }\n var pathRegexp = toRegExp(path);\n var currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.includes('Chrome')) {\n closeByExtension();\n }\n }\n }\n forceWindowClose$1.names = ['close-window', 'window-close-if.js', 'ubo-window-close-if.js', 'ubo-window-close-if'];\n forceWindowClose$1.injections = [hit, toRegExp, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-refresh\n *\n * @description\n * Prevents reloading of a document through a meta \"refresh\" tag.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#refresh-defuserjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-refresh'[, delay])\n * ```\n *\n * - `delay` — optional, number of seconds for delay that indicates when scriptlet should run.\n * If not set, source tag value will be applied.\n *\n * ### Examples\n *\n * 1. Prevent reloading of a document through a meta \"refresh\" tag\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-refresh')\n * ```\n *\n * 1. Prevent reloading of a document with delay\n *\n * ```adblock\n * example.com#%#//scriptlet('prevent-refresh', 3)\n * ```\n *\n * @added v1.6.2.\n */\n /* eslint-enable max-len */\n function preventRefresh$1(source, delaySec) {\n var getMetaElements = function getMetaElements() {\n var metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n // 'i' attribute flag is problematic in Edge 15\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n var getMetaContentDelay = function getMetaContentDelay(metaElements) {\n var delays = metaElements.map(function (meta) {\n var contentString = meta.getAttribute('content');\n if (contentString.length === 0) {\n return null;\n }\n var contentDelay;\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv\n var limiterIndex = contentString.indexOf(';');\n if (limiterIndex !== -1) {\n var delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n // Check if \"delays\" array is empty, may happens when meta's content is invalid\n // and reduce() method cannot be used with empty arrays without initial value\n if (!delays.length) {\n return null;\n }\n // Get smallest delay of all metas on the page\n var minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n // eslint-disable-next-line consistent-return\n return minDelay;\n };\n var stop = function stop() {\n var metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n var secondsToRun = getNumberFromString(delaySec);\n // Check if argument is provided\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n // Check if meta tag has delay\n if (secondsToRun === null) {\n return;\n }\n var delayMs = secondsToRun * 1000;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n preventRefresh$1.names = ['prevent-refresh',\n // Aliases are needed for matching the related scriptlet converted into our syntax\n // These are used by UBO rules syntax\n // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets\n 'refresh-defuser.js', 'refresh-defuser',\n // Prefix 'ubo-' is required to run converted rules\n 'ubo-refresh-defuser.js', 'ubo-refresh-defuser'];\n preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN];\n\n /* eslint-disable max-len, consistent-return */\n /**\n * @scriptlet prevent-element-src-loading\n *\n * @description\n * Prevents target element source loading without triggering 'onerror' listeners and not breaking 'onload' ones.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-element-src-loading', tagName, match)\n * ```\n *\n * - `tagName` — required, case-insensitive target element tagName\n * which `src` property resource loading will be silently prevented; possible values:\n * - `script`\n * - `img`\n * - `iframe`\n * - `link`\n * - `match` — required, string or regular expression for matching the element's URL;\n *\n * ### Examples\n *\n * 1. Prevent script source loading\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle')\n * ```\n *\n * @added v1.6.2.\n */\n /* eslint-enable max-len */\n function preventElementSrcLoading$1(source, tagName, match) {\n // do nothing if browser does not support Proxy or Reflect\n if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n var srcMockData = {\n // \"KCk9Pnt9\" = \"()=>{}\"\n script: 'data:text/javascript;base64,KCk9Pnt9',\n // Empty 1x1 image\n img: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n // Empty h1 tag\n iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=',\n // Empty data\n link: 'data:text/plain;base64,'\n };\n var instance;\n if (tagName === 'script') {\n instance = HTMLScriptElement;\n } else if (tagName === 'img') {\n instance = HTMLImageElement;\n } else if (tagName === 'iframe') {\n instance = HTMLIFrameElement;\n } else if (tagName === 'link') {\n instance = HTMLLinkElement;\n } else {\n return;\n }\n\n // For websites that use Trusted Types\n // https://w3c.github.io/webappsec-trusted-types/dist/spec/\n var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function';\n var policy;\n if (hasTrustedTypes) {\n // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can\n // allow our policy if the server has restricted the creation of a trusted-types policy with\n // the directive 'Content-Security-Policy: trusted-types ;`.\n // If such a header is presented in the server response, corelibs adds permission to create\n // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors.\n // See AG-18204 for details.\n policy = window.trustedTypes.createPolicy('AGPolicy', {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n var SOURCE_PROPERTY_NAME = tagName === 'link' ? 'href' : 'src';\n var ONERROR_PROPERTY_NAME = 'onerror';\n var searchRegexp = toRegExp(match);\n\n // This will be needed to silent error events on matched element,\n // as url wont be available\n var setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, 'matched');\n };\n var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n // Check if arguments are present\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n var nodeName = thisArg.nodeName.toLowerCase();\n var attrName = args[0].toLowerCase();\n var attrValue = args[1];\n var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n // Forward the URI that corresponds with element's MIME type\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n var setAttributeHandler = {\n apply: setAttributeWrapper\n };\n // eslint-disable-next-line max-len\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n var nodeName = this.nodeName.toLowerCase();\n var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n\n // eslint-disable-next-line no-undef\n if (policy && urlValue instanceof TrustedScriptURL) {\n var trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n\n // https://github.com/AdguardTeam/Scriptlets/issues/228\n // Prevent error event being triggered by other sources\n var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n var isMatched = this.getAttribute(source.name) === 'matched';\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n // Check if arguments are present\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n var eventName = args[0];\n var isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error';\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n // eslint-disable-next-line max-len\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n var preventInlineOnerror = function preventInlineOnerror(tagName, src) {\n window.addEventListener('error', function (event) {\n if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) {\n return;\n }\n hit(source);\n if (typeof event.target.onload === 'function') {\n event.target.onerror = event.target.onload;\n return;\n }\n event.target.onerror = noopFunc;\n }, true);\n };\n preventInlineOnerror(tagName, searchRegexp);\n }\n preventElementSrcLoading$1.names = ['prevent-element-src-loading'];\n preventElementSrcLoading$1.injections = [hit, toRegExp, safeGetDescriptor, noopFunc];\n\n /**\n * @scriptlet no-topics\n *\n * @description\n * Prevents using the Topics API.\n * https://developer.chrome.com/docs/privacy-sandbox/topics/\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('no-topics')\n * ```\n *\n * @added v1.6.18.\n */\n function noTopics$1(source) {\n var TOPICS_PROPERTY_NAME = 'browsingTopics';\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n\n // document.browsingTopics() is async function so it's better to return noopPromiseResolve()\n // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve('[]');\n };\n hit(source);\n }\n noTopics$1.names = ['no-topics'];\n noTopics$1.injections = [hit, noopPromiseResolve];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-xhr-response\n *\n * @description\n * Replaces response content of `xhr` requests if **all** given parameters match.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]])\n * ```\n *\n * - `pattern` — optional, argument for matching contents of responseText that should be replaced.\n * If set, `replacement` is required. Possible values:\n * - `*` to match all text content\n * - non-empty string\n * - regular expression\n * - `replacement` — optional, should be set if `pattern` is set. String to replace matched content with.\n * Empty string to remove content.\n * - `propsToMatch` — optional, string of space-separated properties to match for extra condition; possible props:\n * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call;\n * - colon-separated pairs `name:value` where\n * - `name` — string or regular expression for matching XMLHttpRequest property name\n * - `value` — string or regular expression for matching the value of the option\n * passed to `XMLHttpRequest.open()` call\n *\n * > Usage with no arguments will log XMLHttpRequest objects to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Log all XMLHttpRequests\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response')\n * ```\n *\n * 1. Replace text content of XMLHttpRequests with specific url\n *\n * \n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org')\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', 'example.org')\n * ```\n *\n * \n *\n * 1. Remove all text content of XMLHttpRequests with specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET')\n * ```\n *\n * 1. Replace text content of XMLHttpRequests matching by URL regex and request methods\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', '/\\.m3u8/ method:/GET|HEAD/') \n * ```\n *\n * 1. Remove all text content of all XMLHttpRequests for example.com\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n function trustedReplaceXhrResponse$1(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof Proxy === 'undefined') {\n return;\n }\n\n // Only allow pattern as empty string for logging purposes\n if (pattern === '' && replacement !== '') {\n var message = 'Pattern argument should not be empty string.';\n logMessage(source, message);\n return;\n }\n var shouldLog = pattern === '' && replacement === '';\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n // Log if no propsToMatch given\n var _message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, _message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n\n // setRequestHeader can only be called on open xhr object,\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n\n // Extract content from response\n var content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n var patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedContent = content.replace(patternRegexp, replacement);\n\n // Manually put required values into target XHR object\n // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // modified values\n response: {\n value: modifiedContent,\n writable: false\n },\n responseText: {\n value: modifiedContent,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response'\n // trusted scriptlets support no aliases\n ];\n\n trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet xml-prune\n *\n * @description\n * Removes an element from the specified XML.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#xml-prunejs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('xml-prune'[, propsToMatch[, optionalProp[, urlToMatch]]])\n * ```\n *\n * - `propsToMatch` — optional, selector of elements which will be removed from XML\n * - `optionalProp` — optional, selector of elements that must occur in XML document\n * - `urlToMatch` — optional, string or regular expression for matching the request's URL\n *\n * > Usage with no arguments will log response payload and URL to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Remove `Period` tag whose `id` contains `-ad-` from all requests\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]')\n * ```\n *\n * 1. Remove `Period` tag whose `id` contains `-ad-`, only if XML contains `SegmentTemplate`\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]', 'SegmentTemplate')\n * ```\n *\n * 1. Remove `Period` tag whose `id` contains `-ad-`, only if request's URL contains `.mpd`\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]', '', '.mpd')\n * ```\n *\n * 1. Call with no arguments will log response payload and URL at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune')\n * ```\n *\n * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', '', '', '.mpd')\n * ```\n *\n * @added 1.7.3.\n */\n /* eslint-enable max-len */\n\n function xmlPrune$1(source, propsToRemove) {\n var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var isXML = function isXML(text) {\n // It's necessary to check the type of 'text'\n // because 'text' is obtained from the xhr/fetch response,\n // so it could also be Blob/ArrayBuffer/Object or another type\n if (typeof text === 'string') {\n // Check if \"text\" starts with \"<\" and check if it ends with \">\"\n // If so, then it might be an XML file and should be pruned or logged\n var trimmedText = text.trim();\n if (trimmedText.startsWith('<') && trimmedText.endsWith('>')) {\n return true;\n }\n }\n return false;\n };\n var createXMLDocument = function createXMLDocument(text) {\n var xmlParser = new DOMParser();\n var xmlDocument = xmlParser.parseFromString(text, 'text/xml');\n return xmlDocument;\n };\n var isPruningNeeded = function isPruningNeeded(response, propsToRemove) {\n if (!isXML(response)) {\n return false;\n }\n var docXML = createXMLDocument(response);\n return !!docXML.querySelector(propsToRemove);\n };\n var pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n var xmlDoc = createXMLDocument(text);\n var errorNode = xmlDoc.querySelector('parsererror');\n if (errorNode) {\n return text;\n }\n if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n var elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n var serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n\n // setRequestHeader can only be called on open xhr object,\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = ['', 'text'];\n // Do nothing if request do not match\n // or response type is not a string\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n\n // Extract content from response\n var content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n if (!propsToRemove) {\n if (isXML(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, propsToRemove);\n }\n var responseContent = shouldPruneResponse ? pruneXML(response) : response;\n // Manually put required values into target XHR object\n // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // modified values\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n // It's required to fix issue with - Request with body\": Failed to execute 'fetch' on 'Window':\n // Cannot construct a Request with a Request object that has already been used.\n // For example, it occurs on youtube when scriptlet is used without arguments\n var clonedResponse = response.clone();\n var responseText = await response.text();\n shouldPruneResponse = isPruningNeeded(responseText, propsToRemove);\n if (!shouldPruneResponse) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n logMessage(source, createXMLDocument(responseText), true, false);\n return clonedResponse;\n }\n var prunedText = pruneXML(responseText);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n xmlPrune$1.names = ['xml-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune'];\n xmlPrune$1.injections = [hit, logMessage, toRegExp, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet m3u-prune\n *\n * @description\n * Removes content from the specified M3U file.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#m3u-prunejs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch]])\n * ```\n *\n * - `propsToRemove` — optional, string or regular expression\n * to match the URL line (segment) which will be removed alongside with its tags\n * - `urlToMatch` — optional, string or regular expression for matching the request's URL\n *\n * > Usage with no arguments will log response payload and URL to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Removes a tag which contains `example.com/video/`, from all requests\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune', 'example.com/video/')\n * ```\n *\n * 1. Removes a line which contains `example.com/video/`, only if request's URL contains `.m3u8`\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune', 'example.com/video/', '.m3u8')\n * ```\n *\n * 1. Call with no arguments will log response payload and URL at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune')\n * ```\n *\n * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune', '', '.m3u8')\n * ```\n *\n * @added v1.9.1.\n */\n /* eslint-enable max-len */\n\n function m3uPrune$1(source, propsToRemove) {\n var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var SEGMENT_MARKER = '#';\n var AD_MARKER = {\n ASSET: '#EXT-X-ASSET:',\n CUE: '#EXT-X-CUE:',\n CUE_IN: '#EXT-X-CUE-IN',\n DISCONTINUITY: '#EXT-X-DISCONTINUITY',\n EXTINF: '#EXTINF',\n EXTM3U: '#EXTM3U',\n SCTE35: '#EXT-X-SCTE35:'\n };\n var COMCAST_AD_MARKER = {\n AD: '-AD-',\n VAST: '-VAST-',\n VMAP_AD: '-VMAP-AD-',\n VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:'\n };\n\n // List of tags which should not be removed\n var TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START'];\n var isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY\n *\n * @param {Array} lines\n * @param {number} i\n * @returns {object} { array, index }\n */\n var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n var array = lines.slice();\n var index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array,\n index\n };\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * COMCAST_AD_MARKER: COMCAST_AD_MARKER.VMAP_AD, COMCAST_AD_MARKER.VAST, COMCAST_AD_MARKER.AD\n *\n * @param {Array} lines\n * @returns {Array}\n */\n var pruneVmapBlock = function pruneVmapBlock(lines) {\n var array = lines.slice();\n for (var i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n // It's necessary to subtract 1 from \"i\",\n // otherwise one line will be skipped\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * AD_MARKER: AD_MARKER.CUE, AD_MARKER.ASSET, AD_MARKER.SCTE35, AD_MARKER.CUE_IN\n *\n * @param {string} line\n * @param {number} index\n * @param {Array} array\n * @returns {string|undefined}\n */\n\n var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n var removeM3ULineRegexp = toRegExp(propsToRemove);\n\n /**\n * Sets an item in array to undefined, if it contains removeM3ULineRegexp and one of the\n * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY\n *\n * @param {string} line\n * @param {number} index\n * @param {Array} array\n * @returns {string|undefined}\n */\n\n var pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n\n /**\n * Removes block of segments (if it contains removeM3ULineRegexp) until another segment occurs\n *\n * @param {Array} lines\n * @returns {Array}\n */\n var pruneSegments = function pruneSegments(lines) {\n for (var i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n var segmentName = lines[i].substring(0, lines[i].indexOf(':'));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (var j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n\n /**\n * Determines if text contains \"#EXTM3U\" or \"VMAP_AD_BREAK\"\n *\n * @param {*} text\n * @returns {boolean}\n */\n var isM3U = function isM3U(text) {\n if (typeof text === 'string') {\n // Check if \"text\" starts with \"#EXTM3U\" or with \"VMAP_AD_BREAK\"\n // If so, then it might be an M3U file and should be pruned or logged\n var trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n\n /**\n * Determines if pruning is needed\n *\n * @param {string} text\n * @param {RegExp} regexp\n * @returns {boolean}\n */\n var isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n\n /**\n * Prunes lines which contain removeM3ULineRegexp and specific AD_MARKER\n *\n * @param {string} text\n * @returns {string}\n */\n // TODO: make it compatible with $hls modifier\n var pruneM3U = function pruneM3U(text) {\n var lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join('\\n');\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === 'undefined') {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== 'undefined') {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join('\\n');\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n\n // setRequestHeader can only be called on open xhr object,\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = ['', 'text'];\n // Do nothing if request do not match\n // or response type is not a string\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n\n // Extract content from response\n var content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n if (!propsToRemove) {\n if (isM3U(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n var responseContent = shouldPruneResponse ? pruneM3U(response) : response;\n // Manually put required values into target XHR object\n // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // modified values\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n // It's required to fix issue with - Request with body\": Failed to execute 'fetch' on 'Window':\n // Cannot construct a Request with a Request object that has already been used.\n // For example, it occurs on youtube when scriptlet is used without arguments\n var clonedResponse = response.clone();\n var responseText = await response.text();\n // If \"propsToRemove\" is not defined, then response should be logged only\n if (!propsToRemove && isM3U(responseText)) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return clonedResponse;\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n var prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n m3uPrune$1.names = ['m3u-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'm3u-prune.js', 'ubo-m3u-prune.js', 'ubo-m3u-prune'];\n m3uPrune$1.injections = [hit, toRegExp, logMessage, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-cookie\n *\n * @description\n * Sets a cookie with arbitrary name and value,\n * and with optional ability to offset cookie attribute 'expires' and set path.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value. Possible values:\n * - arbitrary value\n * - empty string for no value\n * - `$now$` keyword for setting current time in ms, e.g 1667915146503\n * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire;\n * defaults to no offset. Possible values:\n * - positive integer in seconds\n * - `1year` keyword for setting expiration date to one year\n * - `1day` keyword for setting expiration date to one day\n * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet does not encode cookie names and values.\n * > As a result, if a cookie's name or value includes `;`,\n * > the scriptlet will not set the cookie since this may cause the cookie to break.\n *\n * ### Examples\n *\n * 1. Set cookie\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept')\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '1-accept_1')\n * ```\n *\n * 1. Set cookie with `new Date().getTime()` value\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$')\n * ```\n *\n * 1. Set cookie which will expire in 3 days\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '259200')\n * ```\n *\n * 1. Set cookie which will expire in one year\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year')\n * ```\n *\n * 1. Set cookie with no path\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n\n function trustedSetCookie$1(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n trustedSetCookie$1.names = ['trusted-set-cookie'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-cookie-reload\n *\n * @description\n * Sets a cookie with arbitrary name and value,\n * and with optional ability to offset cookie attribute 'expires' and set path.\n * Also reloads the current page after the cookie setting.\n * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie).\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value. Possible values:\n * - arbitrary value\n * - empty string for no value\n * - `$now$` keyword for setting current time in ms, e.g 1667915146503\n * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire;\n * defaults to no offset. Possible values:\n * - positive integer in seconds\n * - `1year` keyword for setting expiration date to one year\n * - `1day` keyword for setting expiration date to one day\n * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet does not encode cookie names and values.\n * > As a result, if a cookie's name or value includes `;`,\n * > the scriptlet will not set the cookie since this may cause the cookie to break.\n *\n * ### Examples\n *\n * 1. Set cookie and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept')\n * ```\n *\n * 1. Set cookie with `new Date().getTime()` value and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$')\n * ```\n *\n * 1. Set cookie which will expire in 3 days and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200')\n * ```\n *\n * 1. Set cookie which will expire in one year and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year')\n * ```\n *\n * 1. Set cookie with no 'expire' and no path, reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none')\n * ```\n *\n * @added v1.7.10.\n */\n /* eslint-enable max-len */\n\n function trustedSetCookieReload$1(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n\n // Prevent infinite reloads if cookie was already set or blocked by the browser\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n\n // Get cookie value, it's required for checking purpose\n // in case if $now$ or $currentDate$ value is used\n // https://github.com/AdguardTeam/Scriptlets/issues/291\n var cookieValueToCheck = parseCookieString(document.cookie)[name];\n\n // Only reload the page if cookie was set\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) {\n window.location.reload();\n }\n }\n trustedSetCookieReload$1.names = ['trusted-set-cookie-reload'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, parseCookieString, getCookiePath];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-fetch-response\n *\n * @description\n * Replaces response text content of `fetch` requests if **all** given parameters match.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-replace-fetch-response'[, pattern, replacement[, propsToMatch]])\n * ```\n *\n * - `pattern` — optional, argument for matching contents of responseText that should be replaced.\n * If set, `replacement` is required. Possible values:\n * - `*` to match all text content\n * - non-empty string\n * - regular expression\n * - `replacement` — optional, should be set if `pattern` is set. String to replace the response text content\n * matched by `pattern`. Empty string to remove content. Defaults to empty string.\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to fetch call;\n * empty string, wildcard `*` or invalid regular expression will match all fetch calls\n * - colon-separated pairs `name:value` where\n * \n * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters)\n * - `value` is string or regular expression for matching the value of the option passed to fetch call;\n * invalid regular expression will cause any value matching\n *\n * > Usage with no arguments will log fetch calls to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * > Scriptlet does nothing if response body can't be converted to text.\n *\n * ### Examples\n *\n * 1. Log all fetch calls\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response')\n * ```\n *\n * 1. Replace response text content of fetch requests with specific url\n *\n * \n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', 'adb_detect:true', 'adb_detect:false', 'example.org')\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', 'example.org')\n * ```\n *\n * \n *\n * 1. Remove all text content of fetch responses with specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'method:GET')\n * ```\n *\n * 1. Replace response text content of fetch requests matching by URL regex and request methods\n *\n * \n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', '/\\.m3u8/ method:/GET|HEAD/')\n * ```\n *\n * \n *\n * 1. Remove text content of all fetch responses for example.com\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n function trustedReplaceFetchResponse$1(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n\n // Only allow pattern as empty string for logging purposes\n if (pattern === '' && replacement !== '') {\n logMessage(source, 'Pattern argument should not be empty string');\n return;\n }\n var shouldLog = pattern === '' && replacement === '';\n var nativeFetch = fetch;\n var shouldReplace = false;\n var fetchData;\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n // log if no propsToMatch given\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create new Response object using original response' properties\n * and given text as body content\n *\n * @param {Response} response original response to copy properties from\n * @param {string} textContent text to set as body content\n * @returns {Response}\n */\n var forgeResponse = function forgeResponse(response, textContent) {\n var bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n var forgedResponse = new Response(textContent, {\n status,\n statusText,\n headers\n });\n\n // Manually set properties which can't be set by Response constructor\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n\n // eslint-disable-next-line prefer-spread\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n var patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n var forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n // log if response body can't be converted to a string\n var fetchDataStr = objectToString(fetchData);\n var message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign\n }\n\n trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response'\n // trusted scriptlets support no aliases\n ];\n\n trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-local-storage-item\n *\n * @description\n * Adds item with arbitrary key and value to localStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * ### Syntax\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-set-local-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - arbitrary value\n * - `$now$` keyword for setting current time in ms, corresponds to `Date.now()` and `(new Date).getTime()` calls\n * - `$currentDate$` keyword for setting string representation of the current date and time,\n * corresponds to `Date()` and `(new Date).toString()` calls\n *\n * ### Examples\n *\n * 1. Set local storage item\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'COOKIE_CONSENTS', '{\"preferences\":3,\"flag\":false}')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '[16364,88364]')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '{\"providers\":[123,456],\"consent\":\"all\"}')\n * ```\n *\n * 1. Set item with current time since unix epoch in ms\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$now$')\n * ```\n *\n * 1. Set item with current date, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$currentDate$')\n * ```\n *\n * 1. Set item without value\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n\n function trustedSetLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Item value should be specified');\n return;\n }\n var parsedValue = parseKeywordValue(value);\n var _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-constant\n *\n * @description\n * Creates a constant property and assigns it a specified value.\n *\n * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type.\n *\n * > If empty object is present in chain it will be trapped until chain leftovers appear.\n *\n * > Use [set-constant](./about-scriptlets.md#set-constant) to set predefined values and functions.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-set-constant', property, value[, stack])\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`.\n * - `value` — required, an arbitrary value to be set; value type is being inferred from the argument,\n * e.g '500' will be set as number; to set string type value wrap argument into another pair of quotes: `'\"500\"'`;\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * ### Examples\n *\n * 1. Set property values of different types\n *\n * ```adblock\n * ! Set string value wrapping argument into another pair of quotes\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '\"null\"')\n *\n * ✔ window.click_r === 'null'\n * ✔ typeof window.click_r === 'string'\n *\n * ! Set inferred null value\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', 'null')\n *\n * ✔ window.click_r === null\n * ✔ typeof window.click_r === 'object'\n *\n * ! Set number type value\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '48')\n *\n * ✔ window.click_r === 48\n * ✔ typeof window.click_r === 'number'\n *\n * ! Set array or object as property value, argument should be a JSON string\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '[1,\"string\"]')\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '{\"aaa\":123,\"bbb\":{\"ccc\":\"string\"}}')\n * ```\n *\n * 1. Use script stack matching to set value\n *\n * ```adblock\n * ! `document.first` will return `1` if the method is related to `checking.js`\n * example.org#%#//scriptlet('trusted-set-constant', 'document.first', '1', 'checking.js')\n *\n * ✔ document.first === 1 // if the condition described above is met\n * ```\n *\n * @added v1.8.2.\n */\n /* eslint-enable max-len */\n function trustedSetConstant$1(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n\n /**\n * Safely sets property on a given object\n *\n * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} base arbitrary reachable object\n * @param {string} prop property name\n * @param {boolean} configurable if set property should be configurable\n * @param {object} handler custom property descriptor object\n * @returns {boolean} true if prop was trapped successfully\n */\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n // This is required to prevent scriptlets overwrite each over\n if (origDescriptor instanceof Object) {\n // This check is required to avoid defining non-configurable props\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n\n /**\n * Traverses given chain to set constant value to its end prop\n * Chains that yet include non-object values (e.g null) are valid and will be\n * traversed when appropriate chain member is set by an external script\n *\n * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} owner object that owns chain\n * @param {string} property chain of owner properties\n */\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // Handler method init is used to keep track of factual value\n // and apply mustCancel() check only on end prop\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n // Prevent breakage due to loop assignments like win.obj = win.obj\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n\n // End prop case\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n\n // Null prop in chain\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n\n // Empty object prop in chain\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n\n // Defined prop in chain\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n\n // Undefined prop in chain\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n trustedSetConstant$1.names = ['trusted-set-constant'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetConstant$1.injections = [hit, inferValue, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest,\n // following helpers should be imported and injected\n // because they are used by helpers above\n shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet inject-css-in-shadow-dom\n *\n * @description\n * Injects CSS rule into selected Shadow DOM subtrees on a page\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', cssRule[, hostSelector])\n * ```\n *\n * - `cssRule` — required, string representing a single css rule\n * - `hostSelector` — optional, string, selector to match shadow host elements.\n * CSS rule will be only applied to shadow roots inside these elements.\n * Defaults to injecting css rule into all available roots.\n *\n * ### Examples\n *\n * 1. Apply style to all shadow dom subtrees\n *\n * ```adblock\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#advertisement { display: none !important; }')\n * ```\n *\n * 1. Apply style to a specific shadow dom subtree\n *\n * ```adblock\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#content { margin-top: 0 !important; }', '#banner')\n * ```\n *\n * @added v1.8.2.\n */\n /* eslint-enable max-len */\n\n function injectCssInShadowDom$1(source, cssRule) {\n var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n // do nothing if browser does not support ShadowRoot, Proxy or Reflect\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n\n // Prevent url() and image-set() styles from being applied\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n var callback = function callback(shadowRoot) {\n try {\n // adoptedStyleSheets and CSSStyleSheet constructor are not yet supported by Safari\n // https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptedStyleSheets\n // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet\n var stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n var styleTag = document.createElement('style');\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n injectCssInShadowDom$1.names = ['inject-css-in-shadow-dom'];\n injectCssInShadowDom$1.injections = [hit, logMessage, hijackAttachShadow];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-node-text\n *\n * @description\n * Removes text from DOM nodes.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/commit/2bb446797a12086f2eebc0c8635b671b8b90c477\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-node-text', nodeName, condition)\n * ```\n *\n * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed.\n * Must target lowercased node names, e.g `div` instead of `DIV`.\n * - `textMatch` — required, string or RegExp to match against node's text content.\n * If matched, the whole text will be removed. Case sensitive.\n *\n * ### Examples\n *\n * 1. Remove node's text content:\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-node-text', 'div', 'some text')\n * ```\n *\n * ```html\n * \n *
some text
\n * some text\n *\n * \n *
\n * some text\n * ```\n *\n * 2. Remove node's text content, matching both node name and condition by RegExp:\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-node-text', '/[a-z]*[0-9]/', '/text/')\n * ```\n *\n * ```html\n * \n * some text\n * some text\n *\n * \n * \n * some text\n * ```\n *\n * @added v1.9.37.\n */\n /* eslint-enable max-len */\n function removeNodeText$1(source, nodeName, textMatch) {\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch;\n\n /**\n * Handles nodes by removing text content of matched nodes\n *\n * Note: instead of drilling down all the arguments for both replace-node-text\n * and trusted-replace-node-text scriptlets, only the handler is being passed\n *\n * @param {Node[]} nodes nodes to handle\n * @returns {void}\n */\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n var ALL_TEXT_PATTERN = /^[\\s\\S]*$/;\n var REPLACEMENT = '';\n replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT);\n }\n });\n };\n\n // Apply dedicated handler to already rendered nodes...\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n\n // and newly added nodes\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n removeNodeText$1.names = ['remove-node-text',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-node-text.js', 'ubo-remove-node-text.js', 'rmnt.js', 'ubo-rmnt.js', 'ubo-remove-node-text', 'ubo-rmnt'];\n removeNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams,\n // following helpers should be imported and injected\n // because they are used by helpers above\n hit, nodeListToArray, getAddedNodes, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-node-text\n *\n * @description\n * Replaces text in text content of matched DOM nodes.\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-node-text', nodeName, textMatch, pattern, replacement)\n * ```\n *\n * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed.\n * Must target lowercased node names, e.g `div` instead of `DIV`.\n * - `textMatch` — required, string or RegExp to match against node's text content.\n * If matched, the whole text will be removed. Case sensitive.\n * - `pattern` — required, string or regexp for matching contents of `node.textContent` that should be replaced.\n * - `replacement` — required, string to replace text content matched by `pattern`.\n *\n * ### Examples\n *\n * 1. Replace node's text content:\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-node-text', 'div', 'some', 'text', 'other text')\n * ```\n *\n * ```html\n * \n *
some text
\n *
text
\n * some text\n *\n * \n *
some other text
\n *
text
\n * some text\n * ```\n *\n * 2. Replace node's text content, matching both node name, text and pattern by RegExp:\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-node-text', '/[a-z]*[0-9]/', '/s\\dme/', '/t\\dxt/', 'other text')\n * ```\n *\n * ```html\n * \n * s0me t3xt // this node is going to be matched by both node name and text\n * text // this node won't be matched by text content nor text content\n * some text\n *\n * \n * s0me other text // text content has changed\n * text\n * some text\n * ```\n *\n * @added v1.9.37.\n */\n /* eslint-enable max-len */\n function trustedReplaceNodeText$1(source, nodeName, textMatch, pattern, replacement) {\n var uboAliases = ['replace-node-text.js', 'rpnt.js', 'sed.js'];\n\n /**\n * UBO replaceNodeText scriptlet has different signature:\n * function replaceNodeText(nodeName, pattern, replacement, ...extraArgs) {...}\n *\n * with extra params being passed as ['paramname', paramvalue]\n */\n if (uboAliases.includes(source.name)) {\n replacement = pattern;\n pattern = textMatch;\n // eslint-disable-next-line prefer-destructuring, prefer-rest-params\n for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {\n extraArgs[_key - 5] = arguments[_key];\n }\n for (var i = 0; i < extraArgs.length; i += 1) {\n var arg = extraArgs[i];\n if (arg === 'condition') {\n textMatch = extraArgs[i + 1];\n break;\n }\n }\n }\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch,\n patternMatch = _parseNodeTextParams.patternMatch;\n\n /**\n * Handles nodes by removing text content of matched nodes\n *\n * Note: instead of drilling down all the arguments for both replace-node-text\n * and trusted-replace-node-text scriptlets, only the handler is being passed\n *\n * @param {Node[]} nodes nodes to handle\n * @returns {void}\n */\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n replaceNodeText(source, node, patternMatch, replacement);\n }\n });\n };\n\n // Apply dedicated handler to already rendered nodes...\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n\n // and newly added nodes\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n trustedReplaceNodeText$1.names = ['trusted-replace-node-text'\n // trusted scriptlets support no aliases\n ];\n\n trustedReplaceNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams,\n // following helpers should be imported and injected\n // because they are used by helpers above\n hit, nodeListToArray, getAddedNodes, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet evaldata-prune\n *\n * @description\n * Removes specified properties from the result of calling eval (if payloads contains `Object`) and returns to the caller.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/commit/c8de9041917b61035171e454df886706f27fc4f3\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('evaldata-prune'[, propsToRemove [, obligatoryProps [, stack]]])\n * ```\n *\n * - `propsToRemove` — optional, string of space-separated properties to remove\n * - `obligatoryProps` — optional, string of space-separated properties\n * which must be all present for the pruning to occur\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * > Note please that you can use wildcard `*` for chain property name,\n * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`.\n *\n * ### Examples\n *\n * 1. Removes property `example` from the payload of the eval call\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'example')\n * ```\n *\n * For instance, the following call will return `{ one: 1}`\n *\n * ```html\n * eval({ one: 1, example: true })\n * ```\n *\n * 2. If there are no specified properties in the payload of eval call, pruning will NOT occur\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'one', 'obligatoryProp')\n * ```\n *\n * For instance, the following call will return `{ one: 1, two: 2}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"two\":2}')\n * ```\n *\n * 3. A property in a list of properties can be a chain of properties\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'a.b', 'ads.url.first')\n * ```\n *\n * 4. Removes property `content.ad` from the payload of eval call if its error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'content.ad', '', 'test.js')\n * ```\n *\n * 5. A property in a list of properties can be a chain of properties with wildcard in it\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'content.*.media.src', 'content.*.media.ad')\n * ```\n *\n * 6. Call with no arguments will log the current hostname and object payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune')\n * ```\n *\n * 7. Call with only second argument will log the current hostname and matched object payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', '', '\"id\":\"117458\"')\n * ```\n *\n * @added v1.9.37.\n */\n /* eslint-enable max-len */\n function evalDataPrune$1(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : [];\n var evalWrapper = function evalWrapper(target, thisArg, args) {\n var data = Reflect.apply(target, thisArg, args);\n if (typeof data === 'object') {\n data = jsonPruner(source, data, prunePaths, requiredPaths);\n }\n return data;\n };\n var evalHandler = {\n apply: evalWrapper\n };\n // eslint-disable-next-line no-eval\n window.eval = new Proxy(window.eval, evalHandler);\n }\n evalDataPrune$1.names = ['evaldata-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'evaldata-prune.js', 'ubo-evaldata-prune.js', 'ubo-evaldata-prune'];\n evalDataPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, toRegExp, isPruningNeeded, jsonPruner,\n // following helpers are needed for helpers above\n getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n\n /**\n * This file must export all scriptlets which should be accessible\n */\n\n var scriptletList = /*#__PURE__*/Object.freeze({\n __proto__: null,\n abortCurrentInlineScript: abortCurrentInlineScript$1,\n abortOnPropertyRead: abortOnPropertyRead$1,\n abortOnPropertyWrite: abortOnPropertyWrite$1,\n abortOnStackTrace: abortOnStackTrace$1,\n adjustSetInterval: adjustSetInterval$1,\n adjustSetTimeout: adjustSetTimeout$1,\n debugCurrentInlineScript: debugCurrentInlineScript$1,\n debugOnPropertyRead: debugOnPropertyRead$1,\n debugOnPropertyWrite: debugOnPropertyWrite$1,\n dirString: dirString$1,\n disableNewtabLinks: disableNewtabLinks$1,\n evalDataPrune: evalDataPrune$1,\n forceWindowClose: forceWindowClose$1,\n hideInShadowDom: hideInShadowDom$1,\n injectCssInShadowDom: injectCssInShadowDom$1,\n jsonPrune: jsonPrune$1,\n log: log$1,\n logAddEventListener: logAddEventListener$1,\n logEval: logEval$1,\n logOnStacktrace: logOnStacktrace$1,\n m3uPrune: m3uPrune$1,\n noTopics: noTopics$1,\n noeval: noeval$1,\n nowebrtc: nowebrtc$1,\n preventAddEventListener: preventAddEventListener$1,\n preventAdfly: preventAdfly$1,\n preventBab: preventBab$2,\n preventElementSrcLoading: preventElementSrcLoading$1,\n preventEvalIf: preventEvalIf$1,\n preventFab: preventFab$1,\n preventFetch: preventFetch$1,\n preventPopadsNet: preventPopadsNet$1,\n preventRefresh: preventRefresh$1,\n preventRequestAnimationFrame: preventRequestAnimationFrame$1,\n preventSetInterval: preventSetInterval$1,\n preventSetTimeout: preventSetTimeout$1,\n preventWindowOpen: preventWindowOpen$1,\n preventXHR: preventXHR$1,\n removeAttr: removeAttr$1,\n removeClass: removeClass$1,\n removeCookie: removeCookie$1,\n removeInShadowDom: removeInShadowDom$1,\n removeNodeText: removeNodeText$1,\n setAttr: setAttr$1,\n setConstant: setConstant$1,\n setCookie: setCookie$1,\n setCookieReload: setCookieReload$1,\n setLocalStorageItem: setLocalStorageItem$1,\n setPopadsDummy: setPopadsDummy$1,\n setSessionStorageItem: setSessionStorageItem$1,\n trustedClickElement: trustedClickElement$1,\n trustedReplaceFetchResponse: trustedReplaceFetchResponse$1,\n trustedReplaceNodeText: trustedReplaceNodeText$1,\n trustedReplaceXhrResponse: trustedReplaceXhrResponse$1,\n trustedSetConstant: trustedSetConstant$1,\n trustedSetCookie: trustedSetCookie$1,\n trustedSetCookieReload: trustedSetCookieReload$1,\n trustedSetLocalStorageItem: trustedSetLocalStorageItem$1,\n xmlPrune: xmlPrune$1\n });\n\n /**\n * Store of ADG redirects names and their analogs.\n * As it is not a compatibility table, no need to keep in redirects array third-party redirects.\n *\n * Needed only for conversion purposes.\n * e.g. googletagmanager-gtm is removed and should be removed from compatibility table as well\n * but now it works as alias for google-analytics so it should stay valid for compiler\n */\n var redirects$1 = [{\n adg: '1x1-transparent.gif',\n ubo: '1x1.gif',\n abp: '1x1-transparent-gif'\n }, {\n adg: '2x2-transparent.png',\n ubo: '2x2.png',\n abp: '2x2-transparent-png'\n }, {\n adg: '3x2-transparent.png',\n ubo: '3x2.png',\n abp: '3x2-transparent-png'\n }, {\n adg: '32x32-transparent.png',\n ubo: '32x32.png',\n abp: '32x32-transparent-png'\n }, {\n adg: 'amazon-apstag',\n ubo: 'amazon_apstag.js'\n }, {\n adg: 'ati-smarttag'\n }, {\n adg: 'didomi-loader'\n }, {\n adg: 'click2load.html',\n ubo: 'click2load.html'\n }, {\n adg: 'fingerprintjs2',\n ubo: 'fingerprint2.js'\n }, {\n adg: 'fingerprintjs3',\n ubo: 'fingerprint3.js'\n }, {\n adg: 'google-analytics',\n ubo: 'google-analytics_analytics.js'\n }, {\n adg: 'google-analytics-ga',\n ubo: 'google-analytics_ga.js'\n }, {\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication_adsbygoogle.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/162\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication.com/adsbygoogle.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/127\n adg: 'googletagmanager-gtm',\n ubo: 'google-analytics_ga.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/260\n adg: 'googletagmanager-gtm',\n ubo: 'googletagmanager_gtm.js'\n }, {\n adg: 'googletagservices-gpt',\n ubo: 'googletagservices_gpt.js'\n }, {\n adg: 'google-ima3',\n ubo: 'google-ima.js'\n }, {\n adg: 'gemius'\n }, {\n adg: 'matomo'\n }, {\n adg: 'metrika-yandex-watch'\n }, {\n adg: 'metrika-yandex-tag'\n }, {\n adg: 'naver-wcslog'\n }, {\n adg: 'noeval',\n ubo: 'noeval-silent.js'\n }, {\n adg: 'noopcss',\n ubo: 'noop.css',\n abp: 'blank-css'\n }, {\n adg: 'noopframe',\n ubo: 'noop.html',\n abp: 'blank-html'\n }, {\n adg: 'noopjs',\n ubo: 'noop.js',\n abp: 'blank-js'\n }, {\n adg: 'noopjson'\n }, {\n adg: 'nooptext',\n ubo: 'noop.txt',\n abp: 'blank-text'\n }, {\n adg: 'noopmp3-0.1s',\n ubo: 'noop-0.1s.mp3',\n abp: 'blank-mp3'\n }, {\n adg: 'noopmp4-1s',\n ubo: 'noop-1s.mp4',\n abp: 'blank-mp4'\n }, {\n adg: 'noopvmap-1.0',\n ubo: 'noop-vmap1.0.xml'\n }, {\n adg: 'noopvast-2.0'\n }, {\n adg: 'noopvast-3.0'\n }, {\n adg: 'noopvast-4.0'\n }, {\n adg: 'prebid'\n }, {\n adg: 'pardot-1.0'\n }, {\n adg: 'prevent-bab',\n ubo: 'nobab.js'\n }, {\n adg: 'prevent-bab2',\n ubo: 'nobab2.js'\n }, {\n adg: 'prevent-fab-3.2.0',\n ubo: 'nofab.js'\n }, {\n // AG-15917\n adg: 'prevent-fab-3.2.0',\n ubo: 'fuckadblock.js-3.2.0'\n }, {\n adg: 'prevent-popads-net',\n ubo: 'popads.js'\n }, {\n adg: 'scorecardresearch-beacon',\n ubo: 'scorecardresearch_beacon.js'\n }, {\n adg: 'set-popads-dummy',\n ubo: 'popads-dummy.js'\n }, {\n adg: 'empty',\n ubo: 'empty'\n }, {\n adg: 'prebid-ads',\n ubo: 'prebid-ads.js'\n }];\n\n var JS_RULE_MARKER = '#%#';\n var COMMENT_MARKER = '!';\n\n /**\n * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false)\n *\n * @param rule rule text\n * @returns if rule text is comment\n */\n var isComment = function isComment(rule) {\n return rule.startsWith(COMMENT_MARKER);\n };\n\n /* ************************************************************************\n *\n * Scriptlets\n *\n ************************************************************************** */\n\n /**\n * uBlock scriptlet rule mask\n */\n var UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\\s*\\+js/;\n var UBO_SCRIPTLET_MASK_1 = '##+js';\n var UBO_SCRIPTLET_MASK_2 = '##script:inject';\n var UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js';\n var UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject';\n\n /**\n * AdBlock Plus snippet rule mask\n */\n var ABP_SCRIPTLET_MASK = '#$#';\n var ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#';\n\n /**\n * AdGuard CSS rule mask\n */\n var ADG_CSS_MASK_REG = /#@?\\$#.+?\\s*\\{.*\\}\\s*$/g;\n\n /**\n * Checks if the `rule` is AdGuard scriptlet rule\n *\n * @param rule - rule text\n * @returns true if given rule is adg rule\n */\n var isAdgScriptletRule = function isAdgScriptletRule(rule) {\n return !isComment(rule) && rule.includes(ADG_SCRIPTLET_MASK);\n };\n\n /**\n * Checks if the `rule` is uBO scriptlet rule\n *\n * @param rule rule text\n * @returns true if given rule is ubo rule\n */\n var isUboScriptletRule = function isUboScriptletRule(rule) {\n return (rule.includes(UBO_SCRIPTLET_MASK_1) || rule.includes(UBO_SCRIPTLET_MASK_2) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_1) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_2)) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule);\n };\n\n /**\n * Checks if the `rule` is AdBlock Plus snippet\n *\n * @param rule rule text\n * @returns true if given rule is abp rule\n */\n var isAbpSnippetRule = function isAbpSnippetRule(rule) {\n return (rule.includes(ABP_SCRIPTLET_MASK) || rule.includes(ABP_SCRIPTLET_EXCEPTION_MASK)) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule);\n };\n\n /**\n * Returns array of scriptlet objects.\n * Needed for scriptlet name validation which will check aliases names.\n *\n * @returns Array of all scriptlet objects.\n */\n var getScriptletsObjList = function getScriptletsObjList() {\n return Object.values(scriptletList);\n };\n\n /**\n * Finds scriptlet by the `name`.\n *\n * @param name Scriptlet name.\n * @param scriptlets Array of all scriptlet objects.\n * @returns {Function} Scriptlet function.\n */\n var getScriptletByName = function getScriptletByName(name, scriptlets) {\n if (!scriptlets) {\n scriptlets = getScriptletsObjList();\n }\n return scriptlets.find(function (s) {\n return s.names\n // full match name checking\n && (s.names.includes(name)\n // or check ubo alias name without '.js' at the end\n || !name.endsWith('.js') && s.names.includes(\"\".concat(name, \".js\")));\n });\n };\n var scriptletObjects = getScriptletsObjList();\n\n /**\n * Checks whether the scriptlet `name` is valid by checking the scriptlet list object.\n *\n * @param name Scriptlet name.\n * @returns True if scriptlet name is valid.\n */\n var isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) {\n if (!name) {\n return false;\n }\n return !!getScriptletByName(name, scriptletObjects);\n };\n\n /**\n * Cache for better performance of scriptlet name validation.\n */\n var scriptletNameValidationCache = new Map();\n\n /**\n * Checks whether the `name` is valid scriptlet name.\n * Uses cache for better performance.\n *\n * @param name Scriptlet name.\n * @returns true if scriptlet name is a valid one.\n */\n var isValidScriptletName = function isValidScriptletName(name) {\n if (!name) {\n return false;\n }\n // if there is no cached validation value\n if (!scriptletNameValidationCache.has(name)) {\n // we should calculate it first\n var isValid = isValidScriptletNameNotCached(name);\n // and save it to the cache then\n scriptletNameValidationCache.set(name, isValid);\n return isValid;\n }\n // otherwise return cached validation result\n return scriptletNameValidationCache.get(name);\n };\n\n /* ************************************************************************\n *\n * Redirects\n *\n ************************************************************************** */\n\n /**\n * Redirect resources markers\n */\n var ADG_UBO_REDIRECT_MARKER = 'redirect=';\n var ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule=';\n var ABP_REDIRECT_MARKER = 'rewrite=abp-resource:';\n var EMPTY_REDIRECT_MARKER = 'empty';\n var VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other'];\n\n /**\n * Source types for redirect rules if there is no one of them.\n * Used for ADG -> UBO conversion.\n */\n var ABSENT_SOURCE_TYPE_REPLACEMENT = [{\n NAME: 'nooptext',\n TYPES: VALID_SOURCE_TYPES\n }, {\n NAME: 'noopcss',\n TYPES: ['stylesheet']\n }, {\n NAME: 'noopjs',\n TYPES: ['script']\n }, {\n NAME: 'noopframe',\n TYPES: ['subdocument']\n }, {\n NAME: '1x1-transparent.gif',\n TYPES: ['image']\n }, {\n NAME: 'noopmp3-0.1s',\n TYPES: ['media']\n }, {\n NAME: 'noopmp4-1s',\n TYPES: ['media']\n }, {\n NAME: 'googlesyndication-adsbygoogle',\n TYPES: ['xmlhttprequest', 'script']\n }, {\n NAME: 'google-analytics',\n TYPES: ['script']\n }, {\n NAME: 'googletagservices-gpt',\n TYPES: ['script']\n }];\n var validAdgRedirects = redirects$1.filter(function (el) {\n return !!el.adg;\n });\n\n /**\n * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names\n * It's used for UBO -> ADG converting\n */\n var uboToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) {\n return !!el.ubo;\n }).map(function (el) {\n return [el.ubo, el.adg];\n }));\n\n /**\n * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names\n * It's used for ABP -> ADG converting\n */\n var abpToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) {\n return !!el.abp;\n }).map(function (el) {\n return [el.abp, el.adg];\n }));\n\n /**\n * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names\n * It's used for ADG -> UBO converting\n */\n var adgToUboCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) {\n return el.ubo;\n }).map(function (el) {\n return [el.adg, el.ubo];\n }));\n\n /**\n * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names\n * 'adgToUboCompatibility' is still needed for ADG -> UBO converting\n */\n var validAdgCompatibility = Object.fromEntries(validAdgRedirects.map(function (el) {\n return [el.adg, 'valid adg redirect'];\n }));\n var REDIRECT_RULE_TYPES = {\n [\"VALID_ADG\"]: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n compatibility: validAdgCompatibility,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER\n },\n [\"ADG\"]: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n compatibility: adgToUboCompatibility,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER\n },\n [\"UBO\"]: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n compatibility: uboToAdgCompatibility,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER\n },\n [\"ABP\"]: {\n redirectMarker: ABP_REDIRECT_MARKER,\n compatibility: abpToAdgCompatibility\n }\n };\n\n /**\n * Parses redirect rule modifiers\n *\n * @param rule rule text\n * @returns list of rule modifiers\n */\n var parseModifiers = function parseModifiers(rule) {\n return substringAfter$1(rule, '$').split(',');\n };\n\n /**\n * Gets redirect resource name\n *\n * @param rule rule text\n * @param marker - specific Adg/Ubo or Abp redirect resources marker\n * @returns - redirect resource name\n */\n var getRedirectName = function getRedirectName(rule, marker) {\n var ruleModifiers = parseModifiers(rule);\n var redirectNamePart = ruleModifiers.find(function (el) {\n return el.includes(marker);\n });\n return redirectNamePart ? substringAfter$1(redirectNamePart, marker) : null;\n };\n\n /**\n * Checks if the `rule` is AdGuard redirect rule.\n * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier.\n *\n * @param rule - rule text\n * @returns true if given rule is adg redirect\n */\n var isAdgRedirectRule = function isAdgRedirectRule(rule) {\n var MARKER_IN_BASE_PART_MASK = '/((?!\\\\$|\\\\,).{1})redirect((-rule)?)=(.{0,}?)\\\\$(popup)?/';\n var _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[\"ADG\"],\n redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker,\n redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker;\n return !isComment(rule) && (rule.includes(redirectMarker) || typeof redirectRuleMarker === 'string' && rule.includes(redirectRuleMarker))\n // some js rules may have 'redirect=' in it, so we should get rid of them\n && !rule.includes(JS_RULE_MARKER)\n // get rid of rules like '_redirect=*://look.$popup'\n && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule);\n };\n\n /**\n * Checks if the `rule` satisfies the `type`\n *\n * @param rule - rule text\n * @param type - type of a redirect rule\n * @returns if the `rule` satisfies the `type`\n */\n var isRedirectRuleByType = function isRedirectRuleByType(rule, type) {\n var _REDIRECT_RULE_TYPES$2 = REDIRECT_RULE_TYPES[type],\n redirectMarker = _REDIRECT_RULE_TYPES$2.redirectMarker,\n redirectRuleMarker = _REDIRECT_RULE_TYPES$2.redirectRuleMarker,\n compatibility = _REDIRECT_RULE_TYPES$2.compatibility;\n if (rule && !isComment(rule)) {\n var marker;\n // check if there is a $redirect-rule modifier in rule\n var markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1;\n if (markerIndex > -1) {\n marker = redirectRuleMarker;\n } else {\n // check if there $redirect modifier in rule\n markerIndex = rule.indexOf(redirectMarker);\n if (markerIndex > -1) {\n marker = redirectMarker;\n } else {\n return false;\n }\n }\n if (!marker) {\n return false;\n }\n var redirectName = getRedirectName(rule, marker);\n if (!redirectName) {\n return false;\n }\n return redirectName === Object.keys(compatibility).find(function (el) {\n return el === redirectName;\n });\n }\n return false;\n };\n\n /**\n * Checks if the `rule` is **valid** AdGuard redirect resource rule\n *\n * @param rule - rule text\n * @returns true if given rule is valid adg redirect\n */\n var isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) {\n return isRedirectRuleByType(rule, \"VALID_ADG\");\n };\n\n /**\n * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion\n *\n * @param rule - AdGuard rule text\n * @returns - true if the rule can be converted to Ubo\n */\n var isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) {\n return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, \"ADG\");\n };\n\n /**\n * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion\n *\n * @param rule - Ubo rule text\n * @returns - true if the rule can be converted to AdGuard\n */\n var isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, \"UBO\");\n };\n\n /**\n * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion\n *\n * @param rule - Abp rule text\n * @returns - true if the rule can be converted to AdGuard\n */\n var isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, \"ABP\");\n };\n\n /**\n * Checks if the rule has specified content type before Adg -> Ubo conversion.\n *\n * Used ONLY for Adg -> Ubo conversion\n * because Ubo redirect rules must contain content type, but Adg and Abp must not.\n *\n * Also source type can not be added automatically because of such valid rules:\n * ! Abp:\n * $rewrite=abp-resource:blank-js,xmlhttprequest\n * ! Adg:\n * $script,redirect=noopvast-2.0\n * $xmlhttprequest,redirect=noopvast-2.0\n *\n * @param rule rule text\n * @returns if the rule has specified content type before conversion\n */\n var hasValidContentType = function hasValidContentType(rule) {\n var ruleModifiers = parseModifiers(rule);\n // rule can have more than one source type modifier\n var sourceTypes = ruleModifiers.filter(function (el) {\n return VALID_SOURCE_TYPES.includes(el);\n });\n var isSourceTypeSpecified = sourceTypes.length > 0;\n var isEmptyRedirect = ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER));\n if (isEmptyRedirect) {\n // no source type for 'empty' is allowed\n return true;\n }\n return isSourceTypeSpecified;\n };\n var validator = {\n UBO_SCRIPTLET_MASK_REG,\n ABP_SCRIPTLET_MASK,\n ABP_SCRIPTLET_EXCEPTION_MASK,\n isComment,\n isAdgScriptletRule,\n isUboScriptletRule,\n isAbpSnippetRule,\n getScriptletByName,\n isValidScriptletName,\n ADG_UBO_REDIRECT_RULE_MARKER,\n REDIRECT_RULE_TYPES,\n ABSENT_SOURCE_TYPE_REPLACEMENT,\n isAdgRedirectRule,\n isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg,\n parseModifiers,\n getRedirectName,\n hasValidContentType\n };\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _toArray(arr) {\n return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();\n }\n\n /**\n * AdGuard scriptlet rule\n */\n var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\\/\\/scriptlet\\(.+\\)/;\n // eslint-disable-next-line no-template-curly-in-string\n var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})';\n // eslint-disable-next-line no-template-curly-in-string\n var ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})';\n\n /**\n * uBlock scriptlet rule mask\n */\n // eslint-disable-next-line no-template-curly-in-string\n var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})';\n // eslint-disable-next-line no-template-curly-in-string\n var UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})';\n var UBO_ALIAS_NAME_MARKER = 'ubo-';\n var UBO_SCRIPTLET_JS_ENDING = '.js';\n\n // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr\n var UBO_XHR_TYPE = 'xhr';\n var ADG_XHR_TYPE = 'xmlhttprequest';\n var ADG_SET_CONSTANT_NAME = 'set-constant';\n var ADG_SET_CONSTANT_EMPTY_STRING = '';\n var ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr';\n var ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj';\n var UBO_SET_CONSTANT_EMPTY_STRING = '\\'\\'';\n var UBO_SET_CONSTANT_EMPTY_ARRAY = '[]';\n var UBO_SET_CONSTANT_EMPTY_OBJECT = '{}';\n var ADG_PREVENT_FETCH_NAME = 'prevent-fetch';\n var ADG_PREVENT_FETCH_EMPTY_STRING = '';\n var ADG_PREVENT_FETCH_WILDCARD = '*';\n var UBO_NO_FETCH_IF_WILDCARD = '/^/';\n var ESCAPED_COMMA_SEPARATOR = '\\\\,';\n var COMMA_SEPARATOR = ',';\n var REMOVE_ATTR_METHOD = 'removeAttr';\n var REMOVE_CLASS_METHOD = 'removeClass';\n var REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names;\n var REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names;\n var REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete'];\n var ABP_RESOURCE_MARKER = 'abp-resource:';\n\n /**\n * Possible rule origins.\n */\n var Origin = /*#__PURE__*/function (Origin) {\n Origin[\"Ubo\"] = \"ubo\";\n Origin[\"Abp\"] = \"abp\";\n Origin[\"AdgValid\"] = \"adgValid\";\n Origin[\"AdgInvalid\"] = \"adgInvalid\";\n return Origin;\n }(Origin || {});\n /**\n * Array of origin names in the order they must be checked for rule conversion.\n */\n var originNames = [Origin.Ubo, Origin.Abp, Origin.AdgValid, Origin.AdgInvalid];\n\n /**\n * Returns array of strings separated by space which is not in quotes\n *\n * @param str arbitrary string\n * @returns result array\n * @throws\n */\n var getAbpSnippetArguments = function getAbpSnippetArguments(str) {\n var reg = /'.*?'|\".*?\"|\\S+/g;\n var sentences = str.match(reg);\n if (!sentences) {\n throw new Error('Invalid ABP snippet args.');\n }\n return sentences;\n };\n\n /**\n * Replaces string with data by placeholders\n *\n * @param str string with placeholders\n * @param data where keys are placeholders names\n * @returns string filled with data\n */\n var replacePlaceholders = function replacePlaceholders(str, data) {\n return Object.keys(data).reduce(function (acc, key) {\n var reg = new RegExp(\"\\\\$\\\\{\".concat(key, \"\\\\}\"), 'g');\n acc = acc.replace(reg, data[key]);\n return acc;\n }, str);\n };\n var splitArgs = function splitArgs(str) {\n var args = [];\n var prevArgStart = 0;\n for (var i = 0; i < str.length; i += 1) {\n // do not split args by escaped comma\n // https://github.com/AdguardTeam/Scriptlets/issues/133\n if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\\\') {\n args.push(str.slice(prevArgStart, i).trim());\n prevArgStart = i + 1;\n }\n }\n // collect arg after last comma\n args.push(str.slice(prevArgStart, str.length).trim());\n return args;\n };\n\n /**\n * Validates remove-attr/class scriptlet args\n *\n * @param parsedArgs scriptlet arguments\n * @returns valid args OR error for invalid selector\n */\n var validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) {\n var _parsedArgs = _toArray(parsedArgs),\n name = _parsedArgs[0],\n value = _parsedArgs[1],\n restArgs = _parsedArgs.slice(2);\n // no extra checking if there are only scriptlet name and value\n // https://github.com/AdguardTeam/Scriptlets/issues/235\n if (restArgs.length === 0) {\n return [name, value];\n }\n\n // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should:\n // 1. check if last arg is 'applying' parameter\n // 2. join 'selector' into one arg\n // 3. combine all args\n // https://github.com/AdguardTeam/Scriptlets/issues/133\n var lastArg = restArgs.pop(); // https://github.com/microsoft/TypeScript/issues/30406\n var applying;\n // check the last parsed arg for matching possible 'applying' vale\n if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) {\n return lastArg.includes(el);\n })) {\n applying = lastArg;\n } else {\n restArgs.push(lastArg);\n }\n var selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR);\n if (selector.length > 0 && typeof document !== 'undefined') {\n // empty selector is valid for these scriptlets as it applies to all elements,\n // all other selectors should be validated\n // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html')\n document.querySelectorAll(selector);\n }\n var validArgs = applying ? [name, value, selector, applying] : [name, value, selector];\n return validArgs;\n };\n\n /**\n * Converts string of UBO scriptlet rule to AdGuard scriptlet rule\n *\n * @param rule UBO scriptlet rule\n * @returns array with one AdGuard scriptlet rule\n */\n var convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) {\n var domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG);\n var matchResult = rule.match(validator.UBO_SCRIPTLET_MASK_REG);\n var mask = Array.isArray(matchResult) ? matchResult[0] : null;\n var template;\n if (mask !== null && mask !== void 0 && mask.includes('@')) {\n template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = ADGUARD_SCRIPTLET_TEMPLATE;\n }\n var argsStr = getStringInBraces(rule);\n var parsedArgs = splitArgs(argsStr);\n var scriptletName = parsedArgs[0].includes(UBO_SCRIPTLET_JS_ENDING) ? \"ubo-\".concat(parsedArgs[0]) : \"ubo-\".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING);\n if (REMOVE_ATTR_ALIASES.includes(scriptletName) || REMOVE_CLASS_ALIASES.includes(scriptletName)) {\n parsedArgs = validateRemoveAttrClassArgs(parsedArgs);\n }\n var args = parsedArgs.map(function (arg, index) {\n var outputArg = arg;\n if (index === 0) {\n outputArg = scriptletName;\n }\n // for example: example.org##+js(abort-current-inline-script, $, popup)\n if (arg === '$') {\n outputArg = '$$';\n }\n return outputArg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n var adgRule = replacePlaceholders(template, {\n domains,\n args\n });\n return [adgRule];\n };\n\n /**\n * Convert string of ABP snippet rule to AdGuard scriptlet rule\n *\n * @param rule ABP snippet rule\n * @returns array of AdGuard scriptlet rules, one or few items depends on Abp-rule\n */\n var convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) {\n var SEMICOLON_DIVIDER = /;(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/g;\n var mask = rule.includes(validator.ABP_SCRIPTLET_MASK) ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK;\n var template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n var domains = substringBefore(rule, mask);\n var args = substringAfter$1(rule, mask);\n\n /* eslint-disable @typescript-eslint/no-shadow */\n return args.split(SEMICOLON_DIVIDER)\n // abp-rule may have `;` at the end which makes last array item irrelevant\n // https://github.com/AdguardTeam/Scriptlets/issues/236\n .filter(isExisting).map(function (args) {\n return getAbpSnippetArguments(args).map(function (arg, index) {\n return index === 0 ? \"abp-\".concat(arg) : arg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n }).map(function (args) {\n return replacePlaceholders(template, {\n domains,\n args\n });\n });\n /* eslint-enable @typescript-eslint/no-shadow */\n };\n\n /**\n * Validates ADG scriptlet rule syntax.\n *\n * IMPORTANT! The method is not very fast as it parses the rule and checks its syntax.\n *\n * @param adgRuleText Single ADG scriptlet rule.\n *\n * @returns False if ADG scriptlet rule syntax is not valid\n * or `adgRuleText` is not an ADG scriptlet rule.\n */\n var isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) {\n if (!adgRuleText) {\n return false;\n }\n if (!validator.isAdgScriptletRule(adgRuleText)) {\n return false;\n }\n // isAdgScriptletRule() does not check the rule syntax\n var parsedRule;\n try {\n // parseRule() ensures that the rule syntax is valid\n // and it will throw an error if it is not\n parsedRule = parseRule(adgRuleText);\n return validator.isValidScriptletName(parsedRule.name);\n } catch (e) {\n return false;\n }\n };\n\n /**\n * Functions to validate if a given string corresponds to a scriptlet rule of a particular origin.\n */\n var OriginValidator = {\n [Origin.Ubo]: validator.isUboScriptletRule,\n [Origin.Abp]: validator.isAbpSnippetRule,\n [Origin.AdgValid]: isValidAdgScriptletRuleSyntax,\n [Origin.AdgInvalid]: function (r) {\n return validator.isAdgScriptletRule(r) && !isValidAdgScriptletRuleSyntax(r);\n }\n };\n\n // Functions to convert a given scriptlet rule from a mapped origin to an AdGuard rule\n var Converter = {\n [Origin.Ubo]: convertUboScriptletToAdg,\n [Origin.Abp]: convertAbpSnippetToAdg,\n [Origin.AdgValid]: function (r) {\n return [r];\n },\n [Origin.AdgInvalid]: function (r) {\n // eslint-disable-next-line no-console\n console.log(\"Invalid AdGuard scriptlet rule: \".concat(r));\n return [];\n }\n };\n\n /**\n * Returns rule origin name in a meaningful order.\n *\n * @param rule The rule string to check.\n * @returns Rule origin name or undefined if the rule has no valid origin.\n */\n var getRuleOrigin = function getRuleOrigin(rule) {\n return originNames.find(function (originName) {\n return OriginValidator[originName](rule);\n });\n };\n\n /**\n * Converts any scriptlet rule into AdGuard syntax rule.\n * Comments and non-scriptlet rules are returned without changes.\n *\n * @param rule Rule.\n *\n * @returns Array of AdGuard scriptlet rules: one array item for ADG and UBO or few items for ABP.\n * For the ADG `rule` validates its syntax, and returns an empty array if it is invalid.\n */\n var convertScriptletToAdg = function convertScriptletToAdg(rule) {\n if (validator.isComment(rule)) {\n return [rule];\n }\n\n // Determine rule's origin\n var originName = getRuleOrigin(rule);\n\n // if the origin is unknown, return rule unchanged\n // as it is a non-scriptlet rule\n if (!originName) {\n return [rule];\n }\n\n // Call converter of given origin\n return Converter[originName](rule);\n };\n\n /**\n * Converts AdGuard scriptlet rule to UBO syntax.\n *\n * @param rule AdGuard scriptlet rule\n * @returns UBO scriptlet rule\n * or undefined if `rule` is not valid AdGuard scriptlet rule.\n */\n var convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) {\n var res;\n if (validator.isAdgScriptletRule(rule)) {\n var _parseRule = parseRule(rule),\n parsedName = _parseRule.name,\n parsedParams = _parseRule.args;\n var preparedParams;\n if (parsedName === ADG_SET_CONSTANT_NAME\n // https://github.com/AdguardTeam/FiltersCompiler/issues/102\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING];\n } else if (parsedName === ADG_SET_CONSTANT_NAME\n // https://github.com/uBlockOrigin/uBlock-issues/issues/2411\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY];\n } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT];\n } else if (parsedName === ADG_PREVENT_FETCH_NAME\n // https://github.com/AdguardTeam/Scriptlets/issues/109\n && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) {\n preparedParams = [UBO_NO_FETCH_IF_WILDCARD];\n } else {\n preparedParams = parsedParams;\n }\n if (preparedParams && preparedParams.length > 0) {\n // escape all commas in params\n // https://github.com/AdguardTeam/FiltersCompiler/issues/185\n preparedParams = preparedParams.map(function (param) {\n if (param.includes(COMMA_SEPARATOR)) {\n return replaceAll(param, COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR);\n }\n return param;\n });\n }\n\n // object of name and aliases for the Adg-scriptlet\n var scriptletNames = Object.keys(scriptletList);\n var adgScriptletObject = scriptletNames.map(function (name) {\n return scriptletList[name];\n }).map(function (scriptlet) {\n var _scriptlet$names = _toArray(scriptlet.names),\n name = _scriptlet$names[0],\n aliases = _scriptlet$names.slice(1);\n return {\n name,\n aliases\n };\n }).find(function (el) {\n return el.name === parsedName || el.aliases.includes(parsedName);\n });\n var aliases = adgScriptletObject.aliases;\n if (aliases.length > 0) {\n var uboAlias = adgScriptletObject.aliases.find(function (alias) {\n return alias.includes(UBO_ALIAS_NAME_MARKER);\n });\n if (uboAlias) {\n var matchResult = rule.match(ADGUARD_SCRIPTLET_MASK_REG);\n var mask = Array.isArray(matchResult) ? matchResult[0] : null;\n var template;\n if (mask !== null && mask !== void 0 && mask.includes('@')) {\n template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = UBO_SCRIPTLET_TEMPLATE;\n }\n var domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG);\n var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '')\n // '.js' in the Ubo scriptlet name can be omitted\n // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets\n .replace(UBO_SCRIPTLET_JS_ENDING, '');\n var args = preparedParams.length > 0 ? \"\".concat(uboName, \", \").concat(preparedParams.join(\"\".concat(COMMA_SEPARATOR, \" \"))) : uboName;\n var uboRule = replacePlaceholders(template, {\n domains,\n args\n });\n res = uboRule;\n }\n }\n }\n return res;\n };\n\n /**\n * Returns scriptlet name from `rule`.\n *\n * @param rule AdGuard syntax scriptlet rule.\n * @returns Scriptlet name or null.\n */\n var getAdgScriptletName = function getAdgScriptletName(rule) {\n // get substring after '#//scriptlet('\n var buffer = substringAfter$1(rule, \"\".concat(ADG_SCRIPTLET_MASK, \"(\"));\n if (!buffer) {\n return null;\n }\n // get the quote used for the first scriptlet parameter which is a name\n var nameQuote = buffer[0];\n // delete the quote from the buffer\n buffer = buffer.slice(1);\n if (!buffer) {\n return null;\n }\n // get a supposed scriptlet name\n var name = substringBefore(buffer, nameQuote);\n return name === buffer ? null : name;\n };\n\n /**\n * 1. For ADG scriptlet checks whether the scriptlet syntax and name are valid.\n * 2. For UBO and ABP scriptlet first checks their compatibility with ADG\n * by converting them into ADG syntax, and after that checks the name.\n *\n * ADG or UBO rules are \"single-scriptlet\", but ABP rule may contain more than one snippet\n * so if at least one of them is not valid — whole `ruleText` rule is not valid too.\n *\n * @param ruleText Any scriptlet rule — ADG or UBO or ABP.\n *\n * @returns True if scriptlet name is valid in rule.\n */\n var isValidScriptletRule = function isValidScriptletRule(ruleText) {\n if (!ruleText) {\n return false;\n }\n\n // `ruleText` with ABP syntax may contain more than one snippet in one rule\n var rulesArray = convertScriptletToAdg(ruleText);\n\n // for ADG rule with invalid syntax convertScriptletToAdg() will return empty array\n if (rulesArray.length === 0) {\n return false;\n }\n\n // checking if each of parsed scriptlets is valid\n // if at least one of them is not valid - whole `ruleText` is not valid too\n var isValid = rulesArray.every(function (rule) {\n var name = getAdgScriptletName(rule);\n return name && validator.isValidScriptletName(name);\n });\n return isValid;\n };\n\n /**\n * Gets index and redirect resource marker from UBO/ADG modifiers array\n *\n * @param modifiers rule modifiers\n * @param redirectsData validator.REDIRECT_RULE_TYPES.(UBO|ADG)\n * @param rule rule string\n * @returns merker data object\n */\n var getMarkerData = function getMarkerData(modifiers, redirectsData, rule) {\n var redirectRuleMarker = redirectsData.redirectRuleMarker,\n redirectMarker = redirectsData.redirectMarker;\n var index;\n if (redirectRuleMarker) {\n index = modifiers.findIndex(function (m) {\n return m.includes(redirectRuleMarker);\n });\n if (index > -1) {\n return {\n index,\n marker: redirectRuleMarker\n };\n }\n }\n index = modifiers.findIndex(function (m) {\n return m.includes(redirectMarker);\n });\n if (index > -1) {\n return {\n index,\n marker: redirectMarker\n };\n }\n throw new Error(\"No redirect resource modifier found in rule: \".concat(rule));\n };\n\n /**\n * Converts Ubo redirect rule to Adg one\n *\n * @param rule ubo redirect rule\n * @returns converted adg rule\n */\n var convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) {\n var firstPartOfRule = substringBefore(rule, '$');\n var uboModifiers = validator.parseModifiers(rule);\n var uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule);\n var adgModifiers = uboModifiers.map(function (modifier, index) {\n if (index === uboMarkerData.index) {\n var uboName = substringAfter$1(modifier, uboMarkerData.marker);\n var adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName];\n var adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker;\n return \"\".concat(adgMarker).concat(adgName);\n }\n if (modifier === UBO_XHR_TYPE) {\n return ADG_XHR_TYPE;\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n\n /**\n * Converts Abp redirect rule to Adg one\n *\n * @param rule abp redirect rule\n * @returns converted adg rule\n */\n var convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) {\n var firstPartOfRule = substringBefore(rule, '$');\n var abpModifiers = validator.parseModifiers(rule);\n var adgModifiers = abpModifiers.map(function (modifier) {\n if (modifier.includes(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker)) {\n var abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker);\n var adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName];\n return \"\".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName);\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n\n /**\n * Converts redirect rule to AdGuard one\n *\n * @param {string} rule redirect rule\n * @returns converted adg rule\n */\n var convertRedirectToAdg = function convertRedirectToAdg(rule) {\n var result;\n if (validator.isUboRedirectCompatibleWithAdg(rule)) {\n result = convertUboRedirectToAdg(rule);\n } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) {\n result = convertAbpRedirectToAdg(rule);\n } else if (validator.isValidAdgRedirectRule(rule)) {\n result = rule;\n }\n return result;\n };\n\n /**\n * Converts Adg redirect rule to Ubo one\n * 1. Checks if there is Ubo analog for Adg rule\n * 2. Parses the rule and checks if there are any source type modifiers which are required by Ubo\n * and if there are no one we add it manually to the end.\n * Source types are chosen according to redirect name\n * e.g. ||ad.com^$redirect=,important ->> ||ad.com^$redirect=,important,script\n * 3. Replaces Adg redirect name by Ubo analog\n *\n * @param rule adg rule\n * @returns converted ubo rule\n * @throws on incompatible rule\n */\n var convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) {\n if (!validator.isAdgRedirectCompatibleWithUbo(rule)) {\n throw new Error(\"Unable to convert for uBO - unsupported redirect in rule: \".concat(rule));\n }\n var basePart = substringBefore(rule, '$');\n var adgModifiers = validator.parseModifiers(rule);\n var adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule);\n var adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length);\n if (!validator.hasValidContentType(rule)) {\n // add missed source types as content type modifiers\n var sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) {\n return el.NAME === adgRedirectName;\n });\n if (typeof sourceTypesData === 'undefined') {\n // eslint-disable-next-line max-len\n throw new Error(\"Unable to convert for uBO - no types to add for specific redirect in rule: \".concat(rule));\n }\n var additionModifiers = sourceTypesData.TYPES;\n adgModifiers.push(...additionModifiers);\n }\n var uboModifiers = adgModifiers.map(function (el, index) {\n if (index === adgMarkerData.index) {\n var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker;\n // eslint-disable-next-line max-len\n var uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName];\n return \"\".concat(uboMarker).concat(uboRedirectName);\n }\n return el;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(basePart, \"$\").concat(uboModifiers);\n };\n\n /**\n * Converts a redirect name to ADG compatible one, if possible\n *\n * @param name Redirect name to convert\n * @returns Converted ADG compatible redirect name or `undefined` if the redirect isn't supported\n */\n var convertRedirectNameToAdg = function convertRedirectNameToAdg(name) {\n var nameToCheck = name.trim();\n\n // Check if the redirect is already ADG compatible\n if (validator.REDIRECT_RULE_TYPES.ADG.compatibility[nameToCheck]) {\n return nameToCheck;\n }\n\n // Convert uBO redirects to ADG\n if (validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck]) {\n return validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck];\n }\n\n // Convert ABP redirects to ADG\n // AGTree parses '$rewrite=abp-resource:blank-js' as 'rewrite' modifier with\n // 'abp-resource:blank-js' value. So at this point we have to check if the\n // redirect name starts with 'abp-resource:' and remove it if it does.\n if (nameToCheck.startsWith(ABP_RESOURCE_MARKER)) {\n nameToCheck = nameToCheck.slice(ABP_RESOURCE_MARKER.length).trim();\n }\n\n // This also returns `undefined` if the redirect isn't supported\n return validator.REDIRECT_RULE_TYPES.ABP.compatibility[nameToCheck];\n };\n\n /**\n * @redirect google-analytics\n *\n * @description\n * Mocks Google's Analytics and Tag Manager APIs.\n * Covers functionality of\n * the [obsolete googletagmanager-gtm redirect](https://github.com/AdguardTeam/Scriptlets/issues/127).\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_analytics.js\n *\n * ### Examples\n *\n * ```adblock\n * ||google-analytics.com/analytics.js$script,redirect=google-analytics\n * ||googletagmanager.com/gtm.js$script,redirect=google-analytics\n * ```\n *\n * @added v1.0.10.\n */\n function GoogleAnalytics(source) {\n // eslint-disable-next-line func-names\n var Tracker = function Tracker() {}; // constructor\n var proto = Tracker.prototype;\n proto.get = noopFunc;\n proto.set = noopFunc;\n proto.send = noopFunc;\n var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga';\n // a -- fake arg for 'ga.length < 1' antiadblock checking\n // eslint-disable-next-line no-unused-vars\n function ga(a) {\n var len = arguments.length;\n if (len === 0) {\n return;\n }\n // eslint-disable-next-line prefer-rest-params\n var lastArg = arguments[len - 1];\n var replacer;\n if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') {\n replacer = lastArg.hitCallback;\n } else if (typeof lastArg === 'function') {\n // https://github.com/AdguardTeam/Scriptlets/issues/98\n replacer = function replacer() {\n lastArg(ga.create());\n };\n }\n try {\n setTimeout(replacer, 1);\n // eslint-disable-next-line no-empty\n } catch (ex) {}\n }\n ga.create = function () {\n return new Tracker();\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/134\n ga.getByName = function () {\n return new Tracker();\n };\n ga.getAll = function () {\n return [new Tracker()];\n };\n ga.remove = noopFunc;\n ga.loaded = true;\n window[googleAnalyticsName] = ga;\n var _window = window,\n dataLayer = _window.dataLayer,\n google_optimize = _window.google_optimize; // eslint-disable-line camelcase\n if (dataLayer instanceof Object === false) {\n return;\n }\n if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') {\n dataLayer.hide.end();\n }\n\n /**\n * checks data object and delays callback\n *\n * @param {object|Array} dataObj gtag payload\n * @param {string} funcName callback prop name\n */\n var handleCallback = function handleCallback(dataObj, funcName) {\n if (dataObj && typeof dataObj[funcName] === 'function') {\n setTimeout(dataObj[funcName]);\n }\n };\n if (typeof dataLayer.push === 'function') {\n dataLayer.push = function (data) {\n if (data instanceof Object) {\n handleCallback(data, 'eventCallback');\n // eslint-disable-next-line no-restricted-syntax, guard-for-in\n for (var key in data) {\n handleCallback(data[key], 'event_callback');\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) {\n [].push.call(window.dataLayer, data);\n }\n }\n if (Array.isArray(data)) {\n data.forEach(function (arg) {\n handleCallback(arg, 'callback');\n });\n }\n return noopFunc;\n };\n }\n\n // https://github.com/AdguardTeam/Scriptlets/issues/81\n // eslint-disable-next-line camelcase\n if (google_optimize instanceof Object && typeof google_optimize.get === 'function') {\n var googleOptimizeWrapper = {\n get: noopFunc\n };\n window.google_optimize = googleOptimizeWrapper;\n }\n hit(source);\n }\n GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js',\n // https://github.com/AdguardTeam/Scriptlets/issues/127\n 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js'];\n GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray];\n\n /* eslint-disable no-underscore-dangle */\n\n /**\n * @redirect google-analytics-ga\n *\n * @description\n * Mocks old Google Analytics API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_ga.js\n *\n * ### Examples\n *\n * ```adblock\n * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga\n * ```\n *\n * @added v1.0.10.\n */\n function GoogleAnalyticsGa(source) {\n // Gaq constructor\n function Gaq() {}\n Gaq.prototype.Na = noopFunc;\n Gaq.prototype.O = noopFunc;\n Gaq.prototype.Sa = noopFunc;\n Gaq.prototype.Ta = noopFunc;\n Gaq.prototype.Va = noopFunc;\n Gaq.prototype._createAsyncTracker = noopFunc;\n Gaq.prototype._getAsyncTracker = noopFunc;\n Gaq.prototype._getPlugin = noopFunc;\n Gaq.prototype.push = function (data) {\n if (typeof data === 'function') {\n data();\n return;\n }\n if (Array.isArray(data) === false) {\n return;\n }\n // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link\n // https://github.com/uBlockOrigin/uBlock-issues/issues/1807\n if (typeof data[0] === 'string' && /(^|\\.)_link$/.test(data[0]) && typeof data[1] === 'string') {\n window.location.assign(data[1]);\n }\n // https://github.com/gorhill/uBlock/issues/2162\n if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') {\n data[2]();\n }\n };\n var gaq = new Gaq();\n var asyncTrackers = window._gaq || [];\n if (Array.isArray(asyncTrackers)) {\n while (asyncTrackers[0]) {\n gaq.push(asyncTrackers.shift());\n }\n }\n // eslint-disable-next-line no-multi-assign\n window._gaq = gaq.qf = gaq;\n\n // Gat constructor\n function Gat() {}\n\n // Mock tracker api\n var api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode'];\n var tracker = api.reduce(function (res, funcName) {\n res[funcName] = noopFunc;\n return res;\n }, {});\n tracker._getLinkerUrl = function (a) {\n return a;\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/154\n tracker._link = function (url) {\n if (typeof url !== 'string') {\n return;\n }\n try {\n window.location.assign(url);\n } catch (e) {\n logMessage(source, e);\n }\n };\n Gat.prototype._anonymizeIP = noopFunc;\n Gat.prototype._createTracker = noopFunc;\n Gat.prototype._forceSSL = noopFunc;\n Gat.prototype._getPlugin = noopFunc;\n Gat.prototype._getTracker = function () {\n return tracker;\n };\n Gat.prototype._getTrackerByName = function () {\n return tracker;\n };\n Gat.prototype._getTrackers = noopFunc;\n Gat.prototype.aa = noopFunc;\n Gat.prototype.ab = noopFunc;\n Gat.prototype.hb = noopFunc;\n Gat.prototype.la = noopFunc;\n Gat.prototype.oa = noopFunc;\n Gat.prototype.pa = noopFunc;\n Gat.prototype.u = noopFunc;\n var gat = new Gat();\n window._gat = gat;\n hit(source);\n }\n GoogleAnalyticsGa.names = ['google-analytics-ga', 'ubo-google-analytics_ga.js', 'google-analytics_ga.js'];\n GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @redirect googlesyndication-adsbygoogle\n *\n * @description\n * Mocks Google AdSense API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googlesyndication_adsbygoogle.js\n *\n * ### Examples\n *\n * ```adblock\n * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle\n * ```\n *\n * @added v1.0.10.\n */\n /* eslint-enable max-len */\n function GoogleSyndicationAdsByGoogle(source) {\n window.adsbygoogle = {\n // https://github.com/AdguardTeam/Scriptlets/issues/113\n // length: 0,\n loaded: true,\n // https://github.com/AdguardTeam/Scriptlets/issues/184\n push(arg) {\n if (typeof this.length === 'undefined') {\n this.length = 0;\n this.length += 1;\n }\n if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) {\n var key = _Object$keys[_i];\n if (typeof arg[key] === 'function') {\n try {\n // https://github.com/AdguardTeam/Scriptlets/issues/252\n // argument \"{}\" is needed to fix issue with undefined argument\n arg[key].call(this, {});\n } catch (_unused) {\n /* empty */\n }\n }\n }\n }\n }\n };\n var adElems = document.querySelectorAll('.adsbygoogle');\n var css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;';\n var statusAttrName = 'data-adsbygoogle-status';\n var ASWIFT_IFRAME_MARKER = 'aswift_';\n var GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_';\n var executed = false;\n for (var i = 0; i < adElems.length; i += 1) {\n var adElemChildNodes = adElems[i].childNodes;\n var childNodesQuantity = adElemChildNodes.length;\n // childNodes of .adsbygoogle can be defined if scriptlet was executed before\n // so we should check that childNodes are exactly defined by us\n // TODO: remake after scriptlets context developing in 1.3\n var areIframesDefined = false;\n if (childNodesQuantity > 0) {\n // it should be only 2 child iframes if scriptlet was executed\n areIframesDefined = childNodesQuantity === 2\n // the first of child nodes should be aswift iframe\n && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.includes(ASWIFT_IFRAME_MARKER)\n // the second of child nodes should be google_ads iframe\n && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.includes(GOOGLE_ADS_IFRAME_MARKER);\n }\n if (!areIframesDefined) {\n // here we do the job if scriptlet has not been executed earlier\n adElems[i].setAttribute(statusAttrName, 'done');\n var aswiftIframe = document.createElement('iframe');\n aswiftIframe.id = \"\".concat(ASWIFT_IFRAME_MARKER).concat(i);\n aswiftIframe.style = css;\n adElems[i].appendChild(aswiftIframe);\n var innerAswiftIframe = document.createElement('iframe');\n aswiftIframe.contentWindow.document.body.appendChild(innerAswiftIframe);\n var googleadsIframe = document.createElement('iframe');\n googleadsIframe.id = \"\".concat(GOOGLE_ADS_IFRAME_MARKER).concat(i);\n googleadsIframe.style = css;\n adElems[i].appendChild(googleadsIframe);\n var innerGoogleadsIframe = document.createElement('iframe');\n googleadsIframe.contentWindow.document.body.appendChild(innerGoogleadsIframe);\n executed = true;\n }\n }\n if (executed) {\n hit(source);\n }\n }\n GoogleSyndicationAdsByGoogle.names = ['googlesyndication-adsbygoogle', 'ubo-googlesyndication_adsbygoogle.js', 'googlesyndication_adsbygoogle.js'];\n GoogleSyndicationAdsByGoogle.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect googletagservices-gpt\n *\n * @description\n * Mocks Google Publisher Tag API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googletagservices_gpt.js\n *\n * ### Examples\n *\n * ```adblock\n * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt\n * ```\n *\n * @added v1.0.10.\n */\n function GoogleTagServicesGpt(source) {\n var slots = new Map();\n var slotsById = new Map();\n var slotsPerPath = new Map();\n var slotCreatives = new Map();\n var eventCallbacks = new Map();\n var gTargeting = new Map();\n var addEventListener = function addEventListener(name, listener) {\n if (!eventCallbacks.has(name)) {\n eventCallbacks.set(name, new Set());\n }\n eventCallbacks.get(name).add(listener);\n return this;\n };\n var removeEventListener = function removeEventListener(name, listener) {\n if (eventCallbacks.has(name)) {\n return eventCallbacks.get(name).delete(listener);\n }\n return false;\n };\n var fireSlotEvent = function fireSlotEvent(name, slot) {\n return new Promise(function (resolve) {\n requestAnimationFrame(function () {\n var size = [0, 0];\n var callbacksSet = eventCallbacks.get(name) || [];\n var callbackArray = Array.from(callbacksSet);\n for (var i = 0; i < callbackArray.length; i += 1) {\n callbackArray[i]({\n isEmpty: true,\n size,\n slot\n });\n }\n resolve();\n });\n });\n };\n var emptySlotElement = function emptySlotElement(slot) {\n var node = document.getElementById(slot.getSlotElementId());\n while (node !== null && node !== void 0 && node.lastChild) {\n node.lastChild.remove();\n }\n };\n var recreateIframeForSlot = function recreateIframeForSlot(slot) {\n var _document$getElementB;\n var eid = \"google_ads_iframe_\".concat(slot.getId());\n (_document$getElementB = document.getElementById(eid)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();\n var node = document.getElementById(slot.getSlotElementId());\n if (node) {\n var f = document.createElement('iframe');\n f.id = eid;\n f.srcdoc = '';\n f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0';\n f.setAttribute('width', 0);\n f.setAttribute('height', 0);\n // https://github.com/AdguardTeam/Scriptlets/issues/259\n f.setAttribute('data-load-complete', true);\n f.setAttribute('data-google-container-id', true);\n f.setAttribute('sandbox', '');\n node.appendChild(f);\n }\n };\n var displaySlot = function displaySlot(slot) {\n if (!slot) {\n return;\n }\n var id = slot.getSlotElementId();\n if (!document.getElementById(id)) {\n return;\n }\n var parent = document.getElementById(id);\n if (parent) {\n parent.appendChild(document.createElement('div'));\n }\n emptySlotElement(slot);\n recreateIframeForSlot(slot);\n fireSlotEvent('slotRenderEnded', slot);\n fireSlotEvent('slotRequested', slot);\n fireSlotEvent('slotResponseReceived', slot);\n fireSlotEvent('slotOnload', slot);\n fireSlotEvent('impressionViewable', slot);\n };\n var companionAdsService = {\n addEventListener,\n removeEventListener,\n enableSyncLoading: noopFunc,\n setRefreshUnfilledSlots: noopFunc,\n getSlots: noopArray\n };\n var contentService = {\n addEventListener,\n removeEventListener,\n setContent: noopFunc\n };\n function PassbackSlot() {} // constructor\n\n PassbackSlot.prototype.display = noopFunc;\n PassbackSlot.prototype.get = noopNull;\n PassbackSlot.prototype.set = noopThis;\n PassbackSlot.prototype.setClickUrl = noopThis;\n PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis;\n PassbackSlot.prototype.setTargeting = noopThis;\n PassbackSlot.prototype.updateTargetingFromMap = noopThis;\n function SizeMappingBuilder() {} // constructor\n SizeMappingBuilder.prototype.addSize = noopThis;\n SizeMappingBuilder.prototype.build = noopNull;\n var getTargetingValue = function getTargetingValue(v) {\n if (typeof v === 'string') {\n return [v];\n }\n try {\n return Array.prototype.flat.call(v);\n } catch (_unused) {\n // do nothing\n }\n return [];\n };\n var updateTargeting = function updateTargeting(targeting, map) {\n if (typeof map === 'object') {\n for (var key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n targeting.set(key, getTargetingValue(map[key]));\n }\n }\n }\n };\n var defineSlot = function defineSlot(adUnitPath, creatives, optDiv) {\n if (slotsById.has(optDiv)) {\n var _document$getElementB2;\n (_document$getElementB2 = document.getElementById(optDiv)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.remove();\n return slotsById.get(optDiv);\n }\n var attributes = new Map();\n var targeting = new Map();\n var exclusions = new Set();\n var response = {\n advertiserId: undefined,\n campaignId: undefined,\n creativeId: undefined,\n creativeTemplateId: undefined,\n lineItemId: undefined\n };\n var sizes = [{\n getHeight: function getHeight() {\n return 2;\n },\n getWidth: function getWidth() {\n return 2;\n }\n }];\n var num = (slotsPerPath.get(adUnitPath) || 0) + 1;\n slotsPerPath.set(adUnitPath, num);\n var id = \"\".concat(adUnitPath, \"_\").concat(num);\n var clickUrl = '';\n var collapseEmptyDiv = null;\n var services = new Set();\n var slot = {\n addService(e) {\n services.add(e);\n return slot;\n },\n clearCategoryExclusions: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n targeting.clear();\n } else {\n targeting.delete(k);\n }\n },\n defineSizeMapping(mapping) {\n slotCreatives.set(optDiv, mapping);\n return this;\n },\n get: function get(k) {\n return attributes.get(k);\n },\n getAdUnitPath: function getAdUnitPath() {\n return adUnitPath;\n },\n getAttributeKeys: function getAttributeKeys() {\n return Array.from(attributes.keys());\n },\n getCategoryExclusions: function getCategoryExclusions() {\n return Array.from(exclusions);\n },\n getClickUrl: function getClickUrl() {\n return clickUrl;\n },\n getCollapseEmptyDiv: function getCollapseEmptyDiv() {\n return collapseEmptyDiv;\n },\n getContentUrl: function getContentUrl() {\n return '';\n },\n getDivStartsCollapsed: function getDivStartsCollapsed() {\n return null;\n },\n getDomId: function getDomId() {\n return optDiv;\n },\n getEscapedQemQueryId: function getEscapedQemQueryId() {\n return '';\n },\n getFirstLook: function getFirstLook() {\n return 0;\n },\n getId: function getId() {\n return id;\n },\n getHtml: function getHtml() {\n return '';\n },\n getName: function getName() {\n return id;\n },\n getOutOfPage: function getOutOfPage() {\n return false;\n },\n getResponseInformation: function getResponseInformation() {\n return response;\n },\n getServices: function getServices() {\n return Array.from(services);\n },\n getSizes: function getSizes() {\n return sizes;\n },\n getSlotElementId: function getSlotElementId() {\n return optDiv;\n },\n getSlotId: function getSlotId() {\n return slot;\n },\n getTargeting: function getTargeting(k) {\n return targeting.get(k) || gTargeting.get(k) || [];\n },\n getTargetingKeys: function getTargetingKeys() {\n return Array.from(new Set(Array.of(...gTargeting.keys(), ...targeting.keys())));\n },\n getTargetingMap: function getTargetingMap() {\n return Object.assign(Object.fromEntries(gTargeting.entries()), Object.fromEntries(targeting.entries()));\n },\n set(k, v) {\n attributes.set(k, v);\n return slot;\n },\n setCategoryExclusion(e) {\n exclusions.add(e);\n return slot;\n },\n setClickUrl(u) {\n clickUrl = u;\n return slot;\n },\n setCollapseEmptyDiv(v) {\n collapseEmptyDiv = !!v;\n return slot;\n },\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting(k, v) {\n targeting.set(k, getTargetingValue(v));\n return slot;\n },\n toString: function toString() {\n return id;\n },\n updateTargetingFromMap(map) {\n updateTargeting(targeting, map);\n return slot;\n }\n };\n slots.set(adUnitPath, slot);\n slotsById.set(optDiv, slot);\n slotCreatives.set(optDiv, creatives);\n return slot;\n };\n var pubAdsService = {\n addEventListener,\n removeEventListener,\n clear: noopFunc,\n clearCategoryExclusions: noopThis,\n clearTagForChildDirectedTreatment: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n gTargeting.clear();\n } else {\n gTargeting.delete(k);\n }\n },\n collapseEmptyDivs: noopFunc,\n defineOutOfPagePassback() {\n return new PassbackSlot();\n },\n definePassback() {\n return new PassbackSlot();\n },\n disableInitialLoad: noopFunc,\n display: noopFunc,\n enableAsyncRendering: noopFunc,\n enableLazyLoad: noopFunc,\n enableSingleRequest: noopFunc,\n enableSyncRendering: noopFunc,\n enableVideoAds: noopFunc,\n get: noopNull,\n getAttributeKeys: noopArray,\n getTargeting: noopArray,\n getTargetingKeys: noopArray,\n getSlots: noopArray,\n isInitialLoadDisabled: trueFunc,\n refresh: noopFunc,\n set: noopThis,\n setCategoryExclusion: noopThis,\n setCentering: noopFunc,\n setCookieOptions: noopThis,\n setForceSafeFrame: noopThis,\n setLocation: noopThis,\n setPublisherProvidedId: noopThis,\n setRequestNonPersonalizedAds: noopThis,\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting: noopThis,\n setVideoContent: noopThis,\n updateCorrelator: noopFunc\n };\n var _window = window,\n _window$googletag = _window.googletag,\n googletag = _window$googletag === void 0 ? {} : _window$googletag;\n var _googletag$cmd = googletag.cmd,\n cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd;\n googletag.apiReady = true;\n googletag.cmd = [];\n googletag.cmd.push = function (a) {\n try {\n a();\n // eslint-disable-next-line no-empty\n } catch (ex) {}\n return 1;\n };\n googletag.companionAds = function () {\n return companionAdsService;\n };\n googletag.content = function () {\n return contentService;\n };\n googletag.defineOutOfPageSlot = defineSlot;\n googletag.defineSlot = defineSlot;\n googletag.destroySlots = function () {\n slots.clear();\n slotsById.clear();\n };\n googletag.disablePublisherConsole = noopFunc;\n googletag.display = function (arg) {\n var id;\n if (arg !== null && arg !== void 0 && arg.getSlotElementId) {\n id = arg.getSlotElementId();\n } else if (arg !== null && arg !== void 0 && arg.nodeType) {\n id = arg.id;\n } else {\n id = String(arg);\n }\n displaySlot(slotsById.get(id));\n };\n googletag.enableServices = noopFunc;\n googletag.getVersion = noopStr;\n googletag.pubads = function () {\n return pubAdsService;\n };\n googletag.pubadsReady = true;\n googletag.setAdIframeTitle = noopFunc;\n googletag.sizeMapping = function () {\n return new SizeMappingBuilder();\n };\n window.googletag = googletag;\n while (cmd.length !== 0) {\n googletag.cmd.push(cmd.shift());\n }\n hit(source);\n }\n GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js'];\n GoogleTagServicesGpt.injections = [hit, noopFunc, noopThis, noopNull, noopArray, noopStr, trueFunc];\n\n /**\n * @redirect scorecardresearch-beacon\n *\n * @description\n * Mocks Scorecard Research API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/scorecardresearch_beacon.js\n *\n * ### Examples\n *\n * ```adblock\n * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon\n * ```\n *\n * @added v1.0.10.\n */\n function ScoreCardResearchBeacon(source) {\n window.COMSCORE = {\n purge() {\n // eslint-disable-next-line no-underscore-dangle\n window._comscore = [];\n },\n beacon() {}\n };\n hit(source);\n }\n ScoreCardResearchBeacon.names = ['scorecardresearch-beacon', 'ubo-scorecardresearch_beacon.js', 'scorecardresearch_beacon.js'];\n ScoreCardResearchBeacon.injections = [hit];\n\n /**\n * @redirect metrika-yandex-tag\n *\n * @description\n * Mocks Yandex Metrika API.\n * https://yandex.ru/support/metrica/objects/method-reference.html\n *\n * ### Examples\n *\n * ```adblock\n * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag\n * ```\n *\n * @added v1.0.10.\n */\n function metrikaYandexTag(source) {\n var asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = options.callback;\n var ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/addfileextension.html\n */\n var addFileExtension = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/extlink.html\n */\n var extLink = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/file.html\n */\n var file = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/get-client-id.html\n *\n * @param {string} id\n * @param {Function} cb\n */\n var getClientID = function getClientID(id, cb) {\n if (!cb) {\n return;\n }\n setTimeout(cb(null));\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/hit.html\n */\n var hitFunc = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/notbounce.html\n */\n var notBounce = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/params-method.html\n */\n var params = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/reachgoal.html\n *\n * @param {string} id\n * @param {string} target\n * @param {object} params\n * @param {Function} callback\n * @param {any} ctx\n */\n var reachGoal = function reachGoal(id, target, params, callback, ctx) {\n asyncCallbackFromOptions(null, null, {\n callback,\n ctx\n });\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/set-user-id.html\n */\n var setUserID = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/user-params.html\n */\n var userParams = noopFunc;\n\n // https://github.com/AdguardTeam/Scriptlets/issues/198\n var destruct = noopFunc;\n var api = {\n addFileExtension,\n extLink,\n file,\n getClientID,\n hit: hitFunc,\n notBounce,\n params,\n reachGoal,\n setUserID,\n userParams,\n destruct\n };\n function ym(id, funcName) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return api[funcName] && api[funcName](id, ...args);\n }\n function init(id) {\n // yaCounter object should provide api\n window[\"yaCounter\".concat(id)] = api;\n document.dispatchEvent(new Event(\"yacounter\".concat(id, \"inited\")));\n }\n if (typeof window.ym === 'undefined') {\n window.ym = ym;\n ym.a = [];\n } else if (window.ym && window.ym.a) {\n // Keep initial counters array intact\n ym.a = window.ym.a;\n window.ym = ym;\n window.ym.a.forEach(function (params) {\n var id = params[0];\n init(id);\n });\n }\n hit(source);\n }\n metrikaYandexTag.names = ['metrika-yandex-tag'];\n metrikaYandexTag.injections = [hit, noopFunc];\n\n /**\n * @redirect metrika-yandex-watch\n *\n * @description\n * Mocks the old Yandex Metrika API.\n * https://yandex.ru/support/metrica/objects/_method-reference.html\n *\n * ### Examples\n *\n * ```adblock\n * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch\n * ```\n *\n * @added v1.0.10.\n */\n function metrikaYandexWatch(source) {\n var cbName = 'yandex_metrika_callbacks';\n\n /**\n * Gets callback and its context from options and call it in async way\n *\n * @param {object} options Yandex Metrika API options\n */\n var asyncCallbackFromOptions = function asyncCallbackFromOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = options.callback;\n var ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n function Metrika() {} // constructor\n Metrika.counters = noopArray;\n // Methods without options\n Metrika.prototype.addFileExtension = noopFunc;\n Metrika.prototype.getClientID = noopFunc;\n Metrika.prototype.setUserID = noopFunc;\n Metrika.prototype.userParams = noopFunc;\n Metrika.prototype.params = noopFunc;\n Metrika.prototype.counters = noopArray;\n\n // Methods with options\n // The order of arguments should be kept in according to API\n Metrika.prototype.extLink = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.file = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.hit = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.reachGoal = function (target, params, cb, ctx) {\n asyncCallbackFromOptions({\n callback: cb,\n ctx\n });\n };\n Metrika.prototype.notBounce = asyncCallbackFromOptions;\n if (window.Ya) {\n window.Ya.Metrika = Metrika;\n } else {\n window.Ya = {\n Metrika\n };\n }\n if (window[cbName] && Array.isArray(window[cbName])) {\n window[cbName].forEach(function (func) {\n if (typeof func === 'function') {\n func();\n }\n });\n }\n hit(source);\n }\n metrikaYandexWatch.names = ['metrika-yandex-watch'];\n metrikaYandexWatch.injections = [hit, noopFunc, noopArray];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect pardot-1.0\n *\n * @description\n * Mocks the pd.js file of Salesforce.\n * https://pi.pardot.com/pd.js\n * https://developer.salesforce.com/docs/marketing/pardot/overview\n *\n * ### Examples\n *\n * ```adblock\n * ||pi.pardot.com/pd.js$script,redirect=pardot\n * ||pacedg.com.au/pd.js$redirect=pardot\n * ```\n *\n * @added v1.6.55.\n */\n\n function Pardot(source) {\n window.piVersion = '1.0.2';\n window.piScriptNum = 0;\n window.piScriptObj = [];\n window.checkNamespace = noopFunc;\n window.getPardotUrl = noopStr;\n window.piGetParameter = noopNull;\n window.piSetCookie = noopFunc;\n window.piGetCookie = noopStr;\n function piTracker() {\n window.pi = {\n tracker: {\n visitor_id: '',\n visitor_id_sign: '',\n pi_opt_in: '',\n campaign_id: ''\n }\n };\n window.piScriptNum += 1;\n }\n window.piResponse = noopFunc;\n window.piTracker = piTracker;\n piTracker();\n hit(source);\n }\n Pardot.names = ['pardot-1.0'];\n Pardot.injections = [hit, noopFunc, noopStr, noopNull];\n\n /**\n * @redirect prevent-bab\n *\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Mostly it is used as `scriptlet`.\n * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab).\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab.js\n *\n * ### Examples\n *\n * ```adblock\n * /blockadblock.$script,redirect=prevent-bab\n * ```\n *\n * @added v1.3.19.\n */\n var preventBab$1 = preventBab$2;\n preventBab$1.names = ['prevent-bab',\n // list of prevent-bab redirect aliases\n 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser'];\n\n /**\n * @redirect amazon-apstag\n *\n * @description\n * Mocks Amazon's apstag.js\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/amazon_apstag.js\n *\n * ### Examples\n *\n * ```adblock\n * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag\n * ```\n *\n * @added v1.2.3.\n */\n function AmazonApstag(source) {\n var apstagWrapper = {\n fetchBids(a, b) {\n if (typeof b === 'function') {\n b([]);\n }\n },\n init: noopFunc,\n setDisplayBids: noopFunc,\n targetingKeys: noopFunc\n };\n window.apstag = apstagWrapper;\n hit(source);\n }\n AmazonApstag.names = ['amazon-apstag', 'ubo-amazon_apstag.js', 'amazon_apstag.js'];\n AmazonApstag.injections = [hit, noopFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect matomo\n *\n * @description\n * Mocks the piwik.js file of Matomo (formerly Piwik).\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/piwik.js$script,redirect=matomo\n * ```\n *\n * @added v1.5.0.\n */\n\n function Matomo(source) {\n var Tracker = function Tracker() {};\n Tracker.prototype.setDoNotTrack = noopFunc;\n Tracker.prototype.setDomains = noopFunc;\n Tracker.prototype.setCustomDimension = noopFunc;\n Tracker.prototype.trackPageView = noopFunc;\n var AsyncTracker = function AsyncTracker() {};\n AsyncTracker.prototype.addListener = noopFunc;\n var matomoWrapper = {\n getTracker: Tracker,\n getAsyncTracker: AsyncTracker\n };\n window.Piwik = matomoWrapper;\n hit(source);\n }\n Matomo.names = ['matomo'];\n Matomo.injections = [hit, noopFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect fingerprintjs2\n *\n * @description\n * Mocks FingerprintJS v2\n * https://github.com/fingerprintjs\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint2.js\n *\n * ### Examples\n *\n * ```adblock\n * ||example.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2\n * ```\n *\n * @added v1.5.0.\n */\n function Fingerprintjs2(source) {\n var browserId = '';\n for (var i = 0; i < 8; i += 1) {\n browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n var Fingerprint2 = function Fingerprint2() {};\n Fingerprint2.get = function (options, callback) {\n if (!callback) {\n callback = options;\n }\n setTimeout(function () {\n if (callback) {\n callback(browserId, []);\n }\n }, 1);\n };\n Fingerprint2.prototype = {\n get: Fingerprint2.get\n };\n window.Fingerprint2 = Fingerprint2;\n hit(source);\n }\n Fingerprintjs2.names = ['fingerprintjs2',\n // redirect aliases are needed for conversion:\n // prefixed for us\n 'ubo-fingerprint2.js',\n // original ubo name\n 'fingerprint2.js'];\n Fingerprintjs2.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect fingerprintjs3\n *\n * @description\n * Mocks FingerprintJS v3\n * https://github.com/fingerprintjs\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint3.js\n *\n * ### Examples\n *\n * ```adblock\n * ||example.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3\n * ```\n *\n * @added v1.6.2.\n */\n function Fingerprintjs3(source) {\n var visitorId = function () {\n var id = '';\n for (var i = 0; i < 8; i += 1) {\n id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n return id;\n }();\n var FingerprintJS = function FingerprintJS() {};\n FingerprintJS.prototype = {\n load() {\n return Promise.resolve(new FingerprintJS());\n },\n get() {\n return Promise.resolve({\n visitorId\n });\n },\n hashComponents: noopStr\n };\n window.FingerprintJS = new FingerprintJS();\n hit(source);\n }\n Fingerprintjs3.names = ['fingerprintjs3',\n // redirect aliases are needed for conversion:\n // prefixed for us\n 'ubo-fingerprint3.js',\n // original ubo name\n 'fingerprint3.js'];\n Fingerprintjs3.injections = [hit, noopStr];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect gemius\n *\n * @description\n * Mocks Gemius Analytics.\n * https://flowplayer.com/developers/plugins/gemius\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/gplayer.js$script,redirect=gemius\n * ```\n *\n * @added v1.5.0.\n */\n function Gemius(source) {\n var GemiusPlayer = function GemiusPlayer() {};\n GemiusPlayer.prototype = {\n setVideoObject: noopFunc,\n newProgram: noopFunc,\n programEvent: noopFunc,\n newAd: noopFunc,\n adEvent: noopFunc\n };\n window.GemiusPlayer = GemiusPlayer;\n hit(source);\n }\n Gemius.names = ['gemius'];\n Gemius.injections = [hit, noopFunc];\n\n /**\n * @redirect ati-smarttag\n *\n * @description\n * Mocks AT Internat SmartTag.\n * https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/\n *\n * ### Examples\n *\n * ```adblock\n * ||example.com/assets/scripts/smarttag.js$script,redirect=ati-smarttag\n * ```\n *\n * @added v1.5.0.\n */\n function ATInternetSmartTag(source) {\n var setNoopFuncWrapper = {\n set: noopFunc\n };\n var sendNoopFuncWrapper = {\n send: noopFunc\n };\n var ecommerceWrapper = {\n displayCart: {\n products: setNoopFuncWrapper,\n cart: setNoopFuncWrapper\n },\n updateCart: {\n cart: setNoopFuncWrapper\n },\n displayProduct: {\n products: setNoopFuncWrapper\n },\n displayPageProduct: {\n products: setNoopFuncWrapper\n },\n addProduct: {\n products: setNoopFuncWrapper\n },\n removeProduct: {\n products: setNoopFuncWrapper\n }\n };\n\n // eslint-disable-next-line new-cap, func-names\n var tag = function tag() {};\n tag.prototype = {\n setConfig: noopFunc,\n setParam: noopFunc,\n dispatch: noopFunc,\n customVars: setNoopFuncWrapper,\n publisher: setNoopFuncWrapper,\n order: setNoopFuncWrapper,\n click: sendNoopFuncWrapper,\n clickListener: sendNoopFuncWrapper,\n internalSearch: {\n set: noopFunc,\n send: noopFunc\n },\n ecommerce: ecommerceWrapper,\n identifiedVisitor: {\n unset: noopFunc\n },\n page: {\n set: noopFunc,\n send: noopFunc\n },\n selfPromotion: {\n add: noopFunc,\n send: noopFunc\n },\n privacy: {\n setVisitorMode: noopFunc,\n getVisitorMode: noopFunc,\n hit: noopFunc\n },\n richMedia: {\n add: noopFunc,\n send: noopFunc,\n remove: noopFunc,\n removeAll: noopFunc\n }\n };\n var smartTagWrapper = {\n Tracker: {\n Tag: tag\n }\n };\n window.ATInternet = smartTagWrapper;\n hit(source);\n }\n ATInternetSmartTag.names = ['ati-smarttag'];\n ATInternetSmartTag.injections = [hit, noopFunc];\n\n /* eslint-disable consistent-return, no-eval */\n\n /**\n * @redirect prevent-bab2\n *\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Related UBO redirect:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab2.js\n *\n * See [redirect description](../wiki/about-redirects.md#prevent-bab2).\n *\n * ### Examples\n *\n * ```adblock\n * /blockadblock.$script,redirect=prevent-bab2\n * ```\n *\n * @added v1.5.0.\n */\n function preventBab2(source) {\n var script = document.currentScript;\n if (script === null) {\n return;\n }\n var url = script.src;\n if (typeof url !== 'string') {\n return;\n }\n var domainsStr = ['adclixx\\\\.net', 'adnetasia\\\\.com', 'adtrackers\\\\.net', 'bannertrack\\\\.net'].join('|');\n var matchStr = \"^https?://[\\\\w-]+\\\\.(\".concat(domainsStr, \")/.\");\n var domainsRegex = new RegExp(matchStr);\n if (domainsRegex.test(url) === false) {\n return;\n }\n window.nH7eXzOsG = 858;\n hit(source);\n }\n preventBab2.names = ['prevent-bab2',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nobab2.js'];\n preventBab2.injections = [hit];\n\n /* eslint-disable func-names, no-underscore-dangle */\n\n /**\n * @redirect google-ima3\n *\n * @description\n * Mocks the IMA SDK of Google.\n *\n * Related Mozilla shim:\n * https://searchfox.org/mozilla-central/source/browser/extensions/webcompat/shims/google-ima.js\n *\n * ### Examples\n *\n * ```adblock\n * ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima3\n * ```\n *\n * @added v1.6.2.\n */\n\n function GoogleIma3(source) {\n var _window$google$ima;\n var VERSION = '3.453.0';\n var ima = {};\n var AdDisplayContainer = function AdDisplayContainer() {};\n AdDisplayContainer.prototype.destroy = noopFunc;\n AdDisplayContainer.prototype.initialize = noopFunc;\n var ImaSdkSettings = function ImaSdkSettings() {};\n ImaSdkSettings.CompanionBackfillMode = {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n };\n ImaSdkSettings.VpaidMode = {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n };\n ImaSdkSettings.prototype = {\n c: true,\n f: {},\n i: false,\n l: '',\n p: '',\n r: 0,\n t: '',\n v: '',\n getCompanionBackfill: noopFunc,\n getDisableCustomPlaybackForIOS10Plus() {\n return this.i;\n },\n getDisabledFlashAds: function getDisabledFlashAds() {\n return true;\n },\n getFeatureFlags() {\n return this.f;\n },\n getLocale() {\n return this.l;\n },\n getNumRedirects() {\n return this.r;\n },\n getPlayerType() {\n return this.t;\n },\n getPlayerVersion() {\n return this.v;\n },\n getPpid() {\n return this.p;\n },\n getVpaidMode() {\n return this.C;\n },\n isCookiesEnabled() {\n return this.c;\n },\n isVpaidAdapter() {\n return this.M;\n },\n setCompanionBackfill: noopFunc,\n setAutoPlayAdBreaks(a) {\n this.K = a;\n },\n setCookiesEnabled(c) {\n this.c = !!c;\n },\n setDisableCustomPlaybackForIOS10Plus(i) {\n this.i = !!i;\n },\n setDisableFlashAds: noopFunc,\n setFeatureFlags(f) {\n this.f = !!f;\n },\n setIsVpaidAdapter(a) {\n this.M = a;\n },\n setLocale(l) {\n this.l = !!l;\n },\n setNumRedirects(r) {\n this.r = !!r;\n },\n setPageCorrelator(a) {\n this.R = a;\n },\n setPlayerType(t) {\n this.t = !!t;\n },\n setPlayerVersion(v) {\n this.v = !!v;\n },\n setPpid(p) {\n this.p = !!p;\n },\n setVpaidMode(a) {\n this.C = a;\n },\n setSessionId: noopFunc,\n setStreamCorrelator: noopFunc,\n setVpaidAllowed: noopFunc,\n CompanionBackfillMode: {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n },\n VpaidMode: {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n }\n };\n var EventHandler = function EventHandler() {\n this.listeners = new Map();\n this._dispatch = function (e) {\n var listeners = this.listeners.get(e.type) || [];\n // eslint-disable-next-line no-restricted-syntax\n for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) {\n var listener = _Array$from[_i];\n try {\n listener(e);\n } catch (r) {\n logMessage(source, r);\n }\n }\n };\n this.addEventListener = function (t, c) {\n if (!this.listeners.has(t)) {\n this.listeners.set(t, new Set());\n }\n this.listeners.get(t).add(c);\n };\n this.removeEventListener = function (t, c) {\n var _this$listeners$get;\n (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c);\n };\n };\n var AdsManager = new EventHandler();\n /* eslint-disable no-use-before-define */\n AdsManager.volume = 1;\n AdsManager.collapse = noopFunc;\n AdsManager.configureAdsManager = noopFunc;\n AdsManager.destroy = noopFunc;\n AdsManager.discardAdBreak = noopFunc;\n AdsManager.expand = noopFunc;\n AdsManager.focus = noopFunc;\n AdsManager.getAdSkippableState = function () {\n return false;\n };\n AdsManager.getCuePoints = function () {\n return [0];\n };\n AdsManager.getCurrentAd = function () {\n return currentAd;\n };\n AdsManager.getCurrentAdCuePoints = function () {\n return [];\n };\n AdsManager.getRemainingTime = function () {\n return 0;\n };\n AdsManager.getVolume = function () {\n return this.volume;\n };\n AdsManager.init = noopFunc;\n AdsManager.isCustomClickTrackingUsed = function () {\n return false;\n };\n AdsManager.isCustomPlaybackUsed = function () {\n return false;\n };\n AdsManager.pause = noopFunc;\n AdsManager.requestNextAdBreak = noopFunc;\n AdsManager.resize = noopFunc;\n AdsManager.resume = noopFunc;\n AdsManager.setVolume = function (v) {\n this.volume = v;\n };\n AdsManager.skip = noopFunc;\n AdsManager.start = function () {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) {\n var type = _arr[_i2];\n try {\n this._dispatch(new ima.AdEvent(type));\n } catch (e) {\n logMessage(source, e);\n }\n }\n };\n AdsManager.stop = noopFunc;\n AdsManager.updateAdsRenderingSettings = noopFunc;\n /* eslint-enable no-use-before-define */\n\n var manager = Object.create(AdsManager);\n var AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) {\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n };\n AdsManagerLoadedEvent.prototype = {\n getAdsManager: function getAdsManager() {\n return manager;\n },\n getUserRequestContext() {\n if (this.userRequestContext) {\n return this.userRequestContext;\n }\n return {};\n }\n };\n AdsManagerLoadedEvent.Type = {\n ADS_MANAGER_LOADED: 'adsManagerLoaded'\n };\n var AdsLoader = EventHandler;\n AdsLoader.prototype.settings = new ImaSdkSettings();\n AdsLoader.prototype.contentComplete = noopFunc;\n AdsLoader.prototype.destroy = noopFunc;\n AdsLoader.prototype.getSettings = function () {\n return this.settings;\n };\n AdsLoader.prototype.getVersion = function () {\n return VERSION;\n };\n AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) {\n var _this = this;\n requestAnimationFrame(function () {\n var ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED;\n var event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext);\n _this._dispatch(event);\n });\n var e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext);\n requestAnimationFrame(function () {\n _this._dispatch(new ima.AdErrorEvent(e));\n });\n };\n var AdsRenderingSettings = noopFunc;\n var AdsRequest = function AdsRequest() {};\n AdsRequest.prototype = {\n setAdWillAutoPlay: noopFunc,\n setAdWillPlayMuted: noopFunc,\n setContinuousPlayback: noopFunc\n };\n var AdPodInfo = function AdPodInfo() {};\n AdPodInfo.prototype = {\n getAdPosition: function getAdPosition() {\n return 1;\n },\n getIsBumper: function getIsBumper() {\n return false;\n },\n getMaxDuration: function getMaxDuration() {\n return -1;\n },\n getPodIndex: function getPodIndex() {\n return 1;\n },\n getTimeOffset: function getTimeOffset() {\n return 0;\n },\n getTotalAds: function getTotalAds() {\n return 1;\n }\n };\n var Ad = function Ad() {};\n Ad.prototype = {\n pi: new AdPodInfo(),\n getAdId: function getAdId() {\n return '';\n },\n getAdPodInfo() {\n return this.pi;\n },\n getAdSystem: function getAdSystem() {\n return '';\n },\n getAdvertiserName: function getAdvertiserName() {\n return '';\n },\n getApiFramework: function getApiFramework() {\n return null;\n },\n getCompanionAds: function getCompanionAds() {\n return [];\n },\n getContentType: function getContentType() {\n return '';\n },\n getCreativeAdId: function getCreativeAdId() {\n return '';\n },\n getDealId: function getDealId() {\n return '';\n },\n getDescription: function getDescription() {\n return '';\n },\n getDuration: function getDuration() {\n return 8.5;\n },\n getHeight: function getHeight() {\n return 0;\n },\n getMediaUrl: function getMediaUrl() {\n return null;\n },\n getMinSuggestedDuration: function getMinSuggestedDuration() {\n return -2;\n },\n getSkipTimeOffset: function getSkipTimeOffset() {\n return -1;\n },\n getSurveyUrl: function getSurveyUrl() {\n return null;\n },\n getTitle: function getTitle() {\n return '';\n },\n getTraffickingParametersString: function getTraffickingParametersString() {\n return '';\n },\n getUiElements: function getUiElements() {\n return [''];\n },\n getUniversalAdIdRegistry: function getUniversalAdIdRegistry() {\n return 'unknown';\n },\n getUniversalAdIds: function getUniversalAdIds() {\n return [''];\n },\n getUniversalAdIdValue: function getUniversalAdIdValue() {\n return 'unknown';\n },\n getVastMediaBitrate: function getVastMediaBitrate() {\n return 0;\n },\n getVastMediaHeight: function getVastMediaHeight() {\n return 0;\n },\n getVastMediaWidth: function getVastMediaWidth() {\n return 0;\n },\n getWidth: function getWidth() {\n return 0;\n },\n getWrapperAdIds: function getWrapperAdIds() {\n return [''];\n },\n getWrapperAdSystems: function getWrapperAdSystems() {\n return [''];\n },\n getWrapperCreativeIds: function getWrapperCreativeIds() {\n return [''];\n },\n isLinear: function isLinear() {\n return true;\n },\n isSkippable() {\n return true;\n }\n };\n var CompanionAd = function CompanionAd() {};\n CompanionAd.prototype = {\n getAdSlotId: function getAdSlotId() {\n return '';\n },\n getContent: function getContent() {\n return '';\n },\n getContentType: function getContentType() {\n return '';\n },\n getHeight: function getHeight() {\n return 1;\n },\n getWidth: function getWidth() {\n return 1;\n }\n };\n var AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) {\n this.errorCode = code;\n this.message = message;\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n this.getErrorCode = function () {\n return this.errorCode;\n };\n this.getInnerError = function () {};\n this.getMessage = function () {\n return this.message;\n };\n this.getType = function () {\n return this.type;\n };\n this.getVastErrorCode = function () {\n return this.vastErrorCode;\n };\n this.toString = function () {\n return \"AdError \".concat(this.errorCode, \": \").concat(this.message);\n };\n };\n AdError.ErrorCode = {};\n AdError.Type = {};\n var isEngadget = function isEngadget() {\n try {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) {\n var _ctx$getPlayer, _ctx$getPlayer$div;\n var ctx = _Object$values[_i3];\n // eslint-disable-next-line no-restricted-properties\n if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) {\n return true;\n }\n }\n } catch (e) {} // eslint-disable-line no-empty\n return false;\n };\n var currentAd = isEngadget() ? undefined : new Ad();\n var AdEvent = function AdEvent(type) {\n this.type = type;\n };\n AdEvent.prototype = {\n getAd: function getAd() {\n return currentAd;\n },\n getAdData: function getAdData() {}\n };\n AdEvent.Type = {\n AD_BREAK_READY: 'adBreakReady',\n AD_BUFFERING: 'adBuffering',\n AD_CAN_PLAY: 'adCanPlay',\n AD_METADATA: 'adMetadata',\n AD_PROGRESS: 'adProgress',\n ALL_ADS_COMPLETED: 'allAdsCompleted',\n CLICK: 'click',\n COMPLETE: 'complete',\n CONTENT_PAUSE_REQUESTED: 'contentPauseRequested',\n CONTENT_RESUME_REQUESTED: 'contentResumeRequested',\n DURATION_CHANGE: 'durationChange',\n EXPANDED_CHANGED: 'expandedChanged',\n FIRST_QUARTILE: 'firstQuartile',\n IMPRESSION: 'impression',\n INTERACTION: 'interaction',\n LINEAR_CHANGE: 'linearChange',\n LINEAR_CHANGED: 'linearChanged',\n LOADED: 'loaded',\n LOG: 'log',\n MIDPOINT: 'midpoint',\n PAUSED: 'pause',\n RESUMED: 'resume',\n SKIPPABLE_STATE_CHANGED: 'skippableStateChanged',\n SKIPPED: 'skip',\n STARTED: 'start',\n THIRD_QUARTILE: 'thirdQuartile',\n USER_CLOSE: 'userClose',\n VIDEO_CLICKED: 'videoClicked',\n VIDEO_ICON_CLICKED: 'videoIconClicked',\n VIEWABLE_IMPRESSION: 'viewable_impression',\n VOLUME_CHANGED: 'volumeChange',\n VOLUME_MUTED: 'mute'\n };\n var AdErrorEvent = function AdErrorEvent(error) {\n this.error = error;\n this.type = 'adError';\n this.getError = function () {\n return this.error;\n };\n this.getUserRequestContext = function () {\n var _this$error;\n if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) {\n return this.error.userRequestContext;\n }\n return {};\n };\n };\n AdErrorEvent.Type = {\n AD_ERROR: 'adError'\n };\n var CustomContentLoadedEvent = function CustomContentLoadedEvent() {};\n CustomContentLoadedEvent.Type = {\n CUSTOM_CONTENT_LOADED: 'deprecated-event'\n };\n var CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {};\n CompanionAdSelectionSettings.CreativeType = {\n ALL: 'All',\n FLASH: 'Flash',\n IMAGE: 'Image'\n };\n CompanionAdSelectionSettings.ResourceType = {\n ALL: 'All',\n HTML: 'Html',\n IFRAME: 'IFrame',\n STATIC: 'Static'\n };\n CompanionAdSelectionSettings.SizeCriteria = {\n IGNORE: 'IgnoreSize',\n SELECT_EXACT_MATCH: 'SelectExactMatch',\n SELECT_NEAR_MATCH: 'SelectNearMatch'\n };\n var AdCuePoints = function AdCuePoints() {};\n AdCuePoints.prototype = {\n getCuePoints: function getCuePoints() {\n return [];\n },\n getAdIdRegistry: function getAdIdRegistry() {\n return '';\n },\n getAdIsValue: function getAdIsValue() {\n return '';\n }\n };\n var AdProgressData = noopFunc;\n var UniversalAdIdInfo = function UniversalAdIdInfo() {};\n Object.assign(ima, {\n AdCuePoints,\n AdDisplayContainer,\n AdError,\n AdErrorEvent,\n AdEvent,\n AdPodInfo,\n AdProgressData,\n AdsLoader,\n AdsManager: manager,\n AdsManagerLoadedEvent,\n AdsRenderingSettings,\n AdsRequest,\n CompanionAd,\n CompanionAdSelectionSettings,\n CustomContentLoadedEvent,\n gptProxyInstance: {},\n ImaSdkSettings,\n OmidAccessMode: {\n DOMAIN: 'domain',\n FULL: 'full',\n LIMITED: 'limited'\n },\n settings: new ImaSdkSettings(),\n UiElements: {\n AD_ATTRIBUTION: 'adAttribution',\n COUNTDOWN: 'countdown'\n },\n UniversalAdIdInfo,\n VERSION,\n ViewMode: {\n FULLSCREEN: 'fullscreen',\n NORMAL: 'normal'\n }\n });\n if (!window.google) {\n window.google = {};\n }\n\n // Workaround for https://github.com/AdguardTeam/Scriptlets/issues/331\n // To avoid conflicts with the DAI SDK, we need to make sure that the\n // google.ima.dai namespace is not overwritten.\n // TODO: Later we should create a mock for the DAI SDK as well.\n // See https://github.com/AdguardTeam/Scriptlets/issues/239\n if ((_window$google$ima = window.google.ima) !== null && _window$google$ima !== void 0 && _window$google$ima.dai) {\n ima.dai = window.google.ima.dai;\n }\n window.google.ima = ima;\n hit(source);\n }\n GoogleIma3.names = ['google-ima3',\n // prefixed name\n 'ubo-google-ima.js',\n // original ubo name\n 'google-ima.js'];\n GoogleIma3.injections = [hit, noopFunc, logMessage];\n\n /* eslint-disable func-names, no-underscore-dangle */\n\n /**\n * @redirect didomi-loader\n *\n * @description\n * Mocks Didomi's CMP loader script.\n * https://developers.didomi.io/\n *\n * ### Examples\n *\n * ```adblock\n * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader\n * ```\n *\n * @added v1.6.2.\n */\n function DidomiLoader(source) {\n function UserConsentStatusForVendorSubscribe() {}\n UserConsentStatusForVendorSubscribe.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc;\n function UserConsentStatusForVendor() {}\n UserConsentStatusForVendor.prototype.first = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.subscribe = noopFunc;\n var DidomiWrapper = {\n isConsentRequired: falseFunc,\n getUserConsentStatusForPurpose: trueFunc,\n getUserConsentStatus: trueFunc,\n getUserStatus: noopFunc,\n getRequiredPurposes: noopArray,\n getUserConsentStatusForVendor: trueFunc,\n Purposes: {\n Cookies: 'cookies'\n },\n notice: {\n configure: noopFunc,\n hide: noopFunc,\n isVisible: falseFunc,\n show: noopFunc,\n showDataProcessing: trueFunc\n },\n isUserConsentStatusPartial: falseFunc,\n on() {\n return {\n actions: {},\n emitter: {},\n services: {},\n store: {}\n };\n },\n shouldConsentBeCollected: falseFunc,\n getUserConsentStatusForAll: noopFunc,\n getObservableOnUserConsentStatusForVendor() {\n return new UserConsentStatusForVendor();\n }\n };\n window.Didomi = DidomiWrapper;\n var didomiStateWrapper = {\n didomiExperimentId: '',\n didomiExperimentUserGroup: '',\n didomiGDPRApplies: 1,\n didomiIABConsent: '',\n didomiPurposesConsent: '',\n didomiPurposesConsentDenied: '',\n didomiPurposesConsentUnknown: '',\n didomiVendorsConsent: '',\n didomiVendorsConsentDenied: '',\n didomiVendorsConsentUnknown: '',\n didomiVendorsRawConsent: '',\n didomiVendorsRawConsentDenied: '',\n didomiVendorsRawConsentUnknown: ''\n };\n window.didomiState = didomiStateWrapper;\n var tcData = {\n eventStatus: 'tcloaded',\n gdprApplies: false,\n listenerId: noopFunc,\n vendor: {\n consents: []\n },\n purpose: {\n consents: []\n }\n };\n\n // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api\n var __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) {\n if (typeof callback !== 'function' || command === 'removeEventListener') {\n return;\n }\n callback(tcData, true);\n };\n window.__tcfapi = __tcfapiWrapper;\n var didomiEventListenersWrapper = {\n stub: true,\n push: noopFunc\n };\n window.didomiEventListeners = didomiEventListenersWrapper;\n var didomiOnReadyWrapper = {\n stub: true,\n push(arg) {\n if (typeof arg !== 'function') {\n return;\n }\n if (document.readyState !== 'complete') {\n window.addEventListener('load', function () {\n setTimeout(arg(window.Didomi));\n });\n } else {\n setTimeout(arg(window.Didomi));\n }\n }\n };\n window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper;\n if (Array.isArray(window.didomiOnReady)) {\n window.didomiOnReady.forEach(function (arg) {\n if (typeof arg === 'function') {\n try {\n setTimeout(arg(window.Didomi));\n } catch (e) {\n /* empty */\n }\n }\n });\n }\n hit(source);\n }\n DidomiLoader.names = ['didomi-loader'];\n DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect prebid\n *\n * @description\n * Mocks the prebid.js header bidding suit.\n * https://docs.prebid.org/\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/bd/hb/prebid.js$script,redirect=prebid\n * ```\n *\n * @added v1.6.2.\n */\n\n function Prebid(source) {\n var pushFunction = function pushFunction(arg) {\n if (typeof arg === 'function') {\n try {\n arg.call();\n } catch (ex) {\n /* empty */\n }\n }\n };\n var pbjsWrapper = {\n addAdUnits() {},\n adServers: {\n dfp: {\n // https://docs.prebid.org/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html\n // returns ad URL\n buildVideoUrl: noopStr\n }\n },\n adUnits: [],\n aliasBidder() {},\n cmd: [],\n enableAnalytics() {},\n getHighestCpmBids: noopArray,\n libLoaded: true,\n que: [],\n requestBids(arg) {\n if (arg instanceof Object && arg.bidsBackHandler) {\n try {\n arg.bidsBackHandler.call(); // https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html\n } catch (ex) {\n /* empty */\n }\n }\n },\n removeAdUnit() {},\n setBidderConfig() {},\n setConfig() {},\n setTargetingForGPTAsync() {}\n };\n pbjsWrapper.cmd.push = pushFunction;\n pbjsWrapper.que.push = pushFunction;\n window.pbjs = pbjsWrapper;\n hit(source);\n }\n Prebid.names = ['prebid'];\n Prebid.injections = [hit, noopFunc, noopStr, noopArray];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect prebid-ads\n *\n * @description\n * Sets predefined constants on a page:\n *\n * - `canRunAds`: `true`\n * - `isAdBlockActive`: `false`\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/assets/js/prebid-ads.js$script,redirect=prebid-ads\n * ```\n *\n * @added v1.6.2.\n */\n function prebidAds(source) {\n window.canRunAds = true;\n window.isAdBlockActive = false;\n hit(source);\n }\n prebidAds.names = ['prebid-ads', 'ubo-prebid-ads.js', 'prebid-ads.js'];\n prebidAds.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect naver-wcslog\n *\n * @description\n * Mocks wcslog.js of Naver Analytics.\n *\n * ### Examples\n *\n * ```adblock\n * ||wcs.naver.net/wcslog.js$script,redirect=naver-wcslog\n * ```\n *\n * @added v1.6.2.\n */\n\n function NaverWcslog(source) {\n window.wcs_add = {};\n window.wcs_do = noopFunc;\n window.wcs = {\n inflow: noopFunc\n };\n hit(source);\n }\n NaverWcslog.names = ['naver-wcslog'];\n NaverWcslog.injections = [hit, noopFunc];\n\n var redirectsList = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ATInternetSmartTag: ATInternetSmartTag,\n AmazonApstag: AmazonApstag,\n DidomiLoader: DidomiLoader,\n Fingerprintjs2: Fingerprintjs2,\n Fingerprintjs3: Fingerprintjs3,\n Gemius: Gemius,\n GoogleAnalytics: GoogleAnalytics,\n GoogleAnalyticsGa: GoogleAnalyticsGa,\n GoogleIma3: GoogleIma3,\n GoogleSyndicationAdsByGoogle: GoogleSyndicationAdsByGoogle,\n GoogleTagServicesGpt: GoogleTagServicesGpt,\n Matomo: Matomo,\n NaverWcslog: NaverWcslog,\n Pardot: Pardot,\n Prebid: Prebid,\n ScoreCardResearchBeacon: ScoreCardResearchBeacon,\n metrikaYandexTag: metrikaYandexTag,\n metrikaYandexWatch: metrikaYandexWatch,\n noeval: noeval$1,\n prebidAds: prebidAds,\n preventBab: preventBab$1,\n preventBab2: preventBab2,\n preventFab: preventFab$1,\n preventPopadsNet: preventPopadsNet$1,\n setPopadsDummy: setPopadsDummy$1\n });\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n }\n\n function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n }\n\n function _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n }\n\n function _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n\n function getDefaultExportFromCjs (x) {\n \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n }\n\n var jsYaml$2 = {};\n\n var loader$1 = {};\n\n var common$6 = {};\n\n function isNothing(subject) {\n return typeof subject === 'undefined' || subject === null;\n }\n function isObject(subject) {\n return typeof subject === 'object' && subject !== null;\n }\n function toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return [];\n return [sequence];\n }\n function extend(target, source) {\n var index, length, key, sourceKeys;\n if (source) {\n sourceKeys = Object.keys(source);\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n return target;\n }\n function repeat(string, count) {\n var result = '',\n cycle;\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n return result;\n }\n function isNegativeZero(number) {\n return number === 0 && Number.NEGATIVE_INFINITY === 1 / number;\n }\n common$6.isNothing = isNothing;\n common$6.isObject = isObject;\n common$6.toArray = toArray;\n common$6.repeat = repeat;\n common$6.isNegativeZero = isNegativeZero;\n common$6.extend = extend;\n\n function YAMLException$4(reason, mark) {\n // Super constructor\n Error.call(this);\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = new Error().stack || '';\n }\n }\n\n // Inherit from Error\n YAMLException$4.prototype = Object.create(Error.prototype);\n YAMLException$4.prototype.constructor = YAMLException$4;\n YAMLException$4.prototype.toString = function toString(compact) {\n var result = this.name + ': ';\n result += this.reason || '(unknown reason)';\n if (!compact && this.mark) {\n result += ' ' + this.mark.toString();\n }\n return result;\n };\n var exception = YAMLException$4;\n\n var common$5 = common$6;\n function Mark$1(name, buffer, position, line, column) {\n this.name = name;\n this.buffer = buffer;\n this.position = position;\n this.line = line;\n this.column = column;\n }\n Mark$1.prototype.getSnippet = function getSnippet(indent, maxLength) {\n var head, start, tail, end, snippet;\n if (!this.buffer) return null;\n indent = indent || 4;\n maxLength = maxLength || 75;\n head = '';\n start = this.position;\n while (start > 0 && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(start - 1)) === -1) {\n start -= 1;\n if (this.position - start > maxLength / 2 - 1) {\n head = ' ... ';\n start += 5;\n break;\n }\n }\n tail = '';\n end = this.position;\n while (end < this.buffer.length && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(end)) === -1) {\n end += 1;\n if (end - this.position > maxLength / 2 - 1) {\n tail = ' ... ';\n end -= 5;\n break;\n }\n }\n snippet = this.buffer.slice(start, end);\n return common$5.repeat(' ', indent) + head + snippet + tail + '\\n' + common$5.repeat(' ', indent + this.position - start + head.length) + '^';\n };\n Mark$1.prototype.toString = function toString(compact) {\n var snippet,\n where = '';\n if (this.name) {\n where += 'in \"' + this.name + '\" ';\n }\n where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);\n if (!compact) {\n snippet = this.getSnippet();\n if (snippet) {\n where += ':\\n' + snippet;\n }\n }\n return where;\n };\n var mark = Mark$1;\n\n var YAMLException$3 = exception;\n var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases'];\n var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping'];\n function compileStyleAliases(map) {\n var result = {};\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n return result;\n }\n function Type$h(tag, options) {\n options = options || {};\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new YAMLException$3('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () {\n return true;\n };\n this.construct = options['construct'] || function (data) {\n return data;\n };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new YAMLException$3('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n }\n var type = Type$h;\n\n /*eslint-disable max-len*/\n\n var common$4 = common$6;\n var YAMLException$2 = exception;\n var Type$g = type;\n function compileList(schema, name, result) {\n var exclude = [];\n schema.include.forEach(function (includedSchema) {\n result = compileList(includedSchema, name, result);\n });\n schema[name].forEach(function (currentType) {\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {\n exclude.push(previousIndex);\n }\n });\n result.push(currentType);\n });\n return result.filter(function (type, index) {\n return exclude.indexOf(index) === -1;\n });\n }\n function compileMap( /* lists... */\n ) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {}\n },\n index,\n length;\n function collectType(type) {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n }\n function Schema$5(definition) {\n this.include = definition.include || [];\n this.implicit = definition.implicit || [];\n this.explicit = definition.explicit || [];\n this.implicit.forEach(function (type) {\n if (type.loadKind && type.loadKind !== 'scalar') {\n throw new YAMLException$2('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n });\n this.compiledImplicit = compileList(this, 'implicit', []);\n this.compiledExplicit = compileList(this, 'explicit', []);\n this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);\n }\n Schema$5.DEFAULT = null;\n Schema$5.create = function createSchema() {\n var schemas, types;\n switch (arguments.length) {\n case 1:\n schemas = Schema$5.DEFAULT;\n types = arguments[0];\n break;\n case 2:\n schemas = arguments[0];\n types = arguments[1];\n break;\n default:\n throw new YAMLException$2('Wrong number of arguments for Schema.create function');\n }\n schemas = common$4.toArray(schemas);\n types = common$4.toArray(types);\n if (!schemas.every(function (schema) {\n return schema instanceof Schema$5;\n })) {\n throw new YAMLException$2('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');\n }\n if (!types.every(function (type) {\n return type instanceof Type$g;\n })) {\n throw new YAMLException$2('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n return new Schema$5({\n include: schemas,\n explicit: types\n });\n };\n var schema = Schema$5;\n\n var Type$f = type;\n var str = new Type$f('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function construct(data) {\n return data !== null ? data : '';\n }\n });\n\n var Type$e = type;\n var seq = new Type$e('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function construct(data) {\n return data !== null ? data : [];\n }\n });\n\n var Type$d = type;\n var map = new Type$d('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function construct(data) {\n return data !== null ? data : {};\n }\n });\n\n var Schema$4 = schema;\n var failsafe = new Schema$4({\n explicit: [str, seq, map]\n });\n\n var Type$c = type;\n function resolveYamlNull(data) {\n if (data === null) return true;\n var max = data.length;\n return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL');\n }\n function constructYamlNull() {\n return null;\n }\n function isNull(object) {\n return object === null;\n }\n var _null = new Type$c('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function canonical() {\n return '~';\n },\n lowercase: function lowercase() {\n return 'null';\n },\n uppercase: function uppercase() {\n return 'NULL';\n },\n camelcase: function camelcase() {\n return 'Null';\n }\n },\n defaultStyle: 'lowercase'\n });\n\n var Type$b = type;\n function resolveYamlBoolean(data) {\n if (data === null) return false;\n var max = data.length;\n return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE');\n }\n function constructYamlBoolean(data) {\n return data === 'true' || data === 'True' || data === 'TRUE';\n }\n function isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n }\n var bool = new Type$b('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function lowercase(object) {\n return object ? 'true' : 'false';\n },\n uppercase: function uppercase(object) {\n return object ? 'TRUE' : 'FALSE';\n },\n camelcase: function camelcase(object) {\n return object ? 'True' : 'False';\n }\n },\n defaultStyle: 'lowercase'\n });\n\n var common$3 = common$6;\n var Type$a = type;\n function isHexCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */;\n }\n\n function isOctCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */;\n }\n\n function isDecCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */;\n }\n\n function resolveYamlInteger(data) {\n if (data === null) return false;\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n if (!max) return false;\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n if (ch === 'x') {\n // base 16\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n // base 8\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n // base 10 (except 0) or base 60\n\n // value should not start with `_`;\n if (ch === '_') return false;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch === ':') break;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n // if !base60 - done;\n if (ch !== ':') return true;\n\n // base60 almost not used, no needs to optimize\n return /^(:[0-5]?[0-9])+$/.test(data.slice(index));\n }\n function constructYamlInteger(data) {\n var value = data,\n sign = 1,\n ch,\n base,\n digits = [];\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n ch = value[0];\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n if (value === '0') return 0;\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value, 16);\n return sign * parseInt(value, 8);\n }\n if (value.indexOf(':') !== -1) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseInt(v, 10));\n });\n value = 0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseInt(value, 10);\n }\n function isInteger(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common$3.isNegativeZero(object);\n }\n var int = new Type$a('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function binary(obj) {\n return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1);\n },\n octal: function octal(obj) {\n return obj >= 0 ? '0' + obj.toString(8) : '-0' + obj.toString(8).slice(1);\n },\n decimal: function decimal(obj) {\n return obj.toString(10);\n },\n /* eslint-disable max-len */\n hexadecimal: function hexadecimal(obj) {\n return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1);\n }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [2, 'bin'],\n octal: [8, 'oct'],\n decimal: [10, 'dec'],\n hexadecimal: [16, 'hex']\n }\n });\n\n var common$2 = common$6;\n var Type$9 = type;\n var YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // 20:59\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n function resolveYamlFloat(data) {\n if (data === null) return false;\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n return true;\n }\n function constructYamlFloat(data) {\n var value, sign, base, digits;\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n digits = [];\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n if (value === '.inf') {\n return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n } else if (value === '.nan') {\n return NaN;\n } else if (value.indexOf(':') >= 0) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseFloat(v, 10));\n });\n value = 0.0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseFloat(value, 10);\n }\n var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n function representYamlFloat(object, style) {\n var res;\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase':\n return '.nan';\n case 'uppercase':\n return '.NAN';\n case 'camelcase':\n return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '.inf';\n case 'uppercase':\n return '.INF';\n case 'camelcase':\n return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '-.inf';\n case 'uppercase':\n return '-.INF';\n case 'camelcase':\n return '-.Inf';\n }\n } else if (common$2.isNegativeZero(object)) {\n return '-0.0';\n }\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n }\n function isFloat(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common$2.isNegativeZero(object));\n }\n var float = new Type$9('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n });\n\n var Schema$3 = schema;\n var json = new Schema$3({\n include: [failsafe],\n implicit: [_null, bool, int, float]\n });\n\n var Schema$2 = schema;\n var core = new Schema$2({\n include: [json]\n });\n\n var Type$8 = type;\n var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n // [1] year\n '-([0-9][0-9])' +\n // [2] month\n '-([0-9][0-9])$'); // [3] day\n\n var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n // [1] year\n '-([0-9][0-9]?)' +\n // [2] month\n '-([0-9][0-9]?)' +\n // [3] day\n '(?:[Tt]|[ \\\\t]+)' +\n // ...\n '([0-9][0-9]?)' +\n // [4] hour\n ':([0-9][0-9])' +\n // [5] minute\n ':([0-9][0-9])' +\n // [6] second\n '(?:\\\\.([0-9]*))?' +\n // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' +\n // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\n function resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n }\n function constructYamlTimestamp(data) {\n var match,\n year,\n month,\n day,\n hour,\n minute,\n second,\n fraction = 0,\n delta = null,\n tz_hour,\n tz_minute,\n date;\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +match[1];\n month = +match[2] - 1; // JS month starts with 0\n day = +match[3];\n if (!match[4]) {\n // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +match[4];\n minute = +match[5];\n second = +match[6];\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) {\n // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +match[10];\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n if (delta) date.setTime(date.getTime() - delta);\n return date;\n }\n function representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n }\n var timestamp = new Type$8('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n });\n\n var Type$7 = type;\n function resolveYamlMerge(data) {\n return data === '<<' || data === null;\n }\n var merge = new Type$7('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n });\n\n function commonjsRequire(path) {\n \tthrow new Error('Could not dynamically require \"' + path + '\". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');\n }\n\n /*eslint-disable no-bitwise*/\n\n var NodeBuffer;\n try {\n // A trick for browserified version, to not include `Buffer` shim\n var _require$1 = commonjsRequire;\n NodeBuffer = _require$1('buffer').Buffer;\n } catch (__) {}\n var Type$6 = type;\n\n // [ 64, 65, 66 ] -> [ padding, CR, LF ]\n var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n function resolveYamlBinary(data) {\n if (data === null) return false;\n var code,\n idx,\n bitlen = 0,\n max = data.length,\n map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return bitlen % 8 === 0;\n }\n function constructYamlBinary(data) {\n var idx,\n tailbits,\n input = data.replace(/[\\r\\n=]/g, ''),\n // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if (idx % 4 === 0 && idx) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n }\n bits = bits << 6 | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = max % 4 * 6;\n if (tailbits === 0) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push(bits >> 10 & 0xFF);\n result.push(bits >> 2 & 0xFF);\n } else if (tailbits === 12) {\n result.push(bits >> 4 & 0xFF);\n }\n\n // Wrap into Buffer for NodeJS and leave Array for browser\n if (NodeBuffer) {\n // Support node 6.+ Buffer API when available\n return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);\n }\n return result;\n }\n function representYamlBinary(object /*, style*/) {\n var result = '',\n bits = 0,\n idx,\n tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if (idx % 3 === 0 && idx) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n }\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n if (tail === 0) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[bits >> 10 & 0x3F];\n result += map[bits >> 4 & 0x3F];\n result += map[bits << 2 & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[bits >> 2 & 0x3F];\n result += map[bits << 4 & 0x3F];\n result += map[64];\n result += map[64];\n }\n return result;\n }\n function isBinary(object) {\n return NodeBuffer && NodeBuffer.isBuffer(object);\n }\n var binary = new Type$6('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n });\n\n var Type$5 = type;\n var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\n var _toString$2 = Object.prototype.toString;\n function resolveYamlOmap(data) {\n if (data === null) return true;\n var objectKeys = [],\n index,\n length,\n pair,\n pairKey,\n pairHasKey,\n object = data;\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n if (_toString$2.call(pair) !== '[object Object]') return false;\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;else return false;\n }\n }\n if (!pairHasKey) return false;\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false;\n }\n return true;\n }\n function constructYamlOmap(data) {\n return data !== null ? data : [];\n }\n var omap = new Type$5('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n });\n\n var Type$4 = type;\n var _toString$1 = Object.prototype.toString;\n function resolveYamlPairs(data) {\n if (data === null) return true;\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n if (_toString$1.call(pair) !== '[object Object]') return false;\n keys = Object.keys(pair);\n if (keys.length !== 1) return false;\n result[index] = [keys[0], pair[keys[0]]];\n }\n return true;\n }\n function constructYamlPairs(data) {\n if (data === null) return [];\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n keys = Object.keys(pair);\n result[index] = [keys[0], pair[keys[0]]];\n }\n return result;\n }\n var pairs = new Type$4('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n });\n\n var Type$3 = type;\n var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n function resolveYamlSet(data) {\n if (data === null) return true;\n var key,\n object = data;\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n return true;\n }\n function constructYamlSet(data) {\n return data !== null ? data : {};\n }\n var set = new Type$3('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n });\n\n var Schema$1 = schema;\n var default_safe = new Schema$1({\n include: [core],\n implicit: [timestamp, merge],\n explicit: [binary, omap, pairs, set]\n });\n\n var Type$2 = type;\n function resolveJavascriptUndefined() {\n return true;\n }\n function constructJavascriptUndefined() {\n /*eslint-disable no-undefined*/\n return undefined;\n }\n function representJavascriptUndefined() {\n return '';\n }\n function isUndefined(object) {\n return typeof object === 'undefined';\n }\n var _undefined = new Type$2('tag:yaml.org,2002:js/undefined', {\n kind: 'scalar',\n resolve: resolveJavascriptUndefined,\n construct: constructJavascriptUndefined,\n predicate: isUndefined,\n represent: representJavascriptUndefined\n });\n\n var Type$1 = type;\n function resolveJavascriptRegExp(data) {\n if (data === null) return false;\n if (data.length === 0) return false;\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n\n // if regexp starts with '/' it can have modifiers and must be properly closed\n // `/foo/gim` - modifiers tail can be maximum 3 chars\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n if (modifiers.length > 3) return false;\n // if expression starts with /, is should be properly terminated\n if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;\n }\n return true;\n }\n function constructJavascriptRegExp(data) {\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n\n // `/foo/gim` - tail can be maximum 4 chars\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n regexp = regexp.slice(1, regexp.length - modifiers.length - 1);\n }\n return new RegExp(regexp, modifiers);\n }\n function representJavascriptRegExp(object /*, style*/) {\n var result = '/' + object.source + '/';\n if (object.global) result += 'g';\n if (object.multiline) result += 'm';\n if (object.ignoreCase) result += 'i';\n return result;\n }\n function isRegExp(object) {\n return Object.prototype.toString.call(object) === '[object RegExp]';\n }\n var regexp = new Type$1('tag:yaml.org,2002:js/regexp', {\n kind: 'scalar',\n resolve: resolveJavascriptRegExp,\n construct: constructJavascriptRegExp,\n predicate: isRegExp,\n represent: representJavascriptRegExp\n });\n\n var esprima;\n\n // Browserified version does not have esprima\n //\n // 1. For node.js just require module as deps\n // 2. For browser try to require mudule via external AMD system.\n // If not found - try to fallback to window.esprima. If not\n // found too - then fail to parse.\n //\n try {\n // workaround to exclude package from browserify list.\n var _require = commonjsRequire;\n esprima = _require('esprima');\n } catch (_) {\n /* eslint-disable no-redeclare */\n /* global window */\n if (typeof window !== 'undefined') esprima = window.esprima;\n }\n var Type = type;\n function resolveJavascriptFunction(data) {\n if (data === null) return false;\n try {\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n });\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n return false;\n }\n return true;\n } catch (err) {\n return false;\n }\n }\n function constructJavascriptFunction(data) {\n /*jslint evil:true*/\n\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n }),\n params = [],\n body;\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n throw new Error('Failed to resolve function');\n }\n ast.body[0].expression.params.forEach(function (param) {\n params.push(param.name);\n });\n body = ast.body[0].expression.body.range;\n\n // Esprima's ranges include the first '{' and the last '}' characters on\n // function expressions. So cut them out.\n if (ast.body[0].expression.body.type === 'BlockStatement') {\n /*eslint-disable no-new-func*/\n return new Function(params, source.slice(body[0] + 1, body[1] - 1));\n }\n // ES6 arrow functions can omit the BlockStatement. In that case, just return\n // the body.\n /*eslint-disable no-new-func*/\n return new Function(params, 'return ' + source.slice(body[0], body[1]));\n }\n function representJavascriptFunction(object /*, style*/) {\n return object.toString();\n }\n function isFunction(object) {\n return Object.prototype.toString.call(object) === '[object Function]';\n }\n var _function = new Type('tag:yaml.org,2002:js/function', {\n kind: 'scalar',\n resolve: resolveJavascriptFunction,\n construct: constructJavascriptFunction,\n predicate: isFunction,\n represent: representJavascriptFunction\n });\n\n var Schema = schema;\n var default_full = Schema.DEFAULT = new Schema({\n include: [default_safe],\n explicit: [_undefined, regexp, _function]\n });\n\n /*eslint-disable max-len,no-use-before-define*/\n\n var common$1 = common$6;\n var YAMLException$1 = exception;\n var Mark = mark;\n var DEFAULT_SAFE_SCHEMA$1 = default_safe;\n var DEFAULT_FULL_SCHEMA$1 = default_full;\n var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n var CONTEXT_FLOW_IN = 1;\n var CONTEXT_FLOW_OUT = 2;\n var CONTEXT_BLOCK_IN = 3;\n var CONTEXT_BLOCK_OUT = 4;\n var CHOMPING_CLIP = 1;\n var CHOMPING_STRIP = 2;\n var CHOMPING_KEEP = 3;\n var PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\n var PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\n var PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\n var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\n var PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n function _class(obj) {\n return Object.prototype.toString.call(obj);\n }\n function is_EOL(c) {\n return c === 0x0A /* LF */ || c === 0x0D /* CR */;\n }\n\n function is_WHITE_SPACE(c) {\n return c === 0x09 /* Tab */ || c === 0x20 /* Space */;\n }\n\n function is_WS_OR_EOL(c) {\n return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */;\n }\n\n function is_FLOW_INDICATOR(c) {\n return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */;\n }\n\n function fromHexCode(c) {\n var lc;\n if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) {\n return lc - 0x61 + 10;\n }\n return -1;\n }\n function escapedHexLen(c) {\n if (c === 0x78 /* x */) {\n return 2;\n }\n if (c === 0x75 /* u */) {\n return 4;\n }\n if (c === 0x55 /* U */) {\n return 8;\n }\n return 0;\n }\n function fromDecimalCode(c) {\n if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) {\n return c - 0x30;\n }\n return -1;\n }\n function simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return c === 0x30 /* 0 */ ? '\\x00' : c === 0x61 /* a */ ? '\\x07' : c === 0x62 /* b */ ? '\\x08' : c === 0x74 /* t */ ? '\\x09' : c === 0x09 /* Tab */ ? '\\x09' : c === 0x6E /* n */ ? '\\x0A' : c === 0x76 /* v */ ? '\\x0B' : c === 0x66 /* f */ ? '\\x0C' : c === 0x72 /* r */ ? '\\x0D' : c === 0x65 /* e */ ? '\\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* \" */ ? '\\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \\ */ ? '\\x5C' : c === 0x4E /* N */ ? '\\x85' : c === 0x5F /* _ */ ? '\\xA0' : c === 0x4C /* L */ ? \"\\u2028\" : c === 0x50 /* P */ ? \"\\u2029\" : '';\n }\n function charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00);\n }\n var simpleEscapeCheck = new Array(256); // integer, for fast access\n var simpleEscapeMap = new Array(256);\n for (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n }\n function State$1(input, options) {\n this.input = input;\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || DEFAULT_FULL_SCHEMA$1;\n this.onWarning = options['onWarning'] || null;\n this.legacy = options['legacy'] || false;\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n }\n\n function generateError(state, message) {\n return new YAMLException$1(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart));\n }\n function throwError(state, message) {\n throw generateError(state, message);\n }\n function throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n }\n var directiveHandlers = {\n YAML: function handleYamlDirective(state, name, args) {\n var match, major, minor;\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n state.version = args[0];\n state.checkLineBreaks = minor < 2;\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n TAG: function handleTagDirective(state, name, args) {\n var handle, prefix;\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n handle = args[0];\n prefix = args[1];\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n state.tagMap[handle] = prefix;\n }\n };\n function captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n if (start < end) {\n _result = state.input.slice(start, end);\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n state.result += _result;\n }\n }\n function mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n if (!common$1.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n sourceKeys = Object.keys(source);\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n if (!_hasOwnProperty$1.call(destination, key)) {\n destination[key] = source[key];\n overridableKeys[key] = true;\n }\n }\n }\n function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n keyNode = String(keyNode);\n if (_result === null) {\n _result = {};\n }\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n _result[keyNode] = valueNode;\n delete overridableKeys[keyNode];\n }\n return _result;\n }\n function readLineBreak(state) {\n var ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x0A /* LF */) {\n state.position++;\n } else if (ch === 0x0D /* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A /* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n state.line += 1;\n state.lineStart = state.position;\n }\n function skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (allowComments && ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0);\n }\n if (is_EOL(ch)) {\n readLineBreak(state);\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n while (ch === 0x20 /* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n return lineBreaks;\n }\n function testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) {\n _position += 3;\n ch = state.input.charCodeAt(_position);\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n return false;\n }\n function writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common$1.repeat('\\n', count - 1);\n }\n }\n function readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* \" */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) {\n return false;\n }\n if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n while (ch !== 0) {\n if (ch === 0x3A /* : */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n } else if (ch === 0x23 /* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, captureEnd, false);\n if (state.result) {\n return true;\n }\n state.kind = _kind;\n state.result = _result;\n return false;\n }\n function readSingleQuotedScalar(state, nodeIndent) {\n var ch, captureStart, captureEnd;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x27 /* ' */) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27 /* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x27 /* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n }\n function readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart, captureEnd, hexLength, hexResult, tmp, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x22 /* \" */) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22 /* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n } else if (ch === 0x5C /* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n state.result += charFromCodepoint(hexResult);\n state.position++;\n } else {\n throwError(state, 'unknown escape sequence');\n }\n captureStart = captureEnd = state.position;\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n }\n function readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = {},\n keyNode,\n keyTag,\n valueNode,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x5B /* [ */) {\n terminator = 0x5D; /* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B /* { */) {\n terminator = 0x7D; /* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(++state.position);\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n }\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n if (ch === 0x3F /* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));\n } else {\n _result.push(keyNode);\n }\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x2C /* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n throwError(state, 'unexpected end of the stream within a flow collection');\n }\n function readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x7C /* | */) {\n folding = false;\n } else if (ch === 0x3E /* > */) {\n folding = true;\n } else {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x2B /* + */ || ch === 0x2D /* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n } else {\n break;\n }\n }\n if (is_WHITE_SPACE(ch)) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (is_WHITE_SPACE(ch));\n if (ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (!is_EOL(ch) && ch !== 0);\n }\n }\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n ch = state.input.charCodeAt(state.position);\n while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common$1.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) {\n // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common$1.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common$1.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) {\n // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common$1.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common$1.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n while (!is_EOL(ch) && ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, state.position, false);\n }\n return true;\n }\n function readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n if (ch !== 0x2D /* - */) {\n break;\n }\n following = state.input.charCodeAt(state.position + 1);\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n detected = true;\n state.position++;\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n }\n function readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _pos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = {},\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n _pos = state.position;\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) {\n if (ch === 0x3F /* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x3A /* : */) {\n ch = state.input.charCodeAt(++state.position);\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n } else {\n break; // Reading is done. Go to the epilogue.\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);\n keyTag = keyNode = valueNode = null;\n }\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n if (state.lineIndent > nodeIndent && ch !== 0) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n return detected;\n }\n function readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x21 /* ! */) return false;\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x3C /* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n } else if (ch === 0x21 /* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n } else {\n tagHandle = '!';\n }\n _position = state.position;\n if (isVerbatim) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && ch !== 0x3E /* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n if (ch === 0x21 /* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n ch = state.input.charCodeAt(++state.position);\n }\n tagName = state.input.slice(_position, state.position);\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n if (isVerbatim) {\n state.tag = tagName;\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n return true;\n }\n function readAnchorProperty(state) {\n var _position, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x26 /* & */) return false;\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n state.anchor = state.input.slice(_position, state.position);\n return true;\n }\n function readAlias(state) {\n var _position, alias, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x2A /* * */) return false;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n alias = state.input.slice(_position, state.position);\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n }\n function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1,\n // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n blockIndent = state.position - state.lineStart;\n if (indentStatus === 1) {\n if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n } else if (readAlias(state)) {\n hasContent = true;\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n if (state.tag !== null && state.tag !== '!') {\n if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n if (type.resolve(state.result)) {\n // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n if (!type.resolve(state.result)) {\n // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n }\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n }\n function readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = {};\n state.anchorMap = {};\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if (state.lineIndent > 0 || ch !== 0x25 /* % */) {\n break;\n }\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && !is_EOL(ch));\n break;\n }\n if (is_EOL(ch)) break;\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n if (ch !== 0) readLineBreak(state);\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n skipSeparationSpace(state, true, -1);\n if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n state.documents.push(state.result);\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n if (state.input.charCodeAt(state.position) === 0x2E /* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n if (state.position < state.length - 1) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n }\n function loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n if (input.length !== 0) {\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n var state = new State$1(input, options);\n var nullpos = input.indexOf('\\0');\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n while (state.input.charCodeAt(state.position) === 0x20 /* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n while (state.position < state.length - 1) {\n readDocument(state);\n }\n return state.documents;\n }\n function loadAll(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n var documents = loadDocuments(input, options);\n if (typeof iterator !== 'function') {\n return documents;\n }\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n }\n function load(input, options) {\n var documents = loadDocuments(input, options);\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new YAMLException$1('expected a single document in the stream, but found more');\n }\n function safeLoadAll(input, iterator, options) {\n if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n return loadAll(input, iterator, common$1.extend({\n schema: DEFAULT_SAFE_SCHEMA$1\n }, options));\n }\n function safeLoad(input, options) {\n return load(input, common$1.extend({\n schema: DEFAULT_SAFE_SCHEMA$1\n }, options));\n }\n loader$1.loadAll = loadAll;\n loader$1.load = load;\n loader$1.safeLoadAll = safeLoadAll;\n loader$1.safeLoad = safeLoad;\n\n var dumper$1 = {};\n\n /*eslint-disable no-use-before-define*/\n\n var common = common$6;\n var YAMLException = exception;\n var DEFAULT_FULL_SCHEMA = default_full;\n var DEFAULT_SAFE_SCHEMA = default_safe;\n var _toString = Object.prototype.toString;\n var _hasOwnProperty = Object.prototype.hasOwnProperty;\n var CHAR_TAB = 0x09; /* Tab */\n var CHAR_LINE_FEED = 0x0A; /* LF */\n var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\n var CHAR_SPACE = 0x20; /* Space */\n var CHAR_EXCLAMATION = 0x21; /* ! */\n var CHAR_DOUBLE_QUOTE = 0x22; /* \" */\n var CHAR_SHARP = 0x23; /* # */\n var CHAR_PERCENT = 0x25; /* % */\n var CHAR_AMPERSAND = 0x26; /* & */\n var CHAR_SINGLE_QUOTE = 0x27; /* ' */\n var CHAR_ASTERISK = 0x2A; /* * */\n var CHAR_COMMA = 0x2C; /* , */\n var CHAR_MINUS = 0x2D; /* - */\n var CHAR_COLON = 0x3A; /* : */\n var CHAR_EQUALS = 0x3D; /* = */\n var CHAR_GREATER_THAN = 0x3E; /* > */\n var CHAR_QUESTION = 0x3F; /* ? */\n var CHAR_COMMERCIAL_AT = 0x40; /* @ */\n var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\n var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\n var CHAR_GRAVE_ACCENT = 0x60; /* ` */\n var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\n var CHAR_VERTICAL_LINE = 0x7C; /* | */\n var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\n var ESCAPE_SEQUENCES = {};\n ESCAPE_SEQUENCES[0x00] = '\\\\0';\n ESCAPE_SEQUENCES[0x07] = '\\\\a';\n ESCAPE_SEQUENCES[0x08] = '\\\\b';\n ESCAPE_SEQUENCES[0x09] = '\\\\t';\n ESCAPE_SEQUENCES[0x0A] = '\\\\n';\n ESCAPE_SEQUENCES[0x0B] = '\\\\v';\n ESCAPE_SEQUENCES[0x0C] = '\\\\f';\n ESCAPE_SEQUENCES[0x0D] = '\\\\r';\n ESCAPE_SEQUENCES[0x1B] = '\\\\e';\n ESCAPE_SEQUENCES[0x22] = '\\\\\"';\n ESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\n ESCAPE_SEQUENCES[0x85] = '\\\\N';\n ESCAPE_SEQUENCES[0xA0] = '\\\\_';\n ESCAPE_SEQUENCES[0x2028] = '\\\\L';\n ESCAPE_SEQUENCES[0x2029] = '\\\\P';\n var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'];\n function compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n if (map === null) return {};\n result = {};\n keys = Object.keys(map);\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n result[tag] = style;\n }\n return result;\n }\n function encodeHex(character) {\n var string, handle, length;\n string = character.toString(16).toUpperCase();\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');\n }\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n }\n function State(options) {\n this.schema = options['schema'] || DEFAULT_FULL_SCHEMA;\n this.indent = Math.max(1, options['indent'] || 2);\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = common.isNothing(options['flowLevel']) ? -1 : options['flowLevel'];\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n this.tag = null;\n this.result = '';\n this.duplicates = [];\n this.usedDuplicates = null;\n }\n\n // Indents every line in a string. Empty lines (\\n only) are not indented.\n function indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n if (line.length && line !== '\\n') result += ind;\n result += line;\n }\n return result;\n }\n function generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n }\n function testImplicitResolving(state, str) {\n var index, length, type;\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n if (type.resolve(str)) {\n return true;\n }\n }\n return false;\n }\n\n // [33] s-white ::= s-space | s-tab\n function isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n }\n\n // Returns true if the character can be printed without escaping.\n // From YAML 1.2: \"any allowed characters known to be non-printable\n // should also be escaped. [However,] This isn’t mandatory\"\n // Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\n function isPrintable(c) {\n return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF;\n }\n\n // [34] ns-char ::= nb-char - s-white\n // [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n // [26] b-char ::= b-line-feed | b-carriage-return\n // [24] b-line-feed ::= #xA /* LF */\n // [25] b-carriage-return ::= #xD /* CR */\n // [3] c-byte-order-mark ::= #xFEFF\n function isNsChar(c) {\n return isPrintable(c) && !isWhitespace(c)\n // byte-order-mark\n && c !== 0xFEFF\n // b-char\n && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED;\n }\n\n // Simplified test for values allowed after the first character in plain style.\n function isPlainSafe(c, prev) {\n // Uses a subset of nb-char - c-flow-indicator - \":\" - \"#\"\n // where nb-char ::= c-printable - b-char - c-byte-order-mark.\n return isPrintable(c) && c !== 0xFEFF\n // - c-flow-indicator\n && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n // - \":\" - \"#\"\n // /* An ns-char preceding */ \"#\"\n && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev));\n }\n\n // Simplified test for values allowed as the first character in plain style.\n function isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “\"”\n && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE\n // | “%” | “@” | “`”)\n && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT;\n }\n\n // Determines whether block indentation indicator is required.\n function needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n }\n var STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n // Determines which scalar styles are possible and returns the preferred style.\n // lineWidth = -1 => no limit.\n // Pre-conditions: str.length > 0.\n // Post-conditions:\n // STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\n function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {\n var i;\n var char, prev_char;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1));\n if (singleLineOnly) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n\n // Note: line breaking/folding is implemented for only the folded style.\n // NB. We drop the last trailing newline (if any) of a returned block scalar\n // since the dumper adds its own newline. This always works:\n // • No ending newline => unaffected; already using strip \"-\" chomping.\n // • Ending newline => removed then restored.\n // Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\n function writeScalar(state, string, level, iskey) {\n state.dump = function () {\n if (string.length === 0) {\n return \"''\";\n }\n if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {\n return \"'\" + string + \"'\";\n }\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || state.flowLevel > -1 && level >= state.flowLevel;\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new YAMLException('impossible error: invalid scalar style');\n }\n }();\n }\n\n // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\n function blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : clip ? '' : '-';\n return indentIndicator + chomp + '\\n';\n }\n\n // (See the note for writeScalar.)\n function dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n }\n\n // Note: a long line without a suitable break point will exceed the width limit.\n // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\n function foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }();\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while (match = lineRe.exec(string)) {\n var prefix = match[1],\n line = match[2];\n moreIndented = line[0] === ' ';\n result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\\n' : '') + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n return result;\n }\n\n // Greedy line breaking.\n // Picks the longest line under the limit each time,\n // otherwise settles for the shortest line over the limit.\n // NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\n function foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0,\n end,\n curr = 0,\n next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while (match = breakRe.exec(line)) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = curr > start ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n return result.slice(1); // drop extra \\n joiner\n }\n\n // Escapes a double-quoted string.\n function escapeString(string) {\n var result = '';\n var char, nextChar;\n var escapeSeq;\n for (var i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n // Check for surrogate pairs (reference Unicode 3.0 section \"3.7 Surrogates\").\n if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) {\n nextChar = string.charCodeAt(i + 1);\n if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) {\n // Combine the surrogate pair and store it escaped.\n result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);\n // Advance index one extra since we already used that char here.\n i++;\n continue;\n }\n }\n escapeSeq = ESCAPE_SEQUENCES[char];\n result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char);\n }\n return result;\n }\n function writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n // Write only valid elements.\n if (writeNode(state, level, object[index], false, false)) {\n if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n }\n function writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n // Write only valid elements.\n if (writeNode(state, level + 1, object[index], true, true)) {\n if (!compact || index !== 0) {\n _result += generateNextLine(state, level);\n }\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n }\n\n function writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (index !== 0) pairBuffer += ', ';\n if (state.condenseFlow) pairBuffer += '\"';\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n }\n function writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new YAMLException('sortKeys must be a boolean or a function');\n }\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (!compact || index !== 0) {\n pairBuffer += generateNextLine(state, level);\n }\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024;\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n pairBuffer += state.dump;\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n }\n\n function detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) {\n state.tag = explicit ? type.tag : '?';\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new YAMLException('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n state.dump = _result;\n }\n return true;\n }\n }\n return false;\n }\n\n // Serializes `object` and writes it to global `result`.\n // Returns true on success, or false on invalid object.\n //\n function writeNode(state, level, object, block, compact, iskey) {\n state.tag = null;\n state.dump = object;\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n var type = _toString.call(state.dump);\n if (block) {\n block = state.flowLevel < 0 || state.flowLevel > level;\n }\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) {\n compact = false;\n }\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && Object.keys(state.dump).length !== 0) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level;\n if (block && state.dump.length !== 0) {\n writeBlockSequence(state, arrayLevel, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, arrayLevel, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey);\n }\n } else {\n if (state.skipInvalid) return false;\n throw new YAMLException('unacceptable kind of an object to dump ' + type);\n }\n if (state.tag !== null && state.tag !== '?') {\n state.dump = '!<' + state.tag + '> ' + state.dump;\n }\n }\n return true;\n }\n function getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n inspectNode(object, objects, duplicatesIndexes);\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n }\n function inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList, index, length;\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n }\n function dump(input, options) {\n options = options || {};\n var state = new State(options);\n if (!state.noRefs) getDuplicateReferences(input, state);\n if (writeNode(state, 0, input, true, true)) return state.dump + '\\n';\n return '';\n }\n function safeDump(input, options) {\n return dump(input, common.extend({\n schema: DEFAULT_SAFE_SCHEMA\n }, options));\n }\n dumper$1.dump = dump;\n dumper$1.safeDump = safeDump;\n\n var loader = loader$1;\n var dumper = dumper$1;\n function deprecated(name) {\n return function () {\n throw new Error('Function ' + name + ' is deprecated and cannot be used.');\n };\n }\n jsYaml$2.Type = type;\n jsYaml$2.Schema = schema;\n jsYaml$2.FAILSAFE_SCHEMA = failsafe;\n jsYaml$2.JSON_SCHEMA = json;\n jsYaml$2.CORE_SCHEMA = core;\n jsYaml$2.DEFAULT_SAFE_SCHEMA = default_safe;\n jsYaml$2.DEFAULT_FULL_SCHEMA = default_full;\n jsYaml$2.load = loader.load;\n jsYaml$2.loadAll = loader.loadAll;\n jsYaml$2.safeLoad = loader.safeLoad;\n jsYaml$2.safeLoadAll = loader.safeLoadAll;\n jsYaml$2.dump = dumper.dump;\n jsYaml$2.safeDump = dumper.safeDump;\n jsYaml$2.YAMLException = exception;\n\n // Deprecated schema names from JS-YAML 2.0.x\n jsYaml$2.MINIMAL_SCHEMA = failsafe;\n jsYaml$2.SAFE_SCHEMA = default_safe;\n jsYaml$2.DEFAULT_SCHEMA = default_full;\n\n // Deprecated functions from JS-YAML 1.x.x\n jsYaml$2.scan = deprecated('scan');\n jsYaml$2.parse = deprecated('parse');\n jsYaml$2.compose = deprecated('compose');\n jsYaml$2.addConstructor = deprecated('addConstructor');\n\n var yaml = jsYaml$2;\n var jsYaml = yaml;\n var jsYaml$1 = /*@__PURE__*/getDefaultExportFromCjs(jsYaml);\n\n function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n /**\n * Redirect - object used to redirect some requests\n * e.g.\n * {\n * title: 1x1-transparent.gif\n * comment: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever\n * contentType: image/gif;base64\n * content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n * }\n *\n * @typedef {object} Redirect\n * @property {string} title resource name\n * @property {string} comment resource description\n * @property {string} content encoded resource content\n * @property {string} contentType MIME type\n * @property {boolean} [isBlocking] e.g click2load redirect\n * @property {string} [sha] hash\n */\n\n class Redirects {\n /**\n * Converts rawYaml into JS object with sources titles used as keys\n *\n * @param {string} rawYaml\n * @returns {Object} - return object with titles in the keys and RedirectSources\n * in the values\n */\n constructor(rawYaml) {\n try {\n var arrOfRedirects = jsYaml$1.safeLoad(rawYaml);\n this.redirects = arrOfRedirects.reduce(function (acc, redirect) {\n return _objectSpread(_objectSpread({}, acc), {}, {\n [redirect.title]: redirect\n });\n }, {});\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(\"Was unable to load YAML into JS due to: \".concat(e.message));\n throw e;\n }\n }\n\n /**\n * Returns redirect source object\n *\n * @param {string} title\n * @returns {Redirect|undefined} Found redirect source object, or `undefined` if not found.\n */\n getRedirect(title) {\n var _this = this;\n if (Object.prototype.hasOwnProperty.call(this.redirects, title)) {\n return this.redirects[title];\n }\n\n // look title among aliases\n var values = Object.keys(this.redirects).map(function (key) {\n return _this.redirects[key];\n });\n return values.find(function (redirect) {\n var aliases = redirect.aliases;\n if (!aliases) {\n return false;\n }\n return aliases.includes(title);\n });\n }\n\n /**\n * Checks if redirect is blocking like click2load.html\n *\n * @param {string} title Title of the redirect.\n * @returns {boolean} True if redirect is blocking otherwise returns `false` even if redirect name is\n * unknown.\n */\n isBlocking(title) {\n var redirect = this.redirects[title];\n if (redirect) {\n return !!redirect.isBlocking;\n }\n return false;\n }\n }\n\n var redirectsMap = {\n \"1x1-transparent.gif\": \"1x1-transparent.gif\",\n \"1x1.gif\": \"1x1-transparent.gif\",\n \"1x1-transparent-gif\": \"1x1-transparent.gif\",\n \"2x2-transparent.png\": \"2x2-transparent.png\",\n \"2x2.png\": \"2x2-transparent.png\",\n \"2x2-transparent-png\": \"2x2-transparent.png\",\n \"3x2-transparent.png\": \"3x2-transparent.png\",\n \"3x2.png\": \"3x2-transparent.png\",\n \"3x2-transparent-png\": \"3x2-transparent.png\",\n \"32x32-transparent.png\": \"32x32-transparent.png\",\n \"32x32.png\": \"32x32-transparent.png\",\n \"32x32-transparent-png\": \"32x32-transparent.png\",\n noopframe: \"noopframe.html\",\n \"noop.html\": \"noopframe.html\",\n \"blank-html\": \"noopframe.html\",\n noopcss: \"noopcss.css\",\n \"noop.css\": \"noopcss.css\",\n \"blank-css\": \"noopcss.css\",\n noopjs: \"noopjs.js\",\n \"noop.js\": \"noopjs.js\",\n \"blank-js\": \"noopjs.js\",\n noopjson: \"noopjson.json\",\n nooptext: \"nooptext.js\",\n \"noop.txt\": \"nooptext.js\",\n \"blank-text\": \"nooptext.js\",\n empty: \"nooptext.js\",\n \"noopvmap-1.0\": \"noopvmap01.xml\",\n \"noop-vmap1.0.xml\": \"noopvmap01.xml\",\n \"noopvast-2.0\": \"noopvast02.xml\",\n \"noopvast-3.0\": \"noopvast03.xml\",\n \"noopvast-4.0\": \"noopvast04.xml\",\n \"noopmp3-0.1s\": \"noopmp3.mp3\",\n \"blank-mp3\": \"noopmp3.mp3\",\n \"noopmp4-1s\": \"noopmp4.mp4\",\n \"noop-1s.mp4\": \"noopmp4.mp4\",\n \"blank-mp4\": \"noopmp4.mp4\",\n \"click2load.html\": \"click2load.html\",\n \"ubo-click2load.html\": \"click2load.html\",\n \"amazon-apstag\": \"amazon-apstag.js\",\n \"ubo-amazon_apstag.js\": \"amazon-apstag.js\",\n \"amazon_apstag.js\": \"amazon-apstag.js\",\n \"ati-smarttag\": \"ati-smarttag.js\",\n \"didomi-loader\": \"didomi-loader.js\",\n fingerprintjs2: \"fingerprintjs2.js\",\n \"ubo-fingerprint2.js\": \"fingerprintjs2.js\",\n \"fingerprint2.js\": \"fingerprintjs2.js\",\n fingerprintjs3: \"fingerprintjs3.js\",\n \"ubo-fingerprint3.js\": \"fingerprintjs3.js\",\n \"fingerprint3.js\": \"fingerprintjs3.js\",\n gemius: \"gemius.js\",\n \"google-analytics-ga\": \"google-analytics-ga.js\",\n \"ubo-google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics\": \"google-analytics.js\",\n \"ubo-google-analytics_analytics.js\": \"google-analytics.js\",\n \"google-analytics_analytics.js\": \"google-analytics.js\",\n \"googletagmanager-gtm\": \"google-analytics.js\",\n \"ubo-googletagmanager_gtm.js\": \"google-analytics.js\",\n \"googletagmanager_gtm.js\": \"google-analytics.js\",\n \"google-ima3\": \"google-ima3.js\",\n \"ubo-google-ima.js\": \"google-ima3.js\",\n \"google-ima.js\": \"google-ima3.js\",\n \"googlesyndication-adsbygoogle\": \"googlesyndication-adsbygoogle.js\",\n \"ubo-googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googletagservices-gpt\": \"googletagservices-gpt.js\",\n \"ubo-googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n \"googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n matomo: \"matomo.js\",\n \"metrika-yandex-tag\": \"metrika-yandex-tag.js\",\n \"metrika-yandex-watch\": \"metrika-yandex-watch.js\",\n \"naver-wcslog\": \"naver-wcslog.js\",\n noeval: \"noeval.js\",\n \"noeval.js\": \"noeval.js\",\n \"silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval.js\": \"noeval.js\",\n \"ubo-silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval\": \"noeval.js\",\n \"ubo-silent-noeval\": \"noeval.js\",\n \"pardot-1.0\": \"pardot-1.0.js\",\n \"prebid-ads\": \"prebid-ads.js\",\n \"ubo-prebid-ads.js\": \"prebid-ads.js\",\n \"prebid-ads.js\": \"prebid-ads.js\",\n prebid: \"prebid.js\",\n \"prevent-bab\": \"prevent-bab.js\",\n \"nobab.js\": \"prevent-bab.js\",\n \"ubo-nobab.js\": \"prevent-bab.js\",\n \"bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-nobab\": \"prevent-bab.js\",\n \"ubo-bab-defuser\": \"prevent-bab.js\",\n \"prevent-bab2\": \"prevent-bab2.js\",\n \"nobab2.js\": \"prevent-bab2.js\",\n \"prevent-fab-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"nofab.js\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab.js\": \"prevent-fab-3.2.0.js\",\n \"fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab\": \"prevent-fab-3.2.0.js\",\n \"prevent-popads-net\": \"prevent-popads-net.js\",\n \"popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net\": \"prevent-popads-net.js\",\n \"scorecardresearch-beacon\": \"scorecardresearch-beacon.js\",\n \"ubo-scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"set-popads-dummy\": \"set-popads-dummy.js\",\n \"popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy\": \"set-popads-dummy.js\"\n };\n\n /**\n * Finds redirect resource by it's name\n *\n * @param {string} name - redirect name\n * @returns {Function}\n */\n var getRedirectByName = function getRedirectByName(name) {\n var redirects = Object.keys(redirectsList).map(function (key) {\n return redirectsList[key];\n });\n return redirects.find(function (r) {\n return r.names && r.names.includes(name);\n });\n };\n\n /**\n * @typedef {object} Source - redirect properties\n * @property {string} name redirect name\n * @property {Array} args Arguments for redirect function\n * @property {'extension'|'test'} [engine] -\n * Defines the final form of redirect string presentation\n * @property {boolean} [verbose] flag to enable printing to console debug information\n */\n\n /**\n * Returns redirect code by param\n *\n * @param {Source} source\n * @returns {string} redirect code\n */\n var getRedirectCode = function getRedirectCode(source) {\n var redirect = getRedirectByName(source.name);\n var result = attachDependencies(redirect);\n result = addCall(redirect, result);\n\n // redirect code for different sources is checked in tests\n // so it should be just a code without any source and props passed\n result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true);\n return result;\n };\n var getRedirectFilename = function getRedirectFilename(name) {\n return redirectsMap[name];\n };\n var redirects = {\n Redirects,\n getRedirectFilename,\n getCode: getRedirectCode,\n isAdgRedirectRule: validator.isAdgRedirectRule,\n isValidAdgRedirectRule: validator.isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo: validator.isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg: validator.isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg: validator.isAbpRedirectCompatibleWithAdg,\n convertUboRedirectToAdg,\n convertAbpRedirectToAdg,\n convertRedirectToAdg,\n convertRedirectNameToAdg,\n convertAdgRedirectToUbo\n };\n\n function abortCurrentInlineScript(source, args) {\n function abortCurrentInlineScript(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var SRC_DATA_MARKER = \"data:text/javascript;base64,\";\n var getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var _scriptEl$src;\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (content.length === 0 && typeof scriptEl.src !== \"undefined\" && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) {\n var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n var props = property.split(\".\");\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue: currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n var rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyRead(source, args) {\n function abortOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyWrite(source, args) {\n function abortOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnStackTrace(source, args) {\n function abortOnStackTrace(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n var rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnStackTrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetInterval(source, args) {\n function adjustSetInterval(source, matchCallback, matchDelay, boost) {\n var nativeSetInterval = window.setInterval;\n var matchRegexp = toRegExp(matchCallback);\n var intervalWrapper = function intervalWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n var DEFAULT_MULTIPLIER = .05;\n var MIN_MULTIPLIER = .001;\n var MAX_MULTIPLIER = 50;\n var parsedBoost = parseFloat(boost);\n var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n var DEFAULT_DELAY = 1e3;\n var parsedDelay = parseInt(delay, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetTimeout(source, args) {\n function adjustSetTimeout(source, matchCallback, matchDelay, boost) {\n var nativeSetTimeout = window.setTimeout;\n var matchRegexp = toRegExp(matchCallback);\n var timeoutWrapper = function timeoutWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n var DEFAULT_MULTIPLIER = .05;\n var MIN_MULTIPLIER = .001;\n var MAX_MULTIPLIER = 50;\n var parsedBoost = parseFloat(boost);\n var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n var DEFAULT_DELAY = 1e3;\n var parsedDelay = parseInt(delay, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugCurrentInlineScript(source, args) {\n function debugCurrentInlineScript(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger;\n }\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n var props = property.split(\".\");\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyRead(source, args) {\n function debugOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyWrite(source, args) {\n function debugOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function dirString(source, args) {\n function dirString(source, times) {\n var _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === \"function\") {\n dir.call(this, object);\n }\n hit(source);\n }\n console.dir = dirWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n dirString.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function disableNewtabLinks(source, args) {\n function disableNewtabLinks(source) {\n document.addEventListener(\"click\", function (ev) {\n var target = ev.target;\n while (target !== null) {\n if (target.localName === \"a\" && target.hasAttribute(\"target\")) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n disableNewtabLinks.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function evalDataPrune(source, args) {\n function evalDataPrune(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== \"\" ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== \"\" ? requiredInitialProps.split(/ +/) : [];\n var evalWrapper = function evalWrapper(target, thisArg, args) {\n var data = Reflect.apply(target, thisArg, args);\n if (typeof data === \"object\") {\n data = jsonPruner(source, data, prunePaths, requiredPaths);\n }\n return data;\n };\n var evalHandler = {\n apply: evalWrapper\n };\n window.eval = new Proxy(window.eval, evalHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getWildcardPropertyInChain(base, chain) {\n var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n if (chain === \"*\" || chain === \"[]\") {\n for (var key in base) {\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base: base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base: base,\n prop: chain\n });\n }\n return output;\n }\n var prop = chain.slice(0, pos);\n var shouldLookThrough = prop === \"[]\" && Array.isArray(base) || prop === \"*\" && base instanceof Object;\n if (shouldLookThrough) {\n var nextProp = chain.slice(pos + 1);\n var baseKeys = Object.keys(base);\n baseKeys.forEach(function (key) {\n var item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isPruningNeeded(source, root, prunePaths, requiredPaths) {\n if (!root) {\n return false;\n }\n var shouldProcess;\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n var rootString = JSON.stringify(root);\n var matchRegex = toRegExp(requiredPaths.join(\"\"));\n var shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n var wildcardSymbols = [\".*.\", \"*.\", \".*\", \".[].\", \"[].\", \".[]\"];\n var _loop = function _loop() {\n var requiredPath = requiredPaths[i];\n var lastNestedPropName = requiredPath.split(\".\").pop();\n var hasWildcard = wildcardSymbols.some(function (symbol) {\n return requiredPath.includes(symbol);\n });\n var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n shouldProcess = !hasWildcard;\n for (var j = 0; j < details.length; j += 1) {\n var hasRequiredProp = typeof lastNestedPropName === \"string\" && details[j].base[lastNestedPropName] !== undefined;\n if (hasWildcard) {\n shouldProcess = hasRequiredProp || shouldProcess;\n } else {\n shouldProcess = hasRequiredProp && shouldProcess;\n }\n }\n };\n for (var i = 0; i < requiredPaths.length; i += 1) {\n _loop();\n }\n return shouldProcess;\n }\n function jsonPruner(source, root, prunePaths, requiredPaths) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) {\n return root;\n }\n prunePaths.forEach(function (path) {\n var ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n evalDataPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function forceWindowClose(source, args) {\n function forceWindowClose(source) {\n var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n if (typeof window.close !== \"function\") {\n var message = \"window.close() is not a function so 'close-window' scriptlet is unavailable\";\n logMessage(source, message);\n return;\n }\n var closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n logMessage(source, e);\n }\n };\n var closeByExtension = function closeByExtension() {\n var extCall = function extCall() {\n dispatchEvent(new Event(\"adguard:scriptlet-close-window\"));\n };\n window.addEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n }, 5e3);\n };\n var shouldClose = function shouldClose() {\n if (path === \"\") {\n return true;\n }\n var pathRegexp = toRegExp(path);\n var currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.includes(\"Chrome\")) {\n closeByExtension();\n }\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n forceWindowClose.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function hideInShadowDom(source, args) {\n function hideInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n var hideElement = function hideElement(targetElement) {\n var DISPLAY_NONE_CSS = \"display:none!important;\";\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n var hideHandler = function hideHandler() {\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n var _loop = function _loop() {\n var isHidden = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n var hosts = [];\n if (rootElement) {\n var domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n }\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n var targets = [];\n var innerHostsAcc = [];\n hostElements.forEach(function (host) {\n var simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n var shadowRootElem = host.shadowRoot;\n var shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n var innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n var stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n var res = [];\n while (stack.length) {\n var next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n hideInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function injectCssInShadowDom(source, args) {\n function injectCssInShadowDom(source, cssRule) {\n var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n if (!Element.prototype.attachShadow || typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n var callback = function callback(shadowRoot) {\n try {\n var stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n var styleTag = document.createElement(\"style\");\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function hijackAttachShadow(context, hostSelector, callback) {\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || \"*\")) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n var attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n injectCssInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function jsonPrune(source, args) {\n function jsonPrune(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== \"\" ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== \"\" ? requiredInitialProps.split(/ +/) : [];\n var nativeJSONParse = JSON.parse;\n var jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(source, root, prunePaths, requiredPaths);\n };\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n var nativeResponseJson = Response.prototype.json;\n var responseJsonWrapper = function responseJsonWrapper() {\n var promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(source, obj, prunePaths, requiredPaths);\n });\n };\n if (typeof Response === \"undefined\") {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getWildcardPropertyInChain(base, chain) {\n var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n if (chain === \"*\" || chain === \"[]\") {\n for (var key in base) {\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base: base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base: base,\n prop: chain\n });\n }\n return output;\n }\n var prop = chain.slice(0, pos);\n var shouldLookThrough = prop === \"[]\" && Array.isArray(base) || prop === \"*\" && base instanceof Object;\n if (shouldLookThrough) {\n var nextProp = chain.slice(pos + 1);\n var baseKeys = Object.keys(base);\n baseKeys.forEach(function (key) {\n var item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isPruningNeeded(source, root, prunePaths, requiredPaths) {\n if (!root) {\n return false;\n }\n var shouldProcess;\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n var rootString = JSON.stringify(root);\n var matchRegex = toRegExp(requiredPaths.join(\"\"));\n var shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n var wildcardSymbols = [\".*.\", \"*.\", \".*\", \".[].\", \"[].\", \".[]\"];\n var _loop = function _loop() {\n var requiredPath = requiredPaths[i];\n var lastNestedPropName = requiredPath.split(\".\").pop();\n var hasWildcard = wildcardSymbols.some(function (symbol) {\n return requiredPath.includes(symbol);\n });\n var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n shouldProcess = !hasWildcard;\n for (var j = 0; j < details.length; j += 1) {\n var hasRequiredProp = typeof lastNestedPropName === \"string\" && details[j].base[lastNestedPropName] !== undefined;\n if (hasWildcard) {\n shouldProcess = hasRequiredProp || shouldProcess;\n } else {\n shouldProcess = hasRequiredProp && shouldProcess;\n }\n }\n };\n for (var i = 0; i < requiredPaths.length; i += 1) {\n _loop();\n }\n return shouldProcess;\n }\n function jsonPruner(source, root, prunePaths, requiredPaths) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) {\n return root;\n }\n prunePaths.forEach(function (path) {\n var ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n jsonPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function log(source, args) {\n function log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n log.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logAddEventListener(source, args) {\n function logAddEventListener(source) {\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n var message = 'addEventListener(\"'.concat(type, '\", ').concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n } else {\n var _message = \"Invalid event type or listener passed to addEventListener:\\n type: \".concat(convertTypeToString(type), \"\\n listener: \").concat(convertTypeToString(listener));\n logMessage(source, _message, true);\n }\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && \"handleEvent\" in listener && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n function convertTypeToString(value) {\n var output;\n if (typeof value === \"undefined\") {\n output = \"undefined\";\n } else if (typeof value === \"object\") {\n if (value === null) {\n output = \"null\";\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logEval(source, args) {\n function logEval(source) {\n var nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, 'eval(\"'.concat(str, '\")'), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n var nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(\", \"), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logEval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logOnStacktrace(source, args) {\n function logOnStacktrace(source, property) {\n if (!property) {\n return;\n }\n var refineStackTrace = function refineStackTrace(stackString) {\n var stackSteps = stackString.split(\"\\n\").slice(2).map(function (line) {\n return line.replace(/ {4}at /, \"\");\n });\n var logInfoArray = stackSteps.map(function (line) {\n var funcName;\n var funcFullPath;\n var reg = /\\(([^\\)]+)\\)/;\n var regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(\" \").slice(0, -1).join(\" \");\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split(\"@\").slice(0, -1).join(\" \");\n funcFullPath = line.match(regFirefox)[2];\n } else {\n funcName = \"function name is not available\";\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n var logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var value = base[prop];\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n };\n setChainPropAccess(window, property);\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logOnStacktrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function m3uPrune(source, args) {\n function m3uPrune(source, propsToRemove) {\n var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var SEGMENT_MARKER = \"#\";\n var AD_MARKER = {\n ASSET: \"#EXT-X-ASSET:\",\n CUE: \"#EXT-X-CUE:\",\n CUE_IN: \"#EXT-X-CUE-IN\",\n DISCONTINUITY: \"#EXT-X-DISCONTINUITY\",\n EXTINF: \"#EXTINF\",\n EXTM3U: \"#EXTM3U\",\n SCTE35: \"#EXT-X-SCTE35:\"\n };\n var COMCAST_AD_MARKER = {\n AD: \"-AD-\",\n VAST: \"-VAST-\",\n VMAP_AD: \"-VMAP-AD-\",\n VMAP_AD_BREAK: \"#EXT-X-VMAP-AD-BREAK:\"\n };\n var TAGS_ALLOWLIST = [\"#EXT-X-TARGETDURATION\", \"#EXT-X-MEDIA-SEQUENCE\", \"#EXT-X-DISCONTINUITY-SEQUENCE\", \"#EXT-X-ENDLIST\", \"#EXT-X-PLAYLIST-TYPE\", \"#EXT-X-I-FRAMES-ONLY\", \"#EXT-X-MEDIA\", \"#EXT-X-STREAM-INF\", \"#EXT-X-I-FRAME-STREAM-INF\", \"#EXT-X-SESSION-DATA\", \"#EXT-X-SESSION-KEY\", \"#EXT-X-INDEPENDENT-SEGMENTS\", \"#EXT-X-START\"];\n var isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n var array = lines.slice();\n var index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array: array,\n index: index\n };\n };\n var pruneVmapBlock = function pruneVmapBlock(lines) {\n var array = lines.slice();\n for (var i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n var removeM3ULineRegexp = toRegExp(propsToRemove);\n var pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n var pruneSegments = function pruneSegments(lines) {\n for (var i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n var segmentName = lines[i].substring(0, lines[i].indexOf(\":\"));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (var j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n var isM3U = function isM3U(text) {\n if (typeof text === \"string\") {\n var trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n var isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n var pruneM3U = function pruneM3U(text) {\n var lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === \"undefined\") {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== \"undefined\") {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = [\"\", \"text\"];\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n var content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n if (!propsToRemove) {\n if (isM3U(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n var responseContent = shouldPruneResponse ? pruneM3U(response) : response;\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n var clonedResponse = response.clone();\n var responseText = await response.text();\n if (!propsToRemove && isM3U(responseText)) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return clonedResponse;\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n var prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n m3uPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noTopics(source, args) {\n function noTopics(source) {\n var TOPICS_PROPERTY_NAME = \"browsingTopics\";\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve(\"[]\");\n };\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noTopics.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noeval(source, args) {\n function noeval(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noeval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function nowebrtc(source, args) {\n function nowebrtc(source) {\n var propertyName = \"\";\n if (window.RTCPeerConnection) {\n propertyName = \"RTCPeerConnection\";\n } else if (window.webkitRTCPeerConnection) {\n propertyName = \"webkitRTCPeerConnection\";\n }\n if (propertyName === \"\") {\n return;\n }\n var rtcReplacement = function rtcReplacement(config) {\n var message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n var rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function convertRtcConfigToString(config) {\n var UNDEF_STR = \"undefined\";\n var str = UNDEF_STR;\n if (config === null) {\n str = \"null\";\n } else if (config instanceof Object) {\n var SERVERS_PROP_NAME = \"iceServers\";\n var URLS_PROP_NAME = \"urls\";\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n nowebrtc.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAddEventListener(source, args) {\n function preventAddEventListener(source, typeSearch, listenerSearch) {\n var typeSearchRegexp = toRegExp(typeSearch);\n var listenerSearchRegexp = toRegExp(listenerSearch);\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n var shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && \"handleEvent\" in listener && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAdfly(source, args) {\n function preventAdfly(source) {\n var isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n var handler = function handler(encodedURL) {\n var evenChars = \"\";\n var oddChars = \"\";\n for (var i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n var data = (evenChars + oddChars).split(\"\");\n for (var _i = 0; _i < data.length; _i += 1) {\n if (isDigit(data[_i])) {\n for (var ii = _i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[_i] = temp.toString();\n }\n _i = ii;\n break;\n }\n }\n }\n }\n data = data.join(\"\");\n var decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n var val;\n var applyHandler = true;\n var result = setPropertyAccess(window, \"ysmm\", {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === \"string\") {\n handler(value);\n }\n } catch (err) {}\n }\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, \"Failed to set up prevent-adfly scriptlet\");\n }\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAdfly.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventBab(source, args) {\n function preventBab(source) {\n var nativeSetTimeout = window.setTimeout;\n var babRegex = /\\.bab_elementid.$/;\n var timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== \"string\" || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n var signatures = [[\"blockadblock\"], [\"babasbm\"], [/getItem\\('babn'\\)/], [\"getElementById\", \"String.fromCharCode\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\", \"charAt\", \"DOMContentLoaded\", \"AdBlock\", \"addEventListener\", \"doScroll\", \"fromCharCode\", \"<<2|r>>4\", \"sessionStorage\", \"clientWidth\", \"localStorage\", \"Math\", \"random\"]];\n var check = function check(str) {\n if (typeof str !== \"string\") {\n return false;\n }\n for (var i = 0; i < signatures.length; i += 1) {\n var tokens = signatures[i];\n var match = 0;\n for (var j = 0; j < tokens.length; j += 1) {\n var token = tokens[j];\n var found = token instanceof RegExp ? token.test(str) : str.includes(token);\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= .8) {\n return true;\n }\n }\n return false;\n };\n var nativeEval = window.eval;\n var evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n var bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty(\"visibility\");\n }\n var el = document.getElementById(\"babasbmsgx\");\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventBab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventElementSrcLoading(source, args) {\n function preventElementSrcLoading(source, tagName, match) {\n if (typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n var srcMockData = {\n script: \"data:text/javascript;base64,KCk9Pnt9\",\n img: \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",\n iframe: \"data:text/html;base64, PGRpdj48L2Rpdj4=\",\n link: \"data:text/plain;base64,\"\n };\n var instance;\n if (tagName === \"script\") {\n instance = HTMLScriptElement;\n } else if (tagName === \"img\") {\n instance = HTMLImageElement;\n } else if (tagName === \"iframe\") {\n instance = HTMLIFrameElement;\n } else if (tagName === \"link\") {\n instance = HTMLLinkElement;\n } else {\n return;\n }\n var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === \"function\";\n var policy;\n if (hasTrustedTypes) {\n policy = window.trustedTypes.createPolicy(\"AGPolicy\", {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n var SOURCE_PROPERTY_NAME = tagName === \"link\" ? \"href\" : \"src\";\n var ONERROR_PROPERTY_NAME = \"onerror\";\n var searchRegexp = toRegExp(match);\n var setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, \"matched\");\n };\n var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n var nodeName = thisArg.nodeName.toLowerCase();\n var attrName = args[0].toLowerCase();\n var attrValue = args[1];\n var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n var setAttributeHandler = {\n apply: setAttributeWrapper\n };\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n var nodeName = this.nodeName.toLowerCase();\n var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n if (policy && urlValue instanceof TrustedScriptURL) {\n var trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n var isMatched = this.getAttribute(source.name) === \"matched\";\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n var eventName = args[0];\n var isMatched = typeof thisArg.getAttribute === \"function\" && thisArg.getAttribute(source.name) === \"matched\" && eventName === \"error\";\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n var preventInlineOnerror = function preventInlineOnerror(tagName, src) {\n window.addEventListener(\"error\", function (event) {\n if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) {\n return;\n }\n hit(source);\n if (typeof event.target.onload === \"function\") {\n event.target.onerror = event.target.onload;\n return;\n }\n event.target.onerror = noopFunc;\n }, true);\n };\n preventInlineOnerror(tagName, searchRegexp);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function safeGetDescriptor(obj, prop) {\n var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n }\n function noopFunc() {}\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventElementSrcLoading.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventEvalIf(source, args) {\n function preventEvalIf(source, search) {\n var searchRegexp = toRegExp(search);\n var nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventEvalIf.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFab(source, args) {\n function preventFab(source) {\n hit(source);\n var Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n var fab = new Fab();\n var getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n var getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n if (Object.prototype.hasOwnProperty.call(window, \"FuckAdBlock\")) {\n window.FuckAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"FuckAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"BlockAdBlock\")) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"BlockAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"SniffAdBlock\")) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"SniffAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"fuckAdBlock\")) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, \"fuckAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"blockAdBlock\")) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, \"blockAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"sniffAdBlock\")) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, \"sniffAdBlock\", getsetfab);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function noopThis() {\n return this;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFetch(source, args) {\n function preventFetch(source, propsToMatch) {\n var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"emptyObj\";\n var responseType = arguments.length > 3 ? arguments[3] : undefined;\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n var strResponseBody;\n if (responseBody === \"\" || responseBody === \"emptyObj\") {\n strResponseBody = \"{}\";\n } else if (responseBody === \"emptyArr\") {\n strResponseBody = \"[]\";\n } else {\n logMessage(source, \"Invalid responseBody parameter: '\".concat(responseBody, \"'\"));\n return;\n }\n var isResponseTypeSpecified = typeof responseType !== \"undefined\";\n var isResponseTypeSupported = function isResponseTypeSupported(responseType) {\n var SUPPORTED_TYPES = [\"default\", \"opaque\"];\n return SUPPORTED_TYPES.includes(responseType);\n };\n if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) {\n logMessage(source, \"Invalid responseType parameter: '\".concat(responseType, \"'\"));\n return;\n }\n var handlerWrapper = async function handlerWrapper(target, thisArg, args) {\n var shouldPrevent = false;\n var fetchData = getFetchData(args);\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n try {\n var origResponse = await Reflect.apply(target, thisArg, args);\n if (!origResponse.ok) {\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return modifyResponse(origResponse, {\n body: strResponseBody,\n type: responseType\n });\n } catch (ex) {\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getFetchData(args) {\n var fetchPropsObj = {};\n var fetchUrl;\n var fetchInit;\n if (args[0] instanceof Request) {\n var requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n var props = Object.keys(fetchInit);\n props.forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function modifyResponse(origResponse) {\n var _origResponse$headers;\n var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n body: \"{}\"\n };\n var headers = {};\n origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) {\n headers[key] = value;\n });\n var modifiedResponse = new Response(replacement.body, {\n status: origResponse.status,\n statusText: origResponse.statusText,\n headers: headers\n });\n Object.defineProperties(modifiedResponse, {\n url: {\n value: origResponse.url\n },\n type: {\n value: replacement.type || origResponse.type\n }\n });\n return modifiedResponse;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n var requestInitOptions = getRequestProps();\n var entries = requestInitOptions.map(function (key) {\n var value = request[key];\n return [key, value];\n });\n return Object.fromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFetch.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventPopadsNet(source, args) {\n function preventPopadsNet(source) {\n var rid = randomId();\n var throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventPopadsNet.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRefresh(source, args) {\n function preventRefresh(source, delaySec) {\n var getMetaElements = function getMetaElements() {\n var metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n var getMetaContentDelay = function getMetaContentDelay(metaElements) {\n var delays = metaElements.map(function (meta) {\n var contentString = meta.getAttribute(\"content\");\n if (contentString.length === 0) {\n return null;\n }\n var contentDelay;\n var limiterIndex = contentString.indexOf(\";\");\n if (limiterIndex !== -1) {\n var delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n if (!delays.length) {\n return null;\n }\n var minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n return minDelay;\n };\n var stop = function stop() {\n var metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n var secondsToRun = getNumberFromString(delaySec);\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n if (secondsToRun === null) {\n return;\n }\n var delayMs = secondsToRun * 1e3;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRefresh.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRequestAnimationFrame(source, args) {\n function preventRequestAnimationFrame(source, match) {\n var nativeRequestAnimationFrame = window.requestAnimationFrame;\n var shouldLog = typeof match === \"undefined\";\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var rafWrapper = function rafWrapper(callback) {\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRequestAnimationFrame.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetInterval(source, args) {\n function preventSetInterval(source, matchCallback, matchDelay) {\n var shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n var callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n var _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n var parsedDelay = parseRawDelay(delay);\n var shouldPrevent = false;\n var callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n var INVERT_MARKER = \"!\";\n var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER);\n var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n var parsedDelay = parseInt(delayValue, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n var num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n var parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetTimeout(source, args) {\n function preventSetTimeout(source, matchCallback, matchDelay) {\n var shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n var callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n var _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n var parsedDelay = parseRawDelay(delay);\n var shouldPrevent = false;\n var callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n var INVERT_MARKER = \"!\";\n var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER);\n var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n var parsedDelay = parseInt(delayValue, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n var num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n var parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventWindowOpen(source, args) {\n function preventWindowOpen(source) {\n var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"*\";\n var delay = arguments.length > 2 ? arguments[2] : undefined;\n var replacement = arguments.length > 3 ? arguments[3] : undefined;\n var nativeOpen = window.open;\n var isNewSyntax = match !== \"0\" && match !== \"1\";\n var oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n var searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n var newOpenWrapper = function newOpenWrapper(url) {\n var shouldLog = replacement && replacement.includes(\"log\");\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n var argsStr = args && args.length > 0 ? \", \".concat(args.join(\", \")) : \"\";\n var message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n var shouldPrevent = false;\n if (match === \"*\") {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n var parsedDelay = parseInt(delay, 10);\n var result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n var decoyArgs = {\n replacement: replacement,\n url: url,\n delay: parsedDelay\n };\n var decoy = createDecoy(decoyArgs);\n var popup = decoy.contentWindow;\n if (typeof popup === \"object\" && popup !== null) {\n Object.defineProperty(popup, \"closed\", {\n value: false\n });\n Object.defineProperty(popup, \"opener\", {\n value: window\n });\n Object.defineProperty(popup, \"frameElement\", {\n value: null\n });\n } else {\n var nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, \"contentWindow\", {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidMatchStr(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function handleOldReplacement(replacement) {\n var result;\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === \"trueFunc\") {\n result = trueFunc;\n } else if (replacement.includes(\"=\")) {\n var isProp = replacement.startsWith(\"{\") && replacement.endsWith(\"}\");\n if (isProp) {\n var propertyPart = replacement.slice(1, -1);\n var propertyName = substringBefore(propertyPart, \"=\");\n var propertyValue = substringAfter(propertyPart, \"=\");\n if (propertyValue === \"noopFunc\") {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n }\n function createDecoy(args) {\n var UrlPropNameOf = function (UrlPropNameOf) {\n UrlPropNameOf[\"Object\"] = \"data\";\n UrlPropNameOf[\"Iframe\"] = \"src\";\n return UrlPropNameOf;\n }({});\n var replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n var tag;\n if (replacement === \"obj\") {\n tag = \"object\";\n } else {\n tag = \"iframe\";\n }\n var decoy = document.createElement(tag);\n if (decoy instanceof HTMLObjectElement) {\n decoy[UrlPropNameOf.Object] = url;\n } else if (decoy instanceof HTMLIFrameElement) {\n decoy[UrlPropNameOf.Iframe] = url;\n }\n decoy.style.setProperty(\"height\", \"1px\", \"important\");\n decoy.style.setProperty(\"position\", \"fixed\", \"important\");\n decoy.style.setProperty(\"top\", \"-1px\", \"important\");\n decoy.style.setProperty(\"width\", \"1px\", \"important\");\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1e3);\n return decoy;\n }\n function getPreventGetter(nativeGetter) {\n var preventGetter = function preventGetter(target, prop) {\n if (prop && prop === \"closed\") {\n return false;\n }\n if (typeof nativeGetter === \"function\") {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n }\n function noopNull() {\n return null;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function noopFunc() {}\n function trueFunc() {\n return true;\n }\n function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n }\n function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? \"\" : str.substring(index + separator.length);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventWindowOpen.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventXHR(source, args) {\n function preventXHR(source, propsToMatch, customResponseText) {\n if (typeof Proxy === \"undefined\") {\n return;\n }\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader;\n var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders;\n var xhrData;\n var modifiedResponse = \"\";\n var modifiedResponseText = \"\";\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n thisArg.xhrData = xhrData;\n }\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === \"blob\") {\n modifiedResponse = new Blob();\n }\n if (thisArg.responseType === \"arraybuffer\") {\n modifiedResponse = new ArrayBuffer();\n }\n if (customResponseText) {\n var randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n modifiedResponseText = randomText;\n } else {\n logMessage(source, \"Invalid randomize parameter: '\".concat(customResponseText, \"'\"));\n }\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n statusText = forgedRequest.statusText;\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n responseURL: {\n value: responseURL || thisArg.xhrData.url,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: 200,\n writable: false\n },\n response: {\n value: modifiedResponse,\n writable: false\n },\n responseText: {\n value: modifiedResponseText,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetResponseHeader.apply(thisArg, args);\n }\n if (!thisArg.collectedHeaders.length) {\n return null;\n }\n var searchHeaderName = args[0].toLowerCase();\n var matchedHeader = thisArg.collectedHeaders.find(function (header) {\n var headerName = header[0].toLowerCase();\n return headerName === searchHeaderName;\n });\n return matchedHeader ? matchedHeader[1] : null;\n };\n var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetAllResponseHeaders.call(thisArg);\n }\n if (!thisArg.collectedHeaders.length) {\n return \"\";\n }\n var allHeadersStr = thisArg.collectedHeaders.map(function (header) {\n var headerName = header[0];\n var headerValue = header[1];\n return \"\".concat(headerName.toLowerCase(), \": \").concat(headerValue);\n }).join(\"\\r\\n\");\n return allHeadersStr;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n var getHeaderHandler = {\n apply: getHeaderWrapper\n };\n var getAllHeadersHandler = {\n apply: getAllHeadersWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler);\n XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function generateRandomResponse(customResponseText) {\n var customResponse = customResponseText;\n if (customResponse === \"true\") {\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace(\"length:\", \"\");\n var rangeRegex = /^\\d+-\\d+$/;\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n var rangeMin = getNumberFromString(customResponse.split(\"-\")[0]);\n var rangeMax = getNumberFromString(customResponse.split(\"-\")[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n if (rangeMin > rangeMax) {\n var temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n var LENGTH_RANGE_LIMIT = 500 * 1e3;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n var length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n function getRandomStrByLength(length) {\n var result = \"\";\n var characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\";\n var charactersLength = characters.length;\n for (var i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventXHR.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeAttr(source, args) {\n function removeAttr(source, attrs, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join(\"],[\"), \"]\");\n }\n var rmattr = function rmattr() {\n var nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n var removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var flags = parseFlags(applying);\n var run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.includes(\" \")) {\n rmattr();\n }\n observeDOMChanges(rmattr, true);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n var FLAGS_DIVIDER = \" \";\n var ASAP_FLAG = \"asap\";\n var COMPLETE_FLAG = \"complete\";\n var STAY_FLAG = \"stay\";\n var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.includes(f);\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.includes(flag);\n }\n };\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeClass(source, args) {\n function removeClass(source, classNames, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n var selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n var removeClassHandler = function removeClassHandler() {\n var nodes = new Set();\n if (selector) {\n var foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n var elements = document.querySelectorAll(s);\n for (var i = 0; i < elements.length; i += 1) {\n var element = elements[i];\n nodes.add(element);\n }\n });\n }\n var removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var CLASS_ATTR_NAME = [\"class\"];\n var flags = parseFlags(applying);\n var run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.includes(\" \")) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n var FLAGS_DIVIDER = \" \";\n var ASAP_FLAG = \"asap\";\n var COMPLETE_FLAG = \"complete\";\n var STAY_FLAG = \"stay\";\n var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.includes(f);\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.includes(flag);\n }\n };\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeClass.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeCookie(source, args) {\n function removeCookie(source, match) {\n var matchRegexp = toRegExp(match);\n var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n var cookieSpec = \"\".concat(cookieName, \"=\");\n var domain1 = \"; domain=\".concat(hostName);\n var domain2 = \"; domain=.\".concat(hostName);\n var path = \"; path=/\";\n var expiration = \"; expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n var rmCookie = function rmCookie() {\n document.cookie.split(\";\").forEach(function (cookieStr) {\n var pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n var hostParts = document.location.hostname.split(\".\");\n for (var i = 0; i <= hostParts.length - 1; i += 1) {\n var hostName = hostParts.slice(i).join(\".\");\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener(\"beforeunload\", rmCookie);\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeInShadowDom(source, args) {\n function removeInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n var removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n var removeHandler = function removeHandler() {\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n var _loop = function _loop() {\n var isRemoved = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n var hosts = [];\n if (rootElement) {\n var domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n }\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n var targets = [];\n var innerHostsAcc = [];\n hostElements.forEach(function (host) {\n var simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n var shadowRootElem = host.shadowRoot;\n var shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n var innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n var stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n var res = [];\n while (stack.length) {\n var next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeNodeText(source, args) {\n function removeNodeText(source, nodeName, textMatch) {\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch;\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n var ALL_TEXT_PATTERN = /^[\\s\\S]*$/;\n var REPLACEMENT = \"\";\n replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT);\n }\n });\n };\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n function observeDocumentWithTimeout(callback, options) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4;\n var documentObserver = new MutationObserver(function (mutations, observer) {\n observer.disconnect();\n callback(mutations, observer);\n observer.observe(document.documentElement, options);\n });\n documentObserver.observe(document.documentElement, options);\n if (typeof timeout === \"number\") {\n setTimeout(function () {\n return documentObserver.disconnect();\n }, timeout);\n }\n }\n function handleExistingNodes(selector, handler) {\n var nodeList = document.querySelectorAll(selector);\n var nodes = nodeListToArray(nodeList);\n handler(nodes);\n }\n function handleMutations(mutations, handler) {\n var addedNodes = getAddedNodes(mutations);\n handler(addedNodes);\n }\n function replaceNodeText(source, node, pattern, replacement) {\n var textContent = node.textContent;\n if (textContent) {\n node.textContent = textContent.replace(pattern, replacement);\n hit(source);\n }\n }\n function isTargetNode(node, nodeNameMatch, textContentMatch) {\n var nodeName = node.nodeName,\n textContent = node.textContent;\n var nodeNameLowerCase = nodeName.toLowerCase();\n return textContent !== null && textContent !== \"\" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch));\n }\n function parseNodeTextParams(nodeName, textMatch) {\n var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var REGEXP_START_MARKER = \"/\";\n var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER));\n var selector = isStringNameMatch ? nodeName : \"*\";\n var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName);\n var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch);\n var patternMatch;\n if (pattern) {\n patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern);\n }\n return {\n selector: selector,\n nodeNameMatch: nodeNameMatch,\n textContentMatch: textContentMatch,\n patternMatch: patternMatch\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function nodeListToArray(nodeList) {\n var nodes = [];\n for (var i = 0; i < nodeList.length; i += 1) {\n nodes.push(nodeList[i]);\n }\n return nodes;\n }\n function getAddedNodes(mutations) {\n var nodes = [];\n for (var i = 0; i < mutations.length; i += 1) {\n var addedNodes = mutations[i].addedNodes;\n for (var j = 0; j < addedNodes.length; j += 1) {\n nodes.push(addedNodes[j]);\n }\n }\n return nodes;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeNodeText.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setAttr(source, args) {\n function setAttr(source, selector, attr) {\n var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (!selector || !attr) {\n return;\n }\n var allowedValues = [\"true\", \"false\"];\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n var setAttr = function setAttr() {\n var nodes = [].slice.call(document.querySelectorAll(selector));\n var set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setConstant(source, args) {\n function setConstant(source, property, value) {\n var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"\";\n var uboAliases = [\"set-constant.js\", \"ubo-set-constant.js\", \"set.js\", \"ubo-set.js\", \"ubo-set-constant\", \"ubo-set\"];\n if (uboAliases.includes(source.name)) {\n if (stack.length !== 1 && !getNumberFromString(stack)) {\n valueWrapper = stack;\n }\n stack = undefined;\n }\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var emptyArr = noopArray();\n var emptyObj = noopObject();\n var constantValue;\n if (value === \"undefined\") {\n constantValue = undefined;\n } else if (value === \"false\") {\n constantValue = false;\n } else if (value === \"true\") {\n constantValue = true;\n } else if (value === \"null\") {\n constantValue = null;\n } else if (value === \"emptyArr\") {\n constantValue = emptyArr;\n } else if (value === \"emptyObj\") {\n constantValue = emptyObj;\n } else if (value === \"noopFunc\") {\n constantValue = noopFunc;\n } else if (value === \"noopCallbackFunc\") {\n constantValue = noopCallbackFunc;\n } else if (value === \"trueFunc\") {\n constantValue = trueFunc;\n } else if (value === \"falseFunc\") {\n constantValue = falseFunc;\n } else if (value === \"throwFunc\") {\n constantValue = throwFunc;\n } else if (value === \"noopPromiseResolve\") {\n constantValue = noopPromiseResolve;\n } else if (value === \"noopPromiseReject\") {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === \"-1\") {\n constantValue = -1;\n } else if (value === \"\") {\n constantValue = \"\";\n } else if (value === \"yes\") {\n constantValue = \"yes\";\n } else if (value === \"no\") {\n constantValue = \"no\";\n } else {\n return;\n }\n var valueWrapperNames = [\"asFunction\", \"asCallback\", \"asResolved\", \"asRejected\"];\n if (valueWrapperNames.includes(valueWrapper)) {\n var valueWrappersMap = {\n asFunction(v) {\n return function () {\n return v;\n };\n },\n asCallback(v) {\n return function () {\n return function () {\n return v;\n };\n };\n },\n asResolved(v) {\n return Promise.resolve(v);\n },\n asRejected(v) {\n return Promise.reject(v);\n }\n };\n constantValue = valueWrappersMap[valueWrapper](constantValue);\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function noopArray() {\n return [];\n }\n function noopObject() {\n return {};\n }\n function noopFunc() {}\n function noopCallbackFunc() {\n return noopFunc;\n }\n function trueFunc() {\n return true;\n }\n function falseFunc() {\n return false;\n }\n function throwFunc() {\n throw new Error();\n }\n function noopPromiseReject() {\n return Promise.reject();\n }\n function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookie(source, args) {\n function setCookie(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n var allowedCookieValues = new Set([\"true\", \"false\", \"yes\", \"y\", \"no\", \"n\", \"ok\", \"accept\", \"reject\", \"allow\", \"deny\"]);\n var validValue;\n if (allowedCookieValues.has(value.toLowerCase())) {\n validValue = value;\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookieReload(source, args) {\n function setCookieReload(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n var pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n var cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n var allowedCookieValues = new Set([\"true\", \"false\", \"yes\", \"y\", \"no\", \"n\", \"ok\", \"accept\", \"reject\", \"allow\", \"deny\"]);\n var validValue;\n if (allowedCookieValues.has(value.toLowerCase())) {\n validValue = value;\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setLocalStorageItem(source, args) {\n function setLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n localStorage = _window.localStorage;\n if (validValue === \"$remove$\") {\n removeStorageItem(source, localStorage, key);\n } else {\n setStorageItem(source, localStorage, key, validValue);\n }\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function removeStorageItem(source, storage, key) {\n try {\n storage.removeItem(key);\n } catch (e) {\n var message = \"Unable to remove storage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n var validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"$remove$\") {\n validValue = \"$remove$\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setPopadsDummy(source, args) {\n function setPopadsDummy(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setPopadsDummy.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setSessionStorageItem(source, args) {\n function setSessionStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n sessionStorage = _window.sessionStorage;\n if (validValue === \"$remove$\") {\n removeStorageItem(source, sessionStorage, key);\n } else {\n setStorageItem(source, sessionStorage, key, validValue);\n }\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function removeStorageItem(source, storage, key) {\n try {\n storage.removeItem(key);\n } catch (e) {\n var message = \"Unable to remove storage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n var validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"$remove$\") {\n validValue = \"$remove$\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setSessionStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedClickElement(source, args) {\n function trustedClickElement(source, selectors) {\n var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n var OBSERVER_TIMEOUT_MS = 1e4;\n var THROTTLE_DELAY_MS = 20;\n var STATIC_CLICK_DELAY_MS = 150;\n var COOKIE_MATCH_MARKER = \"cookie:\";\n var LOCAL_STORAGE_MATCH_MARKER = \"localStorage:\";\n var SELECTORS_DELIMITER = \",\";\n var COOKIE_STRING_DELIMITER = \";\";\n var EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n var sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n var parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n var message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n var canClick = !parsedDelay;\n var cookieMatches = [];\n var localStorageMatches = [];\n var isInvertedMatchCookie = false;\n var isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.includes(COOKIE_MATCH_MARKER)) {\n var _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, \"\");\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) {\n var _parseMatchArg2 = parseMatchArg(matchStr),\n _isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n _matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = _isInvertedMatch;\n var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, \"\");\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n var parsedCookies = parseCookieString(document.cookie);\n var cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n var keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n var keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n var shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n var localStorageMatched = localStorageMatches.every(function (str) {\n var itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === \"\";\n });\n var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!_shouldRun) {\n return;\n }\n }\n var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n var createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n var elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n var clickElementsBySequence = async function clickElementsBySequence() {\n for (var i = 0; i < elementsSequence.length; i += 1) {\n var elementObj = elementsSequence[i];\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n if (!elementObj.element) {\n break;\n }\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n var allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n hit(source);\n }\n };\n var handleElement = function handleElement(element, i) {\n var elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n var findElements = function findElements(mutations, observer) {\n var fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n var element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.includes(selector) ? null : selector;\n });\n var allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function parseCookieString(cookieString) {\n var COOKIE_DELIMITER = \"=\";\n var COOKIE_PAIRS_DELIMITER = \";\";\n var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n var cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n var cookieKey;\n var cookieValue = \"\";\n var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedClickElement.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceFetchResponse(source, args) {\n function trustedReplaceFetchResponse(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n logMessage(source, \"Pattern argument should not be empty string\");\n return;\n }\n var shouldLog = pattern === \"\" && replacement === \"\";\n var nativeFetch = fetch;\n var shouldReplace = false;\n var fetchData;\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgeResponse = function forgeResponse(response, textContent) {\n var bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n var forgedResponse = new Response(textContent, {\n status: status,\n statusText: statusText,\n headers: headers\n });\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n var patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n var forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n var fetchDataStr = objectToString(fetchData);\n var message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getFetchData(args) {\n var fetchPropsObj = {};\n var fetchUrl;\n var fetchInit;\n if (args[0] instanceof Request) {\n var requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n var props = Object.keys(fetchInit);\n props.forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n var requestInitOptions = getRequestProps();\n var entries = requestInitOptions.map(function (key) {\n var value = request[key];\n return [key, value];\n });\n return Object.fromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceFetchResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceNodeText(source, args) {\n function trustedReplaceNodeText(source, nodeName, textMatch, pattern, replacement) {\n var uboAliases = [\"replace-node-text.js\", \"rpnt.js\", \"sed.js\"];\n if (uboAliases.includes(source.name)) {\n replacement = pattern;\n pattern = textMatch;\n for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {\n extraArgs[_key - 5] = arguments[_key];\n }\n for (var i = 0; i < extraArgs.length; i += 1) {\n var arg = extraArgs[i];\n if (arg === \"condition\") {\n textMatch = extraArgs[i + 1];\n break;\n }\n }\n }\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch,\n patternMatch = _parseNodeTextParams.patternMatch;\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n replaceNodeText(source, node, patternMatch, replacement);\n }\n });\n };\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n function observeDocumentWithTimeout(callback, options) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4;\n var documentObserver = new MutationObserver(function (mutations, observer) {\n observer.disconnect();\n callback(mutations, observer);\n observer.observe(document.documentElement, options);\n });\n documentObserver.observe(document.documentElement, options);\n if (typeof timeout === \"number\") {\n setTimeout(function () {\n return documentObserver.disconnect();\n }, timeout);\n }\n }\n function handleExistingNodes(selector, handler) {\n var nodeList = document.querySelectorAll(selector);\n var nodes = nodeListToArray(nodeList);\n handler(nodes);\n }\n function handleMutations(mutations, handler) {\n var addedNodes = getAddedNodes(mutations);\n handler(addedNodes);\n }\n function replaceNodeText(source, node, pattern, replacement) {\n var textContent = node.textContent;\n if (textContent) {\n node.textContent = textContent.replace(pattern, replacement);\n hit(source);\n }\n }\n function isTargetNode(node, nodeNameMatch, textContentMatch) {\n var nodeName = node.nodeName,\n textContent = node.textContent;\n var nodeNameLowerCase = nodeName.toLowerCase();\n return textContent !== null && textContent !== \"\" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch));\n }\n function parseNodeTextParams(nodeName, textMatch) {\n var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var REGEXP_START_MARKER = \"/\";\n var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER));\n var selector = isStringNameMatch ? nodeName : \"*\";\n var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName);\n var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch);\n var patternMatch;\n if (pattern) {\n patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern);\n }\n return {\n selector: selector,\n nodeNameMatch: nodeNameMatch,\n textContentMatch: textContentMatch,\n patternMatch: patternMatch\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function nodeListToArray(nodeList) {\n var nodes = [];\n for (var i = 0; i < nodeList.length; i += 1) {\n nodes.push(nodeList[i]);\n }\n return nodes;\n }\n function getAddedNodes(mutations) {\n var nodes = [];\n for (var i = 0; i < mutations.length; i += 1) {\n var addedNodes = mutations[i].addedNodes;\n for (var j = 0; j < addedNodes.length; j += 1) {\n nodes.push(addedNodes[j]);\n }\n }\n return nodes;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceNodeText.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceXhrResponse(source, args) {\n function trustedReplaceXhrResponse(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof Proxy === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n var message = \"Pattern argument should not be empty string.\";\n logMessage(source, message);\n return;\n }\n var shouldLog = pattern === \"\" && replacement === \"\";\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n var _message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, _message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n var content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n var patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedContent = content.replace(patternRegexp, replacement);\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n response: {\n value: modifiedContent,\n writable: false\n },\n responseText: {\n value: modifiedContent,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceXhrResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetConstant(source, args) {\n function trustedSetConstant(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function inferValue(value) {\n if (value === \"undefined\") {\n return undefined;\n }\n if (value === \"false\") {\n return false;\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"null\") {\n return null;\n }\n if (value === \"NaN\") {\n return NaN;\n }\n var MAX_ALLOWED_NUM = 32767;\n var numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error(\"number values bigger than 32767 are not allowed\");\n }\n return numVal;\n }\n var errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n var parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === \"string\") {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookie(source, args) {\n function trustedSetCookie(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n var ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n var ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n var MS_IN_SEC = 1e3;\n var SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n var SECONDS_IN_DAY = 24 * 60 * 60;\n var parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = \"$now$\";\n var CURRENT_DATE_KEYWORD = \"$currentDate$\";\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookieReload(source, args) {\n function trustedSetCookieReload(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n var cookieValueToCheck = parseCookieString(document.cookie)[name];\n if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n var pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n var cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n var ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n var ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n var MS_IN_SEC = 1e3;\n var SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n var SECONDS_IN_DAY = 24 * 60 * 60;\n var parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = \"$now$\";\n var CURRENT_DATE_KEYWORD = \"$currentDate$\";\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function parseCookieString(cookieString) {\n var COOKIE_DELIMITER = \"=\";\n var COOKIE_PAIRS_DELIMITER = \";\";\n var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n var cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n var cookieKey;\n var cookieValue = \"\";\n var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetLocalStorageItem(source, args) {\n function trustedSetLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Item value should be specified\");\n return;\n }\n var parsedValue = parseKeywordValue(value);\n var _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = \"$now$\";\n var CURRENT_DATE_KEYWORD = \"$currentDate$\";\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function xmlPrune(source, args) {\n function xmlPrune(source, propsToRemove) {\n var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var isXML = function isXML(text) {\n if (typeof text === \"string\") {\n var trimmedText = text.trim();\n if (trimmedText.startsWith(\"<\") && trimmedText.endsWith(\">\")) {\n return true;\n }\n }\n return false;\n };\n var createXMLDocument = function createXMLDocument(text) {\n var xmlParser = new DOMParser();\n var xmlDocument = xmlParser.parseFromString(text, \"text/xml\");\n return xmlDocument;\n };\n var isPruningNeeded = function isPruningNeeded(response, propsToRemove) {\n if (!isXML(response)) {\n return false;\n }\n var docXML = createXMLDocument(response);\n return !!docXML.querySelector(propsToRemove);\n };\n var pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n var xmlDoc = createXMLDocument(text);\n var errorNode = xmlDoc.querySelector(\"parsererror\");\n if (errorNode) {\n return text;\n }\n if (optionalProp !== \"\" && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n var elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n var serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = [\"\", \"text\"];\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n var content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n if (!propsToRemove) {\n if (isXML(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, propsToRemove);\n }\n var responseContent = shouldPruneResponse ? pruneXML(response) : response;\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n var clonedResponse = response.clone();\n var responseText = await response.text();\n shouldPruneResponse = isPruningNeeded(responseText, propsToRemove);\n if (!shouldPruneResponse) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n logMessage(source, createXMLDocument(responseText), true, false);\n return clonedResponse;\n }\n var prunedText = pruneXML(responseText);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n xmlPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n var scriptletsMap = {\n \"abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-current-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script.js\": abortCurrentInlineScript,\n \"acs.js\": abortCurrentInlineScript,\n \"ubo-acs.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script\": abortCurrentInlineScript,\n \"ubo-acs\": abortCurrentInlineScript,\n \"abort-current-inline-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script.js\": abortCurrentInlineScript,\n \"acis.js\": abortCurrentInlineScript,\n \"ubo-acis.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script\": abortCurrentInlineScript,\n \"ubo-acis\": abortCurrentInlineScript,\n \"abp-abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-read.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read.js\": abortOnPropertyRead,\n \"aopr.js\": abortOnPropertyRead,\n \"ubo-aopr.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read\": abortOnPropertyRead,\n \"ubo-aopr\": abortOnPropertyRead,\n \"abp-abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-property-write.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write.js\": abortOnPropertyWrite,\n \"aopw.js\": abortOnPropertyWrite,\n \"ubo-aopw.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write\": abortOnPropertyWrite,\n \"ubo-aopw\": abortOnPropertyWrite,\n \"abp-abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-stack-trace\": abortOnStackTrace,\n \"abort-on-stack-trace.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace.js\": abortOnStackTrace,\n \"aost.js\": abortOnStackTrace,\n \"ubo-aost.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace\": abortOnStackTrace,\n \"ubo-aost\": abortOnStackTrace,\n \"abp-abort-on-stack-trace\": abortOnStackTrace,\n \"adjust-setInterval\": adjustSetInterval,\n \"nano-setInterval-booster.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster.js\": adjustSetInterval,\n \"nano-sib.js\": adjustSetInterval,\n \"ubo-nano-sib.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster\": adjustSetInterval,\n \"ubo-nano-sib\": adjustSetInterval,\n \"adjust-setTimeout\": adjustSetTimeout,\n \"nano-setTimeout-booster.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster.js\": adjustSetTimeout,\n \"nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster\": adjustSetTimeout,\n \"ubo-nano-stb\": adjustSetTimeout,\n \"debug-current-inline-script\": debugCurrentInlineScript,\n \"debug-on-property-read\": debugOnPropertyRead,\n \"debug-on-property-write\": debugOnPropertyWrite,\n \"dir-string\": dirString,\n \"disable-newtab-links\": disableNewtabLinks,\n \"disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links\": disableNewtabLinks,\n \"evaldata-prune\": evalDataPrune,\n \"evaldata-prune.js\": evalDataPrune,\n \"ubo-evaldata-prune.js\": evalDataPrune,\n \"ubo-evaldata-prune\": evalDataPrune,\n \"close-window\": forceWindowClose,\n \"window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if\": forceWindowClose,\n \"hide-in-shadow-dom\": hideInShadowDom,\n \"inject-css-in-shadow-dom\": injectCssInShadowDom,\n \"json-prune\": jsonPrune,\n \"json-prune.js\": jsonPrune,\n \"ubo-json-prune.js\": jsonPrune,\n \"ubo-json-prune\": jsonPrune,\n \"abp-json-prune\": jsonPrune,\n log: log,\n \"log-addEventListener\": logAddEventListener,\n \"addEventListener-logger.js\": logAddEventListener,\n \"ubo-addEventListener-logger.js\": logAddEventListener,\n \"aell.js\": logAddEventListener,\n \"ubo-aell.js\": logAddEventListener,\n \"ubo-addEventListener-logger\": logAddEventListener,\n \"ubo-aell\": logAddEventListener,\n \"log-eval\": logEval,\n \"log-on-stack-trace\": logOnStacktrace,\n \"m3u-prune\": m3uPrune,\n \"m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune\": m3uPrune,\n \"no-topics\": noTopics,\n noeval: noeval,\n \"noeval.js\": noeval,\n \"silent-noeval.js\": noeval,\n \"ubo-noeval.js\": noeval,\n \"ubo-silent-noeval.js\": noeval,\n \"ubo-noeval\": noeval,\n \"ubo-silent-noeval\": noeval,\n nowebrtc: nowebrtc,\n \"nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc\": nowebrtc,\n \"prevent-addEventListener\": preventAddEventListener,\n \"addEventListener-defuser.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser.js\": preventAddEventListener,\n \"aeld.js\": preventAddEventListener,\n \"ubo-aeld.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser\": preventAddEventListener,\n \"ubo-aeld\": preventAddEventListener,\n \"prevent-adfly\": preventAdfly,\n \"adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser\": preventAdfly,\n \"prevent-bab\": preventBab,\n \"prevent-element-src-loading\": preventElementSrcLoading,\n \"prevent-eval-if\": preventEvalIf,\n \"noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if\": preventEvalIf,\n \"prevent-fab-3.2.0\": preventFab,\n \"nofab.js\": preventFab,\n \"ubo-nofab.js\": preventFab,\n \"fuckadblock.js-3.2.0\": preventFab,\n \"ubo-fuckadblock.js-3.2.0\": preventFab,\n \"ubo-nofab\": preventFab,\n \"prevent-fetch\": preventFetch,\n \"no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if\": preventFetch,\n \"prevent-popads-net\": preventPopadsNet,\n \"popads.net.js\": preventPopadsNet,\n \"ubo-popads.net.js\": preventPopadsNet,\n \"ubo-popads.net\": preventPopadsNet,\n \"prevent-refresh\": preventRefresh,\n \"refresh-defuser.js\": preventRefresh,\n \"refresh-defuser\": preventRefresh,\n \"ubo-refresh-defuser.js\": preventRefresh,\n \"ubo-refresh-defuser\": preventRefresh,\n \"prevent-requestAnimationFrame\": preventRequestAnimationFrame,\n \"no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"norafif.js\": preventRequestAnimationFrame,\n \"ubo-norafif.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if\": preventRequestAnimationFrame,\n \"ubo-norafif\": preventRequestAnimationFrame,\n \"prevent-setInterval\": preventSetInterval,\n \"no-setInterval-if.js\": preventSetInterval,\n \"ubo-no-setInterval-if.js\": preventSetInterval,\n \"setInterval-defuser.js\": preventSetInterval,\n \"ubo-setInterval-defuser.js\": preventSetInterval,\n \"nosiif.js\": preventSetInterval,\n \"ubo-nosiif.js\": preventSetInterval,\n \"sid.js\": preventSetInterval,\n \"ubo-sid.js\": preventSetInterval,\n \"ubo-no-setInterval-if\": preventSetInterval,\n \"ubo-setInterval-defuser\": preventSetInterval,\n \"ubo-nosiif\": preventSetInterval,\n \"ubo-sid\": preventSetInterval,\n \"prevent-setTimeout\": preventSetTimeout,\n \"no-setTimeout-if.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if.js\": preventSetTimeout,\n \"nostif.js\": preventSetTimeout,\n \"ubo-nostif.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if\": preventSetTimeout,\n \"ubo-nostif\": preventSetTimeout,\n \"setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser\": preventSetTimeout,\n \"std.js\": preventSetTimeout,\n \"ubo-std.js\": preventSetTimeout,\n \"ubo-std\": preventSetTimeout,\n \"prevent-window-open\": preventWindowOpen,\n \"window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser\": preventWindowOpen,\n \"nowoif.js\": preventWindowOpen,\n \"ubo-nowoif.js\": preventWindowOpen,\n \"ubo-nowoif\": preventWindowOpen,\n \"prevent-xhr\": preventXHR,\n \"no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if\": preventXHR,\n \"remove-attr\": removeAttr,\n \"remove-attr.js\": removeAttr,\n \"ubo-remove-attr.js\": removeAttr,\n \"ra.js\": removeAttr,\n \"ubo-ra.js\": removeAttr,\n \"ubo-remove-attr\": removeAttr,\n \"ubo-ra\": removeAttr,\n \"remove-class\": removeClass,\n \"remove-class.js\": removeClass,\n \"ubo-remove-class.js\": removeClass,\n \"rc.js\": removeClass,\n \"ubo-rc.js\": removeClass,\n \"ubo-remove-class\": removeClass,\n \"ubo-rc\": removeClass,\n \"remove-cookie\": removeCookie,\n \"cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover\": removeCookie,\n \"remove-in-shadow-dom\": removeInShadowDom,\n \"remove-node-text\": removeNodeText,\n \"remove-node-text.js\": removeNodeText,\n \"ubo-remove-node-text.js\": removeNodeText,\n \"rmnt.js\": removeNodeText,\n \"ubo-rmnt.js\": removeNodeText,\n \"ubo-remove-node-text\": removeNodeText,\n \"ubo-rmnt\": removeNodeText,\n \"set-attr\": setAttr,\n \"set-constant\": setConstant,\n \"set-constant.js\": setConstant,\n \"ubo-set-constant.js\": setConstant,\n \"set.js\": setConstant,\n \"ubo-set.js\": setConstant,\n \"ubo-set-constant\": setConstant,\n \"ubo-set\": setConstant,\n \"abp-override-property-read\": setConstant,\n \"set-cookie\": setCookie,\n \"set-cookie-reload\": setCookieReload,\n \"set-local-storage-item\": setLocalStorageItem,\n \"set-popads-dummy\": setPopadsDummy,\n \"popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy\": setPopadsDummy,\n \"set-session-storage-item\": setSessionStorageItem,\n \"trusted-click-element\": trustedClickElement,\n \"trusted-replace-fetch-response\": trustedReplaceFetchResponse,\n \"trusted-replace-node-text\": trustedReplaceNodeText,\n \"trusted-replace-xhr-response\": trustedReplaceXhrResponse,\n \"trusted-set-constant\": trustedSetConstant,\n \"trusted-set-cookie\": trustedSetCookie,\n \"trusted-set-cookie-reload\": trustedSetCookieReload,\n \"trusted-set-local-storage-item\": trustedSetLocalStorageItem,\n \"xml-prune\": xmlPrune,\n \"xml-prune.js\": xmlPrune,\n \"ubo-xml-prune.js\": xmlPrune,\n \"ubo-xml-prune\": xmlPrune\n };\n var getScriptletFunction = function getScriptletFunction(name) {\n return scriptletsMap[name];\n };\n\n /**\n * @typedef {object} Source Scriptlet properties.\n * @property {string} name Scriptlet name.\n * @property {Array} args Arguments for scriptlet function.\n * @property {'extension'|'corelibs'|'test'} engine Defines the final form of scriptlet string presentation.\n * @property {string} [version] Extension version.\n * @property {boolean} [verbose] Flag to enable debug information printing to console.\n * @property {string} [ruleText] Source rule text, needed for debug purposes.\n * @property {string} [domainName] Domain name where scriptlet is applied, needed for debug purposes.\n */\n\n /**\n * Returns scriptlet code by `source`.\n *\n * @param {Source} source Scriptlet properties.\n *\n * @returns {string|null} Scriptlet code.\n * @throws An error on unknown scriptlet name.\n */\n function getScriptletCode(source) {\n if (!validator.isValidScriptletName(source.name)) {\n return null;\n }\n var scriptletFunction = getScriptletFunction(source.name);\n // In case isValidScriptletName check will pass invalid scriptlet name,\n // for example when there is a bad alias\n if (typeof scriptletFunction !== 'function') {\n throw new Error(\"Error: cannot invoke scriptlet with name: '\".concat(source.name, \"'\"));\n }\n var scriptletFunctionString = scriptletFunction.toString();\n var result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString);\n return result;\n }\n\n /**\n * Scriptlets variable\n *\n * @returns {object} object with methods:\n * `invoke` method receives one argument with `Source` type\n * `validate` method receives one argument with `String` type\n */\n var scriptletsObject = function () {\n return {\n invoke: getScriptletCode,\n getScriptletFunction,\n isValidScriptletName: validator.isValidScriptletName,\n isValidScriptletRule,\n isAdgScriptletRule: validator.isAdgScriptletRule,\n isUboScriptletRule: validator.isUboScriptletRule,\n isAbpSnippetRule: validator.isAbpSnippetRule,\n convertUboToAdg: convertUboScriptletToAdg,\n convertAbpToAdg: convertAbpSnippetToAdg,\n convertScriptletToAdg,\n convertAdgToUbo: convertAdgScriptletToUbo,\n redirects\n };\n }();\n\n /**\n * Add module exports to be used as node package\n */\n module.exports = scriptletsObject;\n\n}));\n\n/**\n * -------------------------------------------\n * | |\n * | If you want to add your own scriptlet |\n * | please put your code below |\n * | |\n * -------------------------------------------\n */\n","'use strict';\n\nconst word = '[a-fA-F\\\\d:]';\nconst b = options => options && options.includeBoundaries ?\n\t`(?:(?<=\\\\s|^)(?=${word})|(?<=${word})(?=\\\\s|$))` :\n\t'';\n\nconst v4 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\n\nconst v6seg = '[a-fA-F\\\\d]{1,4}';\nconst v6 = `\n(?:\n(?:${v6seg}:){7}(?:${v6seg}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:${v6seg}:){6}(?:${v4}|:${v6seg}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:${v6seg}:){5}(?::${v4}|(?::${v6seg}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:${v6seg}:){4}(?:(?::${v6seg}){0,1}:${v4}|(?::${v6seg}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:${v6seg}:){3}(?:(?::${v6seg}){0,2}:${v4}|(?::${v6seg}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:${v6seg}:){2}(?:(?::${v6seg}){0,3}:${v4}|(?::${v6seg}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:${v6seg}:){1}(?:(?::${v6seg}){0,4}:${v4}|(?::${v6seg}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::${v6seg}){0,5}:${v4}|(?::${v6seg}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n`.replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim();\n\n// Pre-compile only the exact regexes because adding a global flag make regexes stateful\nconst v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`);\nconst v4exact = new RegExp(`^${v4}$`);\nconst v6exact = new RegExp(`^${v6}$`);\n\nconst ip = options => options && options.exact ?\n\tv46Exact :\n\tnew RegExp(`(?:${b(options)}${v4}${b(options)})|(?:${b(options)}${v6}${b(options)})`, 'g');\n\nip.v4 = options => options && options.exact ? v4exact : new RegExp(`${b(options)}${v4}${b(options)}`, 'g');\nip.v6 = options => options && options.exact ? v6exact : new RegExp(`${b(options)}${v6}${b(options)}`, 'g');\n\nmodule.exports = ip;\n","\"use strict\";\nconst {v4, v6} = require(\"cidr-regex\");\n\nconst re4 = v4({exact: true});\nconst re6 = v6({exact: true});\n\nmodule.exports = str => re4.test(str) ? 4 : (re6.test(str) ? 6 : 0);\nmodule.exports.v4 = str => re4.test(str);\nmodule.exports.v6 = str => re6.test(str);\n","\"use strict\";\n\nconst ipRegex = require(\"ip-regex\");\n\nconst defaultOpts = {exact: false};\n\nconst v4str = `${ipRegex.v4().source}\\\\/(3[0-2]|[12]?[0-9])`;\nconst v6str = `${ipRegex.v6().source}\\\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])`;\n\n// can not precompile the non-exact regexes because global flag makes the regex object stateful\n// which would require the user to reset .lastIndex on subsequent calls\nconst v4exact = new RegExp(`^${v4str}$`);\nconst v6exact = new RegExp(`^${v6str}$`);\nconst v46exact = new RegExp(`(?:^${v4str}$)|(?:^${v6str}$)`);\n\nmodule.exports = ({exact} = defaultOpts) => exact ? v46exact : new RegExp(`(?:${v4str})|(?:${v6str})`, \"g\");\nmodule.exports.v4 = ({exact} = defaultOpts) => exact ? v4exact : new RegExp(v4str, \"g\");\nmodule.exports.v6 = ({exact} = defaultOpts) => exact ? v6exact : new RegExp(v6str, \"g\");\n","'use strict';\nconst ipRegex = require('ip-regex');\n\nconst isIp = string => ipRegex({exact: true}).test(string);\nisIp.v4 = string => ipRegex.v4({exact: true}).test(string);\nisIp.v6 = string => ipRegex.v6({exact: true}).test(string);\nisIp.version = string => isIp(string) ? (isIp.v4(string) ? 4 : 6) : undefined;\n\nmodule.exports = isIp;\n","'use strict';\n\nconst defaultAlphabetIndexMap = [];\n\nfunction isNumberCode(code) {\n return code >= 48/* '0' */ && code <= 57/* '9' */;\n}\n\nfunction naturalCompare(a, b, opts) {\n if (typeof a !== 'string') {\n throw new TypeError(`The first argument must be a string. Received type '${typeof a}'`);\n }\n if (typeof b !== 'string') {\n throw new TypeError(`The second argument must be a string. Received type '${typeof b}'`);\n }\n\n const lengthA = a.length;\n const lengthB = b.length;\n let indexA = 0;\n let indexB = 0;\n let alphabetIndexMap = defaultAlphabetIndexMap;\n let firstDifferenceInLeadingZeros = 0;\n\n if (opts) {\n if (opts.caseInsensitive) {\n a = a.toLowerCase();\n b = b.toLowerCase();\n }\n\n if (opts.alphabet) {\n alphabetIndexMap = buildAlphabetIndexMap(opts.alphabet);\n }\n }\n\n while (indexA < lengthA && indexB < lengthB) {\n let charCodeA = a.charCodeAt(indexA);\n let charCodeB = b.charCodeAt(indexB);\n\n if (isNumberCode(charCodeA)) {\n if (!isNumberCode(charCodeB)) {\n return charCodeA - charCodeB;\n }\n\n let numStartA = indexA;\n let numStartB = indexB;\n\n while (charCodeA === 48/* '0' */ && ++numStartA < lengthA) {\n charCodeA = a.charCodeAt(numStartA);\n }\n while (charCodeB === 48/* '0' */ && ++numStartB < lengthB) {\n charCodeB = b.charCodeAt(numStartB);\n }\n\n if (numStartA !== numStartB && firstDifferenceInLeadingZeros === 0) {\n firstDifferenceInLeadingZeros = numStartA - numStartB;\n }\n\n let numEndA = numStartA;\n let numEndB = numStartB;\n\n while (numEndA < lengthA && isNumberCode(a.charCodeAt(numEndA))) {\n ++numEndA;\n }\n while (numEndB < lengthB && isNumberCode(b.charCodeAt(numEndB))) {\n ++numEndB;\n }\n\n let difference = numEndA - numStartA - numEndB + numStartB; // numA length - numB length\n if (difference !== 0) {\n return difference;\n }\n\n while (numStartA < numEndA) {\n difference = a.charCodeAt(numStartA++) - b.charCodeAt(numStartB++);\n if (difference !== 0) {\n return difference;\n }\n }\n\n indexA = numEndA;\n indexB = numEndB;\n continue;\n }\n\n if (charCodeA !== charCodeB) {\n if (\n charCodeA < alphabetIndexMap.length &&\n charCodeB < alphabetIndexMap.length &&\n alphabetIndexMap[charCodeA] !== -1 &&\n alphabetIndexMap[charCodeB] !== -1\n ) {\n return alphabetIndexMap[charCodeA] - alphabetIndexMap[charCodeB];\n }\n\n return charCodeA - charCodeB;\n }\n\n ++indexA;\n ++indexB;\n }\n\n if (indexA < lengthA) { // `b` is a substring of `a`\n return 1;\n }\n\n if (indexB < lengthB) { // `a` is a substring of `b`\n return -1;\n }\n\n return firstDifferenceInLeadingZeros;\n}\n\nconst alphabetIndexMapCache = {};\n\nfunction buildAlphabetIndexMap(alphabet) {\n const existingMap = alphabetIndexMapCache[alphabet];\n if (existingMap !== undefined) {\n return existingMap;\n }\n\n const indexMap = [];\n const maxCharCode = alphabet.split('').reduce((maxCode, char) => {\n return Math.max(maxCode, char.charCodeAt(0));\n }, 0);\n\n for (let i = 0; i <= maxCharCode; i++) {\n indexMap.push(-1);\n }\n\n for (let i = 0; i < alphabet.length; i++) {\n indexMap[alphabet.charCodeAt(i)] = i;\n }\n\n alphabetIndexMapCache[alphabet] = indexMap;\n\n return indexMap;\n}\n\nmodule.exports = naturalCompare;\n","\n/**\n * AdGuard Scriptlets\n * Version 1.9.62\n */\n\n(function (factory) {\n typeof define === 'function' && define.amd ? define(factory) :\n factory();\n})((function () {\n /**\n * Concat dependencies to scriptlet code\n *\n * @param scriptlet scriptlet or redirect function\n * @returns string view of scriptlet with attached dependencies\n */\n function attachDependencies(scriptlet) {\n var _scriptlet$injections = scriptlet.injections,\n injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections;\n return injections.reduce(function (accum, dep) {\n return \"\".concat(accum, \"\\n\").concat(dep.toString());\n }, scriptlet.toString());\n }\n\n /**\n * Add scriptlet call to existing code\n *\n * @param scriptlet scriptlet func\n * @param code scriptlet's string representation\n * @returns wrapped scriptlet call\n */\n function addCall(scriptlet, code) {\n return \"\".concat(code, \"\\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\\n try {\\n \").concat(scriptlet.name, \".apply(this, updatedArgs);\\n } catch (e) {\\n console.log(e);\\n }\");\n }\n\n /**\n * Wrap function into IIFE (Immediately invoked function expression)\n *\n * @example\n * const source = {\n * args: [\"aaa\", \"bbb\"],\n * name: 'noeval',\n * };\n * const code = \"function noeval(source, args) { alert(source); } noeval.apply(this, args);\"\n * const result = wrapInIIFE(source, code);\n *\n * // result\n * `(function(source, args) {\n * function noeval(source) { alert(source); }\n * noeval.apply(this, args);\n * )({\"args\": [\"aaa\", \"bbb\"], \"name\":\"noeval\"}, [\"aaa\", \"bbb\"])`\n * @param source - object with scriptlet properties\n * @param code - scriptlet source code with dependencies\n * @param redirect if function is redirect\n * @returns full scriptlet code\n */\n function passSourceAndProps(source, code) {\n var redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var sourceString = JSON.stringify(source);\n var argsString = source.args ? \"[\".concat(source.args.map(function (arg) {\n return JSON.stringify(arg);\n }), \"]\") : undefined;\n var params = argsString ? \"\".concat(sourceString, \", \").concat(argsString) : sourceString;\n if (redirect) {\n return \"(function(source, args){\\n\".concat(code, \"\\n})(\").concat(params, \");\");\n }\n return \"(\".concat(code, \")(\").concat(params, \");\");\n }\n\n /**\n * Wrap code in no name function\n *\n * @param code which must be wrapped\n * @returns wrapped code\n */\n function wrapInNonameFunc(code) {\n return \"function(source, args){\\n\".concat(code, \"\\n}\");\n }\n\n /**\n * Checks whether the obj is an empty object\n *\n * @param obj arbitrary object\n * @returns if object is empty\n */\n var isEmptyObject = function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n };\n\n /**\n * Safely retrieve property descriptor\n *\n * @param obj target object\n * @param prop target property\n * @returns descriptor or null if it's not available or non-configurable\n */\n var safeGetDescriptor = function safeGetDescriptor(obj, prop) {\n var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n };\n\n /**\n * Set getter and setter to property if it's configurable\n *\n * @param object target object with property\n * @param property property name\n * @param descriptor contains getter and setter functions\n * @returns is operation successful\n */\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n\n /**\n * Determines whether the passed value is NaN\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN\n *\n * @param num arbitrary value\n * @returns if provided value is NaN\n */\n var nativeIsNaN = function nativeIsNaN(num) {\n // eslint-disable-next-line no-restricted-properties\n var native = Number.isNaN || window.isNaN;\n return native(num);\n };\n /**\n * Determines whether the passed value is a finite number\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite\n *\n * @param num arbitrary value\n * @returns if provided value is finite\n */\n var nativeIsFinite = function nativeIsFinite(num) {\n // eslint-disable-next-line no-restricted-properties\n var native = Number.isFinite || window.isFinite;\n return native(num);\n };\n\n /**\n * Parses string for a number, if possible, otherwise returns null.\n *\n * @param rawString arbitrary string\n * @returns number or null if string not parsable\n */\n var getNumberFromString = function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n };\n\n /**\n * Generate a random integer between two values, inclusive\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive\n *\n * @param min range minimum\n * @param max range maximum\n * @returns random number\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n\n /**\n * A literal string or regexp pattern wrapped in forward slashes.\n * For example, 'simpleStr' or '/adblock|_0x/'.\n */\n\n /**\n * String.prototype.replaceAll polyfill\n *\n * @param input input string\n * @param substr to look for\n * @param newSubstr replacement\n * @returns result string\n */\n var replaceAll = function replaceAll(input, substr, newSubstr) {\n return input.split(substr).join(newSubstr);\n };\n\n /**\n * Escapes special chars in string\n *\n * @param str raw string\n * @returns string with escaped special characters\n */\n var escapeRegExp = function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n\n /**\n * Converts string to the regexp,\n * if string contains valid regexp flags it will be converted to regexp with flags\n * TODO think about nested dependencies, but be careful with dependency loops\n *\n * @param input literal string or regexp pattern; defaults to '' (empty string)\n * @returns regular expression; defaults to /.?/\n */\n var toRegExp = function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var DEFAULT_VALUE = '.?';\n var FORWARD_SLASH = '/';\n if (input === '') {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n\n /**\n * Checks whether the string is a valid regexp flag\n *\n * @param flag string\n * @returns True if regexp flag is valid, otherwise false.\n */\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n // eslint-disable-next-line no-new\n new RegExp('', flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n\n /**\n * Checks whether the text string contains valid regexp flags,\n * and returns `flagsStr` if valid, otherwise empty string.\n *\n * @param regExpStr string\n * @param flagsStr string\n * @returns `flagsStr` if it is valid, otherwise empty string.\n */\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH)\n // Not a correct regex if ends with '\\\\/'\n && !regExpStr.endsWith('\\\\/') && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return '';\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input\n // remove quotes' escapes for cases where scriptlet rule argument has own escaped quotes\n // e.g #%#//scriptlet('prevent-setTimeout', '.css(\\'display\\',\\'block\\');')\n .replace(/\\\\'/g, '\\'').replace(/\\\\\"/g, '\"')\n // escape special characters for following RegExp construction\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(escaped);\n };\n\n /**\n * Checks whether the input string can be converted to regexp\n *\n * @param input literal string or regexp pattern\n * @returns if input can be converted to regexp\n */\n var isValidStrPattern = function isValidStrPattern(input) {\n var FORWARD_SLASH = '/';\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n };\n\n /**\n * Get string before regexp first match\n *\n * @param str input string\n * @param rx find pattern\n * @returns result string\n */\n var getBeforeRegExp = function getBeforeRegExp(str, rx) {\n var index = str.search(rx);\n return str.substring(0, index);\n };\n var substringAfter$1 = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n var substringBefore = function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n };\n\n /**\n * Wrap str in single quotes and replaces single quotes to double one\n *\n * @param str input string\n * @returns string with swapped quotes\n */\n var wrapInSingleQuotes = function wrapInSingleQuotes(str) {\n if (str[0] === '\\'' && str[str.length - 1] === '\\'' || str[0] === '\"' && str[str.length - 1] === '\"') {\n str = str.substring(1, str.length - 1);\n }\n // eslint-disable-next-line no-useless-escape\n str = str.replace(/\\'/g, '\"');\n return \"'\".concat(str, \"'\");\n };\n\n /**\n * Returns substring enclosed in the widest braces\n *\n * @param str input string\n * @returns substring\n */\n var getStringInBraces = function getStringInBraces(str) {\n var firstIndex = str.indexOf('(');\n var lastIndex = str.lastIndexOf(')');\n return str.substring(firstIndex + 1, lastIndex);\n };\n\n /**\n * Prepares RTCPeerConnection config as string for proper logging\n *\n * @param config RTC config\n * @returns stringified config\n */\n var convertRtcConfigToString = function convertRtcConfigToString(config) {\n var UNDEF_STR = 'undefined';\n var str = UNDEF_STR;\n if (config === null) {\n str = 'null';\n } else if (config instanceof Object) {\n var SERVERS_PROP_NAME = 'iceServers';\n var URLS_PROP_NAME = 'urls';\n /*\n const exampleConfig = {\n 'iceServers': [\n 'urls': ['stun:35.66.206.188:443'],\n ],\n };\n */\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n };\n\n /**\n * Checks whether the match input string can be converted to regexp,\n * used for match inputs with possible negation\n *\n * @param match literal string or regexp pattern\n * @returns true if input can be converted to regexp\n */\n var isValidMatchStr = function isValidMatchStr(match) {\n var INVERT_MARKER = '!';\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n };\n\n /**\n * Validates the match input number,\n * used for match inputs with possible negation\n *\n * @param match string of match number\n * @returns if match number is valid\n */\n var isValidMatchNumber = function isValidMatchNumber(match) {\n var INVERT_MARKER = '!';\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n var num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n };\n\n /**\n * Parses match arg with possible negation for no matching.\n * Needed for prevent-setTimeout, prevent-setInterval,\n * prevent-requestAnimationFrame and prevent-window-open\n *\n * @param match matching arg\n * @returns data prepared for matching\n */\n var parseMatchArg = function parseMatchArg(match) {\n var INVERT_MARKER = '!';\n // In case if \"match\" is \"undefined\" return \"false\"\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch,\n matchRegexp,\n matchValue\n };\n };\n\n /**\n * Parses delay arg with possible negation for no matching.\n * Needed for prevent-setTimeout and prevent-setInterval\n *\n * @param delay scriptlet's delay arg\n * @returns parsed delay data\n */\n var parseDelayArg = function parseDelayArg(delay) {\n var INVERT_MARKER = '!';\n var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER);\n var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n var parsedDelay = parseInt(delayValue, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return {\n isInvertedDelayMatch,\n delayMatch\n };\n };\n\n /**\n * Converts object to string for logging\n *\n * @param obj data object\n * @returns object's string representation\n */\n var objectToString = function objectToString(obj) {\n // In case if the type of passed obj is different than Object\n // https://github.com/AdguardTeam/Scriptlets/issues/282\n if (!obj || typeof obj !== 'object') {\n return String(obj);\n }\n return isEmptyObject(obj) ? '{}' : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, \":\\\"\").concat(recordValueStr, \"\\\"\");\n }).join(' ');\n };\n\n /**\n * Converts types into a string\n *\n * @param value input value type\n * @returns type's string representation\n */\n var convertTypeToString = function convertTypeToString(value) {\n var output;\n if (typeof value === 'undefined') {\n output = 'undefined';\n } else if (typeof value === 'object') {\n if (value === null) {\n output = 'null';\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n };\n\n /**\n * Generate a random string, a length of the string is provided as an argument\n *\n * @param length output's length\n * @returns random string\n */\n function getRandomStrByLength(length) {\n var result = '';\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~';\n var charactersLength = characters.length;\n for (var i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n\n /**\n * Generate a random string\n *\n * @param customResponseText response text to include in output\n * @returns random string or null if passed argument is invalid\n */\n function generateRandomResponse(customResponseText) {\n var customResponse = customResponseText;\n if (customResponse === 'true') {\n // Generate random alphanumeric string of 10 symbols\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace('length:', '');\n var rangeRegex = /^\\d+-\\d+$/;\n // Return empty string if range is invalid\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n var rangeMin = getNumberFromString(customResponse.split('-')[0]);\n var rangeMax = getNumberFromString(customResponse.split('-')[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n\n // If rangeMin > rangeMax, swap variables\n if (rangeMin > rangeMax) {\n var temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n var LENGTH_RANGE_LIMIT = 500 * 1000;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n var length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n\n /**\n * Infers value from string argument\n * Inferring goes from more specific to more ambiguous options\n * Arrays, objects and strings are parsed via JSON.parse\n *\n * @param value arbitrary string\n * @returns converted value\n * @throws an error on unexpected input\n */\n function inferValue(value) {\n if (value === 'undefined') {\n return undefined;\n }\n if (value === 'false') {\n return false;\n }\n if (value === 'true') {\n return true;\n }\n if (value === 'null') {\n return null;\n }\n if (value === 'NaN') {\n return NaN;\n }\n\n // Number class constructor works 2 times faster than JSON.parse\n // and wont interpret mixed inputs like '123asd' as parseFloat would\n var MAX_ALLOWED_NUM = 32767;\n var numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error('number values bigger than 32767 are not allowed');\n }\n return numVal;\n }\n var errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n // Parse strings, arrays and objects represented as JSON strings\n // '[1,2,3,\"string\"]' > [1, 2, 3, 'string']\n // '\"arbitrary string\"' > 'arbitrary string'\n var parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === 'string') {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n\n /**\n * Transition names\n */\n\n /**\n * Iterate over iterable argument and evaluate current state with transitions\n *\n * @param iterable rule or list or rules\n * @param transitions helper object with transition functions\n * @param init first transition name\n * @param args arguments which should be passed to transition functions\n * @returns state\n */\n function iterateWithTransitions(iterable, transitions, init, args) {\n var state = init || Object.keys(transitions)[0];\n for (var i = 0; i < iterable.length; i += 1) {\n state = transitions[state](iterable, i, args);\n }\n return state;\n }\n\n /**\n * AdGuard scriptlet rule mask\n */\n var ADG_SCRIPTLET_MASK = '#//scriptlet';\n\n /**\n * Helper to accumulate an array of strings char by char\n *\n * @returns object with helper methods\n */\n var wordSaver = function wordSaver() {\n var str = '';\n var strings = [];\n var saveSymb = function saveSymb(s) {\n str += s;\n return str;\n };\n var saveStr = function saveStr() {\n strings.push(str);\n str = '';\n };\n var getAll = function getAll() {\n return [...strings];\n };\n return {\n saveSymb,\n saveStr,\n getAll\n };\n };\n var substringAfter = function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? '' : str.substring(index + separator.length);\n };\n\n /**\n * Parses scriptlet rule and validates its syntax.\n *\n * @param ruleText Rule string\n *\n * @returns Parsed rule data.\n * @throws An error on invalid rule syntax.\n */\n var parseRule = function parseRule(ruleText) {\n ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK);\n /**\n * Transition function: the current index position in start, end or between params\n *\n * @param rule rule string\n * @param index index\n * @param Object helper object that contains prop symb with current separator char\n * @param Object.sep contains prop `symb` with current separator char\n * @throws throws if given rule is not a scriptlet\n * @returns transition\n */\n var opened = function opened(rule, index, _ref) {\n var sep = _ref.sep;\n var char = rule[index];\n var transition;\n switch (char) {\n case ' ':\n case '(':\n case ',':\n {\n transition = \"opened\";\n break;\n }\n case '\\'':\n case '\"':\n {\n sep.symb = char;\n transition = \"param\";\n break;\n }\n case ')':\n {\n transition = index === rule.length - 1 ? \"closed\" : \"opened\";\n break;\n }\n default:\n {\n throw new Error('The rule is not a scriptlet');\n }\n }\n return transition;\n };\n\n /**\n * Transition function: the current index position inside param\n *\n * @param rule rule string\n * @param index index\n * @param Object helper object\n * @param Object.sep contains prop `symb` with current separator char\n * @param Object.saver helper which allow to save strings by car by cha\n * @returns transition\n */\n var param = function param(rule, index, _ref2) {\n var saver = _ref2.saver,\n sep = _ref2.sep;\n var char = rule[index];\n switch (char) {\n case '\\'':\n case '\"':\n {\n var preIndex = index - 1;\n var before = rule[preIndex];\n if (char === sep.symb && before !== '\\\\') {\n sep.symb = null;\n saver.saveStr();\n return \"opened\";\n }\n }\n // eslint-disable-next-line no-fallthrough\n default:\n {\n saver.saveSymb(char);\n return \"param\";\n }\n }\n };\n var transitions = {\n [\"opened\"]: opened,\n [\"param\"]: param,\n [\"closed\"]: function () {}\n };\n var sep = {\n symb: null\n };\n var saver = wordSaver();\n var state = iterateWithTransitions(ruleText, transitions, \"opened\", {\n sep,\n saver\n });\n if (state !== \"closed\") {\n throw new Error(\"Invalid scriptlet rule \".concat(ruleText));\n }\n var args = saver.getAll();\n return {\n name: args[0],\n args: args.slice(1)\n };\n };\n\n /**\n * Validates event type\n *\n * @param type event type\n * @returns true if type is valid\n */\n var validateType = function validateType(type) {\n // https://github.com/AdguardTeam/Scriptlets/issues/125\n return typeof type !== 'undefined';\n };\n\n /**\n * Validates event listener\n *\n * @param listener event listener\n * @returns true if listener callback is valid\n */\n var validateListener = function validateListener(listener) {\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters\n return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object'\n // https://github.com/AdguardTeam/Scriptlets/issues/76\n && listener !== null && 'handleEvent' in listener && typeof listener.handleEvent === 'function');\n };\n\n /**\n * Serialize valid event listener\n * https://developer.mozilla.org/en-US/docs/Web/API/EventListener\n *\n * @param listener valid listener\n * @returns listener string\n */\n var listenerToString = function listenerToString(listener) {\n return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString();\n };\n\n var shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) {\n return delay === '*';\n };\n\n /**\n * Handles input delay value\n *\n * @param delay matchDelay argument of adjust-* scriptlets\n * @returns proper number delay value\n */\n var getMatchDelay = function getMatchDelay(delay) {\n var DEFAULT_DELAY = 1000;\n var parsedDelay = parseInt(delay, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY // default scriptlet value\n : parsedDelay;\n return delayMatch;\n };\n\n /**\n * Checks delay match condition\n *\n * @param inputDelay matchDelay argument of adjust-* scriptlets\n * @param realDelay delay argument of setTimeout/setInterval\n * @returns if given delays match\n */\n var isDelayMatched = function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n };\n\n /**\n * Handles input boost value\n *\n * @param boost boost argument of adjust-* scriptlets\n * @returns proper number boost multiplier value\n */\n var getBoostMultiplier = function getBoostMultiplier(boost) {\n var DEFAULT_MULTIPLIER = 0.05;\n // https://github.com/AdguardTeam/Scriptlets/issues/262\n var MIN_MULTIPLIER = 0.001;\n var MAX_MULTIPLIER = 50;\n var parsedBoost = parseFloat(boost);\n var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value\n : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n };\n\n /**\n * Some browsers do not support Array.prototype.flat()\n * for example, Opera 42 which is used for browserstack tests\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n *\n * @param input arbitrary array\n * @returns flattened array\n */\n var flatten = function flatten(input) {\n var stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n var res = [];\n while (stack.length) {\n // pop value from stack\n var next = stack.pop();\n if (Array.isArray(next)) {\n // push back array items, won't modify the original input\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n // reverse to restore input order\n return res.reverse();\n };\n\n /**\n * Predicate method to check if the array item exists\n *\n * @param item arbitrary\n * @returns if item is truthy or not\n */\n var isExisting = function isExisting(item) {\n return !!item;\n };\n\n /**\n * Converts NodeList to array\n *\n * @param {NodeList} nodeList arbitrary NodeList\n * @returns {Node[Array]} array of nodes\n */\n var nodeListToArray = function nodeListToArray(nodeList) {\n var nodes = [];\n for (var i = 0; i < nodeList.length; i += 1) {\n nodes.push(nodeList[i]);\n }\n return nodes;\n };\n\n /**\n * Checks whether the input path is supported\n *\n * @param rawPath input path\n * @returns if cookie path is valid\n */\n var isValidCookiePath = function isValidCookiePath(rawPath) {\n return rawPath === '/' || rawPath === 'none';\n };\n\n /**\n * Returns 'path=/' if rawPath is '/'\n * or empty string '' for other cases, `rawPath === 'none'` included\n *\n * @param rawPath path argument of *set-cookie-* scriptlets\n * @returns cookie path\n */\n var getCookiePath = function getCookiePath(rawPath) {\n if (rawPath === '/') {\n return 'path=/';\n }\n // otherwise do not set path as invalid\n // the same for pathArg === 'none'\n return '';\n };\n\n /**\n * Combines input cookie name, value, and path into string.\n *\n * @param rawName name argument of *set-cookie-* scriptlets\n * @param rawValue value argument of *set-cookie-* scriptlets\n * @param rawPath path argument of *set-cookie-* scriptlets\n * @param shouldEncode if cookie's name and value should be encoded\n * @returns string OR `null` if name or value is invalid\n */\n var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = ';';\n // semicolon will cause the cookie to break\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n };\n\n /**\n * Gets supported cookie value\n *\n * @param value input cookie value\n * @returns valid cookie string if ok OR null if not\n */\n var getLimitedCookieValue = function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n var allowedCookieValues = new Set(['true', 'false', 'yes', 'y', 'no', 'n', 'ok', 'accept', 'reject', 'allow', 'deny']);\n var validValue;\n if (allowedCookieValues.has(value.toLowerCase())) {\n validValue = value;\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n };\n\n /**\n * Object to represent document.cookie-like string\n */\n\n /**\n * Parses cookie string into object\n *\n * @param cookieString string that conforms to document.cookie format\n * @returns key:value object that corresponds with incoming cookies keys and values\n */\n var parseCookieString = function parseCookieString(cookieString) {\n var COOKIE_DELIMITER = '=';\n var COOKIE_PAIRS_DELIMITER = ';';\n\n // Get raw cookies\n var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n var cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n var cookieKey;\n var cookieValue = '';\n var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n // Save cookie key=value data with null instead of empty ('') values\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n };\n\n /**\n * Check if cookie with specified name and value is present in a cookie string\n *\n * @param cookieString 'document.cookie'-like string\n * @param name name argument of *set-cookie-* scriptlets\n * @param value value argument of *set-cookie-* scriptlets\n * @returns if cookie is already set\n */\n var isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(';').some(function (cookieStr) {\n var pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return false;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n var cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n };\n\n /**\n * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid\n *\n * @param offsetExpiresSec input offset param in seconds\n * @returns number is milliseconds OR null\n */\n var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) {\n var ONE_YEAR_EXPIRATION_KEYWORD = '1year';\n var ONE_DAY_EXPIRATION_KEYWORD = '1day';\n var MS_IN_SEC = 1000;\n var SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n var SECONDS_IN_DAY = 24 * 60 * 60;\n var parsedSec;\n // Set predefined expire value if corresponding keyword was passed\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n // If offsetExpiresSec has been parsed to NaN - do not set cookie at all\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n };\n\n /**\n * Noop function\n */\n var noopFunc = function noopFunc() {};\n\n /**\n * Function returns noopFunc\n *\n * @returns noopFunc\n */\n var noopCallbackFunc = function noopCallbackFunc() {\n return noopFunc;\n };\n\n /**\n * Function returns null\n *\n * @returns null\n */\n var noopNull = function noopNull() {\n return null;\n };\n\n /**\n * Function returns true\n *\n * @returns true\n */\n var trueFunc = function trueFunc() {\n return true;\n };\n\n /**\n * Function returns false\n *\n * @returns false\n */\n var falseFunc = function falseFunc() {\n return false;\n };\n\n /**\n * Function returns this\n *\n * @returns this object\n */\n function noopThis() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return this;\n }\n\n /**\n * Function returns empty string\n *\n * @returns empty string\n */\n var noopStr = function noopStr() {\n return '';\n };\n\n /**\n * Function returns empty array\n *\n * @returns empty array\n */\n var noopArray = function noopArray() {\n return [];\n };\n\n /**\n * Function returns empty object\n *\n * @returns empty object\n */\n var noopObject = function noopObject() {\n return {};\n };\n\n /**\n * Function throws an error\n *\n * @throws\n */\n var throwFunc = function throwFunc() {\n throw new Error();\n };\n\n /**\n * Function returns Promise.reject()\n *\n * @returns rejected Promise\n */\n var noopPromiseReject = function noopPromiseReject() {\n return Promise.reject();\n };\n\n /**\n * Returns Promise object that is resolved with specified props\n *\n * @param responseBody value to set as responseBody\n * @param responseUrl value to set as responseUrl\n * @param responseType value to set as responseType\n * @returns resolved Promise or undefined if Response interface is not available\n */\n var noopPromiseResolve = function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}';\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default';\n if (typeof Response === 'undefined') {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: 'OK'\n });\n\n // Mock response' url & type to avoid adb checks\n // https://github.com/AdguardTeam/Scriptlets/issues/216\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n\n // eslint-disable-next-line consistent-return\n return Promise.resolve(response);\n };\n\n /**\n * Determines if type of script is inline or injected\n * and when it's one of them then return true, otherwise false\n * https://github.com/AdguardTeam/Scriptlets/issues/201\n *\n * @param stackMatch input stack value to match\n * @param stackTrace script error stack trace\n * @returns if stacks match\n */\n var shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = 'inlineScript';\n var INJECTED_SCRIPT_STRING = 'injectedScript';\n var INJECTED_SCRIPT_MARKER = '';\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf('#');\n // Remove URL hash\n // in Chrome, URL in stackTrace doesn't contain hash\n // so, it's necessary to remove it, otherwise location.href\n // will not match with location from stackTrace\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split('\\n').slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n // Get stack trace URL\n // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20\n // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16)\n // so, first group \"(.*?@)\" is required for Firefox, second group contains URL\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith('(')) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith('at')) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n };\n\n /**\n * Finds shadow-dom host (elements with shadowRoot property) in DOM of rootElement.\n *\n * @param rootElement shadow dom root\n * @returns shadow-dom hosts\n */\n var findHostElements = function findHostElements(rootElement) {\n var hosts = [];\n if (rootElement) {\n // Element.querySelectorAll() returns list of elements\n // which are defined in DOM of Element.\n // Meanwhile, inner DOM of the element with shadowRoot property\n // is absolutely another DOM and which can not be reached by querySelectorAll('*')\n var domElems = rootElement.querySelectorAll('*');\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n }\n return hosts;\n };\n\n /**\n * A collection of nodes.\n *\n * @external NodeList\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/NodeList NodeList}\n */\n\n /**\n * Pierces open shadow-dom in order to find:\n * - elements by 'selector' matching\n * - inner shadow-dom hosts\n *\n * @param selector DOM elements selector\n * @param hostElements shadow-dom hosts\n * @returns object with found elements and shadow-dom hosts\n */\n var pierceShadowDom = function pierceShadowDom(selector, hostElements) {\n var targets = [];\n var innerHostsAcc = [];\n\n // it's possible to get a few hostElements found by baseSelector on the page\n hostElements.forEach(function (host) {\n // check presence of selector element inside base element if it's not in shadow-dom\n var simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n var shadowRootElem = host.shadowRoot;\n var shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n\n // find inner shadow-dom hosts inside processing shadow-dom\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n\n // if there were more than one host element,\n // innerHostsAcc is an array of arrays and should be flatten\n var innerHosts = flatten(innerHostsAcc);\n return {\n targets,\n innerHosts\n };\n };\n\n /**\n * Checks whether the passed arg is proper callback\n *\n * @param callback arbitrary callback\n * @returns if callback is valid\n */\n var isValidCallback = function isValidCallback(callback) {\n return callback instanceof Function\n // passing string as 'code' arg is not recommended\n // but it is possible and not restricted\n // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters\n || typeof callback === 'string';\n };\n\n /**\n * Parses delay argument of setTimeout / setInterval methods into\n * rounded down number for number/string values or passes on for other types.\n * Needed for prevent-setTimeout and prevent-setInterval\n *\n * @param delay native method delay arg\n * @returns number as parsed delay or any input type if `delay` is not parsable\n */\n var parseRawDelay = function parseRawDelay(delay) {\n var parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n };\n /**\n * Checks whether 'callback' and 'delay' are matching\n * by given parameters 'matchCallback' and 'matchDelay'.\n * Used for prevent-setTimeout and prevent-setInterval.\n *\n * @param preventData set of data to determine if scriptlet should match\n * @param preventData.callback method's callback arg\n * @param preventData.delay method's delay arg\n * @param preventData.matchCallback scriptlets's callback arg\n * @param preventData.matchDelay scriptlets's delay arg\n * @returns if scriptlet should match\n */\n var isPreventionNeeded = function isPreventionNeeded(_ref) {\n var callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n // if callback is has not valid type\n // scriptlet can not prevent it\n // so no need for more checking and do not call hit() later\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n var _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n\n // Parse delay for decimal, string and non-number values\n // https://github.com/AdguardTeam/Scriptlets/issues/247\n var parsedDelay = parseRawDelay(delay);\n var shouldPrevent = false;\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n var callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n };\n\n var handleOldReplacement = function handleOldReplacement(replacement) {\n var result;\n // defaults to return noopFunc instead of window.open\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === 'trueFunc') {\n result = trueFunc;\n } else if (replacement.includes('=')) {\n // We should return noopFunc instead of window.open\n // but with some property if website checks it (examples 5, 6)\n // https://github.com/AdguardTeam/Scriptlets/issues/71\n var isProp = replacement.startsWith('{') && replacement.endsWith('}');\n if (isProp) {\n var propertyPart = replacement.slice(1, -1);\n var propertyName = substringBefore(propertyPart, '=');\n var propertyValue = substringAfter$1(propertyPart, '=');\n if (propertyValue === 'noopFunc') {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n };\n /**\n * Creates a decoy HTML element with a specified URL and delay before removal\n *\n * @param args an object with `replacement`, `url`, and `delay` properties\n * @returns the decoy element that was created and added to the document body\n */\n var createDecoy = function createDecoy(args) {\n var UrlPropNameOf = /*#__PURE__*/function (UrlPropNameOf) {\n UrlPropNameOf[\"Object\"] = \"data\";\n UrlPropNameOf[\"Iframe\"] = \"src\";\n return UrlPropNameOf;\n }({});\n var replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n var tag;\n if (replacement === 'obj') {\n tag = \"object\";\n } else {\n tag = \"iframe\";\n }\n var decoy = document.createElement(tag);\n if (decoy instanceof HTMLObjectElement) {\n decoy[UrlPropNameOf.Object] = url;\n } else if (decoy instanceof HTMLIFrameElement) {\n decoy[UrlPropNameOf.Iframe] = url;\n }\n decoy.style.setProperty('height', '1px', 'important');\n decoy.style.setProperty('position', 'fixed', 'important');\n decoy.style.setProperty('top', '-1px', 'important');\n decoy.style.setProperty('width', '1px', 'important');\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1000);\n return decoy;\n };\n var getPreventGetter = function getPreventGetter(nativeGetter) {\n var preventGetter = function preventGetter(target, prop) {\n if (prop && prop === 'closed') {\n return false;\n }\n if (typeof nativeGetter === 'function') {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n };\n\n /* eslint-disable no-console, no-underscore-dangle */\n\n /**\n * Hit used only for debug purposes now\n *\n * @param source scriptlet properties\n * use LOG_MARKER = 'log: ' at the start of a message\n * for logging scriptlets\n */\n var hit = function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || '';\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = '#%#//';\n var UBO_SCRIPTLET_MARKER = '##+js';\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n // delete all domains from ruleText and leave just rule part\n var rulePart = source.ruleText.slice(ruleStartIndex);\n // prepare applied scriptlet rule for specific domain\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {\n // try catch for Edge 15\n // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/\n // console.log throws an error\n }\n\n // This is necessary for unit-tests only!\n if (typeof window.__debug === 'function') {\n window.__debug(source);\n }\n };\n\n /**\n * Check if the property exists in the base object (recursively).\n * Similar to getPropertyInChain but upgraded for json-prune:\n * handle wildcard properties and does not define nonexistent base property as 'undefined'\n *\n * @param base object that owns chain\n * @param chain chain of owner properties\n * @param lookThrough should the method look through it's props in order to find wildcard\n * @param output result acc\n * @returns list of ChainInfo objects\n */\n function getWildcardPropertyInChain(base, chain) {\n var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n var pos = chain.indexOf('.');\n if (pos === -1) {\n // for paths like 'a.b.*' every final nested prop should be processed\n if (chain === '*' || chain === '[]') {\n // eslint-disable-next-line no-restricted-syntax\n for (var key in base) {\n // to process each key in base except inherited ones\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base,\n prop: chain\n });\n }\n return output;\n }\n var prop = chain.slice(0, pos);\n var shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object;\n if (shouldLookThrough) {\n var nextProp = chain.slice(pos + 1);\n var baseKeys = Object.keys(base);\n\n // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'),\n // each one of base keys should be considered as a potential chain prop in final path\n baseKeys.forEach(function (key) {\n var item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n\n /**\n * Conditionally logs message to console.\n * Convention is to log messages by source.verbose if such log\n * is not a part of scriptlet's functionality, eg on invalid input,\n * and use 'forced' argument otherwise.\n *\n * @param source required, scriptlet properties\n * @param message required, message to log\n * @param forced to log message unconditionally\n * @param convertMessageToString to convert message to string\n */\n var logMessage = function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n\n // eslint-disable-next-line no-console\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n // Template literals convert object to string,\n // so 'message' should not be passed to template literals\n // as it will not be logged correctly\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n };\n\n /**\n * Checks if prunning is required\n *\n * @param source required, scriptlet properties\n * @param root object which should be pruned or logged\n * @param prunePaths array with string of space-separated property chains to remove\n * @param requiredPaths array with string of space-separated propertiy chains\n * which must be all present for the pruning to occur\n * @returns true if prunning is required\n */\n function isPruningNeeded(source, root, prunePaths, requiredPaths) {\n if (!root) {\n return false;\n }\n var shouldProcess;\n\n // Only log hostname and matched JSON payload if only second argument is present\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n var rootString = JSON.stringify(root);\n var matchRegex = toRegExp(requiredPaths.join(''));\n var shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n var wildcardSymbols = ['.*.', '*.', '.*', '.[].', '[].', '.[]'];\n var _loop = function _loop() {\n var requiredPath = requiredPaths[i];\n var lastNestedPropName = requiredPath.split('.').pop();\n var hasWildcard = wildcardSymbols.some(function (symbol) {\n return requiredPath.includes(symbol);\n });\n\n // if the path has wildcard, getPropertyInChain should 'look through' chain props\n var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n\n // start value of 'shouldProcess' due to checking below\n shouldProcess = !hasWildcard;\n for (var j = 0; j < details.length; j += 1) {\n var hasRequiredProp = typeof lastNestedPropName === 'string' && details[j].base[lastNestedPropName] !== undefined;\n if (hasWildcard) {\n // if there is a wildcard,\n // at least one (||) of props chain should be present in object\n shouldProcess = hasRequiredProp || shouldProcess;\n } else {\n // otherwise each one (&&) of them should be there\n shouldProcess = hasRequiredProp && shouldProcess;\n }\n }\n };\n for (var i = 0; i < requiredPaths.length; i += 1) {\n _loop();\n }\n return shouldProcess;\n }\n\n /**\n * Prunes properties of 'root' object\n *\n * @param source required, scriptlet properties\n * @param root object which should be pruned or logged\n * @param prunePaths array with string of space-separated properties to remove\n * @param requiredPaths array with string of space-separated properties\n * which must be all present for the pruning to occur\n * @returns pruned root\n */\n var jsonPruner = function jsonPruner(source, root, prunePaths, requiredPaths) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === 'object') {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) {\n return root;\n }\n\n // if pruning is needed, we check every input pathToRemove\n // and delete it if root has it\n prunePaths.forEach(function (path) {\n var ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n };\n\n /**\n * Returns the native `RegExp.prototype.test` method if it exists.\n *\n * @returns The native `RegExp.prototype.test` method.\n * @throws If `RegExp.prototype.test` is not a function.\n */\n var getNativeRegexpTest = function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'test');\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === 'function') {\n return nativeRegexTest;\n }\n throw new Error('RegExp.prototype.test is not a function');\n };\n\n /**\n * Modifies original response with the given replacement data.\n *\n * @param origResponse Original response.\n * @param replacement Replacement data for response with possible keys:\n * - `body`: optional, string, default to '{}';\n * - `type`: optional, string, original response type is used if not specified.\n *\n * @returns Modified response.\n */\n var modifyResponse = function modifyResponse(origResponse) {\n var _origResponse$headers;\n var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n body: '{}'\n };\n var headers = {};\n origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) {\n headers[key] = value;\n });\n var modifiedResponse = new Response(replacement.body, {\n status: origResponse.status,\n statusText: origResponse.statusText,\n headers\n });\n\n // Mock response url and type to avoid adblocker detection\n // https://github.com/AdguardTeam/Scriptlets/issues/216\n Object.defineProperties(modifiedResponse, {\n url: {\n value: origResponse.url\n },\n type: {\n value: replacement.type || origResponse.type\n }\n });\n return modifiedResponse;\n };\n\n /**\n * Aggregates fetch and XMLHttpRequest.open arguments\n * to operate on arbitrary request data objects\n */\n\n /**\n * Object which is populated with request data from scriptlet arguments\n */\n\n /**\n * Derivative of ParsedMatchProps with its values being\n * converted to RegExp\n */\n\n /**\n * Fetch and xhr.open options that are valid props\n * to match for (trusted-)prevent-(fetch|xhr) scriptlets\n *\n * This type is being derived from getRequestProps return type\n * as enums would be lost at build time disregarding 'const'\n */\n\n /**\n * Returns array of request props that are supported by fetch/xhr scriptlets.\n * Includes common 'url' and 'method' props and all other fetch-specific props\n *\n * @returns list of request props\n */\n var getRequestProps = function getRequestProps() {\n return ['url', 'method', 'headers', 'body', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal', 'mode'];\n };\n\n /**\n * Collects Request options to object\n *\n * @param request Request instance to collect properties from\n * @returns data object\n */\n var getRequestData = function getRequestData(request) {\n var requestInitOptions = getRequestProps();\n var entries = requestInitOptions.map(function (key) {\n // if request has no such option, value will be undefined\n var value = request[key];\n return [key, value];\n });\n return Object.fromEntries(entries);\n };\n\n /**\n * Collects fetch args to object\n *\n * @param args fetch args\n * @returns data object\n */\n var getFetchData = function getFetchData(args) {\n var fetchPropsObj = {};\n var fetchUrl;\n var fetchInit;\n if (args[0] instanceof Request) {\n // if Request passed to fetch, it will be in array\n var requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0]; // eslint-disable-line prefer-destructuring\n fetchInit = args[1]; // eslint-disable-line prefer-destructuring\n }\n\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n var props = Object.keys(fetchInit);\n props.forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n };\n\n /**\n * Collect xhr.open arguments to object\n *\n * @param method request method\n * @param url request url\n * @param async request async prop\n * @param user request user prop\n * @param password request password prop\n * @returns aggregated request data\n */\n var getXhrData = function getXhrData(method, url, async, user, password) {\n return {\n method,\n url,\n async,\n user,\n password\n };\n };\n\n /**\n * Parse propsToMatch input string into object;\n * used for prevent-fetch and prevent-xhr\n *\n * @param propsToMatchStr string of space-separated request properties to match\n * @returns object where 'key' is prop name and 'value' is prop value\n */\n var parseMatchProps = function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = ' ';\n var PAIRS_MARKER = ':';\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n // Escape multiple colons in prop\n // i.e regex value and/or url with protocol specified, with or without 'url:' match prop\n // https://github.com/AdguardTeam/Scriptlets/issues/216#issuecomment-1178591463\n propsObj.url = prop;\n }\n });\n return propsObj;\n };\n\n /**\n * Validates parsed data values\n *\n * @param data request data\n * @returns if data is valid\n */\n var isValidParsedData = function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n };\n\n /**\n * Converts valid parsed data to data obj for further matching\n *\n * @param data parsed request data\n * @returns data obj ready for matching\n */\n var getMatchPropsData = function getMatchPropsData(data) {\n var matchData = {};\n // Assertion is required, as Object.keys always returns string[]\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n };\n\n /**\n * Sets item to a specified storage, if storage isn't full.\n *\n * @param source scriptlet's configuration\n * @param storage storage instance to set item into\n * @param key storage key\n * @param value staroge value\n */\n var setStorageItem = function setStorageItem(source, storage, key, value) {\n // setItem() may throw an exception if the storage is full.\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n };\n\n /**\n * Removes the key/value pair with the given `key` from the `storage`.\n * If unable to remove, logs the reason to console in debug mode.\n *\n * @param source scriptlet's configuration\n * @param storage storage instance from which item has to be removed\n * @param key storage key\n */\n var removeStorageItem = function removeStorageItem(source, storage, key) {\n try {\n storage.removeItem(key);\n } catch (e) {\n var message = \"Unable to remove storage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n };\n\n /**\n * Gets supported storage item value\n *\n * @param value input item value\n * @returns valid item value if ok OR null if not\n */\n var getLimitedStorageItemValue = function getLimitedStorageItemValue(value) {\n if (typeof value !== 'string') {\n throw new Error('Invalid value');\n }\n var validValue;\n if (value === 'undefined') {\n validValue = undefined;\n } else if (value === 'false') {\n validValue = false;\n } else if (value === 'true') {\n validValue = true;\n } else if (value === 'null') {\n validValue = null;\n } else if (value === 'emptyArr') {\n validValue = '[]';\n } else if (value === 'emptyObj') {\n validValue = '{}';\n } else if (value === '') {\n validValue = '';\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error('Invalid value');\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error('Invalid value');\n }\n } else if (value === 'yes') {\n validValue = 'yes';\n } else if (value === 'no') {\n validValue = 'no';\n } else if (value === '$remove$') {\n validValue = '$remove$';\n } else {\n throw new Error('Invalid value');\n }\n return validValue;\n };\n\n /**\n * Generates function which silents global errors on page generated by scriptlet\n * If error doesn't belong to our error we transfer it to the native onError handler\n *\n * @param rid - unique identifier of scriptlet\n * @returns window.onerror handler\n */\n function createOnErrorHandler(rid) {\n // eslint-disable-next-line consistent-return\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === 'string' && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n\n /**\n * Generate random seven symbols id\n *\n * @returns randomized id\n */\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n\n /**\n * Prevents infinite loops when trapping props that could be used by scriptlet's own helpers\n * Example: window.RegExp, that is used by matchStackTrace > toRegExp\n *\n * https://github.com/AdguardTeam/Scriptlets/issues/251\n * https://github.com/AdguardTeam/Scriptlets/issues/226\n * https://github.com/AdguardTeam/Scriptlets/issues/232\n *\n * @returns descriptor addon\n */\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n // try...catch is required in case there are more than one inline scripts\n // which should be aborted,\n // so after the first successful abortion, `cb(...args);` will throw error,\n // and we should not stop on that and continue to abort other scripts\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n var rid = randomId();\n this.isAbortingSuspended = false;\n // It's necessary to throw error\n // otherwise script will be not aborted\n throw new ReferenceError(rid);\n }\n }\n };\n }\n\n /**\n * Check if the property exists in the base object (recursively)\n *\n * If property doesn't exist in base object,\n * defines this property as 'undefined'\n * and returns base, property name and remaining part of property chain\n *\n * @param base object that owns chain\n * @param chain chain of owner properties\n * @returns chain info object\n */\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf('.');\n if (pos === -1) {\n return {\n base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n\n // https://github.com/AdguardTeam/Scriptlets/issues/128\n if (base === null) {\n // if base is null, return 'null' as base.\n // it's needed for triggering the reason logging while debugging\n return {\n base,\n prop,\n chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n // for empty objects in chain\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase === null) {\n return {\n base,\n prop,\n chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base,\n prop,\n chain\n };\n }\n\n /**\n * Checks if given propsToMatch string matches with given request data\n * This is used by prevent-xhr, prevent-fetch, trusted-replace-xhr-response\n * and trusted-replace-fetch-response scriptlets\n *\n * @param source scriptlet properties\n * @param propsToMatch string of space-separated request properties to match\n * @param requestData object with standard properties of fetch/xhr like url, method etc\n * @returns if request properties match\n */\n var matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === '' || propsToMatch === '*') {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n // prevent only if all props match\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === 'string' && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n };\n\n /**\n * Checks if the stackTrace contains stackRegexp\n * https://github.com/AdguardTeam/Scriptlets/issues/82\n *\n * @param stackMatch - input stack value to match\n * @param stackTrace - script error stack trace\n * @returns if the stackTrace contains stackRegexp\n */\n var matchStackTrace = function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === '') {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split('\\n').slice(2) // get rid of our own functions in the stack trace\n .map(function (line) {\n return line.trim();\n }) // trim the lines\n .join('\\n');\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n };\n\n /**\n * Returns a wrapper, passing the call to 'method' at maximum once per 'delay' milliseconds.\n * Those calls that fall into the \"cooldown\" period, are ignored\n *\n * @param cb callback\n * @param delay - milliseconds\n * @returns throttled callback\n */\n var throttle = function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n // \"savedArgs\" might contains few arguments, so it's necessary to use spread operator\n // https://github.com/AdguardTeam/Scriptlets/issues/284#issuecomment-1419464354\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n };\n\n /**\n * DOM tree changes observer. Used for 'remove-attr' and 'remove-class' scriptlets\n *\n * @param callback function to call on each mutation\n * @param observeAttrs if observer should observe attributes changes\n * @param attrsToObserve list of attributes to observe\n */\n var observeDOMChanges = function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n /**\n * 'delay' in milliseconds for 'throttle' method\n */\n var THROTTLE_DELAY_MS = 20;\n /**\n * Used for remove-class\n */\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n\n /**\n * Callback wrapper to prevent loops\n * when callback tinkers with attributes\n */\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n };\n\n /**\n * Returns the list of added nodes from the list of mutations\n *\n * @param mutations list of mutations\n * @returns list of added nodes\n */\n var getAddedNodes = function getAddedNodes(mutations) {\n var nodes = [];\n for (var i = 0; i < mutations.length; i += 1) {\n var addedNodes = mutations[i].addedNodes;\n for (var j = 0; j < addedNodes.length; j += 1) {\n nodes.push(addedNodes[j]);\n }\n }\n return nodes;\n };\n\n /**\n * Creates and runs a MutationObserver on the document element with optional\n * throttling and disconnect timeout.\n *\n * @param {Function} callback MutationObserver callback\n * @param {object} options MutationObserver options\n * @param timeout Disconnect timeout in ms\n */\n var observeDocumentWithTimeout = function observeDocumentWithTimeout(callback, options) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10000;\n var documentObserver = new MutationObserver(function (mutations, observer) {\n observer.disconnect();\n callback(mutations, observer);\n observer.observe(document.documentElement, options);\n });\n documentObserver.observe(document.documentElement, options);\n if (typeof timeout === 'number') {\n setTimeout(function () {\n return documentObserver.disconnect();\n }, timeout);\n }\n };\n\n /**\n * Behaviour flags string parser\n *\n * @param flags required, 'applying' argument string\n * @returns object with parsed flags\n */\n var parseFlags = function parseFlags(flags) {\n var FLAGS_DIVIDER = ' ';\n var ASAP_FLAG = 'asap';\n var COMPLETE_FLAG = 'complete';\n var STAY_FLAG = 'stay';\n var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.includes(f);\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.includes(flag);\n }\n };\n };\n\n /**\n * Modifies passed keyword value according to its purpose.\n * Returns initial value if it's not a keyword.\n *\n * Supported keywords:\n * - '$now$' - returns current time in ms, e.g 1667915146503\n * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n *\n * @param rawValue keyword\n * @returns parsed value\n */\n var parseKeywordValue = function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = '$now$';\n var CURRENT_DATE_KEYWORD = '$currentDate$';\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n // Set to current time in ms, e.g 1667915146503\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n parsedValue = Date();\n }\n return parsedValue;\n };\n\n /**\n * Makes arbitrary operations on shadow root element,\n * to be passed as callback to hijackAttachShadow\n */\n\n /**\n * Overrides attachShadow method of Element API on a given context\n * to pass retrieved shadowRoots to callback\n *\n * @param context e.g global window object or contentWindow of an iframe\n * @param hostSelector selector to determine if callback should be called on current shadow subtree\n * @param callback callback to call on shadow root\n */\n var hijackAttachShadow = function hijackAttachShadow(context, hostSelector, callback) {\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || '*')) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n var attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n };\n\n /**\n * Grabs existing nodes and passes them to a given handler.\n *\n * @param selector CSS selector to find nodes by\n * @param handler handler to pass nodes to\n */\n var handleExistingNodes = function handleExistingNodes(selector, handler) {\n var nodeList = document.querySelectorAll(selector);\n var nodes = nodeListToArray(nodeList);\n handler(nodes);\n };\n\n /**\n * Extracts added nodes from mutations and passes them to a given handler.\n *\n * @param mutations mutations to find eligible nodes in\n * @param handler handler to pass eligible nodes to\n */\n var handleMutations = function handleMutations(mutations, handler) {\n var addedNodes = getAddedNodes(mutations);\n handler(addedNodes);\n };\n\n /**\n * Checks if given node's text content should be replaced\n *\n * @param node node to check\n * @param nodeNameMatch regexp or string to match node name\n * @param textContentMatch regexp or string to match node's text content\n * @returns true if node's text content should be replaced\n */\n var isTargetNode = function isTargetNode(node, nodeNameMatch, textContentMatch) {\n var nodeName = node.nodeName,\n textContent = node.textContent;\n var nodeNameLowerCase = nodeName.toLowerCase();\n return textContent !== null && textContent !== '' && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch));\n };\n\n /**\n * Replaces given node's text content with a given replacement.\n *\n * @param source source of the scriptlet\n * @param node node to replace text content in\n * @param pattern pattern to match text content\n * @param replacement replacement for matched text content\n */\n var replaceNodeText = function replaceNodeText(source, node, pattern, replacement) {\n var textContent = node.textContent;\n if (textContent) {\n node.textContent = textContent.replace(pattern, replacement);\n hit(source);\n }\n };\n\n /**\n * Modifies arguments for trusted-replace-node-text and remove-node-text scriptlets\n *\n * @param nodeName string or stringified regexp to match node name\n * @param textMatch string or stringified regexp to match node's text content\n * @param pattern string or stringified regexp to match replace pattern\n * @returns derivative params\n */\n var parseNodeTextParams = function parseNodeTextParams(nodeName, textMatch) {\n var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var REGEXP_START_MARKER = '/';\n var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER));\n var selector = isStringNameMatch ? nodeName : '*';\n var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName);\n var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch);\n var patternMatch;\n if (pattern) {\n patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern);\n }\n return {\n selector,\n nodeNameMatch,\n textContentMatch,\n patternMatch\n };\n };\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-click-element\n *\n * @description\n * Clicks selected elements in a strict sequence, ordered by selectors passed,\n * and waiting for them to render in the DOM first.\n * Deactivates after all elements have been clicked or by 10s timeout.\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('trusted-click-element', selectors[, extraMatch[, delay]])\n * ```\n *\n * - `selectors` — required, string with query selectors delimited by comma\n * - `extraMatch` — optional, extra condition to check on a page; allows to match `cookie` and `localStorage`;\n * can be set as `name:key[=value]` where `value` is optional.\n * If `cookie`/`localStorage` starts with `!` then the element will only be clicked\n * if specified cookie/localStorage item does not exist.\n * Multiple conditions are allowed inside one `extraMatch` but they should be delimited by comma\n * and each of them should match the syntax. Possible `name`s:\n * - `cookie` — test string or regex against cookies on a page\n * - `localStorage` — check if localStorage item is present\n * - `delay` — optional, time in ms to delay scriptlet execution, defaults to instant execution.\n *\n * ### Examples\n *\n * 1. Click single element by selector\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]')\n * ```\n *\n * 1. Delay click execution by 500ms\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '', '500')\n * ```\n *\n * 1. Click multiple elements by selector with a delay\n *\n * \n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"], button[name=\"check\"], input[type=\"submit\"][value=\"akkoord\"]', '', '500')\n * ```\n *\n * 1. Match cookies by keys using regex and string\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'cookie:userConsentCommunity, cookie:/cmpconsent|cmp/')\n * ```\n *\n * 1. Match by cookie key=value pairs using regex and string\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'cookie:userConsentCommunity=true, cookie:/cmpconsent|cmp/=/[a-z]{1,5}/')\n * ```\n *\n * 1. Match by localStorage item 'promo' key\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', 'localStorage:promo')\n * ```\n *\n * 1. Click multiple elements with delay and matching by both cookie string and localStorage item\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"], input[type=\"submit\"][value=\"akkoord\"]', 'cookie:cmpconsent, localStorage:promo', '250')\n * ```\n *\n * \n *\n * 1. Click element only if cookie with name `cmpconsent` does not exist\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '!cookie:cmpconsent')\n * ```\n *\n * 1. Click element only if specified cookie string and localStorage item does not exist\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-click-element', 'button[name=\"agree\"]', '!cookie:consent, !localStorage:promo')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n function trustedClickElement$1(source, selectors) {\n var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n var OBSERVER_TIMEOUT_MS = 10000;\n var THROTTLE_DELAY_MS = 20;\n var STATIC_CLICK_DELAY_MS = 150;\n var COOKIE_MATCH_MARKER = 'cookie:';\n var LOCAL_STORAGE_MATCH_MARKER = 'localStorage:';\n var SELECTORS_DELIMITER = ',';\n var COOKIE_STRING_DELIMITER = ';';\n // Regex to split match pairs by commas, avoiding the ones included in regexes\n var EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n var sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n var parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n // eslint-disable-next-line max-len\n var message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n var canClick = !parsedDelay;\n var cookieMatches = [];\n var localStorageMatches = [];\n var isInvertedMatchCookie = false;\n var isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n // Get all match marker:value pairs from argument\n var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n\n // Filter match pairs by marker\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.includes(COOKIE_MATCH_MARKER)) {\n var _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, '');\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) {\n var _parseMatchArg2 = parseMatchArg(matchStr),\n _isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n _matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = _isInvertedMatch;\n var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, '');\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n var parsedCookies = parseCookieString(document.cookie);\n var cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n // Avoid getting /.?/ result from toRegExp on undefined\n // as cookie may be set without value,\n // on which cookie parsing will return cookieKey:undefined pair\n var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n var keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n var keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n\n // Key matching is enough if cookie value match is not specified\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n var shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n var localStorageMatched = localStorageMatches.every(function (str) {\n var itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === '';\n });\n var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!_shouldRun) {\n return;\n }\n }\n\n /**\n * Create selectors array and swap selectors to null on finding it's element\n *\n * Selectors / nulls should not be (re)moved from array to:\n * - keep track of selectors order\n * - always know on what index corresponding element should be put\n * - prevent selectors from being queried multiple times\n */\n var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n var createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n var elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n\n /**\n * Go through elementsSequence from left to right, clicking on found elements\n *\n * Element should not be clicked if it is already clicked,\n * or a previous element is not found or clicked yet\n */\n var clickElementsBySequence = async function clickElementsBySequence() {\n for (var i = 0; i < elementsSequence.length; i += 1) {\n var elementObj = elementsSequence[i];\n // Add a delay between clicks to every element except the first one\n // https://github.com/AdguardTeam/Scriptlets/issues/284\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n // Stop clicking if that pos element is not found yet\n if (!elementObj.element) {\n break;\n }\n // Skip already clicked elements\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n var allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n // At this stage observer is already disconnected\n hit(source);\n }\n };\n var handleElement = function handleElement(element, i) {\n var elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n\n /**\n * Query all selectors from queue on each mutation\n * Each selector is swapped to null in selectorsSequence on founding corresponding element\n *\n * We start looking for elements before possible delay is over, to avoid cases\n * when delay is getting off after the last mutation took place.\n *\n */\n var findElements = function findElements(mutations, observer) {\n var fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n var element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n\n // selectorsSequence should be modified after the loop to not break loop indexation\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.includes(selector) ? null : selector;\n });\n\n // Disconnect observer after finding all elements\n var allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n // Click previously collected elements\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n trustedClickElement$1.names = ['trusted-click-element'\n // trusted scriptlets support no aliases\n ];\n\n trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage, parseMatchArg];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-property-read\n *\n * @description\n * Aborts a script when it attempts to **read** the specified property.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-readjs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-read.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('abort-on-property-read', property)\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to access `window.alert`\n * example.org#%#//scriptlet('abort-on-property-read', 'alert')\n *\n * ! Aborts script when it tries to access `navigator.language`\n * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function abortOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyRead$1.names = ['abort-on-property-read',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read'];\n abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-property-write\n *\n * @description\n * Aborts a script when it attempts to **write** the specified property.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#abort-on-property-writejs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/abort-on-property-write.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('abort-on-property-write', property)\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed).\n * The property must be attached to `window`\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to set `window.adblock` value\n * example.org#%#//scriptlet('abort-on-property-write', 'adblock')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function abortOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnPropertyWrite$1.names = ['abort-on-property-write',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write'];\n abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-setTimeout\n *\n * @description\n * Prevents a `setTimeout` call if:\n *\n * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`;\n * otherwise mismatched calls should be defused.\n * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-settimeout-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-setTimeout'[, matchCallback[, matchDelay]])\n * ```\n *\n * > Call with no arguments will log all setTimeout calls (`log-setTimeout` superseding),\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * - `matchCallback` — optional, string or regular expression;\n * invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * If not set, prevents all `setTimeout` calls due to specified `matchDelay`.\n * - `matchDelay` — optional, must be an integer.\n * If starts with `!`, scriptlet will not match the delay but all other will be defused.\n * If do not start with `!`, the delay passed to the `setTimeout` call will be matched.\n * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`.\n *\n * > If `prevent-setTimeout` log looks like `setTimeout(undefined, 1000)`,\n * > it means that no callback was passed to setTimeout() and that's not scriptlet issue\n * > and obviously it can not be matched by `matchCallback`.\n *\n * ### Examples\n *\n * 1. Prevents `setTimeout` calls if the callback matches `/\\.test/` regardless of the delay\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 100);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback does not contain `value`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', '!value')\n * ```\n *\n * For instance, only the first of the following calls will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"test -- prevented\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setTimeout(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback contains `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', 'value', '!300')\n * ```\n *\n * For instance, only the first of the following calls will not be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value 1 -- executed\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value 2 -- prevented\";\n * }, 400);\n * setTimeout(function () {\n * window.test = \"value 3 -- prevented\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback does not contain `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', '!value', '!300')\n * ```\n *\n * For instance, only the second of the following calls will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"test -- executed\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"test -- prevented\";\n * }, 400);\n * setTimeout(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setTimeout(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setTimeout` calls if the callback contains `value` and delay is a decimal\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setTimeout', 'value', '300')\n * ```\n *\n * For instance, the following calls will be prevented:\n *\n * ```javascript\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 300);\n * setTimeout(function () {\n * window.test = \"value\";\n * }, 300 + Math.random());\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventSetTimeout$1(source, matchCallback, matchDelay) {\n // logs setTimeouts to console if no arguments have been specified\n var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n preventSetTimeout$1.names = ['prevent-setTimeout',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-setTimeout-if.js',\n // new implementation of setTimeout-defuser.js\n 'ubo-no-setTimeout-if.js', 'nostif.js',\n // new short name of no-setTimeout-if\n 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif',\n // old scriptlet names which should be supported as well.\n // should be removed eventually.\n // do not remove until other filter lists maintainers use them\n 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std'];\n preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n // following helpers should be injected as helpers above use them\n parseMatchArg, parseDelayArg, toRegExp, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-setInterval\n *\n * @description\n * Prevents a `setInterval` call if:\n *\n * 1. The text of the callback is matching the specified `matchCallback` string/regexp which does not start with `!`;\n * otherwise mismatched calls should be defused.\n * 1. The delay is matching the specified `matchDelay`; otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-setinterval-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-setInterval'[, matchCallback[, matchDelay]])\n * ```\n *\n * > Call with no arguments will log all setInterval calls (`log-setInterval` superseding),\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * - `matchCallback` — optional, string or regular expression;\n * invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * If not set, prevents all `setInterval` calls due to specified `matchDelay`.\n * - `matchDelay` — optional, must be an integer.\n * If starts with `!`, scriptlet will not match the delay but all other will be defused.\n * If do not start with `!`, the delay passed to the `setInterval` call will be matched.\n * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`.\n *\n * > If `prevent-setInterval` log looks like `setInterval(undefined, 1000)`,\n * > it means that no callback was passed to setInterval() and that's not scriptlet issue\n * > and obviously it can not be matched by `matchCallback`.\n *\n * ### Examples\n *\n * 1. Prevents `setInterval` calls if the callback matches `/\\.test/` regardless of the delay\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"value\";\n * }, 100);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback does not contain `value`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', '!value')\n * ```\n *\n * For instance, only the first of the following calls will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"test -- prevented\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setInterval(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback contains `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', 'value', '!300')\n * ```\n *\n * For instance, only the first of the following calls will not be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"value 1 -- executed\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value 2 -- prevented\";\n * }, 400);\n * setInterval(function () {\n * window.test = \"value 3 -- prevented\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback does not contain `value` and the delay is not set to `300`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', '!value', '!300')\n * ```\n *\n * For instance, only the second of the following calls will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"test -- executed\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"test -- prevented\";\n * }, 400);\n * setInterval(function () {\n * window.test = \"value -- executed\";\n * }, 400);\n * setInterval(function () {\n * window.value = \"test -- executed\";\n * }, 500);\n * ```\n *\n * 1. Prevents `setInterval` calls if the callback contains `value` and delay is a decimal number\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-setInterval', 'value', '300')\n * ```\n *\n * For instance, the following calls will be prevented:\n *\n * ```javascript\n * setInterval(function () {\n * window.test = \"value\";\n * }, 300);\n * setInterval(function () {\n * window.test = \"value\";\n * }, 300 + Math.random());\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventSetInterval$1(source, matchCallback, matchDelay) {\n // logs setIntervals to console if no arguments have been specified\n var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined';\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n // https://github.com/AdguardTeam/Scriptlets/issues/105\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback,\n delay,\n matchCallback,\n matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n preventSetInterval$1.names = ['prevent-setInterval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-setInterval-if.js',\n // new implementation of setInterval-defuser.js\n 'ubo-no-setInterval-if.js', 'setInterval-defuser.js',\n // old name should be supported as well\n 'ubo-setInterval-defuser.js', 'nosiif.js',\n // new short name of no-setInterval-if\n 'ubo-nosiif.js', 'sid.js',\n // old short scriptlet name\n 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid'];\n preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage,\n // following helpers should be injected as helpers above use them\n toRegExp, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber, parseRawDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-window-open\n *\n * @description\n * Prevents `window.open` calls when URL either matches or not matches the specified string/regexp.\n * Using it without parameters prevents all `window.open` calls.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#windowopen-defuserjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-window-open'[, match[, delay[, replacement]]])\n * ```\n *\n * - `match` — optional, string or regular expression.\n * If not set or regular expression is invalid, all window.open calls will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n * - `delay` — optional, number of seconds. If not set, scriptlet will return `null`,\n * otherwise valid sham window object as injected `iframe` will be returned\n * for accessing its methods (blur(), focus() etc.) and will be removed after the delay.\n * - `replacement` — optional, string; one of the predefined constants:\n * - `obj` — for returning an object instead of default iframe;\n * for cases when the page requires a valid `window` instance to be returned\n * - `log` — for logging window.open calls; not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Prevent all `window.open` calls\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open')\n * ```\n *\n * 1. Prevent `window.open` for all URLs containing `example`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', 'example')\n * ```\n *\n * 1. Prevent `window.open` for all URLs matching RegExp `/example\\./`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', '/example\\./')\n * ```\n *\n * 1. Prevent `window.open` for all URLs **NOT** containing `example`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', '!example')\n * ```\n *\n * ### Old syntax of prevent-window-open parameters\n *\n * - `match` — optional, defaults to \"matching\", any positive number or nothing for \"matching\",\n * 0 or empty string for \"not matching\"\n * - `search` — optional, string or regexp for matching the URL passed to `window.open` call;\n * defaults to search all `window.open` call\n * - `replacement` — optional, string to return prop value or property instead of window.open;\n * defaults to return noopFunc.\n *\n * ### Examples of old syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-window-open', '1', '/example\\./')\n * example.org#%#//scriptlet('prevent-window-open', '0', 'example')\n * example.org#%#//scriptlet('prevent-window-open', '', '', 'trueFunc')\n * example.org#%#//scriptlet('prevent-window-open', '1', '', '{propName=noopFunc}')\n * ```\n *\n * > For better compatibility with uBO, old syntax is not recommended to use.\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventWindowOpen$1(source) {\n var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*';\n var delay = arguments.length > 2 ? arguments[2] : undefined;\n var replacement = arguments.length > 3 ? arguments[3] : undefined;\n // default match value is needed for preventing all window.open calls\n // if scriptlet runs without args\n var nativeOpen = window.open;\n var isNewSyntax = match !== '0' && match !== '1';\n var oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n // 'delay' was 'search' prop for matching in old syntax\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n var searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n var newOpenWrapper = function newOpenWrapper(url) {\n var shouldLog = replacement && replacement.includes('log');\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n var argsStr = args && args.length > 0 ? \", \".concat(args.join(', ')) : '';\n var message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n var shouldPrevent = false;\n if (match === '*') {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n var parsedDelay = parseInt(delay, 10);\n var result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n var decoyArgs = {\n replacement,\n url,\n delay: parsedDelay\n };\n var decoy = createDecoy(decoyArgs);\n var popup = decoy.contentWindow;\n if (typeof popup === 'object' && popup !== null) {\n Object.defineProperty(popup, 'closed', {\n value: false\n });\n Object.defineProperty(popup, 'opener', {\n value: window\n });\n Object.defineProperty(popup, 'frameElement', {\n value: null\n });\n } else {\n var nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, 'contentWindow', {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n\n // Protect window.open from native code check\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n preventWindowOpen$1.names = ['prevent-window-open',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif'];\n preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, substringBefore, substringAfter$1];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-current-inline-script\n *\n * @description\n * Aborts an inline script when it attempts to **read** or **write to** the specified property\n * AND when the contents of the `\n * ```\n *\n * 1. Aborts inline scripts which are trying to access `window.alert` and match regexp `/Hello.+world/`\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-current-inline-script', 'alert', '/Hello.+world/')\n * ```\n *\n * For instance, the following scripts will be aborted:\n *\n * ```html\n * \n * ```\n *\n * ```html\n * \n * ```\n *\n * And this script will not be aborted:\n *\n * ```html\n * \n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function abortCurrentInlineScript$1(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var SRC_DATA_MARKER = 'data:text/javascript;base64,';\n var getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var _scriptEl$src;\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n\n // We are using Node.prototype.textContent property descriptor\n // to get the real script content\n // even when document.currentScript.textContent is replaced.\n // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {} // eslint-disable-line no-empty\n\n // https://github.com/AdguardTeam/Scriptlets/issues/130\n if (content.length === 0 && typeof scriptEl.src !== 'undefined' && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) {\n var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // The scriptlet might be executed before the chain property has been created\n // (for instance, document.body before the HTML body was loaded).\n // In this case we're checking whether the base element exists or not\n // and if not, we simply exit without overriding anything.\n // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092\n if (base instanceof Object === false && base === null) {\n var props = property.split('.');\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortCurrentInlineScript$1.names = ['abort-current-inline-script',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js',\n // \"ubo\"-aliases with no \"js\"-ending\n 'ubo-abort-current-script', 'ubo-acs',\n // obsolete but supported aliases\n 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script'];\n abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-constant\n *\n * @description\n * Creates a constant property and assigns it one of the values from the predefined list.\n *\n * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type.\n *\n * > If empty object is present in chain it will be trapped until chain leftovers appear.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#set-constantjs-\n *\n * Related ABP snippet:\n * https://github.com/adblockplus/adblockpluscore/blob/adblockpluschrome-3.9.4/lib/content/snippets.js#L1361\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-constant', property, value[, stack])\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`.\n * - `value` — required. Possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `noopFunc` — function with empty body\n * - `noopCallbackFunc` — function returning noopFunc\n * - `trueFunc` — function returning true\n * - `falseFunc` — function returning false\n * - `throwFunc` — function throwing an error\n * - `noopPromiseResolve` — function returning Promise object that is resolved with an empty response\n * - `noopPromiseReject` — function returning Promise.reject()\n * - `''` — empty string\n * - `-1` — number value `-1`\n * - `yes`\n * - `no`\n * - `stack` — string or regular expression that must match the current function call stack trace,\n * defaults to matching every call; if regular expression is invalid, it will be skipped\n * - `valueWrapper` – optional, string to modify a value to be set. Possible wrappers:\n * - `asFunction` – function returning value\n * - `asCallback` – function returning callback, that would return value\n * - `asResolved` – Promise that would resolve with value\n * - `asRejected` – Promise that would reject with value\n *\n * ### Examples\n *\n * ```adblock\n * ! Any access to `window.first` will return `false`\n * example.org#%#//scriptlet('set-constant', 'first', 'false')\n *\n * ✔ window.first === false\n * ```\n *\n * ```adblock\n * ! Any call to `window.second()` will return `true`\n * example.org#%#//scriptlet('set-constant', 'second', 'trueFunc')\n *\n * ✔ window.second() === true\n * ✔ window.second.toString() === \"function trueFunc() {return true;}\"\n * ```\n *\n * ```adblock\n * ! Any call to `document.third()` will return `true` if the method is related to `checking.js`\n * example.org#%#//scriptlet('set-constant', 'document.third', 'trueFunc', 'checking.js')\n *\n * ✔ document.third() === true // if the condition described above is met\n * ```\n *\n * ```adblock\n * ! Any call to `document.fourth()` will return `yes`\n * example.org#%#//scriptlet('set-constant', 'document.fourth', 'yes', '', 'asFunction')\n *\n * ✔ document.fourth() === 'yes'\n * ```\n *\n * ```adblock\n * ! Any call to `document.fifth()` will return `yes`\n * example.org#%#//scriptlet('set-constant', 'document.fifth', '42', '', 'asRejected')\n *\n * ✔ document.fifth.catch((reason) => reason === 42) // promise rejects with specified number\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function setConstant$1(source, property, value) {\n var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';\n var uboAliases = ['set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set'];\n\n /**\n * UBO set-constant analog has it's own args sequence:\n * (property, value, defer | wrapper)\n * 'defer' – a stringified number, which defines execution time, or\n * 'wrapper' - string which defines value wrapper name\n *\n * joysound.com##+js(set, document.body.oncopy, null, 3)\n * kompetent.de##+js(set, Object.keys, 42, asFunction)\n */\n if (uboAliases.includes(source.name)) {\n /**\n * Check that third argument was intended as 'valueWrapper' argument,\n * by excluding 'defer' single digits case, and move it to 'valueWrapper'\n */\n if (stack.length !== 1 && !getNumberFromString(stack)) {\n valueWrapper = stack;\n }\n /**\n * ubo doesn't support 'stack', while adg doesn't support 'defer'\n * that goes in the same spot, so we discard it\n */\n stack = undefined;\n }\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var emptyArr = noopArray();\n var emptyObj = noopObject();\n var constantValue;\n if (value === 'undefined') {\n constantValue = undefined;\n } else if (value === 'false') {\n constantValue = false;\n } else if (value === 'true') {\n constantValue = true;\n } else if (value === 'null') {\n constantValue = null;\n } else if (value === 'emptyArr') {\n constantValue = emptyArr;\n } else if (value === 'emptyObj') {\n constantValue = emptyObj;\n } else if (value === 'noopFunc') {\n constantValue = noopFunc;\n } else if (value === 'noopCallbackFunc') {\n constantValue = noopCallbackFunc;\n } else if (value === 'trueFunc') {\n constantValue = trueFunc;\n } else if (value === 'falseFunc') {\n constantValue = falseFunc;\n } else if (value === 'throwFunc') {\n constantValue = throwFunc;\n } else if (value === 'noopPromiseResolve') {\n constantValue = noopPromiseResolve;\n } else if (value === 'noopPromiseReject') {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === '-1') {\n constantValue = -1;\n } else if (value === '') {\n constantValue = '';\n } else if (value === 'yes') {\n constantValue = 'yes';\n } else if (value === 'no') {\n constantValue = 'no';\n } else {\n return;\n }\n var valueWrapperNames = ['asFunction', 'asCallback', 'asResolved', 'asRejected'];\n if (valueWrapperNames.includes(valueWrapper)) {\n var valueWrappersMap = {\n asFunction(v) {\n return function () {\n return v;\n };\n },\n asCallback(v) {\n return function () {\n return function () {\n return v;\n };\n };\n },\n asResolved(v) {\n return Promise.resolve(v);\n },\n asRejected(v) {\n return Promise.reject(v);\n }\n };\n constantValue = valueWrappersMap[valueWrapper](constantValue);\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n\n /**\n * Safely sets property on a given object\n *\n * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} base arbitrary reachable object\n * @param {string} prop property name\n * @param {boolean} configurable if set property should be configurable\n * @param {object} handler custom property descriptor object\n * @returns {boolean} true if prop was trapped successfully\n */\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n // This is required to prevent scriptlets overwrite each over\n if (origDescriptor instanceof Object) {\n // This check is required to avoid defining non-configurable props\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n\n /**\n * Traverses given chain to set constant value to its end prop\n * Chains that yet include non-object values (e.g null) are valid and will be\n * traversed when appropriate chain member is set by an external script\n *\n * IMPORTANT! this duplicates corresponding func in trusted-set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} owner object that owns chain\n * @param {string} property chain of owner properties\n */\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // Handler method init is used to keep track of factual value\n // and apply mustCancel() check only on end prop\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n // Prevent breakage due to loop assignments like win.obj = win.obj\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n\n // End prop case\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n\n // Null prop in chain\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n\n // Empty object prop in chain\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n\n // Defined prop in chain\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n\n // Undefined prop in chain\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n setConstant$1.names = ['set-constant',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read'];\n setConstant$1.injections = [hit, logMessage, getNumberFromString, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, matchStackTrace, nativeIsNaN, isEmptyObject,\n // following helpers should be imported and injected\n // because they are used by helpers above\n shouldAbortInlineOrInjectedScript, getNativeRegexpTest, setPropertyAccess, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-cookie\n *\n * @description\n * Removes current page cookies by passed string matching with name. For current domain and subdomains.\n * Runs on load and before unload.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#cookie-removerjs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/cookie-remover.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-cookie'[, match])\n * ```\n *\n * - `match` — optional, string or regex matching the cookie name.\n * If not specified all accessible cookies will be removed.\n *\n * ### Examples\n *\n * 1. Removes all cookies\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-cookie')\n * ```\n *\n * 1. Removes cookies which name contains `example` string\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-cookie', 'example')\n * ```\n *\n * For instance this cookie will be removed:\n *\n * ```javascript\n * document.cookie = '__example=randomValue';\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function removeCookie$1(source, match) {\n var matchRegexp = toRegExp(match);\n var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n var cookieSpec = \"\".concat(cookieName, \"=\");\n var domain1 = \"; domain=\".concat(hostName);\n var domain2 = \"; domain=.\".concat(hostName);\n var path = '; path=/';\n var expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n var rmCookie = function rmCookie() {\n document.cookie.split(';').forEach(function (cookieStr) {\n var pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n var hostParts = document.location.hostname.split('.');\n for (var i = 0; i <= hostParts.length - 1; i += 1) {\n var hostName = hostParts.slice(i).join('.');\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener('beforeunload', rmCookie);\n }\n removeCookie$1.names = ['remove-cookie',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover'];\n removeCookie$1.injections = [toRegExp, hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-addEventListener\n *\n * @description\n * Prevents adding event listeners for the specified events and callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-defuserjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-addEventListener'[, typeSearch[, listenerSearch]])\n * ```\n *\n * - `typeSearch` — optional, string or regular expression matching the type (event name);\n * defaults to match all types; invalid regular expression will cause exit and rule will not work\n * - `listenerSearch` — optional, string or regular expression matching the listener function body;\n * defaults to match all listeners; invalid regular expression will cause exit and rule will not work\n *\n * ### Examples\n *\n * 1. Prevent all `click` listeners\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-addEventListener', 'click')\n * ```\n *\n * 1. Prevent 'click' listeners with the callback body containing `searchString`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-addEventListener', 'click', 'searchString')\n * ```\n *\n * For instance, this listener will not be called:\n *\n * ```javascript\n * el.addEventListener('click', () => {\n * window.test = 'searchString';\n * });\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function preventAddEventListener$1(source, typeSearch, listenerSearch) {\n var typeSearchRegexp = toRegExp(typeSearch);\n var listenerSearchRegexp = toRegExp(listenerSearch);\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n var shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n\n // Avoid illegal invocations due to lost context\n // https://github.com/AdguardTeam/Scriptlets/issues/271\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/215\n // https://github.com/AdguardTeam/Scriptlets/issues/143\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n preventAddEventListener$1.names = ['prevent-addEventListener',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld'];\n preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString];\n\n /* eslint-disable consistent-return, no-eval */\n\n /**\n * @scriptlet prevent-bab\n *\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#bab-defuserjs-\n *\n * It also can be used as `$redirect` sometimes.\n * See [redirect description](../wiki/about-redirects.md#prevent-bab).\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-bab')\n * ```\n *\n * @added v1.0.4.\n */\n function preventBab$2(source) {\n var nativeSetTimeout = window.setTimeout;\n var babRegex = /\\.bab_elementid.$/;\n var timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== 'string' || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n var signatures = [['blockadblock'], ['babasbm'], [/getItem\\('babn'\\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']];\n var check = function check(str) {\n if (typeof str !== 'string') {\n return false;\n }\n for (var i = 0; i < signatures.length; i += 1) {\n var tokens = signatures[i];\n var match = 0;\n for (var j = 0; j < tokens.length; j += 1) {\n var token = tokens[j];\n var found = token instanceof RegExp ? token.test(str) : str.includes(token);\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= 0.8) {\n return true;\n }\n }\n return false;\n };\n var nativeEval = window.eval;\n var evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n var bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty('visibility');\n }\n var el = document.getElementById('babasbmsgx');\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n preventBab$2.names = ['prevent-bab'\n // there is no aliases for this scriptlet\n ];\n\n preventBab$2.injections = [hit];\n\n /* eslint-disable no-unused-vars, no-extra-bind, func-names */\n\n /* eslint-disable max-len */\n /**\n * @scriptlet nowebrtc\n *\n * @description\n * Disables WebRTC by overriding `RTCPeerConnection`.\n * The overridden function will log every attempt to create a new connection.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nowebrtcjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('nowebrtc')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function nowebrtc$1(source) {\n var propertyName = '';\n if (window.RTCPeerConnection) {\n propertyName = 'RTCPeerConnection';\n } else if (window.webkitRTCPeerConnection) {\n propertyName = 'webkitRTCPeerConnection';\n }\n if (propertyName === '') {\n return;\n }\n var rtcReplacement = function rtcReplacement(config) {\n // eslint-disable-next-line max-len\n var message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n var rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n nowebrtc$1.names = ['nowebrtc',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc'];\n nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString];\n\n /**\n * @scriptlet log-addEventListener\n *\n * @description\n * Logs all addEventListener calls to the console.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#addeventlistener-loggerjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('log-addEventListener')\n * ```\n *\n * @added v1.0.4.\n */\n function logAddEventListener$1(source) {\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n var message = \"addEventListener(\\\"\".concat(type, \"\\\", \").concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n } else {\n // logging while debugging\n var _message = \"Invalid event type or listener passed to addEventListener:\\n type: \".concat(convertTypeToString(type), \"\\n listener: \").concat(convertTypeToString(listener));\n logMessage(source, _message, true);\n }\n\n // Avoid illegal invocations due to lost context\n // https://github.com/AdguardTeam/Scriptlets/issues/271\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/215\n // https://github.com/AdguardTeam/Scriptlets/issues/143\n Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor);\n Object.defineProperty(window, 'addEventListener', descriptor);\n Object.defineProperty(document, 'addEventListener', descriptor);\n }\n logAddEventListener$1.names = ['log-addEventListener',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell'];\n logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject];\n\n /* eslint-disable no-eval */\n\n /**\n * @scriptlet log-eval\n *\n * @description\n * Logs all `eval()` or `new Function()` calls to the console.\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('log-eval')\n * ```\n *\n * @added v1.0.4.\n */\n function logEval$1(source) {\n // wrap eval function\n var nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, \"eval(\\\"\".concat(str, \"\\\")\"), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n\n // wrap new Function\n var nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(', '), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n logEval$1.names = ['log-eval'];\n logEval$1.injections = [hit, logMessage];\n\n /**\n * @scriptlet log\n *\n * @description\n * A simple scriptlet which only purpose is to print arguments to console.\n * This scriptlet can be helpful for debugging and troubleshooting other scriptlets.\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('log', 'arg1', 'arg2')\n * ```\n *\n * @added v1.0.4.\n */\n function log$1() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args); // eslint-disable-line no-console\n }\n\n log$1.names = ['log'];\n\n /* eslint-disable no-eval, no-extra-bind */\n\n /**\n * @scriptlet noeval\n *\n * @description\n * Prevents page to use eval.\n * Notifies about attempts in the console\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#noevaljs-\n *\n * It also can be used as `$redirect` rules sometimes.\n * See [redirect description](../wiki/about-redirects.md#noeval).\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('noeval')\n * ```\n *\n * @added v1.0.4.\n */\n function noeval$1(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n noeval$1.names = ['noeval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval'];\n noeval$1.injections = [hit, logMessage];\n\n /* eslint-disable no-eval, no-extra-bind, func-names */\n\n\n /**\n * @scriptlet prevent-eval-if\n *\n * @description\n * Prevents page to use eval matching payload.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#noeval-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-eval-if'[, search])\n * ```\n *\n * - `search` — optional, string or regular expression matching the stringified eval payload;\n * defaults to match all stringified eval payloads;\n * invalid regular expression will cause exit and rule will not work\n *\n * ### Examples\n *\n * ```adblock\n * ! Prevents eval if it matches 'test'\n * example.org#%#//scriptlet('prevent-eval-if', 'test')\n * ```\n *\n * @added v1.0.4.\n */\n function preventEvalIf$1(source, search) {\n var searchRegexp = toRegExp(search);\n var nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n preventEvalIf$1.names = ['prevent-eval-if',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if'];\n preventEvalIf$1.injections = [toRegExp, hit];\n\n /* eslint-disable func-names, no-multi-assign */\n\n /**\n * @scriptlet prevent-fab-3.2.0\n *\n * @description\n * Prevents execution of the FAB script v3.2.0.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#fuckadblockjs-320-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fab-3.2.0')\n * ```\n *\n * @added v1.0.4.\n */\n function preventFab$1(source) {\n hit(source);\n\n // redefines Fab function for adblock detection\n var Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n var fab = new Fab();\n var getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n var getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n\n // redefined Fab data properties which if 'FuckAdBlock' variable exists\n if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) {\n window.FuckAdBlock = Fab;\n } else {\n // or redefined Fab accessor properties\n Object.defineProperty(window, 'FuckAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'BlockAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, 'SniffAdBlock', getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, 'fuckAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, 'blockAdBlock', getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, 'sniffAdBlock', getsetfab);\n }\n }\n preventFab$1.names = ['prevent-fab-3.2.0',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab'];\n preventFab$1.injections = [hit, noopFunc, noopThis];\n\n /* eslint-disable func-names, no-multi-assign */\n\n /**\n * @scriptlet set-popads-dummy\n *\n * @description\n * Sets static properties PopAds and popns.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#popads-dummyjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('set-popads-dummy')\n * ```\n *\n * @added v1.0.4.\n */\n function setPopadsDummy$1(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n setPopadsDummy$1.names = ['set-popads-dummy',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy'];\n setPopadsDummy$1.injections = [hit];\n\n /**\n * @scriptlet prevent-popads-net\n *\n * @description\n * Aborts on property write (PopAds, popns), throws reference error with random id.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#popadsnetjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-popads-net')\n * ```\n *\n * @added v1.0.4.\n */\n function preventPopadsNet$1(source) {\n var rid = randomId();\n var throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n preventPopadsNet$1.names = ['prevent-popads-net',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net'];\n preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit];\n\n /* eslint-disable func-names */\n\n /**\n * @scriptlet prevent-adfly\n *\n * @description\n * Prevents anti-adblock scripts on adfly short links.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#adfly-defuserjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-adfly')\n * ```\n *\n * @added v1.0.4.\n */\n function preventAdfly$1(source) {\n var isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n var handler = function handler(encodedURL) {\n var evenChars = '';\n var oddChars = '';\n for (var i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n var data = (evenChars + oddChars).split('');\n for (var _i = 0; _i < data.length; _i += 1) {\n if (isDigit(data[_i])) {\n for (var ii = _i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n // eslint-disable-next-line no-bitwise\n var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[_i] = temp.toString();\n }\n _i = ii;\n break;\n }\n }\n }\n }\n data = data.join('');\n var decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n var val;\n // Do not apply handler more than one time\n var applyHandler = true;\n var result = setPropertyAccess(window, 'ysmm', {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === 'string') {\n handler(value);\n }\n } catch (err) {} // eslint-disable-line no-empty\n }\n\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, 'Failed to set up prevent-adfly scriptlet');\n }\n }\n preventAdfly$1.names = ['prevent-adfly',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser'];\n preventAdfly$1.injections = [setPropertyAccess, hit, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-on-property-read\n *\n * @description\n * This scriptlet is basically the same as [abort-on-property-read](#abort-on-property-read),\n * but instead of aborting it starts the debugger.\n *\n * > It is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * ```adblock\n * ! Debug script if it tries to access `window.alert`\n * example.org#%#//scriptlet('debug-on-property-read', 'alert')\n *\n * ! or `window.open`\n * example.org#%#//scriptlet('debug-on-property-read', 'open')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function debugOnPropertyRead$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n };\n\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyRead$1.names = ['debug-on-property-read'];\n debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-on-property-write\n *\n * @description\n * This scriptlet is basically the same as [abort-on-property-write](#abort-on-property-write),\n * but instead of aborting it starts the debugger.\n *\n * > It is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to write in property `window.test`\n * example.org#%#//scriptlet('debug-on-property-write', 'test')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function debugOnPropertyWrite$1(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n };\n\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugOnPropertyWrite$1.names = ['debug-on-property-write'];\n debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet debug-current-inline-script\n *\n * @description\n * This scriptlet is basically the same as [abort-current-inline-script](#abort-current-inline-script),\n * but instead of aborting it starts the debugger.\n *\n * > It is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * ```adblock\n * ! Aborts script when it tries to access `window.alert`\n * example.org#%#//scriptlet('debug-current-inline-script', 'alert')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function debugCurrentInlineScript$1(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var getCurrentScript = function getCurrentScript() {\n if ('currentScript' in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n\n // We are using Node.prototype.textContent property descriptor\n // to get the real script content\n // even when document.currentScript.textContent is replaced.\n // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {} // eslint-disable-line no-empty\n\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger; // eslint-disable-line no-debugger\n }\n };\n\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // The scriptlet might be executed before the chain property has been created\n // (for instance, document.body before the HTML body was loaded).\n // In this case we're checking whether the base element exists or not\n // and if not, we simply exit without overriding anything.\n // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092\n if (base instanceof Object === false && base === null) {\n var props = property.split('.');\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n debugCurrentInlineScript$1.names = ['debug-current-inline-script'];\n debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-attr\n *\n * @description\n * Removes the specified attributes from DOM nodes. This scriptlet runs once when the page loads\n * and after that periodically in order to DOM tree changes by default,\n * or as specified by applying argument.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-attrjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-attr', attrs[, selector, applying])\n * ```\n *\n * - `attrs` — required, attribute or list of attributes joined by '|'\n * - `selector` — optional, CSS selector, specifies DOM nodes from which the attributes will be removed\n * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply,\n * defaults to 'asap stay'; possible flags:\n * - `asap` — runs as fast as possible **once**\n * - `complete` — runs **once** after the whole page has been loaded\n * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes\n *\n * ### Examples\n *\n * 1. Removes by attribute\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-attr', 'example|test')\n * ```\n *\n * ```html\n * \n *
Some text
\n *\n * \n *
Some text
\n * ```\n *\n * 1. Removes with specified selector\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-attr', 'example', 'div[class=\"inner\"]')\n * ```\n *\n * ```html\n * \n *
\n *
Some text
\n *
\n *\n * \n *
\n *
Some text
\n *
\n * ```\n *\n * 1. Using flags\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function removeAttr$1(source, attrs, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join('],['), \"]\");\n }\n var rmattr = function rmattr() {\n var nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n var removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var flags = parseFlags(applying);\n var run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n // 'true' for observing attributes\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n // https://github.com/AdguardTeam/Scriptlets/issues/245\n // Call rmattr on DOM content loaded\n // to ensure that target node is present on the page\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n // Only call rmattr for single 'stay' flag\n if (!applying.includes(' ')) {\n rmattr();\n }\n // 'true' for observing attributes\n observeDOMChanges(rmattr, true);\n }\n }\n removeAttr$1.names = ['remove-attr',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra'];\n removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-attr\n *\n * @description\n * Sets the specified attribute on the specified elements. This scriptlet runs once when the page loads\n * and after that and after that on DOM tree changes.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-attr', selector, attr[, value])\n * ```\n *\n * - `selector` — required, CSS selector, specifies DOM nodes to set attributes on\n * - `attr` — required, attribute to be set\n * - `value` — the value to assign to the attribute, defaults to ''. Possible values:\n * - `''` — empty string\n * - positive decimal integer `<= 32767`\n * - `true` / `false` in any case variation\n *\n * ### Examples\n *\n * 1. Set attribute by selector\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', '0')\n * ```\n *\n * ```html\n * \n *
Some text\n *\n * \n * Some text\n * ```\n *\n * 1. Set attribute without value\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n *\n * 1. Set attribute value to `TRUE`\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'TRUE')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n *\n * 1. Set attribute value to `fAlse`\n *\n * ```adblock\n * example.org#%#//scriptlet('set-attr', 'div.class > a.class', 'test-attribute', 'fAlse')\n * ```\n *\n * ```html\n * \n * Some text\n *\n * \n * Some text\n * ```\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function setAttr$1(source, selector, attr) {\n var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n if (!selector || !attr) {\n return;\n }\n var allowedValues = ['true', 'false'];\n\n // Drop strings that cant be parsed into number, negative numbers and numbers below 32767\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n var setAttr = function setAttr() {\n var nodes = [].slice.call(document.querySelectorAll(selector));\n var set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n setAttr$1.names = ['set-attr'];\n setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-class\n *\n * @description\n * Removes the specified classes from DOM nodes. This scriptlet runs once after the page loads\n * and after that periodically in order to DOM tree changes.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#remove-classjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-class', classes[, selector, applying])\n * ```\n *\n * - `classes` — required, class or list of classes separated by '|'\n * - `selector` — optional, CSS selector, specifies DOM nodes from which the classes will be removed.\n * If there is no `selector`, each class of `classes` independently will be removed from all nodes which has one\n * - `applying` — optional, one or more space-separated flags that describe the way scriptlet apply,\n * defaults to 'asap stay'; possible flags:\n * - `asap` — runs as fast as possible **once**\n * - `complete` — runs **once** after the whole page has been loaded\n * - `stay` — as fast as possible **and** stays on the page observing possible DOM changes\n *\n * ### Examples\n *\n * 1. Removes by classes\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-class', 'example|test')\n * ```\n *\n * ```html\n * \n *
Some text
\n *
Some text
\n *
Some text
\n *\n * \n *
Some text
\n *
Some text
\n *
Some text
\n * ```\n *\n * 1. Removes with specified selector\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^=\"inner\"]')\n * ```\n *\n * ```html\n * \n *
\n *
Some text
\n *
\n *\n * \n *
\n *
Some text
\n *
\n * ```\n *\n * 1. Using flags\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^=\"inner\"]', 'asap complete')\n * ```\n *\n * @added v1.1.1.\n */\n /* eslint-enable max-len */\n\n function removeClass$1(source, classNames, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay';\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n var selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n var removeClassHandler = function removeClassHandler() {\n var nodes = new Set();\n if (selector) {\n var foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n var elements = document.querySelectorAll(s);\n for (var i = 0; i < elements.length; i += 1) {\n var element = elements[i];\n nodes.add(element);\n }\n });\n }\n var removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var CLASS_ATTR_NAME = ['class'];\n var flags = parseFlags(applying);\n var run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n // 'true' for observing attributes\n // 'class' for observing only classes\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n // https://github.com/AdguardTeam/Scriptlets/issues/245\n // Call removeClassHandler on DOM content loaded\n // to ensure that target node is present on the page\n if (document.readyState === 'loading') {\n window.addEventListener('DOMContentLoaded', removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener('load', run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n // Only call removeClassHandler for single 'stay' flag\n if (!applying.includes(' ')) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n removeClass$1.names = ['remove-class',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc'];\n removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags,\n // following helpers should be imported and injected\n // because they are used by helpers above\n throttle];\n\n /**\n * @scriptlet disable-newtab-links\n *\n * @description\n * Prevents opening new tabs and windows if there is `target` attribute in element.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#disable-newtab-linksjs-\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('disable-newtab-links')\n * ```\n *\n * @added v1.0.4.\n */\n function disableNewtabLinks$1(source) {\n document.addEventListener('click', function (ev) {\n var target = ev.target;\n while (target !== null) {\n if (target.localName === 'a' && target.hasAttribute('target')) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n disableNewtabLinks$1.names = ['disable-newtab-links',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links'];\n disableNewtabLinks$1.injections = [hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet adjust-setInterval\n *\n * @description\n * Adjusts delay for specified setInterval() callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-setinterval-boosterjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('adjust-setInterval'[, matchCallback [, matchDelay[, boost]]])\n * ```\n *\n * - `matchCallback` — optional, string or regular expression for stringified callback matching;\n * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work\n * - `matchDelay` — optional, defaults to 1000, matching setInterval delay; decimal integer OR '*' for any delay\n * - `boost` — optional, default to 0.05, float,\n * capped at 1000 times for up and 50 for down (0.001...50), setInterval delay multiplier\n *\n * ### Examples\n *\n * 1. Adjust all setInterval() x20 times where delay equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval')\n * ```\n *\n * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', 'example')\n * ```\n *\n * 1. Adjust all setInterval() x20 times where callback matched with `example` and delay equal 400ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', 'example', '400')\n * ```\n *\n * 1. Slow down setInterval() x2 times where callback matched with `example` and delay equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', 'example', '', '2')\n * ```\n *\n * 1. Adjust all setInterval() x50 times where delay equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.02')\n * ```\n *\n * 1. Adjust all setInterval() x1000 times where delay equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', '', '2000', '0.001')\n * ```\n *\n * 1. Adjust all setInterval() x50 times where delay is randomized\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function adjustSetInterval$1(source, matchCallback, matchDelay, boost) {\n var nativeSetInterval = window.setInterval;\n var matchRegexp = toRegExp(matchCallback);\n var intervalWrapper = function intervalWrapper(callback, delay) {\n // https://github.com/AdguardTeam/Scriptlets/issues/221\n if (!isValidCallback(callback)) {\n // eslint-disable-next-line max-len\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n adjustSetInterval$1.names = ['adjust-setInterval',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib'];\n adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n // following helpers should be injected as helpers above use them\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet adjust-setTimeout\n *\n * @description\n * Adjusts delay for specified setTimeout() callbacks.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#nano-settimeout-boosterjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('adjust-setTimeout'[, matchCallback [, matchDelay[, boost]]])\n * ```\n *\n * - `matchCallback` — optional, string or regular expression for stringified callback matching;\n * defaults to match all callbacks; invalid regular expression will cause exit and rule will not work\n * - `matchDelay` — optional, defaults to 1000, matching setTimeout delay; decimal integer OR '*' for any delay\n * - `boost` — optional, default to 0.05, float,\n * capped at 1000 times for up and 50 for down (0.001...50), setTimeout delay multiplier\n *\n * ### Examples\n *\n * 1. Adjust all setTimeout() x20 times where timeout equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout')\n * ```\n *\n * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'example')\n * ```\n *\n * 1. Adjust all setTimeout() x20 times where callback matched with `example` and timeout equal 400ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'example', '400')\n * ```\n *\n * 1. Slow down setTimeout() x2 times where callback matched with `example` and timeout equal 1000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'example', '', '2')\n * ```\n *\n * 1. Adjust all setTimeout() x50 times where timeout equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.02')\n * ```\n *\n * 1. Adjust all setTimeout() x1000 times where timeout equal 2000ms\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', '', '2000', '0.001')\n * ```\n *\n * 1. Adjust all setTimeout() x20 times where callback matched with `test` and timeout is randomized\n *\n * ```adblock\n * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) {\n var nativeSetTimeout = window.setTimeout;\n var matchRegexp = toRegExp(matchCallback);\n var timeoutWrapper = function timeoutWrapper(callback, delay) {\n // https://github.com/AdguardTeam/Scriptlets/issues/221\n if (!isValidCallback(callback)) {\n // eslint-disable-next-line max-len\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n adjustSetTimeout$1.names = ['adjust-setTimeout',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb'];\n adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage,\n // following helpers should be injected as helpers above use them\n nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet dir-string\n *\n * @description\n * Wraps the `console.dir` API to call the `toString` method of the argument.\n * There are several adblock circumvention systems that detect browser devtools\n * and hide themselves. Therefore, if we force them to think\n * that devtools are open (using this scriptlet),\n * it will automatically disable the adblock circumvention script.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('dir-string'[, times])\n * ```\n *\n * - `times` — optional, the number of times to call the `toString` method of the argument to `console.dir`\n *\n * ### Examples\n *\n * ```adblock\n * ! Run 2 times\n * example.org#%#//scriptlet('dir-string', '2')\n * ```\n *\n * @added v1.0.4.\n */\n /* eslint-enable max-len */\n function dirString$1(source, times) {\n var _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === 'function') {\n dir.call(this, object);\n }\n hit(source);\n }\n // eslint-disable-next-line no-console\n console.dir = dirWrapper;\n }\n dirString$1.names = ['dir-string'];\n dirString$1.injections = [hit];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet json-prune\n *\n * @description\n * Removes specified properties from the result of calling JSON.parse and returns the caller.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#json-prunejs-\n *\n * Related ABP source:\n * https://gitlab.com/eyeo/snippets/-/blob/main/source/behavioral/json-prune.js\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('json-prune'[, propsToRemove [, obligatoryProps [, stack]]])\n * ```\n *\n * - `propsToRemove` — optional, string of space-separated properties to remove\n * - `obligatoryProps` — optional, string of space-separated properties\n * which must be all present for the pruning to occur\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * > Note please that you can use wildcard `*` for chain property name,\n * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`.\n *\n * ### Examples\n *\n * 1. Removes property `example` from the results of JSON.parse call\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'example')\n * ```\n *\n * For instance, the following call will return `{ one: 1}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"example\":true}')\n * ```\n *\n * 1. If there are no specified properties in the result of JSON.parse call, pruning will NOT occur\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'one', 'obligatoryProp')\n * ```\n *\n * For instance, the following call will return `{ one: 1, two: 2}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"two\":2}')\n * ```\n *\n * 1. A property in a list of properties can be a chain of properties\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'a.b', 'ads.url.first')\n * ```\n *\n * 1. Removes property `content.ad` from the results of JSON.parse call if its error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'content.ad', '', 'test.js')\n * ```\n *\n * 1. A property in a list of properties can be a chain of properties with wildcard in it\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', 'content.*.media.src', 'content.*.media.ad')\n * ```\n *\n * 1. Call with no arguments will log the current hostname and json payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune')\n * ```\n *\n * 1. Call with only second argument will log the current hostname and matched json payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('json-prune', '', '\"id\":\"117458\"')\n * ```\n *\n * @added v1.1.0.\n */\n /* eslint-enable max-len */\n function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : [];\n var nativeJSONParse = JSON.parse;\n var jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n // dealing with stringified json in args, which should be parsed.\n // so we call nativeJSONParse as JSON.parse which is bound to JSON object\n var root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(source, root, prunePaths, requiredPaths);\n };\n\n // JSON.parse mocking\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n var nativeResponseJson = Response.prototype.json;\n // eslint-disable-next-line func-names\n var responseJsonWrapper = function responseJsonWrapper() {\n var promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(source, obj, prunePaths, requiredPaths);\n });\n };\n\n // do nothing if browser does not support Response (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/Response\n if (typeof Response === 'undefined') {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n jsonPrune$1.names = ['json-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune'];\n jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, isPruningNeeded, jsonPruner,\n // following helpers are needed for helpers above\n toRegExp, getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-requestAnimationFrame\n *\n * @description\n * Prevents a `requestAnimationFrame` call\n * if the text of the callback is matching the specified search string which does not start with `!`;\n * otherwise mismatched calls should be defused.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-requestanimationframe-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-requestAnimationFrame'[, search])\n * ```\n *\n * - `search` — optional, string or regular expression;\n * invalid regular expression will be skipped and all callbacks will be matched.\n * If starts with `!`, scriptlet will not match the stringified callback but all other will be defused.\n * If do not start with `!`, the stringified callback will be matched.\n *\n * > Call with no argument will log all requestAnimationFrame calls,\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Prevents `requestAnimationFrame` calls if the callback matches `/\\.test/`\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-requestAnimationFrame', '/\\.test/')\n * ```\n *\n * For instance, the following call will be prevented:\n *\n * ```javascript\n * var times = 0;\n * requestAnimationFrame(function change() {\n * window.test = 'new value';\n * if (times < 2) {\n * times += 1;\n * requestAnimationFrame(change);\n * }\n * });\n * ```\n *\n * 1. Prevents `requestAnimationFrame` calls if **does not match** 'check'\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-requestAnimationFrame', '!check')\n * ```\n *\n * For instance, only the first call will be prevented:\n *\n * ```javascript\n * var timesFirst = 0;\n * requestAnimationFrame(function changeFirst() {\n * window.check = 'should not be prevented';\n * if (timesFirst < 2) {\n * timesFirst += 1;\n * requestAnimationFrame(changeFirst);\n * }\n * });\n *\n * var timesSecond = 0;\n * requestAnimationFrame(function changeSecond() {\n * window.second = 'should be prevented';\n * if (timesSecond < 2) {\n * timesSecond += 1;\n * requestAnimationFrame(changeSecond);\n * }\n * });\n * ```\n *\n * @added v1.1.15.\n */\n /* eslint-enable max-len */\n\n function preventRequestAnimationFrame$1(source, match) {\n var nativeRequestAnimationFrame = window.requestAnimationFrame;\n\n // logs requestAnimationFrame to console if no arguments have been specified\n var shouldLog = typeof match === 'undefined';\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var rafWrapper = function rafWrapper(callback) {\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif'];\n preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage,\n // following helpers should be injected as helpers above use them\n escapeRegExp, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-cookie\n *\n * @description\n * Sets a cookie with the specified name, value, and path.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-cookie', name, value[, path])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value; possible values:\n * - number `>= 0 && <= 15`\n * - one of the predefined constants in any case variation:\n * - `true`\n * - `false`\n * - `yes` / `y`\n * - `no` / `n`\n * - `ok`\n * - `accept`/ `reject`\n * - `allow` / `deny`\n * - `path` — optional, cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet encodes cookie names and values,\n * > e.g value `\"{ test: 'value'}\"` becomes `%7B%20test%3A%20'value'%7D`.\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-cookie', 'CookieConsent', '1')\n *\n * example.org#%#//scriptlet('set-cookie', 'gdpr-settings-cookie', 'true')\n *\n * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none')\n * ```\n *\n * @added v1.2.3.\n */\n /* eslint-enable max-len */\n function setCookie$1(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n setCookie$1.names = ['set-cookie'];\n setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n\n /**\n * @scriptlet set-cookie-reload\n *\n * @description\n * Sets a cookie with the specified name and value, and path,\n * and reloads the current page after the cookie setting.\n * If reloading option is not needed, use [set-cookie](#set-cookie) scriptlet.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('set-cookie-reload', name, value[, path])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value; possible values:\n * - number `>= 0 && <= 15`\n * - one of the predefined constants in any case variation:\n * - `true`\n * - `false`\n * - `yes` / `y`\n * - `no` / `n`\n * - `ok`\n * - `accept`/ `reject`\n * - `allow` / `deny`\n * - `path` — optional, cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet encodes cookie names and values,\n * > e.g value `\"{ test: 'value'}\"` becomes `%7B%20test%3A%20'value'%7D`.\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-cookie-reload', 'checking', 'ok')\n *\n * example.org#%#//scriptlet('set-cookie-reload', 'gdpr-settings-cookie', '1')\n *\n * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none')\n * ```\n *\n * @added v1.3.14.\n */\n function setCookieReload$1(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n\n // Only reload the page if cookie was set\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n setCookieReload$1.names = ['set-cookie-reload'];\n setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath];\n\n /**\n * @scriptlet hide-in-shadow-dom\n *\n * @description\n * Hides elements inside open shadow DOM elements.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('hide-in-shadow-dom', selector[, baseSelector])\n * ```\n *\n * - `selector` — required, CSS selector of element in shadow-dom to hide\n * - `baseSelector` — optional, selector of specific page DOM element,\n * narrows down the part of the page DOM where shadow-dom host supposed to be,\n * defaults to document.documentElement\n *\n * > `baseSelector` should match element of the page DOM, but not of shadow DOM.\n *\n * ### Examples\n *\n * ```adblock\n * ! hides menu bar\n * example.com#%#//scriptlet('hide-in-shadow-dom', '.storyAd', '#app')\n *\n * ! hides floating element\n * example.com#%#//scriptlet('hide-in-shadow-dom', '.contact-fab')\n * ```\n *\n * @added v1.3.0.\n */\n function hideInShadowDom$1(source, selector, baseSelector) {\n // do nothing if browser does not support ShadowRoot\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow) {\n return;\n }\n var hideElement = function hideElement(targetElement) {\n var DISPLAY_NONE_CSS = 'display:none!important;';\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n\n /**\n * Handles shadow-dom piercing and hiding of found elements\n */\n var hideHandler = function hideHandler() {\n // start value of shadow-dom hosts for the page dom\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n\n // if there is shadow-dom host, they should be explored\n var _loop = function _loop() {\n var isHidden = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n\n // continue to pierce for inner shadow-dom hosts\n // and search inside them while the next iteration\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n hideInShadowDom$1.names = ['hide-in-shadow-dom'];\n hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n // following helpers should be imported and injected\n // because they are used by helpers above\n flatten, throttle];\n\n /**\n * @scriptlet remove-in-shadow-dom\n *\n * @description\n * Removes elements inside open shadow DOM elements.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('remove-in-shadow-dom', selector[, baseSelector])\n * ```\n *\n * - `selector` — required, CSS selector of element in shadow-dom to remove\n * - `baseSelector` — optional, selector of specific page DOM element,\n * narrows down the part of the page DOM where shadow-dom host supposed to be,\n * defaults to document.documentElement\n *\n * > `baseSelector` should match element of the page DOM, but not of shadow DOM.\n *\n * ### Examples\n *\n * ```adblock\n * ! removes menu bar\n * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'iron-pages', 'vt-virustotal-app')\n *\n * ! removes floating element\n * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab')\n * ```\n *\n * @added v1.3.14.\n */\n function removeInShadowDom$1(source, selector, baseSelector) {\n // do nothing if browser does not support ShadowRoot\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow) {\n return;\n }\n var removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n\n /**\n * Handles shadow-dom piercing and removing of found elements\n */\n var removeHandler = function removeHandler() {\n // start value of shadow-dom hosts for the page dom\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n\n // if there is shadow-dom host, they should be explored\n var _loop = function _loop() {\n var isRemoved = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n\n // continue to pierce for inner shadow-dom hosts\n // and search inside them while the next iteration\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n removeInShadowDom$1.names = ['remove-in-shadow-dom'];\n removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom,\n // following helpers should be imported and injected\n // because they are used by helpers above\n flatten, throttle];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-fetch\n *\n * @description\n * Prevents `fetch` calls if **all** given parameters match.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-fetch-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-fetch'[, propsToMatch[, responseBody[, responseType]]])\n * ```\n *\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to fetch call;\n * empty string, wildcard `*` or invalid regular expression will match all fetch calls\n * - colon-separated pairs `name:value` where\n * \n * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters)\n * - `value` is string or regular expression for matching the value of the option passed to fetch call;\n * invalid regular expression will cause any value matching\n * - `responseBody` — optional, string for defining response body value,\n * defaults to `emptyObj`. Possible values:\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `responseType` — optional, string for defining response type,\n * original response type is used if not specified. Possible values:\n * - `default`\n * - `opaque`\n *\n * > Usage with no arguments will log fetch calls to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Log all fetch calls\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch')\n * ```\n *\n * 1. Prevent all fetch calls\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '*')\n * ! or\n * example.org#%#//scriptlet('prevent-fetch', '')\n * ```\n *\n * 1. Prevent fetch call for specific url\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '/url\\\\.part/')\n * ```\n *\n * 1. Prevent fetch call for specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', 'method:HEAD')\n * ```\n *\n * 1. Prevent fetch call for specific url and request method\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/')\n * ```\n *\n * 1. Prevent fetch call and specify response body value\n *\n * ```adblock\n * ! Specify response body for fetch call to a specific url\n * example.org#%#//scriptlet('prevent-fetch', '/specified_url_part/ method:/HEAD|GET/', 'emptyArr')\n *\n * ! Specify response body for all fetch calls\n * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr')\n * ```\n *\n * 1. Prevent all fetch calls and specify response type value\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque')\n * ```\n *\n * @added v1.3.18.\n */\n /* eslint-enable max-len */\n function preventFetch$1(source, propsToMatch) {\n var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj';\n var responseType = arguments.length > 3 ? arguments[3] : undefined;\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n var strResponseBody;\n if (responseBody === '' || responseBody === 'emptyObj') {\n strResponseBody = '{}';\n } else if (responseBody === 'emptyArr') {\n strResponseBody = '[]';\n } else {\n logMessage(source, \"Invalid responseBody parameter: '\".concat(responseBody, \"'\"));\n return;\n }\n var isResponseTypeSpecified = typeof responseType !== 'undefined';\n var isResponseTypeSupported = function isResponseTypeSupported(responseType) {\n var SUPPORTED_TYPES = ['default', 'opaque'];\n return SUPPORTED_TYPES.includes(responseType);\n };\n // Skip disallowed response types,\n // specified responseType has limited list of possible values\n if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) {\n logMessage(source, \"Invalid responseType parameter: '\".concat(responseType, \"'\"));\n return;\n }\n var handlerWrapper = async function handlerWrapper(target, thisArg, args) {\n var shouldPrevent = false;\n var fetchData = getFetchData(args);\n if (typeof propsToMatch === 'undefined') {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n try {\n var origResponse = await Reflect.apply(target, thisArg, args);\n // In the case of apps, the blocked request has status 500\n // and no error is thrown, so it's necessary to check response.ok\n // https://github.com/AdguardTeam/Scriptlets/issues/334\n if (!origResponse.ok) {\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return modifyResponse(origResponse, {\n body: strResponseBody,\n type: responseType\n });\n } catch (ex) {\n // https://github.com/AdguardTeam/Scriptlets/issues/334\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign\n }\n\n preventFetch$1.names = ['prevent-fetch',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if'];\n preventFetch$1.injections = [hit, getFetchData, objectToString, matchRequestProps, logMessage, noopPromiseResolve, modifyResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-local-storage-item\n *\n * @description\n * Adds specified key and its value to localStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * To remove item from localStorage use `$remove$` as a value.\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('set-local-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `''` — empty string\n * - `yes`\n * - `no`\n * - `$remove$` — remove specific item from localStorage\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-local-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1')\n *\n * ! Removes the item with key 'foo' from local storage\n * example.org#%#//scriptlet('set-local-storage-item', 'foo', '$remove$')\n * ```\n *\n * @added v1.4.3.\n */\n /* eslint-enable max-len */\n\n function setLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n localStorage = _window.localStorage;\n if (validValue === '$remove$') {\n removeStorageItem(source, localStorage, key);\n } else {\n setStorageItem(source, localStorage, key, validValue);\n }\n hit(source);\n }\n setLocalStorageItem$1.names = ['set-local-storage-item'];\n setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet set-session-storage-item\n *\n * @description\n * Adds specified key and its value to sessionStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * To remove item from sessionStorage use `$remove$` as a value.\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('set-session-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - positive decimal integer `<= 32767`\n * - one of the predefined constants:\n * - `undefined`\n * - `false`\n * - `true`\n * - `null`\n * - `emptyObj` — empty object\n * - `emptyArr` — empty array\n * - `''` — empty string\n * - `yes`\n * - `no`\n * - `$remove$` — remove specific item from sessionStorage\n *\n * ### Examples\n *\n * ```adblock\n * example.org#%#//scriptlet('set-session-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1')\n *\n * ! Removes the item with key 'foo' from session storage\n * example.org#%#//scriptlet('set-session-storage-item', 'foo', '$remove$')\n * ```\n *\n * @added v1.4.3.\n */\n /* eslint-enable max-len */\n\n function setSessionStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified.');\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n sessionStorage = _window.sessionStorage;\n if (validValue === '$remove$') {\n removeStorageItem(source, sessionStorage, key);\n } else {\n setStorageItem(source, sessionStorage, key, validValue);\n }\n hit(source);\n }\n setSessionStorageItem$1.names = ['set-session-storage-item'];\n setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, removeStorageItem, getLimitedStorageItemValue];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet abort-on-stack-trace\n *\n * @description\n * Aborts a script when it attempts to utilize (read or write to) the specified property\n * and it's error stack trace contains given value.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock-for-firefox-legacy/commit/7099186ae54e70b588d5e99554a05d783cabc8ff\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('abort-on-stack-trace', property, stack)\n * ```\n *\n * - `property` — required, path to a property. The property must be attached to window.\n * - `stack` — required, string that must match the current function call stack trace.\n * - values to abort inline or injected script, accordingly:\n * - `inlineScript`\n * - `injectedScript`\n *\n * ### Examples\n *\n * 1. Aborts script when it tries to access `window.Ya` and it's error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'test.js')\n * ```\n *\n * 1. Aborts script when it tries to access `window.Ya.videoAd` and it's error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya.videoAd', 'test.js')\n * ```\n *\n * 1. Aborts script when stack trace matches with any of these parameters\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexFuncName')\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'yandexScriptName')\n * ```\n *\n * 1. Aborts script when it tries to access `window.Ya` and it's an inline script\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'inlineScript')\n * ```\n *\n * 1. Aborts script when it tries to access `window.Ya` and it's an injected script\n *\n * ```adblock\n * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript')\n * ```\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function abortOnStackTrace$1(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n\n // Prevent infinite loops when trapping prop used by helpers in getter/setter\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n // Call wrapped getter and setter to keep isAbortingSuspended & isolateCallback values\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n abortOnStackTrace$1.names = ['abort-on-stack-trace',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace'];\n abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet log-on-stack-trace\n *\n * @description\n * This scriptlet is basically the same as [abort-on-stack-trace](#abort-on-stack-trace),\n * but instead of aborting it logs:\n *\n * - function and source script names pairs that access the given property\n * - was that get or set attempt\n * - script being injected or inline\n *\n * ### Syntax\n *\n * ```text\n * example.com#%#//scriptlet('log-on-stack-trace', 'property')\n * ```\n *\n * - `property` — required, path to a property. The property must be attached to window.\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function logOnStacktrace$1(source, property) {\n if (!property) {\n return;\n }\n var refineStackTrace = function refineStackTrace(stackString) {\n // Split stack trace string by lines and remove first two elements ('Error' and getter call)\n // Remove ' at ' at the start of each string\n var stackSteps = stackString.split('\\n').slice(2).map(function (line) {\n return line.replace(/ {4}at /, '');\n });\n // Trim each line extracting funcName : fullPath pair\n var logInfoArray = stackSteps.map(function (line) {\n var funcName;\n var funcFullPath;\n /* eslint-disable-next-line no-useless-escape */\n var reg = /\\(([^\\)]+)\\)/;\n var regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(' ').slice(0, -1).join(' ');\n /* eslint-disable-next-line prefer-destructuring */\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split('@').slice(0, -1).join(' ');\n /* eslint-disable-next-line prefer-destructuring */\n funcFullPath = line.match(regFirefox)[2];\n } else {\n // For when func name is not available\n funcName = 'function name is not available';\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n // Convert array into object for better display using console.table\n var logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n /* eslint-disable-next-line prefer-destructuring */\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var value = base[prop];\n /* eslint-disable no-console */\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n /* eslint-enable no-console */\n };\n\n setChainPropAccess(window, property);\n }\n logOnStacktrace$1.names = ['log-on-stack-trace'];\n logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-xhr\n *\n * @description\n * Prevents `xhr` calls if **all** given parameters match.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#no-xhr-ifjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-xhr'[, propsToMatch[, randomize]])\n * ```\n *\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call;\n * empty string or wildcard `*` for all `XMLHttpRequest.open()` calls match\n * - colon-separated pairs `name:value` where\n * - `name` is XMLHttpRequest object property name\n * - `value` is string or regular expression for matching the value of the option\n * passed to `XMLHttpRequest.open()` call\n * - `randomize` — defaults to `false` for empty responseText,\n * optional argument to randomize responseText of matched XMLHttpRequest's response; possible values:\n * - `true` to randomize responseText, random alphanumeric string of 10 symbols\n * - colon-separated pair `name:value` string value to customize responseText data where\n * - `name` — only `length` supported for now\n * - `value` — range on numbers, for example `100-300`, limited to 500000 characters\n *\n * > Usage with no arguments will log XMLHttpRequest objects to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Log all XMLHttpRequests\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr')\n * ```\n *\n * 1. Prevent all XMLHttpRequests\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', '*')\n * example.org#%#//scriptlet('prevent-xhr', '')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'method:HEAD')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url and specified request methods\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org method:/HEAD|GET/')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url and randomize it's response text\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'true')\n * ```\n *\n * 1. Prevent XMLHttpRequests for specific url and randomize it's response text with range\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300')\n * ```\n *\n * @added v1.5.0.\n */\n /* eslint-enable max-len */\n function preventXHR$1(source, propsToMatch, customResponseText) {\n // do nothing if browser does not support Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof Proxy === 'undefined') {\n return;\n }\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader;\n var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders;\n var xhrData;\n var modifiedResponse = '';\n var modifiedResponseText = '';\n var openWrapper = function openWrapper(target, thisArg, args) {\n // Get original request properties\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (typeof propsToMatch === 'undefined') {\n // Log if no propsToMatch given\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n // Add xhrData to thisArg to keep original values in case of multiple requests\n // https://github.com/AdguardTeam/Scriptlets/issues/347\n thisArg.xhrData = xhrData;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later;\n // needed for getResponseHeader() and getAllResponseHeaders() methods\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n // setRequestHeader() can only be called on xhr.open(),\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === 'blob') {\n modifiedResponse = new Blob();\n }\n if (thisArg.responseType === 'arraybuffer') {\n modifiedResponse = new ArrayBuffer();\n }\n if (customResponseText) {\n var randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n modifiedResponseText = randomText;\n } else {\n logMessage(source, \"Invalid randomize parameter: '\".concat(customResponseText, \"'\"));\n }\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n statusText = forgedRequest.statusText;\n\n // Mock response object\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // If the request is blocked, responseURL is an empty string\n responseURL: {\n value: responseURL || thisArg.xhrData.url,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n // modified values\n status: {\n value: 200,\n writable: false\n },\n response: {\n value: modifiedResponse,\n writable: false\n },\n responseText: {\n value: modifiedResponseText,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n\n /**\n * Mock XMLHttpRequest.prototype.getHeaderHandler() to avoid adblocker detection.\n *\n * @param {Function} target XMLHttpRequest.prototype.getHeaderHandler().\n * @param {XMLHttpRequest} thisArg The request.\n * @param {string[]} args Header name is passed as first argument.\n *\n * @returns {string|null} Header value or null if header is not set.\n */\n var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetResponseHeader.apply(thisArg, args);\n }\n if (!thisArg.collectedHeaders.length) {\n return null;\n }\n // The search for the header name is case-insensitive\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getResponseHeader\n var searchHeaderName = args[0].toLowerCase();\n var matchedHeader = thisArg.collectedHeaders.find(function (header) {\n var headerName = header[0].toLowerCase();\n return headerName === searchHeaderName;\n });\n return matchedHeader ? matchedHeader[1] : null;\n };\n\n /**\n * Mock XMLHttpRequest.prototype.getAllResponseHeaders() to avoid adblocker detection.\n *\n * @param {Function} target XMLHttpRequest.prototype.getAllResponseHeaders().\n * @param {XMLHttpRequest} thisArg The request.\n *\n * @returns {string} All headers as a string. For no headers an empty string is returned.\n */\n var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetAllResponseHeaders.call(thisArg);\n }\n if (!thisArg.collectedHeaders.length) {\n return '';\n }\n var allHeadersStr = thisArg.collectedHeaders.map(function (header) {\n /**\n * TODO: array destructuring may be used here\n * after the typescript implementation and bundling refactoring\n * as now there is an error: slicedToArray is not defined\n */\n var headerName = header[0];\n var headerValue = header[1];\n // In modern browsers, the header names are returned in all lower case, as per the latest spec.\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders\n return \"\".concat(headerName.toLowerCase(), \": \").concat(headerValue);\n }).join('\\r\\n');\n return allHeadersStr;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n var getHeaderHandler = {\n apply: getHeaderWrapper\n };\n var getAllHeadersHandler = {\n apply: getAllHeadersWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler);\n XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler);\n }\n preventXHR$1.names = ['prevent-xhr',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if'];\n preventXHR$1.injections = [hit, objectToString, generateRandomResponse, matchRequestProps, getXhrData, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, isValidParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength];\n\n /**\n * @scriptlet close-window\n *\n * @description\n * Closes the browser tab immediately.\n *\n * > `window.close()` usage is restricted in the Chrome browser.\n * > In this case tab will only be closed when using AdGuard Browser extension.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('close-window'[, path])\n * ```\n *\n * - `path` — optional, string or regular expression\n * matching the current location's path: `window.location.pathname` + `window.location.search`.\n * Defaults to execute on every page.\n *\n * ### Examples\n *\n * ```adblock\n * ! closes any example.org tab\n * example.org#%#//scriptlet('close-window')\n *\n * ! closes specific example.org tab\n * example.org#%#//scriptlet('close-window', '/example-page.html')\n * ```\n *\n * @added v1.5.0.\n */\n function forceWindowClose$1(source) {\n var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036\n if (typeof window.close !== 'function') {\n var message = 'window.close() is not a function so \\'close-window\\' scriptlet is unavailable';\n logMessage(source, message);\n return;\n }\n var closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n // log the error if window closing is impossible\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/close\n logMessage(source, e);\n }\n };\n var closeByExtension = function closeByExtension() {\n var extCall = function extCall() {\n dispatchEvent(new Event('adguard:scriptlet-close-window'));\n };\n window.addEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener('adguard:subscribed-to-close-window', extCall, {\n once: true\n });\n }, 5000);\n };\n var shouldClose = function shouldClose() {\n if (path === '') {\n return true;\n }\n var pathRegexp = toRegExp(path);\n var currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.includes('Chrome')) {\n closeByExtension();\n }\n }\n }\n forceWindowClose$1.names = ['close-window', 'window-close-if.js', 'ubo-window-close-if.js', 'ubo-window-close-if'];\n forceWindowClose$1.injections = [hit, toRegExp, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet prevent-refresh\n *\n * @description\n * Prevents reloading of a document through a meta \"refresh\" tag.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#refresh-defuserjs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-refresh'[, delay])\n * ```\n *\n * - `delay` — optional, number of seconds for delay that indicates when scriptlet should run.\n * If not set, source tag value will be applied.\n *\n * ### Examples\n *\n * 1. Prevent reloading of a document through a meta \"refresh\" tag\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-refresh')\n * ```\n *\n * 1. Prevent reloading of a document with delay\n *\n * ```adblock\n * example.com#%#//scriptlet('prevent-refresh', 3)\n * ```\n *\n * @added v1.6.2.\n */\n /* eslint-enable max-len */\n function preventRefresh$1(source, delaySec) {\n var getMetaElements = function getMetaElements() {\n var metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n // 'i' attribute flag is problematic in Edge 15\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n var getMetaContentDelay = function getMetaContentDelay(metaElements) {\n var delays = metaElements.map(function (meta) {\n var contentString = meta.getAttribute('content');\n if (contentString.length === 0) {\n return null;\n }\n var contentDelay;\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv\n var limiterIndex = contentString.indexOf(';');\n if (limiterIndex !== -1) {\n var delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n // Check if \"delays\" array is empty, may happens when meta's content is invalid\n // and reduce() method cannot be used with empty arrays without initial value\n if (!delays.length) {\n return null;\n }\n // Get smallest delay of all metas on the page\n var minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n // eslint-disable-next-line consistent-return\n return minDelay;\n };\n var stop = function stop() {\n var metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n var secondsToRun = getNumberFromString(delaySec);\n // Check if argument is provided\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n // Check if meta tag has delay\n if (secondsToRun === null) {\n return;\n }\n var delayMs = secondsToRun * 1000;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n preventRefresh$1.names = ['prevent-refresh',\n // Aliases are needed for matching the related scriptlet converted into our syntax\n // These are used by UBO rules syntax\n // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets\n 'refresh-defuser.js', 'refresh-defuser',\n // Prefix 'ubo-' is required to run converted rules\n 'ubo-refresh-defuser.js', 'ubo-refresh-defuser'];\n preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN];\n\n /* eslint-disable max-len, consistent-return */\n /**\n * @scriptlet prevent-element-src-loading\n *\n * @description\n * Prevents target element source loading without triggering 'onerror' listeners and not breaking 'onload' ones.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('prevent-element-src-loading', tagName, match)\n * ```\n *\n * - `tagName` — required, case-insensitive target element tagName\n * which `src` property resource loading will be silently prevented; possible values:\n * - `script`\n * - `img`\n * - `iframe`\n * - `link`\n * - `match` — required, string or regular expression for matching the element's URL;\n *\n * ### Examples\n *\n * 1. Prevent script source loading\n *\n * ```adblock\n * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle')\n * ```\n *\n * @added v1.6.2.\n */\n /* eslint-enable max-len */\n function preventElementSrcLoading$1(source, tagName, match) {\n // do nothing if browser does not support Proxy or Reflect\n if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n var srcMockData = {\n // \"KCk9Pnt9\" = \"()=>{}\"\n script: 'data:text/javascript;base64,KCk9Pnt9',\n // Empty 1x1 image\n img: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n // Empty h1 tag\n iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=',\n // Empty data\n link: 'data:text/plain;base64,'\n };\n var instance;\n if (tagName === 'script') {\n instance = HTMLScriptElement;\n } else if (tagName === 'img') {\n instance = HTMLImageElement;\n } else if (tagName === 'iframe') {\n instance = HTMLIFrameElement;\n } else if (tagName === 'link') {\n instance = HTMLLinkElement;\n } else {\n return;\n }\n\n // For websites that use Trusted Types\n // https://w3c.github.io/webappsec-trusted-types/dist/spec/\n var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function';\n var policy;\n if (hasTrustedTypes) {\n // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can\n // allow our policy if the server has restricted the creation of a trusted-types policy with\n // the directive 'Content-Security-Policy: trusted-types ;`.\n // If such a header is presented in the server response, corelibs adds permission to create\n // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors.\n // See AG-18204 for details.\n policy = window.trustedTypes.createPolicy('AGPolicy', {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n var SOURCE_PROPERTY_NAME = tagName === 'link' ? 'href' : 'src';\n var ONERROR_PROPERTY_NAME = 'onerror';\n var searchRegexp = toRegExp(match);\n\n // This will be needed to silent error events on matched element,\n // as url wont be available\n var setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, 'matched');\n };\n var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n // Check if arguments are present\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n var nodeName = thisArg.nodeName.toLowerCase();\n var attrName = args[0].toLowerCase();\n var attrValue = args[1];\n var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n // Forward the URI that corresponds with element's MIME type\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n var setAttributeHandler = {\n apply: setAttributeWrapper\n };\n // eslint-disable-next-line max-len\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n var nodeName = this.nodeName.toLowerCase();\n var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n\n // eslint-disable-next-line no-undef\n if (policy && urlValue instanceof TrustedScriptURL) {\n var trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n\n // https://github.com/AdguardTeam/Scriptlets/issues/228\n // Prevent error event being triggered by other sources\n var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n var isMatched = this.getAttribute(source.name) === 'matched';\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n // Check if arguments are present\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n var eventName = args[0];\n var isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error';\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n // eslint-disable-next-line max-len\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n var preventInlineOnerror = function preventInlineOnerror(tagName, src) {\n window.addEventListener('error', function (event) {\n if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) {\n return;\n }\n hit(source);\n if (typeof event.target.onload === 'function') {\n event.target.onerror = event.target.onload;\n return;\n }\n event.target.onerror = noopFunc;\n }, true);\n };\n preventInlineOnerror(tagName, searchRegexp);\n }\n preventElementSrcLoading$1.names = ['prevent-element-src-loading'];\n preventElementSrcLoading$1.injections = [hit, toRegExp, safeGetDescriptor, noopFunc];\n\n /**\n * @scriptlet no-topics\n *\n * @description\n * Prevents using the Topics API.\n * https://developer.chrome.com/docs/privacy-sandbox/topics/\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('no-topics')\n * ```\n *\n * @added v1.6.18.\n */\n function noTopics$1(source) {\n var TOPICS_PROPERTY_NAME = 'browsingTopics';\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n\n // document.browsingTopics() is async function so it's better to return noopPromiseResolve()\n // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve('[]');\n };\n hit(source);\n }\n noTopics$1.names = ['no-topics'];\n noTopics$1.injections = [hit, noopPromiseResolve];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-xhr-response\n *\n * @description\n * Replaces response content of `xhr` requests if **all** given parameters match.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]])\n * ```\n *\n * - `pattern` — optional, argument for matching contents of responseText that should be replaced.\n * If set, `replacement` is required. Possible values:\n * - `*` to match all text content\n * - non-empty string\n * - regular expression\n * - `replacement` — optional, should be set if `pattern` is set. String to replace matched content with.\n * Empty string to remove content.\n * - `propsToMatch` — optional, string of space-separated properties to match for extra condition; possible props:\n * - string or regular expression for matching the URL passed to `XMLHttpRequest.open()` call;\n * - colon-separated pairs `name:value` where\n * - `name` — string or regular expression for matching XMLHttpRequest property name\n * - `value` — string or regular expression for matching the value of the option\n * passed to `XMLHttpRequest.open()` call\n *\n * > Usage with no arguments will log XMLHttpRequest objects to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Log all XMLHttpRequests\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response')\n * ```\n *\n * 1. Replace text content of XMLHttpRequests with specific url\n *\n * \n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org')\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', 'example.org')\n * ```\n *\n * \n *\n * 1. Remove all text content of XMLHttpRequests with specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET')\n * ```\n *\n * 1. Replace text content of XMLHttpRequests matching by URL regex and request methods\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', '/\\.m3u8/ method:/GET|HEAD/') \n * ```\n *\n * 1. Remove all text content of all XMLHttpRequests for example.com\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n function trustedReplaceXhrResponse$1(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof Proxy === 'undefined') {\n return;\n }\n\n // Only allow pattern as empty string for logging purposes\n if (pattern === '' && replacement !== '') {\n var message = 'Pattern argument should not be empty string.';\n logMessage(source, message);\n return;\n }\n var shouldLog = pattern === '' && replacement === '';\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n // Log if no propsToMatch given\n var _message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, _message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n\n // setRequestHeader can only be called on open xhr object,\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n\n // Extract content from response\n var content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n var patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedContent = content.replace(patternRegexp, replacement);\n\n // Manually put required values into target XHR object\n // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // modified values\n response: {\n value: modifiedContent,\n writable: false\n },\n responseText: {\n value: modifiedContent,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response'\n // trusted scriptlets support no aliases\n ];\n\n trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet xml-prune\n *\n * @description\n * Removes an element from the specified XML.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#xml-prunejs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('xml-prune'[, propsToMatch[, optionalProp[, urlToMatch]]])\n * ```\n *\n * - `propsToMatch` — optional, selector of elements which will be removed from XML\n * - `optionalProp` — optional, selector of elements that must occur in XML document\n * - `urlToMatch` — optional, string or regular expression for matching the request's URL\n *\n * > Usage with no arguments will log response payload and URL to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Remove `Period` tag whose `id` contains `-ad-` from all requests\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]')\n * ```\n *\n * 1. Remove `Period` tag whose `id` contains `-ad-`, only if XML contains `SegmentTemplate`\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]', 'SegmentTemplate')\n * ```\n *\n * 1. Remove `Period` tag whose `id` contains `-ad-`, only if request's URL contains `.mpd`\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', 'Period[id*=\"-ad-\"]', '', '.mpd')\n * ```\n *\n * 1. Call with no arguments will log response payload and URL at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune')\n * ```\n *\n * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL\n *\n * ```adblock\n * example.org#%#//scriptlet('xml-prune', '', '', '.mpd')\n * ```\n *\n * @added 1.7.3.\n */\n /* eslint-enable max-len */\n\n function xmlPrune$1(source, propsToRemove) {\n var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var isXML = function isXML(text) {\n // It's necessary to check the type of 'text'\n // because 'text' is obtained from the xhr/fetch response,\n // so it could also be Blob/ArrayBuffer/Object or another type\n if (typeof text === 'string') {\n // Check if \"text\" starts with \"<\" and check if it ends with \">\"\n // If so, then it might be an XML file and should be pruned or logged\n var trimmedText = text.trim();\n if (trimmedText.startsWith('<') && trimmedText.endsWith('>')) {\n return true;\n }\n }\n return false;\n };\n var createXMLDocument = function createXMLDocument(text) {\n var xmlParser = new DOMParser();\n var xmlDocument = xmlParser.parseFromString(text, 'text/xml');\n return xmlDocument;\n };\n var isPruningNeeded = function isPruningNeeded(response, propsToRemove) {\n if (!isXML(response)) {\n return false;\n }\n var docXML = createXMLDocument(response);\n return !!docXML.querySelector(propsToRemove);\n };\n var pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n var xmlDoc = createXMLDocument(text);\n var errorNode = xmlDoc.querySelector('parsererror');\n if (errorNode) {\n return text;\n }\n if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n var elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n var serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n\n // setRequestHeader can only be called on open xhr object,\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = ['', 'text'];\n // Do nothing if request do not match\n // or response type is not a string\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n\n // Extract content from response\n var content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n if (!propsToRemove) {\n if (isXML(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, propsToRemove);\n }\n var responseContent = shouldPruneResponse ? pruneXML(response) : response;\n // Manually put required values into target XHR object\n // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // modified values\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n // It's required to fix issue with - Request with body\": Failed to execute 'fetch' on 'Window':\n // Cannot construct a Request with a Request object that has already been used.\n // For example, it occurs on youtube when scriptlet is used without arguments\n var clonedResponse = response.clone();\n var responseText = await response.text();\n shouldPruneResponse = isPruningNeeded(responseText, propsToRemove);\n if (!shouldPruneResponse) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n logMessage(source, createXMLDocument(responseText), true, false);\n return clonedResponse;\n }\n var prunedText = pruneXML(responseText);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n xmlPrune$1.names = ['xml-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune'];\n xmlPrune$1.injections = [hit, logMessage, toRegExp, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet m3u-prune\n *\n * @description\n * Removes content from the specified M3U file.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/wiki/Resources-Library#m3u-prunejs-\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch]])\n * ```\n *\n * - `propsToRemove` — optional, string or regular expression\n * to match the URL line (segment) which will be removed alongside with its tags\n * - `urlToMatch` — optional, string or regular expression for matching the request's URL\n *\n * > Usage with no arguments will log response payload and URL to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * ### Examples\n *\n * 1. Removes a tag which contains `example.com/video/`, from all requests\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune', 'example.com/video/')\n * ```\n *\n * 1. Removes a line which contains `example.com/video/`, only if request's URL contains `.m3u8`\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune', 'example.com/video/', '.m3u8')\n * ```\n *\n * 1. Call with no arguments will log response payload and URL at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune')\n * ```\n *\n * 1. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL\n *\n * ```adblock\n * example.org#%#//scriptlet('m3u-prune', '', '.m3u8')\n * ```\n *\n * @added v1.9.1.\n */\n /* eslint-enable max-len */\n\n function m3uPrune$1(source, propsToRemove) {\n var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\n if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var SEGMENT_MARKER = '#';\n var AD_MARKER = {\n ASSET: '#EXT-X-ASSET:',\n CUE: '#EXT-X-CUE:',\n CUE_IN: '#EXT-X-CUE-IN',\n DISCONTINUITY: '#EXT-X-DISCONTINUITY',\n EXTINF: '#EXTINF',\n EXTM3U: '#EXTM3U',\n SCTE35: '#EXT-X-SCTE35:'\n };\n var COMCAST_AD_MARKER = {\n AD: '-AD-',\n VAST: '-VAST-',\n VMAP_AD: '-VMAP-AD-',\n VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:'\n };\n\n // List of tags which should not be removed\n var TAGS_ALLOWLIST = ['#EXT-X-TARGETDURATION', '#EXT-X-MEDIA-SEQUENCE', '#EXT-X-DISCONTINUITY-SEQUENCE', '#EXT-X-ENDLIST', '#EXT-X-PLAYLIST-TYPE', '#EXT-X-I-FRAMES-ONLY', '#EXT-X-MEDIA', '#EXT-X-STREAM-INF', '#EXT-X-I-FRAME-STREAM-INF', '#EXT-X-SESSION-DATA', '#EXT-X-SESSION-KEY', '#EXT-X-INDEPENDENT-SEGMENTS', '#EXT-X-START'];\n var isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY\n *\n * @param {Array} lines\n * @param {number} i\n * @returns {object} { array, index }\n */\n var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n var array = lines.slice();\n var index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array,\n index\n };\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * COMCAST_AD_MARKER: COMCAST_AD_MARKER.VMAP_AD, COMCAST_AD_MARKER.VAST, COMCAST_AD_MARKER.AD\n *\n * @param {Array} lines\n * @returns {Array}\n */\n var pruneVmapBlock = function pruneVmapBlock(lines) {\n var array = lines.slice();\n for (var i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n // It's necessary to subtract 1 from \"i\",\n // otherwise one line will be skipped\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n\n /**\n * Sets an item in array to undefined, if it contains one of the\n * AD_MARKER: AD_MARKER.CUE, AD_MARKER.ASSET, AD_MARKER.SCTE35, AD_MARKER.CUE_IN\n *\n * @param {string} line\n * @param {number} index\n * @param {Array} array\n * @returns {string|undefined}\n */\n\n var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n var removeM3ULineRegexp = toRegExp(propsToRemove);\n\n /**\n * Sets an item in array to undefined, if it contains removeM3ULineRegexp and one of the\n * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY\n *\n * @param {string} line\n * @param {number} index\n * @param {Array} array\n * @returns {string|undefined}\n */\n\n var pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n\n /**\n * Removes block of segments (if it contains removeM3ULineRegexp) until another segment occurs\n *\n * @param {Array} lines\n * @returns {Array}\n */\n var pruneSegments = function pruneSegments(lines) {\n for (var i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n var segmentName = lines[i].substring(0, lines[i].indexOf(':'));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (var j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n\n /**\n * Determines if text contains \"#EXTM3U\" or \"VMAP_AD_BREAK\"\n *\n * @param {*} text\n * @returns {boolean}\n */\n var isM3U = function isM3U(text) {\n if (typeof text === 'string') {\n // Check if \"text\" starts with \"#EXTM3U\" or with \"VMAP_AD_BREAK\"\n // If so, then it might be an M3U file and should be pruned or logged\n var trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n\n /**\n * Determines if pruning is needed\n *\n * @param {string} text\n * @param {RegExp} regexp\n * @returns {boolean}\n */\n var isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n\n /**\n * Prunes lines which contain removeM3ULineRegexp and specific AD_MARKER\n *\n * @param {string} text\n * @returns {string}\n */\n // TODO: make it compatible with $hls modifier\n var pruneM3U = function pruneM3U(text) {\n var lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join('\\n');\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === 'undefined') {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== 'undefined') {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join('\\n');\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n // eslint-disable-next-line prefer-spread\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n\n // Trap setRequestHeader of target xhr object to mimic request headers later\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n // Collect headers\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n\n // setRequestHeader can only be called on open xhr object,\n // so we can safely proxy it here\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = ['', 'text'];\n // Do nothing if request do not match\n // or response type is not a string\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create separate XHR request with original request's input\n * to be able to collect response data without triggering\n * listeners on original XHR object\n */\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener('readystatechange', function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n\n // Extract content from response\n var content = responseText || response;\n if (typeof content !== 'string') {\n return;\n }\n if (!propsToRemove) {\n if (isM3U(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n var responseContent = shouldPruneResponse ? pruneM3U(response) : response;\n // Manually put required values into target XHR object\n // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied\n Object.defineProperties(thisArg, {\n // original values\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n // modified values\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n\n // Mock events\n setTimeout(function () {\n var stateEvent = new Event('readystatechange');\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event('load');\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event('loadend');\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n\n // Mimic request headers before sending\n // setRequestHeader can only be called on open request objects\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== 'string' || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n // It's required to fix issue with - Request with body\": Failed to execute 'fetch' on 'Window':\n // Cannot construct a Request with a Request object that has already been used.\n // For example, it occurs on youtube when scriptlet is used without arguments\n var clonedResponse = response.clone();\n var responseText = await response.text();\n // If \"propsToRemove\" is not defined, then response should be logged only\n if (!propsToRemove && isM3U(responseText)) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return clonedResponse;\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n var prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n m3uPrune$1.names = ['m3u-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'm3u-prune.js', 'ubo-m3u-prune.js', 'ubo-m3u-prune'];\n m3uPrune$1.injections = [hit, toRegExp, logMessage, getXhrData, objectToString, matchRequestProps, getMatchPropsData, getRequestProps, isValidParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-cookie\n *\n * @description\n * Sets a cookie with arbitrary name and value,\n * and with optional ability to offset cookie attribute 'expires' and set path.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value. Possible values:\n * - arbitrary value\n * - empty string for no value\n * - `$now$` keyword for setting current time in ms, e.g 1667915146503\n * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire;\n * defaults to no offset. Possible values:\n * - positive integer in seconds\n * - `1year` keyword for setting expiration date to one year\n * - `1day` keyword for setting expiration date to one day\n * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet does not encode cookie names and values.\n * > As a result, if a cookie's name or value includes `;`,\n * > the scriptlet will not set the cookie since this may cause the cookie to break.\n *\n * ### Examples\n *\n * 1. Set cookie\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept')\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '1-accept_1')\n * ```\n *\n * 1. Set cookie with `new Date().getTime()` value\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$')\n * ```\n *\n * 1. Set cookie which will expire in 3 days\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '259200')\n * ```\n *\n * 1. Set cookie which will expire in one year\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year')\n * ```\n *\n * 1. Set cookie with no path\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n\n function trustedSetCookie$1(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n trustedSetCookie$1.names = ['trusted-set-cookie'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-cookie-reload\n *\n * @description\n * Sets a cookie with arbitrary name and value,\n * and with optional ability to offset cookie attribute 'expires' and set path.\n * Also reloads the current page after the cookie setting.\n * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie).\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]])\n * ```\n *\n * - `name` — required, cookie name to be set\n * - `value` — required, cookie value. Possible values:\n * - arbitrary value\n * - empty string for no value\n * - `$now$` keyword for setting current time in ms, e.g 1667915146503\n * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n * - `offsetExpiresSec` — optional, offset from current time in seconds, after which cookie should expire;\n * defaults to no offset. Possible values:\n * - positive integer in seconds\n * - `1year` keyword for setting expiration date to one year\n * - `1day` keyword for setting expiration date to one day\n * - `path` — optional, argument for setting cookie path, defaults to `/`; possible values:\n * - `/` — root path\n * - `none` — to set no path at all\n *\n * > Note that the scriptlet does not encode cookie names and values.\n * > As a result, if a cookie's name or value includes `;`,\n * > the scriptlet will not set the cookie since this may cause the cookie to break.\n *\n * ### Examples\n *\n * 1. Set cookie and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept')\n * ```\n *\n * 1. Set cookie with `new Date().getTime()` value and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$')\n * ```\n *\n * 1. Set cookie which will expire in 3 days and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200')\n * ```\n *\n * 1. Set cookie which will expire in one year and reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year')\n * ```\n *\n * 1. Set cookie with no 'expire' and no path, reload the page after it\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none')\n * ```\n *\n * @added v1.7.10.\n */\n /* eslint-enable max-len */\n\n function trustedSetCookieReload$1(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/';\n if (typeof name === 'undefined') {\n logMessage(source, 'Cookie name should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Cookie value should be specified');\n return;\n }\n\n // Prevent infinite reloads if cookie was already set or blocked by the browser\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, 'Invalid cookie name or value');\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n\n // Get cookie value, it's required for checking purpose\n // in case if $now$ or $currentDate$ value is used\n // https://github.com/AdguardTeam/Scriptlets/issues/291\n var cookieValueToCheck = parseCookieString(document.cookie)[name];\n\n // Only reload the page if cookie was set\n // https://github.com/AdguardTeam/Scriptlets/issues/212\n if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) {\n window.location.reload();\n }\n }\n trustedSetCookieReload$1.names = ['trusted-set-cookie-reload'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, parseCookieString, getCookiePath];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-fetch-response\n *\n * @description\n * Replaces response text content of `fetch` requests if **all** given parameters match.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-replace-fetch-response'[, pattern, replacement[, propsToMatch]])\n * ```\n *\n * - `pattern` — optional, argument for matching contents of responseText that should be replaced.\n * If set, `replacement` is required. Possible values:\n * - `*` to match all text content\n * - non-empty string\n * - regular expression\n * - `replacement` — optional, should be set if `pattern` is set. String to replace the response text content\n * matched by `pattern`. Empty string to remove content. Defaults to empty string.\n * - `propsToMatch` — optional, string of space-separated properties to match; possible props:\n * - string or regular expression for matching the URL passed to fetch call;\n * empty string, wildcard `*` or invalid regular expression will match all fetch calls\n * - colon-separated pairs `name:value` where\n * \n * - `name` is [`init` option name](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#parameters)\n * - `value` is string or regular expression for matching the value of the option passed to fetch call;\n * invalid regular expression will cause any value matching\n *\n * > Usage with no arguments will log fetch calls to browser console;\n * > it may be useful for debugging but it is not allowed for prod versions of filter lists.\n *\n * > Scriptlet does nothing if response body can't be converted to text.\n *\n * ### Examples\n *\n * 1. Log all fetch calls\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response')\n * ```\n *\n * 1. Replace response text content of fetch requests with specific url\n *\n * \n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', 'adb_detect:true', 'adb_detect:false', 'example.org')\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', 'example.org')\n * ```\n *\n * \n *\n * 1. Remove all text content of fetch responses with specific request method\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'method:GET')\n * ```\n *\n * 1. Replace response text content of fetch requests matching by URL regex and request methods\n *\n * \n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '/#EXT-X-VMAP-AD-BREAK[\\s\\S]*?/', '#EXT-X-ENDLIST', '/\\.m3u8/ method:/GET|HEAD/')\n * ```\n *\n * \n *\n * 1. Remove text content of all fetch responses for example.com\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n function trustedReplaceFetchResponse$1(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer)\n // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') {\n return;\n }\n\n // Only allow pattern as empty string for logging purposes\n if (pattern === '' && replacement !== '') {\n logMessage(source, 'Pattern argument should not be empty string');\n return;\n }\n var shouldLog = pattern === '' && replacement === '';\n var nativeFetch = fetch;\n var shouldReplace = false;\n var fetchData;\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n // log if no propsToMatch given\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n\n /**\n * Create new Response object using original response' properties\n * and given text as body content\n *\n * @param {Response} response original response to copy properties from\n * @param {string} textContent text to set as body content\n * @returns {Response}\n */\n var forgeResponse = function forgeResponse(response, textContent) {\n var bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n var forgedResponse = new Response(textContent, {\n status,\n statusText,\n headers\n });\n\n // Manually set properties which can't be set by Response constructor\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n\n // eslint-disable-next-line prefer-spread\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n var patternRegexp = pattern === '*' ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n var forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n // log if response body can't be converted to a string\n var fetchDataStr = objectToString(fetchData);\n var message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign\n }\n\n trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response'\n // trusted scriptlets support no aliases\n ];\n\n trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, parseMatchProps, isValidParsedData, getMatchPropsData];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-local-storage-item\n *\n * @description\n * Adds item with arbitrary key and value to localStorage object, or updates the value of the key if it already exists.\n * Scriptlet won't set item if storage is full.\n *\n * ### Syntax\n *\n * ```adblock\n * example.com#%#//scriptlet('trusted-set-local-storage-item', 'key', 'value')\n * ```\n *\n * - `key` — required, key name to be set.\n * - `value` — required, key value; possible values:\n * - arbitrary value\n * - `$now$` keyword for setting current time in ms, corresponds to `Date.now()` and `(new Date).getTime()` calls\n * - `$currentDate$` keyword for setting string representation of the current date and time,\n * corresponds to `Date()` and `(new Date).toString()` calls\n *\n * ### Examples\n *\n * 1. Set local storage item\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.mute', 'false')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'COOKIE_CONSENTS', '{\"preferences\":3,\"flag\":false}')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '[16364,88364]')\n *\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'providers', '{\"providers\":[123,456],\"consent\":\"all\"}')\n * ```\n *\n * 1. Set item with current time since unix epoch in ms\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$now$')\n * ```\n *\n * 1. Set item with current date, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300'\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'player.live.current.play', '$currentDate$')\n * ```\n *\n * 1. Set item without value\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '')\n * ```\n *\n * @added v1.7.3.\n */\n /* eslint-enable max-len */\n\n function trustedSetLocalStorageItem$1(source, key, value) {\n if (typeof key === 'undefined') {\n logMessage(source, 'Item key should be specified');\n return;\n }\n if (typeof value === 'undefined') {\n logMessage(source, 'Item value should be specified');\n return;\n }\n var parsedValue = parseKeywordValue(value);\n var _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-set-constant\n *\n * @description\n * Creates a constant property and assigns it a specified value.\n *\n * > Actually, it's not a constant. Please note, that it can be rewritten with a value of a different type.\n *\n * > If empty object is present in chain it will be trapped until chain leftovers appear.\n *\n * > Use [set-constant](./about-scriptlets.md#set-constant) to set predefined values and functions.\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('trusted-set-constant', property, value[, stack])\n * ```\n *\n * - `property` — required, path to a property (joined with `.` if needed). The property must be attached to `window`.\n * - `value` — required, an arbitrary value to be set; value type is being inferred from the argument,\n * e.g '500' will be set as number; to set string type value wrap argument into another pair of quotes: `'\"500\"'`;\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * ### Examples\n *\n * 1. Set property values of different types\n *\n * ```adblock\n * ! Set string value wrapping argument into another pair of quotes\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '\"null\"')\n *\n * ✔ window.click_r === 'null'\n * ✔ typeof window.click_r === 'string'\n *\n * ! Set inferred null value\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', 'null')\n *\n * ✔ window.click_r === null\n * ✔ typeof window.click_r === 'object'\n *\n * ! Set number type value\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '48')\n *\n * ✔ window.click_r === 48\n * ✔ typeof window.click_r === 'number'\n *\n * ! Set array or object as property value, argument should be a JSON string\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '[1,\"string\"]')\n * example.org#%#//scriptlet('trusted-set-constant', 'click_r', '{\"aaa\":123,\"bbb\":{\"ccc\":\"string\"}}')\n * ```\n *\n * 1. Use script stack matching to set value\n *\n * ```adblock\n * ! `document.first` will return `1` if the method is related to `checking.js`\n * example.org#%#//scriptlet('trusted-set-constant', 'document.first', '1', 'checking.js')\n *\n * ✔ document.first === 1 // if the condition described above is met\n * ```\n *\n * @added v1.8.2.\n */\n /* eslint-enable max-len */\n function trustedSetConstant$1(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n\n /**\n * Safely sets property on a given object\n *\n * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} base arbitrary reachable object\n * @param {string} prop property name\n * @param {boolean} configurable if set property should be configurable\n * @param {object} handler custom property descriptor object\n * @returns {boolean} true if prop was trapped successfully\n */\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n // This is required to prevent scriptlets overwrite each over\n if (origDescriptor instanceof Object) {\n // This check is required to avoid defining non-configurable props\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n\n /**\n * Traverses given chain to set constant value to its end prop\n * Chains that yet include non-object values (e.g null) are valid and will be\n * traversed when appropriate chain member is set by an external script\n *\n * IMPORTANT! this duplicates corresponding func in set-constant scriptlet as\n * reorganizing this to common helpers will most definitely complicate debugging\n *\n * @param {object} owner object that owns chain\n * @param {string} property chain of owner properties\n */\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n\n // Handler method init is used to keep track of factual value\n // and apply mustCancel() check only on end prop\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n // Prevent breakage due to loop assignments like win.obj = win.obj\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n\n // End prop case\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n\n // Null prop in chain\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n\n // Empty object prop in chain\n if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n\n // Defined prop in chain\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n\n // Undefined prop in chain\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n trustedSetConstant$1.names = ['trusted-set-constant'\n // trusted scriptlets support no aliases\n ];\n\n trustedSetConstant$1.injections = [hit, inferValue, logMessage, noopArray, noopObject, noopFunc, noopCallbackFunc, trueFunc, falseFunc, throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest,\n // following helpers should be imported and injected\n // because they are used by helpers above\n shouldAbortInlineOrInjectedScript];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet inject-css-in-shadow-dom\n *\n * @description\n * Injects CSS rule into selected Shadow DOM subtrees on a page\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', cssRule[, hostSelector])\n * ```\n *\n * - `cssRule` — required, string representing a single css rule\n * - `hostSelector` — optional, string, selector to match shadow host elements.\n * CSS rule will be only applied to shadow roots inside these elements.\n * Defaults to injecting css rule into all available roots.\n *\n * ### Examples\n *\n * 1. Apply style to all shadow dom subtrees\n *\n * ```adblock\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#advertisement { display: none !important; }')\n * ```\n *\n * 1. Apply style to a specific shadow dom subtree\n *\n * ```adblock\n * example.org#%#//scriptlet('inject-css-in-shadow-dom', '#content { margin-top: 0 !important; }', '#banner')\n * ```\n *\n * @added v1.8.2.\n */\n /* eslint-enable max-len */\n\n function injectCssInShadowDom$1(source, cssRule) {\n var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n // do nothing if browser does not support ShadowRoot, Proxy or Reflect\n // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot\n if (!Element.prototype.attachShadow || typeof Proxy === 'undefined' || typeof Reflect === 'undefined') {\n return;\n }\n\n // Prevent url() and image-set() styles from being applied\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n var callback = function callback(shadowRoot) {\n try {\n // adoptedStyleSheets and CSSStyleSheet constructor are not yet supported by Safari\n // https://developer.mozilla.org/en-US/docs/Web/API/Document/adoptedStyleSheets\n // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/CSSStyleSheet\n var stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n var styleTag = document.createElement('style');\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n injectCssInShadowDom$1.names = ['inject-css-in-shadow-dom'];\n injectCssInShadowDom$1.injections = [hit, logMessage, hijackAttachShadow];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet remove-node-text\n *\n * @description\n * Removes text from DOM nodes.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/commit/2bb446797a12086f2eebc0c8635b671b8b90c477\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-node-text', nodeName, condition)\n * ```\n *\n * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed.\n * Must target lowercased node names, e.g `div` instead of `DIV`.\n * - `textMatch` — required, string or RegExp to match against node's text content.\n * If matched, the whole text will be removed. Case sensitive.\n *\n * ### Examples\n *\n * 1. Remove node's text content:\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-node-text', 'div', 'some text')\n * ```\n *\n * ```html\n * \n *
some text
\n * some text\n *\n * \n *
\n * some text\n * ```\n *\n * 2. Remove node's text content, matching both node name and condition by RegExp:\n *\n * ```adblock\n * example.org#%#//scriptlet('remove-node-text', '/[a-z]*[0-9]/', '/text/')\n * ```\n *\n * ```html\n * \n * some text\n * some text\n *\n * \n * \n * some text\n * ```\n *\n * @added v1.9.37.\n */\n /* eslint-enable max-len */\n function removeNodeText$1(source, nodeName, textMatch) {\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch;\n\n /**\n * Handles nodes by removing text content of matched nodes\n *\n * Note: instead of drilling down all the arguments for both replace-node-text\n * and trusted-replace-node-text scriptlets, only the handler is being passed\n *\n * @param {Node[]} nodes nodes to handle\n * @returns {void}\n */\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n var ALL_TEXT_PATTERN = /^[\\s\\S]*$/;\n var REPLACEMENT = '';\n replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT);\n }\n });\n };\n\n // Apply dedicated handler to already rendered nodes...\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n\n // and newly added nodes\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n removeNodeText$1.names = ['remove-node-text',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'remove-node-text.js', 'ubo-remove-node-text.js', 'rmnt.js', 'ubo-rmnt.js', 'ubo-remove-node-text', 'ubo-rmnt'];\n removeNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams,\n // following helpers should be imported and injected\n // because they are used by helpers above\n hit, nodeListToArray, getAddedNodes, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @trustedScriptlet trusted-replace-node-text\n *\n * @description\n * Replaces text in text content of matched DOM nodes.\n *\n * ### Syntax\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-node-text', nodeName, textMatch, pattern, replacement)\n * ```\n *\n * - `nodeName` — required, string or RegExp, specifies DOM node name from which the text will be removed.\n * Must target lowercased node names, e.g `div` instead of `DIV`.\n * - `textMatch` — required, string or RegExp to match against node's text content.\n * If matched, the whole text will be removed. Case sensitive.\n * - `pattern` — required, string or regexp for matching contents of `node.textContent` that should be replaced.\n * - `replacement` — required, string to replace text content matched by `pattern`.\n *\n * ### Examples\n *\n * 1. Replace node's text content:\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-node-text', 'div', 'some', 'text', 'other text')\n * ```\n *\n * ```html\n * \n *
some text
\n *
text
\n * some text\n *\n * \n *
some other text
\n *
text
\n * some text\n * ```\n *\n * 2. Replace node's text content, matching both node name, text and pattern by RegExp:\n *\n * ```adblock\n * example.org#%#//scriptlet('trusted-replace-node-text', '/[a-z]*[0-9]/', '/s\\dme/', '/t\\dxt/', 'other text')\n * ```\n *\n * ```html\n * \n * s0me t3xt // this node is going to be matched by both node name and text\n * text // this node won't be matched by text content nor text content\n * some text\n *\n * \n * s0me other text // text content has changed\n * text\n * some text\n * ```\n *\n * @added v1.9.37.\n */\n /* eslint-enable max-len */\n function trustedReplaceNodeText$1(source, nodeName, textMatch, pattern, replacement) {\n var uboAliases = ['replace-node-text.js', 'rpnt.js', 'sed.js'];\n\n /**\n * UBO replaceNodeText scriptlet has different signature:\n * function replaceNodeText(nodeName, pattern, replacement, ...extraArgs) {...}\n *\n * with extra params being passed as ['paramname', paramvalue]\n */\n if (uboAliases.includes(source.name)) {\n replacement = pattern;\n pattern = textMatch;\n // eslint-disable-next-line prefer-destructuring, prefer-rest-params\n for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {\n extraArgs[_key - 5] = arguments[_key];\n }\n for (var i = 0; i < extraArgs.length; i += 1) {\n var arg = extraArgs[i];\n if (arg === 'condition') {\n textMatch = extraArgs[i + 1];\n break;\n }\n }\n }\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch,\n patternMatch = _parseNodeTextParams.patternMatch;\n\n /**\n * Handles nodes by removing text content of matched nodes\n *\n * Note: instead of drilling down all the arguments for both replace-node-text\n * and trusted-replace-node-text scriptlets, only the handler is being passed\n *\n * @param {Node[]} nodes nodes to handle\n * @returns {void}\n */\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n replaceNodeText(source, node, patternMatch, replacement);\n }\n });\n };\n\n // Apply dedicated handler to already rendered nodes...\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n\n // and newly added nodes\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n trustedReplaceNodeText$1.names = ['trusted-replace-node-text'\n // trusted scriptlets support no aliases\n ];\n\n trustedReplaceNodeText$1.injections = [observeDocumentWithTimeout, handleExistingNodes, handleMutations, replaceNodeText, isTargetNode, parseNodeTextParams,\n // following helpers should be imported and injected\n // because they are used by helpers above\n hit, nodeListToArray, getAddedNodes, toRegExp];\n\n /* eslint-disable max-len */\n /**\n * @scriptlet evaldata-prune\n *\n * @description\n * Removes specified properties from the result of calling eval (if payloads contains `Object`) and returns to the caller.\n *\n * Related UBO scriptlet:\n * https://github.com/gorhill/uBlock/commit/c8de9041917b61035171e454df886706f27fc4f3\n *\n * ### Syntax\n *\n * ```text\n * example.org#%#//scriptlet('evaldata-prune'[, propsToRemove [, obligatoryProps [, stack]]])\n * ```\n *\n * - `propsToRemove` — optional, string of space-separated properties to remove\n * - `obligatoryProps` — optional, string of space-separated properties\n * which must be all present for the pruning to occur\n * - `stack` — optional, string or regular expression that must match the current function call stack trace;\n * if regular expression is invalid it will be skipped\n *\n * > Note please that you can use wildcard `*` for chain property name,\n * > e.g. `ad.*.src` instead of `ad.0.src ad.1.src ad.2.src`.\n *\n * ### Examples\n *\n * 1. Removes property `example` from the payload of the eval call\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'example')\n * ```\n *\n * For instance, the following call will return `{ one: 1}`\n *\n * ```html\n * eval({ one: 1, example: true })\n * ```\n *\n * 2. If there are no specified properties in the payload of eval call, pruning will NOT occur\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'one', 'obligatoryProp')\n * ```\n *\n * For instance, the following call will return `{ one: 1, two: 2}`\n *\n * ```html\n * JSON.parse('{\"one\":1,\"two\":2}')\n * ```\n *\n * 3. A property in a list of properties can be a chain of properties\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'a.b', 'ads.url.first')\n * ```\n *\n * 4. Removes property `content.ad` from the payload of eval call if its error stack trace contains `test.js`\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'content.ad', '', 'test.js')\n * ```\n *\n * 5. A property in a list of properties can be a chain of properties with wildcard in it\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', 'content.*.media.src', 'content.*.media.ad')\n * ```\n *\n * 6. Call with no arguments will log the current hostname and object payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune')\n * ```\n *\n * 7. Call with only second argument will log the current hostname and matched object payload at the console\n *\n * ```adblock\n * example.org#%#//scriptlet('evaldata-prune', '', '\"id\":\"117458\"')\n * ```\n *\n * @added v1.9.37.\n */\n /* eslint-enable max-len */\n function evalDataPrune$1(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : [];\n var evalWrapper = function evalWrapper(target, thisArg, args) {\n var data = Reflect.apply(target, thisArg, args);\n if (typeof data === 'object') {\n data = jsonPruner(source, data, prunePaths, requiredPaths);\n }\n return data;\n };\n var evalHandler = {\n apply: evalWrapper\n };\n // eslint-disable-next-line no-eval\n window.eval = new Proxy(window.eval, evalHandler);\n }\n evalDataPrune$1.names = ['evaldata-prune',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'evaldata-prune.js', 'ubo-evaldata-prune.js', 'ubo-evaldata-prune'];\n evalDataPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, toRegExp, isPruningNeeded, jsonPruner,\n // following helpers are needed for helpers above\n getNativeRegexpTest, shouldAbortInlineOrInjectedScript];\n\n /**\n * This file must export all scriptlets which should be accessible\n */\n\n var scriptletList = /*#__PURE__*/Object.freeze({\n __proto__: null,\n abortCurrentInlineScript: abortCurrentInlineScript$1,\n abortOnPropertyRead: abortOnPropertyRead$1,\n abortOnPropertyWrite: abortOnPropertyWrite$1,\n abortOnStackTrace: abortOnStackTrace$1,\n adjustSetInterval: adjustSetInterval$1,\n adjustSetTimeout: adjustSetTimeout$1,\n debugCurrentInlineScript: debugCurrentInlineScript$1,\n debugOnPropertyRead: debugOnPropertyRead$1,\n debugOnPropertyWrite: debugOnPropertyWrite$1,\n dirString: dirString$1,\n disableNewtabLinks: disableNewtabLinks$1,\n evalDataPrune: evalDataPrune$1,\n forceWindowClose: forceWindowClose$1,\n hideInShadowDom: hideInShadowDom$1,\n injectCssInShadowDom: injectCssInShadowDom$1,\n jsonPrune: jsonPrune$1,\n log: log$1,\n logAddEventListener: logAddEventListener$1,\n logEval: logEval$1,\n logOnStacktrace: logOnStacktrace$1,\n m3uPrune: m3uPrune$1,\n noTopics: noTopics$1,\n noeval: noeval$1,\n nowebrtc: nowebrtc$1,\n preventAddEventListener: preventAddEventListener$1,\n preventAdfly: preventAdfly$1,\n preventBab: preventBab$2,\n preventElementSrcLoading: preventElementSrcLoading$1,\n preventEvalIf: preventEvalIf$1,\n preventFab: preventFab$1,\n preventFetch: preventFetch$1,\n preventPopadsNet: preventPopadsNet$1,\n preventRefresh: preventRefresh$1,\n preventRequestAnimationFrame: preventRequestAnimationFrame$1,\n preventSetInterval: preventSetInterval$1,\n preventSetTimeout: preventSetTimeout$1,\n preventWindowOpen: preventWindowOpen$1,\n preventXHR: preventXHR$1,\n removeAttr: removeAttr$1,\n removeClass: removeClass$1,\n removeCookie: removeCookie$1,\n removeInShadowDom: removeInShadowDom$1,\n removeNodeText: removeNodeText$1,\n setAttr: setAttr$1,\n setConstant: setConstant$1,\n setCookie: setCookie$1,\n setCookieReload: setCookieReload$1,\n setLocalStorageItem: setLocalStorageItem$1,\n setPopadsDummy: setPopadsDummy$1,\n setSessionStorageItem: setSessionStorageItem$1,\n trustedClickElement: trustedClickElement$1,\n trustedReplaceFetchResponse: trustedReplaceFetchResponse$1,\n trustedReplaceNodeText: trustedReplaceNodeText$1,\n trustedReplaceXhrResponse: trustedReplaceXhrResponse$1,\n trustedSetConstant: trustedSetConstant$1,\n trustedSetCookie: trustedSetCookie$1,\n trustedSetCookieReload: trustedSetCookieReload$1,\n trustedSetLocalStorageItem: trustedSetLocalStorageItem$1,\n xmlPrune: xmlPrune$1\n });\n\n /**\n * Store of ADG redirects names and their analogs.\n * As it is not a compatibility table, no need to keep in redirects array third-party redirects.\n *\n * Needed only for conversion purposes.\n * e.g. googletagmanager-gtm is removed and should be removed from compatibility table as well\n * but now it works as alias for google-analytics so it should stay valid for compiler\n */\n var redirects$1 = [{\n adg: '1x1-transparent.gif',\n ubo: '1x1.gif',\n abp: '1x1-transparent-gif'\n }, {\n adg: '2x2-transparent.png',\n ubo: '2x2.png',\n abp: '2x2-transparent-png'\n }, {\n adg: '3x2-transparent.png',\n ubo: '3x2.png',\n abp: '3x2-transparent-png'\n }, {\n adg: '32x32-transparent.png',\n ubo: '32x32.png',\n abp: '32x32-transparent-png'\n }, {\n adg: 'amazon-apstag',\n ubo: 'amazon_apstag.js'\n }, {\n adg: 'ati-smarttag'\n }, {\n adg: 'didomi-loader'\n }, {\n adg: 'click2load.html',\n ubo: 'click2load.html'\n }, {\n adg: 'fingerprintjs2',\n ubo: 'fingerprint2.js'\n }, {\n adg: 'fingerprintjs3',\n ubo: 'fingerprint3.js'\n }, {\n adg: 'google-analytics',\n ubo: 'google-analytics_analytics.js'\n }, {\n adg: 'google-analytics-ga',\n ubo: 'google-analytics_ga.js'\n }, {\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication_adsbygoogle.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/162\n adg: 'googlesyndication-adsbygoogle',\n ubo: 'googlesyndication.com/adsbygoogle.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/127\n adg: 'googletagmanager-gtm',\n ubo: 'google-analytics_ga.js'\n }, {\n // https://github.com/AdguardTeam/Scriptlets/issues/260\n adg: 'googletagmanager-gtm',\n ubo: 'googletagmanager_gtm.js'\n }, {\n adg: 'googletagservices-gpt',\n ubo: 'googletagservices_gpt.js'\n }, {\n adg: 'google-ima3',\n ubo: 'google-ima.js'\n }, {\n adg: 'gemius'\n }, {\n adg: 'matomo'\n }, {\n adg: 'metrika-yandex-watch'\n }, {\n adg: 'metrika-yandex-tag'\n }, {\n adg: 'naver-wcslog'\n }, {\n adg: 'noeval',\n ubo: 'noeval-silent.js'\n }, {\n adg: 'noopcss',\n ubo: 'noop.css',\n abp: 'blank-css'\n }, {\n adg: 'noopframe',\n ubo: 'noop.html',\n abp: 'blank-html'\n }, {\n adg: 'noopjs',\n ubo: 'noop.js',\n abp: 'blank-js'\n }, {\n adg: 'noopjson'\n }, {\n adg: 'nooptext',\n ubo: 'noop.txt',\n abp: 'blank-text'\n }, {\n adg: 'noopmp3-0.1s',\n ubo: 'noop-0.1s.mp3',\n abp: 'blank-mp3'\n }, {\n adg: 'noopmp4-1s',\n ubo: 'noop-1s.mp4',\n abp: 'blank-mp4'\n }, {\n adg: 'noopvmap-1.0',\n ubo: 'noop-vmap1.0.xml'\n }, {\n adg: 'noopvast-2.0'\n }, {\n adg: 'noopvast-3.0'\n }, {\n adg: 'noopvast-4.0'\n }, {\n adg: 'prebid'\n }, {\n adg: 'pardot-1.0'\n }, {\n adg: 'prevent-bab',\n ubo: 'nobab.js'\n }, {\n adg: 'prevent-bab2',\n ubo: 'nobab2.js'\n }, {\n adg: 'prevent-fab-3.2.0',\n ubo: 'nofab.js'\n }, {\n // AG-15917\n adg: 'prevent-fab-3.2.0',\n ubo: 'fuckadblock.js-3.2.0'\n }, {\n adg: 'prevent-popads-net',\n ubo: 'popads.js'\n }, {\n adg: 'scorecardresearch-beacon',\n ubo: 'scorecardresearch_beacon.js'\n }, {\n adg: 'set-popads-dummy',\n ubo: 'popads-dummy.js'\n }, {\n adg: 'empty',\n ubo: 'empty'\n }, {\n adg: 'prebid-ads',\n ubo: 'prebid-ads.js'\n }];\n\n var JS_RULE_MARKER = '#%#';\n var COMMENT_MARKER = '!';\n\n /**\n * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false)\n *\n * @param rule rule text\n * @returns if rule text is comment\n */\n var isComment = function isComment(rule) {\n return rule.startsWith(COMMENT_MARKER);\n };\n\n /* ************************************************************************\n *\n * Scriptlets\n *\n ************************************************************************** */\n\n /**\n * uBlock scriptlet rule mask\n */\n var UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\\s*\\+js/;\n var UBO_SCRIPTLET_MASK_1 = '##+js';\n var UBO_SCRIPTLET_MASK_2 = '##script:inject';\n var UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js';\n var UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject';\n\n /**\n * AdBlock Plus snippet rule mask\n */\n var ABP_SCRIPTLET_MASK = '#$#';\n var ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#';\n\n /**\n * AdGuard CSS rule mask\n */\n var ADG_CSS_MASK_REG = /#@?\\$#.+?\\s*\\{.*\\}\\s*$/g;\n\n /**\n * Checks if the `rule` is AdGuard scriptlet rule\n *\n * @param rule - rule text\n * @returns true if given rule is adg rule\n */\n var isAdgScriptletRule = function isAdgScriptletRule(rule) {\n return !isComment(rule) && rule.includes(ADG_SCRIPTLET_MASK);\n };\n\n /**\n * Checks if the `rule` is uBO scriptlet rule\n *\n * @param rule rule text\n * @returns true if given rule is ubo rule\n */\n var isUboScriptletRule = function isUboScriptletRule(rule) {\n return (rule.includes(UBO_SCRIPTLET_MASK_1) || rule.includes(UBO_SCRIPTLET_MASK_2) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_1) || rule.includes(UBO_SCRIPTLET_EXCEPTION_MASK_2)) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule);\n };\n\n /**\n * Checks if the `rule` is AdBlock Plus snippet\n *\n * @param rule rule text\n * @returns true if given rule is abp rule\n */\n var isAbpSnippetRule = function isAbpSnippetRule(rule) {\n return (rule.includes(ABP_SCRIPTLET_MASK) || rule.includes(ABP_SCRIPTLET_EXCEPTION_MASK)) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule);\n };\n\n /**\n * Returns array of scriptlet objects.\n * Needed for scriptlet name validation which will check aliases names.\n *\n * @returns Array of all scriptlet objects.\n */\n var getScriptletsObjList = function getScriptletsObjList() {\n return Object.values(scriptletList);\n };\n\n /**\n * Finds scriptlet by the `name`.\n *\n * @param name Scriptlet name.\n * @param scriptlets Array of all scriptlet objects.\n * @returns {Function} Scriptlet function.\n */\n var getScriptletByName = function getScriptletByName(name, scriptlets) {\n if (!scriptlets) {\n scriptlets = getScriptletsObjList();\n }\n return scriptlets.find(function (s) {\n return s.names\n // full match name checking\n && (s.names.includes(name)\n // or check ubo alias name without '.js' at the end\n || !name.endsWith('.js') && s.names.includes(\"\".concat(name, \".js\")));\n });\n };\n var scriptletObjects = getScriptletsObjList();\n\n /**\n * Checks whether the scriptlet `name` is valid by checking the scriptlet list object.\n *\n * @param name Scriptlet name.\n * @returns True if scriptlet name is valid.\n */\n var isValidScriptletNameNotCached = function isValidScriptletNameNotCached(name) {\n if (!name) {\n return false;\n }\n return !!getScriptletByName(name, scriptletObjects);\n };\n\n /**\n * Cache for better performance of scriptlet name validation.\n */\n var scriptletNameValidationCache = new Map();\n\n /**\n * Checks whether the `name` is valid scriptlet name.\n * Uses cache for better performance.\n *\n * @param name Scriptlet name.\n * @returns true if scriptlet name is a valid one.\n */\n var isValidScriptletName = function isValidScriptletName(name) {\n if (!name) {\n return false;\n }\n // if there is no cached validation value\n if (!scriptletNameValidationCache.has(name)) {\n // we should calculate it first\n var isValid = isValidScriptletNameNotCached(name);\n // and save it to the cache then\n scriptletNameValidationCache.set(name, isValid);\n return isValid;\n }\n // otherwise return cached validation result\n return scriptletNameValidationCache.get(name);\n };\n\n /* ************************************************************************\n *\n * Redirects\n *\n ************************************************************************** */\n\n /**\n * Redirect resources markers\n */\n var ADG_UBO_REDIRECT_MARKER = 'redirect=';\n var ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule=';\n var ABP_REDIRECT_MARKER = 'rewrite=abp-resource:';\n var EMPTY_REDIRECT_MARKER = 'empty';\n var VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other'];\n\n /**\n * Source types for redirect rules if there is no one of them.\n * Used for ADG -> UBO conversion.\n */\n var ABSENT_SOURCE_TYPE_REPLACEMENT = [{\n NAME: 'nooptext',\n TYPES: VALID_SOURCE_TYPES\n }, {\n NAME: 'noopcss',\n TYPES: ['stylesheet']\n }, {\n NAME: 'noopjs',\n TYPES: ['script']\n }, {\n NAME: 'noopframe',\n TYPES: ['subdocument']\n }, {\n NAME: '1x1-transparent.gif',\n TYPES: ['image']\n }, {\n NAME: 'noopmp3-0.1s',\n TYPES: ['media']\n }, {\n NAME: 'noopmp4-1s',\n TYPES: ['media']\n }, {\n NAME: 'googlesyndication-adsbygoogle',\n TYPES: ['xmlhttprequest', 'script']\n }, {\n NAME: 'google-analytics',\n TYPES: ['script']\n }, {\n NAME: 'googletagservices-gpt',\n TYPES: ['script']\n }];\n var validAdgRedirects = redirects$1.filter(function (el) {\n return !!el.adg;\n });\n\n /**\n * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names\n * It's used for UBO -> ADG converting\n */\n var uboToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) {\n return !!el.ubo;\n }).map(function (el) {\n return [el.ubo, el.adg];\n }));\n\n /**\n * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names\n * It's used for ABP -> ADG converting\n */\n var abpToAdgCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) {\n return !!el.abp;\n }).map(function (el) {\n return [el.abp, el.adg];\n }));\n\n /**\n * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names\n * It's used for ADG -> UBO converting\n */\n var adgToUboCompatibility = Object.fromEntries(validAdgRedirects.filter(function (el) {\n return el.ubo;\n }).map(function (el) {\n return [el.adg, el.ubo];\n }));\n\n /**\n * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names\n * 'adgToUboCompatibility' is still needed for ADG -> UBO converting\n */\n var validAdgCompatibility = Object.fromEntries(validAdgRedirects.map(function (el) {\n return [el.adg, 'valid adg redirect'];\n }));\n var REDIRECT_RULE_TYPES = {\n [\"VALID_ADG\"]: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n compatibility: validAdgCompatibility,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER\n },\n [\"ADG\"]: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n compatibility: adgToUboCompatibility,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER\n },\n [\"UBO\"]: {\n redirectMarker: ADG_UBO_REDIRECT_MARKER,\n compatibility: uboToAdgCompatibility,\n redirectRuleMarker: ADG_UBO_REDIRECT_RULE_MARKER\n },\n [\"ABP\"]: {\n redirectMarker: ABP_REDIRECT_MARKER,\n compatibility: abpToAdgCompatibility\n }\n };\n\n /**\n * Parses redirect rule modifiers\n *\n * @param rule rule text\n * @returns list of rule modifiers\n */\n var parseModifiers = function parseModifiers(rule) {\n return substringAfter$1(rule, '$').split(',');\n };\n\n /**\n * Gets redirect resource name\n *\n * @param rule rule text\n * @param marker - specific Adg/Ubo or Abp redirect resources marker\n * @returns - redirect resource name\n */\n var getRedirectName = function getRedirectName(rule, marker) {\n var ruleModifiers = parseModifiers(rule);\n var redirectNamePart = ruleModifiers.find(function (el) {\n return el.includes(marker);\n });\n return redirectNamePart ? substringAfter$1(redirectNamePart, marker) : null;\n };\n\n /**\n * Checks if the `rule` is AdGuard redirect rule.\n * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier.\n *\n * @param rule - rule text\n * @returns true if given rule is adg redirect\n */\n var isAdgRedirectRule = function isAdgRedirectRule(rule) {\n var MARKER_IN_BASE_PART_MASK = '/((?!\\\\$|\\\\,).{1})redirect((-rule)?)=(.{0,}?)\\\\$(popup)?/';\n var _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[\"ADG\"],\n redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker,\n redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker;\n return !isComment(rule) && (rule.includes(redirectMarker) || typeof redirectRuleMarker === 'string' && rule.includes(redirectRuleMarker))\n // some js rules may have 'redirect=' in it, so we should get rid of them\n && !rule.includes(JS_RULE_MARKER)\n // get rid of rules like '_redirect=*://look.$popup'\n && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule);\n };\n\n /**\n * Checks if the `rule` satisfies the `type`\n *\n * @param rule - rule text\n * @param type - type of a redirect rule\n * @returns if the `rule` satisfies the `type`\n */\n var isRedirectRuleByType = function isRedirectRuleByType(rule, type) {\n var _REDIRECT_RULE_TYPES$2 = REDIRECT_RULE_TYPES[type],\n redirectMarker = _REDIRECT_RULE_TYPES$2.redirectMarker,\n redirectRuleMarker = _REDIRECT_RULE_TYPES$2.redirectRuleMarker,\n compatibility = _REDIRECT_RULE_TYPES$2.compatibility;\n if (rule && !isComment(rule)) {\n var marker;\n // check if there is a $redirect-rule modifier in rule\n var markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1;\n if (markerIndex > -1) {\n marker = redirectRuleMarker;\n } else {\n // check if there $redirect modifier in rule\n markerIndex = rule.indexOf(redirectMarker);\n if (markerIndex > -1) {\n marker = redirectMarker;\n } else {\n return false;\n }\n }\n if (!marker) {\n return false;\n }\n var redirectName = getRedirectName(rule, marker);\n if (!redirectName) {\n return false;\n }\n return redirectName === Object.keys(compatibility).find(function (el) {\n return el === redirectName;\n });\n }\n return false;\n };\n\n /**\n * Checks if the `rule` is **valid** AdGuard redirect resource rule\n *\n * @param rule - rule text\n * @returns true if given rule is valid adg redirect\n */\n var isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) {\n return isRedirectRuleByType(rule, \"VALID_ADG\");\n };\n\n /**\n * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion\n *\n * @param rule - AdGuard rule text\n * @returns - true if the rule can be converted to Ubo\n */\n var isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) {\n return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, \"ADG\");\n };\n\n /**\n * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion\n *\n * @param rule - Ubo rule text\n * @returns - true if the rule can be converted to AdGuard\n */\n var isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, \"UBO\");\n };\n\n /**\n * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion\n *\n * @param rule - Abp rule text\n * @returns - true if the rule can be converted to AdGuard\n */\n var isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) {\n return isRedirectRuleByType(rule, \"ABP\");\n };\n\n /**\n * Checks if the rule has specified content type before Adg -> Ubo conversion.\n *\n * Used ONLY for Adg -> Ubo conversion\n * because Ubo redirect rules must contain content type, but Adg and Abp must not.\n *\n * Also source type can not be added automatically because of such valid rules:\n * ! Abp:\n * $rewrite=abp-resource:blank-js,xmlhttprequest\n * ! Adg:\n * $script,redirect=noopvast-2.0\n * $xmlhttprequest,redirect=noopvast-2.0\n *\n * @param rule rule text\n * @returns if the rule has specified content type before conversion\n */\n var hasValidContentType = function hasValidContentType(rule) {\n var ruleModifiers = parseModifiers(rule);\n // rule can have more than one source type modifier\n var sourceTypes = ruleModifiers.filter(function (el) {\n return VALID_SOURCE_TYPES.includes(el);\n });\n var isSourceTypeSpecified = sourceTypes.length > 0;\n var isEmptyRedirect = ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) || ruleModifiers.includes(\"\".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER));\n if (isEmptyRedirect) {\n // no source type for 'empty' is allowed\n return true;\n }\n return isSourceTypeSpecified;\n };\n var validator = {\n UBO_SCRIPTLET_MASK_REG,\n ABP_SCRIPTLET_MASK,\n ABP_SCRIPTLET_EXCEPTION_MASK,\n isComment,\n isAdgScriptletRule,\n isUboScriptletRule,\n isAbpSnippetRule,\n getScriptletByName,\n isValidScriptletName,\n ADG_UBO_REDIRECT_RULE_MARKER,\n REDIRECT_RULE_TYPES,\n ABSENT_SOURCE_TYPE_REPLACEMENT,\n isAdgRedirectRule,\n isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg,\n parseModifiers,\n getRedirectName,\n hasValidContentType\n };\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _toArray(arr) {\n return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();\n }\n\n /**\n * AdGuard scriptlet rule\n */\n var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\\/\\/scriptlet\\(.+\\)/;\n // eslint-disable-next-line no-template-curly-in-string\n var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})';\n // eslint-disable-next-line no-template-curly-in-string\n var ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})';\n\n /**\n * uBlock scriptlet rule mask\n */\n // eslint-disable-next-line no-template-curly-in-string\n var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})';\n // eslint-disable-next-line no-template-curly-in-string\n var UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})';\n var UBO_ALIAS_NAME_MARKER = 'ubo-';\n var UBO_SCRIPTLET_JS_ENDING = '.js';\n\n // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr\n var UBO_XHR_TYPE = 'xhr';\n var ADG_XHR_TYPE = 'xmlhttprequest';\n var ADG_SET_CONSTANT_NAME = 'set-constant';\n var ADG_SET_CONSTANT_EMPTY_STRING = '';\n var ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr';\n var ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj';\n var UBO_SET_CONSTANT_EMPTY_STRING = '\\'\\'';\n var UBO_SET_CONSTANT_EMPTY_ARRAY = '[]';\n var UBO_SET_CONSTANT_EMPTY_OBJECT = '{}';\n var ADG_PREVENT_FETCH_NAME = 'prevent-fetch';\n var ADG_PREVENT_FETCH_EMPTY_STRING = '';\n var ADG_PREVENT_FETCH_WILDCARD = '*';\n var UBO_NO_FETCH_IF_WILDCARD = '/^/';\n var ESCAPED_COMMA_SEPARATOR = '\\\\,';\n var COMMA_SEPARATOR = ',';\n var REMOVE_ATTR_METHOD = 'removeAttr';\n var REMOVE_CLASS_METHOD = 'removeClass';\n var REMOVE_ATTR_ALIASES = scriptletList[REMOVE_ATTR_METHOD].names;\n var REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names;\n var REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete'];\n var ABP_RESOURCE_MARKER = 'abp-resource:';\n\n /**\n * Possible rule origins.\n */\n var Origin = /*#__PURE__*/function (Origin) {\n Origin[\"Ubo\"] = \"ubo\";\n Origin[\"Abp\"] = \"abp\";\n Origin[\"AdgValid\"] = \"adgValid\";\n Origin[\"AdgInvalid\"] = \"adgInvalid\";\n return Origin;\n }(Origin || {});\n /**\n * Array of origin names in the order they must be checked for rule conversion.\n */\n var originNames = [Origin.Ubo, Origin.Abp, Origin.AdgValid, Origin.AdgInvalid];\n\n /**\n * Returns array of strings separated by space which is not in quotes\n *\n * @param str arbitrary string\n * @returns result array\n * @throws\n */\n var getAbpSnippetArguments = function getAbpSnippetArguments(str) {\n var reg = /'.*?'|\".*?\"|\\S+/g;\n var sentences = str.match(reg);\n if (!sentences) {\n throw new Error('Invalid ABP snippet args.');\n }\n return sentences;\n };\n\n /**\n * Replaces string with data by placeholders\n *\n * @param str string with placeholders\n * @param data where keys are placeholders names\n * @returns string filled with data\n */\n var replacePlaceholders = function replacePlaceholders(str, data) {\n return Object.keys(data).reduce(function (acc, key) {\n var reg = new RegExp(\"\\\\$\\\\{\".concat(key, \"\\\\}\"), 'g');\n acc = acc.replace(reg, data[key]);\n return acc;\n }, str);\n };\n var splitArgs = function splitArgs(str) {\n var args = [];\n var prevArgStart = 0;\n for (var i = 0; i < str.length; i += 1) {\n // do not split args by escaped comma\n // https://github.com/AdguardTeam/Scriptlets/issues/133\n if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\\\') {\n args.push(str.slice(prevArgStart, i).trim());\n prevArgStart = i + 1;\n }\n }\n // collect arg after last comma\n args.push(str.slice(prevArgStart, str.length).trim());\n return args;\n };\n\n /**\n * Validates remove-attr/class scriptlet args\n *\n * @param parsedArgs scriptlet arguments\n * @returns valid args OR error for invalid selector\n */\n var validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) {\n var _parsedArgs = _toArray(parsedArgs),\n name = _parsedArgs[0],\n value = _parsedArgs[1],\n restArgs = _parsedArgs.slice(2);\n // no extra checking if there are only scriptlet name and value\n // https://github.com/AdguardTeam/Scriptlets/issues/235\n if (restArgs.length === 0) {\n return [name, value];\n }\n\n // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should:\n // 1. check if last arg is 'applying' parameter\n // 2. join 'selector' into one arg\n // 3. combine all args\n // https://github.com/AdguardTeam/Scriptlets/issues/133\n var lastArg = restArgs.pop(); // https://github.com/microsoft/TypeScript/issues/30406\n var applying;\n // check the last parsed arg for matching possible 'applying' vale\n if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) {\n return lastArg.includes(el);\n })) {\n applying = lastArg;\n } else {\n restArgs.push(lastArg);\n }\n var selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR);\n if (selector.length > 0 && typeof document !== 'undefined') {\n // empty selector is valid for these scriptlets as it applies to all elements,\n // all other selectors should be validated\n // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html')\n document.querySelectorAll(selector);\n }\n var validArgs = applying ? [name, value, selector, applying] : [name, value, selector];\n return validArgs;\n };\n\n /**\n * Converts string of UBO scriptlet rule to AdGuard scriptlet rule\n *\n * @param rule UBO scriptlet rule\n * @returns array with one AdGuard scriptlet rule\n */\n var convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) {\n var domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG);\n var matchResult = rule.match(validator.UBO_SCRIPTLET_MASK_REG);\n var mask = Array.isArray(matchResult) ? matchResult[0] : null;\n var template;\n if (mask !== null && mask !== void 0 && mask.includes('@')) {\n template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = ADGUARD_SCRIPTLET_TEMPLATE;\n }\n var argsStr = getStringInBraces(rule);\n var parsedArgs = splitArgs(argsStr);\n var scriptletName = parsedArgs[0].includes(UBO_SCRIPTLET_JS_ENDING) ? \"ubo-\".concat(parsedArgs[0]) : \"ubo-\".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING);\n if (REMOVE_ATTR_ALIASES.includes(scriptletName) || REMOVE_CLASS_ALIASES.includes(scriptletName)) {\n parsedArgs = validateRemoveAttrClassArgs(parsedArgs);\n }\n var args = parsedArgs.map(function (arg, index) {\n var outputArg = arg;\n if (index === 0) {\n outputArg = scriptletName;\n }\n // for example: example.org##+js(abort-current-inline-script, $, popup)\n if (arg === '$') {\n outputArg = '$$';\n }\n return outputArg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n var adgRule = replacePlaceholders(template, {\n domains,\n args\n });\n return [adgRule];\n };\n\n /**\n * Convert string of ABP snippet rule to AdGuard scriptlet rule\n *\n * @param rule ABP snippet rule\n * @returns array of AdGuard scriptlet rules, one or few items depends on Abp-rule\n */\n var convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) {\n var SEMICOLON_DIVIDER = /;(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/g;\n var mask = rule.includes(validator.ABP_SCRIPTLET_MASK) ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK;\n var template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE;\n var domains = substringBefore(rule, mask);\n var args = substringAfter$1(rule, mask);\n\n /* eslint-disable @typescript-eslint/no-shadow */\n return args.split(SEMICOLON_DIVIDER)\n // abp-rule may have `;` at the end which makes last array item irrelevant\n // https://github.com/AdguardTeam/Scriptlets/issues/236\n .filter(isExisting).map(function (args) {\n return getAbpSnippetArguments(args).map(function (arg, index) {\n return index === 0 ? \"abp-\".concat(arg) : arg;\n }).map(function (arg) {\n return wrapInSingleQuotes(arg);\n }).join(\"\".concat(COMMA_SEPARATOR, \" \"));\n }).map(function (args) {\n return replacePlaceholders(template, {\n domains,\n args\n });\n });\n /* eslint-enable @typescript-eslint/no-shadow */\n };\n\n /**\n * Validates ADG scriptlet rule syntax.\n *\n * IMPORTANT! The method is not very fast as it parses the rule and checks its syntax.\n *\n * @param adgRuleText Single ADG scriptlet rule.\n *\n * @returns False if ADG scriptlet rule syntax is not valid\n * or `adgRuleText` is not an ADG scriptlet rule.\n */\n var isValidAdgScriptletRuleSyntax = function isValidAdgScriptletRuleSyntax(adgRuleText) {\n if (!adgRuleText) {\n return false;\n }\n if (!validator.isAdgScriptletRule(adgRuleText)) {\n return false;\n }\n // isAdgScriptletRule() does not check the rule syntax\n var parsedRule;\n try {\n // parseRule() ensures that the rule syntax is valid\n // and it will throw an error if it is not\n parsedRule = parseRule(adgRuleText);\n return validator.isValidScriptletName(parsedRule.name);\n } catch (e) {\n return false;\n }\n };\n\n /**\n * Functions to validate if a given string corresponds to a scriptlet rule of a particular origin.\n */\n var OriginValidator = {\n [Origin.Ubo]: validator.isUboScriptletRule,\n [Origin.Abp]: validator.isAbpSnippetRule,\n [Origin.AdgValid]: isValidAdgScriptletRuleSyntax,\n [Origin.AdgInvalid]: function (r) {\n return validator.isAdgScriptletRule(r) && !isValidAdgScriptletRuleSyntax(r);\n }\n };\n\n // Functions to convert a given scriptlet rule from a mapped origin to an AdGuard rule\n var Converter = {\n [Origin.Ubo]: convertUboScriptletToAdg,\n [Origin.Abp]: convertAbpSnippetToAdg,\n [Origin.AdgValid]: function (r) {\n return [r];\n },\n [Origin.AdgInvalid]: function (r) {\n // eslint-disable-next-line no-console\n console.log(\"Invalid AdGuard scriptlet rule: \".concat(r));\n return [];\n }\n };\n\n /**\n * Returns rule origin name in a meaningful order.\n *\n * @param rule The rule string to check.\n * @returns Rule origin name or undefined if the rule has no valid origin.\n */\n var getRuleOrigin = function getRuleOrigin(rule) {\n return originNames.find(function (originName) {\n return OriginValidator[originName](rule);\n });\n };\n\n /**\n * Converts any scriptlet rule into AdGuard syntax rule.\n * Comments and non-scriptlet rules are returned without changes.\n *\n * @param rule Rule.\n *\n * @returns Array of AdGuard scriptlet rules: one array item for ADG and UBO or few items for ABP.\n * For the ADG `rule` validates its syntax, and returns an empty array if it is invalid.\n */\n var convertScriptletToAdg = function convertScriptletToAdg(rule) {\n if (validator.isComment(rule)) {\n return [rule];\n }\n\n // Determine rule's origin\n var originName = getRuleOrigin(rule);\n\n // if the origin is unknown, return rule unchanged\n // as it is a non-scriptlet rule\n if (!originName) {\n return [rule];\n }\n\n // Call converter of given origin\n return Converter[originName](rule);\n };\n\n /**\n * Converts AdGuard scriptlet rule to UBO syntax.\n *\n * @param rule AdGuard scriptlet rule\n * @returns UBO scriptlet rule\n * or undefined if `rule` is not valid AdGuard scriptlet rule.\n */\n var convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) {\n var res;\n if (validator.isAdgScriptletRule(rule)) {\n var _parseRule = parseRule(rule),\n parsedName = _parseRule.name,\n parsedParams = _parseRule.args;\n var preparedParams;\n if (parsedName === ADG_SET_CONSTANT_NAME\n // https://github.com/AdguardTeam/FiltersCompiler/issues/102\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING];\n } else if (parsedName === ADG_SET_CONSTANT_NAME\n // https://github.com/uBlockOrigin/uBlock-issues/issues/2411\n && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY];\n } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) {\n preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT];\n } else if (parsedName === ADG_PREVENT_FETCH_NAME\n // https://github.com/AdguardTeam/Scriptlets/issues/109\n && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) {\n preparedParams = [UBO_NO_FETCH_IF_WILDCARD];\n } else {\n preparedParams = parsedParams;\n }\n if (preparedParams && preparedParams.length > 0) {\n // escape all commas in params\n // https://github.com/AdguardTeam/FiltersCompiler/issues/185\n preparedParams = preparedParams.map(function (param) {\n if (param.includes(COMMA_SEPARATOR)) {\n return replaceAll(param, COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR);\n }\n return param;\n });\n }\n\n // object of name and aliases for the Adg-scriptlet\n var scriptletNames = Object.keys(scriptletList);\n var adgScriptletObject = scriptletNames.map(function (name) {\n return scriptletList[name];\n }).map(function (scriptlet) {\n var _scriptlet$names = _toArray(scriptlet.names),\n name = _scriptlet$names[0],\n aliases = _scriptlet$names.slice(1);\n return {\n name,\n aliases\n };\n }).find(function (el) {\n return el.name === parsedName || el.aliases.includes(parsedName);\n });\n var aliases = adgScriptletObject.aliases;\n if (aliases.length > 0) {\n var uboAlias = adgScriptletObject.aliases.find(function (alias) {\n return alias.includes(UBO_ALIAS_NAME_MARKER);\n });\n if (uboAlias) {\n var matchResult = rule.match(ADGUARD_SCRIPTLET_MASK_REG);\n var mask = Array.isArray(matchResult) ? matchResult[0] : null;\n var template;\n if (mask !== null && mask !== void 0 && mask.includes('@')) {\n template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE;\n } else {\n template = UBO_SCRIPTLET_TEMPLATE;\n }\n var domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG);\n var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '')\n // '.js' in the Ubo scriptlet name can be omitted\n // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets\n .replace(UBO_SCRIPTLET_JS_ENDING, '');\n var args = preparedParams.length > 0 ? \"\".concat(uboName, \", \").concat(preparedParams.join(\"\".concat(COMMA_SEPARATOR, \" \"))) : uboName;\n var uboRule = replacePlaceholders(template, {\n domains,\n args\n });\n res = uboRule;\n }\n }\n }\n return res;\n };\n\n /**\n * Returns scriptlet name from `rule`.\n *\n * @param rule AdGuard syntax scriptlet rule.\n * @returns Scriptlet name or null.\n */\n var getAdgScriptletName = function getAdgScriptletName(rule) {\n // get substring after '#//scriptlet('\n var buffer = substringAfter$1(rule, \"\".concat(ADG_SCRIPTLET_MASK, \"(\"));\n if (!buffer) {\n return null;\n }\n // get the quote used for the first scriptlet parameter which is a name\n var nameQuote = buffer[0];\n // delete the quote from the buffer\n buffer = buffer.slice(1);\n if (!buffer) {\n return null;\n }\n // get a supposed scriptlet name\n var name = substringBefore(buffer, nameQuote);\n return name === buffer ? null : name;\n };\n\n /**\n * 1. For ADG scriptlet checks whether the scriptlet syntax and name are valid.\n * 2. For UBO and ABP scriptlet first checks their compatibility with ADG\n * by converting them into ADG syntax, and after that checks the name.\n *\n * ADG or UBO rules are \"single-scriptlet\", but ABP rule may contain more than one snippet\n * so if at least one of them is not valid — whole `ruleText` rule is not valid too.\n *\n * @param ruleText Any scriptlet rule — ADG or UBO or ABP.\n *\n * @returns True if scriptlet name is valid in rule.\n */\n var isValidScriptletRule = function isValidScriptletRule(ruleText) {\n if (!ruleText) {\n return false;\n }\n\n // `ruleText` with ABP syntax may contain more than one snippet in one rule\n var rulesArray = convertScriptletToAdg(ruleText);\n\n // for ADG rule with invalid syntax convertScriptletToAdg() will return empty array\n if (rulesArray.length === 0) {\n return false;\n }\n\n // checking if each of parsed scriptlets is valid\n // if at least one of them is not valid - whole `ruleText` is not valid too\n var isValid = rulesArray.every(function (rule) {\n var name = getAdgScriptletName(rule);\n return name && validator.isValidScriptletName(name);\n });\n return isValid;\n };\n\n /**\n * Gets index and redirect resource marker from UBO/ADG modifiers array\n *\n * @param modifiers rule modifiers\n * @param redirectsData validator.REDIRECT_RULE_TYPES.(UBO|ADG)\n * @param rule rule string\n * @returns merker data object\n */\n var getMarkerData = function getMarkerData(modifiers, redirectsData, rule) {\n var redirectRuleMarker = redirectsData.redirectRuleMarker,\n redirectMarker = redirectsData.redirectMarker;\n var index;\n if (redirectRuleMarker) {\n index = modifiers.findIndex(function (m) {\n return m.includes(redirectRuleMarker);\n });\n if (index > -1) {\n return {\n index,\n marker: redirectRuleMarker\n };\n }\n }\n index = modifiers.findIndex(function (m) {\n return m.includes(redirectMarker);\n });\n if (index > -1) {\n return {\n index,\n marker: redirectMarker\n };\n }\n throw new Error(\"No redirect resource modifier found in rule: \".concat(rule));\n };\n\n /**\n * Converts Ubo redirect rule to Adg one\n *\n * @param rule ubo redirect rule\n * @returns converted adg rule\n */\n var convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) {\n var firstPartOfRule = substringBefore(rule, '$');\n var uboModifiers = validator.parseModifiers(rule);\n var uboMarkerData = getMarkerData(uboModifiers, validator.REDIRECT_RULE_TYPES.UBO, rule);\n var adgModifiers = uboModifiers.map(function (modifier, index) {\n if (index === uboMarkerData.index) {\n var uboName = substringAfter$1(modifier, uboMarkerData.marker);\n var adgName = validator.REDIRECT_RULE_TYPES.UBO.compatibility[uboName];\n var adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker;\n return \"\".concat(adgMarker).concat(adgName);\n }\n if (modifier === UBO_XHR_TYPE) {\n return ADG_XHR_TYPE;\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n\n /**\n * Converts Abp redirect rule to Adg one\n *\n * @param rule abp redirect rule\n * @returns converted adg rule\n */\n var convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) {\n var firstPartOfRule = substringBefore(rule, '$');\n var abpModifiers = validator.parseModifiers(rule);\n var adgModifiers = abpModifiers.map(function (modifier) {\n if (modifier.includes(validator.REDIRECT_RULE_TYPES.ABP.redirectMarker)) {\n var abpName = substringAfter$1(modifier, validator.REDIRECT_RULE_TYPES.ABP.redirectMarker);\n var adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName];\n return \"\".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName);\n }\n return modifier;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(firstPartOfRule, \"$\").concat(adgModifiers);\n };\n\n /**\n * Converts redirect rule to AdGuard one\n *\n * @param {string} rule redirect rule\n * @returns converted adg rule\n */\n var convertRedirectToAdg = function convertRedirectToAdg(rule) {\n var result;\n if (validator.isUboRedirectCompatibleWithAdg(rule)) {\n result = convertUboRedirectToAdg(rule);\n } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) {\n result = convertAbpRedirectToAdg(rule);\n } else if (validator.isValidAdgRedirectRule(rule)) {\n result = rule;\n }\n return result;\n };\n\n /**\n * Converts Adg redirect rule to Ubo one\n * 1. Checks if there is Ubo analog for Adg rule\n * 2. Parses the rule and checks if there are any source type modifiers which are required by Ubo\n * and if there are no one we add it manually to the end.\n * Source types are chosen according to redirect name\n * e.g. ||ad.com^$redirect=,important ->> ||ad.com^$redirect=,important,script\n * 3. Replaces Adg redirect name by Ubo analog\n *\n * @param rule adg rule\n * @returns converted ubo rule\n * @throws on incompatible rule\n */\n var convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) {\n if (!validator.isAdgRedirectCompatibleWithUbo(rule)) {\n throw new Error(\"Unable to convert for uBO - unsupported redirect in rule: \".concat(rule));\n }\n var basePart = substringBefore(rule, '$');\n var adgModifiers = validator.parseModifiers(rule);\n var adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule);\n var adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length);\n if (!validator.hasValidContentType(rule)) {\n // add missed source types as content type modifiers\n var sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) {\n return el.NAME === adgRedirectName;\n });\n if (typeof sourceTypesData === 'undefined') {\n // eslint-disable-next-line max-len\n throw new Error(\"Unable to convert for uBO - no types to add for specific redirect in rule: \".concat(rule));\n }\n var additionModifiers = sourceTypesData.TYPES;\n adgModifiers.push(...additionModifiers);\n }\n var uboModifiers = adgModifiers.map(function (el, index) {\n if (index === adgMarkerData.index) {\n var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker;\n // eslint-disable-next-line max-len\n var uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName];\n return \"\".concat(uboMarker).concat(uboRedirectName);\n }\n return el;\n }).join(COMMA_SEPARATOR);\n return \"\".concat(basePart, \"$\").concat(uboModifiers);\n };\n\n /**\n * Converts a redirect name to ADG compatible one, if possible\n *\n * @param name Redirect name to convert\n * @returns Converted ADG compatible redirect name or `undefined` if the redirect isn't supported\n */\n var convertRedirectNameToAdg = function convertRedirectNameToAdg(name) {\n var nameToCheck = name.trim();\n\n // Check if the redirect is already ADG compatible\n if (validator.REDIRECT_RULE_TYPES.ADG.compatibility[nameToCheck]) {\n return nameToCheck;\n }\n\n // Convert uBO redirects to ADG\n if (validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck]) {\n return validator.REDIRECT_RULE_TYPES.UBO.compatibility[nameToCheck];\n }\n\n // Convert ABP redirects to ADG\n // AGTree parses '$rewrite=abp-resource:blank-js' as 'rewrite' modifier with\n // 'abp-resource:blank-js' value. So at this point we have to check if the\n // redirect name starts with 'abp-resource:' and remove it if it does.\n if (nameToCheck.startsWith(ABP_RESOURCE_MARKER)) {\n nameToCheck = nameToCheck.slice(ABP_RESOURCE_MARKER.length).trim();\n }\n\n // This also returns `undefined` if the redirect isn't supported\n return validator.REDIRECT_RULE_TYPES.ABP.compatibility[nameToCheck];\n };\n\n /**\n * @redirect google-analytics\n *\n * @description\n * Mocks Google's Analytics and Tag Manager APIs.\n * Covers functionality of\n * the [obsolete googletagmanager-gtm redirect](https://github.com/AdguardTeam/Scriptlets/issues/127).\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_analytics.js\n *\n * ### Examples\n *\n * ```adblock\n * ||google-analytics.com/analytics.js$script,redirect=google-analytics\n * ||googletagmanager.com/gtm.js$script,redirect=google-analytics\n * ```\n *\n * @added v1.0.10.\n */\n function GoogleAnalytics(source) {\n // eslint-disable-next-line func-names\n var Tracker = function Tracker() {}; // constructor\n var proto = Tracker.prototype;\n proto.get = noopFunc;\n proto.set = noopFunc;\n proto.send = noopFunc;\n var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga';\n // a -- fake arg for 'ga.length < 1' antiadblock checking\n // eslint-disable-next-line no-unused-vars\n function ga(a) {\n var len = arguments.length;\n if (len === 0) {\n return;\n }\n // eslint-disable-next-line prefer-rest-params\n var lastArg = arguments[len - 1];\n var replacer;\n if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') {\n replacer = lastArg.hitCallback;\n } else if (typeof lastArg === 'function') {\n // https://github.com/AdguardTeam/Scriptlets/issues/98\n replacer = function replacer() {\n lastArg(ga.create());\n };\n }\n try {\n setTimeout(replacer, 1);\n // eslint-disable-next-line no-empty\n } catch (ex) {}\n }\n ga.create = function () {\n return new Tracker();\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/134\n ga.getByName = function () {\n return new Tracker();\n };\n ga.getAll = function () {\n return [new Tracker()];\n };\n ga.remove = noopFunc;\n ga.loaded = true;\n window[googleAnalyticsName] = ga;\n var _window = window,\n dataLayer = _window.dataLayer,\n google_optimize = _window.google_optimize; // eslint-disable-line camelcase\n if (dataLayer instanceof Object === false) {\n return;\n }\n if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') {\n dataLayer.hide.end();\n }\n\n /**\n * checks data object and delays callback\n *\n * @param {object|Array} dataObj gtag payload\n * @param {string} funcName callback prop name\n */\n var handleCallback = function handleCallback(dataObj, funcName) {\n if (dataObj && typeof dataObj[funcName] === 'function') {\n setTimeout(dataObj[funcName]);\n }\n };\n if (typeof dataLayer.push === 'function') {\n dataLayer.push = function (data) {\n if (data instanceof Object) {\n handleCallback(data, 'eventCallback');\n // eslint-disable-next-line no-restricted-syntax, guard-for-in\n for (var key in data) {\n handleCallback(data[key], 'event_callback');\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) {\n [].push.call(window.dataLayer, data);\n }\n }\n if (Array.isArray(data)) {\n data.forEach(function (arg) {\n handleCallback(arg, 'callback');\n });\n }\n return noopFunc;\n };\n }\n\n // https://github.com/AdguardTeam/Scriptlets/issues/81\n // eslint-disable-next-line camelcase\n if (google_optimize instanceof Object && typeof google_optimize.get === 'function') {\n var googleOptimizeWrapper = {\n get: noopFunc\n };\n window.google_optimize = googleOptimizeWrapper;\n }\n hit(source);\n }\n GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js',\n // https://github.com/AdguardTeam/Scriptlets/issues/127\n 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js'];\n GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray];\n\n /* eslint-disable no-underscore-dangle */\n\n /**\n * @redirect google-analytics-ga\n *\n * @description\n * Mocks old Google Analytics API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/google-analytics_ga.js\n *\n * ### Examples\n *\n * ```adblock\n * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga\n * ```\n *\n * @added v1.0.10.\n */\n function GoogleAnalyticsGa(source) {\n // Gaq constructor\n function Gaq() {}\n Gaq.prototype.Na = noopFunc;\n Gaq.prototype.O = noopFunc;\n Gaq.prototype.Sa = noopFunc;\n Gaq.prototype.Ta = noopFunc;\n Gaq.prototype.Va = noopFunc;\n Gaq.prototype._createAsyncTracker = noopFunc;\n Gaq.prototype._getAsyncTracker = noopFunc;\n Gaq.prototype._getPlugin = noopFunc;\n Gaq.prototype.push = function (data) {\n if (typeof data === 'function') {\n data();\n return;\n }\n if (Array.isArray(data) === false) {\n return;\n }\n // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link\n // https://github.com/uBlockOrigin/uBlock-issues/issues/1807\n if (typeof data[0] === 'string' && /(^|\\.)_link$/.test(data[0]) && typeof data[1] === 'string') {\n window.location.assign(data[1]);\n }\n // https://github.com/gorhill/uBlock/issues/2162\n if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') {\n data[2]();\n }\n };\n var gaq = new Gaq();\n var asyncTrackers = window._gaq || [];\n if (Array.isArray(asyncTrackers)) {\n while (asyncTrackers[0]) {\n gaq.push(asyncTrackers.shift());\n }\n }\n // eslint-disable-next-line no-multi-assign\n window._gaq = gaq.qf = gaq;\n\n // Gat constructor\n function Gat() {}\n\n // Mock tracker api\n var api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode'];\n var tracker = api.reduce(function (res, funcName) {\n res[funcName] = noopFunc;\n return res;\n }, {});\n tracker._getLinkerUrl = function (a) {\n return a;\n };\n // https://github.com/AdguardTeam/Scriptlets/issues/154\n tracker._link = function (url) {\n if (typeof url !== 'string') {\n return;\n }\n try {\n window.location.assign(url);\n } catch (e) {\n logMessage(source, e);\n }\n };\n Gat.prototype._anonymizeIP = noopFunc;\n Gat.prototype._createTracker = noopFunc;\n Gat.prototype._forceSSL = noopFunc;\n Gat.prototype._getPlugin = noopFunc;\n Gat.prototype._getTracker = function () {\n return tracker;\n };\n Gat.prototype._getTrackerByName = function () {\n return tracker;\n };\n Gat.prototype._getTrackers = noopFunc;\n Gat.prototype.aa = noopFunc;\n Gat.prototype.ab = noopFunc;\n Gat.prototype.hb = noopFunc;\n Gat.prototype.la = noopFunc;\n Gat.prototype.oa = noopFunc;\n Gat.prototype.pa = noopFunc;\n Gat.prototype.u = noopFunc;\n var gat = new Gat();\n window._gat = gat;\n hit(source);\n }\n GoogleAnalyticsGa.names = ['google-analytics-ga', 'ubo-google-analytics_ga.js', 'google-analytics_ga.js'];\n GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage];\n\n /* eslint-disable max-len */\n /**\n * @redirect googlesyndication-adsbygoogle\n *\n * @description\n * Mocks Google AdSense API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googlesyndication_adsbygoogle.js\n *\n * ### Examples\n *\n * ```adblock\n * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle\n * ```\n *\n * @added v1.0.10.\n */\n /* eslint-enable max-len */\n function GoogleSyndicationAdsByGoogle(source) {\n window.adsbygoogle = {\n // https://github.com/AdguardTeam/Scriptlets/issues/113\n // length: 0,\n loaded: true,\n // https://github.com/AdguardTeam/Scriptlets/issues/184\n push(arg) {\n if (typeof this.length === 'undefined') {\n this.length = 0;\n this.length += 1;\n }\n if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) {\n var key = _Object$keys[_i];\n if (typeof arg[key] === 'function') {\n try {\n // https://github.com/AdguardTeam/Scriptlets/issues/252\n // argument \"{}\" is needed to fix issue with undefined argument\n arg[key].call(this, {});\n } catch (_unused) {\n /* empty */\n }\n }\n }\n }\n }\n };\n var adElems = document.querySelectorAll('.adsbygoogle');\n var css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;';\n var statusAttrName = 'data-adsbygoogle-status';\n var ASWIFT_IFRAME_MARKER = 'aswift_';\n var GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_';\n var executed = false;\n for (var i = 0; i < adElems.length; i += 1) {\n var adElemChildNodes = adElems[i].childNodes;\n var childNodesQuantity = adElemChildNodes.length;\n // childNodes of .adsbygoogle can be defined if scriptlet was executed before\n // so we should check that childNodes are exactly defined by us\n // TODO: remake after scriptlets context developing in 1.3\n var areIframesDefined = false;\n if (childNodesQuantity > 0) {\n // it should be only 2 child iframes if scriptlet was executed\n areIframesDefined = childNodesQuantity === 2\n // the first of child nodes should be aswift iframe\n && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.includes(ASWIFT_IFRAME_MARKER)\n // the second of child nodes should be google_ads iframe\n && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.includes(GOOGLE_ADS_IFRAME_MARKER);\n }\n if (!areIframesDefined) {\n // here we do the job if scriptlet has not been executed earlier\n adElems[i].setAttribute(statusAttrName, 'done');\n var aswiftIframe = document.createElement('iframe');\n aswiftIframe.id = \"\".concat(ASWIFT_IFRAME_MARKER).concat(i);\n aswiftIframe.style = css;\n adElems[i].appendChild(aswiftIframe);\n var innerAswiftIframe = document.createElement('iframe');\n aswiftIframe.contentWindow.document.body.appendChild(innerAswiftIframe);\n var googleadsIframe = document.createElement('iframe');\n googleadsIframe.id = \"\".concat(GOOGLE_ADS_IFRAME_MARKER).concat(i);\n googleadsIframe.style = css;\n adElems[i].appendChild(googleadsIframe);\n var innerGoogleadsIframe = document.createElement('iframe');\n googleadsIframe.contentWindow.document.body.appendChild(innerGoogleadsIframe);\n executed = true;\n }\n }\n if (executed) {\n hit(source);\n }\n }\n GoogleSyndicationAdsByGoogle.names = ['googlesyndication-adsbygoogle', 'ubo-googlesyndication_adsbygoogle.js', 'googlesyndication_adsbygoogle.js'];\n GoogleSyndicationAdsByGoogle.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect googletagservices-gpt\n *\n * @description\n * Mocks Google Publisher Tag API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/googletagservices_gpt.js\n *\n * ### Examples\n *\n * ```adblock\n * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt\n * ```\n *\n * @added v1.0.10.\n */\n function GoogleTagServicesGpt(source) {\n var slots = new Map();\n var slotsById = new Map();\n var slotsPerPath = new Map();\n var slotCreatives = new Map();\n var eventCallbacks = new Map();\n var gTargeting = new Map();\n var addEventListener = function addEventListener(name, listener) {\n if (!eventCallbacks.has(name)) {\n eventCallbacks.set(name, new Set());\n }\n eventCallbacks.get(name).add(listener);\n return this;\n };\n var removeEventListener = function removeEventListener(name, listener) {\n if (eventCallbacks.has(name)) {\n return eventCallbacks.get(name).delete(listener);\n }\n return false;\n };\n var fireSlotEvent = function fireSlotEvent(name, slot) {\n return new Promise(function (resolve) {\n requestAnimationFrame(function () {\n var size = [0, 0];\n var callbacksSet = eventCallbacks.get(name) || [];\n var callbackArray = Array.from(callbacksSet);\n for (var i = 0; i < callbackArray.length; i += 1) {\n callbackArray[i]({\n isEmpty: true,\n size,\n slot\n });\n }\n resolve();\n });\n });\n };\n var emptySlotElement = function emptySlotElement(slot) {\n var node = document.getElementById(slot.getSlotElementId());\n while (node !== null && node !== void 0 && node.lastChild) {\n node.lastChild.remove();\n }\n };\n var recreateIframeForSlot = function recreateIframeForSlot(slot) {\n var _document$getElementB;\n var eid = \"google_ads_iframe_\".concat(slot.getId());\n (_document$getElementB = document.getElementById(eid)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove();\n var node = document.getElementById(slot.getSlotElementId());\n if (node) {\n var f = document.createElement('iframe');\n f.id = eid;\n f.srcdoc = '';\n f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0';\n f.setAttribute('width', 0);\n f.setAttribute('height', 0);\n // https://github.com/AdguardTeam/Scriptlets/issues/259\n f.setAttribute('data-load-complete', true);\n f.setAttribute('data-google-container-id', true);\n f.setAttribute('sandbox', '');\n node.appendChild(f);\n }\n };\n var displaySlot = function displaySlot(slot) {\n if (!slot) {\n return;\n }\n var id = slot.getSlotElementId();\n if (!document.getElementById(id)) {\n return;\n }\n var parent = document.getElementById(id);\n if (parent) {\n parent.appendChild(document.createElement('div'));\n }\n emptySlotElement(slot);\n recreateIframeForSlot(slot);\n fireSlotEvent('slotRenderEnded', slot);\n fireSlotEvent('slotRequested', slot);\n fireSlotEvent('slotResponseReceived', slot);\n fireSlotEvent('slotOnload', slot);\n fireSlotEvent('impressionViewable', slot);\n };\n var companionAdsService = {\n addEventListener,\n removeEventListener,\n enableSyncLoading: noopFunc,\n setRefreshUnfilledSlots: noopFunc,\n getSlots: noopArray\n };\n var contentService = {\n addEventListener,\n removeEventListener,\n setContent: noopFunc\n };\n function PassbackSlot() {} // constructor\n\n PassbackSlot.prototype.display = noopFunc;\n PassbackSlot.prototype.get = noopNull;\n PassbackSlot.prototype.set = noopThis;\n PassbackSlot.prototype.setClickUrl = noopThis;\n PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis;\n PassbackSlot.prototype.setTargeting = noopThis;\n PassbackSlot.prototype.updateTargetingFromMap = noopThis;\n function SizeMappingBuilder() {} // constructor\n SizeMappingBuilder.prototype.addSize = noopThis;\n SizeMappingBuilder.prototype.build = noopNull;\n var getTargetingValue = function getTargetingValue(v) {\n if (typeof v === 'string') {\n return [v];\n }\n try {\n return Array.prototype.flat.call(v);\n } catch (_unused) {\n // do nothing\n }\n return [];\n };\n var updateTargeting = function updateTargeting(targeting, map) {\n if (typeof map === 'object') {\n for (var key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n targeting.set(key, getTargetingValue(map[key]));\n }\n }\n }\n };\n var defineSlot = function defineSlot(adUnitPath, creatives, optDiv) {\n if (slotsById.has(optDiv)) {\n var _document$getElementB2;\n (_document$getElementB2 = document.getElementById(optDiv)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.remove();\n return slotsById.get(optDiv);\n }\n var attributes = new Map();\n var targeting = new Map();\n var exclusions = new Set();\n var response = {\n advertiserId: undefined,\n campaignId: undefined,\n creativeId: undefined,\n creativeTemplateId: undefined,\n lineItemId: undefined\n };\n var sizes = [{\n getHeight: function getHeight() {\n return 2;\n },\n getWidth: function getWidth() {\n return 2;\n }\n }];\n var num = (slotsPerPath.get(adUnitPath) || 0) + 1;\n slotsPerPath.set(adUnitPath, num);\n var id = \"\".concat(adUnitPath, \"_\").concat(num);\n var clickUrl = '';\n var collapseEmptyDiv = null;\n var services = new Set();\n var slot = {\n addService(e) {\n services.add(e);\n return slot;\n },\n clearCategoryExclusions: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n targeting.clear();\n } else {\n targeting.delete(k);\n }\n },\n defineSizeMapping(mapping) {\n slotCreatives.set(optDiv, mapping);\n return this;\n },\n get: function get(k) {\n return attributes.get(k);\n },\n getAdUnitPath: function getAdUnitPath() {\n return adUnitPath;\n },\n getAttributeKeys: function getAttributeKeys() {\n return Array.from(attributes.keys());\n },\n getCategoryExclusions: function getCategoryExclusions() {\n return Array.from(exclusions);\n },\n getClickUrl: function getClickUrl() {\n return clickUrl;\n },\n getCollapseEmptyDiv: function getCollapseEmptyDiv() {\n return collapseEmptyDiv;\n },\n getContentUrl: function getContentUrl() {\n return '';\n },\n getDivStartsCollapsed: function getDivStartsCollapsed() {\n return null;\n },\n getDomId: function getDomId() {\n return optDiv;\n },\n getEscapedQemQueryId: function getEscapedQemQueryId() {\n return '';\n },\n getFirstLook: function getFirstLook() {\n return 0;\n },\n getId: function getId() {\n return id;\n },\n getHtml: function getHtml() {\n return '';\n },\n getName: function getName() {\n return id;\n },\n getOutOfPage: function getOutOfPage() {\n return false;\n },\n getResponseInformation: function getResponseInformation() {\n return response;\n },\n getServices: function getServices() {\n return Array.from(services);\n },\n getSizes: function getSizes() {\n return sizes;\n },\n getSlotElementId: function getSlotElementId() {\n return optDiv;\n },\n getSlotId: function getSlotId() {\n return slot;\n },\n getTargeting: function getTargeting(k) {\n return targeting.get(k) || gTargeting.get(k) || [];\n },\n getTargetingKeys: function getTargetingKeys() {\n return Array.from(new Set(Array.of(...gTargeting.keys(), ...targeting.keys())));\n },\n getTargetingMap: function getTargetingMap() {\n return Object.assign(Object.fromEntries(gTargeting.entries()), Object.fromEntries(targeting.entries()));\n },\n set(k, v) {\n attributes.set(k, v);\n return slot;\n },\n setCategoryExclusion(e) {\n exclusions.add(e);\n return slot;\n },\n setClickUrl(u) {\n clickUrl = u;\n return slot;\n },\n setCollapseEmptyDiv(v) {\n collapseEmptyDiv = !!v;\n return slot;\n },\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting(k, v) {\n targeting.set(k, getTargetingValue(v));\n return slot;\n },\n toString: function toString() {\n return id;\n },\n updateTargetingFromMap(map) {\n updateTargeting(targeting, map);\n return slot;\n }\n };\n slots.set(adUnitPath, slot);\n slotsById.set(optDiv, slot);\n slotCreatives.set(optDiv, creatives);\n return slot;\n };\n var pubAdsService = {\n addEventListener,\n removeEventListener,\n clear: noopFunc,\n clearCategoryExclusions: noopThis,\n clearTagForChildDirectedTreatment: noopThis,\n clearTargeting(k) {\n if (k === undefined) {\n gTargeting.clear();\n } else {\n gTargeting.delete(k);\n }\n },\n collapseEmptyDivs: noopFunc,\n defineOutOfPagePassback() {\n return new PassbackSlot();\n },\n definePassback() {\n return new PassbackSlot();\n },\n disableInitialLoad: noopFunc,\n display: noopFunc,\n enableAsyncRendering: noopFunc,\n enableLazyLoad: noopFunc,\n enableSingleRequest: noopFunc,\n enableSyncRendering: noopFunc,\n enableVideoAds: noopFunc,\n get: noopNull,\n getAttributeKeys: noopArray,\n getTargeting: noopArray,\n getTargetingKeys: noopArray,\n getSlots: noopArray,\n isInitialLoadDisabled: trueFunc,\n refresh: noopFunc,\n set: noopThis,\n setCategoryExclusion: noopThis,\n setCentering: noopFunc,\n setCookieOptions: noopThis,\n setForceSafeFrame: noopThis,\n setLocation: noopThis,\n setPublisherProvidedId: noopThis,\n setRequestNonPersonalizedAds: noopThis,\n setSafeFrameConfig: noopThis,\n setTagForChildDirectedTreatment: noopThis,\n setTargeting: noopThis,\n setVideoContent: noopThis,\n updateCorrelator: noopFunc\n };\n var _window = window,\n _window$googletag = _window.googletag,\n googletag = _window$googletag === void 0 ? {} : _window$googletag;\n var _googletag$cmd = googletag.cmd,\n cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd;\n googletag.apiReady = true;\n googletag.cmd = [];\n googletag.cmd.push = function (a) {\n try {\n a();\n // eslint-disable-next-line no-empty\n } catch (ex) {}\n return 1;\n };\n googletag.companionAds = function () {\n return companionAdsService;\n };\n googletag.content = function () {\n return contentService;\n };\n googletag.defineOutOfPageSlot = defineSlot;\n googletag.defineSlot = defineSlot;\n googletag.destroySlots = function () {\n slots.clear();\n slotsById.clear();\n };\n googletag.disablePublisherConsole = noopFunc;\n googletag.display = function (arg) {\n var id;\n if (arg !== null && arg !== void 0 && arg.getSlotElementId) {\n id = arg.getSlotElementId();\n } else if (arg !== null && arg !== void 0 && arg.nodeType) {\n id = arg.id;\n } else {\n id = String(arg);\n }\n displaySlot(slotsById.get(id));\n };\n googletag.enableServices = noopFunc;\n googletag.getVersion = noopStr;\n googletag.pubads = function () {\n return pubAdsService;\n };\n googletag.pubadsReady = true;\n googletag.setAdIframeTitle = noopFunc;\n googletag.sizeMapping = function () {\n return new SizeMappingBuilder();\n };\n window.googletag = googletag;\n while (cmd.length !== 0) {\n googletag.cmd.push(cmd.shift());\n }\n hit(source);\n }\n GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js'];\n GoogleTagServicesGpt.injections = [hit, noopFunc, noopThis, noopNull, noopArray, noopStr, trueFunc];\n\n /**\n * @redirect scorecardresearch-beacon\n *\n * @description\n * Mocks Scorecard Research API.\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/scorecardresearch_beacon.js\n *\n * ### Examples\n *\n * ```adblock\n * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon\n * ```\n *\n * @added v1.0.10.\n */\n function ScoreCardResearchBeacon(source) {\n window.COMSCORE = {\n purge() {\n // eslint-disable-next-line no-underscore-dangle\n window._comscore = [];\n },\n beacon() {}\n };\n hit(source);\n }\n ScoreCardResearchBeacon.names = ['scorecardresearch-beacon', 'ubo-scorecardresearch_beacon.js', 'scorecardresearch_beacon.js'];\n ScoreCardResearchBeacon.injections = [hit];\n\n /**\n * @redirect metrika-yandex-tag\n *\n * @description\n * Mocks Yandex Metrika API.\n * https://yandex.ru/support/metrica/objects/method-reference.html\n *\n * ### Examples\n *\n * ```adblock\n * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag\n * ```\n *\n * @added v1.0.10.\n */\n function metrikaYandexTag(source) {\n var asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = options.callback;\n var ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/addfileextension.html\n */\n var addFileExtension = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/extlink.html\n */\n var extLink = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/file.html\n */\n var file = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/get-client-id.html\n *\n * @param {string} id\n * @param {Function} cb\n */\n var getClientID = function getClientID(id, cb) {\n if (!cb) {\n return;\n }\n setTimeout(cb(null));\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/hit.html\n */\n var hitFunc = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/notbounce.html\n */\n var notBounce = asyncCallbackFromOptions;\n\n /**\n * https://yandex.ru/support/metrica/objects/params-method.html\n */\n var params = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/reachgoal.html\n *\n * @param {string} id\n * @param {string} target\n * @param {object} params\n * @param {Function} callback\n * @param {any} ctx\n */\n var reachGoal = function reachGoal(id, target, params, callback, ctx) {\n asyncCallbackFromOptions(null, null, {\n callback,\n ctx\n });\n };\n\n /**\n * https://yandex.ru/support/metrica/objects/set-user-id.html\n */\n var setUserID = noopFunc;\n\n /**\n * https://yandex.ru/support/metrica/objects/user-params.html\n */\n var userParams = noopFunc;\n\n // https://github.com/AdguardTeam/Scriptlets/issues/198\n var destruct = noopFunc;\n var api = {\n addFileExtension,\n extLink,\n file,\n getClientID,\n hit: hitFunc,\n notBounce,\n params,\n reachGoal,\n setUserID,\n userParams,\n destruct\n };\n function ym(id, funcName) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return api[funcName] && api[funcName](id, ...args);\n }\n function init(id) {\n // yaCounter object should provide api\n window[\"yaCounter\".concat(id)] = api;\n document.dispatchEvent(new Event(\"yacounter\".concat(id, \"inited\")));\n }\n if (typeof window.ym === 'undefined') {\n window.ym = ym;\n ym.a = [];\n } else if (window.ym && window.ym.a) {\n // Keep initial counters array intact\n ym.a = window.ym.a;\n window.ym = ym;\n window.ym.a.forEach(function (params) {\n var id = params[0];\n init(id);\n });\n }\n hit(source);\n }\n metrikaYandexTag.names = ['metrika-yandex-tag'];\n metrikaYandexTag.injections = [hit, noopFunc];\n\n /**\n * @redirect metrika-yandex-watch\n *\n * @description\n * Mocks the old Yandex Metrika API.\n * https://yandex.ru/support/metrica/objects/_method-reference.html\n *\n * ### Examples\n *\n * ```adblock\n * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch\n * ```\n *\n * @added v1.0.10.\n */\n function metrikaYandexWatch(source) {\n var cbName = 'yandex_metrika_callbacks';\n\n /**\n * Gets callback and its context from options and call it in async way\n *\n * @param {object} options Yandex Metrika API options\n */\n var asyncCallbackFromOptions = function asyncCallbackFromOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = options.callback;\n var ctx = options.ctx;\n if (typeof callback === 'function') {\n callback = ctx !== undefined ? callback.bind(ctx) : callback;\n setTimeout(function () {\n return callback();\n });\n }\n };\n function Metrika() {} // constructor\n Metrika.counters = noopArray;\n // Methods without options\n Metrika.prototype.addFileExtension = noopFunc;\n Metrika.prototype.getClientID = noopFunc;\n Metrika.prototype.setUserID = noopFunc;\n Metrika.prototype.userParams = noopFunc;\n Metrika.prototype.params = noopFunc;\n Metrika.prototype.counters = noopArray;\n\n // Methods with options\n // The order of arguments should be kept in according to API\n Metrika.prototype.extLink = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.file = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.hit = function (url, options) {\n asyncCallbackFromOptions(options);\n };\n Metrika.prototype.reachGoal = function (target, params, cb, ctx) {\n asyncCallbackFromOptions({\n callback: cb,\n ctx\n });\n };\n Metrika.prototype.notBounce = asyncCallbackFromOptions;\n if (window.Ya) {\n window.Ya.Metrika = Metrika;\n } else {\n window.Ya = {\n Metrika\n };\n }\n if (window[cbName] && Array.isArray(window[cbName])) {\n window[cbName].forEach(function (func) {\n if (typeof func === 'function') {\n func();\n }\n });\n }\n hit(source);\n }\n metrikaYandexWatch.names = ['metrika-yandex-watch'];\n metrikaYandexWatch.injections = [hit, noopFunc, noopArray];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect pardot-1.0\n *\n * @description\n * Mocks the pd.js file of Salesforce.\n * https://pi.pardot.com/pd.js\n * https://developer.salesforce.com/docs/marketing/pardot/overview\n *\n * ### Examples\n *\n * ```adblock\n * ||pi.pardot.com/pd.js$script,redirect=pardot\n * ||pacedg.com.au/pd.js$redirect=pardot\n * ```\n *\n * @added v1.6.55.\n */\n\n function Pardot(source) {\n window.piVersion = '1.0.2';\n window.piScriptNum = 0;\n window.piScriptObj = [];\n window.checkNamespace = noopFunc;\n window.getPardotUrl = noopStr;\n window.piGetParameter = noopNull;\n window.piSetCookie = noopFunc;\n window.piGetCookie = noopStr;\n function piTracker() {\n window.pi = {\n tracker: {\n visitor_id: '',\n visitor_id_sign: '',\n pi_opt_in: '',\n campaign_id: ''\n }\n };\n window.piScriptNum += 1;\n }\n window.piResponse = noopFunc;\n window.piTracker = piTracker;\n piTracker();\n hit(source);\n }\n Pardot.names = ['pardot-1.0'];\n Pardot.injections = [hit, noopFunc, noopStr, noopNull];\n\n /**\n * @redirect prevent-bab\n *\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Mostly it is used as `scriptlet`.\n * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab).\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab.js\n *\n * ### Examples\n *\n * ```adblock\n * /blockadblock.$script,redirect=prevent-bab\n * ```\n *\n * @added v1.3.19.\n */\n var preventBab$1 = preventBab$2;\n preventBab$1.names = ['prevent-bab',\n // list of prevent-bab redirect aliases\n 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser'];\n\n /**\n * @redirect amazon-apstag\n *\n * @description\n * Mocks Amazon's apstag.js\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/amazon_apstag.js\n *\n * ### Examples\n *\n * ```adblock\n * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag\n * ```\n *\n * @added v1.2.3.\n */\n function AmazonApstag(source) {\n var apstagWrapper = {\n fetchBids(a, b) {\n if (typeof b === 'function') {\n b([]);\n }\n },\n init: noopFunc,\n setDisplayBids: noopFunc,\n targetingKeys: noopFunc\n };\n window.apstag = apstagWrapper;\n hit(source);\n }\n AmazonApstag.names = ['amazon-apstag', 'ubo-amazon_apstag.js', 'amazon_apstag.js'];\n AmazonApstag.injections = [hit, noopFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect matomo\n *\n * @description\n * Mocks the piwik.js file of Matomo (formerly Piwik).\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/piwik.js$script,redirect=matomo\n * ```\n *\n * @added v1.5.0.\n */\n\n function Matomo(source) {\n var Tracker = function Tracker() {};\n Tracker.prototype.setDoNotTrack = noopFunc;\n Tracker.prototype.setDomains = noopFunc;\n Tracker.prototype.setCustomDimension = noopFunc;\n Tracker.prototype.trackPageView = noopFunc;\n var AsyncTracker = function AsyncTracker() {};\n AsyncTracker.prototype.addListener = noopFunc;\n var matomoWrapper = {\n getTracker: Tracker,\n getAsyncTracker: AsyncTracker\n };\n window.Piwik = matomoWrapper;\n hit(source);\n }\n Matomo.names = ['matomo'];\n Matomo.injections = [hit, noopFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect fingerprintjs2\n *\n * @description\n * Mocks FingerprintJS v2\n * https://github.com/fingerprintjs\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint2.js\n *\n * ### Examples\n *\n * ```adblock\n * ||example.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2\n * ```\n *\n * @added v1.5.0.\n */\n function Fingerprintjs2(source) {\n var browserId = '';\n for (var i = 0; i < 8; i += 1) {\n browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n var Fingerprint2 = function Fingerprint2() {};\n Fingerprint2.get = function (options, callback) {\n if (!callback) {\n callback = options;\n }\n setTimeout(function () {\n if (callback) {\n callback(browserId, []);\n }\n }, 1);\n };\n Fingerprint2.prototype = {\n get: Fingerprint2.get\n };\n window.Fingerprint2 = Fingerprint2;\n hit(source);\n }\n Fingerprintjs2.names = ['fingerprintjs2',\n // redirect aliases are needed for conversion:\n // prefixed for us\n 'ubo-fingerprint2.js',\n // original ubo name\n 'fingerprint2.js'];\n Fingerprintjs2.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect fingerprintjs3\n *\n * @description\n * Mocks FingerprintJS v3\n * https://github.com/fingerprintjs\n *\n * Related UBO redirect resource:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/fingerprint3.js\n *\n * ### Examples\n *\n * ```adblock\n * ||example.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3\n * ```\n *\n * @added v1.6.2.\n */\n function Fingerprintjs3(source) {\n var visitorId = function () {\n var id = '';\n for (var i = 0; i < 8; i += 1) {\n id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4);\n }\n return id;\n }();\n var FingerprintJS = function FingerprintJS() {};\n FingerprintJS.prototype = {\n load() {\n return Promise.resolve(new FingerprintJS());\n },\n get() {\n return Promise.resolve({\n visitorId\n });\n },\n hashComponents: noopStr\n };\n window.FingerprintJS = new FingerprintJS();\n hit(source);\n }\n Fingerprintjs3.names = ['fingerprintjs3',\n // redirect aliases are needed for conversion:\n // prefixed for us\n 'ubo-fingerprint3.js',\n // original ubo name\n 'fingerprint3.js'];\n Fingerprintjs3.injections = [hit, noopStr];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect gemius\n *\n * @description\n * Mocks Gemius Analytics.\n * https://flowplayer.com/developers/plugins/gemius\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/gplayer.js$script,redirect=gemius\n * ```\n *\n * @added v1.5.0.\n */\n function Gemius(source) {\n var GemiusPlayer = function GemiusPlayer() {};\n GemiusPlayer.prototype = {\n setVideoObject: noopFunc,\n newProgram: noopFunc,\n programEvent: noopFunc,\n newAd: noopFunc,\n adEvent: noopFunc\n };\n window.GemiusPlayer = GemiusPlayer;\n hit(source);\n }\n Gemius.names = ['gemius'];\n Gemius.injections = [hit, noopFunc];\n\n /**\n * @redirect ati-smarttag\n *\n * @description\n * Mocks AT Internat SmartTag.\n * https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/\n *\n * ### Examples\n *\n * ```adblock\n * ||example.com/assets/scripts/smarttag.js$script,redirect=ati-smarttag\n * ```\n *\n * @added v1.5.0.\n */\n function ATInternetSmartTag(source) {\n var setNoopFuncWrapper = {\n set: noopFunc\n };\n var sendNoopFuncWrapper = {\n send: noopFunc\n };\n var ecommerceWrapper = {\n displayCart: {\n products: setNoopFuncWrapper,\n cart: setNoopFuncWrapper\n },\n updateCart: {\n cart: setNoopFuncWrapper\n },\n displayProduct: {\n products: setNoopFuncWrapper\n },\n displayPageProduct: {\n products: setNoopFuncWrapper\n },\n addProduct: {\n products: setNoopFuncWrapper\n },\n removeProduct: {\n products: setNoopFuncWrapper\n }\n };\n\n // eslint-disable-next-line new-cap, func-names\n var tag = function tag() {};\n tag.prototype = {\n setConfig: noopFunc,\n setParam: noopFunc,\n dispatch: noopFunc,\n customVars: setNoopFuncWrapper,\n publisher: setNoopFuncWrapper,\n order: setNoopFuncWrapper,\n click: sendNoopFuncWrapper,\n clickListener: sendNoopFuncWrapper,\n internalSearch: {\n set: noopFunc,\n send: noopFunc\n },\n ecommerce: ecommerceWrapper,\n identifiedVisitor: {\n unset: noopFunc\n },\n page: {\n set: noopFunc,\n send: noopFunc\n },\n selfPromotion: {\n add: noopFunc,\n send: noopFunc\n },\n privacy: {\n setVisitorMode: noopFunc,\n getVisitorMode: noopFunc,\n hit: noopFunc\n },\n richMedia: {\n add: noopFunc,\n send: noopFunc,\n remove: noopFunc,\n removeAll: noopFunc\n }\n };\n var smartTagWrapper = {\n Tracker: {\n Tag: tag\n }\n };\n window.ATInternet = smartTagWrapper;\n hit(source);\n }\n ATInternetSmartTag.names = ['ati-smarttag'];\n ATInternetSmartTag.injections = [hit, noopFunc];\n\n /* eslint-disable consistent-return, no-eval */\n\n /**\n * @redirect prevent-bab2\n *\n * @description\n * Prevents BlockAdblock script from detecting an ad blocker.\n *\n * Related UBO redirect:\n * https://github.com/gorhill/uBlock/blob/master/src/web_accessible_resources/nobab2.js\n *\n * See [redirect description](../wiki/about-redirects.md#prevent-bab2).\n *\n * ### Examples\n *\n * ```adblock\n * /blockadblock.$script,redirect=prevent-bab2\n * ```\n *\n * @added v1.5.0.\n */\n function preventBab2(source) {\n var script = document.currentScript;\n if (script === null) {\n return;\n }\n var url = script.src;\n if (typeof url !== 'string') {\n return;\n }\n var domainsStr = ['adclixx\\\\.net', 'adnetasia\\\\.com', 'adtrackers\\\\.net', 'bannertrack\\\\.net'].join('|');\n var matchStr = \"^https?://[\\\\w-]+\\\\.(\".concat(domainsStr, \")/.\");\n var domainsRegex = new RegExp(matchStr);\n if (domainsRegex.test(url) === false) {\n return;\n }\n window.nH7eXzOsG = 858;\n hit(source);\n }\n preventBab2.names = ['prevent-bab2',\n // aliases are needed for matching the related scriptlet converted into our syntax\n 'nobab2.js'];\n preventBab2.injections = [hit];\n\n /* eslint-disable func-names, no-underscore-dangle */\n\n /**\n * @redirect google-ima3\n *\n * @description\n * Mocks the IMA SDK of Google.\n *\n * Related Mozilla shim:\n * https://searchfox.org/mozilla-central/source/browser/extensions/webcompat/shims/google-ima.js\n *\n * ### Examples\n *\n * ```adblock\n * ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect=google-ima3\n * ```\n *\n * @added v1.6.2.\n */\n\n function GoogleIma3(source) {\n var _window$google$ima;\n var VERSION = '3.453.0';\n var ima = {};\n var AdDisplayContainer = function AdDisplayContainer() {};\n AdDisplayContainer.prototype.destroy = noopFunc;\n AdDisplayContainer.prototype.initialize = noopFunc;\n var ImaSdkSettings = function ImaSdkSettings() {};\n ImaSdkSettings.CompanionBackfillMode = {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n };\n ImaSdkSettings.VpaidMode = {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n };\n ImaSdkSettings.prototype = {\n c: true,\n f: {},\n i: false,\n l: '',\n p: '',\n r: 0,\n t: '',\n v: '',\n getCompanionBackfill: noopFunc,\n getDisableCustomPlaybackForIOS10Plus() {\n return this.i;\n },\n getDisabledFlashAds: function getDisabledFlashAds() {\n return true;\n },\n getFeatureFlags() {\n return this.f;\n },\n getLocale() {\n return this.l;\n },\n getNumRedirects() {\n return this.r;\n },\n getPlayerType() {\n return this.t;\n },\n getPlayerVersion() {\n return this.v;\n },\n getPpid() {\n return this.p;\n },\n getVpaidMode() {\n return this.C;\n },\n isCookiesEnabled() {\n return this.c;\n },\n isVpaidAdapter() {\n return this.M;\n },\n setCompanionBackfill: noopFunc,\n setAutoPlayAdBreaks(a) {\n this.K = a;\n },\n setCookiesEnabled(c) {\n this.c = !!c;\n },\n setDisableCustomPlaybackForIOS10Plus(i) {\n this.i = !!i;\n },\n setDisableFlashAds: noopFunc,\n setFeatureFlags(f) {\n this.f = !!f;\n },\n setIsVpaidAdapter(a) {\n this.M = a;\n },\n setLocale(l) {\n this.l = !!l;\n },\n setNumRedirects(r) {\n this.r = !!r;\n },\n setPageCorrelator(a) {\n this.R = a;\n },\n setPlayerType(t) {\n this.t = !!t;\n },\n setPlayerVersion(v) {\n this.v = !!v;\n },\n setPpid(p) {\n this.p = !!p;\n },\n setVpaidMode(a) {\n this.C = a;\n },\n setSessionId: noopFunc,\n setStreamCorrelator: noopFunc,\n setVpaidAllowed: noopFunc,\n CompanionBackfillMode: {\n ALWAYS: 'always',\n ON_MASTER_AD: 'on_master_ad'\n },\n VpaidMode: {\n DISABLED: 0,\n ENABLED: 1,\n INSECURE: 2\n }\n };\n var EventHandler = function EventHandler() {\n this.listeners = new Map();\n this._dispatch = function (e) {\n var listeners = this.listeners.get(e.type) || [];\n // eslint-disable-next-line no-restricted-syntax\n for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) {\n var listener = _Array$from[_i];\n try {\n listener(e);\n } catch (r) {\n logMessage(source, r);\n }\n }\n };\n this.addEventListener = function (t, c) {\n if (!this.listeners.has(t)) {\n this.listeners.set(t, new Set());\n }\n this.listeners.get(t).add(c);\n };\n this.removeEventListener = function (t, c) {\n var _this$listeners$get;\n (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c);\n };\n };\n var AdsManager = new EventHandler();\n /* eslint-disable no-use-before-define */\n AdsManager.volume = 1;\n AdsManager.collapse = noopFunc;\n AdsManager.configureAdsManager = noopFunc;\n AdsManager.destroy = noopFunc;\n AdsManager.discardAdBreak = noopFunc;\n AdsManager.expand = noopFunc;\n AdsManager.focus = noopFunc;\n AdsManager.getAdSkippableState = function () {\n return false;\n };\n AdsManager.getCuePoints = function () {\n return [0];\n };\n AdsManager.getCurrentAd = function () {\n return currentAd;\n };\n AdsManager.getCurrentAdCuePoints = function () {\n return [];\n };\n AdsManager.getRemainingTime = function () {\n return 0;\n };\n AdsManager.getVolume = function () {\n return this.volume;\n };\n AdsManager.init = noopFunc;\n AdsManager.isCustomClickTrackingUsed = function () {\n return false;\n };\n AdsManager.isCustomPlaybackUsed = function () {\n return false;\n };\n AdsManager.pause = noopFunc;\n AdsManager.requestNextAdBreak = noopFunc;\n AdsManager.resize = noopFunc;\n AdsManager.resume = noopFunc;\n AdsManager.setVolume = function (v) {\n this.volume = v;\n };\n AdsManager.skip = noopFunc;\n AdsManager.start = function () {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) {\n var type = _arr[_i2];\n try {\n this._dispatch(new ima.AdEvent(type));\n } catch (e) {\n logMessage(source, e);\n }\n }\n };\n AdsManager.stop = noopFunc;\n AdsManager.updateAdsRenderingSettings = noopFunc;\n /* eslint-enable no-use-before-define */\n\n var manager = Object.create(AdsManager);\n var AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) {\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n };\n AdsManagerLoadedEvent.prototype = {\n getAdsManager: function getAdsManager() {\n return manager;\n },\n getUserRequestContext() {\n if (this.userRequestContext) {\n return this.userRequestContext;\n }\n return {};\n }\n };\n AdsManagerLoadedEvent.Type = {\n ADS_MANAGER_LOADED: 'adsManagerLoaded'\n };\n var AdsLoader = EventHandler;\n AdsLoader.prototype.settings = new ImaSdkSettings();\n AdsLoader.prototype.contentComplete = noopFunc;\n AdsLoader.prototype.destroy = noopFunc;\n AdsLoader.prototype.getSettings = function () {\n return this.settings;\n };\n AdsLoader.prototype.getVersion = function () {\n return VERSION;\n };\n AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) {\n var _this = this;\n requestAnimationFrame(function () {\n var ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED;\n var event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext);\n _this._dispatch(event);\n });\n var e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext);\n requestAnimationFrame(function () {\n _this._dispatch(new ima.AdErrorEvent(e));\n });\n };\n var AdsRenderingSettings = noopFunc;\n var AdsRequest = function AdsRequest() {};\n AdsRequest.prototype = {\n setAdWillAutoPlay: noopFunc,\n setAdWillPlayMuted: noopFunc,\n setContinuousPlayback: noopFunc\n };\n var AdPodInfo = function AdPodInfo() {};\n AdPodInfo.prototype = {\n getAdPosition: function getAdPosition() {\n return 1;\n },\n getIsBumper: function getIsBumper() {\n return false;\n },\n getMaxDuration: function getMaxDuration() {\n return -1;\n },\n getPodIndex: function getPodIndex() {\n return 1;\n },\n getTimeOffset: function getTimeOffset() {\n return 0;\n },\n getTotalAds: function getTotalAds() {\n return 1;\n }\n };\n var Ad = function Ad() {};\n Ad.prototype = {\n pi: new AdPodInfo(),\n getAdId: function getAdId() {\n return '';\n },\n getAdPodInfo() {\n return this.pi;\n },\n getAdSystem: function getAdSystem() {\n return '';\n },\n getAdvertiserName: function getAdvertiserName() {\n return '';\n },\n getApiFramework: function getApiFramework() {\n return null;\n },\n getCompanionAds: function getCompanionAds() {\n return [];\n },\n getContentType: function getContentType() {\n return '';\n },\n getCreativeAdId: function getCreativeAdId() {\n return '';\n },\n getDealId: function getDealId() {\n return '';\n },\n getDescription: function getDescription() {\n return '';\n },\n getDuration: function getDuration() {\n return 8.5;\n },\n getHeight: function getHeight() {\n return 0;\n },\n getMediaUrl: function getMediaUrl() {\n return null;\n },\n getMinSuggestedDuration: function getMinSuggestedDuration() {\n return -2;\n },\n getSkipTimeOffset: function getSkipTimeOffset() {\n return -1;\n },\n getSurveyUrl: function getSurveyUrl() {\n return null;\n },\n getTitle: function getTitle() {\n return '';\n },\n getTraffickingParametersString: function getTraffickingParametersString() {\n return '';\n },\n getUiElements: function getUiElements() {\n return [''];\n },\n getUniversalAdIdRegistry: function getUniversalAdIdRegistry() {\n return 'unknown';\n },\n getUniversalAdIds: function getUniversalAdIds() {\n return [''];\n },\n getUniversalAdIdValue: function getUniversalAdIdValue() {\n return 'unknown';\n },\n getVastMediaBitrate: function getVastMediaBitrate() {\n return 0;\n },\n getVastMediaHeight: function getVastMediaHeight() {\n return 0;\n },\n getVastMediaWidth: function getVastMediaWidth() {\n return 0;\n },\n getWidth: function getWidth() {\n return 0;\n },\n getWrapperAdIds: function getWrapperAdIds() {\n return [''];\n },\n getWrapperAdSystems: function getWrapperAdSystems() {\n return [''];\n },\n getWrapperCreativeIds: function getWrapperCreativeIds() {\n return [''];\n },\n isLinear: function isLinear() {\n return true;\n },\n isSkippable() {\n return true;\n }\n };\n var CompanionAd = function CompanionAd() {};\n CompanionAd.prototype = {\n getAdSlotId: function getAdSlotId() {\n return '';\n },\n getContent: function getContent() {\n return '';\n },\n getContentType: function getContentType() {\n return '';\n },\n getHeight: function getHeight() {\n return 1;\n },\n getWidth: function getWidth() {\n return 1;\n }\n };\n var AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) {\n this.errorCode = code;\n this.message = message;\n this.type = type;\n this.adsRequest = adsRequest;\n this.userRequestContext = userRequestContext;\n this.getErrorCode = function () {\n return this.errorCode;\n };\n this.getInnerError = function () {};\n this.getMessage = function () {\n return this.message;\n };\n this.getType = function () {\n return this.type;\n };\n this.getVastErrorCode = function () {\n return this.vastErrorCode;\n };\n this.toString = function () {\n return \"AdError \".concat(this.errorCode, \": \").concat(this.message);\n };\n };\n AdError.ErrorCode = {};\n AdError.Type = {};\n var isEngadget = function isEngadget() {\n try {\n // eslint-disable-next-line no-restricted-syntax\n for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) {\n var _ctx$getPlayer, _ctx$getPlayer$div;\n var ctx = _Object$values[_i3];\n // eslint-disable-next-line no-restricted-properties\n if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) {\n return true;\n }\n }\n } catch (e) {} // eslint-disable-line no-empty\n return false;\n };\n var currentAd = isEngadget() ? undefined : new Ad();\n var AdEvent = function AdEvent(type) {\n this.type = type;\n };\n AdEvent.prototype = {\n getAd: function getAd() {\n return currentAd;\n },\n getAdData: function getAdData() {}\n };\n AdEvent.Type = {\n AD_BREAK_READY: 'adBreakReady',\n AD_BUFFERING: 'adBuffering',\n AD_CAN_PLAY: 'adCanPlay',\n AD_METADATA: 'adMetadata',\n AD_PROGRESS: 'adProgress',\n ALL_ADS_COMPLETED: 'allAdsCompleted',\n CLICK: 'click',\n COMPLETE: 'complete',\n CONTENT_PAUSE_REQUESTED: 'contentPauseRequested',\n CONTENT_RESUME_REQUESTED: 'contentResumeRequested',\n DURATION_CHANGE: 'durationChange',\n EXPANDED_CHANGED: 'expandedChanged',\n FIRST_QUARTILE: 'firstQuartile',\n IMPRESSION: 'impression',\n INTERACTION: 'interaction',\n LINEAR_CHANGE: 'linearChange',\n LINEAR_CHANGED: 'linearChanged',\n LOADED: 'loaded',\n LOG: 'log',\n MIDPOINT: 'midpoint',\n PAUSED: 'pause',\n RESUMED: 'resume',\n SKIPPABLE_STATE_CHANGED: 'skippableStateChanged',\n SKIPPED: 'skip',\n STARTED: 'start',\n THIRD_QUARTILE: 'thirdQuartile',\n USER_CLOSE: 'userClose',\n VIDEO_CLICKED: 'videoClicked',\n VIDEO_ICON_CLICKED: 'videoIconClicked',\n VIEWABLE_IMPRESSION: 'viewable_impression',\n VOLUME_CHANGED: 'volumeChange',\n VOLUME_MUTED: 'mute'\n };\n var AdErrorEvent = function AdErrorEvent(error) {\n this.error = error;\n this.type = 'adError';\n this.getError = function () {\n return this.error;\n };\n this.getUserRequestContext = function () {\n var _this$error;\n if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) {\n return this.error.userRequestContext;\n }\n return {};\n };\n };\n AdErrorEvent.Type = {\n AD_ERROR: 'adError'\n };\n var CustomContentLoadedEvent = function CustomContentLoadedEvent() {};\n CustomContentLoadedEvent.Type = {\n CUSTOM_CONTENT_LOADED: 'deprecated-event'\n };\n var CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {};\n CompanionAdSelectionSettings.CreativeType = {\n ALL: 'All',\n FLASH: 'Flash',\n IMAGE: 'Image'\n };\n CompanionAdSelectionSettings.ResourceType = {\n ALL: 'All',\n HTML: 'Html',\n IFRAME: 'IFrame',\n STATIC: 'Static'\n };\n CompanionAdSelectionSettings.SizeCriteria = {\n IGNORE: 'IgnoreSize',\n SELECT_EXACT_MATCH: 'SelectExactMatch',\n SELECT_NEAR_MATCH: 'SelectNearMatch'\n };\n var AdCuePoints = function AdCuePoints() {};\n AdCuePoints.prototype = {\n getCuePoints: function getCuePoints() {\n return [];\n },\n getAdIdRegistry: function getAdIdRegistry() {\n return '';\n },\n getAdIsValue: function getAdIsValue() {\n return '';\n }\n };\n var AdProgressData = noopFunc;\n var UniversalAdIdInfo = function UniversalAdIdInfo() {};\n Object.assign(ima, {\n AdCuePoints,\n AdDisplayContainer,\n AdError,\n AdErrorEvent,\n AdEvent,\n AdPodInfo,\n AdProgressData,\n AdsLoader,\n AdsManager: manager,\n AdsManagerLoadedEvent,\n AdsRenderingSettings,\n AdsRequest,\n CompanionAd,\n CompanionAdSelectionSettings,\n CustomContentLoadedEvent,\n gptProxyInstance: {},\n ImaSdkSettings,\n OmidAccessMode: {\n DOMAIN: 'domain',\n FULL: 'full',\n LIMITED: 'limited'\n },\n settings: new ImaSdkSettings(),\n UiElements: {\n AD_ATTRIBUTION: 'adAttribution',\n COUNTDOWN: 'countdown'\n },\n UniversalAdIdInfo,\n VERSION,\n ViewMode: {\n FULLSCREEN: 'fullscreen',\n NORMAL: 'normal'\n }\n });\n if (!window.google) {\n window.google = {};\n }\n\n // Workaround for https://github.com/AdguardTeam/Scriptlets/issues/331\n // To avoid conflicts with the DAI SDK, we need to make sure that the\n // google.ima.dai namespace is not overwritten.\n // TODO: Later we should create a mock for the DAI SDK as well.\n // See https://github.com/AdguardTeam/Scriptlets/issues/239\n if ((_window$google$ima = window.google.ima) !== null && _window$google$ima !== void 0 && _window$google$ima.dai) {\n ima.dai = window.google.ima.dai;\n }\n window.google.ima = ima;\n hit(source);\n }\n GoogleIma3.names = ['google-ima3',\n // prefixed name\n 'ubo-google-ima.js',\n // original ubo name\n 'google-ima.js'];\n GoogleIma3.injections = [hit, noopFunc, logMessage];\n\n /* eslint-disable func-names, no-underscore-dangle */\n\n /**\n * @redirect didomi-loader\n *\n * @description\n * Mocks Didomi's CMP loader script.\n * https://developers.didomi.io/\n *\n * ### Examples\n *\n * ```adblock\n * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader\n * ```\n *\n * @added v1.6.2.\n */\n function DidomiLoader(source) {\n function UserConsentStatusForVendorSubscribe() {}\n UserConsentStatusForVendorSubscribe.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc;\n function UserConsentStatusForVendor() {}\n UserConsentStatusForVendor.prototype.first = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.filter = function () {\n return new UserConsentStatusForVendorSubscribe();\n };\n UserConsentStatusForVendor.prototype.subscribe = noopFunc;\n var DidomiWrapper = {\n isConsentRequired: falseFunc,\n getUserConsentStatusForPurpose: trueFunc,\n getUserConsentStatus: trueFunc,\n getUserStatus: noopFunc,\n getRequiredPurposes: noopArray,\n getUserConsentStatusForVendor: trueFunc,\n Purposes: {\n Cookies: 'cookies'\n },\n notice: {\n configure: noopFunc,\n hide: noopFunc,\n isVisible: falseFunc,\n show: noopFunc,\n showDataProcessing: trueFunc\n },\n isUserConsentStatusPartial: falseFunc,\n on() {\n return {\n actions: {},\n emitter: {},\n services: {},\n store: {}\n };\n },\n shouldConsentBeCollected: falseFunc,\n getUserConsentStatusForAll: noopFunc,\n getObservableOnUserConsentStatusForVendor() {\n return new UserConsentStatusForVendor();\n }\n };\n window.Didomi = DidomiWrapper;\n var didomiStateWrapper = {\n didomiExperimentId: '',\n didomiExperimentUserGroup: '',\n didomiGDPRApplies: 1,\n didomiIABConsent: '',\n didomiPurposesConsent: '',\n didomiPurposesConsentDenied: '',\n didomiPurposesConsentUnknown: '',\n didomiVendorsConsent: '',\n didomiVendorsConsentDenied: '',\n didomiVendorsConsentUnknown: '',\n didomiVendorsRawConsent: '',\n didomiVendorsRawConsentDenied: '',\n didomiVendorsRawConsentUnknown: ''\n };\n window.didomiState = didomiStateWrapper;\n var tcData = {\n eventStatus: 'tcloaded',\n gdprApplies: false,\n listenerId: noopFunc,\n vendor: {\n consents: []\n },\n purpose: {\n consents: []\n }\n };\n\n // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api\n var __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) {\n if (typeof callback !== 'function' || command === 'removeEventListener') {\n return;\n }\n callback(tcData, true);\n };\n window.__tcfapi = __tcfapiWrapper;\n var didomiEventListenersWrapper = {\n stub: true,\n push: noopFunc\n };\n window.didomiEventListeners = didomiEventListenersWrapper;\n var didomiOnReadyWrapper = {\n stub: true,\n push(arg) {\n if (typeof arg !== 'function') {\n return;\n }\n if (document.readyState !== 'complete') {\n window.addEventListener('load', function () {\n setTimeout(arg(window.Didomi));\n });\n } else {\n setTimeout(arg(window.Didomi));\n }\n }\n };\n window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper;\n if (Array.isArray(window.didomiOnReady)) {\n window.didomiOnReady.forEach(function (arg) {\n if (typeof arg === 'function') {\n try {\n setTimeout(arg(window.Didomi));\n } catch (e) {\n /* empty */\n }\n }\n });\n }\n hit(source);\n }\n DidomiLoader.names = ['didomi-loader'];\n DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect prebid\n *\n * @description\n * Mocks the prebid.js header bidding suit.\n * https://docs.prebid.org/\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/bd/hb/prebid.js$script,redirect=prebid\n * ```\n *\n * @added v1.6.2.\n */\n\n function Prebid(source) {\n var pushFunction = function pushFunction(arg) {\n if (typeof arg === 'function') {\n try {\n arg.call();\n } catch (ex) {\n /* empty */\n }\n }\n };\n var pbjsWrapper = {\n addAdUnits() {},\n adServers: {\n dfp: {\n // https://docs.prebid.org/dev-docs/publisher-api-reference/adServers.dfp.buildVideoUrl.html\n // returns ad URL\n buildVideoUrl: noopStr\n }\n },\n adUnits: [],\n aliasBidder() {},\n cmd: [],\n enableAnalytics() {},\n getHighestCpmBids: noopArray,\n libLoaded: true,\n que: [],\n requestBids(arg) {\n if (arg instanceof Object && arg.bidsBackHandler) {\n try {\n arg.bidsBackHandler.call(); // https://docs.prebid.org/dev-docs/publisher-api-reference/requestBids.html\n } catch (ex) {\n /* empty */\n }\n }\n },\n removeAdUnit() {},\n setBidderConfig() {},\n setConfig() {},\n setTargetingForGPTAsync() {}\n };\n pbjsWrapper.cmd.push = pushFunction;\n pbjsWrapper.que.push = pushFunction;\n window.pbjs = pbjsWrapper;\n hit(source);\n }\n Prebid.names = ['prebid'];\n Prebid.injections = [hit, noopFunc, noopStr, noopArray];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect prebid-ads\n *\n * @description\n * Sets predefined constants on a page:\n *\n * - `canRunAds`: `true`\n * - `isAdBlockActive`: `false`\n *\n * ### Examples\n *\n * ```adblock\n * ||example.org/assets/js/prebid-ads.js$script,redirect=prebid-ads\n * ```\n *\n * @added v1.6.2.\n */\n function prebidAds(source) {\n window.canRunAds = true;\n window.isAdBlockActive = false;\n hit(source);\n }\n prebidAds.names = ['prebid-ads', 'ubo-prebid-ads.js', 'prebid-ads.js'];\n prebidAds.injections = [hit];\n\n /* eslint-disable func-names */\n\n /**\n * @redirect naver-wcslog\n *\n * @description\n * Mocks wcslog.js of Naver Analytics.\n *\n * ### Examples\n *\n * ```adblock\n * ||wcs.naver.net/wcslog.js$script,redirect=naver-wcslog\n * ```\n *\n * @added v1.6.2.\n */\n\n function NaverWcslog(source) {\n window.wcs_add = {};\n window.wcs_do = noopFunc;\n window.wcs = {\n inflow: noopFunc\n };\n hit(source);\n }\n NaverWcslog.names = ['naver-wcslog'];\n NaverWcslog.injections = [hit, noopFunc];\n\n var redirectsList = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ATInternetSmartTag: ATInternetSmartTag,\n AmazonApstag: AmazonApstag,\n DidomiLoader: DidomiLoader,\n Fingerprintjs2: Fingerprintjs2,\n Fingerprintjs3: Fingerprintjs3,\n Gemius: Gemius,\n GoogleAnalytics: GoogleAnalytics,\n GoogleAnalyticsGa: GoogleAnalyticsGa,\n GoogleIma3: GoogleIma3,\n GoogleSyndicationAdsByGoogle: GoogleSyndicationAdsByGoogle,\n GoogleTagServicesGpt: GoogleTagServicesGpt,\n Matomo: Matomo,\n NaverWcslog: NaverWcslog,\n Pardot: Pardot,\n Prebid: Prebid,\n ScoreCardResearchBeacon: ScoreCardResearchBeacon,\n metrikaYandexTag: metrikaYandexTag,\n metrikaYandexWatch: metrikaYandexWatch,\n noeval: noeval$1,\n prebidAds: prebidAds,\n preventBab: preventBab$1,\n preventBab2: preventBab2,\n preventFab: preventFab$1,\n preventPopadsNet: preventPopadsNet$1,\n setPopadsDummy: setPopadsDummy$1\n });\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n }\n\n function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n }\n\n function _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n }\n\n function _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n\n function getDefaultExportFromCjs (x) {\n \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n }\n\n var jsYaml$2 = {};\n\n var loader$1 = {};\n\n var common$6 = {};\n\n function isNothing(subject) {\n return typeof subject === 'undefined' || subject === null;\n }\n function isObject(subject) {\n return typeof subject === 'object' && subject !== null;\n }\n function toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return [];\n return [sequence];\n }\n function extend(target, source) {\n var index, length, key, sourceKeys;\n if (source) {\n sourceKeys = Object.keys(source);\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n return target;\n }\n function repeat(string, count) {\n var result = '',\n cycle;\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n return result;\n }\n function isNegativeZero(number) {\n return number === 0 && Number.NEGATIVE_INFINITY === 1 / number;\n }\n common$6.isNothing = isNothing;\n common$6.isObject = isObject;\n common$6.toArray = toArray;\n common$6.repeat = repeat;\n common$6.isNegativeZero = isNegativeZero;\n common$6.extend = extend;\n\n function YAMLException$4(reason, mark) {\n // Super constructor\n Error.call(this);\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = new Error().stack || '';\n }\n }\n\n // Inherit from Error\n YAMLException$4.prototype = Object.create(Error.prototype);\n YAMLException$4.prototype.constructor = YAMLException$4;\n YAMLException$4.prototype.toString = function toString(compact) {\n var result = this.name + ': ';\n result += this.reason || '(unknown reason)';\n if (!compact && this.mark) {\n result += ' ' + this.mark.toString();\n }\n return result;\n };\n var exception = YAMLException$4;\n\n var common$5 = common$6;\n function Mark$1(name, buffer, position, line, column) {\n this.name = name;\n this.buffer = buffer;\n this.position = position;\n this.line = line;\n this.column = column;\n }\n Mark$1.prototype.getSnippet = function getSnippet(indent, maxLength) {\n var head, start, tail, end, snippet;\n if (!this.buffer) return null;\n indent = indent || 4;\n maxLength = maxLength || 75;\n head = '';\n start = this.position;\n while (start > 0 && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(start - 1)) === -1) {\n start -= 1;\n if (this.position - start > maxLength / 2 - 1) {\n head = ' ... ';\n start += 5;\n break;\n }\n }\n tail = '';\n end = this.position;\n while (end < this.buffer.length && \"\\0\\r\\n\\x85\\u2028\\u2029\".indexOf(this.buffer.charAt(end)) === -1) {\n end += 1;\n if (end - this.position > maxLength / 2 - 1) {\n tail = ' ... ';\n end -= 5;\n break;\n }\n }\n snippet = this.buffer.slice(start, end);\n return common$5.repeat(' ', indent) + head + snippet + tail + '\\n' + common$5.repeat(' ', indent + this.position - start + head.length) + '^';\n };\n Mark$1.prototype.toString = function toString(compact) {\n var snippet,\n where = '';\n if (this.name) {\n where += 'in \"' + this.name + '\" ';\n }\n where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);\n if (!compact) {\n snippet = this.getSnippet();\n if (snippet) {\n where += ':\\n' + snippet;\n }\n }\n return where;\n };\n var mark = Mark$1;\n\n var YAMLException$3 = exception;\n var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases'];\n var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping'];\n function compileStyleAliases(map) {\n var result = {};\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n return result;\n }\n function Type$h(tag, options) {\n options = options || {};\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new YAMLException$3('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () {\n return true;\n };\n this.construct = options['construct'] || function (data) {\n return data;\n };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new YAMLException$3('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n }\n var type = Type$h;\n\n /*eslint-disable max-len*/\n\n var common$4 = common$6;\n var YAMLException$2 = exception;\n var Type$g = type;\n function compileList(schema, name, result) {\n var exclude = [];\n schema.include.forEach(function (includedSchema) {\n result = compileList(includedSchema, name, result);\n });\n schema[name].forEach(function (currentType) {\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {\n exclude.push(previousIndex);\n }\n });\n result.push(currentType);\n });\n return result.filter(function (type, index) {\n return exclude.indexOf(index) === -1;\n });\n }\n function compileMap( /* lists... */\n ) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {}\n },\n index,\n length;\n function collectType(type) {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n }\n function Schema$5(definition) {\n this.include = definition.include || [];\n this.implicit = definition.implicit || [];\n this.explicit = definition.explicit || [];\n this.implicit.forEach(function (type) {\n if (type.loadKind && type.loadKind !== 'scalar') {\n throw new YAMLException$2('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n });\n this.compiledImplicit = compileList(this, 'implicit', []);\n this.compiledExplicit = compileList(this, 'explicit', []);\n this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);\n }\n Schema$5.DEFAULT = null;\n Schema$5.create = function createSchema() {\n var schemas, types;\n switch (arguments.length) {\n case 1:\n schemas = Schema$5.DEFAULT;\n types = arguments[0];\n break;\n case 2:\n schemas = arguments[0];\n types = arguments[1];\n break;\n default:\n throw new YAMLException$2('Wrong number of arguments for Schema.create function');\n }\n schemas = common$4.toArray(schemas);\n types = common$4.toArray(types);\n if (!schemas.every(function (schema) {\n return schema instanceof Schema$5;\n })) {\n throw new YAMLException$2('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');\n }\n if (!types.every(function (type) {\n return type instanceof Type$g;\n })) {\n throw new YAMLException$2('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n return new Schema$5({\n include: schemas,\n explicit: types\n });\n };\n var schema = Schema$5;\n\n var Type$f = type;\n var str = new Type$f('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function construct(data) {\n return data !== null ? data : '';\n }\n });\n\n var Type$e = type;\n var seq = new Type$e('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function construct(data) {\n return data !== null ? data : [];\n }\n });\n\n var Type$d = type;\n var map = new Type$d('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function construct(data) {\n return data !== null ? data : {};\n }\n });\n\n var Schema$4 = schema;\n var failsafe = new Schema$4({\n explicit: [str, seq, map]\n });\n\n var Type$c = type;\n function resolveYamlNull(data) {\n if (data === null) return true;\n var max = data.length;\n return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL');\n }\n function constructYamlNull() {\n return null;\n }\n function isNull(object) {\n return object === null;\n }\n var _null = new Type$c('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function canonical() {\n return '~';\n },\n lowercase: function lowercase() {\n return 'null';\n },\n uppercase: function uppercase() {\n return 'NULL';\n },\n camelcase: function camelcase() {\n return 'Null';\n }\n },\n defaultStyle: 'lowercase'\n });\n\n var Type$b = type;\n function resolveYamlBoolean(data) {\n if (data === null) return false;\n var max = data.length;\n return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE');\n }\n function constructYamlBoolean(data) {\n return data === 'true' || data === 'True' || data === 'TRUE';\n }\n function isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n }\n var bool = new Type$b('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function lowercase(object) {\n return object ? 'true' : 'false';\n },\n uppercase: function uppercase(object) {\n return object ? 'TRUE' : 'FALSE';\n },\n camelcase: function camelcase(object) {\n return object ? 'True' : 'False';\n }\n },\n defaultStyle: 'lowercase'\n });\n\n var common$3 = common$6;\n var Type$a = type;\n function isHexCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */;\n }\n\n function isOctCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */;\n }\n\n function isDecCode(c) {\n return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */;\n }\n\n function resolveYamlInteger(data) {\n if (data === null) return false;\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n if (!max) return false;\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n if (ch === 'x') {\n // base 16\n index++;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n // base 8\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n // base 10 (except 0) or base 60\n\n // value should not start with `_`;\n if (ch === '_') return false;\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch === ':') break;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n // if !base60 - done;\n if (ch !== ':') return true;\n\n // base60 almost not used, no needs to optimize\n return /^(:[0-5]?[0-9])+$/.test(data.slice(index));\n }\n function constructYamlInteger(data) {\n var value = data,\n sign = 1,\n ch,\n base,\n digits = [];\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n ch = value[0];\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n if (value === '0') return 0;\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value, 16);\n return sign * parseInt(value, 8);\n }\n if (value.indexOf(':') !== -1) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseInt(v, 10));\n });\n value = 0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseInt(value, 10);\n }\n function isInteger(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common$3.isNegativeZero(object);\n }\n var int = new Type$a('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function binary(obj) {\n return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1);\n },\n octal: function octal(obj) {\n return obj >= 0 ? '0' + obj.toString(8) : '-0' + obj.toString(8).slice(1);\n },\n decimal: function decimal(obj) {\n return obj.toString(10);\n },\n /* eslint-disable max-len */\n hexadecimal: function hexadecimal(obj) {\n return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1);\n }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [2, 'bin'],\n octal: [8, 'oct'],\n decimal: [10, 'dec'],\n hexadecimal: [16, 'hex']\n }\n });\n\n var common$2 = common$6;\n var Type$9 = type;\n var YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // 20:59\n '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n function resolveYamlFloat(data) {\n if (data === null) return false;\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n return true;\n }\n function constructYamlFloat(data) {\n var value, sign, base, digits;\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n digits = [];\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n if (value === '.inf') {\n return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n } else if (value === '.nan') {\n return NaN;\n } else if (value.indexOf(':') >= 0) {\n value.split(':').forEach(function (v) {\n digits.unshift(parseFloat(v, 10));\n });\n value = 0.0;\n base = 1;\n digits.forEach(function (d) {\n value += d * base;\n base *= 60;\n });\n return sign * value;\n }\n return sign * parseFloat(value, 10);\n }\n var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n function representYamlFloat(object, style) {\n var res;\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase':\n return '.nan';\n case 'uppercase':\n return '.NAN';\n case 'camelcase':\n return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '.inf';\n case 'uppercase':\n return '.INF';\n case 'camelcase':\n return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase':\n return '-.inf';\n case 'uppercase':\n return '-.INF';\n case 'camelcase':\n return '-.Inf';\n }\n } else if (common$2.isNegativeZero(object)) {\n return '-0.0';\n }\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n }\n function isFloat(object) {\n return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common$2.isNegativeZero(object));\n }\n var float = new Type$9('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n });\n\n var Schema$3 = schema;\n var json = new Schema$3({\n include: [failsafe],\n implicit: [_null, bool, int, float]\n });\n\n var Schema$2 = schema;\n var core = new Schema$2({\n include: [json]\n });\n\n var Type$8 = type;\n var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n // [1] year\n '-([0-9][0-9])' +\n // [2] month\n '-([0-9][0-9])$'); // [3] day\n\n var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' +\n // [1] year\n '-([0-9][0-9]?)' +\n // [2] month\n '-([0-9][0-9]?)' +\n // [3] day\n '(?:[Tt]|[ \\\\t]+)' +\n // ...\n '([0-9][0-9]?)' +\n // [4] hour\n ':([0-9][0-9])' +\n // [5] minute\n ':([0-9][0-9])' +\n // [6] second\n '(?:\\\\.([0-9]*))?' +\n // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' +\n // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\n function resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n }\n function constructYamlTimestamp(data) {\n var match,\n year,\n month,\n day,\n hour,\n minute,\n second,\n fraction = 0,\n delta = null,\n tz_hour,\n tz_minute,\n date;\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +match[1];\n month = +match[2] - 1; // JS month starts with 0\n day = +match[3];\n if (!match[4]) {\n // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +match[4];\n minute = +match[5];\n second = +match[6];\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) {\n // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +match[10];\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n if (delta) date.setTime(date.getTime() - delta);\n return date;\n }\n function representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n }\n var timestamp = new Type$8('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n });\n\n var Type$7 = type;\n function resolveYamlMerge(data) {\n return data === '<<' || data === null;\n }\n var merge = new Type$7('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n });\n\n function commonjsRequire(path) {\n \tthrow new Error('Could not dynamically require \"' + path + '\". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');\n }\n\n /*eslint-disable no-bitwise*/\n\n var NodeBuffer;\n try {\n // A trick for browserified version, to not include `Buffer` shim\n var _require$1 = commonjsRequire;\n NodeBuffer = _require$1('buffer').Buffer;\n } catch (__) {}\n var Type$6 = type;\n\n // [ 64, 65, 66 ] -> [ padding, CR, LF ]\n var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n function resolveYamlBinary(data) {\n if (data === null) return false;\n var code,\n idx,\n bitlen = 0,\n max = data.length,\n map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return bitlen % 8 === 0;\n }\n function constructYamlBinary(data) {\n var idx,\n tailbits,\n input = data.replace(/[\\r\\n=]/g, ''),\n // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if (idx % 4 === 0 && idx) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n }\n bits = bits << 6 | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = max % 4 * 6;\n if (tailbits === 0) {\n result.push(bits >> 16 & 0xFF);\n result.push(bits >> 8 & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push(bits >> 10 & 0xFF);\n result.push(bits >> 2 & 0xFF);\n } else if (tailbits === 12) {\n result.push(bits >> 4 & 0xFF);\n }\n\n // Wrap into Buffer for NodeJS and leave Array for browser\n if (NodeBuffer) {\n // Support node 6.+ Buffer API when available\n return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);\n }\n return result;\n }\n function representYamlBinary(object /*, style*/) {\n var result = '',\n bits = 0,\n idx,\n tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if (idx % 3 === 0 && idx) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n }\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n if (tail === 0) {\n result += map[bits >> 18 & 0x3F];\n result += map[bits >> 12 & 0x3F];\n result += map[bits >> 6 & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[bits >> 10 & 0x3F];\n result += map[bits >> 4 & 0x3F];\n result += map[bits << 2 & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[bits >> 2 & 0x3F];\n result += map[bits << 4 & 0x3F];\n result += map[64];\n result += map[64];\n }\n return result;\n }\n function isBinary(object) {\n return NodeBuffer && NodeBuffer.isBuffer(object);\n }\n var binary = new Type$6('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n });\n\n var Type$5 = type;\n var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\n var _toString$2 = Object.prototype.toString;\n function resolveYamlOmap(data) {\n if (data === null) return true;\n var objectKeys = [],\n index,\n length,\n pair,\n pairKey,\n pairHasKey,\n object = data;\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n if (_toString$2.call(pair) !== '[object Object]') return false;\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;else return false;\n }\n }\n if (!pairHasKey) return false;\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false;\n }\n return true;\n }\n function constructYamlOmap(data) {\n return data !== null ? data : [];\n }\n var omap = new Type$5('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n });\n\n var Type$4 = type;\n var _toString$1 = Object.prototype.toString;\n function resolveYamlPairs(data) {\n if (data === null) return true;\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n if (_toString$1.call(pair) !== '[object Object]') return false;\n keys = Object.keys(pair);\n if (keys.length !== 1) return false;\n result[index] = [keys[0], pair[keys[0]]];\n }\n return true;\n }\n function constructYamlPairs(data) {\n if (data === null) return [];\n var index,\n length,\n pair,\n keys,\n result,\n object = data;\n result = new Array(object.length);\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n keys = Object.keys(pair);\n result[index] = [keys[0], pair[keys[0]]];\n }\n return result;\n }\n var pairs = new Type$4('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n });\n\n var Type$3 = type;\n var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n function resolveYamlSet(data) {\n if (data === null) return true;\n var key,\n object = data;\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n return true;\n }\n function constructYamlSet(data) {\n return data !== null ? data : {};\n }\n var set = new Type$3('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n });\n\n var Schema$1 = schema;\n var default_safe = new Schema$1({\n include: [core],\n implicit: [timestamp, merge],\n explicit: [binary, omap, pairs, set]\n });\n\n var Type$2 = type;\n function resolveJavascriptUndefined() {\n return true;\n }\n function constructJavascriptUndefined() {\n /*eslint-disable no-undefined*/\n return undefined;\n }\n function representJavascriptUndefined() {\n return '';\n }\n function isUndefined(object) {\n return typeof object === 'undefined';\n }\n var _undefined = new Type$2('tag:yaml.org,2002:js/undefined', {\n kind: 'scalar',\n resolve: resolveJavascriptUndefined,\n construct: constructJavascriptUndefined,\n predicate: isUndefined,\n represent: representJavascriptUndefined\n });\n\n var Type$1 = type;\n function resolveJavascriptRegExp(data) {\n if (data === null) return false;\n if (data.length === 0) return false;\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n\n // if regexp starts with '/' it can have modifiers and must be properly closed\n // `/foo/gim` - modifiers tail can be maximum 3 chars\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n if (modifiers.length > 3) return false;\n // if expression starts with /, is should be properly terminated\n if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;\n }\n return true;\n }\n function constructJavascriptRegExp(data) {\n var regexp = data,\n tail = /\\/([gim]*)$/.exec(data),\n modifiers = '';\n\n // `/foo/gim` - tail can be maximum 4 chars\n if (regexp[0] === '/') {\n if (tail) modifiers = tail[1];\n regexp = regexp.slice(1, regexp.length - modifiers.length - 1);\n }\n return new RegExp(regexp, modifiers);\n }\n function representJavascriptRegExp(object /*, style*/) {\n var result = '/' + object.source + '/';\n if (object.global) result += 'g';\n if (object.multiline) result += 'm';\n if (object.ignoreCase) result += 'i';\n return result;\n }\n function isRegExp(object) {\n return Object.prototype.toString.call(object) === '[object RegExp]';\n }\n var regexp = new Type$1('tag:yaml.org,2002:js/regexp', {\n kind: 'scalar',\n resolve: resolveJavascriptRegExp,\n construct: constructJavascriptRegExp,\n predicate: isRegExp,\n represent: representJavascriptRegExp\n });\n\n var esprima;\n\n // Browserified version does not have esprima\n //\n // 1. For node.js just require module as deps\n // 2. For browser try to require mudule via external AMD system.\n // If not found - try to fallback to window.esprima. If not\n // found too - then fail to parse.\n //\n try {\n // workaround to exclude package from browserify list.\n var _require = commonjsRequire;\n esprima = _require('esprima');\n } catch (_) {\n /* eslint-disable no-redeclare */\n /* global window */\n if (typeof window !== 'undefined') esprima = window.esprima;\n }\n var Type = type;\n function resolveJavascriptFunction(data) {\n if (data === null) return false;\n try {\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n });\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n return false;\n }\n return true;\n } catch (err) {\n return false;\n }\n }\n function constructJavascriptFunction(data) {\n /*jslint evil:true*/\n\n var source = '(' + data + ')',\n ast = esprima.parse(source, {\n range: true\n }),\n params = [],\n body;\n if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') {\n throw new Error('Failed to resolve function');\n }\n ast.body[0].expression.params.forEach(function (param) {\n params.push(param.name);\n });\n body = ast.body[0].expression.body.range;\n\n // Esprima's ranges include the first '{' and the last '}' characters on\n // function expressions. So cut them out.\n if (ast.body[0].expression.body.type === 'BlockStatement') {\n /*eslint-disable no-new-func*/\n return new Function(params, source.slice(body[0] + 1, body[1] - 1));\n }\n // ES6 arrow functions can omit the BlockStatement. In that case, just return\n // the body.\n /*eslint-disable no-new-func*/\n return new Function(params, 'return ' + source.slice(body[0], body[1]));\n }\n function representJavascriptFunction(object /*, style*/) {\n return object.toString();\n }\n function isFunction(object) {\n return Object.prototype.toString.call(object) === '[object Function]';\n }\n var _function = new Type('tag:yaml.org,2002:js/function', {\n kind: 'scalar',\n resolve: resolveJavascriptFunction,\n construct: constructJavascriptFunction,\n predicate: isFunction,\n represent: representJavascriptFunction\n });\n\n var Schema = schema;\n var default_full = Schema.DEFAULT = new Schema({\n include: [default_safe],\n explicit: [_undefined, regexp, _function]\n });\n\n /*eslint-disable max-len,no-use-before-define*/\n\n var common$1 = common$6;\n var YAMLException$1 = exception;\n var Mark = mark;\n var DEFAULT_SAFE_SCHEMA$1 = default_safe;\n var DEFAULT_FULL_SCHEMA$1 = default_full;\n var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n var CONTEXT_FLOW_IN = 1;\n var CONTEXT_FLOW_OUT = 2;\n var CONTEXT_BLOCK_IN = 3;\n var CONTEXT_BLOCK_OUT = 4;\n var CHOMPING_CLIP = 1;\n var CHOMPING_STRIP = 2;\n var CHOMPING_KEEP = 3;\n var PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\n var PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\n var PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\n var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\n var PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n function _class(obj) {\n return Object.prototype.toString.call(obj);\n }\n function is_EOL(c) {\n return c === 0x0A /* LF */ || c === 0x0D /* CR */;\n }\n\n function is_WHITE_SPACE(c) {\n return c === 0x09 /* Tab */ || c === 0x20 /* Space */;\n }\n\n function is_WS_OR_EOL(c) {\n return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */;\n }\n\n function is_FLOW_INDICATOR(c) {\n return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */;\n }\n\n function fromHexCode(c) {\n var lc;\n if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) {\n return lc - 0x61 + 10;\n }\n return -1;\n }\n function escapedHexLen(c) {\n if (c === 0x78 /* x */) {\n return 2;\n }\n if (c === 0x75 /* u */) {\n return 4;\n }\n if (c === 0x55 /* U */) {\n return 8;\n }\n return 0;\n }\n function fromDecimalCode(c) {\n if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) {\n return c - 0x30;\n }\n return -1;\n }\n function simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return c === 0x30 /* 0 */ ? '\\x00' : c === 0x61 /* a */ ? '\\x07' : c === 0x62 /* b */ ? '\\x08' : c === 0x74 /* t */ ? '\\x09' : c === 0x09 /* Tab */ ? '\\x09' : c === 0x6E /* n */ ? '\\x0A' : c === 0x76 /* v */ ? '\\x0B' : c === 0x66 /* f */ ? '\\x0C' : c === 0x72 /* r */ ? '\\x0D' : c === 0x65 /* e */ ? '\\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* \" */ ? '\\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \\ */ ? '\\x5C' : c === 0x4E /* N */ ? '\\x85' : c === 0x5F /* _ */ ? '\\xA0' : c === 0x4C /* L */ ? \"\\u2028\" : c === 0x50 /* P */ ? \"\\u2029\" : '';\n }\n function charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00);\n }\n var simpleEscapeCheck = new Array(256); // integer, for fast access\n var simpleEscapeMap = new Array(256);\n for (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n }\n function State$1(input, options) {\n this.input = input;\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || DEFAULT_FULL_SCHEMA$1;\n this.onWarning = options['onWarning'] || null;\n this.legacy = options['legacy'] || false;\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n }\n\n function generateError(state, message) {\n return new YAMLException$1(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart));\n }\n function throwError(state, message) {\n throw generateError(state, message);\n }\n function throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n }\n var directiveHandlers = {\n YAML: function handleYamlDirective(state, name, args) {\n var match, major, minor;\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n state.version = args[0];\n state.checkLineBreaks = minor < 2;\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n TAG: function handleTagDirective(state, name, args) {\n var handle, prefix;\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n handle = args[0];\n prefix = args[1];\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n state.tagMap[handle] = prefix;\n }\n };\n function captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n if (start < end) {\n _result = state.input.slice(start, end);\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n state.result += _result;\n }\n }\n function mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n if (!common$1.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n sourceKeys = Object.keys(source);\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n if (!_hasOwnProperty$1.call(destination, key)) {\n destination[key] = source[key];\n overridableKeys[key] = true;\n }\n }\n }\n function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n keyNode = String(keyNode);\n if (_result === null) {\n _result = {};\n }\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n _result[keyNode] = valueNode;\n delete overridableKeys[keyNode];\n }\n return _result;\n }\n function readLineBreak(state) {\n var ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x0A /* LF */) {\n state.position++;\n } else if (ch === 0x0D /* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A /* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n state.line += 1;\n state.lineStart = state.position;\n }\n function skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (allowComments && ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0);\n }\n if (is_EOL(ch)) {\n readLineBreak(state);\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n while (ch === 0x20 /* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n return lineBreaks;\n }\n function testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) {\n _position += 3;\n ch = state.input.charCodeAt(_position);\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n return false;\n }\n function writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common$1.repeat('\\n', count - 1);\n }\n }\n function readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* \" */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) {\n return false;\n }\n if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n while (ch !== 0) {\n if (ch === 0x3A /* : */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n } else if (ch === 0x23 /* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, captureEnd, false);\n if (state.result) {\n return true;\n }\n state.kind = _kind;\n state.result = _result;\n return false;\n }\n function readSingleQuotedScalar(state, nodeIndent) {\n var ch, captureStart, captureEnd;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x27 /* ' */) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27 /* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x27 /* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n }\n function readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart, captureEnd, hexLength, hexResult, tmp, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x22 /* \" */) {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22 /* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n } else if (ch === 0x5C /* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n state.result += charFromCodepoint(hexResult);\n state.position++;\n } else {\n throwError(state, 'unknown escape sequence');\n }\n captureStart = captureEnd = state.position;\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n }\n function readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = {},\n keyNode,\n keyTag,\n valueNode,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x5B /* [ */) {\n terminator = 0x5D; /* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B /* { */) {\n terminator = 0x7D; /* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(++state.position);\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n }\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n if (ch === 0x3F /* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));\n } else {\n _result.push(keyNode);\n }\n skipSeparationSpace(state, true, nodeIndent);\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x2C /* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n throwError(state, 'unexpected end of the stream within a flow collection');\n }\n function readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch === 0x7C /* | */) {\n folding = false;\n } else if (ch === 0x3E /* > */) {\n folding = true;\n } else {\n return false;\n }\n state.kind = 'scalar';\n state.result = '';\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x2B /* + */ || ch === 0x2D /* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n } else {\n break;\n }\n }\n if (is_WHITE_SPACE(ch)) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (is_WHITE_SPACE(ch));\n if (ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (!is_EOL(ch) && ch !== 0);\n }\n }\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n ch = state.input.charCodeAt(state.position);\n while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common$1.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) {\n // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common$1.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common$1.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) {\n // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common$1.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common$1.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n while (!is_EOL(ch) && ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n }\n captureSegment(state, captureStart, state.position, false);\n }\n return true;\n }\n function readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n if (ch !== 0x2D /* - */) {\n break;\n }\n following = state.input.charCodeAt(state.position + 1);\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n detected = true;\n state.position++;\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n }\n function readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _pos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = {},\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n ch = state.input.charCodeAt(state.position);\n while (ch !== 0) {\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n _pos = state.position;\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) {\n if (ch === 0x3F /* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x3A /* : */) {\n ch = state.input.charCodeAt(++state.position);\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n keyTag = keyNode = valueNode = null;\n }\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n } else {\n break; // Reading is done. Go to the epilogue.\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);\n keyTag = keyNode = valueNode = null;\n }\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n if (state.lineIndent > nodeIndent && ch !== 0) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n return detected;\n }\n function readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x21 /* ! */) return false;\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n ch = state.input.charCodeAt(++state.position);\n if (ch === 0x3C /* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n } else if (ch === 0x21 /* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n } else {\n tagHandle = '!';\n }\n _position = state.position;\n if (isVerbatim) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && ch !== 0x3E /* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n if (ch === 0x21 /* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n ch = state.input.charCodeAt(++state.position);\n }\n tagName = state.input.slice(_position, state.position);\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n if (isVerbatim) {\n state.tag = tagName;\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n return true;\n }\n function readAnchorProperty(state) {\n var _position, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x26 /* & */) return false;\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n state.anchor = state.input.slice(_position, state.position);\n return true;\n }\n function readAlias(state) {\n var _position, alias, ch;\n ch = state.input.charCodeAt(state.position);\n if (ch !== 0x2A /* * */) return false;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n alias = state.input.slice(_position, state.position);\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n }\n function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1,\n // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n blockIndent = state.position - state.lineStart;\n if (indentStatus === 1) {\n if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n } else if (readAlias(state)) {\n hasContent = true;\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n if (state.tag !== null && state.tag !== '!') {\n if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n if (type.resolve(state.result)) {\n // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n if (!type.resolve(state.result)) {\n // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n }\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n }\n function readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = {};\n state.anchorMap = {};\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n if (state.lineIndent > 0 || ch !== 0x25 /* % */) {\n break;\n }\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n if (ch === 0x23 /* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0 && !is_EOL(ch));\n break;\n }\n if (is_EOL(ch)) break;\n _position = state.position;\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n if (ch !== 0) readLineBreak(state);\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n skipSeparationSpace(state, true, -1);\n if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n state.documents.push(state.result);\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n if (state.input.charCodeAt(state.position) === 0x2E /* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n if (state.position < state.length - 1) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n }\n function loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n if (input.length !== 0) {\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n var state = new State$1(input, options);\n var nullpos = input.indexOf('\\0');\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n while (state.input.charCodeAt(state.position) === 0x20 /* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n while (state.position < state.length - 1) {\n readDocument(state);\n }\n return state.documents;\n }\n function loadAll(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n var documents = loadDocuments(input, options);\n if (typeof iterator !== 'function') {\n return documents;\n }\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n }\n function load(input, options) {\n var documents = loadDocuments(input, options);\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new YAMLException$1('expected a single document in the stream, but found more');\n }\n function safeLoadAll(input, iterator, options) {\n if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n return loadAll(input, iterator, common$1.extend({\n schema: DEFAULT_SAFE_SCHEMA$1\n }, options));\n }\n function safeLoad(input, options) {\n return load(input, common$1.extend({\n schema: DEFAULT_SAFE_SCHEMA$1\n }, options));\n }\n loader$1.loadAll = loadAll;\n loader$1.load = load;\n loader$1.safeLoadAll = safeLoadAll;\n loader$1.safeLoad = safeLoad;\n\n var dumper$1 = {};\n\n /*eslint-disable no-use-before-define*/\n\n var common = common$6;\n var YAMLException = exception;\n var DEFAULT_FULL_SCHEMA = default_full;\n var DEFAULT_SAFE_SCHEMA = default_safe;\n var _toString = Object.prototype.toString;\n var _hasOwnProperty = Object.prototype.hasOwnProperty;\n var CHAR_TAB = 0x09; /* Tab */\n var CHAR_LINE_FEED = 0x0A; /* LF */\n var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\n var CHAR_SPACE = 0x20; /* Space */\n var CHAR_EXCLAMATION = 0x21; /* ! */\n var CHAR_DOUBLE_QUOTE = 0x22; /* \" */\n var CHAR_SHARP = 0x23; /* # */\n var CHAR_PERCENT = 0x25; /* % */\n var CHAR_AMPERSAND = 0x26; /* & */\n var CHAR_SINGLE_QUOTE = 0x27; /* ' */\n var CHAR_ASTERISK = 0x2A; /* * */\n var CHAR_COMMA = 0x2C; /* , */\n var CHAR_MINUS = 0x2D; /* - */\n var CHAR_COLON = 0x3A; /* : */\n var CHAR_EQUALS = 0x3D; /* = */\n var CHAR_GREATER_THAN = 0x3E; /* > */\n var CHAR_QUESTION = 0x3F; /* ? */\n var CHAR_COMMERCIAL_AT = 0x40; /* @ */\n var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\n var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\n var CHAR_GRAVE_ACCENT = 0x60; /* ` */\n var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\n var CHAR_VERTICAL_LINE = 0x7C; /* | */\n var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\n var ESCAPE_SEQUENCES = {};\n ESCAPE_SEQUENCES[0x00] = '\\\\0';\n ESCAPE_SEQUENCES[0x07] = '\\\\a';\n ESCAPE_SEQUENCES[0x08] = '\\\\b';\n ESCAPE_SEQUENCES[0x09] = '\\\\t';\n ESCAPE_SEQUENCES[0x0A] = '\\\\n';\n ESCAPE_SEQUENCES[0x0B] = '\\\\v';\n ESCAPE_SEQUENCES[0x0C] = '\\\\f';\n ESCAPE_SEQUENCES[0x0D] = '\\\\r';\n ESCAPE_SEQUENCES[0x1B] = '\\\\e';\n ESCAPE_SEQUENCES[0x22] = '\\\\\"';\n ESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\n ESCAPE_SEQUENCES[0x85] = '\\\\N';\n ESCAPE_SEQUENCES[0xA0] = '\\\\_';\n ESCAPE_SEQUENCES[0x2028] = '\\\\L';\n ESCAPE_SEQUENCES[0x2029] = '\\\\P';\n var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'];\n function compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n if (map === null) return {};\n result = {};\n keys = Object.keys(map);\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n result[tag] = style;\n }\n return result;\n }\n function encodeHex(character) {\n var string, handle, length;\n string = character.toString(16).toUpperCase();\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');\n }\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n }\n function State(options) {\n this.schema = options['schema'] || DEFAULT_FULL_SCHEMA;\n this.indent = Math.max(1, options['indent'] || 2);\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = common.isNothing(options['flowLevel']) ? -1 : options['flowLevel'];\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n this.tag = null;\n this.result = '';\n this.duplicates = [];\n this.usedDuplicates = null;\n }\n\n // Indents every line in a string. Empty lines (\\n only) are not indented.\n function indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n if (line.length && line !== '\\n') result += ind;\n result += line;\n }\n return result;\n }\n function generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n }\n function testImplicitResolving(state, str) {\n var index, length, type;\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n if (type.resolve(str)) {\n return true;\n }\n }\n return false;\n }\n\n // [33] s-white ::= s-space | s-tab\n function isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n }\n\n // Returns true if the character can be printed without escaping.\n // From YAML 1.2: \"any allowed characters known to be non-printable\n // should also be escaped. [However,] This isn’t mandatory\"\n // Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\n function isPrintable(c) {\n return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF;\n }\n\n // [34] ns-char ::= nb-char - s-white\n // [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n // [26] b-char ::= b-line-feed | b-carriage-return\n // [24] b-line-feed ::= #xA /* LF */\n // [25] b-carriage-return ::= #xD /* CR */\n // [3] c-byte-order-mark ::= #xFEFF\n function isNsChar(c) {\n return isPrintable(c) && !isWhitespace(c)\n // byte-order-mark\n && c !== 0xFEFF\n // b-char\n && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED;\n }\n\n // Simplified test for values allowed after the first character in plain style.\n function isPlainSafe(c, prev) {\n // Uses a subset of nb-char - c-flow-indicator - \":\" - \"#\"\n // where nb-char ::= c-printable - b-char - c-byte-order-mark.\n return isPrintable(c) && c !== 0xFEFF\n // - c-flow-indicator\n && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n // - \":\" - \"#\"\n // /* An ns-char preceding */ \"#\"\n && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev));\n }\n\n // Simplified test for values allowed as the first character in plain style.\n function isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET\n // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “\"”\n && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE\n // | “%” | “@” | “`”)\n && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT;\n }\n\n // Determines whether block indentation indicator is required.\n function needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n }\n var STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n // Determines which scalar styles are possible and returns the preferred style.\n // lineWidth = -1 => no limit.\n // Pre-conditions: str.length > 0.\n // Post-conditions:\n // STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\n function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {\n var i;\n var char, prev_char;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1));\n if (singleLineOnly) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n prev_char = i > 0 ? string.charCodeAt(i - 1) : null;\n plain = plain && isPlainSafe(char, prev_char);\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' ';\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n\n // Note: line breaking/folding is implemented for only the folded style.\n // NB. We drop the last trailing newline (if any) of a returned block scalar\n // since the dumper adds its own newline. This always works:\n // • No ending newline => unaffected; already using strip \"-\" chomping.\n // • Ending newline => removed then restored.\n // Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\n function writeScalar(state, string, level, iskey) {\n state.dump = function () {\n if (string.length === 0) {\n return \"''\";\n }\n if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {\n return \"'\" + string + \"'\";\n }\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || state.flowLevel > -1 && level >= state.flowLevel;\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new YAMLException('impossible error: invalid scalar style');\n }\n }();\n }\n\n // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\n function blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : clip ? '' : '-';\n return indentIndicator + chomp + '\\n';\n }\n\n // (See the note for writeScalar.)\n function dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n }\n\n // Note: a long line without a suitable break point will exceed the width limit.\n // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\n function foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }();\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while (match = lineRe.exec(string)) {\n var prefix = match[1],\n line = match[2];\n moreIndented = line[0] === ' ';\n result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\\n' : '') + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n return result;\n }\n\n // Greedy line breaking.\n // Picks the longest line under the limit each time,\n // otherwise settles for the shortest line over the limit.\n // NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\n function foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0,\n end,\n curr = 0,\n next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while (match = breakRe.exec(line)) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = curr > start ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n return result.slice(1); // drop extra \\n joiner\n }\n\n // Escapes a double-quoted string.\n function escapeString(string) {\n var result = '';\n var char, nextChar;\n var escapeSeq;\n for (var i = 0; i < string.length; i++) {\n char = string.charCodeAt(i);\n // Check for surrogate pairs (reference Unicode 3.0 section \"3.7 Surrogates\").\n if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) {\n nextChar = string.charCodeAt(i + 1);\n if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) {\n // Combine the surrogate pair and store it escaped.\n result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);\n // Advance index one extra since we already used that char here.\n i++;\n continue;\n }\n }\n escapeSeq = ESCAPE_SEQUENCES[char];\n result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char);\n }\n return result;\n }\n function writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n // Write only valid elements.\n if (writeNode(state, level, object[index], false, false)) {\n if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n }\n function writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length;\n for (index = 0, length = object.length; index < length; index += 1) {\n // Write only valid elements.\n if (writeNode(state, level + 1, object[index], true, true)) {\n if (!compact || index !== 0) {\n _result += generateNextLine(state, level);\n }\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n _result += state.dump;\n }\n }\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n }\n\n function writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (index !== 0) pairBuffer += ', ';\n if (state.condenseFlow) pairBuffer += '\"';\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n }\n function writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new YAMLException('sortKeys must be a boolean or a function');\n }\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n if (!compact || index !== 0) {\n pairBuffer += generateNextLine(state, level);\n }\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024;\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n pairBuffer += state.dump;\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n }\n\n function detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) {\n state.tag = explicit ? type.tag : '?';\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new YAMLException('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n state.dump = _result;\n }\n return true;\n }\n }\n return false;\n }\n\n // Serializes `object` and writes it to global `result`.\n // Returns true on success, or false on invalid object.\n //\n function writeNode(state, level, object, block, compact, iskey) {\n state.tag = null;\n state.dump = object;\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n var type = _toString.call(state.dump);\n if (block) {\n block = state.flowLevel < 0 || state.flowLevel > level;\n }\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) {\n compact = false;\n }\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && Object.keys(state.dump).length !== 0) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level;\n if (block && state.dump.length !== 0) {\n writeBlockSequence(state, arrayLevel, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, arrayLevel, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey);\n }\n } else {\n if (state.skipInvalid) return false;\n throw new YAMLException('unacceptable kind of an object to dump ' + type);\n }\n if (state.tag !== null && state.tag !== '?') {\n state.dump = '!<' + state.tag + '> ' + state.dump;\n }\n }\n return true;\n }\n function getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n inspectNode(object, objects, duplicatesIndexes);\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n }\n function inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList, index, length;\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n }\n function dump(input, options) {\n options = options || {};\n var state = new State(options);\n if (!state.noRefs) getDuplicateReferences(input, state);\n if (writeNode(state, 0, input, true, true)) return state.dump + '\\n';\n return '';\n }\n function safeDump(input, options) {\n return dump(input, common.extend({\n schema: DEFAULT_SAFE_SCHEMA\n }, options));\n }\n dumper$1.dump = dump;\n dumper$1.safeDump = safeDump;\n\n var loader = loader$1;\n var dumper = dumper$1;\n function deprecated(name) {\n return function () {\n throw new Error('Function ' + name + ' is deprecated and cannot be used.');\n };\n }\n jsYaml$2.Type = type;\n jsYaml$2.Schema = schema;\n jsYaml$2.FAILSAFE_SCHEMA = failsafe;\n jsYaml$2.JSON_SCHEMA = json;\n jsYaml$2.CORE_SCHEMA = core;\n jsYaml$2.DEFAULT_SAFE_SCHEMA = default_safe;\n jsYaml$2.DEFAULT_FULL_SCHEMA = default_full;\n jsYaml$2.load = loader.load;\n jsYaml$2.loadAll = loader.loadAll;\n jsYaml$2.safeLoad = loader.safeLoad;\n jsYaml$2.safeLoadAll = loader.safeLoadAll;\n jsYaml$2.dump = dumper.dump;\n jsYaml$2.safeDump = dumper.safeDump;\n jsYaml$2.YAMLException = exception;\n\n // Deprecated schema names from JS-YAML 2.0.x\n jsYaml$2.MINIMAL_SCHEMA = failsafe;\n jsYaml$2.SAFE_SCHEMA = default_safe;\n jsYaml$2.DEFAULT_SCHEMA = default_full;\n\n // Deprecated functions from JS-YAML 1.x.x\n jsYaml$2.scan = deprecated('scan');\n jsYaml$2.parse = deprecated('parse');\n jsYaml$2.compose = deprecated('compose');\n jsYaml$2.addConstructor = deprecated('addConstructor');\n\n var yaml = jsYaml$2;\n var jsYaml = yaml;\n var jsYaml$1 = /*@__PURE__*/getDefaultExportFromCjs(jsYaml);\n\n function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n /**\n * Redirect - object used to redirect some requests\n * e.g.\n * {\n * title: 1x1-transparent.gif\n * comment: http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever\n * contentType: image/gif;base64\n * content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\n * }\n *\n * @typedef {object} Redirect\n * @property {string} title resource name\n * @property {string} comment resource description\n * @property {string} content encoded resource content\n * @property {string} contentType MIME type\n * @property {boolean} [isBlocking] e.g click2load redirect\n * @property {string} [sha] hash\n */\n\n class Redirects {\n /**\n * Converts rawYaml into JS object with sources titles used as keys\n *\n * @param {string} rawYaml\n * @returns {Object} - return object with titles in the keys and RedirectSources\n * in the values\n */\n constructor(rawYaml) {\n try {\n var arrOfRedirects = jsYaml$1.safeLoad(rawYaml);\n this.redirects = arrOfRedirects.reduce(function (acc, redirect) {\n return _objectSpread(_objectSpread({}, acc), {}, {\n [redirect.title]: redirect\n });\n }, {});\n } catch (e) {\n // eslint-disable-next-line no-console\n console.log(\"Was unable to load YAML into JS due to: \".concat(e.message));\n throw e;\n }\n }\n\n /**\n * Returns redirect source object\n *\n * @param {string} title\n * @returns {Redirect|undefined} Found redirect source object, or `undefined` if not found.\n */\n getRedirect(title) {\n var _this = this;\n if (Object.prototype.hasOwnProperty.call(this.redirects, title)) {\n return this.redirects[title];\n }\n\n // look title among aliases\n var values = Object.keys(this.redirects).map(function (key) {\n return _this.redirects[key];\n });\n return values.find(function (redirect) {\n var aliases = redirect.aliases;\n if (!aliases) {\n return false;\n }\n return aliases.includes(title);\n });\n }\n\n /**\n * Checks if redirect is blocking like click2load.html\n *\n * @param {string} title Title of the redirect.\n * @returns {boolean} True if redirect is blocking otherwise returns `false` even if redirect name is\n * unknown.\n */\n isBlocking(title) {\n var redirect = this.redirects[title];\n if (redirect) {\n return !!redirect.isBlocking;\n }\n return false;\n }\n }\n\n var redirectsMap = {\n \"1x1-transparent.gif\": \"1x1-transparent.gif\",\n \"1x1.gif\": \"1x1-transparent.gif\",\n \"1x1-transparent-gif\": \"1x1-transparent.gif\",\n \"2x2-transparent.png\": \"2x2-transparent.png\",\n \"2x2.png\": \"2x2-transparent.png\",\n \"2x2-transparent-png\": \"2x2-transparent.png\",\n \"3x2-transparent.png\": \"3x2-transparent.png\",\n \"3x2.png\": \"3x2-transparent.png\",\n \"3x2-transparent-png\": \"3x2-transparent.png\",\n \"32x32-transparent.png\": \"32x32-transparent.png\",\n \"32x32.png\": \"32x32-transparent.png\",\n \"32x32-transparent-png\": \"32x32-transparent.png\",\n noopframe: \"noopframe.html\",\n \"noop.html\": \"noopframe.html\",\n \"blank-html\": \"noopframe.html\",\n noopcss: \"noopcss.css\",\n \"noop.css\": \"noopcss.css\",\n \"blank-css\": \"noopcss.css\",\n noopjs: \"noopjs.js\",\n \"noop.js\": \"noopjs.js\",\n \"blank-js\": \"noopjs.js\",\n noopjson: \"noopjson.json\",\n nooptext: \"nooptext.js\",\n \"noop.txt\": \"nooptext.js\",\n \"blank-text\": \"nooptext.js\",\n empty: \"nooptext.js\",\n \"noopvmap-1.0\": \"noopvmap01.xml\",\n \"noop-vmap1.0.xml\": \"noopvmap01.xml\",\n \"noopvast-2.0\": \"noopvast02.xml\",\n \"noopvast-3.0\": \"noopvast03.xml\",\n \"noopvast-4.0\": \"noopvast04.xml\",\n \"noopmp3-0.1s\": \"noopmp3.mp3\",\n \"blank-mp3\": \"noopmp3.mp3\",\n \"noopmp4-1s\": \"noopmp4.mp4\",\n \"noop-1s.mp4\": \"noopmp4.mp4\",\n \"blank-mp4\": \"noopmp4.mp4\",\n \"click2load.html\": \"click2load.html\",\n \"ubo-click2load.html\": \"click2load.html\",\n \"amazon-apstag\": \"amazon-apstag.js\",\n \"ubo-amazon_apstag.js\": \"amazon-apstag.js\",\n \"amazon_apstag.js\": \"amazon-apstag.js\",\n \"ati-smarttag\": \"ati-smarttag.js\",\n \"didomi-loader\": \"didomi-loader.js\",\n fingerprintjs2: \"fingerprintjs2.js\",\n \"ubo-fingerprint2.js\": \"fingerprintjs2.js\",\n \"fingerprint2.js\": \"fingerprintjs2.js\",\n fingerprintjs3: \"fingerprintjs3.js\",\n \"ubo-fingerprint3.js\": \"fingerprintjs3.js\",\n \"fingerprint3.js\": \"fingerprintjs3.js\",\n gemius: \"gemius.js\",\n \"google-analytics-ga\": \"google-analytics-ga.js\",\n \"ubo-google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics_ga.js\": \"google-analytics-ga.js\",\n \"google-analytics\": \"google-analytics.js\",\n \"ubo-google-analytics_analytics.js\": \"google-analytics.js\",\n \"google-analytics_analytics.js\": \"google-analytics.js\",\n \"googletagmanager-gtm\": \"google-analytics.js\",\n \"ubo-googletagmanager_gtm.js\": \"google-analytics.js\",\n \"googletagmanager_gtm.js\": \"google-analytics.js\",\n \"google-ima3\": \"google-ima3.js\",\n \"ubo-google-ima.js\": \"google-ima3.js\",\n \"google-ima.js\": \"google-ima3.js\",\n \"googlesyndication-adsbygoogle\": \"googlesyndication-adsbygoogle.js\",\n \"ubo-googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googlesyndication_adsbygoogle.js\": \"googlesyndication-adsbygoogle.js\",\n \"googletagservices-gpt\": \"googletagservices-gpt.js\",\n \"ubo-googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n \"googletagservices_gpt.js\": \"googletagservices-gpt.js\",\n matomo: \"matomo.js\",\n \"metrika-yandex-tag\": \"metrika-yandex-tag.js\",\n \"metrika-yandex-watch\": \"metrika-yandex-watch.js\",\n \"naver-wcslog\": \"naver-wcslog.js\",\n noeval: \"noeval.js\",\n \"noeval.js\": \"noeval.js\",\n \"silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval.js\": \"noeval.js\",\n \"ubo-silent-noeval.js\": \"noeval.js\",\n \"ubo-noeval\": \"noeval.js\",\n \"ubo-silent-noeval\": \"noeval.js\",\n \"pardot-1.0\": \"pardot-1.0.js\",\n \"prebid-ads\": \"prebid-ads.js\",\n \"ubo-prebid-ads.js\": \"prebid-ads.js\",\n \"prebid-ads.js\": \"prebid-ads.js\",\n prebid: \"prebid.js\",\n \"prevent-bab\": \"prevent-bab.js\",\n \"nobab.js\": \"prevent-bab.js\",\n \"ubo-nobab.js\": \"prevent-bab.js\",\n \"bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-bab-defuser.js\": \"prevent-bab.js\",\n \"ubo-nobab\": \"prevent-bab.js\",\n \"ubo-bab-defuser\": \"prevent-bab.js\",\n \"prevent-bab2\": \"prevent-bab2.js\",\n \"nobab2.js\": \"prevent-bab2.js\",\n \"prevent-fab-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"nofab.js\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab.js\": \"prevent-fab-3.2.0.js\",\n \"fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-fuckadblock.js-3.2.0\": \"prevent-fab-3.2.0.js\",\n \"ubo-nofab\": \"prevent-fab-3.2.0.js\",\n \"prevent-popads-net\": \"prevent-popads-net.js\",\n \"popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net.js\": \"prevent-popads-net.js\",\n \"ubo-popads.net\": \"prevent-popads-net.js\",\n \"scorecardresearch-beacon\": \"scorecardresearch-beacon.js\",\n \"ubo-scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"scorecardresearch_beacon.js\": \"scorecardresearch-beacon.js\",\n \"set-popads-dummy\": \"set-popads-dummy.js\",\n \"popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy.js\": \"set-popads-dummy.js\",\n \"ubo-popads-dummy\": \"set-popads-dummy.js\"\n };\n\n /**\n * Finds redirect resource by it's name\n *\n * @param {string} name - redirect name\n * @returns {Function}\n */\n var getRedirectByName = function getRedirectByName(name) {\n var redirects = Object.keys(redirectsList).map(function (key) {\n return redirectsList[key];\n });\n return redirects.find(function (r) {\n return r.names && r.names.includes(name);\n });\n };\n\n /**\n * @typedef {object} Source - redirect properties\n * @property {string} name redirect name\n * @property {Array} args Arguments for redirect function\n * @property {'extension'|'test'} [engine] -\n * Defines the final form of redirect string presentation\n * @property {boolean} [verbose] flag to enable printing to console debug information\n */\n\n /**\n * Returns redirect code by param\n *\n * @param {Source} source\n * @returns {string} redirect code\n */\n var getRedirectCode = function getRedirectCode(source) {\n var redirect = getRedirectByName(source.name);\n var result = attachDependencies(redirect);\n result = addCall(redirect, result);\n\n // redirect code for different sources is checked in tests\n // so it should be just a code without any source and props passed\n result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true);\n return result;\n };\n var getRedirectFilename = function getRedirectFilename(name) {\n return redirectsMap[name];\n };\n var redirects = {\n Redirects,\n getRedirectFilename,\n getCode: getRedirectCode,\n isAdgRedirectRule: validator.isAdgRedirectRule,\n isValidAdgRedirectRule: validator.isValidAdgRedirectRule,\n isAdgRedirectCompatibleWithUbo: validator.isAdgRedirectCompatibleWithUbo,\n isUboRedirectCompatibleWithAdg: validator.isUboRedirectCompatibleWithAdg,\n isAbpRedirectCompatibleWithAdg: validator.isAbpRedirectCompatibleWithAdg,\n convertUboRedirectToAdg,\n convertAbpRedirectToAdg,\n convertRedirectToAdg,\n convertRedirectNameToAdg,\n convertAdgRedirectToUbo\n };\n\n function abortCurrentInlineScript(source, args) {\n function abortCurrentInlineScript(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var SRC_DATA_MARKER = \"data:text/javascript;base64,\";\n var getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var _scriptEl$src;\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (content.length === 0 && typeof scriptEl.src !== \"undefined\" && (_scriptEl$src = scriptEl.src) !== null && _scriptEl$src !== void 0 && _scriptEl$src.startsWith(SRC_DATA_MARKER)) {\n var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length);\n content = window.atob(encodedContent);\n }\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n throw new ReferenceError(rid);\n }\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n var props = property.split(\".\");\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(source, message);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) {\n currentValue = base[prop];\n origDescriptor = undefined;\n }\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n currentValue: currentValue,\n get() {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n return origDescriptor.get.call(base);\n }\n return this.currentValue;\n },\n set(newValue) {\n if (!this.isAbortingSuspended) {\n this.isolateCallback(abort);\n }\n if (origDescriptor instanceof Object) {\n origDescriptor.set.call(base, newValue);\n } else {\n this.currentValue = newValue;\n }\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n var rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyRead(source, args) {\n function abortOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: function set() {}\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnPropertyWrite(source, args) {\n function abortOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function abortOnStackTrace(source, args) {\n function abortOnStackTrace(source, property, stack) {\n if (!property || !stack) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n throw new ReferenceError(rid);\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) {\n logMessage(source, \"Invalid parameter: \".concat(stack));\n return;\n }\n var descriptorWrapper = Object.assign(getDescriptorAddon(), {\n value: base[prop],\n get() {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n return this.value;\n },\n set(newValue) {\n if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) {\n abort();\n }\n this.value = newValue;\n }\n });\n setPropertyAccess(base, prop, {\n get() {\n return descriptorWrapper.get.call(descriptorWrapper);\n },\n set(newValue) {\n descriptorWrapper.set.call(descriptorWrapper, newValue);\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getDescriptorAddon() {\n return {\n isAbortingSuspended: false,\n isolateCallback(cb) {\n this.isAbortingSuspended = true;\n try {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result = cb(...args);\n this.isAbortingSuspended = false;\n return result;\n } catch (_unused) {\n var rid = randomId();\n this.isAbortingSuspended = false;\n throw new ReferenceError(rid);\n }\n }\n };\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n abortOnStackTrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetInterval(source, args) {\n function adjustSetInterval(source, matchCallback, matchDelay, boost) {\n var nativeSetInterval = window.setInterval;\n var matchRegexp = toRegExp(matchCallback);\n var intervalWrapper = function intervalWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetInterval.apply(window, [callback, delay, ...args]);\n };\n window.setInterval = intervalWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n var DEFAULT_MULTIPLIER = .05;\n var MIN_MULTIPLIER = .001;\n var MAX_MULTIPLIER = 50;\n var parsedBoost = parseFloat(boost);\n var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n var DEFAULT_DELAY = 1e3;\n var parsedDelay = parseInt(delay, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function adjustSetTimeout(source, args) {\n function adjustSetTimeout(source, matchCallback, matchDelay, boost) {\n var nativeSetTimeout = window.setTimeout;\n var matchRegexp = toRegExp(matchCallback);\n var timeoutWrapper = function timeoutWrapper(callback, delay) {\n if (!isValidCallback(callback)) {\n var message = \"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback), \"'\");\n logMessage(source, message);\n } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) {\n delay *= getBoostMultiplier(boost);\n hit(source);\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, delay, ...args]);\n };\n window.setTimeout = timeoutWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getBoostMultiplier(boost) {\n var DEFAULT_MULTIPLIER = .05;\n var MIN_MULTIPLIER = .001;\n var MAX_MULTIPLIER = 50;\n var parsedBoost = parseFloat(boost);\n var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost;\n if (boostMultiplier < MIN_MULTIPLIER) {\n boostMultiplier = MIN_MULTIPLIER;\n }\n if (boostMultiplier > MAX_MULTIPLIER) {\n boostMultiplier = MAX_MULTIPLIER;\n }\n return boostMultiplier;\n }\n function isDelayMatched(inputDelay, realDelay) {\n return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function getMatchDelay(delay) {\n var DEFAULT_DELAY = 1e3;\n var parsedDelay = parseInt(delay, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay;\n return delayMatch;\n }\n function shouldMatchAnyDelay(delay) {\n return delay === \"*\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n adjustSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugCurrentInlineScript(source, args) {\n function debugCurrentInlineScript(source, property, search) {\n var searchRegexp = toRegExp(search);\n var rid = randomId();\n var getCurrentScript = function getCurrentScript() {\n if (\"currentScript\" in document) {\n return document.currentScript;\n }\n var scripts = document.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n var ourScript = getCurrentScript();\n var abort = function abort() {\n var scriptEl = getCurrentScript();\n if (!scriptEl) {\n return;\n }\n var content = scriptEl.textContent;\n try {\n var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, \"textContent\").get;\n content = textContentGetter.call(scriptEl);\n } catch (e) {}\n if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) {\n hit(source);\n debugger;\n }\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (base instanceof Object === false && base === null) {\n var props = property.split(\".\");\n var propIndex = props.indexOf(prop);\n var baseName = props[propIndex - 1];\n var message = \"The scriptlet had been executed before the \".concat(baseName, \" was loaded.\");\n logMessage(message, source.verbose);\n return;\n }\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var currentValue = base[prop];\n setPropertyAccess(base, prop, {\n set: function set(value) {\n abort();\n currentValue = value;\n },\n get: function get() {\n abort();\n return currentValue;\n }\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugCurrentInlineScript.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyRead(source, args) {\n function debugOnPropertyRead(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n get: abort,\n set: noopFunc\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyRead.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function debugOnPropertyWrite(source, args) {\n function debugOnPropertyWrite(source, property) {\n if (!property) {\n return;\n }\n var rid = randomId();\n var abort = function abort() {\n hit(source);\n debugger;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n setPropertyAccess(base, prop, {\n set: abort\n });\n };\n setChainPropAccess(window, property);\n window.onerror = createOnErrorHandler(rid).bind();\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n debugOnPropertyWrite.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function dirString(source, args) {\n function dirString(source, times) {\n var _console = console,\n dir = _console.dir;\n function dirWrapper(object) {\n if (typeof dir === \"function\") {\n dir.call(this, object);\n }\n hit(source);\n }\n console.dir = dirWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n dirString.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function disableNewtabLinks(source, args) {\n function disableNewtabLinks(source) {\n document.addEventListener(\"click\", function (ev) {\n var target = ev.target;\n while (target !== null) {\n if (target.localName === \"a\" && target.hasAttribute(\"target\")) {\n ev.stopPropagation();\n ev.preventDefault();\n hit(source);\n break;\n }\n target = target.parentNode;\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n disableNewtabLinks.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function evalDataPrune(source, args) {\n function evalDataPrune(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== \"\" ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== \"\" ? requiredInitialProps.split(/ +/) : [];\n var evalWrapper = function evalWrapper(target, thisArg, args) {\n var data = Reflect.apply(target, thisArg, args);\n if (typeof data === \"object\") {\n data = jsonPruner(source, data, prunePaths, requiredPaths);\n }\n return data;\n };\n var evalHandler = {\n apply: evalWrapper\n };\n window.eval = new Proxy(window.eval, evalHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getWildcardPropertyInChain(base, chain) {\n var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n if (chain === \"*\" || chain === \"[]\") {\n for (var key in base) {\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base: base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base: base,\n prop: chain\n });\n }\n return output;\n }\n var prop = chain.slice(0, pos);\n var shouldLookThrough = prop === \"[]\" && Array.isArray(base) || prop === \"*\" && base instanceof Object;\n if (shouldLookThrough) {\n var nextProp = chain.slice(pos + 1);\n var baseKeys = Object.keys(base);\n baseKeys.forEach(function (key) {\n var item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isPruningNeeded(source, root, prunePaths, requiredPaths) {\n if (!root) {\n return false;\n }\n var shouldProcess;\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n var rootString = JSON.stringify(root);\n var matchRegex = toRegExp(requiredPaths.join(\"\"));\n var shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n var wildcardSymbols = [\".*.\", \"*.\", \".*\", \".[].\", \"[].\", \".[]\"];\n var _loop = function _loop() {\n var requiredPath = requiredPaths[i];\n var lastNestedPropName = requiredPath.split(\".\").pop();\n var hasWildcard = wildcardSymbols.some(function (symbol) {\n return requiredPath.includes(symbol);\n });\n var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n shouldProcess = !hasWildcard;\n for (var j = 0; j < details.length; j += 1) {\n var hasRequiredProp = typeof lastNestedPropName === \"string\" && details[j].base[lastNestedPropName] !== undefined;\n if (hasWildcard) {\n shouldProcess = hasRequiredProp || shouldProcess;\n } else {\n shouldProcess = hasRequiredProp && shouldProcess;\n }\n }\n };\n for (var i = 0; i < requiredPaths.length; i += 1) {\n _loop();\n }\n return shouldProcess;\n }\n function jsonPruner(source, root, prunePaths, requiredPaths) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) {\n return root;\n }\n prunePaths.forEach(function (path) {\n var ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n evalDataPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function forceWindowClose(source, args) {\n function forceWindowClose(source) {\n var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n if (typeof window.close !== \"function\") {\n var message = \"window.close() is not a function so 'close-window' scriptlet is unavailable\";\n logMessage(source, message);\n return;\n }\n var closeImmediately = function closeImmediately() {\n try {\n hit(source);\n window.close();\n } catch (e) {\n logMessage(source, e);\n }\n };\n var closeByExtension = function closeByExtension() {\n var extCall = function extCall() {\n dispatchEvent(new Event(\"adguard:scriptlet-close-window\"));\n };\n window.addEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n setTimeout(function () {\n window.removeEventListener(\"adguard:subscribed-to-close-window\", extCall, {\n once: true\n });\n }, 5e3);\n };\n var shouldClose = function shouldClose() {\n if (path === \"\") {\n return true;\n }\n var pathRegexp = toRegExp(path);\n var currentPath = \"\".concat(window.location.pathname).concat(window.location.search);\n return pathRegexp.test(currentPath);\n };\n if (shouldClose()) {\n closeImmediately();\n if (navigator.userAgent.includes(\"Chrome\")) {\n closeByExtension();\n }\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n forceWindowClose.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function hideInShadowDom(source, args) {\n function hideInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n var hideElement = function hideElement(targetElement) {\n var DISPLAY_NONE_CSS = \"display:none!important;\";\n targetElement.style.cssText = DISPLAY_NONE_CSS;\n };\n var hideHandler = function hideHandler() {\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n var _loop = function _loop() {\n var isHidden = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n hideElement(targetEl);\n isHidden = true;\n });\n if (isHidden) {\n hit(source);\n }\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n hideHandler();\n observeDOMChanges(hideHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n var hosts = [];\n if (rootElement) {\n var domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n }\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n var targets = [];\n var innerHostsAcc = [];\n hostElements.forEach(function (host) {\n var simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n var shadowRootElem = host.shadowRoot;\n var shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n var innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n var stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n var res = [];\n while (stack.length) {\n var next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n hideInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function injectCssInShadowDom(source, args) {\n function injectCssInShadowDom(source, cssRule) {\n var hostSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n if (!Element.prototype.attachShadow || typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n if (cssRule.match(/(url|image-set)\\(.*\\)/i)) {\n logMessage(source, '\"url()\" function is not allowed for css rules');\n return;\n }\n var callback = function callback(shadowRoot) {\n try {\n var stylesheet = new CSSStyleSheet();\n try {\n stylesheet.insertRule(cssRule);\n } catch (e) {\n logMessage(source, \"Unable to apply the rule '\".concat(cssRule, \"' due to: \\n'\").concat(e.message, \"'\"));\n return;\n }\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, stylesheet];\n } catch (_unused) {\n var styleTag = document.createElement(\"style\");\n styleTag.innerText = cssRule;\n shadowRoot.appendChild(styleTag);\n }\n hit(source);\n };\n hijackAttachShadow(window, hostSelector, callback);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function hijackAttachShadow(context, hostSelector, callback) {\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var shadowRoot = Reflect.apply(target, thisArg, args);\n if (thisArg && thisArg.matches(hostSelector || \"*\")) {\n callback(shadowRoot);\n }\n return shadowRoot;\n };\n var attachShadowHandler = {\n apply: handlerWrapper\n };\n context.Element.prototype.attachShadow = new Proxy(context.Element.prototype.attachShadow, attachShadowHandler);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n injectCssInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function jsonPrune(source, args) {\n function jsonPrune(source, propsToRemove, requiredInitialProps, stack) {\n if (!!stack && !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var prunePaths = propsToRemove !== undefined && propsToRemove !== \"\" ? propsToRemove.split(/ +/) : [];\n var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== \"\" ? requiredInitialProps.split(/ +/) : [];\n var nativeJSONParse = JSON.parse;\n var jsonParseWrapper = function jsonParseWrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var root = nativeJSONParse.apply(JSON, args);\n return jsonPruner(source, root, prunePaths, requiredPaths);\n };\n jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse);\n JSON.parse = jsonParseWrapper;\n var nativeResponseJson = Response.prototype.json;\n var responseJsonWrapper = function responseJsonWrapper() {\n var promise = nativeResponseJson.apply(this);\n return promise.then(function (obj) {\n return jsonPruner(source, obj, prunePaths, requiredPaths);\n });\n };\n if (typeof Response === \"undefined\") {\n return;\n }\n Response.prototype.json = responseJsonWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function getWildcardPropertyInChain(base, chain) {\n var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n if (chain === \"*\" || chain === \"[]\") {\n for (var key in base) {\n if (Object.prototype.hasOwnProperty.call(base, key)) {\n output.push({\n base: base,\n prop: key\n });\n }\n }\n } else {\n output.push({\n base: base,\n prop: chain\n });\n }\n return output;\n }\n var prop = chain.slice(0, pos);\n var shouldLookThrough = prop === \"[]\" && Array.isArray(base) || prop === \"*\" && base instanceof Object;\n if (shouldLookThrough) {\n var nextProp = chain.slice(pos + 1);\n var baseKeys = Object.keys(base);\n baseKeys.forEach(function (key) {\n var item = base[key];\n getWildcardPropertyInChain(item, nextProp, lookThrough, output);\n });\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if (nextBase !== undefined) {\n getWildcardPropertyInChain(nextBase, chain, lookThrough, output);\n }\n return output;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isPruningNeeded(source, root, prunePaths, requiredPaths) {\n if (!root) {\n return false;\n }\n var shouldProcess;\n if (prunePaths.length === 0 && requiredPaths.length > 0) {\n var rootString = JSON.stringify(root);\n var matchRegex = toRegExp(requiredPaths.join(\"\"));\n var shouldLog = matchRegex.test(rootString);\n if (shouldLog) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n shouldProcess = false;\n return shouldProcess;\n }\n }\n var wildcardSymbols = [\".*.\", \"*.\", \".*\", \".[].\", \"[].\", \".[]\"];\n var _loop = function _loop() {\n var requiredPath = requiredPaths[i];\n var lastNestedPropName = requiredPath.split(\".\").pop();\n var hasWildcard = wildcardSymbols.some(function (symbol) {\n return requiredPath.includes(symbol);\n });\n var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard);\n shouldProcess = !hasWildcard;\n for (var j = 0; j < details.length; j += 1) {\n var hasRequiredProp = typeof lastNestedPropName === \"string\" && details[j].base[lastNestedPropName] !== undefined;\n if (hasWildcard) {\n shouldProcess = hasRequiredProp || shouldProcess;\n } else {\n shouldProcess = hasRequiredProp && shouldProcess;\n }\n }\n };\n for (var i = 0; i < requiredPaths.length; i += 1) {\n _loop();\n }\n return shouldProcess;\n }\n function jsonPruner(source, root, prunePaths, requiredPaths) {\n if (prunePaths.length === 0 && requiredPaths.length === 0) {\n logMessage(source, \"\".concat(window.location.hostname, \"\\n\").concat(JSON.stringify(root, null, 2)), true);\n if (root && typeof root === \"object\") {\n logMessage(source, root, true, false);\n }\n return root;\n }\n try {\n if (isPruningNeeded(source, root, prunePaths, requiredPaths) === false) {\n return root;\n }\n prunePaths.forEach(function (path) {\n var ownerObjArr = getWildcardPropertyInChain(root, path, true);\n ownerObjArr.forEach(function (ownerObj) {\n if (ownerObj !== undefined && ownerObj.base) {\n delete ownerObj.base[ownerObj.prop];\n hit(source);\n }\n });\n });\n } catch (e) {\n logMessage(source, e);\n }\n return root;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n jsonPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function log(source, args) {\n function log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n console.log(args);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n log.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logAddEventListener(source, args) {\n function logAddEventListener(source) {\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n if (validateType(type) && validateListener(listener)) {\n var message = 'addEventListener(\"'.concat(type, '\", ').concat(listenerToString(listener), \")\");\n logMessage(source, message, true);\n hit(source);\n } else {\n var _message = \"Invalid event type or listener passed to addEventListener:\\n type: \".concat(convertTypeToString(type), \"\\n listener: \").concat(convertTypeToString(listener));\n logMessage(source, _message, true);\n }\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && \"handleEvent\" in listener && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n function convertTypeToString(value) {\n var output;\n if (typeof value === \"undefined\") {\n output = \"undefined\";\n } else if (typeof value === \"object\") {\n if (value === null) {\n output = \"null\";\n } else {\n output = objectToString(value);\n }\n } else {\n output = value.toString();\n }\n return output;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logEval(source, args) {\n function logEval(source) {\n var nativeEval = window.eval;\n function evalWrapper(str) {\n hit(source);\n logMessage(source, 'eval(\"'.concat(str, '\")'), true);\n return nativeEval(str);\n }\n window.eval = evalWrapper;\n var nativeFunction = window.Function;\n function FunctionWrapper() {\n hit(source);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n logMessage(source, \"new Function(\".concat(args.join(\", \"), \")\"), true);\n return nativeFunction.apply(this, [...args]);\n }\n FunctionWrapper.prototype = Object.create(nativeFunction.prototype);\n FunctionWrapper.prototype.constructor = FunctionWrapper;\n window.Function = FunctionWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logEval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function logOnStacktrace(source, args) {\n function logOnStacktrace(source, property) {\n if (!property) {\n return;\n }\n var refineStackTrace = function refineStackTrace(stackString) {\n var stackSteps = stackString.split(\"\\n\").slice(2).map(function (line) {\n return line.replace(/ {4}at /, \"\");\n });\n var logInfoArray = stackSteps.map(function (line) {\n var funcName;\n var funcFullPath;\n var reg = /\\(([^\\)]+)\\)/;\n var regFirefox = /(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;\n if (line.match(reg)) {\n funcName = line.split(\" \").slice(0, -1).join(\" \");\n funcFullPath = line.match(reg)[1];\n } else if (line.match(regFirefox)) {\n funcName = line.split(\"@\").slice(0, -1).join(\" \");\n funcFullPath = line.match(regFirefox)[2];\n } else {\n funcName = \"function name is not available\";\n funcFullPath = line;\n }\n return [funcName, funcFullPath];\n });\n var logInfoObject = {};\n logInfoArray.forEach(function (pair) {\n logInfoObject[pair[0]] = pair[1];\n });\n return logInfoObject;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n if (chain) {\n var setter = function setter(a) {\n base = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n };\n Object.defineProperty(owner, prop, {\n get: function get() {\n return base;\n },\n set: setter\n });\n return;\n }\n var value = base[prop];\n setPropertyAccess(base, prop, {\n get() {\n hit(source);\n logMessage(source, \"Get \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n return value;\n },\n set(newValue) {\n hit(source);\n logMessage(source, \"Set \".concat(prop), true);\n console.table(refineStackTrace(new Error().stack));\n value = newValue;\n }\n });\n };\n setChainPropAccess(window, property);\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n logOnStacktrace.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function m3uPrune(source, args) {\n function m3uPrune(source, propsToRemove) {\n var urlToMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var SEGMENT_MARKER = \"#\";\n var AD_MARKER = {\n ASSET: \"#EXT-X-ASSET:\",\n CUE: \"#EXT-X-CUE:\",\n CUE_IN: \"#EXT-X-CUE-IN\",\n DISCONTINUITY: \"#EXT-X-DISCONTINUITY\",\n EXTINF: \"#EXTINF\",\n EXTM3U: \"#EXTM3U\",\n SCTE35: \"#EXT-X-SCTE35:\"\n };\n var COMCAST_AD_MARKER = {\n AD: \"-AD-\",\n VAST: \"-VAST-\",\n VMAP_AD: \"-VMAP-AD-\",\n VMAP_AD_BREAK: \"#EXT-X-VMAP-AD-BREAK:\"\n };\n var TAGS_ALLOWLIST = [\"#EXT-X-TARGETDURATION\", \"#EXT-X-MEDIA-SEQUENCE\", \"#EXT-X-DISCONTINUITY-SEQUENCE\", \"#EXT-X-ENDLIST\", \"#EXT-X-PLAYLIST-TYPE\", \"#EXT-X-I-FRAMES-ONLY\", \"#EXT-X-MEDIA\", \"#EXT-X-STREAM-INF\", \"#EXT-X-I-FRAME-STREAM-INF\", \"#EXT-X-SESSION-DATA\", \"#EXT-X-SESSION-KEY\", \"#EXT-X-INDEPENDENT-SEGMENTS\", \"#EXT-X-START\"];\n var isAllowedTag = function isAllowedTag(str) {\n return TAGS_ALLOWLIST.some(function (el) {\n return str.startsWith(el);\n });\n };\n var pruneExtinfFromVmapBlock = function pruneExtinfFromVmapBlock(lines, i) {\n var array = lines.slice();\n var index = i;\n if (array[index].includes(AD_MARKER.EXTINF)) {\n array[index] = undefined;\n index += 1;\n if (array[index].includes(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n index += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, index);\n array = prunedExtinf.array;\n index = prunedExtinf.index;\n }\n }\n return {\n array: array,\n index: index\n };\n };\n var pruneVmapBlock = function pruneVmapBlock(lines) {\n var array = lines.slice();\n for (var i = 0; i < array.length - 1; i += 1) {\n if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) || array[i].includes(COMCAST_AD_MARKER.VAST) || array[i].includes(COMCAST_AD_MARKER.AD)) {\n array[i] = undefined;\n if (array[i + 1].includes(AD_MARKER.EXTINF)) {\n i += 1;\n var prunedExtinf = pruneExtinfFromVmapBlock(array, i);\n array = prunedExtinf.array;\n i = prunedExtinf.index - 1;\n }\n }\n }\n return array;\n };\n var pruneSpliceoutBlock = function pruneSpliceoutBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.CUE)) {\n return line;\n }\n line = undefined;\n index += 1;\n if (array[index].startsWith(AD_MARKER.ASSET)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.CUE_IN)) {\n array[index] = undefined;\n index += 1;\n }\n if (array[index].startsWith(AD_MARKER.SCTE35)) {\n array[index] = undefined;\n }\n return line;\n };\n var removeM3ULineRegexp = toRegExp(propsToRemove);\n var pruneInfBlock = function pruneInfBlock(line, index, array) {\n if (!line.startsWith(AD_MARKER.EXTINF)) {\n return line;\n }\n if (!removeM3ULineRegexp.test(array[index + 1])) {\n return line;\n }\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (!isAllowedTag(array[index])) {\n array[index] = undefined;\n }\n index += 1;\n if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) {\n array[index] = undefined;\n }\n return line;\n };\n var pruneSegments = function pruneSegments(lines) {\n for (var i = 0; i < lines.length - 1; i += 1) {\n var _lines$i;\n if ((_lines$i = lines[i]) !== null && _lines$i !== void 0 && _lines$i.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) {\n var segmentName = lines[i].substring(0, lines[i].indexOf(\":\"));\n if (!segmentName) {\n return lines;\n }\n lines[i] = undefined;\n i += 1;\n for (var j = i; j < lines.length; j += 1) {\n if (!lines[j].includes(segmentName) && !isAllowedTag(lines[j])) {\n lines[j] = undefined;\n } else {\n i = j - 1;\n break;\n }\n }\n }\n }\n return lines;\n };\n var isM3U = function isM3U(text) {\n if (typeof text === \"string\") {\n var trimmedText = text.trim();\n return trimmedText.startsWith(AD_MARKER.EXTM3U) || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK);\n }\n return false;\n };\n var isPruningNeeded = function isPruningNeeded(text, regexp) {\n return isM3U(text) && regexp.test(text);\n };\n var pruneM3U = function pruneM3U(text) {\n var lines = text.split(/\\n\\r|\\n|\\r/);\n if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) {\n lines = pruneVmapBlock(lines);\n return lines.filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n }\n lines = pruneSegments(lines);\n return lines.map(function (line, index, array) {\n if (typeof line === \"undefined\") {\n return line;\n }\n line = pruneSpliceoutBlock(line, index, array);\n if (typeof line !== \"undefined\") {\n line = pruneInfBlock(line, index, array);\n }\n return line;\n }).filter(function (l) {\n return !!l;\n }).join(\"\\n\");\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = [\"\", \"text\"];\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n var content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n if (!propsToRemove) {\n if (isM3U(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp);\n }\n var responseContent = shouldPruneResponse ? pruneM3U(response) : response;\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n var clonedResponse = response.clone();\n var responseText = await response.text();\n if (!propsToRemove && isM3U(responseText)) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n return clonedResponse;\n }\n if (isPruningNeeded(responseText, removeM3ULineRegexp)) {\n var prunedText = pruneM3U(responseText);\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n m3uPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noTopics(source, args) {\n function noTopics(source) {\n var TOPICS_PROPERTY_NAME = \"browsingTopics\";\n if (Document instanceof Object === false) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) {\n return;\n }\n Document.prototype[TOPICS_PROPERTY_NAME] = function () {\n return noopPromiseResolve(\"[]\");\n };\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noTopics.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function noeval(source, args) {\n function noeval(source) {\n window.eval = function evalWrapper(s) {\n hit(source);\n logMessage(source, \"AdGuard has prevented eval:\\n\".concat(s), true);\n }.bind();\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n noeval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function nowebrtc(source, args) {\n function nowebrtc(source) {\n var propertyName = \"\";\n if (window.RTCPeerConnection) {\n propertyName = \"RTCPeerConnection\";\n } else if (window.webkitRTCPeerConnection) {\n propertyName = \"webkitRTCPeerConnection\";\n }\n if (propertyName === \"\") {\n return;\n }\n var rtcReplacement = function rtcReplacement(config) {\n var message = \"Document tried to create an RTCPeerConnection: \".concat(convertRtcConfigToString(config));\n logMessage(source, message);\n hit(source);\n };\n rtcReplacement.prototype = {\n close: noopFunc,\n createDataChannel: noopFunc,\n createOffer: noopFunc,\n setRemoteDescription: noopFunc\n };\n var rtc = window[propertyName];\n window[propertyName] = rtcReplacement;\n if (rtc.prototype) {\n rtc.prototype.createDataChannel = function (a, b) {\n return {\n close: noopFunc,\n send: noopFunc\n };\n }.bind(null);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function convertRtcConfigToString(config) {\n var UNDEF_STR = \"undefined\";\n var str = UNDEF_STR;\n if (config === null) {\n str = \"null\";\n } else if (config instanceof Object) {\n var SERVERS_PROP_NAME = \"iceServers\";\n var URLS_PROP_NAME = \"urls\";\n if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && config[SERVERS_PROP_NAME] && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) {\n str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString();\n }\n }\n return str;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n nowebrtc.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAddEventListener(source, args) {\n function preventAddEventListener(source, typeSearch, listenerSearch) {\n var typeSearchRegexp = toRegExp(typeSearch);\n var listenerSearchRegexp = toRegExp(listenerSearch);\n var nativeAddEventListener = window.EventTarget.prototype.addEventListener;\n function addEventListenerWrapper(type, listener) {\n var _this$constructor;\n var shouldPrevent = false;\n if (validateType(type) && validateListener(listener)) {\n shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener));\n }\n if (shouldPrevent) {\n hit(source);\n return undefined;\n }\n var context = this;\n if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === \"Window\" && this !== window) {\n context = window;\n }\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return nativeAddEventListener.apply(context, [type, listener, ...args]);\n }\n var descriptor = {\n configurable: true,\n set: function set() {},\n get: function get() {\n return addEventListenerWrapper;\n }\n };\n Object.defineProperty(window.EventTarget.prototype, \"addEventListener\", descriptor);\n Object.defineProperty(window, \"addEventListener\", descriptor);\n Object.defineProperty(document, \"addEventListener\", descriptor);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function validateType(type) {\n return typeof type !== \"undefined\";\n }\n function validateListener(listener) {\n return typeof listener !== \"undefined\" && (typeof listener === \"function\" || typeof listener === \"object\" && listener !== null && \"handleEvent\" in listener && typeof listener.handleEvent === \"function\");\n }\n function listenerToString(listener) {\n return typeof listener === \"function\" ? listener.toString() : listener.handleEvent.toString();\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAddEventListener.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventAdfly(source, args) {\n function preventAdfly(source) {\n var isDigit = function isDigit(data) {\n return /^\\d$/.test(data);\n };\n var handler = function handler(encodedURL) {\n var evenChars = \"\";\n var oddChars = \"\";\n for (var i = 0; i < encodedURL.length; i += 1) {\n if (i % 2 === 0) {\n evenChars += encodedURL.charAt(i);\n } else {\n oddChars = encodedURL.charAt(i) + oddChars;\n }\n }\n var data = (evenChars + oddChars).split(\"\");\n for (var _i = 0; _i < data.length; _i += 1) {\n if (isDigit(data[_i])) {\n for (var ii = _i + 1; ii < data.length; ii += 1) {\n if (isDigit(data[ii])) {\n var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10);\n if (temp < 10) {\n data[_i] = temp.toString();\n }\n _i = ii;\n break;\n }\n }\n }\n }\n data = data.join(\"\");\n var decodedURL = window.atob(data).slice(16, -16);\n if (window.stop) {\n window.stop();\n }\n window.onbeforeunload = null;\n window.location.href = decodedURL;\n };\n var val;\n var applyHandler = true;\n var result = setPropertyAccess(window, \"ysmm\", {\n configurable: false,\n set: function set(value) {\n if (applyHandler) {\n applyHandler = false;\n try {\n if (typeof value === \"string\") {\n handler(value);\n }\n } catch (err) {}\n }\n val = value;\n },\n get: function get() {\n return val;\n }\n });\n if (result) {\n hit(source);\n } else {\n logMessage(source, \"Failed to set up prevent-adfly scriptlet\");\n }\n }\n function setPropertyAccess(object, property, descriptor) {\n var currentDescriptor = Object.getOwnPropertyDescriptor(object, property);\n if (currentDescriptor && !currentDescriptor.configurable) {\n return false;\n }\n Object.defineProperty(object, property, descriptor);\n return true;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventAdfly.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventBab(source, args) {\n function preventBab(source) {\n var nativeSetTimeout = window.setTimeout;\n var babRegex = /\\.bab_elementid.$/;\n var timeoutWrapper = function timeoutWrapper(callback) {\n if (typeof callback !== \"string\" || !babRegex.test(callback)) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeSetTimeout.apply(window, [callback, ...args]);\n }\n hit(source);\n };\n window.setTimeout = timeoutWrapper;\n var signatures = [[\"blockadblock\"], [\"babasbm\"], [/getItem\\('babn'\\)/], [\"getElementById\", \"String.fromCharCode\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\", \"charAt\", \"DOMContentLoaded\", \"AdBlock\", \"addEventListener\", \"doScroll\", \"fromCharCode\", \"<<2|r>>4\", \"sessionStorage\", \"clientWidth\", \"localStorage\", \"Math\", \"random\"]];\n var check = function check(str) {\n if (typeof str !== \"string\") {\n return false;\n }\n for (var i = 0; i < signatures.length; i += 1) {\n var tokens = signatures[i];\n var match = 0;\n for (var j = 0; j < tokens.length; j += 1) {\n var token = tokens[j];\n var found = token instanceof RegExp ? token.test(str) : str.includes(token);\n if (found) {\n match += 1;\n }\n }\n if (match / tokens.length >= .8) {\n return true;\n }\n }\n return false;\n };\n var nativeEval = window.eval;\n var evalWrapper = function evalWrapper(str) {\n if (!check(str)) {\n return nativeEval(str);\n }\n hit(source);\n var bodyEl = document.body;\n if (bodyEl) {\n bodyEl.style.removeProperty(\"visibility\");\n }\n var el = document.getElementById(\"babasbmsgx\");\n if (el) {\n el.parentNode.removeChild(el);\n }\n };\n window.eval = evalWrapper.bind(window);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventBab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventElementSrcLoading(source, args) {\n function preventElementSrcLoading(source, tagName, match) {\n if (typeof Proxy === \"undefined\" || typeof Reflect === \"undefined\") {\n return;\n }\n var srcMockData = {\n script: \"data:text/javascript;base64,KCk9Pnt9\",\n img: \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",\n iframe: \"data:text/html;base64, PGRpdj48L2Rpdj4=\",\n link: \"data:text/plain;base64,\"\n };\n var instance;\n if (tagName === \"script\") {\n instance = HTMLScriptElement;\n } else if (tagName === \"img\") {\n instance = HTMLImageElement;\n } else if (tagName === \"iframe\") {\n instance = HTMLIFrameElement;\n } else if (tagName === \"link\") {\n instance = HTMLLinkElement;\n } else {\n return;\n }\n var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === \"function\";\n var policy;\n if (hasTrustedTypes) {\n policy = window.trustedTypes.createPolicy(\"AGPolicy\", {\n createScriptURL: function createScriptURL(arg) {\n return arg;\n }\n });\n }\n var SOURCE_PROPERTY_NAME = tagName === \"link\" ? \"href\" : \"src\";\n var ONERROR_PROPERTY_NAME = \"onerror\";\n var searchRegexp = toRegExp(match);\n var setMatchedAttribute = function setMatchedAttribute(elem) {\n return elem.setAttribute(source.name, \"matched\");\n };\n var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) {\n if (!args[0] || !args[1]) {\n return Reflect.apply(target, thisArg, args);\n }\n var nodeName = thisArg.nodeName.toLowerCase();\n var attrName = args[0].toLowerCase();\n var attrValue = args[1];\n var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue);\n if (!isMatched) {\n return Reflect.apply(target, thisArg, args);\n }\n hit(source);\n setMatchedAttribute(thisArg);\n return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]);\n };\n var setAttributeHandler = {\n apply: setAttributeWrapper\n };\n instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler);\n var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME);\n if (!origSrcDescriptor) {\n return;\n }\n Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origSrcDescriptor.get.call(this);\n },\n set(urlValue) {\n var nodeName = this.nodeName.toLowerCase();\n var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue);\n if (!isMatched) {\n origSrcDescriptor.set.call(this, urlValue);\n return true;\n }\n if (policy && urlValue instanceof TrustedScriptURL) {\n var trustedSrc = policy.createScriptURL(urlValue);\n origSrcDescriptor.set.call(this, trustedSrc);\n hit(source);\n return;\n }\n setMatchedAttribute(this);\n origSrcDescriptor.set.call(this, srcMockData[nodeName]);\n hit(source);\n }\n });\n var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME);\n if (!origOnerrorDescriptor) {\n return;\n }\n Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, {\n enumerable: true,\n configurable: true,\n get() {\n return origOnerrorDescriptor.get.call(this);\n },\n set(cb) {\n var isMatched = this.getAttribute(source.name) === \"matched\";\n if (!isMatched) {\n origOnerrorDescriptor.set.call(this, cb);\n return true;\n }\n origOnerrorDescriptor.set.call(this, noopFunc);\n return true;\n }\n });\n var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) {\n if (!args[0] || !args[1] || !thisArg) {\n return Reflect.apply(target, thisArg, args);\n }\n var eventName = args[0];\n var isMatched = typeof thisArg.getAttribute === \"function\" && thisArg.getAttribute(source.name) === \"matched\" && eventName === \"error\";\n if (isMatched) {\n return Reflect.apply(target, thisArg, [eventName, noopFunc]);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var addEventListenerHandler = {\n apply: addEventListenerWrapper\n };\n EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler);\n var preventInlineOnerror = function preventInlineOnerror(tagName, src) {\n window.addEventListener(\"error\", function (event) {\n if (!event.target || !event.target.nodeName || event.target.nodeName.toLowerCase() !== tagName || !event.target.src || !src.test(event.target.src)) {\n return;\n }\n hit(source);\n if (typeof event.target.onload === \"function\") {\n event.target.onerror = event.target.onload;\n return;\n }\n event.target.onerror = noopFunc;\n }, true);\n };\n preventInlineOnerror(tagName, searchRegexp);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function safeGetDescriptor(obj, prop) {\n var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor && descriptor.configurable) {\n return descriptor;\n }\n return null;\n }\n function noopFunc() {}\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventElementSrcLoading.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventEvalIf(source, args) {\n function preventEvalIf(source, search) {\n var searchRegexp = toRegExp(search);\n var nativeEval = window.eval;\n window.eval = function (payload) {\n if (!searchRegexp.test(payload.toString())) {\n return nativeEval.call(window, payload);\n }\n hit(source);\n return undefined;\n }.bind(window);\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventEvalIf.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFab(source, args) {\n function preventFab(source) {\n hit(source);\n var Fab = function Fab() {};\n Fab.prototype.check = noopFunc;\n Fab.prototype.clearEvent = noopFunc;\n Fab.prototype.emitEvent = noopFunc;\n Fab.prototype.on = function (a, b) {\n if (!a) {\n b();\n }\n return this;\n };\n Fab.prototype.onDetected = noopThis;\n Fab.prototype.onNotDetected = function (a) {\n a();\n return this;\n };\n Fab.prototype.setOption = noopFunc;\n Fab.prototype.options = {\n set: noopFunc,\n get: noopFunc\n };\n var fab = new Fab();\n var getSetFab = {\n get() {\n return Fab;\n },\n set() {}\n };\n var getsetfab = {\n get() {\n return fab;\n },\n set() {}\n };\n if (Object.prototype.hasOwnProperty.call(window, \"FuckAdBlock\")) {\n window.FuckAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"FuckAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"BlockAdBlock\")) {\n window.BlockAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"BlockAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"SniffAdBlock\")) {\n window.SniffAdBlock = Fab;\n } else {\n Object.defineProperty(window, \"SniffAdBlock\", getSetFab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"fuckAdBlock\")) {\n window.fuckAdBlock = fab;\n } else {\n Object.defineProperty(window, \"fuckAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"blockAdBlock\")) {\n window.blockAdBlock = fab;\n } else {\n Object.defineProperty(window, \"blockAdBlock\", getsetfab);\n }\n if (Object.prototype.hasOwnProperty.call(window, \"sniffAdBlock\")) {\n window.sniffAdBlock = fab;\n } else {\n Object.defineProperty(window, \"sniffAdBlock\", getsetfab);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function noopThis() {\n return this;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFab.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventFetch(source, args) {\n function preventFetch(source, propsToMatch) {\n var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"emptyObj\";\n var responseType = arguments.length > 3 ? arguments[3] : undefined;\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n var strResponseBody;\n if (responseBody === \"\" || responseBody === \"emptyObj\") {\n strResponseBody = \"{}\";\n } else if (responseBody === \"emptyArr\") {\n strResponseBody = \"[]\";\n } else {\n logMessage(source, \"Invalid responseBody parameter: '\".concat(responseBody, \"'\"));\n return;\n }\n var isResponseTypeSpecified = typeof responseType !== \"undefined\";\n var isResponseTypeSupported = function isResponseTypeSupported(responseType) {\n var SUPPORTED_TYPES = [\"default\", \"opaque\"];\n return SUPPORTED_TYPES.includes(responseType);\n };\n if (isResponseTypeSpecified && !isResponseTypeSupported(responseType)) {\n logMessage(source, \"Invalid responseType parameter: '\".concat(responseType, \"'\"));\n return;\n }\n var handlerWrapper = async function handlerWrapper(target, thisArg, args) {\n var shouldPrevent = false;\n var fetchData = getFetchData(args);\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldPrevent = matchRequestProps(source, propsToMatch, fetchData);\n if (shouldPrevent) {\n hit(source);\n try {\n var origResponse = await Reflect.apply(target, thisArg, args);\n if (!origResponse.ok) {\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n return modifyResponse(origResponse, {\n body: strResponseBody,\n type: responseType\n });\n } catch (ex) {\n return noopPromiseResolve(strResponseBody, fetchData.url, responseType);\n }\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getFetchData(args) {\n var fetchPropsObj = {};\n var fetchUrl;\n var fetchInit;\n if (args[0] instanceof Request) {\n var requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n var props = Object.keys(fetchInit);\n props.forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function modifyResponse(origResponse) {\n var _origResponse$headers;\n var replacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n body: \"{}\"\n };\n var headers = {};\n origResponse === null || origResponse === void 0 ? void 0 : (_origResponse$headers = origResponse.headers) === null || _origResponse$headers === void 0 ? void 0 : _origResponse$headers.forEach(function (value, key) {\n headers[key] = value;\n });\n var modifiedResponse = new Response(replacement.body, {\n status: origResponse.status,\n statusText: origResponse.statusText,\n headers: headers\n });\n Object.defineProperties(modifiedResponse, {\n url: {\n value: origResponse.url\n },\n type: {\n value: replacement.type || origResponse.type\n }\n });\n return modifiedResponse;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n var requestInitOptions = getRequestProps();\n var entries = requestInitOptions.map(function (key) {\n var value = request[key];\n return [key, value];\n });\n return Object.fromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventFetch.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventPopadsNet(source, args) {\n function preventPopadsNet(source) {\n var rid = randomId();\n var throwError = function throwError() {\n throw new ReferenceError(rid);\n };\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n set: throwError\n },\n popns: {\n set: throwError\n }\n });\n window.onerror = createOnErrorHandler(rid).bind();\n hit(source);\n }\n function createOnErrorHandler(rid) {\n var nativeOnError = window.onerror;\n return function onError(error) {\n if (typeof error === \"string\" && error.includes(rid)) {\n return true;\n }\n if (nativeOnError instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeOnError.apply(window, [error, ...args]);\n }\n return false;\n };\n }\n function randomId() {\n return Math.random().toString(36).slice(2, 9);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventPopadsNet.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRefresh(source, args) {\n function preventRefresh(source, delaySec) {\n var getMetaElements = function getMetaElements() {\n var metaNodes = [];\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]');\n } catch (e) {\n try {\n metaNodes = document.querySelectorAll('meta[http-equiv=\"refresh\"][content]');\n } catch (e) {\n logMessage(source, e);\n }\n }\n return Array.from(metaNodes);\n };\n var getMetaContentDelay = function getMetaContentDelay(metaElements) {\n var delays = metaElements.map(function (meta) {\n var contentString = meta.getAttribute(\"content\");\n if (contentString.length === 0) {\n return null;\n }\n var contentDelay;\n var limiterIndex = contentString.indexOf(\";\");\n if (limiterIndex !== -1) {\n var delaySubstring = contentString.substring(0, limiterIndex);\n contentDelay = getNumberFromString(delaySubstring);\n } else {\n contentDelay = getNumberFromString(contentString);\n }\n return contentDelay;\n }).filter(function (delay) {\n return delay !== null;\n });\n if (!delays.length) {\n return null;\n }\n var minDelay = delays.reduce(function (a, b) {\n return Math.min(a, b);\n });\n return minDelay;\n };\n var stop = function stop() {\n var metaElements = getMetaElements();\n if (metaElements.length === 0) {\n return;\n }\n var secondsToRun = getNumberFromString(delaySec);\n if (secondsToRun === null) {\n secondsToRun = getMetaContentDelay(metaElements);\n }\n if (secondsToRun === null) {\n return;\n }\n var delayMs = secondsToRun * 1e3;\n setTimeout(function () {\n window.stop();\n hit(source);\n }, delayMs);\n };\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", stop, {\n once: true\n });\n } else {\n stop();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRefresh.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventRequestAnimationFrame(source, args) {\n function preventRequestAnimationFrame(source, match) {\n var nativeRequestAnimationFrame = window.requestAnimationFrame;\n var shouldLog = typeof match === \"undefined\";\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var rafWrapper = function rafWrapper(callback) {\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"requestAnimationFrame(\".concat(String(callback), \")\"), true);\n } else if (isValidCallback(callback) && isValidStrPattern(match)) {\n shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch;\n }\n if (shouldPrevent) {\n hit(source);\n return nativeRequestAnimationFrame(noopFunc);\n }\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return nativeRequestAnimationFrame.apply(window, [callback, ...args]);\n };\n window.requestAnimationFrame = rafWrapper;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventRequestAnimationFrame.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetInterval(source, args) {\n function preventSetInterval(source, matchCallback, matchDelay) {\n var shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setInterval(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setIntervalHandler = {\n apply: handlerWrapper\n };\n window.setInterval = new Proxy(window.setInterval, setIntervalHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n var callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n var _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n var parsedDelay = parseRawDelay(delay);\n var shouldPrevent = false;\n var callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n var INVERT_MARKER = \"!\";\n var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER);\n var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n var parsedDelay = parseInt(delayValue, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n var num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n var parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetInterval.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventSetTimeout(source, args) {\n function preventSetTimeout(source, matchCallback, matchDelay) {\n var shouldLog = typeof matchCallback === \"undefined\" && typeof matchDelay === \"undefined\";\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n var callback = args[0];\n var delay = args[1];\n var shouldPrevent = false;\n if (shouldLog) {\n hit(source);\n logMessage(source, \"setTimeout(\".concat(String(callback), \", \").concat(delay, \")\"), true);\n } else {\n shouldPrevent = isPreventionNeeded({\n callback: callback,\n delay: delay,\n matchCallback: matchCallback,\n matchDelay: matchDelay\n });\n }\n if (shouldPrevent) {\n hit(source);\n args[0] = noopFunc;\n }\n return target.apply(thisArg, args);\n };\n var setTimeoutHandler = {\n apply: handlerWrapper\n };\n window.setTimeout = new Proxy(window.setTimeout, setTimeoutHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function noopFunc() {}\n function isPreventionNeeded(_ref) {\n var callback = _ref.callback,\n delay = _ref.delay,\n matchCallback = _ref.matchCallback,\n matchDelay = _ref.matchDelay;\n if (!isValidCallback(callback)) {\n return false;\n }\n if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) {\n return false;\n }\n var _parseMatchArg = parseMatchArg(matchCallback),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n var _parseDelayArg = parseDelayArg(matchDelay),\n isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch,\n delayMatch = _parseDelayArg.delayMatch;\n var parsedDelay = parseRawDelay(delay);\n var shouldPrevent = false;\n var callbackStr = String(callback);\n if (delayMatch === null) {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch;\n } else if (!matchCallback) {\n shouldPrevent = parsedDelay === delayMatch !== isInvertedDelayMatch;\n } else {\n shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && parsedDelay === delayMatch !== isInvertedDelayMatch;\n }\n return shouldPrevent;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function parseDelayArg(delay) {\n var INVERT_MARKER = \"!\";\n var isInvertedDelayMatch = delay === null || delay === void 0 ? void 0 : delay.startsWith(INVERT_MARKER);\n var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay;\n var parsedDelay = parseInt(delayValue, 10);\n var delayMatch = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return {\n isInvertedDelayMatch: isInvertedDelayMatch,\n delayMatch: delayMatch\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isValidCallback(callback) {\n return callback instanceof Function || typeof callback === \"string\";\n }\n function isValidMatchStr(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function isValidMatchNumber(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n var num = parseFloat(str);\n return !nativeIsNaN(num) && nativeIsFinite(num);\n }\n function parseRawDelay(delay) {\n var parsedDelay = Math.floor(parseInt(delay, 10));\n return typeof parsedDelay === \"number\" && !nativeIsNaN(parsedDelay) ? parsedDelay : delay;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventSetTimeout.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventWindowOpen(source, args) {\n function preventWindowOpen(source) {\n var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"*\";\n var delay = arguments.length > 2 ? arguments[2] : undefined;\n var replacement = arguments.length > 3 ? arguments[3] : undefined;\n var nativeOpen = window.open;\n var isNewSyntax = match !== \"0\" && match !== \"1\";\n var oldOpenWrapper = function oldOpenWrapper(str) {\n match = Number(match) > 0;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (!isValidStrPattern(delay)) {\n logMessage(source, \"Invalid parameter: \".concat(delay));\n return nativeOpen.apply(window, [str, ...args]);\n }\n var searchRegexp = toRegExp(delay);\n if (match !== searchRegexp.test(str)) {\n return nativeOpen.apply(window, [str, ...args]);\n }\n hit(source);\n return handleOldReplacement(replacement);\n };\n var newOpenWrapper = function newOpenWrapper(url) {\n var shouldLog = replacement && replacement.includes(\"log\");\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (shouldLog) {\n var argsStr = args && args.length > 0 ? \", \".concat(args.join(\", \")) : \"\";\n var message = \"\".concat(url).concat(argsStr);\n logMessage(source, message, true);\n hit(source);\n }\n var shouldPrevent = false;\n if (match === \"*\") {\n shouldPrevent = true;\n } else if (isValidMatchStr(match)) {\n var _parseMatchArg = parseMatchArg(match),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchRegexp = _parseMatchArg.matchRegexp;\n shouldPrevent = matchRegexp.test(url) !== isInvertedMatch;\n } else {\n logMessage(source, \"Invalid parameter: \".concat(match));\n shouldPrevent = false;\n }\n if (shouldPrevent) {\n var parsedDelay = parseInt(delay, 10);\n var result;\n if (nativeIsNaN(parsedDelay)) {\n result = noopNull();\n } else {\n var decoyArgs = {\n replacement: replacement,\n url: url,\n delay: parsedDelay\n };\n var decoy = createDecoy(decoyArgs);\n var popup = decoy.contentWindow;\n if (typeof popup === \"object\" && popup !== null) {\n Object.defineProperty(popup, \"closed\", {\n value: false\n });\n Object.defineProperty(popup, \"opener\", {\n value: window\n });\n Object.defineProperty(popup, \"frameElement\", {\n value: null\n });\n } else {\n var nativeGetter = decoy.contentWindow && decoy.contentWindow.get;\n Object.defineProperty(decoy, \"contentWindow\", {\n get: getPreventGetter(nativeGetter)\n });\n popup = decoy.contentWindow;\n }\n result = popup;\n }\n hit(source);\n return result;\n }\n return nativeOpen.apply(window, [url, ...args]);\n };\n window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper;\n window.open.toString = nativeOpen.toString.bind(nativeOpen);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isValidMatchStr(match) {\n var INVERT_MARKER = \"!\";\n var str = match;\n if (match !== null && match !== void 0 && match.startsWith(INVERT_MARKER)) {\n str = match.slice(1);\n }\n return isValidStrPattern(str);\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n function handleOldReplacement(replacement) {\n var result;\n if (!replacement) {\n result = noopFunc;\n } else if (replacement === \"trueFunc\") {\n result = trueFunc;\n } else if (replacement.includes(\"=\")) {\n var isProp = replacement.startsWith(\"{\") && replacement.endsWith(\"}\");\n if (isProp) {\n var propertyPart = replacement.slice(1, -1);\n var propertyName = substringBefore(propertyPart, \"=\");\n var propertyValue = substringAfter(propertyPart, \"=\");\n if (propertyValue === \"noopFunc\") {\n result = {};\n result[propertyName] = noopFunc;\n }\n }\n }\n return result;\n }\n function createDecoy(args) {\n var UrlPropNameOf = function (UrlPropNameOf) {\n UrlPropNameOf[\"Object\"] = \"data\";\n UrlPropNameOf[\"Iframe\"] = \"src\";\n return UrlPropNameOf;\n }({});\n var replacement = args.replacement,\n url = args.url,\n delay = args.delay;\n var tag;\n if (replacement === \"obj\") {\n tag = \"object\";\n } else {\n tag = \"iframe\";\n }\n var decoy = document.createElement(tag);\n if (decoy instanceof HTMLObjectElement) {\n decoy[UrlPropNameOf.Object] = url;\n } else if (decoy instanceof HTMLIFrameElement) {\n decoy[UrlPropNameOf.Iframe] = url;\n }\n decoy.style.setProperty(\"height\", \"1px\", \"important\");\n decoy.style.setProperty(\"position\", \"fixed\", \"important\");\n decoy.style.setProperty(\"top\", \"-1px\", \"important\");\n decoy.style.setProperty(\"width\", \"1px\", \"important\");\n document.body.appendChild(decoy);\n setTimeout(function () {\n return decoy.remove();\n }, delay * 1e3);\n return decoy;\n }\n function getPreventGetter(nativeGetter) {\n var preventGetter = function preventGetter(target, prop) {\n if (prop && prop === \"closed\") {\n return false;\n }\n if (typeof nativeGetter === \"function\") {\n return noopFunc;\n }\n return prop && target[prop];\n };\n return preventGetter;\n }\n function noopNull() {\n return null;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function noopFunc() {}\n function trueFunc() {\n return true;\n }\n function substringBefore(str, separator) {\n if (!str || !separator) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? str : str.substring(0, index);\n }\n function substringAfter(str, separator) {\n if (!str) {\n return str;\n }\n var index = str.indexOf(separator);\n return index < 0 ? \"\" : str.substring(index + separator.length);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventWindowOpen.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function preventXHR(source, args) {\n function preventXHR(source, propsToMatch, customResponseText) {\n if (typeof Proxy === \"undefined\") {\n return;\n }\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var nativeGetResponseHeader = window.XMLHttpRequest.prototype.getResponseHeader;\n var nativeGetAllResponseHeaders = window.XMLHttpRequest.prototype.getAllResponseHeaders;\n var xhrData;\n var modifiedResponse = \"\";\n var modifiedResponseText = \"\";\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (typeof propsToMatch === \"undefined\") {\n logMessage(source, \"xhr( \".concat(objectToString(xhrData), \" )\"), true);\n hit(source);\n } else if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n thisArg.xhrData = xhrData;\n }\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n if (thisArg.responseType === \"blob\") {\n modifiedResponse = new Blob();\n }\n if (thisArg.responseType === \"arraybuffer\") {\n modifiedResponse = new ArrayBuffer();\n }\n if (customResponseText) {\n var randomText = generateRandomResponse(customResponseText);\n if (randomText) {\n modifiedResponseText = randomText;\n } else {\n logMessage(source, \"Invalid randomize parameter: '\".concat(customResponseText, \"'\"));\n }\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n statusText = forgedRequest.statusText;\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n responseURL: {\n value: responseURL || thisArg.xhrData.url,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: 200,\n writable: false\n },\n response: {\n value: modifiedResponse,\n writable: false\n },\n responseText: {\n value: modifiedResponseText,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var getHeaderWrapper = function getHeaderWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetResponseHeader.apply(thisArg, args);\n }\n if (!thisArg.collectedHeaders.length) {\n return null;\n }\n var searchHeaderName = args[0].toLowerCase();\n var matchedHeader = thisArg.collectedHeaders.find(function (header) {\n var headerName = header[0].toLowerCase();\n return headerName === searchHeaderName;\n });\n return matchedHeader ? matchedHeader[1] : null;\n };\n var getAllHeadersWrapper = function getAllHeadersWrapper(target, thisArg) {\n if (!thisArg.shouldBePrevented) {\n return nativeGetAllResponseHeaders.call(thisArg);\n }\n if (!thisArg.collectedHeaders.length) {\n return \"\";\n }\n var allHeadersStr = thisArg.collectedHeaders.map(function (header) {\n var headerName = header[0];\n var headerValue = header[1];\n return \"\".concat(headerName.toLowerCase(), \": \").concat(headerValue);\n }).join(\"\\r\\n\");\n return allHeadersStr;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n var getHeaderHandler = {\n apply: getHeaderWrapper\n };\n var getAllHeadersHandler = {\n apply: getAllHeadersWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n XMLHttpRequest.prototype.getResponseHeader = new Proxy(XMLHttpRequest.prototype.getResponseHeader, getHeaderHandler);\n XMLHttpRequest.prototype.getAllResponseHeaders = new Proxy(XMLHttpRequest.prototype.getAllResponseHeaders, getAllHeadersHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function generateRandomResponse(customResponseText) {\n var customResponse = customResponseText;\n if (customResponse === \"true\") {\n customResponse = Math.random().toString(36).slice(-10);\n return customResponse;\n }\n customResponse = customResponse.replace(\"length:\", \"\");\n var rangeRegex = /^\\d+-\\d+$/;\n if (!rangeRegex.test(customResponse)) {\n return null;\n }\n var rangeMin = getNumberFromString(customResponse.split(\"-\")[0]);\n var rangeMax = getNumberFromString(customResponse.split(\"-\")[1]);\n if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) {\n return null;\n }\n if (rangeMin > rangeMax) {\n var temp = rangeMin;\n rangeMin = rangeMax;\n rangeMax = temp;\n }\n var LENGTH_RANGE_LIMIT = 500 * 1e3;\n if (rangeMax > LENGTH_RANGE_LIMIT) {\n return null;\n }\n var length = getRandomIntInclusive(rangeMin, rangeMax);\n customResponse = getRandomStrByLength(length);\n return customResponse;\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function nativeIsFinite(num) {\n var native = Number.isFinite || window.isFinite;\n return native(num);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1) + min);\n }\n function getRandomStrByLength(length) {\n var result = \"\";\n var characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\";\n var charactersLength = characters.length;\n for (var i = 0; i < length; i += 1) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n preventXHR.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeAttr(source, args) {\n function removeAttr(source, attrs, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!attrs) {\n return;\n }\n attrs = attrs.split(/\\s*\\|\\s*/);\n if (!selector) {\n selector = \"[\".concat(attrs.join(\"],[\"), \"]\");\n }\n var rmattr = function rmattr() {\n var nodes = [];\n try {\n nodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n var removed = false;\n nodes.forEach(function (node) {\n attrs.forEach(function (attr) {\n node.removeAttribute(attr);\n removed = true;\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var flags = parseFlags(applying);\n var run = function run() {\n rmattr();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(rmattr, true);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", rmattr, {\n once: true\n });\n } else {\n rmattr();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.includes(\" \")) {\n rmattr();\n }\n observeDOMChanges(rmattr, true);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n var FLAGS_DIVIDER = \" \";\n var ASAP_FLAG = \"asap\";\n var COMPLETE_FLAG = \"complete\";\n var STAY_FLAG = \"stay\";\n var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.includes(f);\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.includes(flag);\n }\n };\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeClass(source, args) {\n function removeClass(source, classNames, selector) {\n var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"asap stay\";\n if (!classNames) {\n return;\n }\n classNames = classNames.split(/\\s*\\|\\s*/);\n var selectors = [];\n if (!selector) {\n selectors = classNames.map(function (className) {\n return \".\".concat(className);\n });\n }\n var removeClassHandler = function removeClassHandler() {\n var nodes = new Set();\n if (selector) {\n var foundNodes = [];\n try {\n foundNodes = [].slice.call(document.querySelectorAll(selector));\n } catch (e) {\n logMessage(source, \"Invalid selector arg: '\".concat(selector, \"'\"));\n }\n foundNodes.forEach(function (n) {\n return nodes.add(n);\n });\n } else if (selectors.length > 0) {\n selectors.forEach(function (s) {\n var elements = document.querySelectorAll(s);\n for (var i = 0; i < elements.length; i += 1) {\n var element = elements[i];\n nodes.add(element);\n }\n });\n }\n var removed = false;\n nodes.forEach(function (node) {\n classNames.forEach(function (className) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n removed = true;\n }\n });\n });\n if (removed) {\n hit(source);\n }\n };\n var CLASS_ATTR_NAME = [\"class\"];\n var flags = parseFlags(applying);\n var run = function run() {\n removeClassHandler();\n if (!flags.hasFlag(flags.STAY)) {\n return;\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n };\n if (flags.hasFlag(flags.ASAP)) {\n if (document.readyState === \"loading\") {\n window.addEventListener(\"DOMContentLoaded\", removeClassHandler, {\n once: true\n });\n } else {\n removeClassHandler();\n }\n }\n if (document.readyState !== \"complete\" && flags.hasFlag(flags.COMPLETE)) {\n window.addEventListener(\"load\", run, {\n once: true\n });\n } else if (flags.hasFlag(flags.STAY)) {\n if (!applying.includes(\" \")) {\n removeClassHandler();\n }\n observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME);\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function parseFlags(flags) {\n var FLAGS_DIVIDER = \" \";\n var ASAP_FLAG = \"asap\";\n var COMPLETE_FLAG = \"complete\";\n var STAY_FLAG = \"stay\";\n var VALID_FLAGS = [STAY_FLAG, ASAP_FLAG, COMPLETE_FLAG];\n var passedFlags = flags.trim().split(FLAGS_DIVIDER).filter(function (f) {\n return VALID_FLAGS.includes(f);\n });\n return {\n ASAP: ASAP_FLAG,\n COMPLETE: COMPLETE_FLAG,\n STAY: STAY_FLAG,\n hasFlag(flag) {\n return passedFlags.includes(flag);\n }\n };\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeClass.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeCookie(source, args) {\n function removeCookie(source, match) {\n var matchRegexp = toRegExp(match);\n var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) {\n var cookieSpec = \"\".concat(cookieName, \"=\");\n var domain1 = \"; domain=\".concat(hostName);\n var domain2 = \"; domain=.\".concat(hostName);\n var path = \"; path=/\";\n var expiration = \"; expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n hit(source);\n };\n var rmCookie = function rmCookie() {\n document.cookie.split(\";\").forEach(function (cookieStr) {\n var pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n if (!matchRegexp.test(cookieName)) {\n return;\n }\n var hostParts = document.location.hostname.split(\".\");\n for (var i = 0; i <= hostParts.length - 1; i += 1) {\n var hostName = hostParts.slice(i).join(\".\");\n if (hostName) {\n removeCookieFromHost(cookieName, hostName);\n }\n }\n });\n };\n rmCookie();\n window.addEventListener(\"beforeunload\", rmCookie);\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeInShadowDom(source, args) {\n function removeInShadowDom(source, selector, baseSelector) {\n if (!Element.prototype.attachShadow) {\n return;\n }\n var removeElement = function removeElement(targetElement) {\n targetElement.remove();\n };\n var removeHandler = function removeHandler() {\n var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector);\n var _loop = function _loop() {\n var isRemoved = false;\n var _pierceShadowDom = pierceShadowDom(selector, hostElements),\n targets = _pierceShadowDom.targets,\n innerHosts = _pierceShadowDom.innerHosts;\n targets.forEach(function (targetEl) {\n removeElement(targetEl);\n isRemoved = true;\n });\n if (isRemoved) {\n hit(source);\n }\n hostElements = innerHosts;\n };\n while (hostElements.length !== 0) {\n _loop();\n }\n };\n removeHandler();\n observeDOMChanges(removeHandler, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function findHostElements(rootElement) {\n var hosts = [];\n if (rootElement) {\n var domElems = rootElement.querySelectorAll(\"*\");\n domElems.forEach(function (el) {\n if (el.shadowRoot) {\n hosts.push(el);\n }\n });\n }\n return hosts;\n }\n function pierceShadowDom(selector, hostElements) {\n var targets = [];\n var innerHostsAcc = [];\n hostElements.forEach(function (host) {\n var simpleElems = host.querySelectorAll(selector);\n targets = targets.concat([].slice.call(simpleElems));\n var shadowRootElem = host.shadowRoot;\n var shadowChildren = shadowRootElem.querySelectorAll(selector);\n targets = targets.concat([].slice.call(shadowChildren));\n innerHostsAcc.push(findHostElements(shadowRootElem));\n });\n var innerHosts = flatten(innerHostsAcc);\n return {\n targets: targets,\n innerHosts: innerHosts\n };\n }\n function flatten(input) {\n var stack = [];\n input.forEach(function (el) {\n return stack.push(el);\n });\n var res = [];\n while (stack.length) {\n var next = stack.pop();\n if (Array.isArray(next)) {\n next.forEach(function (el) {\n return stack.push(el);\n });\n } else {\n res.push(next);\n }\n }\n return res.reverse();\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeInShadowDom.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function removeNodeText(source, args) {\n function removeNodeText(source, nodeName, textMatch) {\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch;\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n var ALL_TEXT_PATTERN = /^[\\s\\S]*$/;\n var REPLACEMENT = \"\";\n replaceNodeText(source, node, ALL_TEXT_PATTERN, REPLACEMENT);\n }\n });\n };\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n function observeDocumentWithTimeout(callback, options) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4;\n var documentObserver = new MutationObserver(function (mutations, observer) {\n observer.disconnect();\n callback(mutations, observer);\n observer.observe(document.documentElement, options);\n });\n documentObserver.observe(document.documentElement, options);\n if (typeof timeout === \"number\") {\n setTimeout(function () {\n return documentObserver.disconnect();\n }, timeout);\n }\n }\n function handleExistingNodes(selector, handler) {\n var nodeList = document.querySelectorAll(selector);\n var nodes = nodeListToArray(nodeList);\n handler(nodes);\n }\n function handleMutations(mutations, handler) {\n var addedNodes = getAddedNodes(mutations);\n handler(addedNodes);\n }\n function replaceNodeText(source, node, pattern, replacement) {\n var textContent = node.textContent;\n if (textContent) {\n node.textContent = textContent.replace(pattern, replacement);\n hit(source);\n }\n }\n function isTargetNode(node, nodeNameMatch, textContentMatch) {\n var nodeName = node.nodeName,\n textContent = node.textContent;\n var nodeNameLowerCase = nodeName.toLowerCase();\n return textContent !== null && textContent !== \"\" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch));\n }\n function parseNodeTextParams(nodeName, textMatch) {\n var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var REGEXP_START_MARKER = \"/\";\n var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER));\n var selector = isStringNameMatch ? nodeName : \"*\";\n var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName);\n var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch);\n var patternMatch;\n if (pattern) {\n patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern);\n }\n return {\n selector: selector,\n nodeNameMatch: nodeNameMatch,\n textContentMatch: textContentMatch,\n patternMatch: patternMatch\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function nodeListToArray(nodeList) {\n var nodes = [];\n for (var i = 0; i < nodeList.length; i += 1) {\n nodes.push(nodeList[i]);\n }\n return nodes;\n }\n function getAddedNodes(mutations) {\n var nodes = [];\n for (var i = 0; i < mutations.length; i += 1) {\n var addedNodes = mutations[i].addedNodes;\n for (var j = 0; j < addedNodes.length; j += 1) {\n nodes.push(addedNodes[j]);\n }\n }\n return nodes;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n removeNodeText.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setAttr(source, args) {\n function setAttr(source, selector, attr) {\n var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (!selector || !attr) {\n return;\n }\n var allowedValues = [\"true\", \"false\"];\n if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767) && !allowedValues.includes(value.toLowerCase())) {\n return;\n }\n var setAttr = function setAttr() {\n var nodes = [].slice.call(document.querySelectorAll(selector));\n var set = false;\n nodes.forEach(function (node) {\n node.setAttribute(attr, value);\n set = true;\n });\n if (set) {\n hit(source);\n }\n };\n setAttr();\n observeDOMChanges(setAttr, true);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function observeDOMChanges(callback) {\n var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var THROTTLE_DELAY_MS = 20;\n var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS));\n var connect = function connect() {\n if (attrsToObserve.length > 0) {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs,\n attributeFilter: attrsToObserve\n });\n } else {\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: observeAttrs\n });\n }\n };\n var disconnect = function disconnect() {\n observer.disconnect();\n };\n function callbackWrapper() {\n disconnect();\n callback();\n connect();\n }\n connect();\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setAttr.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setConstant(source, args) {\n function setConstant(source, property, value) {\n var stack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n var valueWrapper = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"\";\n var uboAliases = [\"set-constant.js\", \"ubo-set-constant.js\", \"set.js\", \"ubo-set.js\", \"ubo-set-constant\", \"ubo-set\"];\n if (uboAliases.includes(source.name)) {\n if (stack.length !== 1 && !getNumberFromString(stack)) {\n valueWrapper = stack;\n }\n stack = undefined;\n }\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var emptyArr = noopArray();\n var emptyObj = noopObject();\n var constantValue;\n if (value === \"undefined\") {\n constantValue = undefined;\n } else if (value === \"false\") {\n constantValue = false;\n } else if (value === \"true\") {\n constantValue = true;\n } else if (value === \"null\") {\n constantValue = null;\n } else if (value === \"emptyArr\") {\n constantValue = emptyArr;\n } else if (value === \"emptyObj\") {\n constantValue = emptyObj;\n } else if (value === \"noopFunc\") {\n constantValue = noopFunc;\n } else if (value === \"noopCallbackFunc\") {\n constantValue = noopCallbackFunc;\n } else if (value === \"trueFunc\") {\n constantValue = trueFunc;\n } else if (value === \"falseFunc\") {\n constantValue = falseFunc;\n } else if (value === \"throwFunc\") {\n constantValue = throwFunc;\n } else if (value === \"noopPromiseResolve\") {\n constantValue = noopPromiseResolve;\n } else if (value === \"noopPromiseReject\") {\n constantValue = noopPromiseReject;\n } else if (/^\\d+$/.test(value)) {\n constantValue = parseFloat(value);\n if (nativeIsNaN(constantValue)) {\n return;\n }\n if (Math.abs(constantValue) > 32767) {\n return;\n }\n } else if (value === \"-1\") {\n constantValue = -1;\n } else if (value === \"\") {\n constantValue = \"\";\n } else if (value === \"yes\") {\n constantValue = \"yes\";\n } else if (value === \"no\") {\n constantValue = \"no\";\n } else {\n return;\n }\n var valueWrapperNames = [\"asFunction\", \"asCallback\", \"asResolved\", \"asRejected\"];\n if (valueWrapperNames.includes(valueWrapper)) {\n var valueWrappersMap = {\n asFunction(v) {\n return function () {\n return v;\n };\n },\n asCallback(v) {\n return function () {\n return function () {\n return v;\n };\n };\n },\n asResolved(v) {\n return Promise.resolve(v);\n },\n asRejected(v) {\n return Promise.reject(v);\n }\n };\n constantValue = valueWrappersMap[valueWrapper](constantValue);\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getNumberFromString(rawString) {\n var parsedDelay = parseInt(rawString, 10);\n var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay;\n return validDelay;\n }\n function noopArray() {\n return [];\n }\n function noopObject() {\n return {};\n }\n function noopFunc() {}\n function noopCallbackFunc() {\n return noopFunc;\n }\n function trueFunc() {\n return true;\n }\n function falseFunc() {\n return false;\n }\n function throwFunc() {\n throw new Error();\n }\n function noopPromiseReject() {\n return Promise.reject();\n }\n function noopPromiseResolve() {\n var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"{}\";\n var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"default\";\n if (typeof Response === \"undefined\") {\n return;\n }\n var response = new Response(responseBody, {\n status: 200,\n statusText: \"OK\"\n });\n Object.defineProperties(response, {\n url: {\n value: responseUrl\n },\n type: {\n value: responseType\n }\n });\n return Promise.resolve(response);\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookie(source, args) {\n function setCookie(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(validValue, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n hit(source);\n document.cookie = cookieToSet;\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n var allowedCookieValues = new Set([\"true\", \"false\", \"yes\", \"y\", \"no\", \"n\", \"ok\", \"accept\", \"reject\", \"allow\", \"deny\"]);\n var validValue;\n if (allowedCookieValues.has(value.toLowerCase())) {\n validValue = value;\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setCookieReload(source, args) {\n function setCookieReload(source, name, value) {\n var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"/\";\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var validValue = getLimitedCookieValue(value);\n if (validValue === null) {\n logMessage(source, \"Invalid cookie value: '\".concat(value, \"'\"));\n return;\n }\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, validValue, path);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n document.cookie = cookieToSet;\n hit(source);\n if (isCookieSetWithValue(document.cookie, name, value)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n var pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n var cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function getLimitedCookieValue(value) {\n if (!value) {\n return null;\n }\n var allowedCookieValues = new Set([\"true\", \"false\", \"yes\", \"y\", \"no\", \"n\", \"ok\", \"accept\", \"reject\", \"allow\", \"deny\"]);\n var validValue;\n if (allowedCookieValues.has(value.toLowerCase())) {\n validValue = value;\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n return null;\n }\n if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) {\n return null;\n }\n } else {\n return null;\n }\n return validValue;\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setLocalStorageItem(source, args) {\n function setLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n localStorage = _window.localStorage;\n if (validValue === \"$remove$\") {\n removeStorageItem(source, localStorage, key);\n } else {\n setStorageItem(source, localStorage, key, validValue);\n }\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function removeStorageItem(source, storage, key) {\n try {\n storage.removeItem(key);\n } catch (e) {\n var message = \"Unable to remove storage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n var validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"$remove$\") {\n validValue = \"$remove$\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setPopadsDummy(source, args) {\n function setPopadsDummy(source) {\n delete window.PopAds;\n delete window.popns;\n Object.defineProperties(window, {\n PopAds: {\n get: function get() {\n hit(source);\n return {};\n }\n },\n popns: {\n get: function get() {\n hit(source);\n return {};\n }\n }\n });\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setPopadsDummy.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function setSessionStorageItem(source, args) {\n function setSessionStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified.\");\n return;\n }\n var validValue;\n try {\n validValue = getLimitedStorageItemValue(value);\n } catch (_unused) {\n logMessage(source, \"Invalid storage item value: '\".concat(value, \"'\"));\n return;\n }\n var _window = window,\n sessionStorage = _window.sessionStorage;\n if (validValue === \"$remove$\") {\n removeStorageItem(source, sessionStorage, key);\n } else {\n setStorageItem(source, sessionStorage, key, validValue);\n }\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function removeStorageItem(source, storage, key) {\n try {\n storage.removeItem(key);\n } catch (e) {\n var message = \"Unable to remove storage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function getLimitedStorageItemValue(value) {\n if (typeof value !== \"string\") {\n throw new Error(\"Invalid value\");\n }\n var validValue;\n if (value === \"undefined\") {\n validValue = undefined;\n } else if (value === \"false\") {\n validValue = false;\n } else if (value === \"true\") {\n validValue = true;\n } else if (value === \"null\") {\n validValue = null;\n } else if (value === \"emptyArr\") {\n validValue = \"[]\";\n } else if (value === \"emptyObj\") {\n validValue = \"{}\";\n } else if (value === \"\") {\n validValue = \"\";\n } else if (/^\\d+$/.test(value)) {\n validValue = parseFloat(value);\n if (nativeIsNaN(validValue)) {\n throw new Error(\"Invalid value\");\n }\n if (Math.abs(validValue) > 32767) {\n throw new Error(\"Invalid value\");\n }\n } else if (value === \"yes\") {\n validValue = \"yes\";\n } else if (value === \"no\") {\n validValue = \"no\";\n } else if (value === \"$remove$\") {\n validValue = \"$remove$\";\n } else {\n throw new Error(\"Invalid value\");\n }\n return validValue;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n setSessionStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedClickElement(source, args) {\n function trustedClickElement(source, selectors) {\n var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN;\n if (!selectors) {\n return;\n }\n var OBSERVER_TIMEOUT_MS = 1e4;\n var THROTTLE_DELAY_MS = 20;\n var STATIC_CLICK_DELAY_MS = 150;\n var COOKIE_MATCH_MARKER = \"cookie:\";\n var LOCAL_STORAGE_MATCH_MARKER = \"localStorage:\";\n var SELECTORS_DELIMITER = \",\";\n var COOKIE_STRING_DELIMITER = \";\";\n var EXTRA_MATCH_DELIMITER = /(,\\s*){1}(?=!?cookie:|!?localStorage:)/;\n var sleep = function sleep(delayMs) {\n return new Promise(function (resolve) {\n return setTimeout(resolve, delayMs);\n });\n };\n var parsedDelay;\n if (delay) {\n parsedDelay = parseInt(delay, 10);\n var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS;\n if (!isValidDelay) {\n var message = \"Passed delay '\".concat(delay, \"' is invalid or bigger than \").concat(OBSERVER_TIMEOUT_MS, \" ms\");\n logMessage(source, message);\n return;\n }\n }\n var canClick = !parsedDelay;\n var cookieMatches = [];\n var localStorageMatches = [];\n var isInvertedMatchCookie = false;\n var isInvertedMatchLocalStorage = false;\n if (extraMatch) {\n var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) {\n return matchStr.trim();\n });\n parsedExtraMatch.forEach(function (matchStr) {\n if (matchStr.includes(COOKIE_MATCH_MARKER)) {\n var _parseMatchArg = parseMatchArg(matchStr),\n isInvertedMatch = _parseMatchArg.isInvertedMatch,\n matchValue = _parseMatchArg.matchValue;\n isInvertedMatchCookie = isInvertedMatch;\n var cookieMatch = matchValue.replace(COOKIE_MATCH_MARKER, \"\");\n cookieMatches.push(cookieMatch);\n }\n if (matchStr.includes(LOCAL_STORAGE_MATCH_MARKER)) {\n var _parseMatchArg2 = parseMatchArg(matchStr),\n _isInvertedMatch = _parseMatchArg2.isInvertedMatch,\n _matchValue = _parseMatchArg2.matchValue;\n isInvertedMatchLocalStorage = _isInvertedMatch;\n var localStorageMatch = _matchValue.replace(LOCAL_STORAGE_MATCH_MARKER, \"\");\n localStorageMatches.push(localStorageMatch);\n }\n });\n }\n if (cookieMatches.length > 0) {\n var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER));\n var parsedCookies = parseCookieString(document.cookie);\n var cookieKeys = Object.keys(parsedCookies);\n if (cookieKeys.length === 0) {\n return;\n }\n var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) {\n var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null;\n var keyMatch = toRegExp(key);\n return cookieKeys.some(function (key) {\n var keysMatched = keyMatch.test(key);\n if (!keysMatched) {\n return false;\n }\n if (!valueMatch) {\n return true;\n }\n return valueMatch.test(parsedCookies[key]);\n });\n });\n var shouldRun = cookiesMatched !== isInvertedMatchCookie;\n if (!shouldRun) {\n return;\n }\n }\n if (localStorageMatches.length > 0) {\n var localStorageMatched = localStorageMatches.every(function (str) {\n var itemValue = window.localStorage.getItem(str);\n return itemValue || itemValue === \"\";\n });\n var _shouldRun = localStorageMatched !== isInvertedMatchLocalStorage;\n if (!_shouldRun) {\n return;\n }\n }\n var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) {\n return selector.trim();\n });\n var createElementObj = function createElementObj(element) {\n return {\n element: element || null,\n clicked: false\n };\n };\n var elementsSequence = Array(selectorsSequence.length).fill(createElementObj());\n var clickElementsBySequence = async function clickElementsBySequence() {\n for (var i = 0; i < elementsSequence.length; i += 1) {\n var elementObj = elementsSequence[i];\n if (i >= 1) {\n await sleep(STATIC_CLICK_DELAY_MS);\n }\n if (!elementObj.element) {\n break;\n }\n if (!elementObj.clicked) {\n elementObj.element.click();\n elementObj.clicked = true;\n }\n }\n var allElementsClicked = elementsSequence.every(function (elementObj) {\n return elementObj.clicked === true;\n });\n if (allElementsClicked) {\n hit(source);\n }\n };\n var handleElement = function handleElement(element, i) {\n var elementObj = createElementObj(element);\n elementsSequence[i] = elementObj;\n if (canClick) {\n clickElementsBySequence();\n }\n };\n var findElements = function findElements(mutations, observer) {\n var fulfilledSelectors = [];\n selectorsSequence.forEach(function (selector, i) {\n if (!selector) {\n return;\n }\n var element = document.querySelector(selector);\n if (!element) {\n return;\n }\n handleElement(element, i);\n fulfilledSelectors.push(selector);\n });\n selectorsSequence = selectorsSequence.map(function (selector) {\n return fulfilledSelectors.includes(selector) ? null : selector;\n });\n var allSelectorsFulfilled = selectorsSequence.every(function (selector) {\n return selector === null;\n });\n if (allSelectorsFulfilled) {\n observer.disconnect();\n }\n };\n var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS));\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n if (parsedDelay) {\n setTimeout(function () {\n clickElementsBySequence();\n canClick = true;\n }, parsedDelay);\n }\n setTimeout(function () {\n return observer.disconnect();\n }, OBSERVER_TIMEOUT_MS);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function parseCookieString(cookieString) {\n var COOKIE_DELIMITER = \"=\";\n var COOKIE_PAIRS_DELIMITER = \";\";\n var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n var cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n var cookieKey;\n var cookieValue = \"\";\n var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n }\n function throttle(cb, delay) {\n var wait = false;\n var savedArgs;\n var wrapper = function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (wait) {\n savedArgs = args;\n return;\n }\n cb(...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n if (savedArgs) {\n wrapper(...savedArgs);\n savedArgs = null;\n }\n }, delay);\n };\n return wrapper;\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function parseMatchArg(match) {\n var INVERT_MARKER = \"!\";\n var isInvertedMatch = match ? match === null || match === void 0 ? void 0 : match.startsWith(INVERT_MARKER) : false;\n var matchValue = isInvertedMatch ? match.slice(1) : match;\n var matchRegexp = toRegExp(matchValue);\n return {\n isInvertedMatch: isInvertedMatch,\n matchRegexp: matchRegexp,\n matchValue: matchValue\n };\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedClickElement.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceFetchResponse(source, args) {\n function trustedReplaceFetchResponse(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n logMessage(source, \"Pattern argument should not be empty string\");\n return;\n }\n var shouldLog = pattern === \"\" && replacement === \"\";\n var nativeFetch = fetch;\n var shouldReplace = false;\n var fetchData;\n var handlerWrapper = function handlerWrapper(target, thisArg, args) {\n fetchData = getFetchData(args);\n if (shouldLog) {\n logMessage(source, \"fetch( \".concat(objectToString(fetchData), \" )\"), true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n shouldReplace = matchRequestProps(source, propsToMatch, fetchData);\n if (!shouldReplace) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgeResponse = function forgeResponse(response, textContent) {\n var bodyUsed = response.bodyUsed,\n headers = response.headers,\n ok = response.ok,\n redirected = response.redirected,\n status = response.status,\n statusText = response.statusText,\n type = response.type,\n url = response.url;\n var forgedResponse = new Response(textContent, {\n status: status,\n statusText: statusText,\n headers: headers\n });\n Object.defineProperties(forgedResponse, {\n url: {\n value: url\n },\n type: {\n value: type\n },\n ok: {\n value: ok\n },\n bodyUsed: {\n value: bodyUsed\n },\n redirected: {\n value: redirected\n }\n });\n return forgedResponse;\n };\n return nativeFetch.apply(null, args).then(function (response) {\n return response.text().then(function (bodyText) {\n var patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedTextContent = bodyText.replace(patternRegexp, replacement);\n var forgedResponse = forgeResponse(response, modifiedTextContent);\n hit(source);\n return forgedResponse;\n }).catch(function () {\n var fetchDataStr = objectToString(fetchData);\n var message = \"Response body can't be converted to text: \".concat(fetchDataStr);\n logMessage(source, message);\n return Reflect.apply(target, thisArg, args);\n });\n }).catch(function () {\n return Reflect.apply(target, thisArg, args);\n });\n };\n var fetchHandler = {\n apply: handlerWrapper\n };\n fetch = new Proxy(fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getFetchData(args) {\n var fetchPropsObj = {};\n var fetchUrl;\n var fetchInit;\n if (args[0] instanceof Request) {\n var requestData = getRequestData(args[0]);\n fetchUrl = requestData.url;\n fetchInit = requestData;\n } else {\n fetchUrl = args[0];\n fetchInit = args[1];\n }\n fetchPropsObj.url = fetchUrl;\n if (fetchInit instanceof Object) {\n var props = Object.keys(fetchInit);\n props.forEach(function (prop) {\n fetchPropsObj[prop] = fetchInit[prop];\n });\n }\n return fetchPropsObj;\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getRequestData(request) {\n var requestInitOptions = getRequestProps();\n var entries = requestInitOptions.map(function (key) {\n var value = request[key];\n return [key, value];\n });\n return Object.fromEntries(entries);\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceFetchResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceNodeText(source, args) {\n function trustedReplaceNodeText(source, nodeName, textMatch, pattern, replacement) {\n var uboAliases = [\"replace-node-text.js\", \"rpnt.js\", \"sed.js\"];\n if (uboAliases.includes(source.name)) {\n replacement = pattern;\n pattern = textMatch;\n for (var _len = arguments.length, extraArgs = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {\n extraArgs[_key - 5] = arguments[_key];\n }\n for (var i = 0; i < extraArgs.length; i += 1) {\n var arg = extraArgs[i];\n if (arg === \"condition\") {\n textMatch = extraArgs[i + 1];\n break;\n }\n }\n }\n var _parseNodeTextParams = parseNodeTextParams(nodeName, textMatch, pattern),\n selector = _parseNodeTextParams.selector,\n nodeNameMatch = _parseNodeTextParams.nodeNameMatch,\n textContentMatch = _parseNodeTextParams.textContentMatch,\n patternMatch = _parseNodeTextParams.patternMatch;\n var handleNodes = function handleNodes(nodes) {\n return nodes.forEach(function (node) {\n var shouldReplace = isTargetNode(node, nodeNameMatch, textContentMatch);\n if (shouldReplace) {\n replaceNodeText(source, node, patternMatch, replacement);\n }\n });\n };\n if (document.documentElement) {\n handleExistingNodes(selector, handleNodes);\n }\n observeDocumentWithTimeout(function (mutations) {\n return handleMutations(mutations, handleNodes);\n }, {\n childList: true,\n subtree: true\n });\n }\n function observeDocumentWithTimeout(callback, options) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e4;\n var documentObserver = new MutationObserver(function (mutations, observer) {\n observer.disconnect();\n callback(mutations, observer);\n observer.observe(document.documentElement, options);\n });\n documentObserver.observe(document.documentElement, options);\n if (typeof timeout === \"number\") {\n setTimeout(function () {\n return documentObserver.disconnect();\n }, timeout);\n }\n }\n function handleExistingNodes(selector, handler) {\n var nodeList = document.querySelectorAll(selector);\n var nodes = nodeListToArray(nodeList);\n handler(nodes);\n }\n function handleMutations(mutations, handler) {\n var addedNodes = getAddedNodes(mutations);\n handler(addedNodes);\n }\n function replaceNodeText(source, node, pattern, replacement) {\n var textContent = node.textContent;\n if (textContent) {\n node.textContent = textContent.replace(pattern, replacement);\n hit(source);\n }\n }\n function isTargetNode(node, nodeNameMatch, textContentMatch) {\n var nodeName = node.nodeName,\n textContent = node.textContent;\n var nodeNameLowerCase = nodeName.toLowerCase();\n return textContent !== null && textContent !== \"\" && (nodeNameMatch instanceof RegExp ? nodeNameMatch.test(nodeNameLowerCase) : nodeNameMatch === nodeNameLowerCase) && (textContentMatch instanceof RegExp ? textContentMatch.test(textContent) : textContent.includes(textContentMatch));\n }\n function parseNodeTextParams(nodeName, textMatch) {\n var pattern = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var REGEXP_START_MARKER = \"/\";\n var isStringNameMatch = !(nodeName.startsWith(REGEXP_START_MARKER) && nodeName.endsWith(REGEXP_START_MARKER));\n var selector = isStringNameMatch ? nodeName : \"*\";\n var nodeNameMatch = isStringNameMatch ? nodeName : toRegExp(nodeName);\n var textContentMatch = !textMatch.startsWith(REGEXP_START_MARKER) ? textMatch : toRegExp(textMatch);\n var patternMatch;\n if (pattern) {\n patternMatch = !pattern.startsWith(REGEXP_START_MARKER) ? pattern : toRegExp(pattern);\n }\n return {\n selector: selector,\n nodeNameMatch: nodeNameMatch,\n textContentMatch: textContentMatch,\n patternMatch: patternMatch\n };\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function nodeListToArray(nodeList) {\n var nodes = [];\n for (var i = 0; i < nodeList.length; i += 1) {\n nodes.push(nodeList[i]);\n }\n return nodes;\n }\n function getAddedNodes(mutations) {\n var nodes = [];\n for (var i = 0; i < mutations.length; i += 1) {\n var addedNodes = mutations[i].addedNodes;\n for (var j = 0; j < addedNodes.length; j += 1) {\n nodes.push(addedNodes[j]);\n }\n }\n return nodes;\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceNodeText.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedReplaceXhrResponse(source, args) {\n function trustedReplaceXhrResponse(source) {\n var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof Proxy === \"undefined\") {\n return;\n }\n if (pattern === \"\" && replacement !== \"\") {\n var message = \"Pattern argument should not be empty string.\";\n logMessage(source, message);\n return;\n }\n var shouldLog = pattern === \"\" && replacement === \"\";\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (shouldLog) {\n var _message = \"xhr( \".concat(objectToString(xhrData), \" )\");\n logMessage(source, _message, true);\n hit(source);\n return Reflect.apply(target, thisArg, args);\n }\n if (matchRequestProps(source, propsToMatch, xhrData)) {\n thisArg.shouldBePrevented = true;\n }\n if (thisArg.shouldBePrevented) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n if (!thisArg.shouldBePrevented) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n var content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n var patternRegexp = pattern === \"*\" ? /(\\n|.)*/ : toRegExp(pattern);\n var modifiedContent = content.replace(patternRegexp, replacement);\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n response: {\n value: modifiedContent,\n writable: false\n },\n responseText: {\n value: modifiedContent,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function objectToString(obj) {\n if (!obj || typeof obj !== \"object\") {\n return String(obj);\n }\n return isEmptyObject(obj) ? \"{}\" : Object.entries(obj).map(function (pair) {\n var key = pair[0];\n var value = pair[1];\n var recordValueStr = value;\n if (value instanceof Object) {\n recordValueStr = \"{ \".concat(objectToString(value), \" }\");\n }\n return \"\".concat(key, ':\"').concat(recordValueStr, '\"');\n }).join(\" \");\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedReplaceXhrResponse.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetConstant(source, args) {\n function trustedSetConstant(source, property, value, stack) {\n if (!property || !matchStackTrace(stack, new Error().stack)) {\n return;\n }\n var constantValue;\n try {\n constantValue = inferValue(value);\n } catch (e) {\n logMessage(source, e);\n return;\n }\n var canceled = false;\n var mustCancel = function mustCancel(value) {\n if (canceled) {\n return canceled;\n }\n canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null;\n return canceled;\n };\n var trapProp = function trapProp(base, prop, configurable, handler) {\n if (!handler.init(base[prop])) {\n return false;\n }\n var origDescriptor = Object.getOwnPropertyDescriptor(base, prop);\n var prevSetter;\n if (origDescriptor instanceof Object) {\n if (!origDescriptor.configurable) {\n var message = \"Property '\".concat(prop, \"' is not configurable\");\n logMessage(source, message);\n return false;\n }\n base[prop] = constantValue;\n if (origDescriptor.set instanceof Function) {\n prevSetter = origDescriptor.set;\n }\n }\n Object.defineProperty(base, prop, {\n configurable: configurable,\n get() {\n return handler.get();\n },\n set(a) {\n if (prevSetter !== undefined) {\n prevSetter(a);\n }\n handler.set(a);\n }\n });\n return true;\n };\n var setChainPropAccess = function setChainPropAccess(owner, property) {\n var chainInfo = getPropertyInChain(owner, property);\n var base = chainInfo.base;\n var prop = chainInfo.prop,\n chain = chainInfo.chain;\n var inChainPropHandler = {\n factValue: undefined,\n init(a) {\n this.factValue = a;\n return true;\n },\n get() {\n return this.factValue;\n },\n set(a) {\n if (this.factValue === a) {\n return;\n }\n this.factValue = a;\n if (a instanceof Object) {\n setChainPropAccess(a, chain);\n }\n }\n };\n var endPropHandler = {\n init(a) {\n if (mustCancel(a)) {\n return false;\n }\n return true;\n },\n get() {\n return constantValue;\n },\n set(a) {\n if (!mustCancel(a)) {\n return;\n }\n constantValue = a;\n }\n };\n if (!chain) {\n var isTrapped = trapProp(base, prop, false, endPropHandler);\n if (isTrapped) {\n hit(source);\n }\n return;\n }\n if (base !== undefined && base[prop] === null) {\n trapProp(base, prop, true, inChainPropHandler);\n return;\n }\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n trapProp(base, prop, true, inChainPropHandler);\n }\n var propValue = owner[prop];\n if (propValue instanceof Object || typeof propValue === \"object\" && propValue !== null) {\n setChainPropAccess(propValue, chain);\n }\n trapProp(base, prop, true, inChainPropHandler);\n };\n setChainPropAccess(window, property);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function inferValue(value) {\n if (value === \"undefined\") {\n return undefined;\n }\n if (value === \"false\") {\n return false;\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"null\") {\n return null;\n }\n if (value === \"NaN\") {\n return NaN;\n }\n var MAX_ALLOWED_NUM = 32767;\n var numVal = Number(value);\n if (!nativeIsNaN(numVal)) {\n if (Math.abs(numVal) > MAX_ALLOWED_NUM) {\n throw new Error(\"number values bigger than 32767 are not allowed\");\n }\n return numVal;\n }\n var errorMessage = \"'\".concat(value, \"' value type can't be inferred\");\n try {\n var parsableVal = JSON.parse(value);\n if (parsableVal instanceof Object || typeof parsableVal === \"string\") {\n return parsableVal;\n }\n } catch (e) {\n errorMessage += \": \".concat(e);\n }\n throw new TypeError(errorMessage);\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function getPropertyInChain(base, chain) {\n var pos = chain.indexOf(\".\");\n if (pos === -1) {\n return {\n base: base,\n prop: chain\n };\n }\n var prop = chain.slice(0, pos);\n if (base === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n var nextBase = base[prop];\n chain = chain.slice(pos + 1);\n if ((base instanceof Object || typeof base === \"object\") && isEmptyObject(base)) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase === null) {\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n if (nextBase !== undefined) {\n return getPropertyInChain(nextBase, chain);\n }\n Object.defineProperty(base, prop, {\n configurable: true\n });\n return {\n base: base,\n prop: prop,\n chain: chain\n };\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function matchStackTrace(stackMatch, stackTrace) {\n if (!stackMatch || stackMatch === \"\") {\n return true;\n }\n if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) {\n return true;\n }\n var stackRegexp = toRegExp(stackMatch);\n var refinedStackTrace = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n }).join(\"\\n\");\n return getNativeRegexpTest().call(stackRegexp, refinedStackTrace);\n }\n function nativeIsNaN(num) {\n var native = Number.isNaN || window.isNaN;\n return native(num);\n }\n function isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && !obj.prototype;\n }\n function getNativeRegexpTest() {\n var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, \"test\");\n var nativeRegexTest = descriptor === null || descriptor === void 0 ? void 0 : descriptor.value;\n if (descriptor && typeof descriptor.value === \"function\") {\n return nativeRegexTest;\n }\n throw new Error(\"RegExp.prototype.test is not a function\");\n }\n function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) {\n var INLINE_SCRIPT_STRING = \"inlineScript\";\n var INJECTED_SCRIPT_STRING = \"injectedScript\";\n var INJECTED_SCRIPT_MARKER = \"\";\n var isInlineScript = function isInlineScript(match) {\n return match.includes(INLINE_SCRIPT_STRING);\n };\n var isInjectedScript = function isInjectedScript(match) {\n return match.includes(INJECTED_SCRIPT_STRING);\n };\n if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) {\n return false;\n }\n var documentURL = window.location.href;\n var pos = documentURL.indexOf(\"#\");\n if (pos !== -1) {\n documentURL = documentURL.slice(0, pos);\n }\n var stackSteps = stackTrace.split(\"\\n\").slice(2).map(function (line) {\n return line.trim();\n });\n var stackLines = stackSteps.map(function (line) {\n var stack;\n var getStackTraceURL = /(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);\n if (getStackTraceURL) {\n var _stackURL, _stackURL2;\n var stackURL = getStackTraceURL[2];\n if ((_stackURL = stackURL) !== null && _stackURL !== void 0 && _stackURL.startsWith(\"(\")) {\n stackURL = stackURL.slice(1);\n }\n if ((_stackURL2 = stackURL) !== null && _stackURL2 !== void 0 && _stackURL2.startsWith(INJECTED_SCRIPT_MARKER)) {\n var _stackFunction;\n stackURL = INJECTED_SCRIPT_STRING;\n var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim();\n if ((_stackFunction = stackFunction) !== null && _stackFunction !== void 0 && _stackFunction.startsWith(\"at\")) {\n stackFunction = stackFunction.slice(2).trim();\n }\n stack = \"\".concat(stackFunction, \" \").concat(stackURL).trim();\n } else {\n stack = stackURL;\n }\n } else {\n stack = line;\n }\n return stack;\n });\n if (stackLines) {\n for (var index = 0; index < stackLines.length; index += 1) {\n if (isInlineScript(stackMatch) && documentURL === stackLines[index]) {\n return true;\n }\n if (isInjectedScript(stackMatch) && stackLines[index].startsWith(INJECTED_SCRIPT_STRING)) {\n return true;\n }\n }\n }\n return false;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetConstant.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookie(source, args) {\n function trustedSetCookie(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n var ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n var ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n var MS_IN_SEC = 1e3;\n var SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n var SECONDS_IN_DAY = 24 * 60 * 60;\n var parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = \"$now$\";\n var CURRENT_DATE_KEYWORD = \"$currentDate$\";\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookie.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetCookieReload(source, args) {\n function trustedSetCookieReload(source, name, value) {\n var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"/\";\n if (typeof name === \"undefined\") {\n logMessage(source, \"Cookie name should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Cookie value should be specified\");\n return;\n }\n if (isCookieSetWithValue(document.cookie, name, value)) {\n return;\n }\n var parsedValue = parseKeywordValue(value);\n if (!isValidCookiePath(path)) {\n logMessage(source, \"Invalid cookie path: '\".concat(path, \"'\"));\n return;\n }\n var cookieToSet = concatCookieNameValuePath(name, parsedValue, path, false);\n if (!cookieToSet) {\n logMessage(source, \"Invalid cookie name or value\");\n return;\n }\n if (offsetExpiresSec) {\n var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec);\n if (!parsedOffsetMs) {\n logMessage(source, \"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));\n return;\n }\n var expires = Date.now() + parsedOffsetMs;\n cookieToSet += \" expires=\".concat(new Date(expires).toUTCString(), \";\");\n }\n document.cookie = cookieToSet;\n hit(source);\n var cookieValueToCheck = parseCookieString(document.cookie)[name];\n if (isCookieSetWithValue(document.cookie, name, cookieValueToCheck)) {\n window.location.reload();\n }\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function isCookieSetWithValue(cookieString, name, value) {\n return cookieString.split(\";\").some(function (cookieStr) {\n var pos = cookieStr.indexOf(\"=\");\n if (pos === -1) {\n return false;\n }\n var cookieName = cookieStr.slice(0, pos).trim();\n var cookieValue = cookieStr.slice(pos + 1).trim();\n return name === cookieName && value === cookieValue;\n });\n }\n function concatCookieNameValuePath(rawName, rawValue, rawPath) {\n var shouldEncode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var COOKIE_BREAKER = \";\";\n if (!shouldEncode && (rawName.includes(COOKIE_BREAKER) || \"\".concat(rawValue).includes(COOKIE_BREAKER))) {\n return null;\n }\n var name = shouldEncode ? encodeURIComponent(rawName) : rawName;\n var value = shouldEncode ? encodeURIComponent(rawValue) : rawValue;\n return \"\".concat(name, \"=\").concat(value, \"; \").concat(getCookiePath(rawPath), \";\");\n }\n function isValidCookiePath(rawPath) {\n return rawPath === \"/\" || rawPath === \"none\";\n }\n function getTrustedCookieOffsetMs(offsetExpiresSec) {\n var ONE_YEAR_EXPIRATION_KEYWORD = \"1year\";\n var ONE_DAY_EXPIRATION_KEYWORD = \"1day\";\n var MS_IN_SEC = 1e3;\n var SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n var SECONDS_IN_DAY = 24 * 60 * 60;\n var parsedSec;\n if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_YEAR;\n } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) {\n parsedSec = SECONDS_IN_DAY;\n } else {\n parsedSec = Number.parseInt(offsetExpiresSec, 10);\n if (Number.isNaN(parsedSec)) {\n return null;\n }\n }\n return parsedSec * MS_IN_SEC;\n }\n function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = \"$now$\";\n var CURRENT_DATE_KEYWORD = \"$currentDate$\";\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n function parseCookieString(cookieString) {\n var COOKIE_DELIMITER = \"=\";\n var COOKIE_PAIRS_DELIMITER = \";\";\n var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER);\n var cookieData = {};\n cookieChunks.forEach(function (singleCookie) {\n var cookieKey;\n var cookieValue = \"\";\n var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER);\n if (delimiterIndex === -1) {\n cookieKey = singleCookie.trim();\n } else {\n cookieKey = singleCookie.slice(0, delimiterIndex).trim();\n cookieValue = singleCookie.slice(delimiterIndex + 1);\n }\n cookieData[cookieKey] = cookieValue || null;\n });\n return cookieData;\n }\n function getCookiePath(rawPath) {\n if (rawPath === \"/\") {\n return \"path=/\";\n }\n return \"\";\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetCookieReload.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function trustedSetLocalStorageItem(source, args) {\n function trustedSetLocalStorageItem(source, key, value) {\n if (typeof key === \"undefined\") {\n logMessage(source, \"Item key should be specified\");\n return;\n }\n if (typeof value === \"undefined\") {\n logMessage(source, \"Item value should be specified\");\n return;\n }\n var parsedValue = parseKeywordValue(value);\n var _window = window,\n localStorage = _window.localStorage;\n setStorageItem(source, localStorage, key, parsedValue);\n hit(source);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function setStorageItem(source, storage, key, value) {\n try {\n storage.setItem(key, value);\n } catch (e) {\n var message = \"Unable to set sessionStorage item due to: \".concat(e.message);\n logMessage(source, message);\n }\n }\n function parseKeywordValue(rawValue) {\n var NOW_VALUE_KEYWORD = \"$now$\";\n var CURRENT_DATE_KEYWORD = \"$currentDate$\";\n var parsedValue = rawValue;\n if (rawValue === NOW_VALUE_KEYWORD) {\n parsedValue = Date.now().toString();\n } else if (rawValue === CURRENT_DATE_KEYWORD) {\n parsedValue = Date();\n }\n return parsedValue;\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n trustedSetLocalStorageItem.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n function xmlPrune(source, args) {\n function xmlPrune(source, propsToRemove) {\n var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var urlToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : \"\";\n if (typeof Reflect === \"undefined\" || typeof fetch === \"undefined\" || typeof Proxy === \"undefined\" || typeof Response === \"undefined\") {\n return;\n }\n var shouldPruneResponse = false;\n var urlMatchRegexp = toRegExp(urlToMatch);\n var isXML = function isXML(text) {\n if (typeof text === \"string\") {\n var trimmedText = text.trim();\n if (trimmedText.startsWith(\"<\") && trimmedText.endsWith(\">\")) {\n return true;\n }\n }\n return false;\n };\n var createXMLDocument = function createXMLDocument(text) {\n var xmlParser = new DOMParser();\n var xmlDocument = xmlParser.parseFromString(text, \"text/xml\");\n return xmlDocument;\n };\n var isPruningNeeded = function isPruningNeeded(response, propsToRemove) {\n if (!isXML(response)) {\n return false;\n }\n var docXML = createXMLDocument(response);\n return !!docXML.querySelector(propsToRemove);\n };\n var pruneXML = function pruneXML(text) {\n if (!isXML(text)) {\n shouldPruneResponse = false;\n return text;\n }\n var xmlDoc = createXMLDocument(text);\n var errorNode = xmlDoc.querySelector(\"parsererror\");\n if (errorNode) {\n return text;\n }\n if (optionalProp !== \"\" && xmlDoc.querySelector(optionalProp) === null) {\n shouldPruneResponse = false;\n return text;\n }\n var elems = xmlDoc.querySelectorAll(propsToRemove);\n if (!elems.length) {\n shouldPruneResponse = false;\n return text;\n }\n elems.forEach(function (elem) {\n elem.remove();\n });\n var serializer = new XMLSerializer();\n text = serializer.serializeToString(xmlDoc);\n return text;\n };\n var nativeOpen = window.XMLHttpRequest.prototype.open;\n var nativeSend = window.XMLHttpRequest.prototype.send;\n var xhrData;\n var openWrapper = function openWrapper(target, thisArg, args) {\n xhrData = getXhrData.apply(null, args);\n if (matchRequestProps(source, urlToMatch, xhrData)) {\n thisArg.shouldBePruned = true;\n }\n if (thisArg.shouldBePruned) {\n thisArg.collectedHeaders = [];\n var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) {\n thisArg.collectedHeaders.push(args);\n return Reflect.apply(target, thisArg, args);\n };\n var setRequestHeaderHandler = {\n apply: setRequestHeaderWrapper\n };\n thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler);\n }\n return Reflect.apply(target, thisArg, args);\n };\n var sendWrapper = function sendWrapper(target, thisArg, args) {\n var allowedResponseTypeValues = [\"\", \"text\"];\n if (!thisArg.shouldBePruned || !allowedResponseTypeValues.includes(thisArg.responseType)) {\n return Reflect.apply(target, thisArg, args);\n }\n var forgedRequest = new XMLHttpRequest();\n forgedRequest.addEventListener(\"readystatechange\", function () {\n if (forgedRequest.readyState !== 4) {\n return;\n }\n var readyState = forgedRequest.readyState,\n response = forgedRequest.response,\n responseText = forgedRequest.responseText,\n responseURL = forgedRequest.responseURL,\n responseXML = forgedRequest.responseXML,\n status = forgedRequest.status,\n statusText = forgedRequest.statusText;\n var content = responseText || response;\n if (typeof content !== \"string\") {\n return;\n }\n if (!propsToRemove) {\n if (isXML(response)) {\n var message = \"XMLHttpRequest.open() URL: \".concat(responseURL, \"\\nresponse: \").concat(response);\n logMessage(source, message);\n logMessage(source, createXMLDocument(response), true, false);\n }\n } else {\n shouldPruneResponse = isPruningNeeded(response, propsToRemove);\n }\n var responseContent = shouldPruneResponse ? pruneXML(response) : response;\n Object.defineProperties(thisArg, {\n readyState: {\n value: readyState,\n writable: false\n },\n responseURL: {\n value: responseURL,\n writable: false\n },\n responseXML: {\n value: responseXML,\n writable: false\n },\n status: {\n value: status,\n writable: false\n },\n statusText: {\n value: statusText,\n writable: false\n },\n response: {\n value: responseContent,\n writable: false\n },\n responseText: {\n value: responseContent,\n writable: false\n }\n });\n setTimeout(function () {\n var stateEvent = new Event(\"readystatechange\");\n thisArg.dispatchEvent(stateEvent);\n var loadEvent = new Event(\"load\");\n thisArg.dispatchEvent(loadEvent);\n var loadEndEvent = new Event(\"loadend\");\n thisArg.dispatchEvent(loadEndEvent);\n }, 1);\n hit(source);\n });\n nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);\n thisArg.collectedHeaders.forEach(function (header) {\n var name = header[0];\n var value = header[1];\n forgedRequest.setRequestHeader(name, value);\n });\n thisArg.collectedHeaders = [];\n try {\n nativeSend.call(forgedRequest, args);\n } catch (_unused) {\n return Reflect.apply(target, thisArg, args);\n }\n return undefined;\n };\n var openHandler = {\n apply: openWrapper\n };\n var sendHandler = {\n apply: sendWrapper\n };\n XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler);\n XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler);\n var nativeFetch = window.fetch;\n var fetchWrapper = async function fetchWrapper(target, thisArg, args) {\n var fetchURL = args[0] instanceof Request ? args[0].url : args[0];\n if (typeof fetchURL !== \"string\" || fetchURL.length === 0) {\n return Reflect.apply(target, thisArg, args);\n }\n if (urlMatchRegexp.test(fetchURL)) {\n var response = await nativeFetch(...args);\n var clonedResponse = response.clone();\n var responseText = await response.text();\n shouldPruneResponse = isPruningNeeded(responseText, propsToRemove);\n if (!shouldPruneResponse) {\n var message = \"fetch URL: \".concat(fetchURL, \"\\nresponse text: \").concat(responseText);\n logMessage(source, message);\n logMessage(source, createXMLDocument(responseText), true, false);\n return clonedResponse;\n }\n var prunedText = pruneXML(responseText);\n if (shouldPruneResponse) {\n hit(source);\n return new Response(prunedText, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n return clonedResponse;\n }\n return Reflect.apply(target, thisArg, args);\n };\n var fetchHandler = {\n apply: fetchWrapper\n };\n window.fetch = new Proxy(window.fetch, fetchHandler);\n }\n function hit(source) {\n if (source.verbose !== true) {\n return;\n }\n try {\n var log = console.log.bind(console);\n var trace = console.trace.bind(console);\n var prefix = source.ruleText || \"\";\n if (source.domainName) {\n var AG_SCRIPTLET_MARKER = \"#%#//\";\n var UBO_SCRIPTLET_MARKER = \"##+js\";\n var ruleStartIndex;\n if (source.ruleText.includes(AG_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER);\n } else if (source.ruleText.includes(UBO_SCRIPTLET_MARKER)) {\n ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER);\n }\n var rulePart = source.ruleText.slice(ruleStartIndex);\n prefix = \"\".concat(source.domainName).concat(rulePart);\n }\n log(\"\".concat(prefix, \" trace start\"));\n if (trace) {\n trace();\n }\n log(\"\".concat(prefix, \" trace end\"));\n } catch (e) {}\n if (typeof window.__debug === \"function\") {\n window.__debug(source);\n }\n }\n function logMessage(source, message) {\n var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var convertMessageToString = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var name = source.name,\n verbose = source.verbose;\n if (!forced && !verbose) {\n return;\n }\n var nativeConsole = console.log;\n if (!convertMessageToString) {\n nativeConsole(\"\".concat(name, \":\"), message);\n return;\n }\n nativeConsole(\"\".concat(name, \": \").concat(message));\n }\n function toRegExp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var DEFAULT_VALUE = \".?\";\n var FORWARD_SLASH = \"/\";\n if (input === \"\") {\n return new RegExp(DEFAULT_VALUE);\n }\n var delimiterIndex = input.lastIndexOf(FORWARD_SLASH);\n var flagsPart = input.substring(delimiterIndex + 1);\n var regExpPart = input.substring(0, delimiterIndex + 1);\n var isValidRegExpFlag = function isValidRegExpFlag(flag) {\n if (!flag) {\n return false;\n }\n try {\n new RegExp(\"\", flag);\n return true;\n } catch (ex) {\n return false;\n }\n };\n var getRegExpFlags = function getRegExpFlags(regExpStr, flagsStr) {\n if (regExpStr.startsWith(FORWARD_SLASH) && regExpStr.endsWith(FORWARD_SLASH) && !regExpStr.endsWith(\"\\\\/\") && isValidRegExpFlag(flagsStr)) {\n return flagsStr;\n }\n return \"\";\n };\n var flags = getRegExpFlags(regExpPart, flagsPart);\n if (input.startsWith(FORWARD_SLASH) && input.endsWith(FORWARD_SLASH) || flags) {\n var regExpInput = flags ? regExpPart : input;\n return new RegExp(regExpInput.slice(1, -1), flags);\n }\n var escaped = input.replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped);\n }\n function getXhrData(method, url, async, user, password) {\n return {\n method: method,\n url: url,\n async: async,\n user: user,\n password: password\n };\n }\n function matchRequestProps(source, propsToMatch, requestData) {\n if (propsToMatch === \"\" || propsToMatch === \"*\") {\n return true;\n }\n var isMatched;\n var parsedData = parseMatchProps(propsToMatch);\n if (!isValidParsedData(parsedData)) {\n logMessage(source, \"Invalid parameter: \".concat(propsToMatch));\n isMatched = false;\n } else {\n var matchData = getMatchPropsData(parsedData);\n var matchKeys = Object.keys(matchData);\n isMatched = matchKeys.every(function (matchKey) {\n var matchValue = matchData[matchKey];\n var dataValue = requestData[matchKey];\n return Object.prototype.hasOwnProperty.call(requestData, matchKey) && typeof dataValue === \"string\" && (matchValue === null || matchValue === void 0 ? void 0 : matchValue.test(dataValue));\n });\n }\n return isMatched;\n }\n function getMatchPropsData(data) {\n var matchData = {};\n var dataKeys = Object.keys(data);\n dataKeys.forEach(function (key) {\n matchData[key] = toRegExp(data[key]);\n });\n return matchData;\n }\n function getRequestProps() {\n return [\"url\", \"method\", \"headers\", \"body\", \"credentials\", \"cache\", \"redirect\", \"referrer\", \"referrerPolicy\", \"integrity\", \"keepalive\", \"signal\", \"mode\"];\n }\n function isValidParsedData(data) {\n return Object.values(data).every(function (value) {\n return isValidStrPattern(value);\n });\n }\n function parseMatchProps(propsToMatchStr) {\n var PROPS_DIVIDER = \" \";\n var PAIRS_MARKER = \":\";\n var isRequestProp = function isRequestProp(prop) {\n return getRequestProps().includes(prop);\n };\n var propsObj = {};\n var props = propsToMatchStr.split(PROPS_DIVIDER);\n props.forEach(function (prop) {\n var dividerInd = prop.indexOf(PAIRS_MARKER);\n var key = prop.slice(0, dividerInd);\n if (isRequestProp(key)) {\n var value = prop.slice(dividerInd + 1);\n propsObj[key] = value;\n } else {\n propsObj.url = prop;\n }\n });\n return propsObj;\n }\n function isValidStrPattern(input) {\n var FORWARD_SLASH = \"/\";\n var str = escapeRegExp(input);\n if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) {\n str = input.slice(1, -1);\n }\n var isValid;\n try {\n isValid = new RegExp(str);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n return isValid;\n }\n function escapeRegExp(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n var updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n xmlPrune.apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }\n }\n var scriptletsMap = {\n \"abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-current-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script.js\": abortCurrentInlineScript,\n \"acs.js\": abortCurrentInlineScript,\n \"ubo-acs.js\": abortCurrentInlineScript,\n \"ubo-abort-current-script\": abortCurrentInlineScript,\n \"ubo-acs\": abortCurrentInlineScript,\n \"abort-current-inline-script.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script.js\": abortCurrentInlineScript,\n \"acis.js\": abortCurrentInlineScript,\n \"ubo-acis.js\": abortCurrentInlineScript,\n \"ubo-abort-current-inline-script\": abortCurrentInlineScript,\n \"ubo-acis\": abortCurrentInlineScript,\n \"abp-abort-current-inline-script\": abortCurrentInlineScript,\n \"abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-read.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read.js\": abortOnPropertyRead,\n \"aopr.js\": abortOnPropertyRead,\n \"ubo-aopr.js\": abortOnPropertyRead,\n \"ubo-abort-on-property-read\": abortOnPropertyRead,\n \"ubo-aopr\": abortOnPropertyRead,\n \"abp-abort-on-property-read\": abortOnPropertyRead,\n \"abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-property-write.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write.js\": abortOnPropertyWrite,\n \"aopw.js\": abortOnPropertyWrite,\n \"ubo-aopw.js\": abortOnPropertyWrite,\n \"ubo-abort-on-property-write\": abortOnPropertyWrite,\n \"ubo-aopw\": abortOnPropertyWrite,\n \"abp-abort-on-property-write\": abortOnPropertyWrite,\n \"abort-on-stack-trace\": abortOnStackTrace,\n \"abort-on-stack-trace.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace.js\": abortOnStackTrace,\n \"aost.js\": abortOnStackTrace,\n \"ubo-aost.js\": abortOnStackTrace,\n \"ubo-abort-on-stack-trace\": abortOnStackTrace,\n \"ubo-aost\": abortOnStackTrace,\n \"abp-abort-on-stack-trace\": abortOnStackTrace,\n \"adjust-setInterval\": adjustSetInterval,\n \"nano-setInterval-booster.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster.js\": adjustSetInterval,\n \"nano-sib.js\": adjustSetInterval,\n \"ubo-nano-sib.js\": adjustSetInterval,\n \"ubo-nano-setInterval-booster\": adjustSetInterval,\n \"ubo-nano-sib\": adjustSetInterval,\n \"adjust-setTimeout\": adjustSetTimeout,\n \"nano-setTimeout-booster.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster.js\": adjustSetTimeout,\n \"nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-stb.js\": adjustSetTimeout,\n \"ubo-nano-setTimeout-booster\": adjustSetTimeout,\n \"ubo-nano-stb\": adjustSetTimeout,\n \"debug-current-inline-script\": debugCurrentInlineScript,\n \"debug-on-property-read\": debugOnPropertyRead,\n \"debug-on-property-write\": debugOnPropertyWrite,\n \"dir-string\": dirString,\n \"disable-newtab-links\": disableNewtabLinks,\n \"disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links.js\": disableNewtabLinks,\n \"ubo-disable-newtab-links\": disableNewtabLinks,\n \"evaldata-prune\": evalDataPrune,\n \"evaldata-prune.js\": evalDataPrune,\n \"ubo-evaldata-prune.js\": evalDataPrune,\n \"ubo-evaldata-prune\": evalDataPrune,\n \"close-window\": forceWindowClose,\n \"window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if.js\": forceWindowClose,\n \"ubo-window-close-if\": forceWindowClose,\n \"hide-in-shadow-dom\": hideInShadowDom,\n \"inject-css-in-shadow-dom\": injectCssInShadowDom,\n \"json-prune\": jsonPrune,\n \"json-prune.js\": jsonPrune,\n \"ubo-json-prune.js\": jsonPrune,\n \"ubo-json-prune\": jsonPrune,\n \"abp-json-prune\": jsonPrune,\n log: log,\n \"log-addEventListener\": logAddEventListener,\n \"addEventListener-logger.js\": logAddEventListener,\n \"ubo-addEventListener-logger.js\": logAddEventListener,\n \"aell.js\": logAddEventListener,\n \"ubo-aell.js\": logAddEventListener,\n \"ubo-addEventListener-logger\": logAddEventListener,\n \"ubo-aell\": logAddEventListener,\n \"log-eval\": logEval,\n \"log-on-stack-trace\": logOnStacktrace,\n \"m3u-prune\": m3uPrune,\n \"m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune.js\": m3uPrune,\n \"ubo-m3u-prune\": m3uPrune,\n \"no-topics\": noTopics,\n noeval: noeval,\n \"noeval.js\": noeval,\n \"silent-noeval.js\": noeval,\n \"ubo-noeval.js\": noeval,\n \"ubo-silent-noeval.js\": noeval,\n \"ubo-noeval\": noeval,\n \"ubo-silent-noeval\": noeval,\n nowebrtc: nowebrtc,\n \"nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc.js\": nowebrtc,\n \"ubo-nowebrtc\": nowebrtc,\n \"prevent-addEventListener\": preventAddEventListener,\n \"addEventListener-defuser.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser.js\": preventAddEventListener,\n \"aeld.js\": preventAddEventListener,\n \"ubo-aeld.js\": preventAddEventListener,\n \"ubo-addEventListener-defuser\": preventAddEventListener,\n \"ubo-aeld\": preventAddEventListener,\n \"prevent-adfly\": preventAdfly,\n \"adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser.js\": preventAdfly,\n \"ubo-adfly-defuser\": preventAdfly,\n \"prevent-bab\": preventBab,\n \"prevent-element-src-loading\": preventElementSrcLoading,\n \"prevent-eval-if\": preventEvalIf,\n \"noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if.js\": preventEvalIf,\n \"ubo-noeval-if\": preventEvalIf,\n \"prevent-fab-3.2.0\": preventFab,\n \"nofab.js\": preventFab,\n \"ubo-nofab.js\": preventFab,\n \"fuckadblock.js-3.2.0\": preventFab,\n \"ubo-fuckadblock.js-3.2.0\": preventFab,\n \"ubo-nofab\": preventFab,\n \"prevent-fetch\": preventFetch,\n \"no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if.js\": preventFetch,\n \"ubo-no-fetch-if\": preventFetch,\n \"prevent-popads-net\": preventPopadsNet,\n \"popads.net.js\": preventPopadsNet,\n \"ubo-popads.net.js\": preventPopadsNet,\n \"ubo-popads.net\": preventPopadsNet,\n \"prevent-refresh\": preventRefresh,\n \"refresh-defuser.js\": preventRefresh,\n \"refresh-defuser\": preventRefresh,\n \"ubo-refresh-defuser.js\": preventRefresh,\n \"ubo-refresh-defuser\": preventRefresh,\n \"prevent-requestAnimationFrame\": preventRequestAnimationFrame,\n \"no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if.js\": preventRequestAnimationFrame,\n \"norafif.js\": preventRequestAnimationFrame,\n \"ubo-norafif.js\": preventRequestAnimationFrame,\n \"ubo-no-requestAnimationFrame-if\": preventRequestAnimationFrame,\n \"ubo-norafif\": preventRequestAnimationFrame,\n \"prevent-setInterval\": preventSetInterval,\n \"no-setInterval-if.js\": preventSetInterval,\n \"ubo-no-setInterval-if.js\": preventSetInterval,\n \"setInterval-defuser.js\": preventSetInterval,\n \"ubo-setInterval-defuser.js\": preventSetInterval,\n \"nosiif.js\": preventSetInterval,\n \"ubo-nosiif.js\": preventSetInterval,\n \"sid.js\": preventSetInterval,\n \"ubo-sid.js\": preventSetInterval,\n \"ubo-no-setInterval-if\": preventSetInterval,\n \"ubo-setInterval-defuser\": preventSetInterval,\n \"ubo-nosiif\": preventSetInterval,\n \"ubo-sid\": preventSetInterval,\n \"prevent-setTimeout\": preventSetTimeout,\n \"no-setTimeout-if.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if.js\": preventSetTimeout,\n \"nostif.js\": preventSetTimeout,\n \"ubo-nostif.js\": preventSetTimeout,\n \"ubo-no-setTimeout-if\": preventSetTimeout,\n \"ubo-nostif\": preventSetTimeout,\n \"setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser.js\": preventSetTimeout,\n \"ubo-setTimeout-defuser\": preventSetTimeout,\n \"std.js\": preventSetTimeout,\n \"ubo-std.js\": preventSetTimeout,\n \"ubo-std\": preventSetTimeout,\n \"prevent-window-open\": preventWindowOpen,\n \"window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser.js\": preventWindowOpen,\n \"ubo-window.open-defuser\": preventWindowOpen,\n \"nowoif.js\": preventWindowOpen,\n \"ubo-nowoif.js\": preventWindowOpen,\n \"ubo-nowoif\": preventWindowOpen,\n \"prevent-xhr\": preventXHR,\n \"no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if.js\": preventXHR,\n \"ubo-no-xhr-if\": preventXHR,\n \"remove-attr\": removeAttr,\n \"remove-attr.js\": removeAttr,\n \"ubo-remove-attr.js\": removeAttr,\n \"ra.js\": removeAttr,\n \"ubo-ra.js\": removeAttr,\n \"ubo-remove-attr\": removeAttr,\n \"ubo-ra\": removeAttr,\n \"remove-class\": removeClass,\n \"remove-class.js\": removeClass,\n \"ubo-remove-class.js\": removeClass,\n \"rc.js\": removeClass,\n \"ubo-rc.js\": removeClass,\n \"ubo-remove-class\": removeClass,\n \"ubo-rc\": removeClass,\n \"remove-cookie\": removeCookie,\n \"cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover.js\": removeCookie,\n \"ubo-cookie-remover\": removeCookie,\n \"remove-in-shadow-dom\": removeInShadowDom,\n \"remove-node-text\": removeNodeText,\n \"remove-node-text.js\": removeNodeText,\n \"ubo-remove-node-text.js\": removeNodeText,\n \"rmnt.js\": removeNodeText,\n \"ubo-rmnt.js\": removeNodeText,\n \"ubo-remove-node-text\": removeNodeText,\n \"ubo-rmnt\": removeNodeText,\n \"set-attr\": setAttr,\n \"set-constant\": setConstant,\n \"set-constant.js\": setConstant,\n \"ubo-set-constant.js\": setConstant,\n \"set.js\": setConstant,\n \"ubo-set.js\": setConstant,\n \"ubo-set-constant\": setConstant,\n \"ubo-set\": setConstant,\n \"abp-override-property-read\": setConstant,\n \"set-cookie\": setCookie,\n \"set-cookie-reload\": setCookieReload,\n \"set-local-storage-item\": setLocalStorageItem,\n \"set-popads-dummy\": setPopadsDummy,\n \"popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy.js\": setPopadsDummy,\n \"ubo-popads-dummy\": setPopadsDummy,\n \"set-session-storage-item\": setSessionStorageItem,\n \"trusted-click-element\": trustedClickElement,\n \"trusted-replace-fetch-response\": trustedReplaceFetchResponse,\n \"trusted-replace-node-text\": trustedReplaceNodeText,\n \"trusted-replace-xhr-response\": trustedReplaceXhrResponse,\n \"trusted-set-constant\": trustedSetConstant,\n \"trusted-set-cookie\": trustedSetCookie,\n \"trusted-set-cookie-reload\": trustedSetCookieReload,\n \"trusted-set-local-storage-item\": trustedSetLocalStorageItem,\n \"xml-prune\": xmlPrune,\n \"xml-prune.js\": xmlPrune,\n \"ubo-xml-prune.js\": xmlPrune,\n \"ubo-xml-prune\": xmlPrune\n };\n var getScriptletFunction = function getScriptletFunction(name) {\n return scriptletsMap[name];\n };\n\n /**\n * @typedef {object} Source Scriptlet properties.\n * @property {string} name Scriptlet name.\n * @property {Array} args Arguments for scriptlet function.\n * @property {'extension'|'corelibs'|'test'} engine Defines the final form of scriptlet string presentation.\n * @property {string} [version] Extension version.\n * @property {boolean} [verbose] Flag to enable debug information printing to console.\n * @property {string} [ruleText] Source rule text, needed for debug purposes.\n * @property {string} [domainName] Domain name where scriptlet is applied, needed for debug purposes.\n */\n\n /**\n * Returns scriptlet code by `source`.\n *\n * @param {Source} source Scriptlet properties.\n *\n * @returns {string|null} Scriptlet code.\n * @throws An error on unknown scriptlet name.\n */\n function getScriptletCode(source) {\n if (!validator.isValidScriptletName(source.name)) {\n return null;\n }\n var scriptletFunction = getScriptletFunction(source.name);\n // In case isValidScriptletName check will pass invalid scriptlet name,\n // for example when there is a bad alias\n if (typeof scriptletFunction !== 'function') {\n throw new Error(\"Error: cannot invoke scriptlet with name: '\".concat(source.name, \"'\"));\n }\n var scriptletFunctionString = scriptletFunction.toString();\n var result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunctionString) : passSourceAndProps(source, scriptletFunctionString);\n return result;\n }\n\n /**\n * Scriptlets variable\n *\n * @returns {object} object with methods:\n * `invoke` method receives one argument with `Source` type\n * `validate` method receives one argument with `String` type\n */\n var scriptletsObject = function () {\n return {\n invoke: getScriptletCode,\n getScriptletFunction,\n isValidScriptletName: validator.isValidScriptletName,\n isValidScriptletRule,\n isAdgScriptletRule: validator.isAdgScriptletRule,\n isUboScriptletRule: validator.isUboScriptletRule,\n isAbpSnippetRule: validator.isAbpSnippetRule,\n convertUboToAdg: convertUboScriptletToAdg,\n convertAbpToAdg: convertAbpSnippetToAdg,\n convertScriptletToAdg,\n convertAdgToUbo: convertAdgScriptletToUbo,\n redirects\n };\n }();\n\n /**\n * Add module exports to be used as node package\n */\n module.exports = scriptletsObject;\n\n}));\n\n/**\n * -------------------------------------------\n * | |\n * | If you want to add your own scriptlet |\n * | please put your code below |\n * | |\n * -------------------------------------------\n */\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.bowser=t():e.bowser=t()}(this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,\"a\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\"\",r(r.s=90)}({17:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n=r(18),i=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||\"\"},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||\"\"},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}},e.getMacOSVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return\"Leopard\";case 6:return\"Snow Leopard\";case 7:return\"Lion\";case 8:return\"Mountain Lion\";case 9:return\"Mavericks\";case 10:return\"Yosemite\";case 11:return\"El Capitan\";case 12:return\"Sierra\";case 13:return\"High Sierra\";case 14:return\"Mojave\";case 15:return\"Catalina\";default:return}},e.getAndroidVersionName=function(e){var t=e.split(\".\").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?\"Cupcake\":1===t[0]&&t[1]>=6?\"Donut\":2===t[0]&&t[1]<2?\"Eclair\":2===t[0]&&2===t[1]?\"Froyo\":2===t[0]&&t[1]>2?\"Gingerbread\":3===t[0]?\"Honeycomb\":4===t[0]&&t[1]<1?\"Ice Cream Sandwich\":4===t[0]&&t[1]<4?\"Jelly Bean\":4===t[0]&&t[1]>=4?\"KitKat\":5===t[0]?\"Lollipop\":6===t[0]?\"Marshmallow\":7===t[0]?\"Nougat\":8===t[0]?\"Oreo\":9===t[0]?\"Pie\":void 0},e.getVersionPrecision=function(e){return e.split(\".\").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),a=Math.max(i,s),o=0,u=e.map([t,r],(function(t){var r=a-e.getVersionPrecision(t),n=t+new Array(r+1).join(\".0\");return e.map(n.split(\".\"),(function(e){return new Array(20-e.length).join(\"0\")+e})).reverse()}));for(n&&(o=a-Math.min(i,s)),a-=1;a>=o;){if(u[0][a]>u[1][a])return 1;if(u[0][a]===u[1][a]){if(a===o)return 0;a-=1}else if(u[0][a]1?i-1:0),a=1;a0){var a=Object.keys(r),u=o.default.find(a,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=o.default.find(a,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(s>0){var l=Object.keys(i),h=o.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(i[h])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=o.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if(\"string\"==typeof i)return\">\"===e[0]||\"<\"===e[0]?(r=e.substr(1),\"=\"===e[1]?(n=!0,r=e.substr(2)):t=[],\">\"===e[0]?t.push(1):t.push(-1)):\"=\"===e[0]?r=e.substr(1):\"~\"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(o.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\\/(\\d+(\\.?_?\\d+)+)/i,a=[{test:[/googlebot/i],describe:function(e){var t={name:\"Googlebot\"},r=i.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\\/|opios/i],describe:function(e){var t={name:\"Opera\"},r=i.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:\"Samsung Internet for Android\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:\"NAVER Whale Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:\"MZ Browser\"},r=i.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:\"Focus\"},r=i.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:\"Swing\"},r=i.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:\"Opera Coast\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\\/\\d+(?:.?_?\\d+)+/i],describe:function(e){var t={name:\"Opera Touch\"},r=i.default.getFirstMatch(/(?:opt)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:\"Yandex Browser\"},r=i.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:\"UC Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:\"Maxthon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:\"Epiphany\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:\"Puffin\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:\"Sleipnir\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:\"K-Meleon\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:\"WeChat\"},r=i.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?\"QQ Browser Lite\":\"QQ Browser\"},r=i.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:\"Internet Explorer\"},r=i.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\\sedg\\//i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:\"Microsoft Edge\"},r=i.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:\"Vivaldi\"},r=i.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:\"SeaMonkey\"},r=i.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:\"Sailfish\"},r=i.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:\"Amazon Silk\"},r=i.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:\"PhantomJS\"},r=i.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:\"SlimerJS\"},r=i.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t={name:\"BlackBerry\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:\"WebOS Browser\"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:\"Bada\"},r=i.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:\"Tizen\"},r=i.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:\"QupZilla\"},r=i.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:\"Firefox\"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:\"Electron\"},r=i.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:\"Miui\"},r=i.default.getFirstMatch(/(?:MiuiBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:\"Chromium\"},r=i.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:\"Chrome\"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:\"Google Search\"},r=i.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:\"Android Browser\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:\"PlayStation 4\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:\"Safari\"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search(\"\\\\(\")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=a,e.exports=t.default},93:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/Roku\\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,e);return{name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,e),r=i.default.getWindowsVersionName(t);return{name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(e){var t={name:s.OS_MAP.iOS},r=i.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,e).replace(/[_\\s]/g,\".\"),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,e).replace(/[_\\s]/g,\".\");return{name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,e)||i.default.getFirstMatch(/\\bbb(\\d+)/i,e);return{name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:s.OS_MAP.PlayStation4,version:t}}}];t.default=a,e.exports=t.default},94:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/googlebot/i],describe:function(){return{type:\"bot\",vendor:\"Google\"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&\"Nova\",r={type:s.PLATFORMS_MAP.mobile,vendor:\"Huawei\"};return t&&(r.model=t),r}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Nexus\"}}},{test:[/ipad/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Apple\",model:\"iPad\"}}},{test:[/kftt build/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\",model:\"Kindle Fire HD 7\"}}},{test:[/silk/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet,vendor:\"Amazon\"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:s.PLATFORMS_MAP.mobile,vendor:\"Apple\",model:t}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Nexus\"}}},{test:[/[^-]mobi/i],describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"blackberry\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"BlackBerry\"}}},{test:function(e){return\"bada\"===e.getBrowserName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"windows phone\"===e.getBrowserName()},describe:function(){return{type:s.PLATFORMS_MAP.mobile,vendor:\"Microsoft\"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(\".\")[0]);return\"android\"===e.getOSName(!0)&&t>=3},describe:function(){return{type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return\"android\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return\"macos\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop,vendor:\"Apple\"}}},{test:function(e){return\"windows\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"linux\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return\"playstation 4\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}},{test:function(e){return\"roku\"===e.getOSName(!0)},describe:function(){return{type:s.PLATFORMS_MAP.tv}}}];t.default=a,e.exports=t.default},95:function(e,t,r){\"use strict\";t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:function(e){return\"microsoft edge\"===e.getBrowserName(!0)},describe:function(e){if(/\\sedg\\//i.test(e))return{name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,e);return{name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=a,e.exports=t.default}})}));","!function(g,c){typeof exports==\"object\"&&typeof module!=\"undefined\"?c(exports):typeof define==\"function\"&&define.amd?define([\"exports\"],c):c((g=g||self).lru_map=g.lru_map||{})}(this,function(g){const c=Symbol(\"newer\"),e=Symbol(\"older\");class n{constructor(a,b){typeof a!==\"number\"&&(b=a,a=0),this.size=0,this.limit=a,this.oldest=this.newest=void 0,this._keymap=new Map(),b&&(this.assign(b),a<1&&(this.limit=this.size))}_markEntryAsUsed(a){if(a===this.newest)return;a[c]&&(a===this.oldest&&(this.oldest=a[c]),a[c][e]=a[e]),a[e]&&(a[e][c]=a[c]),a[c]=void 0,a[e]=this.newest,this.newest&&(this.newest[c]=a),this.newest=a}assign(a){let b,d=this.limit||Number.MAX_VALUE;this._keymap.clear();let m=a[Symbol.iterator]();for(let h=m.next();!h.done;h=m.next()){let f=new l(h.value[0],h.value[1]);this._keymap.set(f.key,f),b?(b[c]=f,f[e]=b):this.oldest=f,b=f;if(d--==0)throw new Error(\"overflow\")}this.newest=b,this.size=this._keymap.size}get(a){var b=this._keymap.get(a);return b?(this._markEntryAsUsed(b),b.value):void 0}set(a,b){var d=this._keymap.get(a);return d?(d.value=b,this._markEntryAsUsed(d),this):(this._keymap.set(a,d=new l(a,b)),this.newest?(this.newest[c]=d,d[e]=this.newest):this.oldest=d,this.newest=d,++this.size,this.size>this.limit&&this.shift(),this)}shift(){var a=this.oldest;if(a)return this.oldest[c]?(this.oldest=this.oldest[c],this.oldest[e]=void 0):(this.oldest=void 0,this.newest=void 0),a[c]=a[e]=void 0,this._keymap.delete(a.key),--this.size,[a.key,a.value]}find(a){let b=this._keymap.get(a);return b?b.value:void 0}has(a){return this._keymap.has(a)}delete(a){var b=this._keymap.get(a);return b?(this._keymap.delete(b.key),b[c]&&b[e]?(b[e][c]=b[c],b[c][e]=b[e]):b[c]?(b[c][e]=void 0,this.oldest=b[c]):b[e]?(b[e][c]=void 0,this.newest=b[e]):this.oldest=this.newest=void 0,this.size--,b.value):void 0}clear(){this.oldest=this.newest=void 0,this.size=0,this._keymap.clear()}keys(){return new j(this.oldest)}values(){return new k(this.oldest)}entries(){return this}[Symbol.iterator](){return new i(this.oldest)}forEach(a,b){typeof b!==\"object\"&&(b=this);let d=this.oldest;for(;d;)a.call(b,d.value,d.key,this),d=d[c]}toJSON(){for(var a=new Array(this.size),b=0,d=this.oldest;d;)a[b++]={key:d.key,value:d.value},d=d[c];return a}toString(){for(var a=\"\",b=this.oldest;b;)a+=String(b.key)+\":\"+b.value,b=b[c],b&&(a+=\" < \");return a}}g.LRUMap=n;function l(a,b){this.key=a,this.value=b,this[c]=void 0,this[e]=void 0}function i(a){this.entry=a}i.prototype[Symbol.iterator]=function(){return this},i.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:[a.key,a.value]}):{done:!0,value:void 0}};function j(a){this.entry=a}j.prototype[Symbol.iterator]=function(){return this},j.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.key}):{done:!0,value:void 0}};function k(a){this.entry=a}k.prototype[Symbol.iterator]=function(){return this},k.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.value}):{done:!0,value:void 0}}});\n//# sourceMappingURL=lru.js.map\n","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */\n\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n\n /* vim: set sts=2 sw=2 et tw=80: */\n\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!globalThis.chrome?.runtime?.id) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n\n if (typeof globalThis.browser === \"undefined\" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n\n\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n\n return super.get(key);\n }\n\n }\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n\n\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n\n\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n\n\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args); // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n\n\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n\n });\n };\n\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy}\n */\n\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n\n if (!(prop in target)) {\n return undefined;\n }\n\n let value = target[prop];\n\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n\n get() {\n return target[prop];\n },\n\n set(value) {\n target[prop] = value;\n }\n\n });\n return value;\n }\n\n cache[prop] = value;\n return value;\n },\n\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n\n return true;\n },\n\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n\n }; // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n\n\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n\n });\n\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n\n\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {}\n /* wrappers */\n , {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n\n\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n\n const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n } // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n\n\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n }; // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n\n\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n } // Let Chrome know that the listener is replying.\n\n\n return true;\n };\n });\n\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n }; // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n\n\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","/* (ignored) */","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Splits the string by the delimiter, ignoring escaped delimiters\n * and without tokenizing.\n * Works for plain strings that don't include string representation of\n * complex entities, e.g $replace modifier values.\n *\n * @param string - string to split\n * @param delimiter - delimiter\n * @param escapeCharacter - escape character\n * @param preserveEmptyTokens - if true, preserve empty parts\n * @param shouldUnescape - if true, unescape characters\n * @return array of string parts\n */\nfunction splitByDelimiterWithEscapeCharacter(string, delimiter, escapeCharacter, preserveEmptyTokens, shouldUnescape) {\n if (shouldUnescape === void 0) { shouldUnescape = true; }\n if (!string) {\n return [];\n }\n if (string.startsWith(delimiter)) {\n // eslint-disable-next-line no-param-reassign\n string = string.substring(1);\n }\n var words = [];\n if (!string.includes(escapeCharacter)) {\n words = string.split(delimiter);\n if (!preserveEmptyTokens) {\n words = words.filter(function (word) { return !!word; });\n }\n return words;\n }\n var chars = [];\n var makeWord = function () {\n var word = chars.join('');\n words.push(word);\n chars = [];\n };\n for (var i = 0; i < string.length; i += 1) {\n var char = string.charAt(i);\n var isLastChar = i === (string.length - 1);\n if (char === delimiter) {\n var isEscapedChar = i > 0 && string[i - 1] === escapeCharacter;\n if (isEscapedChar) {\n if (shouldUnescape) {\n chars.splice(chars.length - 1, 1);\n }\n chars.push(char);\n }\n else {\n makeWord();\n }\n if (isLastChar) {\n makeWord();\n }\n }\n else if (isLastChar) {\n chars.push(char);\n makeWord();\n }\n else {\n chars.push(char);\n }\n }\n if (!preserveEmptyTokens) {\n words = words.filter(function (word) { return !!word; });\n }\n return words;\n}\n/**\n * Checks if the specified string starts with a substr at the specified index.\n *\n * @param str - String to check\n * @param startIndex - Index to start checking from\n * @param substr - Substring to check\n * @return boolean true if it does start\n */\nfunction startsAtIndexWith(str, startIndex, substr) {\n if (str.length - startIndex < substr.length) {\n return false;\n }\n for (var i = 0; i < substr.length; i += 1) {\n if (str.charAt(startIndex + i) !== substr.charAt(i)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Checks if str has unquoted substr\n *\n * @param str\n * @param substr\n */\nfunction hasUnquotedSubstring(str, substr) {\n var quotes = ['\"', \"'\", '/'];\n if (!str.includes(substr)) {\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n if (indexOfAny(str, quotes) === -1) {\n return true;\n }\n var stack = [];\n for (var i = 0; i < str.length; i += 1) {\n var cursor = str[i];\n if (stack.length === 0) {\n if (startsAtIndexWith(str, i, substr)) {\n return true;\n }\n }\n if (quotes.indexOf(cursor) >= 0\n && (i === 0 || str[i - 1] !== '\\\\')) {\n var last = stack.pop();\n if (!last) {\n stack.push(cursor);\n }\n else if (last !== cursor) {\n stack.push(last);\n stack.push(cursor);\n }\n }\n }\n return false;\n}\n/**\n * djb2 hash algorithm\n *\n * @param str string to get hash\n * @param begin index from\n * @param end index to\n * @return {number} hash\n */\nfunction fastHashBetween(str, begin, end) {\n var hash = 5381;\n for (var idx = begin; idx < end; idx += 1) {\n hash = 33 * hash + str.charCodeAt(idx);\n }\n return hash;\n}\n/**\n * djb2 hash algorithm\n *\n * @param str string to get hash\n * @return {number} hash\n */\nfunction fastHash(str) {\n if (str === '') {\n return 0;\n }\n var len = str.length;\n return fastHashBetween(str, 0, len);\n}\n/**\n * Look for any symbol from \"chars\" array starting at \"start\" index or from the start of the string\n *\n * @param str String to search\n * @param chars Chars to search for\n * @param start Start index (optional, inclusive)\n * @return int Index of the element found or -1 if not\n */\nfunction indexOfAny(str, chars, start) {\n if (start === void 0) { start = 0; }\n if (str.length <= start) {\n return -1;\n }\n for (var i = start; i < str.length; i += 1) {\n var c = str.charAt(i);\n if (chars.indexOf(c) > -1) {\n return i;\n }\n }\n return -1;\n}\n/**\n * Replaces all occurences of find with replace in str\n *\n * @param str\n * @param find\n * @param replace\n */\nfunction replaceAll(str, find, replace) {\n if (!str) {\n return str;\n }\n return str.split(find).join(replace);\n}\n/**\n * Checks if arrays are equal\n *\n * @param left array\n * @param right array\n * @return {boolean} true on equality\n */\nfunction stringArraysEquals(left, right) {\n if (!left || !right) {\n return !left && !right;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (var i = 0; i < left.length; i += 1) {\n if (left[i] !== right[i]) {\n return false;\n }\n }\n return true;\n}\n/**\n * Checks if arrays have an intersection\n *\n * @param left array\n * @param right array\n * @return {boolean} true on equality\n */\nfunction stringArraysHaveIntersection(left, right) {\n if (!left || !right) {\n return true;\n }\n for (var i = 0; i < left.length; i += 1) {\n if (right.includes(left[i])) {\n return true;\n }\n }\n return false;\n}\n\n/* eslint-disable prefer-regex-literals */\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp\n// should be escaped . * + ? ^ $ { } ( ) | [ ] / \\\n// except of * | ^\nvar specialCharacters = ['.', '+', '?', '$', '{', '}', '(', ')', '[', ']', '/', '\\\\'];\nvar reSpecialCharacters = new RegExp(\"[\".concat(specialCharacters.join('\\\\'), \"]\"), 'g');\nvar reSpecialCharactersFull = /[.*+?^${}()|[\\]\\\\]/g;\nvar reEscapedSpecialCharactersFull = /\\\\[.*+?^${}()|[\\]\\\\]/g;\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings\nvar escapeSequence = {\n n: '\\n',\n r: '\\r',\n t: '\\t',\n b: '\\b',\n f: '\\f',\n v: '\\v',\n};\n/**\n * Class with static helper methods for working with basic filtering rules patterns.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules\n */\nvar SimpleRegex = /** @class */ (function () {\n function SimpleRegex() {\n }\n /**\n * Extracts the shortcut from the rule's pattern.\n * Shortcut is the longest substring of the pattern that does not contain\n * any special characters.\n *\n * Please note, that the shortcut is always lower-case!\n *\n * @param pattern - network rule's pattern.\n * @returns the shortcut or the empty string if we could not extract any.\n */\n SimpleRegex.extractShortcut = function (pattern) {\n if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) {\n return this.extractRegexpShortcut(pattern);\n }\n return this.extractBasicShortcut(pattern);\n };\n /**\n * Searches for the longest substring of the pattern that\n * does not contain any special characters: *,^,|.\n *\n * @param pattern - network rule's pattern.\n * @returns the shortcut or the empty string\n */\n SimpleRegex.extractBasicShortcut = function (pattern) {\n var longest = '';\n var parts = pattern.split(this.rePatternSpecialCharacters);\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\n var part = parts_1[_i];\n if (part.length > longest.length) {\n longest = part;\n }\n }\n return (longest || '').toLowerCase();\n };\n /**\n * Searches for a shortcut inside of a regexp pattern.\n * Shortcut in this case is a longest string with no REGEX special characters.\n * Also, we discard complicated regexps right away.\n *\n * @param pattern - network rule's pattern (regexp).\n * @returns the shortcut or the empty string\n */\n SimpleRegex.extractRegexpShortcut = function (pattern) {\n var reText = pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length);\n if (reText.length === 0) {\n // The rule is too short, doing nothing\n return '';\n }\n if (reText.indexOf('?') >= 0) {\n // Do not mess with complex expressions which use lookahead\n // And with those using ? special character\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/978\n return '';\n }\n var specialCharacter = '$$$';\n // Prepend specialCharacter for the following replace calls to work properly\n reText = specialCharacter + reText;\n // Strip all types of brackets\n reText = reText.replace(/[^\\\\]\\(.*[^\\\\]\\)/, specialCharacter);\n reText = reText.replace(/[^\\\\]\\[.*[^\\\\]\\]/, specialCharacter);\n reText = reText.replace(/[^\\\\]\\{.*[^\\\\]\\}/, specialCharacter);\n // Strip some special characters\n reText = reText.replace(/[^\\\\]\\\\[a-zA-Z]/, specialCharacter);\n // Replace \\. with .\n reText = reText.replace(/\\\\\\./g, '.');\n // Split by special characters\n // `.` is one of the special characters so our `specialCharacter`\n // will be removed from the resulting array\n var parts = reText.split(/[\\\\^$*+?()|[\\]{}]/);\n var longest = '';\n for (var i = 0; i < parts.length; i += 1) {\n var part = parts[i];\n if (part.length > longest.length) {\n longest = part;\n }\n }\n return longest.toLowerCase();\n };\n /**\n * patternToRegexp is a helper method for creating regular expressions from the simple\n * wildcard-based syntax which is used in basic filters:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules\n *\n * @param pattern - basic rule pattern\n * @returns regular expression\n */\n SimpleRegex.patternToRegexp = function (pattern) {\n if (pattern === this.MASK_START_URL\n || pattern === this.MASK_PIPE\n || pattern === this.MASK_ANY_CHARACTER\n || pattern === '') {\n return this.REGEX_ANY_CHARACTER;\n }\n if (pattern.startsWith(this.MASK_REGEX_RULE) && pattern.endsWith(this.MASK_REGEX_RULE)) {\n // This is a regex rule, just remove the regex markers\n return pattern.substring(this.MASK_REGEX_RULE.length, pattern.length - this.MASK_REGEX_RULE.length);\n }\n // Escape special characters except of * | ^\n var regex = pattern.replace(reSpecialCharacters, '\\\\$&');\n // Now escape \"|\" characters but avoid escaping them in the special places\n if (regex.startsWith(this.MASK_START_URL)) {\n regex = regex.substring(0, this.MASK_START_URL.length)\n + replaceAll(regex.substring(this.MASK_START_URL.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, \"\\\\\".concat(this.MASK_PIPE))\n + regex.substring(regex.length - this.MASK_PIPE.length);\n }\n else {\n regex = regex.substring(0, this.MASK_PIPE.length)\n + replaceAll(regex.substring(this.MASK_PIPE.length, regex.length - this.MASK_PIPE.length), this.MASK_PIPE, \"\\\\\".concat(this.MASK_PIPE))\n + regex.substring(regex.length - this.MASK_PIPE.length);\n }\n // Replace special URL masks\n regex = replaceAll(regex, this.MASK_ANY_CHARACTER, this.REGEX_ANY_CHARACTER);\n regex = replaceAll(regex, this.MASK_SEPARATOR, this.REGEX_SEPARATOR);\n // Replace start URL and pipes\n if (regex.startsWith(this.MASK_START_URL)) {\n regex = this.REGEX_START_URL + regex.substring(this.MASK_START_URL.length);\n }\n else if (regex.startsWith(this.MASK_PIPE)) {\n regex = this.REGEX_START_STRING + regex.substring(this.MASK_PIPE.length);\n }\n if (regex.endsWith(this.MASK_PIPE)) {\n regex = regex.substring(0, regex.length - this.MASK_PIPE.length) + this.REGEX_END_STRING;\n }\n return regex;\n };\n /**\n * Creates RegExp object from string in '/reg_exp/gi' format\n *\n * @param str\n */\n SimpleRegex.patternFromString = function (str) {\n var parts = splitByDelimiterWithEscapeCharacter(str, '/', '\\\\', true);\n var modifiers = (parts[1] || '');\n if (modifiers.indexOf('g') < 0) {\n modifiers += 'g';\n }\n return new RegExp(parts[0], modifiers);\n };\n /**\n * Escapes characters with special meaning inside a regular expression.\n *\n * @param str\n * @param searchPattern - Pattern for detecting special characters. Optional.\n */\n SimpleRegex.escapeRegexSpecials = function (str, searchPattern) {\n if (searchPattern === void 0) { searchPattern = reSpecialCharactersFull; }\n return str.replace(searchPattern, '\\\\$&');\n };\n /**\n * Unescapes characters with special meaning inside a regular expression.\n *\n * @param str\n * @param searchPattern - Pattern for detecting special characters. Optional.\n */\n SimpleRegex.unescapeRegexSpecials = function (str, searchPattern) {\n if (searchPattern === void 0) { searchPattern = reEscapedSpecialCharactersFull; }\n return str.replace(searchPattern, function (match) { return match.substring(1); });\n };\n /**\n * Check if pattern is Regex\n */\n SimpleRegex.isRegexPattern = function (str) {\n return str.startsWith('/') && str.endsWith('/');\n };\n /**\n * Unescapes special characters in a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#using_special_characters_in_strings\n */\n SimpleRegex.unescapeSpecials = function (str) {\n var keys = Object.keys(escapeSequence).join('|');\n var regex = new RegExp(\"\\\\\\\\(\".concat(keys, \")\"), 'g');\n return str.replace(regex, function (match, group) {\n return escapeSequence[group];\n });\n };\n /**\n * Matching the beginning of an address. With this character you don't\n * have to specify a particular protocol and subdomain in address mask.\n * It means, || stands for http://*., https://*., ws://*., wss://*. at once.\n */\n SimpleRegex.MASK_START_URL = '||';\n /**\n * REGEX_START_URL corresponds to MASK_START_URL\n */\n SimpleRegex.REGEX_START_URL = '^(http|https|ws|wss)://([a-z0-9-_.]+\\\\.)?';\n /**\n * A pointer to the beginning or the end of address. The value depends on the\n * character placement in the mask. For example, a rule swf| corresponds\n * to http://example.com/annoyingflash.swf , but not to http://example.com/swf/index.html.\n * |http://example.org corresponds to http://example.org,\n * but not to http://domain.com?url=http://example.org.\n */\n SimpleRegex.MASK_PIPE = '|';\n /**\n * REGEX_END_STRING corresponds to MASK_PIPE if it is in the end of a pattern.\n */\n SimpleRegex.REGEX_END_STRING = '$';\n /**\n * REGEX_START_STRING corresponds to MASK_PIPE if it is in the beginning of a pattern.\n */\n SimpleRegex.REGEX_START_STRING = '^';\n /**\n * Separator character mark. Separator character is any character,\n * but a letter, a digit, or one of the following: _ - .\n */\n SimpleRegex.MASK_SEPARATOR = '^';\n /**\n * REGEX_SEPARATOR corresponds to MASK_SEPARATOR\n */\n SimpleRegex.REGEX_SEPARATOR = '([^ a-zA-Z0-9.%_-]|$)';\n /**\n * This is a wildcard character. It is used to represent \"any set of characters\".\n * This can also be an empty string or a string of any length.\n */\n SimpleRegex.MASK_ANY_CHARACTER = '*';\n /**\n * Path separator\n */\n SimpleRegex.MASK_BACKSLASH = '/';\n /**\n * REGEX_ANY_CHARACTER corresponds to MASK_ANY_CHARACTER.\n */\n SimpleRegex.REGEX_ANY_CHARACTER = '.*';\n /**\n * Enclose regex in two backslashes to mark a regex rule:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#regular-expressions-support\n */\n SimpleRegex.MASK_REGEX_RULE = '/';\n /**\n * Regex for matching special characters in modifier regex pattern\n */\n SimpleRegex.reModifierPatternSpecialCharacters = /[[\\],\\\\]/g;\n /**\n * Regex for matching escaped special characters in modifier regex pattern\n */\n SimpleRegex.reModifierPatternEscapedSpecialCharacters = /\\\\[[\\],\\\\]/g;\n /**\n * If string starts with exclamation mark \"!\" we consider it as comment\n */\n SimpleRegex.MASK_COMMENT = '!';\n /**\n * Min length of rule shortcut\n * This value has been picked as a result of performance experiments\n */\n SimpleRegex.MIN_SHORTCUT_LENGTH = 3;\n /**\n * Min length of generic rule shortcut\n */\n SimpleRegex.MIN_GENERIC_RULE_LENGTH = 4;\n /** Regex with basic matching pattern special characters */\n SimpleRegex.rePatternSpecialCharacters = new RegExp('[*^|]');\n return SimpleRegex;\n}());\n\nexport { SimpleRegex as S, stringArraysEquals as a, stringArraysHaveIntersection as b, startsAtIndexWith as c, fastHashBetween as d, fastHash as f, hasUnquotedSubstring as h, indexOfAny as i, replaceAll as r, splitByDelimiterWithEscapeCharacter as s };\n","/**\n * Check if `vhost` is a valid suffix of `hostname` (top-domain)\n *\n * It means that `vhost` needs to be a suffix of `hostname` and we then need to\n * make sure that: either they are equal, or the character preceding `vhost` in\n * `hostname` is a '.' (it should not be a partial label).\n *\n * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok\n * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok\n * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok\n */\nfunction shareSameDomainSuffix(hostname, vhost) {\n if (hostname.endsWith(vhost)) {\n return (hostname.length === vhost.length ||\n hostname[hostname.length - vhost.length - 1] === '.');\n }\n return false;\n}\n/**\n * Given a hostname and its public suffix, extract the general domain.\n */\nfunction extractDomainWithSuffix(hostname, publicSuffix) {\n // Locate the index of the last '.' in the part of the `hostname` preceding\n // the public suffix.\n //\n // examples:\n // 1. not.evil.co.uk => evil.co.uk\n // ^ ^\n // | | start of public suffix\n // | index of the last dot\n //\n // 2. example.co.uk => example.co.uk\n // ^ ^\n // | | start of public suffix\n // |\n // | (-1) no dot found before the public suffix\n const publicSuffixIndex = hostname.length - publicSuffix.length - 2;\n const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex);\n // No '.' found, then `hostname` is the general domain (no sub-domain)\n if (lastDotBeforeSuffixIndex === -1) {\n return hostname;\n }\n // Extract the part between the last '.'\n return hostname.slice(lastDotBeforeSuffixIndex + 1);\n}\n/**\n * Detects the domain based on rules and upon and a host string\n */\nexport default function getDomain(suffix, hostname, options) {\n // Check if `hostname` ends with a member of `validHosts`.\n if (options.validHosts !== null) {\n const validHosts = options.validHosts;\n for (let i = 0; i < validHosts.length; i += 1) {\n const vhost = validHosts[i];\n if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost) === true) {\n return vhost;\n }\n }\n }\n // If `hostname` is a valid public suffix, then there is no domain to return.\n // Since we already know that `getPublicSuffix` returns a suffix of `hostname`\n // there is no need to perform a string comparison and we only compare the\n // size.\n if (suffix.length === hostname.length) {\n return null;\n }\n // To extract the general domain, we start by identifying the public suffix\n // (if any), then consider the domain to be the public suffix with one added\n // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix:\n // `co.uk`, then we take one more level: `evil`, giving the final result:\n // `evil.co.uk`).\n return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix);\n}\n//# sourceMappingURL=domain.js.map","/**\n * Return the part of domain without suffix.\n *\n * Example: for domain 'foo.com', the result would be 'foo'.\n */\nexport default function getDomainWithoutSuffix(domain, suffix) {\n // Note: here `domain` and `suffix` cannot have the same length because in\n // this case we set `domain` to `null` instead. It is thus safe to assume\n // that `suffix` is shorter than `domain`.\n return domain.slice(0, -suffix.length - 1);\n}\n//# sourceMappingURL=domain-without-suffix.js.map","/**\n * @param url - URL we want to extract a hostname from.\n * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname.\n */\nexport default function extractHostname(url, urlIsValidHostname) {\n let start = 0;\n let end = url.length;\n let hasUpper = false;\n // If url is not already a valid hostname, then try to extract hostname.\n if (urlIsValidHostname === false) {\n // Special handling of data URLs\n if (url.startsWith('data:') === true) {\n return null;\n }\n // Trim leading spaces\n while (start < url.length && url.charCodeAt(start) <= 32) {\n start += 1;\n }\n // Trim trailing spaces\n while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {\n end -= 1;\n }\n // Skip scheme.\n if (url.charCodeAt(start) === 47 /* '/' */ &&\n url.charCodeAt(start + 1) === 47 /* '/' */) {\n start += 2;\n }\n else {\n const indexOfProtocol = url.indexOf(':/', start);\n if (indexOfProtocol !== -1) {\n // Implement fast-path for common protocols. We expect most protocols\n // should be one of these 4 and thus we will not need to perform the\n // more expansive validity check most of the time.\n const protocolSize = indexOfProtocol - start;\n const c0 = url.charCodeAt(start);\n const c1 = url.charCodeAt(start + 1);\n const c2 = url.charCodeAt(start + 2);\n const c3 = url.charCodeAt(start + 3);\n const c4 = url.charCodeAt(start + 4);\n if (protocolSize === 5 &&\n c0 === 104 /* 'h' */ &&\n c1 === 116 /* 't' */ &&\n c2 === 116 /* 't' */ &&\n c3 === 112 /* 'p' */ &&\n c4 === 115 /* 's' */) {\n // https\n }\n else if (protocolSize === 4 &&\n c0 === 104 /* 'h' */ &&\n c1 === 116 /* 't' */ &&\n c2 === 116 /* 't' */ &&\n c3 === 112 /* 'p' */) {\n // http\n }\n else if (protocolSize === 3 &&\n c0 === 119 /* 'w' */ &&\n c1 === 115 /* 's' */ &&\n c2 === 115 /* 's' */) {\n // wss\n }\n else if (protocolSize === 2 &&\n c0 === 119 /* 'w' */ &&\n c1 === 115 /* 's' */) {\n // ws\n }\n else {\n // Check that scheme is valid\n for (let i = start; i < indexOfProtocol; i += 1) {\n const lowerCaseCode = url.charCodeAt(i) | 32;\n if (((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z]\n (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9]\n lowerCaseCode === 46 || // '.'\n lowerCaseCode === 45 || // '-'\n lowerCaseCode === 43) === false // '+'\n ) {\n return null;\n }\n }\n }\n // Skip 0, 1 or more '/' after ':/'\n start = indexOfProtocol + 2;\n while (url.charCodeAt(start) === 47 /* '/' */) {\n start += 1;\n }\n }\n }\n // Detect first occurrence of '/', '?' or '#'. We also keep track of the\n // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of\n // (respectively), identifier, ipv6 or port.\n let indexOfIdentifier = -1;\n let indexOfClosingBracket = -1;\n let indexOfPort = -1;\n for (let i = start; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 35 || // '#'\n code === 47 || // '/'\n code === 63 // '?'\n ) {\n end = i;\n break;\n }\n else if (code === 64) {\n // '@'\n indexOfIdentifier = i;\n }\n else if (code === 93) {\n // ']'\n indexOfClosingBracket = i;\n }\n else if (code === 58) {\n // ':'\n indexOfPort = i;\n }\n else if (code >= 65 && code <= 90) {\n hasUpper = true;\n }\n }\n // Detect identifier: '@'\n if (indexOfIdentifier !== -1 &&\n indexOfIdentifier > start &&\n indexOfIdentifier < end) {\n start = indexOfIdentifier + 1;\n }\n // Handle ipv6 addresses\n if (url.charCodeAt(start) === 91 /* '[' */) {\n if (indexOfClosingBracket !== -1) {\n return url.slice(start + 1, indexOfClosingBracket).toLowerCase();\n }\n return null;\n }\n else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) {\n // Detect port: ':'\n end = indexOfPort;\n }\n }\n // Trim trailing dots\n while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) {\n end -= 1;\n }\n const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;\n if (hasUpper) {\n return hostname.toLowerCase();\n }\n return hostname;\n}\n//# sourceMappingURL=extract-hostname.js.map","/**\n * Check if a hostname is an IP. You should be aware that this only works\n * because `hostname` is already garanteed to be a valid hostname!\n */\nfunction isProbablyIpv4(hostname) {\n // Cannot be shorted than 1.1.1.1\n if (hostname.length < 7) {\n return false;\n }\n // Cannot be longer than: 255.255.255.255\n if (hostname.length > 15) {\n return false;\n }\n let numberOfDots = 0;\n for (let i = 0; i < hostname.length; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n numberOfDots += 1;\n }\n else if (code < 48 /* '0' */ || code > 57 /* '9' */) {\n return false;\n }\n }\n return (numberOfDots === 3 &&\n hostname.charCodeAt(0) !== 46 /* '.' */ &&\n hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */);\n}\n/**\n * Similar to isProbablyIpv4.\n */\nfunction isProbablyIpv6(hostname) {\n if (hostname.length < 3) {\n return false;\n }\n let start = hostname[0] === '[' ? 1 : 0;\n let end = hostname.length;\n if (hostname[end - 1] === ']') {\n end -= 1;\n }\n // We only consider the maximum size of a normal IPV6. Note that this will\n // fail on so-called \"IPv4 mapped IPv6 addresses\" but this is a corner-case\n // and a proper validation library should be used for these.\n if (end - start > 39) {\n return false;\n }\n let hasColon = false;\n for (; start < end; start += 1) {\n const code = hostname.charCodeAt(start);\n if (code === 58 /* ':' */) {\n hasColon = true;\n }\n else if (((code >= 48 && code <= 57) || // 0-9\n (code >= 97 && code <= 102) || // a-f\n (code >= 65 && code <= 90)) === // A-F\n false) {\n return false;\n }\n }\n return hasColon;\n}\n/**\n * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4).\n * This *will not* work on any string. We need `hostname` to be a valid\n * hostname.\n */\nexport default function isIp(hostname) {\n return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);\n}\n//# sourceMappingURL=is-ip.js.map","/**\n * Implements fast shallow verification of hostnames. This does not perform a\n * struct check on the content of labels (classes of Unicode characters, etc.)\n * but instead check that the structure is valid (number of labels, length of\n * labels, etc.).\n *\n * If you need stricter validation, consider using an external library.\n */\nfunction isValidAscii(code) {\n return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127);\n}\n/**\n * Check if a hostname string is valid. It's usually a preliminary check before\n * trying to use getDomain or anything else.\n *\n * Beware: it does not check if the TLD exists.\n */\nexport default function (hostname) {\n if (hostname.length > 255) {\n return false;\n }\n if (hostname.length === 0) {\n return false;\n }\n if ( /*@__INLINE__*/isValidAscii(hostname.charCodeAt(0)) === false) {\n return false;\n }\n // Validate hostname according to RFC\n let lastDotIndex = -1;\n let lastCharCode = -1;\n const len = hostname.length;\n for (let i = 0; i < len; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n if (\n // Check that previous label is < 63 bytes long (64 = 63 + '.')\n i - lastDotIndex > 64 ||\n // Check that previous character was not already a '.'\n lastCharCode === 46 ||\n // Check that the previous label does not end with a '-' (dash)\n lastCharCode === 45 ||\n // Check that the previous label does not end with a '_' (underscore)\n lastCharCode === 95) {\n return false;\n }\n lastDotIndex = i;\n }\n else if (( /*@__INLINE__*/isValidAscii(code) || code === 45 || code === 95) ===\n false) {\n // Check if there is a forbidden character in the label\n return false;\n }\n lastCharCode = code;\n }\n return (\n // Check that last label is shorter than 63 chars\n len - lastDotIndex - 1 <= 63 &&\n // Check that the last character is an allowed trailing label character.\n // Since we already checked that the char is a valid hostname character,\n // we only need to check that it's different from '-'.\n lastCharCode !== 45);\n}\n//# sourceMappingURL=is-valid.js.map","function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) {\n return {\n allowIcannDomains,\n allowPrivateDomains,\n detectIp,\n extractHostname,\n mixedInputs,\n validHosts,\n validateHostname,\n };\n}\nconst DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({});\nexport function setDefaults(options) {\n if (options === undefined) {\n return DEFAULT_OPTIONS;\n }\n return /*@__INLINE__*/ setDefaultsImpl(options);\n}\n//# sourceMappingURL=options.js.map","/**\n * Returns the subdomain of a hostname string\n */\nexport default function getSubdomain(hostname, domain) {\n // If `hostname` and `domain` are the same, then there is no sub-domain\n if (domain.length === hostname.length) {\n return '';\n }\n return hostname.slice(0, -domain.length - 1);\n}\n//# sourceMappingURL=subdomain.js.map","/**\n * Implement a factory allowing to plug different implementations of suffix\n * lookup (e.g.: using a trie or the packed hashes datastructures). This is used\n * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints.\n */\nimport getDomain from './domain';\nimport getDomainWithoutSuffix from './domain-without-suffix';\nimport extractHostname from './extract-hostname';\nimport isIp from './is-ip';\nimport isValidHostname from './is-valid';\nimport { setDefaults } from './options';\nimport getSubdomain from './subdomain';\nexport function getEmptyResult() {\n return {\n domain: null,\n domainWithoutSuffix: null,\n hostname: null,\n isIcann: null,\n isIp: null,\n isPrivate: null,\n publicSuffix: null,\n subdomain: null,\n };\n}\nexport function resetResult(result) {\n result.domain = null;\n result.domainWithoutSuffix = null;\n result.hostname = null;\n result.isIcann = null;\n result.isIp = null;\n result.isPrivate = null;\n result.publicSuffix = null;\n result.subdomain = null;\n}\nexport function parseImpl(url, step, suffixLookup, partialOptions, result) {\n const options = /*@__INLINE__*/ setDefaults(partialOptions);\n // Very fast approximate check to make sure `url` is a string. This is needed\n // because the library will not necessarily be used in a typed setup and\n // values of arbitrary types might be given as argument.\n if (typeof url !== 'string') {\n return result;\n }\n // Extract hostname from `url` only if needed. This can be made optional\n // using `options.extractHostname`. This option will typically be used\n // whenever we are sure the inputs to `parse` are already hostnames and not\n // arbitrary URLs.\n //\n // `mixedInput` allows to specify if we expect a mix of URLs and hostnames\n // as input. If only hostnames are expected then `extractHostname` can be\n // set to `false` to speed-up parsing. If only URLs are expected then\n // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint\n // and will not change the behavior of the library.\n if (options.extractHostname === false) {\n result.hostname = url;\n }\n else if (options.mixedInputs === true) {\n result.hostname = extractHostname(url, isValidHostname(url));\n }\n else {\n result.hostname = extractHostname(url, false);\n }\n if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) {\n return result;\n }\n // Check if `hostname` is a valid ip address\n if (options.detectIp === true) {\n result.isIp = isIp(result.hostname);\n if (result.isIp === true) {\n return result;\n }\n }\n // Perform optional hostname validation. If hostname is not valid, no need to\n // go further as there will be no valid domain or sub-domain.\n if (options.validateHostname === true &&\n options.extractHostname === true &&\n isValidHostname(result.hostname) === false) {\n result.hostname = null;\n return result;\n }\n // Extract public suffix\n suffixLookup(result.hostname, options, result);\n if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) {\n return result;\n }\n // Extract domain\n result.domain = getDomain(result.publicSuffix, result.hostname, options);\n if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) {\n return result;\n }\n // Extract subdomain\n result.subdomain = getSubdomain(result.hostname, result.domain);\n if (step === 4 /* FLAG.SUB_DOMAIN */) {\n return result;\n }\n // Extract domain without suffix\n result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix);\n return result;\n}\n//# sourceMappingURL=factory.js.map","export default function (hostname, options, out) {\n // Fast path for very popular suffixes; this allows to by-pass lookup\n // completely as well as any extra allocation or string manipulation.\n if (options.allowPrivateDomains === false && hostname.length > 3) {\n const last = hostname.length - 1;\n const c3 = hostname.charCodeAt(last);\n const c2 = hostname.charCodeAt(last - 1);\n const c1 = hostname.charCodeAt(last - 2);\n const c0 = hostname.charCodeAt(last - 3);\n if (c3 === 109 /* 'm' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 99 /* 'c' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'com';\n return true;\n }\n else if (c3 === 103 /* 'g' */ &&\n c2 === 114 /* 'r' */ &&\n c1 === 111 /* 'o' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'org';\n return true;\n }\n else if (c3 === 117 /* 'u' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 101 /* 'e' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'edu';\n return true;\n }\n else if (c3 === 118 /* 'v' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 103 /* 'g' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'gov';\n return true;\n }\n else if (c3 === 116 /* 't' */ &&\n c2 === 101 /* 'e' */ &&\n c1 === 110 /* 'n' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'net';\n return true;\n }\n else if (c3 === 101 /* 'e' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'de';\n return true;\n }\n }\n return false;\n}\n//# sourceMappingURL=fast-path.js.map","export { parseImpl, getEmptyResult, resetResult } from './src/factory';\nexport { default as fastPathLookup } from './src/lookup/fast-path';\nexport { setDefaults } from './src/options';\n//# sourceMappingURL=index.js.map","export const exceptions = (function () {\n const _0 = { \"$\": 1, \"succ\": {} }, _1 = { \"$\": 0, \"succ\": { \"city\": _0 } };\n const exceptions = { \"$\": 0, \"succ\": { \"ck\": { \"$\": 0, \"succ\": { \"www\": _0 } }, \"jp\": { \"$\": 0, \"succ\": { \"kawasaki\": _1, \"kitakyushu\": _1, \"kobe\": _1, \"nagoya\": _1, \"sapporo\": _1, \"sendai\": _1, \"yokohama\": _1 } } } };\n ;\n return exceptions;\n})();\nexport const rules = (function () {\n const _2 = { \"$\": 1, \"succ\": {} }, _3 = { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"mil\": _2, \"org\": _2 } }, _4 = { \"$\": 2, \"succ\": {} }, _5 = { \"$\": 1, \"succ\": { \"blogspot\": _4 } }, _6 = { \"$\": 1, \"succ\": { \"gov\": _2 } }, _7 = { \"$\": 0, \"succ\": { \"*\": _4 } }, _8 = { \"$\": 0, \"succ\": { \"*\": _2 } }, _9 = { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"gov\": _2 } }, _10 = { \"$\": 1, \"succ\": { \"co\": _4 } }, _11 = { \"$\": 1, \"succ\": { \"ng\": _4 } }, _12 = { \"$\": 0, \"succ\": { \"s3\": _4 } }, _13 = { \"$\": 0, \"succ\": { \"dualstack\": _12 } }, _14 = { \"$\": 0, \"succ\": { \"s3\": _4, \"dualstack\": _12, \"s3-website\": _4 } }, _15 = { \"$\": 0, \"succ\": { \"apps\": _4 } }, _16 = { \"$\": 0, \"succ\": { \"app\": _4 } }, _17 = { \"$\": 0, \"succ\": { \"j\": _4 } }, _18 = { \"$\": 0, \"succ\": { \"user\": _4 } }, _19 = { \"$\": 1, \"succ\": { \"ybo\": _4 } }, _20 = { \"$\": 1, \"succ\": { \"gov\": _2, \"blogspot\": _4, \"nym\": _4 } }, _21 = { \"$\": 0, \"succ\": { \"cust\": _4 } }, _22 = { \"$\": 1, \"succ\": { \"edu\": _2, \"biz\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"info\": _2, \"com\": _2 } }, _23 = { \"$\": 1, \"succ\": { \"blogspot\": _4, \"nym\": _4 } }, _24 = { \"$\": 1, \"succ\": { \"for\": _4 } }, _25 = { \"$\": 1, \"succ\": { \"barsy\": _4 } }, _26 = { \"$\": 0, \"succ\": { \"forgot\": _4 } }, _27 = { \"$\": 0, \"succ\": { \"jelastic\": _4 } }, _28 = { \"$\": 1, \"succ\": { \"gs\": _2 } }, _29 = { \"$\": 0, \"succ\": { \"nes\": _2 } }, _30 = { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _2 } }, _31 = { \"$\": 1, \"succ\": { \"cc\": _2, \"lib\": _2 } };\n const rules = { \"$\": 0, \"succ\": { \"ac\": _3, \"ad\": { \"$\": 1, \"succ\": { \"nom\": _2 } }, \"ae\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"ac\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"aero\": { \"$\": 1, \"succ\": { \"accident-investigation\": _2, \"accident-prevention\": _2, \"aerobatic\": _2, \"aeroclub\": _2, \"aerodrome\": _2, \"agents\": _2, \"aircraft\": _2, \"airline\": _2, \"airport\": _2, \"air-surveillance\": _2, \"airtraffic\": _2, \"air-traffic-control\": _2, \"ambulance\": _2, \"amusement\": _2, \"association\": _2, \"author\": _2, \"ballooning\": _2, \"broker\": _2, \"caa\": _2, \"cargo\": _2, \"catering\": _2, \"certification\": _2, \"championship\": _2, \"charter\": _2, \"civilaviation\": _2, \"club\": _2, \"conference\": _2, \"consultant\": _2, \"consulting\": _2, \"control\": _2, \"council\": _2, \"crew\": _2, \"design\": _2, \"dgca\": _2, \"educator\": _2, \"emergency\": _2, \"engine\": _2, \"engineer\": _2, \"entertainment\": _2, \"equipment\": _2, \"exchange\": _2, \"express\": _2, \"federation\": _2, \"flight\": _2, \"fuel\": _2, \"gliding\": _2, \"government\": _2, \"groundhandling\": _2, \"group\": _2, \"hanggliding\": _2, \"homebuilt\": _2, \"insurance\": _2, \"journal\": _2, \"journalist\": _2, \"leasing\": _2, \"logistics\": _2, \"magazine\": _2, \"maintenance\": _2, \"media\": _2, \"microlight\": _2, \"modelling\": _2, \"navigation\": _2, \"parachuting\": _2, \"paragliding\": _2, \"passenger-association\": _2, \"pilot\": _2, \"press\": _2, \"production\": _2, \"recreation\": _2, \"repbody\": _2, \"res\": _2, \"research\": _2, \"rotorcraft\": _2, \"safety\": _2, \"scientist\": _2, \"services\": _2, \"show\": _2, \"skydiving\": _2, \"software\": _2, \"student\": _2, \"trader\": _2, \"trading\": _2, \"trainer\": _2, \"union\": _2, \"workinggroup\": _2, \"works\": _2 } }, \"af\": { \"$\": 1, \"succ\": { \"gov\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"nom\": _4 } }, \"ag\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"co\": _2, \"nom\": _2 } }, \"ai\": { \"$\": 1, \"succ\": { \"off\": _2, \"com\": _2, \"net\": _2, \"org\": _2, \"uwu\": _4, \"nom\": _4 } }, \"al\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"am\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"commune\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _4, \"neko\": _4, \"nyaa\": _4 } }, \"ao\": { \"$\": 1, \"succ\": { \"ed\": _2, \"gv\": _2, \"og\": _2, \"co\": _2, \"pb\": _2, \"it\": _2 } }, \"aq\": _2, \"ar\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"musica\": _2, \"net\": _2, \"org\": _2, \"tur\": _2 } }, \"arpa\": { \"$\": 1, \"succ\": { \"e164\": _2, \"in-addr\": _2, \"ip6\": _2, \"iris\": _2, \"uri\": _2, \"urn\": _2 } }, \"as\": _6, \"asia\": { \"$\": 1, \"succ\": { \"cloudns\": _4 } }, \"at\": { \"$\": 1, \"succ\": { \"ac\": { \"$\": 1, \"succ\": { \"sth\": _2 } }, \"co\": _5, \"gv\": _2, \"or\": _2, \"funkfeuer\": { \"$\": 0, \"succ\": { \"wien\": _4 } }, \"futurecms\": { \"$\": 0, \"succ\": { \"*\": _4, \"ex\": _7, \"in\": _7 } }, \"futurehosting\": _4, \"futuremailing\": _4, \"ortsinfo\": { \"$\": 0, \"succ\": { \"ex\": _7, \"kunden\": _7 } }, \"biz\": _4, \"info\": _4, \"priv\": _4, \"12hp\": _4, \"2ix\": _4, \"4lima\": _4, \"lima-city\": _4 } }, \"au\": { \"$\": 1, \"succ\": { \"com\": _5, \"net\": _2, \"org\": _2, \"edu\": { \"$\": 1, \"succ\": { \"act\": _2, \"catholic\": _2, \"nsw\": { \"$\": 1, \"succ\": { \"schools\": _2 } }, \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"gov\": { \"$\": 1, \"succ\": { \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"asn\": _2, \"id\": _2, \"info\": _2, \"conf\": _2, \"oz\": _2, \"act\": _2, \"nsw\": _2, \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 } }, \"aw\": { \"$\": 1, \"succ\": { \"com\": _2 } }, \"ax\": { \"$\": 1, \"succ\": { \"be\": _4, \"cat\": _4, \"es\": _4, \"eu\": _4, \"gg\": _4, \"mc\": _4, \"us\": _4, \"xy\": _4 } }, \"az\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"int\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"info\": _2, \"pp\": _2, \"mil\": _2, \"name\": _2, \"pro\": _2, \"biz\": _2 } }, \"ba\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _4 } }, \"bb\": { \"$\": 1, \"succ\": { \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"store\": _2, \"tv\": _2 } }, \"bd\": _8, \"be\": { \"$\": 1, \"succ\": { \"ac\": _2, \"webhosting\": _4, \"blogspot\": _4, \"transurl\": _7 } }, \"bf\": _6, \"bg\": { \"$\": 1, \"succ\": { \"0\": _2, \"1\": _2, \"2\": _2, \"3\": _2, \"4\": _2, \"5\": _2, \"6\": _2, \"7\": _2, \"8\": _2, \"9\": _2, \"a\": _2, \"b\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"j\": _2, \"k\": _2, \"l\": _2, \"m\": _2, \"n\": _2, \"o\": _2, \"p\": _2, \"q\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"u\": _2, \"v\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"blogspot\": _4, \"barsy\": _4 } }, \"bh\": _9, \"bi\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"or\": _2, \"org\": _2 } }, \"biz\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"dyndns\": _4, \"for-better\": _4, \"for-more\": _4, \"for-some\": _4, \"for-the\": _4, \"selfip\": _4, \"webhop\": _4, \"bpl\": _4, \"orx\": _4, \"mmafan\": _4, \"myftp\": _4, \"no-ip\": _4, \"dscloud\": _4 } }, \"bj\": { \"$\": 1, \"succ\": { \"asso\": _2, \"barreau\": _2, \"gouv\": _2, \"blogspot\": _4 } }, \"bm\": _9, \"bn\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"co\": _4 } }, \"bo\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"int\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"tv\": _2, \"web\": _2, \"academia\": _2, \"agro\": _2, \"arte\": _2, \"blog\": _2, \"bolivia\": _2, \"ciencia\": _2, \"cooperativa\": _2, \"democracia\": _2, \"deporte\": _2, \"ecologia\": _2, \"economia\": _2, \"empresa\": _2, \"indigena\": _2, \"industria\": _2, \"info\": _2, \"medicina\": _2, \"movimiento\": _2, \"musica\": _2, \"natural\": _2, \"nombre\": _2, \"noticias\": _2, \"patria\": _2, \"politica\": _2, \"profesional\": _2, \"plurinacional\": _2, \"pueblo\": _2, \"revista\": _2, \"salud\": _2, \"tecnologia\": _2, \"tksat\": _2, \"transporte\": _2, \"wiki\": _2 } }, \"br\": { \"$\": 1, \"succ\": { \"9guacu\": _2, \"abc\": _2, \"adm\": _2, \"adv\": _2, \"agr\": _2, \"aju\": _2, \"am\": _2, \"anani\": _2, \"aparecida\": _2, \"app\": _2, \"arq\": _2, \"art\": _2, \"ato\": _2, \"b\": _2, \"barueri\": _2, \"belem\": _2, \"bhz\": _2, \"bib\": _2, \"bio\": _2, \"blog\": _2, \"bmd\": _2, \"boavista\": _2, \"bsb\": _2, \"campinagrande\": _2, \"campinas\": _2, \"caxias\": _2, \"cim\": _2, \"cng\": _2, \"cnt\": _2, \"com\": _5, \"contagem\": _2, \"coop\": _2, \"coz\": _2, \"cri\": _2, \"cuiaba\": _2, \"curitiba\": _2, \"def\": _2, \"des\": _2, \"det\": _2, \"dev\": _2, \"ecn\": _2, \"eco\": _2, \"edu\": _2, \"emp\": _2, \"enf\": _2, \"eng\": _2, \"esp\": _2, \"etc\": _2, \"eti\": _2, \"far\": _2, \"feira\": _2, \"flog\": _2, \"floripa\": _2, \"fm\": _2, \"fnd\": _2, \"fortal\": _2, \"fot\": _2, \"foz\": _2, \"fst\": _2, \"g12\": _2, \"geo\": _2, \"ggf\": _2, \"goiania\": _2, \"gov\": { \"$\": 1, \"succ\": { \"ac\": _2, \"al\": _2, \"am\": _2, \"ap\": _2, \"ba\": _2, \"ce\": _2, \"df\": _2, \"es\": _2, \"go\": _2, \"ma\": _2, \"mg\": _2, \"ms\": _2, \"mt\": _2, \"pa\": _2, \"pb\": _2, \"pe\": _2, \"pi\": _2, \"pr\": _2, \"rj\": _2, \"rn\": _2, \"ro\": _2, \"rr\": _2, \"rs\": _2, \"sc\": _2, \"se\": _2, \"sp\": _2, \"to\": _2 } }, \"gru\": _2, \"imb\": _2, \"ind\": _2, \"inf\": _2, \"jab\": _2, \"jampa\": _2, \"jdf\": _2, \"joinville\": _2, \"jor\": _2, \"jus\": _2, \"leg\": { \"$\": 1, \"succ\": { \"ac\": _4, \"al\": _4, \"am\": _4, \"ap\": _4, \"ba\": _4, \"ce\": _4, \"df\": _4, \"es\": _4, \"go\": _4, \"ma\": _4, \"mg\": _4, \"ms\": _4, \"mt\": _4, \"pa\": _4, \"pb\": _4, \"pe\": _4, \"pi\": _4, \"pr\": _4, \"rj\": _4, \"rn\": _4, \"ro\": _4, \"rr\": _4, \"rs\": _4, \"sc\": _4, \"se\": _4, \"sp\": _4, \"to\": _4 } }, \"lel\": _2, \"log\": _2, \"londrina\": _2, \"macapa\": _2, \"maceio\": _2, \"manaus\": _2, \"maringa\": _2, \"mat\": _2, \"med\": _2, \"mil\": _2, \"morena\": _2, \"mp\": _2, \"mus\": _2, \"natal\": _2, \"net\": _2, \"niteroi\": _2, \"nom\": _8, \"not\": _2, \"ntr\": _2, \"odo\": _2, \"ong\": _2, \"org\": _2, \"osasco\": _2, \"palmas\": _2, \"poa\": _2, \"ppg\": _2, \"pro\": _2, \"psc\": _2, \"psi\": _2, \"pvh\": _2, \"qsl\": _2, \"radio\": _2, \"rec\": _2, \"recife\": _2, \"rep\": _2, \"ribeirao\": _2, \"rio\": _2, \"riobranco\": _2, \"riopreto\": _2, \"salvador\": _2, \"sampa\": _2, \"santamaria\": _2, \"santoandre\": _2, \"saobernardo\": _2, \"saogonca\": _2, \"seg\": _2, \"sjc\": _2, \"slg\": _2, \"slz\": _2, \"sorocaba\": _2, \"srv\": _2, \"taxi\": _2, \"tc\": _2, \"tec\": _2, \"teo\": _2, \"the\": _2, \"tmp\": _2, \"trd\": _2, \"tur\": _2, \"tv\": _2, \"udi\": _2, \"vet\": _2, \"vix\": _2, \"vlog\": _2, \"wiki\": _2, \"zlg\": _2 } }, \"bs\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"we\": _4 } }, \"bt\": _9, \"bv\": _2, \"bw\": { \"$\": 1, \"succ\": { \"co\": _2, \"org\": _2 } }, \"by\": { \"$\": 1, \"succ\": { \"gov\": _2, \"mil\": _2, \"com\": _5, \"of\": _2, \"nym\": _4 } }, \"bz\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"za\": _4, \"nom\": _4, \"nym\": _4 } }, \"ca\": { \"$\": 1, \"succ\": { \"ab\": _2, \"bc\": _2, \"mb\": _2, \"nb\": _2, \"nf\": _2, \"nl\": _2, \"ns\": _2, \"nt\": _2, \"nu\": _2, \"on\": _2, \"pe\": _2, \"qc\": _2, \"sk\": _2, \"yk\": _2, \"gc\": _2, \"barsy\": _4, \"awdev\": _7, \"co\": _4, \"blogspot\": _4, \"no-ip\": _4 } }, \"cat\": _2, \"cc\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"ftpaccess\": _4, \"game-server\": _4, \"myphotos\": _4, \"scrapping\": _4, \"twmail\": _4, \"csx\": _4, \"fantasyleague\": _4 } }, \"cd\": _6, \"cf\": _5, \"cg\": _2, \"ch\": { \"$\": 1, \"succ\": { \"square7\": _4, \"blogspot\": _4, \"linkyard-cloud\": _4, \"dnsking\": _4, \"gotdns\": _4, \"12hp\": _4, \"2ix\": _4, \"4lima\": _4, \"lima-city\": _4 } }, \"ci\": { \"$\": 1, \"succ\": { \"org\": _2, \"or\": _2, \"com\": _2, \"co\": _2, \"edu\": _2, \"ed\": _2, \"ac\": _2, \"net\": _2, \"go\": _2, \"asso\": _2, \"xn--aroport-bya\": _2, \"aéroport\": _2, \"int\": _2, \"presse\": _2, \"md\": _2, \"gouv\": _2, \"fin\": _4, \"nl\": _4 } }, \"ck\": _8, \"cl\": { \"$\": 1, \"succ\": { \"aprendemas\": _2, \"co\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"cm\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"gov\": _2, \"net\": _2 } }, \"cn\": { \"$\": 1, \"succ\": { \"ac\": _2, \"com\": { \"$\": 1, \"succ\": { \"amazonaws\": { \"$\": 0, \"succ\": { \"compute\": _7, \"eb\": { \"$\": 0, \"succ\": { \"cn-north-1\": _4, \"cn-northwest-1\": _4 } }, \"elb\": _7, \"cn-north-1\": _12 } } } }, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"mil\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"ah\": _2, \"bj\": _2, \"cq\": _2, \"fj\": _2, \"gd\": _2, \"gs\": _2, \"gz\": _2, \"gx\": _2, \"ha\": _2, \"hb\": _2, \"he\": _2, \"hi\": _2, \"hl\": _2, \"hn\": _2, \"jl\": _2, \"js\": _2, \"jx\": _2, \"ln\": _2, \"nm\": _2, \"nx\": _2, \"qh\": _2, \"sc\": _2, \"sd\": _2, \"sh\": _2, \"sn\": _2, \"sx\": _2, \"tj\": _2, \"xj\": _2, \"xz\": _2, \"yn\": _2, \"zj\": _2, \"hk\": _2, \"mo\": _2, \"tw\": _2, \"instantcloud\": _4 } }, \"co\": { \"$\": 1, \"succ\": { \"arts\": _2, \"com\": _5, \"edu\": _2, \"firm\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"rec\": _2, \"web\": _2, \"carrd\": _4, \"crd\": _4, \"otap\": _7, \"leadpages\": _4, \"lpages\": _4, \"mypi\": _4, \"n4t\": _4, \"nodum\": _4, \"repl\": _4 } }, \"com\": { \"$\": 1, \"succ\": { \"adobeaemcloud\": { \"$\": 2, \"succ\": { \"dev\": _7 } }, \"kasserver\": _4, \"amazonaws\": { \"$\": 0, \"succ\": { \"compute\": _7, \"compute-1\": _7, \"us-east-1\": { \"$\": 2, \"succ\": { \"dualstack\": _12 } }, \"elb\": _7, \"s3\": _4, \"s3-ap-northeast-1\": _4, \"s3-ap-northeast-2\": _4, \"s3-ap-south-1\": _4, \"s3-ap-southeast-1\": _4, \"s3-ap-southeast-2\": _4, \"s3-ca-central-1\": _4, \"s3-eu-central-1\": _4, \"s3-eu-west-1\": _4, \"s3-eu-west-2\": _4, \"s3-eu-west-3\": _4, \"s3-external-1\": _4, \"s3-fips-us-gov-west-1\": _4, \"s3-sa-east-1\": _4, \"s3-us-gov-west-1\": _4, \"s3-us-east-2\": _4, \"s3-us-west-1\": _4, \"s3-us-west-2\": _4, \"ap-northeast-2\": _14, \"ap-south-1\": _14, \"ca-central-1\": _14, \"eu-central-1\": _14, \"eu-west-2\": _14, \"eu-west-3\": _14, \"us-east-2\": _14, \"ap-northeast-1\": _13, \"ap-southeast-1\": _13, \"ap-southeast-2\": _13, \"eu-west-1\": _13, \"sa-east-1\": _13, \"s3-website-us-east-1\": _4, \"s3-website-us-west-1\": _4, \"s3-website-us-west-2\": _4, \"s3-website-ap-northeast-1\": _4, \"s3-website-ap-southeast-1\": _4, \"s3-website-ap-southeast-2\": _4, \"s3-website-eu-west-1\": _4, \"s3-website-sa-east-1\": _4 } }, \"elasticbeanstalk\": { \"$\": 2, \"succ\": { \"ap-northeast-1\": _4, \"ap-northeast-2\": _4, \"ap-northeast-3\": _4, \"ap-south-1\": _4, \"ap-southeast-1\": _4, \"ap-southeast-2\": _4, \"ca-central-1\": _4, \"eu-central-1\": _4, \"eu-west-1\": _4, \"eu-west-2\": _4, \"eu-west-3\": _4, \"sa-east-1\": _4, \"us-east-1\": _4, \"us-east-2\": _4, \"us-gov-west-1\": _4, \"us-west-1\": _4, \"us-west-2\": _4 } }, \"on-aptible\": _4, \"myasustor\": _4, \"balena-devices\": _4, \"betainabox\": _4, \"bplaced\": _4, \"ar\": _4, \"br\": _4, \"cn\": _4, \"de\": _4, \"eu\": _4, \"gb\": _4, \"hu\": _4, \"jpn\": _4, \"kr\": _4, \"mex\": _4, \"no\": _4, \"qc\": _4, \"ru\": _4, \"sa\": _4, \"uk\": _4, \"us\": _4, \"uy\": _4, \"za\": _4, \"africa\": _4, \"gr\": _4, \"co\": _4, \"xenapponazure\": _4, \"jdevcloud\": _4, \"wpdevcloud\": _4, \"cloudcontrolled\": _4, \"cloudcontrolapp\": _4, \"trycloudflare\": _4, \"customer-oci\": { \"$\": 0, \"succ\": { \"*\": _4, \"oci\": _7, \"ocp\": _7, \"ocs\": _7 } }, \"dattolocal\": _4, \"dattorelay\": _4, \"dattoweb\": _4, \"mydatto\": _4, \"builtwithdark\": _4, \"drayddns\": _4, \"dreamhosters\": _4, \"mydrobo\": _4, \"dyndns-at-home\": _4, \"dyndns-at-work\": _4, \"dyndns-blog\": _4, \"dyndns-free\": _4, \"dyndns-home\": _4, \"dyndns-ip\": _4, \"dyndns-mail\": _4, \"dyndns-office\": _4, \"dyndns-pics\": _4, \"dyndns-remote\": _4, \"dyndns-server\": _4, \"dyndns-web\": _4, \"dyndns-wiki\": _4, \"dyndns-work\": _4, \"blogdns\": _4, \"cechire\": _4, \"dnsalias\": _4, \"dnsdojo\": _4, \"doesntexist\": _4, \"dontexist\": _4, \"doomdns\": _4, \"dyn-o-saur\": _4, \"dynalias\": _4, \"est-a-la-maison\": _4, \"est-a-la-masion\": _4, \"est-le-patron\": _4, \"est-mon-blogueur\": _4, \"from-ak\": _4, \"from-al\": _4, \"from-ar\": _4, \"from-ca\": _4, \"from-ct\": _4, \"from-dc\": _4, \"from-de\": _4, \"from-fl\": _4, \"from-ga\": _4, \"from-hi\": _4, \"from-ia\": _4, \"from-id\": _4, \"from-il\": _4, \"from-in\": _4, \"from-ks\": _4, \"from-ky\": _4, \"from-ma\": _4, \"from-md\": _4, \"from-mi\": _4, \"from-mn\": _4, \"from-mo\": _4, \"from-ms\": _4, \"from-mt\": _4, \"from-nc\": _4, \"from-nd\": _4, \"from-ne\": _4, \"from-nh\": _4, \"from-nj\": _4, \"from-nm\": _4, \"from-nv\": _4, \"from-oh\": _4, \"from-ok\": _4, \"from-or\": _4, \"from-pa\": _4, \"from-pr\": _4, \"from-ri\": _4, \"from-sc\": _4, \"from-sd\": _4, \"from-tn\": _4, \"from-tx\": _4, \"from-ut\": _4, \"from-va\": _4, \"from-vt\": _4, \"from-wa\": _4, \"from-wi\": _4, \"from-wv\": _4, \"from-wy\": _4, \"getmyip\": _4, \"gotdns\": _4, \"hobby-site\": _4, \"homelinux\": _4, \"homeunix\": _4, \"iamallama\": _4, \"is-a-anarchist\": _4, \"is-a-blogger\": _4, \"is-a-bookkeeper\": _4, \"is-a-bulls-fan\": _4, \"is-a-caterer\": _4, \"is-a-chef\": _4, \"is-a-conservative\": _4, \"is-a-cpa\": _4, \"is-a-cubicle-slave\": _4, \"is-a-democrat\": _4, \"is-a-designer\": _4, \"is-a-doctor\": _4, \"is-a-financialadvisor\": _4, \"is-a-geek\": _4, \"is-a-green\": _4, \"is-a-guru\": _4, \"is-a-hard-worker\": _4, \"is-a-hunter\": _4, \"is-a-landscaper\": _4, \"is-a-lawyer\": _4, \"is-a-liberal\": _4, \"is-a-libertarian\": _4, \"is-a-llama\": _4, \"is-a-musician\": _4, \"is-a-nascarfan\": _4, \"is-a-nurse\": _4, \"is-a-painter\": _4, \"is-a-personaltrainer\": _4, \"is-a-photographer\": _4, \"is-a-player\": _4, \"is-a-republican\": _4, \"is-a-rockstar\": _4, \"is-a-socialist\": _4, \"is-a-student\": _4, \"is-a-teacher\": _4, \"is-a-techie\": _4, \"is-a-therapist\": _4, \"is-an-accountant\": _4, \"is-an-actor\": _4, \"is-an-actress\": _4, \"is-an-anarchist\": _4, \"is-an-artist\": _4, \"is-an-engineer\": _4, \"is-an-entertainer\": _4, \"is-certified\": _4, \"is-gone\": _4, \"is-into-anime\": _4, \"is-into-cars\": _4, \"is-into-cartoons\": _4, \"is-into-games\": _4, \"is-leet\": _4, \"is-not-certified\": _4, \"is-slick\": _4, \"is-uberleet\": _4, \"is-with-theband\": _4, \"isa-geek\": _4, \"isa-hockeynut\": _4, \"issmarterthanyou\": _4, \"likes-pie\": _4, \"likescandy\": _4, \"neat-url\": _4, \"saves-the-whales\": _4, \"selfip\": _4, \"sells-for-less\": _4, \"sells-for-u\": _4, \"servebbs\": _4, \"simple-url\": _4, \"space-to-rent\": _4, \"teaches-yoga\": _4, \"writesthisblog\": _4, \"ddnsfree\": _4, \"ddnsgeek\": _4, \"giize\": _4, \"gleeze\": _4, \"kozow\": _4, \"loseyourip\": _4, \"ooguy\": _4, \"theworkpc\": _4, \"mytuleap\": _4, \"evennode\": { \"$\": 0, \"succ\": { \"eu-1\": _4, \"eu-2\": _4, \"eu-3\": _4, \"eu-4\": _4, \"us-1\": _4, \"us-2\": _4, \"us-3\": _4, \"us-4\": _4 } }, \"onfabrica\": _4, \"fbsbx\": _15, \"fastly-terrarium\": _4, \"fastvps-server\": _4, \"mydobiss\": _4, \"firebaseapp\": _4, \"freebox-os\": _4, \"freeboxos\": _4, \"gentapps\": _4, \"gentlentapis\": _4, \"githubusercontent\": _4, \"0emm\": _7, \"appspot\": { \"$\": 2, \"succ\": { \"r\": _7 } }, \"blogspot\": _4, \"codespot\": _4, \"googleapis\": _4, \"googlecode\": _4, \"pagespeedmobilizer\": _4, \"publishproxy\": _4, \"withgoogle\": _4, \"withyoutube\": _4, \"awsmppl\": _4, \"herokuapp\": _4, \"herokussl\": _4, \"myravendb\": _4, \"pixolino\": _4, \"dopaas\": _4, \"hidora\": _4, \"ik-server\": { \"$\": 0, \"succ\": { \"jcloud\": _4 } }, \"jelastic\": { \"$\": 0, \"succ\": { \"demo\": _4 } }, \"joyent\": { \"$\": 0, \"succ\": { \"cns\": _7 } }, \"lpusercontent\": _4, \"lmpm\": _16, \"linode\": { \"$\": 0, \"succ\": { \"members\": _4, \"nodebalancer\": _7 } }, \"linodeobjects\": _7, \"barsycenter\": _4, \"barsyonline\": _4, \"miniserver\": _4, \"meteorapp\": { \"$\": 2, \"succ\": { \"eu\": _4 } }, \"4u\": _4, \"nfshost\": _4, \"001www\": _4, \"ddnslive\": _4, \"myiphost\": _4, \"blogsyte\": _4, \"ciscofreak\": _4, \"damnserver\": _4, \"ditchyourip\": _4, \"dnsiskinky\": _4, \"dynns\": _4, \"geekgalaxy\": _4, \"health-carereform\": _4, \"homesecuritymac\": _4, \"homesecuritypc\": _4, \"myactivedirectory\": _4, \"mysecuritycamera\": _4, \"net-freaks\": _4, \"onthewifi\": _4, \"point2this\": _4, \"quicksytes\": _4, \"securitytactics\": _4, \"serveexchange\": _4, \"servehumour\": _4, \"servep2p\": _4, \"servesarcasm\": _4, \"stufftoread\": _4, \"unusualperson\": _4, \"workisboring\": _4, \"3utilities\": _4, \"ddnsking\": _4, \"myvnc\": _4, \"servebeer\": _4, \"servecounterstrike\": _4, \"serveftp\": _4, \"servegame\": _4, \"servehalflife\": _4, \"servehttp\": _4, \"serveirc\": _4, \"servemp3\": _4, \"servepics\": _4, \"servequake\": _4, \"observableusercontent\": { \"$\": 0, \"succ\": { \"static\": _4 } }, \"operaunite\": _4, \"skygearapp\": _4, \"outsystemscloud\": _4, \"ownprovider\": _4, \"pgfog\": _4, \"pagefrontapp\": _4, \"pagexl\": _4, \"gotpantheon\": _4, \"platter-app\": _4, \"pleskns\": _4, \"prgmr\": { \"$\": 0, \"succ\": { \"xen\": _4 } }, \"qualifioapp\": _4, \"qbuser\": _4, \"qa2\": _4, \"dev-myqnapcloud\": _4, \"alpha-myqnapcloud\": _4, \"myqnapcloud\": _4, \"quipelements\": _7, \"rackmaze\": _4, \"rhcloud\": _4, \"render\": _16, \"onrender\": _4, \"logoip\": _4, \"scrysec\": _4, \"firewall-gateway\": _4, \"myshopblocks\": _4, \"shopitsite\": _4, \"1kapp\": _4, \"appchizi\": _4, \"applinzi\": _4, \"sinaapp\": _4, \"vipsinaapp\": _4, \"bounty-full\": { \"$\": 2, \"succ\": { \"alpha\": _4, \"beta\": _4 } }, \"stackhero-network\": _4, \"playstation-cloud\": _4, \"stdlib\": { \"$\": 0, \"succ\": { \"api\": _4 } }, \"temp-dns\": _4, \"dsmynas\": _4, \"familyds\": _4, \"thingdustdata\": _4, \"bloxcms\": _4, \"townnews-staging\": _4, \"hk\": _4, \"wafflecell\": _4, \"remotewd\": _4, \"wiardweb\": { \"$\": 0, \"succ\": { \"pages\": _4 } }, \"xnbay\": { \"$\": 2, \"succ\": { \"u2\": _4, \"u2-local\": _4 } }, \"yolasite\": _4, \"wpenginepowered\": _4, \"impertrixcdn\": _4, \"impertrix\": _4 } }, \"coop\": _2, \"cr\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"ed\": _2, \"fi\": _2, \"go\": _2, \"or\": _2, \"sa\": _2 } }, \"cu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"gov\": _2, \"inf\": _2 } }, \"cv\": _5, \"cw\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2 } }, \"cx\": { \"$\": 1, \"succ\": { \"gov\": _2, \"ath\": _4, \"info\": _4 } }, \"cy\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"com\": { \"$\": 1, \"succ\": { \"blogspot\": _4, \"scaleforce\": _17 } }, \"ekloges\": _2, \"gov\": _2, \"ltd\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"parliament\": _2, \"press\": _2, \"pro\": _2, \"tm\": _2 } }, \"cz\": { \"$\": 1, \"succ\": { \"co\": _4, \"realm\": _4, \"e4\": _4, \"blogspot\": _4, \"metacentrum\": { \"$\": 0, \"succ\": { \"cloud\": _4, \"custom\": _4 } }, \"muni\": { \"$\": 0, \"succ\": { \"cloud\": { \"$\": 0, \"succ\": { \"flt\": _4, \"usr\": _4 } } } } } }, \"de\": { \"$\": 1, \"succ\": { \"bplaced\": _4, \"square7\": _4, \"com\": _4, \"cosidns\": { \"$\": 0, \"succ\": { \"dyn\": _4 } }, \"dynamisches-dns\": _4, \"dnsupdater\": _4, \"internet-dns\": _4, \"l-o-g-i-n\": _4, \"dnshome\": _4, \"fuettertdasnetz\": _4, \"isteingeek\": _4, \"istmein\": _4, \"lebtimnetz\": _4, \"leitungsen\": _4, \"traeumtgerade\": _4, \"ddnss\": { \"$\": 2, \"succ\": { \"dyn\": _4, \"dyndns\": _4 } }, \"dyndns1\": _4, \"dyn-ip24\": _4, \"home-webserver\": { \"$\": 2, \"succ\": { \"dyn\": _4 } }, \"myhome-server\": _4, \"goip\": _4, \"blogspot\": _4, \"dyn-berlin\": _4, \"in-berlin\": _4, \"in-brb\": _4, \"in-butter\": _4, \"in-dsl\": _4, \"in-vpn\": _4, \"mein-iserv\": _4, \"schulserver\": _4, \"test-iserv\": _4, \"keymachine\": _4, \"git-repos\": _4, \"lcube-server\": _4, \"svn-repos\": _4, \"barsy\": _4, \"logoip\": _4, \"firewall-gateway\": _4, \"my-gateway\": _4, \"my-router\": _4, \"spdns\": _4, \"speedpartner\": { \"$\": 0, \"succ\": { \"customer\": _4 } }, \"taifun-dns\": _4, \"12hp\": _4, \"2ix\": _4, \"4lima\": _4, \"lima-city\": _4, \"dd-dns\": _4, \"dray-dns\": _4, \"draydns\": _4, \"dyn-vpn\": _4, \"dynvpn\": _4, \"mein-vigor\": _4, \"my-vigor\": _4, \"my-wan\": _4, \"syno-ds\": _4, \"synology-diskstation\": _4, \"synology-ds\": _4, \"uberspace\": _7, \"virtualuser\": _4, \"virtual-user\": _4, \"community-pro\": _4, \"diskussionsbereich\": _4 } }, \"dj\": _2, \"dk\": { \"$\": 1, \"succ\": { \"biz\": _4, \"co\": _4, \"firm\": _4, \"reg\": _4, \"store\": _4, \"blogspot\": _4 } }, \"dm\": _9, \"do\": { \"$\": 1, \"succ\": { \"art\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sld\": _2, \"web\": _2 } }, \"dz\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"gov\": _2, \"edu\": _2, \"asso\": _2, \"pol\": _2, \"art\": _2 } }, \"ec\": { \"$\": 1, \"succ\": { \"com\": _2, \"info\": _2, \"net\": _2, \"fin\": _2, \"k12\": _2, \"med\": _2, \"pro\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"gob\": _2, \"mil\": _2, \"nym\": _4 } }, \"edu\": { \"$\": 1, \"succ\": { \"rit\": { \"$\": 0, \"succ\": { \"git-pages\": _4 } } } }, \"ee\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"riik\": _2, \"lib\": _2, \"med\": _2, \"com\": _5, \"pri\": _2, \"aip\": _2, \"org\": _2, \"fie\": _2 } }, \"eg\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"eun\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sci\": _2 } }, \"er\": _8, \"es\": { \"$\": 1, \"succ\": { \"com\": _5, \"nom\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2 } }, \"et\": { \"$\": 1, \"succ\": { \"com\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"biz\": _2, \"name\": _2, \"info\": _2, \"net\": _2 } }, \"eu\": { \"$\": 1, \"succ\": { \"mycd\": _4, \"cloudns\": _4, \"barsy\": _4, \"wellbeingzone\": _4, \"spdns\": _4, \"transurl\": _7, \"diskstation\": _4 } }, \"fi\": { \"$\": 1, \"succ\": { \"aland\": _2, \"dy\": _4, \"blogspot\": _4, \"xn--hkkinen-5wa\": _4, \"häkkinen\": _4, \"iki\": _4 } }, \"fj\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"com\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"fk\": _8, \"fm\": _2, \"fo\": _2, \"fr\": { \"$\": 1, \"succ\": { \"asso\": _2, \"com\": _2, \"gouv\": _2, \"nom\": _2, \"prd\": _2, \"tm\": _2, \"aeroport\": _2, \"avocat\": _2, \"avoues\": _2, \"cci\": _2, \"chambagri\": _2, \"chirurgiens-dentistes\": _2, \"experts-comptables\": _2, \"geometre-expert\": _2, \"greta\": _2, \"huissier-justice\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmacien\": _2, \"port\": _2, \"veterinaire\": _2, \"en-root\": _4, \"fbx-os\": _4, \"fbxos\": _4, \"freebox-os\": _4, \"freeboxos\": _4, \"blogspot\": _4, \"on-web\": _4, \"chirurgiens-dentistes-en-france\": _4 } }, \"ga\": _2, \"gb\": _2, \"gd\": { \"$\": 1, \"succ\": { \"nom\": _4 } }, \"ge\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"net\": _2, \"pvt\": _2, \"nom\": _4 } }, \"gf\": _2, \"gg\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"kaas\": _4, \"cya\": _4, \"panel\": { \"$\": 2, \"succ\": { \"daemon\": _4 } } } }, \"gh\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2 } }, \"gi\": { \"$\": 1, \"succ\": { \"com\": _2, \"ltd\": _2, \"gov\": _2, \"mod\": _2, \"edu\": _2, \"org\": _2 } }, \"gl\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"biz\": _4, \"nom\": _4, \"xx\": _4 } }, \"gm\": _2, \"gn\": { \"$\": 1, \"succ\": { \"ac\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"net\": _2 } }, \"gov\": _2, \"gp\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"mobi\": _2, \"edu\": _2, \"org\": _2, \"asso\": _2, \"app\": _4 } }, \"gq\": _2, \"gr\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"gs\": _2, \"gt\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"ind\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"nom\": _4, \"blog\": _4, \"de\": _4, \"to\": _4 } }, \"gu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"guam\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"web\": _2 } }, \"gw\": _2, \"gy\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"nym\": _4, \"be\": _4 } }, \"hk\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"idv\": _2, \"net\": _2, \"org\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--wcvs22d\": _2, \"教育\": _2, \"xn--lcvr32d\": _2, \"敎育\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--gmqw5a\": _2, \"個人\": _2, \"xn--ciqpn\": _2, \"个人\": _2, \"xn--gmq050i\": _2, \"箇人\": _2, \"xn--zf0avx\": _2, \"網络\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--mk0axi\": _2, \"组織\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"xn--od0aq3b\": _2, \"网絡\": _2, \"xn--tn0ag\": _2, \"组织\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--uc0ay4a\": _2, \"組织\": _2, \"blogspot\": _4, \"nym\": _4, \"ltd\": _4, \"inc\": _4 } }, \"hm\": _2, \"hn\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"gob\": _2, \"nom\": _4, \"cc\": _4 } }, \"hr\": { \"$\": 1, \"succ\": { \"iz\": _2, \"from\": _2, \"name\": _2, \"com\": _2, \"blogspot\": _4, \"free\": _4 } }, \"ht\": { \"$\": 1, \"succ\": { \"com\": _2, \"shop\": _2, \"firm\": _2, \"info\": _2, \"adult\": _2, \"net\": _2, \"pro\": _2, \"org\": _2, \"med\": _2, \"art\": _2, \"coop\": _2, \"pol\": _2, \"asso\": _2, \"edu\": _2, \"rel\": _2, \"gouv\": _2, \"perso\": _2 } }, \"hu\": { \"$\": 1, \"succ\": { \"2000\": _2, \"co\": _2, \"info\": _2, \"org\": _2, \"priv\": _2, \"sport\": _2, \"tm\": _2, \"agrar\": _2, \"bolt\": _2, \"casino\": _2, \"city\": _2, \"erotica\": _2, \"erotika\": _2, \"film\": _2, \"forum\": _2, \"games\": _2, \"hotel\": _2, \"ingatlan\": _2, \"jogasz\": _2, \"konyvelo\": _2, \"lakas\": _2, \"media\": _2, \"news\": _2, \"reklam\": _2, \"sex\": _2, \"shop\": _2, \"suli\": _2, \"szex\": _2, \"tozsde\": _2, \"utazas\": _2, \"video\": _2, \"blogspot\": _4 } }, \"id\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _5, \"desa\": _2, \"go\": _2, \"mil\": _2, \"my\": _2, \"net\": _2, \"or\": _2, \"ponpes\": _2, \"sch\": _2, \"web\": _2 } }, \"ie\": _20, \"il\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _5, \"gov\": _2, \"idf\": _2, \"k12\": _2, \"muni\": _2, \"net\": _2, \"org\": _2 } }, \"im\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": { \"$\": 1, \"succ\": { \"ltd\": _2, \"plc\": _2 } }, \"com\": _2, \"net\": _2, \"org\": _2, \"tt\": _2, \"tv\": _2, \"ro\": _4, \"nom\": _4 } }, \"in\": { \"$\": 1, \"succ\": { \"co\": _2, \"firm\": _2, \"net\": _2, \"org\": _2, \"gen\": _2, \"ind\": _2, \"nic\": _2, \"ac\": _2, \"edu\": _2, \"res\": _2, \"gov\": _2, \"mil\": _2, \"cloudns\": _4, \"blogspot\": _4, \"barsy\": _4 } }, \"info\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"dynamic-dns\": _4, \"dyndns\": _4, \"barrel-of-knowledge\": _4, \"barrell-of-knowledge\": _4, \"for-our\": _4, \"groks-the\": _4, \"groks-this\": _4, \"here-for-more\": _4, \"knowsitall\": _4, \"selfip\": _4, \"webhop\": _4, \"barsy\": _4, \"mayfirst\": _4, \"forumz\": _4, \"nsupdate\": _4, \"dvrcam\": _4, \"ilovecollege\": _4, \"no-ip\": _4, \"dnsupdate\": _4, \"v-info\": _4 } }, \"int\": { \"$\": 1, \"succ\": { \"eu\": _2 } }, \"io\": { \"$\": 1, \"succ\": { \"2038\": _4, \"com\": _2, \"apigee\": _4, \"b-data\": _4, \"backplaneapp\": _4, \"banzaicloud\": { \"$\": 0, \"succ\": { \"app\": _4, \"backyards\": _7 } }, \"boxfuse\": _4, \"browsersafetymark\": _4, \"bigv\": { \"$\": 0, \"succ\": { \"uk0\": _4 } }, \"cleverapps\": _4, \"dappnode\": { \"$\": 0, \"succ\": { \"dyndns\": _4 } }, \"dedyn\": _4, \"drud\": _4, \"definima\": _4, \"enonic\": { \"$\": 2, \"succ\": { \"customer\": _4 } }, \"shw\": _4, \"github\": _4, \"gitlab\": _4, \"lolipop\": _4, \"hasura-app\": _4, \"hostyhosting\": _4, \"moonscale\": _7, \"jele\": _4, \"loginline\": _4, \"barsy\": _4, \"azurecontainer\": _7, \"ngrok\": _4, \"nodeart\": { \"$\": 0, \"succ\": { \"stage\": _4 } }, \"nodum\": _4, \"nid\": _4, \"pantheonsite\": _4, \"dyn53\": _4, \"protonet\": _4, \"qcx\": { \"$\": 2, \"succ\": { \"sys\": _7 } }, \"vaporcloud\": _4, \"vbrplsbx\": { \"$\": 0, \"succ\": { \"g\": _4 } }, \"on-k3s\": _7, \"on-rio\": _7, \"readthedocs\": _4, \"resindevice\": _4, \"resinstaging\": { \"$\": 0, \"succ\": { \"devices\": _4 } }, \"hzc\": _4, \"sandcats\": _4, \"shiftedit\": _4, \"mo-siemens\": _4, \"lair\": _15, \"stolos\": _7, \"spacekit\": _4, \"utwente\": _4, \"applicationcloud\": _4, \"scapp\": _4, \"s5y\": _7, \"telebit\": _4, \"thingdust\": { \"$\": 0, \"succ\": { \"dev\": _21, \"disrec\": _21, \"prod\": _21, \"testing\": _21 } }, \"wedeploy\": _4, \"basicserver\": _4, \"virtualserver\": _4 } }, \"iq\": _3, \"ir\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"gov\": _2, \"id\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2 } }, \"is\": { \"$\": 1, \"succ\": { \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"int\": _2, \"cupcake\": _4, \"blogspot\": _4 } }, \"it\": { \"$\": 1, \"succ\": { \"gov\": _2, \"edu\": _2, \"abr\": _2, \"abruzzo\": _2, \"aosta-valley\": _2, \"aostavalley\": _2, \"bas\": _2, \"basilicata\": _2, \"cal\": _2, \"calabria\": _2, \"cam\": _2, \"campania\": _2, \"emilia-romagna\": _2, \"emiliaromagna\": _2, \"emr\": _2, \"friuli-v-giulia\": _2, \"friuli-ve-giulia\": _2, \"friuli-vegiulia\": _2, \"friuli-venezia-giulia\": _2, \"friuli-veneziagiulia\": _2, \"friuli-vgiulia\": _2, \"friuliv-giulia\": _2, \"friulive-giulia\": _2, \"friulivegiulia\": _2, \"friulivenezia-giulia\": _2, \"friuliveneziagiulia\": _2, \"friulivgiulia\": _2, \"fvg\": _2, \"laz\": _2, \"lazio\": _2, \"lig\": _2, \"liguria\": _2, \"lom\": _2, \"lombardia\": _2, \"lombardy\": _2, \"lucania\": _2, \"mar\": _2, \"marche\": _2, \"mol\": _2, \"molise\": _2, \"piedmont\": _2, \"piemonte\": _2, \"pmn\": _2, \"pug\": _2, \"puglia\": _2, \"sar\": _2, \"sardegna\": _2, \"sardinia\": _2, \"sic\": _2, \"sicilia\": _2, \"sicily\": _2, \"taa\": _2, \"tos\": _2, \"toscana\": _2, \"trentin-sud-tirol\": _2, \"xn--trentin-sd-tirol-rzb\": _2, \"trentin-süd-tirol\": _2, \"trentin-sudtirol\": _2, \"xn--trentin-sdtirol-7vb\": _2, \"trentin-südtirol\": _2, \"trentin-sued-tirol\": _2, \"trentin-suedtirol\": _2, \"trentino-a-adige\": _2, \"trentino-aadige\": _2, \"trentino-alto-adige\": _2, \"trentino-altoadige\": _2, \"trentino-s-tirol\": _2, \"trentino-stirol\": _2, \"trentino-sud-tirol\": _2, \"xn--trentino-sd-tirol-c3b\": _2, \"trentino-süd-tirol\": _2, \"trentino-sudtirol\": _2, \"xn--trentino-sdtirol-szb\": _2, \"trentino-südtirol\": _2, \"trentino-sued-tirol\": _2, \"trentino-suedtirol\": _2, \"trentino\": _2, \"trentinoa-adige\": _2, \"trentinoaadige\": _2, \"trentinoalto-adige\": _2, \"trentinoaltoadige\": _2, \"trentinos-tirol\": _2, \"trentinostirol\": _2, \"trentinosud-tirol\": _2, \"xn--trentinosd-tirol-rzb\": _2, \"trentinosüd-tirol\": _2, \"trentinosudtirol\": _2, \"xn--trentinosdtirol-7vb\": _2, \"trentinosüdtirol\": _2, \"trentinosued-tirol\": _2, \"trentinosuedtirol\": _2, \"trentinsud-tirol\": _2, \"xn--trentinsd-tirol-6vb\": _2, \"trentinsüd-tirol\": _2, \"trentinsudtirol\": _2, \"xn--trentinsdtirol-nsb\": _2, \"trentinsüdtirol\": _2, \"trentinsued-tirol\": _2, \"trentinsuedtirol\": _2, \"tuscany\": _2, \"umb\": _2, \"umbria\": _2, \"val-d-aosta\": _2, \"val-daosta\": _2, \"vald-aosta\": _2, \"valdaosta\": _2, \"valle-aosta\": _2, \"valle-d-aosta\": _2, \"valle-daosta\": _2, \"valleaosta\": _2, \"valled-aosta\": _2, \"valledaosta\": _2, \"vallee-aoste\": _2, \"xn--valle-aoste-ebb\": _2, \"vallée-aoste\": _2, \"vallee-d-aoste\": _2, \"xn--valle-d-aoste-ehb\": _2, \"vallée-d-aoste\": _2, \"valleeaoste\": _2, \"xn--valleaoste-e7a\": _2, \"valléeaoste\": _2, \"valleedaoste\": _2, \"xn--valledaoste-ebb\": _2, \"valléedaoste\": _2, \"vao\": _2, \"vda\": _2, \"ven\": _2, \"veneto\": _2, \"ag\": _2, \"agrigento\": _2, \"al\": _2, \"alessandria\": _2, \"alto-adige\": _2, \"altoadige\": _2, \"an\": _2, \"ancona\": _2, \"andria-barletta-trani\": _2, \"andria-trani-barletta\": _2, \"andriabarlettatrani\": _2, \"andriatranibarletta\": _2, \"ao\": _2, \"aosta\": _2, \"aoste\": _2, \"ap\": _2, \"aq\": _2, \"aquila\": _2, \"ar\": _2, \"arezzo\": _2, \"ascoli-piceno\": _2, \"ascolipiceno\": _2, \"asti\": _2, \"at\": _2, \"av\": _2, \"avellino\": _2, \"ba\": _2, \"balsan-sudtirol\": _2, \"xn--balsan-sdtirol-nsb\": _2, \"balsan-südtirol\": _2, \"balsan-suedtirol\": _2, \"balsan\": _2, \"bari\": _2, \"barletta-trani-andria\": _2, \"barlettatraniandria\": _2, \"belluno\": _2, \"benevento\": _2, \"bergamo\": _2, \"bg\": _2, \"bi\": _2, \"biella\": _2, \"bl\": _2, \"bn\": _2, \"bo\": _2, \"bologna\": _2, \"bolzano-altoadige\": _2, \"bolzano\": _2, \"bozen-sudtirol\": _2, \"xn--bozen-sdtirol-2ob\": _2, \"bozen-südtirol\": _2, \"bozen-suedtirol\": _2, \"bozen\": _2, \"br\": _2, \"brescia\": _2, \"brindisi\": _2, \"bs\": _2, \"bt\": _2, \"bulsan-sudtirol\": _2, \"xn--bulsan-sdtirol-nsb\": _2, \"bulsan-südtirol\": _2, \"bulsan-suedtirol\": _2, \"bulsan\": _2, \"bz\": _2, \"ca\": _2, \"cagliari\": _2, \"caltanissetta\": _2, \"campidano-medio\": _2, \"campidanomedio\": _2, \"campobasso\": _2, \"carbonia-iglesias\": _2, \"carboniaiglesias\": _2, \"carrara-massa\": _2, \"carraramassa\": _2, \"caserta\": _2, \"catania\": _2, \"catanzaro\": _2, \"cb\": _2, \"ce\": _2, \"cesena-forli\": _2, \"xn--cesena-forl-mcb\": _2, \"cesena-forlì\": _2, \"cesenaforli\": _2, \"xn--cesenaforl-i8a\": _2, \"cesenaforlì\": _2, \"ch\": _2, \"chieti\": _2, \"ci\": _2, \"cl\": _2, \"cn\": _2, \"co\": _2, \"como\": _2, \"cosenza\": _2, \"cr\": _2, \"cremona\": _2, \"crotone\": _2, \"cs\": _2, \"ct\": _2, \"cuneo\": _2, \"cz\": _2, \"dell-ogliastra\": _2, \"dellogliastra\": _2, \"en\": _2, \"enna\": _2, \"fc\": _2, \"fe\": _2, \"fermo\": _2, \"ferrara\": _2, \"fg\": _2, \"fi\": _2, \"firenze\": _2, \"florence\": _2, \"fm\": _2, \"foggia\": _2, \"forli-cesena\": _2, \"xn--forl-cesena-fcb\": _2, \"forlì-cesena\": _2, \"forlicesena\": _2, \"xn--forlcesena-c8a\": _2, \"forlìcesena\": _2, \"fr\": _2, \"frosinone\": _2, \"ge\": _2, \"genoa\": _2, \"genova\": _2, \"go\": _2, \"gorizia\": _2, \"gr\": _2, \"grosseto\": _2, \"iglesias-carbonia\": _2, \"iglesiascarbonia\": _2, \"im\": _2, \"imperia\": _2, \"is\": _2, \"isernia\": _2, \"kr\": _2, \"la-spezia\": _2, \"laquila\": _2, \"laspezia\": _2, \"latina\": _2, \"lc\": _2, \"le\": _2, \"lecce\": _2, \"lecco\": _2, \"li\": _2, \"livorno\": _2, \"lo\": _2, \"lodi\": _2, \"lt\": _2, \"lu\": _2, \"lucca\": _2, \"macerata\": _2, \"mantova\": _2, \"massa-carrara\": _2, \"massacarrara\": _2, \"matera\": _2, \"mb\": _2, \"mc\": _2, \"me\": _2, \"medio-campidano\": _2, \"mediocampidano\": _2, \"messina\": _2, \"mi\": _2, \"milan\": _2, \"milano\": _2, \"mn\": _2, \"mo\": _2, \"modena\": _2, \"monza-brianza\": _2, \"monza-e-della-brianza\": _2, \"monza\": _2, \"monzabrianza\": _2, \"monzaebrianza\": _2, \"monzaedellabrianza\": _2, \"ms\": _2, \"mt\": _2, \"na\": _2, \"naples\": _2, \"napoli\": _2, \"no\": _2, \"novara\": _2, \"nu\": _2, \"nuoro\": _2, \"og\": _2, \"ogliastra\": _2, \"olbia-tempio\": _2, \"olbiatempio\": _2, \"or\": _2, \"oristano\": _2, \"ot\": _2, \"pa\": _2, \"padova\": _2, \"padua\": _2, \"palermo\": _2, \"parma\": _2, \"pavia\": _2, \"pc\": _2, \"pd\": _2, \"pe\": _2, \"perugia\": _2, \"pesaro-urbino\": _2, \"pesarourbino\": _2, \"pescara\": _2, \"pg\": _2, \"pi\": _2, \"piacenza\": _2, \"pisa\": _2, \"pistoia\": _2, \"pn\": _2, \"po\": _2, \"pordenone\": _2, \"potenza\": _2, \"pr\": _2, \"prato\": _2, \"pt\": _2, \"pu\": _2, \"pv\": _2, \"pz\": _2, \"ra\": _2, \"ragusa\": _2, \"ravenna\": _2, \"rc\": _2, \"re\": _2, \"reggio-calabria\": _2, \"reggio-emilia\": _2, \"reggiocalabria\": _2, \"reggioemilia\": _2, \"rg\": _2, \"ri\": _2, \"rieti\": _2, \"rimini\": _2, \"rm\": _2, \"rn\": _2, \"ro\": _2, \"roma\": _2, \"rome\": _2, \"rovigo\": _2, \"sa\": _2, \"salerno\": _2, \"sassari\": _2, \"savona\": _2, \"si\": _2, \"siena\": _2, \"siracusa\": _2, \"so\": _2, \"sondrio\": _2, \"sp\": _2, \"sr\": _2, \"ss\": _2, \"suedtirol\": _2, \"xn--sdtirol-n2a\": _2, \"südtirol\": _2, \"sv\": _2, \"ta\": _2, \"taranto\": _2, \"te\": _2, \"tempio-olbia\": _2, \"tempioolbia\": _2, \"teramo\": _2, \"terni\": _2, \"tn\": _2, \"to\": _2, \"torino\": _2, \"tp\": _2, \"tr\": _2, \"trani-andria-barletta\": _2, \"trani-barletta-andria\": _2, \"traniandriabarletta\": _2, \"tranibarlettaandria\": _2, \"trapani\": _2, \"trento\": _2, \"treviso\": _2, \"trieste\": _2, \"ts\": _2, \"turin\": _2, \"tv\": _2, \"ud\": _2, \"udine\": _2, \"urbino-pesaro\": _2, \"urbinopesaro\": _2, \"va\": _2, \"varese\": _2, \"vb\": _2, \"vc\": _2, \"ve\": _2, \"venezia\": _2, \"venice\": _2, \"verbania\": _2, \"vercelli\": _2, \"verona\": _2, \"vi\": _2, \"vibo-valentia\": _2, \"vibovalentia\": _2, \"vicenza\": _2, \"viterbo\": _2, \"vr\": _2, \"vs\": _2, \"vt\": _2, \"vv\": _2, \"blogspot\": _4, \"16-b\": _4, \"32-b\": _4, \"64-b\": _4, \"syncloud\": _4 } }, \"je\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2 } }, \"jm\": _8, \"jo\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"sch\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2 } }, \"jobs\": _2, \"jp\": { \"$\": 1, \"succ\": { \"ac\": _2, \"ad\": _2, \"co\": _2, \"ed\": _2, \"go\": _2, \"gr\": _2, \"lg\": _2, \"ne\": { \"$\": 1, \"succ\": { \"aseinet\": _18, \"gehirn\": _4 } }, \"or\": _2, \"aichi\": { \"$\": 1, \"succ\": { \"aisai\": _2, \"ama\": _2, \"anjo\": _2, \"asuke\": _2, \"chiryu\": _2, \"chita\": _2, \"fuso\": _2, \"gamagori\": _2, \"handa\": _2, \"hazu\": _2, \"hekinan\": _2, \"higashiura\": _2, \"ichinomiya\": _2, \"inazawa\": _2, \"inuyama\": _2, \"isshiki\": _2, \"iwakura\": _2, \"kanie\": _2, \"kariya\": _2, \"kasugai\": _2, \"kira\": _2, \"kiyosu\": _2, \"komaki\": _2, \"konan\": _2, \"kota\": _2, \"mihama\": _2, \"miyoshi\": _2, \"nishio\": _2, \"nisshin\": _2, \"obu\": _2, \"oguchi\": _2, \"oharu\": _2, \"okazaki\": _2, \"owariasahi\": _2, \"seto\": _2, \"shikatsu\": _2, \"shinshiro\": _2, \"shitara\": _2, \"tahara\": _2, \"takahama\": _2, \"tobishima\": _2, \"toei\": _2, \"togo\": _2, \"tokai\": _2, \"tokoname\": _2, \"toyoake\": _2, \"toyohashi\": _2, \"toyokawa\": _2, \"toyone\": _2, \"toyota\": _2, \"tsushima\": _2, \"yatomi\": _2 } }, \"akita\": { \"$\": 1, \"succ\": { \"akita\": _2, \"daisen\": _2, \"fujisato\": _2, \"gojome\": _2, \"hachirogata\": _2, \"happou\": _2, \"higashinaruse\": _2, \"honjo\": _2, \"honjyo\": _2, \"ikawa\": _2, \"kamikoani\": _2, \"kamioka\": _2, \"katagami\": _2, \"kazuno\": _2, \"kitaakita\": _2, \"kosaka\": _2, \"kyowa\": _2, \"misato\": _2, \"mitane\": _2, \"moriyoshi\": _2, \"nikaho\": _2, \"noshiro\": _2, \"odate\": _2, \"oga\": _2, \"ogata\": _2, \"semboku\": _2, \"yokote\": _2, \"yurihonjo\": _2 } }, \"aomori\": { \"$\": 1, \"succ\": { \"aomori\": _2, \"gonohe\": _2, \"hachinohe\": _2, \"hashikami\": _2, \"hiranai\": _2, \"hirosaki\": _2, \"itayanagi\": _2, \"kuroishi\": _2, \"misawa\": _2, \"mutsu\": _2, \"nakadomari\": _2, \"noheji\": _2, \"oirase\": _2, \"owani\": _2, \"rokunohe\": _2, \"sannohe\": _2, \"shichinohe\": _2, \"shingo\": _2, \"takko\": _2, \"towada\": _2, \"tsugaru\": _2, \"tsuruta\": _2 } }, \"chiba\": { \"$\": 1, \"succ\": { \"abiko\": _2, \"asahi\": _2, \"chonan\": _2, \"chosei\": _2, \"choshi\": _2, \"chuo\": _2, \"funabashi\": _2, \"futtsu\": _2, \"hanamigawa\": _2, \"ichihara\": _2, \"ichikawa\": _2, \"ichinomiya\": _2, \"inzai\": _2, \"isumi\": _2, \"kamagaya\": _2, \"kamogawa\": _2, \"kashiwa\": _2, \"katori\": _2, \"katsuura\": _2, \"kimitsu\": _2, \"kisarazu\": _2, \"kozaki\": _2, \"kujukuri\": _2, \"kyonan\": _2, \"matsudo\": _2, \"midori\": _2, \"mihama\": _2, \"minamiboso\": _2, \"mobara\": _2, \"mutsuzawa\": _2, \"nagara\": _2, \"nagareyama\": _2, \"narashino\": _2, \"narita\": _2, \"noda\": _2, \"oamishirasato\": _2, \"omigawa\": _2, \"onjuku\": _2, \"otaki\": _2, \"sakae\": _2, \"sakura\": _2, \"shimofusa\": _2, \"shirako\": _2, \"shiroi\": _2, \"shisui\": _2, \"sodegaura\": _2, \"sosa\": _2, \"tako\": _2, \"tateyama\": _2, \"togane\": _2, \"tohnosho\": _2, \"tomisato\": _2, \"urayasu\": _2, \"yachimata\": _2, \"yachiyo\": _2, \"yokaichiba\": _2, \"yokoshibahikari\": _2, \"yotsukaido\": _2 } }, \"ehime\": { \"$\": 1, \"succ\": { \"ainan\": _2, \"honai\": _2, \"ikata\": _2, \"imabari\": _2, \"iyo\": _2, \"kamijima\": _2, \"kihoku\": _2, \"kumakogen\": _2, \"masaki\": _2, \"matsuno\": _2, \"matsuyama\": _2, \"namikata\": _2, \"niihama\": _2, \"ozu\": _2, \"saijo\": _2, \"seiyo\": _2, \"shikokuchuo\": _2, \"tobe\": _2, \"toon\": _2, \"uchiko\": _2, \"uwajima\": _2, \"yawatahama\": _2 } }, \"fukui\": { \"$\": 1, \"succ\": { \"echizen\": _2, \"eiheiji\": _2, \"fukui\": _2, \"ikeda\": _2, \"katsuyama\": _2, \"mihama\": _2, \"minamiechizen\": _2, \"obama\": _2, \"ohi\": _2, \"ono\": _2, \"sabae\": _2, \"sakai\": _2, \"takahama\": _2, \"tsuruga\": _2, \"wakasa\": _2 } }, \"fukuoka\": { \"$\": 1, \"succ\": { \"ashiya\": _2, \"buzen\": _2, \"chikugo\": _2, \"chikuho\": _2, \"chikujo\": _2, \"chikushino\": _2, \"chikuzen\": _2, \"chuo\": _2, \"dazaifu\": _2, \"fukuchi\": _2, \"hakata\": _2, \"higashi\": _2, \"hirokawa\": _2, \"hisayama\": _2, \"iizuka\": _2, \"inatsuki\": _2, \"kaho\": _2, \"kasuga\": _2, \"kasuya\": _2, \"kawara\": _2, \"keisen\": _2, \"koga\": _2, \"kurate\": _2, \"kurogi\": _2, \"kurume\": _2, \"minami\": _2, \"miyako\": _2, \"miyama\": _2, \"miyawaka\": _2, \"mizumaki\": _2, \"munakata\": _2, \"nakagawa\": _2, \"nakama\": _2, \"nishi\": _2, \"nogata\": _2, \"ogori\": _2, \"okagaki\": _2, \"okawa\": _2, \"oki\": _2, \"omuta\": _2, \"onga\": _2, \"onojo\": _2, \"oto\": _2, \"saigawa\": _2, \"sasaguri\": _2, \"shingu\": _2, \"shinyoshitomi\": _2, \"shonai\": _2, \"soeda\": _2, \"sue\": _2, \"tachiarai\": _2, \"tagawa\": _2, \"takata\": _2, \"toho\": _2, \"toyotsu\": _2, \"tsuiki\": _2, \"ukiha\": _2, \"umi\": _2, \"usui\": _2, \"yamada\": _2, \"yame\": _2, \"yanagawa\": _2, \"yukuhashi\": _2 } }, \"fukushima\": { \"$\": 1, \"succ\": { \"aizubange\": _2, \"aizumisato\": _2, \"aizuwakamatsu\": _2, \"asakawa\": _2, \"bandai\": _2, \"date\": _2, \"fukushima\": _2, \"furudono\": _2, \"futaba\": _2, \"hanawa\": _2, \"higashi\": _2, \"hirata\": _2, \"hirono\": _2, \"iitate\": _2, \"inawashiro\": _2, \"ishikawa\": _2, \"iwaki\": _2, \"izumizaki\": _2, \"kagamiishi\": _2, \"kaneyama\": _2, \"kawamata\": _2, \"kitakata\": _2, \"kitashiobara\": _2, \"koori\": _2, \"koriyama\": _2, \"kunimi\": _2, \"miharu\": _2, \"mishima\": _2, \"namie\": _2, \"nango\": _2, \"nishiaizu\": _2, \"nishigo\": _2, \"okuma\": _2, \"omotego\": _2, \"ono\": _2, \"otama\": _2, \"samegawa\": _2, \"shimogo\": _2, \"shirakawa\": _2, \"showa\": _2, \"soma\": _2, \"sukagawa\": _2, \"taishin\": _2, \"tamakawa\": _2, \"tanagura\": _2, \"tenei\": _2, \"yabuki\": _2, \"yamato\": _2, \"yamatsuri\": _2, \"yanaizu\": _2, \"yugawa\": _2 } }, \"gifu\": { \"$\": 1, \"succ\": { \"anpachi\": _2, \"ena\": _2, \"gifu\": _2, \"ginan\": _2, \"godo\": _2, \"gujo\": _2, \"hashima\": _2, \"hichiso\": _2, \"hida\": _2, \"higashishirakawa\": _2, \"ibigawa\": _2, \"ikeda\": _2, \"kakamigahara\": _2, \"kani\": _2, \"kasahara\": _2, \"kasamatsu\": _2, \"kawaue\": _2, \"kitagata\": _2, \"mino\": _2, \"minokamo\": _2, \"mitake\": _2, \"mizunami\": _2, \"motosu\": _2, \"nakatsugawa\": _2, \"ogaki\": _2, \"sakahogi\": _2, \"seki\": _2, \"sekigahara\": _2, \"shirakawa\": _2, \"tajimi\": _2, \"takayama\": _2, \"tarui\": _2, \"toki\": _2, \"tomika\": _2, \"wanouchi\": _2, \"yamagata\": _2, \"yaotsu\": _2, \"yoro\": _2 } }, \"gunma\": { \"$\": 1, \"succ\": { \"annaka\": _2, \"chiyoda\": _2, \"fujioka\": _2, \"higashiagatsuma\": _2, \"isesaki\": _2, \"itakura\": _2, \"kanna\": _2, \"kanra\": _2, \"katashina\": _2, \"kawaba\": _2, \"kiryu\": _2, \"kusatsu\": _2, \"maebashi\": _2, \"meiwa\": _2, \"midori\": _2, \"minakami\": _2, \"naganohara\": _2, \"nakanojo\": _2, \"nanmoku\": _2, \"numata\": _2, \"oizumi\": _2, \"ora\": _2, \"ota\": _2, \"shibukawa\": _2, \"shimonita\": _2, \"shinto\": _2, \"showa\": _2, \"takasaki\": _2, \"takayama\": _2, \"tamamura\": _2, \"tatebayashi\": _2, \"tomioka\": _2, \"tsukiyono\": _2, \"tsumagoi\": _2, \"ueno\": _2, \"yoshioka\": _2 } }, \"hiroshima\": { \"$\": 1, \"succ\": { \"asaminami\": _2, \"daiwa\": _2, \"etajima\": _2, \"fuchu\": _2, \"fukuyama\": _2, \"hatsukaichi\": _2, \"higashihiroshima\": _2, \"hongo\": _2, \"jinsekikogen\": _2, \"kaita\": _2, \"kui\": _2, \"kumano\": _2, \"kure\": _2, \"mihara\": _2, \"miyoshi\": _2, \"naka\": _2, \"onomichi\": _2, \"osakikamijima\": _2, \"otake\": _2, \"saka\": _2, \"sera\": _2, \"seranishi\": _2, \"shinichi\": _2, \"shobara\": _2, \"takehara\": _2 } }, \"hokkaido\": { \"$\": 1, \"succ\": { \"abashiri\": _2, \"abira\": _2, \"aibetsu\": _2, \"akabira\": _2, \"akkeshi\": _2, \"asahikawa\": _2, \"ashibetsu\": _2, \"ashoro\": _2, \"assabu\": _2, \"atsuma\": _2, \"bibai\": _2, \"biei\": _2, \"bifuka\": _2, \"bihoro\": _2, \"biratori\": _2, \"chippubetsu\": _2, \"chitose\": _2, \"date\": _2, \"ebetsu\": _2, \"embetsu\": _2, \"eniwa\": _2, \"erimo\": _2, \"esan\": _2, \"esashi\": _2, \"fukagawa\": _2, \"fukushima\": _2, \"furano\": _2, \"furubira\": _2, \"haboro\": _2, \"hakodate\": _2, \"hamatonbetsu\": _2, \"hidaka\": _2, \"higashikagura\": _2, \"higashikawa\": _2, \"hiroo\": _2, \"hokuryu\": _2, \"hokuto\": _2, \"honbetsu\": _2, \"horokanai\": _2, \"horonobe\": _2, \"ikeda\": _2, \"imakane\": _2, \"ishikari\": _2, \"iwamizawa\": _2, \"iwanai\": _2, \"kamifurano\": _2, \"kamikawa\": _2, \"kamishihoro\": _2, \"kamisunagawa\": _2, \"kamoenai\": _2, \"kayabe\": _2, \"kembuchi\": _2, \"kikonai\": _2, \"kimobetsu\": _2, \"kitahiroshima\": _2, \"kitami\": _2, \"kiyosato\": _2, \"koshimizu\": _2, \"kunneppu\": _2, \"kuriyama\": _2, \"kuromatsunai\": _2, \"kushiro\": _2, \"kutchan\": _2, \"kyowa\": _2, \"mashike\": _2, \"matsumae\": _2, \"mikasa\": _2, \"minamifurano\": _2, \"mombetsu\": _2, \"moseushi\": _2, \"mukawa\": _2, \"muroran\": _2, \"naie\": _2, \"nakagawa\": _2, \"nakasatsunai\": _2, \"nakatombetsu\": _2, \"nanae\": _2, \"nanporo\": _2, \"nayoro\": _2, \"nemuro\": _2, \"niikappu\": _2, \"niki\": _2, \"nishiokoppe\": _2, \"noboribetsu\": _2, \"numata\": _2, \"obihiro\": _2, \"obira\": _2, \"oketo\": _2, \"okoppe\": _2, \"otaru\": _2, \"otobe\": _2, \"otofuke\": _2, \"otoineppu\": _2, \"oumu\": _2, \"ozora\": _2, \"pippu\": _2, \"rankoshi\": _2, \"rebun\": _2, \"rikubetsu\": _2, \"rishiri\": _2, \"rishirifuji\": _2, \"saroma\": _2, \"sarufutsu\": _2, \"shakotan\": _2, \"shari\": _2, \"shibecha\": _2, \"shibetsu\": _2, \"shikabe\": _2, \"shikaoi\": _2, \"shimamaki\": _2, \"shimizu\": _2, \"shimokawa\": _2, \"shinshinotsu\": _2, \"shintoku\": _2, \"shiranuka\": _2, \"shiraoi\": _2, \"shiriuchi\": _2, \"sobetsu\": _2, \"sunagawa\": _2, \"taiki\": _2, \"takasu\": _2, \"takikawa\": _2, \"takinoue\": _2, \"teshikaga\": _2, \"tobetsu\": _2, \"tohma\": _2, \"tomakomai\": _2, \"tomari\": _2, \"toya\": _2, \"toyako\": _2, \"toyotomi\": _2, \"toyoura\": _2, \"tsubetsu\": _2, \"tsukigata\": _2, \"urakawa\": _2, \"urausu\": _2, \"uryu\": _2, \"utashinai\": _2, \"wakkanai\": _2, \"wassamu\": _2, \"yakumo\": _2, \"yoichi\": _2 } }, \"hyogo\": { \"$\": 1, \"succ\": { \"aioi\": _2, \"akashi\": _2, \"ako\": _2, \"amagasaki\": _2, \"aogaki\": _2, \"asago\": _2, \"ashiya\": _2, \"awaji\": _2, \"fukusaki\": _2, \"goshiki\": _2, \"harima\": _2, \"himeji\": _2, \"ichikawa\": _2, \"inagawa\": _2, \"itami\": _2, \"kakogawa\": _2, \"kamigori\": _2, \"kamikawa\": _2, \"kasai\": _2, \"kasuga\": _2, \"kawanishi\": _2, \"miki\": _2, \"minamiawaji\": _2, \"nishinomiya\": _2, \"nishiwaki\": _2, \"ono\": _2, \"sanda\": _2, \"sannan\": _2, \"sasayama\": _2, \"sayo\": _2, \"shingu\": _2, \"shinonsen\": _2, \"shiso\": _2, \"sumoto\": _2, \"taishi\": _2, \"taka\": _2, \"takarazuka\": _2, \"takasago\": _2, \"takino\": _2, \"tamba\": _2, \"tatsuno\": _2, \"toyooka\": _2, \"yabu\": _2, \"yashiro\": _2, \"yoka\": _2, \"yokawa\": _2 } }, \"ibaraki\": { \"$\": 1, \"succ\": { \"ami\": _2, \"asahi\": _2, \"bando\": _2, \"chikusei\": _2, \"daigo\": _2, \"fujishiro\": _2, \"hitachi\": _2, \"hitachinaka\": _2, \"hitachiomiya\": _2, \"hitachiota\": _2, \"ibaraki\": _2, \"ina\": _2, \"inashiki\": _2, \"itako\": _2, \"iwama\": _2, \"joso\": _2, \"kamisu\": _2, \"kasama\": _2, \"kashima\": _2, \"kasumigaura\": _2, \"koga\": _2, \"miho\": _2, \"mito\": _2, \"moriya\": _2, \"naka\": _2, \"namegata\": _2, \"oarai\": _2, \"ogawa\": _2, \"omitama\": _2, \"ryugasaki\": _2, \"sakai\": _2, \"sakuragawa\": _2, \"shimodate\": _2, \"shimotsuma\": _2, \"shirosato\": _2, \"sowa\": _2, \"suifu\": _2, \"takahagi\": _2, \"tamatsukuri\": _2, \"tokai\": _2, \"tomobe\": _2, \"tone\": _2, \"toride\": _2, \"tsuchiura\": _2, \"tsukuba\": _2, \"uchihara\": _2, \"ushiku\": _2, \"yachiyo\": _2, \"yamagata\": _2, \"yawara\": _2, \"yuki\": _2 } }, \"ishikawa\": { \"$\": 1, \"succ\": { \"anamizu\": _2, \"hakui\": _2, \"hakusan\": _2, \"kaga\": _2, \"kahoku\": _2, \"kanazawa\": _2, \"kawakita\": _2, \"komatsu\": _2, \"nakanoto\": _2, \"nanao\": _2, \"nomi\": _2, \"nonoichi\": _2, \"noto\": _2, \"shika\": _2, \"suzu\": _2, \"tsubata\": _2, \"tsurugi\": _2, \"uchinada\": _2, \"wajima\": _2 } }, \"iwate\": { \"$\": 1, \"succ\": { \"fudai\": _2, \"fujisawa\": _2, \"hanamaki\": _2, \"hiraizumi\": _2, \"hirono\": _2, \"ichinohe\": _2, \"ichinoseki\": _2, \"iwaizumi\": _2, \"iwate\": _2, \"joboji\": _2, \"kamaishi\": _2, \"kanegasaki\": _2, \"karumai\": _2, \"kawai\": _2, \"kitakami\": _2, \"kuji\": _2, \"kunohe\": _2, \"kuzumaki\": _2, \"miyako\": _2, \"mizusawa\": _2, \"morioka\": _2, \"ninohe\": _2, \"noda\": _2, \"ofunato\": _2, \"oshu\": _2, \"otsuchi\": _2, \"rikuzentakata\": _2, \"shiwa\": _2, \"shizukuishi\": _2, \"sumita\": _2, \"tanohata\": _2, \"tono\": _2, \"yahaba\": _2, \"yamada\": _2 } }, \"kagawa\": { \"$\": 1, \"succ\": { \"ayagawa\": _2, \"higashikagawa\": _2, \"kanonji\": _2, \"kotohira\": _2, \"manno\": _2, \"marugame\": _2, \"mitoyo\": _2, \"naoshima\": _2, \"sanuki\": _2, \"tadotsu\": _2, \"takamatsu\": _2, \"tonosho\": _2, \"uchinomi\": _2, \"utazu\": _2, \"zentsuji\": _2 } }, \"kagoshima\": { \"$\": 1, \"succ\": { \"akune\": _2, \"amami\": _2, \"hioki\": _2, \"isa\": _2, \"isen\": _2, \"izumi\": _2, \"kagoshima\": _2, \"kanoya\": _2, \"kawanabe\": _2, \"kinko\": _2, \"kouyama\": _2, \"makurazaki\": _2, \"matsumoto\": _2, \"minamitane\": _2, \"nakatane\": _2, \"nishinoomote\": _2, \"satsumasendai\": _2, \"soo\": _2, \"tarumizu\": _2, \"yusui\": _2 } }, \"kanagawa\": { \"$\": 1, \"succ\": { \"aikawa\": _2, \"atsugi\": _2, \"ayase\": _2, \"chigasaki\": _2, \"ebina\": _2, \"fujisawa\": _2, \"hadano\": _2, \"hakone\": _2, \"hiratsuka\": _2, \"isehara\": _2, \"kaisei\": _2, \"kamakura\": _2, \"kiyokawa\": _2, \"matsuda\": _2, \"minamiashigara\": _2, \"miura\": _2, \"nakai\": _2, \"ninomiya\": _2, \"odawara\": _2, \"oi\": _2, \"oiso\": _2, \"sagamihara\": _2, \"samukawa\": _2, \"tsukui\": _2, \"yamakita\": _2, \"yamato\": _2, \"yokosuka\": _2, \"yugawara\": _2, \"zama\": _2, \"zushi\": _2 } }, \"kochi\": { \"$\": 1, \"succ\": { \"aki\": _2, \"geisei\": _2, \"hidaka\": _2, \"higashitsuno\": _2, \"ino\": _2, \"kagami\": _2, \"kami\": _2, \"kitagawa\": _2, \"kochi\": _2, \"mihara\": _2, \"motoyama\": _2, \"muroto\": _2, \"nahari\": _2, \"nakamura\": _2, \"nankoku\": _2, \"nishitosa\": _2, \"niyodogawa\": _2, \"ochi\": _2, \"okawa\": _2, \"otoyo\": _2, \"otsuki\": _2, \"sakawa\": _2, \"sukumo\": _2, \"susaki\": _2, \"tosa\": _2, \"tosashimizu\": _2, \"toyo\": _2, \"tsuno\": _2, \"umaji\": _2, \"yasuda\": _2, \"yusuhara\": _2 } }, \"kumamoto\": { \"$\": 1, \"succ\": { \"amakusa\": _2, \"arao\": _2, \"aso\": _2, \"choyo\": _2, \"gyokuto\": _2, \"kamiamakusa\": _2, \"kikuchi\": _2, \"kumamoto\": _2, \"mashiki\": _2, \"mifune\": _2, \"minamata\": _2, \"minamioguni\": _2, \"nagasu\": _2, \"nishihara\": _2, \"oguni\": _2, \"ozu\": _2, \"sumoto\": _2, \"takamori\": _2, \"uki\": _2, \"uto\": _2, \"yamaga\": _2, \"yamato\": _2, \"yatsushiro\": _2 } }, \"kyoto\": { \"$\": 1, \"succ\": { \"ayabe\": _2, \"fukuchiyama\": _2, \"higashiyama\": _2, \"ide\": _2, \"ine\": _2, \"joyo\": _2, \"kameoka\": _2, \"kamo\": _2, \"kita\": _2, \"kizu\": _2, \"kumiyama\": _2, \"kyotamba\": _2, \"kyotanabe\": _2, \"kyotango\": _2, \"maizuru\": _2, \"minami\": _2, \"minamiyamashiro\": _2, \"miyazu\": _2, \"muko\": _2, \"nagaokakyo\": _2, \"nakagyo\": _2, \"nantan\": _2, \"oyamazaki\": _2, \"sakyo\": _2, \"seika\": _2, \"tanabe\": _2, \"uji\": _2, \"ujitawara\": _2, \"wazuka\": _2, \"yamashina\": _2, \"yawata\": _2 } }, \"mie\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"inabe\": _2, \"ise\": _2, \"kameyama\": _2, \"kawagoe\": _2, \"kiho\": _2, \"kisosaki\": _2, \"kiwa\": _2, \"komono\": _2, \"kumano\": _2, \"kuwana\": _2, \"matsusaka\": _2, \"meiwa\": _2, \"mihama\": _2, \"minamiise\": _2, \"misugi\": _2, \"miyama\": _2, \"nabari\": _2, \"shima\": _2, \"suzuka\": _2, \"tado\": _2, \"taiki\": _2, \"taki\": _2, \"tamaki\": _2, \"toba\": _2, \"tsu\": _2, \"udono\": _2, \"ureshino\": _2, \"watarai\": _2, \"yokkaichi\": _2 } }, \"miyagi\": { \"$\": 1, \"succ\": { \"furukawa\": _2, \"higashimatsushima\": _2, \"ishinomaki\": _2, \"iwanuma\": _2, \"kakuda\": _2, \"kami\": _2, \"kawasaki\": _2, \"marumori\": _2, \"matsushima\": _2, \"minamisanriku\": _2, \"misato\": _2, \"murata\": _2, \"natori\": _2, \"ogawara\": _2, \"ohira\": _2, \"onagawa\": _2, \"osaki\": _2, \"rifu\": _2, \"semine\": _2, \"shibata\": _2, \"shichikashuku\": _2, \"shikama\": _2, \"shiogama\": _2, \"shiroishi\": _2, \"tagajo\": _2, \"taiwa\": _2, \"tome\": _2, \"tomiya\": _2, \"wakuya\": _2, \"watari\": _2, \"yamamoto\": _2, \"zao\": _2 } }, \"miyazaki\": { \"$\": 1, \"succ\": { \"aya\": _2, \"ebino\": _2, \"gokase\": _2, \"hyuga\": _2, \"kadogawa\": _2, \"kawaminami\": _2, \"kijo\": _2, \"kitagawa\": _2, \"kitakata\": _2, \"kitaura\": _2, \"kobayashi\": _2, \"kunitomi\": _2, \"kushima\": _2, \"mimata\": _2, \"miyakonojo\": _2, \"miyazaki\": _2, \"morotsuka\": _2, \"nichinan\": _2, \"nishimera\": _2, \"nobeoka\": _2, \"saito\": _2, \"shiiba\": _2, \"shintomi\": _2, \"takaharu\": _2, \"takanabe\": _2, \"takazaki\": _2, \"tsuno\": _2 } }, \"nagano\": { \"$\": 1, \"succ\": { \"achi\": _2, \"agematsu\": _2, \"anan\": _2, \"aoki\": _2, \"asahi\": _2, \"azumino\": _2, \"chikuhoku\": _2, \"chikuma\": _2, \"chino\": _2, \"fujimi\": _2, \"hakuba\": _2, \"hara\": _2, \"hiraya\": _2, \"iida\": _2, \"iijima\": _2, \"iiyama\": _2, \"iizuna\": _2, \"ikeda\": _2, \"ikusaka\": _2, \"ina\": _2, \"karuizawa\": _2, \"kawakami\": _2, \"kiso\": _2, \"kisofukushima\": _2, \"kitaaiki\": _2, \"komagane\": _2, \"komoro\": _2, \"matsukawa\": _2, \"matsumoto\": _2, \"miasa\": _2, \"minamiaiki\": _2, \"minamimaki\": _2, \"minamiminowa\": _2, \"minowa\": _2, \"miyada\": _2, \"miyota\": _2, \"mochizuki\": _2, \"nagano\": _2, \"nagawa\": _2, \"nagiso\": _2, \"nakagawa\": _2, \"nakano\": _2, \"nozawaonsen\": _2, \"obuse\": _2, \"ogawa\": _2, \"okaya\": _2, \"omachi\": _2, \"omi\": _2, \"ookuwa\": _2, \"ooshika\": _2, \"otaki\": _2, \"otari\": _2, \"sakae\": _2, \"sakaki\": _2, \"saku\": _2, \"sakuho\": _2, \"shimosuwa\": _2, \"shinanomachi\": _2, \"shiojiri\": _2, \"suwa\": _2, \"suzaka\": _2, \"takagi\": _2, \"takamori\": _2, \"takayama\": _2, \"tateshina\": _2, \"tatsuno\": _2, \"togakushi\": _2, \"togura\": _2, \"tomi\": _2, \"ueda\": _2, \"wada\": _2, \"yamagata\": _2, \"yamanouchi\": _2, \"yasaka\": _2, \"yasuoka\": _2 } }, \"nagasaki\": { \"$\": 1, \"succ\": { \"chijiwa\": _2, \"futsu\": _2, \"goto\": _2, \"hasami\": _2, \"hirado\": _2, \"iki\": _2, \"isahaya\": _2, \"kawatana\": _2, \"kuchinotsu\": _2, \"matsuura\": _2, \"nagasaki\": _2, \"obama\": _2, \"omura\": _2, \"oseto\": _2, \"saikai\": _2, \"sasebo\": _2, \"seihi\": _2, \"shimabara\": _2, \"shinkamigoto\": _2, \"togitsu\": _2, \"tsushima\": _2, \"unzen\": _2 } }, \"nara\": { \"$\": 1, \"succ\": { \"ando\": _2, \"gose\": _2, \"heguri\": _2, \"higashiyoshino\": _2, \"ikaruga\": _2, \"ikoma\": _2, \"kamikitayama\": _2, \"kanmaki\": _2, \"kashiba\": _2, \"kashihara\": _2, \"katsuragi\": _2, \"kawai\": _2, \"kawakami\": _2, \"kawanishi\": _2, \"koryo\": _2, \"kurotaki\": _2, \"mitsue\": _2, \"miyake\": _2, \"nara\": _2, \"nosegawa\": _2, \"oji\": _2, \"ouda\": _2, \"oyodo\": _2, \"sakurai\": _2, \"sango\": _2, \"shimoichi\": _2, \"shimokitayama\": _2, \"shinjo\": _2, \"soni\": _2, \"takatori\": _2, \"tawaramoto\": _2, \"tenkawa\": _2, \"tenri\": _2, \"uda\": _2, \"yamatokoriyama\": _2, \"yamatotakada\": _2, \"yamazoe\": _2, \"yoshino\": _2 } }, \"niigata\": { \"$\": 1, \"succ\": { \"aga\": _2, \"agano\": _2, \"gosen\": _2, \"itoigawa\": _2, \"izumozaki\": _2, \"joetsu\": _2, \"kamo\": _2, \"kariwa\": _2, \"kashiwazaki\": _2, \"minamiuonuma\": _2, \"mitsuke\": _2, \"muika\": _2, \"murakami\": _2, \"myoko\": _2, \"nagaoka\": _2, \"niigata\": _2, \"ojiya\": _2, \"omi\": _2, \"sado\": _2, \"sanjo\": _2, \"seiro\": _2, \"seirou\": _2, \"sekikawa\": _2, \"shibata\": _2, \"tagami\": _2, \"tainai\": _2, \"tochio\": _2, \"tokamachi\": _2, \"tsubame\": _2, \"tsunan\": _2, \"uonuma\": _2, \"yahiko\": _2, \"yoita\": _2, \"yuzawa\": _2 } }, \"oita\": { \"$\": 1, \"succ\": { \"beppu\": _2, \"bungoono\": _2, \"bungotakada\": _2, \"hasama\": _2, \"hiji\": _2, \"himeshima\": _2, \"hita\": _2, \"kamitsue\": _2, \"kokonoe\": _2, \"kuju\": _2, \"kunisaki\": _2, \"kusu\": _2, \"oita\": _2, \"saiki\": _2, \"taketa\": _2, \"tsukumi\": _2, \"usa\": _2, \"usuki\": _2, \"yufu\": _2 } }, \"okayama\": { \"$\": 1, \"succ\": { \"akaiwa\": _2, \"asakuchi\": _2, \"bizen\": _2, \"hayashima\": _2, \"ibara\": _2, \"kagamino\": _2, \"kasaoka\": _2, \"kibichuo\": _2, \"kumenan\": _2, \"kurashiki\": _2, \"maniwa\": _2, \"misaki\": _2, \"nagi\": _2, \"niimi\": _2, \"nishiawakura\": _2, \"okayama\": _2, \"satosho\": _2, \"setouchi\": _2, \"shinjo\": _2, \"shoo\": _2, \"soja\": _2, \"takahashi\": _2, \"tamano\": _2, \"tsuyama\": _2, \"wake\": _2, \"yakage\": _2 } }, \"okinawa\": { \"$\": 1, \"succ\": { \"aguni\": _2, \"ginowan\": _2, \"ginoza\": _2, \"gushikami\": _2, \"haebaru\": _2, \"higashi\": _2, \"hirara\": _2, \"iheya\": _2, \"ishigaki\": _2, \"ishikawa\": _2, \"itoman\": _2, \"izena\": _2, \"kadena\": _2, \"kin\": _2, \"kitadaito\": _2, \"kitanakagusuku\": _2, \"kumejima\": _2, \"kunigami\": _2, \"minamidaito\": _2, \"motobu\": _2, \"nago\": _2, \"naha\": _2, \"nakagusuku\": _2, \"nakijin\": _2, \"nanjo\": _2, \"nishihara\": _2, \"ogimi\": _2, \"okinawa\": _2, \"onna\": _2, \"shimoji\": _2, \"taketomi\": _2, \"tarama\": _2, \"tokashiki\": _2, \"tomigusuku\": _2, \"tonaki\": _2, \"urasoe\": _2, \"uruma\": _2, \"yaese\": _2, \"yomitan\": _2, \"yonabaru\": _2, \"yonaguni\": _2, \"zamami\": _2 } }, \"osaka\": { \"$\": 1, \"succ\": { \"abeno\": _2, \"chihayaakasaka\": _2, \"chuo\": _2, \"daito\": _2, \"fujiidera\": _2, \"habikino\": _2, \"hannan\": _2, \"higashiosaka\": _2, \"higashisumiyoshi\": _2, \"higashiyodogawa\": _2, \"hirakata\": _2, \"ibaraki\": _2, \"ikeda\": _2, \"izumi\": _2, \"izumiotsu\": _2, \"izumisano\": _2, \"kadoma\": _2, \"kaizuka\": _2, \"kanan\": _2, \"kashiwara\": _2, \"katano\": _2, \"kawachinagano\": _2, \"kishiwada\": _2, \"kita\": _2, \"kumatori\": _2, \"matsubara\": _2, \"minato\": _2, \"minoh\": _2, \"misaki\": _2, \"moriguchi\": _2, \"neyagawa\": _2, \"nishi\": _2, \"nose\": _2, \"osakasayama\": _2, \"sakai\": _2, \"sayama\": _2, \"sennan\": _2, \"settsu\": _2, \"shijonawate\": _2, \"shimamoto\": _2, \"suita\": _2, \"tadaoka\": _2, \"taishi\": _2, \"tajiri\": _2, \"takaishi\": _2, \"takatsuki\": _2, \"tondabayashi\": _2, \"toyonaka\": _2, \"toyono\": _2, \"yao\": _2 } }, \"saga\": { \"$\": 1, \"succ\": { \"ariake\": _2, \"arita\": _2, \"fukudomi\": _2, \"genkai\": _2, \"hamatama\": _2, \"hizen\": _2, \"imari\": _2, \"kamimine\": _2, \"kanzaki\": _2, \"karatsu\": _2, \"kashima\": _2, \"kitagata\": _2, \"kitahata\": _2, \"kiyama\": _2, \"kouhoku\": _2, \"kyuragi\": _2, \"nishiarita\": _2, \"ogi\": _2, \"omachi\": _2, \"ouchi\": _2, \"saga\": _2, \"shiroishi\": _2, \"taku\": _2, \"tara\": _2, \"tosu\": _2, \"yoshinogari\": _2 } }, \"saitama\": { \"$\": 1, \"succ\": { \"arakawa\": _2, \"asaka\": _2, \"chichibu\": _2, \"fujimi\": _2, \"fujimino\": _2, \"fukaya\": _2, \"hanno\": _2, \"hanyu\": _2, \"hasuda\": _2, \"hatogaya\": _2, \"hatoyama\": _2, \"hidaka\": _2, \"higashichichibu\": _2, \"higashimatsuyama\": _2, \"honjo\": _2, \"ina\": _2, \"iruma\": _2, \"iwatsuki\": _2, \"kamiizumi\": _2, \"kamikawa\": _2, \"kamisato\": _2, \"kasukabe\": _2, \"kawagoe\": _2, \"kawaguchi\": _2, \"kawajima\": _2, \"kazo\": _2, \"kitamoto\": _2, \"koshigaya\": _2, \"kounosu\": _2, \"kuki\": _2, \"kumagaya\": _2, \"matsubushi\": _2, \"minano\": _2, \"misato\": _2, \"miyashiro\": _2, \"miyoshi\": _2, \"moroyama\": _2, \"nagatoro\": _2, \"namegawa\": _2, \"niiza\": _2, \"ogano\": _2, \"ogawa\": _2, \"ogose\": _2, \"okegawa\": _2, \"omiya\": _2, \"otaki\": _2, \"ranzan\": _2, \"ryokami\": _2, \"saitama\": _2, \"sakado\": _2, \"satte\": _2, \"sayama\": _2, \"shiki\": _2, \"shiraoka\": _2, \"soka\": _2, \"sugito\": _2, \"toda\": _2, \"tokigawa\": _2, \"tokorozawa\": _2, \"tsurugashima\": _2, \"urawa\": _2, \"warabi\": _2, \"yashio\": _2, \"yokoze\": _2, \"yono\": _2, \"yorii\": _2, \"yoshida\": _2, \"yoshikawa\": _2, \"yoshimi\": _2 } }, \"shiga\": { \"$\": 1, \"succ\": { \"aisho\": _2, \"gamo\": _2, \"higashiomi\": _2, \"hikone\": _2, \"koka\": _2, \"konan\": _2, \"kosei\": _2, \"koto\": _2, \"kusatsu\": _2, \"maibara\": _2, \"moriyama\": _2, \"nagahama\": _2, \"nishiazai\": _2, \"notogawa\": _2, \"omihachiman\": _2, \"otsu\": _2, \"ritto\": _2, \"ryuoh\": _2, \"takashima\": _2, \"takatsuki\": _2, \"torahime\": _2, \"toyosato\": _2, \"yasu\": _2 } }, \"shimane\": { \"$\": 1, \"succ\": { \"akagi\": _2, \"ama\": _2, \"gotsu\": _2, \"hamada\": _2, \"higashiizumo\": _2, \"hikawa\": _2, \"hikimi\": _2, \"izumo\": _2, \"kakinoki\": _2, \"masuda\": _2, \"matsue\": _2, \"misato\": _2, \"nishinoshima\": _2, \"ohda\": _2, \"okinoshima\": _2, \"okuizumo\": _2, \"shimane\": _2, \"tamayu\": _2, \"tsuwano\": _2, \"unnan\": _2, \"yakumo\": _2, \"yasugi\": _2, \"yatsuka\": _2 } }, \"shizuoka\": { \"$\": 1, \"succ\": { \"arai\": _2, \"atami\": _2, \"fuji\": _2, \"fujieda\": _2, \"fujikawa\": _2, \"fujinomiya\": _2, \"fukuroi\": _2, \"gotemba\": _2, \"haibara\": _2, \"hamamatsu\": _2, \"higashiizu\": _2, \"ito\": _2, \"iwata\": _2, \"izu\": _2, \"izunokuni\": _2, \"kakegawa\": _2, \"kannami\": _2, \"kawanehon\": _2, \"kawazu\": _2, \"kikugawa\": _2, \"kosai\": _2, \"makinohara\": _2, \"matsuzaki\": _2, \"minamiizu\": _2, \"mishima\": _2, \"morimachi\": _2, \"nishiizu\": _2, \"numazu\": _2, \"omaezaki\": _2, \"shimada\": _2, \"shimizu\": _2, \"shimoda\": _2, \"shizuoka\": _2, \"susono\": _2, \"yaizu\": _2, \"yoshida\": _2 } }, \"tochigi\": { \"$\": 1, \"succ\": { \"ashikaga\": _2, \"bato\": _2, \"haga\": _2, \"ichikai\": _2, \"iwafune\": _2, \"kaminokawa\": _2, \"kanuma\": _2, \"karasuyama\": _2, \"kuroiso\": _2, \"mashiko\": _2, \"mibu\": _2, \"moka\": _2, \"motegi\": _2, \"nasu\": _2, \"nasushiobara\": _2, \"nikko\": _2, \"nishikata\": _2, \"nogi\": _2, \"ohira\": _2, \"ohtawara\": _2, \"oyama\": _2, \"sakura\": _2, \"sano\": _2, \"shimotsuke\": _2, \"shioya\": _2, \"takanezawa\": _2, \"tochigi\": _2, \"tsuga\": _2, \"ujiie\": _2, \"utsunomiya\": _2, \"yaita\": _2 } }, \"tokushima\": { \"$\": 1, \"succ\": { \"aizumi\": _2, \"anan\": _2, \"ichiba\": _2, \"itano\": _2, \"kainan\": _2, \"komatsushima\": _2, \"matsushige\": _2, \"mima\": _2, \"minami\": _2, \"miyoshi\": _2, \"mugi\": _2, \"nakagawa\": _2, \"naruto\": _2, \"sanagochi\": _2, \"shishikui\": _2, \"tokushima\": _2, \"wajiki\": _2 } }, \"tokyo\": { \"$\": 1, \"succ\": { \"adachi\": _2, \"akiruno\": _2, \"akishima\": _2, \"aogashima\": _2, \"arakawa\": _2, \"bunkyo\": _2, \"chiyoda\": _2, \"chofu\": _2, \"chuo\": _2, \"edogawa\": _2, \"fuchu\": _2, \"fussa\": _2, \"hachijo\": _2, \"hachioji\": _2, \"hamura\": _2, \"higashikurume\": _2, \"higashimurayama\": _2, \"higashiyamato\": _2, \"hino\": _2, \"hinode\": _2, \"hinohara\": _2, \"inagi\": _2, \"itabashi\": _2, \"katsushika\": _2, \"kita\": _2, \"kiyose\": _2, \"kodaira\": _2, \"koganei\": _2, \"kokubunji\": _2, \"komae\": _2, \"koto\": _2, \"kouzushima\": _2, \"kunitachi\": _2, \"machida\": _2, \"meguro\": _2, \"minato\": _2, \"mitaka\": _2, \"mizuho\": _2, \"musashimurayama\": _2, \"musashino\": _2, \"nakano\": _2, \"nerima\": _2, \"ogasawara\": _2, \"okutama\": _2, \"ome\": _2, \"oshima\": _2, \"ota\": _2, \"setagaya\": _2, \"shibuya\": _2, \"shinagawa\": _2, \"shinjuku\": _2, \"suginami\": _2, \"sumida\": _2, \"tachikawa\": _2, \"taito\": _2, \"tama\": _2, \"toshima\": _2 } }, \"tottori\": { \"$\": 1, \"succ\": { \"chizu\": _2, \"hino\": _2, \"kawahara\": _2, \"koge\": _2, \"kotoura\": _2, \"misasa\": _2, \"nanbu\": _2, \"nichinan\": _2, \"sakaiminato\": _2, \"tottori\": _2, \"wakasa\": _2, \"yazu\": _2, \"yonago\": _2 } }, \"toyama\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"fuchu\": _2, \"fukumitsu\": _2, \"funahashi\": _2, \"himi\": _2, \"imizu\": _2, \"inami\": _2, \"johana\": _2, \"kamiichi\": _2, \"kurobe\": _2, \"nakaniikawa\": _2, \"namerikawa\": _2, \"nanto\": _2, \"nyuzen\": _2, \"oyabe\": _2, \"taira\": _2, \"takaoka\": _2, \"tateyama\": _2, \"toga\": _2, \"tonami\": _2, \"toyama\": _2, \"unazuki\": _2, \"uozu\": _2, \"yamada\": _2 } }, \"wakayama\": { \"$\": 1, \"succ\": { \"arida\": _2, \"aridagawa\": _2, \"gobo\": _2, \"hashimoto\": _2, \"hidaka\": _2, \"hirogawa\": _2, \"inami\": _2, \"iwade\": _2, \"kainan\": _2, \"kamitonda\": _2, \"katsuragi\": _2, \"kimino\": _2, \"kinokawa\": _2, \"kitayama\": _2, \"koya\": _2, \"koza\": _2, \"kozagawa\": _2, \"kudoyama\": _2, \"kushimoto\": _2, \"mihama\": _2, \"misato\": _2, \"nachikatsuura\": _2, \"shingu\": _2, \"shirahama\": _2, \"taiji\": _2, \"tanabe\": _2, \"wakayama\": _2, \"yuasa\": _2, \"yura\": _2 } }, \"yamagata\": { \"$\": 1, \"succ\": { \"asahi\": _2, \"funagata\": _2, \"higashine\": _2, \"iide\": _2, \"kahoku\": _2, \"kaminoyama\": _2, \"kaneyama\": _2, \"kawanishi\": _2, \"mamurogawa\": _2, \"mikawa\": _2, \"murayama\": _2, \"nagai\": _2, \"nakayama\": _2, \"nanyo\": _2, \"nishikawa\": _2, \"obanazawa\": _2, \"oe\": _2, \"oguni\": _2, \"ohkura\": _2, \"oishida\": _2, \"sagae\": _2, \"sakata\": _2, \"sakegawa\": _2, \"shinjo\": _2, \"shirataka\": _2, \"shonai\": _2, \"takahata\": _2, \"tendo\": _2, \"tozawa\": _2, \"tsuruoka\": _2, \"yamagata\": _2, \"yamanobe\": _2, \"yonezawa\": _2, \"yuza\": _2 } }, \"yamaguchi\": { \"$\": 1, \"succ\": { \"abu\": _2, \"hagi\": _2, \"hikari\": _2, \"hofu\": _2, \"iwakuni\": _2, \"kudamatsu\": _2, \"mitou\": _2, \"nagato\": _2, \"oshima\": _2, \"shimonoseki\": _2, \"shunan\": _2, \"tabuse\": _2, \"tokuyama\": _2, \"toyota\": _2, \"ube\": _2, \"yuu\": _2 } }, \"yamanashi\": { \"$\": 1, \"succ\": { \"chuo\": _2, \"doshi\": _2, \"fuefuki\": _2, \"fujikawa\": _2, \"fujikawaguchiko\": _2, \"fujiyoshida\": _2, \"hayakawa\": _2, \"hokuto\": _2, \"ichikawamisato\": _2, \"kai\": _2, \"kofu\": _2, \"koshu\": _2, \"kosuge\": _2, \"minami-alps\": _2, \"minobu\": _2, \"nakamichi\": _2, \"nanbu\": _2, \"narusawa\": _2, \"nirasaki\": _2, \"nishikatsura\": _2, \"oshino\": _2, \"otsuki\": _2, \"showa\": _2, \"tabayama\": _2, \"tsuru\": _2, \"uenohara\": _2, \"yamanakako\": _2, \"yamanashi\": _2 } }, \"xn--4pvxs\": _2, \"栃木\": _2, \"xn--vgu402c\": _2, \"愛知\": _2, \"xn--c3s14m\": _2, \"愛媛\": _2, \"xn--f6qx53a\": _2, \"兵庫\": _2, \"xn--8pvr4u\": _2, \"熊本\": _2, \"xn--uist22h\": _2, \"茨城\": _2, \"xn--djrs72d6uy\": _2, \"北海道\": _2, \"xn--mkru45i\": _2, \"千葉\": _2, \"xn--0trq7p7nn\": _2, \"和歌山\": _2, \"xn--8ltr62k\": _2, \"長崎\": _2, \"xn--2m4a15e\": _2, \"長野\": _2, \"xn--efvn9s\": _2, \"新潟\": _2, \"xn--32vp30h\": _2, \"青森\": _2, \"xn--4it797k\": _2, \"静岡\": _2, \"xn--1lqs71d\": _2, \"東京\": _2, \"xn--5rtp49c\": _2, \"石川\": _2, \"xn--5js045d\": _2, \"埼玉\": _2, \"xn--ehqz56n\": _2, \"三重\": _2, \"xn--1lqs03n\": _2, \"京都\": _2, \"xn--qqqt11m\": _2, \"佐賀\": _2, \"xn--kbrq7o\": _2, \"大分\": _2, \"xn--pssu33l\": _2, \"大阪\": _2, \"xn--ntsq17g\": _2, \"奈良\": _2, \"xn--uisz3g\": _2, \"宮城\": _2, \"xn--6btw5a\": _2, \"宮崎\": _2, \"xn--1ctwo\": _2, \"富山\": _2, \"xn--6orx2r\": _2, \"山口\": _2, \"xn--rht61e\": _2, \"山形\": _2, \"xn--rht27z\": _2, \"山梨\": _2, \"xn--djty4k\": _2, \"岩手\": _2, \"xn--nit225k\": _2, \"岐阜\": _2, \"xn--rht3d\": _2, \"岡山\": _2, \"xn--klty5x\": _2, \"島根\": _2, \"xn--kltx9a\": _2, \"広島\": _2, \"xn--kltp7d\": _2, \"徳島\": _2, \"xn--uuwu58a\": _2, \"沖縄\": _2, \"xn--zbx025d\": _2, \"滋賀\": _2, \"xn--ntso0iqx3a\": _2, \"神奈川\": _2, \"xn--elqq16h\": _2, \"福井\": _2, \"xn--4it168d\": _2, \"福岡\": _2, \"xn--klt787d\": _2, \"福島\": _2, \"xn--rny31h\": _2, \"秋田\": _2, \"xn--7t0a264c\": _2, \"群馬\": _2, \"xn--5rtq34k\": _2, \"香川\": _2, \"xn--k7yn95e\": _2, \"高知\": _2, \"xn--tor131o\": _2, \"鳥取\": _2, \"xn--d5qv7z876c\": _2, \"鹿児島\": _2, \"kawasaki\": _8, \"kitakyushu\": _8, \"kobe\": _8, \"nagoya\": _8, \"sapporo\": _8, \"sendai\": _8, \"yokohama\": _8, \"usercontent\": _4, \"blogspot\": _4 } }, \"ke\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _5, \"go\": _2, \"info\": _2, \"me\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2, \"nom\": _4 } }, \"kg\": { \"$\": 1, \"succ\": { \"org\": _2, \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"blog\": _4, \"io\": _4, \"jp\": _4, \"tv\": _4, \"uk\": _4, \"us\": _4 } }, \"kh\": _8, \"ki\": _22, \"km\": { \"$\": 1, \"succ\": { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"ass\": _2, \"com\": _2, \"coop\": _2, \"asso\": _2, \"presse\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmaciens\": _2, \"veterinaire\": _2, \"gouv\": _2 } }, \"kn\": { \"$\": 1, \"succ\": { \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2 } }, \"kp\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"rep\": _2, \"tra\": _2 } }, \"kr\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"es\": _2, \"go\": _2, \"hs\": _2, \"kg\": _2, \"mil\": _2, \"ms\": _2, \"ne\": _2, \"or\": _2, \"pe\": _2, \"re\": _2, \"sc\": _2, \"busan\": _2, \"chungbuk\": _2, \"chungnam\": _2, \"daegu\": _2, \"daejeon\": _2, \"gangwon\": _2, \"gwangju\": _2, \"gyeongbuk\": _2, \"gyeonggi\": _2, \"gyeongnam\": _2, \"incheon\": _2, \"jeju\": _2, \"jeonbuk\": _2, \"jeonnam\": _2, \"seoul\": _2, \"ulsan\": _2, \"blogspot\": _4 } }, \"kw\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"emb\": _2, \"gov\": _2, \"ind\": _2, \"net\": _2, \"org\": _2 } }, \"ky\": _9, \"kz\": { \"$\": 1, \"succ\": { \"org\": _2, \"edu\": _2, \"net\": _2, \"gov\": _2, \"mil\": _2, \"com\": _2, \"nym\": _4 } }, \"la\": { \"$\": 1, \"succ\": { \"int\": _2, \"net\": _2, \"info\": _2, \"edu\": _2, \"gov\": _2, \"per\": _2, \"com\": _2, \"org\": _2, \"bnr\": _4, \"c\": _4, \"nym\": _4 } }, \"lb\": _9, \"lc\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"nym\": _4, \"oy\": _4 } }, \"li\": { \"$\": 1, \"succ\": { \"blogspot\": _4, \"caa\": _4, \"nom\": _4, \"nym\": _4 } }, \"lk\": { \"$\": 1, \"succ\": { \"gov\": _2, \"sch\": _2, \"net\": _2, \"int\": _2, \"com\": _2, \"org\": _2, \"edu\": _2, \"ngo\": _2, \"soc\": _2, \"web\": _2, \"ltd\": _2, \"assn\": _2, \"grp\": _2, \"hotel\": _2, \"ac\": _2 } }, \"lr\": _9, \"ls\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"sc\": _2, \"de\": _4 } }, \"lt\": _20, \"lu\": _23, \"lv\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"id\": _2, \"net\": _2, \"asn\": _2, \"conf\": _2, \"nom\": _4 } }, \"ly\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"gov\": _2, \"plc\": _2, \"edu\": _2, \"sch\": _2, \"med\": _2, \"org\": _2, \"id\": _2 } }, \"ma\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"ac\": _2, \"press\": _2 } }, \"mc\": { \"$\": 1, \"succ\": { \"tm\": _2, \"asso\": _2 } }, \"md\": { \"$\": 1, \"succ\": { \"blogspot\": _4, \"at\": _4, \"de\": _4, \"jp\": _4, \"to\": _4 } }, \"me\": { \"$\": 1, \"succ\": { \"co\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"ac\": _2, \"gov\": _2, \"its\": _2, \"priv\": _2, \"c66\": _4, \"daplie\": { \"$\": 2, \"succ\": { \"localhost\": _4 } }, \"edgestack\": _4, \"couk\": _4, \"ukco\": _4, \"filegear\": _4, \"filegear-au\": _4, \"filegear-de\": _4, \"filegear-gb\": _4, \"filegear-ie\": _4, \"filegear-jp\": _4, \"filegear-sg\": _4, \"glitch\": _4, \"ravendb\": _4, \"barsy\": _4, \"nctu\": _4, \"soundcast\": _4, \"tcp4\": _4, \"brasilia\": _4, \"ddns\": _4, \"dnsfor\": _4, \"hopto\": _4, \"loginto\": _4, \"noip\": _4, \"webhop\": _4, \"nym\": _4, \"diskstation\": _4, \"dscloud\": _4, \"i234\": _4, \"myds\": _4, \"synology\": _4, \"wedeploy\": _4, \"yombo\": _4, \"nohost\": _4 } }, \"mg\": { \"$\": 1, \"succ\": { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"com\": _2, \"co\": _2 } }, \"mh\": _2, \"mil\": _2, \"mk\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"gov\": _2, \"inf\": _2, \"name\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"ml\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gouv\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"presse\": _2 } }, \"mm\": _8, \"mn\": { \"$\": 1, \"succ\": { \"gov\": _2, \"edu\": _2, \"org\": _2, \"nyc\": _4, \"nym\": _4 } }, \"mo\": _9, \"mobi\": { \"$\": 1, \"succ\": { \"barsy\": _4, \"dscloud\": _4 } }, \"mp\": _2, \"mq\": _2, \"mr\": { \"$\": 1, \"succ\": { \"gov\": _2, \"blogspot\": _4 } }, \"ms\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"lab\": _4 } }, \"mt\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"net\": _2, \"org\": _2 } }, \"mu\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"ac\": _2, \"co\": _2, \"or\": _2 } }, \"museum\": { \"$\": 1, \"succ\": { \"academy\": _2, \"agriculture\": _2, \"air\": _2, \"airguard\": _2, \"alabama\": _2, \"alaska\": _2, \"amber\": _2, \"ambulance\": _2, \"american\": _2, \"americana\": _2, \"americanantiques\": _2, \"americanart\": _2, \"amsterdam\": _2, \"and\": _2, \"annefrank\": _2, \"anthro\": _2, \"anthropology\": _2, \"antiques\": _2, \"aquarium\": _2, \"arboretum\": _2, \"archaeological\": _2, \"archaeology\": _2, \"architecture\": _2, \"art\": _2, \"artanddesign\": _2, \"artcenter\": _2, \"artdeco\": _2, \"arteducation\": _2, \"artgallery\": _2, \"arts\": _2, \"artsandcrafts\": _2, \"asmatart\": _2, \"assassination\": _2, \"assisi\": _2, \"association\": _2, \"astronomy\": _2, \"atlanta\": _2, \"austin\": _2, \"australia\": _2, \"automotive\": _2, \"aviation\": _2, \"axis\": _2, \"badajoz\": _2, \"baghdad\": _2, \"bahn\": _2, \"bale\": _2, \"baltimore\": _2, \"barcelona\": _2, \"baseball\": _2, \"basel\": _2, \"baths\": _2, \"bauern\": _2, \"beauxarts\": _2, \"beeldengeluid\": _2, \"bellevue\": _2, \"bergbau\": _2, \"berkeley\": _2, \"berlin\": _2, \"bern\": _2, \"bible\": _2, \"bilbao\": _2, \"bill\": _2, \"birdart\": _2, \"birthplace\": _2, \"bonn\": _2, \"boston\": _2, \"botanical\": _2, \"botanicalgarden\": _2, \"botanicgarden\": _2, \"botany\": _2, \"brandywinevalley\": _2, \"brasil\": _2, \"bristol\": _2, \"british\": _2, \"britishcolumbia\": _2, \"broadcast\": _2, \"brunel\": _2, \"brussel\": _2, \"brussels\": _2, \"bruxelles\": _2, \"building\": _2, \"burghof\": _2, \"bus\": _2, \"bushey\": _2, \"cadaques\": _2, \"california\": _2, \"cambridge\": _2, \"can\": _2, \"canada\": _2, \"capebreton\": _2, \"carrier\": _2, \"cartoonart\": _2, \"casadelamoneda\": _2, \"castle\": _2, \"castres\": _2, \"celtic\": _2, \"center\": _2, \"chattanooga\": _2, \"cheltenham\": _2, \"chesapeakebay\": _2, \"chicago\": _2, \"children\": _2, \"childrens\": _2, \"childrensgarden\": _2, \"chiropractic\": _2, \"chocolate\": _2, \"christiansburg\": _2, \"cincinnati\": _2, \"cinema\": _2, \"circus\": _2, \"civilisation\": _2, \"civilization\": _2, \"civilwar\": _2, \"clinton\": _2, \"clock\": _2, \"coal\": _2, \"coastaldefence\": _2, \"cody\": _2, \"coldwar\": _2, \"collection\": _2, \"colonialwilliamsburg\": _2, \"coloradoplateau\": _2, \"columbia\": _2, \"columbus\": _2, \"communication\": _2, \"communications\": _2, \"community\": _2, \"computer\": _2, \"computerhistory\": _2, \"xn--comunicaes-v6a2o\": _2, \"comunicações\": _2, \"contemporary\": _2, \"contemporaryart\": _2, \"convent\": _2, \"copenhagen\": _2, \"corporation\": _2, \"xn--correios-e-telecomunicaes-ghc29a\": _2, \"correios-e-telecomunicações\": _2, \"corvette\": _2, \"costume\": _2, \"countryestate\": _2, \"county\": _2, \"crafts\": _2, \"cranbrook\": _2, \"creation\": _2, \"cultural\": _2, \"culturalcenter\": _2, \"culture\": _2, \"cyber\": _2, \"cymru\": _2, \"dali\": _2, \"dallas\": _2, \"database\": _2, \"ddr\": _2, \"decorativearts\": _2, \"delaware\": _2, \"delmenhorst\": _2, \"denmark\": _2, \"depot\": _2, \"design\": _2, \"detroit\": _2, \"dinosaur\": _2, \"discovery\": _2, \"dolls\": _2, \"donostia\": _2, \"durham\": _2, \"eastafrica\": _2, \"eastcoast\": _2, \"education\": _2, \"educational\": _2, \"egyptian\": _2, \"eisenbahn\": _2, \"elburg\": _2, \"elvendrell\": _2, \"embroidery\": _2, \"encyclopedic\": _2, \"england\": _2, \"entomology\": _2, \"environment\": _2, \"environmentalconservation\": _2, \"epilepsy\": _2, \"essex\": _2, \"estate\": _2, \"ethnology\": _2, \"exeter\": _2, \"exhibition\": _2, \"family\": _2, \"farm\": _2, \"farmequipment\": _2, \"farmers\": _2, \"farmstead\": _2, \"field\": _2, \"figueres\": _2, \"filatelia\": _2, \"film\": _2, \"fineart\": _2, \"finearts\": _2, \"finland\": _2, \"flanders\": _2, \"florida\": _2, \"force\": _2, \"fortmissoula\": _2, \"fortworth\": _2, \"foundation\": _2, \"francaise\": _2, \"frankfurt\": _2, \"franziskaner\": _2, \"freemasonry\": _2, \"freiburg\": _2, \"fribourg\": _2, \"frog\": _2, \"fundacio\": _2, \"furniture\": _2, \"gallery\": _2, \"garden\": _2, \"gateway\": _2, \"geelvinck\": _2, \"gemological\": _2, \"geology\": _2, \"georgia\": _2, \"giessen\": _2, \"glas\": _2, \"glass\": _2, \"gorge\": _2, \"grandrapids\": _2, \"graz\": _2, \"guernsey\": _2, \"halloffame\": _2, \"hamburg\": _2, \"handson\": _2, \"harvestcelebration\": _2, \"hawaii\": _2, \"health\": _2, \"heimatunduhren\": _2, \"hellas\": _2, \"helsinki\": _2, \"hembygdsforbund\": _2, \"heritage\": _2, \"histoire\": _2, \"historical\": _2, \"historicalsociety\": _2, \"historichouses\": _2, \"historisch\": _2, \"historisches\": _2, \"history\": _2, \"historyofscience\": _2, \"horology\": _2, \"house\": _2, \"humanities\": _2, \"illustration\": _2, \"imageandsound\": _2, \"indian\": _2, \"indiana\": _2, \"indianapolis\": _2, \"indianmarket\": _2, \"intelligence\": _2, \"interactive\": _2, \"iraq\": _2, \"iron\": _2, \"isleofman\": _2, \"jamison\": _2, \"jefferson\": _2, \"jerusalem\": _2, \"jewelry\": _2, \"jewish\": _2, \"jewishart\": _2, \"jfk\": _2, \"journalism\": _2, \"judaica\": _2, \"judygarland\": _2, \"juedisches\": _2, \"juif\": _2, \"karate\": _2, \"karikatur\": _2, \"kids\": _2, \"koebenhavn\": _2, \"koeln\": _2, \"kunst\": _2, \"kunstsammlung\": _2, \"kunstunddesign\": _2, \"labor\": _2, \"labour\": _2, \"lajolla\": _2, \"lancashire\": _2, \"landes\": _2, \"lans\": _2, \"xn--lns-qla\": _2, \"läns\": _2, \"larsson\": _2, \"lewismiller\": _2, \"lincoln\": _2, \"linz\": _2, \"living\": _2, \"livinghistory\": _2, \"localhistory\": _2, \"london\": _2, \"losangeles\": _2, \"louvre\": _2, \"loyalist\": _2, \"lucerne\": _2, \"luxembourg\": _2, \"luzern\": _2, \"mad\": _2, \"madrid\": _2, \"mallorca\": _2, \"manchester\": _2, \"mansion\": _2, \"mansions\": _2, \"manx\": _2, \"marburg\": _2, \"maritime\": _2, \"maritimo\": _2, \"maryland\": _2, \"marylhurst\": _2, \"media\": _2, \"medical\": _2, \"medizinhistorisches\": _2, \"meeres\": _2, \"memorial\": _2, \"mesaverde\": _2, \"michigan\": _2, \"midatlantic\": _2, \"military\": _2, \"mill\": _2, \"miners\": _2, \"mining\": _2, \"minnesota\": _2, \"missile\": _2, \"missoula\": _2, \"modern\": _2, \"moma\": _2, \"money\": _2, \"monmouth\": _2, \"monticello\": _2, \"montreal\": _2, \"moscow\": _2, \"motorcycle\": _2, \"muenchen\": _2, \"muenster\": _2, \"mulhouse\": _2, \"muncie\": _2, \"museet\": _2, \"museumcenter\": _2, \"museumvereniging\": _2, \"music\": _2, \"national\": _2, \"nationalfirearms\": _2, \"nationalheritage\": _2, \"nativeamerican\": _2, \"naturalhistory\": _2, \"naturalhistorymuseum\": _2, \"naturalsciences\": _2, \"nature\": _2, \"naturhistorisches\": _2, \"natuurwetenschappen\": _2, \"naumburg\": _2, \"naval\": _2, \"nebraska\": _2, \"neues\": _2, \"newhampshire\": _2, \"newjersey\": _2, \"newmexico\": _2, \"newport\": _2, \"newspaper\": _2, \"newyork\": _2, \"niepce\": _2, \"norfolk\": _2, \"north\": _2, \"nrw\": _2, \"nyc\": _2, \"nyny\": _2, \"oceanographic\": _2, \"oceanographique\": _2, \"omaha\": _2, \"online\": _2, \"ontario\": _2, \"openair\": _2, \"oregon\": _2, \"oregontrail\": _2, \"otago\": _2, \"oxford\": _2, \"pacific\": _2, \"paderborn\": _2, \"palace\": _2, \"paleo\": _2, \"palmsprings\": _2, \"panama\": _2, \"paris\": _2, \"pasadena\": _2, \"pharmacy\": _2, \"philadelphia\": _2, \"philadelphiaarea\": _2, \"philately\": _2, \"phoenix\": _2, \"photography\": _2, \"pilots\": _2, \"pittsburgh\": _2, \"planetarium\": _2, \"plantation\": _2, \"plants\": _2, \"plaza\": _2, \"portal\": _2, \"portland\": _2, \"portlligat\": _2, \"posts-and-telecommunications\": _2, \"preservation\": _2, \"presidio\": _2, \"press\": _2, \"project\": _2, \"public\": _2, \"pubol\": _2, \"quebec\": _2, \"railroad\": _2, \"railway\": _2, \"research\": _2, \"resistance\": _2, \"riodejaneiro\": _2, \"rochester\": _2, \"rockart\": _2, \"roma\": _2, \"russia\": _2, \"saintlouis\": _2, \"salem\": _2, \"salvadordali\": _2, \"salzburg\": _2, \"sandiego\": _2, \"sanfrancisco\": _2, \"santabarbara\": _2, \"santacruz\": _2, \"santafe\": _2, \"saskatchewan\": _2, \"satx\": _2, \"savannahga\": _2, \"schlesisches\": _2, \"schoenbrunn\": _2, \"schokoladen\": _2, \"school\": _2, \"schweiz\": _2, \"science\": _2, \"scienceandhistory\": _2, \"scienceandindustry\": _2, \"sciencecenter\": _2, \"sciencecenters\": _2, \"science-fiction\": _2, \"sciencehistory\": _2, \"sciences\": _2, \"sciencesnaturelles\": _2, \"scotland\": _2, \"seaport\": _2, \"settlement\": _2, \"settlers\": _2, \"shell\": _2, \"sherbrooke\": _2, \"sibenik\": _2, \"silk\": _2, \"ski\": _2, \"skole\": _2, \"society\": _2, \"sologne\": _2, \"soundandvision\": _2, \"southcarolina\": _2, \"southwest\": _2, \"space\": _2, \"spy\": _2, \"square\": _2, \"stadt\": _2, \"stalbans\": _2, \"starnberg\": _2, \"state\": _2, \"stateofdelaware\": _2, \"station\": _2, \"steam\": _2, \"steiermark\": _2, \"stjohn\": _2, \"stockholm\": _2, \"stpetersburg\": _2, \"stuttgart\": _2, \"suisse\": _2, \"surgeonshall\": _2, \"surrey\": _2, \"svizzera\": _2, \"sweden\": _2, \"sydney\": _2, \"tank\": _2, \"tcm\": _2, \"technology\": _2, \"telekommunikation\": _2, \"television\": _2, \"texas\": _2, \"textile\": _2, \"theater\": _2, \"time\": _2, \"timekeeping\": _2, \"topology\": _2, \"torino\": _2, \"touch\": _2, \"town\": _2, \"transport\": _2, \"tree\": _2, \"trolley\": _2, \"trust\": _2, \"trustee\": _2, \"uhren\": _2, \"ulm\": _2, \"undersea\": _2, \"university\": _2, \"usa\": _2, \"usantiques\": _2, \"usarts\": _2, \"uscountryestate\": _2, \"usculture\": _2, \"usdecorativearts\": _2, \"usgarden\": _2, \"ushistory\": _2, \"ushuaia\": _2, \"uslivinghistory\": _2, \"utah\": _2, \"uvic\": _2, \"valley\": _2, \"vantaa\": _2, \"versailles\": _2, \"viking\": _2, \"village\": _2, \"virginia\": _2, \"virtual\": _2, \"virtuel\": _2, \"vlaanderen\": _2, \"volkenkunde\": _2, \"wales\": _2, \"wallonie\": _2, \"war\": _2, \"washingtondc\": _2, \"watchandclock\": _2, \"watch-and-clock\": _2, \"western\": _2, \"westfalen\": _2, \"whaling\": _2, \"wildlife\": _2, \"williamsburg\": _2, \"windmill\": _2, \"workshop\": _2, \"york\": _2, \"yorkshire\": _2, \"yosemite\": _2, \"youth\": _2, \"zoological\": _2, \"zoology\": _2, \"xn--9dbhblg6di\": _2, \"ירושלים\": _2, \"xn--h1aegh\": _2, \"иком\": _2 } }, \"mv\": { \"$\": 1, \"succ\": { \"aero\": _2, \"biz\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"museum\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"mw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"int\": _2, \"museum\": _2, \"net\": _2, \"org\": _2 } }, \"mx\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2, \"net\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"my\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"mil\": _2, \"name\": _2, \"blogspot\": _4 } }, \"mz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"adv\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"na\": { \"$\": 1, \"succ\": { \"info\": _2, \"pro\": _2, \"name\": _2, \"school\": _2, \"or\": _2, \"dr\": _2, \"us\": _2, \"mx\": _2, \"ca\": _2, \"in\": _2, \"cc\": _2, \"tv\": _2, \"ws\": _2, \"mobi\": _2, \"co\": _2, \"com\": _2, \"org\": _2 } }, \"name\": { \"$\": 1, \"succ\": { \"her\": _26, \"his\": _26 } }, \"nc\": { \"$\": 1, \"succ\": { \"asso\": _2, \"nom\": _2 } }, \"ne\": _2, \"net\": { \"$\": 1, \"succ\": { \"adobeaemcloud\": _4, \"alwaysdata\": _4, \"cloudfront\": _4, \"t3l3p0rt\": _4, \"myfritz\": _4, \"blackbaudcdn\": _4, \"boomla\": _4, \"bplaced\": _4, \"square7\": _4, \"gb\": _4, \"hu\": _4, \"jp\": _4, \"se\": _4, \"uk\": _4, \"in\": _4, \"clic2000\": _4, \"cloudaccess\": _4, \"cdn77-ssl\": _4, \"cdn77\": { \"$\": 0, \"succ\": { \"r\": _4 } }, \"cloudeity\": _4, \"feste-ip\": _4, \"knx-server\": _4, \"static-access\": _4, \"cryptonomic\": _7, \"dattolocal\": _4, \"mydatto\": _4, \"debian\": _4, \"bitbridge\": _4, \"at-band-camp\": _4, \"blogdns\": _4, \"broke-it\": _4, \"buyshouses\": _4, \"dnsalias\": _4, \"dnsdojo\": _4, \"does-it\": _4, \"dontexist\": _4, \"dynalias\": _4, \"dynathome\": _4, \"endofinternet\": _4, \"from-az\": _4, \"from-co\": _4, \"from-la\": _4, \"from-ny\": _4, \"gets-it\": _4, \"ham-radio-op\": _4, \"homeftp\": _4, \"homeip\": _4, \"homelinux\": _4, \"homeunix\": _4, \"in-the-band\": _4, \"is-a-chef\": _4, \"is-a-geek\": _4, \"isa-geek\": _4, \"kicks-ass\": _4, \"office-on-the\": _4, \"podzone\": _4, \"scrapper-site\": _4, \"selfip\": _4, \"sells-it\": _4, \"servebbs\": _4, \"serveftp\": _4, \"thruhere\": _4, \"webhop\": _4, \"definima\": _4, \"casacam\": _4, \"dynu\": _4, \"dynv6\": _4, \"twmail\": _4, \"ru\": _4, \"channelsdvr\": { \"$\": 2, \"succ\": { \"u\": _4 } }, \"fastlylb\": { \"$\": 2, \"succ\": { \"map\": _4 } }, \"fastly\": { \"$\": 0, \"succ\": { \"freetls\": _4, \"map\": _4, \"prod\": { \"$\": 0, \"succ\": { \"a\": _4, \"global\": _4 } }, \"ssl\": { \"$\": 0, \"succ\": { \"a\": _4, \"b\": _4, \"global\": _4 } } } }, \"edgeapp\": _4, \"flynnhosting\": _4, \"cloudfunctions\": _4, \"moonscale\": _4, \"in-dsl\": _4, \"in-vpn\": _4, \"ipifony\": _4, \"iobb\": _4, \"cloudjiffy\": _4, \"elastx\": { \"$\": 0, \"succ\": { \"jls-sto1\": _4 } }, \"saveincloud\": _27, \"kinghost\": _4, \"uni5\": _4, \"barsy\": _4, \"memset\": _4, \"azurewebsites\": _4, \"azure-mobile\": _4, \"cloudapp\": _4, \"dnsup\": _4, \"hicam\": _4, \"now-dns\": _4, \"ownip\": _4, \"vpndns\": _4, \"eating-organic\": _4, \"mydissent\": _4, \"myeffect\": _4, \"mymediapc\": _4, \"mypsx\": _4, \"mysecuritycamera\": _4, \"nhlfan\": _4, \"no-ip\": _4, \"pgafan\": _4, \"privatizehealthinsurance\": _4, \"bounceme\": _4, \"ddns\": _4, \"redirectme\": _4, \"serveblog\": _4, \"serveminecraft\": _4, \"sytes\": _4, \"cloudycluster\": _4, \"rackmaze\": _4, \"schokokeks\": _4, \"firewall-gateway\": _4, \"seidat\": _4, \"senseering\": _4, \"siteleaf\": _4, \"srcf\": { \"$\": 0, \"succ\": { \"soc\": _4, \"user\": _4 } }, \"dsmynas\": _4, \"familyds\": _4, \"community-pro\": _4, \"meinforum\": _4, \"yandexcloud\": { \"$\": 2, \"succ\": { \"storage\": _4, \"website\": _4 } }, \"za\": _4 } }, \"nf\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"per\": _2, \"rec\": _2, \"web\": _2, \"arts\": _2, \"firm\": _2, \"info\": _2, \"other\": _2, \"store\": _2 } }, \"ng\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"gov\": _2, \"i\": _2, \"mil\": _2, \"mobi\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"col\": _4, \"firm\": _4, \"gen\": _4, \"ltd\": _4, \"ngo\": _4 } }, \"ni\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"in\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"web\": _2 } }, \"nl\": { \"$\": 1, \"succ\": { \"amsw\": _4, \"virtueeldomein\": _4, \"co\": _4, \"hosting-cluster\": _4, \"blogspot\": _4, \"khplay\": _4, \"transurl\": _7, \"cistron\": _4, \"demon\": _4 } }, \"no\": { \"$\": 1, \"succ\": { \"fhs\": _2, \"vgs\": _2, \"fylkesbibl\": _2, \"folkebibl\": _2, \"museum\": _2, \"idrett\": _2, \"priv\": _2, \"mil\": _2, \"stat\": _2, \"dep\": _2, \"kommune\": _2, \"herad\": _2, \"aa\": _28, \"ah\": _28, \"bu\": _28, \"fm\": _28, \"hl\": _28, \"hm\": _28, \"jan-mayen\": _28, \"mr\": _28, \"nl\": _28, \"nt\": _28, \"of\": _28, \"ol\": _28, \"oslo\": _28, \"rl\": _28, \"sf\": _28, \"st\": _28, \"svalbard\": _28, \"tm\": _28, \"tr\": _28, \"va\": _28, \"vf\": _28, \"akrehamn\": _2, \"xn--krehamn-dxa\": _2, \"åkrehamn\": _2, \"algard\": _2, \"xn--lgrd-poac\": _2, \"ålgård\": _2, \"arna\": _2, \"brumunddal\": _2, \"bryne\": _2, \"bronnoysund\": _2, \"xn--brnnysund-m8ac\": _2, \"brønnøysund\": _2, \"drobak\": _2, \"xn--drbak-wua\": _2, \"drøbak\": _2, \"egersund\": _2, \"fetsund\": _2, \"floro\": _2, \"xn--flor-jra\": _2, \"florø\": _2, \"fredrikstad\": _2, \"hokksund\": _2, \"honefoss\": _2, \"xn--hnefoss-q1a\": _2, \"hønefoss\": _2, \"jessheim\": _2, \"jorpeland\": _2, \"xn--jrpeland-54a\": _2, \"jørpeland\": _2, \"kirkenes\": _2, \"kopervik\": _2, \"krokstadelva\": _2, \"langevag\": _2, \"xn--langevg-jxa\": _2, \"langevåg\": _2, \"leirvik\": _2, \"mjondalen\": _2, \"xn--mjndalen-64a\": _2, \"mjøndalen\": _2, \"mo-i-rana\": _2, \"mosjoen\": _2, \"xn--mosjen-eya\": _2, \"mosjøen\": _2, \"nesoddtangen\": _2, \"orkanger\": _2, \"osoyro\": _2, \"xn--osyro-wua\": _2, \"osøyro\": _2, \"raholt\": _2, \"xn--rholt-mra\": _2, \"råholt\": _2, \"sandnessjoen\": _2, \"xn--sandnessjen-ogb\": _2, \"sandnessjøen\": _2, \"skedsmokorset\": _2, \"slattum\": _2, \"spjelkavik\": _2, \"stathelle\": _2, \"stavern\": _2, \"stjordalshalsen\": _2, \"xn--stjrdalshalsen-sqb\": _2, \"stjørdalshalsen\": _2, \"tananger\": _2, \"tranby\": _2, \"vossevangen\": _2, \"afjord\": _2, \"xn--fjord-lra\": _2, \"åfjord\": _2, \"agdenes\": _2, \"al\": _2, \"xn--l-1fa\": _2, \"ål\": _2, \"alesund\": _2, \"xn--lesund-hua\": _2, \"ålesund\": _2, \"alstahaug\": _2, \"alta\": _2, \"xn--lt-liac\": _2, \"áltá\": _2, \"alaheadju\": _2, \"xn--laheadju-7ya\": _2, \"álaheadju\": _2, \"alvdal\": _2, \"amli\": _2, \"xn--mli-tla\": _2, \"åmli\": _2, \"amot\": _2, \"xn--mot-tla\": _2, \"åmot\": _2, \"andebu\": _2, \"andoy\": _2, \"xn--andy-ira\": _2, \"andøy\": _2, \"andasuolo\": _2, \"ardal\": _2, \"xn--rdal-poa\": _2, \"årdal\": _2, \"aremark\": _2, \"arendal\": _2, \"xn--s-1fa\": _2, \"ås\": _2, \"aseral\": _2, \"xn--seral-lra\": _2, \"åseral\": _2, \"asker\": _2, \"askim\": _2, \"askvoll\": _2, \"askoy\": _2, \"xn--asky-ira\": _2, \"askøy\": _2, \"asnes\": _2, \"xn--snes-poa\": _2, \"åsnes\": _2, \"audnedaln\": _2, \"aukra\": _2, \"aure\": _2, \"aurland\": _2, \"aurskog-holand\": _2, \"xn--aurskog-hland-jnb\": _2, \"aurskog-høland\": _2, \"austevoll\": _2, \"austrheim\": _2, \"averoy\": _2, \"xn--avery-yua\": _2, \"averøy\": _2, \"balestrand\": _2, \"ballangen\": _2, \"balat\": _2, \"xn--blt-elab\": _2, \"bálát\": _2, \"balsfjord\": _2, \"bahccavuotna\": _2, \"xn--bhccavuotna-k7a\": _2, \"báhccavuotna\": _2, \"bamble\": _2, \"bardu\": _2, \"beardu\": _2, \"beiarn\": _2, \"bajddar\": _2, \"xn--bjddar-pta\": _2, \"bájddar\": _2, \"baidar\": _2, \"xn--bidr-5nac\": _2, \"báidár\": _2, \"berg\": _2, \"bergen\": _2, \"berlevag\": _2, \"xn--berlevg-jxa\": _2, \"berlevåg\": _2, \"bearalvahki\": _2, \"xn--bearalvhki-y4a\": _2, \"bearalváhki\": _2, \"bindal\": _2, \"birkenes\": _2, \"bjarkoy\": _2, \"xn--bjarky-fya\": _2, \"bjarkøy\": _2, \"bjerkreim\": _2, \"bjugn\": _2, \"bodo\": _2, \"xn--bod-2na\": _2, \"bodø\": _2, \"badaddja\": _2, \"xn--bdddj-mrabd\": _2, \"bådåddjå\": _2, \"budejju\": _2, \"bokn\": _2, \"bremanger\": _2, \"bronnoy\": _2, \"xn--brnny-wuac\": _2, \"brønnøy\": _2, \"bygland\": _2, \"bykle\": _2, \"barum\": _2, \"xn--brum-voa\": _2, \"bærum\": _2, \"telemark\": { \"$\": 0, \"succ\": { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2 } }, \"nordland\": { \"$\": 0, \"succ\": { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2, \"heroy\": _2, \"xn--hery-ira\": _2, \"herøy\": _2 } }, \"bievat\": _2, \"xn--bievt-0qa\": _2, \"bievát\": _2, \"bomlo\": _2, \"xn--bmlo-gra\": _2, \"bømlo\": _2, \"batsfjord\": _2, \"xn--btsfjord-9za\": _2, \"båtsfjord\": _2, \"bahcavuotna\": _2, \"xn--bhcavuotna-s4a\": _2, \"báhcavuotna\": _2, \"dovre\": _2, \"drammen\": _2, \"drangedal\": _2, \"dyroy\": _2, \"xn--dyry-ira\": _2, \"dyrøy\": _2, \"donna\": _2, \"xn--dnna-gra\": _2, \"dønna\": _2, \"eid\": _2, \"eidfjord\": _2, \"eidsberg\": _2, \"eidskog\": _2, \"eidsvoll\": _2, \"eigersund\": _2, \"elverum\": _2, \"enebakk\": _2, \"engerdal\": _2, \"etne\": _2, \"etnedal\": _2, \"evenes\": _2, \"evenassi\": _2, \"xn--eveni-0qa01ga\": _2, \"evenášši\": _2, \"evje-og-hornnes\": _2, \"farsund\": _2, \"fauske\": _2, \"fuossko\": _2, \"fuoisku\": _2, \"fedje\": _2, \"fet\": _2, \"finnoy\": _2, \"xn--finny-yua\": _2, \"finnøy\": _2, \"fitjar\": _2, \"fjaler\": _2, \"fjell\": _2, \"flakstad\": _2, \"flatanger\": _2, \"flekkefjord\": _2, \"flesberg\": _2, \"flora\": _2, \"fla\": _2, \"xn--fl-zia\": _2, \"flå\": _2, \"folldal\": _2, \"forsand\": _2, \"fosnes\": _2, \"frei\": _2, \"frogn\": _2, \"froland\": _2, \"frosta\": _2, \"frana\": _2, \"xn--frna-woa\": _2, \"fræna\": _2, \"froya\": _2, \"xn--frya-hra\": _2, \"frøya\": _2, \"fusa\": _2, \"fyresdal\": _2, \"forde\": _2, \"xn--frde-gra\": _2, \"førde\": _2, \"gamvik\": _2, \"gangaviika\": _2, \"xn--ggaviika-8ya47h\": _2, \"gáŋgaviika\": _2, \"gaular\": _2, \"gausdal\": _2, \"gildeskal\": _2, \"xn--gildeskl-g0a\": _2, \"gildeskål\": _2, \"giske\": _2, \"gjemnes\": _2, \"gjerdrum\": _2, \"gjerstad\": _2, \"gjesdal\": _2, \"gjovik\": _2, \"xn--gjvik-wua\": _2, \"gjøvik\": _2, \"gloppen\": _2, \"gol\": _2, \"gran\": _2, \"grane\": _2, \"granvin\": _2, \"gratangen\": _2, \"grimstad\": _2, \"grong\": _2, \"kraanghke\": _2, \"xn--kranghke-b0a\": _2, \"kråanghke\": _2, \"grue\": _2, \"gulen\": _2, \"hadsel\": _2, \"halden\": _2, \"halsa\": _2, \"hamar\": _2, \"hamaroy\": _2, \"habmer\": _2, \"xn--hbmer-xqa\": _2, \"hábmer\": _2, \"hapmir\": _2, \"xn--hpmir-xqa\": _2, \"hápmir\": _2, \"hammerfest\": _2, \"hammarfeasta\": _2, \"xn--hmmrfeasta-s4ac\": _2, \"hámmárfeasta\": _2, \"haram\": _2, \"hareid\": _2, \"harstad\": _2, \"hasvik\": _2, \"aknoluokta\": _2, \"xn--koluokta-7ya57h\": _2, \"ákŋoluokta\": _2, \"hattfjelldal\": _2, \"aarborte\": _2, \"haugesund\": _2, \"hemne\": _2, \"hemnes\": _2, \"hemsedal\": _2, \"more-og-romsdal\": { \"$\": 0, \"succ\": { \"heroy\": _2, \"sande\": _2 } }, \"xn--mre-og-romsdal-qqb\": { \"$\": 0, \"succ\": { \"xn--hery-ira\": _2, \"sande\": _2 } }, \"møre-og-romsdal\": { \"$\": 0, \"succ\": { \"herøy\": _2, \"sande\": _2 } }, \"hitra\": _2, \"hjartdal\": _2, \"hjelmeland\": _2, \"hobol\": _2, \"xn--hobl-ira\": _2, \"hobøl\": _2, \"hof\": _2, \"hol\": _2, \"hole\": _2, \"holmestrand\": _2, \"holtalen\": _2, \"xn--holtlen-hxa\": _2, \"holtålen\": _2, \"hornindal\": _2, \"horten\": _2, \"hurdal\": _2, \"hurum\": _2, \"hvaler\": _2, \"hyllestad\": _2, \"hagebostad\": _2, \"xn--hgebostad-g3a\": _2, \"hægebostad\": _2, \"hoyanger\": _2, \"xn--hyanger-q1a\": _2, \"høyanger\": _2, \"hoylandet\": _2, \"xn--hylandet-54a\": _2, \"høylandet\": _2, \"ha\": _2, \"xn--h-2fa\": _2, \"hå\": _2, \"ibestad\": _2, \"inderoy\": _2, \"xn--indery-fya\": _2, \"inderøy\": _2, \"iveland\": _2, \"jevnaker\": _2, \"jondal\": _2, \"jolster\": _2, \"xn--jlster-bya\": _2, \"jølster\": _2, \"karasjok\": _2, \"karasjohka\": _2, \"xn--krjohka-hwab49j\": _2, \"kárášjohka\": _2, \"karlsoy\": _2, \"galsa\": _2, \"xn--gls-elac\": _2, \"gálsá\": _2, \"karmoy\": _2, \"xn--karmy-yua\": _2, \"karmøy\": _2, \"kautokeino\": _2, \"guovdageaidnu\": _2, \"klepp\": _2, \"klabu\": _2, \"xn--klbu-woa\": _2, \"klæbu\": _2, \"kongsberg\": _2, \"kongsvinger\": _2, \"kragero\": _2, \"xn--krager-gya\": _2, \"kragerø\": _2, \"kristiansand\": _2, \"kristiansund\": _2, \"krodsherad\": _2, \"xn--krdsherad-m8a\": _2, \"krødsherad\": _2, \"kvalsund\": _2, \"rahkkeravju\": _2, \"xn--rhkkervju-01af\": _2, \"ráhkkerávju\": _2, \"kvam\": _2, \"kvinesdal\": _2, \"kvinnherad\": _2, \"kviteseid\": _2, \"kvitsoy\": _2, \"xn--kvitsy-fya\": _2, \"kvitsøy\": _2, \"kvafjord\": _2, \"xn--kvfjord-nxa\": _2, \"kvæfjord\": _2, \"giehtavuoatna\": _2, \"kvanangen\": _2, \"xn--kvnangen-k0a\": _2, \"kvænangen\": _2, \"navuotna\": _2, \"xn--nvuotna-hwa\": _2, \"návuotna\": _2, \"kafjord\": _2, \"xn--kfjord-iua\": _2, \"kåfjord\": _2, \"gaivuotna\": _2, \"xn--givuotna-8ya\": _2, \"gáivuotna\": _2, \"larvik\": _2, \"lavangen\": _2, \"lavagis\": _2, \"loabat\": _2, \"xn--loabt-0qa\": _2, \"loabát\": _2, \"lebesby\": _2, \"davvesiida\": _2, \"leikanger\": _2, \"leirfjord\": _2, \"leka\": _2, \"leksvik\": _2, \"lenvik\": _2, \"leangaviika\": _2, \"xn--leagaviika-52b\": _2, \"leaŋgaviika\": _2, \"lesja\": _2, \"levanger\": _2, \"lier\": _2, \"lierne\": _2, \"lillehammer\": _2, \"lillesand\": _2, \"lindesnes\": _2, \"lindas\": _2, \"xn--linds-pra\": _2, \"lindås\": _2, \"lom\": _2, \"loppa\": _2, \"lahppi\": _2, \"xn--lhppi-xqa\": _2, \"láhppi\": _2, \"lund\": _2, \"lunner\": _2, \"luroy\": _2, \"xn--lury-ira\": _2, \"lurøy\": _2, \"luster\": _2, \"lyngdal\": _2, \"lyngen\": _2, \"ivgu\": _2, \"lardal\": _2, \"lerdal\": _2, \"xn--lrdal-sra\": _2, \"lærdal\": _2, \"lodingen\": _2, \"xn--ldingen-q1a\": _2, \"lødingen\": _2, \"lorenskog\": _2, \"xn--lrenskog-54a\": _2, \"lørenskog\": _2, \"loten\": _2, \"xn--lten-gra\": _2, \"løten\": _2, \"malvik\": _2, \"masoy\": _2, \"xn--msy-ula0h\": _2, \"måsøy\": _2, \"muosat\": _2, \"xn--muost-0qa\": _2, \"muosát\": _2, \"mandal\": _2, \"marker\": _2, \"marnardal\": _2, \"masfjorden\": _2, \"meland\": _2, \"meldal\": _2, \"melhus\": _2, \"meloy\": _2, \"xn--mely-ira\": _2, \"meløy\": _2, \"meraker\": _2, \"xn--merker-kua\": _2, \"meråker\": _2, \"moareke\": _2, \"xn--moreke-jua\": _2, \"moåreke\": _2, \"midsund\": _2, \"midtre-gauldal\": _2, \"modalen\": _2, \"modum\": _2, \"molde\": _2, \"moskenes\": _2, \"moss\": _2, \"mosvik\": _2, \"malselv\": _2, \"xn--mlselv-iua\": _2, \"målselv\": _2, \"malatvuopmi\": _2, \"xn--mlatvuopmi-s4a\": _2, \"málatvuopmi\": _2, \"namdalseid\": _2, \"aejrie\": _2, \"namsos\": _2, \"namsskogan\": _2, \"naamesjevuemie\": _2, \"xn--nmesjevuemie-tcba\": _2, \"nååmesjevuemie\": _2, \"laakesvuemie\": _2, \"nannestad\": _2, \"narvik\": _2, \"narviika\": _2, \"naustdal\": _2, \"nedre-eiker\": _2, \"akershus\": _29, \"buskerud\": _29, \"nesna\": _2, \"nesodden\": _2, \"nesseby\": _2, \"unjarga\": _2, \"xn--unjrga-rta\": _2, \"unjárga\": _2, \"nesset\": _2, \"nissedal\": _2, \"nittedal\": _2, \"nord-aurdal\": _2, \"nord-fron\": _2, \"nord-odal\": _2, \"norddal\": _2, \"nordkapp\": _2, \"davvenjarga\": _2, \"xn--davvenjrga-y4a\": _2, \"davvenjárga\": _2, \"nordre-land\": _2, \"nordreisa\": _2, \"raisa\": _2, \"xn--risa-5na\": _2, \"ráisa\": _2, \"nore-og-uvdal\": _2, \"notodden\": _2, \"naroy\": _2, \"xn--nry-yla5g\": _2, \"nærøy\": _2, \"notteroy\": _2, \"xn--nttery-byae\": _2, \"nøtterøy\": _2, \"odda\": _2, \"oksnes\": _2, \"xn--ksnes-uua\": _2, \"øksnes\": _2, \"oppdal\": _2, \"oppegard\": _2, \"xn--oppegrd-ixa\": _2, \"oppegård\": _2, \"orkdal\": _2, \"orland\": _2, \"xn--rland-uua\": _2, \"ørland\": _2, \"orskog\": _2, \"xn--rskog-uua\": _2, \"ørskog\": _2, \"orsta\": _2, \"xn--rsta-fra\": _2, \"ørsta\": _2, \"hedmark\": { \"$\": 0, \"succ\": { \"os\": _2, \"valer\": _2, \"xn--vler-qoa\": _2, \"våler\": _2 } }, \"hordaland\": { \"$\": 0, \"succ\": { \"os\": _2 } }, \"osen\": _2, \"osteroy\": _2, \"xn--ostery-fya\": _2, \"osterøy\": _2, \"ostre-toten\": _2, \"xn--stre-toten-zcb\": _2, \"østre-toten\": _2, \"overhalla\": _2, \"ovre-eiker\": _2, \"xn--vre-eiker-k8a\": _2, \"øvre-eiker\": _2, \"oyer\": _2, \"xn--yer-zna\": _2, \"øyer\": _2, \"oygarden\": _2, \"xn--ygarden-p1a\": _2, \"øygarden\": _2, \"oystre-slidre\": _2, \"xn--ystre-slidre-ujb\": _2, \"øystre-slidre\": _2, \"porsanger\": _2, \"porsangu\": _2, \"xn--porsgu-sta26f\": _2, \"porsáŋgu\": _2, \"porsgrunn\": _2, \"radoy\": _2, \"xn--rady-ira\": _2, \"radøy\": _2, \"rakkestad\": _2, \"rana\": _2, \"ruovat\": _2, \"randaberg\": _2, \"rauma\": _2, \"rendalen\": _2, \"rennebu\": _2, \"rennesoy\": _2, \"xn--rennesy-v1a\": _2, \"rennesøy\": _2, \"rindal\": _2, \"ringebu\": _2, \"ringerike\": _2, \"ringsaker\": _2, \"rissa\": _2, \"risor\": _2, \"xn--risr-ira\": _2, \"risør\": _2, \"roan\": _2, \"rollag\": _2, \"rygge\": _2, \"ralingen\": _2, \"xn--rlingen-mxa\": _2, \"rælingen\": _2, \"rodoy\": _2, \"xn--rdy-0nab\": _2, \"rødøy\": _2, \"romskog\": _2, \"xn--rmskog-bya\": _2, \"rømskog\": _2, \"roros\": _2, \"xn--rros-gra\": _2, \"røros\": _2, \"rost\": _2, \"xn--rst-0na\": _2, \"røst\": _2, \"royken\": _2, \"xn--ryken-vua\": _2, \"røyken\": _2, \"royrvik\": _2, \"xn--ryrvik-bya\": _2, \"røyrvik\": _2, \"rade\": _2, \"xn--rde-ula\": _2, \"råde\": _2, \"salangen\": _2, \"siellak\": _2, \"saltdal\": _2, \"salat\": _2, \"xn--slt-elab\": _2, \"sálát\": _2, \"xn--slat-5na\": _2, \"sálat\": _2, \"samnanger\": _2, \"vestfold\": { \"$\": 0, \"succ\": { \"sande\": _2 } }, \"sandefjord\": _2, \"sandnes\": _2, \"sandoy\": _2, \"xn--sandy-yua\": _2, \"sandøy\": _2, \"sarpsborg\": _2, \"sauda\": _2, \"sauherad\": _2, \"sel\": _2, \"selbu\": _2, \"selje\": _2, \"seljord\": _2, \"sigdal\": _2, \"siljan\": _2, \"sirdal\": _2, \"skaun\": _2, \"skedsmo\": _2, \"ski\": _2, \"skien\": _2, \"skiptvet\": _2, \"skjervoy\": _2, \"xn--skjervy-v1a\": _2, \"skjervøy\": _2, \"skierva\": _2, \"xn--skierv-uta\": _2, \"skiervá\": _2, \"skjak\": _2, \"xn--skjk-soa\": _2, \"skjåk\": _2, \"skodje\": _2, \"skanland\": _2, \"xn--sknland-fxa\": _2, \"skånland\": _2, \"skanit\": _2, \"xn--sknit-yqa\": _2, \"skánit\": _2, \"smola\": _2, \"xn--smla-hra\": _2, \"smøla\": _2, \"snillfjord\": _2, \"snasa\": _2, \"xn--snsa-roa\": _2, \"snåsa\": _2, \"snoasa\": _2, \"snaase\": _2, \"xn--snase-nra\": _2, \"snåase\": _2, \"sogndal\": _2, \"sokndal\": _2, \"sola\": _2, \"solund\": _2, \"songdalen\": _2, \"sortland\": _2, \"spydeberg\": _2, \"stange\": _2, \"stavanger\": _2, \"steigen\": _2, \"steinkjer\": _2, \"stjordal\": _2, \"xn--stjrdal-s1a\": _2, \"stjørdal\": _2, \"stokke\": _2, \"stor-elvdal\": _2, \"stord\": _2, \"stordal\": _2, \"storfjord\": _2, \"omasvuotna\": _2, \"strand\": _2, \"stranda\": _2, \"stryn\": _2, \"sula\": _2, \"suldal\": _2, \"sund\": _2, \"sunndal\": _2, \"surnadal\": _2, \"sveio\": _2, \"svelvik\": _2, \"sykkylven\": _2, \"sogne\": _2, \"xn--sgne-gra\": _2, \"søgne\": _2, \"somna\": _2, \"xn--smna-gra\": _2, \"sømna\": _2, \"sondre-land\": _2, \"xn--sndre-land-0cb\": _2, \"søndre-land\": _2, \"sor-aurdal\": _2, \"xn--sr-aurdal-l8a\": _2, \"sør-aurdal\": _2, \"sor-fron\": _2, \"xn--sr-fron-q1a\": _2, \"sør-fron\": _2, \"sor-odal\": _2, \"xn--sr-odal-q1a\": _2, \"sør-odal\": _2, \"sor-varanger\": _2, \"xn--sr-varanger-ggb\": _2, \"sør-varanger\": _2, \"matta-varjjat\": _2, \"xn--mtta-vrjjat-k7af\": _2, \"mátta-várjjat\": _2, \"sorfold\": _2, \"xn--srfold-bya\": _2, \"sørfold\": _2, \"sorreisa\": _2, \"xn--srreisa-q1a\": _2, \"sørreisa\": _2, \"sorum\": _2, \"xn--srum-gra\": _2, \"sørum\": _2, \"tana\": _2, \"deatnu\": _2, \"time\": _2, \"tingvoll\": _2, \"tinn\": _2, \"tjeldsund\": _2, \"dielddanuorri\": _2, \"tjome\": _2, \"xn--tjme-hra\": _2, \"tjøme\": _2, \"tokke\": _2, \"tolga\": _2, \"torsken\": _2, \"tranoy\": _2, \"xn--trany-yua\": _2, \"tranøy\": _2, \"tromso\": _2, \"xn--troms-zua\": _2, \"tromsø\": _2, \"tromsa\": _2, \"romsa\": _2, \"trondheim\": _2, \"troandin\": _2, \"trysil\": _2, \"trana\": _2, \"xn--trna-woa\": _2, \"træna\": _2, \"trogstad\": _2, \"xn--trgstad-r1a\": _2, \"trøgstad\": _2, \"tvedestrand\": _2, \"tydal\": _2, \"tynset\": _2, \"tysfjord\": _2, \"divtasvuodna\": _2, \"divttasvuotna\": _2, \"tysnes\": _2, \"tysvar\": _2, \"xn--tysvr-vra\": _2, \"tysvær\": _2, \"tonsberg\": _2, \"xn--tnsberg-q1a\": _2, \"tønsberg\": _2, \"ullensaker\": _2, \"ullensvang\": _2, \"ulvik\": _2, \"utsira\": _2, \"vadso\": _2, \"xn--vads-jra\": _2, \"vadsø\": _2, \"cahcesuolo\": _2, \"xn--hcesuolo-7ya35b\": _2, \"čáhcesuolo\": _2, \"vaksdal\": _2, \"valle\": _2, \"vang\": _2, \"vanylven\": _2, \"vardo\": _2, \"xn--vard-jra\": _2, \"vardø\": _2, \"varggat\": _2, \"xn--vrggt-xqad\": _2, \"várggát\": _2, \"vefsn\": _2, \"vaapste\": _2, \"vega\": _2, \"vegarshei\": _2, \"xn--vegrshei-c0a\": _2, \"vegårshei\": _2, \"vennesla\": _2, \"verdal\": _2, \"verran\": _2, \"vestby\": _2, \"vestnes\": _2, \"vestre-slidre\": _2, \"vestre-toten\": _2, \"vestvagoy\": _2, \"xn--vestvgy-ixa6o\": _2, \"vestvågøy\": _2, \"vevelstad\": _2, \"vik\": _2, \"vikna\": _2, \"vindafjord\": _2, \"volda\": _2, \"voss\": _2, \"varoy\": _2, \"xn--vry-yla5g\": _2, \"værøy\": _2, \"vagan\": _2, \"xn--vgan-qoa\": _2, \"vågan\": _2, \"voagat\": _2, \"vagsoy\": _2, \"xn--vgsy-qoa0j\": _2, \"vågsøy\": _2, \"vaga\": _2, \"xn--vg-yiab\": _2, \"vågå\": _2, \"ostfold\": { \"$\": 0, \"succ\": { \"valer\": _2 } }, \"xn--stfold-9xa\": { \"$\": 0, \"succ\": { \"xn--vler-qoa\": _2 } }, \"østfold\": { \"$\": 0, \"succ\": { \"våler\": _2 } }, \"co\": _4, \"blogspot\": _4 } }, \"np\": _8, \"nr\": _22, \"nu\": { \"$\": 1, \"succ\": { \"merseine\": _4, \"mine\": _4, \"shacknet\": _4, \"nom\": _4, \"uwu\": _4, \"enterprisecloud\": _4 } }, \"nz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _5, \"cri\": _2, \"geek\": _2, \"gen\": _2, \"govt\": _2, \"health\": _2, \"iwi\": _2, \"kiwi\": _2, \"maori\": _2, \"mil\": _2, \"xn--mori-qsa\": _2, \"māori\": _2, \"net\": _2, \"org\": _2, \"parliament\": _2, \"school\": _2, \"nym\": _4 } }, \"om\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"med\": _2, \"museum\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 } }, \"onion\": _2, \"org\": { \"$\": 1, \"succ\": { \"altervista\": _4, \"amune\": { \"$\": 0, \"succ\": { \"tele\": _4 } }, \"pimienta\": _4, \"poivron\": _4, \"potager\": _4, \"sweetpepper\": _4, \"ae\": _4, \"us\": _4, \"certmgr\": _4, \"cdn77\": { \"$\": 0, \"succ\": { \"c\": _4, \"rsc\": _4 } }, \"cdn77-secure\": { \"$\": 0, \"succ\": { \"origin\": { \"$\": 0, \"succ\": { \"ssl\": _4 } } } }, \"cloudns\": _4, \"duckdns\": _4, \"tunk\": _4, \"dyndns\": { \"$\": 2, \"succ\": { \"go\": _4, \"home\": _4 } }, \"blogdns\": _4, \"blogsite\": _4, \"boldlygoingnowhere\": _4, \"dnsalias\": _4, \"dnsdojo\": _4, \"doesntexist\": _4, \"dontexist\": _4, \"doomdns\": _4, \"dvrdns\": _4, \"dynalias\": _4, \"endofinternet\": _4, \"endoftheinternet\": _4, \"from-me\": _4, \"game-host\": _4, \"gotdns\": _4, \"hobby-site\": _4, \"homedns\": _4, \"homeftp\": _4, \"homelinux\": _4, \"homeunix\": _4, \"is-a-bruinsfan\": _4, \"is-a-candidate\": _4, \"is-a-celticsfan\": _4, \"is-a-chef\": _4, \"is-a-geek\": _4, \"is-a-knight\": _4, \"is-a-linux-user\": _4, \"is-a-patsfan\": _4, \"is-a-soxfan\": _4, \"is-found\": _4, \"is-lost\": _4, \"is-saved\": _4, \"is-very-bad\": _4, \"is-very-evil\": _4, \"is-very-good\": _4, \"is-very-nice\": _4, \"is-very-sweet\": _4, \"isa-geek\": _4, \"kicks-ass\": _4, \"misconfused\": _4, \"podzone\": _4, \"readmyblog\": _4, \"selfip\": _4, \"sellsyourhome\": _4, \"servebbs\": _4, \"serveftp\": _4, \"servegame\": _4, \"stuff-4-sale\": _4, \"webhop\": _4, \"ddnss\": _4, \"accesscam\": _4, \"camdvr\": _4, \"freeddns\": _4, \"mywire\": _4, \"webredirect\": _4, \"eu\": { \"$\": 2, \"succ\": { \"al\": _4, \"asso\": _4, \"at\": _4, \"au\": _4, \"be\": _4, \"bg\": _4, \"ca\": _4, \"cd\": _4, \"ch\": _4, \"cn\": _4, \"cy\": _4, \"cz\": _4, \"de\": _4, \"dk\": _4, \"edu\": _4, \"ee\": _4, \"es\": _4, \"fi\": _4, \"fr\": _4, \"gr\": _4, \"hr\": _4, \"hu\": _4, \"ie\": _4, \"il\": _4, \"in\": _4, \"int\": _4, \"is\": _4, \"it\": _4, \"jp\": _4, \"kr\": _4, \"lt\": _4, \"lu\": _4, \"lv\": _4, \"mc\": _4, \"me\": _4, \"mk\": _4, \"mt\": _4, \"my\": _4, \"net\": _4, \"ng\": _4, \"nl\": _4, \"no\": _4, \"nz\": _4, \"paris\": _4, \"pl\": _4, \"pt\": _4, \"q-a\": _4, \"ro\": _4, \"ru\": _4, \"se\": _4, \"si\": _4, \"sk\": _4, \"tr\": _4, \"uk\": _4, \"us\": _4 } }, \"twmail\": _4, \"fedorainfracloud\": _4, \"fedorapeople\": _4, \"fedoraproject\": { \"$\": 0, \"succ\": { \"cloud\": _4, \"os\": _16, \"stg\": { \"$\": 0, \"succ\": { \"os\": _16 } } } }, \"freedesktop\": _4, \"hepforge\": _4, \"in-dsl\": _4, \"in-vpn\": _4, \"js\": _4, \"uklugs\": _4, \"barsy\": _4, \"mayfirst\": _4, \"mozilla-iot\": _4, \"bmoattachments\": _4, \"dynserv\": _4, \"now-dns\": _4, \"cable-modem\": _4, \"collegefan\": _4, \"couchpotatofries\": _4, \"mlbfan\": _4, \"mysecuritycamera\": _4, \"nflfan\": _4, \"read-books\": _4, \"ufcfan\": _4, \"hopto\": _4, \"myftp\": _4, \"no-ip\": _4, \"zapto\": _4, \"pubtls\": _4, \"my-firewall\": _4, \"myfirewall\": _4, \"spdns\": _4, \"dsmynas\": _4, \"familyds\": _4, \"edugit\": _4, \"tuxfamily\": _4, \"diskstation\": _4, \"hk\": _4, \"wmflabs\": _4, \"toolforge\": _4, \"wmcloud\": _4, \"za\": _4 } }, \"pa\": { \"$\": 1, \"succ\": { \"ac\": _2, \"gob\": _2, \"com\": _2, \"org\": _2, \"sld\": _2, \"edu\": _2, \"net\": _2, \"ing\": _2, \"abo\": _2, \"med\": _2, \"nom\": _2 } }, \"pe\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gob\": _2, \"nom\": _2, \"mil\": _2, \"org\": _2, \"com\": _2, \"net\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"pf\": { \"$\": 1, \"succ\": { \"com\": _2, \"org\": _2, \"edu\": _2 } }, \"pg\": _8, \"ph\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"ngo\": _2, \"mil\": _2, \"i\": _2 } }, \"pk\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"edu\": _2, \"org\": _2, \"fam\": _2, \"biz\": _2, \"web\": _2, \"gov\": _2, \"gob\": _2, \"gok\": _2, \"gon\": _2, \"gop\": _2, \"gos\": _2, \"info\": _2 } }, \"pl\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"aid\": _2, \"agro\": _2, \"atm\": _2, \"auto\": _2, \"biz\": _2, \"edu\": _2, \"gmina\": _2, \"gsm\": _2, \"info\": _2, \"mail\": _2, \"miasta\": _2, \"media\": _2, \"mil\": _2, \"nieruchomosci\": _2, \"nom\": _2, \"pc\": _2, \"powiat\": _2, \"priv\": _2, \"realestate\": _2, \"rel\": _2, \"sex\": _2, \"shop\": _2, \"sklep\": _2, \"sos\": _2, \"szkola\": _2, \"targi\": _2, \"tm\": _2, \"tourism\": _2, \"travel\": _2, \"turystyka\": _2, \"gov\": { \"$\": 1, \"succ\": { \"ap\": _2, \"ic\": _2, \"is\": _2, \"us\": _2, \"kmpsp\": _2, \"kppsp\": _2, \"kwpsp\": _2, \"psp\": _2, \"wskr\": _2, \"kwp\": _2, \"mw\": _2, \"ug\": _2, \"um\": _2, \"umig\": _2, \"ugim\": _2, \"upow\": _2, \"uw\": _2, \"starostwo\": _2, \"pa\": _2, \"po\": _2, \"psse\": _2, \"pup\": _2, \"rzgw\": _2, \"sa\": _2, \"so\": _2, \"sr\": _2, \"wsa\": _2, \"sko\": _2, \"uzs\": _2, \"wiih\": _2, \"winb\": _2, \"pinb\": _2, \"wios\": _2, \"witd\": _2, \"wzmiuw\": _2, \"piw\": _2, \"wiw\": _2, \"griw\": _2, \"wif\": _2, \"oum\": _2, \"sdn\": _2, \"zp\": _2, \"uppo\": _2, \"mup\": _2, \"wuoz\": _2, \"konsulat\": _2, \"oirm\": _2 } }, \"augustow\": _2, \"babia-gora\": _2, \"bedzin\": _2, \"beskidy\": _2, \"bialowieza\": _2, \"bialystok\": _2, \"bielawa\": _2, \"bieszczady\": _2, \"boleslawiec\": _2, \"bydgoszcz\": _2, \"bytom\": _2, \"cieszyn\": _2, \"czeladz\": _2, \"czest\": _2, \"dlugoleka\": _2, \"elblag\": _2, \"elk\": _2, \"glogow\": _2, \"gniezno\": _2, \"gorlice\": _2, \"grajewo\": _2, \"ilawa\": _2, \"jaworzno\": _2, \"jelenia-gora\": _2, \"jgora\": _2, \"kalisz\": _2, \"kazimierz-dolny\": _2, \"karpacz\": _2, \"kartuzy\": _2, \"kaszuby\": _2, \"katowice\": _2, \"kepno\": _2, \"ketrzyn\": _2, \"klodzko\": _2, \"kobierzyce\": _2, \"kolobrzeg\": _2, \"konin\": _2, \"konskowola\": _2, \"kutno\": _2, \"lapy\": _2, \"lebork\": _2, \"legnica\": _2, \"lezajsk\": _2, \"limanowa\": _2, \"lomza\": _2, \"lowicz\": _2, \"lubin\": _2, \"lukow\": _2, \"malbork\": _2, \"malopolska\": _2, \"mazowsze\": _2, \"mazury\": _2, \"mielec\": _2, \"mielno\": _2, \"mragowo\": _2, \"naklo\": _2, \"nowaruda\": _2, \"nysa\": _2, \"olawa\": _2, \"olecko\": _2, \"olkusz\": _2, \"olsztyn\": _2, \"opoczno\": _2, \"opole\": _2, \"ostroda\": _2, \"ostroleka\": _2, \"ostrowiec\": _2, \"ostrowwlkp\": _2, \"pila\": _2, \"pisz\": _2, \"podhale\": _2, \"podlasie\": _2, \"polkowice\": _2, \"pomorze\": _2, \"pomorskie\": _2, \"prochowice\": _2, \"pruszkow\": _2, \"przeworsk\": _2, \"pulawy\": _2, \"radom\": _2, \"rawa-maz\": _2, \"rybnik\": _2, \"rzeszow\": _2, \"sanok\": _2, \"sejny\": _2, \"slask\": _2, \"slupsk\": _2, \"sosnowiec\": _2, \"stalowa-wola\": _2, \"skoczow\": _2, \"starachowice\": _2, \"stargard\": _2, \"suwalki\": _2, \"swidnica\": _2, \"swiebodzin\": _2, \"swinoujscie\": _2, \"szczecin\": _2, \"szczytno\": _2, \"tarnobrzeg\": _2, \"tgory\": _2, \"turek\": _2, \"tychy\": _2, \"ustka\": _2, \"walbrzych\": _2, \"warmia\": _2, \"warszawa\": _2, \"waw\": _2, \"wegrow\": _2, \"wielun\": _2, \"wlocl\": _2, \"wloclawek\": _2, \"wodzislaw\": _2, \"wolomin\": _2, \"wroclaw\": _2, \"zachpomor\": _2, \"zagan\": _2, \"zarow\": _2, \"zgora\": _2, \"zgorzelec\": _2, \"beep\": _4, \"krasnik\": _4, \"leczna\": _4, \"lubartow\": _4, \"lublin\": _4, \"poniatowa\": _4, \"swidnik\": _4, \"co\": _4, \"art\": _4, \"gliwice\": _4, \"krakow\": _4, \"poznan\": _4, \"wroc\": _4, \"zakopane\": _4, \"gda\": _4, \"gdansk\": _4, \"gdynia\": _4, \"med\": _4, \"sopot\": _4 } }, \"pm\": { \"$\": 1, \"succ\": { \"own\": _4 } }, \"pn\": { \"$\": 1, \"succ\": { \"gov\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"net\": _2 } }, \"post\": _2, \"pr\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"isla\": _2, \"pro\": _2, \"biz\": _2, \"info\": _2, \"name\": _2, \"est\": _2, \"prof\": _2, \"ac\": _2 } }, \"pro\": { \"$\": 1, \"succ\": { \"aaa\": _2, \"aca\": _2, \"acct\": _2, \"avocat\": _2, \"bar\": _2, \"cpa\": _2, \"eng\": _2, \"jur\": _2, \"law\": _2, \"med\": _2, \"recht\": _2, \"cloudns\": _4, \"dnstrace\": { \"$\": 0, \"succ\": { \"bci\": _4 } }, \"barsy\": _4 } }, \"ps\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"sec\": _2, \"plo\": _2, \"com\": _2, \"org\": _2, \"net\": _2 } }, \"pt\": { \"$\": 1, \"succ\": { \"net\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"int\": _2, \"publ\": _2, \"com\": _2, \"nome\": _2, \"blogspot\": _4, \"nym\": _4 } }, \"pw\": { \"$\": 1, \"succ\": { \"co\": _2, \"ne\": _2, \"or\": _2, \"ed\": _2, \"go\": _2, \"belau\": _2, \"cloudns\": _4, \"x443\": _4, \"nom\": _4 } }, \"py\": { \"$\": 1, \"succ\": { \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"qa\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"re\": { \"$\": 1, \"succ\": { \"asso\": _2, \"com\": _2, \"nom\": _2, \"blogspot\": _4 } }, \"ro\": { \"$\": 1, \"succ\": { \"arts\": _2, \"com\": _2, \"firm\": _2, \"info\": _2, \"nom\": _2, \"nt\": _2, \"org\": _2, \"rec\": _2, \"store\": _2, \"tm\": _2, \"www\": _2, \"shop\": _4, \"blogspot\": _4, \"nym\": _4 } }, \"rs\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"org\": _2, \"blogspot\": _4, \"ua\": _4, \"nom\": _4, \"ox\": _4 } }, \"ru\": { \"$\": 1, \"succ\": { \"ac\": _4, \"edu\": _4, \"gov\": _4, \"int\": _4, \"mil\": _4, \"test\": _4, \"adygeya\": _4, \"bashkiria\": _4, \"bir\": _4, \"cbg\": _4, \"com\": _4, \"dagestan\": _4, \"grozny\": _4, \"kalmykia\": _4, \"kustanai\": _4, \"marine\": _4, \"mordovia\": _4, \"msk\": _4, \"mytis\": _4, \"nalchik\": _4, \"nov\": _4, \"pyatigorsk\": _4, \"spb\": _4, \"vladikavkaz\": _4, \"vladimir\": _4, \"blogspot\": _4, \"regruhosting\": _27, \"myjino\": { \"$\": 2, \"succ\": { \"hosting\": _7, \"landing\": _7, \"spectrum\": _7, \"vps\": _7 } }, \"cldmail\": { \"$\": 0, \"succ\": { \"hb\": _4 } }, \"net\": _4, \"org\": _4, \"pp\": _4, \"ras\": _4 } }, \"rw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"coop\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 } }, \"sa\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"med\": _2, \"pub\": _2, \"edu\": _2, \"sch\": _2 } }, \"sb\": _9, \"sc\": _9, \"sd\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"med\": _2, \"tv\": _2, \"gov\": _2, \"info\": _2 } }, \"se\": { \"$\": 1, \"succ\": { \"a\": _2, \"ac\": _2, \"b\": _2, \"bd\": _2, \"brand\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"fh\": _2, \"fhsk\": _2, \"fhv\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"k\": _2, \"komforb\": _2, \"kommunalforbund\": _2, \"komvux\": _2, \"l\": _2, \"lanbib\": _2, \"m\": _2, \"n\": _2, \"naturbruksgymn\": _2, \"o\": _2, \"org\": _2, \"p\": _2, \"parti\": _2, \"pp\": _2, \"press\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"tm\": _2, \"u\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"com\": _4, \"blogspot\": _4, \"conf\": _4 } }, \"sg\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"per\": _2, \"blogspot\": _4 } }, \"sh\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"hashbang\": _4, \"platform\": { \"$\": 0, \"succ\": { \"bc\": _4, \"ent\": _4, \"eu\": _4, \"us\": _4 } }, \"now\": _4, \"vxl\": _4, \"wedeploy\": _4 } }, \"si\": { \"$\": 1, \"succ\": { \"gitpage\": _4, \"blogspot\": _4, \"nom\": _4 } }, \"sj\": _2, \"sk\": _23, \"sl\": _9, \"sm\": _2, \"sn\": { \"$\": 1, \"succ\": { \"art\": _2, \"com\": _2, \"edu\": _2, \"gouv\": _2, \"org\": _2, \"perso\": _2, \"univ\": _2, \"blogspot\": _4 } }, \"so\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"me\": _2, \"net\": _2, \"org\": _2, \"sch\": _4 } }, \"sr\": _2, \"ss\": { \"$\": 1, \"succ\": { \"biz\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2 } }, \"st\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"consulado\": _2, \"edu\": _2, \"embaixada\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"principe\": _2, \"saotome\": _2, \"store\": _2, \"nom\": _4, \"noho\": _4 } }, \"su\": { \"$\": 1, \"succ\": { \"abkhazia\": _4, \"adygeya\": _4, \"aktyubinsk\": _4, \"arkhangelsk\": _4, \"armenia\": _4, \"ashgabad\": _4, \"azerbaijan\": _4, \"balashov\": _4, \"bashkiria\": _4, \"bryansk\": _4, \"bukhara\": _4, \"chimkent\": _4, \"dagestan\": _4, \"east-kazakhstan\": _4, \"exnet\": _4, \"georgia\": _4, \"grozny\": _4, \"ivanovo\": _4, \"jambyl\": _4, \"kalmykia\": _4, \"kaluga\": _4, \"karacol\": _4, \"karaganda\": _4, \"karelia\": _4, \"khakassia\": _4, \"krasnodar\": _4, \"kurgan\": _4, \"kustanai\": _4, \"lenug\": _4, \"mangyshlak\": _4, \"mordovia\": _4, \"msk\": _4, \"murmansk\": _4, \"nalchik\": _4, \"navoi\": _4, \"north-kazakhstan\": _4, \"nov\": _4, \"obninsk\": _4, \"penza\": _4, \"pokrovsk\": _4, \"sochi\": _4, \"spb\": _4, \"tashkent\": _4, \"termez\": _4, \"togliatti\": _4, \"troitsk\": _4, \"tselinograd\": _4, \"tula\": _4, \"tuva\": _4, \"vladikavkaz\": _4, \"vladimir\": _4, \"vologda\": _4, \"nym\": _4 } }, \"sv\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gob\": _2, \"org\": _2, \"red\": _2 } }, \"sx\": { \"$\": 1, \"succ\": { \"gov\": _2, \"nym\": _4 } }, \"sy\": _3, \"sz\": { \"$\": 1, \"succ\": { \"co\": _2, \"ac\": _2, \"org\": _2 } }, \"tc\": { \"$\": 1, \"succ\": { \"ch\": _4, \"me\": _4, \"we\": _4 } }, \"td\": _5, \"tel\": _2, \"tf\": _2, \"tg\": _2, \"th\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"go\": _2, \"in\": _2, \"mi\": _2, \"net\": _2, \"or\": _2, \"online\": _4, \"shop\": _4 } }, \"tj\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"go\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"nic\": _2, \"org\": _2, \"test\": _2, \"web\": _2, \"nom\": _4 } }, \"tk\": _2, \"tl\": _6, \"tm\": { \"$\": 1, \"succ\": { \"com\": _2, \"co\": _2, \"org\": _2, \"net\": _2, \"nom\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2 } }, \"tn\": { \"$\": 1, \"succ\": { \"com\": _2, \"ens\": _2, \"fin\": _2, \"gov\": _2, \"ind\": _2, \"intl\": _2, \"nat\": _2, \"net\": _2, \"org\": _2, \"info\": _2, \"perso\": _2, \"tourism\": _2, \"edunet\": _2, \"rnrt\": _2, \"rns\": _2, \"rnu\": _2, \"mincom\": _2, \"agrinet\": _2, \"defense\": _2, \"turen\": _2 } }, \"to\": { \"$\": 1, \"succ\": { \"611\": _4, \"com\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"mil\": _2, \"oya\": _4, \"vpnplus\": _4, \"quickconnect\": { \"$\": 0, \"succ\": { \"direct\": _4 } }, \"nyan\": _4 } }, \"tr\": { \"$\": 1, \"succ\": { \"av\": _2, \"bbs\": _2, \"bel\": _2, \"biz\": _2, \"com\": _5, \"dr\": _2, \"edu\": _2, \"gen\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"k12\": _2, \"kep\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pol\": _2, \"tel\": _2, \"tsk\": _2, \"tv\": _2, \"web\": _2, \"nc\": _6 } }, \"tt\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"biz\": _2, \"info\": _2, \"pro\": _2, \"int\": _2, \"coop\": _2, \"jobs\": _2, \"mobi\": _2, \"travel\": _2, \"museum\": _2, \"aero\": _2, \"name\": _2, \"gov\": _2, \"edu\": _2 } }, \"tv\": { \"$\": 1, \"succ\": { \"dyndns\": _4, \"better-than\": _4, \"on-the-web\": _4, \"worse-than\": _4 } }, \"tw\": { \"$\": 1, \"succ\": { \"edu\": _2, \"gov\": _2, \"mil\": _2, \"com\": { \"$\": 1, \"succ\": { \"mymailer\": _4 } }, \"net\": _2, \"org\": _2, \"idv\": _2, \"game\": _2, \"ebiz\": _2, \"club\": _2, \"xn--zf0ao64a\": _2, \"網路\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--czrw28b\": _2, \"商業\": _2, \"url\": _4, \"blogspot\": _4, \"nym\": _4 } }, \"tz\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"go\": _2, \"hotel\": _2, \"info\": _2, \"me\": _2, \"mil\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2, \"tv\": _2 } }, \"ua\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"net\": _2, \"org\": _2, \"cherkassy\": _2, \"cherkasy\": _2, \"chernigov\": _2, \"chernihiv\": _2, \"chernivtsi\": _2, \"chernovtsy\": _2, \"ck\": _2, \"cn\": _2, \"cr\": _2, \"crimea\": _2, \"cv\": _2, \"dn\": _2, \"dnepropetrovsk\": _2, \"dnipropetrovsk\": _2, \"donetsk\": _2, \"dp\": _2, \"if\": _2, \"ivano-frankivsk\": _2, \"kh\": _2, \"kharkiv\": _2, \"kharkov\": _2, \"kherson\": _2, \"khmelnitskiy\": _2, \"khmelnytskyi\": _2, \"kiev\": _2, \"kirovograd\": _2, \"km\": _2, \"kr\": _2, \"krym\": _2, \"ks\": _2, \"kv\": _2, \"kyiv\": _2, \"lg\": _2, \"lt\": _2, \"lugansk\": _2, \"lutsk\": _2, \"lv\": _2, \"lviv\": _2, \"mk\": _2, \"mykolaiv\": _2, \"nikolaev\": _2, \"od\": _2, \"odesa\": _2, \"odessa\": _2, \"pl\": _2, \"poltava\": _2, \"rivne\": _2, \"rovno\": _2, \"rv\": _2, \"sb\": _2, \"sebastopol\": _2, \"sevastopol\": _2, \"sm\": _2, \"sumy\": _2, \"te\": _2, \"ternopil\": _2, \"uz\": _2, \"uzhgorod\": _2, \"vinnica\": _2, \"vinnytsia\": _2, \"vn\": _2, \"volyn\": _2, \"yalta\": _2, \"zaporizhzhe\": _2, \"zaporizhzhia\": _2, \"zhitomir\": _2, \"zhytomyr\": _2, \"zp\": _2, \"zt\": _2, \"cc\": _4, \"inf\": _4, \"ltd\": _4, \"biz\": _4, \"co\": _4, \"pp\": _4, \"v\": _4 } }, \"ug\": { \"$\": 1, \"succ\": { \"co\": _2, \"or\": _2, \"ac\": _2, \"sc\": _2, \"go\": _2, \"ne\": _2, \"com\": _2, \"org\": _2, \"blogspot\": _4, \"nom\": _4 } }, \"uk\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": { \"$\": 1, \"succ\": { \"bytemark\": { \"$\": 0, \"succ\": { \"dh\": _4, \"vm\": _4 } }, \"blogspot\": _4, \"layershift\": _17, \"barsy\": _4, \"barsyonline\": _4, \"nh-serv\": _4, \"no-ip\": _4, \"wellbeingzone\": _4, \"gwiddle\": _4 } }, \"gov\": { \"$\": 1, \"succ\": { \"service\": _4, \"homeoffice\": _4 } }, \"ltd\": _2, \"me\": _2, \"net\": _2, \"nhs\": _2, \"org\": { \"$\": 1, \"succ\": { \"glug\": _4, \"lug\": _4, \"lugs\": _4 } }, \"plc\": _2, \"police\": _2, \"sch\": _8, \"conn\": _4, \"copro\": _4, \"barsy\": _4 } }, \"us\": { \"$\": 1, \"succ\": { \"dni\": _2, \"fed\": _2, \"isa\": _2, \"kids\": _2, \"nsn\": _2, \"ak\": _30, \"al\": _30, \"ar\": _30, \"as\": _30, \"az\": _30, \"ca\": _30, \"co\": _30, \"ct\": _30, \"dc\": _30, \"de\": { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _4 } }, \"fl\": _30, \"ga\": _30, \"gu\": _30, \"hi\": _31, \"ia\": _30, \"id\": _30, \"il\": _30, \"in\": _30, \"ks\": _30, \"ky\": _30, \"la\": _30, \"ma\": { \"$\": 1, \"succ\": { \"k12\": { \"$\": 1, \"succ\": { \"pvt\": _2, \"chtr\": _2, \"paroch\": _2 } }, \"cc\": _2, \"lib\": _2 } }, \"md\": _30, \"me\": _30, \"mi\": { \"$\": 1, \"succ\": { \"k12\": _2, \"cc\": _2, \"lib\": _2, \"ann-arbor\": _2, \"cog\": _2, \"dst\": _2, \"eaton\": _2, \"gen\": _2, \"mus\": _2, \"tec\": _2, \"washtenaw\": _2 } }, \"mn\": _30, \"mo\": _30, \"ms\": _30, \"mt\": _30, \"nc\": _30, \"nd\": _31, \"ne\": _30, \"nh\": _30, \"nj\": _30, \"nm\": _30, \"nv\": _30, \"ny\": _30, \"oh\": _30, \"ok\": _30, \"or\": _30, \"pa\": _30, \"pr\": _30, \"ri\": _31, \"sc\": _30, \"sd\": _31, \"tn\": _30, \"tx\": _30, \"ut\": _30, \"vi\": _30, \"vt\": _30, \"va\": _30, \"wa\": _30, \"wi\": _30, \"wv\": { \"$\": 1, \"succ\": { \"cc\": _2 } }, \"wy\": _30, \"cloudns\": _4, \"drud\": _4, \"is-by\": _4, \"land-4-sale\": _4, \"stuff-4-sale\": _4, \"graphox\": _4, \"freeddns\": _4, \"golffan\": _4, \"noip\": _4, \"pointto\": _4, \"platterp\": _4 } }, \"uy\": { \"$\": 1, \"succ\": { \"com\": _5, \"edu\": _2, \"gub\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"nom\": _4 } }, \"uz\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"net\": _2, \"org\": _2 } }, \"va\": _2, \"vc\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2, \"gv\": { \"$\": 2, \"succ\": { \"d\": _4 } }, \"0e\": _4, \"nom\": _4 } }, \"ve\": { \"$\": 1, \"succ\": { \"arts\": _2, \"co\": _2, \"com\": _2, \"e12\": _2, \"edu\": _2, \"firm\": _2, \"gob\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"rec\": _2, \"store\": _2, \"tec\": _2, \"web\": _2 } }, \"vg\": { \"$\": 1, \"succ\": { \"nom\": _4, \"at\": _4 } }, \"vi\": { \"$\": 1, \"succ\": { \"co\": _2, \"com\": _2, \"k12\": _2, \"net\": _2, \"org\": _2 } }, \"vn\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"int\": _2, \"ac\": _2, \"biz\": _2, \"info\": _2, \"name\": _2, \"pro\": _2, \"health\": _2, \"blogspot\": _4 } }, \"vu\": { \"$\": 1, \"succ\": { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"blog\": _4, \"dev\": _4, \"me\": _4, \"cn\": _4 } }, \"wf\": _2, \"ws\": { \"$\": 1, \"succ\": { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"advisor\": _7, \"cloud66\": _4, \"dyndns\": _4, \"mypets\": _4 } }, \"yt\": _2, \"xn--mgbaam7a8h\": _2, \"امارات\": _2, \"xn--y9a3aq\": _2, \"հայ\": _2, \"xn--54b7fta0cc\": _2, \"বাংলা\": _2, \"xn--90ae\": _2, \"бг\": _2, \"xn--90ais\": _2, \"бел\": _2, \"xn--fiqs8s\": _2, \"中国\": _2, \"xn--fiqz9s\": _2, \"中國\": _2, \"xn--lgbbat1ad8j\": _2, \"الجزائر\": _2, \"xn--wgbh1c\": _2, \"مصر\": _2, \"xn--e1a4c\": _2, \"ею\": _2, \"xn--qxa6a\": _2, \"ευ\": _2, \"xn--mgbah1a3hjkrd\": _2, \"موريتانيا\": _2, \"xn--node\": _2, \"გე\": _2, \"xn--qxam\": _2, \"ελ\": _2, \"xn--j6w193g\": { \"$\": 1, \"succ\": { \"xn--55qx5d\": _2, \"xn--wcvs22d\": _2, \"xn--mxtq1m\": _2, \"xn--gmqw5a\": _2, \"xn--od0alg\": _2, \"xn--uc0atv\": _2 } }, \"香港\": { \"$\": 1, \"succ\": { \"公司\": _2, \"教育\": _2, \"政府\": _2, \"個人\": _2, \"網絡\": _2, \"組織\": _2 } }, \"xn--2scrj9c\": _2, \"ಭಾರತ\": _2, \"xn--3hcrj9c\": _2, \"ଭାରତ\": _2, \"xn--45br5cyl\": _2, \"ভাৰত\": _2, \"xn--h2breg3eve\": _2, \"भारतम्\": _2, \"xn--h2brj9c8c\": _2, \"भारोत\": _2, \"xn--mgbgu82a\": _2, \"ڀارت\": _2, \"xn--rvc1e0am3e\": _2, \"ഭാരതം\": _2, \"xn--h2brj9c\": _2, \"भारत\": _2, \"xn--mgbbh1a\": _2, \"بارت\": _2, \"xn--mgbbh1a71e\": _2, \"بھارت\": _2, \"xn--fpcrj9c3d\": _2, \"భారత్\": _2, \"xn--gecrj9c\": _2, \"ભારત\": _2, \"xn--s9brj9c\": _2, \"ਭਾਰਤ\": _2, \"xn--45brj9c\": _2, \"ভারত\": _2, \"xn--xkc2dl3a5ee0h\": _2, \"இந்தியா\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2, \"xn--mgbtx2b\": _2, \"عراق\": _2, \"xn--mgbayh7gpa\": _2, \"الاردن\": _2, \"xn--3e0b707e\": _2, \"한국\": _2, \"xn--80ao21a\": _2, \"қаз\": _2, \"xn--fzc2c9e2c\": _2, \"ලංකා\": _2, \"xn--xkc2al3hye2a\": _2, \"இலங்கை\": _2, \"xn--mgbc0a9azcg\": _2, \"المغرب\": _2, \"xn--d1alf\": _2, \"мкд\": _2, \"xn--l1acc\": _2, \"мон\": _2, \"xn--mix891f\": _2, \"澳門\": _2, \"xn--mix082f\": _2, \"澳门\": _2, \"xn--mgbx4cd0ab\": _2, \"مليسيا\": _2, \"xn--mgb9awbf\": _2, \"عمان\": _2, \"xn--mgbai9azgqp6j\": _2, \"پاکستان\": _2, \"xn--mgbai9a5eva00b\": _2, \"پاكستان\": _2, \"xn--ygbi2ammx\": _2, \"فلسطين\": _2, \"xn--90a3ac\": { \"$\": 1, \"succ\": { \"xn--o1ac\": _2, \"xn--c1avg\": _2, \"xn--90azh\": _2, \"xn--d1at\": _2, \"xn--o1ach\": _2, \"xn--80au\": _2 } }, \"срб\": { \"$\": 1, \"succ\": { \"пр\": _2, \"орг\": _2, \"обр\": _2, \"од\": _2, \"упр\": _2, \"ак\": _2 } }, \"xn--p1ai\": _2, \"рф\": _2, \"xn--wgbl6a\": _2, \"قطر\": _2, \"xn--mgberp4a5d4ar\": _2, \"السعودية\": _2, \"xn--mgberp4a5d4a87g\": _2, \"السعودیة\": _2, \"xn--mgbqly7c0a67fbc\": _2, \"السعودیۃ\": _2, \"xn--mgbqly7cvafr\": _2, \"السعوديه\": _2, \"xn--mgbpl2fh\": _2, \"سودان\": _2, \"xn--yfro4i67o\": _2, \"新加坡\": _2, \"xn--clchc0ea0b2g2a9gcd\": _2, \"சிங்கப்பூர்\": _2, \"xn--ogbpf8fl\": _2, \"سورية\": _2, \"xn--mgbtf8fl\": _2, \"سوريا\": _2, \"xn--o3cw4h\": { \"$\": 1, \"succ\": { \"xn--12c1fe0br\": _2, \"xn--12co0c3b4eva\": _2, \"xn--h3cuzk1di\": _2, \"xn--o3cyx2a\": _2, \"xn--m3ch0j3a\": _2, \"xn--12cfi8ixb8l\": _2 } }, \"ไทย\": { \"$\": 1, \"succ\": { \"ศึกษา\": _2, \"ธุรกิจ\": _2, \"รัฐบาล\": _2, \"ทหาร\": _2, \"เน็ต\": _2, \"องค์กร\": _2 } }, \"xn--pgbs0dh\": _2, \"تونس\": _2, \"xn--kpry57d\": _2, \"台灣\": _2, \"xn--kprw13d\": _2, \"台湾\": _2, \"xn--nnx388a\": _2, \"臺灣\": _2, \"xn--j1amh\": _2, \"укр\": _2, \"xn--mgb2ddes\": _2, \"اليمن\": _2, \"xxx\": _2, \"ye\": _8, \"za\": { \"$\": 0, \"succ\": { \"ac\": _2, \"agric\": _2, \"alt\": _2, \"co\": _5, \"edu\": _2, \"gov\": _2, \"grondar\": _2, \"law\": _2, \"mil\": _2, \"net\": _2, \"ngo\": _2, \"nic\": _2, \"nis\": _2, \"nom\": _2, \"org\": _2, \"school\": _2, \"tm\": _2, \"web\": _2 } }, \"zm\": { \"$\": 1, \"succ\": { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sch\": _2 } }, \"zw\": { \"$\": 1, \"succ\": { \"ac\": _2, \"co\": _2, \"gov\": _2, \"mil\": _2, \"org\": _2 } }, \"aaa\": _2, \"aarp\": _2, \"abarth\": _2, \"abb\": _2, \"abbott\": _2, \"abbvie\": _2, \"abc\": _2, \"able\": _2, \"abogado\": _2, \"abudhabi\": _2, \"academy\": { \"$\": 1, \"succ\": { \"official\": _4 } }, \"accenture\": _2, \"accountant\": _2, \"accountants\": _2, \"aco\": _2, \"actor\": _2, \"adac\": _2, \"ads\": _2, \"adult\": _2, \"aeg\": _2, \"aetna\": _2, \"afamilycompany\": _2, \"afl\": _2, \"africa\": _2, \"agakhan\": _2, \"agency\": _2, \"aig\": _2, \"airbus\": _2, \"airforce\": _2, \"airtel\": _2, \"akdn\": _2, \"alfaromeo\": _2, \"alibaba\": _2, \"alipay\": _2, \"allfinanz\": _2, \"allstate\": _2, \"ally\": _2, \"alsace\": _2, \"alstom\": _2, \"amazon\": _2, \"americanexpress\": _2, \"americanfamily\": _2, \"amex\": _2, \"amfam\": _2, \"amica\": _2, \"amsterdam\": _2, \"analytics\": _2, \"android\": _2, \"anquan\": _2, \"anz\": _2, \"aol\": _2, \"apartments\": _2, \"app\": { \"$\": 1, \"succ\": { \"wnext\": _4, \"run\": { \"$\": 2, \"succ\": { \"a\": _4 } }, \"web\": _4, \"hasura\": _4, \"loginline\": _4, \"netlify\": _4, \"telebit\": _4, \"vercel\": _4 } }, \"apple\": _2, \"aquarelle\": _2, \"arab\": _2, \"aramco\": _2, \"archi\": _2, \"army\": _2, \"art\": _2, \"arte\": _2, \"asda\": _2, \"associates\": _2, \"athleta\": _2, \"attorney\": _2, \"auction\": _2, \"audi\": _2, \"audible\": _2, \"audio\": _2, \"auspost\": _2, \"author\": _2, \"auto\": _2, \"autos\": _2, \"avianca\": _2, \"aws\": _2, \"axa\": _2, \"azure\": _2, \"baby\": _2, \"baidu\": _2, \"banamex\": _2, \"bananarepublic\": _2, \"band\": _2, \"bank\": _2, \"bar\": _2, \"barcelona\": _2, \"barclaycard\": _2, \"barclays\": _2, \"barefoot\": _2, \"bargains\": _2, \"baseball\": _2, \"basketball\": _2, \"bauhaus\": _2, \"bayern\": _2, \"bbc\": _2, \"bbt\": _2, \"bbva\": _2, \"bcg\": _2, \"bcn\": _2, \"beats\": _2, \"beauty\": _2, \"beer\": _2, \"bentley\": _2, \"berlin\": _2, \"best\": _2, \"bestbuy\": _2, \"bet\": _2, \"bharti\": _2, \"bible\": _2, \"bid\": _2, \"bike\": _2, \"bing\": _2, \"bingo\": _2, \"bio\": _2, \"black\": _2, \"blackfriday\": _2, \"blockbuster\": _2, \"blog\": _2, \"bloomberg\": _2, \"blue\": _2, \"bms\": _2, \"bmw\": _2, \"bnpparibas\": _2, \"boats\": _2, \"boehringer\": _2, \"bofa\": _2, \"bom\": _2, \"bond\": _2, \"boo\": _2, \"book\": _2, \"booking\": _2, \"bosch\": _2, \"bostik\": _2, \"boston\": _2, \"bot\": _2, \"boutique\": _2, \"box\": _2, \"bradesco\": _2, \"bridgestone\": _2, \"broadway\": _2, \"broker\": _2, \"brother\": _2, \"brussels\": _2, \"budapest\": _2, \"bugatti\": _2, \"build\": _2, \"builders\": _2, \"business\": _10, \"buy\": _2, \"buzz\": _2, \"bzh\": _2, \"cab\": _2, \"cafe\": _2, \"cal\": _2, \"call\": _2, \"calvinklein\": _2, \"cam\": _2, \"camera\": _2, \"camp\": _2, \"cancerresearch\": _2, \"canon\": _2, \"capetown\": _2, \"capital\": _2, \"capitalone\": _2, \"car\": _2, \"caravan\": _2, \"cards\": _2, \"care\": _2, \"career\": _2, \"careers\": _2, \"cars\": _2, \"casa\": { \"$\": 1, \"succ\": { \"nabu\": { \"$\": 0, \"succ\": { \"ui\": _4 } } } }, \"case\": _2, \"caseih\": _2, \"cash\": _2, \"casino\": _2, \"catering\": _2, \"catholic\": _2, \"cba\": _2, \"cbn\": _2, \"cbre\": _2, \"cbs\": _2, \"ceb\": _2, \"center\": _2, \"ceo\": _2, \"cern\": _2, \"cfa\": _2, \"cfd\": _2, \"chanel\": _2, \"channel\": _2, \"charity\": _2, \"chase\": _2, \"chat\": _2, \"cheap\": _2, \"chintai\": _2, \"christmas\": _2, \"chrome\": _2, \"church\": _2, \"cipriani\": _2, \"circle\": _2, \"cisco\": _2, \"citadel\": _2, \"citi\": _2, \"citic\": _2, \"city\": _11, \"cityeats\": _2, \"claims\": _2, \"cleaning\": _2, \"click\": _2, \"clinic\": _2, \"clinique\": _2, \"clothing\": _2, \"cloud\": { \"$\": 1, \"succ\": { \"banzai\": _7, \"statics\": _7, \"jele\": _4, \"linkyard\": _4, \"magentosite\": _7, \"perspecta\": _4, \"vapor\": _4, \"on-rancher\": _7, \"sensiosite\": _7, \"trafficplex\": _4, \"urown\": _4, \"voorloper\": _4 } }, \"club\": { \"$\": 1, \"succ\": { \"cloudns\": _4, \"jele\": _4, \"barsy\": _4, \"pony\": _4 } }, \"clubmed\": _2, \"coach\": _2, \"codes\": { \"$\": 1, \"succ\": { \"owo\": _7 } }, \"coffee\": _2, \"college\": _2, \"cologne\": _2, \"comcast\": _2, \"commbank\": _2, \"community\": { \"$\": 1, \"succ\": { \"ravendb\": _4, \"myforum\": _4 } }, \"company\": _2, \"compare\": _2, \"computer\": _2, \"comsec\": _2, \"condos\": _2, \"construction\": _2, \"consulting\": _2, \"contact\": _2, \"contractors\": _2, \"cooking\": _2, \"cookingchannel\": _2, \"cool\": { \"$\": 1, \"succ\": { \"de\": _4 } }, \"corsica\": _2, \"country\": _2, \"coupon\": _2, \"coupons\": _2, \"courses\": _2, \"cpa\": _2, \"credit\": _2, \"creditcard\": _2, \"creditunion\": _2, \"cricket\": _2, \"crown\": _2, \"crs\": _2, \"cruise\": _2, \"cruises\": _2, \"csc\": _2, \"cuisinella\": _2, \"cymru\": _2, \"cyou\": _2, \"dabur\": _2, \"dad\": _2, \"dance\": _2, \"data\": _2, \"date\": _2, \"dating\": _2, \"datsun\": _2, \"day\": _2, \"dclk\": _2, \"dds\": _2, \"deal\": _2, \"dealer\": _2, \"deals\": _2, \"degree\": _2, \"delivery\": _2, \"dell\": _2, \"deloitte\": _2, \"delta\": _2, \"democrat\": _2, \"dental\": _2, \"dentist\": _2, \"desi\": _2, \"design\": { \"$\": 1, \"succ\": { \"bss\": _4 } }, \"dev\": { \"$\": 1, \"succ\": { \"lcl\": _7, \"stg\": _7, \"workers\": _4, \"curv\": _4, \"fly\": _4, \"iserv\": _4, \"loginline\": _4, \"platter-app\": _4, \"vercel\": _4, \"webhare\": _7 } }, \"dhl\": _2, \"diamonds\": _2, \"diet\": _2, \"digital\": { \"$\": 1, \"succ\": { \"cloudapps\": { \"$\": 2, \"succ\": { \"london\": _4 } } } }, \"direct\": _2, \"directory\": _2, \"discount\": _2, \"discover\": _2, \"dish\": _2, \"diy\": _2, \"dnp\": _2, \"docs\": _2, \"doctor\": _2, \"dog\": _2, \"domains\": _2, \"dot\": _2, \"download\": _2, \"drive\": _2, \"dtv\": _2, \"dubai\": _2, \"duck\": _2, \"dunlop\": _2, \"dupont\": _2, \"durban\": _2, \"dvag\": _2, \"dvr\": _2, \"earth\": { \"$\": 1, \"succ\": { \"dapps\": { \"$\": 0, \"succ\": { \"*\": _4, \"bzz\": _7 } } } }, \"eat\": _2, \"eco\": _2, \"edeka\": _2, \"education\": _10, \"email\": _2, \"emerck\": _2, \"energy\": _2, \"engineer\": _2, \"engineering\": _2, \"enterprises\": _2, \"epson\": _2, \"equipment\": _2, \"ericsson\": _2, \"erni\": _2, \"esq\": _2, \"estate\": { \"$\": 1, \"succ\": { \"compute\": _7 } }, \"etisalat\": _2, \"eurovision\": _2, \"eus\": { \"$\": 1, \"succ\": { \"party\": _18 } }, \"events\": _10, \"exchange\": _2, \"expert\": _2, \"exposed\": _2, \"express\": _2, \"extraspace\": _2, \"fage\": _2, \"fail\": _2, \"fairwinds\": _2, \"faith\": _19, \"family\": _2, \"fan\": _2, \"fans\": _2, \"farm\": { \"$\": 1, \"succ\": { \"storj\": _4 } }, \"farmers\": _2, \"fashion\": { \"$\": 1, \"succ\": { \"of\": _4, \"on\": _4 } }, \"fast\": _2, \"fedex\": _2, \"feedback\": _2, \"ferrari\": _2, \"ferrero\": _2, \"fiat\": _2, \"fidelity\": _2, \"fido\": _2, \"film\": _2, \"final\": _2, \"finance\": _2, \"financial\": _10, \"fire\": _2, \"firestone\": _2, \"firmdale\": _2, \"fish\": _2, \"fishing\": _2, \"fit\": { \"$\": 1, \"succ\": { \"ptplus\": _4 } }, \"fitness\": _2, \"flickr\": _2, \"flights\": _2, \"flir\": _2, \"florist\": _2, \"flowers\": _2, \"fly\": _2, \"foo\": _2, \"food\": _2, \"foodnetwork\": _2, \"football\": { \"$\": 1, \"succ\": { \"of\": _4 } }, \"ford\": _2, \"forex\": _2, \"forsale\": _2, \"forum\": _2, \"foundation\": _2, \"fox\": _2, \"free\": _2, \"fresenius\": _2, \"frl\": _2, \"frogans\": _2, \"frontdoor\": _2, \"frontier\": _2, \"ftr\": _2, \"fujitsu\": _2, \"fujixerox\": _2, \"fun\": _2, \"fund\": _2, \"furniture\": _2, \"futbol\": _2, \"fyi\": _2, \"gal\": _2, \"gallery\": _2, \"gallo\": _2, \"gallup\": _2, \"game\": _2, \"games\": _2, \"gap\": _2, \"garden\": _2, \"gay\": _2, \"gbiz\": _2, \"gdn\": { \"$\": 1, \"succ\": { \"cnpy\": _4 } }, \"gea\": _2, \"gent\": _2, \"genting\": _2, \"george\": _2, \"ggee\": _2, \"gift\": _2, \"gifts\": _2, \"gives\": _2, \"giving\": _2, \"glade\": _2, \"glass\": _2, \"gle\": _2, \"global\": _2, \"globo\": _2, \"gmail\": _2, \"gmbh\": _2, \"gmo\": _2, \"gmx\": _2, \"godaddy\": _2, \"gold\": _2, \"goldpoint\": _2, \"golf\": _2, \"goo\": _2, \"goodyear\": _2, \"goog\": { \"$\": 1, \"succ\": { \"cloud\": _4 } }, \"google\": _2, \"gop\": _2, \"got\": _2, \"grainger\": _2, \"graphics\": _2, \"gratis\": _2, \"green\": _2, \"gripe\": _2, \"grocery\": _2, \"group\": { \"$\": 1, \"succ\": { \"discourse\": _4 } }, \"guardian\": _2, \"gucci\": _2, \"guge\": _2, \"guide\": _2, \"guitars\": _2, \"guru\": _2, \"hair\": _2, \"hamburg\": _2, \"hangout\": _2, \"haus\": _2, \"hbo\": _2, \"hdfc\": _2, \"hdfcbank\": _2, \"health\": _2, \"healthcare\": _2, \"help\": _2, \"helsinki\": _2, \"here\": _2, \"hermes\": _2, \"hgtv\": _2, \"hiphop\": _2, \"hisamitsu\": _2, \"hitachi\": _2, \"hiv\": _2, \"hkt\": _2, \"hockey\": _2, \"holdings\": _2, \"holiday\": _2, \"homedepot\": _2, \"homegoods\": _2, \"homes\": _2, \"homesense\": _2, \"honda\": _2, \"horse\": _2, \"hospital\": _2, \"host\": { \"$\": 1, \"succ\": { \"cloudaccess\": _4, \"freesite\": _4, \"fastvps\": _4, \"myfast\": _4, \"jele\": _4, \"mircloud\": _4, \"pcloud\": _4, \"half\": _4 } }, \"hosting\": { \"$\": 1, \"succ\": { \"opencraft\": _4 } }, \"hot\": _2, \"hoteles\": _2, \"hotels\": _2, \"hotmail\": _2, \"house\": _2, \"how\": _2, \"hsbc\": _2, \"hughes\": _2, \"hyatt\": _2, \"hyundai\": _2, \"ibm\": _2, \"icbc\": _2, \"ice\": _2, \"icu\": _2, \"ieee\": _2, \"ifm\": _2, \"ikano\": _2, \"imamat\": _2, \"imdb\": _2, \"immo\": _2, \"immobilien\": _2, \"inc\": _2, \"industries\": _2, \"infiniti\": _2, \"ing\": _2, \"ink\": _11, \"institute\": _2, \"insurance\": _2, \"insure\": _2, \"intel\": _2, \"international\": _2, \"intuit\": _2, \"investments\": _2, \"ipiranga\": _2, \"irish\": _2, \"ismaili\": _2, \"ist\": _2, \"istanbul\": _2, \"itau\": _2, \"itv\": _2, \"iveco\": _2, \"jaguar\": _2, \"java\": _2, \"jcb\": _2, \"jcp\": _2, \"jeep\": _2, \"jetzt\": _2, \"jewelry\": _2, \"jio\": _2, \"jll\": _2, \"jmp\": _2, \"jnj\": _2, \"joburg\": _2, \"jot\": _2, \"joy\": _2, \"jpmorgan\": _2, \"jprs\": _2, \"juegos\": _2, \"juniper\": _2, \"kaufen\": _2, \"kddi\": _2, \"kerryhotels\": _2, \"kerrylogistics\": _2, \"kerryproperties\": _2, \"kfh\": _2, \"kia\": _2, \"kim\": _2, \"kinder\": _2, \"kindle\": _2, \"kitchen\": _2, \"kiwi\": _2, \"koeln\": _2, \"komatsu\": _2, \"kosher\": _2, \"kpmg\": _2, \"kpn\": _2, \"krd\": { \"$\": 1, \"succ\": { \"co\": _4, \"edu\": _4 } }, \"kred\": _2, \"kuokgroup\": _2, \"kyoto\": _2, \"lacaixa\": _2, \"lamborghini\": _2, \"lamer\": _2, \"lancaster\": _2, \"lancia\": _2, \"land\": { \"$\": 1, \"succ\": { \"static\": { \"$\": 2, \"succ\": { \"dev\": _4, \"sites\": _4 } } } }, \"landrover\": _2, \"lanxess\": _2, \"lasalle\": _2, \"lat\": _2, \"latino\": _2, \"latrobe\": _2, \"law\": _2, \"lawyer\": _2, \"lds\": _2, \"lease\": _2, \"leclerc\": _2, \"lefrak\": _2, \"legal\": _2, \"lego\": _2, \"lexus\": _2, \"lgbt\": _2, \"lidl\": _2, \"life\": _2, \"lifeinsurance\": _2, \"lifestyle\": _2, \"lighting\": _2, \"like\": _2, \"lilly\": _2, \"limited\": _2, \"limo\": _2, \"lincoln\": _2, \"linde\": _2, \"link\": { \"$\": 1, \"succ\": { \"cyon\": _4, \"mypep\": _4, \"dweb\": _7 } }, \"lipsy\": _2, \"live\": _2, \"living\": _2, \"lixil\": _2, \"llc\": _2, \"llp\": _2, \"loan\": _2, \"loans\": _2, \"locker\": _2, \"locus\": _2, \"loft\": _2, \"lol\": _2, \"london\": { \"$\": 1, \"succ\": { \"in\": _4, \"of\": _4 } }, \"lotte\": _2, \"lotto\": _2, \"love\": _2, \"lpl\": _2, \"lplfinancial\": _2, \"ltd\": _2, \"ltda\": _2, \"lundbeck\": _2, \"lupin\": _2, \"luxe\": _2, \"luxury\": _2, \"macys\": _2, \"madrid\": _2, \"maif\": _2, \"maison\": _2, \"makeup\": _2, \"man\": _2, \"management\": { \"$\": 1, \"succ\": { \"router\": _4 } }, \"mango\": _2, \"map\": _2, \"market\": _2, \"marketing\": _2, \"markets\": _2, \"marriott\": _2, \"marshalls\": _2, \"maserati\": _2, \"mattel\": _2, \"mba\": _2, \"mckinsey\": _2, \"med\": _2, \"media\": _2, \"meet\": _2, \"melbourne\": _2, \"meme\": _2, \"memorial\": _2, \"men\": _24, \"menu\": _25, \"merckmsd\": _2, \"metlife\": _2, \"miami\": _2, \"microsoft\": _2, \"mini\": _2, \"mint\": _2, \"mit\": _2, \"mitsubishi\": _2, \"mlb\": _2, \"mls\": _2, \"mma\": _2, \"mobile\": _2, \"moda\": _2, \"moe\": _2, \"moi\": _2, \"mom\": { \"$\": 1, \"succ\": { \"and\": _4, \"for\": _4 } }, \"monash\": _2, \"money\": _2, \"monster\": _2, \"mormon\": _2, \"mortgage\": _2, \"moscow\": _2, \"moto\": _2, \"motorcycles\": _2, \"mov\": _2, \"movie\": _2, \"msd\": _2, \"mtn\": _2, \"mtr\": _2, \"mutual\": _2, \"nab\": _2, \"nagoya\": _2, \"nationwide\": _2, \"natura\": _2, \"navy\": _2, \"nba\": _2, \"nec\": _2, \"netbank\": _2, \"netflix\": _2, \"network\": { \"$\": 1, \"succ\": { \"alces\": _7, \"co\": _4, \"arvo\": _4, \"azimuth\": _4 } }, \"neustar\": _2, \"new\": _2, \"newholland\": _2, \"news\": _2, \"next\": _2, \"nextdirect\": _2, \"nexus\": _2, \"nfl\": _2, \"ngo\": _2, \"nhk\": _2, \"nico\": _2, \"nike\": _2, \"nikon\": _2, \"ninja\": _2, \"nissan\": _2, \"nissay\": _2, \"nokia\": _2, \"northwesternmutual\": _2, \"norton\": _2, \"now\": _2, \"nowruz\": _2, \"nowtv\": _2, \"nra\": _2, \"nrw\": _2, \"ntt\": _2, \"nyc\": _2, \"obi\": _2, \"observer\": _2, \"off\": _2, \"office\": _2, \"okinawa\": _2, \"olayan\": _2, \"olayangroup\": _2, \"oldnavy\": _2, \"ollo\": _2, \"omega\": _2, \"one\": { \"$\": 1, \"succ\": { \"onred\": { \"$\": 2, \"succ\": { \"staging\": _4 } }, \"for\": _4, \"homelink\": _4 } }, \"ong\": _2, \"onl\": _2, \"online\": _25, \"onyourside\": _2, \"ooo\": _2, \"open\": _2, \"oracle\": _2, \"orange\": _2, \"organic\": _2, \"origins\": _2, \"osaka\": _2, \"otsuka\": _2, \"ott\": _2, \"ovh\": { \"$\": 1, \"succ\": { \"nerdpol\": _4 } }, \"page\": { \"$\": 1, \"succ\": { \"pdns\": _4, \"plesk\": _4, \"prvcy\": _4 } }, \"panasonic\": _2, \"paris\": _2, \"pars\": _2, \"partners\": _2, \"parts\": _2, \"party\": _19, \"passagens\": _2, \"pay\": _2, \"pccw\": _2, \"pet\": _2, \"pfizer\": _2, \"pharmacy\": _2, \"phd\": _2, \"philips\": _2, \"phone\": _2, \"photo\": _2, \"photography\": _2, \"photos\": _2, \"physio\": _2, \"pics\": _2, \"pictet\": _2, \"pictures\": { \"$\": 1, \"succ\": { \"1337\": _4 } }, \"pid\": _2, \"pin\": _2, \"ping\": _2, \"pink\": _2, \"pioneer\": _2, \"pizza\": _2, \"place\": _10, \"play\": _2, \"playstation\": _2, \"plumbing\": _2, \"plus\": _2, \"pnc\": _2, \"pohl\": _2, \"poker\": _2, \"politie\": _2, \"porn\": { \"$\": 1, \"succ\": { \"indie\": _4 } }, \"pramerica\": _2, \"praxi\": _2, \"press\": _2, \"prime\": _2, \"prod\": _2, \"productions\": _2, \"prof\": _2, \"progressive\": _2, \"promo\": _2, \"properties\": _2, \"property\": _2, \"protection\": _2, \"pru\": _2, \"prudential\": _2, \"pub\": _25, \"pwc\": _2, \"qpon\": _2, \"quebec\": _2, \"quest\": _2, \"qvc\": _2, \"racing\": _2, \"radio\": _2, \"raid\": _2, \"read\": _2, \"realestate\": _2, \"realtor\": _2, \"realty\": _2, \"recipes\": _2, \"red\": _2, \"redstone\": _2, \"redumbrella\": _2, \"rehab\": _2, \"reise\": _2, \"reisen\": _2, \"reit\": _2, \"reliance\": _2, \"ren\": _2, \"rent\": _2, \"rentals\": _2, \"repair\": _2, \"report\": _2, \"republican\": _2, \"rest\": _2, \"restaurant\": _2, \"review\": _19, \"reviews\": _2, \"rexroth\": _2, \"rich\": _2, \"richardli\": _2, \"ricoh\": _2, \"ril\": _2, \"rio\": _2, \"rip\": { \"$\": 1, \"succ\": { \"clan\": _4 } }, \"rmit\": _2, \"rocher\": _2, \"rocks\": { \"$\": 1, \"succ\": { \"myddns\": _4, \"lima-city\": _4, \"webspace\": _4 } }, \"rodeo\": _2, \"rogers\": _2, \"room\": _2, \"rsvp\": _2, \"rugby\": _2, \"ruhr\": _2, \"run\": { \"$\": 1, \"succ\": { \"hs\": _4, \"development\": _4, \"ravendb\": _4, \"repl\": _4 } }, \"rwe\": _2, \"ryukyu\": _2, \"saarland\": _2, \"safe\": _2, \"safety\": _2, \"sakura\": _2, \"sale\": _24, \"salon\": _2, \"samsclub\": _2, \"samsung\": _2, \"sandvik\": _2, \"sandvikcoromant\": _2, \"sanofi\": _2, \"sap\": _2, \"sarl\": _2, \"sas\": _2, \"save\": _2, \"saxo\": _2, \"sbi\": _2, \"sbs\": _2, \"sca\": _2, \"scb\": _2, \"schaeffler\": _2, \"schmidt\": _2, \"scholarships\": _2, \"school\": _11, \"schule\": _2, \"schwarz\": _2, \"science\": _19, \"scjohnson\": _2, \"scot\": { \"$\": 1, \"succ\": { \"gov\": _4 } }, \"search\": _2, \"seat\": _2, \"secure\": _2, \"security\": _2, \"seek\": _2, \"select\": _2, \"sener\": _2, \"services\": { \"$\": 1, \"succ\": { \"loginline\": _4 } }, \"ses\": _2, \"seven\": _2, \"sew\": _2, \"sex\": _2, \"sexy\": _2, \"sfr\": _2, \"shangrila\": _2, \"sharp\": _2, \"shaw\": _2, \"shell\": _2, \"shia\": _2, \"shiksha\": _2, \"shoes\": _2, \"shop\": _25, \"shopping\": _2, \"shouji\": _2, \"show\": _2, \"showtime\": _2, \"shriram\": _2, \"silk\": _2, \"sina\": _2, \"singles\": _2, \"site\": { \"$\": 1, \"succ\": { \"cloudera\": _4, \"cyon\": _4, \"fastvps\": _4, \"jele\": _4, \"lelux\": _4, \"loginline\": _4, \"barsy\": _4, \"opensocial\": _4, \"platformsh\": _7, \"byen\": _4, \"mintere\": _4 } }, \"ski\": _2, \"skin\": _2, \"sky\": _2, \"skype\": _2, \"sling\": _2, \"smart\": _2, \"smile\": _2, \"sncf\": _2, \"soccer\": _2, \"social\": _2, \"softbank\": _2, \"software\": _2, \"sohu\": _2, \"solar\": _2, \"solutions\": _2, \"song\": _2, \"sony\": _2, \"soy\": _2, \"spa\": _2, \"space\": { \"$\": 1, \"succ\": { \"myfast\": _4, \"linkitools\": _4, \"uber\": _4, \"xs4all\": _4 } }, \"sport\": _2, \"spot\": _2, \"spreadbetting\": _2, \"srl\": _2, \"stada\": _2, \"staples\": _2, \"star\": _2, \"statebank\": _2, \"statefarm\": _2, \"stc\": _2, \"stcgroup\": _2, \"stockholm\": _2, \"storage\": _2, \"store\": { \"$\": 1, \"succ\": { \"shopware\": _4 } }, \"stream\": _2, \"studio\": _2, \"study\": _2, \"style\": _2, \"sucks\": _2, \"supplies\": _2, \"supply\": _2, \"support\": _25, \"surf\": _2, \"surgery\": _2, \"suzuki\": _2, \"swatch\": _2, \"swiftcover\": _2, \"swiss\": _2, \"sydney\": _2, \"systems\": { \"$\": 1, \"succ\": { \"knightpoint\": _4 } }, \"tab\": _2, \"taipei\": _2, \"talk\": _2, \"taobao\": _2, \"target\": _2, \"tatamotors\": _2, \"tatar\": _2, \"tattoo\": _2, \"tax\": _2, \"taxi\": _2, \"tci\": _2, \"tdk\": _2, \"team\": { \"$\": 1, \"succ\": { \"discourse\": _4, \"jelastic\": _4 } }, \"tech\": _2, \"technology\": _10, \"temasek\": _2, \"tennis\": _2, \"teva\": _2, \"thd\": _2, \"theater\": _2, \"theatre\": _2, \"tiaa\": _2, \"tickets\": _2, \"tienda\": _2, \"tiffany\": _2, \"tips\": _2, \"tires\": _2, \"tirol\": _2, \"tjmaxx\": _2, \"tjx\": _2, \"tkmaxx\": _2, \"tmall\": _2, \"today\": _2, \"tokyo\": _2, \"tools\": _2, \"top\": { \"$\": 1, \"succ\": { \"now-dns\": _4, \"ntdll\": _4 } }, \"toray\": _2, \"toshiba\": _2, \"total\": _2, \"tours\": _2, \"town\": _2, \"toyota\": _2, \"toys\": _2, \"trade\": _19, \"trading\": _2, \"training\": _2, \"travel\": _2, \"travelchannel\": _2, \"travelers\": _2, \"travelersinsurance\": _2, \"trust\": _2, \"trv\": _2, \"tube\": _2, \"tui\": _2, \"tunes\": _2, \"tushu\": _2, \"tvs\": _2, \"ubank\": _2, \"ubs\": _2, \"unicom\": _2, \"university\": _2, \"uno\": _2, \"uol\": _2, \"ups\": _2, \"vacations\": _2, \"vana\": _2, \"vanguard\": _2, \"vegas\": _2, \"ventures\": _2, \"verisign\": _2, \"versicherung\": _2, \"vet\": _2, \"viajes\": _2, \"video\": _2, \"vig\": _2, \"viking\": _2, \"villas\": _2, \"vin\": _2, \"vip\": _2, \"virgin\": _2, \"visa\": _2, \"vision\": _2, \"viva\": _2, \"vivo\": _2, \"vlaanderen\": _2, \"vodka\": _2, \"volkswagen\": _2, \"volvo\": _2, \"vote\": _2, \"voting\": _2, \"voto\": _2, \"voyage\": _2, \"vuelos\": _2, \"wales\": _2, \"walmart\": _2, \"walter\": _2, \"wang\": _2, \"wanggou\": _2, \"watch\": _2, \"watches\": _2, \"weather\": _2, \"weatherchannel\": _2, \"webcam\": _2, \"weber\": _2, \"website\": _2, \"wed\": _2, \"wedding\": _2, \"weibo\": _2, \"weir\": _2, \"whoswho\": _2, \"wien\": _2, \"wiki\": _2, \"williamhill\": _2, \"win\": _2, \"windows\": _2, \"wine\": _2, \"winners\": _2, \"wme\": _2, \"wolterskluwer\": _2, \"woodside\": _2, \"work\": { \"$\": 1, \"succ\": { \"of\": _4, \"to\": _4 } }, \"works\": _2, \"world\": _2, \"wow\": _2, \"wtc\": _2, \"wtf\": _2, \"xbox\": _2, \"xerox\": _2, \"xfinity\": _2, \"xihuan\": _2, \"xin\": _2, \"xn--11b4c3d\": _2, \"कॉम\": _2, \"xn--1ck2e1b\": _2, \"セール\": _2, \"xn--1qqw23a\": _2, \"佛山\": _2, \"xn--30rr7y\": _2, \"慈善\": _2, \"xn--3bst00m\": _2, \"集团\": _2, \"xn--3ds443g\": _2, \"在线\": _2, \"xn--3oq18vl8pn36a\": _2, \"大众汽车\": _2, \"xn--3pxu8k\": _2, \"点看\": _2, \"xn--42c2d9a\": _2, \"คอม\": _2, \"xn--45q11c\": _2, \"八卦\": _2, \"xn--4gbrim\": _2, \"موقع\": _2, \"xn--55qw42g\": _2, \"公益\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--5su34j936bgsg\": _2, \"香格里拉\": _2, \"xn--5tzm5g\": _2, \"网站\": _2, \"xn--6frz82g\": _2, \"移动\": _2, \"xn--6qq986b3xl\": _2, \"我爱你\": _2, \"xn--80adxhks\": _2, \"москва\": _2, \"xn--80aqecdr1a\": _2, \"католик\": _2, \"xn--80asehdb\": _2, \"онлайн\": _2, \"xn--80aswg\": _2, \"сайт\": _2, \"xn--8y0a063a\": _2, \"联通\": _2, \"xn--9dbq2a\": _2, \"קום\": _2, \"xn--9et52u\": _2, \"时尚\": _2, \"xn--9krt00a\": _2, \"微博\": _2, \"xn--b4w605ferd\": _2, \"淡马锡\": _2, \"xn--bck1b9a5dre4c\": _2, \"ファッション\": _2, \"xn--c1avg\": _2, \"орг\": _2, \"xn--c2br7g\": _2, \"नेट\": _2, \"xn--cck2b3b\": _2, \"ストア\": _2, \"xn--cckwcxetd\": _2, \"アマゾン\": _2, \"xn--cg4bki\": _2, \"삼성\": _2, \"xn--czr694b\": _2, \"商标\": _2, \"xn--czrs0t\": _2, \"商店\": _2, \"xn--czru2d\": _2, \"商城\": _2, \"xn--d1acj3b\": _2, \"дети\": _2, \"xn--eckvdtc9d\": _2, \"ポイント\": _2, \"xn--efvy88h\": _2, \"新闻\": _2, \"xn--fct429k\": _2, \"家電\": _2, \"xn--fhbei\": _2, \"كوم\": _2, \"xn--fiq228c5hs\": _2, \"中文网\": _2, \"xn--fiq64b\": _2, \"中信\": _2, \"xn--fjq720a\": _2, \"娱乐\": _2, \"xn--flw351e\": _2, \"谷歌\": _2, \"xn--fzys8d69uvgm\": _2, \"電訊盈科\": _2, \"xn--g2xx48c\": _2, \"购物\": _2, \"xn--gckr3f0f\": _2, \"クラウド\": _2, \"xn--gk3at1e\": _2, \"通販\": _2, \"xn--hxt814e\": _2, \"网店\": _2, \"xn--i1b6b1a6a2e\": _2, \"संगठन\": _2, \"xn--imr513n\": _2, \"餐厅\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--j1aef\": _2, \"ком\": _2, \"xn--jlq480n2rg\": _2, \"亚马逊\": _2, \"xn--jlq61u9w7b\": _2, \"诺基亚\": _2, \"xn--jvr189m\": _2, \"食品\": _2, \"xn--kcrx77d1x4a\": _2, \"飞利浦\": _2, \"xn--kput3i\": _2, \"手机\": _2, \"xn--mgba3a3ejt\": _2, \"ارامكو\": _2, \"xn--mgba7c0bbn0a\": _2, \"العليان\": _2, \"xn--mgbaakc7dvf\": _2, \"اتصالات\": _2, \"xn--mgbab2bd\": _2, \"بازار\": _2, \"xn--mgbca7dzdo\": _2, \"ابوظبي\": _2, \"xn--mgbi4ecexp\": _2, \"كاثوليك\": _2, \"xn--mgbt3dhd\": _2, \"همراه\": _2, \"xn--mk1bu44c\": _2, \"닷컴\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--ngbc5azd\": _2, \"شبكة\": _2, \"xn--ngbe9e0a\": _2, \"بيتك\": _2, \"xn--ngbrx\": _2, \"عرب\": _2, \"xn--nqv7f\": _2, \"机构\": _2, \"xn--nqv7fs00ema\": _2, \"组织机构\": _2, \"xn--nyqy26a\": _2, \"健康\": _2, \"xn--otu796d\": _2, \"招聘\": _2, \"xn--p1acf\": _2, \"рус\": _2, \"xn--pssy2u\": _2, \"大拿\": _2, \"xn--q9jyb4c\": _2, \"みんな\": _2, \"xn--qcka1pmc\": _2, \"グーグル\": _2, \"xn--rhqv96g\": _2, \"世界\": _2, \"xn--rovu88b\": _2, \"書籍\": _2, \"xn--ses554g\": _2, \"网址\": _2, \"xn--t60b56a\": _2, \"닷넷\": _2, \"xn--tckwe\": _2, \"コム\": _2, \"xn--tiq49xqyj\": _2, \"天主教\": _2, \"xn--unup4y\": _2, \"游戏\": _2, \"xn--vermgensberater-ctb\": _2, \"vermögensberater\": _2, \"xn--vermgensberatung-pwb\": _2, \"vermögensberatung\": _2, \"xn--vhquv\": _2, \"企业\": _2, \"xn--vuq861b\": _2, \"信息\": _2, \"xn--w4r85el8fhu5dnra\": _2, \"嘉里大酒店\": _2, \"xn--w4rs40l\": _2, \"嘉里\": _2, \"xn--xhq521b\": _2, \"广东\": _2, \"xn--zfr164b\": _2, \"政务\": _2, \"xyz\": { \"$\": 1, \"succ\": { \"blogsite\": _4, \"fhapp\": _4, \"crafting\": _4, \"zapto\": _4, \"telebit\": _7 } }, \"yachts\": _2, \"yahoo\": _2, \"yamaxun\": _2, \"yandex\": _2, \"yodobashi\": _2, \"yoga\": _2, \"yokohama\": _2, \"you\": _2, \"youtube\": _2, \"yun\": _2, \"zappos\": _2, \"zara\": _2, \"zero\": _2, \"zip\": _2, \"zone\": { \"$\": 1, \"succ\": { \"cloud66\": _4, \"hs\": _4, \"triton\": _7, \"lima\": _4 } }, \"zuerich\": _2 } };\n ;\n return rules;\n})();\n//# sourceMappingURL=trie.js.map","import { fastPathLookup, } from 'tldts-core';\nimport { exceptions, rules } from './data/trie';\n/**\n * Lookup parts of domain in Trie\n */\nfunction lookupInTrie(parts, trie, index, allowedMask) {\n let result = null;\n let node = trie;\n while (node !== undefined) {\n // We have a match!\n if ((node.$ & allowedMask) !== 0) {\n result = {\n index: index + 1,\n isIcann: node.$ === 1 /* ICANN */,\n isPrivate: node.$ === 2 /* PRIVATE */,\n };\n }\n // No more `parts` to look for\n if (index === -1) {\n break;\n }\n const succ = node.succ;\n node = succ && (succ[parts[index]] || succ['*']);\n index -= 1;\n }\n return result;\n}\n/**\n * Check if `hostname` has a valid public suffix in `trie`.\n */\nexport default function suffixLookup(hostname, options, out) {\n if (fastPathLookup(hostname, options, out) === true) {\n return;\n }\n const hostnameParts = hostname.split('.');\n const allowedMask = (options.allowPrivateDomains === true ? 2 /* PRIVATE */ : 0) |\n (options.allowIcannDomains === true ? 1 /* ICANN */ : 0);\n // Look for exceptions\n const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1, allowedMask);\n if (exceptionMatch !== null) {\n out.isIcann = exceptionMatch.isIcann;\n out.isPrivate = exceptionMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.');\n return;\n }\n // Look for a match in rules\n const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1, allowedMask);\n if (rulesMatch !== null) {\n out.isIcann = rulesMatch.isIcann;\n out.isPrivate = rulesMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.');\n return;\n }\n // No match found...\n // Prevailing rule is '*' so we consider the top-level domain to be the\n // public suffix of `hostname` (e.g.: 'example.org' => 'org').\n out.isIcann = false;\n out.isPrivate = false;\n out.publicSuffix = hostnameParts[hostnameParts.length - 1];\n}\n//# sourceMappingURL=suffix-trie.js.map","import { getEmptyResult, parseImpl, resetResult } from 'tldts-core';\nimport suffixLookup from './src/suffix-trie';\n// For all methods but 'parse', it does not make sense to allocate an object\n// every single time to only return the value of a specific attribute. To avoid\n// this un-necessary allocation, we use a global object which is re-used.\nconst RESULT = getEmptyResult();\nexport function parse(url, options = {}) {\n return parseImpl(url, 5 /* ALL */, suffixLookup, options, getEmptyResult());\n}\nexport function getHostname(url, options = {}) {\n resetResult(RESULT);\n return parseImpl(url, 0 /* HOSTNAME */, suffixLookup, options, RESULT).hostname;\n}\nexport function getPublicSuffix(url, options = {}) {\n resetResult(RESULT);\n return parseImpl(url, 2 /* PUBLIC_SUFFIX */, suffixLookup, options, RESULT).publicSuffix;\n}\nexport function getDomain(url, options = {}) {\n resetResult(RESULT);\n return parseImpl(url, 3 /* DOMAIN */, suffixLookup, options, RESULT).domain;\n}\nexport function getSubdomain(url, options = {}) {\n resetResult(RESULT);\n return parseImpl(url, 4 /* SUB_DOMAIN */, suffixLookup, options, RESULT).subdomain;\n}\nexport function getDomainWithoutSuffix(url, options = {}) {\n resetResult(RESULT);\n return parseImpl(url, 5 /* ALL */, suffixLookup, options, RESULT).domainWithoutSuffix;\n}\n//# sourceMappingURL=index.js.map","var NETWORK_RULE_OPTIONS = {\n THIRD_PARTY: 'third-party',\n FIRST_PARTY: 'first-party',\n MATCH_CASE: 'match-case',\n IMPORTANT: 'important',\n DOMAIN: 'domain',\n DENYALLOW: 'denyallow',\n ELEMHIDE: 'elemhide',\n GENERICHIDE: 'generichide',\n SPECIFICHIDE: 'specifichide',\n GENERICBLOCK: 'genericblock',\n JSINJECT: 'jsinject',\n URLBLOCK: 'urlblock',\n CONTENT: 'content',\n DOCUMENT: 'document',\n DOC: 'doc',\n STEALTH: 'stealth',\n POPUP: 'popup',\n EMPTY: 'empty',\n MP4: 'mp4',\n SCRIPT: 'script',\n STYLESHEET: 'stylesheet',\n SUBDOCUMENT: 'subdocument',\n OBJECT: 'object',\n IMAGE: 'image',\n XMLHTTPREQUEST: 'xmlhttprequest',\n MEDIA: 'media',\n FONT: 'font',\n WEBSOCKET: 'websocket',\n OTHER: 'other',\n PING: 'ping',\n BADFILTER: 'badfilter',\n CSP: 'csp',\n REPLACE: 'replace',\n COOKIE: 'cookie',\n REDIRECT: 'redirect',\n REDIRECTRULE: 'redirect-rule',\n REMOVEPARAM: 'removeparam',\n REMOVEHEADER: 'removeheader',\n JSONPRUNE: 'jsonprune',\n HLS: 'hls',\n APP: 'app',\n NETWORK: 'network',\n EXTENSION: 'extension',\n NOOP: '_',\n CLIENT: 'client',\n DNSREWRITE: 'dnsrewrite',\n DNSTYPE: 'dnstype',\n CTAG: 'ctag',\n METHOD: 'method',\n TO: 'to',\n ALL: 'all',\n};\nvar OPTIONS_DELIMITER = '$';\nvar MASK_ALLOWLIST = '@@';\nvar NOT_MARK = '~';\nvar ESCAPE_CHARACTER = '\\\\';\n\nexport { ESCAPE_CHARACTER, MASK_ALLOWLIST, NETWORK_RULE_OPTIONS, NOT_MARK, OPTIONS_DELIMITER };\n","/**\n * RequestType is the request types enumeration.\n * Important: the enumeration is marked as const to avoid side effects when\n * importing it into an extension.\n */\nvar RequestType = {\n /** No value is set. Syntax sugar to simplify code. */\n NotSet: 0,\n /** main frame */\n Document: 1,\n /** (iframe) $subdocument */\n SubDocument: 2,\n /** (javascript, etc) $script */\n Script: 4,\n /** (css) $stylesheet */\n Stylesheet: 8,\n /** (flash, etc) $object */\n Object: 16,\n /** (any image) $image */\n Image: 32,\n /** (ajax/fetch) $xmlhttprequest */\n XmlHttpRequest: 64,\n /** (video/music) $media */\n Media: 128,\n /** (any custom font) $font */\n Font: 256,\n /** (a websocket connection) $websocket */\n WebSocket: 512,\n /** (navigator.sendBeacon()) $ping */\n Ping: 1024,\n /** any other request type */\n Other: 2048, // 1 << 11\n};\n\nexport { RequestType };\n","const word = '[a-fA-F\\\\d:]';\n\nconst boundry = options => options && options.includeBoundaries\n\t? `(?:(?<=\\\\s|^)(?=${word})|(?<=${word})(?=\\\\s|$))`\n\t: '';\n\nconst v4 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\n\nconst v6segment = '[a-fA-F\\\\d]{1,4}';\n\nconst v6 = `\n(?:\n(?:${v6segment}:){7}(?:${v6segment}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:${v6segment}:){6}(?:${v4}|:${v6segment}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:${v6segment}:){5}(?::${v4}|(?::${v6segment}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:${v6segment}:){4}(?:(?::${v6segment}){0,1}:${v4}|(?::${v6segment}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:${v6segment}:){3}(?:(?::${v6segment}){0,2}:${v4}|(?::${v6segment}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:${v6segment}:){2}(?:(?::${v6segment}){0,3}:${v4}|(?::${v6segment}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:${v6segment}:){1}(?:(?::${v6segment}){0,4}:${v4}|(?::${v6segment}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::${v6segment}){0,5}:${v4}|(?::${v6segment}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n`.replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim();\n\n// Pre-compile only the exact regexes because adding a global flag make regexes stateful\nconst v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`);\nconst v4exact = new RegExp(`^${v4}$`);\nconst v6exact = new RegExp(`^${v6}$`);\n\nconst ipRegex = options => options && options.exact\n\t? v46Exact\n\t: new RegExp(`(?:${boundry(options)}${v4}${boundry(options)})|(?:${boundry(options)}${v6}${boundry(options)})`, 'g');\n\nipRegex.v4 = options => options && options.exact ? v4exact : new RegExp(`${boundry(options)}${v4}${boundry(options)}`, 'g');\nipRegex.v6 = options => options && options.exact ? v6exact : new RegExp(`${boundry(options)}${v6}${boundry(options)}`, 'g');\n\nexport default ipRegex;\n","const word = '[a-fA-F\\\\d:]';\n\nconst boundry = options => options && options.includeBoundaries\n\t? `(?:(?<=\\\\s|^)(?=${word})|(?<=${word})(?=\\\\s|$))`\n\t: '';\n\nconst v4 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\n\nconst v6segment = '[a-fA-F\\\\d]{1,4}';\n\nconst v6 = `\n(?:\n(?:${v6segment}:){7}(?:${v6segment}|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:${v6segment}:){6}(?:${v4}|:${v6segment}|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:${v6segment}:){5}(?::${v4}|(?::${v6segment}){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:${v6segment}:){4}(?:(?::${v6segment}){0,1}:${v4}|(?::${v6segment}){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:${v6segment}:){3}(?:(?::${v6segment}){0,2}:${v4}|(?::${v6segment}){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:${v6segment}:){2}(?:(?::${v6segment}){0,3}:${v4}|(?::${v6segment}){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:${v6segment}:){1}(?:(?::${v6segment}){0,4}:${v4}|(?::${v6segment}){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::${v6segment}){0,5}:${v4}|(?::${v6segment}){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n`.replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim();\n\n// Pre-compile only the exact regexes because adding a global flag make regexes stateful\nconst v46Exact = new RegExp(`(?:^${v4}$)|(?:^${v6}$)`);\nconst v4exact = new RegExp(`^${v4}$`);\nconst v6exact = new RegExp(`^${v6}$`);\n\nconst ipRegex = options => options && options.exact\n\t? v46Exact\n\t: new RegExp(`(?:${boundry(options)}${v4}${boundry(options)})|(?:${boundry(options)}${v6}${boundry(options)})`, 'g');\n\nipRegex.v4 = options => options && options.exact ? v4exact : new RegExp(`${boundry(options)}${v4}${boundry(options)}`, 'g');\nipRegex.v6 = options => options && options.exact ? v6exact : new RegExp(`${boundry(options)}${v6}${boundry(options)}`, 'g');\n\nexport default ipRegex;\n","import ipRegex from \"ip-regex\";\n\nconst defaultOpts = {exact: false};\nconst v4str = `${ipRegex.v4().source}\\\\/(3[0-2]|[12]?[0-9])`;\nconst v6str = `${ipRegex.v6().source}\\\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])`;\n\n// pre-compile only the exact regexes as global flag makes regex objects stateful\nconst v4exact = new RegExp(`^${v4str}$`);\nconst v6exact = new RegExp(`^${v6str}$`);\nconst v46exact = new RegExp(`(?:^${v4str}$)|(?:^${v6str}$)`);\n\nconst cidrRegex = ({exact} = defaultOpts) => exact ? v46exact : new RegExp(`(?:${v4str})|(?:${v6str})`, \"g\");\nexport const v4 = cidrRegex.v4 = ({exact} = defaultOpts) => exact ? v4exact : new RegExp(v4str, \"g\");\nexport const v6 = cidrRegex.v6 = ({exact} = defaultOpts) => exact ? v6exact : new RegExp(v6str, \"g\");\nexport default cidrRegex;\n","export const max4 = 2n ** 32n - 1n;\nexport const max6 = 2n ** 128n - 1n;\n\nexport function parseIp(ip) {\n const version = ip.includes(\":\") ? 6 : ip.includes(\".\") ? 4 : 0;\n if (!version) throw new Error(`Invalid IP address: ${ip}`);\n\n let number = 0n;\n let exp = 0n;\n const res = Object.create(null);\n\n if (version === 4) {\n for (const n of ip.split(\".\").map(BigInt).reverse()) {\n number += n * (2n ** exp);\n exp += 8n;\n }\n } else {\n if (ip.includes(\".\")) {\n res.ipv4mapped = true;\n ip = ip.split(\":\").map(part => {\n if (part.includes(\".\")) {\n const digits = part.split(\".\").map(str => Number(str).toString(16).padStart(2, \"0\"));\n return `${digits[0]}${digits[1]}:${digits[2]}${digits[3]}`;\n } else {\n return part;\n }\n }).join(\":\");\n }\n\n if (ip.includes(\"%\")) {\n let scopeid;\n [, ip, scopeid] = /(.+)%(.+)/.exec(ip);\n res.scopeid = scopeid;\n }\n\n const parts = ip.split(\":\");\n const index = parts.indexOf(\"\");\n\n if (index !== -1) {\n while (parts.length < 8) {\n parts.splice(index, 0, \"\");\n }\n }\n\n for (const n of parts.map(part => BigInt(parseInt(part || 0, 16))).reverse()) {\n number += n * (2n ** exp);\n exp += 16n;\n }\n }\n\n res.number = number;\n res.version = version;\n return res;\n}\n\nexport function stringifyIp({number, version, ipv4mapped, scopeid} = {}, {compress = true, hexify = false} = {}) {\n if (typeof number !== \"bigint\") throw new Error(`Expected a BigInt`);\n if (![4, 6].includes(version)) throw new Error(`Invalid version: ${version}`);\n if (number < 0n || number > (version === 4 ? max4 : max6)) throw new Error(`Invalid number: ${number}`);\n\n let step = version === 4 ? 24n : 112n;\n const stepReduction = version === 4 ? 8n : 16n;\n let remain = number;\n const parts = [];\n\n while (step > 0n) {\n const divisor = 2n ** step;\n parts.push(remain / divisor);\n remain = number % divisor;\n step -= stepReduction;\n }\n parts.push(remain);\n\n if (version === 4) {\n return parts.join(\".\");\n } else {\n let ip = \"\";\n if (ipv4mapped && !hexify) {\n for (const [index, num] of parts.entries()) {\n if (index < 6) {\n ip += `${num.toString(16)}:`;\n } else {\n ip += `${String(num >> 8n)}.${String(num & 255n)}${index === 6 ? \".\" : \"\"}`;\n }\n }\n if (compress) {\n ip = compressIPv6(ip.split(\":\"));\n }\n } else {\n if (compress) {\n ip = compressIPv6(parts.map(n => n.toString(16)));\n } else {\n ip = parts.map(n => n.toString(16)).join(\":\");\n }\n }\n\n if (scopeid) {\n ip = `${ip}%${scopeid}`;\n }\n\n return ip;\n }\n}\n\nexport function normalizeIp(ip, {compress = true, hexify = false} = {}) {\n return stringifyIp(parseIp(ip), {compress, hexify});\n}\n\n// take the longest or first sequence of \"0\" segments and replace it with \"::\"\nfunction compressIPv6(parts) {\n let longest, current;\n for (const [index, part] of parts.entries()) {\n if (part === \"0\") {\n if (!current) {\n current = new Set([index]);\n } else {\n current.add(index);\n }\n } else {\n if (current) {\n if (!longest) {\n longest = current;\n } else if (current.size > longest.size) {\n longest = current;\n }\n current = null;\n }\n }\n }\n if ((!longest && current) || (current && current.size > longest.size)) {\n longest = current;\n }\n\n for (const index of longest || []) {\n parts[index] = \":\";\n }\n\n return parts.filter(Boolean).join(\":\").replace(/:{2,}/, \"::\");\n}\n","import ipRegex from \"ip-regex\";\nimport cidrRegex from \"cidr-regex\";\nimport naturalCompare from \"string-natural-compare\";\nimport {parseIp, stringifyIp, normalizeIp} from \"ip-bigint\";\n\nconst bits = {\n \"v4\": 32,\n \"v6\": 128,\n};\n\nconst uniq = arr => Array.from(new Set(arr));\n\nexport function isIP(ip) {\n if (ipRegex.v4({exact: true}).test(ip)) return 4;\n if (ipRegex.v6({exact: true}).test(ip)) return 6;\n return 0;\n}\n\nfunction isCidr(ip) {\n if (cidrRegex.v4({exact: true}).test(ip)) return 4;\n if (cidrRegex.v6({exact: true}).test(ip)) return 6;\n return 0;\n}\n\nfunction doNormalize(cidr, {compress = true, hexify = false} = {}) {\n const {start, prefix, single, version} = parse(cidr);\n if (!single) { // cidr\n // set network address to first address\n const ip = normalizeIp(stringifyIp({number: start, version}), {compress, hexify});\n return `${ip}/${prefix}`;\n } else { // single ip\n return normalizeIp(cidr, {compress, hexify});\n }\n}\n\nexport function normalize(cidr, {compress = true, hexify = false} = {}) {\n if (Array.isArray(cidr)) {\n return cidr.map(entry => normalize(entry, {compress, hexify}));\n } else {\n return doNormalize(cidr, {compress, hexify});\n }\n}\n\nexport function parse(str) {\n const cidrVersion = isCidr(str);\n const parsed = Object.create(null);\n parsed.single = false;\n\n if (cidrVersion) {\n parsed.cidr = str;\n parsed.version = cidrVersion;\n } else {\n const version = isIP(str);\n if (version) {\n parsed.cidr = `${str}/${bits[`v${version}`]}`;\n parsed.version = version;\n parsed.single = true;\n } else {\n throw new Error(`Network is not a CIDR or IP: ${str}`);\n }\n }\n\n const [ip, prefix] = parsed.cidr.split(\"/\");\n parsed.prefix = prefix;\n const {number, version} = parseIp(ip);\n const numBits = bits[`v${version}`];\n const ipBits = number.toString(2).padStart(numBits, \"0\");\n const prefixLen = Number(numBits - prefix);\n const startBits = ipBits.substring(0, numBits - prefixLen);\n parsed.start = BigInt(`0b${startBits}${\"0\".repeat(prefixLen)}`);\n parsed.end = BigInt(`0b${startBits}${\"1\".repeat(prefixLen)}`);\n return parsed;\n}\n\n// returns whether networks fully or partially overlap\nfunction doNetsOverlap(a, b) {\n // aaa\n // bbb\n if (a.start > b.end) return false; // a starts after b\n\n // aaa\n // bbb\n if (b.start > a.end) return false; // b starts after a\n\n return true;\n}\n\n// returns whether network a fully contains network b;\nfunction netContains(a, b) {\n // aaa\n // bbbb\n if (b.start < a.start) return false; // a starts after b\n\n // aaa\n // bbbb\n if (b.end > a.end) return false; // b starts after a\n\n return true;\n}\n\n// exclude b from a and return remainder cidrs\nfunction excludeNets(a, b, v) {\n const parts = [];\n\n // compareTo returns negative if left is less than right\n\n // aaa\n // bbb\n // aaa\n // bbb\n if (a.start > b.end || a.end < b.start) {\n return [a.cidr];\n }\n\n // aaa\n // bbb\n if (a.start === b.start && a.end === b.end) {\n return [];\n }\n\n // aa\n // bbbb\n if (a.start > b.start && a.end < b.end) {\n return [];\n }\n\n // aaaa\n // bbbb\n // aaaa\n // bb\n if (a.start < b.start && a.end <= b.end) {\n parts.push({start: a.start, end: b.start - 1n});\n }\n\n // aaa\n // bbb\n // aaaa\n // bbb\n if (a.start >= b.start && a.end > b.end) {\n parts.push({start: b.end + 1n, end: a.end});\n }\n\n // aaaa\n // bb\n if (a.start < b.start && a.end > b.end) {\n parts.push(\n {start: a.start, end: b.start - 1n},\n {start: b.end + 1n, end: a.end},\n );\n }\n\n const remaining = [];\n for (const part of parts) {\n for (const subpart of subparts(part)) {\n remaining.push(formatPart(subpart, v));\n }\n }\n\n return merge(remaining);\n}\n\nfunction biggestPowerOfTwo(num) {\n if (num === 0n) return 0n;\n return 2n ** BigInt(String(num.toString(2).length - 1));\n}\n\nfunction subparts(part) {\n // special case for when part is length 1\n if ((part.end - part.start) === 1n) {\n if (part.end % 2n === 0n) {\n return [{start: part.start, end: part.start}, {start: part.end, end: part.end}];\n } else {\n return [{start: part.start, end: part.end}];\n }\n }\n\n const size = diff(part.end, part.start);\n let biggest = biggestPowerOfTwo(size);\n\n let start, end;\n if (size === biggest && part.start + size === part.end) {\n return [part];\n } else if (part.start % biggest === 0n) {\n // start is matching on the size-defined boundary - ex: 0-12, use 0-8\n start = part.start;\n end = start + biggest - 1n;\n } else {\n start = (part.end / biggest) * biggest;\n\n // start is not matching on the size-defined boundary - 4-16, use 8-16\n if ((start + biggest - 1n) > part.end) {\n // divide will floor to nearest integer\n start = ((part.end / biggest) - 1n) * biggest;\n\n while (start < part.start) {\n biggest /= 2n;\n start = ((part.end / biggest) - 1n) * biggest;\n }\n\n end = start + biggest - 1n;\n } else {\n start = (part.end / biggest) * biggest;\n end = start + biggest - 1n;\n }\n }\n\n let parts = [{start, end}];\n\n // additional subnets on left side\n if (start !== part.start) {\n parts = parts.concat(subparts({start: part.start, end: start - 1n}));\n }\n\n // additional subnets on right side\n if (end !== part.end) {\n parts = parts.concat(subparts({start: end + 1n, end: part.end}));\n }\n\n return parts;\n}\n\nfunction diff(a, b) {\n if (typeof a !== \"bigint\") a = BigInt(a);\n if (typeof b !== \"bigint\") b = BigInt(b);\n a += 1n;\n return a - b;\n}\n\nfunction formatPart(part, v) {\n const ip = normalize(stringifyIp({\n number: BigInt(part.start.toString()),\n version: Number(v.substring(1)),\n }));\n const zeroes = diff(part.end, part.start).toString(2);\n const prefix = bits[v] - (zeroes.match(/0/g) || []).length;\n return `${ip}/${prefix}`;\n}\n\nfunction mapNets(nets) {\n const maps = {v4: {}, v6: {}};\n for (const {start, end, version} of nets) {\n const v = `v${version}`;\n\n if (!maps[v][start]) maps[v][start] = {};\n if (!maps[v][end]) maps[v][end] = {};\n\n if (maps[v][start].start) {\n maps[v][start].start += 1;\n } else {\n maps[v][start].start = 1;\n }\n\n if (maps[v][end].end) {\n maps[v][end].end += 1;\n } else {\n maps[v][end].end = 1;\n }\n }\n return maps;\n}\n\nexport function merge(nets) {\n nets = uniq((Array.isArray(nets) ? nets : [nets]).map(parse));\n const maps = mapNets(nets);\n\n const merged = {v4: [], v6: []};\n const start = {v4: null, v6: null};\n const end = {v4: null, v6: null};\n\n for (const v of [\"v4\", \"v6\"]) {\n const numbers = Object.keys(maps[v]).sort(naturalCompare);\n let depth = 0;\n\n for (const [index, number] of numbers.entries()) {\n const marker = maps[v][number];\n\n if (start[v] === null && marker.start) {\n start[v] = BigInt(number);\n }\n if (marker.end) {\n end[v] = BigInt(number);\n }\n\n if (marker.start) depth += marker.start;\n if (marker.end) depth -= marker.end;\n\n if (marker.end && depth === 0 && ((numbers[index + 1] - numbers[index]) > 1)) {\n for (const sub of subparts({start: start[v], end: end[v]})) {\n merged[v].push(formatPart(sub, v));\n }\n start[v] = null;\n end[v] = null;\n } else if (index === (numbers.length - 1)) {\n for (const sub of subparts({start: start[v], end: end[v]})) {\n merged[v].push(formatPart(sub, v));\n }\n }\n }\n }\n\n return [...merged.v4.sort(naturalCompare), ...merged.v6.sort(naturalCompare)];\n}\n\nexport function exclude(basenets, exclnets) {\n basenets = uniq(Array.isArray(basenets) ? basenets : [basenets]);\n exclnets = uniq(Array.isArray(exclnets) ? exclnets : [exclnets]);\n\n basenets = merge(basenets);\n exclnets = merge(exclnets);\n\n const bases = {v4: [], v6: []};\n const excls = {v4: [], v6: []};\n\n for (const basenet of basenets) {\n bases[`v${isCidr(basenet)}`].push(basenet);\n }\n\n for (const exclnet of exclnets) {\n excls[`v${isCidr(exclnet)}`].push(exclnet);\n }\n\n for (const v of [\"v4\", \"v6\"]) {\n for (const exclcidr of excls[v]) {\n for (const [index, basecidr] of bases[v].entries()) {\n const base = parse(basecidr);\n const excl = parse(exclcidr);\n const remainders = excludeNets(base, excl, v);\n if (base.cidr !== remainders.toString()) {\n bases[v] = bases[v].concat(remainders);\n bases[v].splice(index, 1);\n }\n }\n }\n }\n\n return bases.v4.concat(bases.v6);\n}\n\nexport function expand(nets) {\n nets = uniq(Array.isArray(nets) ? nets : [nets]);\n\n const ips = [];\n for (const net of merge(nets)) {\n const {start, end, version} = parse(net);\n for (let number = start; number <= end; number++) {\n ips.push(stringifyIp({number, version}));\n }\n }\n return ips.map(normalize);\n}\n\nexport function overlap(a, b) {\n const aNets = uniq(Array.isArray(a) ? a : [a]);\n const bNets = uniq(Array.isArray(b) ? b : [b]);\n\n for (const a of aNets) {\n const aParsed = parse(a);\n for (const b of bNets) {\n const bParsed = parse(b);\n\n // version mismatch\n if (aParsed.version !== bParsed.version) {\n continue;\n }\n\n if (doNetsOverlap(aParsed, bParsed)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport function contains(a, b) {\n const aNets = uniq(Array.isArray(a) ? a : [a]);\n const bNets = uniq(Array.isArray(b) ? b : [b]);\n\n const numExpected = bNets.length;\n let numFound = 0;\n for (const a of aNets) {\n const aParsed = parse(a);\n for (const b of bNets) {\n const bParsed = parse(b);\n\n // version mismatch\n if (aParsed.version !== bParsed.version) {\n continue;\n }\n\n if (netContains(aParsed, bParsed)) {\n numFound++;\n continue;\n }\n }\n }\n\n return numFound === numExpected;\n}\n\nexport default {\n merge,\n exclude,\n expand,\n overlap,\n contains,\n normalize,\n parse,\n};\n","/**\n * Enumeration with the cosmetic rules markers.\n *\n * All cosmetic rules have similar structure:\n * ```\n * rule = [domains] \"marker\" content\n * domains = [domain0, domain1[, ...[, domainN]]]\n * ```\n *\n * For instance, element hiding rules look like:\n * `example.org##.banner`\n *\n * In this case:\n * * `[domains]` is `example.org` (comma-separated list of domains)\n * * `marker` is `##` (marker of element hiding rules)\n * * `content` is `.banner` (CSS selector)\n */\nvar CosmeticRuleMarker;\n(function (CosmeticRuleMarker) {\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-elemhide-rules */\n CosmeticRuleMarker[\"ElementHiding\"] = \"##\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#element-hiding-rules-exceptions */\n CosmeticRuleMarker[\"ElementHidingException\"] = \"#@#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors */\n CosmeticRuleMarker[\"ElementHidingExtCSS\"] = \"#?#\";\n /** Basically the same as {@link CosmeticRuleMarker.ElementHidingException} */\n CosmeticRuleMarker[\"ElementHidingExtCSSException\"] = \"#@?#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules */\n CosmeticRuleMarker[\"Css\"] = \"#$#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules-exceptions */\n CosmeticRuleMarker[\"CssException\"] = \"#@$#\";\n /**\n * CSS rules that use extended CSS selectors:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#extended-css-selectors\n */\n CosmeticRuleMarker[\"CssExtCSS\"] = \"#$?#\";\n /** Basically the same as {@link CosmeticRuleMarker.CssException} */\n CosmeticRuleMarker[\"CssExtCSSException\"] = \"#@$?#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules */\n CosmeticRuleMarker[\"Js\"] = \"#%#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules-exceptions-1 */\n CosmeticRuleMarker[\"JsException\"] = \"#@%#\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules */\n CosmeticRuleMarker[\"Html\"] = \"$$\";\n /** https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules-exceptions-1 */\n CosmeticRuleMarker[\"HtmlException\"] = \"$@$\";\n})(CosmeticRuleMarker || (CosmeticRuleMarker = {}));\n/**\n * findCosmeticRuleMarker looks for a cosmetic rule marker in the rule text\n * and returns the start index of the marker and the marker found.\n * If nothing found, it returns -1 and null.\n *\n * @privateRemarks\n *\n * The idea is to search for the rule marker as quickly as possible.\n * If we were simply using `Array.includes` we had to call it a dozen of times (for every marker),\n * and that'd have been much slower.\n *\n * @param ruleText - rule text to scan.\n */\nfunction findCosmeticRuleMarker(ruleText) {\n var maxIndex = ruleText.length - 1;\n for (var i = 0; i < maxIndex; i += 1) {\n var char = ruleText.charAt(i);\n switch (char) {\n case '#':\n if (i + 4 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '$'\n && ruleText.charAt(i + 3) === '?'\n && ruleText.charAt(i + 4) === '#') {\n return [i, CosmeticRuleMarker.CssExtCSSException];\n }\n }\n if (i + 3 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.ElementHidingExtCSSException];\n }\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '$' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.CssException];\n }\n if (ruleText.charAt(i + 1) === '@'\n && ruleText.charAt(i + 2) === '%' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.JsException];\n }\n if (ruleText.charAt(i + 1) === '$'\n && ruleText.charAt(i + 2) === '?' && ruleText.charAt(i + 3) === '#') {\n return [i, CosmeticRuleMarker.CssExtCSS];\n }\n }\n if (i + 2 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.ElementHidingException];\n }\n if (ruleText.charAt(i + 1) === '?' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.ElementHidingExtCSS];\n }\n if (ruleText.charAt(i + 1) === '%' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.Js];\n }\n if (ruleText.charAt(i + 1) === '$' && ruleText.charAt(i + 2) === '#') {\n return [i, CosmeticRuleMarker.Css];\n }\n }\n if (i + 1 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '#') {\n // Handling false positives while looking for cosmetic rules in host files.\n //\n // For instance, it could look like this:\n // 127.0.0.1 localhost ## this is just a comment\n if (i > 0 && ruleText.charAt(i - 1) === ' ') {\n return [-1, null];\n }\n return [i, CosmeticRuleMarker.ElementHiding];\n }\n }\n break;\n case '$':\n if (i + 2 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '@' && ruleText.charAt(i + 2) === '$') {\n return [i, CosmeticRuleMarker.HtmlException];\n }\n }\n if (i + 1 <= maxIndex) {\n if (ruleText.charAt(i + 1) === '$') {\n return [i, CosmeticRuleMarker.Html];\n }\n }\n break;\n }\n }\n return [-1, null];\n}\n/**\n * Detects is the rule is extended css rule\n * @param marker - string to check\n */\nfunction isExtCssMarker(marker) {\n var EXTENDED_CSS_MARKERS = [\n CosmeticRuleMarker.CssExtCSS,\n CosmeticRuleMarker.CssExtCSSException,\n CosmeticRuleMarker.ElementHidingExtCSS,\n CosmeticRuleMarker.ElementHidingExtCSSException,\n ];\n return EXTENDED_CSS_MARKERS.indexOf(marker) !== -1;\n}\n/**\n * AdGuard scriptlet rule mask\n */\nvar ADG_SCRIPTLET_MASK = '//scriptlet';\n\nexport { ADG_SCRIPTLET_MASK, CosmeticRuleMarker, findCosmeticRuleMarker, isExtCssMarker };\n","import { s as splitByDelimiterWithEscapeCharacter, S as SimpleRegex, a as stringArraysEquals, b as stringArraysHaveIntersection, f as fastHash, i as indexOfAny, h as hasUnquotedSubstring } from './simple-regex-40f65170.js';\nexport { S as SimpleRegex, f as fastHash, d as fastHashBetween, h as hasUnquotedSubstring, i as indexOfAny, r as replaceAll, s as splitByDelimiterWithEscapeCharacter, c as startsAtIndexWith, a as stringArraysEquals, b as stringArraysHaveIntersection } from './simple-regex-40f65170.js';\nimport { getPublicSuffix, parse, getHostname } from 'tldts';\nimport scriptlets from '@adguard/scriptlets';\nimport { NETWORK_RULE_OPTIONS, NOT_MARK, OPTIONS_DELIMITER, ESCAPE_CHARACTER, MASK_ALLOWLIST } from './network-rule-options.js';\nexport { NETWORK_RULE_OPTIONS, OPTIONS_DELIMITER } from './network-rule-options.js';\nimport { RequestType } from './request-type.js';\nexport { RequestType } from './request-type.js';\nimport isCidr from 'is-cidr';\nimport isIp from 'is-ip';\nimport { contains } from 'cidr-tools';\nimport { findCosmeticRuleMarker, CosmeticRuleMarker, ADG_SCRIPTLET_MASK, isExtCssMarker } from './cosmetic-rule-marker.js';\nexport { CosmeticRuleMarker } from './cosmetic-rule-marker.js';\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\nfunction __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nvar __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\n/**\n * Compatibility types are used to configure engine for better support of different libraries\n * For example:\n * extension doesn't support $app modifier. So if we set in configuration CompatibilityTypes.Extension,\n * engine would ignore rules with $app modifier\n */\nvar CompatibilityTypes;\n(function (CompatibilityTypes) {\n CompatibilityTypes[CompatibilityTypes[\"Extension\"] = 1] = \"Extension\";\n CompatibilityTypes[CompatibilityTypes[\"CoreLibs\"] = 2] = \"CoreLibs\";\n CompatibilityTypes[CompatibilityTypes[\"Dns\"] = 4] = \"Dns\";\n})(CompatibilityTypes || (CompatibilityTypes = {}));\n/**\n * Application configuration class\n */\nvar Configuration = /** @class */ (function () {\n function Configuration(inputConfig) {\n this.defaultConfig = {\n engine: null,\n version: null,\n verbose: false,\n compatibility: null,\n };\n /**\n * {'extension'|'corelibs'} engine application type\n */\n this.engine = null;\n /**\n * {string} version\n */\n this.version = null;\n /**\n * {boolean} verbose flag\n */\n this.verbose = false;\n /**\n * compatibility flag\n */\n this.compatibility = CompatibilityTypes.Extension;\n var config = __assign(__assign({}, this.defaultConfig), inputConfig);\n this.engine = config.engine;\n this.version = config.version;\n this.verbose = config.verbose;\n this.compatibility = config.compatibility;\n }\n return Configuration;\n}());\n// eslint-disable-next-line import/no-mutable-exports\nvar config = new Configuration();\n/**\n * Checks config is compatible with input level\n * @param compatibilityLevel\n * @private\n */\nfunction isCompatibleWith(compatibilityLevel) {\n if (config.compatibility === null) {\n return false;\n }\n return (config.compatibility & compatibilityLevel) === compatibilityLevel;\n}\nvar setConfiguration = function (outerConfig) {\n config = new Configuration(outerConfig);\n};\n\n/**\n * This class stores found cosmetic css rules content in the appropriate collections\n * It is primarily used by the {@see CosmeticResult}\n */\nvar CosmeticStylesResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticStylesResult() {\n this.generic = [];\n this.specific = [];\n this.genericExtCss = [];\n this.specificExtCss = [];\n }\n /**\n * Appends rule to the appropriate collection\n * @param rule\n */\n CosmeticStylesResult.prototype.append = function (rule) {\n if (rule.isGeneric()) {\n if (rule.isExtendedCss()) {\n this.genericExtCss.push(rule);\n }\n else {\n this.generic.push(rule);\n }\n }\n else if (rule.isExtendedCss()) {\n this.specificExtCss.push(rule);\n }\n else {\n this.specific.push(rule);\n }\n };\n return CosmeticStylesResult;\n}());\n\n/**\n * This class stores found script rules content in the appropriate collections\n * It is primarily used by the {@see CosmeticResult}\n */\nvar CosmeticScriptsResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticScriptsResult() {\n this.generic = [];\n this.specific = [];\n }\n /**\n * Appends rule to appropriate collection\n * @param rule\n */\n CosmeticScriptsResult.prototype.append = function (rule) {\n if (rule.isGeneric()) {\n this.generic.push(rule);\n }\n else {\n this.specific.push(rule);\n }\n };\n /**\n * Returns rules collected\n */\n CosmeticScriptsResult.prototype.getRules = function () {\n return __spreadArray(__spreadArray([], this.generic, true), this.specific, true);\n };\n return CosmeticScriptsResult;\n}());\n\n/**\n * This class stores found cosmetic html rules content in the appropriate collections\n * It is primarily used by the {@see CosmeticResult}\n */\nvar CosmeticHtmlResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticHtmlResult() {\n this.generic = [];\n this.specific = [];\n }\n /**\n * Appends rule to the appropriate collection\n * @param rule\n */\n CosmeticHtmlResult.prototype.append = function (rule) {\n if (rule.isGeneric()) {\n this.generic.push(rule);\n }\n else {\n this.specific.push(rule);\n }\n };\n /**\n * Returns rules collected\n */\n CosmeticHtmlResult.prototype.getRules = function () {\n return __spreadArray(__spreadArray([], this.generic, true), this.specific, true);\n };\n return CosmeticHtmlResult;\n}());\n\n/**\n * Cosmetic result is the representation of rules\n * It is primarily used by the {@see CosmeticEngine}\n */\nvar CosmeticResult = /** @class */ (function () {\n /**\n * Constructor\n */\n function CosmeticResult() {\n this.elementHiding = new CosmeticStylesResult();\n this.CSS = new CosmeticStylesResult();\n this.JS = new CosmeticScriptsResult();\n this.Html = new CosmeticHtmlResult();\n }\n /**\n * Script rules\n */\n CosmeticResult.prototype.getScriptRules = function () {\n return this.JS.getRules();\n };\n return CosmeticResult;\n}());\n\n/**\n * CosmeticOption is the enumeration of various content script options.\n * Depending on the set of enabled flags the content script will contain different set of settings.\n */\nvar CosmeticOption;\n(function (CosmeticOption) {\n /**\n * if generic elemhide and CSS rules are enabled\n * Could be disabled by a $generichide rule and $elemhide rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionGenericCSS\"] = 2] = \"CosmeticOptionGenericCSS\";\n /**\n * if specific elemhide and CSS rules are enabled\n * Could be disabled by a $specifichide rule and $elemhide rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionSpecificCSS\"] = 4] = \"CosmeticOptionSpecificCSS\";\n /**\n * if JS rules and scriptlets are enabled\n * Could be disabled by a $jsinject rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionJS\"] = 8] = \"CosmeticOptionJS\";\n /**\n * if Html filtering rules are enabled\n * Could be disabled by a $content rule.\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionHtml\"] = 16] = \"CosmeticOptionHtml\";\n /**\n * TODO: Add support for these flags\n * They are useful when content script is injected into an iframe\n * In this case we can check what flags were applied to the top-level frame\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionSourceGenericCSS\"] = 32] = \"CosmeticOptionSourceGenericCSS\";\n CosmeticOption[CosmeticOption[\"CosmeticOptionSourceCSS\"] = 64] = \"CosmeticOptionSourceCSS\";\n CosmeticOption[CosmeticOption[\"CosmeticOptionSourceJS\"] = 128] = \"CosmeticOptionSourceJS\";\n /**\n * everything is enabled\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionAll\"] = 30] = \"CosmeticOptionAll\";\n /**\n * everything is disabled\n */\n CosmeticOption[CosmeticOption[\"CosmeticOptionNone\"] = 0] = \"CosmeticOptionNone\";\n})(CosmeticOption || (CosmeticOption = {}));\n\n/**\n * This is a helper class that is used specifically to work\n * with domains restrictions.\n *\n * There are two options how you can add a domain restriction:\n * * `$domain` modifier: https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier\n * * domains list for the cosmetic rules\n *\n * The only difference between them is that in one case we use `|` as a separator,\n * and in the other case - `,`.\n *\n * Examples:\n * * `||example.org^$domain=example.com|~sub.example.com` -- network rule\n * * `example.com,~sub.example.com##banner` -- cosmetic rule\n */\nvar DomainModifier = /** @class */ (function () {\n /**\n * Parses the `domains` string and initializes the object.\n *\n * @param domainsStr Domains string.\n * @param separator Separator — `,` or `|`.\n *\n * @throws An error if the domains string is empty or invalid\n */\n function DomainModifier(domainsStr, separator) {\n if (!domainsStr) {\n throw new SyntaxError('Modifier $domain cannot be empty');\n }\n var permittedDomains = [];\n var restrictedDomains = [];\n var parts = domainsStr.toLowerCase().split(separator);\n for (var i = 0; i < parts.length; i += 1) {\n var domain = parts[i].trim();\n var restricted = false;\n if (domain.startsWith('~')) {\n restricted = true;\n domain = domain.substring(1);\n }\n if (domain === '') {\n throw new SyntaxError(\"Empty domain specified in \\\"\".concat(domainsStr, \"\\\"\"));\n }\n if (restricted) {\n restrictedDomains.push(domain);\n }\n else {\n permittedDomains.push(domain);\n }\n }\n this.restrictedDomains = restrictedDomains.length > 0 ? restrictedDomains : null;\n this.permittedDomains = permittedDomains.length > 0 ? permittedDomains : null;\n }\n /**\n * isDomainOrSubdomainOfAny checks if `domain` is the same or a subdomain\n * of any of `domains`.\n *\n * @param domain - domain to check\n * @param domains - domains list to check against\n */\n DomainModifier.isDomainOrSubdomainOfAny = function (domain, domains) {\n for (var i = 0; i < domains.length; i += 1) {\n var d = domains[i];\n if (DomainModifier.isWildcardDomain(d)) {\n if (DomainModifier.matchAsWildcard(d, domain)) {\n return true;\n }\n }\n if (domain === d || (domain.endsWith(d) && domain.endsWith(\".\".concat(d)))) {\n return true;\n }\n }\n return false;\n };\n /**\n * Checks if domain ends with wildcard\n *\n * @param domain\n */\n DomainModifier.isWildcardDomain = function (domain) {\n return domain.endsWith('.*');\n };\n /**\n * Checks if wildcard matches domain\n *\n * @param wildcard\n * @param domainNameToCheck\n */\n DomainModifier.matchAsWildcard = function (wildcard, domainNameToCheck) {\n var wildcardedDomainToCheck = DomainModifier.genTldWildcard(domainNameToCheck);\n if (wildcardedDomainToCheck) {\n return wildcardedDomainToCheck === wildcard\n || (wildcardedDomainToCheck.endsWith(wildcard) && wildcardedDomainToCheck.endsWith(\".\".concat(wildcard)));\n }\n return false;\n };\n /**\n * Generates from domain tld wildcard e.g. google.com -> google.* ; youtube.co.uk -> youtube.*\n *\n * @param {string} domainName\n * @returns {string} string is empty if tld for provided domain name doesn't exists\n */\n DomainModifier.genTldWildcard = function (domainName) {\n var tld = getPublicSuffix(domainName);\n if (tld) {\n // lastIndexOf() is needed not to match the domain, e.g. 'www.chrono24.ch'.\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2312.\n return \"\".concat(domainName.slice(0, domainName.lastIndexOf(\".\".concat(tld))), \".*\");\n }\n return '';\n };\n return DomainModifier;\n}());\n/**\n * Comma separator\n */\nvar COMMA_SEPARATOR = ',';\n/**\n * Pipe separator\n */\nvar PIPE_SEPARATOR = '|';\n\nvar _a, _b;\n/**\n * Array of special modifiers allow to check for modifier name more efficient\n * by avoiding Object.values(SpecialModifier) calls in custom type-guard while\n * allowing the usage of 'const enum' for SpecialModifier\n */\nvar SpecialModifiers = [\n \"replace\" /* SpecialModifier.Replace */,\n \"removeparam\" /* SpecialModifier.Removeparam */,\n \"hls\" /* SpecialModifier.Hls */,\n];\nvar isSpecialModifierToken = function (token) { return token.type === \"specialModifier\" /* TokenType.SpecialModifier */; };\n/**\n * TODO (s.atroschenko) git rid of necessity of adding modifier names for simple regexp values (removaparam, hls):\n * use unified 'simple-regexp' pattern instead\n */\nvar modifiersPatterns = (_a = {},\n _a[\"replace\" /* SpecialModifier.Replace */] = [\"regexp\" /* Phase.Regexp */, \"replacement\" /* Phase.Replacement */, \"flags\" /* Phase.Flags */],\n _a[\"removeparam\" /* SpecialModifier.Removeparam */] = [\"regexp\" /* Phase.Regexp */, \"flags\" /* Phase.Flags */],\n _a[\"hls\" /* SpecialModifier.Hls */] = [\"regexp\" /* Phase.Regexp */, \"flags\" /* Phase.Flags */],\n _a);\n/**\n * Extracts modifier's plain value\n */\nvar parsePlainValue = function (string, startIndex) {\n var modifierValue = '';\n var modifierEndIndex = -1;\n var chars = [];\n for (var i = startIndex; i < string.length; i += 1) {\n var c = string[i];\n var isLastChar = i === (string.length - 1);\n var isUnescapedChar = i > 0 && !(string[i - 1] === \"\\\\\" /* SpecialCharacter.OptionEscape */);\n if ((c === \",\" /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) {\n if (isLastChar) {\n chars.push(c);\n }\n modifierValue = chars.join('');\n modifierEndIndex = i;\n break;\n }\n else {\n chars.push(c);\n }\n }\n return {\n modifierValue: modifierValue,\n modifierEndIndex: modifierEndIndex,\n };\n};\n/**\n * Extract modifier's regexp(-like) value\n *\n * @throws on invalid special modifier value\n */\nvar parseRegexpValue = function (string, startIndex, pattern) {\n var currentPhase;\n var nextPhase = (function () {\n var i = 0;\n return function () {\n if (i < pattern.length) {\n currentPhase = pattern[i];\n i += 1;\n return;\n }\n // Undefined phase indicates that there were more Regexp delimiters\n // than pattern implies and that makes modifier value invalid\n throw new Error('Invalid pattern for regexp modifier value.');\n };\n })();\n var modifierValue = '';\n var modifierEndIndex = -1;\n var chars = [];\n for (var i = startIndex; i < string.length; i += 1) {\n var c = string[i];\n var isLastChar = i === (string.length - 1);\n var isUnescapedChar = i > 0 && !(string[i - 1] === \"\\\\\" /* SpecialCharacter.OptionEscape */);\n if (c === \"/\" /* SpecialCharacter.RegexpDelimiter */ && isUnescapedChar) {\n // Step into the next pattern phase\n nextPhase();\n }\n if ((c === \",\" /* SpecialCharacter.OptionDelimiter */ && isUnescapedChar) || isLastChar) {\n // Skip unescaped commas that are part of regexp\n if (currentPhase === \"regexp\" /* Phase.Regexp */) {\n chars.push(c);\n continue;\n }\n if (isLastChar) {\n chars.push(c);\n }\n // Unescaped delimiter and/or last character indicates\n // the end of the modifier value, if current phase is the last one\n if (currentPhase === pattern[pattern.length - 1]) {\n modifierValue = chars.join('');\n modifierEndIndex = i;\n break;\n }\n else {\n throw new Error('Unexpected options delimiter or end of options string.');\n }\n }\n else {\n chars.push(c);\n }\n }\n return {\n modifierValue: modifierValue,\n modifierEndIndex: modifierEndIndex,\n };\n};\nvar modifierValueParsers = (_b = {},\n _b[\"regexp\" /* ModifierValueType.Regexp */] = parseRegexpValue,\n _b[\"plain\" /* ModifierValueType.Plain */] = parsePlainValue,\n _b);\n/**\n * Processes raw tokens by splitting token values by delimiter\n *\n * @param preprocessedTokens array of preprocessed tokens (of TokenType.SpecialModifier | TokenType.Raw type)\n * @param delimiter - delimiter\n * @param escapeCharacter - escape character\n * @param unescape if true, remove escape characters from string\n * @returns array of processed tokens\n */\nvar tokenize = function (preprocessedTokens, delimiter, escapeCharacter, unescape) {\n // Split raw tokens\n var nestedProcessedTokens = preprocessedTokens\n .map(function (token) {\n // Modifier tokens are already concrete tokens and are being passed down the pipeline here\n if (isSpecialModifierToken(token)) {\n return token;\n }\n var tokenValue = token.value;\n var tokens = [];\n var chars = [];\n var makeToken = function (type) {\n tokens.push({\n type: type,\n value: chars.join(''),\n });\n chars = [];\n };\n for (var i = 0; i < tokenValue.length; i += 1) {\n var c = tokenValue[i];\n if (c === delimiter) {\n var isEscaped = i > 0 && tokenValue[i - 1] === escapeCharacter;\n if (isEscaped) {\n if (unescape) {\n chars.splice(chars.length - 1, 1);\n }\n chars.push(c);\n }\n else {\n // Don't make token with '' value\n // when raw token starts with a delimiter\n if (chars.length !== 0) {\n makeToken(\"string\" /* TokenType.String */);\n }\n chars.push(c);\n makeToken(\"delim\" /* TokenType.Delimiter */);\n }\n }\n else {\n chars.push(c);\n // Last character case\n if (i === (tokenValue.length - 1)) {\n makeToken(\"string\" /* TokenType.String */);\n }\n }\n }\n return tokens;\n });\n // Flatten the result\n var processedTokens = [];\n for (var i = 0; i < nestedProcessedTokens.length; i += 1) {\n var currentVal = nestedProcessedTokens[i];\n if (Array.isArray(currentVal)) {\n processedTokens.push.apply(processedTokens, currentVal);\n }\n else {\n processedTokens.push(currentVal);\n }\n }\n return processedTokens;\n};\n/**\n * Converts arrays of tokens into array of their values\n *\n * @param tokens array of arbitrary tokens\n * @returns array of tokens' values\n */\nvar makeWords = function (tokens) {\n var words = [];\n for (var i = 0; i < tokens.length; i += 1) {\n var token = tokens[i];\n if (token.type !== \"delim\" /* TokenType.Delimiter */) {\n words.push(token.value);\n }\n }\n return words;\n};\n/**\n * Parses special modifier value\n *\n * @param modifierName name of modifier to be parsed\n * @param string options string\n * @returns object with Modifier token value and next index to keep iterating from\n */\nfunction parseSpecialModifier(modifierName, string) {\n var tokenValue = \"\".concat(modifierName).concat(\"=\" /* SpecialCharacter.ModifierValueMarker */);\n var modifierValueStartIndex = string.indexOf(tokenValue) + tokenValue.length;\n // Define modifier value type\n var valueType = string[modifierValueStartIndex] === \"/\" /* SpecialCharacter.RegexpDelimiter */\n ? \"regexp\" /* ModifierValueType.Regexp */\n : \"plain\" /* ModifierValueType.Plain */;\n // Pick parser for specific type of modifier value\n var parser = modifierValueParsers[valueType];\n // Get pattern of current modifier\n var pattern = modifiersPatterns[modifierName];\n var _a = parser(string, modifierValueStartIndex, pattern), modifierValue = _a.modifierValue, modifierEndIndex = _a.modifierEndIndex;\n if (modifierEndIndex === -1) {\n throw new Error(\"Invalid $\".concat(modifierName, \" modifier value.\"));\n }\n tokenValue += modifierValue;\n var nextIndex = modifierEndIndex;\n return {\n tokenValue: tokenValue,\n nextIndex: nextIndex,\n };\n}\n/**\n * Converts options string into array of Raw and Modifier tokens\n *\n * @param string options string\n * @returns array of preprocessed tokens\n */\nfunction splitBySpecialModifierTokens(string) {\n var tokens = [];\n var chars = [];\n var makeToken = function (tokenType, tokenValue) {\n tokens.push({\n type: tokenType,\n value: tokenValue,\n });\n chars = [];\n };\n for (var i = 0; i < string.length; i += 1) {\n var c = string[i];\n var isUnescapedChar = i > 0 && !(string[i - 1] === \"\\\\\" /* SpecialCharacter.OptionEscape */);\n if (c === \"=\" /* SpecialCharacter.ModifierValueMarker */ && isUnescapedChar) {\n // Parse current chars array to get modifier name\n // Assume that modifier name is everything after last ',' and before current '='\n var charsStr = chars.join('');\n var lastCommaIndex = charsStr.lastIndexOf(\",\" /* SpecialCharacter.OptionDelimiter */, i);\n // Assertion is used to avoid type-guard for SpecialModifier, making it faster,\n // and reduce call stack size\n var modifierName = charsStr.substring(lastCommaIndex + 1);\n // Check if this is modifier that requires custom parsing logic\n if (!SpecialModifiers.includes(modifierName)) {\n chars.push(c);\n // Last character case\n if (i === (string.length - 1)) {\n makeToken(\"raw\" /* TokenType.Raw */, charsStr);\n }\n continue;\n }\n // Remove modifier name from char stack,\n // make token from whats left and empty chars\n makeToken(\"raw\" /* TokenType.Raw */, charsStr.substring(0, charsStr.lastIndexOf(modifierName)));\n // Extract predefined token value and next iteration index\n // Token value includes both name, separator('=') and value of modifier\n var _a = parseSpecialModifier(modifierName, string), tokenValue = _a.tokenValue, nextIndex = _a.nextIndex;\n makeToken(\"specialModifier\" /* TokenType.SpecialModifier */, tokenValue);\n i = nextIndex;\n }\n else {\n chars.push(c);\n // Last character case\n if (i === (string.length - 1)) {\n makeToken(\"raw\" /* TokenType.Raw */, chars.join(''));\n }\n }\n }\n return tokens;\n}\n/**\n * Splits options string into array of modifier=value pairs\n *\n * @param string - string to split\n * @param unescape - if true, remove escape characters from string\n * @return array of string parts\n * @throws on invalid special modifier value\n */\nfunction parseOptionsString(string, unescape) {\n if (unescape === void 0) { unescape = true; }\n if (!string) {\n return [];\n }\n if (string.startsWith(\",\" /* SpecialCharacter.OptionDelimiter */)) {\n // eslint-disable-next-line no-param-reassign\n string = string.substring(1);\n }\n /**\n * Extract modifier tokens for modifiers that require custom parsing\n * https://github.com/AdguardTeam/tsurlfilter/issues/79\n */\n var preprocessedTokens = splitBySpecialModifierTokens(string);\n /**\n * Split raw tokens by delimiter\n */\n var tokens = tokenize(preprocessedTokens, \",\" /* SpecialCharacter.OptionDelimiter */, \"\\\\\" /* SpecialCharacter.OptionEscape */, unescape);\n /**\n * Join tokens into words\n */\n return makeWords(tokens);\n}\n\n/**\n * Replace modifier class\n */\nvar ReplaceModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function ReplaceModifier(value) {\n var parsed = ReplaceModifier.parseReplaceOption(value);\n this.replaceOption = parsed.optionText;\n this.replaceApply = parsed.apply;\n }\n /**\n *\n * @param option\n */\n ReplaceModifier.parseReplaceOption = function (option) {\n if (!option) {\n return {\n apply: function (x) { return x; },\n optionText: '',\n };\n }\n var parts = splitByDelimiterWithEscapeCharacter(option, '/', '\\\\', true);\n var modifiers = (parts[2] || '');\n if (modifiers.indexOf('g') < 0) {\n modifiers += 'g';\n }\n var pattern = new RegExp(parts[0], modifiers);\n // unescape replacement alias\n var replacement = parts[1].replace(/\\\\\\$/g, '$');\n replacement = SimpleRegex.unescapeSpecials(replacement);\n var apply = function (input) { return input.replace(pattern, replacement); };\n return {\n apply: apply,\n optionText: option,\n };\n };\n /**\n * Replace content\n */\n ReplaceModifier.prototype.getValue = function () {\n return this.replaceOption;\n };\n /**\n * Replace apply function\n */\n ReplaceModifier.prototype.getApplyFunc = function () {\n return this.replaceApply;\n };\n return ReplaceModifier;\n}());\n\n/**\n * Csp modifier class\n */\nvar CspModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n * @param isAllowlist\n */\n function CspModifier(value, isAllowlist) {\n this.cspDirective = value;\n this.isAllowlist = isAllowlist;\n this.validateCspDirective();\n }\n /**\n * Csp directive\n */\n CspModifier.prototype.getValue = function () {\n return this.cspDirective;\n };\n /**\n * Validates CSP rule\n */\n CspModifier.prototype.validateCspDirective = function () {\n /**\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685\n * CSP directive may be empty in case of allowlist rule,\n * it means to disable all $csp rules matching the allowlist rule\n */\n if (!this.isAllowlist && !this.cspDirective) {\n throw new Error('Invalid $CSP rule: CSP directive must not be empty');\n }\n if (this.cspDirective) {\n /**\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/685#issue-228287090\n * Forbids report-to and report-uri directives\n */\n var cspDirective = this.cspDirective.toLowerCase();\n if (cspDirective.indexOf('report-') >= 0) {\n throw new Error(\"Forbidden CSP directive: \".concat(cspDirective));\n }\n }\n };\n return CspModifier;\n}());\n\n/**\n * Cookie modifier class\n *\n * Learn more about it here:\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/961\n */\nvar CookieModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function CookieModifier(value) {\n // Save the source text of the option modifier\n this.optionValue = value || '';\n this.regex = null;\n this.cookieName = null;\n this.sameSite = null;\n this.maxAge = null;\n // Parse cookie name/regex\n var parts = this.optionValue.split(/;/);\n if (parts.length < 1) {\n throw new Error(\"Cannot parse \".concat(this.optionValue));\n }\n var cookieName = parts[0];\n if (cookieName.startsWith('/') && cookieName.endsWith('/')) {\n var pattern = cookieName.substring(1, cookieName.length - 1);\n // Save regex to be used further for matching cookies\n this.regex = new RegExp(pattern);\n }\n else {\n // Match by cookie name\n this.cookieName = cookieName;\n }\n // Parse other cookie options\n if (parts.length > 1) {\n for (var i = 1; i < parts.length; i += 1) {\n var nameValue = parts[i].split('=');\n var optionName = nameValue[0];\n var optionValue = nameValue[1];\n if (optionName === CookieModifier.MAX_AGE) {\n this.maxAge = parseInt(optionValue, 10);\n }\n else if (optionName === CookieModifier.SAME_SITE) {\n this.sameSite = optionValue;\n }\n else {\n throw new Error(\"Unknown $cookie option: \".concat(optionName));\n }\n }\n }\n }\n /**\n * Modifier value\n */\n CookieModifier.prototype.getValue = function () {\n return this.optionValue;\n };\n /**\n * First cookie name\n */\n CookieModifier.prototype.getCookieName = function () {\n return this.cookieName;\n };\n /**\n * Max age cookie value\n */\n CookieModifier.prototype.getMaxAge = function () {\n return this.maxAge;\n };\n /**\n * Same site cookie value\n */\n CookieModifier.prototype.getSameSite = function () {\n return this.sameSite;\n };\n /**\n * Checks if cookie with the specified name matches this option\n *\n * @param {string} name Cookie name\n * @return {boolean} true if it does\n */\n CookieModifier.prototype.matches = function (name) {\n if (!name) {\n return false;\n }\n if (this.regex) {\n return this.regex.test(name);\n }\n if (this.cookieName) {\n return this.cookieName === name;\n }\n // Empty regex and cookieName means that we must match all cookies\n return true;\n };\n /**\n * Checks if cookie rule has an empty $cookie option\n *\n * @return {boolean} True if $cookie option is empty\n */\n CookieModifier.prototype.isEmpty = function () {\n return !this.regex && !this.cookieName;\n };\n /**\n * Cookie name maxAge\n */\n CookieModifier.MAX_AGE = 'maxAge';\n /**\n * Cookie name sameSite\n */\n CookieModifier.SAME_SITE = 'sameSite';\n return CookieModifier;\n}());\n\n/**\n * Redirect modifier class\n */\nvar RedirectModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n * @param ruleText\n * @param isAllowlist\n * @param isRedirectingOnlyBlocked is redirect-rule modifier\n */\n function RedirectModifier(value, ruleText, isAllowlist, isRedirectingOnlyBlocked) {\n if (isRedirectingOnlyBlocked === void 0) { isRedirectingOnlyBlocked = false; }\n /**\n * Is redirecting only blocked requests\n * See $redirect-rule options\n */\n this.isRedirectingOnlyBlocked = false;\n RedirectModifier.validate(ruleText, value, isAllowlist);\n this.redirectTitle = value;\n this.isRedirectingOnlyBlocked = isRedirectingOnlyBlocked;\n }\n /**\n * Redirect title\n */\n RedirectModifier.prototype.getValue = function () {\n return this.redirectTitle;\n };\n /**\n * Validates redirect rule\n *\n * @param ruleText\n * @param redirectTitle\n * @param isAllowlist\n */\n RedirectModifier.validate = function (ruleText, redirectTitle, isAllowlist) {\n if (isAllowlist && !redirectTitle) {\n return;\n }\n if (!redirectTitle) {\n throw new SyntaxError('Invalid $redirect rule, redirect value must not be empty');\n }\n var redirects = scriptlets.redirects;\n var ruleTextToValidate = ruleText.replace(NETWORK_RULE_OPTIONS.REDIRECTRULE, NETWORK_RULE_OPTIONS.REDIRECT);\n if (!redirects.isAdgRedirectRule(ruleTextToValidate) || !redirects.isValidAdgRedirectRule(ruleTextToValidate)) {\n throw new SyntaxError('$redirect modifier is invalid');\n }\n };\n return RedirectModifier;\n}());\n\n/**\n * Splits url into parts\n *\n * @param url\n */\nfunction splitUrl(url) {\n var strippedUrl = url;\n var hash = '';\n var hashIndex = url.indexOf('#');\n if (hashIndex >= 0) {\n hash = url.slice(hashIndex);\n strippedUrl = url.slice(0, hashIndex);\n }\n var query = '';\n var queryIndex = url.indexOf('?');\n if (queryIndex >= 0) {\n query = strippedUrl.slice(queryIndex + 1);\n strippedUrl = strippedUrl.slice(0, queryIndex);\n }\n return {\n path: strippedUrl,\n query: query,\n hash: hash,\n };\n}\n/**\n * Normalizes url query parameters\n *\n * @param query\n */\nfunction normalizeQuery(query) {\n // Cleanup empty params (p0=0&=2&=3)\n var result = query\n .split('&')\n .filter(function (x) { return x && !x.startsWith('='); })\n .join('&');\n // If we've collapsed the URL to the point where there's an '&' against the '?'\n // then we need to get rid of that.\n while (result.charAt(0) === '&') {\n result = result.substr(1);\n }\n return result;\n}\n/**\n * Removes query params from url by regexp\n *\n * @param url\n * @param regExp\n * @param invert remove every parameter in url except the ones matched regexp\n */\nfunction cleanUrlParamByRegExp(url, regExp, invert) {\n if (invert === void 0) { invert = false; }\n var searchIndex = url.indexOf('?');\n // If no params, nothing to modify\n if (searchIndex === -1) {\n return url;\n }\n var split = splitUrl(url);\n var modifiedQuery;\n if (invert) {\n modifiedQuery = split.query\n .split('&')\n .filter(function (x) { return x; })\n .filter(function (x) { return x && x.match(regExp); })\n .join('&');\n }\n else {\n modifiedQuery = split.query\n .split('&')\n .filter(function (x) {\n var test = x.includes('=') ? x : \"\".concat(x, \"=\");\n return !test.match(regExp);\n })\n .join('&');\n }\n // Do not normalize if regexp is not applied\n if (modifiedQuery === split.query) {\n return url;\n }\n modifiedQuery = normalizeQuery(modifiedQuery);\n var result = split.path;\n if (modifiedQuery) {\n result += \"?\".concat(modifiedQuery);\n }\n return result + split.hash;\n}\nvar DOMAIN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+$/;\n/**\n * Check if the string could be a domain name\n *\n * @param text\n */\nvar isDomainName = function (text) {\n if (text.indexOf('.') < 0 || text.endsWith('.')) {\n return false;\n }\n return DOMAIN_REGEX.test(text);\n};\n/**\n * Extract relative part from hierarchical structured URL\n * @param url\n */\nvar getRelativeUrl = function (url) {\n var i = url.indexOf('/', url.indexOf('://') + 3);\n return i !== -1 ? url.substr(i) : null;\n};\n\n/**\n * Query parameters filtering modifier class\n * Works with '$removeparam' modifier\n */\nvar RemoveParamModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function RemoveParamModifier(value) {\n /**\n * Is modifier valid for MV3 or not\n */\n this.mv3Valid = true;\n this.value = value;\n var rawValue = value;\n // TODO: Seems like negation not using in valueRegExp\n if (value.startsWith('~')) {\n rawValue = value.substring(1);\n this.mv3Valid = false;\n }\n if (rawValue.startsWith('/')) {\n this.valueRegExp = SimpleRegex.patternFromString(rawValue);\n this.mv3Valid = false;\n }\n else {\n if (rawValue.includes('|')) {\n throw new Error('Unsupported option in $removeparam: multiple values are not allowed');\n }\n this.valueRegExp = new RegExp(\"((^|&)(\".concat(SimpleRegex.escapeRegexSpecials(rawValue), \")=[^&#]*)\"), 'g');\n }\n }\n /**\n * Modifier value\n */\n RemoveParamModifier.prototype.getValue = function () {\n return this.value;\n };\n /**\n * Is modifier valid for MV3 or not\n */\n RemoveParamModifier.prototype.getMV3Validity = function () {\n return this.mv3Valid;\n };\n /**\n * Removes query parameters from url\n *\n * @param url\n */\n RemoveParamModifier.prototype.removeParameters = function (url) {\n var sepIndex = url.indexOf('?');\n if (sepIndex < 0) {\n return url;\n }\n if (!this.value) {\n return url.substring(0, sepIndex);\n }\n if (sepIndex === url.length - 1) {\n return url;\n }\n if (this.value.startsWith('~')) {\n return cleanUrlParamByRegExp(url, this.valueRegExp, true);\n }\n return cleanUrlParamByRegExp(url, this.valueRegExp);\n };\n return RemoveParamModifier;\n}());\n\n/**\n * Headers filtering modifier class.\n * Rules with $removeheader modifier are intended to remove headers from HTTP requests and responses.\n */\nvar RemoveHeaderModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n * @param isAllowlist\n */\n function RemoveHeaderModifier(value, isAllowlist) {\n this.value = value.toLowerCase();\n if (!isAllowlist && !this.value) {\n throw new SyntaxError('Invalid $removeheader rule, removeheader value must not be empty');\n }\n this.isRequestModifier = this.value.startsWith(RemoveHeaderModifier.REQUEST_PREFIX);\n var headerName = this.isRequestModifier\n ? this.value.substring(RemoveHeaderModifier.REQUEST_PREFIX.length)\n : this.value;\n // Values with \":\" are not supported in MV3 declarative rules, e.g. \"$removeheader=dnt:1\"\n this.valid = RemoveHeaderModifier.isAllowedHeader(headerName) && !headerName.includes(':');\n this.applicableHeaderName = this.valid ? headerName : null;\n }\n /**\n * Modifier value\n */\n RemoveHeaderModifier.prototype.getValue = function () {\n return this.value;\n };\n Object.defineProperty(RemoveHeaderModifier.prototype, \"isValid\", {\n /**\n * Modifier validity\n */\n get: function () {\n return this.valid;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns effective header name to be removed\n *\n * @param isRequestHeaders\n */\n RemoveHeaderModifier.prototype.getApplicableHeaderName = function (isRequestHeaders) {\n if (!this.applicableHeaderName) {\n return null;\n }\n if (isRequestHeaders !== this.isRequestModifier) {\n return null;\n }\n return this.applicableHeaderName;\n };\n /**\n * Some headers are forbidden to remove\n *\n * @param headerName\n */\n RemoveHeaderModifier.isAllowedHeader = function (headerName) {\n return !this.FORBIDDEN_HEADERS.includes(headerName);\n };\n /**\n * List of forbidden headers\n */\n RemoveHeaderModifier.FORBIDDEN_HEADERS = [\n 'access-control-allow-origin',\n 'access-control-allow-credentials',\n 'access-control-allow-headers',\n 'access-control-allow-methods',\n 'access-control-expose-headers',\n 'access-control-max-age',\n 'access-control-request-headers',\n 'access-control-request-method',\n 'origin',\n 'timing-allow-origin',\n 'allow',\n 'cross-origin-embedder-policy',\n 'cross-origin-opener-policy',\n 'cross-origin-resource-policy',\n 'content-security-policy',\n 'content-security-policy-report-only',\n 'expect-ct',\n 'feature-policy',\n 'origin-isolation',\n 'strict-transport-security',\n 'upgrade-insecure-requests',\n 'x-content-type-options',\n 'x-download-options',\n 'x-frame-options',\n 'x-permitted-cross-domain-policies',\n 'x-powered-by',\n 'x-xss-protection',\n 'public-key-pins',\n 'public-key-pins-report-only',\n 'sec-websocket-key',\n 'sec-websocket-extensions',\n 'sec-websocket-accept',\n 'sec-websocket-protocol',\n 'sec-websocket-version',\n 'p3p',\n 'sec-fetch-mode',\n 'sec-fetch-dest',\n 'sec-fetch-site',\n 'sec-fetch-user',\n 'referrer-policy',\n 'content-type',\n 'content-length',\n 'accept',\n 'accept-encoding',\n 'host',\n 'connection',\n 'transfer-encoding',\n 'upgrade',\n ];\n /**\n * Request prefix\n */\n RemoveHeaderModifier.REQUEST_PREFIX = 'request:';\n return RemoveHeaderModifier;\n}());\n\nvar ErrorStatusCodes;\n(function (ErrorStatusCodes) {\n ErrorStatusCodes[ErrorStatusCodes[\"ComplexRegex\"] = 1001] = \"ComplexRegex\";\n ErrorStatusCodes[ErrorStatusCodes[\"RuleLimit\"] = 1002] = \"RuleLimit\";\n ErrorStatusCodes[ErrorStatusCodes[\"RegexpRuleLimit\"] = 1003] = \"RegexpRuleLimit\";\n ErrorStatusCodes[ErrorStatusCodes[\"RemoveparamRegexpIsNotSupported\"] = 1004] = \"RemoveparamRegexpIsNotSupported\";\n ErrorStatusCodes[ErrorStatusCodes[\"RemoveparamInversionIsNotSupported\"] = 1005] = \"RemoveparamInversionIsNotSupported\";\n})(ErrorStatusCodes || (ErrorStatusCodes = {}));\nvar SEPARATOR = '|';\n\n/**\n * This is a helper class that is used specifically to work with app restrictions.\n *\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app\n *\n * Examples:\n * ||baddomain.com^$app=org.example.app\n * ||baddomain.com^$app=org.example.app1|org.example.app2\n */\nvar AppModifier = /** @class */ (function () {\n /**\n * Parses the `apps` string\n *\n * @param apps - apps string\n *\n * @throws an error if the app string is empty or invalid\n */\n function AppModifier(apps) {\n if (!apps) {\n throw new SyntaxError('$app modifier cannot be empty');\n }\n var permittedApps = [];\n var restrictedApps = [];\n var parts = apps.split(SEPARATOR);\n for (var i = 0; i < parts.length; i += 1) {\n var app = parts[i];\n var restricted = false;\n if (app.startsWith('~')) {\n restricted = true;\n app = app.substring(1).trim();\n }\n if (app === '') {\n throw new SyntaxError(\"Empty app specified in \\\"\".concat(apps, \"\\\"\"));\n }\n if (restricted) {\n restrictedApps.push(app);\n }\n else {\n permittedApps.push(app);\n }\n }\n this.restrictedApps = restrictedApps.length > 0 ? restrictedApps : null;\n this.permittedApps = permittedApps.length > 0 ? permittedApps : null;\n }\n return AppModifier;\n}());\n\nvar HTTPMethod;\n(function (HTTPMethod) {\n HTTPMethod[\"GET\"] = \"GET\";\n HTTPMethod[\"POST\"] = \"POST\";\n HTTPMethod[\"PUT\"] = \"PUT\";\n HTTPMethod[\"DELETE\"] = \"DELETE\";\n HTTPMethod[\"PATCH\"] = \"PATCH\";\n HTTPMethod[\"HEAD\"] = \"HEAD\";\n HTTPMethod[\"OPTIONS\"] = \"OPTIONS\";\n HTTPMethod[\"CONNECT\"] = \"CONNECT\";\n HTTPMethod[\"TRACE\"] = \"TRACE\";\n})(HTTPMethod || (HTTPMethod = {}));\n/**\n * Method modifier class.\n * Rules with $method modifier will be applied only to requests with specified methods.\n *\n * Learn more about it here:\n * https://adguard.com/kb/general/ad-filtering/create-own-filters/#method-modifier\n */\nvar MethodModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function MethodModifier(methodsStr) {\n if (methodsStr === '') {\n throw new SyntaxError('$method modifier value cannot be empty');\n }\n var permittedMethods = [];\n var restrictedMethods = [];\n var parts = methodsStr.toUpperCase().split(MethodModifier.PIPE_SEPARATOR);\n for (var i = 0; i < parts.length; i += 1) {\n var method = parts[i].trim();\n var restricted = false;\n if (method.startsWith('~')) {\n restricted = true;\n method = method.substring(1);\n }\n if (!MethodModifier.isHTTPMethod(method)) {\n throw new SyntaxError(\"Invalid $method modifier value: \".concat(method));\n }\n if (restricted) {\n restrictedMethods.push(method);\n }\n else {\n permittedMethods.push(method);\n }\n }\n if (restrictedMethods.length > 0 && permittedMethods.length > 0) {\n throw new SyntaxError(\"Negated values cannot be mixed with non-negated values: \".concat(methodsStr));\n }\n this.restrictedValues = restrictedMethods.length > 0 ? restrictedMethods : null;\n this.permittedValues = permittedMethods.length > 0 ? permittedMethods : null;\n }\n /**\n * Request methods separator\n */\n MethodModifier.PIPE_SEPARATOR = '|';\n MethodModifier.isHTTPMethod = function (value) { return value in HTTPMethod; };\n return MethodModifier;\n}());\n\n/**\n * To modifier class.\n * Rules with $to modifier are limited to requests made to the specified domains and their subdomains.\n *\n * Learn more about it here:\n * https://adguard.com/kb/general/ad-filtering/create-own-filters/#to-modifier\n */\nvar ToModifier = /** @class */ (function () {\n /**\n * Constructor\n */\n function ToModifier(domainsStr) {\n if (!domainsStr) {\n throw new SyntaxError('$to modifier value cannot be empty');\n }\n var permittedDomains = [];\n var restrictedDomains = [];\n var parts = domainsStr.toLowerCase().split(ToModifier.PIPE_SEPARATOR);\n for (var i = 0; i < parts.length; i += 1) {\n var domain = parts[i].trim();\n var restricted = false;\n if (domain.startsWith('~')) {\n restricted = true;\n domain = domain.substring(1);\n }\n if (domain === '') {\n throw new SyntaxError(\"Empty domain specified in \\\"\".concat(domainsStr, \"\\\"\"));\n }\n if (restricted) {\n restrictedDomains.push(domain);\n }\n else {\n permittedDomains.push(domain);\n }\n }\n this.restrictedValues = restrictedDomains.length > 0 ? restrictedDomains : null;\n this.permittedValues = permittedDomains.length > 0 ? permittedDomains : null;\n }\n /**\n * Domains separator\n */\n ToModifier.PIPE_SEPARATOR = '|';\n return ToModifier;\n}());\n\n/**\n * Checks if error has message.\n *\n * @param error Error object.\n * @returns If param is error.\n */\nfunction isErrorWithMessage(error) {\n return (typeof error === 'object'\n && error !== null\n && 'message' in error\n && typeof error.message === 'string');\n}\n/**\n * Converts error to the error with message.\n *\n * @param maybeError Possible error.\n * @returns Error with message.\n */\nfunction toErrorWithMessage(maybeError) {\n if (isErrorWithMessage(maybeError)) {\n return maybeError;\n }\n try {\n return new Error(JSON.stringify(maybeError));\n }\n catch (_a) {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n/**\n * Converts error object to error with message. This method might be helpful to handle thrown errors.\n *\n * @param error Error object.\n *\n * @returns Message of the error.\n */\nfunction getErrorMessage(error) {\n return toErrorWithMessage(error).message;\n}\n\n/**\n * This is the base class representing double values modifiers\n */\nvar BaseValuesModifier = /** @class */ (function () {\n /**\n * Parses the values string\n *\n * @param values - values string\n *\n * @throws an error if the string is empty or invalid\n */\n function BaseValuesModifier(values) {\n if (!values) {\n throw new SyntaxError('Modifier cannot be empty');\n }\n this.value = values;\n var permittedValues = [];\n var restrictedValues = [];\n var parts = values.split(SEPARATOR);\n for (var i = 0; i < parts.length; i += 1) {\n var app = parts[i];\n var restricted = false;\n if (app.startsWith('~')) {\n restricted = true;\n app = app.substring(1).trim();\n }\n if (app === '') {\n throw new SyntaxError(\"Empty values specified in \\\"\".concat(values, \"\\\"\"));\n }\n if (restricted) {\n restrictedValues.push(app);\n }\n else {\n permittedValues.push(app);\n }\n }\n this.restricted = restrictedValues.length > 0 ? restrictedValues : null;\n this.permitted = permittedValues.length > 0 ? permittedValues : null;\n }\n BaseValuesModifier.prototype.getPermitted = function () {\n return this.permitted;\n };\n BaseValuesModifier.prototype.getRestricted = function () {\n return this.restricted;\n };\n BaseValuesModifier.prototype.getValue = function () {\n return this.value;\n };\n BaseValuesModifier.prototype.match = function (value) {\n if (!this.restricted && !this.permitted) {\n return true;\n }\n if (this.restricted && this.restricted.includes(value)) {\n return false;\n }\n if (this.permitted) {\n return this.permitted.includes(value);\n }\n return true;\n };\n return BaseValuesModifier;\n}());\n\n/**\n * Netmasks class\n */\nvar NetmasksCollection = /** @class */ (function () {\n function NetmasksCollection() {\n this.ipv4Masks = [];\n this.ipv6Masks = [];\n }\n /**\n * Returns true if any of the containing masks contains provided value\n *\n * @param value\n */\n NetmasksCollection.prototype.contains = function (value) {\n if (isIp.v4(value)) {\n return this.ipv4Masks.some(function (x) { return contains(x, value); });\n }\n return this.ipv6Masks.some(function (x) { return contains(x, value); });\n };\n return NetmasksCollection;\n}());\n/**\n * The client modifier allows specifying clients this rule will be working for.\n * It accepts client names (not ClientIDs), IP addresses, or CIDR ranges.\n */\nvar ClientModifier = /** @class */ (function (_super) {\n __extends(ClientModifier, _super);\n /**\n * Constructor\n *\n * @param value\n */\n function ClientModifier(value) {\n var _this = _super.call(this, value) || this;\n var permitted = _this.getPermitted();\n if (permitted) {\n _this.permitted = ClientModifier.stripValues(permitted);\n _this.permittedNetmasks = ClientModifier.parseNetmasks(_this.permitted);\n }\n var restricted = _this.getRestricted();\n if (restricted) {\n _this.restricted = ClientModifier.stripValues(restricted);\n _this.restrictedNetmasks = ClientModifier.parseNetmasks(_this.restricted);\n }\n return _this;\n }\n /**\n * Unquotes and unescapes string\n *\n * @param values\n */\n ClientModifier.stripValues = function (values) {\n return values.map(function (v) {\n if ((v.startsWith('\"') && v.endsWith('\"'))\n || (v.startsWith('\\'') && v.endsWith('\\''))) {\n // eslint-disable-next-line no-param-reassign\n v = v.substr(1, v.length - 2);\n }\n return v.replace(/\\\\/ig, '');\n });\n };\n /**\n * Checks if this modifier matches provided params\n *\n * @param clientName\n * @param clientIP\n */\n ClientModifier.prototype.matchAny = function (clientName, clientIP) {\n if (this.restricted) {\n if (clientName && this.restricted.includes(clientName)) {\n return false;\n }\n if (clientIP && this.restricted.includes(clientIP)) {\n return false;\n }\n return true;\n }\n if (this.restrictedNetmasks) {\n if (clientIP && this.restrictedNetmasks.contains(clientIP)) {\n return false;\n }\n return true;\n }\n if (this.permitted) {\n if (clientName && this.permitted.includes(clientName)) {\n return true;\n }\n if (clientIP && this.permitted.includes(clientIP)) {\n return true;\n }\n }\n if (this.permittedNetmasks) {\n if (clientIP && this.permittedNetmasks.contains(clientIP)) {\n return true;\n }\n }\n return false;\n };\n /**\n * Parses netmasks from client's strings\n *\n * @param values\n */\n ClientModifier.parseNetmasks = function (values) {\n var result = new NetmasksCollection();\n values.forEach(function (x) {\n var cidrVersion = isCidr(x);\n if (cidrVersion === 4) {\n result.ipv4Masks.push(x);\n }\n else if (cidrVersion === 6) {\n result.ipv6Masks.push(x);\n }\n });\n return result;\n };\n return ClientModifier;\n}(BaseValuesModifier));\n\n/**\n * The dnsrewrite response modifier allows replacing the content of the response\n * to the DNS request for the matching hosts.\n *\n * TODO: This modifier is not yet implemented\n * https://github.com/AdguardTeam/AdGuardHome/wiki/Hosts-Blocklists#dnsrewrite\n */\nvar DnsRewriteModifier = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param value\n */\n function DnsRewriteModifier(value) {\n this.value = value;\n }\n /**\n * Modifier value\n */\n DnsRewriteModifier.prototype.getValue = function () {\n return this.value;\n };\n return DnsRewriteModifier;\n}());\n\n/**\n * The dnstype modifier allows specifying DNS request type on which this rule will be triggered.\n */\nvar DnsTypeModifier = /** @class */ (function (_super) {\n __extends(DnsTypeModifier, _super);\n /**\n * Constructor\n *\n * @param value\n */\n function DnsTypeModifier(value) {\n var _this = _super.call(this, value) || this;\n if (_this.permitted) {\n _this.restricted = null;\n }\n return _this;\n }\n return DnsTypeModifier;\n}(BaseValuesModifier));\n\n/**\n * The ctag modifier allows to block domains only for specific types of DNS client tags.\n */\nvar CtagModifier = /** @class */ (function (_super) {\n __extends(CtagModifier, _super);\n /**\n * Constructor\n *\n * @param value\n */\n function CtagModifier(value) {\n var _this = _super.call(this, value) || this;\n _this.validate();\n return _this;\n }\n /**\n * Validates tag values\n */\n CtagModifier.prototype.validate = function () {\n if (!this.getValue()) {\n throw new Error('Invalid rule: Ctag modifier must not be empty');\n }\n var tags = this.permitted ? this.permitted : this.restricted;\n if (tags && tags.some(function (x) { return !CtagModifier.ALLOWED_TAGS.includes(x); })) {\n throw new Error('Invalid rule: Invalid ctag modifier');\n }\n };\n /**\n * The list of allowed tags\n */\n CtagModifier.ALLOWED_TAGS = [\n // By device type:\n 'device_audio',\n 'device_camera',\n 'device_gameconsole',\n 'device_laptop',\n 'device_nas',\n 'device_pc',\n 'device_phone',\n 'device_printer',\n 'device_securityalarm',\n 'device_tablet',\n 'device_tv',\n 'device_other',\n // By operating system:\n 'os_android',\n 'os_ios',\n 'os_linux',\n 'os_macos',\n 'os_windows',\n 'os_other',\n // By user group:\n 'user_admin',\n 'user_regular',\n 'user_child',\n ];\n return CtagModifier;\n}(BaseValuesModifier));\n\n/**\n * Rule pattern class\n *\n * This class parses rule pattern text to simple fields.\n */\nvar Pattern = /** @class */ (function () {\n /**\n * Constructor\n * @param pattern\n * @param matchcase\n */\n function Pattern(pattern, matchcase) {\n if (matchcase === void 0) { matchcase = false; }\n this.pattern = pattern;\n this.shortcut = SimpleRegex.extractShortcut(this.pattern);\n this.matchcase = matchcase;\n }\n /**\n * Checks if this rule pattern matches the specified request.\n *\n * @param request - request to check\n * @param shortcutMatched if true, it means that the request already matches\n * this pattern's shortcut and we don't need to match it again.\n * @returns true if pattern matches\n */\n Pattern.prototype.matchPattern = function (request, shortcutMatched) {\n this.prepare();\n if (this.patternShortcut) {\n return shortcutMatched || this.matchShortcut(request.urlLowercase);\n }\n if (this.hostname) {\n // If we have a `||example.org^` rule, it's easier to match\n // against the request's hostname only without matching\n // a regular expression.\n return request.hostname === this.hostname\n || ( // First light check without new string memory allocation\n request.hostname.endsWith(this.hostname)\n // Strict check\n && request.hostname.endsWith(\".\".concat(this.hostname)));\n }\n // If the regular expression is invalid, just return false right away.\n if (this.regexInvalid || !this.regex) {\n return false;\n }\n // This is needed for DNS filtering only, not used in browser blocking.\n if (this.shouldMatchHostname(request)) {\n return this.regex.test(request.hostname);\n }\n return this.regex.test(request.url);\n };\n /**\n * Checks if this rule pattern matches the specified relative path string.\n * This method is used in cosmetic rules to implement the $path modifier matching logic.\n *\n * @param path - path to check\n * @returns true if pattern matches\n */\n Pattern.prototype.matchPathPattern = function (path) {\n this.prepare();\n if (this.hostname) {\n return false;\n }\n var pathIsEmptyString = this.pattern === '';\n // No-value $path should match root URL\n if (pathIsEmptyString && path === '/') {\n return true;\n }\n if (!pathIsEmptyString && this.patternShortcut) {\n return this.matchShortcut(path);\n }\n // If the regular expression is invalid, just return false right away.\n if (this.regexInvalid || !this.regex) {\n return false;\n }\n return this.regex.test(path);\n };\n /**\n * matchShortcut simply checks if shortcut is a substring of the URL.\n * @param request - request to check.\n */\n Pattern.prototype.matchShortcut = function (str) {\n return str.indexOf(this.shortcut) >= 0;\n };\n /**\n * Prepares this pattern\n */\n Pattern.prototype.prepare = function () {\n if (this.prepared) {\n return;\n }\n this.prepared = true;\n // If shortcut and pattern are the same, we don't need to actually compile\n // a regex and can simply use matchShortcut instead,\n // except for the $match-case modifier\n if (this.pattern === this.shortcut && !this.matchcase) {\n this.patternShortcut = true;\n return;\n }\n // Rules like `/example/*` are rather often in the real-life filters,\n // we might want to process them.\n if (this.pattern.startsWith(this.shortcut)\n && this.pattern.length === this.shortcut.length + 1\n && this.pattern.endsWith('*')) {\n this.patternShortcut = true;\n return;\n }\n if (this.pattern.startsWith(SimpleRegex.MASK_START_URL)\n && this.pattern.endsWith(SimpleRegex.MASK_SEPARATOR)\n && this.pattern.indexOf('*') < 0\n && this.pattern.indexOf('/') < 0) {\n this.hostname = this.pattern.slice(2, this.pattern.length - 1);\n return;\n }\n this.compileRegex();\n };\n /**\n * Compiles this pattern regex\n */\n Pattern.prototype.compileRegex = function () {\n var regexText = SimpleRegex.patternToRegexp(this.pattern);\n try {\n var flags = 'i';\n if (this.matchcase) {\n flags = '';\n }\n this.regex = new RegExp(regexText, flags);\n }\n catch (e) {\n this.regexInvalid = true;\n }\n };\n /**\n * Checks if we should match hostnames and not the URL\n * this is important for the cases when we use urlfilter for DNS-level blocking\n * Note, that even though we may work on a DNS-level, we should still sometimes match full URL instead\n *\n * @param request\n */\n Pattern.prototype.shouldMatchHostname = function (request) {\n if (!request.isHostnameRequest) {\n return false;\n }\n return !this.isPatternDomainSpecific();\n };\n /**\n * In case pattern starts with the following it targets some specific domain\n */\n Pattern.prototype.isPatternDomainSpecific = function () {\n if (this.patternDomainSpecific === undefined) {\n this.patternDomainSpecific = this.pattern.startsWith(SimpleRegex.MASK_START_URL)\n || this.pattern.startsWith('http://')\n || this.pattern.startsWith('https:/')\n || this.pattern.startsWith('://');\n }\n return this.patternDomainSpecific;\n };\n return Pattern;\n}());\n\n/**\n * Counts the number of bits in the number and returns it\n *\n * @param a number to count bits\n *\n * @returns The number of bits in the number.\n */\nfunction getBitCount(a) {\n var count = 0;\n var n = a;\n while (n > 0) {\n count += n & 1;\n n >>= 1;\n }\n return count;\n}\n/**\n * Count the number of bits enabled in a number based on a bit mask\n *\n * @param base Base number to check\n * @param mask Mask to check\n *\n * @returns The number of bits enabled in the base number based on the mask\n *\n * @example\n * countEnabledBits(0b100, 0b110); // 1\n * countEnabledBits(0b111, 0b000); // 0\n */\nfunction countEnabledBits(base, mask) {\n // Get the common bits between the base and the mask\n var common = base & mask;\n // Count the number of bits enabled in the common bits\n return getBitCount(common);\n}\n\n/**\n * NetworkRuleOption is the enumeration of various rule options.\n * In order to save memory, we store some options as a flag.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#modifiers\n */\nvar NetworkRuleOption;\n(function (NetworkRuleOption) {\n /** No value is set. Syntax sugar to simplify code. */\n NetworkRuleOption[NetworkRuleOption[\"NotSet\"] = 0] = \"NotSet\";\n /** $third-party modifier */\n NetworkRuleOption[NetworkRuleOption[\"ThirdParty\"] = 1] = \"ThirdParty\";\n /** $match-case modifier */\n NetworkRuleOption[NetworkRuleOption[\"MatchCase\"] = 2] = \"MatchCase\";\n /** $important modifier */\n NetworkRuleOption[NetworkRuleOption[\"Important\"] = 4] = \"Important\";\n // Allowlist rules modifiers\n // Each of them can disable part of the functionality\n /** $elemhide modifier */\n NetworkRuleOption[NetworkRuleOption[\"Elemhide\"] = 8] = \"Elemhide\";\n /** $generichide modifier */\n NetworkRuleOption[NetworkRuleOption[\"Generichide\"] = 16] = \"Generichide\";\n /** $specifichide modifier */\n NetworkRuleOption[NetworkRuleOption[\"Specifichide\"] = 32] = \"Specifichide\";\n /** $genericblock modifier */\n NetworkRuleOption[NetworkRuleOption[\"Genericblock\"] = 64] = \"Genericblock\";\n /** $jsinject modifier */\n NetworkRuleOption[NetworkRuleOption[\"Jsinject\"] = 128] = \"Jsinject\";\n /** $urlblock modifier */\n NetworkRuleOption[NetworkRuleOption[\"Urlblock\"] = 256] = \"Urlblock\";\n /** $content modifier */\n NetworkRuleOption[NetworkRuleOption[\"Content\"] = 512] = \"Content\";\n /** $extension modifier */\n NetworkRuleOption[NetworkRuleOption[\"Extension\"] = 1024] = \"Extension\";\n /** $stealth modifier */\n NetworkRuleOption[NetworkRuleOption[\"Stealth\"] = 2048] = \"Stealth\";\n // Other modifiers\n /** $popup modifier */\n NetworkRuleOption[NetworkRuleOption[\"Popup\"] = 16384] = \"Popup\";\n /** $csp modifier */\n NetworkRuleOption[NetworkRuleOption[\"Csp\"] = 32768] = \"Csp\";\n /** $replace modifier */\n NetworkRuleOption[NetworkRuleOption[\"Replace\"] = 65536] = \"Replace\";\n /** $cookie modifier */\n NetworkRuleOption[NetworkRuleOption[\"Cookie\"] = 131072] = \"Cookie\";\n /** $redirect modifier */\n NetworkRuleOption[NetworkRuleOption[\"Redirect\"] = 262144] = \"Redirect\";\n /** $badfilter modifier */\n NetworkRuleOption[NetworkRuleOption[\"Badfilter\"] = 524288] = \"Badfilter\";\n /** $removeparam modifier */\n NetworkRuleOption[NetworkRuleOption[\"RemoveParam\"] = 1048576] = \"RemoveParam\";\n /** $removeheader modifier */\n NetworkRuleOption[NetworkRuleOption[\"RemoveHeader\"] = 2097152] = \"RemoveHeader\";\n /** $jsonprune modifier */\n NetworkRuleOption[NetworkRuleOption[\"JsonPrune\"] = 4194304] = \"JsonPrune\";\n /** $hls modifier */\n NetworkRuleOption[NetworkRuleOption[\"Hls\"] = 8388608] = \"Hls\";\n // Compatibility dependent\n /** $network modifier */\n NetworkRuleOption[NetworkRuleOption[\"Network\"] = 16777216] = \"Network\";\n /** dns modifiers */\n NetworkRuleOption[NetworkRuleOption[\"Client\"] = 33554432] = \"Client\";\n NetworkRuleOption[NetworkRuleOption[\"DnsRewrite\"] = 67108864] = \"DnsRewrite\";\n NetworkRuleOption[NetworkRuleOption[\"DnsType\"] = 134217728] = \"DnsType\";\n NetworkRuleOption[NetworkRuleOption[\"Ctag\"] = 268435456] = \"Ctag\";\n // $method modifier\n NetworkRuleOption[NetworkRuleOption[\"Method\"] = 1073741824] = \"Method\";\n // $to modifier\n NetworkRuleOption[NetworkRuleOption[\"To\"] = -2147483648] = \"To\";\n // Groups (for validation)\n /** Allowlist-only modifiers */\n NetworkRuleOption[NetworkRuleOption[\"AllowlistOnly\"] = 4088] = \"AllowlistOnly\";\n /** Options supported by host-level network rules * */\n NetworkRuleOption[NetworkRuleOption[\"OptionHostLevelRules\"] = 503840772] = \"OptionHostLevelRules\";\n /**\n * Removeparam compatible modifiers\n *\n * $removeparam rules are compatible only with content type modifiers ($subdocument, $script, $stylesheet, etc)\n * except $document (using by default) and this list of modifiers:\n */\n NetworkRuleOption[NetworkRuleOption[\"RemoveParamCompatibleOptions\"] = 1572871] = \"RemoveParamCompatibleOptions\";\n /**\n * Removeheader compatible modifiers\n *\n * $removeheader rules are compatible only with content type modifiers ($subdocument, $script, $stylesheet, etc)\n * except $document (using by default) and this list of modifiers:\n */\n NetworkRuleOption[NetworkRuleOption[\"RemoveHeaderCompatibleOptions\"] = 2621447] = \"RemoveHeaderCompatibleOptions\";\n})(NetworkRuleOption || (NetworkRuleOption = {}));\n/**\n * Helper class that is used for passing {@link NetworkRule.parseRuleText}\n * result to the caller. Should not be used outside of this file.\n */\nvar BasicRuleParts = /** @class */ (function () {\n function BasicRuleParts() {\n }\n return BasicRuleParts;\n}());\n/**\n * Basic network filtering rule.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules\n */\nvar NetworkRule = /** @class */ (function () {\n /**\n * Creates an instance of the {@link NetworkRule}.\n * It parses this rule and extracts the rule pattern (see {@link SimpleRegex}),\n * and rule modifiers.\n *\n * @param ruleText - original rule text.\n * @param filterListId - ID of the filter list this rule belongs to.\n *\n * @throws error if it fails to parse the rule.\n */\n function NetworkRule(ruleText, filterListId) {\n this.permittedDomains = null;\n this.restrictedDomains = null;\n /**\n * Domains in denyallow modifier providing exceptions for permitted domains\n * https://github.com/AdguardTeam/CoreLibs/issues/1304\n */\n this.denyAllowDomains = null;\n /**\n * Flag with all enabled rule options.\n */\n this.enabledOptions = NetworkRuleOption.NotSet;\n /**\n * Flag with all disabled rule options.\n */\n this.disabledOptions = NetworkRuleOption.NotSet;\n /**\n * Flag with all permitted request types.\n */\n this.permittedRequestTypes = RequestType.NotSet;\n /**\n * Flag with all restricted request types.\n */\n this.restrictedRequestTypes = RequestType.NotSet;\n /**\n * Rule Advanced modifier\n */\n this.advancedModifier = null;\n /**\n * Rule App modifier\n */\n this.appModifier = null;\n /**\n * Rule Method modifier\n */\n this.methodModifier = null;\n /**\n * Rule To modifier\n */\n this.toModifier = null;\n /**\n * Rule priority, which is needed when the engine has to choose between\n * several rules matching the query. This value is calculated based on\n * the rule modifiers enabled or disabled and rounded up\n * to the smallest integer greater than or equal to the calculated weight\n * in the {@link calculatePriorityWeight}.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-1\n */\n this.priorityWeight = 1;\n this.ruleText = ruleText;\n this.filterListId = filterListId;\n var ruleParts = NetworkRule.parseRuleText(ruleText);\n this.allowlist = !!ruleParts.allowlist;\n var pattern = ruleParts.pattern;\n if (pattern && NetworkRule.hasSpaces(pattern)) {\n throw new SyntaxError('Rule has spaces, seems to be an host rule');\n }\n if (ruleParts.options) {\n this.loadOptions(ruleParts.options);\n }\n if (pattern === SimpleRegex.MASK_START_URL\n || pattern === SimpleRegex.MASK_ANY_CHARACTER\n || pattern === ''\n || pattern.length < SimpleRegex.MIN_GENERIC_RULE_LENGTH) {\n // Except cookie, removeparam rules and dns compatible rules, they have their own atmosphere\n var hasCookieModifier = this.advancedModifier instanceof CookieModifier;\n var hasRemoveParamModifier = this.advancedModifier instanceof RemoveParamModifier;\n // https://github.com/AdguardTeam/tsurlfilter/issues/56\n var isDnsCompatible = isCompatibleWith(CompatibilityTypes.Dns);\n if (!hasCookieModifier && !hasRemoveParamModifier && !isDnsCompatible) {\n if (!(this.hasPermittedDomains() || this.hasPermittedApps())) {\n // Rule matches too much and does not have any domain restriction\n // We should not allow this kind of rules\n // eslint-disable-next-line max-len\n throw new SyntaxError('The rule is too wide, add domain restriction or make the pattern more specific');\n }\n }\n }\n this.calculatePriorityWeight();\n this.pattern = new Pattern(pattern, this.isOptionEnabled(NetworkRuleOption.MatchCase));\n }\n /**\n * Returns the original text of the rule from which it was parsed.\n *\n * @returns Original text of the rule.\n */\n NetworkRule.prototype.getText = function () {\n return this.ruleText;\n };\n /**\n * Returns the identifier of the filter from which the rule was received.\n *\n * @returns Identifier of the filter from which the rule was received.\n */\n NetworkRule.prototype.getFilterListId = function () {\n return this.filterListId;\n };\n /**\n * Each rule has its own priority, which is necessary when several rules\n * match the request and the filtering system needs to select one of them.\n * Priority is measured as a positive integer.\n * In the case of a conflict between two rules with the same priority value,\n * it is not specified which one of them will be chosen.\n *\n * @returns Rule priority.\n */\n NetworkRule.prototype.getPriorityWeight = function () {\n return this.priorityWeight;\n };\n /**\n * Returns rule pattern,\n * which currently is used only in the rule validator module\n */\n NetworkRule.prototype.getPattern = function () {\n return this.pattern.pattern;\n };\n /**\n * Returns `true` if the rule is \"allowlist\", e.g. if it disables other\n * rules when the pattern matches the request.\n */\n NetworkRule.prototype.isAllowlist = function () {\n return this.allowlist;\n };\n /**\n * Checks if the rule is a document-level allowlist rule with $urlblock or\n * $genericblock or $content.\n * This means that the rule is supposed to disable or modify blocking\n * of the page subrequests.\n * For instance, `@@||example.org^$urlblock` unblocks all sub-requests.\n */\n NetworkRule.prototype.isDocumentLevelAllowlistRule = function () {\n if (!this.isAllowlist()) {\n return false;\n }\n return this.isOptionEnabled(NetworkRuleOption.Urlblock)\n || this.isOptionEnabled(NetworkRuleOption.Genericblock)\n || this.isOptionEnabled(NetworkRuleOption.Content);\n };\n /**\n * Checks if the rule completely disables filtering.\n */\n NetworkRule.prototype.isFilteringDisabled = function () {\n if (!this.isAllowlist()) {\n return false;\n }\n return this.isOptionEnabled(NetworkRuleOption.Elemhide)\n && this.isOptionEnabled(NetworkRuleOption.Content)\n && this.isOptionEnabled(NetworkRuleOption.Urlblock)\n && this.isOptionEnabled(NetworkRuleOption.Jsinject);\n };\n /**\n * The longest part of pattern without any special characters.\n * It is used to improve the matching performance.\n */\n NetworkRule.prototype.getShortcut = function () {\n return this.pattern.shortcut;\n };\n /**\n * Gets list of permitted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier\n */\n NetworkRule.prototype.getPermittedDomains = function () {\n return this.permittedDomains;\n };\n /**\n * Gets list of denyAllow domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#denyallow-modifier\n */\n NetworkRule.prototype.getDenyAllowDomains = function () {\n return this.denyAllowDomains;\n };\n /**\n * Gets list of restricted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#domain-modifier\n */\n NetworkRule.prototype.getRestrictedDomains = function () {\n return this.restrictedDomains;\n };\n /**\n * Get list of permitted $to domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#to-modifier\n */\n NetworkRule.prototype.getPermittedToDomains = function () {\n if (this.toModifier) {\n return this.toModifier.permittedValues;\n }\n return null;\n };\n /**\n * Get list of restricted $to domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#to-modifier\n */\n NetworkRule.prototype.getRestrictedToDomains = function () {\n if (this.toModifier) {\n return this.toModifier.restrictedValues;\n }\n return null;\n };\n /**\n * Gets list of permitted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app\n */\n NetworkRule.prototype.getPermittedApps = function () {\n if (this.appModifier) {\n return this.appModifier.permittedApps;\n }\n return null;\n };\n /**\n * Gets list of restricted domains.\n * See https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#app\n */\n NetworkRule.prototype.getRestrictedApps = function () {\n if (this.appModifier) {\n return this.appModifier.restrictedApps;\n }\n return null;\n };\n /**\n * Gets list of permitted methods.\n * See https://kb.adguard.com/general/how-to-create-your-own-ad-filters#method-modifier\n */\n NetworkRule.prototype.getRestrictedMethods = function () {\n if (this.methodModifier) {\n return this.methodModifier.restrictedValues;\n }\n return null;\n };\n /**\n * Gets list of restricted methods.\n * See https://kb.adguard.com/general/how-to-create-your-own-ad-filters#method-modifier\n */\n NetworkRule.prototype.getPermittedMethods = function () {\n if (this.methodModifier) {\n return this.methodModifier.permittedValues;\n }\n return null;\n };\n /**\n * Flag with all permitted request types.\n * The value {@link RequestType.NotSet} here means \"all request types are allowed\".\n */\n NetworkRule.prototype.getPermittedRequestTypes = function () {\n return this.permittedRequestTypes;\n };\n /**\n * Flag with all restricted request types.\n * The value {@link RequestType.NotSet} here means \"no type of request is restricted\".\n */\n NetworkRule.prototype.getRestrictedRequestTypes = function () {\n return this.restrictedRequestTypes;\n };\n /**\n * Advanced modifier\n */\n NetworkRule.prototype.getAdvancedModifier = function () {\n return this.advancedModifier;\n };\n /**\n * Advanced modifier value\n */\n NetworkRule.prototype.getAdvancedModifierValue = function () {\n return this.advancedModifier && this.advancedModifier.getValue();\n };\n /**\n * isRegexRule returns true if rule's pattern is a regular expression.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#regexp-support\n */\n NetworkRule.prototype.isRegexRule = function () {\n return (this.getPattern().startsWith(SimpleRegex.MASK_REGEX_RULE)\n && this.getPattern().endsWith(SimpleRegex.MASK_REGEX_RULE));\n };\n NetworkRule.prototype.matchesPermittedDomains = function (hostname) {\n if (this.hasPermittedDomains()\n && DomainModifier.isDomainOrSubdomainOfAny(hostname, this.permittedDomains)) {\n return true;\n }\n return false;\n };\n /**\n * Checks if this filtering rule matches the specified request.\n * @param request - request to check.\n * @param useShortcut - the flag to use this rule shortcut\n *\n * In case we use Trie in lookup table, we don't need to use shortcut cause we already check if request's url\n * includes full rule shortcut.\n */\n NetworkRule.prototype.match = function (request, useShortcut) {\n if (useShortcut === void 0) { useShortcut = true; }\n // Regex rules should not be tested by shortcut\n if (useShortcut && !this.matchShortcut(request)) {\n return false;\n }\n if (this.isOptionEnabled(NetworkRuleOption.Method) && !this.matchMethod(request.method)) {\n return false;\n }\n if (this.isOptionEnabled(NetworkRuleOption.ThirdParty) && !request.thirdParty) {\n return false;\n }\n if (this.isOptionDisabled(NetworkRuleOption.ThirdParty) && request.thirdParty) {\n return false;\n }\n if (!this.matchRequestType(request.requestType)) {\n return false;\n }\n if (!this.matchDomainModifier(request)) {\n return false;\n }\n if (this.isOptionEnabled(NetworkRuleOption.RemoveParam)) {\n if (!this.matchRequestTypeExplicit(request.requestType)) {\n return false;\n }\n }\n if (!this.matchDenyAllowDomains(request.hostname)) {\n return false;\n }\n if (this.isOptionEnabled(NetworkRuleOption.To) && !this.matchToModifier(request.hostname)) {\n return false;\n }\n if (!this.matchDnsType(request.dnsType)) {\n return false;\n }\n if (!this.matchClientTags(request.clientTags)) {\n return false;\n }\n if (!this.matchClient(request.clientName, request.clientIP)) {\n return false;\n }\n return this.pattern.matchPattern(request, true);\n };\n /**\n * matchShortcut simply checks if shortcut is a substring of the URL.\n * @param request - request to check.\n */\n NetworkRule.prototype.matchShortcut = function (request) {\n return request.urlLowercase.indexOf(this.getShortcut()) >= 0;\n };\n /**\n * matchDomain checks if the filtering rule is allowed on this domain.\n * @param domain - domain to check.\n */\n NetworkRule.prototype.matchDomain = function (domain) {\n if (this.hasRestrictedDomains()) {\n if (DomainModifier.isDomainOrSubdomainOfAny(domain, this.restrictedDomains)) {\n // Domain or host is restricted\n // i.e. $domain=~example.org\n return false;\n }\n }\n if (this.hasPermittedDomains()) {\n if (!DomainModifier.isDomainOrSubdomainOfAny(domain, this.permittedDomains)) {\n // Domain is not among permitted\n // i.e. $domain=example.org and we're checking example.com\n return false;\n }\n }\n return true;\n };\n /**\n * Check if request matches domain modifier by request referrer (general case) or by request target\n *\n * In some cases the $domain modifier can match not only the referrer domain, but also the target domain.\n * This happens when the following is true (1 AND ((2 AND 3) OR 4):\n *\n * 1) The request has document type\n * 2) The rule's pattern doesn't match any particular domain(s)\n * 3) The rule's pattern doesn't contain regular expressions\n * 4) The $domain modifier contains only excluded domains (e.g., $domain=~example.org|~example.com)\n *\n * When all these conditions are met, the domain modifier will match both the referrer domain and the target domain.\n * https://github.com/AdguardTeam/tsurlfilter/issues/45\n * @param request\n */\n NetworkRule.prototype.matchDomainModifier = function (request) {\n if (!this.permittedDomains && !this.restrictedDomains) {\n return true;\n }\n var isDocumentType = request.requestType === RequestType.Document\n || request.requestType === RequestType.SubDocument;\n var hasOnlyExcludedDomains = (!this.permittedDomains || this.permittedDomains.length === 0)\n && this.restrictedDomains\n && this.restrictedDomains.length > 0;\n var patternIsRegex = this.isRegexRule();\n var patternIsDomainSpecific = this.pattern.isPatternDomainSpecific();\n var matchesTargetByPatternCondition = !patternIsRegex && !patternIsDomainSpecific;\n if (isDocumentType && (hasOnlyExcludedDomains || matchesTargetByPatternCondition)) {\n // check if matches source hostname if exists or if matches target hostname\n return (request.sourceHostname && this.matchDomain(request.sourceHostname))\n || this.matchDomain(request.hostname);\n }\n return this.matchDomain(request.sourceHostname || '');\n };\n /**\n * checks if the filtering rule is allowed on this domain.\n * @param domain\n */\n NetworkRule.prototype.matchDenyAllowDomains = function (domain) {\n if (!this.denyAllowDomains) {\n return true;\n }\n if (this.denyAllowDomains.length > 0) {\n if (DomainModifier.isDomainOrSubdomainOfAny(domain, this.denyAllowDomains)) {\n return false;\n }\n }\n return true;\n };\n /**\n * Checks if request target matches with specified domains\n *\n * @param domain request's domain\n * @return true if request domain matches with specified domains\n */\n NetworkRule.prototype.matchToModifier = function (domain) {\n if (!this.toModifier) {\n return true;\n }\n /**\n * Request's domain must be either explicitly\n * permitted and not be included in list of restricted domains\n * for the rule to apply\n */\n var permittedDomains = this.getPermittedToDomains();\n var restrictedDomains = this.getRestrictedToDomains();\n var isPermittedDomain = !!permittedDomains\n && DomainModifier.isDomainOrSubdomainOfAny(domain, permittedDomains);\n var isRestrictedDomain = !!restrictedDomains\n && DomainModifier.isDomainOrSubdomainOfAny(domain, restrictedDomains);\n return isPermittedDomain && !isRestrictedDomain;\n };\n /**\n * Return TRUE if this rule matches with the tags associated with a client\n *\n * @param clientTags\n */\n NetworkRule.prototype.matchClientTags = function (clientTags) {\n var advancedModifier = this.getAdvancedModifier();\n if (!advancedModifier || !(advancedModifier instanceof CtagModifier)) {\n return true;\n }\n if (!clientTags) {\n return false;\n }\n var cTagsModifier = advancedModifier;\n return clientTags.every(function (x) { return cTagsModifier.match(x); });\n };\n /**\n * returns TRUE if the rule matches with the specified client\n *\n * @param clientName\n * @param clientIP\n */\n NetworkRule.prototype.matchClient = function (clientName, clientIP) {\n var advancedModifier = this.getAdvancedModifier();\n if (!advancedModifier || !(advancedModifier instanceof ClientModifier)) {\n return true;\n }\n if (!clientName && !clientIP) {\n return false;\n }\n var modifier = advancedModifier;\n return modifier.matchAny(clientName, clientIP);\n };\n /**\n * Return TRUE if this rule matches with the request dnstype\n *\n * @param dnstype\n */\n NetworkRule.prototype.matchDnsType = function (dnstype) {\n var advancedModifier = this.getAdvancedModifier();\n if (!advancedModifier || !(advancedModifier instanceof DnsTypeModifier)) {\n return true;\n }\n if (!dnstype) {\n return false;\n }\n var modifier = advancedModifier;\n return modifier.match(dnstype);\n };\n /**\n * Checks if rule has permitted domains\n */\n NetworkRule.prototype.hasPermittedDomains = function () {\n return this.permittedDomains != null && this.permittedDomains.length > 0;\n };\n /**\n * Checks if rule has restricted domains\n */\n NetworkRule.prototype.hasRestrictedDomains = function () {\n return this.restrictedDomains != null && this.restrictedDomains.length > 0;\n };\n /**\n * Checks if rule has permitted apps\n */\n NetworkRule.prototype.hasPermittedApps = function () {\n if (!this.appModifier) {\n return false;\n }\n return this.appModifier.permittedApps !== null && this.appModifier.permittedApps.length > 0;\n };\n /**\n * matchRequestType checks if the request's type matches the rule properties\n * @param requestType - request type to check.\n */\n NetworkRule.prototype.matchRequestType = function (requestType) {\n if (this.permittedRequestTypes !== RequestType.NotSet) {\n if ((this.permittedRequestTypes & requestType) !== requestType) {\n return false;\n }\n }\n if (this.restrictedRequestTypes !== RequestType.NotSet) {\n if ((this.restrictedRequestTypes & requestType) === requestType) {\n return false;\n }\n }\n return true;\n };\n /**\n * In case of $removeparam modifier,\n * we only allow it to target other content types if the rule has an explicit content-type modifier.\n */\n NetworkRule.prototype.matchRequestTypeExplicit = function (requestType) {\n if (this.permittedRequestTypes === RequestType.NotSet\n && this.restrictedRequestTypes === RequestType.NotSet\n && requestType !== RequestType.Document\n && requestType !== RequestType.SubDocument) {\n return false;\n }\n return this.matchRequestType(requestType);\n };\n /**\n * Checks if request's method matches with the rule\n *\n * @param method request's method\n * @returns true, if rule must be applied to the request\n */\n NetworkRule.prototype.matchMethod = function (method) {\n if (!method || !MethodModifier.isHTTPMethod(method)) {\n return false;\n }\n /**\n * Request's method must be either explicitly\n * permitted or not be included in list of restricted methods\n * for the rule to apply\n */\n var permittedMethods = this.getPermittedMethods();\n if (permittedMethods === null || permittedMethods === void 0 ? void 0 : permittedMethods.includes(method)) {\n return true;\n }\n var restrictedMethods = this.getRestrictedMethods();\n return !!restrictedMethods && !restrictedMethods.includes(method);\n };\n /**\n * Checks if pattern has spaces\n * Used in order to do not create network rules from host rules\n * @param pattern\n * @private\n */\n NetworkRule.hasSpaces = function (pattern) {\n return pattern.indexOf(' ') > -1;\n };\n /**\n * Parses the options string and saves them.\n * More on the rule modifiers:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules-modifiers\n *\n * @param options - string with the rule modifiers\n *\n * @throws an error if there is an unsupported modifier\n */\n NetworkRule.prototype.loadOptions = function (options) {\n var optionParts;\n try {\n optionParts = parseOptionsString(options);\n }\n catch (e) {\n var errorMessage = getErrorMessage(e);\n throw new Error(\"Cannot parse \".concat(options, \": \").concat(errorMessage));\n }\n for (var i = 0; i < optionParts.length; i += 1) {\n var option = optionParts[i];\n var valueIndex = option.indexOf('=');\n var optionName = option;\n var optionValue = '';\n if (valueIndex > 0) {\n optionName = option.substring(0, valueIndex);\n optionValue = option.substring(valueIndex + 1);\n }\n this.loadOption(optionName, optionValue);\n }\n this.validateOptions();\n };\n /**\n * Returns true if rule contains (enabled or disabled) specified option.\n * Please note, that options have three state: enabled, disabled, undefined.\n *\n * @param option - rule option to check.\n */\n NetworkRule.prototype.hasOption = function (option) {\n return this.isOptionEnabled(option) || this.isOptionDisabled(option);\n };\n /**\n * Returns true if the specified option is enabled.\n * Please note, that options have three state: enabled, disabled, undefined.\n *\n * @param option - rule option to check.\n */\n NetworkRule.prototype.isOptionEnabled = function (option) {\n return (this.enabledOptions & option) === option;\n };\n /**\n * Returns true if one and only option is enabled\n *\n * @param option\n */\n NetworkRule.prototype.isSingleOptionEnabled = function (option) {\n return this.enabledOptions === option;\n };\n /**\n * Returns true if the specified option is disabled.\n * Please note, that options have three state: enabled, disabled, undefined.\n *\n * @param option - rule option to check.\n */\n NetworkRule.prototype.isOptionDisabled = function (option) {\n return (this.disabledOptions & option) === option;\n };\n /**\n * Checks if the rule has higher priority that the specified rule\n * allowlist + $important > $important > redirect > allowlist > basic rules\n */\n NetworkRule.prototype.isHigherPriority = function (r) {\n return this.priorityWeight > r.priorityWeight;\n };\n /**\n * Returns true if the rule is considered \"generic\"\n * \"generic\" means that the rule is not restricted to a limited set of domains\n * Please note that it might be forbidden on some domains, though.\n *\n * @return {boolean}\n */\n NetworkRule.prototype.isGeneric = function () {\n return !this.hasPermittedDomains();\n };\n /**\n * Returns true if this rule negates the specified rule\n * Only makes sense when this rule has a `badfilter` modifier\n */\n NetworkRule.prototype.negatesBadfilter = function (specifiedRule) {\n if (!this.isOptionEnabled(NetworkRuleOption.Badfilter)) {\n return false;\n }\n if (this.allowlist !== specifiedRule.allowlist) {\n return false;\n }\n if (this.pattern.pattern !== specifiedRule.pattern.pattern) {\n return false;\n }\n if (this.permittedRequestTypes !== specifiedRule.permittedRequestTypes) {\n return false;\n }\n if (this.restrictedRequestTypes !== specifiedRule.restrictedRequestTypes) {\n return false;\n }\n if ((this.enabledOptions ^ NetworkRuleOption.Badfilter) !== specifiedRule.enabledOptions) {\n return false;\n }\n if (this.disabledOptions !== specifiedRule.disabledOptions) {\n return false;\n }\n if (!stringArraysEquals(this.restrictedDomains, specifiedRule.restrictedDomains)) {\n return false;\n }\n if (!stringArraysHaveIntersection(this.permittedDomains, specifiedRule.permittedDomains)) {\n return false;\n }\n return true;\n };\n /**\n * Checks if this rule can be used for hosts-level blocking\n */\n NetworkRule.prototype.isHostLevelNetworkRule = function () {\n if (this.hasPermittedDomains() || this.hasRestrictedDomains()) {\n return false;\n }\n if (this.permittedRequestTypes !== 0 && this.restrictedRequestTypes !== 0) {\n return false;\n }\n if (this.disabledOptions !== NetworkRuleOption.NotSet) {\n return false;\n }\n if (this.enabledOptions !== NetworkRuleOption.NotSet) {\n return ((this.enabledOptions\n & NetworkRuleOption.OptionHostLevelRules)\n | (this.enabledOptions\n ^ NetworkRuleOption.OptionHostLevelRules)) === NetworkRuleOption.OptionHostLevelRules;\n }\n return true;\n };\n /**\n * Enables or disables the specified option.\n *\n * @param option - option to enable or disable.\n * @param enabled - true to enable, false to disable.\n * @param skipRestrictions - skip options allowlist/blacklist restrictions\n *\n * @throws an error if the option we're trying to enable cannot be.\n * For instance, you cannot enable $elemhide for blacklist rules.\n */\n NetworkRule.prototype.setOptionEnabled = function (option, enabled, skipRestrictions) {\n if (skipRestrictions === void 0) { skipRestrictions = false; }\n if (!skipRestrictions) {\n if (!this.allowlist && (option & NetworkRuleOption.AllowlistOnly) === option) {\n throw new SyntaxError(\"Modifier \".concat(NetworkRuleOption[option], \" cannot be used in blacklist rule\"));\n }\n }\n if (enabled) {\n this.enabledOptions |= option;\n }\n else {\n this.disabledOptions |= option;\n }\n };\n /**\n * Permits or forbids the specified request type.\n * \"Permits\" means that the rule will match **only** the types that are permitted.\n * \"Restricts\" means that the rule will match **all but restricted**.\n *\n * @param requestType - request type.\n * @param permitted - true if it's permitted (whic)\n */\n NetworkRule.prototype.setRequestType = function (requestType, permitted) {\n if (permitted) {\n this.permittedRequestTypes |= requestType;\n }\n else {\n this.restrictedRequestTypes |= requestType;\n }\n };\n /**\n * Sets and validates exceptionally allowed domains presented in $denyallow modifier\n *\n * @param optionValue\n */\n NetworkRule.prototype.setDenyAllowDomains = function (optionValue) {\n var domainModifier = new DomainModifier(optionValue, PIPE_SEPARATOR);\n if (domainModifier.restrictedDomains && domainModifier.restrictedDomains.length > 0) {\n throw new SyntaxError('Invalid modifier: $denyallow domains cannot be negated');\n }\n if (domainModifier.permittedDomains\n && domainModifier.permittedDomains.some(function (x) { return x.includes(SimpleRegex.MASK_ANY_CHARACTER); })) {\n throw new SyntaxError('Invalid modifier: $denyallow domains wildcards are not supported');\n }\n this.denyAllowDomains = domainModifier.permittedDomains;\n };\n /**\n * Loads the specified modifier:\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#basic-rules-modifiers\n *\n * @param optionName - modifier name.\n * @param optionValue - modifier value.\n *\n * @throws an error if there is an unsupported modifier\n */\n NetworkRule.prototype.loadOption = function (optionName, optionValue) {\n var _this = this;\n var OPTIONS = NetworkRule.OPTIONS;\n if (optionName.startsWith(OPTIONS.NOOP)) {\n /**\n * A noop modifier does nothing and can be used to increase some rules readability.\n * It consists of the sequence of underscore characters (_) of any length\n * and can appear in a rule as many times as it's needed.\n */\n if (!optionName.split(OPTIONS.NOOP).some(function (s) { return !!s; })) {\n return;\n }\n }\n switch (optionName) {\n // General options\n // $third-party, $~first-party\n case OPTIONS.THIRD_PARTY:\n case NOT_MARK + OPTIONS.FIRST_PARTY:\n this.setOptionEnabled(NetworkRuleOption.ThirdParty, true);\n break;\n // $first-party, $~third-party\n case NOT_MARK + OPTIONS.THIRD_PARTY:\n case OPTIONS.FIRST_PARTY:\n this.setOptionEnabled(NetworkRuleOption.ThirdParty, false);\n break;\n // $match-case\n case OPTIONS.MATCH_CASE:\n this.setOptionEnabled(NetworkRuleOption.MatchCase, true);\n break;\n // $~match-case\n case NOT_MARK + OPTIONS.MATCH_CASE:\n this.setOptionEnabled(NetworkRuleOption.MatchCase, false);\n break;\n // $important\n case OPTIONS.IMPORTANT:\n this.setOptionEnabled(NetworkRuleOption.Important, true);\n break;\n // $domain\n case OPTIONS.DOMAIN:\n // eslint-disable-next-line no-case-declarations\n var domainModifier = new DomainModifier(optionValue, PIPE_SEPARATOR);\n this.permittedDomains = domainModifier.permittedDomains;\n this.restrictedDomains = domainModifier.restrictedDomains;\n break;\n // $denyallow\n case OPTIONS.DENYALLOW:\n this.setDenyAllowDomains(optionValue);\n break;\n // $method modifier\n case OPTIONS.METHOD: {\n this.setOptionEnabled(NetworkRuleOption.Method, true);\n this.methodModifier = new MethodModifier(optionValue);\n break;\n }\n // $to modifier\n case OPTIONS.TO: {\n this.setOptionEnabled(NetworkRuleOption.To, true);\n this.toModifier = new ToModifier(optionValue);\n break;\n }\n // Document-level allowlist rules\n // $elemhide\n case OPTIONS.ELEMHIDE:\n this.setOptionEnabled(NetworkRuleOption.Elemhide, true);\n this.setRequestType(RequestType.Document, true);\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $generichide\n case OPTIONS.GENERICHIDE:\n this.setOptionEnabled(NetworkRuleOption.Generichide, true);\n this.setRequestType(RequestType.Document, true);\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $specifichide\n case OPTIONS.SPECIFICHIDE:\n this.setOptionEnabled(NetworkRuleOption.Specifichide, true);\n this.setRequestType(RequestType.Document, true);\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $genericblock\n case OPTIONS.GENERICBLOCK:\n this.setOptionEnabled(NetworkRuleOption.Genericblock, true);\n this.setRequestType(RequestType.Document, true);\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $jsinject\n case OPTIONS.JSINJECT:\n this.setOptionEnabled(NetworkRuleOption.Jsinject, true);\n this.setRequestType(RequestType.Document, true);\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $urlblock\n case OPTIONS.URLBLOCK:\n this.setOptionEnabled(NetworkRuleOption.Urlblock, true);\n this.setRequestType(RequestType.Document, true);\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $content\n case OPTIONS.CONTENT:\n this.setOptionEnabled(NetworkRuleOption.Content, true);\n this.setRequestType(RequestType.Document, true);\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $document, $doc\n case OPTIONS.DOCUMENT:\n case OPTIONS.DOC:\n this.setRequestType(RequestType.Document, true);\n // In the case of allowlist rules $document implicitly includes\n // all these modifiers: `$content`, `$elemhide`, `$jsinject`,\n // `$urlblock`.\n if (this.isAllowlist()) {\n this.setOptionEnabled(NetworkRuleOption.Elemhide, true, true);\n this.setOptionEnabled(NetworkRuleOption.Jsinject, true, true);\n this.setOptionEnabled(NetworkRuleOption.Urlblock, true, true);\n this.setOptionEnabled(NetworkRuleOption.Content, true, true);\n }\n break;\n // $~document, $~doc\n case NOT_MARK + OPTIONS.DOCUMENT:\n case NOT_MARK + OPTIONS.DOC:\n this.setRequestType(RequestType.Document, false);\n break;\n // $stealh\n case OPTIONS.STEALTH:\n this.setOptionEnabled(NetworkRuleOption.Stealth, true);\n break;\n // $popup\n case OPTIONS.POPUP:\n this.setRequestType(RequestType.Document, true);\n this.setOptionEnabled(NetworkRuleOption.Popup, true);\n break;\n // Content type options\n // $script\n case OPTIONS.SCRIPT:\n this.setRequestType(RequestType.Script, true);\n break;\n // $~script\n case NOT_MARK + OPTIONS.SCRIPT:\n this.setRequestType(RequestType.Script, false);\n break;\n // $stylesheet\n case OPTIONS.STYLESHEET:\n this.setRequestType(RequestType.Stylesheet, true);\n break;\n // $~stylesheet\n case NOT_MARK + OPTIONS.STYLESHEET:\n this.setRequestType(RequestType.Stylesheet, false);\n break;\n // $subdocument\n case OPTIONS.SUBDOCUMENT:\n this.setRequestType(RequestType.SubDocument, true);\n break;\n // $~subdocument\n case NOT_MARK + OPTIONS.SUBDOCUMENT:\n this.setRequestType(RequestType.SubDocument, false);\n break;\n // $object\n case OPTIONS.OBJECT:\n this.setRequestType(RequestType.Object, true);\n break;\n // $~object\n case NOT_MARK + OPTIONS.OBJECT:\n this.setRequestType(RequestType.Object, false);\n break;\n // $image\n case OPTIONS.IMAGE:\n this.setRequestType(RequestType.Image, true);\n break;\n // $~image\n case NOT_MARK + OPTIONS.IMAGE:\n this.setRequestType(RequestType.Image, false);\n break;\n // $xmlhttprequest\n case OPTIONS.XMLHTTPREQUEST:\n this.setRequestType(RequestType.XmlHttpRequest, true);\n break;\n // $~xmlhttprequest\n case NOT_MARK + OPTIONS.XMLHTTPREQUEST:\n this.setRequestType(RequestType.XmlHttpRequest, false);\n break;\n // $media\n case OPTIONS.MEDIA:\n this.setRequestType(RequestType.Media, true);\n break;\n // $~media\n case NOT_MARK + OPTIONS.MEDIA:\n this.setRequestType(RequestType.Media, false);\n break;\n // $font\n case OPTIONS.FONT:\n this.setRequestType(RequestType.Font, true);\n break;\n // $~font\n case NOT_MARK + OPTIONS.FONT:\n this.setRequestType(RequestType.Font, false);\n break;\n // $websocket\n case OPTIONS.WEBSOCKET:\n this.setRequestType(RequestType.WebSocket, true);\n break;\n // $~websocket\n case NOT_MARK + OPTIONS.WEBSOCKET:\n this.setRequestType(RequestType.WebSocket, false);\n break;\n // $other\n case OPTIONS.OTHER:\n this.setRequestType(RequestType.Other, true);\n break;\n // $~other\n case NOT_MARK + OPTIONS.OTHER:\n this.setRequestType(RequestType.Other, false);\n break;\n // $ping\n case OPTIONS.PING:\n this.setRequestType(RequestType.Ping, true);\n break;\n // $~ping\n case NOT_MARK + OPTIONS.PING:\n this.setRequestType(RequestType.Ping, false);\n break;\n // Special modifiers\n // $badfilter\n case OPTIONS.BADFILTER:\n this.setOptionEnabled(NetworkRuleOption.Badfilter, true);\n break;\n // $csp\n case OPTIONS.CSP:\n this.setOptionEnabled(NetworkRuleOption.Csp, true);\n this.advancedModifier = new CspModifier(optionValue, this.isAllowlist());\n break;\n // $replace\n case OPTIONS.REPLACE:\n this.setOptionEnabled(NetworkRuleOption.Replace, true);\n this.advancedModifier = new ReplaceModifier(optionValue);\n break;\n // $cookie\n case OPTIONS.COOKIE:\n this.setOptionEnabled(NetworkRuleOption.Cookie, true);\n this.advancedModifier = new CookieModifier(optionValue);\n break;\n // $redirect\n case OPTIONS.REDIRECT:\n this.setOptionEnabled(NetworkRuleOption.Redirect, true);\n this.advancedModifier = new RedirectModifier(optionValue, this.ruleText, this.isAllowlist());\n break;\n // $redirect-rule\n case OPTIONS.REDIRECTRULE:\n this.setOptionEnabled(NetworkRuleOption.Redirect, true);\n this.advancedModifier = new RedirectModifier(optionValue, this.ruleText, this.isAllowlist(), true);\n break;\n // $removeparam\n case OPTIONS.REMOVEPARAM:\n this.setOptionEnabled(NetworkRuleOption.RemoveParam, true);\n this.advancedModifier = new RemoveParamModifier(optionValue);\n break;\n // $removeheader\n case OPTIONS.REMOVEHEADER:\n this.setOptionEnabled(NetworkRuleOption.RemoveHeader, true);\n this.advancedModifier = new RemoveHeaderModifier(optionValue, this.isAllowlist());\n break;\n // $jsonprune\n // simple validation of jsonprune rules for compiler\n // https://github.com/AdguardTeam/FiltersCompiler/issues/168\n case OPTIONS.JSONPRUNE:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension does not support $jsonprune modifier yet');\n }\n this.setOptionEnabled(NetworkRuleOption.JsonPrune, true);\n // TODO: should be properly implemented later\n // https://github.com/AdguardTeam/tsurlfilter/issues/71\n break;\n // $hls\n // simple validation of hls rules for compiler\n // https://github.com/AdguardTeam/FiltersCompiler/issues/169\n case OPTIONS.HLS:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension does not support $hls modifier yet');\n }\n this.setOptionEnabled(NetworkRuleOption.Hls, true);\n // TODO: should be properly implemented later\n // https://github.com/AdguardTeam/tsurlfilter/issues/72\n break;\n // Dns modifiers\n // $client\n case OPTIONS.CLIENT:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $client modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Client, true);\n this.advancedModifier = new ClientModifier(optionValue);\n break;\n // $dnsrewrite\n case OPTIONS.DNSREWRITE:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $dnsrewrite modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.DnsRewrite, true);\n this.advancedModifier = new DnsRewriteModifier(optionValue);\n break;\n // $dnstype\n case OPTIONS.DNSTYPE:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $dnstype modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.DnsType, true);\n this.advancedModifier = new DnsTypeModifier(optionValue);\n break;\n // $ctag\n case OPTIONS.CTAG:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $ctag modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Ctag, true);\n this.advancedModifier = new CtagModifier(optionValue);\n break;\n // $app\n case OPTIONS.APP:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $app modifier');\n }\n this.appModifier = new AppModifier(optionValue);\n break;\n // $network\n case OPTIONS.NETWORK:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $network modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Network, true);\n break;\n // $extension\n case OPTIONS.EXTENSION:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $extension modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Extension, true);\n break;\n // $~extension\n case NOT_MARK + OPTIONS.EXTENSION:\n if (isCompatibleWith(CompatibilityTypes.Extension)) {\n throw new SyntaxError('Extension doesn\\'t support $extension modifier');\n }\n this.setOptionEnabled(NetworkRuleOption.Extension, false);\n break;\n // $all\n case OPTIONS.ALL:\n if (this.isAllowlist()) {\n throw new SyntaxError('Rule with $all modifier can not be allowlist rule');\n }\n // Set all request types\n Object.values(RequestType).forEach(function (type) {\n _this.setRequestType(type, true);\n });\n this.setOptionEnabled(NetworkRuleOption.Popup, true);\n break;\n // $empty and $mp4\n // Deprecated in favor of $redirect\n case OPTIONS.EMPTY:\n case OPTIONS.MP4:\n // Do nothing.\n break;\n default: {\n // clear empty values\n var modifierView = [optionName, optionValue]\n .filter(function (i) { return i; })\n .join('=');\n throw new SyntaxError(\"Unknown modifier: \".concat(modifierView));\n }\n }\n };\n /**\n * To calculate priority, we've categorized modifiers into different groups.\n * These groups are ranked based on their priority, from lowest to highest.\n * A modifier that significantly narrows the scope of a rule adds more\n * weight to its total priority. Conversely, if a rule applies to a broader\n * range of requests, its priority decreases.\n *\n * It's worth noting that there are cases where a single-parameter modifier\n * has a higher priority than multi-parameter ones. For instance, in\n * the case of `$domain=example.com|example.org`, a rule that includes two\n * domains has a slightly broader effective area than a rule with one\n * specified domain, therefore its priority is lower.\n *\n * The base priority weight of any rule is 1. If the calculated priority\n * is a floating-point number, it will be **rounded up** to the smallest\n * integer greater than or equal to the calculated weight.\n *\n * @see {@link NetworkRule.PermittedRequestTypeWeight}\n * @see {@link NetworkRule.PermittedDomainWeight}\n * @see {@link NetworkRule.SpecificExceptionsWeight}\n * @see {@link NetworkRule.AllowlistRuleWeight}\n * @see {@link NetworkRule.RedirectRuleWeight}\n * @see {@link NetworkRule.ImportantRuleWeight}\n *\n * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-counting}\n */\n NetworkRule.prototype.calculatePriorityWeight = function () {\n var _a, _b;\n // Base modifiers, category 1.\n this.priorityWeight += countEnabledBits(this.enabledOptions, NetworkRule.CATEGORY_1_OPTIONS_MASK);\n this.priorityWeight += countEnabledBits(this.disabledOptions, NetworkRule.CATEGORY_1_OPTIONS_MASK);\n /**\n * When dealing with a negated domain, app, method, or content-type,\n * we add a point for the existence of the modifier itself, regardless\n * of the quantity of negated domains or content-types. This is because\n * the rule's scope is already infinitely broad. Put simply,\n * by prohibiting multiple domains, content-types, methods or apps,\n * the scope of the rule becomes only minimally smaller.\n */\n if (this.denyAllowDomains && this.denyAllowDomains.length > 0) {\n this.priorityWeight += 1;\n }\n if (this.restrictedDomains && this.restrictedDomains.length > 0) {\n this.priorityWeight += 1;\n }\n if (((_a = this.methodModifier) === null || _a === void 0 ? void 0 : _a.restrictedValues) && this.methodModifier.restrictedValues.length > 0) {\n this.priorityWeight += 1;\n }\n if (this.restrictedRequestTypes !== RequestType.NotSet) {\n this.priorityWeight += 1;\n }\n // $to modifier is basically a replacement for a regular expression\n // See https://github.com/AdguardTeam/KnowledgeBase/pull/196#discussion_r1221401215\n if (this.toModifier) {\n this.priorityWeight += 1;\n }\n /**\n * Category 2: permitted request types and methods.\n * Specified content-types add `50 + 50 / number_of_content_types`,\n * for example: `||example.com^$image,script` will add\n * `50 + 50 / 2 = 50 + 25 = 75` to the total weight of the rule.\n * The `$popup` also belongs to this category, because it implicitly\n * adds the modifier `$document`.\n * Similarly, specific exceptions add `$document,subdocument`.\n */\n if (this.permittedRequestTypes !== RequestType.NotSet) {\n var numberOfPermittedRequestTypes = getBitCount(this.permittedRequestTypes);\n // More permitted request types mean less priority weight.\n var relativeWeight = NetworkRule.CategoryTwoWeight / numberOfPermittedRequestTypes;\n this.priorityWeight += NetworkRule.CategoryTwoWeight + relativeWeight;\n }\n if (((_b = this.methodModifier) === null || _b === void 0 ? void 0 : _b.permittedValues) && this.methodModifier.permittedValues.length > 0) {\n // More permitted request methods mean less priority weight.\n var relativeWeight = NetworkRule.CategoryTwoWeight / this.methodModifier.permittedValues.length;\n this.priorityWeight += NetworkRule.CategoryTwoWeight + relativeWeight;\n }\n /**\n * Category 3: permitted domains.\n * Specified domains through `$domain` and specified applications\n * through `$app` add `100 + 100 / number_domains (or number_applications)`,\n * for example:\n * `||example.com^$domain=example.com|example.org|example.net`\n * will add `100 + 100 / 3 = 134.3 = 134` or\n * `||example.com^$app=org.example.app1|org.example.app2`\n * will add `100 + 100 / 2 = 151`.\n */\n if (this.permittedDomains && this.permittedDomains.length > 0) {\n // More permitted domains mean less priority weight.\n var relativeWeight = NetworkRule.CategoryThreeWeight / this.permittedDomains.length;\n this.priorityWeight += NetworkRule.CategoryThreeWeight + relativeWeight;\n }\n // Category 4: redirect rules.\n if (this.isOptionEnabled(NetworkRuleOption.Redirect)) {\n this.priorityWeight += NetworkRule.CategoryFourWeight;\n }\n // Category 5: specific exceptions.\n this.priorityWeight += NetworkRule.CategoryFiveWeight * countEnabledBits(this.enabledOptions, NetworkRule.SPECIFIC_EXCLUSIONS_MASK);\n // Category 6: allowlist rules.\n if (this.isAllowlist()) {\n this.priorityWeight += NetworkRule.CategorySixWeight;\n }\n // Category 7: important rules.\n if (this.isOptionEnabled(NetworkRuleOption.Important)) {\n this.priorityWeight += NetworkRule.CategorySevenWeight;\n }\n // Round up to avoid overlap between different categories of rules.\n this.priorityWeight = Math.ceil(this.priorityWeight);\n };\n /**\n * Validates rule options\n */\n NetworkRule.prototype.validateOptions = function () {\n if (this.advancedModifier instanceof RemoveParamModifier) {\n this.validateRemoveParamRule();\n }\n else if (this.advancedModifier instanceof RemoveHeaderModifier) {\n this.validateRemoveHeaderRule();\n }\n else if (this.toModifier !== null) {\n this.validateToRule();\n }\n else if (this.denyAllowDomains !== null) {\n this.validateDenyallowRule();\n }\n };\n /**\n * $removeparam rules are not compatible with any other modifiers except $domain,\n * $third-party, $app, $important, $match-case and permitted content type modifiers ($script, $stylesheet, etc).\n * The rules with any other modifiers are considered invalid and will be discarded.\n */\n NetworkRule.prototype.validateRemoveParamRule = function () {\n if ((this.enabledOptions | NetworkRuleOption.RemoveParamCompatibleOptions)\n !== NetworkRuleOption.RemoveParamCompatibleOptions) {\n throw new SyntaxError('$removeparam rules are not compatible with some other modifiers');\n }\n };\n /**\n * $removeheader rules are not compatible with any other modifiers except $domain,\n * $third-party, $app, $important, $match-case and permitted content type modifiers ($script, $stylesheet, etc).\n * The rules with any other modifiers are considered invalid and will be discarded.\n */\n NetworkRule.prototype.validateRemoveHeaderRule = function () {\n if ((this.enabledOptions | NetworkRuleOption.RemoveHeaderCompatibleOptions)\n !== NetworkRuleOption.RemoveHeaderCompatibleOptions) {\n throw new SyntaxError('$removeheader rules are not compatible with some other modifiers');\n }\n };\n /**\n * $to rules are not compatible $denyallow - these rules considered invalid\n * and will be discarded.\n */\n NetworkRule.prototype.validateToRule = function () {\n if (this.denyAllowDomains) {\n throw new SyntaxError('modifier $to is not compatible with $denyallow modifier');\n }\n };\n /**\n * $denyallow rules are not compatible $to - these rules considered invalid\n * and will be discarded.\n */\n NetworkRule.prototype.validateDenyallowRule = function () {\n if (this.toModifier) {\n throw new SyntaxError('modifier $to is not compatible with $denyallow modifier');\n }\n };\n /**\n * parseRuleText splits the rule text into multiple parts.\n * @param ruleText - original rule text\n * @returns basic rule parts\n *\n * @throws error if the rule is empty (for instance, empty string or `@@`)\n */\n NetworkRule.parseRuleText = function (ruleText) {\n var ruleParts = new BasicRuleParts();\n ruleParts.allowlist = false;\n var startIndex = 0;\n if (ruleText.startsWith(NetworkRule.MASK_ALLOWLIST)) {\n ruleParts.allowlist = true;\n startIndex = NetworkRule.MASK_ALLOWLIST.length;\n }\n if (ruleText.length <= startIndex) {\n throw new SyntaxError('Rule is too short');\n }\n // Setting pattern to rule text (for the case of empty options)\n ruleParts.pattern = ruleText.substring(startIndex);\n // Avoid parsing options inside of a regex rule\n if (ruleParts.pattern.startsWith(SimpleRegex.MASK_REGEX_RULE)\n && ruleParts.pattern.endsWith(SimpleRegex.MASK_REGEX_RULE)\n && !ruleParts.pattern.includes(\"\".concat(NetworkRule.OPTIONS.REPLACE, \"=\"))) {\n return ruleParts;\n }\n var removeParamIndex = ruleText.lastIndexOf(\"\".concat(NetworkRule.OPTIONS.REMOVEPARAM, \"=\"));\n var endIndex = removeParamIndex >= 0 ? removeParamIndex : ruleText.length - 2;\n var foundEscaped = false;\n for (var i = endIndex; i >= startIndex; i -= 1) {\n var c = ruleText.charAt(i);\n if (c === NetworkRule.OPTIONS_DELIMITER) {\n if (i > startIndex && ruleText.charAt(i - 1) === NetworkRule.ESCAPE_CHARACTER) {\n foundEscaped = true;\n }\n else {\n ruleParts.pattern = ruleText.substring(startIndex, i);\n ruleParts.options = ruleText.substring(i + 1);\n if (foundEscaped) {\n // Find and replace escaped options delimiter\n ruleParts.options = ruleParts.options.replace(NetworkRule.RE_ESCAPED_OPTIONS_DELIMITER, NetworkRule.OPTIONS_DELIMITER);\n // Reset the regexp state\n NetworkRule.RE_ESCAPED_OPTIONS_DELIMITER.lastIndex = 0;\n }\n // Options delimiter was found, exiting loop\n break;\n }\n }\n }\n return ruleParts;\n };\n /**\n * Rules with base modifiers, from category 1, each of them adds 1\n * to the weight of the rule.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-1\n */\n NetworkRule.CATEGORY_1_OPTIONS_MASK = NetworkRuleOption.ThirdParty\n | NetworkRuleOption.MatchCase\n | NetworkRuleOption.DnsRewrite;\n /**\n * The priority weight used in {@link calculatePriorityWeight} for rules\n * with permitted request types and methods.\n * The value 50 is chosen in order to cover (with a margin) all possible\n * combinations and variations of rules from categories with a lower\n * priority (each of them adds 1 to the rule priority).\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-2\n */\n NetworkRule.CategoryTwoWeight = 50;\n /**\n * The priority weight used in {@link calculatePriorityWeight} for rules\n * with allowed domains.\n * The value 100 is chosen to cover all possible combinations and variations\n * of rules from categories with a lower priority, for example a rule with\n * one allowed query type will get priority 100 (50 + 50/1), but for allowed\n * domains with any number of domains we will get at least 101 (for 100\n * domains: 100 + 100/100; for 200 100 + 100/200; or even for 10000:\n * 100 + 100/10000) because the resulting weight is rounded up.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-3\n */\n NetworkRule.CategoryThreeWeight = 100;\n /**\n * The priority weight used in {@link calculatePriorityWeight}\n * for $redirect rules.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-6\n */\n NetworkRule.CategoryFourWeight = Math.pow(10, 3);\n /**\n * The priority weight used in {@link calculatePriorityWeight} for rules\n * with specific exceptions.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-4\n */\n NetworkRule.CategoryFiveWeight = Math.pow(10, 4);\n /**\n * Rules with specific exclusions, from category 4, each of them adds\n * {@link SpecificExceptionsWeight} to the weight of the rule.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-4\n */\n NetworkRule.SPECIFIC_EXCLUSIONS_MASK = NetworkRuleOption.Elemhide\n | NetworkRuleOption.Generichide\n | NetworkRuleOption.Specifichide\n | NetworkRuleOption.Content\n | NetworkRuleOption.Urlblock\n | NetworkRuleOption.Genericblock\n | NetworkRuleOption.Jsinject\n | NetworkRuleOption.Extension;\n /**\n * The priority weight used in {@link calculatePriorityWeight} for rules\n * with allowlist mark '@@'.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-5\n */\n NetworkRule.CategorySixWeight = Math.pow(10, 5);\n /**\n * The priority weight used in {@link calculatePriorityWeight}\n * for $important rules.\n *\n * @see https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-7\n */\n NetworkRule.CategorySevenWeight = Math.pow(10, 6);\n /**\n * Separates the rule pattern from the list of modifiers.\n *\n * ```\n * rule = [\"@@\"] pattern [ \"$\" modifiers ]\n * modifiers = [modifier0, modifier1[, ...[, modifierN]]]\n * ```\n */\n NetworkRule.OPTIONS_DELIMITER = OPTIONS_DELIMITER;\n /**\n * This character is used to escape special characters in modifiers values\n */\n NetworkRule.ESCAPE_CHARACTER = ESCAPE_CHARACTER;\n // eslint-disable-next-line max-len\n NetworkRule.RE_ESCAPED_OPTIONS_DELIMITER = new RegExp(\"\".concat(NetworkRule.ESCAPE_CHARACTER).concat(NetworkRule.OPTIONS_DELIMITER), 'g');\n /**\n * A marker that is used in rules of exception.\n * To turn off filtering for a request, start your rule with this marker.\n */\n NetworkRule.MASK_ALLOWLIST = MASK_ALLOWLIST;\n /**\n * Mark that negates options\n */\n NetworkRule.NOT_MARK = NOT_MARK;\n /**\n * Rule options\n */\n NetworkRule.OPTIONS = NETWORK_RULE_OPTIONS;\n return NetworkRule;\n}());\n\n/**\n * Implements a host rule.\n *\n * HostRule is a structure for simple host-level rules (i.e. /etc/hosts syntax).\n * http://man7.org/linux/man-pages/man5/hosts.5.html\n * It also supports \"just domain\" syntax. In this case, the IP will be set to 0.0.0.0.\n *\n * Rules syntax looks like this:\n * ```\n * IP_address canonical_hostname [aliases...]\n * ```\n *\n * Examples:\n * * `192.168.1.13 bar.mydomain.org bar` -- ipv4\n * * `ff02::1 ip6-allnodes` -- ipv6\n * * `::1 localhost ip6-localhost ip6-loopback` -- ipv6 aliases\n * * `example.org` -- \"just domain\" syntax\n */\nvar HostRule = /** @class */ (function () {\n /**\n * Constructor\n *\n * Parses the rule and creates a new HostRule instance\n *\n * @param ruleText - original rule text.\n * @param filterListId - ID of the filter list this rule belongs to.\n *\n * @throws error if it fails to parse the rule.\n */\n function HostRule(ruleText, filterListId) {\n this.hostnames = [];\n this.ip = '';\n this.invalid = false;\n this.ruleText = ruleText;\n this.filterListId = filterListId;\n var commentIndex = ruleText.indexOf('#');\n var stripped = commentIndex >= 0 ? ruleText.substring(0, commentIndex) : ruleText;\n var parts = stripped.trim().split(' ');\n if (parts.length >= 2) {\n if (!isIp(parts[0])) {\n this.invalid = true;\n return;\n }\n // eslint-disable-next-line prefer-destructuring\n this.ip = parts[0];\n this.hostnames = parts.slice(1).filter(function (x) { return !!x; });\n }\n else if (parts.length === 1 && isDomainName(parts[0])) {\n this.hostnames = [parts[0]];\n this.ip = '0.0.0.0';\n }\n else {\n this.invalid = true;\n }\n }\n /**\n * Match returns true if this rule can be used on the specified hostname.\n *\n * @param hostname - hostname to check\n */\n HostRule.prototype.match = function (hostname) {\n return this.hostnames.includes(hostname);\n };\n /**\n * Returns list id\n */\n HostRule.prototype.getFilterListId = function () {\n return this.filterListId;\n };\n /**\n * Return rule text\n */\n HostRule.prototype.getText = function () {\n return this.ruleText;\n };\n /**\n * Returns ip address\n */\n HostRule.prototype.getIp = function () {\n return this.ip;\n };\n /**\n * Returns hostnames\n */\n HostRule.prototype.getHostnames = function () {\n return this.hostnames;\n };\n /**\n * Is invalid rule\n */\n HostRule.prototype.isInvalid = function () {\n return this.invalid;\n };\n return HostRule;\n}());\n\n/**\n * MatchingResult contains all the rules matching a web request, and provides methods\n * that define how a web request should be processed\n */\nvar MatchingResult = /** @class */ (function () {\n /**\n * Creates an instance of the MatchingResult struct and fills it with the rules.\n *\n * @param rules A list of network rules that match the request.\n * @param sourceRule A rule that matches the document that is a source\n * of the request, i.e. document-level exclusions.\n */\n function MatchingResult(rules, sourceRule) {\n var _a;\n this.basicRule = null;\n this.documentRule = null;\n this.cspRules = null;\n this.cookieRules = null;\n this.replaceRules = null;\n this.removeParamRules = null;\n this.removeHeaderRules = null;\n this.redirectRules = null;\n this.stealthRule = null;\n // eslint-disable-next-line no-param-reassign\n rules = MatchingResult.removeBadfilterRules(rules);\n if (sourceRule) {\n this.documentRule = sourceRule;\n }\n // Second - check if blocking rules (generic or all of them) are allowed\n // generic blocking rules are allowed by default\n var genericAllowed = true;\n // basic blocking rules are allowed by default\n var basicAllowed = true;\n if (this.documentRule) {\n var documentRule = this.documentRule;\n if (documentRule.isOptionEnabled(NetworkRuleOption.Urlblock)) {\n basicAllowed = false;\n }\n else if (documentRule.isOptionEnabled(NetworkRuleOption.Genericblock)) {\n genericAllowed = false;\n }\n }\n // Iterate through the list of rules and fill the MatchingResult\n for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) {\n var rule = rules_1[_i];\n if (rule.isOptionEnabled(NetworkRuleOption.Cookie)) {\n if (!this.cookieRules) {\n this.cookieRules = [];\n }\n this.cookieRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Replace)) {\n if (!this.replaceRules) {\n this.replaceRules = [];\n }\n this.replaceRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.RemoveParam)) {\n if (!this.removeParamRules) {\n this.removeParamRules = [];\n }\n this.removeParamRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.RemoveHeader)) {\n if (!this.removeHeaderRules) {\n this.removeHeaderRules = [];\n }\n this.removeHeaderRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Redirect)) {\n if (!this.redirectRules) {\n this.redirectRules = [];\n }\n this.redirectRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Csp)) {\n if (!this.cspRules) {\n this.cspRules = [];\n }\n this.cspRules.push(rule);\n continue;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Stealth)) {\n this.stealthRule = rule;\n continue;\n }\n // Check blocking rules against $genericblock / $urlblock\n if (!rule.isAllowlist() && ((_a = this.documentRule) === null || _a === void 0 ? void 0 : _a.isHigherPriority(rule))) {\n if (!basicAllowed) {\n continue;\n }\n if (!genericAllowed && rule.isGeneric()) {\n continue;\n }\n }\n if (!this.basicRule || rule.isHigherPriority(this.basicRule)) {\n this.basicRule = rule;\n }\n }\n }\n /**\n * GetBasicResult returns a rule that should be applied to the web request.\n * Possible outcomes are:\n * returns nil -- allow the request.\n * returns an allowlist rule -- allow the request.\n * returns a blocking rule -- block the request.\n * returns a redirect rule -- redirect the request.\n *\n * @return {NetworkRule | null} basic result rule\n */\n MatchingResult.prototype.getBasicResult = function () {\n var basic = this.basicRule;\n if (!basic) {\n // Only document-level frame rule would be returned as a basic result,\n // cause only those rules could block or modify page subrequests.\n // Other frame rules (generichide, elemhide etc) will be used in getCosmeticOption function.\n if (this.documentRule && this.documentRule.isDocumentLevelAllowlistRule()) {\n basic = this.documentRule;\n }\n }\n // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#replace-modifier\n // https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-extra\n // $replace rules have a higher priority than other basic rules (including exception rules).\n // So if a request corresponds to two different rules one of which has the $replace modifier,\n // this rule will be applied.\n if (this.replaceRules) {\n var isReplaceOrContent = (basic === null || basic === void 0 ? void 0 : basic.isOptionEnabled(NetworkRuleOption.Replace))\n || (basic === null || basic === void 0 ? void 0 : basic.isOptionEnabled(NetworkRuleOption.Content));\n // If basic rule is an exception with $replace or $content modifier,\n // then basic rule will disable $replace rules.\n if ((basic === null || basic === void 0 ? void 0 : basic.isAllowlist()) && isReplaceOrContent) {\n return basic;\n }\n // Otherwise null is returned to allow the request, because we need\n // to get response first to then apply the $replace rules to\n // the response.\n return null;\n }\n // Redirect rules have a high priority\n // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#redirect-modifier\n // https://adguard.com/kb/general/ad-filtering/create-own-filters/#priority-category-6\n var redirectRule = this.getRedirectRule();\n if (redirectRule && (!basic || !basic.isHigherPriority(redirectRule))) {\n return redirectRule;\n }\n return basic;\n };\n /**\n * Returns a bit-flag with the list of cosmetic options\n *\n * @return {CosmeticOption} mask\n */\n MatchingResult.prototype.getCosmeticOption = function () {\n var _a = this, basicRule = _a.basicRule, documentRule = _a.documentRule;\n var rule = basicRule;\n // We choose a non-empty rule and the one of the two with the higher\n // priority in order to accurately calculate cosmetic options.\n if ((!rule && documentRule) || (rule && (documentRule === null || documentRule === void 0 ? void 0 : documentRule.isHigherPriority(rule)))) {\n rule = documentRule;\n }\n if (!rule || !rule.isAllowlist()) {\n return CosmeticOption.CosmeticOptionAll;\n }\n var option = CosmeticOption.CosmeticOptionAll;\n if (rule.isOptionEnabled(NetworkRuleOption.Elemhide)) {\n option ^= CosmeticOption.CosmeticOptionGenericCSS;\n option ^= CosmeticOption.CosmeticOptionSpecificCSS;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Generichide)) {\n option ^= CosmeticOption.CosmeticOptionGenericCSS;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Specifichide)) {\n option ^= CosmeticOption.CosmeticOptionSpecificCSS;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Jsinject)) {\n option ^= CosmeticOption.CosmeticOptionJS;\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Content)) {\n option ^= CosmeticOption.CosmeticOptionHtml;\n }\n return option;\n };\n /**\n * Return an array of replace rules\n */\n MatchingResult.prototype.getReplaceRules = function () {\n if (!this.replaceRules) {\n return [];\n }\n // TODO: Look up for allowlist $content rule\n return MatchingResult.filterAdvancedModifierRules(this.replaceRules, function (rule) { return (function (x) { return x.getAdvancedModifierValue() === rule.getAdvancedModifierValue(); }); });\n };\n /**\n * Filters array of rules according to allowlist rules contained.\n * Empty advanced modifier allowlists everything.\n *\n * @param rules\n * @param allowlistPredicate allowlist criteria\n * This function result will be called for testing if rule `x` allowlists rule `r`\n */\n MatchingResult.filterAdvancedModifierRules = function (rules, allowlistPredicate) {\n var _this = this;\n var blockingRules = [];\n var allowlistRules = [];\n for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) {\n var rule = rules_2[_i];\n if (rule.isAllowlist()) {\n allowlistRules.push(rule);\n }\n else {\n blockingRules.push(rule);\n }\n }\n if (blockingRules.length === 0) {\n return [];\n }\n if (allowlistRules.length === 0) {\n return blockingRules;\n }\n if (allowlistRules.length > 0) {\n var allowlistRuleWithEmptyOption_1 = allowlistRules\n .find(function (allowlistRule) { return allowlistRule.getAdvancedModifierValue() === ''; });\n var result_1 = [];\n blockingRules.forEach(function (blockRule) {\n if (allowlistRuleWithEmptyOption_1\n && !blockRule.isHigherPriority(allowlistRuleWithEmptyOption_1)) {\n result_1.push(allowlistRuleWithEmptyOption_1);\n return;\n }\n var allowlistingRule = allowlistRules.find(function (a) {\n return !blockRule.isHigherPriority(a) && allowlistPredicate.call(_this, blockRule)(a);\n });\n if (allowlistingRule) {\n result_1.push(allowlistingRule);\n }\n else {\n result_1.push(blockRule);\n }\n });\n return result_1.filter(function (item, pos) { return result_1.indexOf(item) === pos; });\n }\n return blockingRules;\n };\n /**\n * Returns an array of csp rules\n */\n MatchingResult.prototype.getCspRules = function () {\n if (!this.cspRules) {\n return [];\n }\n var blockingRules = [];\n var allowlistedRulesByDirective = new Map();\n for (var _i = 0, _a = this.cspRules; _i < _a.length; _i++) {\n var rule = _a[_i];\n if (rule.isAllowlist()) {\n if (!rule.getAdvancedModifierValue()) { // Global allowlist rule\n return [rule];\n }\n MatchingResult.putWithPriority(rule, undefined, allowlistedRulesByDirective);\n }\n else {\n blockingRules.push(rule);\n }\n }\n var rulesByDirective = new Map();\n // Collect allowlist and blocking CSP rules in one array\n blockingRules.forEach(function (rule) {\n if (rule.getAdvancedModifierValue()) {\n var allowlistRule = allowlistedRulesByDirective.get(rule.getAdvancedModifierValue());\n MatchingResult.putWithPriority(rule, allowlistRule, rulesByDirective);\n }\n });\n return Array.from(rulesByDirective.values());\n };\n /**\n * Returns a redirect rule or null if redirect rules are empty.\n * $redirect-rule is only returned if there's a blocking rule also matching\n * this request.\n */\n MatchingResult.prototype.getRedirectRule = function () {\n if (!this.redirectRules) {\n return null;\n }\n // Apply allowlist $redirect rules.\n var result = MatchingResult.filterAdvancedModifierRules(this.redirectRules, function (rule) { return (function (x) { return x.getAdvancedModifierValue() === rule.getAdvancedModifierValue(); }); });\n // Filters only not allowlist rules.\n result = result.filter(function (r) { return !r.isAllowlist(); });\n // Splits $redirect and $redirect-rule into separate arrays.\n var conditionalRedirectRules = [];\n var allWeatherRedirectRules = [];\n result.forEach(function (rule) {\n var redirectModifier = rule.getAdvancedModifier();\n if (redirectModifier.isRedirectingOnlyBlocked) {\n conditionalRedirectRules.push(rule);\n }\n else {\n allWeatherRedirectRules.push(rule);\n }\n });\n if (allWeatherRedirectRules.length > 0) {\n return allWeatherRedirectRules\n .sort(function (a, b) { return (b.isHigherPriority(a) ? 1 : -1); })[0];\n }\n if (conditionalRedirectRules.length > 0 && this.basicRule && !this.basicRule.isAllowlist()) {\n return conditionalRedirectRules\n .sort(function (a, b) { return (b.isHigherPriority(a) ? 1 : -1); })[0];\n }\n return null;\n };\n /**\n * Returns an array of cookie rules\n */\n MatchingResult.prototype.getCookieRules = function () {\n if (!this.cookieRules) {\n return [];\n }\n var basic = this.getBasicResult();\n if ((basic === null || basic === void 0 ? void 0 : basic.isAllowlist()) && basic.isOptionEnabled(NetworkRuleOption.Urlblock)) {\n return [];\n }\n var allowlistPredicate = function (rule) { return (function (allowlistRule) {\n var allowlistRuleCookieModifier = allowlistRule.getAdvancedModifier();\n var ruleCookieModifier = rule.getAdvancedModifier();\n if (allowlistRule.getAdvancedModifierValue() === rule.getAdvancedModifierValue()) {\n return true;\n }\n // Matches by cookie name\n if (allowlistRuleCookieModifier.matches(ruleCookieModifier.getCookieName())) {\n return true;\n }\n return false;\n }); };\n var filtered = MatchingResult.filterAdvancedModifierRules(this.cookieRules, allowlistPredicate);\n return filtered.concat(__spreadArray([], this.cookieRules.filter(function (r) { return r.isAllowlist(); }), true));\n };\n /**\n * Returns an array of removeparam rules\n */\n MatchingResult.prototype.getRemoveParamRules = function () {\n if (!this.removeParamRules) {\n return [];\n }\n return MatchingResult.filterAdvancedModifierRules(this.removeParamRules, \n // eslint-disable-next-line arrow-body-style\n function (rule) { return (function (x) {\n return x.isHigherPriority(rule) && x.getAdvancedModifierValue() === rule.getAdvancedModifierValue();\n }); });\n };\n /**\n * Returns an array of removeheader rules\n */\n MatchingResult.prototype.getRemoveHeaderRules = function () {\n if (!this.removeHeaderRules) {\n return [];\n }\n if (this.basicRule\n && this.basicRule.isAllowlist()\n && this.basicRule.isOptionEnabled(NetworkRuleOption.Urlblock)) {\n return [];\n }\n return MatchingResult.filterAdvancedModifierRules(this.removeHeaderRules, function (rule) { return (function (x) { return x.getAdvancedModifierValue() === rule.getAdvancedModifierValue(); }); });\n };\n /**\n * Decides which rule should be put into the given map.\n * Compares priorities of the two given rules with the equal CSP directive and the rule that may already in the map.\n *\n * @param rule CSP rule (not null)\n * @param allowlistRule CSP allowlist rule (may be null)\n * @param map Rules mapped by csp directive\n */\n // eslint-disable-next-line max-len\n MatchingResult.putWithPriority = function (rule, allowlistRule, map) {\n var cspDirective = rule.getAdvancedModifierValue();\n var currentRule = cspDirective ? map.get(cspDirective) : null;\n var newRule = rule;\n if (currentRule && !rule.isHigherPriority(currentRule)) {\n newRule = currentRule;\n }\n if (allowlistRule && allowlistRule.isHigherPriority(newRule)) {\n newRule = allowlistRule;\n }\n map.set(cspDirective, newRule);\n };\n /**\n * Looks if there are any matching $badfilter rules and removes\n * matching bad filters from the array (see the $badfilter description for more info)\n *\n * @param rules to filter\n * @return filtered rules\n */\n MatchingResult.removeBadfilterRules = function (rules) {\n var badfilterRules = [];\n for (var _i = 0, rules_3 = rules; _i < rules_3.length; _i++) {\n var rule = rules_3[_i];\n if (rule.isOptionEnabled(NetworkRuleOption.Badfilter)) {\n badfilterRules.push(rule);\n }\n }\n if (badfilterRules.length > 0) {\n return rules.filter(function (rule) {\n if (rule.isOptionEnabled(NetworkRuleOption.Badfilter)) {\n return false;\n }\n var isRuleNegated = badfilterRules.some(function (badfilter) { return badfilter.negatesBadfilter(rule); });\n return !isRuleNegated;\n });\n }\n return rules;\n };\n return MatchingResult;\n}());\n\n/**\n * Scanner types enum\n */\nvar ScannerType;\n(function (ScannerType) {\n /**\n * Scanning for network rules\n */\n ScannerType[ScannerType[\"NetworkRules\"] = 0] = \"NetworkRules\";\n /**\n * Scanning for cosmetic rules\n */\n ScannerType[ScannerType[\"CosmeticRules\"] = 2] = \"CosmeticRules\";\n /**\n * Scanning for host rules\n */\n ScannerType[ScannerType[\"HostRules\"] = 4] = \"HostRules\";\n /**\n * All\n */\n ScannerType[ScannerType[\"All\"] = 6] = \"All\";\n})(ScannerType || (ScannerType = {}));\n\n/**\n * Prefix tree implementation\n */\nvar TrieNode = /** @class */ (function () {\n /**\n * Creates an instance of a TrieNode with the specified char code.\n *\n * @param code\n */\n function TrieNode(code) {\n this.code = code;\n }\n /**\n * Attaches data to this TrieNode.\n *\n * @param data\n */\n TrieNode.prototype.attach = function (data) {\n if (!this.data) {\n this.data = [];\n }\n this.data.push(data);\n };\n /**\n * Adds the specified string to the Trie and attaches data to it.\n *\n * @param str string to add.\n * @param data data to attach to the leaf node.\n */\n TrieNode.prototype.add = function (str, data) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var root = this;\n for (var i = 0; i < str.length; i += 1) {\n var c = str.charCodeAt(i);\n var next = root.getChild(c);\n if (!next) {\n next = root.addChild(c);\n }\n root = next;\n }\n root.attach(data);\n };\n /**\n * Traverses this TrieNode and it's children using the specified search string.\n * This method collects all the data that's attached on the way and returns as\n * a result.\n *\n * @param str string to check.\n * @param start index in str where to start traversing from.\n */\n TrieNode.prototype.traverse = function (str, start) {\n var result = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var current = this;\n for (var i = start; i < str.length; i += 1) {\n var c = str.charCodeAt(i);\n var next = current.getChild(c);\n if (!next) {\n break;\n }\n if (next.data) {\n result.push.apply(result, next.data);\n }\n current = next;\n }\n return result;\n };\n /**\n * Traverses this TrieNode and it's children using the specified search string and all substrings.\n *\n * @param str string to check\n * @param len max length to check\n */\n TrieNode.prototype.traverseAll = function (str, len) {\n var data = [];\n for (var i = 0; i <= len; i += 1) {\n var result = this.traverse(str, i);\n if (result) {\n data.push.apply(data, result);\n }\n }\n return data;\n };\n /**\n * Returns a child node with the specified character code or\n * undefined if not found.\n *\n * @param code character code\n * @returns child node or undefined.\n */\n TrieNode.prototype.getChild = function (code) {\n var children = this.children;\n if (!children) {\n return undefined;\n }\n if (children instanceof TrieNode) {\n if (children.code === code) {\n return children;\n }\n return undefined;\n }\n return children.get(code);\n };\n /**\n * Adds a new child node with the specified character code.\n *\n * @param code character code.\n * @returns the newly created TrieNode.\n */\n TrieNode.prototype.addChild = function (code) {\n var node = new TrieNode(code);\n if (!this.children) {\n this.children = node;\n }\n else if (this.children instanceof TrieNode) {\n var oldNode = this.children;\n this.children = new Map();\n this.children.set(oldNode.code, oldNode);\n this.children.set(code, node);\n }\n else {\n this.children.set(code, node);\n }\n return node;\n };\n return TrieNode;\n}());\n\n/**\n * Look up table with underlying prefix tree\n */\nvar TrieLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance of the TrieLookupTable.\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function TrieLookupTable(storage) {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n this.ruleStorage = storage;\n this.trie = new TrieNode(0);\n }\n /**\n * Finds all matching rules from the shortcuts lookup table\n *\n * @param request to check\n * @return array of matching rules\n */\n TrieLookupTable.prototype.matchAll = function (request) {\n var rulesIndexes = this.traverse(request);\n return this.matchRules(request, rulesIndexes);\n };\n /**\n * Tries to add the rule to the lookup table.\n * returns true if it was added\n *\n * @param rule to add\n * @param storageIdx index\n * @return {boolean} true if the rule been added\n */\n TrieLookupTable.prototype.addRule = function (rule, storageIdx) {\n var shortcut = rule.getShortcut();\n if (!shortcut || TrieLookupTable.isAnyURLShortcut(shortcut)\n || shortcut.length < SimpleRegex.MIN_SHORTCUT_LENGTH) {\n return false;\n }\n this.trie.add(shortcut, storageIdx);\n this.rulesCount += 1;\n return true;\n };\n /**\n * @return total rules count\n */\n TrieLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * For specified request finds matching rules from rules indexes array\n *\n * @param request\n * @param rulesIndexes\n */\n TrieLookupTable.prototype.matchRules = function (request, rulesIndexes) {\n if (!rulesIndexes) {\n return [];\n }\n var result = [];\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var idx = rulesIndexes[j];\n var rule = this.ruleStorage.retrieveNetworkRule(idx);\n if (rule && rule.match(request, false)) {\n result.push(rule);\n }\n }\n return result;\n };\n /**\n * Traverses trie\n *\n * @param request\n */\n TrieLookupTable.prototype.traverse = function (request) {\n return this.trie.traverseAll(request.urlLowercase, request.urlLowercase.length);\n };\n /**\n * Checks if the rule potentially matches too many URLs.\n * We'd better use another type of lookup table for this kind of rules.\n *\n * @param shortcut to check\n * @return check result\n */\n TrieLookupTable.isAnyURLShortcut = function (shortcut) {\n // The numbers are basically (\"PROTO://\".length + 1)\n if (shortcut.length < 6 && shortcut.indexOf('ws:') === 0) {\n return true;\n }\n if (shortcut.length < 7 && shortcut.indexOf('|ws') === 0) {\n return true;\n }\n if (shortcut.length < 9 && shortcut.indexOf('http') === 0) {\n return true;\n }\n return !!(shortcut.length < 10 && shortcut.indexOf('|http') === 0);\n };\n return TrieLookupTable;\n}());\n\n/**\n * Domain lookup table. Key is the domain name hash.\n */\nvar DomainsLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function DomainsLookupTable(storage) {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n /**\n * Domain lookup table. Key is the domain name hash.\n */\n this.domainsLookupTable = new Map();\n this.ruleStorage = storage;\n }\n /**\n * addRule implements the ILookupTable interface for DomainsLookupTable.\n * @param rule\n * @param storageIdx\n */\n DomainsLookupTable.prototype.addRule = function (rule, storageIdx) {\n var _this = this;\n var permittedDomains = rule.getPermittedDomains();\n if (!permittedDomains || permittedDomains.length === 0) {\n return false;\n }\n var hasWildcardDomain = permittedDomains.some(function (d) { return DomainModifier.isWildcardDomain(d); });\n if (hasWildcardDomain) {\n return false;\n }\n permittedDomains.forEach(function (domain) {\n var hash = fastHash(domain);\n // Add the rule to the lookup table\n var rulesIndexes = _this.domainsLookupTable.get(hash);\n if (!rulesIndexes) {\n rulesIndexes = [];\n }\n rulesIndexes.push(storageIdx);\n _this.domainsLookupTable.set(hash, rulesIndexes);\n });\n this.rulesCount += 1;\n return true;\n };\n /**\n * Implements the ILookupTable interface method.\n */\n DomainsLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * Implements the ILookupTable interface method.\n * @param request\n */\n DomainsLookupTable.prototype.matchAll = function (request) {\n var result = [];\n if (!request.sourceHostname) {\n return result;\n }\n var domains = request.subdomains;\n if (request.hostname !== request.sourceHostname) {\n domains.push.apply(domains, request.sourceSubdomains);\n }\n for (var i = 0; i < domains.length; i += 1) {\n var hash = fastHash(domains[i]);\n var rulesIndexes = this.domainsLookupTable.get(hash);\n if (rulesIndexes) {\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this.ruleStorage.retrieveNetworkRule(rulesIndexes[j]);\n if (rule && rule.match(request)) {\n result.push(rule);\n }\n }\n }\n }\n return result;\n };\n return DomainsLookupTable;\n}());\n\n/**\n * Hostname lookup table.\n * For specific kind of rules like '||hostname^' and '||hostname/path' more simple algorithm with hashes is faster.\n */\nvar HostnameLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function HostnameLookupTable(storage) {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n /**\n * Domain lookup table. Key is the domain name hash.\n */\n this.hostnameLookupTable = new Map();\n this.ruleStorage = storage;\n }\n /**\n * addRule implements the ILookupTable interface for DomainsLookupTable.\n * @param rule\n * @param storageIdx\n */\n HostnameLookupTable.prototype.addRule = function (rule, storageIdx) {\n var pattern = rule.getPattern();\n var hostname = '';\n // Pattern: '||example.org^'\n if (pattern.startsWith(SimpleRegex.MASK_START_URL) && pattern.endsWith(SimpleRegex.MASK_SEPARATOR)) {\n hostname = pattern.slice(SimpleRegex.MASK_START_URL.length, pattern.length - SimpleRegex.MASK_SEPARATOR.length);\n }\n // Pattern: '||example.org/path'\n if (pattern.startsWith(SimpleRegex.MASK_START_URL) && pattern.indexOf(SimpleRegex.MASK_BACKSLASH) !== -1) {\n var end = pattern.indexOf(SimpleRegex.MASK_BACKSLASH);\n hostname = pattern.slice(SimpleRegex.MASK_START_URL.length, end);\n }\n if (!HostnameLookupTable.isValidHostname(hostname)) {\n return false;\n }\n var hash = fastHash(hostname);\n var rulesIndexes = this.hostnameLookupTable.get(hash);\n if (!rulesIndexes) {\n rulesIndexes = new Array();\n this.hostnameLookupTable.set(hash, rulesIndexes);\n }\n rulesIndexes.push(storageIdx);\n this.rulesCount += 1;\n return true;\n };\n /**\n * Implements the ILookupTable interface method.\n */\n HostnameLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * Implements the ILookupTable interface method.\n * @param request\n */\n HostnameLookupTable.prototype.matchAll = function (request) {\n var result = [];\n var domains = request.subdomains;\n for (var i = 0; i < domains.length; i += 1) {\n var hash = fastHash(domains[i]);\n var rulesIndexes = this.hostnameLookupTable.get(hash);\n if (rulesIndexes) {\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this.ruleStorage.retrieveNetworkRule(rulesIndexes[j]);\n if (rule && rule.match(request)) {\n result.push(rule);\n }\n }\n }\n }\n return result;\n };\n /**\n * Checks if this hostname string is valid\n *\n * @param hostname\n */\n HostnameLookupTable.isValidHostname = function (hostname) {\n if (!hostname) {\n return false;\n }\n if (hostname.indexOf(SimpleRegex.MASK_ANY_CHARACTER) !== -1) {\n return false;\n }\n if (hostname.indexOf('.') < 0 || hostname.endsWith('.')) {\n return false;\n }\n return true;\n };\n return HostnameLookupTable;\n}());\n\n/**\n * Sequence scan lookup table of rules for which we could not find a shortcut\n * and could not place it to the shortcuts lookup table.\n * In common case of rule there is always a way to just check a rule.match().\n */\nvar SeqScanLookupTable = /** @class */ (function () {\n function SeqScanLookupTable() {\n /**\n * Count of rules added to this lookup table.\n */\n this.rulesCount = 0;\n /**\n * Rules for which we could not find a shortcut and could not place it to the shortcuts lookup table.\n */\n this.rules = [];\n }\n /**\n * addRule implements the ILookupTable interface for SeqScanLookupTable.\n * @param rule\n */\n SeqScanLookupTable.prototype.addRule = function (rule) {\n if (!this.rules.includes(rule)) {\n this.rules.push(rule);\n this.rulesCount += 1;\n return true;\n }\n return false;\n };\n /**\n * Implements the ILookupTable interface method.\n */\n SeqScanLookupTable.prototype.getRulesCount = function () {\n return this.rulesCount;\n };\n /**\n * Implements the ILookupTable interface method.\n * @param request\n */\n SeqScanLookupTable.prototype.matchAll = function (request) {\n var result = [];\n for (var i = 0; i < this.rules.length; i += 1) {\n var r = this.rules[i];\n if (r.match(request)) {\n result.push(r);\n }\n }\n return result;\n };\n return SeqScanLookupTable;\n}());\n\n/**\n * NetworkEngine is the engine that supports quick search over network rules\n */\nvar NetworkEngine = /** @class */ (function () {\n /**\n * Builds an instance of the network engine\n *\n * @param storage an object for a rules storage.\n * @param skipStorageScan create an instance without storage scanning.\n */\n function NetworkEngine(storage, skipStorageScan) {\n if (skipStorageScan === void 0) { skipStorageScan = false; }\n this.ruleStorage = storage;\n this.rulesCount = 0;\n this.domainsLookupTable = new DomainsLookupTable(storage);\n this.hostnameLookupTable = new HostnameLookupTable(storage);\n this.shortcutsLookupTable = new TrieLookupTable(storage);\n this.seqScanLookupTable = new SeqScanLookupTable();\n if (skipStorageScan) {\n return;\n }\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.NetworkRules);\n while (scanner.scan()) {\n var indexedRule = scanner.getRule();\n if (indexedRule\n && indexedRule.rule instanceof NetworkRule) {\n this.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n }\n /**\n * Match searches over all filtering rules loaded to the engine\n * It returns rule if a match was found alongside the matching rule\n *\n * @param request to check\n * @return rule matching request or null\n */\n NetworkEngine.prototype.match = function (request) {\n var networkRules = this.matchAll(request);\n if (networkRules.length === 0) {\n return null;\n }\n var result = new MatchingResult(networkRules, null);\n return result.getBasicResult();\n };\n /**\n * Finds all rules matching the specified request regardless of the rule types\n * It will find both allowlist and blacklist rules\n *\n * @param request to check\n * @return array of matching rules\n */\n NetworkEngine.prototype.matchAll = function (request) {\n // First check by shortcuts\n var result = this.hostnameLookupTable.matchAll(request);\n result.push.apply(result, (this.shortcutsLookupTable.matchAll(request)));\n result.push.apply(result, (this.domainsLookupTable.matchAll(request)));\n result.push.apply(result, (this.seqScanLookupTable.matchAll(request)));\n return result;\n };\n /**\n * Adds rule to the network engine\n *\n * @param rule\n * @param storageIdx\n */\n NetworkEngine.prototype.addRule = function (rule, storageIdx) {\n if (!this.hostnameLookupTable.addRule(rule, storageIdx)) {\n if (!this.shortcutsLookupTable.addRule(rule, storageIdx)) {\n if (!this.domainsLookupTable.addRule(rule, storageIdx)) {\n this.seqScanLookupTable.addRule(rule, storageIdx);\n }\n }\n }\n this.rulesCount += 1;\n };\n return NetworkEngine;\n}());\n\n/**\n * Request represents a web request with all it's necessary properties\n */\nvar Request = /** @class */ (function () {\n /**\n * Creates an instance of a Request\n *\n * @param url - request URL\n * @param sourceUrl - source URL\n * @param requestType - request type\n * @param method - request method\n *\n * @throws\n */\n function Request(url, sourceUrl, requestType, method) {\n /**\n * the request is for a given Hostname, and not for a URL, and we don't really know what protocol it is.\n * This can be true for DNS requests, or for HTTP CONNECT, or SNI matching.\n */\n this.isHostnameRequest = false;\n if (typeof url !== 'string') {\n throw new TypeError(\"Invalid request url: \".concat(url));\n }\n this.url = url;\n this.requestType = requestType;\n this.method = method;\n this.urlLowercase = Request.compactUrl(url).toLowerCase();\n this.sourceUrl = Request.compactUrl(sourceUrl);\n var tldResult = parse(url);\n this.hostname = tldResult.hostname;\n this.domain = tldResult.domain;\n this.subdomains = Request.getSubdomains(tldResult);\n var sourceTldResult;\n if (sourceUrl) {\n sourceTldResult = parse(sourceUrl);\n this.sourceHostname = sourceTldResult.hostname;\n this.sourceDomain = sourceTldResult.domain;\n this.sourceSubdomains = Request.getSubdomains(sourceTldResult);\n }\n else {\n this.sourceHostname = null;\n this.sourceDomain = null;\n this.sourceSubdomains = [];\n }\n if (this.sourceDomain) {\n this.thirdParty = this.domain !== this.sourceDomain;\n }\n else if (sourceTldResult && sourceTldResult.isIp) {\n this.thirdParty = this.hostname !== this.sourceHostname;\n }\n else {\n this.thirdParty = null;\n }\n }\n /**\n * We cut the url in performance purposes\n * @param url\n */\n Request.compactUrl = function (url) {\n var compacted = url;\n if (compacted && compacted.length > Request.MAX_URL_MATCH_LENGTH) {\n compacted = compacted.substring(0, Request.MAX_URL_MATCH_LENGTH);\n }\n return compacted;\n };\n /**\n * Splits subdomains and returns all subdomains (including the hostname itself)\n *\n * @param tldResult\n * @returns array of subdomains\n */\n Request.getSubdomains = function (tldResult) {\n var domain = tldResult.domain, hostname = tldResult.hostname, subdomain = tldResult.subdomain, publicSuffix = tldResult.publicSuffix;\n var subdomainsResult = [];\n if (!domain) {\n if (hostname) {\n subdomainsResult.push(hostname);\n return subdomainsResult;\n }\n return [];\n }\n if (publicSuffix) {\n subdomainsResult.push(publicSuffix);\n // Extract subdomains from complex suffixes\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2037\n // https://github.com/AdguardTeam/tsurlfilter/issues/57\n for (var i = 0; i < publicSuffix.length; i += 1) {\n if (publicSuffix[i] === '.') {\n subdomainsResult.push(publicSuffix.slice(i + 1));\n }\n }\n }\n subdomainsResult.push(domain);\n if (!subdomain) {\n return subdomainsResult;\n }\n var parts = subdomain.split('.');\n var incrementDomain = domain;\n for (var i = parts.length - 1; i >= 0; i -= 1) {\n incrementDomain = \"\".concat(parts[i], \".\").concat(incrementDomain);\n subdomainsResult.push(incrementDomain);\n }\n return subdomainsResult;\n };\n /**\n * Max url length for matching\n * Some urls are really long and slow down matching, so we cut them to this length.\n */\n Request.MAX_URL_MATCH_LENGTH = 2000;\n return Request;\n}());\n\n/**\n * DnsResult contains a network rule and host rules matching request\n */\nvar DnsResult = /** @class */ (function () {\n function DnsResult() {\n /**\n * BasicRule - a network rule matching the request.\n */\n this.basicRule = null;\n /**\n * Host rules\n */\n this.hostRules = [];\n }\n return DnsResult;\n}());\n\n/**\n * DNSEngine combines host rules and network rules and is supposed to quickly find\n * matching rules for hostnames.\n * First, it looks over network rules and returns first rule found.\n * Then, if nothing found, it looks up the host rules.\n */\nvar DnsEngine = /** @class */ (function () {\n /**\n * Builds an instance of dns engine\n *\n * @param storage\n */\n function DnsEngine(storage) {\n this.ruleStorage = storage;\n this.rulesCount = 0;\n this.lookupTable = new Map();\n this.networkEngine = new NetworkEngine(storage, true);\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.HostRules);\n while (scanner.scan()) {\n var indexedRule = scanner.getRule();\n if (indexedRule) {\n if (indexedRule.rule instanceof HostRule) {\n this.addRule(indexedRule.rule, indexedRule.index);\n }\n else if (indexedRule.rule instanceof NetworkRule\n && indexedRule.rule.isHostLevelNetworkRule()) {\n this.networkEngine.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n }\n }\n /**\n * Match searches over all filtering and host rules loaded to the engine\n *\n * @param hostname to check\n * @return dns result object\n */\n DnsEngine.prototype.match = function (hostname) {\n var result = new DnsResult();\n if (!hostname) {\n return result;\n }\n var url = \"http://\".concat(hostname, \"/\");\n var request = new Request(url, url, RequestType.Document);\n request.isHostnameRequest = true;\n var networkRule = this.networkEngine.match(request);\n if (networkRule) {\n // Network rules always have higher priority\n result.basicRule = networkRule;\n return result;\n }\n var hash = fastHash(hostname);\n var rulesIndexes = this.lookupTable.get(hash);\n if (rulesIndexes) {\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this.ruleStorage.retrieveHostRule(rulesIndexes[j]);\n if (rule && rule.match(hostname)) {\n result.hostRules.push(rule);\n }\n }\n }\n return result;\n };\n /**\n * Adds rule to engine\n *\n * @param rule\n * @param storageIdx\n */\n DnsEngine.prototype.addRule = function (rule, storageIdx) {\n var _this = this;\n rule.getHostnames().forEach(function (hostname) {\n var hash = fastHash(hostname);\n // Add the rule to the lookup table\n var rulesIndexes = _this.lookupTable.get(hash);\n if (!rulesIndexes) {\n rulesIndexes = [];\n }\n rulesIndexes.push(storageIdx);\n _this.lookupTable.set(hash, rulesIndexes);\n });\n this.rulesCount += 1;\n };\n return DnsEngine;\n}());\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar lru = {exports: {}};\n\n(function (module, exports) {\n\t!function(g,c){c(exports);}(commonjsGlobal,function(g){const c=Symbol(\"newer\"),e=Symbol(\"older\");class n{constructor(a,b){typeof a!==\"number\"&&(b=a,a=0),this.size=0,this.limit=a,this.oldest=this.newest=void 0,this._keymap=new Map(),b&&(this.assign(b),a<1&&(this.limit=this.size));}_markEntryAsUsed(a){if(a===this.newest)return;a[c]&&(a===this.oldest&&(this.oldest=a[c]),a[c][e]=a[e]),a[e]&&(a[e][c]=a[c]),a[c]=void 0,a[e]=this.newest,this.newest&&(this.newest[c]=a),this.newest=a;}assign(a){let b,d=this.limit||Number.MAX_VALUE;this._keymap.clear();let m=a[Symbol.iterator]();for(let h=m.next();!h.done;h=m.next()){let f=new l(h.value[0],h.value[1]);this._keymap.set(f.key,f),b?(b[c]=f,f[e]=b):this.oldest=f,b=f;if(d--==0)throw new Error(\"overflow\")}this.newest=b,this.size=this._keymap.size;}get(a){var b=this._keymap.get(a);return b?(this._markEntryAsUsed(b),b.value):void 0}set(a,b){var d=this._keymap.get(a);return d?(d.value=b,this._markEntryAsUsed(d),this):(this._keymap.set(a,d=new l(a,b)),this.newest?(this.newest[c]=d,d[e]=this.newest):this.oldest=d,this.newest=d,++this.size,this.size>this.limit&&this.shift(),this)}shift(){var a=this.oldest;if(a)return this.oldest[c]?(this.oldest=this.oldest[c],this.oldest[e]=void 0):(this.oldest=void 0,this.newest=void 0),a[c]=a[e]=void 0,this._keymap.delete(a.key),--this.size,[a.key,a.value]}find(a){let b=this._keymap.get(a);return b?b.value:void 0}has(a){return this._keymap.has(a)}delete(a){var b=this._keymap.get(a);return b?(this._keymap.delete(b.key),b[c]&&b[e]?(b[e][c]=b[c],b[c][e]=b[e]):b[c]?(b[c][e]=void 0,this.oldest=b[c]):b[e]?(b[e][c]=void 0,this.newest=b[e]):this.oldest=this.newest=void 0,this.size--,b.value):void 0}clear(){this.oldest=this.newest=void 0,this.size=0,this._keymap.clear();}keys(){return new j(this.oldest)}values(){return new k(this.oldest)}entries(){return this}[Symbol.iterator](){return new i(this.oldest)}forEach(a,b){typeof b!==\"object\"&&(b=this);let d=this.oldest;for(;d;)a.call(b,d.value,d.key,this),d=d[c];}toJSON(){for(var a=new Array(this.size),b=0,d=this.oldest;d;)a[b++]={key:d.key,value:d.value},d=d[c];return a}toString(){for(var a=\"\",b=this.oldest;b;)a+=String(b.key)+\":\"+b.value,b=b[c],b&&(a+=\" < \");return a}}g.LRUMap=n;function l(a,b){this.key=a,this.value=b,this[c]=void 0,this[e]=void 0;}function i(a){this.entry=a;}i.prototype[Symbol.iterator]=function(){return this},i.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:[a.key,a.value]}):{done:!0,value:void 0}};function j(a){this.entry=a;}j.prototype[Symbol.iterator]=function(){return this},j.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.key}):{done:!0,value:void 0}};function k(a){this.entry=a;}k.prototype[Symbol.iterator]=function(){return this},k.prototype.next=function(){let a=this.entry;return a?(this.entry=a[c],{done:!1,value:a.value}):{done:!0,value:void 0}};});\n\t\n} (lru, lru.exports));\n\n/**\n * CosmeticLookupTable lets quickly lookup cosmetic rules for the specified hostname.\n * It is primarily used by the {@see CosmeticEngine}.\n */\nvar CosmeticLookupTable = /** @class */ (function () {\n /**\n * Creates a new instance\n *\n * @param storage rules storage. We store \"rule indexes\" in the lookup table which\n * can be used to retrieve the full rules from the storage.\n */\n function CosmeticLookupTable(storage) {\n this.byHostname = new Map();\n this.wildcardRules = [];\n this.genericRules = [];\n this.allowlist = new Map();\n this.ruleStorage = storage;\n }\n /**\n * Adds rule to the appropriate collection\n * @param rule\n * @param storageIdx\n */\n CosmeticLookupTable.prototype.addRule = function (rule, storageIdx) {\n if (rule.isAllowlist()) {\n var key = rule.getContent();\n var existingRules = this.allowlist.get(key) || [];\n existingRules.push(storageIdx);\n this.allowlist.set(key, existingRules);\n return;\n }\n if (rule.isGeneric()) {\n this.genericRules.push(rule);\n return;\n }\n var domains = rule.getPermittedDomains();\n if (domains) {\n var hasWildcardDomain = domains.some(function (d) { return DomainModifier.isWildcardDomain(d); });\n if (hasWildcardDomain) {\n this.wildcardRules.push(rule);\n return;\n }\n for (var _i = 0, domains_1 = domains; _i < domains_1.length; _i++) {\n var domain = domains_1[_i];\n var tldResult = parse(domain);\n // tldResult.domain equals to eTLD domain,\n // e.g. sub.example.uk.org would result in example.uk.org\n var parsedDomain = tldResult.domain || domain;\n var key = fastHash(parsedDomain);\n var rules = this.byHostname.get(key) || [];\n rules.push(storageIdx);\n this.byHostname.set(key, rules);\n }\n }\n };\n /**\n * Finds rules by hostname\n * @param request\n * @param subdomains\n */\n CosmeticLookupTable.prototype.findByHostname = function (request) {\n var result = [];\n var subdomains = request.subdomains;\n var _loop_1 = function (i) {\n var subdomain = subdomains[i];\n var rulesIndexes = this_1.byHostname.get(fastHash(subdomain));\n if (rulesIndexes) {\n // Filtering out duplicates\n rulesIndexes = rulesIndexes.filter(function (v, index) { return rulesIndexes.indexOf(v) === index; });\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var rule = this_1.ruleStorage.retrieveRule(rulesIndexes[j]);\n if (rule && rule.match(request)) {\n result.push(rule);\n }\n }\n }\n };\n var this_1 = this;\n // Iterate over all sub-domains\n for (var i = 0; i < subdomains.length; i += 1) {\n _loop_1(i);\n }\n result.push.apply(result, this.wildcardRules.filter(function (r) { return r.match(request); }));\n return result.filter(function (rule) { return !rule.isAllowlist(); });\n };\n /**\n * Checks if the rule is disabled on the specified hostname.\n * @param request\n * @param rule\n */\n CosmeticLookupTable.prototype.isAllowlisted = function (request, rule) {\n var rulesIndexes = this.allowlist.get(rule.getContent());\n if (!rulesIndexes) {\n return false;\n }\n for (var j = 0; j < rulesIndexes.length; j += 1) {\n var r = this.ruleStorage.retrieveRule(rulesIndexes[j]);\n if (r && r.match(request)) {\n return true;\n }\n }\n return false;\n };\n return CosmeticLookupTable;\n}());\n\nvar CosmeticRuleModifiers;\n(function (CosmeticRuleModifiers) {\n CosmeticRuleModifiers[\"Path\"] = \"path\";\n CosmeticRuleModifiers[\"Domain\"] = \"domain\";\n})(CosmeticRuleModifiers || (CosmeticRuleModifiers = {}));\nvar CosmeticRuleModifiersSyntax = {\n OpenBracket: '[',\n CloseBracket: ']',\n SpecialSymbol: '$',\n Delimiter: ',',\n Assigner: '=',\n EscapeCharacter: '\\\\',\n};\n\nvar cosmeticRuleModifiersList = Object.values(CosmeticRuleModifiers);\n/**\n * Helper class for parsing text of cosmetic rules\n * used by CosmeticRule and [Filter compiler](https://github.com/AdguardTeam/FiltersCompiler)\n *\n *\n * The cosmetic rule contains of the following parts:\n *\n * `pattern##content`\n *\n * `pattern` contains the list of the rule modifiers and domains.\n *\n * `##` is a marker (might be a different marker depending on the rule type).\n * You can find the list of markers in the CosmeticRuleMarker enumeration.\n *\n * `content` might be a CSS selector, a scriptlet or something else, depending on the rule type.\n */\nvar CosmeticRuleParser = /** @class */ (function () {\n function CosmeticRuleParser() {\n }\n /**\n * Parse the rule's pattern, cosmetic marker and the content parts from the rule text.\n * If the content is empty, throws a SyntaxError.\n *\n * @param ruleText\n * @returns Object with pattern, marker and content text parts\n */\n CosmeticRuleParser.parseRuleTextByMarker = function (ruleText) {\n var _a = findCosmeticRuleMarker(ruleText), markerIndex = _a[0], marker = _a[1];\n if (marker === null) {\n throw new SyntaxError('Not a cosmetic rule');\n }\n var content = ruleText.substring(markerIndex + marker.length).trim();\n if (!content) {\n throw new SyntaxError('Rule content is empty');\n }\n var pattern;\n if (markerIndex > 0) {\n pattern = ruleText.substring(0, markerIndex);\n }\n return {\n pattern: pattern,\n marker: marker,\n content: content,\n };\n };\n /**\n * Extracts the rule modifiers and domains from the rule pattern.\n * @param rulePattern\n * @returns Object with modifiers and domains text parts\n */\n CosmeticRuleParser.parseRulePatternText = function (rulePattern) {\n var OpenBracket = CosmeticRuleModifiersSyntax.OpenBracket, CloseBracket = CosmeticRuleModifiersSyntax.CloseBracket, SpecialSymbol = CosmeticRuleModifiersSyntax.SpecialSymbol, EscapeCharacter = CosmeticRuleModifiersSyntax.EscapeCharacter;\n if (!rulePattern.startsWith(\"\".concat(OpenBracket + SpecialSymbol))) {\n return { domainsText: rulePattern };\n }\n var closeBracketIndex;\n // The first two characters cannot be closing brackets\n for (var i = 2; i < rulePattern.length; i += 1) {\n if (rulePattern[i] === CloseBracket && rulePattern[i - 1] !== EscapeCharacter) {\n closeBracketIndex = i;\n break;\n }\n }\n if (!closeBracketIndex) {\n throw new SyntaxError('Can\\'t parse modifiers list');\n }\n // Handle this case: `[$]`\n if (closeBracketIndex === 2) {\n throw new SyntaxError('Modifiers list can\\'t be empty');\n }\n var modifiersText = rulePattern.slice(2, closeBracketIndex);\n var domainsText;\n if (closeBracketIndex < rulePattern.length - 1) {\n domainsText = rulePattern.slice(closeBracketIndex + 1);\n }\n return {\n modifiersText: modifiersText,\n domainsText: domainsText,\n };\n };\n /**\n * Parses the list of modifiers. Parsing is done in the same way as it's done in the NetworkRule, i.e.\n * we have a comma-separated list of modifier-value pairs.\n * If we encounter an invalid modifier, this method throws a SyntaxError.\n *\n * @param modifiersText - list of modifiers splited by comma\n * @returns - modifiers collection object\n */\n CosmeticRuleParser.parseRuleModifiers = function (modifiersText) {\n if (!modifiersText) {\n return null;\n }\n var Assigner = CosmeticRuleModifiersSyntax.Assigner;\n var modifiersTextArray = parseOptionsString(modifiersText, false);\n var modifiers = Object.create(null);\n for (var i = 0; i < modifiersTextArray.length; i += 1) {\n var modifierText = modifiersTextArray[i];\n var assignerIndex = modifierText.indexOf(Assigner);\n if (modifierText === 'path') {\n // Empty path modifier without assigner and value will match only main page\n modifiers[modifierText] = '';\n continue;\n }\n if (assignerIndex === -1) {\n throw new SyntaxError('Modifier must have assigned value');\n }\n var modifierKey = modifierText.substring(0, assignerIndex);\n if (cosmeticRuleModifiersList.includes(modifierKey)) {\n var modifierValue = modifierText.substring(assignerIndex + 1);\n modifiers[modifierKey] = modifierValue;\n }\n else {\n throw new SyntaxError(\"'\".concat(modifierKey, \"' is not valid modifier\"));\n }\n }\n return modifiers;\n };\n /**\n * Parses the rule pattern and extracts the permitted/restricted domains and the unescaped path modifier value,\n * If domains are declared through $domain modifier and pattern domain list, this method throws a SyntaxError.\n * @param rulePattern - rule pattern text\n *\n * @returns Object with permitted/restricted domains list and the path modifier string value\n */\n CosmeticRuleParser.parseRulePattern = function (rulePattern) {\n var _a = CosmeticRuleParser.parseRulePatternText(rulePattern), domainsText = _a.domainsText, modifiersText = _a.modifiersText;\n var domains = domainsText;\n var path;\n var modifiers = CosmeticRuleParser.parseRuleModifiers(modifiersText);\n if (modifiers) {\n if (modifiers.path || modifiers.path === '') {\n path = modifiers.path;\n if (SimpleRegex.isRegexPattern(path)) {\n path = SimpleRegex.unescapeRegexSpecials(path, SimpleRegex.reModifierPatternEscapedSpecialCharacters);\n }\n }\n if (modifiers.domain) {\n if (domains) {\n throw new SyntaxError('The $domain modifier is not allowed in a domain-specific rule');\n }\n else {\n domains = modifiers.domain;\n }\n }\n }\n var permittedDomains;\n var restrictedDomains;\n // Skip wildcard domain\n if (domains && domains !== SimpleRegex.MASK_ANY_CHARACTER) {\n var separator = (modifiers === null || modifiers === void 0 ? void 0 : modifiers.domain) ? PIPE_SEPARATOR : COMMA_SEPARATOR;\n var domainModifier = new DomainModifier(domains, separator);\n if (domainModifier.permittedDomains) {\n permittedDomains = domainModifier.permittedDomains;\n }\n if (domainModifier.restrictedDomains) {\n restrictedDomains = domainModifier.restrictedDomains;\n }\n }\n return {\n path: path,\n permittedDomains: permittedDomains,\n restrictedDomains: restrictedDomains,\n };\n };\n return CosmeticRuleParser;\n}());\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Scriptlets helper class\n */\n// eslint-disable-next-line max-classes-per-file\nvar ScriptletParser = /** @class */ (function () {\n function ScriptletParser() {\n }\n /**\n * Iterate over iterable argument and evaluate current state with transitions\n *\n * @param {Array|Collection|string} iterable\n * @param {Object} transitions transition functions\n * @param {string} initState first transition name\n * @param {any} args arguments which should be passed to transition functions\n * @returns {string} transition\n */\n ScriptletParser.iterateWithTransitions = function (iterable, transitions, initState, args) {\n var state = initState;\n for (var i = 0; i < iterable.length; i += 1) {\n state = transitions[state](iterable, i, args);\n }\n return state;\n };\n /**\n * Parse and validate scriptlet rule\n * @param {*} ruleContent\n * @returns {{name: string, args: Array}}\n */\n ScriptletParser.parseRule = function (ruleContent) {\n var _a;\n var transitions = (_a = {},\n _a[ScriptletParser.TRANSITION.OPENED] = ScriptletParser.opened,\n _a[ScriptletParser.TRANSITION.PARAM] = ScriptletParser.param,\n _a[ScriptletParser.TRANSITION.CLOSED] = function () { },\n _a);\n var sep = { symb: null };\n var saver = new ScriptletParser.WordSaver();\n var state = ScriptletParser.iterateWithTransitions(ruleContent, transitions, ScriptletParser.TRANSITION.OPENED, { sep: sep, saver: saver });\n if (state !== 'closed') {\n throw new Error(\"Invalid scriptlet \".concat(ruleContent));\n }\n var args = saver.getAll();\n return {\n name: args[0],\n args: args.slice(1),\n };\n };\n /**\n * Helper class to accumulate an array of strings char by char\n */\n ScriptletParser.WordSaver = /** @class */ (function () {\n function class_1() {\n /**\n * String cursor\n */\n this.str = '';\n /**\n * Strings array\n */\n this.collectedStrings = [];\n }\n /**\n * Saves symbol to cursor\n *\n * @param s\n */\n class_1.prototype.saveSymbol = function (s) {\n this.str += s;\n };\n /**\n * Saves cursor to strings\n */\n class_1.prototype.saveStr = function () {\n this.collectedStrings.push(this.str);\n this.str = '';\n };\n /**\n * Returns collected strings\n */\n class_1.prototype.getAll = function () {\n return __spreadArray([], this.collectedStrings, true);\n };\n return class_1;\n }());\n /**\n * Transition names\n */\n ScriptletParser.TRANSITION = {\n OPENED: 'opened',\n PARAM: 'param',\n CLOSED: 'closed',\n };\n /**\n * Transition function: the current index position in start, end or between params\n * @param {string} rule\n * @param {number} index\n * @param {Object} Object\n * @property {Object} Object.sep contains prop symb with current separator char\n * @returns {string} transition\n */\n ScriptletParser.opened = function (rule, index, _a) {\n var sep = _a.sep;\n var char = rule[index];\n switch (char) {\n case ' ':\n case '(':\n case ',':\n return ScriptletParser.TRANSITION.OPENED;\n case '\\'':\n case '\"':\n // eslint-disable-next-line no-param-reassign\n sep.symb = char;\n return ScriptletParser.TRANSITION.PARAM;\n case ')':\n return index === rule.length - 1\n ? ScriptletParser.TRANSITION.CLOSED\n : ScriptletParser.TRANSITION.OPENED;\n }\n return undefined;\n };\n /**\n * Transition function: the current index position inside param\n *\n * @param {string} rule\n * @param {number} index\n * @param {Object} Object\n * @property {Object} Object.sep contains prop `symb` with current separator char\n * @property {Object} Object.saver helper which allow to save strings by car by char\n * @returns {string} transition\n */\n ScriptletParser.param = function (rule, index, _a) {\n var saver = _a.saver, sep = _a.sep;\n var char = rule[index];\n switch (char) {\n case '\\'':\n case '\"':\n if (char === sep.symb && rule[index - 1] !== '\\\\') {\n // eslint-disable-next-line no-param-reassign\n sep.symb = null;\n saver.saveStr();\n return ScriptletParser.TRANSITION.OPENED;\n }\n saver.saveSymbol(char);\n return ScriptletParser.TRANSITION.PARAM;\n default:\n saver.saveSymbol(char);\n return ScriptletParser.TRANSITION.PARAM;\n }\n };\n return ScriptletParser;\n}());\n\n/**\n * CosmeticRuleType is an enumeration of the possible\n * cosmetic rule types.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-rules\n */\nvar CosmeticRuleType;\n(function (CosmeticRuleType) {\n /**\n * Cosmetic rules that just hide page elements.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#element-hiding-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"ElementHiding\"] = 0] = \"ElementHiding\";\n /**\n * Cosmetic rules that allow adding custom CSS styles.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#cosmetic-css-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"Css\"] = 1] = \"Css\";\n /**\n * Cosmetic rules that allow executing custom JS scripts.\n * Some restrictions are applied to this type of rules by default.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#javascript-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"Js\"] = 2] = \"Js\";\n /**\n * Special type of rules that allows filtering HTML code of web pages.\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules\n */\n CosmeticRuleType[CosmeticRuleType[\"Html\"] = 3] = \"Html\";\n})(CosmeticRuleType || (CosmeticRuleType = {}));\n/**\n * Pseudo class indicators. They are used to detect if rule is extended or not even if rule does not\n * have extended css marker\n */\nvar EXT_CSS_PSEUDO_INDICATORS = [\n /**\n * Pseudo-classes :is(), and :not() may use native implementation\n * so they are not listed here\n * https://github.com/AdguardTeam/ExtendedCss#extended-css-is\n * https://github.com/AdguardTeam/ExtendedCss#extended-css-not\n */\n /**\n * :has() should also be conditionally considered as extended and should not be in this list\n * https://github.com/AdguardTeam/ExtendedCss#extended-css-has\n * but there is a bug with content blocker in safari\n * https://bugs.webkit.org/show_bug.cgi?id=248868\n *\n * TODO: remove ':has(' later\n */\n ':has(',\n ':contains(',\n ':matches-css(',\n ':matches-attr(',\n ':matches-property(',\n ':xpath(',\n ':upward(',\n ':nth-ancestor(',\n ':remove(',\n // aliases for :has()\n ':-abp-has(',\n // aliases for :contains()\n ':has-text(',\n ':-abp-contains(',\n // old syntax\n '[-ext-has=',\n '[-ext-contains=',\n '[-ext-has-text=',\n '[-ext-matches-css=',\n '[-ext-matches-css-before=',\n '[-ext-matches-css-after=',\n // obsolete since ExtendedCss v2.0.2 but still compatible\n // https://github.com/AdguardTeam/ExtendedCss/releases/tag/v2.0.2\n ':matches-css-before(',\n ':matches-css-after(',\n];\n/**\n * Implements a basic cosmetic rule.\n *\n * Cosmetic rules syntax are almost similar and looks like this:\n * ```\n * rule = [domains] \"marker\" content\n * domains = [domain0, domain1[, ...[, domainN]]]\n * ```\n *\n * The rule type is defined by the `marker` value, you can find the list of them\n * in the {@see CosmeticRuleMarker} enumeration.\n *\n * What matters, though, is what's in the `content` part of it.\n *\n * Examples:\n * * `example.org##.banner` -- element hiding rule\n * * `example.org#$#.banner { display: block; }` -- CSS rule\n * * `example.org#%#window.x=1;` -- JS rule\n * * `example.org#%#//scriptlet('scriptlet-name')` -- Scriptlet rule\n * * `example.org$$div[id=\"test\"]` -- HTML filtering rule\n */\nvar CosmeticRule = /** @class */ (function () {\n /**\n * Creates an instance of the {@link CosmeticRule}.\n * It parses the rule and extracts the permitted/restricted domains,\n * and also the cosmetic rule's content.\n *\n * Depending on the rule type, the content might be transformed in\n * one of the helper classes, or kept as string when it's appropriate.\n *\n * @param ruleText - original rule text.\n * @param filterListId - ID of the filter list this rule belongs to.\n *\n * @throws error if it fails to parse the rule.\n */\n function CosmeticRule(ruleText, filterListId) {\n this.allowlist = false;\n this.extendedCss = false;\n this.permittedDomains = undefined;\n this.restrictedDomains = undefined;\n /**\n * Js script to execute\n */\n this.script = undefined;\n /**\n * Object with script code ready to execute and debug, domain values\n * @private\n */\n this.scriptData = null;\n /**\n * Object with scriptlet function and params\n * @private\n */\n this.scriptletData = null;\n /**\n * If the rule contains scriptlet content\n */\n this.isScriptlet = false;\n this.ruleText = ruleText;\n this.filterListId = filterListId;\n var _a = CosmeticRuleParser.parseRuleTextByMarker(ruleText), pattern = _a.pattern, marker = _a.marker, content = _a.content;\n this.content = content;\n this.type = CosmeticRule.parseType(marker);\n this.extendedCss = isExtCssMarker(marker);\n if (!this.extendedCss\n && (this.type === CosmeticRuleType.ElementHiding\n || this.type === CosmeticRuleType.Css)) {\n // additional check if rule is extended css rule by pseudo class indicators\n for (var i = 0; i < EXT_CSS_PSEUDO_INDICATORS.length; i += 1) {\n if (this.content.indexOf(EXT_CSS_PSEUDO_INDICATORS[i]) !== -1) {\n this.extendedCss = true;\n break;\n }\n }\n }\n CosmeticRule.validate(ruleText, this.type, content, this.extendedCss);\n if (pattern) {\n // This means that the marker is preceded by the list of domains and modifiers\n // Now it's a good time to parse them.\n var _b = CosmeticRuleParser.parseRulePattern(pattern), path = _b.path, permittedDomains = _b.permittedDomains, restrictedDomains = _b.restrictedDomains;\n if (path || path === '') {\n this.pathModifier = new Pattern(path);\n }\n if (permittedDomains) {\n this.permittedDomains = permittedDomains;\n }\n if (restrictedDomains) {\n this.restrictedDomains = restrictedDomains;\n }\n }\n this.allowlist = CosmeticRule.parseAllowlist(marker);\n this.isScriptlet = this.content.startsWith(ADG_SCRIPTLET_MASK);\n }\n /**\n * Parses first pseudo class from the specified CSS selector\n *\n * @param selector\n * @returns pseudo class name if found or null\n */\n CosmeticRule.parsePseudoClass = function (selector) {\n var beginIndex = 0;\n var nameStartIndex = -1;\n var squareBracketIndex = 0;\n while (squareBracketIndex >= 0) {\n nameStartIndex = selector.indexOf(':', beginIndex);\n if (nameStartIndex < 0) {\n return null;\n }\n if (nameStartIndex > 0 && selector.charAt(nameStartIndex - 1) === '\\\\') {\n // Escaped colon character\n return null;\n }\n squareBracketIndex = selector.indexOf('[', beginIndex);\n while (squareBracketIndex >= 0) {\n if (nameStartIndex > squareBracketIndex) {\n var squareEndBracketIndex = selector.indexOf(']', squareBracketIndex + 1);\n beginIndex = squareEndBracketIndex + 1;\n if (nameStartIndex < squareEndBracketIndex) {\n // Means that colon character is somewhere inside attribute selector\n // Something like a[src^=\"http://domain.com\"]\n break;\n }\n if (squareEndBracketIndex > 0) {\n squareBracketIndex = selector.indexOf('[', beginIndex);\n }\n else {\n // bad rule, example: a[src=\"http:\n return null;\n }\n }\n else {\n squareBracketIndex = -1;\n break;\n }\n }\n }\n var nameEndIndex = indexOfAny(selector, [' ', ',', '\\t', '>', '(', '[', '.', '#', ':', '+', '~', '\"', '\\''], nameStartIndex + 1);\n if (nameEndIndex < 0) {\n nameEndIndex = selector.length;\n }\n var name = selector.substring(nameStartIndex, nameEndIndex);\n if (name.length <= 1) {\n // Either empty name or a pseudo element (like ::content)\n return null;\n }\n return name;\n };\n CosmeticRule.prototype.getText = function () {\n return this.ruleText;\n };\n CosmeticRule.prototype.getFilterListId = function () {\n return this.filterListId;\n };\n /**\n * Cosmetic rule type (always present)\n */\n CosmeticRule.prototype.getType = function () {\n return this.type;\n };\n /**\n * Allowlist means that this rule is meant to disable other rules.\n * For instance, https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#elemhide-exceptions\n */\n CosmeticRule.prototype.isAllowlist = function () {\n return this.allowlist;\n };\n /**\n * Gets the rule content. The meaning of this field depends on the rule type.\n * For instance, for an element hiding rule, this is just a CSS selector.\n * While, for a CSS rule, this is a CSS selector + style.\n */\n CosmeticRule.prototype.getContent = function () {\n return this.content;\n };\n /**\n * Returns script ready to execute or null\n * Rebuilds scriptlet script if debug or domain params change\n * @param options\n */\n CosmeticRule.prototype.getScript = function (options) {\n var _a, _b;\n if (options === void 0) { options = {}; }\n var _c = options.debug, debug = _c === void 0 ? false : _c, _d = options.request, request = _d === void 0 ? null : _d;\n var scriptData = this.scriptData;\n if (scriptData && !this.isScriptlet) {\n return scriptData.code;\n }\n if (scriptData && scriptData.debug === debug) {\n if (request) {\n if (request.domain === scriptData.domain) {\n return scriptData.code;\n }\n }\n else {\n return scriptData.code;\n }\n }\n this.initScript(options);\n return (_b = (_a = this.scriptData) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : null;\n };\n /**\n * Gets list of permitted domains.\n */\n CosmeticRule.prototype.getPermittedDomains = function () {\n return this.permittedDomains;\n };\n /**\n * Returns true if the rule is considered \"generic\"\n * \"generic\" means that the rule is not restricted to a limited set of domains\n * Please note that it might be forbidden on some domains, though.\n *\n * @return {boolean}\n */\n CosmeticRule.prototype.isGeneric = function () {\n return !this.permittedDomains || this.permittedDomains.length === 0;\n };\n /**\n * Gets list of restricted domains.\n */\n CosmeticRule.prototype.getRestrictedDomains = function () {\n return this.restrictedDomains;\n };\n CosmeticRule.prototype.isExtendedCss = function () {\n return this.extendedCss;\n };\n /**\n * Match returns true if this rule can be used on the specified request.\n *\n * @param request - request to check\n */\n CosmeticRule.prototype.match = function (request) {\n if (!this.permittedDomains && !this.restrictedDomains && !this.pathModifier) {\n return true;\n }\n if (this.matchesRestrictedDomains(request.hostname)) {\n /**\n * Domain or host is restricted\n * i.e. ~example.org##rule\n */\n return false;\n }\n if (this.hasPermittedDomains()) {\n if (!DomainModifier.isDomainOrSubdomainOfAny(request.hostname, this.permittedDomains)) {\n /**\n * Domain is not among permitted\n * i.e. example.org##rule and we're checking example.org\n */\n return false;\n }\n }\n if (this.pathModifier) {\n var path = getRelativeUrl(request.urlLowercase);\n if (path) {\n return this.pathModifier.matchPathPattern(path);\n }\n return false;\n }\n return true;\n };\n CosmeticRule.parseType = function (marker) {\n switch (marker) {\n case CosmeticRuleMarker.ElementHiding:\n case CosmeticRuleMarker.ElementHidingExtCSS:\n return CosmeticRuleType.ElementHiding;\n case CosmeticRuleMarker.ElementHidingException:\n case CosmeticRuleMarker.ElementHidingExtCSSException:\n return CosmeticRuleType.ElementHiding;\n case CosmeticRuleMarker.Css:\n case CosmeticRuleMarker.CssExtCSS:\n return CosmeticRuleType.Css;\n case CosmeticRuleMarker.CssException:\n case CosmeticRuleMarker.CssExtCSSException:\n return CosmeticRuleType.Css;\n case CosmeticRuleMarker.Js:\n return CosmeticRuleType.Js;\n case CosmeticRuleMarker.JsException:\n return CosmeticRuleType.Js;\n case CosmeticRuleMarker.Html:\n return CosmeticRuleType.Html;\n case CosmeticRuleMarker.HtmlException:\n return CosmeticRuleType.Html;\n default:\n throw new SyntaxError('Unsupported rule type');\n }\n };\n /**\n * Determines if rule is allowlist rule\n * @param marker\n * @private\n */\n CosmeticRule.parseAllowlist = function (marker) {\n switch (marker) {\n case CosmeticRuleMarker.ElementHidingException:\n case CosmeticRuleMarker.ElementHidingExtCSSException:\n case CosmeticRuleMarker.CssException:\n case CosmeticRuleMarker.CssExtCSSException:\n case CosmeticRuleMarker.JsException:\n case CosmeticRuleMarker.HtmlException:\n return true;\n default:\n return false;\n }\n };\n /**\n * Validate pseudo-classes\n *\n * @param ruleText\n * @param ruleContent\n * @throws SyntaxError\n */\n CosmeticRule.validatePseudoClasses = function (ruleText, ruleContent) {\n var pseudoClass = CosmeticRule.parsePseudoClass(ruleContent);\n if (pseudoClass !== null) {\n if (CosmeticRule.SUPPORTED_PSEUDO_CLASSES.indexOf(pseudoClass) < 0) {\n throw new SyntaxError(\"Unknown pseudo-class '\".concat(pseudoClass, \"' in selector: '\").concat(ruleContent, \"'\"));\n }\n }\n };\n /**\n * Simple validation for elemhide rules\n *\n * @param ruleText\n * @param ruleContent\n * @throws SyntaxError\n */\n CosmeticRule.validateElemhideRule = function (ruleText, ruleContent) {\n if (ruleText.startsWith(SimpleRegex.MASK_START_URL)) {\n throw new SyntaxError('Element hiding rule shouldn\\'t start with \"||\"');\n }\n if (CosmeticRule.ELEMHIDE_VALIDATION_REGEX.test(ruleContent)) {\n throw new SyntaxError('Invalid elemhide rule, style presented');\n }\n };\n CosmeticRule.validateJsRules = function (ruleText, ruleContent) {\n if (ruleContent.startsWith(ADG_SCRIPTLET_MASK)) {\n if (!scriptlets.isValidScriptletRule(ruleText)) {\n throw new SyntaxError('Invalid scriptlet');\n }\n }\n };\n /**\n * Validates css injection rules\n *\n * @param ruleText\n * @param ruleContent\n * @throws SyntaxError\n */\n CosmeticRule.validateCssRules = function (ruleText, ruleContent) {\n // Simple validation for css injection rules\n if (!/{.+}/.test(ruleContent)) {\n throw new SyntaxError('Invalid CSS modifying rule, no style presented');\n }\n // discard css inject rules containing \"url\"\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1196\n if (/{.*url\\(.*\\)/gi.test(ruleContent)) {\n throw new SyntaxError('CSS modifying rule with \\'url\\' was omitted');\n }\n // discard css inject rules containing other unsafe selectors\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1920\n if (/{.*image-set\\(.*\\)/gi.test(ruleContent)\n || /{.*image\\(.*\\)/gi.test(ruleContent)\n || /{.*cross-fade\\(.*\\)/gi.test(ruleContent)) {\n throw new SyntaxError('CSS modifying rule with unsafe style was omitted');\n }\n // Prohibit \"\\\" character in style of CSS injection rules\n // Check slash character only after the index of last opening curly brackets\n if (ruleContent.indexOf('\\\\', ruleContent.lastIndexOf('{')) > -1) {\n throw new SyntaxError('CSS injection rule with \\'\\\\\\' was omitted');\n }\n };\n /**\n * Checks if the rule has permitted domains\n */\n CosmeticRule.prototype.hasPermittedDomains = function () {\n return this.permittedDomains != null && this.permittedDomains.length > 0;\n };\n /**\n * Checks if the rule has restricted domains\n */\n CosmeticRule.prototype.hasRestrictedDomains = function () {\n return this.restrictedDomains != null && this.restrictedDomains.length > 0;\n };\n /**\n * Checks if the hostname matches permitted domains\n * @param hostname\n */\n CosmeticRule.prototype.matchesPermittedDomains = function (hostname) {\n return this.hasPermittedDomains() && DomainModifier.isDomainOrSubdomainOfAny(hostname, this.permittedDomains);\n };\n /**\n * Checks if the hostname matches the restricted domains.\n * @param hostname\n */\n CosmeticRule.prototype.matchesRestrictedDomains = function (hostname) {\n return this.hasRestrictedDomains()\n && DomainModifier.isDomainOrSubdomainOfAny(hostname, this.restrictedDomains);\n };\n /**\n * Validates cosmetic rule text\n * @param ruleText\n * @param type\n * @param content\n * @param isExtCss\n * @private\n */\n CosmeticRule.validate = function (ruleText, type, content, isExtCss) {\n if (type !== CosmeticRuleType.Css\n && type !== CosmeticRuleType.Js\n && type !== CosmeticRuleType.Html) {\n CosmeticRule.validatePseudoClasses(ruleText, content);\n if (hasUnquotedSubstring(content, '{')) {\n throw new SyntaxError('Invalid cosmetic rule, wrong brackets');\n }\n }\n if (type === CosmeticRuleType.ElementHiding) {\n CosmeticRule.validateElemhideRule(ruleText, content);\n }\n if (type === CosmeticRuleType.Css) {\n CosmeticRule.validateCssRules(ruleText, content);\n }\n if (type === CosmeticRuleType.Js) {\n CosmeticRule.validateJsRules(ruleText, content);\n }\n if ((!isExtCss && hasUnquotedSubstring(content, '/*'))\n || hasUnquotedSubstring(content, ' /*')\n || hasUnquotedSubstring(content, ' //')) {\n throw new SyntaxError('Cosmetic rule should not contain comments');\n }\n };\n /**\n * Returns the scriptlet's data consisting of the scriptlet function and its arguments.\n * This method is supposed to be used in the manifest V3 extension.\n */\n CosmeticRule.prototype.getScriptletData = function () {\n if (this.scriptletData) {\n return this.scriptletData;\n }\n this.initScript();\n return this.scriptletData;\n };\n /**\n * Updates this.scriptData and if scriptlet this.scriptletData with js ready to execute\n *\n * @param options\n */\n CosmeticRule.prototype.initScript = function (options) {\n var _a;\n if (options === void 0) { options = {}; }\n var _b = options.debug, debug = _b === void 0 ? false : _b, _c = options.request, request = _c === void 0 ? null : _c;\n var ruleContent = this.getContent();\n if (!this.isScriptlet) {\n this.scriptData = {\n code: ruleContent,\n };\n return;\n }\n var scriptletContent = ruleContent.substring(ADG_SCRIPTLET_MASK.length);\n var scriptletParams = ScriptletParser.parseRule(scriptletContent);\n var params = {\n args: scriptletParams.args,\n engine: config.engine || '',\n name: scriptletParams.name,\n ruleText: this.getText(),\n verbose: debug,\n domainName: request === null || request === void 0 ? void 0 : request.domain,\n version: config.version || '',\n };\n this.scriptData = {\n code: (_a = scriptlets.invoke(params)) !== null && _a !== void 0 ? _a : null,\n debug: debug,\n domain: request === null || request === void 0 ? void 0 : request.domain,\n };\n this.scriptletData = {\n func: scriptlets.getScriptletFunction(params.name),\n params: params,\n };\n };\n /**\n * The problem with pseudo-classes is that any unknown pseudo-class makes browser ignore the whole CSS rule,\n * which contains a lot more selectors. So, if CSS selector contains a pseudo-class, we should try to validate it.\n *

\n * One more problem with pseudo-classes is that they are actively used in uBlock, hence it may mess AG styles.\n */\n CosmeticRule.SUPPORTED_PSEUDO_CLASSES = [':active',\n ':checked', ':contains', ':disabled', ':empty', ':enabled', ':first-child', ':first-of-type',\n ':focus', ':has', ':has-text', ':hover', ':if', ':if-not', ':in-range', ':invalid', ':lang',\n ':last-child', ':last-of-type', ':link', ':matches-css', ':matches-css-before', ':matches-css-after',\n ':not', ':nth-child', ':nth-last-child', ':nth-last-of-type', ':nth-of-type',\n ':only-child', ':only-of-type', ':optional', ':out-of-range', ':read-only',\n ':read-write', ':required', ':root', ':target', ':valid', ':visited',\n ':-abp-has', ':-abp-contains', ':xpath', ':nth-ancestor', ':upward', ':remove',\n ':matches-attr', ':matches-property', ':is', ':where'];\n CosmeticRule.ELEMHIDE_VALIDATION_REGEX = / {.+}/;\n return CosmeticRule;\n}());\n\n/**\n * CosmeticEngine combines all the cosmetic rules and allows to quickly\n * find all rules matching this or that hostname\n * It is primarily used by the {@see Engine}\n */\nvar CosmeticEngine = /** @class */ (function () {\n /**\n * Builds instance of cosmetic engine\n *\n * @param ruleStorage\n * @param skipStorageScan create an instance without storage scanning\n */\n function CosmeticEngine(ruleStorage, skipStorageScan) {\n if (skipStorageScan === void 0) { skipStorageScan = false; }\n this.ruleStorage = ruleStorage;\n this.rulesCount = 0;\n this.elementHidingLookupTable = new CosmeticLookupTable(ruleStorage);\n this.cssLookupTable = new CosmeticLookupTable(ruleStorage);\n this.jsLookupTable = new CosmeticLookupTable(ruleStorage);\n this.htmlLookupTable = new CosmeticLookupTable(ruleStorage);\n if (skipStorageScan) {\n return;\n }\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.CosmeticRules);\n while (scanner.scan()) {\n var indexedRule = scanner.getRule();\n if (indexedRule\n && indexedRule.rule instanceof CosmeticRule) {\n this.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n }\n /**\n * Adds rules into appropriate tables\n * @param rule\n * @param storageIdx\n */\n CosmeticEngine.prototype.addRule = function (rule, storageIdx) {\n switch (rule.getType()) {\n case CosmeticRuleType.ElementHiding: {\n this.elementHidingLookupTable.addRule(rule, storageIdx);\n break;\n }\n case CosmeticRuleType.Css: {\n this.cssLookupTable.addRule(rule, storageIdx);\n break;\n }\n case CosmeticRuleType.Js: {\n this.jsLookupTable.addRule(rule, storageIdx);\n break;\n }\n case CosmeticRuleType.Html: {\n this.htmlLookupTable.addRule(rule, storageIdx);\n break;\n }\n }\n this.rulesCount += 1;\n };\n /**\n * Checks if bitwise mask matches option\n * @param option\n * @param targetOption\n */\n CosmeticEngine.matchOption = function (option, targetOption) {\n return (option & targetOption) === targetOption;\n };\n /**\n * Prepares cosmetic result by request\n *\n * @param request - request to match\n * @param option mask of enabled cosmetic types\n * @return CosmeticResult\n */\n CosmeticEngine.prototype.match = function (request, option) {\n var includeGeneric = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionGenericCSS);\n var includeSpecific = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionSpecificCSS);\n var includeJs = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionJS);\n var includeHtml = CosmeticEngine.matchOption(option, CosmeticOption.CosmeticOptionHtml);\n var cosmeticResult = new CosmeticResult();\n if (includeGeneric) {\n CosmeticEngine.appendGenericRules(cosmeticResult.elementHiding, this.elementHidingLookupTable, request);\n CosmeticEngine.appendGenericRules(cosmeticResult.CSS, this.cssLookupTable, request);\n }\n if (includeSpecific) {\n CosmeticEngine.appendSpecificRules(cosmeticResult.elementHiding, this.elementHidingLookupTable, request);\n CosmeticEngine.appendSpecificRules(cosmeticResult.CSS, this.cssLookupTable, request);\n }\n if (includeJs) {\n CosmeticEngine.appendGenericRules(cosmeticResult.JS, this.jsLookupTable, request);\n CosmeticEngine.appendSpecificRules(cosmeticResult.JS, this.jsLookupTable, request);\n }\n if (includeHtml) {\n if (includeGeneric) {\n CosmeticEngine.appendGenericRules(cosmeticResult.Html, this.htmlLookupTable, request);\n }\n CosmeticEngine.appendSpecificRules(cosmeticResult.Html, this.htmlLookupTable, request);\n }\n return cosmeticResult;\n };\n /**\n * Selects generic rules and appends rules content to cosmetic result\n * @param cosmeticResult\n * @param lookupTable\n * @param request\n */\n CosmeticEngine.appendGenericRules = function (cosmeticResult, lookupTable, request) {\n for (var _i = 0, _a = lookupTable.genericRules; _i < _a.length; _i++) {\n var genericRule = _a[_i];\n if (!lookupTable.isAllowlisted(request, genericRule)\n && genericRule.match(request)) {\n cosmeticResult.append(genericRule, request);\n }\n }\n };\n /**\n * Selects specific rules and appends rules content to cosmetic result\n * @param cosmeticResult\n * @param lookupTable\n * @param request\n */\n CosmeticEngine.appendSpecificRules = function (cosmeticResult, lookupTable, request) {\n var hostnameRules = lookupTable.findByHostname(request);\n if (hostnameRules.length > 0) {\n for (var _i = 0, hostnameRules_1 = hostnameRules; _i < hostnameRules_1.length; _i++) {\n var rule = hostnameRules_1[_i];\n if (!lookupTable.isAllowlisted(request, rule)) {\n cosmeticResult.append(rule, request);\n }\n }\n }\n };\n return CosmeticEngine;\n}());\n\n/**\n * Engine represents the filtering engine with all the loaded rules\n */\nvar Engine = /** @class */ (function () {\n /**\n * Creates an instance of an Engine\n * Parses the filtering rules and creates a filtering engine of them\n *\n * @param ruleStorage storage\n * @param skipStorageScan create an instance without storage scanning\n * @throws\n */\n function Engine(ruleStorage, skipStorageScan) {\n if (skipStorageScan === void 0) { skipStorageScan = false; }\n this.ruleStorage = ruleStorage;\n this.networkEngine = new NetworkEngine(ruleStorage, skipStorageScan);\n this.cosmeticEngine = new CosmeticEngine(ruleStorage, skipStorageScan);\n this.resultCache = new lru.exports.LRUMap(Engine.REQUEST_CACHE_SIZE);\n }\n /**\n * Loads rules to engine\n */\n Engine.prototype.loadRules = function () {\n var scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.NetworkRules | ScannerType.CosmeticRules);\n while (scanner.scan()) {\n this.addRule(scanner.getRule());\n }\n };\n /**\n * Async loads rules to engine\n *\n * @param chunkSize size of rules chunk to load at a time\n */\n Engine.prototype.loadRulesAsync = function (chunkSize) {\n return __awaiter(this, void 0, void 0, function () {\n var scanner, counter;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n scanner = this.ruleStorage.createRuleStorageScanner(ScannerType.NetworkRules | ScannerType.CosmeticRules);\n counter = 0;\n _a.label = 1;\n case 1:\n if (!scanner.scan()) return [3 /*break*/, 4];\n counter += 1;\n if (!(counter >= chunkSize)) return [3 /*break*/, 3];\n counter = 0;\n /**\n * In some cases UI thread becomes blocked while adding rules to engine,\n * that't why we create filter rules using chunks of the specified length\n * Rules creation is rather slow operation so we should\n * use setTimeout calls to give UI thread some time.\n */\n return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1); })];\n case 2:\n /**\n * In some cases UI thread becomes blocked while adding rules to engine,\n * that't why we create filter rules using chunks of the specified length\n * Rules creation is rather slow operation so we should\n * use setTimeout calls to give UI thread some time.\n */\n _a.sent();\n _a.label = 3;\n case 3:\n this.addRule(scanner.getRule());\n return [3 /*break*/, 1];\n case 4: return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Matches the specified request against the filtering engine and returns the matching result.\n *\n * @param request - request to check\n * @param frameRule - source document rule or null\n * @return matching result\n */\n Engine.prototype.matchRequest = function (request, frameRule) {\n if (frameRule === void 0) { frameRule = null; }\n var cacheKey = \"\".concat(request.url, \"#\").concat(request.sourceHostname, \"#\").concat(request.requestType);\n if (request.method) {\n cacheKey += \"#\".concat(request.method);\n }\n /**\n * Add frame url text to the key to avoid caching,\n * because allowlist rules are not stored in the engine\n * AG-12694\n */\n if (frameRule) {\n cacheKey += \"#\".concat(frameRule.getText());\n }\n var res = this.resultCache.get(cacheKey);\n if (res) {\n return res;\n }\n var networkRules = this.networkEngine.matchAll(request);\n var result = new MatchingResult(networkRules, frameRule);\n this.resultCache.set(cacheKey, result);\n return result;\n };\n /**\n * Matches current frame and returns document-level allowlist rule if found.\n *\n * @param frameUrl\n */\n Engine.prototype.matchFrame = function (frameUrl) {\n var sourceRequest = new Request(frameUrl, '', RequestType.Document);\n var sourceRules = this.networkEngine.matchAll(sourceRequest);\n sourceRules = MatchingResult.removeBadfilterRules(sourceRules);\n var result = null;\n sourceRules.forEach(function (r) {\n if (r.isDocumentLevelAllowlistRule()) {\n if (!result || r.isHigherPriority(result)) {\n result = r;\n }\n }\n });\n return result;\n };\n /**\n * Gets cosmetic result for the specified hostname and cosmetic options\n *\n * @param request host to check\n * @param option mask of enabled cosmetic types\n * @return cosmetic result\n */\n Engine.prototype.getCosmeticResult = function (request, option) {\n return this.cosmeticEngine.match(request, option);\n };\n /**\n * Gets rules count\n */\n Engine.prototype.getRulesCount = function () {\n return this.networkEngine.rulesCount + this.cosmeticEngine.rulesCount;\n };\n /**\n * Adds rules to engines\n *\n * @param indexedRule\n */\n Engine.prototype.addRule = function (indexedRule) {\n if (indexedRule) {\n if (indexedRule.rule instanceof NetworkRule) {\n this.networkEngine.addRule(indexedRule.rule, indexedRule.index);\n }\n else if (indexedRule.rule instanceof CosmeticRule) {\n this.cosmeticEngine.addRule(indexedRule.rule, indexedRule.index);\n }\n }\n };\n /**\n * Request's cache size\n * Used as both source rules and others limit.\n * The value is based on benchmark runs.\n */\n Engine.REQUEST_CACHE_SIZE = 500;\n return Engine;\n}());\n\n/**\n * Rule with index\n */\nvar IndexedRule = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param rule\n * @param index\n */\n function IndexedRule(rule, index) {\n this.rule = rule;\n this.index = index;\n }\n return IndexedRule;\n}());\n/**\n * Rule with storage index\n */\nvar IndexedStorageRule = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param rule\n * @param index\n */\n function IndexedStorageRule(rule, index) {\n this.rule = rule;\n this.index = index;\n }\n return IndexedStorageRule;\n}());\n\n/**\n * Export logger implementation\n */\nvar logger = console;\n/**\n * Set logger implementation\n *\n * @param loggerImpl\n */\nfunction setLogger(loggerImpl) {\n logger = loggerImpl;\n}\n\n/**\n * Rule builder class\n */\nvar RuleFactory = /** @class */ (function () {\n function RuleFactory() {\n }\n /**\n * Creates rule of suitable class from text string\n * It returns null if the line is empty or if it is a comment\n *\n * TODO: Pack `ignore*` parameters and `silent` into one object with flags.\n *\n * @param text rule string\n * @param filterListId list id\n * @param ignoreNetwork do not create network rules\n * @param ignoreCosmetic do not create cosmetic rules\n * @param ignoreHost do not create host rules\n * @param silent Log the error for `true`, otherwise throw an exception on\n * a rule creation\n *\n * @throws Error when `silent` flag is passed as false on rule creation error.\n *\n * @return IRule object or null\n */\n RuleFactory.createRule = function (text, filterListId, ignoreNetwork, ignoreCosmetic, ignoreHost, silent) {\n if (ignoreNetwork === void 0) { ignoreNetwork = false; }\n if (ignoreCosmetic === void 0) { ignoreCosmetic = false; }\n if (ignoreHost === void 0) { ignoreHost = true; }\n if (silent === void 0) { silent = true; }\n if (!text || RuleFactory.isComment(text)) {\n return null;\n }\n if (RuleFactory.isShort(text)) {\n logger.info(\"The rule is too short: \".concat(text));\n }\n var line = text.trim();\n try {\n if (RuleFactory.isCosmetic(line)) {\n if (ignoreCosmetic) {\n return null;\n }\n return new CosmeticRule(line, filterListId);\n }\n if (!ignoreHost) {\n var hostRule = RuleFactory.createHostRule(line, filterListId);\n if (hostRule) {\n return hostRule;\n }\n }\n if (!ignoreNetwork) {\n return new NetworkRule(line, filterListId);\n }\n }\n catch (e) {\n var msg = \"\\\"\".concat(e.message, \"\\\" in the rule: \\\"\").concat(line, \"\\\"\");\n if (silent) {\n logger.info(\"Error: \".concat(msg));\n }\n else {\n throw new Error(msg);\n }\n }\n return null;\n };\n /**\n * Creates host rule from text\n *\n * @param ruleText\n * @param filterListId\n */\n RuleFactory.createHostRule = function (ruleText, filterListId) {\n var rule = new HostRule(ruleText, filterListId);\n return rule.isInvalid() ? null : rule;\n };\n /**\n * Checks if rule is short\n */\n RuleFactory.isShort = function (rule) {\n if (!rule) {\n return true;\n }\n return !!(rule && rule.length <= 3);\n };\n /**\n * Checks if the rule is cosmetic or not.\n * @param ruleText - rule text to check.\n */\n RuleFactory.isCosmetic = function (ruleText) {\n var marker = findCosmeticRuleMarker(ruleText);\n return marker[0] !== -1;\n };\n /**\n * If text is comment\n *\n * @param text\n */\n RuleFactory.isComment = function (text) {\n if (text.charAt(0) === '!') {\n return true;\n }\n if (text.charAt(0) === '#') {\n if (text.length === 1) {\n return true;\n }\n // Now we should check that this is not a cosmetic rule\n return !RuleFactory.isCosmetic(text);\n }\n return false;\n };\n return RuleFactory;\n}());\n\n/**\n * Rule scanner implements an interface for reading filtering rules.\n */\nvar RuleScanner = /** @class */ (function () {\n /**\n * NewRuleScanner returns a new RuleScanner to read from r.\n *\n * @param reader source of the filtering rules\n * @param listId filter list ID\n * @param configuration config object\n */\n function RuleScanner(reader, listId, configuration) {\n /**\n * Current rule\n */\n this.currentRule = null;\n /**\n * Index of the beginning of the current rule\n */\n this.currentRuleIndex = 0;\n /**\n * Current position in the reader\n */\n this.currentPos = 0;\n this.reader = reader;\n this.listId = listId;\n this.ignoreCosmetic = !!configuration.ignoreCosmetic\n || ((configuration.scannerType & ScannerType.CosmeticRules) !== ScannerType.CosmeticRules);\n this.ignoreNetwork = (configuration.scannerType & ScannerType.NetworkRules) !== ScannerType.NetworkRules;\n this.ignoreHost = (configuration.scannerType & ScannerType.HostRules) !== ScannerType.HostRules;\n this.ignoreJS = !!configuration.ignoreJS;\n this.ignoreUnsafe = !!configuration.ignoreUnsafe;\n }\n /**\n * Scan advances the RuleScanner to the next rule, which will then be available\n * through the Rule method.\n *\n * @return false when the scan stops, either by\n * reaching the end of the input or an error.\n */\n RuleScanner.prototype.scan = function () {\n while (true) {\n var lineIndex = this.currentPos;\n var line = this.readNextLine();\n if (line === null) {\n return false;\n }\n if (line) {\n var rule = RuleFactory.createRule(line, this.listId, this.ignoreNetwork, this.ignoreCosmetic, this.ignoreHost);\n if (rule && !this.isIgnored(rule)) {\n this.currentRule = rule;\n this.currentRuleIndex = lineIndex;\n return true;\n }\n }\n }\n };\n /**\n * @return the most recent rule generated by a call to Scan, and the index of this rule's text.\n */\n RuleScanner.prototype.getRule = function () {\n if (this.currentRule) {\n return new IndexedRule(this.currentRule, this.currentRuleIndex);\n }\n return null;\n };\n /**\n * Reads the next line and returns it\n *\n * @return next line string or null\n */\n RuleScanner.prototype.readNextLine = function () {\n var line = this.reader.readLine();\n if (line != null) {\n this.currentPos += line.length + 1;\n return line.trim();\n }\n return null;\n };\n /**\n * Checks if the rule should be ignored by this scanner\n *\n * @param rule to check\n * @return is rule ignored\n */\n RuleScanner.prototype.isIgnored = function (rule) {\n if (!this.ignoreCosmetic && !this.ignoreJS && !this.ignoreUnsafe) {\n return false;\n }\n if (rule instanceof CosmeticRule) {\n if (this.ignoreCosmetic) {\n return true;\n }\n // Ignore JS type rules\n // TODO: in the future we may allow CSS rules and Scriptlets (except for \"trusted\" scriptlets)\n return (this.ignoreJS && rule.getType() === CosmeticRuleType.Js);\n }\n if (this.ignoreUnsafe) {\n if (rule instanceof NetworkRule) {\n if (rule.getAdvancedModifier() && (rule.getAdvancedModifier() instanceof RemoveHeaderModifier)) {\n return true;\n }\n }\n }\n return false;\n };\n return RuleScanner;\n}());\n\n/**\n * Reads string line by line\n */\nvar StringLineReader = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param text\n */\n function StringLineReader(text) {\n /**\n * Current position\n */\n this.currentIndex = 0;\n this.text = text;\n }\n /**\n * Reads next line\n *\n * @return text or null on end\n */\n StringLineReader.prototype.readLine = function () {\n if (this.currentIndex === -1) {\n return null;\n }\n var startIndex = this.currentIndex;\n this.currentIndex = this.text.indexOf('\\n', startIndex);\n if (this.currentIndex === -1) {\n return this.text.substring(startIndex);\n }\n this.currentIndex += 1;\n // - 1 in order to exclude EOL\n return this.text.substring(startIndex, this.currentIndex - 1);\n };\n return StringLineReader;\n}());\n\n/**\n * List identifier max value.\n * We use \"number\" type for storage indexes, so we have some limits for list identifiers,\n * We line number for rule index, so if we save 11 ranks for rules, then we have 6 ranks left for list ids.\n * Check RuleStorageScanner class for more info.\n */\nvar LIST_ID_MAX_VALUE = Math.pow(10, 6);\n/**\n * StringRuleList represents a string-based rule list\n */\nvar StringRuleList = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param listId\n * @param ruleText\n * @param ignoreCosmetic (Optional) default false\n * @param ignoreJS (Optional) default false\n * @param ignoreUnsafe (Optional) default false\n */\n function StringRuleList(listId, ruleText, ignoreCosmetic, ignoreJS, ignoreUnsafe) {\n if (listId >= LIST_ID_MAX_VALUE) {\n throw new Error(\"Invalid list identifier, it must be less than \".concat(LIST_ID_MAX_VALUE));\n }\n this.id = listId;\n this.rulesText = ruleText;\n this.ignoreCosmetic = !!ignoreCosmetic;\n this.ignoreJS = !!ignoreJS;\n this.ignoreUnsafe = !!ignoreUnsafe;\n }\n /**\n * Close does nothing as here's nothing to close in the StringRuleList\n */\n // eslint-disable-next-line class-methods-use-this\n StringRuleList.prototype.close = function () {\n // Empty\n };\n /**\n * @return the rule list identifier\n */\n StringRuleList.prototype.getId = function () {\n return this.id;\n };\n /**\n * Creates a new rules scanner that reads the list contents\n * @return scanner object\n */\n StringRuleList.prototype.newScanner = function (scannerType) {\n var reader = new StringLineReader(this.rulesText);\n return new RuleScanner(reader, this.id, {\n scannerType: scannerType,\n ignoreCosmetic: this.ignoreCosmetic,\n ignoreJS: this.ignoreJS,\n ignoreUnsafe: this.ignoreUnsafe,\n });\n };\n /**\n * Finds rule text by its index.\n * If there's no rule by that index or rule is invalid, it will return null\n *\n * @param ruleIdx\n * @return rule text or null\n */\n StringRuleList.prototype.retrieveRuleText = function (ruleIdx) {\n if (ruleIdx < 0 || ruleIdx >= this.rulesText.length) {\n return null;\n }\n var endOfLine = this.rulesText.indexOf('\\n', ruleIdx);\n if (endOfLine === -1) {\n endOfLine = this.rulesText.length;\n }\n var line = this.rulesText.substring(ruleIdx, endOfLine).trim();\n if (!line) {\n return null;\n }\n return line;\n };\n return StringRuleList;\n}());\n\n/**\n * RuleStorageScanner scans multiple RuleScanner instances\n * The rule index is built from the rule index in the list + the list ID\n * In the index number we consider decimal part as listId and integer part as ruleId\n*/\nvar RuleStorageScanner = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param scanners\n */\n function RuleStorageScanner(scanners) {\n /**\n * Current scanner\n */\n this.currentScanner = null;\n /**\n * Index of the current scanner\n */\n this.currentScannerIdx = -1;\n this.scanners = scanners;\n }\n /**\n * Scan advances the RuleStorageScanner to the next rule, which will then be available\n * through the Rule method. It returns false when the scan stops, either by\n * reaching the end of the input or an error.\n *\n * @return true if there is some result\n */\n RuleStorageScanner.prototype.scan = function () {\n if (this.scanners.length === 0) {\n return false;\n }\n if (!this.currentScanner) {\n this.currentScannerIdx = 0;\n this.currentScanner = this.scanners[this.currentScannerIdx];\n }\n while (true) {\n if (this.currentScanner.scan()) {\n return true;\n }\n // Take the next scanner or just return false if there's nothing more\n if (this.currentScannerIdx === (this.scanners.length - 1)) {\n return false;\n }\n this.currentScannerIdx += 1;\n this.currentScanner = this.scanners[this.currentScannerIdx];\n }\n };\n /**\n * Rule returns the most recent rule generated by a call to Scan, and the index of this rule.\n * See ruleListIdxToStorageIdx for more information on what this index is.\n */\n RuleStorageScanner.prototype.getRule = function () {\n if (!this.currentScanner) {\n return null;\n }\n var rule = this.currentScanner.getRule();\n if (!rule) {\n return null;\n }\n var index = RuleStorageScanner.ruleListIdxToStorageIdx(rule.rule.getFilterListId(), rule.index);\n return new IndexedStorageRule(rule.rule, index);\n };\n /**\n * ruleListIdxToStorageIdx converts pair of listID and rule list index\n * to \"storage index\" number\n *\n * @param listId\n * @param ruleIdx\n */\n RuleStorageScanner.ruleListIdxToStorageIdx = function (listId, ruleIdx) {\n return listId / LIST_ID_MAX_VALUE + ruleIdx;\n };\n /**\n * Converts the \"storage index\" to two integers:\n * listID -- rule list identifier\n * ruleIdx -- index of the rule in the list\n *\n * @param storageIdx\n * @return [listId, ruleIdx]\n */\n RuleStorageScanner.storageIdxToRuleListIdx = function (storageIdx) {\n var listId = Math.round((storageIdx % 1) * LIST_ID_MAX_VALUE);\n var ruleIdx = Math.trunc(storageIdx);\n return [listId, ruleIdx];\n };\n return RuleStorageScanner;\n}());\n\n/**\n * Rule list's cache\n */\nvar ListCache = /** @class */ (function () {\n /**\n * Constructor\n */\n function ListCache() {\n this.cache = new Map();\n }\n /**\n * @param key\n * @return rule for specified key\n */\n ListCache.prototype.get = function (key) {\n return this.cache.get(key);\n };\n /**\n * Sets rule for specified key\n *\n * @param key\n * @param rule\n */\n ListCache.prototype.set = function (key, rule) {\n this.cache.set(key, rule);\n };\n return ListCache;\n}());\n\n/**\n * RuleStorage is an abstraction that combines several rule lists\n * It can be scanned using RuleStorageScanner, and also it allows\n * retrieving rules by its index\n\n * The idea is to keep rules in a serialized format (even original format in the case of FileRuleList)\n * and create them in a lazy manner only when we really need them. When the filtering engine is\n * being initialized, we need to scan the rule lists once in order to fill up the lookup tables.\n * We use rule indexes as a unique rule identifier instead of the rule itself.\n * The rule is created (see RetrieveRule) only when there's a chance that it's needed.\n\n * Rule index is an int64 value that actually consists of two int32 values:\n * One is the rule list identifier, and the second is the index of the rule inside of that list.\n*/\nvar RuleStorage = /** @class */ (function () {\n /**\n * Constructor\n *\n * @param lists rule lists array\n *\n * @throws on duplicate lists\n */\n function RuleStorage(lists) {\n var _this = this;\n this.lists = lists;\n this.listsMap = new Map();\n this.cache = new Map();\n this.lists.forEach(function (list) {\n var filterListId = list.getId();\n if (_this.listsMap.get(filterListId)) {\n throw new Error(\"Duplicate list ID: \".concat(filterListId));\n }\n _this.listsMap.set(filterListId, list);\n });\n }\n /**\n * Creates a new instance of RuleStorageScanner.\n * It can be used to read and parse all the storage contents.\n *\n * @return scanner instance\n */\n RuleStorage.prototype.createRuleStorageScanner = function (scannerType) {\n var scanners = this.lists.map(function (list) { return list.newScanner(scannerType); });\n return new RuleStorageScanner(scanners);\n };\n /**\n * Looks for the filtering rule in this storage\n *\n * @param storageIdx the lookup index that you can get from the rule storage scanner\n * @param ignoreHost rules could be retrieved as host rules\n */\n RuleStorage.prototype.retrieveRule = function (storageIdx, ignoreHost) {\n if (ignoreHost === void 0) { ignoreHost = true; }\n var _a = RuleStorageScanner.storageIdxToRuleListIdx(storageIdx), listId = _a[0], ruleIdx = _a[1];\n var rule = this.getFromCache(listId, ruleIdx);\n if (rule) {\n return rule;\n }\n var list = this.listsMap.get(listId);\n if (!list) {\n // List doesn't exist\n return null;\n }\n var ruleText = list.retrieveRuleText(ruleIdx);\n if (!ruleText) {\n return null;\n }\n var result = RuleFactory.createRule(ruleText, listId, false, false, ignoreHost);\n if (result) {\n this.saveToCache(listId, ruleIdx, result);\n }\n return result;\n };\n /**\n * RetrieveNetworkRule is a helper method that retrieves a network rule from the storage\n *\n * @param storageIdx\n * @return the rule or nil in any other case (not found or error)\n */\n RuleStorage.prototype.retrieveNetworkRule = function (storageIdx) {\n var rule = this.retrieveRule(storageIdx);\n if (!rule) {\n return null;\n }\n if (rule instanceof NetworkRule) {\n return rule;\n }\n return null;\n };\n /**\n * RetrieveHostRule is a helper method that retrieves a host rule from the storage\n *\n * @param storageIdx\n * @return the rule or nil in any other case (not found or error)\n */\n RuleStorage.prototype.retrieveHostRule = function (storageIdx) {\n var rule = this.retrieveRule(storageIdx, false);\n if (!rule) {\n return null;\n }\n if (rule instanceof HostRule) {\n return rule;\n }\n return null;\n };\n /**\n * Saves rule to cache\n *\n * @param listId\n * @param ruleIdx\n * @param rule\n */\n RuleStorage.prototype.saveToCache = function (listId, ruleIdx, rule) {\n var listCache = this.cache.get(listId);\n if (!listCache) {\n listCache = new ListCache();\n this.cache.set(listId, listCache);\n }\n listCache.set(ruleIdx, rule);\n };\n /**\n * Retrieves rule form cache\n *\n * @param listId\n * @param ruleIdx\n */\n RuleStorage.prototype.getFromCache = function (listId, ruleIdx) {\n var listCache = this.cache.get(listId);\n if (!listCache) {\n return undefined;\n }\n return listCache.get(ruleIdx);\n };\n return RuleStorage;\n}());\n\n/**\n * Rule converter class\n */\nvar RuleConverter = /** @class */ (function () {\n function RuleConverter() {\n }\n /**\n * Converts rules text\n *\n * @param rulesText\n */\n RuleConverter.convertRules = function (rulesText) {\n var result = [];\n var lines = rulesText.split(/\\r?\\n/);\n for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {\n var line = lines_1[_i];\n try {\n result.push.apply(result, RuleConverter.convertRule(line));\n }\n catch (e) {\n logger.warn(e.message);\n }\n }\n return result.join('\\n');\n };\n /**\n * TODO for more efficient conversion build AST. And then use the modified AST for creating a\n * rule object.\n * Convert external scriptlet rule to AdGuard scriptlet syntax\n *\n * @param rawRule\n */\n RuleConverter.convertRule = function (rawRule) {\n var rule = rawRule.trim();\n if (rule.startsWith(SimpleRegex.MASK_COMMENT) || rule === '') {\n return [rule];\n }\n var comment = RuleConverter.convertUboComments(rule);\n if (comment) {\n return [comment];\n }\n var converted = rule;\n if (RuleFactory.isCosmetic(rule)) {\n converted = RuleConverter.convertCssInjection(converted);\n converted = RuleConverter.convertPseudoElements(converted);\n converted = RuleConverter.convertRemoveRule(converted);\n converted = RuleConverter.convertScriptHasTextToScriptTagContent(converted);\n converted = RuleConverter.convertUboMatchesPathRule(converted);\n // special case for ubo response header rule, it looks like cosmetic rule, but is converted to network rule\n var removeHeaderRule = RuleConverter.convertUboResponseHeaderRule(converted);\n if (removeHeaderRule) {\n return [removeHeaderRule];\n }\n }\n else {\n var domainAndOptions = RuleConverter.splitIntoDomainAndOptions(converted);\n var domain = domainAndOptions[0];\n var optionsParts = domainAndOptions[1];\n if (optionsParts) {\n optionsParts = RuleConverter.replaceOptions(optionsParts);\n var ruleWithConvertedOptions = RuleConverter.convertOptions(domain, optionsParts);\n if (ruleWithConvertedOptions) {\n return ruleWithConvertedOptions;\n }\n converted = \"\".concat(domain, \"$\").concat(optionsParts.join(','));\n }\n }\n var scriptletRules = scriptlets.convertScriptletToAdg(converted);\n // TODO Check if isValidScriptletRule call is needed here, looks like convertScriptletToAdg\n // should already return a valid scriptlet.\n if (scriptletRules && scriptletRules.every(function (x) { return RuleConverter.isValidScriptletRule(x); })) {\n return scriptletRules;\n }\n var adgRedirectRule = RuleConverter.convertUboAndAbpRedirectsToAdg(converted);\n if (adgRedirectRule) {\n return [adgRedirectRule];\n }\n if (converted.includes(RuleConverter.UBO_HTML_RULE_MASK)) {\n throw new SyntaxError(\"Invalid UBO script rule: \".concat(converted));\n }\n return [converted];\n };\n /**\n * Validates AdGuard syntax scriptlet rule.\n *\n * @param ruleText AdGuard scriptlet rule.\n */\n RuleConverter.isValidScriptletRule = function (ruleText) {\n try {\n // checks whether the ADG scriptlet rule name is valid\n return scriptlets.isValidScriptletRule(ruleText);\n }\n catch (e) {\n return false;\n }\n };\n /**\n * Converts UBO Script rule\n *\n * @param {string} ruleText rule text\n * @returns {string} converted rule\n */\n RuleConverter.convertScriptHasTextToScriptTagContent = function (ruleText) {\n if (ruleText.startsWith(SimpleRegex.MASK_COMMENT)\n || !RuleConverter.SCRIPT_HAS_TEXT_REGEX.test(ruleText)\n || RuleConverter.CSS_COMBINATORS_REGEX.test(ruleText)) {\n return ruleText;\n }\n var convertedRuleText = ruleText;\n var attributeStrings = [];\n // Cut all attributes substrings from rule text into array\n // https://github.com/AdguardTeam/tsurlfilter/issues/55\n if (RuleConverter.ATTRIBUTE_REGEX.test(ruleText)) {\n var globalAttributeRegExp = new RegExp(RuleConverter.ATTRIBUTE_REGEX, 'gi');\n attributeStrings = ruleText.match(globalAttributeRegExp);\n attributeStrings === null || attributeStrings === void 0 ? void 0 : attributeStrings.forEach(function (attrStr) {\n convertedRuleText = convertedRuleText.replace(attrStr, '');\n });\n }\n // Convert base of the rule ##^script:has-text(text) to $$script[tag-content='text']\n convertedRuleText = \"\".concat(convertedRuleText\n .replace(RuleConverter.SCRIPT_HAS_TEXT_REGEX_SHORT, RuleConverter.SCRIPT_HAS_TEXT_REPLACEMENT)\n .slice(0, -1), \"\\\"][max-length=\\\"262144\\\"]\");\n // Escape double quotes inside tag-content, like it is required by AdGuard syntax\n // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#tag-content\n convertedRuleText = convertedRuleText.replace(RuleConverter.TAG_CONTENT_VALUE_REGEX, function (match, group) {\n return \"[tag-content=\\\"\".concat(group.replace(/\"/g, '\"\"'), \"\\\"]\");\n });\n // Return attributes if there were any\n attributeStrings === null || attributeStrings === void 0 ? void 0 : attributeStrings.forEach(function (attrStr) {\n convertedRuleText += attrStr;\n });\n return convertedRuleText;\n };\n /**\n * Converts UBO and ABP redirect rules to AdGuard redirect rules\n * @param rule\n * @return {string} convertedRule\n */\n RuleConverter.convertUboAndAbpRedirectsToAdg = function (rule) {\n var redirects = scriptlets.redirects;\n if (redirects.isUboRedirectCompatibleWithAdg(rule) || redirects.isAbpRedirectCompatibleWithAdg(rule)) {\n return redirects.convertRedirectToAdg(rule);\n }\n return null;\n };\n /**\n * Converts the rule options according to the conversion map and handles special cases.\n * @param domainPart - The domain part of the rule.\n * @param optionsParts - The options part of the rule as an array of strings.\n * @private\n */\n RuleConverter.convertOptions = function (domainPart, optionsParts) {\n var NAME_VALUE_SPLITTER = '=';\n var areOptionsConverted = false;\n var updatedOptionsParts = optionsParts.map(function (optionsPart) {\n var convertedOptionsPart = RuleConverter.OPTIONS_CONVERSION_MAP.get(optionsPart);\n // If option is $mp4, then it should go with $media option together\n if (optionsPart === 'mp4') {\n // Check if media is not already among options\n if (!optionsParts.some(function (option) { return option === 'media'; })) {\n convertedOptionsPart = \"\".concat(convertedOptionsPart, \",media\");\n }\n }\n if (convertedOptionsPart) {\n areOptionsConverted = true;\n return convertedOptionsPart;\n }\n return optionsPart;\n });\n // If options have more than one csp modifiers, we merge them into one;\n var cspParts = updatedOptionsParts.filter(function (optionsPart) { return optionsPart.startsWith('csp'); });\n if (cspParts.length > 1) {\n var allButCsp = updatedOptionsParts.filter(function (optionsPart) { return !optionsPart.startsWith('csp'); });\n var cspValues = cspParts.map(function (cspPart) { return cspPart.split(NAME_VALUE_SPLITTER)[1]; });\n var updatedCspOption = \"csp\".concat(NAME_VALUE_SPLITTER).concat(cspValues.join('; '));\n updatedOptionsParts = allButCsp.concat(updatedCspOption);\n }\n if (areOptionsConverted) {\n var updatedOptions = updatedOptionsParts.join(',');\n return [\"\".concat(domainPart, \"$\").concat(updatedOptions)];\n }\n return null;\n };\n /**\n * Converts ubo syntax comments (rules starting with #)\n * Note: It's not possible to detect 100% cause rules starting with ## are valid elemhide rules\n *\n * @param rule\n * @return {string}\n */\n RuleConverter.convertUboComments = function (rule) {\n if (rule.startsWith('# ') || rule.startsWith('####')) {\n return \"! \".concat(rule);\n }\n return null;\n };\n /**\n * Executes rule css conversion\n *\n * @param rule\n * @param parts\n * @param ruleMark\n */\n RuleConverter.executeConversion = function (rule, parts, ruleMark) {\n var result = rule;\n var domain = parts[0];\n if (domain) {\n var rulePart = parts[1];\n if (rulePart.match(RuleConverter.CSS_RULE_REPLACE_PATTERN)) {\n var groups = RuleConverter.CSS_RULE_REPLACE_PATTERN.exec(rulePart);\n if (groups != null) {\n if (groups.length === 3) {\n result = domain + ruleMark;\n result += \"\".concat(groups[1], \" { \").concat(groups[2], \" }\");\n }\n }\n }\n }\n return result;\n };\n /**\n * Adds colon to the pseudo elements written with one colon (:before, :after);\n * e.g.\n * \"hotline.ua##.reset-scroll:before\" -> \"hotline.ua##.reset-scroll::before\"\n * @param rule\n * @private\n */\n RuleConverter.convertPseudoElements = function (rule) {\n var BEFORE = 'before';\n var AFTER = 'after';\n var SINGLE_COLON = ':';\n // does not have parts to convert\n if (!(rule.includes(SINGLE_COLON + BEFORE) || rule.includes(SINGLE_COLON + AFTER))) {\n return rule;\n }\n // not an css rule\n if (!(rule.includes(RuleConverter.MASK_ELEMENT_HIDING)\n || rule.includes(RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION)\n || rule.includes(RuleConverter.MASK_CSS)\n || rule.includes(RuleConverter.MASK_CSS_EXCEPTION))) {\n return rule;\n }\n var modifiedRule = '';\n for (var i = 0; i < rule.length; i += 1) {\n if (rule[i] !== SINGLE_COLON) {\n modifiedRule += rule[i];\n continue;\n }\n if ((rule.indexOf(BEFORE, i) === i + 1\n || rule.indexOf(AFTER, i) === i + 1)\n && rule[i - 1] !== SINGLE_COLON) {\n modifiedRule += SINGLE_COLON;\n modifiedRule += rule[i];\n continue;\n }\n modifiedRule += rule[i];\n }\n return modifiedRule;\n };\n /**\n * Converts CSS injection\n * example.com##h1:style(background-color: blue !important)\n * into\n * example.com#$#h1 { background-color: blue !important }\n *

\n * OR (for exceptions):\n * example.com#@#h1:style(background-color: blue !important)\n * into\n * example.com#@$#h1 { background-color: blue !important }\n *\n * @param {string} rule\n * @return {string} convertedRule\n */\n RuleConverter.convertCssInjection = function (rule) {\n if (rule.includes(':style')) {\n var parts = void 0;\n var resultMask = void 0;\n var resultRule = rule;\n var isExtendedCss = false;\n for (var i = 0; i < EXT_CSS_PSEUDO_INDICATORS.length; i += 1) {\n isExtendedCss = rule.indexOf(EXT_CSS_PSEUDO_INDICATORS[i]) !== -1;\n if (isExtendedCss) {\n break;\n }\n }\n if (rule.includes(RuleConverter.MASK_CSS_EXTENDED_CSS_RULE)) {\n parts = rule.split(RuleConverter.MASK_CSS_EXTENDED_CSS_RULE, 2);\n resultMask = RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE;\n }\n else if (rule.includes(RuleConverter.MASK_CSS_EXCEPTION_EXTENDED_CSS_RULE)) {\n parts = rule.split(RuleConverter.MASK_CSS_EXCEPTION_EXTENDED_CSS_RULE, 2);\n resultMask = RuleConverter.MASK_CSS_EXCEPTION_INJECT_EXTENDED_CSS_RULE;\n // firstly we check for exception rule in order not to confuse with id selectors\n // e.g. yourconroenews.com#@##siteNav:style(transform: none !important;)\n }\n else if (rule.includes(RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION)) {\n parts = rule.split(RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION, 2);\n if (isExtendedCss) {\n resultMask = RuleConverter.MASK_CSS_EXCEPTION_INJECT_EXTENDED_CSS_RULE;\n }\n else {\n resultMask = RuleConverter.MASK_CSS_EXCEPTION;\n }\n }\n else if (rule.includes(RuleConverter.MASK_ELEMENT_HIDING)) {\n parts = rule.split(RuleConverter.MASK_ELEMENT_HIDING, 2);\n if (isExtendedCss) {\n resultMask = RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE;\n }\n else {\n resultMask = RuleConverter.MASK_CSS;\n }\n }\n if (parts && resultMask) {\n resultRule = RuleConverter.executeConversion(rule, parts, resultMask);\n }\n return resultRule;\n }\n return rule;\n };\n /**\n * Converts ':remove()' rule to AdGuard extended css rule\n * example.com###banner:remove() -> example.com#$?##banner { remove: true; }\n * @param {string} rule\n * @return {string} rule or converted rule\n */\n RuleConverter.convertRemoveRule = function (rule) {\n // if rule is already extended css, do not convert it\n if (rule.includes(RuleConverter.MASK_CSS_EXTENDED_CSS_RULE)) {\n return rule;\n }\n if (rule.includes(RuleConverter.MASK_ELEMENT_HIDING) && rule.endsWith(RuleConverter.REMOVE_RULE_PATTERN)) {\n return rule\n .replace(RuleConverter.MASK_ELEMENT_HIDING, RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE)\n .replace(RuleConverter.REMOVE_RULE_PATTERN, RuleConverter.REMOVE_RULE_REPLACER);\n }\n return rule;\n };\n /**\n * Converts '^responseheader()' rule to AdGuard's $removeheader modifier\n * \"ya.ru##^responseheader(header-name)\" -> \"||ya.ru^$removeheader=header-name\"\n *\n * @param {string} ruleText\n * @return {string} ruleText or converted rule\n */\n RuleConverter.convertUboResponseHeaderRule = function (ruleText) {\n if (ruleText.startsWith(SimpleRegex.MASK_COMMENT) || !ruleText.includes(RuleConverter.UBO_RESPONSE_HEADER)) {\n return null;\n }\n if (RuleConverter.UBO_RESPONSE_HEADER_REGEX.test(ruleText)) {\n return \"||\".concat(ruleText.replace(RuleConverter.UBO_RESPONSE_HEADER_REGEX, RuleConverter.UBO_RESPONSE_HEADER_REPLACEMENT)\n .slice(0, -1));\n }\n if (RuleConverter.UBO_RESPONSE_HEADER_EXCEPTION_REGEX.test(ruleText)) {\n return \"@@||\".concat(ruleText.replace(RuleConverter.UBO_RESPONSE_HEADER_EXCEPTION_REGEX, RuleConverter.UBO_RESPONSE_HEADER_REPLACEMENT).slice(0, -1));\n }\n return ruleText;\n };\n /**\n * Converts cosmetic 'matches-path()' rule to AdGuard's $path modifier\n * \"ya.ru##:matches-path(/page) p\" -> \"[$path=/page]ya.ru##p\"\n *\n * @param {string} ruleText\n * @return {string} ruleText or converted rule\n */\n RuleConverter.convertUboMatchesPathRule = function (ruleText) {\n if (ruleText.startsWith(SimpleRegex.MASK_COMMENT)) {\n return ruleText;\n }\n var _b = findCosmeticRuleMarker(ruleText), markerIndex = _b[0], marker = _b[1];\n if (!marker) {\n return ruleText;\n }\n var expressionStartIndex = markerIndex + marker.length;\n var matchesPathStartIndex = ruleText.indexOf(RuleConverter.UBO_MATCHES_PATH, expressionStartIndex);\n if (matchesPathStartIndex === -1) {\n return ruleText;\n }\n var reversedMatchesPathStartIndex = ruleText.indexOf(RuleConverter.UBO_REVERSED_MATCHES_PATH, expressionStartIndex);\n var isReversed = reversedMatchesPathStartIndex !== -1;\n var pathStartIndex = isReversed\n ? reversedMatchesPathStartIndex + RuleConverter.UBO_REVERSED_MATCHES_PATH.length\n : matchesPathStartIndex + RuleConverter.UBO_MATCHES_PATH.length;\n var matchPathOperatorCloseBracketIndex;\n var openBracketCounter = 1;\n var closeBracketCounter = 0;\n for (var i = pathStartIndex; i < ruleText.length; i += 1) {\n if (ruleText[i - 1] !== '\\\\') {\n if (ruleText[i] === '(') {\n openBracketCounter += 1;\n }\n else if (ruleText[i] === ')') {\n closeBracketCounter += 1;\n if (openBracketCounter === closeBracketCounter) {\n matchPathOperatorCloseBracketIndex = i;\n break;\n }\n }\n }\n }\n if (!matchPathOperatorCloseBracketIndex) {\n return ruleText;\n }\n var domains = ruleText.slice(0, markerIndex);\n var expressionMiddle = ruleText.slice(expressionStartIndex, isReversed ? reversedMatchesPathStartIndex : matchesPathStartIndex);\n var expressionTail = ruleText\n .slice(matchPathOperatorCloseBracketIndex + (isReversed ? 2 : 1))\n .trim();\n var path = ruleText.slice(pathStartIndex, matchPathOperatorCloseBracketIndex);\n var isRegex = SimpleRegex.isRegexPattern(path);\n if (isReversed) {\n path = \"/^((?!\".concat(isRegex ? path.slice(1, path.length - 1) : SimpleRegex.patternToRegexp(path), \").)*$/\");\n }\n if (isRegex) {\n path = SimpleRegex.escapeRegexSpecials(path, SimpleRegex.reModifierPatternSpecialCharacters);\n }\n return \"[$path=\".concat(path, \"]\").concat(domains).concat(marker).concat(expressionMiddle).concat(expressionTail);\n };\n /**\n * Substitutes option aliases in the provided options array with their corresponding aliases.\n *\n * @param optionsParts - An array of options to replace aliases in.\n * @returns - An array of options with aliases replaced.\n */\n RuleConverter.replaceOptions = function (optionsParts) {\n var resultOptions = optionsParts.map(function (option) {\n var _b = option.split('=', 2), optionNameRaw = _b[0], optionValue = _b[1];\n var isNegated = optionNameRaw.startsWith('~');\n var optionName = isNegated ? optionNameRaw.slice(1) : optionNameRaw;\n var convertedOptionName = RuleConverter.OPTIONS_ALIASES[optionName];\n if (!convertedOptionName) {\n return option;\n }\n var negationPrefix = isNegated ? '~' : '';\n return optionValue\n ? \"\".concat(negationPrefix).concat(convertedOptionName, \"=\").concat(optionValue)\n : \"\".concat(negationPrefix).concat(convertedOptionName);\n });\n return resultOptions;\n };\n var _a;\n _a = RuleConverter;\n RuleConverter.CSS_RULE_REPLACE_PATTERN = /(.*):style\\((.*)\\)/g;\n // eslint-disable-next-line max-len\n RuleConverter.SCRIPT_HAS_TEXT_REGEX = /##\\^(script(\\[[{a-z0-9-_.:}]*(=\"[{a-z0-9-_.:}]*\")*\\])*:(has-text|contains))\\((?!\\/.+\\/\\))/i;\n RuleConverter.SCRIPT_HAS_TEXT_REGEX_SHORT = /(##\\^script:(has-text|contains))\\((?!\\/.+\\/\\))/i;\n RuleConverter.TAG_CONTENT_VALUE_REGEX = /\\[tag-content=\"(.*?)\"]/g;\n RuleConverter.ATTRIBUTE_REGEX = /(\\[[{a-z0-9-_.:}]*(=\"[{a-z0-9-_.:}]*\")*\\])/i;\n RuleConverter.CSS_COMBINATORS_REGEX = />|\\+|~/;\n RuleConverter.SCRIPT_HAS_TEXT_REPLACEMENT = '$$$$script[tag-content=\"';\n RuleConverter.UBO_RESPONSE_HEADER = '#^responseheader(';\n RuleConverter.UBO_RESPONSE_HEADER_REGEX = /##\\^responseheader\\((?!\\/.+\\/\\))/i;\n RuleConverter.UBO_RESPONSE_HEADER_EXCEPTION_REGEX = /#@#\\^responseheader\\((?!\\/.+\\/\\))/i;\n RuleConverter.UBO_RESPONSE_HEADER_REPLACEMENT = '^$removeheader=';\n RuleConverter.UBO_MATCHES_PATH = ':matches-path(';\n RuleConverter.UBO_REVERSED_MATCHES_PATH = ':not(:matches-path(';\n /**\n * Rule masks\n */\n RuleConverter.MASK_ELEMENT_HIDING = '##';\n RuleConverter.UBO_HTML_RULE_MASK = '##^';\n RuleConverter.MASK_ELEMENT_HIDING_EXCEPTION = '#@#';\n RuleConverter.MASK_CSS = '#$#';\n RuleConverter.MASK_CSS_EXCEPTION = '#@$#';\n RuleConverter.MASK_CSS_EXTENDED_CSS_RULE = '#?#';\n RuleConverter.MASK_CSS_EXCEPTION_EXTENDED_CSS_RULE = '#@?#';\n RuleConverter.MASK_CSS_INJECT_EXTENDED_CSS_RULE = '#$?#';\n RuleConverter.MASK_CSS_EXCEPTION_INJECT_EXTENDED_CSS_RULE = '#@$?#';\n RuleConverter.REMOVE_RULE_PATTERN = ':remove()';\n RuleConverter.REMOVE_RULE_REPLACER = ' { remove: true; }';\n /**\n * Special characters\n */\n RuleConverter.REGEXP_DELIMITER = '/';\n RuleConverter.ESCAPING_SLASH = '\\\\';\n /**\n * Splits the given rule text into domain and options parts using the options delimiter ($).\n * Returns the domain part and an array of options, or null if no options are present.\n *\n * @param ruleText - The rule text to be split.\n * @returns [domain, options] or [domain, null] if no options are present.\n */\n RuleConverter.splitIntoDomainAndOptions = function (ruleText) {\n var optionsDelimiterIdx = -1;\n var inRegExp = false;\n for (var i = ruleText.length - 1; i >= 0; i -= 1) {\n if (!inRegExp && ruleText[i] === OPTIONS_DELIMITER) {\n optionsDelimiterIdx = i;\n break;\n }\n if (ruleText[i] === _a.REGEXP_DELIMITER\n && (i === 0 || ruleText[i - 1] !== _a.ESCAPING_SLASH)) {\n inRegExp = !inRegExp;\n }\n }\n if (optionsDelimiterIdx === -1) {\n return [ruleText, null];\n }\n var domainPart = ruleText.slice(0, optionsDelimiterIdx);\n var optionsPart = ruleText.slice(optionsDelimiterIdx + 1);\n // do not remove escape characters from regexp modifiers values\n var optionsParts = parseOptionsString(optionsPart, false);\n return [domainPart, optionsParts];\n };\n /**\n * These option shortcuts will be converted to a more wordy AdGuard options.\n * @private\n */\n RuleConverter.OPTIONS_CONVERSION_MAP = new Map([\n // See https://adguard.com/kb/general/ad-filtering/create-own-filters/#empty-modifier\n ['empty', 'redirect=nooptext'],\n // See https://adguard.com/kb/general/ad-filtering/create-own-filters/#mp4-modifier\n ['mp4', 'redirect=noopmp4-1s'],\n ['inline-script', \"csp=script-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:\"],\n ['inline-font', \"csp=font-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:\"],\n ]);\n /**\n * Options aliases, used to convert non-AdGuard options to AdGuard options\n */\n RuleConverter.OPTIONS_ALIASES = {\n 'first-party': '~third-party',\n xhr: 'xmlhttprequest',\n css: 'stylesheet',\n frame: 'subdocument',\n queryprune: 'removeparam',\n doc: 'document',\n '1p': '~third-party',\n '3p': 'third-party',\n ghide: 'generichide',\n ehide: 'elemhide',\n shide: 'specifichide',\n };\n return RuleConverter;\n}());\n\n/**\n * Module, which can be used to validate filter rules in other libraries\n */\nvar RuleValidator = /** @class */ (function () {\n function RuleValidator() {\n }\n /**\n * Creates validation result\n * @param valid\n * @param error\n * @private\n */\n RuleValidator.createValidationResult = function (valid, error) {\n if (error) {\n return { valid: valid, error: error };\n }\n return { valid: valid, error: null };\n };\n RuleValidator.validateRegexp = function (pattern, ruleText) {\n if (pattern.startsWith(SimpleRegex.MASK_REGEX_RULE)\n && pattern.endsWith(SimpleRegex.MASK_REGEX_RULE)) {\n try {\n new RegExp(pattern.slice(1, -1));\n }\n catch (e) {\n throw new SyntaxError(\"Rule has invalid regex pattern: \\\"\".concat(ruleText, \"\\\"\"));\n }\n }\n };\n /**\n * Validates raw rule string\n * @param rawRule\n */\n RuleValidator.validate = function (rawRule) {\n var ruleText = rawRule.trim();\n if (!ruleText || RuleFactory.isComment(ruleText)) {\n return RuleValidator.createValidationResult(true);\n }\n if (RuleFactory.isShort(ruleText)) {\n return RuleValidator.createValidationResult(false, \"Rule is too short: \".concat(ruleText));\n }\n try {\n // Validate cosmetic rules\n if (RuleFactory.isCosmetic(ruleText)) {\n new CosmeticRule(ruleText, 0);\n return RuleValidator.createValidationResult(true);\n }\n // Validate network rules\n var rule = new NetworkRule(ruleText, 0);\n RuleValidator.validateRegexp(rule.getPattern(), rule.getText());\n }\n catch (e) {\n var errorMessage = \"Error: \\\"\".concat(e.message, \"\\\" in the rule: \\\"\").concat(ruleText, \"\\\"\");\n return RuleValidator.createValidationResult(false, errorMessage);\n }\n return RuleValidator.createValidationResult(true);\n // TODO validate host rules\n };\n return RuleValidator;\n}());\n\n/**\n * Module with miscellaneous syntax utils exposed in API\n */\nvar RuleSyntaxUtils = /** @class */ (function () {\n function RuleSyntaxUtils() {\n }\n /**\n * Checks if rule can be matched by domain\n * @param ruleText\n * @param domain\n */\n RuleSyntaxUtils.isRuleForDomain = function (ruleText, domain) {\n var rule = RuleFactory.createRule(ruleText, this.DUMMY_FILTER_ID);\n if (!rule) {\n return false;\n }\n return rule.matchesPermittedDomains(domain);\n };\n /**\n * Checks if rule can be matched by url\n * @param ruleText\n * @param url\n */\n RuleSyntaxUtils.isRuleForUrl = function (ruleText, url) {\n var domain = getHostname(url);\n if (!domain) {\n return false;\n }\n return this.isRuleForDomain(ruleText, domain);\n };\n RuleSyntaxUtils.DUMMY_FILTER_ID = 0;\n return RuleSyntaxUtils;\n}());\n\nexport { CompatibilityTypes, CookieModifier, CosmeticOption, CosmeticResult, CosmeticRule, CosmeticRuleParser, CosmeticRuleType, DnsEngine, DnsResult, EXT_CSS_PSEUDO_INDICATORS, Engine, HTTPMethod, HostRule, IndexedRule, IndexedStorageRule, LIST_ID_MAX_VALUE, MatchingResult, NetworkRule, NetworkRuleOption, RemoveHeaderModifier, RemoveParamModifier, ReplaceModifier, Request, RuleConverter, RuleFactory, RuleStorage, RuleSyntaxUtils, RuleValidator, StringRuleList, cleanUrlParamByRegExp, config, getRelativeUrl, isCompatibleWith, isDomainName, logger, setConfiguration, setLogger };\n","/**\n * Check if `vhost` is a valid suffix of `hostname` (top-domain)\n *\n * It means that `vhost` needs to be a suffix of `hostname` and we then need to\n * make sure that: either they are equal, or the character preceding `vhost` in\n * `hostname` is a '.' (it should not be a partial label).\n *\n * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok\n * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok\n * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok\n */\nfunction shareSameDomainSuffix(hostname, vhost) {\n if (hostname.endsWith(vhost)) {\n return (hostname.length === vhost.length ||\n hostname[hostname.length - vhost.length - 1] === '.');\n }\n return false;\n}\n/**\n * Given a hostname and its public suffix, extract the general domain.\n */\nfunction extractDomainWithSuffix(hostname, publicSuffix) {\n // Locate the index of the last '.' in the part of the `hostname` preceding\n // the public suffix.\n //\n // examples:\n // 1. not.evil.co.uk => evil.co.uk\n // ^ ^\n // | | start of public suffix\n // | index of the last dot\n //\n // 2. example.co.uk => example.co.uk\n // ^ ^\n // | | start of public suffix\n // |\n // | (-1) no dot found before the public suffix\n const publicSuffixIndex = hostname.length - publicSuffix.length - 2;\n const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex);\n // No '.' found, then `hostname` is the general domain (no sub-domain)\n if (lastDotBeforeSuffixIndex === -1) {\n return hostname;\n }\n // Extract the part between the last '.'\n return hostname.slice(lastDotBeforeSuffixIndex + 1);\n}\n/**\n * Detects the domain based on rules and upon and a host string\n */\nexport default function getDomain(suffix, hostname, options) {\n // Check if `hostname` ends with a member of `validHosts`.\n if (options.validHosts !== null) {\n const validHosts = options.validHosts;\n for (const vhost of validHosts) {\n if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost)) {\n return vhost;\n }\n }\n }\n let numberOfLeadingDots = 0;\n if (hostname.startsWith('.')) {\n while (numberOfLeadingDots < hostname.length &&\n hostname[numberOfLeadingDots] === '.') {\n numberOfLeadingDots += 1;\n }\n }\n // If `hostname` is a valid public suffix, then there is no domain to return.\n // Since we already know that `getPublicSuffix` returns a suffix of `hostname`\n // there is no need to perform a string comparison and we only compare the\n // size.\n if (suffix.length === hostname.length - numberOfLeadingDots) {\n return null;\n }\n // To extract the general domain, we start by identifying the public suffix\n // (if any), then consider the domain to be the public suffix with one added\n // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix:\n // `co.uk`, then we take one more level: `evil`, giving the final result:\n // `evil.co.uk`).\n return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix);\n}\n//# sourceMappingURL=domain.js.map","/**\n * Return the part of domain without suffix.\n *\n * Example: for domain 'foo.com', the result would be 'foo'.\n */\nexport default function getDomainWithoutSuffix(domain, suffix) {\n // Note: here `domain` and `suffix` cannot have the same length because in\n // this case we set `domain` to `null` instead. It is thus safe to assume\n // that `suffix` is shorter than `domain`.\n return domain.slice(0, -suffix.length - 1);\n}\n//# sourceMappingURL=domain-without-suffix.js.map","/**\n * @param url - URL we want to extract a hostname from.\n * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname.\n */\nexport default function extractHostname(url, urlIsValidHostname) {\n let start = 0;\n let end = url.length;\n let hasUpper = false;\n // If url is not already a valid hostname, then try to extract hostname.\n if (!urlIsValidHostname) {\n // Special handling of data URLs\n if (url.startsWith('data:')) {\n return null;\n }\n // Trim leading spaces\n while (start < url.length && url.charCodeAt(start) <= 32) {\n start += 1;\n }\n // Trim trailing spaces\n while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {\n end -= 1;\n }\n // Skip scheme.\n if (url.charCodeAt(start) === 47 /* '/' */ &&\n url.charCodeAt(start + 1) === 47 /* '/' */) {\n start += 2;\n }\n else {\n const indexOfProtocol = url.indexOf(':/', start);\n if (indexOfProtocol !== -1) {\n // Implement fast-path for common protocols. We expect most protocols\n // should be one of these 4 and thus we will not need to perform the\n // more expansive validity check most of the time.\n const protocolSize = indexOfProtocol - start;\n const c0 = url.charCodeAt(start);\n const c1 = url.charCodeAt(start + 1);\n const c2 = url.charCodeAt(start + 2);\n const c3 = url.charCodeAt(start + 3);\n const c4 = url.charCodeAt(start + 4);\n if (protocolSize === 5 &&\n c0 === 104 /* 'h' */ &&\n c1 === 116 /* 't' */ &&\n c2 === 116 /* 't' */ &&\n c3 === 112 /* 'p' */ &&\n c4 === 115 /* 's' */) {\n // https\n }\n else if (protocolSize === 4 &&\n c0 === 104 /* 'h' */ &&\n c1 === 116 /* 't' */ &&\n c2 === 116 /* 't' */ &&\n c3 === 112 /* 'p' */) {\n // http\n }\n else if (protocolSize === 3 &&\n c0 === 119 /* 'w' */ &&\n c1 === 115 /* 's' */ &&\n c2 === 115 /* 's' */) {\n // wss\n }\n else if (protocolSize === 2 &&\n c0 === 119 /* 'w' */ &&\n c1 === 115 /* 's' */) {\n // ws\n }\n else {\n // Check that scheme is valid\n for (let i = start; i < indexOfProtocol; i += 1) {\n const lowerCaseCode = url.charCodeAt(i) | 32;\n if (!(((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z]\n (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9]\n lowerCaseCode === 46 || // '.'\n lowerCaseCode === 45 || // '-'\n lowerCaseCode === 43) // '+'\n )) {\n return null;\n }\n }\n }\n // Skip 0, 1 or more '/' after ':/'\n start = indexOfProtocol + 2;\n while (url.charCodeAt(start) === 47 /* '/' */) {\n start += 1;\n }\n }\n }\n // Detect first occurrence of '/', '?' or '#'. We also keep track of the\n // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of\n // (respectively), identifier, ipv6 or port.\n let indexOfIdentifier = -1;\n let indexOfClosingBracket = -1;\n let indexOfPort = -1;\n for (let i = start; i < end; i += 1) {\n const code = url.charCodeAt(i);\n if (code === 35 || // '#'\n code === 47 || // '/'\n code === 63 // '?'\n ) {\n end = i;\n break;\n }\n else if (code === 64) {\n // '@'\n indexOfIdentifier = i;\n }\n else if (code === 93) {\n // ']'\n indexOfClosingBracket = i;\n }\n else if (code === 58) {\n // ':'\n indexOfPort = i;\n }\n else if (code >= 65 && code <= 90) {\n hasUpper = true;\n }\n }\n // Detect identifier: '@'\n if (indexOfIdentifier !== -1 &&\n indexOfIdentifier > start &&\n indexOfIdentifier < end) {\n start = indexOfIdentifier + 1;\n }\n // Handle ipv6 addresses\n if (url.charCodeAt(start) === 91 /* '[' */) {\n if (indexOfClosingBracket !== -1) {\n return url.slice(start + 1, indexOfClosingBracket).toLowerCase();\n }\n return null;\n }\n else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) {\n // Detect port: ':'\n end = indexOfPort;\n }\n }\n // Trim trailing dots\n while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) {\n end -= 1;\n }\n const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;\n if (hasUpper) {\n return hostname.toLowerCase();\n }\n return hostname;\n}\n//# sourceMappingURL=extract-hostname.js.map","/**\n * Check if a hostname is an IP. You should be aware that this only works\n * because `hostname` is already garanteed to be a valid hostname!\n */\nfunction isProbablyIpv4(hostname) {\n // Cannot be shorted than 1.1.1.1\n if (hostname.length < 7) {\n return false;\n }\n // Cannot be longer than: 255.255.255.255\n if (hostname.length > 15) {\n return false;\n }\n let numberOfDots = 0;\n for (let i = 0; i < hostname.length; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n numberOfDots += 1;\n }\n else if (code < 48 /* '0' */ || code > 57 /* '9' */) {\n return false;\n }\n }\n return (numberOfDots === 3 &&\n hostname.charCodeAt(0) !== 46 /* '.' */ &&\n hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */);\n}\n/**\n * Similar to isProbablyIpv4.\n */\nfunction isProbablyIpv6(hostname) {\n if (hostname.length < 3) {\n return false;\n }\n let start = hostname.startsWith('[') ? 1 : 0;\n let end = hostname.length;\n if (hostname[end - 1] === ']') {\n end -= 1;\n }\n // We only consider the maximum size of a normal IPV6. Note that this will\n // fail on so-called \"IPv4 mapped IPv6 addresses\" but this is a corner-case\n // and a proper validation library should be used for these.\n if (end - start > 39) {\n return false;\n }\n let hasColon = false;\n for (; start < end; start += 1) {\n const code = hostname.charCodeAt(start);\n if (code === 58 /* ':' */) {\n hasColon = true;\n }\n else if (!(((code >= 48 && code <= 57) || // 0-9\n (code >= 97 && code <= 102) || // a-f\n (code >= 65 && code <= 90)) // A-F\n )) {\n return false;\n }\n }\n return hasColon;\n}\n/**\n * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4).\n * This *will not* work on any string. We need `hostname` to be a valid\n * hostname.\n */\nexport default function isIp(hostname) {\n return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);\n}\n//# sourceMappingURL=is-ip.js.map","/**\n * Implements fast shallow verification of hostnames. This does not perform a\n * struct check on the content of labels (classes of Unicode characters, etc.)\n * but instead check that the structure is valid (number of labels, length of\n * labels, etc.).\n *\n * If you need stricter validation, consider using an external library.\n */\nfunction isValidAscii(code) {\n return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127);\n}\n/**\n * Check if a hostname string is valid. It's usually a preliminary check before\n * trying to use getDomain or anything else.\n *\n * Beware: it does not check if the TLD exists.\n */\nexport default function (hostname) {\n if (hostname.length > 255) {\n return false;\n }\n if (hostname.length === 0) {\n return false;\n }\n if (\n /*@__INLINE__*/ !isValidAscii(hostname.charCodeAt(0)) &&\n hostname.charCodeAt(0) !== 46 && // '.' (dot)\n hostname.charCodeAt(0) !== 95 // '_' (underscore)\n ) {\n return false;\n }\n // Validate hostname according to RFC\n let lastDotIndex = -1;\n let lastCharCode = -1;\n const len = hostname.length;\n for (let i = 0; i < len; i += 1) {\n const code = hostname.charCodeAt(i);\n if (code === 46 /* '.' */) {\n if (\n // Check that previous label is < 63 bytes long (64 = 63 + '.')\n i - lastDotIndex > 64 ||\n // Check that previous character was not already a '.'\n lastCharCode === 46 ||\n // Check that the previous label does not end with a '-' (dash)\n lastCharCode === 45 ||\n // Check that the previous label does not end with a '_' (underscore)\n lastCharCode === 95) {\n return false;\n }\n lastDotIndex = i;\n }\n else if (!( /*@__INLINE__*/(isValidAscii(code) || code === 45 || code === 95))) {\n // Check if there is a forbidden character in the label\n return false;\n }\n lastCharCode = code;\n }\n return (\n // Check that last label is shorter than 63 chars\n len - lastDotIndex - 1 <= 63 &&\n // Check that the last character is an allowed trailing label character.\n // Since we already checked that the char is a valid hostname character,\n // we only need to check that it's different from '-'.\n lastCharCode !== 45);\n}\n//# sourceMappingURL=is-valid.js.map","function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) {\n return {\n allowIcannDomains,\n allowPrivateDomains,\n detectIp,\n extractHostname,\n mixedInputs,\n validHosts,\n validateHostname,\n };\n}\nconst DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({});\nexport function setDefaults(options) {\n if (options === undefined) {\n return DEFAULT_OPTIONS;\n }\n return /*@__INLINE__*/ setDefaultsImpl(options);\n}\n//# sourceMappingURL=options.js.map","/**\n * Returns the subdomain of a hostname string\n */\nexport default function getSubdomain(hostname, domain) {\n // If `hostname` and `domain` are the same, then there is no sub-domain\n if (domain.length === hostname.length) {\n return '';\n }\n return hostname.slice(0, -domain.length - 1);\n}\n//# sourceMappingURL=subdomain.js.map","/**\n * Implement a factory allowing to plug different implementations of suffix\n * lookup (e.g.: using a trie or the packed hashes datastructures). This is used\n * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints.\n */\nimport getDomain from './domain';\nimport getDomainWithoutSuffix from './domain-without-suffix';\nimport extractHostname from './extract-hostname';\nimport isIp from './is-ip';\nimport isValidHostname from './is-valid';\nimport { setDefaults } from './options';\nimport getSubdomain from './subdomain';\nexport function getEmptyResult() {\n return {\n domain: null,\n domainWithoutSuffix: null,\n hostname: null,\n isIcann: null,\n isIp: null,\n isPrivate: null,\n publicSuffix: null,\n subdomain: null,\n };\n}\nexport function resetResult(result) {\n result.domain = null;\n result.domainWithoutSuffix = null;\n result.hostname = null;\n result.isIcann = null;\n result.isIp = null;\n result.isPrivate = null;\n result.publicSuffix = null;\n result.subdomain = null;\n}\nexport function parseImpl(url, step, suffixLookup, partialOptions, result) {\n const options = /*@__INLINE__*/ setDefaults(partialOptions);\n // Very fast approximate check to make sure `url` is a string. This is needed\n // because the library will not necessarily be used in a typed setup and\n // values of arbitrary types might be given as argument.\n if (typeof url !== 'string') {\n return result;\n }\n // Extract hostname from `url` only if needed. This can be made optional\n // using `options.extractHostname`. This option will typically be used\n // whenever we are sure the inputs to `parse` are already hostnames and not\n // arbitrary URLs.\n //\n // `mixedInput` allows to specify if we expect a mix of URLs and hostnames\n // as input. If only hostnames are expected then `extractHostname` can be\n // set to `false` to speed-up parsing. If only URLs are expected then\n // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint\n // and will not change the behavior of the library.\n if (!options.extractHostname) {\n result.hostname = url;\n }\n else if (options.mixedInputs) {\n result.hostname = extractHostname(url, isValidHostname(url));\n }\n else {\n result.hostname = extractHostname(url, false);\n }\n if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) {\n return result;\n }\n // Check if `hostname` is a valid ip address\n if (options.detectIp) {\n result.isIp = isIp(result.hostname);\n if (result.isIp) {\n return result;\n }\n }\n // Perform optional hostname validation. If hostname is not valid, no need to\n // go further as there will be no valid domain or sub-domain.\n if (options.validateHostname &&\n options.extractHostname &&\n !isValidHostname(result.hostname)) {\n result.hostname = null;\n return result;\n }\n // Extract public suffix\n suffixLookup(result.hostname, options, result);\n if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) {\n return result;\n }\n // Extract domain\n result.domain = getDomain(result.publicSuffix, result.hostname, options);\n if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) {\n return result;\n }\n // Extract subdomain\n result.subdomain = getSubdomain(result.hostname, result.domain);\n if (step === 4 /* FLAG.SUB_DOMAIN */) {\n return result;\n }\n // Extract domain without suffix\n result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix);\n return result;\n}\n//# sourceMappingURL=factory.js.map","export default function (hostname, options, out) {\n // Fast path for very popular suffixes; this allows to by-pass lookup\n // completely as well as any extra allocation or string manipulation.\n if (!options.allowPrivateDomains && hostname.length > 3) {\n const last = hostname.length - 1;\n const c3 = hostname.charCodeAt(last);\n const c2 = hostname.charCodeAt(last - 1);\n const c1 = hostname.charCodeAt(last - 2);\n const c0 = hostname.charCodeAt(last - 3);\n if (c3 === 109 /* 'm' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 99 /* 'c' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'com';\n return true;\n }\n else if (c3 === 103 /* 'g' */ &&\n c2 === 114 /* 'r' */ &&\n c1 === 111 /* 'o' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'org';\n return true;\n }\n else if (c3 === 117 /* 'u' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 101 /* 'e' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'edu';\n return true;\n }\n else if (c3 === 118 /* 'v' */ &&\n c2 === 111 /* 'o' */ &&\n c1 === 103 /* 'g' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'gov';\n return true;\n }\n else if (c3 === 116 /* 't' */ &&\n c2 === 101 /* 'e' */ &&\n c1 === 110 /* 'n' */ &&\n c0 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'net';\n return true;\n }\n else if (c3 === 101 /* 'e' */ &&\n c2 === 100 /* 'd' */ &&\n c1 === 46 /* '.' */) {\n out.isIcann = true;\n out.isPrivate = false;\n out.publicSuffix = 'de';\n return true;\n }\n }\n return false;\n}\n//# sourceMappingURL=fast-path.js.map","export { parseImpl, getEmptyResult, resetResult, } from './src/factory';\nexport { default as fastPathLookup } from './src/lookup/fast-path';\nexport { setDefaults } from './src/options';\n//# sourceMappingURL=index.js.map","export const exceptions = (function () {\n const _0 = [1, {}], _1 = [0, { \"city\": _0 }];\n const exceptions = [0, { \"ck\": [0, { \"www\": _0 }], \"jp\": [0, { \"kawasaki\": _1, \"kitakyushu\": _1, \"kobe\": _1, \"nagoya\": _1, \"sapporo\": _1, \"sendai\": _1, \"yokohama\": _1 }] }];\n return exceptions;\n})();\nexport const rules = (function () {\n const _2 = [1, {}], _3 = [2, {}], _4 = [1, { \"gov\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2 }], _5 = [0, { \"*\": _3 }], _6 = [1, { \"blogspot\": _3 }], _7 = [1, { \"gov\": _2 }], _8 = [0, { \"*\": _2 }], _9 = [0, { \"cloud\": _3 }], _10 = [1, { \"co\": _3 }], _11 = [2, { \"nodes\": _3 }], _12 = [0, { \"s3\": _3 }], _13 = [0, { \"direct\": _3 }], _14 = [2, { \"id\": _3 }], _15 = [0, { \"vfs\": _3, \"webview-assets\": _3 }], _16 = [0, { \"cloud9\": _15 }], _17 = [0, { \"dualstack\": _12, \"cloud9\": _15 }], _18 = [0, { \"dualstack\": _12, \"s3\": _3, \"s3-website\": _3, \"cloud9\": _15 }], _19 = [0, { \"apps\": _3 }], _20 = [0, { \"paas\": _3 }], _21 = [0, { \"app\": _3 }], _22 = [2, { \"eu\": _3 }], _23 = [0, { \"site\": _3 }], _24 = [0, { \"pages\": _3 }], _25 = [1, { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2 }], _26 = [0, { \"j\": _3 }], _27 = [0, { \"jelastic\": _3 }], _28 = [0, { \"user\": _3 }], _29 = [1, { \"ybo\": _3 }], _30 = [0, { \"cust\": _3, \"reservd\": _3 }], _31 = [0, { \"cust\": _3 }], _32 = [1, { \"gov\": _2, \"edu\": _2, \"mil\": _2, \"com\": _2, \"org\": _2, \"net\": _2 }], _33 = [1, { \"edu\": _2, \"biz\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"info\": _2, \"com\": _2 }], _34 = [1, { \"gov\": _2, \"blogspot\": _3 }], _35 = [1, { \"framer\": _3 }], _36 = [1, { \"barsy\": _3 }], _37 = [0, { \"forgot\": _3 }], _38 = [1, { \"gs\": _2 }], _39 = [0, { \"nes\": _2 }], _40 = [1, { \"k12\": _2, \"cc\": _2, \"lib\": _2 }], _41 = [1, { \"cc\": _2, \"lib\": _2 }];\n const rules = [0, { \"ac\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"mil\": _2, \"org\": _2, \"drr\": _3 }], \"ad\": [1, { \"nom\": _2 }], \"ae\": [1, { \"co\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"ac\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _3 }], \"aero\": [1, { \"accident-investigation\": _2, \"accident-prevention\": _2, \"aerobatic\": _2, \"aeroclub\": _2, \"aerodrome\": _2, \"agents\": _2, \"aircraft\": _2, \"airline\": _2, \"airport\": _2, \"air-surveillance\": _2, \"airtraffic\": _2, \"air-traffic-control\": _2, \"ambulance\": _2, \"amusement\": _2, \"association\": _2, \"author\": _2, \"ballooning\": _2, \"broker\": _2, \"caa\": _2, \"cargo\": _2, \"catering\": _2, \"certification\": _2, \"championship\": _2, \"charter\": _2, \"civilaviation\": _2, \"club\": _2, \"conference\": _2, \"consultant\": _2, \"consulting\": _2, \"control\": _2, \"council\": _2, \"crew\": _2, \"design\": _2, \"dgca\": _2, \"educator\": _2, \"emergency\": _2, \"engine\": _2, \"engineer\": _2, \"entertainment\": _2, \"equipment\": _2, \"exchange\": _2, \"express\": _2, \"federation\": _2, \"flight\": _2, \"fuel\": _2, \"gliding\": _2, \"government\": _2, \"groundhandling\": _2, \"group\": _2, \"hanggliding\": _2, \"homebuilt\": _2, \"insurance\": _2, \"journal\": _2, \"journalist\": _2, \"leasing\": _2, \"logistics\": _2, \"magazine\": _2, \"maintenance\": _2, \"media\": _2, \"microlight\": _2, \"modelling\": _2, \"navigation\": _2, \"parachuting\": _2, \"paragliding\": _2, \"passenger-association\": _2, \"pilot\": _2, \"press\": _2, \"production\": _2, \"recreation\": _2, \"repbody\": _2, \"res\": _2, \"research\": _2, \"rotorcraft\": _2, \"safety\": _2, \"scientist\": _2, \"services\": _2, \"show\": _2, \"skydiving\": _2, \"software\": _2, \"student\": _2, \"trader\": _2, \"trading\": _2, \"trainer\": _2, \"union\": _2, \"workinggroup\": _2, \"works\": _2 }], \"af\": _4, \"ag\": [1, { \"com\": _2, \"org\": _2, \"net\": _2, \"co\": _2, \"nom\": _2 }], \"ai\": [1, { \"off\": _2, \"com\": _2, \"net\": _2, \"org\": _2, \"uwu\": _3 }], \"al\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _3 }], \"am\": [1, { \"co\": _2, \"com\": _2, \"commune\": _2, \"net\": _2, \"org\": _2, \"radio\": _3, \"blogspot\": _3, \"neko\": _3, \"nyaa\": _3 }], \"ao\": [1, { \"ed\": _2, \"gv\": _2, \"og\": _2, \"co\": _2, \"pb\": _2, \"it\": _2 }], \"aq\": _2, \"ar\": [1, { \"bet\": _2, \"com\": _6, \"coop\": _2, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"musica\": _2, \"mutual\": _2, \"net\": _2, \"org\": _2, \"senasa\": _2, \"tur\": _2 }], \"arpa\": [1, { \"e164\": _2, \"in-addr\": _2, \"ip6\": _2, \"iris\": _2, \"uri\": _2, \"urn\": _2 }], \"as\": _7, \"asia\": [1, { \"cloudns\": _3 }], \"at\": [1, { \"ac\": [1, { \"sth\": _2 }], \"co\": _6, \"gv\": _2, \"or\": _2, \"funkfeuer\": [0, { \"wien\": _3 }], \"futurecms\": [0, { \"*\": _3, \"ex\": _5, \"in\": _5 }], \"futurehosting\": _3, \"futuremailing\": _3, \"ortsinfo\": [0, { \"ex\": _5, \"kunden\": _5 }], \"biz\": _3, \"info\": _3, \"123webseite\": _3, \"priv\": _3, \"myspreadshop\": _3, \"12hp\": _3, \"2ix\": _3, \"4lima\": _3, \"lima-city\": _3 }], \"au\": [1, { \"com\": [1, { \"blogspot\": _3, \"cloudlets\": [0, { \"mel\": _3 }], \"myspreadshop\": _3 }], \"net\": _2, \"org\": _2, \"edu\": [1, { \"act\": _2, \"catholic\": _2, \"nsw\": [1, { \"schools\": _2 }], \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 }], \"gov\": [1, { \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 }], \"asn\": _2, \"id\": _2, \"info\": _2, \"conf\": _2, \"oz\": _2, \"act\": _2, \"nsw\": _2, \"nt\": _2, \"qld\": _2, \"sa\": _2, \"tas\": _2, \"vic\": _2, \"wa\": _2 }], \"aw\": [1, { \"com\": _2 }], \"ax\": [1, { \"be\": _3, \"cat\": _3, \"es\": _3, \"eu\": _3, \"gg\": _3, \"mc\": _3, \"us\": _3, \"xy\": _3 }], \"az\": [1, { \"com\": _2, \"net\": _2, \"int\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"info\": _2, \"pp\": _2, \"mil\": _2, \"name\": _2, \"pro\": _2, \"biz\": _2 }], \"ba\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"rs\": _3, \"blogspot\": _3 }], \"bb\": [1, { \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"store\": _2, \"tv\": _2 }], \"bd\": _8, \"be\": [1, { \"ac\": _2, \"webhosting\": _3, \"blogspot\": _3, \"interhostsolutions\": _9, \"kuleuven\": [0, { \"ezproxy\": _3 }], \"123website\": _3, \"myspreadshop\": _3, \"transurl\": _5 }], \"bf\": _7, \"bg\": [1, { \"0\": _2, \"1\": _2, \"2\": _2, \"3\": _2, \"4\": _2, \"5\": _2, \"6\": _2, \"7\": _2, \"8\": _2, \"9\": _2, \"a\": _2, \"b\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"j\": _2, \"k\": _2, \"l\": _2, \"m\": _2, \"n\": _2, \"o\": _2, \"p\": _2, \"q\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"u\": _2, \"v\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"blogspot\": _3, \"barsy\": _3 }], \"bh\": _4, \"bi\": [1, { \"co\": _2, \"com\": _2, \"edu\": _2, \"or\": _2, \"org\": _2 }], \"biz\": [1, { \"activetrail\": _3, \"cloudns\": _3, \"jozi\": _3, \"dyndns\": _3, \"for-better\": _3, \"for-more\": _3, \"for-some\": _3, \"for-the\": _3, \"selfip\": _3, \"webhop\": _3, \"orx\": _3, \"mmafan\": _3, \"myftp\": _3, \"no-ip\": _3, \"dscloud\": _3 }], \"bj\": [1, { \"africa\": _2, \"agro\": _2, \"architectes\": _2, \"assur\": _2, \"avocats\": _2, \"co\": _2, \"com\": _2, \"eco\": _2, \"econo\": _2, \"edu\": _2, \"info\": _2, \"loisirs\": _2, \"money\": _2, \"net\": _2, \"org\": _2, \"ote\": _2, \"resto\": _2, \"restaurant\": _2, \"tourism\": _2, \"univ\": _2, \"blogspot\": _3 }], \"bm\": _4, \"bn\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"co\": _3 }], \"bo\": [1, { \"com\": _2, \"edu\": _2, \"gob\": _2, \"int\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"tv\": _2, \"web\": _2, \"academia\": _2, \"agro\": _2, \"arte\": _2, \"blog\": _2, \"bolivia\": _2, \"ciencia\": _2, \"cooperativa\": _2, \"democracia\": _2, \"deporte\": _2, \"ecologia\": _2, \"economia\": _2, \"empresa\": _2, \"indigena\": _2, \"industria\": _2, \"info\": _2, \"medicina\": _2, \"movimiento\": _2, \"musica\": _2, \"natural\": _2, \"nombre\": _2, \"noticias\": _2, \"patria\": _2, \"politica\": _2, \"profesional\": _2, \"plurinacional\": _2, \"pueblo\": _2, \"revista\": _2, \"salud\": _2, \"tecnologia\": _2, \"tksat\": _2, \"transporte\": _2, \"wiki\": _2 }], \"br\": [1, { \"9guacu\": _2, \"abc\": _2, \"adm\": _2, \"adv\": _2, \"agr\": _2, \"aju\": _2, \"am\": _2, \"anani\": _2, \"aparecida\": _2, \"app\": _2, \"arq\": _2, \"art\": _2, \"ato\": _2, \"b\": _2, \"barueri\": _2, \"belem\": _2, \"bhz\": _2, \"bib\": _2, \"bio\": _2, \"blog\": _2, \"bmd\": _2, \"boavista\": _2, \"bsb\": _2, \"campinagrande\": _2, \"campinas\": _2, \"caxias\": _2, \"cim\": _2, \"cng\": _2, \"cnt\": _2, \"com\": [1, { \"blogspot\": _3, \"virtualcloud\": [0, { \"scale\": [0, { \"users\": _3 }] }], \"simplesite\": _3 }], \"contagem\": _2, \"coop\": _2, \"coz\": _2, \"cri\": _2, \"cuiaba\": _2, \"curitiba\": _2, \"def\": _2, \"des\": _2, \"det\": _2, \"dev\": _2, \"ecn\": _2, \"eco\": _2, \"edu\": _2, \"emp\": _2, \"enf\": _2, \"eng\": _2, \"esp\": _2, \"etc\": _2, \"eti\": _2, \"far\": _2, \"feira\": _2, \"flog\": _2, \"floripa\": _2, \"fm\": _2, \"fnd\": _2, \"fortal\": _2, \"fot\": _2, \"foz\": _2, \"fst\": _2, \"g12\": _2, \"geo\": _2, \"ggf\": _2, \"goiania\": _2, \"gov\": [1, { \"ac\": _2, \"al\": _2, \"am\": _2, \"ap\": _2, \"ba\": _2, \"ce\": _2, \"df\": _2, \"es\": _2, \"go\": _2, \"ma\": _2, \"mg\": _2, \"ms\": _2, \"mt\": _2, \"pa\": _2, \"pb\": _2, \"pe\": _2, \"pi\": _2, \"pr\": _2, \"rj\": _2, \"rn\": _2, \"ro\": _2, \"rr\": _2, \"rs\": _2, \"sc\": _2, \"se\": _2, \"sp\": _2, \"to\": _2 }], \"gru\": _2, \"imb\": _2, \"ind\": _2, \"inf\": _2, \"jab\": _2, \"jampa\": _2, \"jdf\": _2, \"joinville\": _2, \"jor\": _2, \"jus\": _2, \"leg\": [1, { \"ac\": _3, \"al\": _3, \"am\": _3, \"ap\": _3, \"ba\": _3, \"ce\": _3, \"df\": _3, \"es\": _3, \"go\": _3, \"ma\": _3, \"mg\": _3, \"ms\": _3, \"mt\": _3, \"pa\": _3, \"pb\": _3, \"pe\": _3, \"pi\": _3, \"pr\": _3, \"rj\": _3, \"rn\": _3, \"ro\": _3, \"rr\": _3, \"rs\": _3, \"sc\": _3, \"se\": _3, \"sp\": _3, \"to\": _3 }], \"lel\": _2, \"log\": _2, \"londrina\": _2, \"macapa\": _2, \"maceio\": _2, \"manaus\": _2, \"maringa\": _2, \"mat\": _2, \"med\": _2, \"mil\": _2, \"morena\": _2, \"mp\": _2, \"mus\": _2, \"natal\": _2, \"net\": _2, \"niteroi\": _2, \"nom\": _8, \"not\": _2, \"ntr\": _2, \"odo\": _2, \"ong\": _2, \"org\": _2, \"osasco\": _2, \"palmas\": _2, \"poa\": _2, \"ppg\": _2, \"pro\": _2, \"psc\": _2, \"psi\": _2, \"pvh\": _2, \"qsl\": _2, \"radio\": _2, \"rec\": _2, \"recife\": _2, \"rep\": _2, \"ribeirao\": _2, \"rio\": _2, \"riobranco\": _2, \"riopreto\": _2, \"salvador\": _2, \"sampa\": _2, \"santamaria\": _2, \"santoandre\": _2, \"saobernardo\": _2, \"saogonca\": _2, \"seg\": _2, \"sjc\": _2, \"slg\": _2, \"slz\": _2, \"sorocaba\": _2, \"srv\": _2, \"taxi\": _2, \"tc\": _2, \"tec\": _2, \"teo\": _2, \"the\": _2, \"tmp\": _2, \"trd\": _2, \"tur\": _2, \"tv\": _2, \"udi\": _2, \"vet\": _2, \"vix\": _2, \"vlog\": _2, \"wiki\": _2, \"zlg\": _2 }], \"bs\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"we\": _3 }], \"bt\": _4, \"bv\": _2, \"bw\": [1, { \"co\": _2, \"org\": _2 }], \"by\": [1, { \"gov\": _2, \"mil\": _2, \"com\": _6, \"of\": _2, \"mycloud\": _3, \"mediatech\": _3 }], \"bz\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"za\": _3, \"gsj\": _3 }], \"ca\": [1, { \"ab\": _2, \"bc\": _2, \"mb\": _2, \"nb\": _2, \"nf\": _2, \"nl\": _2, \"ns\": _2, \"nt\": _2, \"nu\": _2, \"on\": _2, \"pe\": _2, \"qc\": _2, \"sk\": _2, \"yk\": _2, \"gc\": _2, \"barsy\": _3, \"awdev\": _5, \"co\": _3, \"blogspot\": _3, \"no-ip\": _3, \"myspreadshop\": _3 }], \"cat\": _2, \"cc\": [1, { \"cloudns\": _3, \"ftpaccess\": _3, \"game-server\": _3, \"myphotos\": _3, \"scrapping\": _3, \"twmail\": _3, \"csx\": _3, \"fantasyleague\": _3, \"spawn\": [0, { \"instances\": _3 }] }], \"cd\": _7, \"cf\": _6, \"cg\": _2, \"ch\": [1, { \"square7\": _3, \"blogspot\": _3, \"flow\": [0, { \"ae\": [0, { \"alp1\": _3 }], \"appengine\": _3 }], \"linkyard-cloud\": _3, \"dnsking\": _3, \"gotdns\": _3, \"123website\": _3, \"myspreadshop\": _3, \"firenet\": [0, { \"*\": _3, \"svc\": _5 }], \"12hp\": _3, \"2ix\": _3, \"4lima\": _3, \"lima-city\": _3 }], \"ci\": [1, { \"org\": _2, \"or\": _2, \"com\": _2, \"co\": _2, \"edu\": _2, \"ed\": _2, \"ac\": _2, \"net\": _2, \"go\": _2, \"asso\": _2, \"xn--aroport-bya\": _2, \"aéroport\": _2, \"int\": _2, \"presse\": _2, \"md\": _2, \"gouv\": _2, \"fin\": _3, \"nl\": _3 }], \"ck\": _8, \"cl\": [1, { \"co\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"blogspot\": _3 }], \"cm\": [1, { \"co\": _2, \"com\": _2, \"gov\": _2, \"net\": _2 }], \"cn\": [1, { \"ac\": _2, \"com\": [1, { \"amazonaws\": [0, { \"compute\": _5, \"cn-north-1\": _12, \"eb\": [0, { \"cn-north-1\": _3, \"cn-northwest-1\": _3 }], \"elb\": _5 }] }], \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"mil\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"ah\": _2, \"bj\": _2, \"cq\": _2, \"fj\": _2, \"gd\": _2, \"gs\": _2, \"gz\": _2, \"gx\": _2, \"ha\": _2, \"hb\": _2, \"he\": _2, \"hi\": _2, \"hl\": _2, \"hn\": _2, \"jl\": _2, \"js\": _2, \"jx\": _2, \"ln\": _2, \"nm\": _2, \"nx\": _2, \"qh\": _2, \"sc\": _2, \"sd\": _2, \"sh\": _2, \"sn\": _2, \"sx\": _2, \"tj\": _2, \"xj\": _2, \"xz\": _2, \"yn\": _2, \"zj\": _2, \"hk\": _2, \"mo\": _2, \"tw\": _2, \"canva-apps\": _3, \"instantcloud\": _3, \"quickconnect\": _13 }], \"co\": [1, { \"arts\": _2, \"com\": _6, \"edu\": _2, \"firm\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"rec\": _2, \"web\": _2, \"carrd\": _3, \"crd\": _3, \"otap\": _5, \"leadpages\": _3, \"lpages\": _3, \"mypi\": _3, \"n4t\": _3, \"firewalledreplit\": _14, \"repl\": _14, \"supabase\": _3 }], \"com\": [1, { \"devcdnaccesso\": _5, \"adobeaemcloud\": [2, { \"dev\": _5 }], \"airkitapps\": _3, \"airkitapps-au\": _3, \"aivencloud\": _3, \"kasserver\": _3, \"amazonaws\": [0, { \"compute\": _5, \"compute-1\": _5, \"us-east-1\": [2, { \"dualstack\": _12, \"cloud9\": _15 }], \"ap-northeast-1\": _17, \"ap-northeast-2\": _18, \"ap-south-1\": _18, \"ap-southeast-1\": _17, \"ap-southeast-2\": _17, \"ca-central-1\": _18, \"eu-central-1\": _18, \"eu-west-1\": _17, \"eu-west-2\": _18, \"eu-west-3\": _18, \"s3\": _3, \"s3-ap-northeast-1\": _3, \"s3-ap-northeast-2\": _3, \"s3-ap-south-1\": _3, \"s3-ap-southeast-1\": _3, \"s3-ap-southeast-2\": _3, \"s3-ca-central-1\": _3, \"s3-eu-central-1\": _3, \"s3-eu-west-1\": _3, \"s3-eu-west-2\": _3, \"s3-eu-west-3\": _3, \"s3-external-1\": _3, \"s3-fips-us-gov-west-1\": _3, \"s3-sa-east-1\": _3, \"s3-us-east-2\": _3, \"s3-us-gov-west-1\": _3, \"s3-us-west-1\": _3, \"s3-us-west-2\": _3, \"s3-website-ap-northeast-1\": _3, \"s3-website-ap-southeast-1\": _3, \"s3-website-ap-southeast-2\": _3, \"s3-website-eu-west-1\": _3, \"s3-website-sa-east-1\": _3, \"s3-website-us-east-1\": _3, \"s3-website-us-west-1\": _3, \"s3-website-us-west-2\": _3, \"sa-east-1\": _17, \"us-east-2\": _18, \"af-south-1\": _16, \"ap-east-1\": _16, \"ap-northeast-3\": _16, \"eu-north-1\": _16, \"eu-south-1\": _16, \"me-south-1\": _16, \"us-west-1\": _16, \"us-west-2\": _16, \"elb\": _5 }], \"elasticbeanstalk\": [2, { \"ap-northeast-1\": _3, \"ap-northeast-2\": _3, \"ap-northeast-3\": _3, \"ap-south-1\": _3, \"ap-southeast-1\": _3, \"ap-southeast-2\": _3, \"ca-central-1\": _3, \"eu-central-1\": _3, \"eu-west-1\": _3, \"eu-west-2\": _3, \"eu-west-3\": _3, \"sa-east-1\": _3, \"us-east-1\": _3, \"us-east-2\": _3, \"us-gov-west-1\": _3, \"us-west-1\": _3, \"us-west-2\": _3 }], \"awsglobalaccelerator\": _3, \"siiites\": _3, \"appspacehosted\": _3, \"appspaceusercontent\": _3, \"on-aptible\": _3, \"myasustor\": _3, \"balena-devices\": _3, \"betainabox\": _3, \"boutir\": _3, \"bplaced\": _3, \"cafjs\": _3, \"canva-apps\": _3, \"br\": _3, \"cn\": _3, \"de\": _3, \"eu\": _3, \"jpn\": _3, \"mex\": _3, \"ru\": _3, \"sa\": _3, \"uk\": _3, \"us\": _3, \"za\": _3, \"ar\": _3, \"hu\": _3, \"kr\": _3, \"no\": _3, \"qc\": _3, \"uy\": _3, \"africa\": _3, \"gr\": _3, \"co\": _3, \"jdevcloud\": _3, \"wpdevcloud\": _3, \"cloudcontrolled\": _3, \"cloudcontrolapp\": _3, \"cf-ipfs\": _3, \"cloudflare-ipfs\": _3, \"trycloudflare\": _3, \"customer-oci\": [0, { \"*\": _3, \"oci\": _5, \"ocp\": _5, \"ocs\": _5 }], \"dattolocal\": _3, \"dattorelay\": _3, \"dattoweb\": _3, \"mydatto\": _3, \"builtwithdark\": _3, \"datadetect\": [0, { \"demo\": _3, \"instance\": _3 }], \"ddns5\": _3, \"discordsays\": _3, \"discordsez\": _3, \"drayddns\": _3, \"dreamhosters\": _3, \"mydrobo\": _3, \"dyndns-at-home\": _3, \"dyndns-at-work\": _3, \"dyndns-blog\": _3, \"dyndns-free\": _3, \"dyndns-home\": _3, \"dyndns-ip\": _3, \"dyndns-mail\": _3, \"dyndns-office\": _3, \"dyndns-pics\": _3, \"dyndns-remote\": _3, \"dyndns-server\": _3, \"dyndns-web\": _3, \"dyndns-wiki\": _3, \"dyndns-work\": _3, \"blogdns\": _3, \"cechire\": _3, \"dnsalias\": _3, \"dnsdojo\": _3, \"doesntexist\": _3, \"dontexist\": _3, \"doomdns\": _3, \"dyn-o-saur\": _3, \"dynalias\": _3, \"est-a-la-maison\": _3, \"est-a-la-masion\": _3, \"est-le-patron\": _3, \"est-mon-blogueur\": _3, \"from-ak\": _3, \"from-al\": _3, \"from-ar\": _3, \"from-ca\": _3, \"from-ct\": _3, \"from-dc\": _3, \"from-de\": _3, \"from-fl\": _3, \"from-ga\": _3, \"from-hi\": _3, \"from-ia\": _3, \"from-id\": _3, \"from-il\": _3, \"from-in\": _3, \"from-ks\": _3, \"from-ky\": _3, \"from-ma\": _3, \"from-md\": _3, \"from-mi\": _3, \"from-mn\": _3, \"from-mo\": _3, \"from-ms\": _3, \"from-mt\": _3, \"from-nc\": _3, \"from-nd\": _3, \"from-ne\": _3, \"from-nh\": _3, \"from-nj\": _3, \"from-nm\": _3, \"from-nv\": _3, \"from-oh\": _3, \"from-ok\": _3, \"from-or\": _3, \"from-pa\": _3, \"from-pr\": _3, \"from-ri\": _3, \"from-sc\": _3, \"from-sd\": _3, \"from-tn\": _3, \"from-tx\": _3, \"from-ut\": _3, \"from-va\": _3, \"from-vt\": _3, \"from-wa\": _3, \"from-wi\": _3, \"from-wv\": _3, \"from-wy\": _3, \"getmyip\": _3, \"gotdns\": _3, \"hobby-site\": _3, \"homelinux\": _3, \"homeunix\": _3, \"iamallama\": _3, \"is-a-anarchist\": _3, \"is-a-blogger\": _3, \"is-a-bookkeeper\": _3, \"is-a-bulls-fan\": _3, \"is-a-caterer\": _3, \"is-a-chef\": _3, \"is-a-conservative\": _3, \"is-a-cpa\": _3, \"is-a-cubicle-slave\": _3, \"is-a-democrat\": _3, \"is-a-designer\": _3, \"is-a-doctor\": _3, \"is-a-financialadvisor\": _3, \"is-a-geek\": _3, \"is-a-green\": _3, \"is-a-guru\": _3, \"is-a-hard-worker\": _3, \"is-a-hunter\": _3, \"is-a-landscaper\": _3, \"is-a-lawyer\": _3, \"is-a-liberal\": _3, \"is-a-libertarian\": _3, \"is-a-llama\": _3, \"is-a-musician\": _3, \"is-a-nascarfan\": _3, \"is-a-nurse\": _3, \"is-a-painter\": _3, \"is-a-personaltrainer\": _3, \"is-a-photographer\": _3, \"is-a-player\": _3, \"is-a-republican\": _3, \"is-a-rockstar\": _3, \"is-a-socialist\": _3, \"is-a-student\": _3, \"is-a-teacher\": _3, \"is-a-techie\": _3, \"is-a-therapist\": _3, \"is-an-accountant\": _3, \"is-an-actor\": _3, \"is-an-actress\": _3, \"is-an-anarchist\": _3, \"is-an-artist\": _3, \"is-an-engineer\": _3, \"is-an-entertainer\": _3, \"is-certified\": _3, \"is-gone\": _3, \"is-into-anime\": _3, \"is-into-cars\": _3, \"is-into-cartoons\": _3, \"is-into-games\": _3, \"is-leet\": _3, \"is-not-certified\": _3, \"is-slick\": _3, \"is-uberleet\": _3, \"is-with-theband\": _3, \"isa-geek\": _3, \"isa-hockeynut\": _3, \"issmarterthanyou\": _3, \"likes-pie\": _3, \"likescandy\": _3, \"neat-url\": _3, \"saves-the-whales\": _3, \"selfip\": _3, \"sells-for-less\": _3, \"sells-for-u\": _3, \"servebbs\": _3, \"simple-url\": _3, \"space-to-rent\": _3, \"teaches-yoga\": _3, \"writesthisblog\": _3, \"digitaloceanspaces\": _5, \"ddnsfree\": _3, \"ddnsgeek\": _3, \"giize\": _3, \"gleeze\": _3, \"kozow\": _3, \"loseyourip\": _3, \"ooguy\": _3, \"theworkpc\": _3, \"mytuleap\": _3, \"tuleap-partners\": _3, \"encoreapi\": _3, \"evennode\": [0, { \"eu-1\": _3, \"eu-2\": _3, \"eu-3\": _3, \"eu-4\": _3, \"us-1\": _3, \"us-2\": _3, \"us-3\": _3, \"us-4\": _3 }], \"onfabrica\": _3, \"fbsbx\": _19, \"fastly-edge\": _3, \"fastly-terrarium\": _3, \"fastvps-server\": _3, \"mydobiss\": _3, \"firebaseapp\": _3, \"fldrv\": _3, \"forgeblocks\": _3, \"framercanvas\": _3, \"freebox-os\": _3, \"freeboxos\": _3, \"freemyip\": _3, \"gentapps\": _3, \"gentlentapis\": _3, \"githubusercontent\": _3, \"0emm\": _5, \"appspot\": [2, { \"r\": _5 }], \"codespot\": _3, \"googleapis\": _3, \"googlecode\": _3, \"pagespeedmobilizer\": _3, \"publishproxy\": _3, \"withgoogle\": _3, \"withyoutube\": _3, \"blogspot\": _3, \"awsmppl\": _3, \"herokuapp\": _3, \"herokussl\": _3, \"impertrixcdn\": _3, \"impertrix\": _3, \"smushcdn\": _3, \"wphostedmail\": _3, \"wpmucdn\": _3, \"pixolino\": _3, \"amscompute\": _3, \"clicketcloud\": _3, \"dopaas\": _3, \"hidora\": _3, \"hosted-by-previder\": _20, \"hosteur\": [0, { \"rag-cloud\": _3, \"rag-cloud-ch\": _3 }], \"ik-server\": [0, { \"jcloud\": _3, \"jcloud-ver-jpc\": _3 }], \"jelastic\": [0, { \"demo\": _3 }], \"kilatiron\": _3, \"massivegrid\": _20, \"wafaicloud\": [0, { \"jed\": _3, \"lon\": _3, \"ryd\": _3 }], \"joyent\": [0, { \"cns\": _5 }], \"ktistory\": _3, \"lpusercontent\": _3, \"lmpm\": _21, \"linode\": [0, { \"members\": _3, \"nodebalancer\": _5 }], \"linodeobjects\": _5, \"linodeusercontent\": [0, { \"ip\": _3 }], \"barsycenter\": _3, \"barsyonline\": _3, \"mazeplay\": _3, \"miniserver\": _3, \"meteorapp\": _22, \"hostedpi\": _3, \"mythic-beasts\": [0, { \"customer\": _3, \"caracal\": _3, \"fentiger\": _3, \"lynx\": _3, \"ocelot\": _3, \"oncilla\": _3, \"onza\": _3, \"sphinx\": _3, \"vs\": _3, \"x\": _3, \"yali\": _3 }], \"nospamproxy\": _9, \"4u\": _3, \"nfshost\": _3, \"001www\": _3, \"ddnslive\": _3, \"myiphost\": _3, \"blogsyte\": _3, \"ciscofreak\": _3, \"damnserver\": _3, \"ditchyourip\": _3, \"dnsiskinky\": _3, \"dynns\": _3, \"geekgalaxy\": _3, \"health-carereform\": _3, \"homesecuritymac\": _3, \"homesecuritypc\": _3, \"myactivedirectory\": _3, \"mysecuritycamera\": _3, \"net-freaks\": _3, \"onthewifi\": _3, \"point2this\": _3, \"quicksytes\": _3, \"securitytactics\": _3, \"serveexchange\": _3, \"servehumour\": _3, \"servep2p\": _3, \"servesarcasm\": _3, \"stufftoread\": _3, \"unusualperson\": _3, \"workisboring\": _3, \"3utilities\": _3, \"ddnsking\": _3, \"myvnc\": _3, \"servebeer\": _3, \"servecounterstrike\": _3, \"serveftp\": _3, \"servegame\": _3, \"servehalflife\": _3, \"servehttp\": _3, \"serveirc\": _3, \"servemp3\": _3, \"servepics\": _3, \"servequake\": _3, \"observableusercontent\": [0, { \"static\": _3 }], \"simplesite\": _3, \"orsites\": _3, \"operaunite\": _3, \"authgear-staging\": _3, \"authgearapps\": _3, \"skygearapp\": _3, \"outsystemscloud\": _3, \"ownprovider\": _3, \"pgfog\": _3, \"pagefrontapp\": _3, \"pagexl\": _3, \"paywhirl\": _5, \"gotpantheon\": _3, \"platter-app\": _3, \"pleskns\": _3, \"postman-echo\": _3, \"prgmr\": [0, { \"xen\": _3 }], \"pythonanywhere\": _22, \"qualifioapp\": _3, \"ladesk\": _3, \"qbuser\": _3, \"qa2\": _3, \"dev-myqnapcloud\": _3, \"alpha-myqnapcloud\": _3, \"myqnapcloud\": _3, \"quipelements\": _5, \"rackmaze\": _3, \"rhcloud\": _3, \"render\": _21, \"onrender\": _3, \"180r\": _3, \"dojin\": _3, \"sakuratan\": _3, \"sakuraweb\": _3, \"x0\": _3, \"code\": [0, { \"builder\": _5, \"dev-builder\": _5, \"stg-builder\": _5 }], \"logoip\": _3, \"scrysec\": _3, \"firewall-gateway\": _3, \"myshopblocks\": _3, \"myshopify\": _3, \"shopitsite\": _3, \"1kapp\": _3, \"appchizi\": _3, \"applinzi\": _3, \"sinaapp\": _3, \"vipsinaapp\": _3, \"bounty-full\": [2, { \"alpha\": _3, \"beta\": _3 }], \"streamlitapp\": _3, \"try-snowplow\": _3, \"stackhero-network\": _3, \"playstation-cloud\": _3, \"myspreadshop\": _3, \"stdlib\": [0, { \"api\": _3 }], \"temp-dns\": _3, \"dsmynas\": _3, \"familyds\": _3, \"mytabit\": _3, \"tb-hosting\": _23, \"reservd\": _3, \"thingdustdata\": _3, \"bloxcms\": _3, \"townnews-staging\": _3, \"typeform\": [0, { \"pro\": _3 }], \"hk\": _3, \"it\": _3, \"vultrobjects\": _5, \"wafflecell\": _3, \"reserve-online\": _3, \"hotelwithflight\": _3, \"remotewd\": _3, \"wiardweb\": _24, \"messwithdns\": _3, \"woltlab-demo\": _3, \"wpenginepowered\": [2, { \"js\": _3 }], \"wixsite\": _3, \"xnbay\": [2, { \"u2\": _3, \"u2-local\": _3 }], \"yolasite\": _3 }], \"coop\": _2, \"cr\": [1, { \"ac\": _2, \"co\": _2, \"ed\": _2, \"fi\": _2, \"go\": _2, \"or\": _2, \"sa\": _2 }], \"cu\": [1, { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"gov\": _2, \"inf\": _2 }], \"cv\": [1, { \"com\": _2, \"edu\": _2, \"int\": _2, \"nome\": _2, \"org\": _2, \"blogspot\": _3 }], \"cw\": _25, \"cx\": [1, { \"gov\": _2, \"ath\": _3, \"info\": _3 }], \"cy\": [1, { \"ac\": _2, \"biz\": _2, \"com\": [1, { \"blogspot\": _3, \"scaleforce\": _26 }], \"ekloges\": _2, \"gov\": _2, \"ltd\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"press\": _2, \"pro\": _2, \"tm\": _2 }], \"cz\": [1, { \"co\": _3, \"realm\": _3, \"e4\": _3, \"blogspot\": _3, \"metacentrum\": [0, { \"cloud\": _5, \"custom\": _3 }], \"muni\": [0, { \"cloud\": [0, { \"flt\": _3, \"usr\": _3 }] }] }], \"de\": [1, { \"bplaced\": _3, \"square7\": _3, \"com\": _3, \"cosidns\": [0, { \"dyn\": _3 }], \"dynamisches-dns\": _3, \"dnsupdater\": _3, \"internet-dns\": _3, \"l-o-g-i-n\": _3, \"dnshome\": _3, \"fuettertdasnetz\": _3, \"isteingeek\": _3, \"istmein\": _3, \"lebtimnetz\": _3, \"leitungsen\": _3, \"traeumtgerade\": _3, \"ddnss\": [2, { \"dyn\": _3, \"dyndns\": _3 }], \"dyndns1\": _3, \"dyn-ip24\": _3, \"home-webserver\": [2, { \"dyn\": _3 }], \"myhome-server\": _3, \"frusky\": _5, \"goip\": _3, \"blogspot\": _3, \"xn--gnstigbestellen-zvb\": _3, \"günstigbestellen\": _3, \"xn--gnstigliefern-wob\": _3, \"günstigliefern\": _3, \"hs-heilbronn\": [0, { \"it\": _24 }], \"dyn-berlin\": _3, \"in-berlin\": _3, \"in-brb\": _3, \"in-butter\": _3, \"in-dsl\": _3, \"in-vpn\": _3, \"iservschule\": _3, \"mein-iserv\": _3, \"schulplattform\": _3, \"schulserver\": _3, \"test-iserv\": _3, \"keymachine\": _3, \"git-repos\": _3, \"lcube-server\": _3, \"svn-repos\": _3, \"barsy\": _3, \"123webseite\": _3, \"logoip\": _3, \"firewall-gateway\": _3, \"my-gateway\": _3, \"my-router\": _3, \"spdns\": _3, \"speedpartner\": [0, { \"customer\": _3 }], \"myspreadshop\": _3, \"taifun-dns\": _3, \"12hp\": _3, \"2ix\": _3, \"4lima\": _3, \"lima-city\": _3, \"dd-dns\": _3, \"dray-dns\": _3, \"draydns\": _3, \"dyn-vpn\": _3, \"dynvpn\": _3, \"mein-vigor\": _3, \"my-vigor\": _3, \"my-wan\": _3, \"syno-ds\": _3, \"synology-diskstation\": _3, \"synology-ds\": _3, \"uberspace\": _5, \"virtualuser\": _3, \"virtual-user\": _3, \"community-pro\": _3, \"diskussionsbereich\": _3 }], \"dj\": _2, \"dk\": [1, { \"biz\": _3, \"co\": _3, \"firm\": _3, \"reg\": _3, \"store\": _3, \"blogspot\": _3, \"123hjemmeside\": _3, \"myspreadshop\": _3 }], \"dm\": _4, \"do\": [1, { \"art\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sld\": _2, \"web\": _2 }], \"dz\": [1, { \"art\": _2, \"asso\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"net\": _2, \"pol\": _2, \"soc\": _2, \"tm\": _2 }], \"ec\": [1, { \"com\": _2, \"info\": _2, \"net\": _2, \"fin\": _2, \"k12\": _2, \"med\": _2, \"pro\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"gob\": _2, \"mil\": _2, \"base\": _3, \"official\": _3 }], \"edu\": [1, { \"rit\": [0, { \"git-pages\": _3 }] }], \"ee\": [1, { \"edu\": _2, \"gov\": _2, \"riik\": _2, \"lib\": _2, \"med\": _2, \"com\": _6, \"pri\": _2, \"aip\": _2, \"org\": _2, \"fie\": _2 }], \"eg\": [1, { \"com\": _6, \"edu\": _2, \"eun\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sci\": _2 }], \"er\": _8, \"es\": [1, { \"com\": _6, \"nom\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2, \"123miweb\": _3, \"myspreadshop\": _3 }], \"et\": [1, { \"com\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"biz\": _2, \"name\": _2, \"info\": _2, \"net\": _2 }], \"eu\": [1, { \"airkitapps\": _3, \"mycd\": _3, \"cloudns\": _3, \"dogado\": _27, \"barsy\": _3, \"wellbeingzone\": _3, \"spdns\": _3, \"transurl\": _5, \"diskstation\": _3 }], \"fi\": [1, { \"aland\": _2, \"dy\": _3, \"blogspot\": _3, \"xn--hkkinen-5wa\": _3, \"häkkinen\": _3, \"iki\": _3, \"cloudplatform\": [0, { \"fi\": _3 }], \"datacenter\": [0, { \"demo\": _3, \"paas\": _3 }], \"kapsi\": _3, \"123kotisivu\": _3, \"myspreadshop\": _3 }], \"fj\": [1, { \"ac\": _2, \"biz\": _2, \"com\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 }], \"fk\": _8, \"fm\": [1, { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"radio\": _3, \"user\": _5 }], \"fo\": _2, \"fr\": [1, { \"asso\": _2, \"com\": _2, \"gouv\": _2, \"nom\": _2, \"prd\": _2, \"tm\": _2, \"aeroport\": _2, \"avocat\": _2, \"avoues\": _2, \"cci\": _2, \"chambagri\": _2, \"chirurgiens-dentistes\": _2, \"experts-comptables\": _2, \"geometre-expert\": _2, \"greta\": _2, \"huissier-justice\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmacien\": _2, \"port\": _2, \"veterinaire\": _2, \"en-root\": _3, \"fbx-os\": _3, \"fbxos\": _3, \"freebox-os\": _3, \"freeboxos\": _3, \"blogspot\": _3, \"goupile\": _3, \"123siteweb\": _3, \"on-web\": _3, \"chirurgiens-dentistes-en-france\": _3, \"dedibox\": _3, \"myspreadshop\": _3, \"ynh\": _3 }], \"ga\": _2, \"gb\": _2, \"gd\": [1, { \"edu\": _2, \"gov\": _2 }], \"ge\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"net\": _2, \"pvt\": _2 }], \"gf\": _2, \"gg\": [1, { \"co\": _2, \"net\": _2, \"org\": _2, \"kaas\": _3, \"cya\": _3, \"panel\": [2, { \"daemon\": _3 }] }], \"gh\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2 }], \"gi\": [1, { \"com\": _2, \"ltd\": _2, \"gov\": _2, \"mod\": _2, \"edu\": _2, \"org\": _2 }], \"gl\": [1, { \"co\": _2, \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"biz\": _3, \"xx\": _3 }], \"gm\": _2, \"gn\": [1, { \"ac\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"net\": _2 }], \"gov\": _2, \"gp\": [1, { \"com\": _2, \"net\": _2, \"mobi\": _2, \"edu\": _2, \"org\": _2, \"asso\": _2, \"app\": _3 }], \"gq\": _2, \"gr\": [1, { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"blogspot\": _3, \"simplesite\": _3 }], \"gs\": _2, \"gt\": [1, { \"com\": _2, \"edu\": _2, \"gob\": _2, \"ind\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"blog\": _3, \"de\": _3, \"to\": _3 }], \"gu\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"guam\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"web\": _2 }], \"gw\": _2, \"gy\": [1, { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"be\": _3 }], \"hk\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"idv\": _2, \"net\": _2, \"org\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--wcvs22d\": _2, \"教育\": _2, \"xn--lcvr32d\": _2, \"敎育\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--gmqw5a\": _2, \"個人\": _2, \"xn--ciqpn\": _2, \"个人\": _2, \"xn--gmq050i\": _2, \"箇人\": _2, \"xn--zf0avx\": _2, \"網络\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--mk0axi\": _2, \"组織\": _2, \"xn--od0alg\": _2, \"網絡\": _2, \"xn--od0aq3b\": _2, \"网絡\": _2, \"xn--tn0ag\": _2, \"组织\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--uc0ay4a\": _2, \"組织\": _2, \"blogspot\": _3, \"secaas\": _3, \"ltd\": _3, \"inc\": _3 }], \"hm\": _2, \"hn\": [1, { \"com\": _2, \"edu\": _2, \"org\": _2, \"net\": _2, \"mil\": _2, \"gob\": _2, \"cc\": _3 }], \"hr\": [1, { \"iz\": _2, \"from\": _2, \"name\": _2, \"com\": _2, \"blogspot\": _3, \"free\": _3 }], \"ht\": [1, { \"com\": _2, \"shop\": _2, \"firm\": _2, \"info\": _2, \"adult\": _2, \"net\": _2, \"pro\": _2, \"org\": _2, \"med\": _2, \"art\": _2, \"coop\": _2, \"pol\": _2, \"asso\": _2, \"edu\": _2, \"rel\": _2, \"gouv\": _2, \"perso\": _2 }], \"hu\": [1, { \"2000\": _2, \"co\": _2, \"info\": _2, \"org\": _2, \"priv\": _2, \"sport\": _2, \"tm\": _2, \"agrar\": _2, \"bolt\": _2, \"casino\": _2, \"city\": _2, \"erotica\": _2, \"erotika\": _2, \"film\": _2, \"forum\": _2, \"games\": _2, \"hotel\": _2, \"ingatlan\": _2, \"jogasz\": _2, \"konyvelo\": _2, \"lakas\": _2, \"media\": _2, \"news\": _2, \"reklam\": _2, \"sex\": _2, \"shop\": _2, \"suli\": _2, \"szex\": _2, \"tozsde\": _2, \"utazas\": _2, \"video\": _2, \"blogspot\": _3 }], \"id\": [1, { \"ac\": _2, \"biz\": _2, \"co\": _6, \"desa\": _2, \"go\": _2, \"mil\": _2, \"my\": [1, { \"rss\": _5 }], \"net\": _2, \"or\": _2, \"ponpes\": _2, \"sch\": _2, \"web\": _2, \"flap\": _3, \"forte\": _3 }], \"ie\": [1, { \"gov\": _2, \"blogspot\": _3, \"myspreadshop\": _3 }], \"il\": [1, { \"ac\": _2, \"co\": [1, { \"ravpage\": _3, \"blogspot\": _3, \"tabitorder\": _3, \"mytabit\": _3 }], \"gov\": _2, \"idf\": _2, \"k12\": _2, \"muni\": _2, \"net\": _2, \"org\": _2 }], \"xn--4dbrk0ce\": [1, { \"xn--4dbgdty6c\": _2, \"xn--5dbhl8d\": _2, \"xn--8dbq2a\": _2, \"xn--hebda8b\": _2 }], \"ישראל\": [1, { \"אקדמיה\": _2, \"ישוב\": _2, \"צהל\": _2, \"ממשל\": _2 }], \"im\": [1, { \"ac\": _2, \"co\": [1, { \"ltd\": _2, \"plc\": _2 }], \"com\": _2, \"net\": _2, \"org\": _2, \"tt\": _2, \"tv\": _2, \"ro\": _3 }], \"in\": [1, { \"5g\": _2, \"6g\": _2, \"ac\": _2, \"ai\": _2, \"am\": _2, \"bihar\": _2, \"biz\": _2, \"business\": _2, \"ca\": _2, \"cn\": _2, \"co\": _2, \"com\": _2, \"coop\": _2, \"cs\": _2, \"delhi\": _2, \"dr\": _2, \"edu\": _2, \"er\": _2, \"firm\": _2, \"gen\": _2, \"gov\": _2, \"gujarat\": _2, \"ind\": _2, \"info\": _2, \"int\": _2, \"internet\": _2, \"io\": _2, \"me\": _2, \"mil\": _2, \"net\": _2, \"nic\": _2, \"org\": _2, \"pg\": _2, \"post\": _2, \"pro\": _2, \"res\": _2, \"travel\": _2, \"tv\": _2, \"uk\": _2, \"up\": _2, \"us\": _2, \"web\": _3, \"cloudns\": _3, \"blogspot\": _3, \"barsy\": _3, \"supabase\": _3 }], \"info\": [1, { \"cloudns\": _3, \"dynamic-dns\": _3, \"dyndns\": _3, \"barrel-of-knowledge\": _3, \"barrell-of-knowledge\": _3, \"for-our\": _3, \"groks-the\": _3, \"groks-this\": _3, \"here-for-more\": _3, \"knowsitall\": _3, \"selfip\": _3, \"webhop\": _3, \"barsy\": _3, \"mayfirst\": _3, \"forumz\": _3, \"nsupdate\": _3, \"dvrcam\": _3, \"ilovecollege\": _3, \"no-ip\": _3, \"dnsupdate\": _3, \"v-info\": _3 }], \"int\": [1, { \"eu\": _2 }], \"io\": [1, { \"2038\": _3, \"com\": _2, \"on-acorn\": _5, \"apigee\": _3, \"b-data\": _3, \"backplaneapp\": _3, \"banzaicloud\": [0, { \"app\": _3, \"backyards\": _5 }], \"beagleboard\": _3, \"bitbucket\": _3, \"bluebite\": _3, \"boxfuse\": _3, \"browsersafetymark\": _3, \"bigv\": [0, { \"uk0\": _3 }], \"cleverapps\": _3, \"dappnode\": [0, { \"dyndns\": _3 }], \"dedyn\": _3, \"drud\": _3, \"definima\": _3, \"fh-muenster\": _3, \"shw\": _3, \"forgerock\": [0, { \"id\": _3 }], \"ghost\": _3, \"github\": _3, \"gitlab\": _3, \"lolipop\": _3, \"hasura-app\": _3, \"hostyhosting\": _3, \"moonscale\": _5, \"beebyte\": _20, \"beebyteapp\": [0, { \"sekd1\": _3 }], \"jele\": _3, \"unispace\": [0, { \"cloud-fr1\": _3 }], \"webthings\": _3, \"loginline\": _3, \"barsy\": _3, \"azurecontainer\": _5, \"ngrok\": [2, { \"ap\": _3, \"au\": _3, \"eu\": _3, \"in\": _3, \"jp\": _3, \"sa\": _3, \"us\": _3 }], \"nodeart\": [0, { \"stage\": _3 }], \"nid\": _3, \"pantheonsite\": _3, \"dyn53\": _3, \"pstmn\": [2, { \"mock\": _3 }], \"protonet\": _3, \"qoto\": _3, \"qcx\": [2, { \"sys\": _5 }], \"vaporcloud\": _3, \"vbrplsbx\": [0, { \"g\": _3 }], \"on-k3s\": _5, \"on-rio\": _5, \"readthedocs\": _3, \"resindevice\": _3, \"resinstaging\": [0, { \"devices\": _3 }], \"hzc\": _3, \"sandcats\": _3, \"shiftcrypto\": _3, \"shiftedit\": _3, \"mo-siemens\": _3, \"musician\": _3, \"lair\": _19, \"stolos\": _5, \"spacekit\": _3, \"utwente\": _3, \"s5y\": _5, \"edugit\": _3, \"telebit\": _3, \"thingdust\": [0, { \"dev\": _30, \"disrec\": _30, \"prod\": _31, \"testing\": _30 }], \"tickets\": _3, \"upli\": _3, \"wedeploy\": _3, \"editorx\": _3, \"basicserver\": _3, \"virtualserver\": _3 }], \"iq\": _32, \"ir\": [1, { \"ac\": _2, \"co\": _2, \"gov\": _2, \"id\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2 }], \"is\": [1, { \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"int\": _2, \"cupcake\": _3, \"blogspot\": _3 }], \"it\": [1, { \"gov\": _2, \"edu\": _2, \"abr\": _2, \"abruzzo\": _2, \"aosta-valley\": _2, \"aostavalley\": _2, \"bas\": _2, \"basilicata\": _2, \"cal\": _2, \"calabria\": _2, \"cam\": _2, \"campania\": _2, \"emilia-romagna\": _2, \"emiliaromagna\": _2, \"emr\": _2, \"friuli-v-giulia\": _2, \"friuli-ve-giulia\": _2, \"friuli-vegiulia\": _2, \"friuli-venezia-giulia\": _2, \"friuli-veneziagiulia\": _2, \"friuli-vgiulia\": _2, \"friuliv-giulia\": _2, \"friulive-giulia\": _2, \"friulivegiulia\": _2, \"friulivenezia-giulia\": _2, \"friuliveneziagiulia\": _2, \"friulivgiulia\": _2, \"fvg\": _2, \"laz\": _2, \"lazio\": _2, \"lig\": _2, \"liguria\": _2, \"lom\": _2, \"lombardia\": _2, \"lombardy\": _2, \"lucania\": _2, \"mar\": _2, \"marche\": _2, \"mol\": _2, \"molise\": _2, \"piedmont\": _2, \"piemonte\": _2, \"pmn\": _2, \"pug\": _2, \"puglia\": _2, \"sar\": _2, \"sardegna\": _2, \"sardinia\": _2, \"sic\": _2, \"sicilia\": _2, \"sicily\": _2, \"taa\": _2, \"tos\": _2, \"toscana\": _2, \"trentin-sud-tirol\": _2, \"xn--trentin-sd-tirol-rzb\": _2, \"trentin-süd-tirol\": _2, \"trentin-sudtirol\": _2, \"xn--trentin-sdtirol-7vb\": _2, \"trentin-südtirol\": _2, \"trentin-sued-tirol\": _2, \"trentin-suedtirol\": _2, \"trentino-a-adige\": _2, \"trentino-aadige\": _2, \"trentino-alto-adige\": _2, \"trentino-altoadige\": _2, \"trentino-s-tirol\": _2, \"trentino-stirol\": _2, \"trentino-sud-tirol\": _2, \"xn--trentino-sd-tirol-c3b\": _2, \"trentino-süd-tirol\": _2, \"trentino-sudtirol\": _2, \"xn--trentino-sdtirol-szb\": _2, \"trentino-südtirol\": _2, \"trentino-sued-tirol\": _2, \"trentino-suedtirol\": _2, \"trentino\": _2, \"trentinoa-adige\": _2, \"trentinoaadige\": _2, \"trentinoalto-adige\": _2, \"trentinoaltoadige\": _2, \"trentinos-tirol\": _2, \"trentinostirol\": _2, \"trentinosud-tirol\": _2, \"xn--trentinosd-tirol-rzb\": _2, \"trentinosüd-tirol\": _2, \"trentinosudtirol\": _2, \"xn--trentinosdtirol-7vb\": _2, \"trentinosüdtirol\": _2, \"trentinosued-tirol\": _2, \"trentinosuedtirol\": _2, \"trentinsud-tirol\": _2, \"xn--trentinsd-tirol-6vb\": _2, \"trentinsüd-tirol\": _2, \"trentinsudtirol\": _2, \"xn--trentinsdtirol-nsb\": _2, \"trentinsüdtirol\": _2, \"trentinsued-tirol\": _2, \"trentinsuedtirol\": _2, \"tuscany\": _2, \"umb\": _2, \"umbria\": _2, \"val-d-aosta\": _2, \"val-daosta\": _2, \"vald-aosta\": _2, \"valdaosta\": _2, \"valle-aosta\": _2, \"valle-d-aosta\": _2, \"valle-daosta\": _2, \"valleaosta\": _2, \"valled-aosta\": _2, \"valledaosta\": _2, \"vallee-aoste\": _2, \"xn--valle-aoste-ebb\": _2, \"vallée-aoste\": _2, \"vallee-d-aoste\": _2, \"xn--valle-d-aoste-ehb\": _2, \"vallée-d-aoste\": _2, \"valleeaoste\": _2, \"xn--valleaoste-e7a\": _2, \"valléeaoste\": _2, \"valleedaoste\": _2, \"xn--valledaoste-ebb\": _2, \"valléedaoste\": _2, \"vao\": _2, \"vda\": _2, \"ven\": _2, \"veneto\": _2, \"ag\": _2, \"agrigento\": _2, \"al\": _2, \"alessandria\": _2, \"alto-adige\": _2, \"altoadige\": _2, \"an\": _2, \"ancona\": _2, \"andria-barletta-trani\": _2, \"andria-trani-barletta\": _2, \"andriabarlettatrani\": _2, \"andriatranibarletta\": _2, \"ao\": _2, \"aosta\": _2, \"aoste\": _2, \"ap\": _2, \"aq\": _2, \"aquila\": _2, \"ar\": _2, \"arezzo\": _2, \"ascoli-piceno\": _2, \"ascolipiceno\": _2, \"asti\": _2, \"at\": _2, \"av\": _2, \"avellino\": _2, \"ba\": _2, \"balsan-sudtirol\": _2, \"xn--balsan-sdtirol-nsb\": _2, \"balsan-südtirol\": _2, \"balsan-suedtirol\": _2, \"balsan\": _2, \"bari\": _2, \"barletta-trani-andria\": _2, \"barlettatraniandria\": _2, \"belluno\": _2, \"benevento\": _2, \"bergamo\": _2, \"bg\": _2, \"bi\": _2, \"biella\": _2, \"bl\": _2, \"bn\": _2, \"bo\": _2, \"bologna\": _2, \"bolzano-altoadige\": _2, \"bolzano\": _2, \"bozen-sudtirol\": _2, \"xn--bozen-sdtirol-2ob\": _2, \"bozen-südtirol\": _2, \"bozen-suedtirol\": _2, \"bozen\": _2, \"br\": _2, \"brescia\": _2, \"brindisi\": _2, \"bs\": _2, \"bt\": _2, \"bulsan-sudtirol\": _2, \"xn--bulsan-sdtirol-nsb\": _2, \"bulsan-südtirol\": _2, \"bulsan-suedtirol\": _2, \"bulsan\": _2, \"bz\": _2, \"ca\": _2, \"cagliari\": _2, \"caltanissetta\": _2, \"campidano-medio\": _2, \"campidanomedio\": _2, \"campobasso\": _2, \"carbonia-iglesias\": _2, \"carboniaiglesias\": _2, \"carrara-massa\": _2, \"carraramassa\": _2, \"caserta\": _2, \"catania\": _2, \"catanzaro\": _2, \"cb\": _2, \"ce\": _2, \"cesena-forli\": _2, \"xn--cesena-forl-mcb\": _2, \"cesena-forlì\": _2, \"cesenaforli\": _2, \"xn--cesenaforl-i8a\": _2, \"cesenaforlì\": _2, \"ch\": _2, \"chieti\": _2, \"ci\": _2, \"cl\": _2, \"cn\": _2, \"co\": _2, \"como\": _2, \"cosenza\": _2, \"cr\": _2, \"cremona\": _2, \"crotone\": _2, \"cs\": _2, \"ct\": _2, \"cuneo\": _2, \"cz\": _2, \"dell-ogliastra\": _2, \"dellogliastra\": _2, \"en\": _2, \"enna\": _2, \"fc\": _2, \"fe\": _2, \"fermo\": _2, \"ferrara\": _2, \"fg\": _2, \"fi\": _2, \"firenze\": _2, \"florence\": _2, \"fm\": _2, \"foggia\": _2, \"forli-cesena\": _2, \"xn--forl-cesena-fcb\": _2, \"forlì-cesena\": _2, \"forlicesena\": _2, \"xn--forlcesena-c8a\": _2, \"forlìcesena\": _2, \"fr\": _2, \"frosinone\": _2, \"ge\": _2, \"genoa\": _2, \"genova\": _2, \"go\": _2, \"gorizia\": _2, \"gr\": _2, \"grosseto\": _2, \"iglesias-carbonia\": _2, \"iglesiascarbonia\": _2, \"im\": _2, \"imperia\": _2, \"is\": _2, \"isernia\": _2, \"kr\": _2, \"la-spezia\": _2, \"laquila\": _2, \"laspezia\": _2, \"latina\": _2, \"lc\": _2, \"le\": _2, \"lecce\": _2, \"lecco\": _2, \"li\": _2, \"livorno\": _2, \"lo\": _2, \"lodi\": _2, \"lt\": _2, \"lu\": _2, \"lucca\": _2, \"macerata\": _2, \"mantova\": _2, \"massa-carrara\": _2, \"massacarrara\": _2, \"matera\": _2, \"mb\": _2, \"mc\": _2, \"me\": _2, \"medio-campidano\": _2, \"mediocampidano\": _2, \"messina\": _2, \"mi\": _2, \"milan\": _2, \"milano\": _2, \"mn\": _2, \"mo\": _2, \"modena\": _2, \"monza-brianza\": _2, \"monza-e-della-brianza\": _2, \"monza\": _2, \"monzabrianza\": _2, \"monzaebrianza\": _2, \"monzaedellabrianza\": _2, \"ms\": _2, \"mt\": _2, \"na\": _2, \"naples\": _2, \"napoli\": _2, \"no\": _2, \"novara\": _2, \"nu\": _2, \"nuoro\": _2, \"og\": _2, \"ogliastra\": _2, \"olbia-tempio\": _2, \"olbiatempio\": _2, \"or\": _2, \"oristano\": _2, \"ot\": _2, \"pa\": _2, \"padova\": _2, \"padua\": _2, \"palermo\": _2, \"parma\": _2, \"pavia\": _2, \"pc\": _2, \"pd\": _2, \"pe\": _2, \"perugia\": _2, \"pesaro-urbino\": _2, \"pesarourbino\": _2, \"pescara\": _2, \"pg\": _2, \"pi\": _2, \"piacenza\": _2, \"pisa\": _2, \"pistoia\": _2, \"pn\": _2, \"po\": _2, \"pordenone\": _2, \"potenza\": _2, \"pr\": _2, \"prato\": _2, \"pt\": _2, \"pu\": _2, \"pv\": _2, \"pz\": _2, \"ra\": _2, \"ragusa\": _2, \"ravenna\": _2, \"rc\": _2, \"re\": _2, \"reggio-calabria\": _2, \"reggio-emilia\": _2, \"reggiocalabria\": _2, \"reggioemilia\": _2, \"rg\": _2, \"ri\": _2, \"rieti\": _2, \"rimini\": _2, \"rm\": _2, \"rn\": _2, \"ro\": _2, \"roma\": _2, \"rome\": _2, \"rovigo\": _2, \"sa\": _2, \"salerno\": _2, \"sassari\": _2, \"savona\": _2, \"si\": _2, \"siena\": _2, \"siracusa\": _2, \"so\": _2, \"sondrio\": _2, \"sp\": _2, \"sr\": _2, \"ss\": _2, \"suedtirol\": _2, \"xn--sdtirol-n2a\": _2, \"südtirol\": _2, \"sv\": _2, \"ta\": _2, \"taranto\": _2, \"te\": _2, \"tempio-olbia\": _2, \"tempioolbia\": _2, \"teramo\": _2, \"terni\": _2, \"tn\": _2, \"to\": _2, \"torino\": _2, \"tp\": _2, \"tr\": _2, \"trani-andria-barletta\": _2, \"trani-barletta-andria\": _2, \"traniandriabarletta\": _2, \"tranibarlettaandria\": _2, \"trapani\": _2, \"trento\": _2, \"treviso\": _2, \"trieste\": _2, \"ts\": _2, \"turin\": _2, \"tv\": _2, \"ud\": _2, \"udine\": _2, \"urbino-pesaro\": _2, \"urbinopesaro\": _2, \"va\": _2, \"varese\": _2, \"vb\": _2, \"vc\": _2, \"ve\": _2, \"venezia\": _2, \"venice\": _2, \"verbania\": _2, \"vercelli\": _2, \"verona\": _2, \"vi\": _2, \"vibo-valentia\": _2, \"vibovalentia\": _2, \"vicenza\": _2, \"viterbo\": _2, \"vr\": _2, \"vs\": _2, \"vt\": _2, \"vv\": _2, \"blogspot\": _3, \"ibxos\": _3, \"iliadboxos\": _3, \"neen\": [0, { \"jc\": _3 }], \"tim\": [0, { \"open\": [0, { \"jelastic\": _9 }] }], \"16-b\": _3, \"32-b\": _3, \"64-b\": _3, \"123homepage\": _3, \"myspreadshop\": _3, \"syncloud\": _3 }], \"je\": [1, { \"co\": _2, \"net\": _2, \"org\": _2, \"of\": _3 }], \"jm\": _8, \"jo\": [1, { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"sch\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2 }], \"jobs\": _2, \"jp\": [1, { \"ac\": _2, \"ad\": _2, \"co\": _2, \"ed\": _2, \"go\": _2, \"gr\": _2, \"lg\": _2, \"ne\": [1, { \"aseinet\": _28, \"gehirn\": _3, \"ivory\": _3, \"mail-box\": _3, \"mints\": _3, \"mokuren\": _3, \"opal\": _3, \"sakura\": _3, \"sumomo\": _3, \"topaz\": _3 }], \"or\": _2, \"aichi\": [1, { \"aisai\": _2, \"ama\": _2, \"anjo\": _2, \"asuke\": _2, \"chiryu\": _2, \"chita\": _2, \"fuso\": _2, \"gamagori\": _2, \"handa\": _2, \"hazu\": _2, \"hekinan\": _2, \"higashiura\": _2, \"ichinomiya\": _2, \"inazawa\": _2, \"inuyama\": _2, \"isshiki\": _2, \"iwakura\": _2, \"kanie\": _2, \"kariya\": _2, \"kasugai\": _2, \"kira\": _2, \"kiyosu\": _2, \"komaki\": _2, \"konan\": _2, \"kota\": _2, \"mihama\": _2, \"miyoshi\": _2, \"nishio\": _2, \"nisshin\": _2, \"obu\": _2, \"oguchi\": _2, \"oharu\": _2, \"okazaki\": _2, \"owariasahi\": _2, \"seto\": _2, \"shikatsu\": _2, \"shinshiro\": _2, \"shitara\": _2, \"tahara\": _2, \"takahama\": _2, \"tobishima\": _2, \"toei\": _2, \"togo\": _2, \"tokai\": _2, \"tokoname\": _2, \"toyoake\": _2, \"toyohashi\": _2, \"toyokawa\": _2, \"toyone\": _2, \"toyota\": _2, \"tsushima\": _2, \"yatomi\": _2 }], \"akita\": [1, { \"akita\": _2, \"daisen\": _2, \"fujisato\": _2, \"gojome\": _2, \"hachirogata\": _2, \"happou\": _2, \"higashinaruse\": _2, \"honjo\": _2, \"honjyo\": _2, \"ikawa\": _2, \"kamikoani\": _2, \"kamioka\": _2, \"katagami\": _2, \"kazuno\": _2, \"kitaakita\": _2, \"kosaka\": _2, \"kyowa\": _2, \"misato\": _2, \"mitane\": _2, \"moriyoshi\": _2, \"nikaho\": _2, \"noshiro\": _2, \"odate\": _2, \"oga\": _2, \"ogata\": _2, \"semboku\": _2, \"yokote\": _2, \"yurihonjo\": _2 }], \"aomori\": [1, { \"aomori\": _2, \"gonohe\": _2, \"hachinohe\": _2, \"hashikami\": _2, \"hiranai\": _2, \"hirosaki\": _2, \"itayanagi\": _2, \"kuroishi\": _2, \"misawa\": _2, \"mutsu\": _2, \"nakadomari\": _2, \"noheji\": _2, \"oirase\": _2, \"owani\": _2, \"rokunohe\": _2, \"sannohe\": _2, \"shichinohe\": _2, \"shingo\": _2, \"takko\": _2, \"towada\": _2, \"tsugaru\": _2, \"tsuruta\": _2 }], \"chiba\": [1, { \"abiko\": _2, \"asahi\": _2, \"chonan\": _2, \"chosei\": _2, \"choshi\": _2, \"chuo\": _2, \"funabashi\": _2, \"futtsu\": _2, \"hanamigawa\": _2, \"ichihara\": _2, \"ichikawa\": _2, \"ichinomiya\": _2, \"inzai\": _2, \"isumi\": _2, \"kamagaya\": _2, \"kamogawa\": _2, \"kashiwa\": _2, \"katori\": _2, \"katsuura\": _2, \"kimitsu\": _2, \"kisarazu\": _2, \"kozaki\": _2, \"kujukuri\": _2, \"kyonan\": _2, \"matsudo\": _2, \"midori\": _2, \"mihama\": _2, \"minamiboso\": _2, \"mobara\": _2, \"mutsuzawa\": _2, \"nagara\": _2, \"nagareyama\": _2, \"narashino\": _2, \"narita\": _2, \"noda\": _2, \"oamishirasato\": _2, \"omigawa\": _2, \"onjuku\": _2, \"otaki\": _2, \"sakae\": _2, \"sakura\": _2, \"shimofusa\": _2, \"shirako\": _2, \"shiroi\": _2, \"shisui\": _2, \"sodegaura\": _2, \"sosa\": _2, \"tako\": _2, \"tateyama\": _2, \"togane\": _2, \"tohnosho\": _2, \"tomisato\": _2, \"urayasu\": _2, \"yachimata\": _2, \"yachiyo\": _2, \"yokaichiba\": _2, \"yokoshibahikari\": _2, \"yotsukaido\": _2 }], \"ehime\": [1, { \"ainan\": _2, \"honai\": _2, \"ikata\": _2, \"imabari\": _2, \"iyo\": _2, \"kamijima\": _2, \"kihoku\": _2, \"kumakogen\": _2, \"masaki\": _2, \"matsuno\": _2, \"matsuyama\": _2, \"namikata\": _2, \"niihama\": _2, \"ozu\": _2, \"saijo\": _2, \"seiyo\": _2, \"shikokuchuo\": _2, \"tobe\": _2, \"toon\": _2, \"uchiko\": _2, \"uwajima\": _2, \"yawatahama\": _2 }], \"fukui\": [1, { \"echizen\": _2, \"eiheiji\": _2, \"fukui\": _2, \"ikeda\": _2, \"katsuyama\": _2, \"mihama\": _2, \"minamiechizen\": _2, \"obama\": _2, \"ohi\": _2, \"ono\": _2, \"sabae\": _2, \"sakai\": _2, \"takahama\": _2, \"tsuruga\": _2, \"wakasa\": _2 }], \"fukuoka\": [1, { \"ashiya\": _2, \"buzen\": _2, \"chikugo\": _2, \"chikuho\": _2, \"chikujo\": _2, \"chikushino\": _2, \"chikuzen\": _2, \"chuo\": _2, \"dazaifu\": _2, \"fukuchi\": _2, \"hakata\": _2, \"higashi\": _2, \"hirokawa\": _2, \"hisayama\": _2, \"iizuka\": _2, \"inatsuki\": _2, \"kaho\": _2, \"kasuga\": _2, \"kasuya\": _2, \"kawara\": _2, \"keisen\": _2, \"koga\": _2, \"kurate\": _2, \"kurogi\": _2, \"kurume\": _2, \"minami\": _2, \"miyako\": _2, \"miyama\": _2, \"miyawaka\": _2, \"mizumaki\": _2, \"munakata\": _2, \"nakagawa\": _2, \"nakama\": _2, \"nishi\": _2, \"nogata\": _2, \"ogori\": _2, \"okagaki\": _2, \"okawa\": _2, \"oki\": _2, \"omuta\": _2, \"onga\": _2, \"onojo\": _2, \"oto\": _2, \"saigawa\": _2, \"sasaguri\": _2, \"shingu\": _2, \"shinyoshitomi\": _2, \"shonai\": _2, \"soeda\": _2, \"sue\": _2, \"tachiarai\": _2, \"tagawa\": _2, \"takata\": _2, \"toho\": _2, \"toyotsu\": _2, \"tsuiki\": _2, \"ukiha\": _2, \"umi\": _2, \"usui\": _2, \"yamada\": _2, \"yame\": _2, \"yanagawa\": _2, \"yukuhashi\": _2 }], \"fukushima\": [1, { \"aizubange\": _2, \"aizumisato\": _2, \"aizuwakamatsu\": _2, \"asakawa\": _2, \"bandai\": _2, \"date\": _2, \"fukushima\": _2, \"furudono\": _2, \"futaba\": _2, \"hanawa\": _2, \"higashi\": _2, \"hirata\": _2, \"hirono\": _2, \"iitate\": _2, \"inawashiro\": _2, \"ishikawa\": _2, \"iwaki\": _2, \"izumizaki\": _2, \"kagamiishi\": _2, \"kaneyama\": _2, \"kawamata\": _2, \"kitakata\": _2, \"kitashiobara\": _2, \"koori\": _2, \"koriyama\": _2, \"kunimi\": _2, \"miharu\": _2, \"mishima\": _2, \"namie\": _2, \"nango\": _2, \"nishiaizu\": _2, \"nishigo\": _2, \"okuma\": _2, \"omotego\": _2, \"ono\": _2, \"otama\": _2, \"samegawa\": _2, \"shimogo\": _2, \"shirakawa\": _2, \"showa\": _2, \"soma\": _2, \"sukagawa\": _2, \"taishin\": _2, \"tamakawa\": _2, \"tanagura\": _2, \"tenei\": _2, \"yabuki\": _2, \"yamato\": _2, \"yamatsuri\": _2, \"yanaizu\": _2, \"yugawa\": _2 }], \"gifu\": [1, { \"anpachi\": _2, \"ena\": _2, \"gifu\": _2, \"ginan\": _2, \"godo\": _2, \"gujo\": _2, \"hashima\": _2, \"hichiso\": _2, \"hida\": _2, \"higashishirakawa\": _2, \"ibigawa\": _2, \"ikeda\": _2, \"kakamigahara\": _2, \"kani\": _2, \"kasahara\": _2, \"kasamatsu\": _2, \"kawaue\": _2, \"kitagata\": _2, \"mino\": _2, \"minokamo\": _2, \"mitake\": _2, \"mizunami\": _2, \"motosu\": _2, \"nakatsugawa\": _2, \"ogaki\": _2, \"sakahogi\": _2, \"seki\": _2, \"sekigahara\": _2, \"shirakawa\": _2, \"tajimi\": _2, \"takayama\": _2, \"tarui\": _2, \"toki\": _2, \"tomika\": _2, \"wanouchi\": _2, \"yamagata\": _2, \"yaotsu\": _2, \"yoro\": _2 }], \"gunma\": [1, { \"annaka\": _2, \"chiyoda\": _2, \"fujioka\": _2, \"higashiagatsuma\": _2, \"isesaki\": _2, \"itakura\": _2, \"kanna\": _2, \"kanra\": _2, \"katashina\": _2, \"kawaba\": _2, \"kiryu\": _2, \"kusatsu\": _2, \"maebashi\": _2, \"meiwa\": _2, \"midori\": _2, \"minakami\": _2, \"naganohara\": _2, \"nakanojo\": _2, \"nanmoku\": _2, \"numata\": _2, \"oizumi\": _2, \"ora\": _2, \"ota\": _2, \"shibukawa\": _2, \"shimonita\": _2, \"shinto\": _2, \"showa\": _2, \"takasaki\": _2, \"takayama\": _2, \"tamamura\": _2, \"tatebayashi\": _2, \"tomioka\": _2, \"tsukiyono\": _2, \"tsumagoi\": _2, \"ueno\": _2, \"yoshioka\": _2 }], \"hiroshima\": [1, { \"asaminami\": _2, \"daiwa\": _2, \"etajima\": _2, \"fuchu\": _2, \"fukuyama\": _2, \"hatsukaichi\": _2, \"higashihiroshima\": _2, \"hongo\": _2, \"jinsekikogen\": _2, \"kaita\": _2, \"kui\": _2, \"kumano\": _2, \"kure\": _2, \"mihara\": _2, \"miyoshi\": _2, \"naka\": _2, \"onomichi\": _2, \"osakikamijima\": _2, \"otake\": _2, \"saka\": _2, \"sera\": _2, \"seranishi\": _2, \"shinichi\": _2, \"shobara\": _2, \"takehara\": _2 }], \"hokkaido\": [1, { \"abashiri\": _2, \"abira\": _2, \"aibetsu\": _2, \"akabira\": _2, \"akkeshi\": _2, \"asahikawa\": _2, \"ashibetsu\": _2, \"ashoro\": _2, \"assabu\": _2, \"atsuma\": _2, \"bibai\": _2, \"biei\": _2, \"bifuka\": _2, \"bihoro\": _2, \"biratori\": _2, \"chippubetsu\": _2, \"chitose\": _2, \"date\": _2, \"ebetsu\": _2, \"embetsu\": _2, \"eniwa\": _2, \"erimo\": _2, \"esan\": _2, \"esashi\": _2, \"fukagawa\": _2, \"fukushima\": _2, \"furano\": _2, \"furubira\": _2, \"haboro\": _2, \"hakodate\": _2, \"hamatonbetsu\": _2, \"hidaka\": _2, \"higashikagura\": _2, \"higashikawa\": _2, \"hiroo\": _2, \"hokuryu\": _2, \"hokuto\": _2, \"honbetsu\": _2, \"horokanai\": _2, \"horonobe\": _2, \"ikeda\": _2, \"imakane\": _2, \"ishikari\": _2, \"iwamizawa\": _2, \"iwanai\": _2, \"kamifurano\": _2, \"kamikawa\": _2, \"kamishihoro\": _2, \"kamisunagawa\": _2, \"kamoenai\": _2, \"kayabe\": _2, \"kembuchi\": _2, \"kikonai\": _2, \"kimobetsu\": _2, \"kitahiroshima\": _2, \"kitami\": _2, \"kiyosato\": _2, \"koshimizu\": _2, \"kunneppu\": _2, \"kuriyama\": _2, \"kuromatsunai\": _2, \"kushiro\": _2, \"kutchan\": _2, \"kyowa\": _2, \"mashike\": _2, \"matsumae\": _2, \"mikasa\": _2, \"minamifurano\": _2, \"mombetsu\": _2, \"moseushi\": _2, \"mukawa\": _2, \"muroran\": _2, \"naie\": _2, \"nakagawa\": _2, \"nakasatsunai\": _2, \"nakatombetsu\": _2, \"nanae\": _2, \"nanporo\": _2, \"nayoro\": _2, \"nemuro\": _2, \"niikappu\": _2, \"niki\": _2, \"nishiokoppe\": _2, \"noboribetsu\": _2, \"numata\": _2, \"obihiro\": _2, \"obira\": _2, \"oketo\": _2, \"okoppe\": _2, \"otaru\": _2, \"otobe\": _2, \"otofuke\": _2, \"otoineppu\": _2, \"oumu\": _2, \"ozora\": _2, \"pippu\": _2, \"rankoshi\": _2, \"rebun\": _2, \"rikubetsu\": _2, \"rishiri\": _2, \"rishirifuji\": _2, \"saroma\": _2, \"sarufutsu\": _2, \"shakotan\": _2, \"shari\": _2, \"shibecha\": _2, \"shibetsu\": _2, \"shikabe\": _2, \"shikaoi\": _2, \"shimamaki\": _2, \"shimizu\": _2, \"shimokawa\": _2, \"shinshinotsu\": _2, \"shintoku\": _2, \"shiranuka\": _2, \"shiraoi\": _2, \"shiriuchi\": _2, \"sobetsu\": _2, \"sunagawa\": _2, \"taiki\": _2, \"takasu\": _2, \"takikawa\": _2, \"takinoue\": _2, \"teshikaga\": _2, \"tobetsu\": _2, \"tohma\": _2, \"tomakomai\": _2, \"tomari\": _2, \"toya\": _2, \"toyako\": _2, \"toyotomi\": _2, \"toyoura\": _2, \"tsubetsu\": _2, \"tsukigata\": _2, \"urakawa\": _2, \"urausu\": _2, \"uryu\": _2, \"utashinai\": _2, \"wakkanai\": _2, \"wassamu\": _2, \"yakumo\": _2, \"yoichi\": _2 }], \"hyogo\": [1, { \"aioi\": _2, \"akashi\": _2, \"ako\": _2, \"amagasaki\": _2, \"aogaki\": _2, \"asago\": _2, \"ashiya\": _2, \"awaji\": _2, \"fukusaki\": _2, \"goshiki\": _2, \"harima\": _2, \"himeji\": _2, \"ichikawa\": _2, \"inagawa\": _2, \"itami\": _2, \"kakogawa\": _2, \"kamigori\": _2, \"kamikawa\": _2, \"kasai\": _2, \"kasuga\": _2, \"kawanishi\": _2, \"miki\": _2, \"minamiawaji\": _2, \"nishinomiya\": _2, \"nishiwaki\": _2, \"ono\": _2, \"sanda\": _2, \"sannan\": _2, \"sasayama\": _2, \"sayo\": _2, \"shingu\": _2, \"shinonsen\": _2, \"shiso\": _2, \"sumoto\": _2, \"taishi\": _2, \"taka\": _2, \"takarazuka\": _2, \"takasago\": _2, \"takino\": _2, \"tamba\": _2, \"tatsuno\": _2, \"toyooka\": _2, \"yabu\": _2, \"yashiro\": _2, \"yoka\": _2, \"yokawa\": _2 }], \"ibaraki\": [1, { \"ami\": _2, \"asahi\": _2, \"bando\": _2, \"chikusei\": _2, \"daigo\": _2, \"fujishiro\": _2, \"hitachi\": _2, \"hitachinaka\": _2, \"hitachiomiya\": _2, \"hitachiota\": _2, \"ibaraki\": _2, \"ina\": _2, \"inashiki\": _2, \"itako\": _2, \"iwama\": _2, \"joso\": _2, \"kamisu\": _2, \"kasama\": _2, \"kashima\": _2, \"kasumigaura\": _2, \"koga\": _2, \"miho\": _2, \"mito\": _2, \"moriya\": _2, \"naka\": _2, \"namegata\": _2, \"oarai\": _2, \"ogawa\": _2, \"omitama\": _2, \"ryugasaki\": _2, \"sakai\": _2, \"sakuragawa\": _2, \"shimodate\": _2, \"shimotsuma\": _2, \"shirosato\": _2, \"sowa\": _2, \"suifu\": _2, \"takahagi\": _2, \"tamatsukuri\": _2, \"tokai\": _2, \"tomobe\": _2, \"tone\": _2, \"toride\": _2, \"tsuchiura\": _2, \"tsukuba\": _2, \"uchihara\": _2, \"ushiku\": _2, \"yachiyo\": _2, \"yamagata\": _2, \"yawara\": _2, \"yuki\": _2 }], \"ishikawa\": [1, { \"anamizu\": _2, \"hakui\": _2, \"hakusan\": _2, \"kaga\": _2, \"kahoku\": _2, \"kanazawa\": _2, \"kawakita\": _2, \"komatsu\": _2, \"nakanoto\": _2, \"nanao\": _2, \"nomi\": _2, \"nonoichi\": _2, \"noto\": _2, \"shika\": _2, \"suzu\": _2, \"tsubata\": _2, \"tsurugi\": _2, \"uchinada\": _2, \"wajima\": _2 }], \"iwate\": [1, { \"fudai\": _2, \"fujisawa\": _2, \"hanamaki\": _2, \"hiraizumi\": _2, \"hirono\": _2, \"ichinohe\": _2, \"ichinoseki\": _2, \"iwaizumi\": _2, \"iwate\": _2, \"joboji\": _2, \"kamaishi\": _2, \"kanegasaki\": _2, \"karumai\": _2, \"kawai\": _2, \"kitakami\": _2, \"kuji\": _2, \"kunohe\": _2, \"kuzumaki\": _2, \"miyako\": _2, \"mizusawa\": _2, \"morioka\": _2, \"ninohe\": _2, \"noda\": _2, \"ofunato\": _2, \"oshu\": _2, \"otsuchi\": _2, \"rikuzentakata\": _2, \"shiwa\": _2, \"shizukuishi\": _2, \"sumita\": _2, \"tanohata\": _2, \"tono\": _2, \"yahaba\": _2, \"yamada\": _2 }], \"kagawa\": [1, { \"ayagawa\": _2, \"higashikagawa\": _2, \"kanonji\": _2, \"kotohira\": _2, \"manno\": _2, \"marugame\": _2, \"mitoyo\": _2, \"naoshima\": _2, \"sanuki\": _2, \"tadotsu\": _2, \"takamatsu\": _2, \"tonosho\": _2, \"uchinomi\": _2, \"utazu\": _2, \"zentsuji\": _2 }], \"kagoshima\": [1, { \"akune\": _2, \"amami\": _2, \"hioki\": _2, \"isa\": _2, \"isen\": _2, \"izumi\": _2, \"kagoshima\": _2, \"kanoya\": _2, \"kawanabe\": _2, \"kinko\": _2, \"kouyama\": _2, \"makurazaki\": _2, \"matsumoto\": _2, \"minamitane\": _2, \"nakatane\": _2, \"nishinoomote\": _2, \"satsumasendai\": _2, \"soo\": _2, \"tarumizu\": _2, \"yusui\": _2 }], \"kanagawa\": [1, { \"aikawa\": _2, \"atsugi\": _2, \"ayase\": _2, \"chigasaki\": _2, \"ebina\": _2, \"fujisawa\": _2, \"hadano\": _2, \"hakone\": _2, \"hiratsuka\": _2, \"isehara\": _2, \"kaisei\": _2, \"kamakura\": _2, \"kiyokawa\": _2, \"matsuda\": _2, \"minamiashigara\": _2, \"miura\": _2, \"nakai\": _2, \"ninomiya\": _2, \"odawara\": _2, \"oi\": _2, \"oiso\": _2, \"sagamihara\": _2, \"samukawa\": _2, \"tsukui\": _2, \"yamakita\": _2, \"yamato\": _2, \"yokosuka\": _2, \"yugawara\": _2, \"zama\": _2, \"zushi\": _2 }], \"kochi\": [1, { \"aki\": _2, \"geisei\": _2, \"hidaka\": _2, \"higashitsuno\": _2, \"ino\": _2, \"kagami\": _2, \"kami\": _2, \"kitagawa\": _2, \"kochi\": _2, \"mihara\": _2, \"motoyama\": _2, \"muroto\": _2, \"nahari\": _2, \"nakamura\": _2, \"nankoku\": _2, \"nishitosa\": _2, \"niyodogawa\": _2, \"ochi\": _2, \"okawa\": _2, \"otoyo\": _2, \"otsuki\": _2, \"sakawa\": _2, \"sukumo\": _2, \"susaki\": _2, \"tosa\": _2, \"tosashimizu\": _2, \"toyo\": _2, \"tsuno\": _2, \"umaji\": _2, \"yasuda\": _2, \"yusuhara\": _2 }], \"kumamoto\": [1, { \"amakusa\": _2, \"arao\": _2, \"aso\": _2, \"choyo\": _2, \"gyokuto\": _2, \"kamiamakusa\": _2, \"kikuchi\": _2, \"kumamoto\": _2, \"mashiki\": _2, \"mifune\": _2, \"minamata\": _2, \"minamioguni\": _2, \"nagasu\": _2, \"nishihara\": _2, \"oguni\": _2, \"ozu\": _2, \"sumoto\": _2, \"takamori\": _2, \"uki\": _2, \"uto\": _2, \"yamaga\": _2, \"yamato\": _2, \"yatsushiro\": _2 }], \"kyoto\": [1, { \"ayabe\": _2, \"fukuchiyama\": _2, \"higashiyama\": _2, \"ide\": _2, \"ine\": _2, \"joyo\": _2, \"kameoka\": _2, \"kamo\": _2, \"kita\": _2, \"kizu\": _2, \"kumiyama\": _2, \"kyotamba\": _2, \"kyotanabe\": _2, \"kyotango\": _2, \"maizuru\": _2, \"minami\": _2, \"minamiyamashiro\": _2, \"miyazu\": _2, \"muko\": _2, \"nagaokakyo\": _2, \"nakagyo\": _2, \"nantan\": _2, \"oyamazaki\": _2, \"sakyo\": _2, \"seika\": _2, \"tanabe\": _2, \"uji\": _2, \"ujitawara\": _2, \"wazuka\": _2, \"yamashina\": _2, \"yawata\": _2 }], \"mie\": [1, { \"asahi\": _2, \"inabe\": _2, \"ise\": _2, \"kameyama\": _2, \"kawagoe\": _2, \"kiho\": _2, \"kisosaki\": _2, \"kiwa\": _2, \"komono\": _2, \"kumano\": _2, \"kuwana\": _2, \"matsusaka\": _2, \"meiwa\": _2, \"mihama\": _2, \"minamiise\": _2, \"misugi\": _2, \"miyama\": _2, \"nabari\": _2, \"shima\": _2, \"suzuka\": _2, \"tado\": _2, \"taiki\": _2, \"taki\": _2, \"tamaki\": _2, \"toba\": _2, \"tsu\": _2, \"udono\": _2, \"ureshino\": _2, \"watarai\": _2, \"yokkaichi\": _2 }], \"miyagi\": [1, { \"furukawa\": _2, \"higashimatsushima\": _2, \"ishinomaki\": _2, \"iwanuma\": _2, \"kakuda\": _2, \"kami\": _2, \"kawasaki\": _2, \"marumori\": _2, \"matsushima\": _2, \"minamisanriku\": _2, \"misato\": _2, \"murata\": _2, \"natori\": _2, \"ogawara\": _2, \"ohira\": _2, \"onagawa\": _2, \"osaki\": _2, \"rifu\": _2, \"semine\": _2, \"shibata\": _2, \"shichikashuku\": _2, \"shikama\": _2, \"shiogama\": _2, \"shiroishi\": _2, \"tagajo\": _2, \"taiwa\": _2, \"tome\": _2, \"tomiya\": _2, \"wakuya\": _2, \"watari\": _2, \"yamamoto\": _2, \"zao\": _2 }], \"miyazaki\": [1, { \"aya\": _2, \"ebino\": _2, \"gokase\": _2, \"hyuga\": _2, \"kadogawa\": _2, \"kawaminami\": _2, \"kijo\": _2, \"kitagawa\": _2, \"kitakata\": _2, \"kitaura\": _2, \"kobayashi\": _2, \"kunitomi\": _2, \"kushima\": _2, \"mimata\": _2, \"miyakonojo\": _2, \"miyazaki\": _2, \"morotsuka\": _2, \"nichinan\": _2, \"nishimera\": _2, \"nobeoka\": _2, \"saito\": _2, \"shiiba\": _2, \"shintomi\": _2, \"takaharu\": _2, \"takanabe\": _2, \"takazaki\": _2, \"tsuno\": _2 }], \"nagano\": [1, { \"achi\": _2, \"agematsu\": _2, \"anan\": _2, \"aoki\": _2, \"asahi\": _2, \"azumino\": _2, \"chikuhoku\": _2, \"chikuma\": _2, \"chino\": _2, \"fujimi\": _2, \"hakuba\": _2, \"hara\": _2, \"hiraya\": _2, \"iida\": _2, \"iijima\": _2, \"iiyama\": _2, \"iizuna\": _2, \"ikeda\": _2, \"ikusaka\": _2, \"ina\": _2, \"karuizawa\": _2, \"kawakami\": _2, \"kiso\": _2, \"kisofukushima\": _2, \"kitaaiki\": _2, \"komagane\": _2, \"komoro\": _2, \"matsukawa\": _2, \"matsumoto\": _2, \"miasa\": _2, \"minamiaiki\": _2, \"minamimaki\": _2, \"minamiminowa\": _2, \"minowa\": _2, \"miyada\": _2, \"miyota\": _2, \"mochizuki\": _2, \"nagano\": _2, \"nagawa\": _2, \"nagiso\": _2, \"nakagawa\": _2, \"nakano\": _2, \"nozawaonsen\": _2, \"obuse\": _2, \"ogawa\": _2, \"okaya\": _2, \"omachi\": _2, \"omi\": _2, \"ookuwa\": _2, \"ooshika\": _2, \"otaki\": _2, \"otari\": _2, \"sakae\": _2, \"sakaki\": _2, \"saku\": _2, \"sakuho\": _2, \"shimosuwa\": _2, \"shinanomachi\": _2, \"shiojiri\": _2, \"suwa\": _2, \"suzaka\": _2, \"takagi\": _2, \"takamori\": _2, \"takayama\": _2, \"tateshina\": _2, \"tatsuno\": _2, \"togakushi\": _2, \"togura\": _2, \"tomi\": _2, \"ueda\": _2, \"wada\": _2, \"yamagata\": _2, \"yamanouchi\": _2, \"yasaka\": _2, \"yasuoka\": _2 }], \"nagasaki\": [1, { \"chijiwa\": _2, \"futsu\": _2, \"goto\": _2, \"hasami\": _2, \"hirado\": _2, \"iki\": _2, \"isahaya\": _2, \"kawatana\": _2, \"kuchinotsu\": _2, \"matsuura\": _2, \"nagasaki\": _2, \"obama\": _2, \"omura\": _2, \"oseto\": _2, \"saikai\": _2, \"sasebo\": _2, \"seihi\": _2, \"shimabara\": _2, \"shinkamigoto\": _2, \"togitsu\": _2, \"tsushima\": _2, \"unzen\": _2 }], \"nara\": [1, { \"ando\": _2, \"gose\": _2, \"heguri\": _2, \"higashiyoshino\": _2, \"ikaruga\": _2, \"ikoma\": _2, \"kamikitayama\": _2, \"kanmaki\": _2, \"kashiba\": _2, \"kashihara\": _2, \"katsuragi\": _2, \"kawai\": _2, \"kawakami\": _2, \"kawanishi\": _2, \"koryo\": _2, \"kurotaki\": _2, \"mitsue\": _2, \"miyake\": _2, \"nara\": _2, \"nosegawa\": _2, \"oji\": _2, \"ouda\": _2, \"oyodo\": _2, \"sakurai\": _2, \"sango\": _2, \"shimoichi\": _2, \"shimokitayama\": _2, \"shinjo\": _2, \"soni\": _2, \"takatori\": _2, \"tawaramoto\": _2, \"tenkawa\": _2, \"tenri\": _2, \"uda\": _2, \"yamatokoriyama\": _2, \"yamatotakada\": _2, \"yamazoe\": _2, \"yoshino\": _2 }], \"niigata\": [1, { \"aga\": _2, \"agano\": _2, \"gosen\": _2, \"itoigawa\": _2, \"izumozaki\": _2, \"joetsu\": _2, \"kamo\": _2, \"kariwa\": _2, \"kashiwazaki\": _2, \"minamiuonuma\": _2, \"mitsuke\": _2, \"muika\": _2, \"murakami\": _2, \"myoko\": _2, \"nagaoka\": _2, \"niigata\": _2, \"ojiya\": _2, \"omi\": _2, \"sado\": _2, \"sanjo\": _2, \"seiro\": _2, \"seirou\": _2, \"sekikawa\": _2, \"shibata\": _2, \"tagami\": _2, \"tainai\": _2, \"tochio\": _2, \"tokamachi\": _2, \"tsubame\": _2, \"tsunan\": _2, \"uonuma\": _2, \"yahiko\": _2, \"yoita\": _2, \"yuzawa\": _2 }], \"oita\": [1, { \"beppu\": _2, \"bungoono\": _2, \"bungotakada\": _2, \"hasama\": _2, \"hiji\": _2, \"himeshima\": _2, \"hita\": _2, \"kamitsue\": _2, \"kokonoe\": _2, \"kuju\": _2, \"kunisaki\": _2, \"kusu\": _2, \"oita\": _2, \"saiki\": _2, \"taketa\": _2, \"tsukumi\": _2, \"usa\": _2, \"usuki\": _2, \"yufu\": _2 }], \"okayama\": [1, { \"akaiwa\": _2, \"asakuchi\": _2, \"bizen\": _2, \"hayashima\": _2, \"ibara\": _2, \"kagamino\": _2, \"kasaoka\": _2, \"kibichuo\": _2, \"kumenan\": _2, \"kurashiki\": _2, \"maniwa\": _2, \"misaki\": _2, \"nagi\": _2, \"niimi\": _2, \"nishiawakura\": _2, \"okayama\": _2, \"satosho\": _2, \"setouchi\": _2, \"shinjo\": _2, \"shoo\": _2, \"soja\": _2, \"takahashi\": _2, \"tamano\": _2, \"tsuyama\": _2, \"wake\": _2, \"yakage\": _2 }], \"okinawa\": [1, { \"aguni\": _2, \"ginowan\": _2, \"ginoza\": _2, \"gushikami\": _2, \"haebaru\": _2, \"higashi\": _2, \"hirara\": _2, \"iheya\": _2, \"ishigaki\": _2, \"ishikawa\": _2, \"itoman\": _2, \"izena\": _2, \"kadena\": _2, \"kin\": _2, \"kitadaito\": _2, \"kitanakagusuku\": _2, \"kumejima\": _2, \"kunigami\": _2, \"minamidaito\": _2, \"motobu\": _2, \"nago\": _2, \"naha\": _2, \"nakagusuku\": _2, \"nakijin\": _2, \"nanjo\": _2, \"nishihara\": _2, \"ogimi\": _2, \"okinawa\": _2, \"onna\": _2, \"shimoji\": _2, \"taketomi\": _2, \"tarama\": _2, \"tokashiki\": _2, \"tomigusuku\": _2, \"tonaki\": _2, \"urasoe\": _2, \"uruma\": _2, \"yaese\": _2, \"yomitan\": _2, \"yonabaru\": _2, \"yonaguni\": _2, \"zamami\": _2 }], \"osaka\": [1, { \"abeno\": _2, \"chihayaakasaka\": _2, \"chuo\": _2, \"daito\": _2, \"fujiidera\": _2, \"habikino\": _2, \"hannan\": _2, \"higashiosaka\": _2, \"higashisumiyoshi\": _2, \"higashiyodogawa\": _2, \"hirakata\": _2, \"ibaraki\": _2, \"ikeda\": _2, \"izumi\": _2, \"izumiotsu\": _2, \"izumisano\": _2, \"kadoma\": _2, \"kaizuka\": _2, \"kanan\": _2, \"kashiwara\": _2, \"katano\": _2, \"kawachinagano\": _2, \"kishiwada\": _2, \"kita\": _2, \"kumatori\": _2, \"matsubara\": _2, \"minato\": _2, \"minoh\": _2, \"misaki\": _2, \"moriguchi\": _2, \"neyagawa\": _2, \"nishi\": _2, \"nose\": _2, \"osakasayama\": _2, \"sakai\": _2, \"sayama\": _2, \"sennan\": _2, \"settsu\": _2, \"shijonawate\": _2, \"shimamoto\": _2, \"suita\": _2, \"tadaoka\": _2, \"taishi\": _2, \"tajiri\": _2, \"takaishi\": _2, \"takatsuki\": _2, \"tondabayashi\": _2, \"toyonaka\": _2, \"toyono\": _2, \"yao\": _2 }], \"saga\": [1, { \"ariake\": _2, \"arita\": _2, \"fukudomi\": _2, \"genkai\": _2, \"hamatama\": _2, \"hizen\": _2, \"imari\": _2, \"kamimine\": _2, \"kanzaki\": _2, \"karatsu\": _2, \"kashima\": _2, \"kitagata\": _2, \"kitahata\": _2, \"kiyama\": _2, \"kouhoku\": _2, \"kyuragi\": _2, \"nishiarita\": _2, \"ogi\": _2, \"omachi\": _2, \"ouchi\": _2, \"saga\": _2, \"shiroishi\": _2, \"taku\": _2, \"tara\": _2, \"tosu\": _2, \"yoshinogari\": _2 }], \"saitama\": [1, { \"arakawa\": _2, \"asaka\": _2, \"chichibu\": _2, \"fujimi\": _2, \"fujimino\": _2, \"fukaya\": _2, \"hanno\": _2, \"hanyu\": _2, \"hasuda\": _2, \"hatogaya\": _2, \"hatoyama\": _2, \"hidaka\": _2, \"higashichichibu\": _2, \"higashimatsuyama\": _2, \"honjo\": _2, \"ina\": _2, \"iruma\": _2, \"iwatsuki\": _2, \"kamiizumi\": _2, \"kamikawa\": _2, \"kamisato\": _2, \"kasukabe\": _2, \"kawagoe\": _2, \"kawaguchi\": _2, \"kawajima\": _2, \"kazo\": _2, \"kitamoto\": _2, \"koshigaya\": _2, \"kounosu\": _2, \"kuki\": _2, \"kumagaya\": _2, \"matsubushi\": _2, \"minano\": _2, \"misato\": _2, \"miyashiro\": _2, \"miyoshi\": _2, \"moroyama\": _2, \"nagatoro\": _2, \"namegawa\": _2, \"niiza\": _2, \"ogano\": _2, \"ogawa\": _2, \"ogose\": _2, \"okegawa\": _2, \"omiya\": _2, \"otaki\": _2, \"ranzan\": _2, \"ryokami\": _2, \"saitama\": _2, \"sakado\": _2, \"satte\": _2, \"sayama\": _2, \"shiki\": _2, \"shiraoka\": _2, \"soka\": _2, \"sugito\": _2, \"toda\": _2, \"tokigawa\": _2, \"tokorozawa\": _2, \"tsurugashima\": _2, \"urawa\": _2, \"warabi\": _2, \"yashio\": _2, \"yokoze\": _2, \"yono\": _2, \"yorii\": _2, \"yoshida\": _2, \"yoshikawa\": _2, \"yoshimi\": _2 }], \"shiga\": [1, { \"aisho\": _2, \"gamo\": _2, \"higashiomi\": _2, \"hikone\": _2, \"koka\": _2, \"konan\": _2, \"kosei\": _2, \"koto\": _2, \"kusatsu\": _2, \"maibara\": _2, \"moriyama\": _2, \"nagahama\": _2, \"nishiazai\": _2, \"notogawa\": _2, \"omihachiman\": _2, \"otsu\": _2, \"ritto\": _2, \"ryuoh\": _2, \"takashima\": _2, \"takatsuki\": _2, \"torahime\": _2, \"toyosato\": _2, \"yasu\": _2 }], \"shimane\": [1, { \"akagi\": _2, \"ama\": _2, \"gotsu\": _2, \"hamada\": _2, \"higashiizumo\": _2, \"hikawa\": _2, \"hikimi\": _2, \"izumo\": _2, \"kakinoki\": _2, \"masuda\": _2, \"matsue\": _2, \"misato\": _2, \"nishinoshima\": _2, \"ohda\": _2, \"okinoshima\": _2, \"okuizumo\": _2, \"shimane\": _2, \"tamayu\": _2, \"tsuwano\": _2, \"unnan\": _2, \"yakumo\": _2, \"yasugi\": _2, \"yatsuka\": _2 }], \"shizuoka\": [1, { \"arai\": _2, \"atami\": _2, \"fuji\": _2, \"fujieda\": _2, \"fujikawa\": _2, \"fujinomiya\": _2, \"fukuroi\": _2, \"gotemba\": _2, \"haibara\": _2, \"hamamatsu\": _2, \"higashiizu\": _2, \"ito\": _2, \"iwata\": _2, \"izu\": _2, \"izunokuni\": _2, \"kakegawa\": _2, \"kannami\": _2, \"kawanehon\": _2, \"kawazu\": _2, \"kikugawa\": _2, \"kosai\": _2, \"makinohara\": _2, \"matsuzaki\": _2, \"minamiizu\": _2, \"mishima\": _2, \"morimachi\": _2, \"nishiizu\": _2, \"numazu\": _2, \"omaezaki\": _2, \"shimada\": _2, \"shimizu\": _2, \"shimoda\": _2, \"shizuoka\": _2, \"susono\": _2, \"yaizu\": _2, \"yoshida\": _2 }], \"tochigi\": [1, { \"ashikaga\": _2, \"bato\": _2, \"haga\": _2, \"ichikai\": _2, \"iwafune\": _2, \"kaminokawa\": _2, \"kanuma\": _2, \"karasuyama\": _2, \"kuroiso\": _2, \"mashiko\": _2, \"mibu\": _2, \"moka\": _2, \"motegi\": _2, \"nasu\": _2, \"nasushiobara\": _2, \"nikko\": _2, \"nishikata\": _2, \"nogi\": _2, \"ohira\": _2, \"ohtawara\": _2, \"oyama\": _2, \"sakura\": _2, \"sano\": _2, \"shimotsuke\": _2, \"shioya\": _2, \"takanezawa\": _2, \"tochigi\": _2, \"tsuga\": _2, \"ujiie\": _2, \"utsunomiya\": _2, \"yaita\": _2 }], \"tokushima\": [1, { \"aizumi\": _2, \"anan\": _2, \"ichiba\": _2, \"itano\": _2, \"kainan\": _2, \"komatsushima\": _2, \"matsushige\": _2, \"mima\": _2, \"minami\": _2, \"miyoshi\": _2, \"mugi\": _2, \"nakagawa\": _2, \"naruto\": _2, \"sanagochi\": _2, \"shishikui\": _2, \"tokushima\": _2, \"wajiki\": _2 }], \"tokyo\": [1, { \"adachi\": _2, \"akiruno\": _2, \"akishima\": _2, \"aogashima\": _2, \"arakawa\": _2, \"bunkyo\": _2, \"chiyoda\": _2, \"chofu\": _2, \"chuo\": _2, \"edogawa\": _2, \"fuchu\": _2, \"fussa\": _2, \"hachijo\": _2, \"hachioji\": _2, \"hamura\": _2, \"higashikurume\": _2, \"higashimurayama\": _2, \"higashiyamato\": _2, \"hino\": _2, \"hinode\": _2, \"hinohara\": _2, \"inagi\": _2, \"itabashi\": _2, \"katsushika\": _2, \"kita\": _2, \"kiyose\": _2, \"kodaira\": _2, \"koganei\": _2, \"kokubunji\": _2, \"komae\": _2, \"koto\": _2, \"kouzushima\": _2, \"kunitachi\": _2, \"machida\": _2, \"meguro\": _2, \"minato\": _2, \"mitaka\": _2, \"mizuho\": _2, \"musashimurayama\": _2, \"musashino\": _2, \"nakano\": _2, \"nerima\": _2, \"ogasawara\": _2, \"okutama\": _2, \"ome\": _2, \"oshima\": _2, \"ota\": _2, \"setagaya\": _2, \"shibuya\": _2, \"shinagawa\": _2, \"shinjuku\": _2, \"suginami\": _2, \"sumida\": _2, \"tachikawa\": _2, \"taito\": _2, \"tama\": _2, \"toshima\": _2 }], \"tottori\": [1, { \"chizu\": _2, \"hino\": _2, \"kawahara\": _2, \"koge\": _2, \"kotoura\": _2, \"misasa\": _2, \"nanbu\": _2, \"nichinan\": _2, \"sakaiminato\": _2, \"tottori\": _2, \"wakasa\": _2, \"yazu\": _2, \"yonago\": _2 }], \"toyama\": [1, { \"asahi\": _2, \"fuchu\": _2, \"fukumitsu\": _2, \"funahashi\": _2, \"himi\": _2, \"imizu\": _2, \"inami\": _2, \"johana\": _2, \"kamiichi\": _2, \"kurobe\": _2, \"nakaniikawa\": _2, \"namerikawa\": _2, \"nanto\": _2, \"nyuzen\": _2, \"oyabe\": _2, \"taira\": _2, \"takaoka\": _2, \"tateyama\": _2, \"toga\": _2, \"tonami\": _2, \"toyama\": _2, \"unazuki\": _2, \"uozu\": _2, \"yamada\": _2 }], \"wakayama\": [1, { \"arida\": _2, \"aridagawa\": _2, \"gobo\": _2, \"hashimoto\": _2, \"hidaka\": _2, \"hirogawa\": _2, \"inami\": _2, \"iwade\": _2, \"kainan\": _2, \"kamitonda\": _2, \"katsuragi\": _2, \"kimino\": _2, \"kinokawa\": _2, \"kitayama\": _2, \"koya\": _2, \"koza\": _2, \"kozagawa\": _2, \"kudoyama\": _2, \"kushimoto\": _2, \"mihama\": _2, \"misato\": _2, \"nachikatsuura\": _2, \"shingu\": _2, \"shirahama\": _2, \"taiji\": _2, \"tanabe\": _2, \"wakayama\": _2, \"yuasa\": _2, \"yura\": _2 }], \"yamagata\": [1, { \"asahi\": _2, \"funagata\": _2, \"higashine\": _2, \"iide\": _2, \"kahoku\": _2, \"kaminoyama\": _2, \"kaneyama\": _2, \"kawanishi\": _2, \"mamurogawa\": _2, \"mikawa\": _2, \"murayama\": _2, \"nagai\": _2, \"nakayama\": _2, \"nanyo\": _2, \"nishikawa\": _2, \"obanazawa\": _2, \"oe\": _2, \"oguni\": _2, \"ohkura\": _2, \"oishida\": _2, \"sagae\": _2, \"sakata\": _2, \"sakegawa\": _2, \"shinjo\": _2, \"shirataka\": _2, \"shonai\": _2, \"takahata\": _2, \"tendo\": _2, \"tozawa\": _2, \"tsuruoka\": _2, \"yamagata\": _2, \"yamanobe\": _2, \"yonezawa\": _2, \"yuza\": _2 }], \"yamaguchi\": [1, { \"abu\": _2, \"hagi\": _2, \"hikari\": _2, \"hofu\": _2, \"iwakuni\": _2, \"kudamatsu\": _2, \"mitou\": _2, \"nagato\": _2, \"oshima\": _2, \"shimonoseki\": _2, \"shunan\": _2, \"tabuse\": _2, \"tokuyama\": _2, \"toyota\": _2, \"ube\": _2, \"yuu\": _2 }], \"yamanashi\": [1, { \"chuo\": _2, \"doshi\": _2, \"fuefuki\": _2, \"fujikawa\": _2, \"fujikawaguchiko\": _2, \"fujiyoshida\": _2, \"hayakawa\": _2, \"hokuto\": _2, \"ichikawamisato\": _2, \"kai\": _2, \"kofu\": _2, \"koshu\": _2, \"kosuge\": _2, \"minami-alps\": _2, \"minobu\": _2, \"nakamichi\": _2, \"nanbu\": _2, \"narusawa\": _2, \"nirasaki\": _2, \"nishikatsura\": _2, \"oshino\": _2, \"otsuki\": _2, \"showa\": _2, \"tabayama\": _2, \"tsuru\": _2, \"uenohara\": _2, \"yamanakako\": _2, \"yamanashi\": _2 }], \"xn--4pvxs\": _2, \"栃木\": _2, \"xn--vgu402c\": _2, \"愛知\": _2, \"xn--c3s14m\": _2, \"愛媛\": _2, \"xn--f6qx53a\": _2, \"兵庫\": _2, \"xn--8pvr4u\": _2, \"熊本\": _2, \"xn--uist22h\": _2, \"茨城\": _2, \"xn--djrs72d6uy\": _2, \"北海道\": _2, \"xn--mkru45i\": _2, \"千葉\": _2, \"xn--0trq7p7nn\": _2, \"和歌山\": _2, \"xn--8ltr62k\": _2, \"長崎\": _2, \"xn--2m4a15e\": _2, \"長野\": _2, \"xn--efvn9s\": _2, \"新潟\": _2, \"xn--32vp30h\": _2, \"青森\": _2, \"xn--4it797k\": _2, \"静岡\": _2, \"xn--1lqs71d\": _2, \"東京\": _2, \"xn--5rtp49c\": _2, \"石川\": _2, \"xn--5js045d\": _2, \"埼玉\": _2, \"xn--ehqz56n\": _2, \"三重\": _2, \"xn--1lqs03n\": _2, \"京都\": _2, \"xn--qqqt11m\": _2, \"佐賀\": _2, \"xn--kbrq7o\": _2, \"大分\": _2, \"xn--pssu33l\": _2, \"大阪\": _2, \"xn--ntsq17g\": _2, \"奈良\": _2, \"xn--uisz3g\": _2, \"宮城\": _2, \"xn--6btw5a\": _2, \"宮崎\": _2, \"xn--1ctwo\": _2, \"富山\": _2, \"xn--6orx2r\": _2, \"山口\": _2, \"xn--rht61e\": _2, \"山形\": _2, \"xn--rht27z\": _2, \"山梨\": _2, \"xn--djty4k\": _2, \"岩手\": _2, \"xn--nit225k\": _2, \"岐阜\": _2, \"xn--rht3d\": _2, \"岡山\": _2, \"xn--klty5x\": _2, \"島根\": _2, \"xn--kltx9a\": _2, \"広島\": _2, \"xn--kltp7d\": _2, \"徳島\": _2, \"xn--uuwu58a\": _2, \"沖縄\": _2, \"xn--zbx025d\": _2, \"滋賀\": _2, \"xn--ntso0iqx3a\": _2, \"神奈川\": _2, \"xn--elqq16h\": _2, \"福井\": _2, \"xn--4it168d\": _2, \"福岡\": _2, \"xn--klt787d\": _2, \"福島\": _2, \"xn--rny31h\": _2, \"秋田\": _2, \"xn--7t0a264c\": _2, \"群馬\": _2, \"xn--5rtq34k\": _2, \"香川\": _2, \"xn--k7yn95e\": _2, \"高知\": _2, \"xn--tor131o\": _2, \"鳥取\": _2, \"xn--d5qv7z876c\": _2, \"鹿児島\": _2, \"kawasaki\": _8, \"kitakyushu\": _8, \"kobe\": _8, \"nagoya\": _8, \"sapporo\": _8, \"sendai\": _8, \"yokohama\": _8, \"buyshop\": _3, \"fashionstore\": _3, \"handcrafted\": _3, \"kawaiishop\": _3, \"supersale\": _3, \"theshop\": _3, \"usercontent\": _3, \"angry\": _3, \"babyblue\": _3, \"babymilk\": _3, \"backdrop\": _3, \"bambina\": _3, \"bitter\": _3, \"blush\": _3, \"boo\": _3, \"boy\": _3, \"boyfriend\": _3, \"but\": _3, \"candypop\": _3, \"capoo\": _3, \"catfood\": _3, \"cheap\": _3, \"chicappa\": _3, \"chillout\": _3, \"chips\": _3, \"chowder\": _3, \"chu\": _3, \"ciao\": _3, \"cocotte\": _3, \"coolblog\": _3, \"cranky\": _3, \"cutegirl\": _3, \"daa\": _3, \"deca\": _3, \"deci\": _3, \"digick\": _3, \"egoism\": _3, \"fakefur\": _3, \"fem\": _3, \"flier\": _3, \"floppy\": _3, \"fool\": _3, \"frenchkiss\": _3, \"girlfriend\": _3, \"girly\": _3, \"gloomy\": _3, \"gonna\": _3, \"greater\": _3, \"hacca\": _3, \"heavy\": _3, \"her\": _3, \"hiho\": _3, \"hippy\": _3, \"holy\": _3, \"hungry\": _3, \"icurus\": _3, \"itigo\": _3, \"jellybean\": _3, \"kikirara\": _3, \"kill\": _3, \"kilo\": _3, \"kuron\": _3, \"littlestar\": _3, \"lolipopmc\": _3, \"lolitapunk\": _3, \"lomo\": _3, \"lovepop\": _3, \"lovesick\": _3, \"main\": _3, \"mods\": _3, \"mond\": _3, \"mongolian\": _3, \"moo\": _3, \"namaste\": _3, \"nikita\": _3, \"nobushi\": _3, \"noor\": _3, \"oops\": _3, \"parallel\": _3, \"parasite\": _3, \"pecori\": _3, \"peewee\": _3, \"penne\": _3, \"pepper\": _3, \"perma\": _3, \"pigboat\": _3, \"pinoko\": _3, \"punyu\": _3, \"pupu\": _3, \"pussycat\": _3, \"pya\": _3, \"raindrop\": _3, \"readymade\": _3, \"sadist\": _3, \"schoolbus\": _3, \"secret\": _3, \"staba\": _3, \"stripper\": _3, \"sub\": _3, \"sunnyday\": _3, \"thick\": _3, \"tonkotsu\": _3, \"under\": _3, \"upper\": _3, \"velvet\": _3, \"verse\": _3, \"versus\": _3, \"vivian\": _3, \"watson\": _3, \"weblike\": _3, \"whitesnow\": _3, \"zombie\": _3, \"blogspot\": _3, \"2-d\": _3, \"bona\": _3, \"crap\": _3, \"daynight\": _3, \"eek\": _3, \"flop\": _3, \"halfmoon\": _3, \"jeez\": _3, \"matrix\": _3, \"mimoza\": _3, \"netgamers\": _3, \"nyanta\": _3, \"o0o0\": _3, \"rdy\": _3, \"rgr\": _3, \"rulez\": _3, \"sakurastorage\": [0, { \"isk01\": _12, \"isk02\": _12 }], \"saloon\": _3, \"sblo\": _3, \"skr\": _3, \"tank\": _3, \"uh-oh\": _3, \"undo\": _3, \"webaccel\": [0, { \"rs\": _3, \"user\": _3 }], \"websozai\": _3, \"xii\": _3 }], \"ke\": [1, { \"ac\": _2, \"co\": _6, \"go\": _2, \"info\": _2, \"me\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2 }], \"kg\": [1, { \"org\": _2, \"net\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"blog\": _3, \"io\": _3, \"jp\": _3, \"tv\": _3, \"uk\": _3, \"us\": _3 }], \"kh\": _8, \"ki\": _33, \"km\": [1, { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"ass\": _2, \"com\": _2, \"coop\": _2, \"asso\": _2, \"presse\": _2, \"medecin\": _2, \"notaires\": _2, \"pharmaciens\": _2, \"veterinaire\": _2, \"gouv\": _2 }], \"kn\": [1, { \"net\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2 }], \"kp\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"rep\": _2, \"tra\": _2 }], \"kr\": [1, { \"ac\": _2, \"co\": _2, \"es\": _2, \"go\": _2, \"hs\": _2, \"kg\": _2, \"mil\": _2, \"ms\": _2, \"ne\": _2, \"or\": _2, \"pe\": _2, \"re\": _2, \"sc\": _2, \"busan\": _2, \"chungbuk\": _2, \"chungnam\": _2, \"daegu\": _2, \"daejeon\": _2, \"gangwon\": _2, \"gwangju\": _2, \"gyeongbuk\": _2, \"gyeonggi\": _2, \"gyeongnam\": _2, \"incheon\": _2, \"jeju\": _2, \"jeonbuk\": _2, \"jeonnam\": _2, \"seoul\": _2, \"ulsan\": _2, \"blogspot\": _3 }], \"kw\": [1, { \"com\": _2, \"edu\": _2, \"emb\": _2, \"gov\": _2, \"ind\": _2, \"net\": _2, \"org\": _2 }], \"ky\": _25, \"kz\": [1, { \"org\": _2, \"edu\": _2, \"net\": _2, \"gov\": _2, \"mil\": _2, \"com\": _2, \"jcloud\": _3, \"kazteleport\": [0, { \"upaas\": _3 }] }], \"la\": [1, { \"int\": _2, \"net\": _2, \"info\": _2, \"edu\": _2, \"gov\": _2, \"per\": _2, \"com\": _2, \"org\": _2, \"bnr\": _3, \"c\": _3 }], \"lb\": _4, \"lc\": [1, { \"com\": _2, \"net\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"gov\": _2, \"oy\": _3 }], \"li\": [1, { \"blogspot\": _3, \"caa\": _3 }], \"lk\": [1, { \"gov\": _2, \"sch\": _2, \"net\": _2, \"int\": _2, \"com\": _2, \"org\": _2, \"edu\": _2, \"ngo\": _2, \"soc\": _2, \"web\": _2, \"ltd\": _2, \"assn\": _2, \"grp\": _2, \"hotel\": _2, \"ac\": _2 }], \"lr\": _4, \"ls\": [1, { \"ac\": _2, \"biz\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"net\": _2, \"org\": _2, \"sc\": _2, \"de\": _3 }], \"lt\": _34, \"lu\": [1, { \"blogspot\": _3, \"123website\": _3 }], \"lv\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"id\": _2, \"net\": _2, \"asn\": _2, \"conf\": _2 }], \"ly\": [1, { \"com\": _2, \"net\": _2, \"gov\": _2, \"plc\": _2, \"edu\": _2, \"sch\": _2, \"med\": _2, \"org\": _2, \"id\": _2 }], \"ma\": [1, { \"co\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"ac\": _2, \"press\": _2 }], \"mc\": [1, { \"tm\": _2, \"asso\": _2 }], \"md\": [1, { \"blogspot\": _3, \"at\": _3, \"de\": _3, \"jp\": _3, \"to\": _3 }], \"me\": [1, { \"co\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"ac\": _2, \"gov\": _2, \"its\": _2, \"priv\": _2, \"c66\": _3, \"daplie\": [2, { \"localhost\": _3 }], \"edgestack\": _3, \"filegear\": _3, \"filegear-au\": _3, \"filegear-de\": _3, \"filegear-gb\": _3, \"filegear-ie\": _3, \"filegear-jp\": _3, \"filegear-sg\": _3, \"glitch\": _3, \"ravendb\": _3, \"lohmus\": _3, \"barsy\": _3, \"mcpe\": _3, \"mcdir\": _3, \"soundcast\": _3, \"tcp4\": _3, \"brasilia\": _3, \"ddns\": _3, \"dnsfor\": _3, \"hopto\": _3, \"loginto\": _3, \"noip\": _3, \"webhop\": _3, \"vp4\": _3, \"diskstation\": _3, \"dscloud\": _3, \"i234\": _3, \"myds\": _3, \"synology\": _3, \"transip\": _23, \"wedeploy\": _3, \"yombo\": _3, \"nohost\": _3 }], \"mg\": [1, { \"org\": _2, \"nom\": _2, \"gov\": _2, \"prd\": _2, \"tm\": _2, \"edu\": _2, \"mil\": _2, \"com\": _2, \"co\": _2 }], \"mh\": _2, \"mil\": _2, \"mk\": [1, { \"com\": _2, \"org\": _2, \"net\": _2, \"edu\": _2, \"gov\": _2, \"inf\": _2, \"name\": _2, \"blogspot\": _3 }], \"ml\": [1, { \"com\": _2, \"edu\": _2, \"gouv\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"presse\": _2 }], \"mm\": _8, \"mn\": [1, { \"gov\": _2, \"edu\": _2, \"org\": _2, \"nyc\": _3 }], \"mo\": _4, \"mobi\": [1, { \"barsy\": _3, \"dscloud\": _3 }], \"mp\": [1, { \"ju\": _3 }], \"mq\": _2, \"mr\": _34, \"ms\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"lab\": _3, \"minisite\": _3 }], \"mt\": [1, { \"com\": _6, \"edu\": _2, \"net\": _2, \"org\": _2 }], \"mu\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"ac\": _2, \"co\": _2, \"or\": _2 }], \"museum\": _2, \"mv\": [1, { \"aero\": _2, \"biz\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"museum\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 }], \"mw\": [1, { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"int\": _2, \"museum\": _2, \"net\": _2, \"org\": _2 }], \"mx\": [1, { \"com\": _2, \"org\": _2, \"gob\": _2, \"edu\": _2, \"net\": _2, \"blogspot\": _3 }], \"my\": [1, { \"biz\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"blogspot\": _3 }], \"mz\": [1, { \"ac\": _2, \"adv\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 }], \"na\": [1, { \"info\": _2, \"pro\": _2, \"name\": _2, \"school\": _2, \"or\": _2, \"dr\": _2, \"us\": _2, \"mx\": _2, \"ca\": _2, \"in\": _2, \"cc\": _2, \"tv\": _2, \"ws\": _2, \"mobi\": _2, \"co\": _2, \"com\": _2, \"org\": _2 }], \"name\": [1, { \"her\": _37, \"his\": _37 }], \"nc\": [1, { \"asso\": _2, \"nom\": _2 }], \"ne\": _2, \"net\": [1, { \"adobeaemcloud\": _3, \"adobeio-static\": _3, \"adobeioruntime\": _3, \"akadns\": _3, \"akamai\": _3, \"akamai-staging\": _3, \"akamaiedge\": _3, \"akamaiedge-staging\": _3, \"akamaihd\": _3, \"akamaihd-staging\": _3, \"akamaiorigin\": _3, \"akamaiorigin-staging\": _3, \"akamaized\": _3, \"akamaized-staging\": _3, \"edgekey\": _3, \"edgekey-staging\": _3, \"edgesuite\": _3, \"edgesuite-staging\": _3, \"alwaysdata\": _3, \"myamaze\": _3, \"cloudfront\": _3, \"t3l3p0rt\": _3, \"appudo\": _3, \"atlassian-dev\": [0, { \"prod\": [0, { \"cdn\": _3 }] }], \"myfritz\": _3, \"onavstack\": _3, \"shopselect\": _3, \"blackbaudcdn\": _3, \"boomla\": _3, \"bplaced\": _3, \"square7\": _3, \"gb\": _3, \"hu\": _3, \"jp\": _3, \"se\": _3, \"uk\": _3, \"in\": _3, \"clickrising\": _3, \"cloudaccess\": _3, \"cdn77-ssl\": _3, \"cdn77\": [0, { \"r\": _3 }], \"feste-ip\": _3, \"knx-server\": _3, \"static-access\": _3, \"cryptonomic\": _5, \"dattolocal\": _3, \"mydatto\": _3, \"debian\": _3, \"bitbridge\": _3, \"at-band-camp\": _3, \"blogdns\": _3, \"broke-it\": _3, \"buyshouses\": _3, \"dnsalias\": _3, \"dnsdojo\": _3, \"does-it\": _3, \"dontexist\": _3, \"dynalias\": _3, \"dynathome\": _3, \"endofinternet\": _3, \"from-az\": _3, \"from-co\": _3, \"from-la\": _3, \"from-ny\": _3, \"gets-it\": _3, \"ham-radio-op\": _3, \"homeftp\": _3, \"homeip\": _3, \"homelinux\": _3, \"homeunix\": _3, \"in-the-band\": _3, \"is-a-chef\": _3, \"is-a-geek\": _3, \"isa-geek\": _3, \"kicks-ass\": _3, \"office-on-the\": _3, \"podzone\": _3, \"scrapper-site\": _3, \"selfip\": _3, \"sells-it\": _3, \"servebbs\": _3, \"serveftp\": _3, \"thruhere\": _3, \"webhop\": _3, \"definima\": _3, \"casacam\": _3, \"dynu\": _3, \"dynv6\": _3, \"twmail\": _3, \"ru\": _3, \"channelsdvr\": [2, { \"u\": _3 }], \"fastlylb\": [2, { \"map\": _3 }], \"fastly\": [0, { \"freetls\": _3, \"map\": _3, \"prod\": [0, { \"a\": _3, \"global\": _3 }], \"ssl\": [0, { \"a\": _3, \"b\": _3, \"global\": _3 }] }], \"edgeapp\": _3, \"flynnhosting\": _3, \"cdn-edges\": _3, \"heteml\": _3, \"cloudfunctions\": _3, \"moonscale\": _3, \"in-dsl\": _3, \"in-vpn\": _3, \"ipifony\": _3, \"iobb\": _3, \"cloudjiffy\": [2, { \"fra1-de\": _3, \"west1-us\": _3 }], \"elastx\": [0, { \"jls-sto1\": _3, \"jls-sto2\": _3, \"jls-sto3\": _3 }], \"faststacks\": _3, \"massivegrid\": [0, { \"paas\": [0, { \"fr-1\": _3, \"lon-1\": _3, \"lon-2\": _3, \"ny-1\": _3, \"ny-2\": _3, \"sg-1\": _3 }] }], \"saveincloud\": [0, { \"jelastic\": _3, \"nordeste-idc\": _3 }], \"scaleforce\": _26, \"tsukaeru\": _27, \"kinghost\": _3, \"uni5\": _3, \"krellian\": _3, \"barsy\": _3, \"memset\": _3, \"azurewebsites\": _3, \"azure-mobile\": _3, \"cloudapp\": _3, \"azurestaticapps\": [2, { \"1\": _3, \"2\": _3, \"3\": _3, \"centralus\": _3, \"eastasia\": _3, \"eastus2\": _3, \"westeurope\": _3, \"westus2\": _3 }], \"dnsup\": _3, \"hicam\": _3, \"now-dns\": _3, \"ownip\": _3, \"vpndns\": _3, \"eating-organic\": _3, \"mydissent\": _3, \"myeffect\": _3, \"mymediapc\": _3, \"mypsx\": _3, \"mysecuritycamera\": _3, \"nhlfan\": _3, \"no-ip\": _3, \"pgafan\": _3, \"privatizehealthinsurance\": _3, \"bounceme\": _3, \"ddns\": _3, \"redirectme\": _3, \"serveblog\": _3, \"serveminecraft\": _3, \"sytes\": _3, \"cloudycluster\": _3, \"ovh\": [0, { \"webpaas\": _5, \"hosting\": _5 }], \"bar0\": _3, \"bar1\": _3, \"bar2\": _3, \"rackmaze\": _3, \"squares\": _3, \"schokokeks\": _3, \"firewall-gateway\": _3, \"seidat\": _3, \"senseering\": _3, \"siteleaf\": _3, \"vps-host\": [2, { \"jelastic\": [0, { \"atl\": _3, \"njs\": _3, \"ric\": _3 }] }], \"myspreadshop\": _3, \"srcf\": [0, { \"soc\": _3, \"user\": _3 }], \"supabase\": _3, \"dsmynas\": _3, \"familyds\": _3, \"tailscale\": [0, { \"beta\": _3 }], \"ts\": _3, \"torproject\": [2, { \"pages\": _3 }], \"reserve-online\": _3, \"community-pro\": _3, \"meinforum\": _3, \"yandexcloud\": [2, { \"storage\": _3, \"website\": _3 }], \"za\": _3 }], \"nf\": [1, { \"com\": _2, \"net\": _2, \"per\": _2, \"rec\": _2, \"web\": _2, \"arts\": _2, \"firm\": _2, \"info\": _2, \"other\": _2, \"store\": _2 }], \"ng\": [1, { \"com\": _6, \"edu\": _2, \"gov\": _2, \"i\": _2, \"mil\": _2, \"mobi\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"col\": _3, \"firm\": _3, \"gen\": _3, \"ltd\": _3, \"ngo\": _3 }], \"ni\": [1, { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gob\": _2, \"in\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"web\": _2 }], \"nl\": [1, { \"co\": _3, \"hosting-cluster\": _3, \"blogspot\": _3, \"gov\": _3, \"khplay\": _3, \"123website\": _3, \"myspreadshop\": _3, \"transurl\": _5, \"cistron\": _3, \"demon\": _3 }], \"no\": [1, { \"fhs\": _2, \"vgs\": _2, \"fylkesbibl\": _2, \"folkebibl\": _2, \"museum\": _2, \"idrett\": _2, \"priv\": _2, \"mil\": _2, \"stat\": _2, \"dep\": _2, \"kommune\": _2, \"herad\": _2, \"aa\": _38, \"ah\": _38, \"bu\": _38, \"fm\": _38, \"hl\": _38, \"hm\": _38, \"jan-mayen\": _38, \"mr\": _38, \"nl\": _38, \"nt\": _38, \"of\": _38, \"ol\": _38, \"oslo\": _38, \"rl\": _38, \"sf\": _38, \"st\": _38, \"svalbard\": _38, \"tm\": _38, \"tr\": _38, \"va\": _38, \"vf\": _38, \"akrehamn\": _2, \"xn--krehamn-dxa\": _2, \"åkrehamn\": _2, \"algard\": _2, \"xn--lgrd-poac\": _2, \"ålgård\": _2, \"arna\": _2, \"brumunddal\": _2, \"bryne\": _2, \"bronnoysund\": _2, \"xn--brnnysund-m8ac\": _2, \"brønnøysund\": _2, \"drobak\": _2, \"xn--drbak-wua\": _2, \"drøbak\": _2, \"egersund\": _2, \"fetsund\": _2, \"floro\": _2, \"xn--flor-jra\": _2, \"florø\": _2, \"fredrikstad\": _2, \"hokksund\": _2, \"honefoss\": _2, \"xn--hnefoss-q1a\": _2, \"hønefoss\": _2, \"jessheim\": _2, \"jorpeland\": _2, \"xn--jrpeland-54a\": _2, \"jørpeland\": _2, \"kirkenes\": _2, \"kopervik\": _2, \"krokstadelva\": _2, \"langevag\": _2, \"xn--langevg-jxa\": _2, \"langevåg\": _2, \"leirvik\": _2, \"mjondalen\": _2, \"xn--mjndalen-64a\": _2, \"mjøndalen\": _2, \"mo-i-rana\": _2, \"mosjoen\": _2, \"xn--mosjen-eya\": _2, \"mosjøen\": _2, \"nesoddtangen\": _2, \"orkanger\": _2, \"osoyro\": _2, \"xn--osyro-wua\": _2, \"osøyro\": _2, \"raholt\": _2, \"xn--rholt-mra\": _2, \"råholt\": _2, \"sandnessjoen\": _2, \"xn--sandnessjen-ogb\": _2, \"sandnessjøen\": _2, \"skedsmokorset\": _2, \"slattum\": _2, \"spjelkavik\": _2, \"stathelle\": _2, \"stavern\": _2, \"stjordalshalsen\": _2, \"xn--stjrdalshalsen-sqb\": _2, \"stjørdalshalsen\": _2, \"tananger\": _2, \"tranby\": _2, \"vossevangen\": _2, \"afjord\": _2, \"xn--fjord-lra\": _2, \"åfjord\": _2, \"agdenes\": _2, \"al\": _2, \"xn--l-1fa\": _2, \"ål\": _2, \"alesund\": _2, \"xn--lesund-hua\": _2, \"ålesund\": _2, \"alstahaug\": _2, \"alta\": _2, \"xn--lt-liac\": _2, \"áltá\": _2, \"alaheadju\": _2, \"xn--laheadju-7ya\": _2, \"álaheadju\": _2, \"alvdal\": _2, \"amli\": _2, \"xn--mli-tla\": _2, \"åmli\": _2, \"amot\": _2, \"xn--mot-tla\": _2, \"åmot\": _2, \"andebu\": _2, \"andoy\": _2, \"xn--andy-ira\": _2, \"andøy\": _2, \"andasuolo\": _2, \"ardal\": _2, \"xn--rdal-poa\": _2, \"årdal\": _2, \"aremark\": _2, \"arendal\": _2, \"xn--s-1fa\": _2, \"ås\": _2, \"aseral\": _2, \"xn--seral-lra\": _2, \"åseral\": _2, \"asker\": _2, \"askim\": _2, \"askvoll\": _2, \"askoy\": _2, \"xn--asky-ira\": _2, \"askøy\": _2, \"asnes\": _2, \"xn--snes-poa\": _2, \"åsnes\": _2, \"audnedaln\": _2, \"aukra\": _2, \"aure\": _2, \"aurland\": _2, \"aurskog-holand\": _2, \"xn--aurskog-hland-jnb\": _2, \"aurskog-høland\": _2, \"austevoll\": _2, \"austrheim\": _2, \"averoy\": _2, \"xn--avery-yua\": _2, \"averøy\": _2, \"balestrand\": _2, \"ballangen\": _2, \"balat\": _2, \"xn--blt-elab\": _2, \"bálát\": _2, \"balsfjord\": _2, \"bahccavuotna\": _2, \"xn--bhccavuotna-k7a\": _2, \"báhccavuotna\": _2, \"bamble\": _2, \"bardu\": _2, \"beardu\": _2, \"beiarn\": _2, \"bajddar\": _2, \"xn--bjddar-pta\": _2, \"bájddar\": _2, \"baidar\": _2, \"xn--bidr-5nac\": _2, \"báidár\": _2, \"berg\": _2, \"bergen\": _2, \"berlevag\": _2, \"xn--berlevg-jxa\": _2, \"berlevåg\": _2, \"bearalvahki\": _2, \"xn--bearalvhki-y4a\": _2, \"bearalváhki\": _2, \"bindal\": _2, \"birkenes\": _2, \"bjarkoy\": _2, \"xn--bjarky-fya\": _2, \"bjarkøy\": _2, \"bjerkreim\": _2, \"bjugn\": _2, \"bodo\": _2, \"xn--bod-2na\": _2, \"bodø\": _2, \"badaddja\": _2, \"xn--bdddj-mrabd\": _2, \"bådåddjå\": _2, \"budejju\": _2, \"bokn\": _2, \"bremanger\": _2, \"bronnoy\": _2, \"xn--brnny-wuac\": _2, \"brønnøy\": _2, \"bygland\": _2, \"bykle\": _2, \"barum\": _2, \"xn--brum-voa\": _2, \"bærum\": _2, \"telemark\": [0, { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2 }], \"nordland\": [0, { \"bo\": _2, \"xn--b-5ga\": _2, \"bø\": _2, \"heroy\": _2, \"xn--hery-ira\": _2, \"herøy\": _2 }], \"bievat\": _2, \"xn--bievt-0qa\": _2, \"bievát\": _2, \"bomlo\": _2, \"xn--bmlo-gra\": _2, \"bømlo\": _2, \"batsfjord\": _2, \"xn--btsfjord-9za\": _2, \"båtsfjord\": _2, \"bahcavuotna\": _2, \"xn--bhcavuotna-s4a\": _2, \"báhcavuotna\": _2, \"dovre\": _2, \"drammen\": _2, \"drangedal\": _2, \"dyroy\": _2, \"xn--dyry-ira\": _2, \"dyrøy\": _2, \"donna\": _2, \"xn--dnna-gra\": _2, \"dønna\": _2, \"eid\": _2, \"eidfjord\": _2, \"eidsberg\": _2, \"eidskog\": _2, \"eidsvoll\": _2, \"eigersund\": _2, \"elverum\": _2, \"enebakk\": _2, \"engerdal\": _2, \"etne\": _2, \"etnedal\": _2, \"evenes\": _2, \"evenassi\": _2, \"xn--eveni-0qa01ga\": _2, \"evenášši\": _2, \"evje-og-hornnes\": _2, \"farsund\": _2, \"fauske\": _2, \"fuossko\": _2, \"fuoisku\": _2, \"fedje\": _2, \"fet\": _2, \"finnoy\": _2, \"xn--finny-yua\": _2, \"finnøy\": _2, \"fitjar\": _2, \"fjaler\": _2, \"fjell\": _2, \"flakstad\": _2, \"flatanger\": _2, \"flekkefjord\": _2, \"flesberg\": _2, \"flora\": _2, \"fla\": _2, \"xn--fl-zia\": _2, \"flå\": _2, \"folldal\": _2, \"forsand\": _2, \"fosnes\": _2, \"frei\": _2, \"frogn\": _2, \"froland\": _2, \"frosta\": _2, \"frana\": _2, \"xn--frna-woa\": _2, \"fræna\": _2, \"froya\": _2, \"xn--frya-hra\": _2, \"frøya\": _2, \"fusa\": _2, \"fyresdal\": _2, \"forde\": _2, \"xn--frde-gra\": _2, \"førde\": _2, \"gamvik\": _2, \"gangaviika\": _2, \"xn--ggaviika-8ya47h\": _2, \"gáŋgaviika\": _2, \"gaular\": _2, \"gausdal\": _2, \"gildeskal\": _2, \"xn--gildeskl-g0a\": _2, \"gildeskål\": _2, \"giske\": _2, \"gjemnes\": _2, \"gjerdrum\": _2, \"gjerstad\": _2, \"gjesdal\": _2, \"gjovik\": _2, \"xn--gjvik-wua\": _2, \"gjøvik\": _2, \"gloppen\": _2, \"gol\": _2, \"gran\": _2, \"grane\": _2, \"granvin\": _2, \"gratangen\": _2, \"grimstad\": _2, \"grong\": _2, \"kraanghke\": _2, \"xn--kranghke-b0a\": _2, \"kråanghke\": _2, \"grue\": _2, \"gulen\": _2, \"hadsel\": _2, \"halden\": _2, \"halsa\": _2, \"hamar\": _2, \"hamaroy\": _2, \"habmer\": _2, \"xn--hbmer-xqa\": _2, \"hábmer\": _2, \"hapmir\": _2, \"xn--hpmir-xqa\": _2, \"hápmir\": _2, \"hammerfest\": _2, \"hammarfeasta\": _2, \"xn--hmmrfeasta-s4ac\": _2, \"hámmárfeasta\": _2, \"haram\": _2, \"hareid\": _2, \"harstad\": _2, \"hasvik\": _2, \"aknoluokta\": _2, \"xn--koluokta-7ya57h\": _2, \"ákŋoluokta\": _2, \"hattfjelldal\": _2, \"aarborte\": _2, \"haugesund\": _2, \"hemne\": _2, \"hemnes\": _2, \"hemsedal\": _2, \"more-og-romsdal\": [0, { \"heroy\": _2, \"sande\": _2 }], \"xn--mre-og-romsdal-qqb\": [0, { \"xn--hery-ira\": _2, \"sande\": _2 }], \"møre-og-romsdal\": [0, { \"herøy\": _2, \"sande\": _2 }], \"hitra\": _2, \"hjartdal\": _2, \"hjelmeland\": _2, \"hobol\": _2, \"xn--hobl-ira\": _2, \"hobøl\": _2, \"hof\": _2, \"hol\": _2, \"hole\": _2, \"holmestrand\": _2, \"holtalen\": _2, \"xn--holtlen-hxa\": _2, \"holtålen\": _2, \"hornindal\": _2, \"horten\": _2, \"hurdal\": _2, \"hurum\": _2, \"hvaler\": _2, \"hyllestad\": _2, \"hagebostad\": _2, \"xn--hgebostad-g3a\": _2, \"hægebostad\": _2, \"hoyanger\": _2, \"xn--hyanger-q1a\": _2, \"høyanger\": _2, \"hoylandet\": _2, \"xn--hylandet-54a\": _2, \"høylandet\": _2, \"ha\": _2, \"xn--h-2fa\": _2, \"hå\": _2, \"ibestad\": _2, \"inderoy\": _2, \"xn--indery-fya\": _2, \"inderøy\": _2, \"iveland\": _2, \"jevnaker\": _2, \"jondal\": _2, \"jolster\": _2, \"xn--jlster-bya\": _2, \"jølster\": _2, \"karasjok\": _2, \"karasjohka\": _2, \"xn--krjohka-hwab49j\": _2, \"kárášjohka\": _2, \"karlsoy\": _2, \"galsa\": _2, \"xn--gls-elac\": _2, \"gálsá\": _2, \"karmoy\": _2, \"xn--karmy-yua\": _2, \"karmøy\": _2, \"kautokeino\": _2, \"guovdageaidnu\": _2, \"klepp\": _2, \"klabu\": _2, \"xn--klbu-woa\": _2, \"klæbu\": _2, \"kongsberg\": _2, \"kongsvinger\": _2, \"kragero\": _2, \"xn--krager-gya\": _2, \"kragerø\": _2, \"kristiansand\": _2, \"kristiansund\": _2, \"krodsherad\": _2, \"xn--krdsherad-m8a\": _2, \"krødsherad\": _2, \"kvalsund\": _2, \"rahkkeravju\": _2, \"xn--rhkkervju-01af\": _2, \"ráhkkerávju\": _2, \"kvam\": _2, \"kvinesdal\": _2, \"kvinnherad\": _2, \"kviteseid\": _2, \"kvitsoy\": _2, \"xn--kvitsy-fya\": _2, \"kvitsøy\": _2, \"kvafjord\": _2, \"xn--kvfjord-nxa\": _2, \"kvæfjord\": _2, \"giehtavuoatna\": _2, \"kvanangen\": _2, \"xn--kvnangen-k0a\": _2, \"kvænangen\": _2, \"navuotna\": _2, \"xn--nvuotna-hwa\": _2, \"návuotna\": _2, \"kafjord\": _2, \"xn--kfjord-iua\": _2, \"kåfjord\": _2, \"gaivuotna\": _2, \"xn--givuotna-8ya\": _2, \"gáivuotna\": _2, \"larvik\": _2, \"lavangen\": _2, \"lavagis\": _2, \"loabat\": _2, \"xn--loabt-0qa\": _2, \"loabát\": _2, \"lebesby\": _2, \"davvesiida\": _2, \"leikanger\": _2, \"leirfjord\": _2, \"leka\": _2, \"leksvik\": _2, \"lenvik\": _2, \"leangaviika\": _2, \"xn--leagaviika-52b\": _2, \"leaŋgaviika\": _2, \"lesja\": _2, \"levanger\": _2, \"lier\": _2, \"lierne\": _2, \"lillehammer\": _2, \"lillesand\": _2, \"lindesnes\": _2, \"lindas\": _2, \"xn--linds-pra\": _2, \"lindås\": _2, \"lom\": _2, \"loppa\": _2, \"lahppi\": _2, \"xn--lhppi-xqa\": _2, \"láhppi\": _2, \"lund\": _2, \"lunner\": _2, \"luroy\": _2, \"xn--lury-ira\": _2, \"lurøy\": _2, \"luster\": _2, \"lyngdal\": _2, \"lyngen\": _2, \"ivgu\": _2, \"lardal\": _2, \"lerdal\": _2, \"xn--lrdal-sra\": _2, \"lærdal\": _2, \"lodingen\": _2, \"xn--ldingen-q1a\": _2, \"lødingen\": _2, \"lorenskog\": _2, \"xn--lrenskog-54a\": _2, \"lørenskog\": _2, \"loten\": _2, \"xn--lten-gra\": _2, \"løten\": _2, \"malvik\": _2, \"masoy\": _2, \"xn--msy-ula0h\": _2, \"måsøy\": _2, \"muosat\": _2, \"xn--muost-0qa\": _2, \"muosát\": _2, \"mandal\": _2, \"marker\": _2, \"marnardal\": _2, \"masfjorden\": _2, \"meland\": _2, \"meldal\": _2, \"melhus\": _2, \"meloy\": _2, \"xn--mely-ira\": _2, \"meløy\": _2, \"meraker\": _2, \"xn--merker-kua\": _2, \"meråker\": _2, \"moareke\": _2, \"xn--moreke-jua\": _2, \"moåreke\": _2, \"midsund\": _2, \"midtre-gauldal\": _2, \"modalen\": _2, \"modum\": _2, \"molde\": _2, \"moskenes\": _2, \"moss\": _2, \"mosvik\": _2, \"malselv\": _2, \"xn--mlselv-iua\": _2, \"målselv\": _2, \"malatvuopmi\": _2, \"xn--mlatvuopmi-s4a\": _2, \"málatvuopmi\": _2, \"namdalseid\": _2, \"aejrie\": _2, \"namsos\": _2, \"namsskogan\": _2, \"naamesjevuemie\": _2, \"xn--nmesjevuemie-tcba\": _2, \"nååmesjevuemie\": _2, \"laakesvuemie\": _2, \"nannestad\": _2, \"narvik\": _2, \"narviika\": _2, \"naustdal\": _2, \"nedre-eiker\": _2, \"akershus\": _39, \"buskerud\": _39, \"nesna\": _2, \"nesodden\": _2, \"nesseby\": _2, \"unjarga\": _2, \"xn--unjrga-rta\": _2, \"unjárga\": _2, \"nesset\": _2, \"nissedal\": _2, \"nittedal\": _2, \"nord-aurdal\": _2, \"nord-fron\": _2, \"nord-odal\": _2, \"norddal\": _2, \"nordkapp\": _2, \"davvenjarga\": _2, \"xn--davvenjrga-y4a\": _2, \"davvenjárga\": _2, \"nordre-land\": _2, \"nordreisa\": _2, \"raisa\": _2, \"xn--risa-5na\": _2, \"ráisa\": _2, \"nore-og-uvdal\": _2, \"notodden\": _2, \"naroy\": _2, \"xn--nry-yla5g\": _2, \"nærøy\": _2, \"notteroy\": _2, \"xn--nttery-byae\": _2, \"nøtterøy\": _2, \"odda\": _2, \"oksnes\": _2, \"xn--ksnes-uua\": _2, \"øksnes\": _2, \"oppdal\": _2, \"oppegard\": _2, \"xn--oppegrd-ixa\": _2, \"oppegård\": _2, \"orkdal\": _2, \"orland\": _2, \"xn--rland-uua\": _2, \"ørland\": _2, \"orskog\": _2, \"xn--rskog-uua\": _2, \"ørskog\": _2, \"orsta\": _2, \"xn--rsta-fra\": _2, \"ørsta\": _2, \"hedmark\": [0, { \"os\": _2, \"valer\": _2, \"xn--vler-qoa\": _2, \"våler\": _2 }], \"hordaland\": [0, { \"os\": _2 }], \"osen\": _2, \"osteroy\": _2, \"xn--ostery-fya\": _2, \"osterøy\": _2, \"ostre-toten\": _2, \"xn--stre-toten-zcb\": _2, \"østre-toten\": _2, \"overhalla\": _2, \"ovre-eiker\": _2, \"xn--vre-eiker-k8a\": _2, \"øvre-eiker\": _2, \"oyer\": _2, \"xn--yer-zna\": _2, \"øyer\": _2, \"oygarden\": _2, \"xn--ygarden-p1a\": _2, \"øygarden\": _2, \"oystre-slidre\": _2, \"xn--ystre-slidre-ujb\": _2, \"øystre-slidre\": _2, \"porsanger\": _2, \"porsangu\": _2, \"xn--porsgu-sta26f\": _2, \"porsáŋgu\": _2, \"porsgrunn\": _2, \"radoy\": _2, \"xn--rady-ira\": _2, \"radøy\": _2, \"rakkestad\": _2, \"rana\": _2, \"ruovat\": _2, \"randaberg\": _2, \"rauma\": _2, \"rendalen\": _2, \"rennebu\": _2, \"rennesoy\": _2, \"xn--rennesy-v1a\": _2, \"rennesøy\": _2, \"rindal\": _2, \"ringebu\": _2, \"ringerike\": _2, \"ringsaker\": _2, \"rissa\": _2, \"risor\": _2, \"xn--risr-ira\": _2, \"risør\": _2, \"roan\": _2, \"rollag\": _2, \"rygge\": _2, \"ralingen\": _2, \"xn--rlingen-mxa\": _2, \"rælingen\": _2, \"rodoy\": _2, \"xn--rdy-0nab\": _2, \"rødøy\": _2, \"romskog\": _2, \"xn--rmskog-bya\": _2, \"rømskog\": _2, \"roros\": _2, \"xn--rros-gra\": _2, \"røros\": _2, \"rost\": _2, \"xn--rst-0na\": _2, \"røst\": _2, \"royken\": _2, \"xn--ryken-vua\": _2, \"røyken\": _2, \"royrvik\": _2, \"xn--ryrvik-bya\": _2, \"røyrvik\": _2, \"rade\": _2, \"xn--rde-ula\": _2, \"råde\": _2, \"salangen\": _2, \"siellak\": _2, \"saltdal\": _2, \"salat\": _2, \"xn--slt-elab\": _2, \"sálát\": _2, \"xn--slat-5na\": _2, \"sálat\": _2, \"samnanger\": _2, \"vestfold\": [0, { \"sande\": _2 }], \"sandefjord\": _2, \"sandnes\": _2, \"sandoy\": _2, \"xn--sandy-yua\": _2, \"sandøy\": _2, \"sarpsborg\": _2, \"sauda\": _2, \"sauherad\": _2, \"sel\": _2, \"selbu\": _2, \"selje\": _2, \"seljord\": _2, \"sigdal\": _2, \"siljan\": _2, \"sirdal\": _2, \"skaun\": _2, \"skedsmo\": _2, \"ski\": _2, \"skien\": _2, \"skiptvet\": _2, \"skjervoy\": _2, \"xn--skjervy-v1a\": _2, \"skjervøy\": _2, \"skierva\": _2, \"xn--skierv-uta\": _2, \"skiervá\": _2, \"skjak\": _2, \"xn--skjk-soa\": _2, \"skjåk\": _2, \"skodje\": _2, \"skanland\": _2, \"xn--sknland-fxa\": _2, \"skånland\": _2, \"skanit\": _2, \"xn--sknit-yqa\": _2, \"skánit\": _2, \"smola\": _2, \"xn--smla-hra\": _2, \"smøla\": _2, \"snillfjord\": _2, \"snasa\": _2, \"xn--snsa-roa\": _2, \"snåsa\": _2, \"snoasa\": _2, \"snaase\": _2, \"xn--snase-nra\": _2, \"snåase\": _2, \"sogndal\": _2, \"sokndal\": _2, \"sola\": _2, \"solund\": _2, \"songdalen\": _2, \"sortland\": _2, \"spydeberg\": _2, \"stange\": _2, \"stavanger\": _2, \"steigen\": _2, \"steinkjer\": _2, \"stjordal\": _2, \"xn--stjrdal-s1a\": _2, \"stjørdal\": _2, \"stokke\": _2, \"stor-elvdal\": _2, \"stord\": _2, \"stordal\": _2, \"storfjord\": _2, \"omasvuotna\": _2, \"strand\": _2, \"stranda\": _2, \"stryn\": _2, \"sula\": _2, \"suldal\": _2, \"sund\": _2, \"sunndal\": _2, \"surnadal\": _2, \"sveio\": _2, \"svelvik\": _2, \"sykkylven\": _2, \"sogne\": _2, \"xn--sgne-gra\": _2, \"søgne\": _2, \"somna\": _2, \"xn--smna-gra\": _2, \"sømna\": _2, \"sondre-land\": _2, \"xn--sndre-land-0cb\": _2, \"søndre-land\": _2, \"sor-aurdal\": _2, \"xn--sr-aurdal-l8a\": _2, \"sør-aurdal\": _2, \"sor-fron\": _2, \"xn--sr-fron-q1a\": _2, \"sør-fron\": _2, \"sor-odal\": _2, \"xn--sr-odal-q1a\": _2, \"sør-odal\": _2, \"sor-varanger\": _2, \"xn--sr-varanger-ggb\": _2, \"sør-varanger\": _2, \"matta-varjjat\": _2, \"xn--mtta-vrjjat-k7af\": _2, \"mátta-várjjat\": _2, \"sorfold\": _2, \"xn--srfold-bya\": _2, \"sørfold\": _2, \"sorreisa\": _2, \"xn--srreisa-q1a\": _2, \"sørreisa\": _2, \"sorum\": _2, \"xn--srum-gra\": _2, \"sørum\": _2, \"tana\": _2, \"deatnu\": _2, \"time\": _2, \"tingvoll\": _2, \"tinn\": _2, \"tjeldsund\": _2, \"dielddanuorri\": _2, \"tjome\": _2, \"xn--tjme-hra\": _2, \"tjøme\": _2, \"tokke\": _2, \"tolga\": _2, \"torsken\": _2, \"tranoy\": _2, \"xn--trany-yua\": _2, \"tranøy\": _2, \"tromso\": _2, \"xn--troms-zua\": _2, \"tromsø\": _2, \"tromsa\": _2, \"romsa\": _2, \"trondheim\": _2, \"troandin\": _2, \"trysil\": _2, \"trana\": _2, \"xn--trna-woa\": _2, \"træna\": _2, \"trogstad\": _2, \"xn--trgstad-r1a\": _2, \"trøgstad\": _2, \"tvedestrand\": _2, \"tydal\": _2, \"tynset\": _2, \"tysfjord\": _2, \"divtasvuodna\": _2, \"divttasvuotna\": _2, \"tysnes\": _2, \"tysvar\": _2, \"xn--tysvr-vra\": _2, \"tysvær\": _2, \"tonsberg\": _2, \"xn--tnsberg-q1a\": _2, \"tønsberg\": _2, \"ullensaker\": _2, \"ullensvang\": _2, \"ulvik\": _2, \"utsira\": _2, \"vadso\": _2, \"xn--vads-jra\": _2, \"vadsø\": _2, \"cahcesuolo\": _2, \"xn--hcesuolo-7ya35b\": _2, \"čáhcesuolo\": _2, \"vaksdal\": _2, \"valle\": _2, \"vang\": _2, \"vanylven\": _2, \"vardo\": _2, \"xn--vard-jra\": _2, \"vardø\": _2, \"varggat\": _2, \"xn--vrggt-xqad\": _2, \"várggát\": _2, \"vefsn\": _2, \"vaapste\": _2, \"vega\": _2, \"vegarshei\": _2, \"xn--vegrshei-c0a\": _2, \"vegårshei\": _2, \"vennesla\": _2, \"verdal\": _2, \"verran\": _2, \"vestby\": _2, \"vestnes\": _2, \"vestre-slidre\": _2, \"vestre-toten\": _2, \"vestvagoy\": _2, \"xn--vestvgy-ixa6o\": _2, \"vestvågøy\": _2, \"vevelstad\": _2, \"vik\": _2, \"vikna\": _2, \"vindafjord\": _2, \"volda\": _2, \"voss\": _2, \"varoy\": _2, \"xn--vry-yla5g\": _2, \"værøy\": _2, \"vagan\": _2, \"xn--vgan-qoa\": _2, \"vågan\": _2, \"voagat\": _2, \"vagsoy\": _2, \"xn--vgsy-qoa0j\": _2, \"vågsøy\": _2, \"vaga\": _2, \"xn--vg-yiab\": _2, \"vågå\": _2, \"ostfold\": [0, { \"valer\": _2 }], \"xn--stfold-9xa\": [0, { \"xn--vler-qoa\": _2 }], \"østfold\": [0, { \"våler\": _2 }], \"co\": _3, \"blogspot\": _3, \"123hjemmeside\": _3, \"myspreadshop\": _3 }], \"np\": _8, \"nr\": _33, \"nu\": [1, { \"merseine\": _3, \"mine\": _3, \"shacknet\": _3, \"enterprisecloud\": _3 }], \"nz\": [1, { \"ac\": _2, \"co\": _6, \"cri\": _2, \"geek\": _2, \"gen\": _2, \"govt\": _2, \"health\": _2, \"iwi\": _2, \"kiwi\": _2, \"maori\": _2, \"mil\": _2, \"xn--mori-qsa\": _2, \"māori\": _2, \"net\": _2, \"org\": _2, \"parliament\": _2, \"school\": _2 }], \"om\": [1, { \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"med\": _2, \"museum\": _2, \"net\": _2, \"org\": _2, \"pro\": _2 }], \"onion\": _2, \"org\": [1, { \"altervista\": _3, \"amune\": [0, { \"tele\": _3 }], \"pimienta\": _3, \"poivron\": _3, \"potager\": _3, \"sweetpepper\": _3, \"ae\": _3, \"us\": _3, \"certmgr\": _3, \"cdn77\": [0, { \"c\": _3, \"rsc\": _3 }], \"cdn77-secure\": [0, { \"origin\": [0, { \"ssl\": _3 }] }], \"cloudns\": _3, \"duckdns\": _3, \"tunk\": _3, \"dyndns\": [2, { \"go\": _3, \"home\": _3 }], \"blogdns\": _3, \"blogsite\": _3, \"boldlygoingnowhere\": _3, \"dnsalias\": _3, \"dnsdojo\": _3, \"doesntexist\": _3, \"dontexist\": _3, \"doomdns\": _3, \"dvrdns\": _3, \"dynalias\": _3, \"endofinternet\": _3, \"endoftheinternet\": _3, \"from-me\": _3, \"game-host\": _3, \"gotdns\": _3, \"hobby-site\": _3, \"homedns\": _3, \"homeftp\": _3, \"homelinux\": _3, \"homeunix\": _3, \"is-a-bruinsfan\": _3, \"is-a-candidate\": _3, \"is-a-celticsfan\": _3, \"is-a-chef\": _3, \"is-a-geek\": _3, \"is-a-knight\": _3, \"is-a-linux-user\": _3, \"is-a-patsfan\": _3, \"is-a-soxfan\": _3, \"is-found\": _3, \"is-lost\": _3, \"is-saved\": _3, \"is-very-bad\": _3, \"is-very-evil\": _3, \"is-very-good\": _3, \"is-very-nice\": _3, \"is-very-sweet\": _3, \"isa-geek\": _3, \"kicks-ass\": _3, \"misconfused\": _3, \"podzone\": _3, \"readmyblog\": _3, \"selfip\": _3, \"sellsyourhome\": _3, \"servebbs\": _3, \"serveftp\": _3, \"servegame\": _3, \"stuff-4-sale\": _3, \"webhop\": _3, \"ddnss\": _3, \"accesscam\": _3, \"camdvr\": _3, \"freeddns\": _3, \"mywire\": _3, \"webredirect\": _3, \"eu\": [2, { \"al\": _3, \"asso\": _3, \"at\": _3, \"au\": _3, \"be\": _3, \"bg\": _3, \"ca\": _3, \"cd\": _3, \"ch\": _3, \"cn\": _3, \"cy\": _3, \"cz\": _3, \"de\": _3, \"dk\": _3, \"edu\": _3, \"ee\": _3, \"es\": _3, \"fi\": _3, \"fr\": _3, \"gr\": _3, \"hr\": _3, \"hu\": _3, \"ie\": _3, \"il\": _3, \"in\": _3, \"int\": _3, \"is\": _3, \"it\": _3, \"jp\": _3, \"kr\": _3, \"lt\": _3, \"lu\": _3, \"lv\": _3, \"mc\": _3, \"me\": _3, \"mk\": _3, \"mt\": _3, \"my\": _3, \"net\": _3, \"ng\": _3, \"nl\": _3, \"no\": _3, \"nz\": _3, \"paris\": _3, \"pl\": _3, \"pt\": _3, \"q-a\": _3, \"ro\": _3, \"ru\": _3, \"se\": _3, \"si\": _3, \"sk\": _3, \"tr\": _3, \"uk\": _3, \"us\": _3 }], \"twmail\": _3, \"fedorainfracloud\": _3, \"fedorapeople\": _3, \"fedoraproject\": [0, { \"cloud\": _3, \"os\": _21, \"stg\": [0, { \"os\": _21 }] }], \"freedesktop\": _3, \"hepforge\": _3, \"in-dsl\": _3, \"in-vpn\": _3, \"js\": _3, \"barsy\": _3, \"mayfirst\": _3, \"mozilla-iot\": _3, \"bmoattachments\": _3, \"dynserv\": _3, \"now-dns\": _3, \"cable-modem\": _3, \"collegefan\": _3, \"couchpotatofries\": _3, \"mlbfan\": _3, \"mysecuritycamera\": _3, \"nflfan\": _3, \"read-books\": _3, \"ufcfan\": _3, \"hopto\": _3, \"myftp\": _3, \"no-ip\": _3, \"zapto\": _3, \"httpbin\": _3, \"pubtls\": _3, \"jpn\": _3, \"my-firewall\": _3, \"myfirewall\": _3, \"spdns\": _3, \"small-web\": _3, \"dsmynas\": _3, \"familyds\": _3, \"teckids\": _12, \"tuxfamily\": _3, \"diskstation\": _3, \"hk\": _3, \"wmflabs\": _3, \"toolforge\": _3, \"wmcloud\": _3, \"za\": _3 }], \"pa\": [1, { \"ac\": _2, \"gob\": _2, \"com\": _2, \"org\": _2, \"sld\": _2, \"edu\": _2, \"net\": _2, \"ing\": _2, \"abo\": _2, \"med\": _2, \"nom\": _2 }], \"pe\": [1, { \"edu\": _2, \"gob\": _2, \"nom\": _2, \"mil\": _2, \"org\": _2, \"com\": _2, \"net\": _2, \"blogspot\": _3 }], \"pf\": [1, { \"com\": _2, \"org\": _2, \"edu\": _2 }], \"pg\": _8, \"ph\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"ngo\": _2, \"mil\": _2, \"i\": _2 }], \"pk\": [1, { \"com\": _2, \"net\": _2, \"edu\": _2, \"org\": _2, \"fam\": _2, \"biz\": _2, \"web\": _2, \"gov\": _2, \"gob\": _2, \"gok\": _2, \"gon\": _2, \"gop\": _2, \"gos\": _2, \"info\": _2 }], \"pl\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"aid\": _2, \"agro\": _2, \"atm\": _2, \"auto\": _2, \"biz\": _2, \"edu\": _2, \"gmina\": _2, \"gsm\": _2, \"info\": _2, \"mail\": _2, \"miasta\": _2, \"media\": _2, \"mil\": _2, \"nieruchomosci\": _2, \"nom\": _2, \"pc\": _2, \"powiat\": _2, \"priv\": _2, \"realestate\": _2, \"rel\": _2, \"sex\": _2, \"shop\": _2, \"sklep\": _2, \"sos\": _2, \"szkola\": _2, \"targi\": _2, \"tm\": _2, \"tourism\": _2, \"travel\": _2, \"turystyka\": _2, \"gov\": [1, { \"ap\": _2, \"griw\": _2, \"ic\": _2, \"is\": _2, \"kmpsp\": _2, \"konsulat\": _2, \"kppsp\": _2, \"kwp\": _2, \"kwpsp\": _2, \"mup\": _2, \"mw\": _2, \"oia\": _2, \"oirm\": _2, \"oke\": _2, \"oow\": _2, \"oschr\": _2, \"oum\": _2, \"pa\": _2, \"pinb\": _2, \"piw\": _2, \"po\": _2, \"pr\": _2, \"psp\": _2, \"psse\": _2, \"pup\": _2, \"rzgw\": _2, \"sa\": _2, \"sdn\": _2, \"sko\": _2, \"so\": _2, \"sr\": _2, \"starostwo\": _2, \"ug\": _2, \"ugim\": _2, \"um\": _2, \"umig\": _2, \"upow\": _2, \"uppo\": _2, \"us\": _2, \"uw\": _2, \"uzs\": _2, \"wif\": _2, \"wiih\": _2, \"winb\": _2, \"wios\": _2, \"witd\": _2, \"wiw\": _2, \"wkz\": _2, \"wsa\": _2, \"wskr\": _2, \"wsse\": _2, \"wuoz\": _2, \"wzmiuw\": _2, \"zp\": _2, \"zpisdn\": _2 }], \"augustow\": _2, \"babia-gora\": _2, \"bedzin\": _2, \"beskidy\": _2, \"bialowieza\": _2, \"bialystok\": _2, \"bielawa\": _2, \"bieszczady\": _2, \"boleslawiec\": _2, \"bydgoszcz\": _2, \"bytom\": _2, \"cieszyn\": _2, \"czeladz\": _2, \"czest\": _2, \"dlugoleka\": _2, \"elblag\": _2, \"elk\": _2, \"glogow\": _2, \"gniezno\": _2, \"gorlice\": _2, \"grajewo\": _2, \"ilawa\": _2, \"jaworzno\": _2, \"jelenia-gora\": _2, \"jgora\": _2, \"kalisz\": _2, \"kazimierz-dolny\": _2, \"karpacz\": _2, \"kartuzy\": _2, \"kaszuby\": _2, \"katowice\": _2, \"kepno\": _2, \"ketrzyn\": _2, \"klodzko\": _2, \"kobierzyce\": _2, \"kolobrzeg\": _2, \"konin\": _2, \"konskowola\": _2, \"kutno\": _2, \"lapy\": _2, \"lebork\": _2, \"legnica\": _2, \"lezajsk\": _2, \"limanowa\": _2, \"lomza\": _2, \"lowicz\": _2, \"lubin\": _2, \"lukow\": _2, \"malbork\": _2, \"malopolska\": _2, \"mazowsze\": _2, \"mazury\": _2, \"mielec\": _2, \"mielno\": _2, \"mragowo\": _2, \"naklo\": _2, \"nowaruda\": _2, \"nysa\": _2, \"olawa\": _2, \"olecko\": _2, \"olkusz\": _2, \"olsztyn\": _2, \"opoczno\": _2, \"opole\": _2, \"ostroda\": _2, \"ostroleka\": _2, \"ostrowiec\": _2, \"ostrowwlkp\": _2, \"pila\": _2, \"pisz\": _2, \"podhale\": _2, \"podlasie\": _2, \"polkowice\": _2, \"pomorze\": _2, \"pomorskie\": _2, \"prochowice\": _2, \"pruszkow\": _2, \"przeworsk\": _2, \"pulawy\": _2, \"radom\": _2, \"rawa-maz\": _2, \"rybnik\": _2, \"rzeszow\": _2, \"sanok\": _2, \"sejny\": _2, \"slask\": _2, \"slupsk\": _2, \"sosnowiec\": _2, \"stalowa-wola\": _2, \"skoczow\": _2, \"starachowice\": _2, \"stargard\": _2, \"suwalki\": _2, \"swidnica\": _2, \"swiebodzin\": _2, \"swinoujscie\": _2, \"szczecin\": _2, \"szczytno\": _2, \"tarnobrzeg\": _2, \"tgory\": _2, \"turek\": _2, \"tychy\": _2, \"ustka\": _2, \"walbrzych\": _2, \"warmia\": _2, \"warszawa\": _2, \"waw\": _2, \"wegrow\": _2, \"wielun\": _2, \"wlocl\": _2, \"wloclawek\": _2, \"wodzislaw\": _2, \"wolomin\": _2, \"wroclaw\": _2, \"zachpomor\": _2, \"zagan\": _2, \"zarow\": _2, \"zgora\": _2, \"zgorzelec\": _2, \"beep\": _3, \"ecommerce-shop\": _3, \"shoparena\": _3, \"homesklep\": _3, \"sdscloud\": _3, \"unicloud\": _3, \"krasnik\": _3, \"leczna\": _3, \"lubartow\": _3, \"lublin\": _3, \"poniatowa\": _3, \"swidnik\": _3, \"co\": _3, \"simplesite\": _3, \"art\": _3, \"gliwice\": _3, \"krakow\": _3, \"poznan\": _3, \"wroc\": _3, \"zakopane\": _3, \"myspreadshop\": _3, \"gda\": _3, \"gdansk\": _3, \"gdynia\": _3, \"med\": _3, \"sopot\": _3 }], \"pm\": [1, { \"own\": _3, \"name\": _3 }], \"pn\": [1, { \"gov\": _2, \"co\": _2, \"org\": _2, \"edu\": _2, \"net\": _2 }], \"post\": _2, \"pr\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"isla\": _2, \"pro\": _2, \"biz\": _2, \"info\": _2, \"name\": _2, \"est\": _2, \"prof\": _2, \"ac\": _2 }], \"pro\": [1, { \"aaa\": _2, \"aca\": _2, \"acct\": _2, \"avocat\": _2, \"bar\": _2, \"cpa\": _2, \"eng\": _2, \"jur\": _2, \"law\": _2, \"med\": _2, \"recht\": _2, \"cloudns\": _3, \"dnstrace\": [0, { \"bci\": _3 }], \"barsy\": _3 }], \"ps\": [1, { \"edu\": _2, \"gov\": _2, \"sec\": _2, \"plo\": _2, \"com\": _2, \"org\": _2, \"net\": _2 }], \"pt\": [1, { \"net\": _2, \"gov\": _2, \"org\": _2, \"edu\": _2, \"int\": _2, \"publ\": _2, \"com\": _2, \"nome\": _2, \"blogspot\": _3, \"123paginaweb\": _3 }], \"pw\": [1, { \"co\": _2, \"ne\": _2, \"or\": _2, \"ed\": _2, \"go\": _2, \"belau\": _2, \"cloudns\": _3, \"x443\": _3 }], \"py\": [1, { \"com\": _2, \"coop\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 }], \"qa\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"sch\": _2, \"blogspot\": _3 }], \"re\": [1, { \"asso\": _2, \"com\": _2, \"nom\": _2, \"blogspot\": _3 }], \"ro\": [1, { \"arts\": _2, \"com\": _2, \"firm\": _2, \"info\": _2, \"nom\": _2, \"nt\": _2, \"org\": _2, \"rec\": _2, \"store\": _2, \"tm\": _2, \"www\": _2, \"co\": _3, \"shop\": _3, \"blogspot\": _3, \"barsy\": _3 }], \"rs\": [1, { \"ac\": _2, \"co\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"org\": _2, \"brendly\": [0, { \"shop\": _3 }], \"blogspot\": _3, \"ua\": _3, \"ox\": _3 }], \"ru\": [1, { \"ac\": _3, \"edu\": _3, \"gov\": _3, \"int\": _3, \"mil\": _3, \"test\": _3, \"eurodir\": _3, \"adygeya\": _3, \"bashkiria\": _3, \"bir\": _3, \"cbg\": _3, \"com\": _3, \"dagestan\": _3, \"grozny\": _3, \"kalmykia\": _3, \"kustanai\": _3, \"marine\": _3, \"mordovia\": _3, \"msk\": _3, \"mytis\": _3, \"nalchik\": _3, \"nov\": _3, \"pyatigorsk\": _3, \"spb\": _3, \"vladikavkaz\": _3, \"vladimir\": _3, \"blogspot\": _3, \"na4u\": _3, \"mircloud\": _3, \"regruhosting\": _27, \"myjino\": [2, { \"hosting\": _5, \"landing\": _5, \"spectrum\": _5, \"vps\": _5 }], \"cldmail\": [0, { \"hb\": _3 }], \"mcdir\": [2, { \"vps\": _3 }], \"mcpre\": _3, \"net\": _3, \"org\": _3, \"pp\": _3, \"123sait\": _3, \"lk3\": _3, \"ras\": _3 }], \"rw\": [1, { \"ac\": _2, \"co\": _2, \"coop\": _2, \"gov\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 }], \"sa\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"med\": _2, \"pub\": _2, \"edu\": _2, \"sch\": _2 }], \"sb\": _4, \"sc\": _4, \"sd\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"med\": _2, \"tv\": _2, \"gov\": _2, \"info\": _2 }], \"se\": [1, { \"a\": _2, \"ac\": _2, \"b\": _2, \"bd\": _2, \"brand\": _2, \"c\": _2, \"d\": _2, \"e\": _2, \"f\": _2, \"fh\": _2, \"fhsk\": _2, \"fhv\": _2, \"g\": _2, \"h\": _2, \"i\": _2, \"k\": _2, \"komforb\": _2, \"kommunalforbund\": _2, \"komvux\": _2, \"l\": _2, \"lanbib\": _2, \"m\": _2, \"n\": _2, \"naturbruksgymn\": _2, \"o\": _2, \"org\": _2, \"p\": _2, \"parti\": _2, \"pp\": _2, \"press\": _2, \"r\": _2, \"s\": _2, \"t\": _2, \"tm\": _2, \"u\": _2, \"w\": _2, \"x\": _2, \"y\": _2, \"z\": _2, \"com\": _3, \"blogspot\": _3, \"conf\": _3, \"iopsys\": _3, \"123minsida\": _3, \"itcouldbewor\": _3, \"myspreadshop\": _3, \"paba\": [0, { \"su\": _3 }] }], \"sg\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"per\": _2, \"blogspot\": _3, \"enscaled\": _3 }], \"sh\": [1, { \"com\": _2, \"net\": _2, \"gov\": _2, \"org\": _2, \"mil\": _2, \"bip\": _3, \"hashbang\": _3, \"platform\": [0, { \"bc\": _3, \"ent\": _3, \"eu\": _3, \"us\": _3 }], \"now\": _3, \"vxl\": _3, \"wedeploy\": _3 }], \"si\": [1, { \"gitapp\": _3, \"gitpage\": _3, \"blogspot\": _3 }], \"sj\": _2, \"sk\": _6, \"sl\": _4, \"sm\": _2, \"sn\": [1, { \"art\": _2, \"com\": _2, \"edu\": _2, \"gouv\": _2, \"org\": _2, \"perso\": _2, \"univ\": _2, \"blogspot\": _3 }], \"so\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"me\": _2, \"net\": _2, \"org\": _2, \"sch\": _3 }], \"sr\": _2, \"ss\": [1, { \"biz\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"me\": _2, \"net\": _2, \"org\": _2, \"sch\": _2 }], \"st\": [1, { \"co\": _2, \"com\": _2, \"consulado\": _2, \"edu\": _2, \"embaixada\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"principe\": _2, \"saotome\": _2, \"store\": _2, \"kirara\": _3, \"noho\": _3 }], \"su\": [1, { \"abkhazia\": _3, \"adygeya\": _3, \"aktyubinsk\": _3, \"arkhangelsk\": _3, \"armenia\": _3, \"ashgabad\": _3, \"azerbaijan\": _3, \"balashov\": _3, \"bashkiria\": _3, \"bryansk\": _3, \"bukhara\": _3, \"chimkent\": _3, \"dagestan\": _3, \"east-kazakhstan\": _3, \"exnet\": _3, \"georgia\": _3, \"grozny\": _3, \"ivanovo\": _3, \"jambyl\": _3, \"kalmykia\": _3, \"kaluga\": _3, \"karacol\": _3, \"karaganda\": _3, \"karelia\": _3, \"khakassia\": _3, \"krasnodar\": _3, \"kurgan\": _3, \"kustanai\": _3, \"lenug\": _3, \"mangyshlak\": _3, \"mordovia\": _3, \"msk\": _3, \"murmansk\": _3, \"nalchik\": _3, \"navoi\": _3, \"north-kazakhstan\": _3, \"nov\": _3, \"obninsk\": _3, \"penza\": _3, \"pokrovsk\": _3, \"sochi\": _3, \"spb\": _3, \"tashkent\": _3, \"termez\": _3, \"togliatti\": _3, \"troitsk\": _3, \"tselinograd\": _3, \"tula\": _3, \"tuva\": _3, \"vladikavkaz\": _3, \"vladimir\": _3, \"vologda\": _3 }], \"sv\": [1, { \"com\": _2, \"edu\": _2, \"gob\": _2, \"org\": _2, \"red\": _2 }], \"sx\": _7, \"sy\": _32, \"sz\": [1, { \"co\": _2, \"ac\": _2, \"org\": _2 }], \"tc\": [1, { \"ch\": _3, \"me\": _3, \"we\": _3 }], \"td\": _6, \"tel\": _2, \"tf\": [1, { \"sch\": _3 }], \"tg\": _2, \"th\": [1, { \"ac\": _2, \"co\": _2, \"go\": _2, \"in\": _2, \"mi\": _2, \"net\": _2, \"or\": _2, \"online\": _3, \"shop\": _3 }], \"tj\": [1, { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"go\": _2, \"gov\": _2, \"int\": _2, \"mil\": _2, \"name\": _2, \"net\": _2, \"nic\": _2, \"org\": _2, \"test\": _2, \"web\": _2 }], \"tk\": _2, \"tl\": _7, \"tm\": [1, { \"com\": _2, \"co\": _2, \"org\": _2, \"net\": _2, \"nom\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2 }], \"tn\": [1, { \"com\": _2, \"ens\": _2, \"fin\": _2, \"gov\": _2, \"ind\": _2, \"info\": _2, \"intl\": _2, \"mincom\": _2, \"nat\": _2, \"net\": _2, \"org\": _2, \"perso\": _2, \"tourism\": _2, \"orangecloud\": _3 }], \"to\": [1, { \"611\": _3, \"com\": _2, \"gov\": _2, \"net\": _2, \"org\": _2, \"edu\": _2, \"mil\": _2, \"oya\": _3, \"rdv\": _3, \"x0\": _3, \"vpnplus\": _3, \"quickconnect\": _13, \"nyan\": _3 }], \"tr\": [1, { \"av\": _2, \"bbs\": _2, \"bel\": _2, \"biz\": _2, \"com\": _6, \"dr\": _2, \"edu\": _2, \"gen\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"k12\": _2, \"kep\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pol\": _2, \"tel\": _2, \"tsk\": _2, \"tv\": _2, \"web\": _2, \"nc\": _7 }], \"tt\": [1, { \"co\": _2, \"com\": _2, \"org\": _2, \"net\": _2, \"biz\": _2, \"info\": _2, \"pro\": _2, \"int\": _2, \"coop\": _2, \"jobs\": _2, \"mobi\": _2, \"travel\": _2, \"museum\": _2, \"aero\": _2, \"name\": _2, \"gov\": _2, \"edu\": _2 }], \"tv\": [1, { \"dyndns\": _3, \"better-than\": _3, \"on-the-web\": _3, \"worse-than\": _3, \"from\": _3, \"sakura\": _3 }], \"tw\": [1, { \"edu\": _2, \"gov\": _2, \"mil\": _2, \"com\": [1, { \"mymailer\": _3 }], \"net\": _2, \"org\": _2, \"idv\": _2, \"game\": _2, \"ebiz\": _2, \"club\": _2, \"xn--zf0ao64a\": _2, \"網路\": _2, \"xn--uc0atv\": _2, \"組織\": _2, \"xn--czrw28b\": _2, \"商業\": _2, \"url\": _3, \"blogspot\": _3 }], \"tz\": [1, { \"ac\": _2, \"co\": _2, \"go\": _2, \"hotel\": _2, \"info\": _2, \"me\": _2, \"mil\": _2, \"mobi\": _2, \"ne\": _2, \"or\": _2, \"sc\": _2, \"tv\": _2 }], \"ua\": [1, { \"com\": _2, \"edu\": _2, \"gov\": _2, \"in\": _2, \"net\": _2, \"org\": _2, \"cherkassy\": _2, \"cherkasy\": _2, \"chernigov\": _2, \"chernihiv\": _2, \"chernivtsi\": _2, \"chernovtsy\": _2, \"ck\": _2, \"cn\": _2, \"cr\": _2, \"crimea\": _2, \"cv\": _2, \"dn\": _2, \"dnepropetrovsk\": _2, \"dnipropetrovsk\": _2, \"donetsk\": _2, \"dp\": _2, \"if\": _2, \"ivano-frankivsk\": _2, \"kh\": _2, \"kharkiv\": _2, \"kharkov\": _2, \"kherson\": _2, \"khmelnitskiy\": _2, \"khmelnytskyi\": _2, \"kiev\": _2, \"kirovograd\": _2, \"km\": _2, \"kr\": _2, \"kropyvnytskyi\": _2, \"krym\": _2, \"ks\": _2, \"kv\": _2, \"kyiv\": _2, \"lg\": _2, \"lt\": _2, \"lugansk\": _2, \"lutsk\": _2, \"lv\": _2, \"lviv\": _2, \"mk\": _2, \"mykolaiv\": _2, \"nikolaev\": _2, \"od\": _2, \"odesa\": _2, \"odessa\": _2, \"pl\": _2, \"poltava\": _2, \"rivne\": _2, \"rovno\": _2, \"rv\": _2, \"sb\": _2, \"sebastopol\": _2, \"sevastopol\": _2, \"sm\": _2, \"sumy\": _2, \"te\": _2, \"ternopil\": _2, \"uz\": _2, \"uzhgorod\": _2, \"vinnica\": _2, \"vinnytsia\": _2, \"vn\": _2, \"volyn\": _2, \"yalta\": _2, \"zaporizhzhe\": _2, \"zaporizhzhia\": _2, \"zhitomir\": _2, \"zhytomyr\": _2, \"zp\": _2, \"zt\": _2, \"cc\": _3, \"inf\": _3, \"ltd\": _3, \"cx\": _3, \"ie\": _3, \"biz\": _3, \"co\": _3, \"pp\": _3, \"v\": _3 }], \"ug\": [1, { \"co\": _2, \"or\": _2, \"ac\": _2, \"sc\": _2, \"go\": _2, \"ne\": _2, \"com\": _2, \"org\": _2, \"blogspot\": _3 }], \"uk\": [1, { \"ac\": _2, \"co\": [1, { \"bytemark\": [0, { \"dh\": _3, \"vm\": _3 }], \"blogspot\": _3, \"layershift\": _26, \"barsy\": _3, \"barsyonline\": _3, \"retrosnub\": _31, \"nh-serv\": _3, \"no-ip\": _3, \"wellbeingzone\": _3, \"adimo\": _3, \"myspreadshop\": _3 }], \"gov\": [1, { \"campaign\": _3, \"service\": _3, \"api\": _3, \"homeoffice\": _3 }], \"ltd\": _2, \"me\": _2, \"net\": _2, \"nhs\": _2, \"org\": [1, { \"glug\": _3, \"lug\": _3, \"lugs\": _3, \"affinitylottery\": _3, \"raffleentry\": _3, \"weeklylottery\": _3 }], \"plc\": _2, \"police\": _2, \"sch\": _8, \"conn\": _3, \"copro\": _3, \"hosp\": _3, \"independent-commission\": _3, \"independent-inquest\": _3, \"independent-inquiry\": _3, \"independent-panel\": _3, \"independent-review\": _3, \"public-inquiry\": _3, \"royal-commission\": _3, \"pymnt\": _3, \"barsy\": _3 }], \"us\": [1, { \"dni\": _2, \"fed\": _2, \"isa\": _2, \"kids\": _2, \"nsn\": _2, \"ak\": _40, \"al\": _40, \"ar\": _40, \"as\": _40, \"az\": _40, \"ca\": _40, \"co\": _40, \"ct\": _40, \"dc\": _40, \"de\": [1, { \"k12\": _2, \"cc\": _2, \"lib\": _3 }], \"fl\": _40, \"ga\": _40, \"gu\": _40, \"hi\": _41, \"ia\": _40, \"id\": _40, \"il\": _40, \"in\": _40, \"ks\": _40, \"ky\": _40, \"la\": _40, \"ma\": [1, { \"k12\": [1, { \"pvt\": _2, \"chtr\": _2, \"paroch\": _2 }], \"cc\": _2, \"lib\": _2 }], \"md\": _40, \"me\": _40, \"mi\": [1, { \"k12\": _2, \"cc\": _2, \"lib\": _2, \"ann-arbor\": _2, \"cog\": _2, \"dst\": _2, \"eaton\": _2, \"gen\": _2, \"mus\": _2, \"tec\": _2, \"washtenaw\": _2 }], \"mn\": _40, \"mo\": _40, \"ms\": _40, \"mt\": _40, \"nc\": _40, \"nd\": _41, \"ne\": _40, \"nh\": _40, \"nj\": _40, \"nm\": _40, \"nv\": _40, \"ny\": _40, \"oh\": _40, \"ok\": _40, \"or\": _40, \"pa\": _40, \"pr\": _40, \"ri\": _41, \"sc\": _40, \"sd\": _41, \"tn\": _40, \"tx\": _40, \"ut\": _40, \"vi\": _40, \"vt\": _40, \"va\": _40, \"wa\": _40, \"wi\": _40, \"wv\": [1, { \"cc\": _2 }], \"wy\": _40, \"graphox\": _3, \"cloudns\": _3, \"drud\": _3, \"is-by\": _3, \"land-4-sale\": _3, \"stuff-4-sale\": _3, \"enscaled\": [0, { \"phx\": _3 }], \"mircloud\": _3, \"freeddns\": _3, \"golffan\": _3, \"noip\": _3, \"pointto\": _3, \"platterp\": _3 }], \"uy\": [1, { \"com\": _6, \"edu\": _2, \"gub\": _2, \"mil\": _2, \"net\": _2, \"org\": _2 }], \"uz\": [1, { \"co\": _2, \"com\": _2, \"net\": _2, \"org\": _2 }], \"va\": _2, \"vc\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"mil\": _2, \"edu\": _2, \"gv\": [2, { \"d\": _3 }], \"0e\": _3 }], \"ve\": [1, { \"arts\": _2, \"bib\": _2, \"co\": _2, \"com\": _2, \"e12\": _2, \"edu\": _2, \"firm\": _2, \"gob\": _2, \"gov\": _2, \"info\": _2, \"int\": _2, \"mil\": _2, \"net\": _2, \"nom\": _2, \"org\": _2, \"rar\": _2, \"rec\": _2, \"store\": _2, \"tec\": _2, \"web\": _2 }], \"vg\": [1, { \"at\": _3 }], \"vi\": [1, { \"co\": _2, \"com\": _2, \"k12\": _2, \"net\": _2, \"org\": _2 }], \"vn\": [1, { \"ac\": _2, \"ai\": _2, \"biz\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"health\": _2, \"id\": _2, \"info\": _2, \"int\": _2, \"io\": _2, \"name\": _2, \"net\": _2, \"org\": _2, \"pro\": _2, \"angiang\": _2, \"bacgiang\": _2, \"backan\": _2, \"baclieu\": _2, \"bacninh\": _2, \"baria-vungtau\": _2, \"bentre\": _2, \"binhdinh\": _2, \"binhduong\": _2, \"binhphuoc\": _2, \"binhthuan\": _2, \"camau\": _2, \"cantho\": _2, \"caobang\": _2, \"daklak\": _2, \"daknong\": _2, \"danang\": _2, \"dienbien\": _2, \"dongnai\": _2, \"dongthap\": _2, \"gialai\": _2, \"hagiang\": _2, \"haiduong\": _2, \"haiphong\": _2, \"hanam\": _2, \"hanoi\": _2, \"hatinh\": _2, \"haugiang\": _2, \"hoabinh\": _2, \"hungyen\": _2, \"khanhhoa\": _2, \"kiengiang\": _2, \"kontum\": _2, \"laichau\": _2, \"lamdong\": _2, \"langson\": _2, \"laocai\": _2, \"longan\": _2, \"namdinh\": _2, \"nghean\": _2, \"ninhbinh\": _2, \"ninhthuan\": _2, \"phutho\": _2, \"phuyen\": _2, \"quangbinh\": _2, \"quangnam\": _2, \"quangngai\": _2, \"quangninh\": _2, \"quangtri\": _2, \"soctrang\": _2, \"sonla\": _2, \"tayninh\": _2, \"thaibinh\": _2, \"thainguyen\": _2, \"thanhhoa\": _2, \"thanhphohochiminh\": _2, \"thuathienhue\": _2, \"tiengiang\": _2, \"travinh\": _2, \"tuyenquang\": _2, \"vinhlong\": _2, \"vinhphuc\": _2, \"yenbai\": _2, \"blogspot\": _3 }], \"vu\": [1, { \"com\": _2, \"edu\": _2, \"net\": _2, \"org\": _2, \"cn\": _3, \"blog\": _3, \"dev\": _3, \"me\": _3 }], \"wf\": [1, { \"biz\": _3, \"sch\": _3 }], \"ws\": [1, { \"com\": _2, \"net\": _2, \"org\": _2, \"gov\": _2, \"edu\": _2, \"advisor\": _5, \"cloud66\": _3, \"dyndns\": _3, \"mypets\": _3 }], \"yt\": [1, { \"org\": _3 }], \"xn--mgbaam7a8h\": _2, \"امارات\": _2, \"xn--y9a3aq\": _2, \"հայ\": _2, \"xn--54b7fta0cc\": _2, \"বাংলা\": _2, \"xn--90ae\": _2, \"бг\": _2, \"xn--mgbcpq6gpa1a\": _2, \"البحرين\": _2, \"xn--90ais\": _2, \"бел\": _2, \"xn--fiqs8s\": _2, \"中国\": _2, \"xn--fiqz9s\": _2, \"中國\": _2, \"xn--lgbbat1ad8j\": _2, \"الجزائر\": _2, \"xn--wgbh1c\": _2, \"مصر\": _2, \"xn--e1a4c\": _2, \"ею\": _2, \"xn--qxa6a\": _2, \"ευ\": _2, \"xn--mgbah1a3hjkrd\": _2, \"موريتانيا\": _2, \"xn--node\": _2, \"გე\": _2, \"xn--qxam\": _2, \"ελ\": _2, \"xn--j6w193g\": [1, { \"xn--55qx5d\": _2, \"xn--wcvs22d\": _2, \"xn--mxtq1m\": _2, \"xn--gmqw5a\": _2, \"xn--od0alg\": _2, \"xn--uc0atv\": _2 }], \"香港\": [1, { \"公司\": _2, \"教育\": _2, \"政府\": _2, \"個人\": _2, \"網絡\": _2, \"組織\": _2 }], \"xn--2scrj9c\": _2, \"ಭಾರತ\": _2, \"xn--3hcrj9c\": _2, \"ଭାରତ\": _2, \"xn--45br5cyl\": _2, \"ভাৰত\": _2, \"xn--h2breg3eve\": _2, \"भारतम्\": _2, \"xn--h2brj9c8c\": _2, \"भारोत\": _2, \"xn--mgbgu82a\": _2, \"ڀارت\": _2, \"xn--rvc1e0am3e\": _2, \"ഭാരതം\": _2, \"xn--h2brj9c\": _2, \"भारत\": _2, \"xn--mgbbh1a\": _2, \"بارت\": _2, \"xn--mgbbh1a71e\": _2, \"بھارت\": _2, \"xn--fpcrj9c3d\": _2, \"భారత్\": _2, \"xn--gecrj9c\": _2, \"ભારત\": _2, \"xn--s9brj9c\": _2, \"ਭਾਰਤ\": _2, \"xn--45brj9c\": _2, \"ভারত\": _2, \"xn--xkc2dl3a5ee0h\": _2, \"இந்தியா\": _2, \"xn--mgba3a4f16a\": _2, \"ایران\": _2, \"xn--mgba3a4fra\": _2, \"ايران\": _2, \"xn--mgbtx2b\": _2, \"عراق\": _2, \"xn--mgbayh7gpa\": _2, \"الاردن\": _2, \"xn--3e0b707e\": _2, \"한국\": _2, \"xn--80ao21a\": _2, \"қаз\": _2, \"xn--q7ce6a\": _2, \"ລາວ\": _2, \"xn--fzc2c9e2c\": _2, \"ලංකා\": _2, \"xn--xkc2al3hye2a\": _2, \"இலங்கை\": _2, \"xn--mgbc0a9azcg\": _2, \"المغرب\": _2, \"xn--d1alf\": _2, \"мкд\": _2, \"xn--l1acc\": _2, \"мон\": _2, \"xn--mix891f\": _2, \"澳門\": _2, \"xn--mix082f\": _2, \"澳门\": _2, \"xn--mgbx4cd0ab\": _2, \"مليسيا\": _2, \"xn--mgb9awbf\": _2, \"عمان\": _2, \"xn--mgbai9azgqp6j\": _2, \"پاکستان\": _2, \"xn--mgbai9a5eva00b\": _2, \"پاكستان\": _2, \"xn--ygbi2ammx\": _2, \"فلسطين\": _2, \"xn--90a3ac\": [1, { \"xn--o1ac\": _2, \"xn--c1avg\": _2, \"xn--90azh\": _2, \"xn--d1at\": _2, \"xn--o1ach\": _2, \"xn--80au\": _2 }], \"срб\": [1, { \"пр\": _2, \"орг\": _2, \"обр\": _2, \"од\": _2, \"упр\": _2, \"ак\": _2 }], \"xn--p1ai\": _2, \"рф\": _2, \"xn--wgbl6a\": _2, \"قطر\": _2, \"xn--mgberp4a5d4ar\": _2, \"السعودية\": _2, \"xn--mgberp4a5d4a87g\": _2, \"السعودیة\": _2, \"xn--mgbqly7c0a67fbc\": _2, \"السعودیۃ\": _2, \"xn--mgbqly7cvafr\": _2, \"السعوديه\": _2, \"xn--mgbpl2fh\": _2, \"سودان\": _2, \"xn--yfro4i67o\": _2, \"新加坡\": _2, \"xn--clchc0ea0b2g2a9gcd\": _2, \"சிங்கப்பூர்\": _2, \"xn--ogbpf8fl\": _2, \"سورية\": _2, \"xn--mgbtf8fl\": _2, \"سوريا\": _2, \"xn--o3cw4h\": [1, { \"xn--12c1fe0br\": _2, \"xn--12co0c3b4eva\": _2, \"xn--h3cuzk1di\": _2, \"xn--o3cyx2a\": _2, \"xn--m3ch0j3a\": _2, \"xn--12cfi8ixb8l\": _2 }], \"ไทย\": [1, { \"ศึกษา\": _2, \"ธุรกิจ\": _2, \"รัฐบาล\": _2, \"ทหาร\": _2, \"เน็ต\": _2, \"องค์กร\": _2 }], \"xn--pgbs0dh\": _2, \"تونس\": _2, \"xn--kpry57d\": _2, \"台灣\": _2, \"xn--kprw13d\": _2, \"台湾\": _2, \"xn--nnx388a\": _2, \"臺灣\": _2, \"xn--j1amh\": _2, \"укр\": _2, \"xn--mgb2ddes\": _2, \"اليمن\": _2, \"xxx\": _2, \"ye\": _32, \"za\": [0, { \"ac\": _2, \"agric\": _2, \"alt\": _2, \"co\": _6, \"edu\": _2, \"gov\": _2, \"grondar\": _2, \"law\": _2, \"mil\": _2, \"net\": _2, \"ngo\": _2, \"nic\": _2, \"nis\": _2, \"nom\": _2, \"org\": _2, \"school\": _2, \"tm\": _2, \"web\": _2 }], \"zm\": [1, { \"ac\": _2, \"biz\": _2, \"co\": _2, \"com\": _2, \"edu\": _2, \"gov\": _2, \"info\": _2, \"mil\": _2, \"net\": _2, \"org\": _2, \"sch\": _2 }], \"zw\": [1, { \"ac\": _2, \"co\": _2, \"gov\": _2, \"mil\": _2, \"org\": _2 }], \"aaa\": _2, \"aarp\": _2, \"abb\": _2, \"abbott\": _2, \"abbvie\": _2, \"abc\": _2, \"able\": _2, \"abogado\": _2, \"abudhabi\": _2, \"academy\": [1, { \"official\": _3 }], \"accenture\": _2, \"accountant\": _2, \"accountants\": _2, \"aco\": _2, \"actor\": _2, \"ads\": _2, \"adult\": _2, \"aeg\": _2, \"aetna\": _2, \"afl\": _2, \"africa\": _2, \"agakhan\": _2, \"agency\": _2, \"aig\": _2, \"airbus\": _2, \"airforce\": _2, \"airtel\": _2, \"akdn\": _2, \"alibaba\": _2, \"alipay\": _2, \"allfinanz\": _2, \"allstate\": _2, \"ally\": _2, \"alsace\": _2, \"alstom\": _2, \"amazon\": _2, \"americanexpress\": _2, \"americanfamily\": _2, \"amex\": _2, \"amfam\": _2, \"amica\": _2, \"amsterdam\": _2, \"analytics\": _2, \"android\": _2, \"anquan\": _2, \"anz\": _2, \"aol\": _2, \"apartments\": _2, \"app\": [1, { \"beget\": _5, \"clerk\": _3, \"clerkstage\": _3, \"wnext\": _3, \"platform0\": _3, \"deta\": _3, \"ondigitalocean\": _3, \"easypanel\": _3, \"encr\": _3, \"edgecompute\": _3, \"fireweb\": _3, \"onflashdrive\": _3, \"framer\": _3, \"run\": [2, { \"a\": _3 }], \"web\": _3, \"hasura\": _3, \"loginline\": _3, \"messerli\": _3, \"netlify\": _3, \"ngrok\": _3, \"ngrok-free\": _3, \"developer\": _5, \"noop\": _3, \"northflank\": _5, \"snowflake\": [2, { \"privatelink\": _3 }], \"streamlit\": _3, \"telebit\": _3, \"typedream\": _3, \"vercel\": _3, \"bookonline\": _3 }], \"apple\": _2, \"aquarelle\": _2, \"arab\": _2, \"aramco\": _2, \"archi\": _2, \"army\": _2, \"art\": _2, \"arte\": _2, \"asda\": _2, \"associates\": _2, \"athleta\": _2, \"attorney\": _2, \"auction\": _2, \"audi\": _2, \"audible\": _2, \"audio\": _2, \"auspost\": _2, \"author\": _2, \"auto\": _2, \"autos\": _2, \"avianca\": _2, \"aws\": _2, \"axa\": _2, \"azure\": _2, \"baby\": _2, \"baidu\": _2, \"banamex\": _2, \"bananarepublic\": _2, \"band\": _2, \"bank\": _2, \"bar\": _2, \"barcelona\": _2, \"barclaycard\": _2, \"barclays\": _2, \"barefoot\": _2, \"bargains\": _2, \"baseball\": _2, \"basketball\": [1, { \"aus\": _3, \"nz\": _3 }], \"bauhaus\": _2, \"bayern\": _2, \"bbc\": _2, \"bbt\": _2, \"bbva\": _2, \"bcg\": _2, \"bcn\": _2, \"beats\": _2, \"beauty\": _2, \"beer\": _2, \"bentley\": _2, \"berlin\": _2, \"best\": _2, \"bestbuy\": _2, \"bet\": _2, \"bharti\": _2, \"bible\": _2, \"bid\": _2, \"bike\": _2, \"bing\": _2, \"bingo\": _2, \"bio\": _2, \"black\": _2, \"blackfriday\": _2, \"blockbuster\": _2, \"blog\": _2, \"bloomberg\": _2, \"blue\": _2, \"bms\": _2, \"bmw\": _2, \"bnpparibas\": _2, \"boats\": _2, \"boehringer\": _2, \"bofa\": _2, \"bom\": _2, \"bond\": _2, \"boo\": _2, \"book\": _2, \"booking\": _2, \"bosch\": _2, \"bostik\": _2, \"boston\": _2, \"bot\": _2, \"boutique\": _2, \"box\": _2, \"bradesco\": _2, \"bridgestone\": _2, \"broadway\": _2, \"broker\": _2, \"brother\": _2, \"brussels\": _2, \"build\": _2, \"builders\": [1, { \"cloudsite\": _3 }], \"business\": _10, \"buy\": _2, \"buzz\": _2, \"bzh\": _2, \"cab\": _2, \"cafe\": _2, \"cal\": _2, \"call\": _2, \"calvinklein\": _2, \"cam\": _2, \"camera\": _2, \"camp\": _2, \"canon\": _2, \"capetown\": _2, \"capital\": _2, \"capitalone\": _2, \"car\": _2, \"caravan\": _2, \"cards\": _2, \"care\": _2, \"career\": _2, \"careers\": _2, \"cars\": _2, \"casa\": [1, { \"nabu\": [0, { \"ui\": _3 }] }], \"case\": _2, \"cash\": _2, \"casino\": _2, \"catering\": _2, \"catholic\": _2, \"cba\": _2, \"cbn\": _2, \"cbre\": _2, \"cbs\": _2, \"center\": _2, \"ceo\": _2, \"cern\": _2, \"cfa\": _2, \"cfd\": _2, \"chanel\": _2, \"channel\": _2, \"charity\": _2, \"chase\": _2, \"chat\": _2, \"cheap\": _2, \"chintai\": _2, \"christmas\": _2, \"chrome\": _2, \"church\": _2, \"cipriani\": _2, \"circle\": _2, \"cisco\": _2, \"citadel\": _2, \"citi\": _2, \"citic\": _2, \"city\": _2, \"cityeats\": _2, \"claims\": _2, \"cleaning\": _2, \"click\": _2, \"clinic\": _2, \"clinique\": _2, \"clothing\": _2, \"cloud\": [1, { \"banzai\": _5, \"elementor\": _3, \"encoway\": [0, { \"eu\": _3 }], \"statics\": _5, \"ravendb\": _3, \"axarnet\": [0, { \"es-1\": _3 }], \"diadem\": _3, \"jelastic\": [0, { \"vip\": _3 }], \"jele\": _3, \"jenv-aruba\": [0, { \"aruba\": [0, { \"eur\": [0, { \"it1\": _3 }] }], \"it1\": _3 }], \"keliweb\": [2, { \"cs\": _3 }], \"oxa\": [2, { \"tn\": _3, \"uk\": _3 }], \"primetel\": [2, { \"uk\": _3 }], \"reclaim\": [0, { \"ca\": _3, \"uk\": _3, \"us\": _3 }], \"trendhosting\": [0, { \"ch\": _3, \"de\": _3 }], \"jotelulu\": _3, \"kuleuven\": _3, \"linkyard\": _3, \"magentosite\": _5, \"perspecta\": _3, \"vapor\": _3, \"on-rancher\": _5, \"scw\": [0, { \"baremetal\": [0, { \"fr-par-1\": _3, \"fr-par-2\": _3, \"nl-ams-1\": _3 }], \"fr-par\": [0, { \"fnc\": [2, { \"functions\": _3 }], \"k8s\": _11, \"s3\": _3, \"s3-website\": _3, \"whm\": _3 }], \"instances\": [0, { \"priv\": _3, \"pub\": _3 }], \"k8s\": _3, \"nl-ams\": [0, { \"k8s\": _11, \"s3\": _3, \"s3-website\": _3, \"whm\": _3 }], \"pl-waw\": [0, { \"k8s\": _11, \"s3\": _3, \"s3-website\": _3 }], \"scalebook\": _3, \"smartlabeling\": _3 }], \"sensiosite\": _5, \"trafficplex\": _3, \"urown\": _3, \"voorloper\": _3 }], \"club\": [1, { \"cloudns\": _3, \"jele\": _3, \"barsy\": _3 }], \"clubmed\": _2, \"coach\": _2, \"codes\": [1, { \"owo\": _5 }], \"coffee\": _2, \"college\": _2, \"cologne\": _2, \"comcast\": _2, \"commbank\": _2, \"community\": [1, { \"nog\": _3, \"ravendb\": _3, \"myforum\": _3 }], \"company\": _2, \"compare\": _2, \"computer\": _2, \"comsec\": _2, \"condos\": _2, \"construction\": _2, \"consulting\": _2, \"contact\": _2, \"contractors\": _2, \"cooking\": _2, \"cool\": [1, { \"elementor\": _3, \"de\": _3 }], \"corsica\": _2, \"country\": _2, \"coupon\": _2, \"coupons\": _2, \"courses\": _2, \"cpa\": _2, \"credit\": _2, \"creditcard\": _2, \"creditunion\": _2, \"cricket\": _2, \"crown\": _2, \"crs\": _2, \"cruise\": _2, \"cruises\": _2, \"cuisinella\": _2, \"cymru\": _2, \"cyou\": _2, \"dabur\": _2, \"dad\": _2, \"dance\": _2, \"data\": _2, \"date\": _2, \"dating\": _2, \"datsun\": _2, \"day\": _2, \"dclk\": _2, \"dds\": _2, \"deal\": _2, \"dealer\": _2, \"deals\": _2, \"degree\": _2, \"delivery\": _2, \"dell\": _2, \"deloitte\": _2, \"delta\": _2, \"democrat\": _2, \"dental\": _2, \"dentist\": _2, \"desi\": _2, \"design\": [1, { \"bss\": _3 }], \"dev\": [1, { \"autocode\": _3, \"lcl\": _5, \"lclstage\": _5, \"stg\": _5, \"stgstage\": _5, \"pages\": _3, \"r2\": _3, \"workers\": _3, \"curv\": _3, \"deno\": _3, \"deno-staging\": _3, \"deta\": _3, \"fly\": _3, \"githubpreview\": _3, \"gateway\": _5, \"iserv\": _3, \"localcert\": [0, { \"user\": _5 }], \"loginline\": _3, \"mediatech\": _3, \"ngrok\": _3, \"ngrok-free\": _3, \"platter-app\": _3, \"shiftcrypto\": _3, \"vercel\": _3, \"webhare\": _5 }], \"dhl\": _2, \"diamonds\": _2, \"diet\": _2, \"digital\": [1, { \"cloudapps\": [2, { \"london\": _3 }] }], \"direct\": _2, \"directory\": _2, \"discount\": _2, \"discover\": _2, \"dish\": _2, \"diy\": _2, \"dnp\": _2, \"docs\": _2, \"doctor\": _2, \"dog\": _2, \"domains\": _2, \"dot\": _2, \"download\": _2, \"drive\": _2, \"dtv\": _2, \"dubai\": _2, \"dunlop\": _2, \"dupont\": _2, \"durban\": _2, \"dvag\": _2, \"dvr\": _2, \"earth\": [1, { \"dapps\": [0, { \"*\": _3, \"bzz\": _5 }] }], \"eat\": _2, \"eco\": _2, \"edeka\": _2, \"education\": _10, \"email\": _2, \"emerck\": _2, \"energy\": _2, \"engineer\": _2, \"engineering\": _2, \"enterprises\": _2, \"epson\": _2, \"equipment\": _2, \"ericsson\": _2, \"erni\": _2, \"esq\": _2, \"estate\": [1, { \"compute\": _5 }], \"etisalat\": _2, \"eurovision\": _2, \"eus\": [1, { \"party\": _28 }], \"events\": [1, { \"koobin\": _3, \"co\": _3 }], \"exchange\": _2, \"expert\": _2, \"exposed\": _2, \"express\": _2, \"extraspace\": _2, \"fage\": _2, \"fail\": _2, \"fairwinds\": _2, \"faith\": _29, \"family\": _2, \"fan\": _2, \"fans\": _2, \"farm\": [1, { \"storj\": _3 }], \"farmers\": _2, \"fashion\": _2, \"fast\": _2, \"fedex\": _2, \"feedback\": _2, \"ferrari\": _2, \"ferrero\": _2, \"fidelity\": _2, \"fido\": _2, \"film\": _2, \"final\": _2, \"finance\": _2, \"financial\": _10, \"fire\": _2, \"firestone\": _2, \"firmdale\": _2, \"fish\": _2, \"fishing\": _2, \"fit\": _2, \"fitness\": _2, \"flickr\": _2, \"flights\": _2, \"flir\": _2, \"florist\": _2, \"flowers\": _2, \"fly\": _2, \"foo\": _2, \"food\": _2, \"football\": _2, \"ford\": _2, \"forex\": _2, \"forsale\": _2, \"forum\": _2, \"foundation\": _2, \"fox\": _2, \"free\": _2, \"fresenius\": _2, \"frl\": _2, \"frogans\": _2, \"frontdoor\": _2, \"frontier\": _2, \"ftr\": _2, \"fujitsu\": _2, \"fun\": _2, \"fund\": _2, \"furniture\": _2, \"futbol\": _2, \"fyi\": _2, \"gal\": _2, \"gallery\": _2, \"gallo\": _2, \"gallup\": _2, \"game\": _2, \"games\": _2, \"gap\": _2, \"garden\": _2, \"gay\": _2, \"gbiz\": _2, \"gdn\": [1, { \"cnpy\": _3 }], \"gea\": _2, \"gent\": _2, \"genting\": _2, \"george\": _2, \"ggee\": _2, \"gift\": _2, \"gifts\": _2, \"gives\": _2, \"giving\": _2, \"glass\": _2, \"gle\": _2, \"global\": _2, \"globo\": _2, \"gmail\": _2, \"gmbh\": _2, \"gmo\": _2, \"gmx\": _2, \"godaddy\": _2, \"gold\": _2, \"goldpoint\": _2, \"golf\": _2, \"goo\": _2, \"goodyear\": _2, \"goog\": [1, { \"cloud\": _3, \"translate\": _3, \"usercontent\": _5 }], \"google\": _2, \"gop\": _2, \"got\": _2, \"grainger\": _2, \"graphics\": _2, \"gratis\": _2, \"green\": _2, \"gripe\": _2, \"grocery\": _2, \"group\": [1, { \"discourse\": _3 }], \"guardian\": _2, \"gucci\": _2, \"guge\": _2, \"guide\": _2, \"guitars\": _2, \"guru\": _2, \"hair\": _2, \"hamburg\": _2, \"hangout\": _2, \"haus\": _2, \"hbo\": _2, \"hdfc\": _2, \"hdfcbank\": _2, \"health\": [1, { \"hra\": _3 }], \"healthcare\": _2, \"help\": _2, \"helsinki\": _2, \"here\": _2, \"hermes\": _2, \"hiphop\": _2, \"hisamitsu\": _2, \"hitachi\": _2, \"hiv\": _2, \"hkt\": _2, \"hockey\": _2, \"holdings\": _2, \"holiday\": _2, \"homedepot\": _2, \"homegoods\": _2, \"homes\": _2, \"homesense\": _2, \"honda\": _2, \"horse\": _2, \"hospital\": _2, \"host\": [1, { \"cloudaccess\": _3, \"freesite\": _3, \"easypanel\": _3, \"fastvps\": _3, \"myfast\": _3, \"tempurl\": _3, \"wpmudev\": _3, \"jele\": _3, \"mircloud\": _3, \"pcloud\": _3, \"half\": _3 }], \"hosting\": [1, { \"opencraft\": _3 }], \"hot\": _2, \"hoteles\": _2, \"hotels\": _2, \"hotmail\": _2, \"house\": _2, \"how\": _2, \"hsbc\": _2, \"hughes\": _2, \"hyatt\": _2, \"hyundai\": _2, \"ibm\": _2, \"icbc\": _2, \"ice\": _2, \"icu\": _2, \"ieee\": _2, \"ifm\": _2, \"ikano\": _2, \"imamat\": _2, \"imdb\": _2, \"immo\": _2, \"immobilien\": _2, \"inc\": _2, \"industries\": _2, \"infiniti\": _2, \"ing\": _2, \"ink\": _2, \"institute\": _2, \"insurance\": _2, \"insure\": _2, \"international\": _2, \"intuit\": _2, \"investments\": _2, \"ipiranga\": _2, \"irish\": _2, \"ismaili\": _2, \"ist\": _2, \"istanbul\": _2, \"itau\": _2, \"itv\": _2, \"jaguar\": _2, \"java\": _2, \"jcb\": _2, \"jeep\": _2, \"jetzt\": _2, \"jewelry\": _2, \"jio\": _2, \"jll\": _2, \"jmp\": _2, \"jnj\": _2, \"joburg\": _2, \"jot\": _2, \"joy\": _2, \"jpmorgan\": _2, \"jprs\": _2, \"juegos\": _2, \"juniper\": _2, \"kaufen\": _2, \"kddi\": _2, \"kerryhotels\": _2, \"kerrylogistics\": _2, \"kerryproperties\": _2, \"kfh\": _2, \"kia\": _2, \"kids\": _2, \"kim\": _2, \"kinder\": _2, \"kindle\": _2, \"kitchen\": _2, \"kiwi\": _2, \"koeln\": _2, \"komatsu\": _2, \"kosher\": _2, \"kpmg\": _2, \"kpn\": _2, \"krd\": [1, { \"co\": _3, \"edu\": _3 }], \"kred\": _2, \"kuokgroup\": _2, \"kyoto\": _2, \"lacaixa\": _2, \"lamborghini\": _2, \"lamer\": _2, \"lancaster\": _2, \"land\": [1, { \"static\": [2, { \"dev\": _3, \"sites\": _3 }] }], \"landrover\": _2, \"lanxess\": _2, \"lasalle\": _2, \"lat\": _2, \"latino\": _2, \"latrobe\": _2, \"law\": _2, \"lawyer\": _2, \"lds\": _2, \"lease\": _2, \"leclerc\": _2, \"lefrak\": _2, \"legal\": _2, \"lego\": _2, \"lexus\": _2, \"lgbt\": _2, \"lidl\": _2, \"life\": _2, \"lifeinsurance\": _2, \"lifestyle\": _2, \"lighting\": _2, \"like\": _2, \"lilly\": _2, \"limited\": _2, \"limo\": _2, \"lincoln\": _2, \"link\": [1, { \"cyon\": _3, \"mypep\": _3, \"dweb\": _5 }], \"lipsy\": _2, \"live\": [1, { \"hlx\": _3 }], \"living\": _2, \"llc\": _2, \"llp\": _2, \"loan\": _2, \"loans\": _2, \"locker\": _2, \"locus\": _2, \"lol\": [1, { \"omg\": _3 }], \"london\": _2, \"lotte\": _2, \"lotto\": _2, \"love\": _2, \"lpl\": _2, \"lplfinancial\": _2, \"ltd\": _2, \"ltda\": _2, \"lundbeck\": _2, \"luxe\": _2, \"luxury\": _2, \"madrid\": _2, \"maif\": _2, \"maison\": _2, \"makeup\": _2, \"man\": _2, \"management\": [1, { \"router\": _3 }], \"mango\": _2, \"map\": _2, \"market\": _2, \"marketing\": _2, \"markets\": _2, \"marriott\": _2, \"marshalls\": _2, \"mattel\": _2, \"mba\": _2, \"mckinsey\": _2, \"med\": _2, \"media\": _35, \"meet\": _2, \"melbourne\": _2, \"meme\": _2, \"memorial\": _2, \"men\": _2, \"menu\": _36, \"merckmsd\": _2, \"miami\": _2, \"microsoft\": _2, \"mini\": _2, \"mint\": _2, \"mit\": _2, \"mitsubishi\": _2, \"mlb\": _2, \"mls\": _2, \"mma\": _2, \"mobile\": _2, \"moda\": _2, \"moe\": _2, \"moi\": _2, \"mom\": _2, \"monash\": _2, \"money\": _2, \"monster\": _2, \"mormon\": _2, \"mortgage\": _2, \"moscow\": _2, \"moto\": _2, \"motorcycles\": _2, \"mov\": _2, \"movie\": _2, \"msd\": _2, \"mtn\": _2, \"mtr\": _2, \"music\": _2, \"mutual\": _2, \"nab\": _2, \"nagoya\": _2, \"natura\": _2, \"navy\": _2, \"nba\": _2, \"nec\": _2, \"netbank\": _2, \"netflix\": _2, \"network\": [1, { \"alces\": _5, \"co\": _3, \"arvo\": _3, \"azimuth\": _3, \"tlon\": _3 }], \"neustar\": _2, \"new\": _2, \"news\": [1, { \"noticeable\": _3 }], \"next\": _2, \"nextdirect\": _2, \"nexus\": _2, \"nfl\": _2, \"ngo\": _2, \"nhk\": _2, \"nico\": _2, \"nike\": _2, \"nikon\": _2, \"ninja\": _2, \"nissan\": _2, \"nissay\": _2, \"nokia\": _2, \"northwesternmutual\": _2, \"norton\": _2, \"now\": _2, \"nowruz\": _2, \"nowtv\": _2, \"nra\": _2, \"nrw\": _2, \"ntt\": _2, \"nyc\": _2, \"obi\": _2, \"observer\": _2, \"office\": _2, \"okinawa\": _2, \"olayan\": _2, \"olayangroup\": _2, \"oldnavy\": _2, \"ollo\": _2, \"omega\": _2, \"one\": [1, { \"onred\": [2, { \"staging\": _3 }], \"service\": _3, \"homelink\": _3 }], \"ong\": _2, \"onl\": _2, \"online\": [1, { \"eero\": _3, \"eero-stage\": _3, \"barsy\": _3 }], \"ooo\": _2, \"open\": _2, \"oracle\": _2, \"orange\": [1, { \"tech\": _3 }], \"organic\": _2, \"origins\": _2, \"osaka\": _2, \"otsuka\": _2, \"ott\": _2, \"ovh\": [1, { \"nerdpol\": _3 }], \"page\": [1, { \"hlx\": _3, \"hlx3\": _3, \"translated\": _3, \"codeberg\": _3, \"pdns\": _3, \"plesk\": _3, \"prvcy\": _3, \"rocky\": _3, \"magnet\": _3 }], \"panasonic\": _2, \"paris\": _2, \"pars\": _2, \"partners\": _2, \"parts\": _2, \"party\": _29, \"passagens\": _2, \"pay\": _2, \"pccw\": _2, \"pet\": _2, \"pfizer\": _2, \"pharmacy\": _2, \"phd\": _2, \"philips\": _2, \"phone\": _2, \"photo\": _2, \"photography\": _2, \"photos\": _35, \"physio\": _2, \"pics\": _2, \"pictet\": _2, \"pictures\": [1, { \"1337\": _3 }], \"pid\": _2, \"pin\": _2, \"ping\": _2, \"pink\": _2, \"pioneer\": _2, \"pizza\": [1, { \"ngrok\": _3 }], \"place\": _10, \"play\": _2, \"playstation\": _2, \"plumbing\": _2, \"plus\": _2, \"pnc\": _2, \"pohl\": _2, \"poker\": _2, \"politie\": _2, \"porn\": [1, { \"indie\": _3 }], \"pramerica\": _2, \"praxi\": _2, \"press\": _2, \"prime\": _2, \"prod\": _2, \"productions\": _2, \"prof\": _2, \"progressive\": _2, \"promo\": _2, \"properties\": _2, \"property\": _2, \"protection\": _2, \"pru\": _2, \"prudential\": _2, \"pub\": _36, \"pwc\": _2, \"qpon\": _2, \"quebec\": _2, \"quest\": _2, \"racing\": _2, \"radio\": _2, \"read\": _2, \"realestate\": _2, \"realtor\": _2, \"realty\": _2, \"recipes\": _2, \"red\": _2, \"redstone\": _2, \"redumbrella\": _2, \"rehab\": _2, \"reise\": _2, \"reisen\": _2, \"reit\": _2, \"reliance\": _2, \"ren\": _2, \"rent\": _2, \"rentals\": _2, \"repair\": _2, \"report\": _2, \"republican\": _2, \"rest\": _2, \"restaurant\": _2, \"review\": _29, \"reviews\": _2, \"rexroth\": _2, \"rich\": _2, \"richardli\": _2, \"ricoh\": _2, \"ril\": _2, \"rio\": _2, \"rip\": [1, { \"clan\": _3 }], \"rocher\": _2, \"rocks\": [1, { \"myddns\": _3, \"lima-city\": _3, \"webspace\": _3 }], \"rodeo\": _2, \"rogers\": _2, \"room\": _2, \"rsvp\": _2, \"rugby\": _2, \"ruhr\": _2, \"run\": [1, { \"hs\": _3, \"development\": _3, \"ravendb\": _3, \"servers\": _3, \"build\": _5, \"code\": _5, \"database\": _5, \"migration\": _5, \"onporter\": _3, \"repl\": _3 }], \"rwe\": _2, \"ryukyu\": _2, \"saarland\": _2, \"safe\": _2, \"safety\": _2, \"sakura\": _2, \"sale\": _2, \"salon\": _2, \"samsclub\": _2, \"samsung\": _2, \"sandvik\": _2, \"sandvikcoromant\": _2, \"sanofi\": _2, \"sap\": _2, \"sarl\": _2, \"sas\": _2, \"save\": _2, \"saxo\": _2, \"sbi\": _2, \"sbs\": _2, \"sca\": _2, \"scb\": _2, \"schaeffler\": _2, \"schmidt\": _2, \"scholarships\": _2, \"school\": _2, \"schule\": _2, \"schwarz\": _2, \"science\": _29, \"scot\": [1, { \"edu\": _3, \"gov\": [2, { \"service\": _3 }] }], \"search\": _2, \"seat\": _2, \"secure\": _2, \"security\": _2, \"seek\": _2, \"select\": _2, \"sener\": _2, \"services\": [1, { \"loginline\": _3 }], \"seven\": _2, \"sew\": _2, \"sex\": _2, \"sexy\": _2, \"sfr\": _2, \"shangrila\": _2, \"sharp\": _2, \"shaw\": _2, \"shell\": _2, \"shia\": _2, \"shiksha\": _2, \"shoes\": _2, \"shop\": [1, { \"base\": _3, \"hoplix\": _3, \"barsy\": _3 }], \"shopping\": _2, \"shouji\": _2, \"show\": _2, \"showtime\": _2, \"silk\": _2, \"sina\": _2, \"singles\": _2, \"site\": [1, { \"cloudera\": _5, \"cyon\": _3, \"fnwk\": _3, \"folionetwork\": _3, \"fastvps\": _3, \"jele\": _3, \"lelux\": _3, \"loginline\": _3, \"barsy\": _3, \"mintere\": _3, \"omniwe\": _3, \"opensocial\": _3, \"platformsh\": _5, \"tst\": _5, \"byen\": _3, \"srht\": _3, \"novecore\": _3 }], \"ski\": _2, \"skin\": _2, \"sky\": _2, \"skype\": _2, \"sling\": _2, \"smart\": _2, \"smile\": _2, \"sncf\": _2, \"soccer\": _2, \"social\": _2, \"softbank\": _2, \"software\": _2, \"sohu\": _2, \"solar\": _2, \"solutions\": [1, { \"diher\": _5 }], \"song\": _2, \"sony\": _2, \"soy\": _2, \"spa\": _2, \"space\": [1, { \"myfast\": _3, \"uber\": _3, \"xs4all\": _3 }], \"sport\": _2, \"spot\": _2, \"srl\": _2, \"stada\": _2, \"staples\": _2, \"star\": _2, \"statebank\": _2, \"statefarm\": _2, \"stc\": _2, \"stcgroup\": _2, \"stockholm\": _2, \"storage\": _2, \"store\": [1, { \"sellfy\": _3, \"shopware\": _3, \"storebase\": _3 }], \"stream\": _2, \"studio\": _2, \"study\": _2, \"style\": _2, \"sucks\": _2, \"supplies\": _2, \"supply\": _2, \"support\": _36, \"surf\": _2, \"surgery\": _2, \"suzuki\": _2, \"swatch\": _2, \"swiss\": _2, \"sydney\": _2, \"systems\": [1, { \"knightpoint\": _3 }], \"tab\": _2, \"taipei\": _2, \"talk\": _2, \"taobao\": _2, \"target\": _2, \"tatamotors\": _2, \"tatar\": _2, \"tattoo\": _2, \"tax\": _2, \"taxi\": _2, \"tci\": _2, \"tdk\": _2, \"team\": [1, { \"discourse\": _3, \"jelastic\": _3 }], \"tech\": _2, \"technology\": _10, \"temasek\": _2, \"tennis\": _2, \"teva\": _2, \"thd\": _2, \"theater\": _2, \"theatre\": _2, \"tiaa\": _2, \"tickets\": _2, \"tienda\": _2, \"tiffany\": _2, \"tips\": _2, \"tires\": _2, \"tirol\": _2, \"tjmaxx\": _2, \"tjx\": _2, \"tkmaxx\": _2, \"tmall\": _2, \"today\": [1, { \"prequalifyme\": _3 }], \"tokyo\": _2, \"tools\": _2, \"top\": [1, { \"now-dns\": _3, \"ntdll\": _3 }], \"toray\": _2, \"toshiba\": _2, \"total\": _2, \"tours\": _2, \"town\": _2, \"toyota\": _2, \"toys\": _2, \"trade\": _29, \"trading\": _2, \"training\": _2, \"travel\": _2, \"travelers\": _2, \"travelersinsurance\": _2, \"trust\": _2, \"trv\": _2, \"tube\": _2, \"tui\": _2, \"tunes\": _2, \"tushu\": _2, \"tvs\": _2, \"ubank\": _2, \"ubs\": _2, \"unicom\": _2, \"university\": _2, \"uno\": _2, \"uol\": _2, \"ups\": _2, \"vacations\": _2, \"vana\": _2, \"vanguard\": _2, \"vegas\": _2, \"ventures\": _2, \"verisign\": _2, \"versicherung\": _2, \"vet\": _2, \"viajes\": _2, \"video\": _2, \"vig\": _2, \"viking\": _2, \"villas\": _2, \"vin\": _2, \"vip\": _2, \"virgin\": _2, \"visa\": _2, \"vision\": _2, \"viva\": _2, \"vivo\": _2, \"vlaanderen\": _2, \"vodka\": _2, \"volkswagen\": _2, \"volvo\": _2, \"vote\": _2, \"voting\": _2, \"voto\": _2, \"voyage\": _2, \"vuelos\": _2, \"wales\": _2, \"walmart\": _2, \"walter\": _2, \"wang\": _2, \"wanggou\": _2, \"watch\": _2, \"watches\": _2, \"weather\": _2, \"weatherchannel\": _2, \"webcam\": _2, \"weber\": _2, \"website\": _35, \"wedding\": _2, \"weibo\": _2, \"weir\": _2, \"whoswho\": _2, \"wien\": _2, \"wiki\": _35, \"williamhill\": _2, \"win\": _2, \"windows\": _2, \"wine\": _2, \"winners\": _2, \"wme\": _2, \"wolterskluwer\": _2, \"woodside\": _2, \"work\": _2, \"works\": _2, \"world\": _2, \"wow\": _2, \"wtc\": _2, \"wtf\": _2, \"xbox\": _2, \"xerox\": _2, \"xfinity\": _2, \"xihuan\": _2, \"xin\": _2, \"xn--11b4c3d\": _2, \"कॉम\": _2, \"xn--1ck2e1b\": _2, \"セール\": _2, \"xn--1qqw23a\": _2, \"佛山\": _2, \"xn--30rr7y\": _2, \"慈善\": _2, \"xn--3bst00m\": _2, \"集团\": _2, \"xn--3ds443g\": _2, \"在线\": _2, \"xn--3pxu8k\": _2, \"点看\": _2, \"xn--42c2d9a\": _2, \"คอม\": _2, \"xn--45q11c\": _2, \"八卦\": _2, \"xn--4gbrim\": _2, \"موقع\": _2, \"xn--55qw42g\": _2, \"公益\": _2, \"xn--55qx5d\": _2, \"公司\": _2, \"xn--5su34j936bgsg\": _2, \"香格里拉\": _2, \"xn--5tzm5g\": _2, \"网站\": _2, \"xn--6frz82g\": _2, \"移动\": _2, \"xn--6qq986b3xl\": _2, \"我爱你\": _2, \"xn--80adxhks\": _2, \"москва\": _2, \"xn--80aqecdr1a\": _2, \"католик\": _2, \"xn--80asehdb\": _2, \"онлайн\": _2, \"xn--80aswg\": _2, \"сайт\": _2, \"xn--8y0a063a\": _2, \"联通\": _2, \"xn--9dbq2a\": _2, \"קום\": _2, \"xn--9et52u\": _2, \"时尚\": _2, \"xn--9krt00a\": _2, \"微博\": _2, \"xn--b4w605ferd\": _2, \"淡马锡\": _2, \"xn--bck1b9a5dre4c\": _2, \"ファッション\": _2, \"xn--c1avg\": _2, \"орг\": _2, \"xn--c2br7g\": _2, \"नेट\": _2, \"xn--cck2b3b\": _2, \"ストア\": _2, \"xn--cckwcxetd\": _2, \"アマゾン\": _2, \"xn--cg4bki\": _2, \"삼성\": _2, \"xn--czr694b\": _2, \"商标\": _2, \"xn--czrs0t\": _2, \"商店\": _2, \"xn--czru2d\": _2, \"商城\": _2, \"xn--d1acj3b\": _2, \"дети\": _2, \"xn--eckvdtc9d\": _2, \"ポイント\": _2, \"xn--efvy88h\": _2, \"新闻\": _2, \"xn--fct429k\": _2, \"家電\": _2, \"xn--fhbei\": _2, \"كوم\": _2, \"xn--fiq228c5hs\": _2, \"中文网\": _2, \"xn--fiq64b\": _2, \"中信\": _2, \"xn--fjq720a\": _2, \"娱乐\": _2, \"xn--flw351e\": _2, \"谷歌\": _2, \"xn--fzys8d69uvgm\": _2, \"電訊盈科\": _2, \"xn--g2xx48c\": _2, \"购物\": _2, \"xn--gckr3f0f\": _2, \"クラウド\": _2, \"xn--gk3at1e\": _2, \"通販\": _2, \"xn--hxt814e\": _2, \"网店\": _2, \"xn--i1b6b1a6a2e\": _2, \"संगठन\": _2, \"xn--imr513n\": _2, \"餐厅\": _2, \"xn--io0a7i\": _2, \"网络\": _2, \"xn--j1aef\": _2, \"ком\": _2, \"xn--jlq480n2rg\": _2, \"亚马逊\": _2, \"xn--jvr189m\": _2, \"食品\": _2, \"xn--kcrx77d1x4a\": _2, \"飞利浦\": _2, \"xn--kput3i\": _2, \"手机\": _2, \"xn--mgba3a3ejt\": _2, \"ارامكو\": _2, \"xn--mgba7c0bbn0a\": _2, \"العليان\": _2, \"xn--mgbaakc7dvf\": _2, \"اتصالات\": _2, \"xn--mgbab2bd\": _2, \"بازار\": _2, \"xn--mgbca7dzdo\": _2, \"ابوظبي\": _2, \"xn--mgbi4ecexp\": _2, \"كاثوليك\": _2, \"xn--mgbt3dhd\": _2, \"همراه\": _2, \"xn--mk1bu44c\": _2, \"닷컴\": _2, \"xn--mxtq1m\": _2, \"政府\": _2, \"xn--ngbc5azd\": _2, \"شبكة\": _2, \"xn--ngbe9e0a\": _2, \"بيتك\": _2, \"xn--ngbrx\": _2, \"عرب\": _2, \"xn--nqv7f\": _2, \"机构\": _2, \"xn--nqv7fs00ema\": _2, \"组织机构\": _2, \"xn--nyqy26a\": _2, \"健康\": _2, \"xn--otu796d\": _2, \"招聘\": _2, \"xn--p1acf\": [1, { \"xn--90amc\": _3, \"xn--j1aef\": _3, \"xn--j1ael8b\": _3, \"xn--h1ahn\": _3, \"xn--j1adp\": _3, \"xn--c1avg\": _3, \"xn--80aaa0cvac\": _3, \"xn--h1aliz\": _3, \"xn--90a1af\": _3, \"xn--41a\": _3 }], \"рус\": [1, { \"биз\": _3, \"ком\": _3, \"крым\": _3, \"мир\": _3, \"мск\": _3, \"орг\": _3, \"самара\": _3, \"сочи\": _3, \"спб\": _3, \"я\": _3 }], \"xn--pssy2u\": _2, \"大拿\": _2, \"xn--q9jyb4c\": _2, \"みんな\": _2, \"xn--qcka1pmc\": _2, \"グーグル\": _2, \"xn--rhqv96g\": _2, \"世界\": _2, \"xn--rovu88b\": _2, \"書籍\": _2, \"xn--ses554g\": _2, \"网址\": _2, \"xn--t60b56a\": _2, \"닷넷\": _2, \"xn--tckwe\": _2, \"コム\": _2, \"xn--tiq49xqyj\": _2, \"天主教\": _2, \"xn--unup4y\": _2, \"游戏\": _2, \"xn--vermgensberater-ctb\": _2, \"vermögensberater\": _2, \"xn--vermgensberatung-pwb\": _2, \"vermögensberatung\": _2, \"xn--vhquv\": _2, \"企业\": _2, \"xn--vuq861b\": _2, \"信息\": _2, \"xn--w4r85el8fhu5dnra\": _2, \"嘉里大酒店\": _2, \"xn--w4rs40l\": _2, \"嘉里\": _2, \"xn--xhq521b\": _2, \"广东\": _2, \"xn--zfr164b\": _2, \"政务\": _2, \"xyz\": [1, { \"blogsite\": _3, \"localzone\": _3, \"crafting\": _3, \"zapto\": _3, \"telebit\": _5 }], \"yachts\": _2, \"yahoo\": _2, \"yamaxun\": _2, \"yandex\": _2, \"yodobashi\": _2, \"yoga\": _2, \"yokohama\": _2, \"you\": _2, \"youtube\": _2, \"yun\": _2, \"zappos\": _2, \"zara\": _2, \"zero\": _2, \"zip\": _2, \"zone\": [1, { \"cloud66\": _3, \"hs\": _3, \"triton\": _5, \"lima\": _3 }], \"zuerich\": _2 }];\n return rules;\n})();\n//# sourceMappingURL=trie.js.map","import { fastPathLookup, } from 'tldts-core';\nimport { exceptions, rules } from './data/trie';\n/**\n * Lookup parts of domain in Trie\n */\nfunction lookupInTrie(parts, trie, index, allowedMask) {\n var _a;\n let result = null;\n let node = trie;\n while (node !== undefined) {\n // We have a match!\n if ((node[0] & allowedMask) !== 0) {\n result = {\n index: index + 1,\n isIcann: node[0] === 1 /* RULE_TYPE.ICANN */,\n isPrivate: node[0] === 2 /* RULE_TYPE.PRIVATE */,\n };\n }\n // No more `parts` to look for\n if (index === -1) {\n break;\n }\n const succ = node[1];\n node = (_a = succ[parts[index]]) !== null && _a !== void 0 ? _a : succ['*'];\n index -= 1;\n }\n return result;\n}\n/**\n * Check if `hostname` has a valid public suffix in `trie`.\n */\nexport default function suffixLookup(hostname, options, out) {\n var _a;\n if (fastPathLookup(hostname, options, out)) {\n return;\n }\n const hostnameParts = hostname.split('.');\n const allowedMask = (options.allowPrivateDomains ? 2 /* RULE_TYPE.PRIVATE */ : 0) |\n (options.allowIcannDomains ? 1 /* RULE_TYPE.ICANN */ : 0);\n // Look for exceptions\n const exceptionMatch = lookupInTrie(hostnameParts, exceptions, hostnameParts.length - 1, allowedMask);\n if (exceptionMatch !== null) {\n out.isIcann = exceptionMatch.isIcann;\n out.isPrivate = exceptionMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(exceptionMatch.index + 1).join('.');\n return;\n }\n // Look for a match in rules\n const rulesMatch = lookupInTrie(hostnameParts, rules, hostnameParts.length - 1, allowedMask);\n if (rulesMatch !== null) {\n out.isIcann = rulesMatch.isIcann;\n out.isPrivate = rulesMatch.isPrivate;\n out.publicSuffix = hostnameParts.slice(rulesMatch.index).join('.');\n return;\n }\n // No match found...\n // Prevailing rule is '*' so we consider the top-level domain to be the\n // public suffix of `hostname` (e.g.: 'example.org' => 'org').\n out.isIcann = false;\n out.isPrivate = false;\n out.publicSuffix = (_a = hostnameParts[hostnameParts.length - 1]) !== null && _a !== void 0 ? _a : null;\n}\n//# sourceMappingURL=suffix-trie.js.map","import { getEmptyResult, parseImpl, resetResult, } from 'tldts-core';\nimport suffixLookup from './src/suffix-trie';\n// For all methods but 'parse', it does not make sense to allocate an object\n// every single time to only return the value of a specific attribute. To avoid\n// this un-necessary allocation, we use a global object which is re-used.\nconst RESULT = getEmptyResult();\nexport function parse(url, options = {}) {\n return parseImpl(url, 5 /* FLAG.ALL */, suffixLookup, options, getEmptyResult());\n}\nexport function getHostname(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 0 /* FLAG.HOSTNAME */, suffixLookup, options, RESULT).hostname;\n}\nexport function getPublicSuffix(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 2 /* FLAG.PUBLIC_SUFFIX */, suffixLookup, options, RESULT)\n .publicSuffix;\n}\nexport function getDomain(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 3 /* FLAG.DOMAIN */, suffixLookup, options, RESULT).domain;\n}\nexport function getSubdomain(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 4 /* FLAG.SUB_DOMAIN */, suffixLookup, options, RESULT)\n .subdomain;\n}\nexport function getDomainWithoutSuffix(url, options = {}) {\n /*@__INLINE__*/ resetResult(RESULT);\n return parseImpl(url, 5 /* FLAG.ALL */, suffixLookup, options, RESULT)\n .domainWithoutSuffix;\n}\n//# sourceMappingURL=index.js.map","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n get errors() {\n return this.issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message || errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n syncPairs.push({\n key: await pair.key,\n value: await pair.value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (typeof value.value !== \"undefined\" || pair.alwaysSet) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n if (typeof ctx.data === \"undefined\") {\n return { message: required_error !== null && required_error !== void 0 ? required_error : ctx.defaultError };\n }\n return { message: invalid_type_error !== null && invalid_type_error !== void 0 ? invalid_type_error : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n }\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this, this._def);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[a-z][a-z0-9]*$/;\nconst ulidRegex = /[0-9A-HJKMNP-TV-Z]{26}/;\nconst uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\nconst emailRegex = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst emojiRegex = /^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$/u;\nconst ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/;\nconst ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\n// Adapted from https://stackoverflow.com/a/3143231\nconst datetimeRegex = (args) => {\n if (args.precision) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}Z$`);\n }\n }\n else if (args.precision === 0) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}Z$`);\n }\n }\n else {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?Z$`);\n }\n }\n};\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n constructor() {\n super(...arguments);\n this._regex = (regex, validation, message) => this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n /**\n * @deprecated Use z.string().min(1) instead.\n * @see {@link ZodString.min}\n */\n this.nonempty = (message) => this.min(1, errorUtil.errToObj(message));\n this.trim = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n this.toLowerCase = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n this.toUpperCase = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n }\n //\n );\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = BigInt(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n syncPairs.push({\n key,\n value: await pair.value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return Object.keys(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else {\n return null;\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n return OK(async (...args) => {\n const error = new ZodError([]);\n const parsedArgs = await this._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await fn(...parsedArgs);\n const parsedReturns = await this._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n return OK((...args) => {\n const parsedArgs = this._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = fn(...parsedArgs.data);\n const parsedReturns = this._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (this._def.values.indexOf(input.data) === -1) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values) {\n return ZodEnum.create(values);\n }\n exclude(values) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)));\n }\n}\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (nativeEnumValues.indexOf(input.data) === -1) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data);\n if (ctx.common.async) {\n return Promise.resolve(processed).then((processed) => {\n return this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n });\n }\n else {\n return this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc\n // effect: RefinementEffect\n ) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nconst custom = (check, params = {}, \n/*\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) => {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n};\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n","import { StringRuleList, NetworkRule, RuleConverter, RuleStorage, setConfiguration, CompatibilityTypes, Engine, Request, CosmeticResult, RequestType as RequestType$1, NetworkRuleOption, replaceAll, indexOfAny, CosmeticRule } from '@adguard/tsurlfilter';\nexport { CosmeticRule, CosmeticRuleType, NetworkRule, NetworkRuleOption } from '@adguard/tsurlfilter';\nimport browser from 'webextension-polyfill';\nimport { parse, getDomain as getDomain$1 } from 'tldts';\nimport { z } from 'zod';\nimport { nanoid } from 'nanoid';\nimport Bowser from 'bowser';\nimport { redirects } from '@adguard/scriptlets';\nimport { LRUMap } from 'lru_map';\n\nconst USER_FILTER_ID = 0;\nconst ALLOWLIST_FILTER_ID = 100;\nconst BACKGROUND_TAB_ID = -1;\n\n/**\n * The allowlist is used to exclude certain websites from filtering.\n * Blocking rules are not applied to the sites in the list.\n * The allow list can also be inverted.\n * In inverted mode, the application will unblock ads everywhere except for the sites added to this list.\n */\nclass Allowlist {\n constructor() {\n this.domains = [];\n this.inverted = false;\n this.enabled = false;\n }\n /**\n * Configures allowlist state based on app configuration.\n *\n * @param configuration App configuration.\n */\n configure(configuration) {\n const { allowlist, settings, } = configuration;\n const { allowlistEnabled, allowlistInverted, } = settings;\n this.enabled = allowlistEnabled;\n this.inverted = allowlistInverted;\n const domains = [];\n allowlist.forEach((hostname) => {\n domains.push(hostname.startsWith('www.') ? hostname.substring(4) : hostname);\n });\n this.domains = domains;\n }\n /**\n * Returns a list of rules to be loaded into the engine based on allowlist state.\n *\n * @returns List of allowlist rules or null.\n */\n getAllowlistRules() {\n if (this.enabled && !this.inverted) {\n return new StringRuleList(ALLOWLIST_FILTER_ID, this.domains.map((domain) => {\n return Allowlist.createAllowlistRuleString(domain);\n }).join('\\n'));\n }\n return null;\n }\n /**\n * Creates allowlist rule for domain.\n *\n * @param domain Domain name.\n * @returns Allowlist rule or null.\n */\n static createAllowlistRule(domain) {\n if (!domain) {\n return null;\n }\n const ruleString = Allowlist.createAllowlistRuleString(domain);\n return new NetworkRule(ruleString, ALLOWLIST_FILTER_ID);\n }\n /**\n * Creates rule string based on specified domain.\n *\n * @param domain Allowlisted domain.\n * @returns Allowlist rule string.\n */\n static createAllowlistRuleString(domain) {\n return String.raw `@@///(www\\.)?${domain}/$document,important`;\n }\n}\n\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\n/**\n * Checks if url is http request.\n *\n * @param url Request url.\n * @returns True if url starts with http{s?}.\n */\nfunction isHttpRequest(url) {\n return !!url && url.indexOf('http') === 0;\n}\n/**\n * Checks if url is http or websocket.\n *\n * @param url Request url.\n * @returns True if url starts with http{s?} or ws.\n */\nfunction isHttpOrWsRequest(url) {\n return !!url && (url.indexOf('http') === 0 || url.indexOf('ws') === 0);\n}\n/**\n * Extract host from url.\n *\n * @param url Url.\n * @returns Host of the url or null.\n */\nfunction getHost(url) {\n let firstIdx = url.indexOf('//');\n if (firstIdx === -1) {\n /**\n * It's non-hierarchical structured URL (stun: or turn:).\n *\n * @see {@link https://tools.ietf.org/html/rfc4395#section-2.2}\n * @see {@link https://tools.ietf.org/html/draft-nandakumar-rtcweb-stun-uri-08#appendix-B}\n */\n firstIdx = url.indexOf(':');\n if (firstIdx === -1) {\n return null;\n }\n firstIdx -= 1;\n }\n const nextSlashIdx = url.indexOf('/', firstIdx + 2);\n const startParamsIdx = url.indexOf('?', firstIdx + 2);\n let lastIdx = nextSlashIdx;\n if (startParamsIdx > 0 && (startParamsIdx < nextSlashIdx || nextSlashIdx < 0)) {\n lastIdx = startParamsIdx;\n }\n let host = lastIdx === -1 ? url.substring(firstIdx + 2) : url.substring(firstIdx + 2, lastIdx);\n const portIndex = host.indexOf(':');\n host = portIndex === -1 ? host : host.substring(0, portIndex);\n const lastChar = host.charAt(host.length - 1);\n if (lastChar === '.') {\n host = host.slice(0, -1);\n }\n return host;\n}\n/**\n * Extracts domain name from url.\n *\n * @param url Url.\n * @returns Domain name or null.\n */\nfunction getDomain(url) {\n const host = getHost(url);\n if (!host) {\n return null;\n }\n return host.startsWith('www.') ? host.substring(4) : host;\n}\n/**\n * If referrer of request contains full url of extension, then this request is considered as extension's own request.\n * Example: request for filter downloading.\n * Related issue: @see {@link https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1437}.\n *\n * @param url Request url.\n * @returns True if request is extension's own.\n */\nfunction isExtensionUrl(url) {\n return url.indexOf(browser.runtime.getURL('')) === 0;\n}\n/**\n * Checks third party relation.\n *\n * @param requestUrl Request url.\n * @param referrer Referrer url.\n * @returns True if request is third-party.\n */\nfunction isThirdPartyRequest(requestUrl, referrer) {\n const tldResult = parse(requestUrl);\n const sourceTldResult = parse(referrer);\n return tldResult.domain !== sourceTldResult.domain;\n}\n\n/**\n * TSUrlFilter Engine wrapper.\n */\nclass EngineApi {\n /**\n * Gets app filtering status.\n *\n * @returns True if filtering is enabled, otherwise returns false.\n */\n get isFilteringEnabled() {\n var _a;\n return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled);\n }\n /**\n * Creates Engine Api instance.\n *\n * @param allowlist Allowlist.\n * @param appContext App context.\n * @param stealthApi Stealth Api.\n */\n constructor(allowlist, appContext, stealthApi) {\n this.allowlist = allowlist;\n this.appContext = appContext;\n this.stealthApi = stealthApi;\n }\n /**\n * Starts engine.\n *\n * @param configuration Engine configuration.\n */\n startEngine(configuration) {\n return __awaiter(this, void 0, void 0, function* () {\n const { filters, userrules, verbose, } = configuration;\n this.allowlist.configure(configuration);\n const lists = [];\n for (let i = 0; i < filters.length; i += 1) {\n const { filterId, content, trusted } = filters[i];\n const convertedContent = RuleConverter.convertRules(content);\n lists.push(new StringRuleList(filterId, convertedContent, false, !trusted, !trusted));\n }\n if (userrules.length > 0) {\n const convertedUserRules = RuleConverter.convertRules(userrules.join('\\n'));\n lists.push(new StringRuleList(USER_FILTER_ID, convertedUserRules));\n }\n const allowlistRules = this.allowlist.getAllowlistRules();\n if (allowlistRules) {\n lists.push(allowlistRules);\n }\n const stealthModeList = this.stealthApi.getStealthModeRuleList();\n if (stealthModeList) {\n lists.push(stealthModeList);\n }\n const ruleStorage = new RuleStorage(lists);\n setConfiguration({\n engine: 'extension',\n version: browser.runtime.getManifest().version,\n verbose,\n compatibility: CompatibilityTypes.Extension,\n });\n /*\n * UI thread becomes blocked on the options page while request filter is created\n * that's why we create filter rules using chunks of the specified length\n * Request filter creation is rather slow operation so we should\n * use setTimeout calls to give UI thread some time.\n */\n const engine = new Engine(ruleStorage, true);\n yield engine.loadRulesAsync(EngineApi.ASYNC_LOAD_CHINK_SIZE);\n this.engine = engine;\n });\n }\n /**\n * Searched for rules by match query.\n *\n * @param matchQuery Query against which the request would be matched.\n * @returns Matching result or null.\n */\n matchRequest(matchQuery) {\n if (!this.engine || !this.isFilteringEnabled) {\n return null;\n }\n const { requestUrl, frameUrl, requestType, method, } = matchQuery;\n let { frameRule } = matchQuery;\n const request = new Request(requestUrl, frameUrl, requestType, method);\n if (!frameRule) {\n frameRule = null;\n }\n return this.engine.matchRequest(request, frameRule);\n }\n /**\n * Searched for cosmetic rules by match query.\n *\n * @param matchQuery Query against which the request would be matched.\n * @returns Cosmetic result.\n */\n matchCosmetic(matchQuery) {\n if (!this.engine || !this.isFilteringEnabled) {\n return new CosmeticResult();\n }\n const matchingResult = this.matchRequest(matchQuery);\n if (!matchingResult) {\n return new CosmeticResult();\n }\n const cosmeticOption = matchingResult.getCosmeticOption();\n return this.getCosmeticResult(matchQuery.requestUrl, cosmeticOption);\n }\n /**\n * Matches current frame url and returns rule if found.\n *\n * @param frameUrl Frame url.\n * @returns NetworkRule or null.\n */\n matchFrame(frameUrl) {\n if (!this.engine || !this.isFilteringEnabled) {\n return null;\n }\n return this.engine.matchFrame(frameUrl);\n }\n /**\n * Gets cosmetic result for the specified hostname and cosmetic options.\n *\n * @param url Request url.\n * @param option Cosmetic options.\n * @returns Cosmetic result.\n */\n getCosmeticResult(url, option) {\n if (!this.engine || !this.isFilteringEnabled) {\n return new CosmeticResult();\n }\n const frameUrl = getHost(url);\n const request = new Request(url, frameUrl, RequestType$1.Document);\n return this.engine.getCosmeticResult(request, option);\n }\n /**\n * Simple getter for rules count.\n *\n * @returns Number of rules in the engine.\n */\n getRulesCount() {\n return this.engine ? this.engine.getRulesCount() : 0;\n }\n}\nEngineApi.ASYNC_LOAD_CHINK_SIZE = 5000;\n\n/**\n * Matches rules from {@link EngineApi} based on current {@link Allowlist} state.\n */\nclass DocumentApi {\n /**\n * Creates new DocumentApi instance.\n *\n * @param allowlist Allowlist API.\n * @param engineApi Engine API.\n */\n constructor(allowlist, engineApi) {\n this.allowlist = allowlist;\n this.engineApi = engineApi;\n }\n /**\n * Match frame rule based on allowlist state.\n *\n * @param frameUrl Frame url.\n * @returns Matched rule or null.\n */\n matchFrame(frameUrl) {\n const { enabled, inverted } = this.allowlist;\n /**\n * If inverted allowlist enabled, use specific matching strategy.\n */\n if (enabled && inverted) {\n return this.matchFrameInverted(frameUrl);\n }\n /**\n * If allowlist mode is default, request rule from engine.\n * If allowlist is enabled, rules have already loaded.\n */\n return this.engineApi.matchFrame(frameUrl);\n }\n /**\n * Creates allowlist rule for domains that are not in the inverted list.\n * In other cases returns engine matched rule.\n *\n * @param frameUrl Frame url.\n * @returns Matched rule or null.\n */\n matchFrameInverted(frameUrl) {\n const domain = getDomain(frameUrl);\n if (!domain) {\n return null;\n }\n if (!this.allowlist.domains.includes(domain)) {\n return Allowlist.createAllowlistRule(domain);\n }\n return this.engineApi.matchFrame(frameUrl);\n }\n}\n\n/**\n * Simple pub-sub implementation.\n */\nclass EventChannel {\n constructor() {\n this.listeners = [];\n }\n /**\n * Dispatch event.\n *\n * @param data Event data.\n */\n dispatch(data) {\n this.listeners.forEach((listener) => listener(data));\n }\n /**\n * Subscribe to events channel.\n *\n * @param listener Callback to be called on event.\n */\n subscribe(listener) {\n this.listeners.push(listener);\n }\n /**\n * Unsubscribe from events channel.\n *\n * @param listener Callback to be removed from listeners.\n */\n unsubscribe(listener) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n}\n\nvar RequestType = {\n NotSet: 0,\n Document: 1,\n SubDocument: 2,\n Script: 4,\n Stylesheet: 8,\n Object: 16,\n Image: 32,\n XmlHttpRequest: 64,\n Media: 128,\n Font: 256,\n WebSocket: 512,\n Ping: 1024,\n Other: 2048,\n};\n\n/**\n * Document level frame id.\n */\nconst MAIN_FRAME_ID = 0;\n/**\n * Frame context data.\n */\nclass Frame {\n /**\n * Creates frame instance.\n *\n * @param url Frame url.\n * @param requestId Request id.\n */\n constructor(url, requestId) {\n this.url = url;\n this.requestId = requestId;\n }\n}\n\nconst logLevelNames = [\n \"error\" /* LogLevelName.Error */,\n \"warn\" /* LogLevelName.Warn */,\n \"info\" /* LogLevelName.Info */,\n \"debug\" /* LogLevelName.Debug */,\n];\nconst LogLevelEnum = z.enum(logLevelNames);\nconst LogLevelValidator = LogLevelEnum.optional();\n/**\n * Stealth mode configuration schema.\n */\nconst stealthConfigValidator = z.object({\n /**\n * Should the application set a fixed lifetime from\n * {@link StealthConfig.selfDestructFirstPartyCookiesTime} for first-party\n * cookies.\n */\n selfDestructFirstPartyCookies: z.boolean(),\n /**\n * Time in minutes to delete first-party cookies.\n */\n selfDestructFirstPartyCookiesTime: z.number(),\n /**\n * Should the application set a fixed lifetime from\n * {@link StealthConfig.selfDestructThirdPartyCookiesTime} for third-party\n * cookies.\n */\n selfDestructThirdPartyCookies: z.boolean(),\n /**\n * Time in minutes to delete third-party cookies.\n */\n selfDestructThirdPartyCookiesTime: z.number(),\n /**\n * Should the application hide the origin referrer in third-party requests\n * by replacing the referrer url with the request url.\n */\n hideReferrer: z.boolean(),\n /**\n * Should the application hide the original referrer from the search page\n * containing the search query in third-party queries, replacing\n * the referrer url with the request url.\n */\n hideSearchQueries: z.boolean(),\n /**\n * For Google Chrome, it removes the 'X-Client-Data' header from\n * the requests, which contains information about the browser version\n * and modifications.\n */\n blockChromeClientData: z.boolean(),\n /**\n * Includes HTTP headers 'DNT' and 'Sec-GPC' in all requests.\n *\n * @see https://en.wikipedia.org/wiki/Do_Not_Track\n * @see https://globalprivacycontrol.org\n */\n sendDoNotTrack: z.boolean(),\n /**\n * Blocks the possibility of leaking your IP address through WebRTC, even if\n * you use a proxy server or VPN.\n */\n blockWebRTC: z.boolean(),\n}).strict();\n/**\n * Settings configuration schema.\n */\nconst settingsConfigValidator = z.object({\n /**\n * If this flag is true, the application will work ONLY with domains\n * from the {@link Configuration.allowlist},\n * otherwise it will work everywhere EXCLUDING domains from the list.\n */\n allowlistInverted: z.boolean(),\n /**\n * Flag specifying {@link Configuration.allowlist} enable state.\n * We don't use allowlist array length condition for calculate enable state,\n * because it's not cover case with empty list in inverted mode.\n */\n allowlistEnabled: z.boolean(),\n /**\n * Enables css hits counter if true.\n */\n collectStats: z.boolean(),\n /**\n * Enables stealth mode if true.\n */\n stealthModeEnabled: z.boolean(),\n /**\n * Enables filtering if true.\n */\n filteringEnabled: z.boolean(),\n /**\n * Redirect url for $document rules.\n */\n documentBlockingPageUrl: z.string().optional(),\n /**\n * Path to the assembled @adguard/assistant module. Necessary for lazy\n * on-demand loading of the assistant.\n */\n assistantUrl: z.string(),\n /**\n * Stealth mode options.\n */\n stealth: stealthConfigValidator,\n});\n/**\n * Generic app configuration schema.\n */\nconst configurationValidator = z.object({\n /**\n * List of hostnames or domains of sites, which should be excluded\n * from blocking or which should be included in blocking\n * depending on the value of {@link SettingsConfig.allowlistInverted} setting value.\n */\n allowlist: z.string().array(),\n /**\n * List of domain names of sites, which should be temporary excluded from document blocking.\n */\n trustedDomains: z.string().array(),\n /**\n * List of rules added by user.\n */\n userrules: z.string().array(),\n /**\n * Flag responsible for logging.\n *\n * @deprecated Will be removed in the next minor version.\n * Use {@link Configuration.logLevel} instead.\n */\n verbose: z.boolean().optional(),\n /**\n * Logging level.\n */\n logLevel: LogLevelValidator,\n settings: settingsConfigValidator,\n}).strict();\n\n/**\n * Top level app context storage.\n *\n * This context is needed to share data between other modules without cyclic dependencies.\n *\n * TODO (v.zhelvis) move app context to common and make it generic.\n */\nclass AppContext {\n constructor() {\n /**\n * Is app started.\n */\n this.isAppStarted = false;\n }\n}\nconst appContext = new AppContext();\n\n// TODO (v.zhelvis) move app context to common and make it generic.\nconst DEFAULT_VERBOSE_FLAG = true;\nconst DEFAULT_LOG_LEVEL = \"error\" /* LogLevelName.Error */;\n/**\n * Export logger implementation.\n */\nclass Logger {\n /**\n * Gets app verbose status.\n *\n * TODO (v.zhelvis) remove eslint rule after passing appContext the right way.\n *\n * @returns App verbose status.\n */\n // eslint-disable-next-line class-methods-use-this\n get verbose() {\n var _a, _b;\n return (_b = (_a = appContext.configuration) === null || _a === void 0 ? void 0 : _a.verbose) !== null && _b !== void 0 ? _b : DEFAULT_VERBOSE_FLAG;\n }\n /**\n * Gets app log level.\n *\n * TODO (v.zhelvis) remove eslint rule after passing appContext the right way.\n *\n * @returns Log level.\n */\n // eslint-disable-next-line class-methods-use-this\n get logLevel() {\n var _a, _b;\n const logLevelString = (_b = (_a = appContext.configuration) === null || _a === void 0 ? void 0 : _a.logLevel) !== null && _b !== void 0 ? _b : DEFAULT_LOG_LEVEL;\n switch (logLevelString) {\n case \"error\" /* LogLevelName.Error */:\n return 1 /* LogLevelWeight.Error */;\n case \"warn\" /* LogLevelName.Warn */:\n return 2 /* LogLevelWeight.Warn */;\n case \"info\" /* LogLevelName.Info */:\n return 3 /* LogLevelWeight.Info */;\n case \"debug\" /* LogLevelName.Debug */:\n return 4 /* LogLevelWeight.Debug */;\n default:\n throw new Error(`Logger only supports following levels: ${[logLevelNames.join(', ')]}`);\n }\n }\n /**\n * Logger constructor.\n *\n * @param loggerImpl Logger implementation to set, defaults to global console.\n */\n constructor(loggerImpl = console) {\n this.loggerImpl = loggerImpl;\n this.error = this.error.bind(this);\n this.warn = this.warn.bind(this);\n this.debug = this.debug.bind(this);\n this.info = this.info.bind(this);\n }\n /**\n * Calls error method on logger implementation.\n *\n * @param message Log message.\n */\n error(message) {\n if (this.logLevel >= 1 /* LogLevelWeight.Error */) {\n this.loggerImpl.error(message);\n }\n }\n /**\n * Calls warn method on logger implementation.\n *\n * @param message Log message.\n */\n warn(message) {\n if (this.verbose && this.logLevel >= 2 /* LogLevelWeight.Warn */) {\n this.loggerImpl.warn(message);\n }\n }\n /**\n * Calls debug method on logger implementation.\n *\n * @param message Log message.\n */\n debug(message) {\n if (this.verbose && this.logLevel >= 4 /* LogLevelWeight.Debug */) {\n this.loggerImpl.debug(message);\n }\n }\n /**\n * Calls info method on logger implementation.\n *\n * @param message Log message.\n */\n info(message) {\n if (this.verbose && this.logLevel >= 3 /* LogLevelWeight.Info */) {\n this.loggerImpl.info(message);\n }\n }\n}\nconst logger = new Logger();\n\n/**\n * Types of filtering events that can occur during request processing.\n */\nvar FilteringEventType;\n(function (FilteringEventType) {\n FilteringEventType[\"SendRequest\"] = \"sendRequest\";\n FilteringEventType[\"TabReload\"] = \"tabReload\";\n FilteringEventType[\"ApplyBasicRule\"] = \"applyBasicRule\";\n FilteringEventType[\"ApplyCosmeticRule\"] = \"applyCosmeticRule\";\n // TODO: Doesn't look like it's being used.\n FilteringEventType[\"ApplyCspRule\"] = \"applyCspRule\";\n FilteringEventType[\"ReceiveResponse\"] = \"receiveResponse\";\n FilteringEventType[\"Cookie\"] = \"cookie\";\n FilteringEventType[\"RemoveHeader\"] = \"removeHeader\";\n FilteringEventType[\"RemoveParam\"] = \"removeParam\";\n FilteringEventType[\"ReplaceRuleApply\"] = \"replaceRuleApply\";\n FilteringEventType[\"ContentFilteringStart\"] = \"contentFilteringStart\";\n FilteringEventType[\"ContentFilteringFinish\"] = \"contentFilteringFinish\";\n FilteringEventType[\"StealthAction\"] = \"stealthAction\";\n FilteringEventType[\"JsInject\"] = \"jsInject\";\n})(FilteringEventType || (FilteringEventType = {}));\n/**\n * {@link FilteringLogInterface} Default implementation.\n */\nclass FilteringLog {\n constructor() {\n this.onLogEvent = new EventChannel();\n this.channels = [];\n }\n /**\n * Registers listener for specified {@link FilteringLogEvent}.\n *\n * @param type Filtering log type.\n * @param listener Filtering log listener.\n */\n addEventListener(type, listener) {\n const channel = { type, listener };\n this.channels.push(channel);\n }\n /**\n * Publishes event to attached listeners.\n *\n * @param event Filtering log event.\n */\n publishEvent(event) {\n const listeners = this.channels\n .filter(({ type }) => type === event.type)\n .map(({ listener }) => listener);\n for (const listener of listeners) {\n listener(event);\n }\n this.onLogEvent.dispatch(event);\n }\n}\n/**\n * Shared {@link FilteringLog} instance.\n */\nconst defaultFilteringLog = new FilteringLog();\n\n/**\n * Tab context.\n */\nclass TabContext {\n /**\n * Context constructor.\n *\n * @param info Webextension API tab data.\n * @param documentApi Document API.\n * @param filteringLog Filtering Log API.\n */\n constructor(info, documentApi, filteringLog = defaultFilteringLog) {\n this.info = info;\n this.documentApi = documentApi;\n this.filteringLog = filteringLog;\n /**\n * Frames context.\n */\n this.frames = new Map();\n /**\n * Blocked request count.\n */\n this.blockedRequestCount = 0;\n /**\n * Document level rule, applied to the tab.\n */\n this.mainFrameRule = null;\n /**\n * We mark these tabs as synthetic because they may not actually exist.\n */\n this.isSyntheticTab = true;\n /**\n * Is document page request handled by memory cache or sw.\n */\n this.isDocumentRequestCached = false;\n this.info = info;\n }\n /**\n * Updates tab info.\n *\n * @param changeInfo Tab change info.\n */\n updateTabInfo(changeInfo) {\n this.info = Object.assign(this.info, changeInfo);\n // If the tab was updated it means that it wasn't used to send requests in the background.\n this.isSyntheticTab = false;\n // Update main frame data when we navigate to another page with document request caching enabled.\n if (changeInfo.url) {\n // Get current main frame.\n const frame = this.frames.get(MAIN_FRAME_ID);\n // If main frame url is the same as request url, do nothing.\n if ((frame === null || frame === void 0 ? void 0 : frame.url) === changeInfo.url) {\n return;\n }\n // If the main frame doesn't exist or its URL is different from the request URL,\n // it means that the document request hasn't been processed by the WebRequestApi yet.\n // In this case, we mark the tab as using the cache and update its context using the tabsApi.\n this.isDocumentRequestCached = true;\n // Update main frame data.\n this.handleMainFrameRequest(changeInfo.url);\n }\n // When the cached page is reloaded, we need to manually update\n // the main frame rule for correct document-level rule processing.\n if (!changeInfo.url\n && changeInfo.status === 'loading'\n && this.isDocumentRequestCached\n && this.info.url) {\n this.handleMainFrameRequest(this.info.url);\n }\n }\n /**\n * Increments blocked requests count.\n */\n incrementBlockedRequestCount() {\n this.blockedRequestCount += 1;\n }\n /**\n * Handles document or subdocument request and stores data in specified frame context.\n * If the request is a document request, will also match the main frame rule\n * and store it in the {@link mainFrameRule} property.\n * This method is called before filtering processing in WebRequest onBeforeRequest handler.\n * MatchingResult is handled in {@link handleFrameMatchingResult}.\n * CosmeticResult is handled in {@link handleFrameCosmeticResult}.\n *\n * @param requestContext Request context data.\n */\n handleFrameRequest(requestContext) {\n // This method is called in the WebRequest onBeforeRequest handler.\n // It means that the request is being processed.\n this.isDocumentRequestCached = false;\n const { frameId, requestId, requestUrl, requestType, } = requestContext;\n if (requestType === RequestType.Document) {\n this.handleMainFrameRequest(requestUrl, requestId);\n }\n else {\n this.frames.set(frameId, new Frame(requestUrl, requestId));\n }\n }\n /**\n * Handles request {@link MatchingResult} from WebRequest onBeforeRequest handler\n * and stores it in specified frame context.\n *\n * @param frameId Frame id.\n * @param matchingResult Matching result.\n */\n handleFrameMatchingResult(frameId, matchingResult) {\n const frame = this.frames.get(frameId);\n if (frame) {\n frame.matchingResult = matchingResult;\n }\n }\n /**\n * Handles frame {@link CosmeticResult} from WebRequest onBeforeRequest handler\n * and stores it in specified frame context.\n *\n * @param frameId Frame id.\n * @param cosmeticResult Cosmetic result.\n */\n handleFrameCosmeticResult(frameId, cosmeticResult) {\n const frame = this.frames.get(frameId);\n if (frame) {\n frame.cosmeticResult = cosmeticResult;\n }\n }\n /**\n * Handles document request and updates main frame context.\n *\n * Also matches document level rule and store it {@link mainFrameRule}.\n *\n * MatchingResult handles in {@link handleFrameMatchingResult}.\n * CosmeticResult handles in {@link handleFrameCosmeticResult}.\n *\n * @param requestUrl Request url.\n * @param requestId Request id.\n */\n handleMainFrameRequest(requestUrl, requestId) {\n // Clear frames data on tab reload.\n this.frames.clear();\n // Set new main frame data.\n this.frames.set(MAIN_FRAME_ID, new Frame(requestUrl, requestId));\n // Calculate new main frame rule.\n this.mainFrameRule = this.documentApi.matchFrame(requestUrl);\n // Reset tab blocked count.\n this.blockedRequestCount = 0;\n // dispatch filtering log reload event\n this.filteringLog.publishEvent({\n type: FilteringEventType.TabReload,\n data: {\n tabId: this.info.id,\n },\n });\n }\n /**\n * Creates context for new tab.\n *\n * @param tab Webextension API tab data.\n * @param allowlistApi Allowlist API.\n * @returns Tab context for new tab.\n */\n static createNewTabContext(tab, allowlistApi) {\n const tabContext = new TabContext(tab, allowlistApi);\n // In some cases, tab is created while browser navigation processing.\n // For example: when you navigate outside the browser or create new empty tab.\n // `pendingUrl` represent url navigated to. We check it first.\n // If server returns redirect, new main frame url will be processed in WebRequestApi.\n const url = tab.pendingUrl || tab.url;\n if (url) {\n tabContext.mainFrameRule = allowlistApi.matchFrame(url);\n tabContext.frames.set(MAIN_FRAME_ID, new Frame(url));\n }\n return tabContext;\n }\n /**\n * Checks if passed {@link Tabs.Tab} details represent a browser tab.\n *\n * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/Tab#type\n * @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/TAB_ID_NONE\n *\n * @param tab Tab details.\n * @returns True if the tab is a browser tab, otherwise returns false.\n */\n static isBrowserTab(tab) {\n return typeof tab.id === 'number' && tab.id !== browser.tabs.TAB_ID_NONE;\n }\n}\n\n/**\n * Tabs API. Wrapper around browser.tabs API.\n */\nclass TabsApi {\n /**\n * Tabs API constructor.\n *\n * @param documentApi Document API.\n */\n constructor(documentApi) {\n this.documentApi = documentApi;\n this.context = new Map();\n this.onCreate = new EventChannel();\n this.onUpdate = new EventChannel();\n this.onDelete = new EventChannel();\n this.onActivate = new EventChannel();\n this.handleTabCreate = this.handleTabCreate.bind(this);\n this.handleTabUpdate = this.handleTabUpdate.bind(this);\n this.handleTabActivate = this.handleTabActivate.bind(this);\n this.handleTabDelete = this.handleTabDelete.bind(this);\n this.handleFrameRequest = this.handleFrameRequest.bind(this);\n this.handleFrameCosmeticResult = this.handleFrameCosmeticResult.bind(this);\n this.handleFrameMatchingResult = this.handleFrameMatchingResult.bind(this);\n this.getTabContext = this.getTabContext.bind(this);\n this.getTabFrameRule = this.getTabFrameRule.bind(this);\n this.getTabFrame = this.getTabFrame.bind(this);\n this.getTabMainFrame = this.getTabMainFrame.bind(this);\n this.onWindowFocusChanged = this.onWindowFocusChanged.bind(this);\n }\n /**\n * Initializes tabs API and starts listening for tab & window events.\n */\n start() {\n return __awaiter(this, void 0, void 0, function* () {\n browser.tabs.onCreated.addListener(this.handleTabCreate);\n browser.tabs.onRemoved.addListener(this.handleTabDelete);\n browser.tabs.onUpdated.addListener(this.handleTabUpdate);\n browser.tabs.onActivated.addListener(this.handleTabActivate);\n browser.windows.onFocusChanged.addListener(this.onWindowFocusChanged);\n });\n }\n /**\n * Stops listening for tab & window events and clears tabs context.\n */\n stop() {\n browser.tabs.onCreated.removeListener(this.handleTabCreate);\n browser.tabs.onRemoved.removeListener(this.handleTabDelete);\n browser.tabs.onUpdated.removeListener(this.handleTabUpdate);\n browser.tabs.onActivated.removeListener(this.handleTabActivate);\n browser.windows.onFocusChanged.removeListener(this.onWindowFocusChanged);\n this.context.clear();\n }\n /**\n * Retrieves frame rule for the tab context.\n *\n * @param tabId Tab ID.\n * @returns Frame rule or null if not found.\n */\n getTabFrameRule(tabId) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return null;\n }\n return tabContext.mainFrameRule;\n }\n /**\n * Retrieves frame data for the frame in the tab context.\n *\n * @param tabId Tab ID.\n * @param frameId Frame ID.\n * @returns Frame data or null if not found.\n */\n getTabFrame(tabId, frameId) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return null;\n }\n const frame = tabContext.frames.get(frameId);\n if (!frame) {\n return null;\n }\n return frame;\n }\n /**\n * Retrieves main frame data for the tab context.\n *\n * @param tabId Tab ID.\n * @returns Frame data or null if not found.\n */\n getTabMainFrame(tabId) {\n return this.getTabFrame(tabId, MAIN_FRAME_ID);\n }\n /**\n * Records request context to the tab context.\n *\n * @param requestContext Tab's frame's request context.\n */\n handleFrameRequest(requestContext) {\n const { tabId } = requestContext;\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return;\n }\n tabContext.handleFrameRequest(requestContext);\n }\n /**\n * Records frame cosmetic result to the tab context.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @param cosmeticResult Frame {@link CosmeticResult}.\n */\n handleFrameCosmeticResult(tabId, frameId, cosmeticResult) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return;\n }\n tabContext.handleFrameCosmeticResult(frameId, cosmeticResult);\n }\n /**\n * Records frame matching result to the tab context.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @param matchingResult Frame {@link MatchingResult}.\n */\n handleFrameMatchingResult(tabId, frameId, matchingResult) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return;\n }\n tabContext.handleFrameMatchingResult(frameId, matchingResult);\n }\n /**\n * Retrieves tab context by tab ID.\n *\n * @param tabId Tab ID.\n * @returns Tab context or undefined if not found.\n */\n getTabContext(tabId) {\n return this.context.get(tabId);\n }\n /**\n * Checks whether the tab with the specified ID is open in incognito mode\n * or not.\n *\n * @param tabId Tab ID.\n * @returns True if the tab is open in incognito mode, and false\n * if otherwise.\n */\n isIncognitoTab(tabId) {\n const tabContext = this.getTabContext(tabId);\n if (!tabContext) {\n return false;\n }\n return tabContext.info.incognito;\n }\n /**\n * Increments tab context blocked request count.\n *\n * @param tabId Tab ID.\n */\n incrementTabBlockedRequestCount(tabId) {\n const tabContext = this.context.get(tabId);\n if (!tabContext) {\n return;\n }\n tabContext.incrementBlockedRequestCount();\n }\n /**\n * Updates tab's main frame rule.\n *\n * @param tabId Tab ID.\n */\n updateTabMainFrameRule(tabId) {\n const tabContext = this.context.get(tabId);\n if (!(tabContext === null || tabContext === void 0 ? void 0 : tabContext.info.url)) {\n return;\n }\n tabContext.mainFrameRule = this.documentApi.matchFrame(tabContext.info.url);\n }\n /**\n * Updates tab context data after filter engine load.\n */\n updateCurrentTabsMainFrameRules() {\n return __awaiter(this, void 0, void 0, function* () {\n const currentTabs = yield browser.tabs.query({});\n if (!Array.isArray(currentTabs)) {\n return;\n }\n for (const tab of currentTabs) {\n if (typeof tab.id === 'number') {\n this.updateTabMainFrameRule(tab.id);\n }\n }\n });\n }\n /**\n * Checks if tab is a new tab.\n *\n * TODO: Change in AG-22715: if the lifetime of the tab is less than N\n * seconds (for example 5 seconds), then it is a popup and we close it. If\n * the opposite is true, then we block it with a stub.\n *\n * @param tabId Tab ID.\n * @returns True if tab is a new tab.\n */\n isNewPopupTab(tabId) {\n var _a;\n const tab = this.context.get(tabId);\n if (!tab) {\n return false;\n }\n const url = (_a = tab.info) === null || _a === void 0 ? void 0 : _a.url;\n return url === undefined\n || url === ''\n || url === 'about:blank';\n }\n /**\n * Creates a new tab context.\n *\n * @param tab Tab info.\n * @param tab.id Tab id.\n *\n * @returns Created tab context, or null if tab is not browser tab.\n */\n handleTabCreate(tab) {\n if (!TabContext.isBrowserTab(tab)) {\n return null;\n }\n const tabContext = TabContext.createNewTabContext(tab, this.documentApi);\n this.context.set(tab.id, tabContext);\n this.onCreate.dispatch(tabContext);\n return tabContext;\n }\n /**\n * Removes tab context by tab ID.\n *\n * @param tabId Tab ID.\n */\n handleTabDelete(tabId) {\n const tabContext = this.context.get(tabId);\n if (tabContext) {\n this.context.delete(tabId);\n this.onDelete.dispatch(tabContext);\n }\n }\n /**\n * Updates tab context data on tab update.\n *\n * @param tabId Tab ID.\n * @param changeInfo Tab change info.\n */\n handleTabUpdate(tabId, changeInfo) {\n // TODO: we can ignore some events (favicon url update etc.)\n const tabContext = this.context.get(tabId);\n if (tabContext) {\n tabContext.updateTabInfo(changeInfo);\n this.onUpdate.dispatch(tabContext);\n }\n }\n /**\n * Dispatches tab on activated event.\n *\n * @param info Tab activated info.\n * @param info.tabId Tab ID.\n */\n handleTabActivate({ tabId }) {\n const tabContext = this.context.get(tabId);\n if (tabContext) {\n this.onActivate.dispatch(tabContext);\n }\n }\n /**\n * Called when focus state of window changed.\n *\n * @param windowId Window ID.\n */\n onWindowFocusChanged(windowId) {\n return __awaiter(this, void 0, void 0, function* () {\n // If all browser windows have lost focus.\n if (windowId === browser.windows.WINDOW_ID_NONE) {\n return;\n }\n const [activeTab] = yield browser.tabs.query({\n active: true,\n windowId,\n });\n if (!activeTab || !activeTab.id) {\n return;\n }\n const tabContext = this.context.get(activeTab.id);\n if (tabContext) {\n this.onActivate.dispatch(tabContext);\n }\n });\n }\n /**\n * Injects script to the frame by tab id and frame id.\n *\n * @param code Script to be injected.\n * @param tabId Tab ID.\n * @param frameId Frame ID.\n */\n static injectScript(code, tabId, frameId) {\n return __awaiter(this, void 0, void 0, function* () {\n const injectDetails = {\n code,\n frameId,\n runAt: 'document_start',\n matchAboutBlank: true,\n };\n yield browser.tabs.executeScript(tabId, injectDetails);\n });\n }\n /**\n * Injects css styles to the frame by tab id and frame id.\n *\n * @param code CSS styles to be injected.\n * @param tabId Tab ID.\n * @param frameId Frame ID.\n */\n static injectCss(code, tabId, frameId) {\n return __awaiter(this, void 0, void 0, function* () {\n const injectDetails = {\n code,\n frameId,\n runAt: 'document_start',\n matchAboutBlank: true,\n cssOrigin: 'user',\n };\n yield browser.tabs.insertCSS(tabId, injectDetails);\n });\n }\n}\n\n/**\n * Finds header object by header name (case-insensitive).\n *\n * @param headers Headers collection.\n * @param headerName Header name.\n * @returns Found header, or null if not found.\n */\nfunction findHeaderByName(headers, headerName) {\n for (let i = 0; i < headers.length; i += 1) {\n const header = headers[i];\n if (header.name.toLowerCase() === headerName.toLowerCase()) {\n return header;\n }\n }\n return null;\n}\n/**\n * TODO: Make function pure (don't modify headers, return new object instead)\n * Removes header from headers by name.\n *\n * @param headers Headers collection.\n * @param headerName Header name.\n * @returns True if headers were removed.\n */\nfunction removeHeader(headers, headerName) {\n let removed = false;\n for (let i = headers.length - 1; i >= 0; i -= 1) {\n const header = headers[i];\n if (header.name.toLowerCase() === headerName.toLowerCase()) {\n headers.splice(i, 1);\n removed = true;\n }\n }\n return removed;\n}\n\n// Disable jest coverage for this file, because it will insert\n// line comments, and code to count lines covered by tests, for example:\n// /* istanbul ignore next */\n// cov_uqm40oh03().f[0]++;\n// cov_uqm40oh03().s[2]++;\n// And we cannot test these strings correctly, because the names of these\n// functions with counters are generated at runtime\n/* istanbul ignore file */\n/**\n * This module applies stealth actions in page context.\n */\nclass StealthHelper {\n /**\n * Sends a Global Privacy Control DOM signal.\n */\n static setDomSignal() {\n try {\n if ('globalPrivacyControl' in Navigator.prototype) {\n return;\n }\n Object.defineProperty(Navigator.prototype, 'globalPrivacyControl', {\n get: () => true,\n configurable: true,\n enumerable: true,\n });\n }\n catch (ex) {\n // Ignore\n }\n }\n}\n\n/**\n * Stealth action bitwise masks used on the background page and on the filtering log page.\n */\nvar StealthActions;\n(function (StealthActions) {\n StealthActions[StealthActions[\"None\"] = 0] = \"None\";\n StealthActions[StealthActions[\"HideReferrer\"] = 1] = \"HideReferrer\";\n StealthActions[StealthActions[\"HideSearchQueries\"] = 2] = \"HideSearchQueries\";\n StealthActions[StealthActions[\"BlockChromeClientData\"] = 4] = \"BlockChromeClientData\";\n StealthActions[StealthActions[\"SendDoNotTrack\"] = 8] = \"SendDoNotTrack\";\n // TODO check where this enums are used, and add comments\n StealthActions[StealthActions[\"FirstPartyCookies\"] = 16] = \"FirstPartyCookies\";\n StealthActions[StealthActions[\"ThirdPartyCookies\"] = 32] = \"ThirdPartyCookies\";\n})(StealthActions || (StealthActions = {}));\n/**\n * Stealth service module.\n */\nclass StealthService {\n /**\n * Configuration.\n *\n * @returns App Stealth configuration or undefined.\n */\n get config() {\n var _a;\n return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth;\n }\n /**\n * Constructor.\n *\n * @param appContext App context.\n * @param filteringLog Filtering log.\n */\n constructor(appContext, filteringLog) {\n this.appContext = appContext;\n this.filteringLog = filteringLog;\n }\n /**\n * Returns synthetic set of rules matching the specified request.\n *\n * @returns Strings of cookie rules.\n */\n getCookieRulesTexts() {\n var _a, _b;\n const result = [];\n if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.selfDestructFirstPartyCookies) {\n result.push(StealthService.generateCookieRuleText(this.config.selfDestructFirstPartyCookiesTime));\n }\n if ((_b = this.config) === null || _b === void 0 ? void 0 : _b.selfDestructThirdPartyCookies) {\n result.push(StealthService.generateCookieRuleText(this.config.selfDestructThirdPartyCookiesTime, true));\n }\n return result;\n }\n /**\n * Applies stealth actions to request headers.\n *\n * @param context Request context.\n * @returns Stealth actions bitmask.\n */\n processRequestHeaders(context) {\n var _a, _b, _c, _d;\n let stealthActions = StealthActions.None;\n const { requestUrl, requestType, requestHeaders } = context;\n if (!requestHeaders) {\n return stealthActions;\n }\n // Remove referrer for third-party requests\n if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.hideReferrer) {\n const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER);\n if (refHeader\n && refHeader.value\n && isThirdPartyRequest(requestUrl, refHeader.value)) {\n refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl);\n stealthActions |= StealthActions.HideReferrer;\n }\n }\n // Hide referrer in case of search engine is referrer\n const isMainFrame = requestType === RequestType.Document;\n if (((_b = this.config) === null || _b === void 0 ? void 0 : _b.hideSearchQueries) && isMainFrame) {\n const refHeader = findHeaderByName(requestHeaders, StealthService.HEADERS.REFERRER);\n if (refHeader\n && refHeader.value\n && StealthService.isSearchEngine(refHeader.value)\n && isThirdPartyRequest(requestUrl, refHeader.value)) {\n refHeader.value = StealthService.createMockRefHeaderUrl(requestUrl);\n stealthActions |= StealthActions.HideSearchQueries;\n }\n }\n // Remove X-Client-Data header\n if ((_c = this.config) === null || _c === void 0 ? void 0 : _c.blockChromeClientData) {\n if (removeHeader(requestHeaders, StealthService.HEADERS.X_CLIENT_DATA)) {\n stealthActions |= StealthActions.BlockChromeClientData;\n }\n }\n // Adding Do-Not-Track (DNT) header\n if ((_d = this.config) === null || _d === void 0 ? void 0 : _d.sendDoNotTrack) {\n requestHeaders.push(StealthService.HEADER_VALUES.DO_NOT_TRACK);\n requestHeaders.push(StealthService.HEADER_VALUES.GLOBAL_PRIVACY_CONTROL);\n stealthActions |= StealthActions.SendDoNotTrack;\n }\n if (stealthActions > 0) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.StealthAction,\n data: {\n tabId: context.tabId,\n eventId: context.eventId,\n stealthActions,\n },\n });\n }\n return stealthActions;\n }\n /**\n * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string.\n *\n * @returns Dom signal script.\n */\n getSetDomSignalScript() {\n var _a;\n if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.sendDoNotTrack) {\n return `;(function ${StealthHelper.setDomSignal.toString()})();`;\n }\n return '';\n }\n /**\n * Generates rule removing cookies.\n *\n * @param maxAgeMinutes Cookie maxAge in minutes.\n * @param isThirdParty Flag for generating third-party rule texts.\n * @returns Rule text.\n */\n static generateCookieRuleText(maxAgeMinutes, isThirdParty = false) {\n const maxAgeOption = maxAgeMinutes > 0 ? `;maxAge=${maxAgeMinutes * 60}` : '';\n const thirdPartyOption = isThirdParty ? ',third-party' : '';\n const ruleText = `$cookie=/.+/${maxAgeOption}${thirdPartyOption}`;\n return ruleText;\n }\n /**\n * Crops url path.\n *\n * @param url URL.\n * @returns URL without path.\n */\n static createMockRefHeaderUrl(url) {\n const host = getHost(url);\n return `${(url.indexOf('https') === 0 ? 'https://' : 'http://') + host}/`;\n }\n /**\n * Is url search engine.\n *\n * @param url Url for check.\n * @returns True if url is search engine.\n */\n static isSearchEngine(url) {\n return StealthService.SEARCH_ENGINES.some((searchEngineRegex) => searchEngineRegex.test(url));\n }\n}\n/**\n * Headers.\n */\nStealthService.HEADERS = {\n REFERRER: 'Referer',\n X_CLIENT_DATA: 'X-Client-Data',\n DO_NOT_TRACK: 'DNT',\n};\n/**\n * Header values.\n */\nStealthService.HEADER_VALUES = {\n DO_NOT_TRACK: {\n name: 'DNT',\n value: '1',\n },\n GLOBAL_PRIVACY_CONTROL: {\n name: 'Sec-GPC',\n value: '1',\n },\n};\n/**\n * Search engines regexps.\n */\nStealthService.SEARCH_ENGINES = [\n /https?:\\/\\/(www\\.)?google\\./i,\n /https?:\\/\\/(www\\.)?yandex\\./i,\n /https?:\\/\\/(www\\.)?bing\\./i,\n /https?:\\/\\/(www\\.)?yahoo\\./i,\n /https?:\\/\\/(www\\.)?go\\.mail\\.ru/i,\n /https?:\\/\\/(www\\.)?ask\\.com/i,\n /https?:\\/\\/(www\\.)?aol\\.com/i,\n /https?:\\/\\/(www\\.)?baidu\\.com/i,\n /https?:\\/\\/(www\\.)?seznam\\.cz/i,\n];\n\n/**\n * @file\n * This file contains constants for communication between background and content scripts.\n * This constants are separated from message.ts to reduce bundle size,\n * because rollup cannot tree-shake tswebextension library code.\n */\n/**\n * Name of the message handler.\n * It is needed for determining specific tswebextension message from other messages.\n */\nconst MESSAGE_HANDLER_NAME = 'tsWebExtension';\n/**\n * Message types for communication between background and content scripts.\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"ProcessShouldCollapse\"] = \"processShouldCollapse\";\n MessageType[\"GetCosmeticData\"] = \"getCosmeticData\";\n MessageType[\"GetCss\"] = \"getCss\";\n MessageType[\"GetCookieRules\"] = \"getCookieRules\";\n MessageType[\"SaveCookieLogEvent\"] = \"saveCookieLogEvent\";\n MessageType[\"InitAssistant\"] = \"initAssistant\";\n MessageType[\"CloseAssistant\"] = \"closeAssistant\";\n MessageType[\"AssistantCreateRule\"] = \"assistantCreateRule\";\n MessageType[\"SaveCssHitsStats\"] = \"saveCssHitsStats\";\n})(MessageType || (MessageType = {}));\n\n/**\n * @file\n * This file contains validation schemas and inferred types for message data.\n */\n/**\n * Message DTO validation schema.\n */\nconst messageValidator = z.object({\n handlerName: z.literal(MESSAGE_HANDLER_NAME),\n type: z.nativeEnum(MessageType),\n payload: z.unknown(),\n}).strict();\n/**\n * {@link MessageType.ProcessShouldCollapse} Message payload validation schema.\n */\nconst processShouldCollapsePayloadValidator = z.object({\n elementUrl: z.string(),\n documentUrl: z.string(),\n requestType: z.nativeEnum(RequestType$1),\n}).strict();\n/**\n * {@link MessageType.GetCosmeticData} Message payload validation schema.\n */\nconst getExtendedCssPayloadValidator = z.object({\n documentUrl: z.string(),\n}).strict();\n/**\n * {@link MessageType.GetCss} Message payload validation schema.\n */\nconst getCssPayloadValidator = z.object({\n url: z.string(),\n referrer: z.string(),\n}).strict();\n/**\n * {@link MessageType.GetCookieRules} Message payload validation schema.\n */\nconst getCookieRulesPayloadValidator = z.object({\n documentUrl: z.string(),\n}).strict();\n/**\n * {@link MessageType.SaveCookieLogEvent} Message payload validation schema.\n */\nconst getSaveCookieLogEventPayloadValidator = z.object({\n cookieName: z.string(),\n cookieDomain: z.string(),\n cookieValue: z.string(),\n ruleText: z.string(),\n filterId: z.number(),\n thirdParty: z.boolean(),\n}).strict();\n/**\n * {@link MessageType.InitAssistant} Message payload validation schema.\n */\nconst getAssistantCreateRulePayloadValidator = z.object({\n ruleText: z.string(),\n}).strict();\n\n// TODO check if we can return typed message here\n/**\n * Sends message to the background page.\n *\n * @param message Message to send.\n * @param message.payload Payload of the message.\n * @param message.type Message type.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst sendAppMessage = (message) => __awaiter(void 0, void 0, void 0, function* () {\n return browser.runtime.sendMessage(Object.assign({ handlerName: MESSAGE_HANDLER_NAME }, message));\n});\n\n/**\n * Request content type.\n *\n * NOTE: Do not use `const enum`,\n * because this enum is imported in extension frontend writing in js.\n */\nvar ContentType;\n(function (ContentType) {\n ContentType[\"Document\"] = \"document\";\n ContentType[\"Subdocument\"] = \"subdocument\";\n ContentType[\"Script\"] = \"script\";\n ContentType[\"Stylesheet\"] = \"stylesheet\";\n ContentType[\"Object\"] = \"object\";\n ContentType[\"Image\"] = \"image\";\n ContentType[\"XmlHttpRequest\"] = \"xmlHttpRequest\";\n ContentType[\"Media\"] = \"media\";\n ContentType[\"Font\"] = \"font\";\n ContentType[\"Websocket\"] = \"websocket\";\n ContentType[\"WebRtc\"] = \"webRtc\";\n ContentType[\"Other\"] = \"other\";\n ContentType[\"Csp\"] = \"csp\";\n ContentType[\"Cookie\"] = \"cookie\";\n ContentType[\"Ping\"] = \"ping\";\n ContentType[\"CspReport\"] = \"cspReport\";\n})(ContentType || (ContentType = {}));\n/**\n * Returns request type and content type by resource type.\n *\n * @param resourceType Resource type.\n * @returns Request type and content type.\n */\nfunction getRequestType(resourceType) {\n switch (resourceType) {\n case 'main_frame':\n return {\n contentType: ContentType.Document,\n requestType: RequestType.Document,\n };\n case 'sub_frame':\n return {\n contentType: ContentType.Subdocument,\n requestType: RequestType.SubDocument,\n };\n case 'stylesheet':\n return {\n contentType: ContentType.Stylesheet,\n requestType: RequestType.Stylesheet,\n };\n case 'script':\n return {\n contentType: ContentType.Script,\n requestType: RequestType.Script,\n };\n case 'image':\n case 'imageset':\n return {\n contentType: ContentType.Image,\n requestType: RequestType.Image,\n };\n case 'object':\n return {\n contentType: ContentType.Object,\n requestType: RequestType.Object,\n };\n case 'xmlhttprequest':\n return {\n contentType: ContentType.XmlHttpRequest,\n requestType: RequestType.XmlHttpRequest,\n };\n case 'ping':\n case 'beacon':\n return {\n contentType: ContentType.Ping,\n requestType: RequestType.Ping,\n };\n case 'font':\n return {\n contentType: ContentType.Font,\n requestType: RequestType.Font,\n };\n case 'media':\n return {\n contentType: ContentType.Media,\n requestType: RequestType.Media,\n };\n case 'websocket':\n return {\n contentType: ContentType.Websocket,\n requestType: RequestType.WebSocket,\n };\n case 'csp_report':\n return {\n contentType: ContentType.CspReport,\n requestType: RequestType.Other,\n };\n default:\n return {\n contentType: ContentType.Other,\n requestType: RequestType.Other,\n };\n }\n}\n\n/**\n * Checks if error has message.\n *\n * @param error Error object.\n * @returns If param is error.\n */\nfunction isErrorWithMessage(error) {\n return (typeof error === 'object'\n && error !== null\n && 'message' in error\n && typeof error.message === 'string');\n}\n/**\n * Converts error to the error with message.\n *\n * @param maybeError Possible error.\n * @returns Error with message.\n */\nfunction toErrorWithMessage(maybeError) {\n if (isErrorWithMessage(maybeError)) {\n return maybeError;\n }\n try {\n return new Error(JSON.stringify(maybeError));\n }\n catch (_a) {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n/**\n * Converts error object to error with message. This method might be helpful to handle thrown errors.\n *\n * @param error Error object.\n *\n * @returns Message of the error.\n */\nfunction getErrorMessage(error) {\n return toErrorWithMessage(error).message;\n}\n\n/**\n * Stealth api implementation.\n */\nclass StealthApi {\n /**\n * Stealth configuration.\n *\n * @returns App Stealth configuration or undefined.\n */\n get configuration() {\n var _a;\n return (_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealth;\n }\n /**\n * Gets app stealth mode status.\n *\n * @returns True if stealth mode is enabled, otherwise returns false.\n */\n get isStealthModeEnabled() {\n var _a;\n return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.stealthModeEnabled);\n }\n /**\n * Gets app filtering status.\n *\n * @returns True if filtering is enabled, otherwise returns false.\n */\n get isFilteringEnabled() {\n var _a;\n return Boolean((_a = this.appContext.configuration) === null || _a === void 0 ? void 0 : _a.settings.filteringEnabled);\n }\n /**\n * Stealth API constructor.\n *\n * @param appContextInstance App context.\n * @param filteringLog Filtering log.\n */\n constructor(appContextInstance, filteringLog) {\n this.appContext = appContextInstance;\n this.filteringLog = filteringLog;\n this.engine = new StealthService(this.appContext, this.filteringLog);\n }\n /**\n * Requires privacy permissions and updates browser privacy.network\n * settings depending on blocking WebRTC or not.\n */\n updateWebRtcPrivacyPermissions() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!StealthApi.canBlockWebRTC()) {\n return;\n }\n try {\n const isPermissionsGranted = yield browser.permissions.contains(StealthApi.PRIVACY_PERMISSIONS);\n if (isPermissionsGranted) {\n yield this.handleBlockWebRTC();\n }\n }\n catch (e) {\n logger.error(getErrorMessage(e));\n }\n });\n }\n /**\n * Returns rule list with stealth mode rules.\n *\n * @returns String rule list or null.\n */\n getStealthModeRuleList() {\n if (!this.engine || !this.isStealthModeEnabled) {\n return null;\n }\n const rulesTexts = this.engine.getCookieRulesTexts().join('\\n');\n return new StringRuleList(StealthApi.STEALTH_MODE_FILTER_ID, rulesTexts, false, false);\n }\n /**\n * Stealth api onBeforeRequest handler.\n *\n * @param context Request context.\n *\n * @returns True if the headers have been changed.\n */\n onBeforeSendHeaders(context) {\n if (!context) {\n return false;\n }\n if (!this.canApplyStealthActionsToContext(context)) {\n return false;\n }\n const stealthActions = this.engine.processRequestHeaders(context);\n return stealthActions !== StealthActions.None;\n }\n /**\n * Checks if stealth actions can be applied to request context.\n *\n * @param context Request context.\n * @returns True if stealth actions can be applied to request context.\n */\n canApplyStealthActionsToContext(context) {\n if (!this.isStealthModeEnabled || !this.isFilteringEnabled) {\n return false;\n }\n const { matchingResult } = context;\n if (matchingResult) {\n if (matchingResult.documentRule || matchingResult.stealthRule) {\n return false;\n }\n }\n return true;\n }\n /**\n * Returns set dom signal script if sendDoNotTrack enabled, otherwise empty string.\n *\n * @returns Dom signal script.\n */\n getSetDomSignalScript() {\n return this.engine.getSetDomSignalScript();\n }\n /**\n * Updates browser privacy.network settings depending on blocking WebRTC or not.\n */\n handleBlockWebRTC() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.configuration) {\n return;\n }\n const webRTCDisabled = this.configuration.blockWebRTC\n && this.isStealthModeEnabled\n && this.isFilteringEnabled;\n try {\n if (webRTCDisabled) {\n yield browser.privacy.network.webRTCIPHandlingPolicy.set({\n value: 'disable_non_proxied_udp',\n scope: 'regular',\n });\n }\n else {\n yield browser.privacy.network.webRTCIPHandlingPolicy.clear({\n scope: 'regular',\n });\n }\n }\n catch (e) {\n logger.error(`Error updating privacy.network settings: ${getErrorMessage(e)}`);\n }\n // privacy.network.peerConnectionEnabled is currently only supported in Firefox\n if (typeof browser.privacy.network.peerConnectionEnabled === 'object') {\n try {\n if (webRTCDisabled) {\n yield browser.privacy.network.peerConnectionEnabled.set({\n value: false,\n scope: 'regular',\n });\n }\n else {\n yield browser.privacy.network.peerConnectionEnabled.clear({\n scope: 'regular',\n });\n }\n }\n catch (e) {\n logger.error(`Error updating privacy.network settings: ${getErrorMessage(e)}`);\n }\n }\n });\n }\n /**\n * // TODO consider deprecating this method as edge browser is built on chromium now.\n * Checks if there is browser.privacy permission is granted.\n *\n * @returns True if there is browser.privacy permission.\n */\n static canBlockWebRTC() {\n // Edge doesn't support privacy api\n // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy\n return !!browser.privacy;\n }\n}\n/**\n * Privacy permission for block webrtc stealth setting.\n */\nStealthApi.PRIVACY_PERMISSIONS = {\n permissions: ['privacy'],\n};\nconst stealthApi = new StealthApi(appContext, defaultFilteringLog);\n\n/**\n * @file Temporary entry point for global background submodule instances.\n * Needed for backward compatibility during internal API updates.\n * Will be removed in the future.\n */\nconst allowlist = new Allowlist();\nconst engineApi = new EngineApi(allowlist, appContext, stealthApi);\nconst documentApi = new DocumentApi(allowlist, engineApi);\nconst tabsApi = new TabsApi(documentApi);\n\n/**\n * Taken from:\n * {@link https://github.com/seanl-adg/InlineResourceLiteral/blob/master/index.js#L136}\n * {@link https://github.com/joliss/js-string-escape/blob/master/index.js}.\n */\nconst reJsEscape = /[\"'\\\\\\n\\r\\u2028\\u2029]/g;\nconst escapeJs = (match) => {\n switch (match) {\n case '\"':\n case \"'\":\n case '\\\\':\n return `\\\\${match}`;\n case '\\n':\n /**\n * Line continuation character for ease of reading inlined resource.\n */\n return '\\\\n\\\\\\n';\n case '\\r':\n /**\n * Carriage returns won't have any semantic meaning in JS.\n */\n return '';\n case '\\u2028':\n return '\\\\u2028';\n case '\\u2029':\n return '\\\\u2029';\n default:\n return match;\n }\n};\n/**\n * We use changing variable name because global properties can be modified across isolated worlds of extension\n * content page and tab page.\n *\n * Issue: @see {@link https://bugs.chromium.org/p/project-zero/issues/detail?id=1225&desc=6}.\n */\nconst variableName = `scriptExecuted${Date.now()}`;\n/**\n * Builds script to inject in a safe way.\n *\n * @see {@link LocalScriptRulesService} for details about script source.\n * @param scriptText Script text.\n * @returns Script to inject.\n */\nconst buildScriptText = (scriptText) => {\n /**\n * Executes scripts in a scope of the page, but the `window` fields are in\n * an isolated scope, e.g. `window.${variableName}` will only be visible in\n * this scope of the script, but not in the original scope of the page.\n * In order to prevent multiple script execution checks if script was already executed.\n * Sometimes in Firefox when content-filtering is applied to the page race condition happens.\n * This causes an issue when the page doesn't have its document.head or document.documentElement at the moment of\n * injection. So script waits for them. But if a quantity of frame-requests reaches FRAME_REQUESTS_LIMIT then\n * script stops waiting with the error.\n * Description of the issue: @see {@link https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1004}.\n */\n return `(function() {\\\n if (window.${variableName}) {\\\n return;\\\n }\\\n var script = document.createElement(\"script\");\\\n script.setAttribute(\"type\", \"text/javascript\");\\\n script.textContent = \"${scriptText.replace(reJsEscape, escapeJs)}\";\\\n var FRAME_REQUESTS_LIMIT = 500;\\\n var frameRequests = 0;\\\n function waitParent () {\\\n frameRequests += 1;\\\n var parent = document.head || document.documentElement;\\\n if (parent) {\\\n try {\\\n parent.appendChild(script);\\\n parent.removeChild(script);\\\n } catch (e) {\\\n } finally {\\\n window.${variableName} = true;\\\n return true;\\\n }\\\n }\\\n if(frameRequests < FRAME_REQUESTS_LIMIT) {\\\n requestAnimationFrame(waitParent);\\\n } else {\\\n console.log(\"AdGuard: document.head or document.documentElement were unavailable too long\");\\\n }\\\n }\\\n waitParent();\\\n })()`;\n};\n\n/**\n * By the rules of AMO we cannot use remote scripts (and our JS rules can be counted as such).\n * Because of that we use the following approach (that was accepted by AMO reviewers):\n *\n * 1. We pre-build JS rules from AdGuard filters into the JSON file.\n * 2. At runtime we check every JS rule if it's included into JSON.\n * If it is included we allow this rule to work since it's pre-built. Other rules are discarded.\n * 3. We also allow \"User rules\" to work since those rules are added manually by the user.\n * This way filters maintainers can test new rules before including them in the filters.\n */\nclass LocalScriptRulesService {\n /**\n * Saves local script rules to object.\n *\n * @param json JSON object with pre-build JS rules.\n */\n setLocalScriptRules(json) {\n this.localScripts = new Set(json.rules.map((rule) => {\n const { domains, script } = rule;\n let ruleText = '';\n if (domains !== LocalScriptRulesService.JS_RULE_GENERIC_DOMAIN_TOKEN) {\n ruleText = domains;\n }\n ruleText += `${LocalScriptRulesService.JS_RULE_SEPARATOR_TOKEN}${script}`;\n return ruleText;\n }));\n }\n /**\n * Checks if ruleText is in the pre-built JSON with JS rules.\n *\n * @param ruleText Rule text.\n *\n * @returns True, if rule is local, else returns false.\n */\n isLocal(ruleText) {\n if (this.localScripts === undefined) {\n return true;\n }\n /**\n * In case of Firefox add-ons JS filtering rules are hardcoded\n * into add-on code. So, if rule is not local - we exclude these\n * rules from execution for Firefox AMO.\n *\n * Check description of {@link LocalScriptRulesService} for\n * details about script source.\n */\n return this.localScripts.has(ruleText);\n }\n}\nLocalScriptRulesService.JS_RULE_GENERIC_DOMAIN_TOKEN = '';\nLocalScriptRulesService.JS_RULE_SEPARATOR_TOKEN = '#%#';\nconst localScriptRulesService = new LocalScriptRulesService();\n\n/**\n * Cosmetic api class.\n * Used to prepare and inject javascript and css into pages.\n */\nclass CosmeticApi {\n /**\n * Applies scripts from a cosmetic result. It is possible inject a script\n * only once, because after the first inject, we set a flag in an isolated\n * copy of the window and all next calls to `buildScriptText` will return\n * nothing.\n *\n * @param scriptText Script text.\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @see {@link buildScriptText} for details about multiple injects.\n * @see {@link LocalScriptRulesService} for details about script source.\n */\n static injectScript(scriptText, tabId, frameId = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n return TabsApi.injectScript(buildScriptText(scriptText), tabId, frameId);\n });\n }\n /**\n * Applies css from cosmetic result.\n *\n * Patches rule selector adding adguard mark rule info in the content attribute.\n * Example:\n * .selector -> .selector { content: 'adguard{filterId};{ruleText} !important;}.\n *\n * @param cssText Css text.\n * @param tabId Tab id.\n * @param frameId Frame id.\n */\n static injectCss(cssText, tabId, frameId = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n return TabsApi.injectCss(cssText, tabId, frameId);\n });\n }\n /**\n * Retrieves css styles from the cosmetic result.\n *\n * @param cosmeticResult Cosmetic result.\n * @param collectingCosmeticRulesHits Flag to collect cosmetic rules hits.\n * @returns Css styles as string, or `undefined` if no styles found.\n */\n static getCssText(cosmeticResult, collectingCosmeticRulesHits = false) {\n const { elementHiding, CSS } = cosmeticResult;\n const elemhideCss = elementHiding.generic.concat(elementHiding.specific);\n const injectCss = CSS.generic.concat(CSS.specific);\n let styles;\n if (collectingCosmeticRulesHits) {\n styles = CosmeticApi.buildStyleSheetsWithHits(elemhideCss, injectCss);\n }\n else {\n styles = CosmeticApi.buildStyleSheets(elemhideCss, injectCss, true);\n }\n if (styles.length > 0) {\n return styles.join(CosmeticApi.LINE_BREAK);\n }\n return undefined;\n }\n /**\n * Builds extended css rules from cosmetic result.\n *\n * @param cosmeticResult Cosmetic result.\n * @param collectingCosmeticRulesHits Flag to collect cosmetic rules hits.\n * @returns Array of extended css rules or null.\n */\n static getExtCssRules(cosmeticResult, collectingCosmeticRulesHits = false) {\n const { elementHiding, CSS } = cosmeticResult;\n const elemhideExtCss = elementHiding.genericExtCss.concat(elementHiding.specificExtCss);\n const injectExtCss = CSS.genericExtCss.concat(CSS.specificExtCss);\n let extCssRules;\n if (collectingCosmeticRulesHits) {\n extCssRules = CosmeticApi.buildStyleSheetsWithHits(elemhideExtCss, injectExtCss);\n }\n else {\n extCssRules = CosmeticApi.buildStyleSheets(elemhideExtCss, injectExtCss, false);\n }\n return extCssRules.length > 0\n ? extCssRules\n : null;\n }\n /**\n * Builds scripts from cosmetic rules.\n *\n * @param rules Cosmetic rules.\n * @returns Scripts or undefined.\n */\n static getScriptText(rules) {\n if (rules.length === 0) {\n return undefined;\n }\n const permittedRules = CosmeticApi.sanitizeScriptRules(rules);\n const scriptText = permittedRules\n .map((rule) => rule.getScript())\n .join('\\n');\n if (!scriptText) {\n return undefined;\n }\n return scriptText;\n }\n /**\n * Returns content script data for applying cosmetic.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @returns Content script data for applying cosmetic.\n */\n static getContentScriptData(tabId, frameId) {\n const { isAppStarted, configuration } = appContext;\n const areHitsStatsCollected = (configuration === null || configuration === void 0 ? void 0 : configuration.settings.collectStats) || false;\n const data = {\n isAppStarted,\n areHitsStatsCollected,\n extCssRules: null,\n };\n const tabContext = tabsApi.getTabContext(tabId);\n if (!tabContext) {\n return data;\n }\n const frame = tabContext.frames.get(frameId);\n if (!frame) {\n return data;\n }\n /**\n * Cosmetic result may not be committed to frame context during worker request processing.\n * We use engine request as a fallback for this case.\n */\n if (!(frame === null || frame === void 0 ? void 0 : frame.cosmeticResult)) {\n frame.cosmeticResult = engineApi.matchCosmetic({\n requestUrl: frame.url,\n frameUrl: frame.url,\n requestType: frameId === MAIN_FRAME_ID ? RequestType.Document : RequestType.SubDocument,\n frameRule: tabContext.mainFrameRule,\n });\n }\n data.extCssRules = CosmeticApi.getExtCssRules(frame.cosmeticResult, areHitsStatsCollected);\n return data;\n }\n /**\n * Applies css rules to specific frame.\n *\n * @param params Data for css rules injecting.\n */\n static applyCssRules(params) {\n return __awaiter(this, void 0, void 0, function* () {\n const { tabId, frameId, cosmeticResult, } = params;\n const { configuration } = appContext;\n const areHitsStatsCollected = (configuration === null || configuration === void 0 ? void 0 : configuration.settings.collectStats) || false;\n const cssText = CosmeticApi.getCssText(cosmeticResult, areHitsStatsCollected);\n if (cssText) {\n yield CosmeticApi.injectCss(cssText, tabId, frameId);\n }\n });\n }\n /**\n * Applies js rules to specific frame.\n *\n * @param params Data for js rule injecting.\n */\n static applyJsRules(params) {\n return __awaiter(this, void 0, void 0, function* () {\n const { tabId, frameId, cosmeticResult, } = params;\n const scriptRules = cosmeticResult.getScriptRules();\n let scriptText = CosmeticApi.getScriptText(scriptRules);\n scriptText += stealthApi.getSetDomSignalScript();\n if (scriptText) {\n /**\n * We can execute injectScript only once per frame, so we need to\n * combine all the scripts into a single injection.\n *\n * @see {@link buildScriptText} for details about multiple injects.\n * @see {@link LocalScriptRulesService} for details about script source\n */\n yield CosmeticApi.injectScript(scriptText, tabId, frameId);\n }\n });\n }\n /**\n * Logs js rules to specific frame.\n *\n * We need a separate function for logging because script rules can be logged before injection\n * to avoid duplicate logs while the js rule is being applied.\n *\n * See {@link WebRequestApi.onBeforeRequest} for details.\n *\n * @param params Data for js rule logging.\n */\n static logScriptRules(params) {\n const { tabId, cosmeticResult, url, contentType, timestamp, } = params;\n const scriptRules = cosmeticResult.getScriptRules();\n const permittedScriptRules = CosmeticApi.sanitizeScriptRules(scriptRules);\n for (const scriptRule of permittedScriptRules) {\n if (!scriptRule.isGeneric()) {\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.JsInject,\n data: {\n script: true,\n tabId,\n // for proper filtering log request info rule displaying\n // event id should be unique for each event, not copied from request\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2341\n eventId: nanoid(),\n requestUrl: url,\n frameUrl: url,\n frameDomain: getDomain(url),\n requestType: contentType,\n timestamp,\n rule: scriptRule,\n },\n });\n }\n }\n }\n /**\n * Apply js to specified frame based on provided data and injection FSM state.\n *\n * @param params The data required for the injection.\n * @param tries The number of tries for the operation in case of failure.\n */\n static applyFrameJsRules(params, tries = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield CosmeticApi.applyJsRules(params);\n }\n catch (e) {\n if (tries < CosmeticApi.INJECTION_MAX_TRIES) {\n setTimeout(() => {\n CosmeticApi.applyFrameJsRules(params, tries + 1);\n }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS);\n }\n else {\n logger.debug(getErrorMessage(e));\n }\n }\n });\n }\n /**\n * Injects css to specified frame based on provided data and injection FSM state.\n *\n * @param params Data required for the injection.\n * @param tries Number of tries for the operation in case of failure.\n */\n static applyFrameCssRules(params, tries = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield CosmeticApi.applyCssRules(params);\n }\n catch (e) {\n if (tries < CosmeticApi.INJECTION_MAX_TRIES) {\n setTimeout(() => {\n CosmeticApi.applyFrameCssRules(params, tries + 1);\n }, CosmeticApi.INJECTION_RETRY_TIMEOUT_MS);\n }\n else {\n logger.debug(getErrorMessage(e));\n }\n }\n });\n }\n /**\n * Filters insecure scripts from remote sources.\n *\n * @param rules Cosmetic rules.\n * @returns Permitted script rules.\n */\n static sanitizeScriptRules(rules) {\n return rules.filter((rule) => {\n // Scriptlets should not be excluded for remote filters\n if (rule.isScriptlet) {\n return true;\n }\n // User rules should not be excluded\n const filterId = rule.getFilterListId();\n if (filterId === USER_FILTER_ID) {\n return true;\n }\n /**\n * @see {@link LocalScriptRulesService} for details about script source\n */\n const text = rule.getText();\n return localScriptRulesService.isLocal(text);\n });\n }\n /**\n * Builds element hiding stylesheet from rules.\n * If `groupElemhideSelectors` is set,\n * selector are to be combined into selector lists of {@link CosmeticApi.CSS_SELECTORS_PER_LINE}.\n *\n * @param elemhideRules List of elemhide rules.\n * @param groupElemhideSelectors Flag for elemhide selectors grouping.\n *\n * @returns Array of styles.\n */\n static buildElemhideStyles(elemhideRules, groupElemhideSelectors) {\n // TODO: refactor constants as ELEMHIDE_CSS_STYLE and ELEMHIDE_HIT_START are duplicates partly\n const ELEMHIDE_CSS_STYLE = ' { display: none !important; }';\n const elemhideSelectors = [];\n for (const selector of elemhideRules) {\n elemhideSelectors.push(selector.getContent());\n }\n // if selector should not be grouped,\n // add element hiding style to each of them\n if (!groupElemhideSelectors) {\n return elemhideSelectors.map((selector) => {\n return `${selector}${ELEMHIDE_CSS_STYLE}`;\n });\n }\n // otherwise selectors should be grouped into selector lists\n const elemhideStyles = [];\n for (let i = 0; i < elemhideSelectors.length; i += CosmeticApi.CSS_SELECTORS_PER_LINE) {\n const selectorList = elemhideSelectors\n .slice(i, i + CosmeticApi.CSS_SELECTORS_PER_LINE)\n .join(', ');\n elemhideStyles.push(`${selectorList}${ELEMHIDE_CSS_STYLE}`);\n }\n return elemhideStyles;\n }\n /**\n * Builds stylesheets from rules.\n * If `groupElemhideSelectors` is set,\n * element hiding selector are to be combined into selector lists of {@link CosmeticApi.CSS_SELECTORS_PER_LINE}.\n *\n * @param elemhideRules List of elemhide rules.\n * @param injectRules List of inject css rules.\n * @param groupElemhideSelectors Flag for elemhide selectors grouping.\n *\n * @returns List of stylesheet expressions.\n */\n static buildStyleSheets(elemhideRules, injectRules, groupElemhideSelectors) {\n const styles = [];\n const elemHideStyles = CosmeticApi.buildElemhideStyles(elemhideRules, groupElemhideSelectors);\n if (elemHideStyles.length > 0) {\n if (groupElemhideSelectors) {\n styles.push(elemHideStyles.join(CosmeticApi.LINE_BREAK));\n }\n else {\n styles.push(...elemHideStyles);\n }\n }\n const cssStyles = injectRules.map((x) => x.getContent());\n if (cssStyles.length > 0) {\n if (groupElemhideSelectors) {\n styles.push(cssStyles.join(CosmeticApi.LINE_BREAK));\n }\n else {\n styles.push(...cssStyles);\n }\n }\n return styles;\n }\n /**\n * Encodes rule text.\n *\n * @param ruleText Rule text.\n * @returns Encoded rule text.\n */\n static escapeRule(ruleText) {\n return encodeURIComponent(ruleText).replace(/['()]/g, (match) => ({ \"'\": '%27', '(': '%28', ')': '%29' }[match]));\n }\n /**\n * Patches rule selector adding adguard mark rule info in the content attribute.\n * Example:\n * .selector -> .selector { content: 'adguard{filterId};{ruleText} !important;}.\n *\n * @param rule Elemhide cosmetic rule.\n *\n * @returns Rule with modified stylesheet, containing content marker.\n */\n static addMarkerToElemhideRule(rule) {\n const result = [];\n result.push(rule.getContent());\n result.push(CosmeticApi.ELEMHIDE_HIT_START);\n result.push(rule.getFilterListId());\n result.push(CosmeticApi.HIT_SEP);\n result.push(CosmeticApi.escapeRule(rule.getText()));\n result.push(CosmeticApi.HIT_END);\n return result.join('');\n }\n /**\n * Patches rule selector adding adguard mark and rule info in the content style attribute.\n * Example:\n * .selector { color: red } -> .selector { color: red, content: 'adguard{filterId};{ruleText} !important;}.\n *\n * @param rule Inject cosmetic rule.\n *\n * @returns Modified rule with injected content marker into stylesheet.\n */\n static addMarkerToInjectRule(rule) {\n const result = [];\n const ruleContent = rule.getContent();\n // if rule text has content attribute we don't add rule marker\n const contentAttributeRegex = /[{;\"(]\\s*content\\s*:/gi;\n if (contentAttributeRegex.test(ruleContent)) {\n return ruleContent;\n }\n // remove closing brace\n const ruleTextWithoutCloseBrace = ruleContent.slice(0, -1).trim();\n // check semicolon\n const ruleTextWithSemicolon = ruleTextWithoutCloseBrace.endsWith(';')\n ? ruleTextWithoutCloseBrace\n : `${ruleTextWithoutCloseBrace};`;\n result.push(ruleTextWithSemicolon);\n result.push(CosmeticApi.INJECT_HIT_START);\n result.push(rule.getFilterListId());\n result.push(CosmeticApi.HIT_SEP);\n result.push(CosmeticApi.escapeRule(rule.getText()));\n result.push(CosmeticApi.HIT_END);\n return result.join('');\n }\n /**\n * Builds stylesheets with css-hits marker.\n *\n * @param elemhideRules Elemhide css rules.\n * @param injectRules Inject css rules.\n *\n * @returns List of stylesheet expressions.\n */\n static buildStyleSheetsWithHits(elemhideRules, injectRules) {\n const elemhideStyles = elemhideRules.map((x) => CosmeticApi.addMarkerToElemhideRule(x));\n const injectStyles = injectRules.map((x) => CosmeticApi.addMarkerToInjectRule(x));\n return [...elemhideStyles, ...injectStyles];\n }\n}\nCosmeticApi.ELEMHIDE_HIT_START = \" { display: none !important; content: 'adguard\";\nCosmeticApi.INJECT_HIT_START = \" content: 'adguard\";\nCosmeticApi.HIT_SEP = encodeURIComponent(';');\nCosmeticApi.HIT_END = \"' !important; }\";\nCosmeticApi.LINE_BREAK = '\\r\\n';\n// Number of selectors in grouped selector list\nCosmeticApi.CSS_SELECTORS_PER_LINE = 50;\n// Timeout for cosmetic injection retry on failure.\nCosmeticApi.INJECTION_RETRY_TIMEOUT_MS = 10;\n// Max number of tries to inject cosmetic rules.\nCosmeticApi.INJECTION_MAX_TRIES = 100;\n\n/**\n * Implementation of the request context storage.\n */\nclass RequestContextStorage extends Map {\n /**\n * Create new request context.\n *\n * @param requestId Request id.\n * @param data Request context with a omitted eventId field. It is automatically generated.\n * @returns Request context storage instance.\n */\n create(requestId, data) {\n const requestContext = Object.assign({ eventId: nanoid() }, data);\n super.set(requestId, requestContext);\n return requestContext;\n }\n /**\n * Update request context fields. Can be done partially.\n *\n * @param requestId Request id.\n * @param data Partial request context.\n * @returns Updated request context.\n */\n update(requestId, data) {\n const requestContext = super.get(requestId);\n if (requestContext) {\n Object.assign(requestContext, data);\n return requestContext;\n }\n // TODO: Throws error if request context not found after RequestEvents refactoring.\n super.set(requestId, data);\n return undefined;\n }\n}\nconst requestContextStorage = new RequestContextStorage();\n\n/**\n * Css, injected to broken element for hiding.\n */\n// eslint-disable-next-line max-len\nconst HIDING_STYLE = '{ display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important; }';\n/**\n * Creates hiding css rule for specified tag with src attribute.\n *\n * @param tag Element tag for css selector.\n * @param src `src` attribute value for css selector. If value is the empty string\n * then the selector does not represent anything.\n * @param matching Attribute matching type. Currently support strict (=) and suffix ($=) matching.\n * Default to strict.\n *\n * @returns Css rule text.\n */\nfunction createHidingCssRule(tag, src, matching = \"=\" /* AttributeMatching.Strict */) {\n return `${tag}[src${matching}\"${src}\"] ${HIDING_STYLE}\\n`;\n}\n\n/**\n * Get relative path of first-party request for resource `src` attribute.\n *\n * @param requestUrl Resource url.\n * @param documentUrl Url of the document in which the resource will be loaded.\n *\n * @returns Relative path of resource `src` attribute for css selector.\n */\nfunction getRelativeSrcPath(requestUrl, documentUrl) {\n const requestUrlData = new URL(requestUrl);\n const documentUrlData = new URL(documentUrl);\n const documentPathname = documentUrlData.pathname;\n const requestPathname = requestUrlData.pathname;\n const requestUrlTail = requestUrlData.search + requestUrlData.hash;\n if (documentPathname === '/') {\n return requestPathname + requestUrlTail;\n }\n // Check that partial pathnames match\n const requestUrlPathParts = requestPathname.split('/').filter((part) => !!part);\n const documentUrlPathParts = documentPathname.split('/').filter((part) => !!part);\n const commonParts = [];\n for (let i = 0; i < Math.min(requestUrlPathParts.length, documentUrlPathParts.length); i += 1) {\n if (requestUrlPathParts[i] !== documentUrlPathParts[i]) {\n const path = requestUrlPathParts.slice(i).join('/') + requestUrlTail;\n // If first parts are matched, return path relative to document page\n // else return path relative to host\n return i > 0 ? path : `/${path}`;\n }\n commonParts.push(requestUrlPathParts[i]);\n }\n const commonPath = `/${commonParts.join('/')}`;\n return requestPathname.substring(commonPath.length + 1) + requestUrlTail;\n}\n/**\n * Returns network request initiator tag by request type.\n *\n * @param requestType Request type.\n * @returns Initiator tag.\n */\nfunction getRequestInitiatorTag(requestType) {\n switch (requestType) {\n case RequestType.SubDocument:\n return [\"iframe\" /* InitiatorTag.Iframe */, \"frame\" /* InitiatorTag.Frame */];\n case RequestType.Image:\n return [\"img\" /* InitiatorTag.Image */];\n default:\n return null;\n }\n}\n/**\n * Inject css for element hiding by tabs.injectCss.\n *\n * @param tabId Tab id.\n * @param requestFrameId Request frame id.\n * @param requestUrl Request url.\n * @param documentUrl Document url.\n * @param requestType Request type.\n * @param isThirdParty Flag telling if request is third-party.\n */\nfunction hideRequestInitiatorElement(tabId, requestFrameId, requestUrl, documentUrl, requestType, isThirdParty) {\n const initiatorTags = getRequestInitiatorTag(requestType);\n if (!initiatorTags || tabId === BACKGROUND_TAB_ID) {\n return;\n }\n let src;\n let matching;\n if (isThirdParty) {\n src = requestUrl.substring(requestUrl.indexOf('//'));\n matching = \"$=\" /* AttributeMatching.Suffix */;\n }\n else {\n src = getRelativeSrcPath(requestUrl, documentUrl);\n matching = \"=\" /* AttributeMatching.Strict */;\n }\n let code = '';\n for (let i = 0; i < initiatorTags.length; i += 1) {\n code += createHidingCssRule(initiatorTags[i], src, matching);\n }\n CosmeticApi.injectCss(code, tabId, requestFrameId);\n}\n\nconst browserDetector = Bowser.getParser(window.navigator.userAgent);\nconst browserDetails = browserDetector.getBrowser();\nconst engineDetails = browserDetector.getEngine();\nconst isFirefox = browserDetails.name === 'Firefox';\nbrowserDetails.name === 'Chrome';\nconst isChromium = engineDetails.name === 'Blink';\n\n/**\n * This service encapsulate processing of $document modifier rules.\n *\n * Service is initialized in {@link configure} method, called from {@link EngineApi#startEngine}.\n *\n * Request rule is processed in {@link getDocumentBlockingResponse} method, called\n * from {@link RequestBlockingApi.getBlockingResponse}.\n *\n * Request rule is processed following scenario:\n * - if domain is trusted, ignore request\n * - if rule is document blocking and {@link documentBlockingPageUrl} is undefined, return\n * {@link WebRequestApi.onBeforeRequest} blocking response\n * - if rule is document blocking and {@link documentBlockingPageUrl} is defined, return redirect response with\n * required params.\n * - if browser is Firefox, update page url by {@link browser.tabs} API, because FF doesn't support redirects to\n * extension pages.\n */\nclass DocumentBlockingService {\n constructor() {\n // list of domain names of sites, which should be excluded from document blocking\n this.trustedDomains = [];\n }\n /**\n * Configures service instance {@link documentBlockingPageUrl}.\n *\n * @param configuration App {@link Configuration}.\n */\n configure(configuration) {\n const { settings, trustedDomains } = configuration;\n this.documentBlockingPageUrl = settings === null || settings === void 0 ? void 0 : settings.documentBlockingPageUrl;\n this.trustedDomains = trustedDomains;\n }\n /**\n * Processes $document modifier rule matched request in {@link RequestBlockingApi.getBlockingResponse}.\n *\n * @param eventId Request event id.\n * @param requestUrl Url of processed request.\n * @param rule {@link NetworkRule} Instance of matched rule.\n * @param tabId TabId of processed request.\n * @returns Blocking response or null {@link WebRequestApi.onBeforeRequest}.\n */\n getDocumentBlockingResponse(eventId, requestUrl, rule, tabId) {\n // if request url domain is trusted, ignore document blocking rule\n if (this.isTrustedDomain(requestUrl)) {\n return undefined;\n }\n // public filtering log event\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ApplyBasicRule,\n data: {\n eventId,\n tabId,\n rule,\n },\n });\n // if documentBlockingPage is undefined, block request\n if (!this.documentBlockingPageUrl) {\n return { cancel: true };\n }\n // get document blocking url with required params\n const blockingUrl = DocumentBlockingService.createBlockingUrl(this.documentBlockingPageUrl, requestUrl, rule.getText());\n // Chrome doesn't allow to show extension pages in incognito mode\n if (isChromium && tabsApi.isIncognitoTab(tabId)) {\n // Closing tab before opening a new one may lead to browser crash (Chromium)\n browser.tabs.create({ url: blockingUrl })\n .then(() => {\n browser.tabs.remove(tabId);\n })\n .catch((e) => {\n logger.warn(`Can't open info page about blocked domain. Err: ${e}`);\n });\n }\n else {\n // Browser doesn't allow redirects to extension pages which are not listed in web\n // accessible resources. We set blocking page url via browser.tabs\n // api for bypassing this limitation.\n DocumentBlockingService.reloadTabWithBlockingPage(tabId, blockingUrl);\n }\n return { cancel: true };\n }\n /**\n * Checks if request url domain is trusted.\n *\n * @param url Request url.\n * @returns True, if request url domain is trusted, else false.\n */\n isTrustedDomain(url) {\n const domain = getDomain$1(url);\n if (domain) {\n return this.trustedDomains.includes(domain);\n }\n return false;\n }\n /**\n * Updates tab with document blocking page url.\n *\n * @param tabId Tab id.\n * @param url Blocking page url.\n */\n static reloadTabWithBlockingPage(tabId, url) {\n const tabContext = tabsApi.getTabContext(tabId);\n if (!tabContext) {\n return;\n }\n browser.tabs.update(tabId, { url });\n }\n /**\n * Sets required url and rule query params to document-blocking page url.\n *\n * @param documentBlockingPageUrl Url of document-blocking page.\n * @param requestUrl Processed request url.\n * @param ruleText Matched rule text.\n * @returns Document blocking page url with required params.\n */\n static createBlockingUrl(documentBlockingPageUrl, requestUrl, ruleText) {\n const url = new URL(documentBlockingPageUrl);\n url.searchParams.set('url', requestUrl);\n url.searchParams.set('rule', ruleText);\n return url.toString();\n }\n}\nconst documentBlockingService = new DocumentBlockingService();\n\n/**\n * RedirectsCache is used for new type of blocking redirects, like click2load.html.\n * Here we save redirected urls to check later for being able to view hidden frame after user\n * clicked on button \"click to load\".\n */\nclass RedirectsCache {\n constructor() {\n /**\n * Instance or LRUMap.\n */\n this.cache = new LRUMap(100);\n /**\n * Adds url to the cache.\n *\n * @param url Url added to cache.\n */\n this.add = (url) => {\n this.cache.set(url, true);\n };\n /**\n * Checks if url is in the cache.\n *\n * @param url Url to check.\n * @returns True if url is in the cache.\n */\n this.hasUrl = (url) => {\n return this.cache.has(url);\n };\n }\n}\nconst redirectsCache = new RedirectsCache();\n\n/**\n * Used for new type of redirects, i.e.: click2load.html.\n * This tokens are transferred to redirect and used later to unblock page after user clicked button\n * \"click to load\".\n */\nclass RedirectsTokensCache {\n constructor() {\n this.cache = new LRUMap(1000);\n /**\n * Generates random unblock token for url and saves it to cache.\n * Used for blocking redirect params creation {@link resourcesService.blockingUrlParams}.\n *\n * @returns Generated random string.\n */\n this.generateToken = () => {\n const token = nanoid();\n this.cache.set(token, true);\n return token;\n };\n /**\n * Checks whether token exist in cache.\n * Used when redirect is checked in {@link resourcesService.shouldCreateRedirectUrl}.\n *\n * @param token Some string or null.\n * @returns True if cache has such token.\n */\n this.hasToken = (token) => {\n if (!token) {\n return false;\n }\n return this.cache.has(token);\n };\n }\n}\nconst redirectsTokensCache = new RedirectsTokensCache();\n\n/**\n * Prevent web pages to identify extension through its web accessible resources.\n *\n * Inspired by:\n * https://github.com/gorhill/uBlock/blob/7f999b759fe540e457e297363f55b25d9860dd3e/platform/chromium/vapi-background.\n */\nclass ResourcesService {\n /**\n * Constructor.\n *\n * @param generateSecretKey Function to generate secret key.\n */\n constructor(generateSecretKey) {\n this.secrets = [];\n this.root = browser.runtime.getURL('/');\n this.lastSecretTime = 0;\n this.generateSecretKey = generateSecretKey;\n this.guardWar = this.guardWar.bind(this);\n }\n /**\n * Init service.\n *\n * @param warDir Web accessible resources directory.\n */\n init(warDir) {\n this.warDir = warDir;\n const filter = {\n urls: [`${this.root}${this.warDir}/*`],\n };\n const extraInfoSpec = ['blocking'];\n browser.webRequest.onBeforeRequest.addListener(this.guardWar, filter, extraInfoSpec);\n }\n /**\n * Stops service.\n */\n stop() {\n this.warDir = undefined;\n this.secrets = [];\n browser.webRequest.onBeforeRequest.removeListener(this.guardWar);\n }\n /**\n * Creates url for war file.\n *\n * @param path Resource relative path.\n * @param params Additional params appended to url, by default empty.\n * @throws Error, if web accessible resources path is not defined.\n *\n * @returns Url to resource with secret param.\n */\n createResourceUrl(path, params = new URLSearchParams()) {\n if (!this.warDir) {\n throw new Error('Resources path is not defined. Did you init the service?');\n }\n const secretParams = new URLSearchParams(this.createSecretParam());\n const resultParams = new URLSearchParams([...secretParams, ...params]);\n return browser.runtime.getURL(`/${this.warDir}/${path}?${resultParams.toString()}`);\n }\n /**\n * Loads war resource by path.\n *\n * @param path Resource relative path.\n */\n loadResource(path) {\n return __awaiter(this, void 0, void 0, function* () {\n const url = this.createResourceUrl(path);\n const response = yield fetch(url);\n return response.text();\n });\n }\n /**\n * Generates secret key, persists it in the secrets array and formats querystring.\n *\n * @returns Querystring with secret.\n */\n createSecretParam() {\n if (this.secrets.length !== 0) {\n // TODO move magic numbers to constants\n if ((Date.now() - this.lastSecretTime) > 5000) {\n this.secrets.splice(0);\n }\n else if (this.secrets.length > 256) {\n this.secrets.splice(0, this.secrets.length - 192);\n }\n }\n this.lastSecretTime = Date.now();\n const secret = this.generateSecretKey();\n this.secrets.push(secret);\n return `?secret=${secret}`;\n }\n /**\n * If secret is not found redirects to the main url of extension, otherwise removes secret from the stored values.\n *\n * @param details Web request details.\n * @returns Redirect or nothing.\n */\n guardWar(details) {\n const { url } = details;\n const pos = this.secrets.findIndex((secret) => url.lastIndexOf(`?secret=${secret}`) !== -1);\n if (pos === -1) {\n return { redirectUrl: this.root };\n }\n this.secrets.splice(pos, 1);\n return undefined;\n }\n}\nconst resourcesService = new ResourcesService(() => {\n return Math.floor(Math.random() * 982451653 + 982451653).toString(36);\n});\n\n/**\n * Service for working with redirects.\n */\nclass RedirectsService {\n constructor() {\n this.redirects = null;\n /**\n * Check whether redirect creating is needed i.e.: for click2load.html it's not needed after\n * button click.\n *\n * @param redirectTitle A name of the redirect.\n * @param requestUrl Request url.\n * @returns True if should create redirect url.\n */\n this.shouldCreateRedirectUrl = (redirectTitle, requestUrl) => {\n // if no redirects loaded we won't be able to create redirect url;\n if (!this.redirects) {\n return false;\n }\n // no further checking is needed for most of the redirects\n // except blocking redirects, i.e. click2load.html\n if (!this.redirects.isBlocking(redirectTitle)) {\n return true;\n }\n // unblock token passed to redirect by createRedirectFileUrl and returned back.\n // it should be last parameter in url\n const UNBLOCK_TOKEN_PARAM = '__unblock';\n let cleanRequestUrl = requestUrl;\n const url = new URL(requestUrl);\n const params = new URLSearchParams(url.search);\n const unblockToken = params.get(UNBLOCK_TOKEN_PARAM);\n if (unblockToken) {\n // if redirect has returned unblock token back,\n // add url to cache for no further redirecting on button click;\n // save cleaned origin url so unblock token parameter should be cut off\n params.delete(UNBLOCK_TOKEN_PARAM);\n cleanRequestUrl = `${url.origin}${url.pathname}?${params.toString()}`;\n redirectsCache.add(cleanRequestUrl);\n }\n return !redirectsCache.hasUrl(cleanRequestUrl)\n || !redirectsTokensCache.hasToken(unblockToken);\n };\n }\n /**\n * Starts redirects service.\n */\n start() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const rawYaml = yield resourcesService.loadResource('redirects.yml');\n this.redirects = new redirects.Redirects(rawYaml);\n }\n catch (e) {\n throw new Error(e.message);\n }\n });\n }\n /**\n * Builds blocking url search params.\n *\n * @param redirectTitle Title of the redirect.\n * @param requestUrl Request url.\n * @throws Error if this method called before redirects where set.\n * @returns Url search params.\n * @private\n */\n blockingUrlParams(redirectTitle, requestUrl) {\n if (!this.redirects) {\n throw new Error('This method should be called after redirects are loaded');\n }\n const params = new URLSearchParams();\n if (this.redirects.isBlocking(redirectTitle)) {\n const unblockToken = redirectsTokensCache.generateToken();\n params.set('__unblock', unblockToken);\n params.set('__origin', requestUrl);\n }\n return params;\n }\n /**\n * Returns redirect url for the specified title.\n *\n * @param title Redirect title or null.\n * @param requestUrl Request url.\n * @returns Redirect url or null if redirect is not found.\n */\n createRedirectUrl(title, requestUrl) {\n if (!title) {\n return null;\n }\n if (!this.redirects) {\n return null;\n }\n const redirectSource = this.redirects.getRedirect(title);\n if (!redirectSource) {\n logger.debug(`There is no redirect source with title: \"${title}\"`);\n return null;\n }\n const shouldRedirect = this.shouldCreateRedirectUrl(title, requestUrl);\n if (!shouldRedirect) {\n return null;\n }\n // For blocking redirects we generate additional search params.\n const params = this.blockingUrlParams(title, requestUrl);\n return resourcesService.createResourceUrl(`redirects/${redirectSource.file}`, params);\n }\n}\nconst redirectsService = new RedirectsService();\n\n/**\n * Api for processing request filtering.\n *\n * Method {@link getBlockingResponse} processes rule applying for request and computes response\n * for {@link WebRequestApi.onBeforeRequest} listener.\n *\n * Method {@link shouldCollapseElement} checks, if initializer for request should be collapsed by content-script.\n *\n * This class also provides method {@link isRequestBlockedByRule} for checking, if rule is blocking rule.\n */\nclass RequestBlockingApi {\n /**\n * In some cases request blocking breaks images and frames on page.\n * We match rule from content-script and decide if DOM element should be hidden via css.\n *\n * @param tabId Tab id.\n * @param url Request url.\n * @param referrerUrl Request initializer frame url.\n * @param requestType Type of request.\n *\n * @returns True, if element should be collapsed, else returns false.\n */\n static shouldCollapseElement(tabId, url, referrerUrl, requestType) {\n const result = engineApi.matchRequest({\n requestUrl: url,\n frameUrl: referrerUrl,\n requestType,\n frameRule: tabsApi.getTabFrameRule(tabId),\n });\n if (!result) {\n return false;\n }\n return RequestBlockingApi.isRequestBlockedByRule(result.getBasicResult());\n }\n /**\n * Checks if request rule is blocked.\n *\n * @param requestRule Request network rule or null.\n * @returns True, if rule is request blocking, else returns false.\n */\n static isRequestBlockedByRule(requestRule) {\n return !!requestRule\n && !requestRule.isAllowlist()\n && !requestRule.isOptionEnabled(NetworkRuleOption.Replace)\n && !requestRule.isOptionEnabled(NetworkRuleOption.Redirect);\n }\n /**\n * Processes rule applying for request and compute response for {@link WebRequestApi.onBeforeRequest} listener.\n *\n * @param rule Matched rule.\n * @param eventId Request event id.\n * @param requestUrl Request url.\n * @param requestType Request type.\n * @param tabId Tab id.\n *\n * @returns Response for {@link WebRequestApi.onBeforeRequest} listener.\n */\n static getBlockingResponse(rule, eventId, requestUrl, requestType, tabId) {\n if (!rule) {\n return undefined;\n }\n if (rule.isAllowlist()) {\n RequestBlockingApi.logRuleApplying(eventId, rule, tabId);\n return undefined;\n }\n // If the request is a document request.\n if (requestType === RequestType$1.Document) {\n // First, make sure that the content-types of the matching rule include\n // the content-type of the document.\n if ((rule.getPermittedRequestTypes() & RequestType$1.Document) !== RequestType$1.Document) {\n return undefined;\n }\n // Blocking rule can be with $popup modifier - in this case we need\n // to close the tab as soon as possible.\n // https://adguard.com/kb/ru/general/ad-filtering/create-own-filters/#popup-modifier\n if (rule.isOptionEnabled(NetworkRuleOption.Popup)) {\n const isNewTab = tabsApi.isNewPopupTab(tabId);\n if (isNewTab) {\n RequestBlockingApi.logRuleApplying(eventId, rule, tabId);\n browser.tabs.remove(tabId);\n return { cancel: true };\n }\n }\n // For all other blocking rules, we return our dummy page with the\n // option to temporarily disable blocking for the specified domain.\n return documentBlockingService.getDocumentBlockingResponse(eventId, requestUrl, rule, tabId);\n }\n if (rule.isOptionEnabled(NetworkRuleOption.Redirect)) {\n const redirectUrl = redirectsService.createRedirectUrl(rule.getAdvancedModifierValue(), requestUrl);\n if (redirectUrl) {\n RequestBlockingApi.logRuleApplying(eventId, rule, tabId);\n return { redirectUrl };\n }\n }\n RequestBlockingApi.logRuleApplying(eventId, rule, tabId);\n return { cancel: true };\n }\n /**\n * Creates {@link FilteringLog} event of rule applying for processed request.\n *\n * @param eventId Request event id.\n * @param requestRule Request rule.\n * @param tabId Tab id.\n */\n static logRuleApplying(eventId, requestRule, tabId) {\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ApplyBasicRule,\n data: {\n eventId,\n tabId,\n rule: requestRule,\n },\n });\n }\n}\n\n/**\n * Generic wrapper for browser.webRequest with custom event implementation.\n */\nclass RequestEvent {\n constructor() {\n this.listeners = [];\n }\n /**\n * Register listener for the browser.webRequest events.\n *\n * @param event Webrequest event name.\n * @param handler Handler to register.\n * @param filter Filter of the events.\n * @param extraInfoSpec Extra info spec.\n */\n init(event, handler, filter, extraInfoSpec) {\n const handleBrowserEvent = (details) => {\n const data = handler(details);\n /**\n * Execute all registered listeners one by one until a non-empty value is returned.\n */\n for (let i = 0; i < this.listeners.length; i += 1) {\n const res = this.listeners[i](data);\n if (res) {\n return res;\n }\n }\n return undefined;\n };\n if (extraInfoSpec) {\n event.addListener(handleBrowserEvent, filter, extraInfoSpec);\n }\n else {\n event.addListener(handleBrowserEvent, filter);\n }\n }\n /**\n * Register listener for the browser.webRequest events.\n *\n * @param listener Event callback.\n */\n addListener(listener) {\n this.listeners.push(listener);\n }\n /**\n * Remove listener from the browser.webRequest events.\n *\n * @param listener Event callback.\n */\n removeListener(listener) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n}\n\n/**\n * Injects cosmetic rules into tabs, opened before app initialization.\n */\nclass TabsCosmeticInjector {\n /**\n * Create instance of TabsCosmeticInjector.\n *\n * @param engineApi Engine API.\n * @param documentApi Document API.\n * @param tabsApi Tabs API.\n */\n constructor(engineApi, documentApi, tabsApi) {\n this.engineApi = engineApi;\n this.documentApi = documentApi;\n this.tabsApi = tabsApi;\n }\n /**\n * Creates contexts for tabs opened before api initialization and\n * applies cosmetic rules for each frame.\n */\n processOpenTabs() {\n return __awaiter(this, void 0, void 0, function* () {\n const currentTabs = yield browser.tabs.query({});\n const tasks = currentTabs.map((tab) => this.processOpenTab(tab));\n const promises = yield Promise.allSettled(tasks);\n // Handles errors\n promises.forEach((promise) => {\n if (promise.status === 'rejected') {\n logger.error(promise.reason);\n }\n });\n });\n }\n /**\n * Creates context for tab opened before api initialization and\n * applies cosmetic rules for each frame.\n *\n * @param tab Tab details.\n */\n processOpenTab(tab) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!TabContext.isBrowserTab(tab)) {\n return;\n }\n const tabContext = new TabContext(tab, this.documentApi);\n const tabId = tab.id;\n this.tabsApi.context.set(tabId, tabContext);\n if (tab.url) {\n tabContext.mainFrameRule = this.documentApi.matchFrame(tab.url);\n }\n const frames = yield browser.webNavigation.getAllFrames({ tabId });\n if (!frames) {\n return;\n }\n frames.forEach(({ frameId, url }) => {\n const frame = new Frame(url);\n tabContext.frames.set(frameId, frame);\n if (!isHttpOrWsRequest(url)) {\n return;\n }\n const isDocumentFrame = frameId === MAIN_FRAME_ID;\n frame.matchingResult = this.engineApi.matchRequest({\n requestUrl: url,\n frameUrl: url,\n requestType: isDocumentFrame ? RequestType.Document : RequestType.SubDocument,\n frameRule: tabContext.mainFrameRule,\n });\n if (!frame.matchingResult) {\n return;\n }\n const cosmeticOption = frame.matchingResult.getCosmeticOption();\n frame.cosmeticResult = this.engineApi.getCosmeticResult(url, cosmeticOption);\n const { cosmeticResult } = frame;\n const cssInjectionParams = {\n tabId,\n frameId,\n cosmeticResult,\n };\n CosmeticApi.applyFrameCssRules(cssInjectionParams);\n CosmeticApi.applyFrameJsRules({\n tabId,\n frameId,\n cosmeticResult,\n });\n CosmeticApi.logScriptRules({\n url,\n tabId,\n cosmeticResult,\n timestamp: Date.now(),\n contentType: isDocumentFrame\n ? ContentType.Document\n : ContentType.Subdocument,\n });\n });\n });\n }\n}\n\nconst MAX_URL_LENGTH = 1024 * 16;\n/**\n * Request events class.\n */\nclass RequestEvents {\n /**\n * Initializes request events service.\n */\n static init() {\n RequestEvents.onBeforeRequest.init(browser.webRequest.onBeforeRequest, RequestEvents.handleOnBeforeRequest, { urls: [''] }, ['blocking', 'requestBody']);\n const onBeforeSendHeadersOptions = ['requestHeaders', 'blocking'];\n const onBeforeSendHeadersOptionTypes = browser.webRequest.OnBeforeSendHeadersOptions;\n if (typeof onBeforeSendHeadersOptionTypes !== 'undefined'\n && Object.prototype.hasOwnProperty.call(onBeforeSendHeadersOptionTypes, 'EXTRA_HEADERS')) {\n onBeforeSendHeadersOptions.push('extraHeaders');\n }\n RequestEvents.onBeforeSendHeaders.init(browser.webRequest.onBeforeSendHeaders, RequestEvents.handleOnBeforeSendHeaders, { urls: [''] }, onBeforeSendHeadersOptions);\n RequestEvents.onSendHeaders.init(browser.webRequest.onSendHeaders, RequestEvents.handleSendHeaders, { urls: [''] });\n const onHeadersReceivedOptions = ['responseHeaders', 'blocking'];\n const onHeadersReceivedOptionTypes = browser.webRequest.OnHeadersReceivedOptions;\n if (typeof onHeadersReceivedOptionTypes !== 'undefined'\n && Object.prototype.hasOwnProperty.call(onBeforeSendHeadersOptionTypes, 'EXTRA_HEADERS')) {\n onHeadersReceivedOptions.push('extraHeaders');\n }\n RequestEvents.onHeadersReceived.init(browser.webRequest.onHeadersReceived, RequestEvents.handleOnHeadersReceived, { urls: [''] }, onHeadersReceivedOptions);\n RequestEvents.onAuthRequired.init(browser.webRequest.onAuthRequired, RequestEvents.handleOnAuthRequired, { urls: [''] });\n RequestEvents.onBeforeRedirect.init(browser.webRequest.onBeforeRedirect, RequestEvents.handleOnBeforeRedirect, { urls: [''] });\n RequestEvents.onResponseStarted.init(browser.webRequest.onResponseStarted, RequestEvents.handleOnResponseStarted, { urls: [''] });\n RequestEvents.onCompleted.init(browser.webRequest.onCompleted, RequestEvents.handleOnCompleted, { urls: [''] }, ['responseHeaders']);\n RequestEvents.onErrorOccurred.init(browser.webRequest.onErrorOccurred, RequestEvents.handleOnErrorOccurred, { urls: [''] });\n }\n /**\n * Handles onBeforeRequest event.\n *\n * @param details WebRequest details.\n * @returns Request data.\n */\n static handleOnBeforeRequest(details) {\n var _a, _b;\n const { requestId, type, tabId, parentFrameId, originUrl, initiator, method, timeStamp, } = details;\n let { url, frameId } = details;\n /**\n * Truncate too long urls.\n *\n * @see {@link https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1493}\n */\n if (url.length > MAX_URL_LENGTH) {\n url = url.slice(0, MAX_URL_LENGTH);\n }\n /**\n * FF sends http instead of ws protocol at the http-listeners layer\n * Although this is expected, as the Upgrade request is indeed an HTTP request,\n * we use a chromium based approach in this case.\n */\n if (type === 'websocket' && isHttpRequest(url)) {\n url = url.replace(/^http(s)?:/, 'ws$1:');\n }\n const { requestType, contentType } = getRequestType(type);\n const isDocumentRequest = requestType === RequestType.Document;\n // Pre-rendered documents can have a frame ID other than zero\n frameId = isDocumentRequest ? MAIN_FRAME_ID : details.frameId;\n let requestFrameId = isDocumentRequest ? frameId : parentFrameId;\n // Relate request to main_frame\n if (requestFrameId === -1) {\n requestFrameId = 0;\n }\n // To mark requests started via navigation from the address bar (real\n // request or pre-render, it does not matter) as first-party requests,\n // we get only part of the request context to record only the tab and\n // frame information before calculating the request referrer.\n const tabFrameRequestContext = {\n requestUrl: url,\n requestType,\n requestId,\n frameId,\n tabId,\n };\n if (isDocumentRequest || requestType === RequestType.SubDocument) {\n // Saves the current tab url to retrieve it correctly below.\n tabsApi.handleFrameRequest(tabFrameRequestContext);\n }\n const referrerUrl = originUrl\n || initiator\n // Comparison of the requested url with the tab frame url in case of\n // a navigation change from the browser address bar.\n || ((_a = tabsApi.getTabMainFrame(tabId)) === null || _a === void 0 ? void 0 : _a.url)\n || ((_b = tabsApi.getTabFrame(tabId, requestFrameId)) === null || _b === void 0 ? void 0 : _b.url)\n || url;\n // Retrieve the rest part of the request context for record all fields.\n const requestContext = requestContextStorage.create(requestId, Object.assign(Object.assign({}, tabFrameRequestContext), { requestFrameId, state: \"beforeRequest\" /* RequestContextState.BeforeRequest */, timestamp: timeStamp, thirdParty: isThirdPartyRequest(url, referrerUrl), referrerUrl,\n contentType, method: method }));\n return { details, context: requestContext };\n }\n /**\n * Handles onBeforeSendHeaders event.\n *\n * @param details WebRequest details.\n * @returns Request data.\n */\n static handleOnBeforeSendHeaders(details) {\n const { requestId, timeStamp, requestHeaders } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"beforeSendHeaders\" /* RequestContextState.BeforeSendHeaders */,\n timestamp: timeStamp,\n requestHeaders,\n });\n return { details, context };\n }\n /**\n * Handles onSendHeaders event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleSendHeaders(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"sendHeaders\" /* RequestContextState.SendHeaders */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onHeadersReceived event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnHeadersReceived(details) {\n const { requestId, responseHeaders, statusCode, } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"headersReceived\" /* RequestContextState.HeadersReceived */,\n responseHeaders,\n statusCode,\n });\n return { details, context };\n }\n /**\n * Handles onAuthRequired event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnAuthRequired(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"authRequired\" /* RequestContextState.AuthRequired */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onBeforeRedirect event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnBeforeRedirect(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"beforeRedirect\" /* RequestContextState.BeforeRedirect */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onResponseStarted event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnResponseStarted(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"responseStarted\" /* RequestContextState.ResponseStarted */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onCompleted event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnCompleted(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"completed\" /* RequestContextState.Completed */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n /**\n * Handles onErrorOccurred event.\n *\n * @param details WebRequest details.\n * @returns Request data with context.\n */\n static handleOnErrorOccurred(details) {\n const { requestId, timeStamp } = details;\n const context = requestContextStorage.update(requestId, {\n state: \"error\" /* RequestContextState.Error */,\n timestamp: timeStamp,\n });\n return { details, context };\n }\n}\nRequestEvents.onBeforeRequest = new RequestEvent();\nRequestEvents.onBeforeSendHeaders = new RequestEvent();\nRequestEvents.onSendHeaders = new RequestEvent();\nRequestEvents.onHeadersReceived = new RequestEvent();\nRequestEvents.onAuthRequired = new RequestEvent();\nRequestEvents.onBeforeRedirect = new RequestEvent();\nRequestEvents.onResponseStarted = new RequestEvent();\nRequestEvents.onCompleted = new RequestEvent();\nRequestEvents.onErrorOccurred = new RequestEvent();\n\n/**\n * Headers filtering service module.\n */\nclass HeadersService {\n /**\n * Constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.filteringLog = filteringLog;\n }\n /**\n * On before send headers handler.\n * Removes request headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n onBeforeSendHeaders(context) {\n const { requestHeaders, matchingResult, tabId, requestUrl, requestId, contentType, timestamp, } = context;\n if (!requestHeaders || !matchingResult) {\n return false;\n }\n const rules = matchingResult.getRemoveHeaderRules();\n if (rules.length === 0) {\n return false;\n }\n let isModified = false;\n rules.forEach((rule) => {\n if (HeadersService.applyRule(requestHeaders, rule, true)) {\n isModified = true;\n this.filteringLog.publishEvent({\n type: FilteringEventType.RemoveHeader,\n data: {\n removeHeader: true,\n headerName: rule.getAdvancedModifierValue(),\n eventId: nanoid(),\n tabId,\n requestUrl,\n frameUrl: requestUrl,\n frameDomain: getDomain(requestUrl),\n requestType: contentType,\n timestamp,\n rule,\n },\n });\n }\n });\n if (isModified) {\n requestContextStorage.update(requestId, { requestHeaders });\n }\n return isModified;\n }\n /**\n * On headers received handler.\n * Removes response headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n onHeadersReceived(context) {\n const { responseHeaders, matchingResult, tabId, requestUrl, requestId, contentType, timestamp, } = context;\n if (!responseHeaders || !matchingResult) {\n return false;\n }\n const rules = matchingResult.getRemoveHeaderRules();\n if (rules.length === 0) {\n return false;\n }\n let isModified = false;\n rules.forEach((rule) => {\n if (HeadersService.applyRule(responseHeaders, rule, false)) {\n isModified = true;\n this.filteringLog.publishEvent({\n type: FilteringEventType.RemoveHeader,\n data: {\n removeHeader: true,\n headerName: rule.getAdvancedModifierValue(),\n eventId: nanoid(),\n tabId,\n requestUrl,\n frameUrl: requestUrl,\n frameDomain: getDomain(requestUrl),\n requestType: contentType,\n timestamp,\n rule,\n },\n });\n }\n });\n if (isModified) {\n requestContextStorage.update(requestId, { responseHeaders });\n }\n return isModified;\n }\n /**\n * Applies rule to headers. Removes header from headers if rule matches.\n * Important: this method modifies headers array as they are passed by reference.\n *\n * @param headers Headers.\n * @param rule Rule to apply if it has remove header modifier.\n * @param isRequestHeaders Is request headers.\n * @returns True if headers removed by rule.\n */\n static applyRule(headers, rule, isRequestHeaders) {\n const modifier = rule.getAdvancedModifier();\n if (!modifier) {\n return false;\n }\n const headerName = modifier.getApplicableHeaderName(isRequestHeaders);\n if (!headerName) {\n return false;\n }\n return removeHeader(headers, headerName);\n }\n}\nconst headersService = new HeadersService(defaultFilteringLog);\n\n/**\n * Params filtering service module.\n */\nclass ParamsService {\n /**\n * Constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.filteringLog = filteringLog;\n }\n /**\n * Removes request params from url, stored in request context.\n *\n * @param requestId Request id.\n * @returns Modified url or null.\n */\n getPurgedUrl(requestId) {\n const context = requestContextStorage.get(requestId);\n if (!context) {\n return null;\n }\n const { matchingResult, method, requestUrl, contentType, timestamp, } = context;\n if (!matchingResult || !ParamsService.isMethodSupported(method)) {\n return null;\n }\n const removeParamRules = matchingResult.getRemoveParamRules();\n if (removeParamRules.length === 0) {\n return null;\n }\n const purgedUrl = removeParamRules.reduce((url, rule) => {\n if (rule.isAllowlist()) {\n return url;\n }\n const modifier = rule.getAdvancedModifier();\n const modifiedUrl = modifier.removeParameters(url);\n if (url !== modifiedUrl) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.RemoveParam,\n data: {\n removeParam: true,\n eventId: nanoid(),\n tabId: context.tabId,\n requestUrl: modifiedUrl,\n frameUrl: modifiedUrl,\n frameDomain: getDomain(modifiedUrl),\n requestType: contentType,\n rule,\n timestamp,\n },\n });\n }\n return modifier.removeParameters(url);\n }, requestUrl);\n if (purgedUrl === requestUrl) {\n return null;\n }\n return purgedUrl;\n }\n /**\n * Checks if we support requests for specified method.\n *\n * @param method Request method.\n * @returns True if method supported.\n */\n static isMethodSupported(method) {\n return ParamsService.SupportedMethods.includes(method.toUpperCase());\n }\n}\nParamsService.SupportedMethods = ['GET', 'OPTIONS', 'HEAD'];\nconst paramsService = new ParamsService(defaultFilteringLog);\n\n/**\n * Cookie rules manager class.\n */\nclass CookieRulesFinder {\n /**\n * Filters blocking rules.\n * Used in content scripts.\n *\n * @param url Request url.\n * @param rules List of rules.\n * @returns Blocking rules.\n */\n static getBlockingRules(url, rules) {\n return rules.filter((rule) => !CookieRulesFinder.isModifyingRule(rule));\n }\n /**\n * Finds a rule that doesn't modify cookie:\n * i.e.: this rule cancels cookie or if it's an allowlist rule.\n *\n * @param cookieName Cookie name.\n * @param rules List of network rules.\n * @param isThirdPartyCookie Flag that indicates if cookie is third-party.\n * @returns Found rule or null.\n */\n static lookupNotModifyingRule(cookieName, rules, isThirdPartyCookie) {\n const blockingRules = [];\n const allowlistRules = [];\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n if (!CookieRulesFinder.matchThirdParty(rule, isThirdPartyCookie)) {\n continue;\n }\n const cookieModifier = rule.getAdvancedModifier();\n if (cookieModifier.matches(cookieName) && !CookieRulesFinder.isModifyingRule(rule)) {\n if (rule.isAllowlist()) {\n allowlistRules.push(rule);\n }\n else {\n blockingRules.push(rule);\n }\n }\n }\n if (allowlistRules.length > 0) {\n return allowlistRules[0];\n }\n if (blockingRules.length > 0) {\n return blockingRules[0];\n }\n return null;\n }\n /**\n * Finds rules that modify cookie.\n *\n * @param cookieName Cookie name.\n * @param rules Matching rules.\n * @param isThirdPartyCookie Flag that indicates if cookie is third-party.\n * @returns Modifying rules.\n */\n static lookupModifyingRules(cookieName, rules, isThirdPartyCookie) {\n const result = [];\n const allowlistRules = [];\n if (rules && rules.length > 0) {\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n if (!CookieRulesFinder.matchThirdParty(rule, isThirdPartyCookie)) {\n continue;\n }\n const cookieModifier = rule.getAdvancedModifier();\n if (!cookieModifier.matches(cookieName)) {\n continue;\n }\n if (!rule.isAllowlist() && !CookieRulesFinder.isModifyingRule(rule)) {\n return [];\n }\n if (rule.isAllowlist()) {\n allowlistRules.push(rule);\n }\n else {\n result.push(rule);\n }\n }\n }\n if (allowlistRules.length > 0) {\n return allowlistRules;\n }\n return result;\n }\n /**\n * Checks if rule and third party flag matches.\n *\n * @param rule Rule.\n * @param isThirdParty Flag that indicates if cookie is third-party.\n * @returns True if rule and third party flag matches.\n */\n static matchThirdParty(rule, isThirdParty) {\n if (!rule.isOptionEnabled(NetworkRuleOption.ThirdParty)) {\n return true;\n }\n return isThirdParty === rule.isOptionEnabled(NetworkRuleOption.ThirdParty);\n }\n /**\n * Checks if $cookie rule is modifying.\n *\n * @param rule $cookie rule.\n * @returns True if rule is modifying.\n */\n static isModifyingRule(rule) {\n const cookieModifier = rule.getAdvancedModifier();\n return cookieModifier.getSameSite() !== null\n || (cookieModifier.getMaxAge() !== null && cookieModifier.getMaxAge() > 0);\n }\n}\n\n/**\n * Synthetic Cookie-like object parsed from headers.\n */\nclass ParsedCookie {\n /**\n * Constructor.\n *\n * @param name Cookie name.\n * @param value Cookie value.\n * @param url Url.\n */\n constructor(name, value, url) {\n /**\n * Cookie's third-party status.\n */\n this.thirdParty = false;\n this.name = name;\n this.value = value;\n this.url = url;\n this.path = new URL(url).pathname;\n }\n /**\n * Creates new {@link ParsedCookie} from provided {@link Cookies.Cookie}.\n *\n * @param cookie Item of {@link Cookies.Cookie}.\n * @param url String URL relative to this cookie.\n *\n * @returns New {@link ParsedCookie}.\n */\n static fromBrowserCookie(cookie, url) {\n const parsedCookie = new ParsedCookie(cookie.name, cookie.value, url);\n parsedCookie.thirdParty = !cookie.firstPartyDomain;\n parsedCookie.httpOnly = cookie.httpOnly;\n parsedCookie.secure = cookie.secure;\n parsedCookie.sameSite = cookie.sameSite;\n // For hostOnly cookie domain should be empty and path should be '/'.\n if (cookie.hostOnly) {\n parsedCookie.path = '/';\n }\n else {\n parsedCookie.domain = cookie.domain;\n parsedCookie.path = cookie.path;\n }\n if (cookie.expirationDate) {\n // cookie.expirationDate is a number of seconds that's why it should be multiplied\n parsedCookie.expires = new Date(cookie.expirationDate * 1000);\n }\n return parsedCookie;\n }\n}\n\n/**\n * Cookie Utils.\n */\nclass CookieUtils {\n /**\n * Parses set-cookie header from http response header.\n *\n * @param header HTTP response header.\n * @param url Request URL.\n * @returns Parsed cookie or null if it failed to parse the header.\n */\n static parseSetCookieHeader(header, url) {\n if (!header.name || header.name.toLowerCase() !== 'set-cookie') {\n return null;\n }\n if (!header.value) {\n return null;\n }\n return CookieUtils.parseSetCookie(header.value, url);\n }\n /**\n * Parses set-cookie headers for cookie objects.\n *\n * @param responseHeaders HTTP response headers.\n * @param url Request URL.\n * @returns Array of parsed cookies.\n */\n static parseSetCookieHeaders(responseHeaders, url) {\n const result = [];\n let iResponseHeaders = responseHeaders.length;\n while (iResponseHeaders > 0) {\n iResponseHeaders -= 1;\n const header = responseHeaders[iResponseHeaders];\n const setCookie = CookieUtils.parseSetCookieHeader(header, url);\n if (setCookie) {\n result.push(setCookie);\n }\n }\n return result;\n }\n /**\n * Parse an HTTP Cookie header string and return an object with all cookie name-value pairs.\n *\n * @param cookieValue HTTP Cookie value.\n * @param url Request URL.\n * @returns Array of cookie name-value pairs.\n */\n static parseCookies(cookieValue, url) {\n const cookies = [];\n // Split Cookie values\n const pairs = cookieValue.split(/; */);\n for (let i = 0; i < pairs.length; i += 1) {\n const pair = pairs[i];\n const eqIdx = pair.indexOf('=');\n // skip things that don't look like key=value\n if (eqIdx < 0) {\n continue;\n }\n const key = pair.substring(0, eqIdx).trim();\n const value = pair.substring(eqIdx + 1, pair.length).trim();\n const parsedCookie = new ParsedCookie(key, value, url);\n /**\n * Not obviously there are few special name prefixes.\n *\n * @see {@link https://developer.cdn.mozilla.net/pt-BR/docs/Web/HTTP/Headers/Set-Cookie}\n */\n if (key.startsWith('__Secure-') || key.startsWith('__Host-')) {\n parsedCookie.secure = true;\n }\n cookies.push(parsedCookie);\n }\n return cookies;\n }\n /**\n * Parses \"Set-Cookie\" header value and returns a cookie object with its properties.\n *\n * @param setCookieValue \"Set-Cookie\" header value to parse.\n * @param url Request URL.\n * @returns Parsed cookie or null if it failed to parse the value.\n */\n static parseSetCookie(setCookieValue, url) {\n const parts = setCookieValue.split(';').filter((s) => !!s);\n const nameValuePart = parts.shift();\n if (!nameValuePart) {\n logger.debug(`Cannot shift first name-value pair from Set-Cookie header '${setCookieValue}'.`);\n return null;\n }\n const nameValue = nameValuePart.split('=');\n const name = nameValue.shift();\n if (!name) {\n logger.debug(`Cannot extract name from first name-value pair from Set-Cookie header '${setCookieValue}'.`);\n return null;\n }\n // Everything after the first =, joined by a \"=\" if there was more\n // than one part.\n const value = nameValue.join('=');\n const cookie = new ParsedCookie(name, value, url);\n parts.forEach((part) => {\n const sides = part.split('=');\n const key = sides\n .shift()\n .trimStart()\n .toLowerCase();\n const optionValue = sides.join('=');\n if (key === 'expires') {\n cookie.expires = new Date(optionValue);\n }\n else if (key === 'max-age') {\n cookie.maxAge = parseInt(optionValue, 10);\n }\n else if (key === 'secure') {\n cookie.secure = true;\n }\n else if (key === 'httponly') {\n cookie.httpOnly = true;\n }\n else if (key === 'samesite') {\n cookie.sameSite = optionValue;\n }\n else if (key === 'path') {\n cookie.path = optionValue;\n }\n else if (key === 'domain') {\n cookie.domain = optionValue;\n }\n });\n return cookie;\n }\n /**\n * Updates cookie maxAge value.\n *\n * @param cookie Cookie to modify.\n * @param maxAge New maxAge value.\n * @returns True if cookie was modified.\n */\n static updateCookieMaxAge(cookie, maxAge) {\n const currentTimeSec = Date.now() / 1000;\n let cookieExpiresTimeSec = null;\n if (cookie.maxAge) {\n cookieExpiresTimeSec = currentTimeSec + cookie.maxAge;\n }\n else if (cookie.expires) {\n cookieExpiresTimeSec = cookie.expires.getTime() / 1000;\n }\n const newCookieExpiresTimeSec = currentTimeSec + maxAge;\n if (cookieExpiresTimeSec === null || cookieExpiresTimeSec > newCookieExpiresTimeSec) {\n // eslint-disable-next-line no-param-reassign\n cookie.expires = new Date(newCookieExpiresTimeSec * 1000);\n // eslint-disable-next-line no-param-reassign\n cookie.maxAge = maxAge;\n return true;\n }\n return false;\n }\n /**\n * Serializes cookie data into a string suitable for Set-Cookie header.\n *\n * @param cookie A cookie object.\n * @returns Set-Cookie string or null if it failed to serialize object.\n * @throws {TypeError} Thrown in case of invalid input data.\n */\n static serializeCookieToResponseHeader(cookie) {\n if (!cookie) {\n throw new TypeError('empty cookie data');\n }\n // 1. Validate fields\n if (!CookieUtils.FIELD_CONTENT_REGEX.test(cookie.name)) {\n throw new TypeError(`Cookie name is invalid: ${cookie.name}`);\n }\n if (cookie.value && !CookieUtils.FIELD_CONTENT_REGEX.test(cookie.value)) {\n throw new TypeError(`Cookie value is invalid: ${cookie.value}`);\n }\n if (cookie.domain && !CookieUtils.FIELD_CONTENT_REGEX.test(cookie.domain)) {\n throw new TypeError(`Cookie domain is invalid: ${cookie.domain}`);\n }\n if (cookie.path && !CookieUtils.FIELD_CONTENT_REGEX.test(cookie.path)) {\n throw new TypeError(`Cookie path is invalid: ${cookie.path}`);\n }\n if (cookie.expires && typeof cookie.expires.toUTCString !== 'function') {\n throw new TypeError(`Cookie expires is invalid: ${cookie.expires}`);\n }\n // 2. Build Set-Cookie header value\n let setCookieValue = `${cookie.name}=${cookie.value}`;\n if (typeof cookie.maxAge === 'number' && !Number.isNaN(cookie.maxAge)) {\n setCookieValue += `; Max-Age=${Math.floor(cookie.maxAge)}`;\n }\n if (cookie.domain) {\n setCookieValue += `; Domain=${cookie.domain}`;\n }\n if (cookie.path) {\n setCookieValue += `; Path=${cookie.path}`;\n }\n if (cookie.expires) {\n setCookieValue += `; Expires=${cookie.expires.toUTCString()}`;\n }\n if (cookie.httpOnly) {\n setCookieValue += '; HttpOnly';\n }\n if (cookie.secure) {\n setCookieValue += '; Secure';\n }\n if (cookie.sameSite) {\n const sameSite = cookie.sameSite.toLowerCase();\n switch (sameSite) {\n case 'lax':\n setCookieValue += '; SameSite=Lax';\n break;\n case 'strict':\n setCookieValue += '; SameSite=Strict';\n break;\n case 'none':\n setCookieValue += '; SameSite=None';\n break;\n default:\n throw new TypeError(`Cookie sameSite is invalid: ${cookie.sameSite}`);\n }\n }\n // Not affected. Let it be here just in case\n // https://bugs.chromium.org/p/chromium/issues/detail?id=232693\n if (cookie.priority) {\n setCookieValue += `; Priority=${cookie.priority}`;\n }\n return setCookieValue;\n }\n /**\n * Serializes cookie data into a string suitable for Cookie header.\n *\n * @param cookies Array with {@link ParsedCookie}.\n * @returns Cookie string or null if it failed to serialize object.\n */\n static serializeCookieToRequestHeader(cookies) {\n return cookies\n .map((cookie) => `${cookie.name}=${cookie.value}`)\n .join('; ');\n }\n}\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2.\n *\n * Example:\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF.\n */\n// eslint-disable-next-line no-control-regex\nCookieUtils.FIELD_CONTENT_REGEX = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\n/**\n * Cookie api implementation.\n */\nclass BrowserCookieApi {\n /**\n * Removes cookie.\n *\n * @param name Cookie name.\n * @param url Request url.\n * @returns True if cookie was removed.\n */\n removeCookie(name, url) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield browser.cookies.remove({ name, url });\n return true;\n }\n catch (e) {\n logger.error(e.message);\n }\n return false;\n });\n }\n /**\n * Updates cookie.\n *\n * @param cookie Cookie for update.\n */\n modifyCookie(cookie) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const update = BrowserCookieApi.convertToSetDetailsType(cookie);\n yield browser.cookies.set(update);\n return true;\n }\n catch (e) {\n // If `domain` contains the `path` part, the cookie cannot be saved,\n // since `domain` can only contain hostname.\n if ((_a = cookie.domain) === null || _a === void 0 ? void 0 : _a.includes('/')) {\n logger.info(e.message);\n }\n else {\n logger.error(e.message);\n }\n }\n return false;\n });\n }\n /**\n * Search for cookies that match a given pattern.\n *\n * @param pattern Pattern of cookies to find.\n *\n * @returns List of found cookies.\n */\n findCookies(pattern) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n const found = yield browser.cookies.getAll(pattern);\n return found;\n }\n catch (e) {\n logger.error(e.message);\n }\n return [];\n });\n }\n /**\n * Converts cookie to SetDetailsType.\n *\n * @param cookie Cookie for convert.\n * @returns SetDetailsType.\n */\n static convertToSetDetailsType(cookie) {\n return {\n /**\n * The request-URI to associate with the setting of the cookie.\n * This value can affect the default domain and path values of the created cookie.\n * If host permissions for this URL are not specified in the manifest file, the API call will fail.\n */\n url: cookie.url,\n /**\n * The name of the cookie. Empty by default if omitted.\n */\n name: cookie.name,\n /**\n * The value of the cookie. Empty by default if omitted.\n */\n value: cookie.value,\n /**\n * The domain of the cookie. If omitted, the cookie becomes a host-only cookie.\n */\n domain: cookie.domain,\n /**\n * Whether the cookie should be marked as Secure. Defaults to false.\n */\n secure: cookie.secure,\n /**\n * Whether the cookie should be marked as HttpOnly. Defaults to false.\n */\n httpOnly: cookie.httpOnly,\n /**\n * The cookie's same-site status.\n */\n sameSite: BrowserCookieApi.getSameSiteStatus(cookie.sameSite),\n /**\n * The expiration date of the cookie as the number of seconds since the UNIX epoch.\n * If omitted, the cookie becomes a session cookie.\n */\n expirationDate: cookie.expires\n ? Math.floor(cookie.expires.getTime() / 1000)\n : undefined,\n /**\n * The path of the cookie. Defaults to the path portion of the url parameter.\n */\n path: cookie.path,\n };\n }\n /**\n * Returns same-site type.\n *\n * @param sameSite Same-site string.\n * @returns Same-site status or undefined if same-site is not specified.\n */\n static getSameSiteStatus(sameSite) {\n if (sameSite) {\n if (sameSite.toLowerCase() === 'lax') {\n return 'lax';\n }\n if (sameSite.toLowerCase() === 'strict') {\n return 'strict';\n }\n }\n return undefined;\n }\n}\n\n/**\n * Cookie filtering.\n *\n * The following public methods should be set as suitable webrequest events listeners, check sample extension in this\n * repo for an example.\n *\n * Logic introduction:\n * onBeforeSendHeaders:\n * - get all cookies for request url;\n * - store cookies (first-party);\n *\n * onHeadersReceived:\n * - parse set-cookie header, only to detect if the cookie in header will be set from third-party request;\n * - save third-party flag for this cookie cookie.thirdParty=request.thirdParty;\n * - apply rules via removing them from headers and removing them with browser.cookies api;\n * TODO Rewrite/split method for extensions on MV3, because we wont have possibility to remove rules via headers.\n *\n * onCompleted\n * - apply rules via content script\n * In content-scripts (check /src/content-script/cookie-controller.ts):\n * - get matching cookie rules\n * - apply\n */\nclass CookieFiltering {\n /**\n * Constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.browserCookieApi = new BrowserCookieApi();\n this.filteringLog = filteringLog;\n }\n /**\n * Parses cookies from headers.\n *\n * @param context Request context.\n *\n * @returns True if headers were modified.\n */\n onBeforeSendHeaders(context) {\n const { requestHeaders, requestUrl, requestId } = context;\n if (!requestHeaders || !requestUrl) {\n return false;\n }\n const cookieHeader = findHeaderByName(requestHeaders, 'Cookie');\n if (!(cookieHeader === null || cookieHeader === void 0 ? void 0 : cookieHeader.value)) {\n return false;\n }\n const cookies = CookieUtils.parseCookies(cookieHeader.value, requestUrl);\n if (cookies.length === 0) {\n return false;\n }\n // Saves cookies to context\n requestContextStorage.update(requestId, { cookies });\n // Removes cookies from browser with browser.cookies api, but not\n // removing them from context to correct process them in headers.\n // IMPORTANT: This method reads cookies from context, so it should be\n // called before method that change headers, since that method will\n // remove or change headers in context.\n this.applyRules(context)\n .catch((e) => {\n logger.error(e.message);\n });\n // Removes cookie from headers and updates context.\n // Note: this method won't work in the extension build with manifest v3.\n const headersModified = this.applyRulesToRequestCookieHeaders(context);\n return headersModified;\n }\n /**\n * Applies cookies to request headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n applyRulesToRequestCookieHeaders(context) {\n let headersModified = false;\n const { requestHeaders, cookies, matchingResult, requestUrl, thirdParty, tabId, requestId, } = context;\n if (!requestHeaders\n || !matchingResult\n || !requestUrl\n || typeof thirdParty !== 'boolean'\n || !cookies) {\n return headersModified;\n }\n const cookieRules = matchingResult.getCookieRules();\n for (let i = 0; i < cookies.length; i += 1) {\n const cookie = cookies[i];\n if (!cookie) {\n continue;\n }\n const bRule = CookieRulesFinder.lookupNotModifyingRule(cookie.name, cookieRules, thirdParty);\n if (bRule) {\n if (!bRule.isAllowlist()) {\n // Remove from cookies array.\n cookies.splice(i, 1);\n // Move the loop counter back because we removed one element\n // from the iterated array.\n i -= 1;\n headersModified = true;\n }\n this.recordCookieEvent(tabId, cookie, requestUrl, bRule, false, thirdParty);\n }\n const mRules = CookieRulesFinder.lookupModifyingRules(cookie.name, cookieRules, thirdParty);\n if (mRules.length > 0) {\n const appliedRules = CookieFiltering.applyRuleToBrowserCookie(cookie, mRules);\n if (appliedRules.length > 0) {\n headersModified = true;\n }\n appliedRules.forEach((r) => {\n this.recordCookieEvent(tabId, cookie, requestUrl, r, true, thirdParty);\n });\n }\n }\n if (headersModified) {\n const cookieHeaderIndex = requestHeaders.findIndex((header) => header.name.toLowerCase() === 'cookie');\n if (cookieHeaderIndex !== -1) {\n if (cookies.length > 0) {\n // Update \"cookie\" header before send request to server.\n requestHeaders[cookieHeaderIndex].value = CookieUtils.serializeCookieToRequestHeader(cookies);\n }\n else {\n // Empty cookies, delete header \"Cookie\".\n requestHeaders.splice(cookieHeaderIndex, 1);\n }\n }\n // Update headers and cookies in context.\n requestContextStorage.update(requestId, { requestHeaders, cookies });\n }\n return headersModified;\n }\n /**\n * Applies cookies to response headers.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n applyRulesToResponseCookieHeaders(context) {\n let headersModified = false;\n const { responseHeaders, matchingResult, requestUrl, thirdParty, tabId, requestId, } = context;\n if (!responseHeaders\n || !matchingResult\n || !requestUrl\n || typeof thirdParty !== 'boolean') {\n return headersModified;\n }\n const cookieRules = matchingResult.getCookieRules();\n for (let i = responseHeaders.length - 1; i >= 0; i -= 1) {\n const header = responseHeaders[i];\n const cookie = CookieUtils.parseSetCookieHeader(header, requestUrl);\n if (!cookie) {\n continue;\n }\n const bRule = CookieRulesFinder.lookupNotModifyingRule(cookie.name, cookieRules, thirdParty);\n if (bRule) {\n if (!bRule.isAllowlist()) {\n responseHeaders.splice(i, 1);\n headersModified = true;\n }\n this.recordCookieEvent(tabId, cookie, requestUrl, bRule, false, thirdParty);\n }\n const mRules = CookieRulesFinder.lookupModifyingRules(cookie.name, cookieRules, thirdParty);\n if (mRules.length > 0) {\n const appliedRules = CookieFiltering.applyRuleToBrowserCookie(cookie, mRules);\n if (appliedRules.length > 0) {\n headersModified = true;\n responseHeaders[i] = {\n name: 'set-cookie',\n value: CookieUtils.serializeCookieToResponseHeader(cookie),\n };\n appliedRules.forEach((r) => {\n this.recordCookieEvent(tabId, cookie, requestUrl, r, true, thirdParty);\n });\n }\n }\n }\n if (headersModified) {\n requestContextStorage.update(requestId, { responseHeaders });\n }\n return headersModified;\n }\n /**\n * Parses set-cookie header and looks up third-party cookies.\n * This callback won't work for mv3 extensions.\n * TODO separate or rewrite to mv2 and mv3 methods.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n onHeadersReceived(context) {\n const { responseHeaders, requestUrl, thirdParty, requestId, } = context;\n if (responseHeaders\n && requestUrl\n && typeof thirdParty === 'boolean') {\n const cookies = CookieUtils.parseSetCookieHeaders(responseHeaders, requestUrl);\n const newCookies = cookies.filter((c) => { var _a; return !((_a = context.cookies) === null || _a === void 0 ? void 0 : _a.includes(c)); });\n for (const cookie of newCookies) {\n cookie.thirdParty = thirdParty;\n }\n requestContextStorage.update(requestId, {\n cookies: context.cookies ? [...context.cookies, ...newCookies] : newCookies,\n });\n }\n // Removes cookies from browser with browser.cookies api, but not\n // removing them from context to correct process them in headers.\n // IMPORTANT: This method reads cookies from context, so it should be\n // called before method that change headers, since that method will\n // remove or change headers in context.\n this.applyRules(context)\n .catch((e) => {\n logger.error(e.message);\n });\n // Remove cookie headers.\n // This method won't work in the extension build with manifest v3.\n const headersModified = this.applyRulesToResponseCookieHeaders(context);\n return headersModified;\n }\n /**\n * TODO: Return engine startup status data to content script\n * to delay execution of cookie rules until the engine is ready\n *\n * Looks up blocking rules for content-script in frame context.\n *\n * @param tabId Tab id.\n * @param frameId Frame id.\n * @returns List of blocking rules.\n */\n getBlockingRules(tabId, frameId) {\n const frame = tabsApi.getTabFrame(tabId, frameId);\n if (!frame || !frame.matchingResult) {\n return [];\n }\n const cookieRules = frame.matchingResult.getCookieRules();\n return CookieRulesFinder.getBlockingRules(frame.url, cookieRules);\n }\n /**\n * Applies rules.\n *\n * @param context Request context.\n */\n applyRules(context) {\n return __awaiter(this, void 0, void 0, function* () {\n const { matchingResult, cookies, requestUrl, tabId, } = context;\n if (!matchingResult || !cookies) {\n return;\n }\n const cookieRules = matchingResult.getCookieRules();\n const promises = cookies.map((cookie) => __awaiter(this, void 0, void 0, function* () {\n yield this.applyRulesToCookie(cookie, cookieRules, requestUrl, tabId);\n }));\n yield Promise.all(promises);\n });\n }\n /**\n * Attempts to find a \"parent\" cookie with a wider \"path\" field,\n * the scope of which includes the specified cookie from\n * the function parameters.\n *\n * This needs to prevent create of multiple \"child\"-cookies\n * and only modified expiration of general \"parent\"-cookie,\n * which covered \"children\"-cookies by 'path' value.\n *\n * @param cookie Cookie, for which need to find the \"parent\" cookie.\n *\n * @returns Item of parent cookie {@link ParsedCookie} or null if not found.\n */\n findParentCookie(cookie) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const pattern = {\n url: cookie.url,\n name: cookie.name,\n domain: cookie.domain,\n secure: cookie.secure,\n };\n const parentCookies = yield this.browserCookieApi.findCookies(pattern);\n const sortedParentCookies = parentCookies.sort((a, b) => a.path.length - b.path.length);\n for (let i = 0; i < sortedParentCookies.length; i += 1) {\n const parentCookie = sortedParentCookies[i];\n if ((_a = cookie.path) === null || _a === void 0 ? void 0 : _a.startsWith(parentCookie.path)) {\n return ParsedCookie.fromBrowserCookie(parentCookie, cookie.url);\n }\n }\n return null;\n });\n }\n /**\n * Applies rules to cookie.\n *\n * @param cookie Cookie.\n * @param cookieRules Cookie rules.\n * @param requestUrl Request URL, needs to record filtering event.\n * @param tabId Tab id.\n */\n applyRulesToCookie(cookie, cookieRules, requestUrl, tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n const cookieName = cookie.name;\n const isThirdPartyCookie = cookie.thirdParty;\n const bRule = CookieRulesFinder.lookupNotModifyingRule(cookieName, cookieRules, isThirdPartyCookie);\n if (bRule) {\n if (bRule.isAllowlist() || (yield this.browserCookieApi.removeCookie(cookie.name, cookie.url))) {\n this.recordCookieEvent(tabId, cookie, requestUrl, bRule, false, isThirdPartyCookie);\n }\n return;\n }\n const mRules = CookieRulesFinder.lookupModifyingRules(cookieName, cookieRules, isThirdPartyCookie);\n if (mRules.length > 0) {\n // Try to find \"parent\" cookie and modify it instead of creating\n // \"child copy\" cookie.\n const parentCookie = yield this.findParentCookie(cookie);\n const cookieToModify = parentCookie || cookie;\n const appliedRules = CookieFiltering.applyRuleToBrowserCookie(cookieToModify, mRules);\n if (appliedRules.length > 0) {\n if (yield this.browserCookieApi.modifyCookie(cookieToModify)) {\n appliedRules.forEach((r) => {\n this.recordCookieEvent(tabId, cookieToModify, requestUrl, r, true, isThirdPartyCookie);\n });\n }\n }\n }\n });\n }\n /**\n * Modifies instance of {@link ParsedCookie} with provided rules.\n *\n * @param cookie Cookie modify.\n * @param rules Cookie matching rules.\n * @returns Applied rules.\n */\n static applyRuleToBrowserCookie(cookie, rules) {\n const appliedRules = [];\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n if (rule.isAllowlist()) {\n appliedRules.push(rule);\n continue;\n }\n const cookieModifier = rule.getAdvancedModifier();\n let modified = false;\n const sameSite = cookieModifier.getSameSite();\n if (sameSite && cookie.sameSite !== sameSite) {\n // eslint-disable-next-line no-param-reassign\n cookie.sameSite = sameSite;\n modified = true;\n }\n const maxAge = cookieModifier.getMaxAge();\n if (maxAge) {\n if (CookieUtils.updateCookieMaxAge(cookie, maxAge)) {\n modified = true;\n }\n }\n if (modified) {\n appliedRules.push(rule);\n }\n }\n return appliedRules;\n }\n /**\n * Records cookie event to filtering log.\n *\n * @param tabId Id of the tab.\n * @param cookie Item of {@link ParsedCookie}.\n * @param requestUrl URL of the request.\n * @param rule Applied modifying or deleting rule.\n * @param isModifyingCookieRule Is applied rule modifying or not.\n * @param requestThirdParty Whether request third party or not.\n */\n recordCookieEvent(tabId, cookie, requestUrl, rule, isModifyingCookieRule, requestThirdParty) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.Cookie,\n data: {\n eventId: nanoid(),\n tabId,\n cookieName: cookie.name,\n cookieValue: cookie.value,\n frameDomain: getDomain$1(requestUrl) || requestUrl,\n rule,\n isModifyingCookieRule,\n requestThirdParty,\n timestamp: Date.now(),\n requestType: ContentType.Cookie,\n },\n });\n }\n}\nconst cookieFiltering = new CookieFiltering(defaultFilteringLog);\n\n/**\n * Document parser wrapper.\n */\nclass DocumentParser {\n /**\n * Constructor.\n */\n constructor() {\n // eslint-disable-next-line no-undef\n this.parser = new DOMParser();\n const errorneousParse = this.parser.parseFromString('<', 'text/xml');\n this.parsererrorNS = errorneousParse.getElementsByTagName('parsererror')[0].namespaceURI;\n }\n /**\n * Checks for parse errors.\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMParser#Error_handling}.\n *\n * @param parsedDocument Parsed document.\n * @returns True if document cannot be parsed.\n */\n isParseError(parsedDocument) {\n if (this.parsererrorNS === 'http://www.w3.org/1999/xhtml') {\n return parsedDocument.getElementsByTagName('parsererror').length > 0;\n }\n return parsedDocument.getElementsByTagNameNS(this.parsererrorNS, 'parsererror').length > 0;\n }\n /**\n * Parse html to document.\n *\n * @param html HTML content.\n * @returns Document or null if parse error occurred.\n */\n parse(html) {\n const doc = this.parser.parseFromString(html, 'text/html');\n if (this.isParseError(doc)) {\n return null;\n }\n return doc;\n }\n}\nconst documentParser = new DocumentParser();\n\n/**\n * Html rule wildcard.\n */\nclass Wildcard {\n /**\n * Constructor.\n *\n * @param pattern Wildcard pattern.\n */\n constructor(pattern) {\n this.regexp = new RegExp(Wildcard.wildcardToRegex(pattern), 'i');\n this.shortcut = Wildcard.extractShortcut(pattern);\n }\n /**\n * Returns 'true' if input text is matching wildcard.\n * This method first checking shortcut -- if shortcut exists in input string -- than it checks regexp.\n *\n * @param input Input string.\n * @returns Boolean if input string matches wildcard.\n */\n matches(input) {\n if (!input) {\n return false;\n }\n if (input.toLowerCase().indexOf(this.shortcut) < 0) {\n return false;\n }\n return this.regexp.test(input);\n }\n /**\n * Converts wildcard to regular expression.\n *\n * @param pattern The wildcard pattern to convert.\n * @returns A regex equivalent of the given wildcard.\n */\n static wildcardToRegex(pattern) {\n const specials = [\n '\\\\', '*', '+', '?', '|', '{', '}', '[', ']', '(', ')', '^', '$', '.', '#',\n ];\n const specialsRegex = new RegExp(`[${specials.join('\\\\')}]`, 'g');\n let result = pattern.replace(specialsRegex, '\\\\$&');\n result = replaceAll(result, '\\\\*', '[\\\\s\\\\S]*');\n result = replaceAll(result, '\\\\?', '.');\n return `^${result}$`;\n }\n /**\n * Extracts the longest string that does not contain \"*\" or \"?\" symbols.\n *\n * @param pattern Wildcard pattern.\n * @returns Longest string without special symbols.\n */\n static extractShortcut(pattern) {\n const wildcardChars = ['*', '?'];\n let startIndex = 0;\n let endIndex = indexOfAny(pattern, wildcardChars);\n if (endIndex < 0) {\n return pattern.toLowerCase();\n }\n let shortcut = endIndex === startIndex ? '' : pattern.substring(startIndex, endIndex - startIndex);\n while (endIndex >= 0) {\n startIndex = startIndex + endIndex + 1;\n if (pattern.length <= startIndex) {\n break;\n }\n endIndex = indexOfAny(pattern.substring(startIndex), wildcardChars);\n // eslint-disable-next-line max-len\n const tmpShortcut = endIndex < 0 ? pattern.substring(startIndex) : pattern.substring(startIndex, endIndex + startIndex);\n if (tmpShortcut.length > shortcut.length) {\n shortcut = tmpShortcut;\n }\n }\n return shortcut.toLowerCase();\n }\n}\n\n/**\n * Html rule attributes.\n *\n * @example\n * rule = [domains] \"$$\" tagName [attributes]\n * domains = [domain0, domain1[, ...[, domainN]]]\n * attributes = \"[\" name0 = value0 \"]\" \"[\" name1 = value2 \"]\" ... \"[\" nameN = valueN \"]\"\n *\n * https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#html-filtering-rules-syntax-1\n */\nclass HtmlRuleAttributes {\n}\n\n/**\n * Encapsulates html rule attributes parsing.\n */\nclass HtmlRuleParser {\n /**\n * Parses html rule.\n *\n * @param rule Rule to parse.\n * @returns Parsed rule attributes.\n */\n static parse(rule) {\n const result = new HtmlRuleAttributes();\n result.parentSearchLevel = HtmlRuleParser.DEFAULT_PARENT_SEARCH_LEVEL;\n result.maxLength = HtmlRuleParser.DEFAULT_MAX_LENGTH;\n const ruleContent = rule.getContent();\n let htmlAttributesStartIndex = ruleContent.indexOf(HtmlRuleParser.ATTRIBUTE_START_MARK);\n // Cutting tag name from string\n if (htmlAttributesStartIndex === -1) {\n result.tagName = ruleContent;\n }\n else {\n result.tagName = ruleContent.substring(0, htmlAttributesStartIndex);\n }\n const selector = [result.tagName];\n // Loading attributes filter\n while (htmlAttributesStartIndex !== -1) {\n const equalityIndex = ruleContent.indexOf('=', htmlAttributesStartIndex + 1);\n const quoteStartIndex = ruleContent.indexOf(HtmlRuleParser.QUOTES, equalityIndex + 1);\n const quoteEndIndex = HtmlRuleParser.getClosingQuoteIndex(ruleContent, quoteStartIndex + 1);\n if (quoteStartIndex === -1 || quoteEndIndex === -1) {\n break;\n }\n const ruleEndIndex = ruleContent.indexOf(HtmlRuleParser.ATTRIBUTE_END_MARK, quoteEndIndex + 1);\n const attributeName = ruleContent.substring(htmlAttributesStartIndex + 1, equalityIndex);\n let attributeValue = ruleContent.substring(quoteStartIndex + 1, quoteEndIndex);\n attributeValue = replaceAll(attributeValue, '\"\"', '\"');\n switch (attributeName) {\n case HtmlRuleParser.TAG_CONTENT_MASK:\n result.tagContentFilter = attributeValue;\n break;\n case HtmlRuleParser.WILDCARD_MASK:\n result.wildcard = new Wildcard(attributeValue);\n break;\n case HtmlRuleParser.TAG_CONTENT_MAX_LENGTH:\n result.maxLength = parseInt(attributeValue, 10);\n break;\n case HtmlRuleParser.TAG_CONTENT_MIN_LENGTH:\n result.minLength = parseInt(attributeValue, 10);\n break;\n case HtmlRuleParser.PARENT_ELEMENTS:\n result.parentElements = attributeValue.split(',');\n break;\n case HtmlRuleParser.PARENT_SEARCH_LEVEL:\n result.parentSearchLevel = parseInt(attributeValue, 10);\n break;\n default:\n selector.push('[');\n selector.push(attributeName);\n selector.push('*=\"');\n selector.push(attributeValue);\n selector.push('\"]');\n break;\n }\n if (ruleEndIndex === -1) {\n break;\n }\n htmlAttributesStartIndex = ruleContent.indexOf(HtmlRuleParser.ATTRIBUTE_START_MARK, ruleEndIndex + 1);\n }\n result.selector = selector.join('');\n // Validates selector immediately\n // eslint-disable-next-line no-undef\n if (typeof window !== 'undefined') {\n window.document.querySelectorAll(result.selector);\n }\n return result;\n }\n /**\n * Looks up next closing quotation starting from start index.\n * Skips double quotes in text like:\n * [tag-content=\"teas\"\"ernet\"].\n *\n * @param text Text to search.\n * @param startIndex Start index.\n * @returns Index of closing double quotation `\"` found, or `-1` if not found.\n */\n static getClosingQuoteIndex(text, startIndex) {\n let nextChar = HtmlRuleParser.QUOTES;\n let quoteIndex = startIndex - 2;\n while (nextChar === '\"') {\n quoteIndex = text.indexOf(HtmlRuleParser.QUOTES, quoteIndex + 2);\n if (quoteIndex === -1) {\n return -1;\n }\n nextChar = text.length === (quoteIndex + 1) ? '0' : text.charAt(quoteIndex + 1);\n }\n return quoteIndex;\n }\n}\nHtmlRuleParser.ATTRIBUTE_START_MARK = '[';\nHtmlRuleParser.ATTRIBUTE_END_MARK = ']';\nHtmlRuleParser.QUOTES = '\"';\nHtmlRuleParser.TAG_CONTENT_MASK = 'tag-content';\nHtmlRuleParser.WILDCARD_MASK = 'wildcard';\nHtmlRuleParser.TAG_CONTENT_MAX_LENGTH = 'max-length';\nHtmlRuleParser.TAG_CONTENT_MIN_LENGTH = 'min-length';\nHtmlRuleParser.PARENT_ELEMENTS = 'parent-elements';\nHtmlRuleParser.PARENT_SEARCH_LEVEL = 'parent-search-level';\nHtmlRuleParser.DEFAULT_PARENT_SEARCH_LEVEL = 3;\nHtmlRuleParser.DEFAULT_MAX_LENGTH = 8192;\n\n/**\n * Encapsulates document element matching.\n */\nclass HtmlRuleSelector {\n /**\n * Constructor.\n *\n * @param parsedHtmlRule Html rule attributes.\n */\n constructor(parsedHtmlRule) {\n this.ruleAttributes = parsedHtmlRule;\n }\n /**\n * Returns elements matched by provided html rule.\n *\n * @param doc Document object.\n * @returns Array of elements or null.\n */\n getMatchedElements(doc) {\n const elements = doc.querySelectorAll(this.ruleAttributes.selector);\n let result = null;\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n let elementToDelete = null;\n if (this.isFiltered(element)) {\n if (this.ruleAttributes.parentElements) {\n const parentElement = this.searchForParentElement(element);\n if (parentElement) {\n elementToDelete = parentElement;\n }\n }\n else {\n elementToDelete = element;\n }\n if (elementToDelete) {\n if (result === null) {\n result = [];\n }\n result.push(elementToDelete);\n }\n }\n }\n return result;\n }\n /**\n * Checks if element is filtered by provided rule.\n *\n * @param element Element to check.\n * @returns True if element is filtered.\n */\n isFiltered(element) {\n // Checking tag content length limits\n const content = element.innerHTML || '';\n if (this.ruleAttributes.maxLength && this.ruleAttributes.maxLength > 0) {\n // If max-length is set - checking content length (it should be lesser than max length)\n if (content.length > this.ruleAttributes.maxLength) {\n return false;\n }\n }\n if (this.ruleAttributes.minLength && this.ruleAttributes.minLength > 0) {\n // If min-length is set - checking content length (it should be greater than min length)\n if (content.length < this.ruleAttributes.minLength) {\n return false;\n }\n }\n if (!this.ruleAttributes.tagContentFilter && !this.ruleAttributes.wildcard) {\n // Rule does not depend on content\n return true;\n }\n if (!content) {\n return false;\n }\n // Checking tag content against filter\n if (this.ruleAttributes.tagContentFilter && content.indexOf(this.ruleAttributes.tagContentFilter) < 0) {\n return false;\n }\n // Checking tag content against the wildcard\n if (this.ruleAttributes.wildcard && !this.ruleAttributes.wildcard.matches(content)) {\n return false;\n }\n // All filters are passed, tag is filtered\n return true;\n }\n /**\n * Searches for parent element.\n * Suitable parent elements are set by 'parent-elements' attribute.\n * If suitable element found - returns it. Otherwise - returns null.\n *\n * @param element Element evaluated against this rule.\n * @returns Parent element.\n */\n searchForParentElement(element) {\n let parentElement = element.parentNode;\n for (let i = 0; i < this.ruleAttributes.parentSearchLevel; i += 1) {\n if (!parentElement) {\n return null;\n }\n if (this.ruleAttributes.parentElements.indexOf(parentElement.tagName.toLowerCase()) > 0) {\n return parentElement;\n }\n parentElement = parentElement.parentNode;\n }\n return null;\n }\n}\n\n/**\n * Content string filter.\n */\nclass ContentStringFilter {\n /**\n * Creates an instance of ContentStringFilter.\n *\n * @param context Request context.\n * @param htmlRules Html rules.\n * @param replaceRules Replace rules.\n * @param filteringLog Filtering log.\n */\n constructor(context, htmlRules, replaceRules, filteringLog) {\n this.context = context;\n this.htmlRules = htmlRules;\n this.replaceRules = replaceRules;\n this.filteringLog = filteringLog;\n }\n /**\n * Applies Html and Replace rules to content string.\n *\n * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#html-filtering-rules}\n * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#replace-modifier}\n *\n * @param content Content string.\n * @returns Modified content string.\n */\n applyRules(content) {\n if (this.htmlRules && this.htmlRules.length > 0) {\n content = this.applyHtmlRules(content);\n }\n if (this.replaceRules\n && this.replaceRules.length > 0\n // response content is over 3MB, ignore it\n && content.length <= 3 * 1024 * 1024) {\n content = this.applyReplaceRules(content);\n }\n return content;\n }\n /**\n * Applies Html rules to content string.\n *\n * @see {@link https://adguard.com/kb/general/ad-filtering/create-own-filters/#html-filtering-rules}\n *\n * @param content Content string.\n * @returns Modified content string.\n */\n applyHtmlRules(content) {\n const doc = documentParser.parse(content);\n if (!doc) {\n return content;\n }\n const deleted = [];\n for (let i = 0; i < this.htmlRules.length; i += 1) {\n const rule = this.htmlRules[i];\n const parsed = HtmlRuleParser.parse(rule);\n const elements = new HtmlRuleSelector(parsed).getMatchedElements(doc);\n if (elements) {\n for (let j = 0; j < elements.length; j += 1) {\n const element = elements[j];\n if (element.parentNode && deleted.indexOf(element) < 0) {\n element.parentNode.removeChild(element);\n const { tabId, requestUrl, timestamp, contentType, } = this.context;\n this.filteringLog.publishEvent({\n type: FilteringEventType.ApplyCosmeticRule,\n data: {\n tabId,\n eventId: nanoid(),\n element: element.innerHTML,\n frameUrl: requestUrl,\n rule,\n frameDomain: getDomain(requestUrl),\n requestType: contentType,\n timestamp,\n },\n });\n deleted.push(element);\n }\n }\n }\n }\n // Add \n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/959\n // XMLSerializer is used to serialize doctype object\n // eslint-disable-next-line no-undef\n const doctype = doc.doctype ? `${new XMLSerializer().serializeToString(doc.doctype)}\\r\\n` : '';\n if (deleted.length > 0) {\n return doctype + doc.documentElement.outerHTML;\n }\n return content;\n }\n /**\n * Applies \"replace\" rules to content string.\n *\n * @param content Content string.\n * @returns Modified content string.\n */\n applyReplaceRules(content) {\n const appliedRules = [];\n let modifiedContent = content;\n for (let i = 0; i < this.replaceRules.length; i += 1) {\n const replaceRule = this.replaceRules[i];\n if (replaceRule.isAllowlist()) {\n appliedRules.push(replaceRule);\n }\n else {\n const advancedModifier = replaceRule.getAdvancedModifier();\n modifiedContent = advancedModifier.getApplyFunc()(modifiedContent);\n appliedRules.push(replaceRule);\n }\n }\n const { tabId, eventId } = this.context;\n if (appliedRules.length > 0) {\n this.filteringLog.publishEvent({\n type: FilteringEventType.ReplaceRuleApply,\n data: {\n tabId,\n eventId,\n rules: appliedRules,\n },\n });\n }\n return modifiedContent;\n }\n}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar encoding$1 = {exports: {}};\n\nvar encodingIndexes = {exports: {}};\n\nvar hasRequiredEncodingIndexes;\n\nfunction requireEncodingIndexes () {\n\tif (hasRequiredEncodingIndexes) return encodingIndexes.exports;\n\thasRequiredEncodingIndexes = 1;\n\t(function (module) {\n\t\t(function(global) {\n\t\t if (module.exports) {\n\t\t module.exports = global;\n\t\t }\n\t\t global[\"encoding-indexes\"] =\n\t\t{\n\t\t \"big5\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188],\n\t\t \"euc-kr\":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"gb18030\":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565],\n\t\t \"gb18030-ranges\":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]],\n\t\t \"jis0208\":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"jis0212\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"ibm866\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160],\n\t\t \"iso-8859-2\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n\t\t \"iso-8859-3\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729],\n\t\t \"iso-8859-4\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729],\n\t\t \"iso-8859-5\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119],\n\t\t \"iso-8859-6\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null],\n\t\t \"iso-8859-7\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n\t\t \"iso-8859-8\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n\t\t \"iso-8859-10\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312],\n\t\t \"iso-8859-13\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217],\n\t\t \"iso-8859-14\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255],\n\t\t \"iso-8859-15\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n\t\t \"iso-8859-16\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255],\n\t\t \"koi8-r\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n\t\t \"koi8-u\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n\t\t \"macintosh\":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711],\n\t\t \"windows-874\":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null],\n\t\t \"windows-1250\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n\t\t \"windows-1251\":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103],\n\t\t \"windows-1252\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n\t\t \"windows-1253\":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n\t\t \"windows-1254\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255],\n\t\t \"windows-1255\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n\t\t \"windows-1256\":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746],\n\t\t \"windows-1257\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729],\n\t\t \"windows-1258\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255],\n\t\t \"x-mac-cyrillic\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364]\n\t\t};\n\t\t}(commonjsGlobal || {})); \n\t} (encodingIndexes));\n\treturn encodingIndexes.exports;\n}\n\n(function (module) {\n\t(function(global) {\n\t if (module.exports &&\n\t !global[\"encoding-indexes\"]) {\n\t global[\"encoding-indexes\"] =\n\t requireEncodingIndexes()[\"encoding-indexes\"];\n\t }\n\t function inRange(a, min, max) {\n\t return min <= a && a <= max;\n\t }\n\t function includes(array, item) {\n\t return array.indexOf(item) !== -1;\n\t }\n\t var floor = Math.floor;\n\t function ToDictionary(o) {\n\t if (o === undefined) return {};\n\t if (o === Object(o)) return o;\n\t throw TypeError('Could not convert argument to dictionary');\n\t }\n\t function stringToCodePoints(string) {\n\t var s = String(string);\n\t var n = s.length;\n\t var i = 0;\n\t var u = [];\n\t while (i < n) {\n\t var c = s.charCodeAt(i);\n\t if (c < 0xD800 || c > 0xDFFF) {\n\t u.push(c);\n\t }\n\t else if (0xDC00 <= c && c <= 0xDFFF) {\n\t u.push(0xFFFD);\n\t }\n\t else if (0xD800 <= c && c <= 0xDBFF) {\n\t if (i === n - 1) {\n\t u.push(0xFFFD);\n\t }\n\t else {\n\t var d = s.charCodeAt(i + 1);\n\t if (0xDC00 <= d && d <= 0xDFFF) {\n\t var a = c & 0x3FF;\n\t var b = d & 0x3FF;\n\t u.push(0x10000 + (a << 10) + b);\n\t i += 1;\n\t }\n\t else {\n\t u.push(0xFFFD);\n\t }\n\t }\n\t }\n\t i += 1;\n\t }\n\t return u;\n\t }\n\t function codePointsToString(code_points) {\n\t var s = '';\n\t for (var i = 0; i < code_points.length; ++i) {\n\t var cp = code_points[i];\n\t if (cp <= 0xFFFF) {\n\t s += String.fromCharCode(cp);\n\t } else {\n\t cp -= 0x10000;\n\t s += String.fromCharCode((cp >> 10) + 0xD800,\n\t (cp & 0x3FF) + 0xDC00);\n\t }\n\t }\n\t return s;\n\t }\n\t function isASCIIByte(a) {\n\t return 0x00 <= a && a <= 0x7F;\n\t }\n\t var isASCIICodePoint = isASCIIByte;\n\t var end_of_stream = -1;\n\t function Stream(tokens) {\n\t this.tokens = [].slice.call(tokens);\n\t this.tokens.reverse();\n\t }\n\t Stream.prototype = {\n\t endOfStream: function() {\n\t return !this.tokens.length;\n\t },\n\t read: function() {\n\t if (!this.tokens.length)\n\t return end_of_stream;\n\t return this.tokens.pop();\n\t },\n\t prepend: function(token) {\n\t if (Array.isArray(token)) {\n\t var tokens = (token);\n\t while (tokens.length)\n\t this.tokens.push(tokens.pop());\n\t } else {\n\t this.tokens.push(token);\n\t }\n\t },\n\t push: function(token) {\n\t if (Array.isArray(token)) {\n\t var tokens = (token);\n\t while (tokens.length)\n\t this.tokens.unshift(tokens.shift());\n\t } else {\n\t this.tokens.unshift(token);\n\t }\n\t }\n\t };\n\t var finished = -1;\n\t function decoderError(fatal, opt_code_point) {\n\t if (fatal)\n\t throw TypeError('Decoder error');\n\t return opt_code_point || 0xFFFD;\n\t }\n\t function encoderError(code_point) {\n\t throw TypeError('The code point ' + code_point + ' could not be encoded.');\n\t }\n\t function getEncoding(label) {\n\t label = String(label).trim().toLowerCase();\n\t if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {\n\t return label_to_encoding[label];\n\t }\n\t return null;\n\t }\n\t var encodings = [\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"unicode-1-1-utf-8\",\n\t \"utf-8\",\n\t \"utf8\"\n\t ],\n\t \"name\": \"UTF-8\"\n\t }\n\t ],\n\t \"heading\": \"The Encoding\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"866\",\n\t \"cp866\",\n\t \"csibm866\",\n\t \"ibm866\"\n\t ],\n\t \"name\": \"IBM866\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin2\",\n\t \"iso-8859-2\",\n\t \"iso-ir-101\",\n\t \"iso8859-2\",\n\t \"iso88592\",\n\t \"iso_8859-2\",\n\t \"iso_8859-2:1987\",\n\t \"l2\",\n\t \"latin2\"\n\t ],\n\t \"name\": \"ISO-8859-2\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin3\",\n\t \"iso-8859-3\",\n\t \"iso-ir-109\",\n\t \"iso8859-3\",\n\t \"iso88593\",\n\t \"iso_8859-3\",\n\t \"iso_8859-3:1988\",\n\t \"l3\",\n\t \"latin3\"\n\t ],\n\t \"name\": \"ISO-8859-3\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin4\",\n\t \"iso-8859-4\",\n\t \"iso-ir-110\",\n\t \"iso8859-4\",\n\t \"iso88594\",\n\t \"iso_8859-4\",\n\t \"iso_8859-4:1988\",\n\t \"l4\",\n\t \"latin4\"\n\t ],\n\t \"name\": \"ISO-8859-4\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatincyrillic\",\n\t \"cyrillic\",\n\t \"iso-8859-5\",\n\t \"iso-ir-144\",\n\t \"iso8859-5\",\n\t \"iso88595\",\n\t \"iso_8859-5\",\n\t \"iso_8859-5:1988\"\n\t ],\n\t \"name\": \"ISO-8859-5\"\n\t },\n\t {\n\t \"labels\": [\n\t \"arabic\",\n\t \"asmo-708\",\n\t \"csiso88596e\",\n\t \"csiso88596i\",\n\t \"csisolatinarabic\",\n\t \"ecma-114\",\n\t \"iso-8859-6\",\n\t \"iso-8859-6-e\",\n\t \"iso-8859-6-i\",\n\t \"iso-ir-127\",\n\t \"iso8859-6\",\n\t \"iso88596\",\n\t \"iso_8859-6\",\n\t \"iso_8859-6:1987\"\n\t ],\n\t \"name\": \"ISO-8859-6\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatingreek\",\n\t \"ecma-118\",\n\t \"elot_928\",\n\t \"greek\",\n\t \"greek8\",\n\t \"iso-8859-7\",\n\t \"iso-ir-126\",\n\t \"iso8859-7\",\n\t \"iso88597\",\n\t \"iso_8859-7\",\n\t \"iso_8859-7:1987\",\n\t \"sun_eu_greek\"\n\t ],\n\t \"name\": \"ISO-8859-7\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csiso88598e\",\n\t \"csisolatinhebrew\",\n\t \"hebrew\",\n\t \"iso-8859-8\",\n\t \"iso-8859-8-e\",\n\t \"iso-ir-138\",\n\t \"iso8859-8\",\n\t \"iso88598\",\n\t \"iso_8859-8\",\n\t \"iso_8859-8:1988\",\n\t \"visual\"\n\t ],\n\t \"name\": \"ISO-8859-8\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csiso88598i\",\n\t \"iso-8859-8-i\",\n\t \"logical\"\n\t ],\n\t \"name\": \"ISO-8859-8-I\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin6\",\n\t \"iso-8859-10\",\n\t \"iso-ir-157\",\n\t \"iso8859-10\",\n\t \"iso885910\",\n\t \"l6\",\n\t \"latin6\"\n\t ],\n\t \"name\": \"ISO-8859-10\"\n\t },\n\t {\n\t \"labels\": [\n\t \"iso-8859-13\",\n\t \"iso8859-13\",\n\t \"iso885913\"\n\t ],\n\t \"name\": \"ISO-8859-13\"\n\t },\n\t {\n\t \"labels\": [\n\t \"iso-8859-14\",\n\t \"iso8859-14\",\n\t \"iso885914\"\n\t ],\n\t \"name\": \"ISO-8859-14\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csisolatin9\",\n\t \"iso-8859-15\",\n\t \"iso8859-15\",\n\t \"iso885915\",\n\t \"iso_8859-15\",\n\t \"l9\"\n\t ],\n\t \"name\": \"ISO-8859-15\"\n\t },\n\t {\n\t \"labels\": [\n\t \"iso-8859-16\"\n\t ],\n\t \"name\": \"ISO-8859-16\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cskoi8r\",\n\t \"koi\",\n\t \"koi8\",\n\t \"koi8-r\",\n\t \"koi8_r\"\n\t ],\n\t \"name\": \"KOI8-R\"\n\t },\n\t {\n\t \"labels\": [\n\t \"koi8-ru\",\n\t \"koi8-u\"\n\t ],\n\t \"name\": \"KOI8-U\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csmacintosh\",\n\t \"mac\",\n\t \"macintosh\",\n\t \"x-mac-roman\"\n\t ],\n\t \"name\": \"macintosh\"\n\t },\n\t {\n\t \"labels\": [\n\t \"dos-874\",\n\t \"iso-8859-11\",\n\t \"iso8859-11\",\n\t \"iso885911\",\n\t \"tis-620\",\n\t \"windows-874\"\n\t ],\n\t \"name\": \"windows-874\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1250\",\n\t \"windows-1250\",\n\t \"x-cp1250\"\n\t ],\n\t \"name\": \"windows-1250\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1251\",\n\t \"windows-1251\",\n\t \"x-cp1251\"\n\t ],\n\t \"name\": \"windows-1251\"\n\t },\n\t {\n\t \"labels\": [\n\t \"ansi_x3.4-1968\",\n\t \"ascii\",\n\t \"cp1252\",\n\t \"cp819\",\n\t \"csisolatin1\",\n\t \"ibm819\",\n\t \"iso-8859-1\",\n\t \"iso-ir-100\",\n\t \"iso8859-1\",\n\t \"iso88591\",\n\t \"iso_8859-1\",\n\t \"iso_8859-1:1987\",\n\t \"l1\",\n\t \"latin1\",\n\t \"us-ascii\",\n\t \"windows-1252\",\n\t \"x-cp1252\"\n\t ],\n\t \"name\": \"windows-1252\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1253\",\n\t \"windows-1253\",\n\t \"x-cp1253\"\n\t ],\n\t \"name\": \"windows-1253\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1254\",\n\t \"csisolatin5\",\n\t \"iso-8859-9\",\n\t \"iso-ir-148\",\n\t \"iso8859-9\",\n\t \"iso88599\",\n\t \"iso_8859-9\",\n\t \"iso_8859-9:1989\",\n\t \"l5\",\n\t \"latin5\",\n\t \"windows-1254\",\n\t \"x-cp1254\"\n\t ],\n\t \"name\": \"windows-1254\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1255\",\n\t \"windows-1255\",\n\t \"x-cp1255\"\n\t ],\n\t \"name\": \"windows-1255\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1256\",\n\t \"windows-1256\",\n\t \"x-cp1256\"\n\t ],\n\t \"name\": \"windows-1256\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1257\",\n\t \"windows-1257\",\n\t \"x-cp1257\"\n\t ],\n\t \"name\": \"windows-1257\"\n\t },\n\t {\n\t \"labels\": [\n\t \"cp1258\",\n\t \"windows-1258\",\n\t \"x-cp1258\"\n\t ],\n\t \"name\": \"windows-1258\"\n\t },\n\t {\n\t \"labels\": [\n\t \"x-mac-cyrillic\",\n\t \"x-mac-ukrainian\"\n\t ],\n\t \"name\": \"x-mac-cyrillic\"\n\t }\n\t ],\n\t \"heading\": \"Legacy single-byte encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"chinese\",\n\t \"csgb2312\",\n\t \"csiso58gb231280\",\n\t \"gb2312\",\n\t \"gb_2312\",\n\t \"gb_2312-80\",\n\t \"gbk\",\n\t \"iso-ir-58\",\n\t \"x-gbk\"\n\t ],\n\t \"name\": \"GBK\"\n\t },\n\t {\n\t \"labels\": [\n\t \"gb18030\"\n\t ],\n\t \"name\": \"gb18030\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Chinese (simplified) encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"big5\",\n\t \"big5-hkscs\",\n\t \"cn-big5\",\n\t \"csbig5\",\n\t \"x-x-big5\"\n\t ],\n\t \"name\": \"Big5\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Chinese (traditional) encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"cseucpkdfmtjapanese\",\n\t \"euc-jp\",\n\t \"x-euc-jp\"\n\t ],\n\t \"name\": \"EUC-JP\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csiso2022jp\",\n\t \"iso-2022-jp\"\n\t ],\n\t \"name\": \"ISO-2022-JP\"\n\t },\n\t {\n\t \"labels\": [\n\t \"csshiftjis\",\n\t \"ms932\",\n\t \"ms_kanji\",\n\t \"shift-jis\",\n\t \"shift_jis\",\n\t \"sjis\",\n\t \"windows-31j\",\n\t \"x-sjis\"\n\t ],\n\t \"name\": \"Shift_JIS\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Japanese encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"cseuckr\",\n\t \"csksc56011987\",\n\t \"euc-kr\",\n\t \"iso-ir-149\",\n\t \"korean\",\n\t \"ks_c_5601-1987\",\n\t \"ks_c_5601-1989\",\n\t \"ksc5601\",\n\t \"ksc_5601\",\n\t \"windows-949\"\n\t ],\n\t \"name\": \"EUC-KR\"\n\t }\n\t ],\n\t \"heading\": \"Legacy multi-byte Korean encodings\"\n\t },\n\t {\n\t \"encodings\": [\n\t {\n\t \"labels\": [\n\t \"csiso2022kr\",\n\t \"hz-gb-2312\",\n\t \"iso-2022-cn\",\n\t \"iso-2022-cn-ext\",\n\t \"iso-2022-kr\"\n\t ],\n\t \"name\": \"replacement\"\n\t },\n\t {\n\t \"labels\": [\n\t \"utf-16be\"\n\t ],\n\t \"name\": \"UTF-16BE\"\n\t },\n\t {\n\t \"labels\": [\n\t \"utf-16\",\n\t \"utf-16le\"\n\t ],\n\t \"name\": \"UTF-16LE\"\n\t },\n\t {\n\t \"labels\": [\n\t \"x-user-defined\"\n\t ],\n\t \"name\": \"x-user-defined\"\n\t }\n\t ],\n\t \"heading\": \"Legacy miscellaneous encodings\"\n\t }\n\t ];\n\t var label_to_encoding = {};\n\t encodings.forEach(function(category) {\n\t category.encodings.forEach(function(encoding) {\n\t encoding.labels.forEach(function(label) {\n\t label_to_encoding[label] = encoding;\n\t });\n\t });\n\t });\n\t var encoders = {};\n\t var decoders = {};\n\t function indexCodePointFor(pointer, index) {\n\t if (!index) return null;\n\t return index[pointer] || null;\n\t }\n\t function indexPointerFor(code_point, index) {\n\t var pointer = index.indexOf(code_point);\n\t return pointer === -1 ? null : pointer;\n\t }\n\t function index(name) {\n\t if (!('encoding-indexes' in global)) {\n\t throw Error(\"Indexes missing.\" +\n\t \" Did you forget to include encoding-indexes.js first?\");\n\t }\n\t return global['encoding-indexes'][name];\n\t }\n\t function fallbackReplacement(name) {\n\t var fallbackConfiguration = global['encode-fallback-replacement'];\n\t if (fallbackConfiguration) {\n\t var fallback = fallbackConfiguration[name];\n\t if (fallback) {\n\t return {\n\t \"replacement\": fallback.replacement,\n\t \"index\": index(fallback.index)\n\t }\n\t }\n\t }\n\t return null;\n\t }\n\t function indexGB18030RangesCodePointFor(pointer) {\n\t if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))\n\t return null;\n\t if (pointer === 7457) return 0xE7C7;\n\t var offset = 0;\n\t var code_point_offset = 0;\n\t var idx = index('gb18030-ranges');\n\t var i;\n\t for (i = 0; i < idx.length; ++i) {\n\t var entry = idx[i];\n\t if (entry[0] <= pointer) {\n\t offset = entry[0];\n\t code_point_offset = entry[1];\n\t } else {\n\t break;\n\t }\n\t }\n\t return code_point_offset + pointer - offset;\n\t }\n\t function indexGB18030RangesPointerFor(code_point) {\n\t if (code_point === 0xE7C7) return 7457;\n\t var offset = 0;\n\t var pointer_offset = 0;\n\t var idx = index('gb18030-ranges');\n\t var i;\n\t for (i = 0; i < idx.length; ++i) {\n\t var entry = idx[i];\n\t if (entry[1] <= code_point) {\n\t offset = entry[1];\n\t pointer_offset = entry[0];\n\t } else {\n\t break;\n\t }\n\t }\n\t return pointer_offset + code_point - offset;\n\t }\n\t function indexShiftJISPointerFor(code_point) {\n\t shift_jis_index = shift_jis_index ||\n\t index('jis0208').map(function(code_point, pointer) {\n\t return inRange(pointer, 8272, 8835) ? null : code_point;\n\t });\n\t var index_ = shift_jis_index;\n\t return index_.indexOf(code_point);\n\t }\n\t var shift_jis_index;\n\t function indexBig5PointerFor(code_point) {\n\t big5_index_no_hkscs = big5_index_no_hkscs ||\n\t index('big5').map(function(code_point, pointer) {\n\t return (pointer < (0xA1 - 0x81) * 157) ? null : code_point;\n\t });\n\t var index_ = big5_index_no_hkscs;\n\t if (code_point === 0x2550 || code_point === 0x255E ||\n\t code_point === 0x2561 || code_point === 0x256A ||\n\t code_point === 0x5341 || code_point === 0x5345) {\n\t return index_.lastIndexOf(code_point);\n\t }\n\t return indexPointerFor(code_point, index_);\n\t }\n\t var big5_index_no_hkscs;\n\t var DEFAULT_ENCODING = 'utf-8';\n\t function TextDecoder(label, options) {\n\t if (!(this instanceof TextDecoder))\n\t throw TypeError('Called as a function. Did you forget \\'new\\'?');\n\t label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n\t options = ToDictionary(options);\n\t this._encoding = null;\n\t this._decoder = null;\n\t this._ignoreBOM = false;\n\t this._BOMseen = false;\n\t this._error_mode = 'replacement';\n\t this._do_not_flush = false;\n\t var encoding = getEncoding(label);\n\t if (encoding === null || encoding.name === 'replacement')\n\t throw RangeError('Unknown encoding: ' + label);\n\t if (!decoders[encoding.name]) {\n\t throw Error('Decoder not present.' +\n\t ' Did you forget to include encoding-indexes.js first?');\n\t }\n\t var dec = this;\n\t dec._encoding = encoding;\n\t if (Boolean(options['fatal']))\n\t dec._error_mode = 'fatal';\n\t if (Boolean(options['ignoreBOM']))\n\t dec._ignoreBOM = true;\n\t if (!Object.defineProperty) {\n\t this.encoding = dec._encoding.name.toLowerCase();\n\t this.fatal = dec._error_mode === 'fatal';\n\t this.ignoreBOM = dec._ignoreBOM;\n\t }\n\t return dec;\n\t }\n\t if (Object.defineProperty) {\n\t Object.defineProperty(TextDecoder.prototype, 'encoding', {\n\t get: function() { return this._encoding.name.toLowerCase(); }\n\t });\n\t Object.defineProperty(TextDecoder.prototype, 'fatal', {\n\t get: function() { return this._error_mode === 'fatal'; }\n\t });\n\t Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', {\n\t get: function() { return this._ignoreBOM; }\n\t });\n\t }\n\t TextDecoder.prototype.decode = function decode(input, options) {\n\t var bytes;\n\t if (typeof input === 'object' && input instanceof ArrayBuffer) {\n\t bytes = new Uint8Array(input);\n\t } else if (typeof input === 'object' && 'buffer' in input &&\n\t input.buffer instanceof ArrayBuffer) {\n\t bytes = new Uint8Array(input.buffer,\n\t input.byteOffset,\n\t input.byteLength);\n\t } else if (typeof input === 'object' && input instanceof Uint8Array) {\n\t bytes = input;\n\t } else {\n\t bytes = new Uint8Array(0);\n\t }\n\t options = ToDictionary(options);\n\t if (!this._do_not_flush) {\n\t this._decoder = decoders[this._encoding.name]({\n\t fatal: this._error_mode === 'fatal'});\n\t this._BOMseen = false;\n\t }\n\t this._do_not_flush = Boolean(options['stream']);\n\t var input_stream = new Stream(bytes);\n\t var output = [];\n\t var result;\n\t while (true) {\n\t var token = input_stream.read();\n\t if (token === end_of_stream)\n\t break;\n\t result = this._decoder.handler(input_stream, token);\n\t if (result === finished)\n\t break;\n\t if (result !== null) {\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t }\n\t }\n\t if (!this._do_not_flush) {\n\t do {\n\t result = this._decoder.handler(input_stream, input_stream.read());\n\t if (result === finished)\n\t break;\n\t if (result === null)\n\t continue;\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t } while (!input_stream.endOfStream());\n\t this._decoder = null;\n\t }\n\t function serializeStream(stream) {\n\t if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) &&\n\t !this._ignoreBOM && !this._BOMseen) {\n\t if (stream.length > 0 && stream[0] === 0xFEFF) {\n\t this._BOMseen = true;\n\t stream.shift();\n\t } else if (stream.length > 0) {\n\t this._BOMseen = true;\n\t } else ;\n\t }\n\t return codePointsToString(stream);\n\t }\n\t return serializeStream.call(this, output);\n\t };\n\t function TextEncoder(label, options) {\n\t if (!(this instanceof TextEncoder))\n\t throw TypeError('Called as a function. Did you forget \\'new\\'?');\n\t options = ToDictionary(options);\n\t this._encoding = null;\n\t this._encoder = null;\n\t this._do_not_flush = false;\n\t this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement';\n\t var enc = this;\n\t if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {\n\t label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n\t var encoding = getEncoding(label);\n\t if (encoding === null || encoding.name === 'replacement')\n\t throw RangeError('Unknown encoding: ' + label);\n\t if (!encoders[encoding.name]) {\n\t throw Error('Encoder not present.' +\n\t ' Did you forget to include encoding-indexes.js first?');\n\t }\n\t enc._encoding = encoding;\n\t } else {\n\t enc._encoding = getEncoding('utf-8');\n\t if (label !== undefined && 'console' in global) {\n\t console.warn('TextEncoder constructor called with encoding label, '\n\t + 'which is ignored.');\n\t }\n\t }\n\t if (!Object.defineProperty)\n\t this.encoding = enc._encoding.name.toLowerCase();\n\t return enc;\n\t }\n\t if (Object.defineProperty) {\n\t Object.defineProperty(TextEncoder.prototype, 'encoding', {\n\t get: function() { return this._encoding.name.toLowerCase(); }\n\t });\n\t }\n\t TextEncoder.prototype.encode = function encode(opt_string, options) {\n\t opt_string = opt_string === undefined ? '' : String(opt_string);\n\t options = ToDictionary(options);\n\t if (!this._do_not_flush)\n\t this._encoder = encoders[this._encoding.name]({\n\t fatal: this._fatal === 'fatal'});\n\t this._do_not_flush = Boolean(options['stream']);\n\t var input = new Stream(stringToCodePoints(opt_string));\n\t var output = [];\n\t var result;\n\t while (true) {\n\t var token = input.read();\n\t if (token === end_of_stream)\n\t break;\n\t result = this._encoder.handler(input, token);\n\t if (result === finished)\n\t break;\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t }\n\t if (!this._do_not_flush) {\n\t while (true) {\n\t result = this._encoder.handler(input, input.read());\n\t if (result === finished)\n\t break;\n\t if (Array.isArray(result))\n\t output.push.apply(output, (result));\n\t else\n\t output.push(result);\n\t }\n\t this._encoder = null;\n\t }\n\t return new Uint8Array(output);\n\t };\n\t function UTF8Decoder(options) {\n\t var fatal = options.fatal;\n\t var utf8_code_point = 0,\n\t utf8_bytes_seen = 0,\n\t utf8_bytes_needed = 0,\n\t utf8_lower_boundary = 0x80,\n\t utf8_upper_boundary = 0xBF;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && utf8_bytes_needed !== 0) {\n\t utf8_bytes_needed = 0;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream)\n\t return finished;\n\t if (utf8_bytes_needed === 0) {\n\t if (inRange(bite, 0x00, 0x7F)) {\n\t return bite;\n\t }\n\t else if (inRange(bite, 0xC2, 0xDF)) {\n\t utf8_bytes_needed = 1;\n\t utf8_code_point = bite & 0x1F;\n\t }\n\t else if (inRange(bite, 0xE0, 0xEF)) {\n\t if (bite === 0xE0)\n\t utf8_lower_boundary = 0xA0;\n\t if (bite === 0xED)\n\t utf8_upper_boundary = 0x9F;\n\t utf8_bytes_needed = 2;\n\t utf8_code_point = bite & 0xF;\n\t }\n\t else if (inRange(bite, 0xF0, 0xF4)) {\n\t if (bite === 0xF0)\n\t utf8_lower_boundary = 0x90;\n\t if (bite === 0xF4)\n\t utf8_upper_boundary = 0x8F;\n\t utf8_bytes_needed = 3;\n\t utf8_code_point = bite & 0x7;\n\t }\n\t else {\n\t return decoderError(fatal);\n\t }\n\t return null;\n\t }\n\t if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) {\n\t utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n\t utf8_lower_boundary = 0x80;\n\t utf8_upper_boundary = 0xBF;\n\t stream.prepend(bite);\n\t return decoderError(fatal);\n\t }\n\t utf8_lower_boundary = 0x80;\n\t utf8_upper_boundary = 0xBF;\n\t utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F);\n\t utf8_bytes_seen += 1;\n\t if (utf8_bytes_seen !== utf8_bytes_needed)\n\t return null;\n\t var code_point = utf8_code_point;\n\t utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n\t return code_point;\n\t };\n\t }\n\t function UTF8Encoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var count, offset;\n\t if (inRange(code_point, 0x0080, 0x07FF)) {\n\t count = 1;\n\t offset = 0xC0;\n\t }\n\t else if (inRange(code_point, 0x0800, 0xFFFF)) {\n\t count = 2;\n\t offset = 0xE0;\n\t }\n\t else if (inRange(code_point, 0x10000, 0x10FFFF)) {\n\t count = 3;\n\t offset = 0xF0;\n\t }\n\t var bytes = [(code_point >> (6 * count)) + offset];\n\t while (count > 0) {\n\t var temp = code_point >> (6 * (count - 1));\n\t bytes.push(0x80 | (temp & 0x3F));\n\t count -= 1;\n\t }\n\t return bytes;\n\t };\n\t }\n\t encoders['UTF-8'] = function(options) {\n\t return new UTF8Encoder(options);\n\t };\n\t decoders['UTF-8'] = function(options) {\n\t return new UTF8Decoder(options);\n\t };\n\t function SingleByteDecoder(index, options) {\n\t var fatal = options.fatal;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream)\n\t return finished;\n\t if (isASCIIByte(bite))\n\t return bite;\n\t var code_point = index[bite - 0x80];\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t };\n\t }\n\t function SingleByteEncoder(index, options, fallback) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var pointer = indexPointerFor(code_point, index);\n\t if (pointer == null && fallback && fallback.index) {\n\t pointer = indexPointerFor(code_point, fallback.index);\n\t }\n\t if (pointer == null && fallback) {\n\t return fallback.replacement;\n\t }\n\t if (pointer === null)\n\t encoderError(code_point);\n\t return pointer + 0x80;\n\t };\n\t }\n\t (function() {\n\t if (!('encoding-indexes' in global))\n\t return;\n\t encodings.forEach(function(category) {\n\t if (category.heading !== 'Legacy single-byte encodings')\n\t return;\n\t category.encodings.forEach(function(encoding) {\n\t var name = encoding.name;\n\t var idx = index(name.toLowerCase());\n\t var fallback = fallbackReplacement(name.toLowerCase());\n\t decoders[name] = function(options) {\n\t return new SingleByteDecoder(idx, options);\n\t };\n\t encoders[name] = function(options) {\n\t return new SingleByteEncoder(idx, options, fallback);\n\t };\n\t });\n\t });\n\t }());\n\t decoders['GBK'] = function(options) {\n\t return new GB18030Decoder(options);\n\t };\n\t encoders['GBK'] = function(options) {\n\t return new GB18030Encoder(options, true);\n\t };\n\t function GB18030Decoder(options) {\n\t var fatal = options.fatal;\n\t var gb18030_first = 0x00,\n\t gb18030_second = 0x00,\n\t gb18030_third = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && gb18030_first === 0x00 &&\n\t gb18030_second === 0x00 && gb18030_third === 0x00) {\n\t return finished;\n\t }\n\t if (bite === end_of_stream &&\n\t (gb18030_first !== 0x00 || gb18030_second !== 0x00 ||\n\t gb18030_third !== 0x00)) {\n\t gb18030_first = 0x00;\n\t gb18030_second = 0x00;\n\t gb18030_third = 0x00;\n\t decoderError(fatal);\n\t }\n\t var code_point;\n\t if (gb18030_third !== 0x00) {\n\t code_point = null;\n\t if (inRange(bite, 0x30, 0x39)) {\n\t code_point = indexGB18030RangesCodePointFor(\n\t (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 +\n\t gb18030_third - 0x81) * 10 + bite - 0x30);\n\t }\n\t var buffer = [gb18030_second, gb18030_third, bite];\n\t gb18030_first = 0x00;\n\t gb18030_second = 0x00;\n\t gb18030_third = 0x00;\n\t if (code_point === null) {\n\t stream.prepend(buffer);\n\t return decoderError(fatal);\n\t }\n\t return code_point;\n\t }\n\t if (gb18030_second !== 0x00) {\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t gb18030_third = bite;\n\t return null;\n\t }\n\t stream.prepend([gb18030_second, bite]);\n\t gb18030_first = 0x00;\n\t gb18030_second = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (gb18030_first !== 0x00) {\n\t if (inRange(bite, 0x30, 0x39)) {\n\t gb18030_second = bite;\n\t return null;\n\t }\n\t var lead = gb18030_first;\n\t var pointer = null;\n\t gb18030_first = 0x00;\n\t var offset = bite < 0x7F ? 0x40 : 0x41;\n\t if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE))\n\t pointer = (lead - 0x81) * 190 + (bite - offset);\n\t code_point = pointer === null ? null :\n\t indexCodePointFor(pointer, index('gb18030'));\n\t if (code_point === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (bite === 0x80)\n\t return 0x20AC;\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t gb18030_first = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function GB18030Encoder(options, gbk_flag) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (code_point === 0xE5E5)\n\t return encoderError(code_point);\n\t if (gbk_flag && code_point === 0x20AC)\n\t return 0x80;\n\t var pointer = indexPointerFor(code_point, index('gb18030'));\n\t if (pointer !== null) {\n\t var lead = floor(pointer / 190) + 0x81;\n\t var trail = pointer % 190;\n\t var offset = trail < 0x3F ? 0x40 : 0x41;\n\t return [lead, trail + offset];\n\t }\n\t if (gbk_flag)\n\t return encoderError(code_point);\n\t pointer = indexGB18030RangesPointerFor(code_point);\n\t var byte1 = floor(pointer / 10 / 126 / 10);\n\t pointer = pointer - byte1 * 10 * 126 * 10;\n\t var byte2 = floor(pointer / 10 / 126);\n\t pointer = pointer - byte2 * 10 * 126;\n\t var byte3 = floor(pointer / 10);\n\t var byte4 = pointer - byte3 * 10;\n\t return [byte1 + 0x81,\n\t byte2 + 0x30,\n\t byte3 + 0x81,\n\t byte4 + 0x30];\n\t };\n\t }\n\t encoders['gb18030'] = function(options) {\n\t return new GB18030Encoder(options);\n\t };\n\t decoders['gb18030'] = function(options) {\n\t return new GB18030Decoder(options);\n\t };\n\t function Big5Decoder(options) {\n\t var fatal = options.fatal;\n\t var Big5_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && Big5_lead !== 0x00) {\n\t Big5_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && Big5_lead === 0x00)\n\t return finished;\n\t if (Big5_lead !== 0x00) {\n\t var lead = Big5_lead;\n\t var pointer = null;\n\t Big5_lead = 0x00;\n\t var offset = bite < 0x7F ? 0x40 : 0x62;\n\t if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE))\n\t pointer = (lead - 0x81) * 157 + (bite - offset);\n\t switch (pointer) {\n\t case 1133: return [0x00CA, 0x0304];\n\t case 1135: return [0x00CA, 0x030C];\n\t case 1164: return [0x00EA, 0x0304];\n\t case 1166: return [0x00EA, 0x030C];\n\t }\n\t var code_point = (pointer === null) ? null :\n\t indexCodePointFor(pointer, index('big5'));\n\t if (code_point === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t Big5_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function Big5Encoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var pointer = indexBig5PointerFor(code_point);\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 157) + 0x81;\n\t if (lead < 0xA1)\n\t return encoderError(code_point);\n\t var trail = pointer % 157;\n\t var offset = trail < 0x3F ? 0x40 : 0x62;\n\t return [lead, trail + offset];\n\t };\n\t }\n\t encoders['Big5'] = function(options) {\n\t return new Big5Encoder(options);\n\t };\n\t decoders['Big5'] = function(options) {\n\t return new Big5Decoder(options);\n\t };\n\t function EUCJPDecoder(options) {\n\t var fatal = options.fatal;\n\t var eucjp_jis0212_flag = false,\n\t eucjp_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && eucjp_lead !== 0x00) {\n\t eucjp_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && eucjp_lead === 0x00)\n\t return finished;\n\t if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) {\n\t eucjp_lead = 0x00;\n\t return 0xFF61 - 0xA1 + bite;\n\t }\n\t if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) {\n\t eucjp_jis0212_flag = true;\n\t eucjp_lead = bite;\n\t return null;\n\t }\n\t if (eucjp_lead !== 0x00) {\n\t var lead = eucjp_lead;\n\t eucjp_lead = 0x00;\n\t var code_point = null;\n\t if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {\n\t code_point = indexCodePointFor(\n\t (lead - 0xA1) * 94 + (bite - 0xA1),\n\t index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212'));\n\t }\n\t eucjp_jis0212_flag = false;\n\t if (!inRange(bite, 0xA1, 0xFE))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) {\n\t eucjp_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function EUCJPEncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (code_point === 0x00A5)\n\t return 0x5C;\n\t if (code_point === 0x203E)\n\t return 0x7E;\n\t if (inRange(code_point, 0xFF61, 0xFF9F))\n\t return [0x8E, code_point - 0xFF61 + 0xA1];\n\t if (code_point === 0x2212)\n\t code_point = 0xFF0D;\n\t var pointer = indexPointerFor(code_point, index('jis0208'));\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 94) + 0xA1;\n\t var trail = pointer % 94 + 0xA1;\n\t return [lead, trail];\n\t };\n\t }\n\t encoders['EUC-JP'] = function(options) {\n\t return new EUCJPEncoder(options);\n\t };\n\t decoders['EUC-JP'] = function(options) {\n\t return new EUCJPDecoder(options);\n\t };\n\t function ISO2022JPDecoder(options) {\n\t var fatal = options.fatal;\n\t var states = {\n\t ASCII: 0,\n\t Roman: 1,\n\t Katakana: 2,\n\t LeadByte: 3,\n\t TrailByte: 4,\n\t EscapeStart: 5,\n\t Escape: 6\n\t };\n\t var iso2022jp_decoder_state = states.ASCII,\n\t iso2022jp_decoder_output_state = states.ASCII,\n\t iso2022jp_lead = 0x00,\n\t iso2022jp_output_flag = false;\n\t this.handler = function(stream, bite) {\n\t switch (iso2022jp_decoder_state) {\n\t default:\n\t case states.ASCII:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E\n\t && bite !== 0x0F && bite !== 0x1B) {\n\t iso2022jp_output_flag = false;\n\t return bite;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.Roman:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (bite === 0x5C) {\n\t iso2022jp_output_flag = false;\n\t return 0x00A5;\n\t }\n\t if (bite === 0x7E) {\n\t iso2022jp_output_flag = false;\n\t return 0x203E;\n\t }\n\t if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F\n\t && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) {\n\t iso2022jp_output_flag = false;\n\t return bite;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.Katakana:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (inRange(bite, 0x21, 0x5F)) {\n\t iso2022jp_output_flag = false;\n\t return 0xFF61 - 0x21 + bite;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.LeadByte:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return null;\n\t }\n\t if (inRange(bite, 0x21, 0x7E)) {\n\t iso2022jp_output_flag = false;\n\t iso2022jp_lead = bite;\n\t iso2022jp_decoder_state = states.TrailByte;\n\t return null;\n\t }\n\t if (bite === end_of_stream) {\n\t return finished;\n\t }\n\t iso2022jp_output_flag = false;\n\t return decoderError(fatal);\n\t case states.TrailByte:\n\t if (bite === 0x1B) {\n\t iso2022jp_decoder_state = states.EscapeStart;\n\t return decoderError(fatal);\n\t }\n\t if (inRange(bite, 0x21, 0x7E)) {\n\t iso2022jp_decoder_state = states.LeadByte;\n\t var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;\n\t var code_point = indexCodePointFor(pointer, index('jis0208'));\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (bite === end_of_stream) {\n\t iso2022jp_decoder_state = states.LeadByte;\n\t stream.prepend(bite);\n\t return decoderError(fatal);\n\t }\n\t iso2022jp_decoder_state = states.LeadByte;\n\t return decoderError(fatal);\n\t case states.EscapeStart:\n\t if (bite === 0x24 || bite === 0x28) {\n\t iso2022jp_lead = bite;\n\t iso2022jp_decoder_state = states.Escape;\n\t return null;\n\t }\n\t stream.prepend(bite);\n\t iso2022jp_output_flag = false;\n\t iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n\t return decoderError(fatal);\n\t case states.Escape:\n\t var lead = iso2022jp_lead;\n\t iso2022jp_lead = 0x00;\n\t var state = null;\n\t if (lead === 0x28 && bite === 0x42)\n\t state = states.ASCII;\n\t if (lead === 0x28 && bite === 0x4A)\n\t state = states.Roman;\n\t if (lead === 0x28 && bite === 0x49)\n\t state = states.Katakana;\n\t if (lead === 0x24 && (bite === 0x40 || bite === 0x42))\n\t state = states.LeadByte;\n\t if (state !== null) {\n\t iso2022jp_decoder_state = iso2022jp_decoder_state = state;\n\t var output_flag = iso2022jp_output_flag;\n\t iso2022jp_output_flag = true;\n\t return !output_flag ? null : decoderError(fatal);\n\t }\n\t stream.prepend([lead, bite]);\n\t iso2022jp_output_flag = false;\n\t iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n\t return decoderError(fatal);\n\t }\n\t };\n\t }\n\t function ISO2022JPEncoder(options) {\n\t options.fatal;\n\t var states = {\n\t ASCII: 0,\n\t Roman: 1,\n\t jis0208: 2\n\t };\n\t var iso2022jp_state = states.ASCII;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream &&\n\t iso2022jp_state !== states.ASCII) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.ASCII;\n\t return [0x1B, 0x28, 0x42];\n\t }\n\t if (code_point === end_of_stream && iso2022jp_state === states.ASCII)\n\t return finished;\n\t if ((iso2022jp_state === states.ASCII ||\n\t iso2022jp_state === states.Roman) &&\n\t (code_point === 0x000E || code_point === 0x000F ||\n\t code_point === 0x001B)) {\n\t return encoderError(0xFFFD);\n\t }\n\t if (iso2022jp_state === states.ASCII &&\n\t isASCIICodePoint(code_point))\n\t return code_point;\n\t if (iso2022jp_state === states.Roman &&\n\t ((isASCIICodePoint(code_point) &&\n\t code_point !== 0x005C && code_point !== 0x007E) ||\n\t (code_point == 0x00A5 || code_point == 0x203E))) {\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (code_point === 0x00A5)\n\t return 0x5C;\n\t if (code_point === 0x203E)\n\t return 0x7E;\n\t }\n\t if (isASCIICodePoint(code_point) &&\n\t iso2022jp_state !== states.ASCII) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.ASCII;\n\t return [0x1B, 0x28, 0x42];\n\t }\n\t if ((code_point === 0x00A5 || code_point === 0x203E) &&\n\t iso2022jp_state !== states.Roman) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.Roman;\n\t return [0x1B, 0x28, 0x4A];\n\t }\n\t if (code_point === 0x2212)\n\t code_point = 0xFF0D;\n\t var pointer = indexPointerFor(code_point, index('jis0208'));\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t if (iso2022jp_state !== states.jis0208) {\n\t stream.prepend(code_point);\n\t iso2022jp_state = states.jis0208;\n\t return [0x1B, 0x24, 0x42];\n\t }\n\t var lead = floor(pointer / 94) + 0x21;\n\t var trail = pointer % 94 + 0x21;\n\t return [lead, trail];\n\t };\n\t }\n\t encoders['ISO-2022-JP'] = function(options) {\n\t return new ISO2022JPEncoder(options);\n\t };\n\t decoders['ISO-2022-JP'] = function(options) {\n\t return new ISO2022JPDecoder(options);\n\t };\n\t function ShiftJISDecoder(options) {\n\t var fatal = options.fatal;\n\t var Shift_JIS_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && Shift_JIS_lead !== 0x00) {\n\t Shift_JIS_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && Shift_JIS_lead === 0x00)\n\t return finished;\n\t if (Shift_JIS_lead !== 0x00) {\n\t var lead = Shift_JIS_lead;\n\t var pointer = null;\n\t Shift_JIS_lead = 0x00;\n\t var offset = (bite < 0x7F) ? 0x40 : 0x41;\n\t var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;\n\t if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC))\n\t pointer = (lead - lead_offset) * 188 + bite - offset;\n\t if (inRange(pointer, 8836, 10715))\n\t return 0xE000 - 8836 + pointer;\n\t var code_point = (pointer === null) ? null :\n\t indexCodePointFor(pointer, index('jis0208'));\n\t if (code_point === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite) || bite === 0x80)\n\t return bite;\n\t if (inRange(bite, 0xA1, 0xDF))\n\t return 0xFF61 - 0xA1 + bite;\n\t if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {\n\t Shift_JIS_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function ShiftJISEncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point) || code_point === 0x0080)\n\t return code_point;\n\t if (code_point === 0x00A5)\n\t return 0x5C;\n\t if (code_point === 0x203E)\n\t return 0x7E;\n\t if (inRange(code_point, 0xFF61, 0xFF9F))\n\t return code_point - 0xFF61 + 0xA1;\n\t if (code_point === 0x2212)\n\t code_point = 0xFF0D;\n\t var pointer = indexShiftJISPointerFor(code_point);\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 188);\n\t var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1;\n\t var trail = pointer % 188;\n\t var offset = (trail < 0x3F) ? 0x40 : 0x41;\n\t return [lead + lead_offset, trail + offset];\n\t };\n\t }\n\t encoders['Shift_JIS'] = function(options) {\n\t return new ShiftJISEncoder(options);\n\t };\n\t decoders['Shift_JIS'] = function(options) {\n\t return new ShiftJISDecoder(options);\n\t };\n\t function EUCKRDecoder(options) {\n\t var fatal = options.fatal;\n\t var euckr_lead = 0x00;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && euckr_lead !== 0) {\n\t euckr_lead = 0x00;\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && euckr_lead === 0)\n\t return finished;\n\t if (euckr_lead !== 0x00) {\n\t var lead = euckr_lead;\n\t var pointer = null;\n\t euckr_lead = 0x00;\n\t if (inRange(bite, 0x41, 0xFE))\n\t pointer = (lead - 0x81) * 190 + (bite - 0x41);\n\t var code_point = (pointer === null)\n\t ? null : indexCodePointFor(pointer, index('euc-kr'));\n\t if (pointer === null && isASCIIByte(bite))\n\t stream.prepend(bite);\n\t if (code_point === null)\n\t return decoderError(fatal);\n\t return code_point;\n\t }\n\t if (isASCIIByte(bite))\n\t return bite;\n\t if (inRange(bite, 0x81, 0xFE)) {\n\t euckr_lead = bite;\n\t return null;\n\t }\n\t return decoderError(fatal);\n\t };\n\t }\n\t function EUCKREncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t var pointer = indexPointerFor(code_point, index('euc-kr'));\n\t if (pointer === null)\n\t return encoderError(code_point);\n\t var lead = floor(pointer / 190) + 0x81;\n\t var trail = (pointer % 190) + 0x41;\n\t return [lead, trail];\n\t };\n\t }\n\t encoders['EUC-KR'] = function(options) {\n\t return new EUCKREncoder(options);\n\t };\n\t decoders['EUC-KR'] = function(options) {\n\t return new EUCKRDecoder(options);\n\t };\n\t function convertCodeUnitToBytes(code_unit, utf16be) {\n\t var byte1 = code_unit >> 8;\n\t var byte2 = code_unit & 0x00FF;\n\t if (utf16be)\n\t return [byte1, byte2];\n\t return [byte2, byte1];\n\t }\n\t function UTF16Decoder(utf16_be, options) {\n\t var fatal = options.fatal;\n\t var utf16_lead_byte = null,\n\t utf16_lead_surrogate = null;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream && (utf16_lead_byte !== null ||\n\t utf16_lead_surrogate !== null)) {\n\t return decoderError(fatal);\n\t }\n\t if (bite === end_of_stream && utf16_lead_byte === null &&\n\t utf16_lead_surrogate === null) {\n\t return finished;\n\t }\n\t if (utf16_lead_byte === null) {\n\t utf16_lead_byte = bite;\n\t return null;\n\t }\n\t var code_unit;\n\t if (utf16_be) {\n\t code_unit = (utf16_lead_byte << 8) + bite;\n\t } else {\n\t code_unit = (bite << 8) + utf16_lead_byte;\n\t }\n\t utf16_lead_byte = null;\n\t if (utf16_lead_surrogate !== null) {\n\t var lead_surrogate = utf16_lead_surrogate;\n\t utf16_lead_surrogate = null;\n\t if (inRange(code_unit, 0xDC00, 0xDFFF)) {\n\t return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +\n\t (code_unit - 0xDC00);\n\t }\n\t stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be));\n\t return decoderError(fatal);\n\t }\n\t if (inRange(code_unit, 0xD800, 0xDBFF)) {\n\t utf16_lead_surrogate = code_unit;\n\t return null;\n\t }\n\t if (inRange(code_unit, 0xDC00, 0xDFFF))\n\t return decoderError(fatal);\n\t return code_unit;\n\t };\n\t }\n\t function UTF16Encoder(utf16_be, options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (inRange(code_point, 0x0000, 0xFFFF))\n\t return convertCodeUnitToBytes(code_point, utf16_be);\n\t var lead = convertCodeUnitToBytes(\n\t ((code_point - 0x10000) >> 10) + 0xD800, utf16_be);\n\t var trail = convertCodeUnitToBytes(\n\t ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be);\n\t return lead.concat(trail);\n\t };\n\t }\n\t encoders['UTF-16BE'] = function(options) {\n\t return new UTF16Encoder(true, options);\n\t };\n\t decoders['UTF-16BE'] = function(options) {\n\t return new UTF16Decoder(true, options);\n\t };\n\t encoders['UTF-16LE'] = function(options) {\n\t return new UTF16Encoder(false, options);\n\t };\n\t decoders['UTF-16LE'] = function(options) {\n\t return new UTF16Decoder(false, options);\n\t };\n\t function XUserDefinedDecoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, bite) {\n\t if (bite === end_of_stream)\n\t return finished;\n\t if (isASCIIByte(bite))\n\t return bite;\n\t return 0xF780 + bite - 0x80;\n\t };\n\t }\n\t function XUserDefinedEncoder(options) {\n\t options.fatal;\n\t this.handler = function(stream, code_point) {\n\t if (code_point === end_of_stream)\n\t return finished;\n\t if (isASCIICodePoint(code_point))\n\t return code_point;\n\t if (inRange(code_point, 0xF780, 0xF7FF))\n\t return code_point - 0xF780 + 0x80;\n\t return encoderError(code_point);\n\t };\n\t }\n\t encoders['x-user-defined'] = function(options) {\n\t return new XUserDefinedEncoder(options);\n\t };\n\t decoders['x-user-defined'] = function(options) {\n\t return new XUserDefinedDecoder(options);\n\t };\n\t if (!global['TextEncoder'])\n\t global['TextEncoder'] = TextEncoder;\n\t if (!global['TextDecoder'])\n\t global['TextDecoder'] = TextDecoder;\n\t if (module.exports) {\n\t module.exports = {\n\t TextEncoder: TextEncoder,\n\t TextDecoder: global['TextDecoder'],\n\t EncodingIndexes: global[\"encoding-indexes\"]\n\t };\n\t }\n\t}(commonjsGlobal || {})); \n} (encoding$1));\n\nvar encodingExports = encoding$1.exports;\n\nvar encoding = encodingExports;\nvar textEncoding = {\n TextEncoder: encoding.TextEncoder,\n TextDecoder: encoding.TextDecoder,\n};\n\nconst DEFAULT_CHARSET = 'utf-8';\nconst LATIN_1 = 'iso-8859-1';\nconst WIN_1251 = 'windows-1251';\nconst WIN_1252 = 'windows-1252';\n/**\n * Supported charsets array.\n */\nconst SUPPORTED_CHARSETS = [DEFAULT_CHARSET, WIN_1251, WIN_1252, LATIN_1];\n/**\n * Parses charset from content-type header.\n *\n * @param contentType Content-type header.\n * @returns Charset string or null.\n */\nfunction parseCharsetFromHeader(contentType) {\n if (!contentType) {\n return null;\n }\n const match = /charset=\"?(.*?)\"?$/.exec(contentType.toLowerCase());\n if (match && match.length > 1) {\n return match[1].toLowerCase();\n }\n return null;\n}\n/**\n * Parses charset from html, looking for:\n * \n * \n * \n * \n * .\n *\n * @param text Html content.\n * @returns Charset string or null.\n */\nfunction parseCharsetFromHtml(text) {\n let match = //.exec(text.toLowerCase());\n if (match && match.length > 1) {\n return match[1].trim().toLowerCase();\n }\n // eslint-disable-next-line max-len\n match = / 1) {\n return match[1].trim().toLowerCase();\n }\n // eslint-disable-next-line max-len\n match = / 1) {\n return match[1].trim().toLowerCase();\n }\n return null;\n}\n/**\n * Parses charset from css.\n *\n * @param text Css content.\n * @returns Charset string or null.\n */\nfunction parseCharsetFromCss(text) {\n const match = /^@charset\\s*['\"](.*?)['\"]/.exec(text.toLowerCase());\n if (match && match.length > 1) {\n return match[1].trim().toLowerCase();\n }\n return null;\n}\n\n/**\n * Content Stream Filter class.\n *\n * Encapsulates response data stream filtering logic\n * https://mail.mozilla.org/pipermail/dev-addons/2017-April/002729.html.\n */\nclass ContentStream {\n /**\n * Content stream constructor.\n *\n * @param context Request context.\n * @param contentStringFilter Content filter.\n * @param streamFilterCreator Stream filter creator.\n * @param filteringLog Filtering log.\n */\n constructor(context, contentStringFilter, streamFilterCreator, filteringLog) {\n /**\n * Contains collection of accepted content types for stream filtering.\n */\n this.allowedContentTypes = [\n 'text/',\n 'application/json',\n 'application/xml',\n 'application/xhtml+xml',\n 'application/javascript',\n 'application/x-javascript',\n ];\n this.content = '';\n this.context = context;\n this.contentStringFilter = contentStringFilter;\n this.filteringLog = filteringLog;\n this.filter = streamFilterCreator(context.requestId);\n this.onResponseData = this.onResponseData.bind(this);\n this.onResponseFinish = this.onResponseFinish.bind(this);\n this.onResponseError = this.onResponseError.bind(this);\n }\n /**\n * Initializes encoders and filter.\n */\n init() {\n this.initEncoders();\n this.initFilter();\n }\n /**\n * Writes data to stream.\n *\n * @param content Content to write.\n */\n write(content) {\n this.filter.write(this.encoder.encode(content));\n this.filter.close();\n }\n /**\n * Sets charset.\n *\n * @param charset Charset.\n */\n setCharset(charset) {\n if (charset) {\n this.charset = charset;\n this.initEncoders();\n }\n }\n /**\n * Disconnects filter from stream.\n *\n * @param data Data to write.\n */\n disconnect(data) {\n this.filter.write(data);\n this.filter.disconnect();\n }\n /**\n * Initializes encoders.\n */\n initEncoders() {\n let set = this.charset ? this.charset : DEFAULT_CHARSET;\n // Redefining it as TextDecoder does not understand the iso- name\n if (set === LATIN_1) {\n set = WIN_1252;\n }\n this.decoder = new textEncoding.TextDecoder(set);\n if (set === DEFAULT_CHARSET) {\n this.encoder = new textEncoding.TextEncoder();\n }\n else {\n this.encoder = new textEncoding.TextEncoder(set, { NONSTANDARD_allowLegacyEncoding: true });\n }\n }\n /**\n * Initializes filter.\n */\n initFilter() {\n this.filter.ondata = this.onResponseData;\n this.filter.onstop = this.onResponseFinish;\n this.filter.onerror = this.onResponseError;\n }\n /**\n * We do not support stream filtering for some content types.\n *\n * @returns True if content type is supported.\n */\n shouldProcessFiltering() {\n const { requestType, contentTypeHeader } = this.context;\n if (requestType === RequestType$1.Other || requestType === RequestType$1.XmlHttpRequest) {\n return !!contentTypeHeader && this.allowedContentTypes.some((contentType) => {\n return contentTypeHeader.indexOf(contentType) === 0;\n });\n }\n return true;\n }\n /**\n * Handler for response data.\n *\n * @param event Stream filter event.\n */\n onResponseData(event) {\n if (!this.shouldProcessFiltering()) {\n this.disconnect(event.data);\n return;\n }\n if (!this.charset) {\n try {\n let charset;\n /**\n * If this.charset is undefined and requestType is Document or Subdocument, we try to detect charset\n * from page tags.\n */\n if (this.context.requestType === RequestType$1.SubDocument\n || this.context.requestType === RequestType$1.Document) {\n charset = ContentStream.parseHtmlCharset(event.data);\n }\n /**\n * If this.charset is undefined and requestType is Stylesheet, we try to detect charset from css\n * directive.\n */\n if (this.context.requestType === RequestType$1.Stylesheet) {\n charset = ContentStream.parseCssCharset(event.data);\n }\n if (!charset) {\n charset = DEFAULT_CHARSET;\n }\n if (charset && SUPPORTED_CHARSETS.indexOf(charset) >= 0) {\n this.charset = charset;\n this.initEncoders();\n this.content += this.decoder.decode(event.data, { stream: true });\n }\n else {\n // Charset is not supported\n this.disconnect(event.data);\n }\n }\n catch (e) {\n logger.warn(e.message);\n // on error we disconnect the filter from the request\n this.disconnect(event.data);\n }\n }\n else {\n this.content += this.decoder.decode(event.data, { stream: true });\n }\n }\n /**\n * Handler for response error.\n */\n onResponseError() {\n if (this.filter.error && this.filter.error) {\n logger.info(this.filter.error);\n }\n }\n /**\n * Handler for the end of response data.\n */\n onResponseFinish() {\n this.content += this.decoder.decode(); // finish stream\n this.filteringLog.publishEvent({\n type: FilteringEventType.ContentFilteringStart,\n data: {\n requestId: this.context.requestId,\n },\n });\n const { contentTypeHeader, statusCode } = this.context;\n if (statusCode !== 200) {\n this.write(this.content);\n return;\n }\n const charset = parseCharsetFromHeader(contentTypeHeader);\n if (charset) {\n if (SUPPORTED_CHARSETS.indexOf(charset) < 0) {\n // Charset is detected and it is not supported\n // eslint-disable-next-line max-len\n logger.warn(`Skipping request ${this.context.requestId} with Content-Type ${this.context.contentTypeHeader}`);\n this.write(this.content);\n return;\n }\n this.setCharset(charset);\n }\n this.content = this.contentStringFilter.applyRules(this.content);\n this.write(this.content);\n this.filteringLog.publishEvent({\n type: FilteringEventType.ContentFilteringFinish,\n data: {\n requestId: this.context.requestId,\n },\n });\n }\n /**\n * Parses charset from html.\n *\n * @param data Data to parse.\n * @returns Parsed charset or null.\n */\n static parseHtmlCharset(data) {\n const decoded = new textEncoding.TextDecoder('utf-8').decode(data).toLowerCase();\n return parseCharsetFromHtml(decoded);\n }\n /**\n * Parses charset from css.\n *\n * @param data Data to parse.\n * @returns Parsed charset or null.\n */\n static parseCssCharset(data) {\n const decoded = new textEncoding.TextDecoder('utf-8').decode(data).toLowerCase();\n return parseCharsetFromCss(decoded);\n }\n}\n\n/**\n * Content filtering module.\n * Handles Html filtering and replace rules.\n */\nclass ContentFiltering {\n /**\n * Retrieves html rules.\n *\n * @param context Request context.\n * @returns Html rules or null.\n */\n static getHtmlRules(context) {\n const { cosmeticResult } = context;\n /**\n * \"cosmeticResult\" is defined only for Document and Subdocument request types\n * do not need extra request type checking.\n */\n if (!cosmeticResult) {\n return null;\n }\n const htmlRules = cosmeticResult.Html.getRules();\n if (htmlRules.length === 0) {\n return null;\n }\n return htmlRules;\n }\n /**\n * Retrieves replace rules and sorts them alphabetically.\n *\n * @param context Request context.\n * @returns Replace rules or null.\n */\n static getReplaceRules(context) {\n const { requestType, matchingResult } = context;\n if (!requestType\n || !matchingResult\n || !ContentFiltering.supportedReplaceRulesRequestTypes.includes(requestType)) {\n return null;\n }\n const replaceRules = matchingResult.getReplaceRules();\n if (replaceRules.length === 0) {\n return null;\n }\n // Sort replace rules alphabetically as noted here\n // https://github.com/AdguardTeam/CoreLibs/issues/45\n return replaceRules.sort((prev, next) => {\n if (prev.getText() > next.getText()) {\n return 1;\n }\n if (prev.getText() < next.getText()) {\n return -1;\n }\n return 0;\n });\n }\n /**\n * Checks if request content filtering disabled by exception rule with $content modifier.\n *\n * @param context Request context.\n *\n * @returns `true`, if content filtering disabled by exception rule with $content modifier,\n * overwise returns `false`.\n */\n static hasContentExceptionRule(context) {\n const { matchingResult } = context;\n if (!matchingResult) {\n return false;\n }\n const rule = matchingResult.getBasicResult();\n if (!rule) {\n return false;\n }\n // The $content modifier only applies with the exception rule.\n // We don't need additional `rule.isAllowlist()` check.\n return rule.isOptionEnabled(NetworkRuleOption.Content);\n }\n /**\n * Checks if request method is supported.\n *\n * @param context Request context.\n * @returns `true`, if request method is supported,\n * overwise returns `false`.\n */\n static isRequestMethodSupported(context) {\n const { method } = context;\n return method === 'GET' || method === 'POST';\n }\n /**\n * On before request event handler.\n *\n * @param context Request context.\n */\n static onBeforeRequest(context) {\n if (!browser.webRequest.filterResponseData\n || !ContentFiltering.isRequestMethodSupported(context)\n || ContentFiltering.hasContentExceptionRule(context)) {\n return;\n }\n const htmlRules = ContentFiltering.getHtmlRules(context);\n const replaceRules = ContentFiltering.getReplaceRules(context);\n if (htmlRules || replaceRules) {\n const contentStringFilter = new ContentStringFilter(context, htmlRules, replaceRules, defaultFilteringLog);\n const contentStream = new ContentStream(context, contentStringFilter, browser.webRequest.filterResponseData, defaultFilteringLog);\n contentStream.init();\n }\n }\n}\n/**\n * Contains collection of supported request types for replace rules.\n */\nContentFiltering.supportedReplaceRulesRequestTypes = [\n RequestType$1.Document,\n RequestType$1.SubDocument,\n RequestType$1.Script,\n RequestType$1.Stylesheet,\n RequestType$1.XmlHttpRequest,\n RequestType$1.Other,\n];\n\nconst CSP_HEADER_NAME = 'Content-Security-Policy';\n/**\n * Content Security Policy Headers filtering service module.\n */\nclass CspService {\n /**\n * Applies CSP rules to response headers and returns modified headers.\n * It is applied when webRequest.onHeadersReceived event is fired.\n *\n * @param context Request context.\n * @returns True if headers were modified.\n */\n static onHeadersReceived(context) {\n const { matchingResult, responseHeaders, requestId, tabId, requestUrl, referrerUrl, } = context;\n if (!matchingResult) {\n return false;\n }\n const cspHeaders = [];\n const cspRules = matchingResult.getCspRules();\n for (let i = 0; i < cspRules.length; i += 1) {\n const rule = cspRules[i];\n // Don't forget: getCspRules returns all $csp rules, we must directly check that the rule is blocking.\n if (RequestBlockingApi.isRequestBlockedByRule(rule)) {\n const cspHeaderValue = rule.getAdvancedModifierValue();\n if (cspHeaderValue) {\n cspHeaders.push({\n name: CSP_HEADER_NAME,\n value: cspHeaderValue,\n });\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ApplyCspRule,\n data: {\n tabId,\n eventId: nanoid(),\n requestUrl,\n frameUrl: referrerUrl,\n frameDomain: getDomain$1(referrerUrl),\n requestType: ContentType.Csp,\n rule,\n timestamp: Date.now(),\n },\n });\n }\n }\n }\n if (cspHeaders.length > 0) {\n requestContextStorage.update(requestId, {\n responseHeaders: responseHeaders ? [...responseHeaders, ...cspHeaders] : cspHeaders,\n });\n return true;\n }\n return false;\n }\n}\n\n/**\n * This API is used to remove traceable data from requests initiated by the background extension.\n */\nclass SanitizeApi {\n /**\n * Removes Cookie headers from background extension's requests.\n *\n * @param context Request context.\n * @returns Blocking response or null.\n */\n static onBeforeSendHeaders(context) {\n const { requestHeaders, referrerUrl, tabId, } = context;\n if (tabId !== BACKGROUND_TAB_ID || !requestHeaders) {\n return null;\n }\n // removeHeader modifies 'context.requestHeaders'\n if (isExtensionUrl(referrerUrl) && removeHeader(requestHeaders, 'Cookie')) {\n return { requestHeaders };\n }\n return null;\n }\n}\n\n/**\n * API for applying rules from background service by handling\n * Web Request API and web navigation events.\n */\nclass WebRequestApi {\n /**\n * Adds listeners to web request events.\n */\n static start() {\n // browser.webRequest Events\n RequestEvents.onBeforeRequest.addListener(WebRequestApi.onBeforeRequest);\n RequestEvents.onBeforeSendHeaders.addListener(WebRequestApi.onBeforeSendHeaders);\n RequestEvents.onHeadersReceived.addListener(WebRequestApi.onHeadersReceived);\n RequestEvents.onResponseStarted.addListener(WebRequestApi.onResponseStarted);\n RequestEvents.onErrorOccurred.addListener(WebRequestApi.onErrorOccurred);\n RequestEvents.onCompleted.addListener(WebRequestApi.onCompleted);\n // browser.webNavigation Events\n browser.webNavigation.onCommitted.addListener(WebRequestApi.onCommitted);\n browser.webNavigation.onDOMContentLoaded.addListener(WebRequestApi.onDomContentLoaded);\n }\n /**\n * Removes web request event handlers.\n */\n static stop() {\n RequestEvents.onBeforeRequest.removeListener(WebRequestApi.onBeforeRequest);\n RequestEvents.onBeforeSendHeaders.removeListener(WebRequestApi.onBeforeSendHeaders);\n RequestEvents.onHeadersReceived.removeListener(WebRequestApi.onHeadersReceived);\n RequestEvents.onResponseStarted.removeListener(WebRequestApi.onResponseStarted);\n RequestEvents.onErrorOccurred.removeListener(WebRequestApi.onErrorOccurred);\n RequestEvents.onCompleted.removeListener(WebRequestApi.onCompleted);\n browser.webNavigation.onCommitted.removeListener(WebRequestApi.onCommitted);\n browser.webNavigation.onDOMContentLoaded.removeListener(WebRequestApi.onDomContentLoaded);\n }\n /**\n * Flush browser in-memory cache.\n *\n * This function is called after an engine update or filtering switch to ensure\n * that new rules are applied to requests that may have been cached by the browser.\n */\n static flushMemoryCache() {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield browser.webRequest.handlerBehaviorChanged();\n }\n catch (e) {\n // TODO: use getErrorMessage instead\n const message = e instanceof Error ? e.message : String(e);\n logger.error(message);\n }\n });\n }\n /**\n * On before request event handler. This is the earliest event in the chain of the web request events.\n *\n * @param details Request details.\n * @param details.context Request context.\n * @returns Web request response or void if there is nothing to do.\n */\n static onBeforeRequest({ context }) {\n var _a;\n if (!context) {\n return undefined;\n }\n const { requestType, tabId, frameId, requestUrl, referrerUrl, eventId, requestId, contentType, timestamp, thirdParty, method, requestFrameId, } = context;\n if (!isHttpOrWsRequest(requestUrl)) {\n return undefined;\n }\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.SendRequest,\n data: {\n tabId,\n eventId,\n requestUrl,\n requestDomain: getDomain(requestUrl),\n frameUrl: referrerUrl,\n frameDomain: getDomain(referrerUrl),\n requestType: contentType,\n timestamp,\n requestThirdParty: thirdParty,\n method,\n },\n });\n const result = engineApi.matchRequest({\n requestUrl,\n frameUrl: referrerUrl,\n requestType,\n frameRule: tabsApi.getTabFrameRule(tabId),\n method,\n });\n if (!result) {\n return undefined;\n }\n requestContextStorage.update(requestId, {\n matchingResult: result,\n });\n if (requestType === RequestType.Document || requestType === RequestType.SubDocument) {\n tabsApi.handleFrameMatchingResult(tabId, frameId, result);\n const cosmeticOption = result.getCosmeticOption();\n const cosmeticResult = engineApi.getCosmeticResult(requestUrl, cosmeticOption);\n tabsApi.handleFrameCosmeticResult(tabId, frameId, cosmeticResult);\n requestContextStorage.update(requestId, {\n cosmeticResult,\n });\n }\n const basicResult = result.getBasicResult();\n // For a $replace rule, response will be undefined since we need to get\n // the response in order to actually apply $replace rules to it.\n const response = RequestBlockingApi.getBlockingResponse(basicResult, eventId, requestUrl, requestType, tabId);\n if (!response) {\n /*\n Strip url by $removeparam rules\n $removeparam rules are applied after URL blocking rules\n https://github.com/AdguardTeam/CoreLibs/issues/1462\n */\n const purgedUrl = paramsService.getPurgedUrl(requestId);\n if (purgedUrl) {\n return { redirectUrl: purgedUrl };\n }\n }\n if (response === null || response === void 0 ? void 0 : response.cancel) {\n tabsApi.incrementTabBlockedRequestCount(tabId);\n const mainFrameUrl = (_a = tabsApi.getTabMainFrame(tabId)) === null || _a === void 0 ? void 0 : _a.url;\n hideRequestInitiatorElement(tabId, requestFrameId, requestUrl, mainFrameUrl || referrerUrl, requestType, thirdParty);\n }\n else {\n ContentFiltering.onBeforeRequest(context);\n }\n return response;\n }\n /**\n * On before send headers event handler.\n *\n * !IMPORTANT! This method modifies headers in the context. This non-pure action needs\n * to increase performance: exclude copying of headers for each service.\n *\n * @param details On before send headers details.\n * @param details.context Details context.\n * @returns Web request event response.\n */\n static onBeforeSendHeaders({ context, }) {\n if (!context) {\n return undefined;\n }\n // If current request from the background - we don't need to modify headers,\n // only remove Cookie and immediately return modified headers\n const sanitizedRequest = SanitizeApi.onBeforeSendHeaders(context);\n if (sanitizedRequest) {\n return sanitizedRequest;\n }\n let requestHeadersModified = false;\n if (stealthApi.onBeforeSendHeaders(context)) {\n requestHeadersModified = true;\n }\n // If the current request does not comply with any rules - we do not\n // need to call any other processing services (e.g. cookie, header)\n if (context === null || context === void 0 ? void 0 : context.matchingResult) {\n if (cookieFiltering.onBeforeSendHeaders(context)) {\n requestHeadersModified = true;\n }\n if (headersService.onBeforeSendHeaders(context)) {\n requestHeadersModified = true;\n }\n }\n if (requestHeadersModified) {\n return { requestHeaders: context.requestHeaders };\n }\n return undefined;\n }\n /**\n * On headers received event handler.\n *\n * @param event On headers received event.\n * @param event.context Event context.\n * @param event.details On headers received details.\n * @returns Web request event response.\n */\n static onHeadersReceived({ context, details, }) {\n var _a;\n if (!context) {\n return undefined;\n }\n defaultFilteringLog.publishEvent({\n type: FilteringEventType.ReceiveResponse,\n data: {\n tabId: context.tabId,\n eventId: context.eventId,\n statusCode: details.statusCode,\n },\n });\n if (!(context === null || context === void 0 ? void 0 : context.matchingResult)) {\n return undefined;\n }\n const { requestId, requestUrl, requestType, responseHeaders, } = context;\n const contentTypeHeader = (_a = findHeaderByName(responseHeaders, 'content-type')) === null || _a === void 0 ? void 0 : _a.value;\n if (contentTypeHeader) {\n requestContextStorage.update(requestId, { contentTypeHeader });\n }\n let responseHeadersModified = false;\n if (requestUrl && (requestType === RequestType.Document || requestType === RequestType.SubDocument)) {\n if (CspService.onHeadersReceived(context)) {\n responseHeadersModified = true;\n }\n }\n if (cookieFiltering.onHeadersReceived(context)) {\n responseHeadersModified = true;\n }\n if (headersService.onHeadersReceived(context)) {\n responseHeadersModified = true;\n }\n if (responseHeadersModified) {\n return { responseHeaders: context.responseHeaders };\n }\n return undefined;\n }\n /**\n * On response started event handler.\n *\n * @param event On response started event.\n * @param event.context Event context.\n */\n static onResponseStarted({ context, }) {\n if (!context) {\n return;\n }\n const { tabId, frameId, requestType, } = context;\n if (requestType !== RequestType.Document && requestType !== RequestType.SubDocument) {\n return;\n }\n const tabContext = tabsApi.getTabContext(tabId);\n if (!tabContext) {\n return;\n }\n const frame = tabContext.frames.get(frameId);\n if (!frame || !frame.cosmeticResult) {\n return;\n }\n /**\n * Actual tab url may not be committed by navigation event during response processing.\n * If {@link tabContext.info.url} and {@link url} are not the same, this means\n * that tab navigation steel is being processed and js injection may be causing the error.\n * In this case, js will be injected in the {@link WebNavigation.onCommitted} event.\n */\n if (requestType === RequestType.Document && frame.url !== tabContext.info.url) {\n return;\n }\n const { cosmeticResult } = frame;\n const injectionParams = {\n tabId,\n frameId,\n cosmeticResult,\n };\n CosmeticApi.applyFrameJsRules(injectionParams);\n }\n /**\n * This is handler for the last event from the request lifecycle.\n *\n * @param event On completed event.\n * @param event.context Request context.\n * @private\n */\n static onCompleted({ context, }) {\n if (!context) {\n return;\n }\n const { requestId, requestType, tabId, frameId, requestUrl, timestamp, contentType, cosmeticResult, } = context;\n /**\n * If the request is a subdocument request in Firefox, try injecting frame cosmetic result into frame,\n * because {@link WebRequestApi.onCommitted} can be not triggered.\n */\n if (isFirefox || requestType === RequestType.SubDocument) {\n WebRequestApi.injectCosmetic({\n frameId,\n tabId,\n timestamp,\n url: requestUrl,\n });\n }\n if (cosmeticResult\n && (requestType === RequestType.Document || requestType === RequestType.SubDocument)) {\n CosmeticApi.logScriptRules({\n tabId,\n cosmeticResult,\n url: requestUrl,\n contentType,\n timestamp,\n });\n }\n requestContextStorage.delete(requestId);\n }\n /**\n * Event handler for onErrorOccurred event. It fires when an error occurs.\n *\n * @param event On error occurred event.\n * @param event.details On error occurred event details.\n */\n static onErrorOccurred({ details, }) {\n requestContextStorage.delete(details.requestId);\n }\n /**\n * Checks if iframe has same source as main frame or if src is about:blank, javascript:, etc.\n * We don't include frames with 'src=data:' because Chrome and Firefox\n * do not allow data to be injected into frames with this type of src,\n * this bug is reported here https://bugs.chromium.org/p/chromium/issues/detail?id=55084.\n *\n * @param frameUrl Frame url.\n * @param frameId Unique id of frame in the tab.\n * @param mainFrameUrl Url of tab where iframe exists.\n * @returns True if frame without src, else returns false.\n */\n static isLocalFrame(frameUrl, frameId, mainFrameUrl) {\n return frameId !== MAIN_FRAME_ID\n && (frameUrl === mainFrameUrl\n || frameUrl === 'about:blank'\n || frameUrl === 'about:srcdoc'\n // eslint-disable-next-line no-script-url\n || frameUrl.indexOf('javascript:') > -1);\n }\n /**\n * Injects cosmetic rules to specified frame based on data from frame and response context.\n *\n * If cosmetic result does not exist or it has been already applied, ignore injection.\n *\n * @param params Data required for rule injection.\n */\n static injectCosmetic(params) {\n const { frameId, tabId, url, } = params;\n const tabContext = tabsApi.getTabContext(tabId);\n if (!tabContext) {\n return;\n }\n const frame = tabContext.frames.get(frameId);\n if (!frame) {\n return;\n }\n /**\n * Cosmetic result may not be committed to frame context during worker request processing.\n * We use engine request as a fallback for this case.\n */\n if (!frame.cosmeticResult) {\n frame.cosmeticResult = engineApi.matchCosmetic({\n requestUrl: url,\n frameUrl: url,\n requestType: frameId === MAIN_FRAME_ID ? RequestType.Document : RequestType.SubDocument,\n frameRule: tabContext.mainFrameRule,\n });\n }\n const { cosmeticResult } = frame;\n const cssInjectionParams = {\n tabId,\n frameId,\n cosmeticResult,\n };\n const jsInjectionParams = {\n tabId,\n frameId,\n cosmeticResult,\n };\n CosmeticApi.applyFrameCssRules(cssInjectionParams);\n CosmeticApi.applyFrameJsRules(jsInjectionParams);\n }\n /**\n * On committed web navigation event handler.\n *\n * Injects necessary CSS and scripts into the web page.\n *\n * @param details Event details.\n */\n static onCommitted(details) {\n const { frameId, tabId, timeStamp, url, } = details;\n WebRequestApi.injectCosmetic({\n frameId,\n tabId,\n timestamp: timeStamp,\n url,\n });\n }\n /**\n * On DOM content loaded web navigation event handler.\n *\n * This method injects css and js code in iframes without remote source.\n * Usual webRequest callbacks don't fire for iframes without remote source.\n * Also urls in these iframes may be \"about:blank\", \"about:srcdoc\", etc.\n * Due to this reason we prepare injections for them as for mainframe\n * and inject them only when onDOMContentLoaded fires.\n *\n * @see https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1046\n * @param details Event details.\n */\n static onDomContentLoaded(details) {\n const { tabId, frameId, url, } = details;\n const mainFrame = tabsApi.getTabMainFrame(tabId);\n if (!mainFrame\n || !mainFrame.cosmeticResult\n || !WebRequestApi.isLocalFrame(url, frameId, mainFrame.url)) {\n return;\n }\n const { cosmeticResult } = mainFrame;\n CosmeticApi\n .applyCssRules({\n tabId,\n frameId,\n cosmeticResult,\n })\n .catch(logger.debug);\n CosmeticApi\n .applyJsRules({\n tabId,\n frameId,\n cosmeticResult,\n })\n .catch(logger.debug);\n }\n}\n\n/**\n * Event channel wrapper for sending messages to assistant.\n */\nclass Assistant {\n /**\n * Sends message to assistant to open it on the page.\n *\n * @param tabId Tab id.\n */\n static openAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n // Lazy load assistant\n yield browser.tabs.executeScript(tabId, { file: this.assistantUrl });\n yield messagesApi.sendMessage(tabId, {\n type: MessageType.InitAssistant,\n tabId,\n assistantUrl: this.assistantUrl,\n });\n });\n }\n /**\n * Sends message to assistant to close it on the page.\n *\n * @param tabId Tab id.\n */\n static closeAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n yield messagesApi.sendMessage(tabId, {\n type: MessageType.CloseAssistant,\n });\n });\n }\n}\nAssistant.onCreateRule = new EventChannel();\n/**\n * Path to assembled @adguard/assistant module. Necessary for lazy on-demand\n * loading of the assistant.\n */\nAssistant.assistantUrl = '';\n\n// TODO: add long live connection\n// TODO: CollectHitStats\n/**\n * Messages API implementation. It is used to communicate with content scripts.\n */\nclass MessagesApi {\n /**\n * Messages API constructor.\n *\n * @param filteringLog Filtering log.\n */\n constructor(filteringLog) {\n this.filteringLog = filteringLog;\n this.handleMessage = this.handleMessage.bind(this);\n }\n /**\n * Sends message to the specified tab.\n *\n * @param tabId Tab ID.\n * @param message Message.\n */\n sendMessage(tabId, message) {\n return __awaiter(this, void 0, void 0, function* () {\n yield browser.tabs.sendMessage(tabId, message);\n });\n }\n /**\n * Messages handler.\n *\n * @param message Message object.\n * @param sender Tab which sent the message.\n */\n // TODO remove the rule bellow, and any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMessage(message, sender) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n message = messageValidator.parse(message);\n }\n catch (e) {\n // ignore\n return undefined;\n }\n const { type } = message;\n switch (type) {\n case MessageType.ProcessShouldCollapse: {\n return this.handleProcessShouldCollapseMessage(sender, message.payload);\n }\n case MessageType.GetCosmeticData: {\n return this.handleContentScriptDataMessage(sender, message.payload);\n }\n case MessageType.GetCookieRules: {\n return this.handleGetCookieRulesMessage(sender, message.payload);\n }\n case MessageType.SaveCookieLogEvent: {\n return this.handleSaveCookieLogEvent(sender, message.payload);\n }\n case MessageType.AssistantCreateRule: {\n return this.handleAssistantCreateRuleMessage(sender, message.payload);\n }\n case MessageType.SaveCssHitsStats: {\n return this.handleSaveCssHitsStats(sender, message.payload);\n }\n }\n return undefined;\n });\n }\n /**\n * Handles should collapse element message.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns True if element should be collapsed.\n */\n handleProcessShouldCollapseMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = processShouldCollapsePayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const tabId = sender.tab.id;\n const { elementUrl, documentUrl, requestType } = res.data;\n return RequestBlockingApi.shouldCollapseElement(tabId, elementUrl, documentUrl, requestType);\n }\n /**\n * Handles get extended css message.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns Extended css string or false or undefined.\n */\n handleContentScriptDataMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return null;\n }\n const res = getExtendedCssPayloadValidator.safeParse(payload);\n if (!res.success) {\n return null;\n }\n const tabId = sender.tab.id;\n let { frameId } = sender;\n if (!frameId) {\n frameId = 0;\n }\n // TODO check rules for parent/grandparent frames\n if (!tabsApi.getTabFrame(tabId, frameId)) {\n frameId = 0;\n }\n return CosmeticApi.getContentScriptData(tabId, frameId);\n }\n /**\n * Handles messages.\n * Returns cookie rules data for content script.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns Cookie rules data.\n */\n handleGetCookieRulesMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = getCookieRulesPayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const tabId = sender.tab.id;\n let { frameId } = sender;\n if (!frameId) {\n frameId = 0;\n }\n // TODO check rules for parent/grandparent frames\n if (!tabsApi.getTabFrame(tabId, frameId)) {\n frameId = 0;\n }\n const cookieRules = cookieFiltering.getBlockingRules(tabId, frameId);\n return cookieRules.map((rule) => ({\n ruleText: rule.getText(),\n match: rule.getAdvancedModifierValue(),\n isThirdParty: rule.isOptionEnabled(NetworkRuleOption.ThirdParty),\n filterId: rule.getFilterListId(),\n isAllowlist: rule.isAllowlist(),\n }));\n }\n /**\n * Calls filtering to add an event from cookie-controller content-script.\n *\n * @param sender Tab which sent the message.\n * @param payload Message payload.\n * @returns True if event was published to filtering log.\n */\n handleSaveCookieLogEvent(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = getSaveCookieLogEventPayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const { data } = res;\n this.filteringLog.publishEvent({\n type: FilteringEventType.Cookie,\n data: {\n eventId: nanoid(),\n tabId: sender.tab.id,\n cookieName: data.cookieName,\n frameDomain: data.cookieDomain,\n cookieValue: data.cookieValue,\n rule: new NetworkRule(data.ruleText, data.filterId),\n isModifyingCookieRule: false,\n requestThirdParty: data.thirdParty,\n timestamp: Date.now(),\n requestType: ContentType.Cookie,\n },\n });\n return true;\n }\n /**\n * Handles message with new rule from assistant content script.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns True if rule was dispatched.\n */\n handleAssistantCreateRuleMessage(sender, payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const res = getAssistantCreateRulePayloadValidator.safeParse(payload);\n if (!res.success) {\n return false;\n }\n const { ruleText } = res.data;\n Assistant.onCreateRule.dispatch(ruleText);\n return true;\n }\n /**\n * Handle message about saving css hits stats.\n *\n * @param sender Tab, which sent message.\n * @param payload Message payload.\n * @returns True if stats was saved.\n */\n handleSaveCssHitsStats(sender, \n // TODO add payload type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n payload) {\n var _a;\n if (!payload || !((_a = sender === null || sender === void 0 ? void 0 : sender.tab) === null || _a === void 0 ? void 0 : _a.id)) {\n return false;\n }\n const tabId = sender.tab.id;\n const frame = tabsApi.getTabMainFrame(tabId);\n if (!(frame === null || frame === void 0 ? void 0 : frame.url)) {\n return false;\n }\n const { url } = frame;\n let published = false;\n for (let i = 0; i < payload.length; i += 1) {\n const stat = payload[i];\n const rule = new CosmeticRule(stat.ruleText, stat.filterId);\n this.filteringLog.publishEvent({\n type: FilteringEventType.ApplyCosmeticRule,\n data: {\n tabId,\n eventId: nanoid(),\n rule,\n element: stat.element,\n frameUrl: url,\n frameDomain: getDomain(url),\n requestType: ContentType.Document,\n timestamp: Date.now(),\n },\n });\n published = true;\n }\n return published;\n }\n}\nconst messagesApi = new MessagesApi(defaultFilteringLog);\n\n/**\n * Filter list configuration validator for MV2.\n */\nconst filterMV2Validator = z.object({\n /**\n * Filter identifier.\n */\n filterId: z.number(),\n /**\n * Filter list text content.\n */\n content: z.string(),\n /**\n * Filter trusted flag. If true, js rules from list can be executed.\n */\n trusted: z.boolean(),\n});\n/**\n * Configuration validator for MV2.\n */\nconst configurationMV2Validator = configurationValidator.extend({\n filters: filterMV2Validator.array(),\n});\n\n/**\n * App implementation for MV2.\n */\nclass TsWebExtension {\n /**\n * Gets app running status.\n *\n * @returns True if app started, else false.\n */\n get isStarted() {\n return appContext.isAppStarted;\n }\n /**\n * Sets app running status.\n *\n * @param value Status value.\n */\n set isStarted(value) {\n appContext.isAppStarted = value;\n }\n /**\n * Gets app configuration context.\n *\n * @throws Error if value not set.\n * @returns True if app started, else false.\n */\n get configuration() {\n if (!appContext.configuration) {\n throw new Error('Configuration not set!');\n }\n return appContext.configuration;\n }\n /**\n * Sets app configuration context.\n *\n * @param value Status value.\n */\n set configuration(value) {\n appContext.configuration = value;\n }\n /**\n * Constructor.\n *\n * @param webAccessibleResourcesPath Path to web accessible resources for {@link resourcesService}.\n */\n constructor(webAccessibleResourcesPath) {\n /**\n * Fires on filtering log event.\n */\n this.onFilteringLogEvent = defaultFilteringLog.onLogEvent;\n /**\n * Fires when a rule has been created from the helper.\n */\n this.onAssistantCreateRule = Assistant.onCreateRule;\n /**\n * Tabs cosmetic injector.\n * Used to inject cosmetic rules into opened tabs on extension start.\n */\n this.tabCosmeticInjector = new TabsCosmeticInjector(engineApi, documentApi, tabsApi);\n resourcesService.init(webAccessibleResourcesPath);\n }\n /**\n * Initializes {@link EngineApi} with passed {@link configuration}.\n * Starts request processing via {@link WebRequestApi} and tab tracking via {@link tabsApi}.\n *\n * Also updates webRTC privacy.network settings on demand and flushes browser in-memory request cache.\n *\n * @param configuration App configuration.\n *\n * @throws Error if configuration is not valid.\n */\n start(configuration) {\n return __awaiter(this, void 0, void 0, function* () {\n configurationMV2Validator.parse(configuration);\n this.configuration = TsWebExtension.createConfigurationMV2Context(configuration);\n RequestEvents.init();\n yield redirectsService.start();\n documentBlockingService.configure(configuration);\n yield engineApi.startEngine(configuration);\n yield this.tabCosmeticInjector.processOpenTabs();\n yield tabsApi.start();\n WebRequestApi.start();\n Assistant.assistantUrl = configuration.settings.assistantUrl;\n yield WebRequestApi.flushMemoryCache();\n yield stealthApi.updateWebRtcPrivacyPermissions();\n this.isStarted = true;\n });\n }\n /**\n * Fully stop request and tab processing.\n */\n stop() {\n return __awaiter(this, void 0, void 0, function* () {\n WebRequestApi.stop();\n tabsApi.stop();\n this.isStarted = false;\n });\n }\n /**\n * Re-initializes {@link EngineApi} with passed {@link configuration}\n * and update tabs main frame rules based on new engine state.\n *\n * Also updates webRTC privacy.network settings on demand and flushes browser in-memory request cache.\n *\n * Requires app is started.\n *\n * @param configuration App configuration.\n *\n * @throws Error if app is not started or configuration is not valid.\n */\n configure(configuration) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.isStarted) {\n throw new Error('App is not started!');\n }\n configurationMV2Validator.parse(configuration);\n this.configuration = TsWebExtension.createConfigurationMV2Context(configuration);\n documentBlockingService.configure(configuration);\n yield engineApi.startEngine(configuration);\n yield tabsApi.updateCurrentTabsMainFrameRules();\n yield WebRequestApi.flushMemoryCache();\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Opens assistant in the tab.\n *\n * @param tabId Tab id where assistant will be opened.\n */\n openAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n yield Assistant.openAssistant(tabId);\n });\n }\n /**\n * Close assistant in the required tab.\n *\n * @param tabId Tab id.\n */\n closeAssistant(tabId) {\n return __awaiter(this, void 0, void 0, function* () {\n yield Assistant.closeAssistant(tabId);\n });\n }\n /**\n * Return rules count for current configuration.\n *\n * @returns Rules count.\n */\n getRulesCount() {\n return engineApi.getRulesCount();\n }\n /**\n * Returns a message handler that will listen to internal messages,\n * for example: message for get computed css for content-script.\n *\n * @returns Messages handler.\n */\n getMessageHandler() {\n return messagesApi.handleMessage;\n }\n /**\n * Sets prebuild local script rules.\n *\n * @see {@link LocalScriptRulesService}\n *\n * @param localScriptRules JSON object with pre-build JS rules. @see {@link LocalScriptRulesService}.\n */\n setLocalScriptRules(localScriptRules) {\n localScriptRulesService.setLocalScriptRules(localScriptRules);\n }\n /**\n * Updates `filteringEnabled` configuration value without re-initialization of engine.\n *\n * Also updates webRTC privacy.network settings on demand and flushes browser in-memory request cache.\n *\n * @throws Error if {@link configuration} not set.\n * @param isFilteringEnabled `filteringEnabled` config value.\n */\n setFilteringEnabled(isFilteringEnabled) {\n return __awaiter(this, void 0, void 0, function* () {\n this.configuration.settings.filteringEnabled = isFilteringEnabled;\n yield WebRequestApi.flushMemoryCache();\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Updates `collectStats` configuration value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isCollectStats `collectStats` config value.\n */\n setCollectHitStats(isCollectStats) {\n this.configuration.settings.collectStats = isCollectStats;\n }\n /**\n * Updates `stealthModeEnabled` configuration value without re-initialization of engine.\n * Also updates webRTC privacy.network settings on demand.\n *\n * @throws Error if {@link configuration} not set.\n * @param isStealthModeEnabled `stealthModeEnabled` config value.\n */\n setStealthModeEnabled(isStealthModeEnabled) {\n return __awaiter(this, void 0, void 0, function* () {\n this.configuration.settings.stealthModeEnabled = isStealthModeEnabled;\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Updates `selfDestructFirstPartyCookies` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isSelfDestructFirstPartyCookies `selfDestructFirstPartyCookies` stealth config value.\n */\n setSelfDestructFirstPartyCookies(isSelfDestructFirstPartyCookies) {\n this.configuration.settings.stealth.selfDestructFirstPartyCookies = isSelfDestructFirstPartyCookies;\n }\n /**\n * Updates `selfDestructThirdPartyCookies` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isSelfDestructThirdPartyCookies `selfDestructThirdPartyCookies` stealth config value.\n */\n setSelfDestructThirdPartyCookies(isSelfDestructThirdPartyCookies) {\n this.configuration.settings.stealth.selfDestructThirdPartyCookies = isSelfDestructThirdPartyCookies;\n }\n /**\n * Updates `selfDestructFirstPartyCookiesTime` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param selfDestructFirstPartyCookiesTime `selfDestructFirstPartyCookiesTime` stealth config value.\n */\n setSelfDestructFirstPartyCookiesTime(selfDestructFirstPartyCookiesTime) {\n this.configuration.settings.stealth.selfDestructFirstPartyCookiesTime = selfDestructFirstPartyCookiesTime;\n }\n /**\n * Updates `selfDestructThirdPartyCookiesTime` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param selfDestructThirdPartyCookiesTime `selfDestructThirdPartyCookiesTime` stealth config value.\n */\n setSelfDestructThirdPartyCookiesTime(selfDestructThirdPartyCookiesTime) {\n this.configuration.settings.stealth.selfDestructThirdPartyCookiesTime = selfDestructThirdPartyCookiesTime;\n }\n /**\n * Updates `hideReferrer` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isHideReferrer `isHideReferrer` stealth config value.\n */\n setHideReferrer(isHideReferrer) {\n this.configuration.settings.stealth.hideReferrer = isHideReferrer;\n }\n /**\n * Updates `hideSearchQueries` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isHideSearchQueries `hideSearchQueries` stealth config value.\n */\n setHideSearchQueries(isHideSearchQueries) {\n this.configuration.settings.stealth.hideSearchQueries = isHideSearchQueries;\n }\n /**\n * Updates `blockChromeClientData` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isBlockChromeClientData `blockChromeClientData` stealth config value.\n */\n setBlockChromeClientData(isBlockChromeClientData) {\n this.configuration.settings.stealth.blockChromeClientData = isBlockChromeClientData;\n }\n /**\n * Updates `sendDoNotTrack` stealth config value without re-initialization of engine.\n *\n * @throws Error if {@link configuration} not set.\n * @param isSendDoNotTrack `sendDoNotTrack` stealth config value.\n */\n setSendDoNotTrack(isSendDoNotTrack) {\n this.configuration.settings.stealth.sendDoNotTrack = isSendDoNotTrack;\n }\n /**\n * Updates `blockWebRTC` stealth config value without re-initialization of engine.\n * Also updates webRTC privacy.network settings on demand.\n *\n * @throws Error if {@link configuration} not set.\n * @param isBlockWebRTC `blockWebRTC` stealth config value.\n */\n setBlockWebRTC(isBlockWebRTC) {\n return __awaiter(this, void 0, void 0, function* () {\n this.configuration.settings.stealth.blockWebRTC = isBlockWebRTC;\n yield stealthApi.updateWebRtcPrivacyPermissions();\n });\n }\n /**\n * Creates configuration context.\n *\n * @param configuration Configuration.\n * @returns Configuration context.\n */\n static createConfigurationMV2Context(configuration) {\n const { filters, verbose, logLevel, settings, } = configuration;\n return {\n filters: filters.map(({ filterId }) => filterId),\n verbose,\n logLevel,\n settings,\n };\n }\n}\n\nexport { ALLOWLIST_FILTER_ID, BACKGROUND_TAB_ID, ContentType, EventChannel, FilteringEventType, FilteringLog, Frame, LogLevelEnum, Logger, MAIN_FRAME_ID, MESSAGE_HANDLER_NAME, MessageType, RequestBlockingApi, RequestContextStorage, RequestEvent, RequestEvents, StealthActions, StealthHelper, TabContext, TabsApi, TabsCosmeticInjector, TsWebExtension, USER_FILTER_ID, allowlist, configurationMV2Validator, configurationValidator, defaultFilteringLog, documentApi, engineApi, filterMV2Validator, getAssistantCreateRulePayloadValidator, getCookieRulesPayloadValidator, getCssPayloadValidator, getDomain, getErrorMessage, getExtendedCssPayloadValidator, getHost, getRequestType, getSaveCookieLogEventPayloadValidator, hideRequestInitiatorElement, isExtensionUrl, isHttpOrWsRequest, isHttpRequest, isThirdPartyRequest, logLevelNames, logger, messageValidator, processShouldCollapsePayloadValidator, requestContextStorage, sendAppMessage, settingsConfigValidator, stealthConfigValidator, tabsApi };\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n/**\n * Helper class for work with semver\n *\n * Parsed semver string saves in {@link data} property.\n * We save first {@link MAX_LENGTH} parts of parsed string.\n * If there are less than {@link MAX_LENGTH} parts in the version, the missing ones are filled with zeros\n * For example, entry string `1.1` will be parsed as `[1, 1, 0, 0]`.\n *\n * @param version - semver string\n * @class\n * @throws error, if passed string cannot be parsed\n */\nexport class Version {\n private static MAX_LENGTH = 4;\n\n // splitted semver\n public data: number[] = [];\n\n constructor(version: string) {\n const parts = String(version || \"\").split(\".\", Version.MAX_LENGTH);\n\n for (let i = 0; i < Version.MAX_LENGTH; i += 1) {\n if (parts[i] === \"\") {\n throw new Error(`Found empty part in string '${version}'`);\n }\n\n const part = parts[i] || \"0\";\n\n if (Number.isNaN(Number.parseInt(part, 10))) {\n throw new Error(`Can not parse '${version}' string`);\n }\n\n this.data[i] = Math.max(Number(part), 0);\n }\n }\n\n /**\n * Compare current semver with passed\n *\n * @param version - {@link Version} instance\n * @returns number, indicates the result of the comparison (1 - greater, -1 - less, 0 - equals).\n * @throws error, if some version data is invalid\n */\n public compare(version: Version): number {\n for (let i = 0; i < Version.MAX_LENGTH; i += 1) {\n const leftPart = this?.data?.[i];\n const rightPart = version?.data?.[i];\n\n if (typeof leftPart !== \"number\" || typeof rightPart !== \"number\") {\n throw new Error(\"Can not compare versions\");\n }\n\n if (leftPart > rightPart) {\n return 1;\n }\n if (leftPart < rightPart) {\n return -1;\n }\n }\n return 0;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Version } from \"./version\";\n\n/**\n * Helper class for working with browser extension context\n */\nexport class BrowserUtils {\n /**\n * Checks if left version is greater than the right version or equals\n *\n * @param leftVersion - semver string\n * @param rightVersion - semver string\n * @returns true, if left version is greater than the right version or equals, else returns false\n */\n public static isGreaterOrEqualsVersion(leftVersion: string, rightVersion: string): boolean {\n const left = new Version(leftVersion);\n const right = new Version(rightVersion);\n return left.compare(right) >= 0;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// typing for navigator UA client data API\n\n// WICG Spec: https://wicg.github.io/ua-client-hints\n// https://wicg.github.io/ua-client-hints/#navigatorua\ndeclare global {\n interface Navigator {\n readonly userAgentData?: NavigatorUAData;\n }\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-navigatoruabrandversion\ninterface NavigatorUABrandVersion {\n readonly brand: string;\n readonly version: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-uadatavalues\ninterface UADataValues {\n readonly brands?: NavigatorUABrandVersion[];\n readonly mobile?: boolean;\n readonly platform?: string;\n readonly architecture?: string;\n readonly bitness?: string;\n readonly model?: string;\n readonly platformVersion?: string;\n /** @deprecated in favour of fullVersionList */\n readonly uaFullVersion?: string;\n readonly fullVersionList?: NavigatorUABrandVersion[];\n readonly wow64?: boolean;\n}\n\n// https://wicg.github.io/ua-client-hints/#dictdef-ualowentropyjson\ninterface UALowEntropyJSON {\n readonly brands: NavigatorUABrandVersion[];\n readonly mobile: boolean;\n readonly platform: string;\n}\n\n// https://wicg.github.io/ua-client-hints/#navigatoruadata\ninterface NavigatorUAData extends UALowEntropyJSON {\n getHighEntropyValues(hints: string[]): Promise;\n toJSON(): UALowEntropyJSON;\n}\n\ntype BrowserData = {\n uaStringName: string;\n brand?: string;\n};\n\n/**\n * Helper class for user agent data\n */\nexport class UserAgent {\n private static browserDataMap: Record = {\n Chrome: {\n brand: \"Google Chrome\",\n uaStringName: \"Chrome\",\n },\n Firefox: {\n uaStringName: \"Firefox\",\n },\n Safari: {\n uaStringName: \"Safari\",\n },\n Opera: {\n brand: \"Opera\",\n uaStringName: \"OPR\",\n },\n YaBrowser: {\n brand: \"Yandex\",\n uaStringName: \"YaBrowser\",\n },\n Edge: {\n uaStringName: \"edge\",\n },\n EdgeChromium: {\n brand: \"Microsoft Edge\",\n uaStringName: \"edg\",\n },\n };\n\n public static isChrome = UserAgent.isTargetBrowser(\"Chrome\");\n\n public static isFirefox = UserAgent.isTargetBrowser(\"Firefox\");\n\n public static isOpera = UserAgent.isTargetBrowser(\"Opera\");\n\n public static isEdge = UserAgent.isTargetBrowser(\"Edge\");\n\n /**\n * Check if current browser is as given\n *\n * @param browserName - Browser Name\n * @returns true, if current browser has specified name\n */\n private static isTargetBrowser(browserName: string): boolean {\n const brand = UserAgent.browserDataMap[browserName]?.brand;\n const uaStringName = UserAgent.browserDataMap[browserName]?.uaStringName;\n\n const brandsData = navigator?.userAgentData?.brands;\n\n if (!brandsData || !brand) {\n return uaStringName ? navigator.userAgent.indexOf(uaStringName) >= 0 : false;\n }\n\n for (let i = 0; i < brandsData.length; i += 1) {\n const data = brandsData[i];\n\n if (data && data.brand === brand) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n/**\n * Helper class for working with i18n locales\n */\nexport class I18n {\n /**\n * Gets matched locale from locales list\n *\n * @param locales - list of i18n locales\n * @param locale - target locale\n * @returns matched locale or null, if locale is not found\n */\n public static find(locales: string[], locale: string): string | null {\n const lang = locale.replace(\"-\", \"_\");\n\n if (locales.includes(lang)) {\n return lang;\n }\n\n const [localePart] = lang.split(\"_\");\n\n if (localePart && locales.includes(localePart)) {\n return localePart;\n }\n\n return null;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Entry point for API helper classes\n\n// Helper class for working with browser extension context\nexport { BrowserUtils } from \"./browser-utils\";\n\n// Helper class for user agent data\nexport { UserAgent } from \"./user-agent\";\n\n// Helper class for working with i18n locales\nexport { I18n } from \"./i18n\";\n","var util;\n(function (util) {\n util.assertEqual = (val) => val;\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array\n .map((val) => (typeof val === \"string\" ? `'${val}'` : val))\n .join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nconst getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then &&\n typeof data.then === \"function\" &&\n data.catch &&\n typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n\nconst ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n get errors() {\n return this.issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly equal to `\n : issue.inclusive\n ? `greater than or equal to `\n : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `less than or equal to`\n : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact\n ? `exactly`\n : issue.inclusive\n ? `smaller than or equal to`\n : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\n\nlet overrideErrorMap = errorMap;\nfunction setErrorMap(map) {\n overrideErrorMap = map;\n}\nfunction getErrorMap() {\n return overrideErrorMap;\n}\n\nconst makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message || errorMessage,\n };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n syncPairs.push({\n key: await pair.key,\n value: await pair.value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (typeof value.value !== \"undefined\" || pair.alwaysSet) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nconst INVALID = Object.freeze({\n status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n\nvar errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message === null || message === void 0 ? void 0 : message.message;\n})(errorUtil || (errorUtil = {}));\n\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (this._key instanceof Array) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n if (typeof ctx.data === \"undefined\") {\n return { message: required_error !== null && required_error !== void 0 ? required_error : ctx.defaultError };\n }\n return { message: invalid_type_error !== null && invalid_type_error !== void 0 ? invalid_type_error : ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nclass ZodType {\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n }\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n var _a;\n const ctx = {\n common: {\n issues: [],\n async: (_a = params === null || params === void 0 ? void 0 : params.async) !== null && _a !== void 0 ? _a : false,\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params === null || params === void 0 ? void 0 : params.errorMap,\n async: true,\n },\n path: (params === null || params === void 0 ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult)\n ? maybeAsyncResult\n : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\"\n ? refinementData(val, ctx)\n : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this, this._def);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[a-z][a-z0-9]*$/;\nconst ulidRegex = /[0-9A-HJKMNP-TV-Z]{26}/;\nconst uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\nconst emailRegex = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst emojiRegex = /^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$/u;\nconst ipv4Regex = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/;\nconst ipv6Regex = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\n// Adapted from https://stackoverflow.com/a/3143231\nconst datetimeRegex = (args) => {\n if (args.precision) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{${args.precision}}Z$`);\n }\n }\n else if (args.precision === 0) {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}Z$`);\n }\n }\n else {\n if (args.offset) {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?(([+-]\\\\d{2}(:?\\\\d{2})?)|Z)$`);\n }\n else {\n return new RegExp(`^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(\\\\.\\\\d+)?Z$`);\n }\n }\n};\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nclass ZodString extends ZodType {\n constructor() {\n super(...arguments);\n this._regex = (regex, validation, message) => this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n /**\n * @deprecated Use z.string().min(1) instead.\n * @see {@link ZodString.min}\n */\n this.nonempty = (message) => this.min(1, errorUtil.errToObj(message));\n this.trim = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n this.toLowerCase = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n this.toUpperCase = () => new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n }\n //\n );\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch (_a) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n var _a;\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof (options === null || options === void 0 ? void 0 : options.precision) === \"undefined\" ? null : options === null || options === void 0 ? void 0 : options.precision,\n offset: (_a = options === null || options === void 0 ? void 0 : options.offset) !== null && _a !== void 0 ? _a : false,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options === null || options === void 0 ? void 0 : options.position,\n ...errorUtil.errToObj(options === null || options === void 0 ? void 0 : options.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n var _a;\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / Math.pow(10, decCount);\n}\nclass ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" ||\n (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null, min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" ||\n ch.kind === \"int\" ||\n ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = BigInt(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive\n ? input.data < check.value\n : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive\n ? input.data > check.value\n : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n var _a;\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (_a = params === null || params === void 0 ? void 0 : params.coerce) !== null && _a !== void 0 ? _a : false,\n ...processCreateParams(params),\n });\n};\nclass ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n ...processCreateParams(params),\n });\n};\nclass ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params === null || params === void 0 ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nclass ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nclass ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nclass ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nclass ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nclass ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nclass ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nclass ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nclass ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nclass ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n return (this._cached = { shape, keys });\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever &&\n this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n syncPairs.push({\n key,\n value: await pair.value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n var _a, _b, _c, _d;\n const defaultError = (_c = (_b = (_a = this._def).errorMap) === null || _b === void 0 ? void 0 : _b.call(_a, issue, ctx).message) !== null && _c !== void 0 ? _c : ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: (_d = errorUtil.errToObj(message).message) !== null && _d !== void 0 ? _d : defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // (def: Def) =>\n // (\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge(\n // merging: Incoming\n // ): //ZodObject = (merging) => {\n // ZodObject<\n // extendShape>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n util.objectKeys(mask).forEach((key) => {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n util.objectKeys(this.shape).forEach((key) => {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n });\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nclass ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return Object.keys(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else {\n return null;\n }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util\n .objectKeys(a)\n .filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date &&\n bType === ZodParsedType.date &&\n +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nclass ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\nclass ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nclass ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nclass ZodMap extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nclass ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nclass ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n ctx.schemaErrorMap,\n getErrorMap(),\n errorMap,\n ].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n return OK(async (...args) => {\n const error = new ZodError([]);\n const parsedArgs = await this._def.args\n .parseAsync(args, params)\n .catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await fn(...parsedArgs);\n const parsedReturns = await this._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n return OK((...args) => {\n const parsedArgs = this._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = fn(...parsedArgs.data);\n const parsedReturns = this._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args\n ? args\n : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nclass ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nclass ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nclass ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (this._def.values.indexOf(input.data) === -1) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values) {\n return ZodEnum.create(values);\n }\n exclude(values) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)));\n }\n}\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string &&\n ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (nativeEnumValues.indexOf(input.data) === -1) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nclass ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise &&\n ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise\n ? ctx.data\n : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nclass ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data);\n if (ctx.common.async) {\n return Promise.resolve(processed).then((processed) => {\n return this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n });\n }\n else {\n return this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc\n // effect: RefinementEffect\n ) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return base;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema\n ._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx })\n .then((base) => {\n if (!isValid(base))\n return base;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ status: status.value, value: result }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nclass ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nclass ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nclass ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\"\n ? params.default\n : () => params.default,\n ...processCreateParams(params),\n });\n};\nclass ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nclass ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nclass ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nconst custom = (check, params = {}, \n/*\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) => {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n var _a, _b;\n if (!check(data)) {\n const p = typeof params === \"function\"\n ? params(data)\n : typeof params === \"string\"\n ? { message: params }\n : params;\n const _fatal = (_b = (_a = p.fatal) !== null && _a !== void 0 ? _a : fatal) !== null && _b !== void 0 ? _b : true;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n ctx.addIssue({ code: \"custom\", ...p2, fatal: _fatal });\n }\n });\n return ZodAny.create();\n};\nconst late = {\n object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\nconst instanceOfType = (\n// const instanceOfType = any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nconst NEVER = INVALID;\n\nvar z = /*#__PURE__*/Object.freeze({\n __proto__: null,\n defaultErrorMap: errorMap,\n setErrorMap: setErrorMap,\n getErrorMap: getErrorMap,\n makeIssue: makeIssue,\n EMPTY_PATH: EMPTY_PATH,\n addIssueToContext: addIssueToContext,\n ParseStatus: ParseStatus,\n INVALID: INVALID,\n DIRTY: DIRTY,\n OK: OK,\n isAborted: isAborted,\n isDirty: isDirty,\n isValid: isValid,\n isAsync: isAsync,\n get util () { return util; },\n get objectUtil () { return objectUtil; },\n ZodParsedType: ZodParsedType,\n getParsedType: getParsedType,\n ZodType: ZodType,\n ZodString: ZodString,\n ZodNumber: ZodNumber,\n ZodBigInt: ZodBigInt,\n ZodBoolean: ZodBoolean,\n ZodDate: ZodDate,\n ZodSymbol: ZodSymbol,\n ZodUndefined: ZodUndefined,\n ZodNull: ZodNull,\n ZodAny: ZodAny,\n ZodUnknown: ZodUnknown,\n ZodNever: ZodNever,\n ZodVoid: ZodVoid,\n ZodArray: ZodArray,\n ZodObject: ZodObject,\n ZodUnion: ZodUnion,\n ZodDiscriminatedUnion: ZodDiscriminatedUnion,\n ZodIntersection: ZodIntersection,\n ZodTuple: ZodTuple,\n ZodRecord: ZodRecord,\n ZodMap: ZodMap,\n ZodSet: ZodSet,\n ZodFunction: ZodFunction,\n ZodLazy: ZodLazy,\n ZodLiteral: ZodLiteral,\n ZodEnum: ZodEnum,\n ZodNativeEnum: ZodNativeEnum,\n ZodPromise: ZodPromise,\n ZodEffects: ZodEffects,\n ZodTransformer: ZodEffects,\n ZodOptional: ZodOptional,\n ZodNullable: ZodNullable,\n ZodDefault: ZodDefault,\n ZodCatch: ZodCatch,\n ZodNaN: ZodNaN,\n BRAND: BRAND,\n ZodBranded: ZodBranded,\n ZodPipeline: ZodPipeline,\n custom: custom,\n Schema: ZodType,\n ZodSchema: ZodType,\n late: late,\n get ZodFirstPartyTypeKind () { return ZodFirstPartyTypeKind; },\n coerce: coerce,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n date: dateType,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n 'enum': enumType,\n 'function': functionType,\n 'instanceof': instanceOfType,\n intersection: intersectionType,\n lazy: lazyType,\n literal: literalType,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n 'null': nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n oboolean: oboolean,\n onumber: onumber,\n optional: optionalType,\n ostring: ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n record: recordType,\n set: setType,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n 'undefined': undefinedType,\n union: unionType,\n unknown: unknownType,\n 'void': voidType,\n NEVER: NEVER,\n ZodIssueCode: ZodIssueCode,\n quotelessJson: quotelessJson,\n ZodError: ZodError\n});\n\nexport { BRAND, DIRTY, EMPTY_PATH, INVALID, NEVER, OK, ParseStatus, ZodType as Schema, ZodAny, ZodArray, ZodBigInt, ZodBoolean, ZodBranded, ZodCatch, ZodDate, ZodDefault, ZodDiscriminatedUnion, ZodEffects, ZodEnum, ZodError, ZodFirstPartyTypeKind, ZodFunction, ZodIntersection, ZodIssueCode, ZodLazy, ZodLiteral, ZodMap, ZodNaN, ZodNativeEnum, ZodNever, ZodNull, ZodNullable, ZodNumber, ZodObject, ZodOptional, ZodParsedType, ZodPipeline, ZodPromise, ZodRecord, ZodType as ZodSchema, ZodSet, ZodString, ZodSymbol, ZodEffects as ZodTransformer, ZodTuple, ZodType, ZodUndefined, ZodUnion, ZodUnknown, ZodVoid, addIssueToContext, anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, coerce, custom, dateType as date, z as default, errorMap as defaultErrorMap, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, getErrorMap, getParsedType, instanceOfType as instanceof, intersectionType as intersection, isAborted, isAsync, isDirty, isValid, late, lazyType as lazy, literalType as literal, makeIssue, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, objectUtil, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, quotelessJson, recordType as record, setType as set, setErrorMap, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, util, voidType as void, z };\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * {@link AdguardApi} configuration runtime validator\n */\nexport const configurationValidator = zod.object({\n /**\n * An array of filters identifiers.\n *\n * You can look for possible filters identifiers in the filters metadata file.\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\n filters: zod.number().array(),\n\n /**\n * An array of domains, for which AdGuard won't work.\n */\n allowlist: zod.string().array().optional(),\n\n /**\n * This property completely changes AdGuard behavior.\n *\n * If it is defined, Adguard will work for domains from the {@link blocklist} only.\n *\n * All other domains will be ignored. If {@link blocklist} is defined, {@link allowlist} will be ignored.\n */\n blocklist: zod.string().array().optional(),\n\n /**\n * An array of custom filtering rules.\n *\n * These custom rules might be created by a user via AdGuard Assistant UI.\n *\n * @see https://adguard.com/en/filterrules.html\n */\n rules: zod.string().array().optional(),\n\n /**\n * An absolute path to a file, containing filters metadata.\n *\n * Once started, AdGuard will periodically check filters updates by downloading this file.\n *\n * Example: `https://filters.adtidy.org/extension/chromium/filters.json`.\n */\n filtersMetadataUrl: zod.string(),\n\n /**\n * URL mask used for fetching filters rules.\n * `{filter_id}` parameter will be replaced with an actual filter identifier.\n *\n * Example: `https://filters.adtidy.org/extension/chromium/filters/{filter_id}.txt`\n *\n * English filter (filter id = 2) will be loaded from: `https://filters.adtidy.org/extension/chromium/2.txt`.\n */\n filterRulesUrl: zod.string(),\n});\n\nexport type Configuration = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Configuration schema entry point\n\n// AdguardApi configuration type and runtime validator\nexport * from \"./configuration\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod, { z } from \"zod\";\n\n/**\n * Filter metadata item runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const filterMetadataValidator = zod.object({\n description: zod.string(),\n displayNumber: zod.number(),\n expires: zod.number(),\n filterId: zod.number(),\n groupId: zod.number(),\n homepage: zod.string(),\n languages: zod.string().array(),\n name: zod.string(),\n subscriptionUrl: zod.string(),\n tags: zod.number().array(),\n timeAdded: zod.string(),\n timeUpdated: zod.string(),\n trustLevel: zod.string(),\n version: zod.string(),\n});\n\nexport type FilterMetadata = z.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * Filter tag metadata item runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const tagMetadataValidator = zod.object({\n tagId: zod.number(),\n keyword: zod.string(),\n description: zod.string().optional(),\n name: zod.string().optional(),\n});\n\nexport type TagMetadata = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * Filter group metadata item runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const groupMetadataValidator = zod.object({\n displayNumber: zod.number(),\n groupId: zod.number(),\n groupName: zod.string(),\n});\n\nexport type GroupMetadata = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\nimport { filterMetadataValidator } from \"./filter\";\nimport { tagMetadataValidator } from \"./tag\";\nimport { groupMetadataValidator } from \"./group\";\n\n/**\n * Metadata runtime validator\n *\n * @see https://filters.adtidy.org/extension/chromium/filters.json\n */\nexport const metadataValidator = zod.object({\n filters: filterMetadataValidator.array(),\n groups: groupMetadataValidator.array(),\n tags: tagMetadataValidator.array(),\n});\n\nexport type Metadata = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Metadata schema entry point\n\n// Metadata runtime validator and types\nexport * from \"./metadata\";\n\n// Filter metadata item runtime validator and types\nexport * from \"./filter\";\n\n// Filter tag metadata item runtime validator and types\nexport * from \"./tag\";\n\n// Filter group metadata item runtime validator and types\nexport * from \"./group\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\n\n/**\n * In some cases we want to preprocessing input before validation\n * For example, cast loaded filter metadata item id field from string to number before validation:\n *\n * { filterId: \"1\", ... } -> { filterId: 1, ... }\n */\nexport class SchemaPreprocessor {\n /**\n * {@link zod} runtime validator with {@link castStringToBoolean} preprocessor\n */\n public static booleanValidator = zod.preprocess(SchemaPreprocessor.castStringToBoolean, zod.boolean());\n\n /**\n * {@link zod} runtime validator with {@link castStringToNumber} preprocessor\n */\n public static numberValidator = zod.preprocess(SchemaPreprocessor.castStringToNumber, zod.number());\n\n /**\n * If {@link value} is string, cast it to number, else returns original value.\n *\n * @param value - preprocessed value\n * @returns number value, if string passed, else returns original value\n */\n private static castStringToNumber(value: unknown): number | unknown {\n if (typeof value === \"string\") {\n return Number(value);\n }\n\n return value;\n }\n\n /**\n * If {@link value} is string, cast it to boolean, else returns original value.\n *\n * @param value - preprocessed value\n * @returns boolean value, if string passed, else returns original value\n */\n private static castStringToBoolean(value: unknown): boolean | unknown {\n if (typeof value === \"string\") {\n try {\n return Boolean(JSON.parse(value));\n } catch (e) {\n return value;\n }\n }\n\n return value;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport zod from \"zod\";\nimport { SchemaPreprocessor } from \"../preprocessor\";\n\n/**\n * Runtime validator for persistent filter version data\n */\nexport const filterVersionDataValidator = zod.object({\n version: zod.string(),\n lastCheckTime: zod.number(),\n lastUpdateTime: zod.number(),\n expires: zod.number(),\n});\n\nexport type FilterVersionData = zod.infer;\n\n/**\n * Runtime validator for persistent key value storage of filter version data.\n *\n * Key is filter metadata id.\n * Value is {@link FilterVersionData}.\n */\nexport const filterVersionStorageDataValidator = zod.record(\n SchemaPreprocessor.numberValidator,\n filterVersionDataValidator\n);\n\nexport type FilterVersionStorageData = zod.infer;\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Filter version schema entry point\n\n// Filter version validators and types\nexport * from \"./filter-version\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Schemas entry point\n\n// Api Configuration schema entry point\nexport * from \"./configuration\";\n\n// Metadata schema entry point\nexport * from \"./metadata\";\n\n// Filter version data entry point\nexport * from \"./filter-version\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport FiltersDownloader, { type DefinedExpressions } from \"@adguard/filters-downloader/browser\";\n\nimport { UserAgent } from \"./utils\";\nimport { metadataValidator, Metadata, Configuration } from \"./schemas\";\n\n/**\n * Network requests API\n *\n * This class provides methods for downloading {@link Metadata} and filter rules from remote source\n */\nexport class Network {\n // FiltersDownloader constants\n private filterCompilerConditionsConstants: DefinedExpressions = {\n adguard: true,\n adguard_ext_chromium: UserAgent.isChrome,\n adguard_ext_firefox: UserAgent.isFirefox,\n adguard_ext_edge: UserAgent.isEdge,\n adguard_ext_safari: false,\n adguard_ext_opera: UserAgent.isOpera,\n };\n\n // Cached filters metadata url\n private filtersMetadataUrl: string | undefined;\n\n // Cached filter rules url template\n private filterRulesUrl: string | undefined;\n\n /**\n * Apply network {@link Configuration} options\n *\n * @param configuration - api {@link Configuration}\n */\n public configure(configuration: Configuration): void {\n const { filtersMetadataUrl, filterRulesUrl } = configuration;\n\n this.filtersMetadataUrl = filtersMetadataUrl;\n this.filterRulesUrl = filterRulesUrl;\n }\n\n /**\n * Downloads filter rules by filter ID via {@link FiltersDownloader} module\n *\n * @param filterId - Filter id\n * @returns promise, resolved with filter rules string\n * @throws error, if {@link filterRulesUrl} is not defined or response data is not valid\n */\n public async downloadFilterRules(filterId: number): Promise {\n if (!this.filterRulesUrl) {\n throw new Error(\"filterRulesUrl option is not set\");\n }\n\n const url = this.filterRulesUrl.replace(\"{filter_id}\", String(filterId));\n\n return FiltersDownloader.download(url, this.filterCompilerConditionsConstants);\n }\n\n /**\n * Downloads and validate {@link Metadata}\n *\n * @returns promise, resolved with downloaded metadata\n * @throws error, if {@link filtersMetadataUrl} is not defined, or response data is not valid\n */\n public async downloadFiltersMetadata(): Promise {\n if (!this.filtersMetadataUrl) {\n throw new Error(\"filtersMetadataUrl option is not set\");\n }\n\n const response = await fetch(this.filtersMetadataUrl);\n\n const metadata = await response.json();\n\n if (!metadata) {\n throw new Error(`Invalid response: ${response}`);\n }\n\n return metadataValidator.parse(metadata);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport browser from \"webextension-polyfill\";\n\n/**\n * Dev-friendly API for key-value extension storage\n */\nexport class Storage {\n // Storage instance\n private storage = browser.storage.local;\n\n /**\n * Save {@link value} for {@link key}\n *\n * @param key - storage key\n * @param value - storage value\n */\n public async set(key: string, value: unknown): Promise {\n await this.storage.set({ [key]: value });\n }\n\n /**\n * Get storage value by {@link key}\n *\n * @param key - storage key\n * @returns storage value or undefined, if value was not found\n */\n public async get(key: string): Promise {\n return (await this.storage.get(key))?.[key];\n }\n\n /**\n * Remove value for {@link key}\n *\n * @param key - storage key\n */\n public async remove(key: string): Promise {\n await this.storage.remove(key);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Network } from \"../network\";\nimport { Storage } from \"../storage\";\nimport { metadataValidator, Metadata, FilterMetadata } from \"../schemas\";\nimport { Logger } from \"../logger\";\n\n// Metadata storage key for browser.storage.local\nexport const METADATA_STORAGE_KEY = \"metadata\";\n\n/**\n * Metadata Api provides methods for managing app {@link Metadata}\n */\nexport class MetadataApi {\n // Cached app metadata\n private metadata: Metadata | undefined;\n\n // Network requests API\n private network: Network;\n\n // Dev-friendly API for key-value extension storage\n private storage: Storage;\n\n // Simple Api for logging\n private logger: Logger;\n\n constructor(network: Network, storage: Storage, logger: Logger) {\n this.storage = storage;\n this.network = network;\n this.logger = logger;\n }\n\n /**\n * Reads and parses {@link Metadata} from extension storage.\n *\n * If metadata is invalid or not exist, try to load it form backend\n */\n public async init(): Promise {\n const storageData = await this.storage.get(METADATA_STORAGE_KEY);\n\n if (typeof storageData !== \"string\") {\n await this.loadMetadata();\n return;\n }\n\n try {\n const metadata = JSON.parse(storageData);\n this.metadata = metadataValidator.parse(metadata);\n } catch (e) {\n this.logger.warn(\"Can`t parse data from metadata storage, load it from backend\", e);\n await this.loadMetadata();\n }\n }\n\n /**\n * Downloads app {@link Metadata} from backend and save it in extension storage\n */\n public async loadMetadata(): Promise {\n try {\n const metadata = await this.network.downloadFiltersMetadata();\n await this.storage.set(METADATA_STORAGE_KEY, JSON.stringify(metadata));\n this.metadata = metadata;\n } catch (e) {\n this.logger.error(\"Can`t download metadata\", e);\n }\n }\n\n /**\n * Gets persisted {@link FilterMetadata} for all known filter\n *\n * @returns list of {@link FilterMetadata}\n * @throws error, if metadata is not loaded in memory\n */\n public getFiltersMetadata(): FilterMetadata[] {\n if (!this.metadata) {\n throw new Error(\"Metadata is not loaded!\");\n }\n return this.metadata.filters;\n }\n\n /**\n * Gets persisted {@link FilterMetadata} for specified filter\n *\n * @param filterId - filter id\n * @returns filter metadata for specified filter or undefined, if metadata is not found\n */\n public getFilterMetadata(filterId: number): FilterMetadata | undefined {\n return this.getFiltersMetadata().find((el) => el.filterId === filterId);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Storage } from \"../storage\";\nimport { filterVersionStorageDataValidator, FilterVersionData, FilterVersionStorageData } from \"../schemas\";\nimport { Logger } from \"../logger\";\n\n// Filters versions data storage key for browser.storage.local\nexport const FILTERS_VERSIONS_KEY = \"versions\";\n\n/**\n * Api for managing filter version data\n */\nexport class VersionsApi {\n // Cached filter version data\n private versions: FilterVersionStorageData | undefined;\n\n // Dev-friendly API for key-value extension storage\n private storage: Storage;\n\n // Simple Api for logging\n private logger: Logger;\n\n constructor(storage: Storage, logger: Logger) {\n this.logger = logger;\n this.storage = storage;\n }\n\n /**\n * Reads and parses {@link FilterVersionStorageData} from extension storage.\n *\n * If data is invalid or not exist, load default data\n */\n public async init(): Promise {\n const storageData = await this.storage.get(FILTERS_VERSIONS_KEY);\n\n if (typeof storageData !== \"string\") {\n this.loadDefaultData();\n return;\n }\n\n try {\n const versions = JSON.parse(storageData);\n this.versions = filterVersionStorageDataValidator.parse(versions);\n } catch (e) {\n this.logger.warn(\"Can`t parse data from versions storage, load default data\", e);\n this.loadDefaultData();\n }\n }\n\n /**\n * Gets installed filters ids.\n *\n * A filter is considered installed if its version data is saved\n *\n * @returns list of filters ids\n * @throws error if filter version storage data is not loaded\n */\n public getInstalledFilters(): number[] {\n if (!this.versions) {\n throw new Error(\"Filter versions are not initialized\");\n }\n return Object.keys(this.versions).map((id) => Number(id));\n }\n\n /**\n * Gets version data for specified filter\n *\n * @param filterId - filter id\n * @returns filter version data\n * @throws error if filter version storage data is not loaded\n */\n public get(filterId: number): FilterVersionData | undefined {\n if (!this.versions) {\n throw new Error(\"Filter versions are not initialized\");\n }\n\n return this.versions[filterId];\n }\n\n /**\n * Sets version data for specified filter\n *\n * @param filterId - filter id\n * @param data - filter version data\n * @throws error if filter version storage data is not loaded\n */\n public async set(filterId: number, data: FilterVersionData): Promise {\n if (!this.versions) {\n throw new Error(\"Filter versions are not initialized\");\n }\n\n this.versions[filterId] = data;\n await this.saveData();\n }\n\n /**\n * Save data in extension storage\n */\n private async saveData(): Promise {\n await this.storage.set(FILTERS_VERSIONS_KEY, JSON.stringify(this.versions));\n }\n\n /**\n * Load default empty filter storage data\n */\n private async loadDefaultData(): Promise {\n this.versions = {};\n await this.saveData();\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { Storage } from \"../storage\";\n\n/**\n * Api for write and read filters rules from extension storage\n */\nexport class FilterRulesApi {\n // Dev-friendly API for key-value extension storage\n storage: Storage;\n\n constructor(storage: Storage) {\n this.storage = storage;\n }\n\n /**\n * Gets specified filter rules lines from extension storage\n *\n * @param filterId - Filter id\n * @returns specified filter rules lines\n */\n async get(filterId: number): Promise {\n return this.storage.get(FilterRulesApi.getFilterKey(filterId)) as Promise;\n }\n\n /**\n * Sets specified filter rules lines to extension storage\n *\n * @param filterId - Filter id\n * @param rules - Filter rules lines\n */\n async set(filterId: number, rules: string[]): Promise {\n await this.storage.set(FilterRulesApi.getFilterKey(filterId), rules);\n }\n\n /**\n * Generates {@link Storage} key for specified filter rules\n *\n * @param filterId - Filter Id\n * @returns storage key\n */\n private static getFilterKey(filterId: number): string {\n return `filterrules_${filterId}.txt`;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nexport enum NotifierEventType {\n DetectFilters = \"DetectFilters\",\n UpdateFilters = \"UpdateFilters\",\n}\n\nexport type DetectFiltersEvent = {\n type: NotifierEventType.DetectFilters;\n data: {\n filtersIds: number[];\n };\n};\n\nexport type UpdateFiltersEvent = {\n type: NotifierEventType.UpdateFilters;\n};\n\nexport type NotifierEvent = DetectFiltersEvent | UpdateFiltersEvent;\n\nexport type ExtractedNotifierEvent = Extract;\n\nexport type NotifierListener = (value: ExtractedNotifierEvent) => void | Promise;\n\nexport type NotifierListenersMap = { [K in NotifierEventType]: NotifierListener[] };\n\n/**\n * Type-safe mediator for app events\n *\n * Used for reduce modules coupling\n */\nexport class Notifier {\n // registered listeners mapping\n private listenersMap: NotifierListenersMap = {\n [NotifierEventType.DetectFilters]: [],\n [NotifierEventType.UpdateFilters]: [],\n };\n\n /**\n * Register listener for specified event.\n *\n * @param type - event type\n * @param listener - listener function\n */\n public addListener(type: T, listener: NotifierListener): void {\n this.listenersMap[type].push(listener);\n }\n\n /**\n * Unregister listener for specified event.\n *\n * @param type - event type\n * @param listener - listener function\n */\n public removeListener(type: T, listener: NotifierListener): void {\n const listeners = this.listenersMap[type];\n\n this.listenersMap[type] = listeners.filter((el) => el !== listener) as NotifierListenersMap[T];\n }\n\n /**\n * Execute all registered listeners for specified event type with passed data.\n *\n * @param event - event data\n */\n public publishEvent(event: T): void {\n const listeners = this.listenersMap[event.type] as NotifierListener[];\n\n listeners.forEach((listener) => {\n listener(event);\n });\n }\n}\n\nexport const notifier = new Notifier();\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\nimport { Network } from \"../network\";\nimport { Storage } from \"../storage\";\nimport { MetadataApi } from \"./metadata\";\nimport { VersionsApi } from \"./versions\";\nimport { FilterRulesApi } from \"./rules\";\nimport { BrowserUtils, I18n } from \"../utils\";\nimport { FilterMetadata } from \"../schemas\";\nimport { notifier, NotifierEventType } from \"../notifier\";\nimport { Logger } from \"../logger\";\n\n/**\n * Filter Api provides methods for managing filters data\n */\nexport class FiltersApi {\n // Api for managing app Metadata\n private metadataApi: MetadataApi;\n\n // Api for managing filter version data\n private versionsApi: VersionsApi;\n\n // Api for write and read filters rules from extension storage\n private filterRulesApi: FilterRulesApi;\n\n // Network requests Api\n private network: Network;\n\n // Simple Api for logging\n private logger: Logger;\n\n constructor(network: Network, storage: Storage, logger: Logger) {\n this.logger = logger;\n this.metadataApi = new MetadataApi(network, storage, this.logger);\n this.versionsApi = new VersionsApi(storage, this.logger);\n this.filterRulesApi = new FilterRulesApi(storage);\n this.network = network;\n }\n\n /**\n * Initializes linked APIs\n */\n public async init(): Promise {\n await this.metadataApi.init();\n await this.versionsApi.init();\n }\n\n /**\n * Gets filter rules lists for specified filters ids.\n *\n * @param filterIds - list of filter ids\n * @returns filters data for {@link TsWebExtension} configuration\n */\n public async getFilters(filterIds: number[]): Promise<\n {\n content: string;\n filterId: number;\n trusted: boolean;\n }[]\n > {\n const tasks = filterIds.map((id) => this.getFilter(id));\n\n return Promise.all(tasks);\n }\n\n /**\n * Gets filter rules for specified filter id.\n *\n * Try to load rules from extension storage.\n * If rules is not found, download it from backend.\n *\n * @param filterId - filter id\n * @returns filters data item for {@link TsWebExtension} configuration\n */\n private async getFilter(filterId: number): Promise<{\n content: string;\n filterId: number;\n trusted: boolean;\n }> {\n let rules = await this.filterRulesApi.get(filterId);\n\n if (!Array.isArray(rules)) {\n rules = await this.loadFilterRules(filterId);\n }\n\n return {\n filterId,\n content: (rules || []).join(\"\\n\"),\n trusted: true,\n };\n }\n\n /**\n * Update filters rules lists based on {@link FilterMetadata}.\n *\n * Downloads fresh {@link Metadata} from backend\n * and match filter versions with persisted {@link FilterVersionStorageData} for each installed filter.\n * If filter version in metadata is higher, downloads and saves new rules content\n *\n * Dispatches {@link NotifierEventType.UpdateFilters} event, if at least one filter has been updated\n */\n public async updateFilters(): Promise {\n this.logger.info(\"Update filters\");\n /**\n * Reload filters metadata from backend for correct\n * version matching on update check.\n */\n await this.metadataApi.loadMetadata();\n\n const ids = this.versionsApi.getInstalledFilters();\n\n const updateTasks = ids.map(async (id) => this.updateFilter(id));\n\n const updatedFilters = await Promise.all(updateTasks);\n\n if (updatedFilters.some((filterData) => !!filterData?.filterId)) {\n notifier.publishEvent({ type: NotifierEventType.UpdateFilters });\n }\n }\n\n /**\n * Update filter rules list based on {@link FilterMetadata}\n *\n * Match filter version from {@link Metadata} with persisted filter version from {@link VersionsApi}.\n * If version in metadata is higher, downloads and saves new filter rules.\n *\n * Note: you must update {@link Metadata} first.\n *\n * @param filterId - filter id\n * @returns updated filter metadata or null, if update is not required\n */\n private async updateFilter(filterId: number): Promise {\n /* eslint-disable no-console */\n this.logger.info(`Update filter ${filterId}`);\n\n const filterMetadata = this.metadataApi.getFilterMetadata(filterId);\n\n if (!filterMetadata) {\n console.error(`Can't find filter ${filterId} metadata`);\n return null;\n }\n\n if (!this.isFilterNeedUpdate(filterMetadata)) {\n this.logger.info(`Filter ${filterId} is already updated`);\n return null;\n }\n\n try {\n await this.loadFilterRules(filterId);\n this.logger.info(`Successfully update filter ${filterId}`);\n return filterMetadata;\n } catch (e) {\n console.error(e);\n return null;\n }\n /* eslint-enable no-console */\n }\n\n /**\n * Checks if filter need update.\n * Matches version from updated metadata with data in filter version storage.\n *\n * @param filterMetadata - updated filter metadata\n * @returns true, if filter update is required, else returns false.\n */\n private isFilterNeedUpdate(filterMetadata: FilterMetadata): boolean {\n this.logger.info(`Check if filter ${filterMetadata.filterId} need to update`);\n\n const filterVersion = this.versionsApi.get(filterMetadata.filterId);\n\n // filter is not installed\n if (!filterVersion) {\n return false;\n }\n\n return !BrowserUtils.isGreaterOrEqualsVersion(filterVersion.version, filterMetadata.version);\n }\n\n /**\n * Download filter rules from backend\n *\n * @param filterId - filter Id\n * @returns list of downloaded rules lines\n */\n private async loadFilterRules(filterId: number): Promise {\n this.logger.info(`Download rules for filter ${filterId}`);\n\n const filterMetadata = this.metadataApi.getFilterMetadata(filterId);\n\n if (!filterMetadata) {\n throw new Error(`filter ${filterId} metadata is not found`);\n }\n\n const rules = await this.network.downloadFilterRules(filterId);\n await this.filterRulesApi.set(filterId, rules);\n\n const { version, expires, timeUpdated } = filterMetadata;\n\n this.versionsApi.set(filterId, {\n version,\n expires,\n lastUpdateTime: new Date(timeUpdated).getTime(),\n lastCheckTime: Date.now(),\n });\n\n return rules;\n }\n\n /**\n * Gets list of filters for the specified language\n *\n * @param locale - page locale\n * @returns list of filters ids for the specified language\n */\n public getFilterIdsForLanguage(locale: string): number[] {\n const filters = this.metadataApi.getFiltersMetadata();\n\n const filterIds: number[] = [];\n\n filters.forEach(({ languages, filterId }) => {\n const language = I18n.find(languages, locale);\n if (language) {\n filterIds.push(filterId);\n }\n });\n\n return filterIds;\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport { FiltersApi } from \"./api\";\n\n/**\n * Service for scheduling filters rules updates\n */\nexport class FiltersUpdateService {\n // update checking initialization delay\n private static initDelay = 1000 * 60 * 5; // 5 min\n\n // update checking period\n private static checkPeriodMs = 1000 * 60 * 30; // 30 min\n\n // current update timer\n private updateTimerId: number | undefined;\n\n // current initialization delay timer\n private delayTimerId: number | undefined;\n\n // API for managing filters data\n private api: FiltersApi;\n\n constructor(api: FiltersApi) {\n this.api = api;\n }\n\n /**\n * Initialize update scheduler with {@link initDelay}\n */\n public start(): void {\n this.delayTimerId = window.setTimeout(async () => {\n await this.scheduleUpdate();\n }, FiltersUpdateService.initDelay);\n }\n\n /**\n * Clear current timers\n */\n public stop(): void {\n if (this.delayTimerId) {\n window.clearTimeout(this.delayTimerId);\n }\n\n if (this.updateTimerId) {\n window.clearTimeout(this.updateTimerId);\n }\n }\n\n /**\n * Schedule filter data update after {@link checkPeriodMs}\n */\n private async scheduleUpdate(): Promise {\n if (this.updateTimerId) {\n window.clearTimeout(this.updateTimerId);\n }\n\n await this.api.updateFilters();\n\n this.updateTimerId = window.setTimeout(async () => {\n await this.scheduleUpdate();\n }, FiltersUpdateService.checkPeriodMs);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport browser, { Tabs } from \"webextension-polyfill\";\nimport { isHttpRequest, getDomain } from \"@adguard/tswebextension\";\n\nimport { UserAgent } from \"../utils\";\nimport { Configuration } from \"../schemas\";\nimport { FiltersApi } from \"./api\";\nimport { notifier, NotifierEventType } from \"../notifier\";\n\nexport type BrowsingLanguage = {\n language: string;\n time: number;\n};\n\n/**\n *\n * This service is used to auto-enable language-specific filters.\n *\n * Tracks page language, reading data on browser tab update.\n *\n * If language hits some times, checks if language filter\n * is disabled and dispatches {@link NotifierEventType.DetectFilters} event with detected filter ids.\n */\nexport class LocaleDetectService {\n // Language hits threshold\n private static SUCCESS_HIT_COUNT = 3;\n\n // Max count of hits, stored in memory\n private static MAX_HISTORY_LENGTH = 10;\n\n // Page locale to filter language data mapping\n private static domainToLanguagesMap: Record = {\n // Russian\n ru: \"ru\",\n ua: \"ru\",\n by: \"ru\",\n kz: \"ru\",\n // English\n com: \"en\",\n au: \"en\",\n uk: \"en\",\n nz: \"en\",\n // German\n de: \"de\",\n at: \"de\",\n // Japanese\n jp: \"ja\",\n // Dutch\n nl: \"nl\",\n // French\n fr: \"fr\",\n // Spanish\n es: \"es\",\n // Italian\n it: \"it\",\n // Portuguese\n pt: \"pt\",\n // Polish\n pl: \"pl\",\n // Czech\n cz: \"cs\",\n // Bulgarian\n bg: \"bg\",\n // Lithuanian\n lt: \"lt\",\n // Latvian\n lv: \"lv\",\n // Arabic\n eg: \"ar\",\n dz: \"ar\",\n kw: \"ar\",\n ae: \"ar\",\n // Slovakian\n sk: \"sk\",\n // Romanian\n ro: \"ro\",\n // Suomi\n fi: \"fi\",\n // Icelandic\n is: \"is\",\n // Norwegian\n no: \"no\",\n // Greek\n gr: \"el\",\n // Hungarian\n hu: \"hu\",\n // Hebrew\n il: \"he\",\n // Chinese\n cn: \"zh\",\n // Indonesian\n id: \"id\",\n // Turkish\n tr: \"tr\",\n };\n\n // Memory storage for language hits\n private browsingLanguages: BrowsingLanguage[] = [];\n\n // Api for managing filters data\n private filtersApi: FiltersApi;\n\n // list of enabled filters ids\n private enabledFilters: number[] = [];\n\n constructor(filtersApi: FiltersApi) {\n this.filtersApi = filtersApi;\n this.onTabUpdated = this.onTabUpdated.bind(this);\n }\n\n /**\n * Add tab updates listener\n */\n public start(): void {\n browser.tabs.onUpdated.addListener(this.onTabUpdated);\n }\n\n /**\n * Remove tab updates listener\n */\n public stop(): void {\n browser.tabs.onUpdated.removeListener(this.onTabUpdated);\n }\n\n /**\n * Set enabled filters ids on {@link Configuration} load\n *\n * @param configuration - loaded {@link Configuration}\n */\n public configure(configuration: Configuration): void {\n this.enabledFilters = configuration.filters;\n }\n\n /**\n * Handles tab data on update\n *\n * @param _tabId - Tab id\n * @param _changeInfo - Tab change info\n * @param tab - Tab details record\n */\n private onTabUpdated(_tabId: number, _changeInfo: Tabs.OnUpdatedChangeInfoType, tab: Tabs.Tab): void {\n if (tab.status === \"complete\") {\n this.detectTabLanguage(tab);\n }\n }\n\n /**\n * Detects language for the specified tab\n *\n * @param tab - {@link Tabs.Tab} data\n */\n private async detectTabLanguage(tab: Tabs.Tab): Promise {\n if (\n !tab.url ||\n // Check language only for http://... tabs\n !isHttpRequest(tab.url)\n ) {\n return;\n }\n\n // tabs.detectLanguage doesn't work in Opera\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/997\n if (!UserAgent.isOpera) {\n if (tab.id && browser.tabs && browser.tabs.detectLanguage) {\n // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/detectLanguage\n try {\n const language = await browser.tabs.detectLanguage(tab.id);\n this.detectLanguage(language);\n } catch (e) {\n // do nothing\n }\n return;\n }\n }\n\n // Detecting language by top-level domain if extension API language detection is unavailable\n // Ignore hostnames which length is less or equal to 8\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1354\n const host = getDomain(tab.url);\n if (host && host.length > 8) {\n const parts = host.split(\".\");\n const tld = parts.at(-1);\n\n if (!tld) {\n return;\n }\n\n const lang = LocaleDetectService.domainToLanguagesMap[tld];\n\n if (!lang) {\n return;\n }\n\n this.detectLanguage(lang);\n }\n }\n\n /**\n * Stores language in the special array containing languages of the last visited pages.\n * If user has visited enough pages with a specified language we call special callback\n * to auto-enable filter for this language\n *\n * @param language - Page language\n */\n private detectLanguage(language: string): void {\n /**\n * For an unknown language \"und\" will be returned\n * https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/detectLanguage\n */\n if (!language || language === \"und\") {\n return;\n }\n\n this.browsingLanguages.push({\n language,\n time: Date.now(),\n });\n\n if (this.browsingLanguages.length > LocaleDetectService.MAX_HISTORY_LENGTH) {\n this.browsingLanguages.shift();\n }\n\n const history = this.browsingLanguages.filter((h) => {\n return h.language === language;\n });\n\n if (history.length >= LocaleDetectService.SUCCESS_HIT_COUNT) {\n const filterIds = this.filtersApi.getFilterIdsForLanguage(language);\n this.onFilterDetectedByLocale(filterIds);\n }\n }\n\n /**\n * Called when LocaleDetector has detected language-specific filters we can enable.\n *\n * @param filterIds - list of detected language-specific filters identifiers\n */\n private onFilterDetectedByLocale(filterIds: number[]): void {\n if (!filterIds || filterIds.length === 0) {\n return;\n }\n\n const filtersIds = filterIds.filter((filterId) => !this.enabledFilters.includes(filterId));\n\n notifier.publishEvent({\n type: NotifierEventType.DetectFilters,\n data: {\n filtersIds,\n },\n });\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// Entry point for filter management modules\n\n// Filters data management API\nexport { FiltersApi } from \"./api\";\n\n// Service for scheduling filters rules updates\nexport { FiltersUpdateService } from \"./update\";\n\n// Service for auto-enabling language filters\nexport { LocaleDetectService } from \"./locale-detect\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport {\n ApplyBasicRuleEvent,\n ContentType,\n defaultFilteringLog,\n EventChannel,\n EventChannelListener,\n FilteringEventType,\n requestContextStorage,\n} from \"@adguard/tswebextension\";\n\nexport type RequestBlockingEvent = {\n // Tab identifier.\n tabId: number;\n // Blocked request URL.\n requestUrl: string;\n // Referrer URL.\n referrerUrl: string;\n // Filtering rule, which has blocked this request.\n rule: string;\n // Rule's filter identifier.\n filterId: number;\n // Request mime type.\n requestType: ContentType;\n};\n\nexport interface RequestBlockingLoggerInterface {\n addListener(listener: EventChannelListener): void;\n removeListener(listener: EventChannelListener): void;\n}\n\n/**\n * API for adding and removing listeners for request blocking events.\n *\n * Wraps {@link defaultFilteringLog} {@link EventChannel} for {@link ApplyBasicRuleEvent}\n */\nexport class RequestBlockingLogger implements RequestBlockingLoggerInterface {\n private channel = new EventChannel();\n\n constructor() {\n this.onBasicRuleApply = this.onBasicRuleApply.bind(this);\n defaultFilteringLog.addEventListener(FilteringEventType.ApplyBasicRule, this.onBasicRuleApply);\n }\n\n // map public API to event channel\n\n public addListener(listener: EventChannelListener): void {\n this.channel.subscribe(listener);\n }\n\n public removeListener(listener: EventChannelListener): void {\n this.channel.unsubscribe(listener);\n }\n\n /**\n * Handles {@link ApplyBasicRuleEvent}, gets extra data for {@link requestContextStorage}\n * and dispatch new {@link RequestBlockingEvent}\n *\n * @param event - {@link ApplyBasicRuleEvent}\n */\n private onBasicRuleApply(event: ApplyBasicRuleEvent): void {\n const { eventId, rule, tabId } = event.data;\n\n // exclude allowlist rules\n if (rule.isAllowlist()) {\n return;\n }\n\n const requestContext = requestContextStorage.get(eventId);\n\n if (!requestContext) {\n return;\n }\n\n const { requestUrl, contentType, referrerUrl } = requestContext;\n\n this.channel.dispatch({\n tabId,\n rule: rule.getText(),\n filterId: rule.getFilterListId(),\n requestUrl,\n referrerUrl,\n requestType: contentType,\n });\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n/**\n * Simple API for logging\n */\nexport class Logger {\n private api = console;\n\n public info(...args: unknown[]): void {\n this.api.log(...args);\n }\n\n public error(...args: unknown[]): void {\n this.api.error(...args);\n }\n\n public warn(...args: unknown[]): void {\n this.api.warn(...args);\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\nexport const API_OUTPUT = \"adguard-api\";\nexport const CONTENT_SCRIPT_OUTPUT = \"adguard-content\";\nexport const ASSISTANT_OUTPUT = \"adguard-assistant\";\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport browser, { Runtime } from \"webextension-polyfill\";\nimport {\n TsWebExtension,\n ConfigurationMV2 as TsWebExtensionConfiguration,\n EventChannel,\n MESSAGE_HANDLER_NAME,\n Message,\n} from \"@adguard/tswebextension\";\n\nimport { Network } from \"./network\";\nimport { Storage } from \"./storage\";\nimport { FiltersApi, FiltersUpdateService, LocaleDetectService } from \"./filters\";\nimport { Configuration, configurationValidator } from \"./schemas\";\nimport { DetectFiltersEvent, notifier, NotifierEventType } from \"./notifier\";\nimport { RequestBlockingLogger } from \"./request-blocking-logger\";\nimport { Logger } from \"./logger\";\n\nimport { ASSISTANT_OUTPUT } from \"../../constants\";\n\n/**\n * By the rules of Firefox AMO we cannot use remote scripts (and our JS rules can be counted as such).\n * Because of that we use the following approach (that was accepted by AMO reviewers):\n *\n * 1. We pre-build JS rules from AdGuard filters into the JSON file.\n * 2. At runtime we check every JS rule if it's included into JSON.\n * If it is included we allow this rule to work since it's pre-built. Other rules are discarded.\n * 3. We also allow \"User rules\" to work since those rules are added manually by the user.\n * This way filters maintainers can test new rules before including them in the filters.\n */\nimport localScriptRules from \"../local_script_rules.json\";\n\nexport const WEB_ACCESSIBLE_RESOURCES_PATH = \"adguard\";\n\n/**\n * AdGuard API is filtering library, provided following features:\n * - request and content filtering, using {@link TsWebExtension}\n * - filters rules downloading and caching via {@link FiltersApi}\n * - filters rules auto updates via {@link filtersUpdateService}\n * - content blocking via AdGuard Assistant UI, provided by {@link TsWebExtension}\n * - auto detecting language filters via {@link localeDetectService}\n * - logging request processing via filtering events api, provided by {@link TsWebExtension}\n */\nexport class AdguardApi {\n // Engine instance\n private tswebextension: TsWebExtension;\n\n // Network requests API\n private network: Network;\n\n // API for managing filters data\n private filtersApi: FiltersApi;\n\n // Service for scheduling filters rules updates\n private filtersUpdateService: FiltersUpdateService;\n\n // Service for auto-enabling language-specific filters.\n private localeDetectService: LocaleDetectService;\n\n // AdguardApi configuration\n private configuration: Configuration | undefined;\n\n // Simple Api for logging\n private logger: Logger;\n\n /**\n * {@link TsWebExtension} {@link EventChannel}, which fires event on assistant rule creation.\n */\n public onAssistantCreateRule: EventChannel;\n\n /**\n * API for adding and removing listeners for request blocking events.\n *\n */\n public onRequestBlocked = new RequestBlockingLogger();\n\n constructor() {\n this.tswebextension = new TsWebExtension(WEB_ACCESSIBLE_RESOURCES_PATH);\n\n // TODO: load only in ff\n this.tswebextension.setLocalScriptRules(localScriptRules);\n\n this.onAssistantCreateRule = this.tswebextension.onAssistantCreateRule;\n\n this.network = new Network();\n\n const storage = new Storage();\n\n this.logger = new Logger();\n\n this.filtersApi = new FiltersApi(this.network, storage, this.logger);\n\n this.filtersUpdateService = new FiltersUpdateService(this.filtersApi);\n\n this.localeDetectService = new LocaleDetectService(this.filtersApi);\n\n this.handleMessage = this.handleMessage.bind(this);\n this.openAssistant = this.openAssistant.bind(this);\n this.handleDetectFilters = this.handleDetectFilters.bind(this);\n this.handleUpdateFilters = this.handleUpdateFilters.bind(this);\n }\n\n /**\n * Initializes AdGuard with specified {@link Configuration} and starts it immediately.\n *\n * @param configuration - api {@link Configuration}\n * @returns applied {@link Configuration} promise\n */\n public async start(configuration: Configuration): Promise {\n this.configuration = configurationValidator.parse(configuration);\n\n this.network.configure(this.configuration);\n\n browser.runtime.onMessage.addListener(this.handleMessage);\n\n await this.filtersApi.init();\n this.filtersUpdateService.start();\n this.localeDetectService.start();\n\n notifier.addListener(NotifierEventType.UpdateFilters, this.handleUpdateFilters);\n notifier.addListener(NotifierEventType.DetectFilters, this.handleDetectFilters);\n\n const tsWebExtensionConfiguration = await this.createTsWebExtensionConfiguration();\n\n await this.tswebextension.start(tsWebExtensionConfiguration);\n\n return configuration;\n }\n\n /**\n * Completely stops AdGuard\n */\n public async stop(): Promise {\n await this.tswebextension.stop();\n this.filtersUpdateService.stop();\n this.localeDetectService.stop();\n\n browser.runtime.onMessage.removeListener(this.handleMessage);\n }\n\n /**\n * Modifies AdGuard {@link Configuration}. Please note, that Adguard must be already started.\n *\n * @param configuration - api {@link Configuration}\n * @returns applied {@link Configuration} promise\n */\n public async configure(configuration: Configuration): Promise {\n this.configuration = configurationValidator.parse(configuration);\n\n this.network.configure(this.configuration);\n\n const tsWebExtensionConfiguration = await this.createTsWebExtensionConfiguration();\n\n await this.tswebextension.configure(tsWebExtensionConfiguration);\n\n return configuration;\n }\n\n /**\n * Opens the AdGuard assistant UI in the specified tab.\n * You should also subscribe on {@link onAssistantCreateRule} event channel for applying rules,\n * which are created by the Adguard assistant.\n *\n * @param tabId - {@link browser.tabs.Tab } id. @see https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab\n */\n public async openAssistant(tabId: number): Promise {\n await this.tswebextension.openAssistant(tabId);\n }\n\n /**\n * Closes AdGuard assistant in the specified tab.\n *\n * @param tabId - {@link browser.tabs.Tab } id. @see https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab\n */\n public async closeAssistant(tabId: number): Promise {\n await this.tswebextension.closeAssistant(tabId);\n }\n\n /**\n * Gets current loaded rules count\n *\n * @returns rules count number\n */\n public getRulesCount(): number {\n return this.tswebextension.getRulesCount();\n }\n\n /**\n * Creates {@link TsWebExtension} configuration based on current API {@link configuration}.\n *\n * @returns - {@link TsWebExtension} configuration\n */\n private async createTsWebExtensionConfiguration(): Promise {\n if (!this.configuration) {\n throw new Error(\"Api configuration is not set\");\n }\n\n let allowlistInverted = false;\n let allowlist: string[] = [];\n\n if (this.configuration.blocklist) {\n allowlist = this.configuration.blocklist;\n allowlistInverted = true;\n } else if (this.configuration.allowlist) {\n allowlist = this.configuration.allowlist;\n }\n\n const userrules = this.configuration.rules || [];\n\n const filters = await this.filtersApi.getFilters(this.configuration.filters);\n\n return {\n filters,\n allowlist,\n trustedDomains: [],\n userrules,\n verbose: false,\n settings: {\n assistantUrl: `${ASSISTANT_OUTPUT}.js`,\n filteringEnabled: true,\n stealthModeEnabled: true,\n collectStats: false,\n allowlistInverted,\n allowlistEnabled: true,\n stealth: {\n blockChromeClientData: false,\n hideReferrer: false,\n hideSearchQueries: false,\n sendDoNotTrack: false,\n blockWebRTC: false,\n selfDestructThirdPartyCookies: true,\n selfDestructThirdPartyCookiesTime: 3600,\n selfDestructFirstPartyCookies: true,\n selfDestructFirstPartyCookiesTime: 3600,\n },\n },\n };\n }\n\n /**\n * Handles messages from {@link TsWebExtension} content-script\n *\n * @param message - {@link TsWebExtension} extension {@link Message}\n * @param sender - extension {@link Runtime.MessageSender}\n * @returns TsWebExtension message handler response\n */\n // eslint-disable-next-line consistent-return\n private async handleMessage(message: Message, sender: Runtime.MessageSender): Promise {\n if (message?.handlerName === MESSAGE_HANDLER_NAME) {\n const handler = this.tswebextension.getMessageHandler();\n\n return handler(message, sender);\n }\n }\n\n /**\n * Handles fired {@link UpdateFiltersEvent}\n */\n private async handleUpdateFilters(): Promise {\n const tsWebExtensionConfig = await this.createTsWebExtensionConfiguration();\n\n await this.tswebextension.configure(tsWebExtensionConfig);\n\n this.logger.info(\"Reload engine with updated filter ids list\");\n }\n\n /**\n * Handles fired {@link DetectFiltersEvent}\n *\n * @param event - fired {@link DetectFiltersEvent}\n */\n private async handleDetectFilters(event: DetectFiltersEvent): Promise {\n if (!this.configuration) {\n throw new Error(\"Api configuration is not set\");\n }\n\n const { filters: currentFilters } = this.configuration;\n\n const filtersIds = event.data.filtersIds.filter((id) => !currentFilters.includes(id));\n\n if (filtersIds.length === 0) {\n return;\n }\n\n this.configuration.filters = [...this.configuration.filters, ...filtersIds];\n\n this.logger.info(`Add language filters ids: ${filtersIds}`);\n\n await this.handleUpdateFilters();\n }\n\n /**\n * Creates new adguardApi instance\n *\n * @returns AdguardApi instance\n */\n public static create(): AdguardApi {\n return new AdguardApi();\n }\n}\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\n// API entry point\n\n// API Configuration type\nexport type { Configuration } from \"./schemas\";\n\n// Request blocking event type\nexport type { RequestBlockingEvent } from \"./request-blocking-logger\";\n\n// Public interface\nexport { AdguardApi } from \"./main\";\n"],"names":["Version","compare","version","i","MAX_LENGTH","leftPart","data","rightPart","Error","constructor","parts","String","split","part","Number","isNaN","parseInt","Math","max","BrowserUtils","isGreaterOrEqualsVersion","leftVersion","rightVersion","left","right","UserAgent","isTargetBrowser","browserName","navigator","brand","browserDataMap","uaStringName","brandsData","userAgentData","brands","userAgent","indexOf","length","Chrome","Firefox","Safari","Opera","YaBrowser","Edge","EdgeChromium","isChrome","isFirefox","isOpera","isEdge","I18n","find","locales","locale","lang","replace","includes","localePart","zod","configurationValidator","object","filters","number","array","allowlist","string","optional","blocklist","rules","filtersMetadataUrl","filterRulesUrl","filterMetadataValidator","description","displayNumber","expires","filterId","groupId","homepage","languages","name","subscriptionUrl","tags","timeAdded","timeUpdated","trustLevel","tagMetadataValidator","tagId","keyword","groupMetadataValidator","groupName","metadataValidator","groups","SchemaPreprocessor","castStringToNumber","value","castStringToBoolean","Boolean","JSON","parse","e","booleanValidator","preprocess","boolean","numberValidator","filterVersionDataValidator","lastCheckTime","lastUpdateTime","filterVersionStorageDataValidator","record","FiltersDownloader","Network","configure","configuration","downloadFilterRules","url","download","filterCompilerConditionsConstants","downloadFiltersMetadata","response","fetch","metadata","json","adguard","adguard_ext_chromium","adguard_ext_firefox","adguard_ext_edge","adguard_ext_safari","adguard_ext_opera","browser","Storage","set","key","storage","get","remove","local","METADATA_STORAGE_KEY","MetadataApi","init","storageData","loadMetadata","logger","warn","network","stringify","error","getFiltersMetadata","getFilterMetadata","el","FILTERS_VERSIONS_KEY","VersionsApi","loadDefaultData","versions","getInstalledFilters","Object","keys","map","id","saveData","FilterRulesApi","getFilterKey","NotifierEventType","DetectFilters","UpdateFilters","Notifier","addListener","type","listener","listenersMap","push","removeListener","listeners","filter","publishEvent","event","forEach","notifier","FiltersApi","metadataApi","versionsApi","getFilters","filterIds","tasks","getFilter","Promise","all","filterRulesApi","Array","isArray","loadFilterRules","content","join","trusted","updateFilters","info","ids","updateTasks","updateFilter","updatedFilters","some","filterData","filterMetadata","console","isFilterNeedUpdate","filterVersion","Date","getTime","now","getFilterIdsForLanguage","language","FiltersUpdateService","start","delayTimerId","window","setTimeout","scheduleUpdate","initDelay","stop","clearTimeout","updateTimerId","api","checkPeriodMs","isHttpRequest","getDomain","LocaleDetectService","tabs","onUpdated","onTabUpdated","enabledFilters","_tabId","_changeInfo","tab","status","detectTabLanguage","detectLanguage","host","tld","at","domainToLanguagesMap","browsingLanguages","time","MAX_HISTORY_LENGTH","shift","history","h","SUCCESS_HIT_COUNT","filtersApi","onFilterDetectedByLocale","filtersIds","bind","ru","ua","by","kz","com","au","uk","nz","de","jp","nl","fr","es","it","pt","pl","cz","bg","lt","lv","eg","dz","kw","ae","sk","ro","fi","is","no","gr","hu","il","cn","tr","defaultFilteringLog","EventChannel","FilteringEventType","requestContextStorage","RequestBlockingLogger","channel","subscribe","unsubscribe","onBasicRuleApply","eventId","rule","tabId","isAllowlist","requestContext","requestUrl","contentType","referrerUrl","dispatch","getText","getFilterListId","requestType","addEventListener","ApplyBasicRule","Logger","args","log","API_OUTPUT","CONTENT_SCRIPT_OUTPUT","ASSISTANT_OUTPUT","TsWebExtension","MESSAGE_HANDLER_NAME","localScriptRules","WEB_ACCESSIBLE_RESOURCES_PATH","AdguardApi","runtime","onMessage","handleMessage","filtersUpdateService","localeDetectService","handleUpdateFilters","handleDetectFilters","tsWebExtensionConfiguration","createTsWebExtensionConfiguration","tswebextension","openAssistant","closeAssistant","getRulesCount","allowlistInverted","userrules","trustedDomains","verbose","settings","assistantUrl","filteringEnabled","stealthModeEnabled","collectStats","allowlistEnabled","stealth","blockChromeClientData","hideReferrer","hideSearchQueries","sendDoNotTrack","blockWebRTC","selfDestructThirdPartyCookies","selfDestructThirdPartyCookiesTime","selfDestructFirstPartyCookies","selfDestructFirstPartyCookiesTime","message","sender","handlerName","handler","getMessageHandler","tsWebExtensionConfig","currentFilters","create","onAssistantCreateRule","onRequestBlocked","setLocalScriptRules"],"sourceRoot":""} \ No newline at end of file diff --git a/packages/adguard-api/dist/adguard-assistant.js b/packages/adguard-api/dist/adguard-assistant.js index 5a455ff93..e8211b36d 100644 --- a/packages/adguard-api/dist/adguard-assistant.js +++ b/packages/adguard-api/dist/adguard-assistant.js @@ -3934,7 +3934,7 @@ var assistant = {exports: {}}; init: init }; } - const package_namespaceObject = {"i8":"4.3.69"}; + const package_namespaceObject = {"i8":"4.3.70"}; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -4175,16 +4175,18 @@ var assistant = {exports: {}}; return __nested_webpack_exports__; })() ; - }); + }); } (assistant)); +var assistantExports = assistant.exports; + /** * @file * In this file we doing only lazy-load assistant and save it to the global * scope of the current content-script. */ if (!window.adguardAssistant) { - window.adguardAssistant = assistant.exports.adguardAssistant(); + window.adguardAssistant = assistantExports.adguardAssistant(); } diff --git a/packages/adguard-api/dist/adguard-assistant.js.map b/packages/adguard-api/dist/adguard-assistant.js.map index 9594a019b..7458ccbf6 100644 --- a/packages/adguard-api/dist/adguard-assistant.js.map +++ b/packages/adguard-api/dist/adguard-assistant.js.map @@ -1 +1 @@ -{"version":3,"file":"adguard-assistant.js","mappings":"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ACN;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,cAAc;AACpE;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB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I;AACJ;AACA,YAAY,iCAAmB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,iCAAmB;AAC7E;AACA;AACA;AACA,IAAI,iCAAmB;AACvB;AACA;AACA;AACA,KAAK,iCAAmB,aAAa,WAAW;AAChD;AACA;AACA,IAAI;AACJ;AACA,IAAI,iCAAmB;AACvB;AACA,SAAS,iCAAmB,wBAAwB,iCAAmB;AACvE,6CAA6C,wCAAwC;AACrF;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI,iCAAmB;AACvB,IAAI;AACJ;AACA,IAAI,iCAAmB;AACvB;AACA,2DAA2D,iBAAiB;AAC5E;AACA,oDAAoD,aAAa;AACjE;AACA,IAAI;AACJ,KAAK,0BAAmB;AACxB;AACA,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C;AACA,EAAE;AACF,mDAAmD,0CAA0C;AAC7F,6CAA6C,gBAAgB,kBAAkB,OAAO,2BAA2B,wDAAwD,gCAAgC,uDAAuD;AAChQ,+DAA+D,sEAAsE,8DAA8D;AACnM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,2BAA2B,2EAA2E,kCAAkC,wBAAwB,OAAO,kCAAkC,mIAAmI;AACrW;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,iCAAiC,MAAM;AACvC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,aAAa;AACtF;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,0CAA0C;AAC1G,0DAA0D,gBAAgB,kBAAkB,OAAO,2BAA2B,wDAAwD,gCAAgC,uDAAuD;AAC7Q,4EAA4E,mFAAmF,2EAA2E;AAC1O;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA,gBAAgB;AAChB,iCAAiC,2BAA2B,2EAA2E,0CAA0C,wBAAwB,OAAO,0CAA0C,mIAAmI;AAC7X;AACA;AACA;AACA;AACA;AACA,uFAAuF,EAAE;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAmB;AAC3C,sBAAsB,iCAAmB;AACzC,gBAAgB,iCAAmB;AACnC,wBAAwB,iCAAmB;AAC3C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C,kBAAkB,iCAAmB;AACrC,0BAA0B,iCAAmB;AAC7C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C,mBAAmB,iCAAmB;AACtC,2BAA2B,iCAAmB;AAC9C,kBAAkB,iCAAmB;AACrC,0BAA0B,iCAAmB;AAC7C,mBAAmB,iCAAmB;AACtC,2BAA2B,iCAAmB;AAC9C,qBAAqB,iCAAmB;AACxC,6BAA6B,iCAAmB;AAChD,YAAY,iCAAmB;AAC/B,oBAAoB,iCAAmB;AACvC,gBAAgB,iCAAmB;AACnC,wBAAwB,iCAAmB;AAC3C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,+BAA+B;AAC/B,0CAA0C,gFAAgF,eAAe,eAAe,gBAAgB,oBAAoB,MAAM,0CAA0C,+BAA+B,aAAa,qBAAqB,uCAAuC,cAAc,WAAW,YAAY,UAAU,MAAM,mDAAmD,UAAU,sBAAsB;AAC5d,iCAAiC;AACjC,oCAAoC;AACpC,iCAAiC;AACjC,mDAAmD,gBAAgB,gEAAgE,wDAAwD,6DAA6D,sDAAsD;AAC9S,mCAAmC;AACnC,oCAAoC;AACpC,wCAAwC,uDAAuD,uCAAuC,SAAS,OAAO,oBAAoB;AAC1K;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,gBAAgB,iCAAmB;AACnC;AACA;AACA;AACA;AACA,oBAAoB,iCAAmB;AACvC;AACA;AACA,EAAE,IAAI;AACN;AACA,qCAAqC,2BAA2B,2EAA2E,8CAA8C,wBAAwB,OAAO,8CAA8C,mIAAmI;AACzY,+CAA+C;AAC/C,2CAA2C;AAC3C,+DAA+D,gBAAgB,4EAA4E,wDAAwD,6DAA6D,sDAAsD;AACtU,oDAAoD,uDAAuD,uCAAuC,SAAS,OAAO,oBAAoB;AACtL,sDAAsD,gFAAgF,eAAe,eAAe,gBAAgB,oBAAoB,MAAM,0CAA0C,+BAA+B,aAAa,qBAAqB,uCAAuC,cAAc,WAAW,YAAY,UAAU,MAAM,mDAAmD,UAAU,sBAAsB;AACxe,6CAA6C;AAC7C,4BAA4B,iCAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,2DAA2D,EAAE;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,2BAA2B,2EAA2E,kDAAkD,wBAAwB,OAAO,kDAAkD,mIAAmI;AACrZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,8BAA8B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA,QAAQ;AACR;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA,yBAAyB,sDAAsD;AAC/E;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gCAAgC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,8EAA8E,kBAAkB,mBAAmB;AACrL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,4CAA4C,gCAAgC,oCAAoC,oDAAoD,8DAA8D,iEAAiE,GAAG,kCAAkC;AACxU,kCAAkC,gBAAgB,sBAAsB,OAAO,uDAAuD,aAAa,uDAAuD,4CAA4C,KAAK,6CAA6C,6EAA6E,OAAO,iDAAiD,mFAAmF,OAAO;AACvgB,6CAA6C,kBAAkB,kCAAkC,oEAAoE,KAAK,OAAO,oBAAoB;AACrM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA,MAAM;AACN;AACA;AACA,6CAA6C;AAC7C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA,qBAAqB,8BAA8B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,UAAU,0BAAmB;AAC7B,GAAG;AACH;AACA,EAAE;AACF,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;UC3kIA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;ACNA;;;;;;;;;;;;;;;;CAgBC,GACiD","sources":["webpack://@adguard/api/webpack/universalModuleDefinition","webpack://@adguard/api/../tswebextension/dist/assistant-inject.js","webpack://@adguard/api/webpack/bootstrap","webpack://@adguard/api/webpack/runtime/compat get default export","webpack://@adguard/api/webpack/runtime/define property getters","webpack://@adguard/api/webpack/runtime/hasOwnProperty shorthand","webpack://@adguard/api/webpack/runtime/make namespace object","webpack://@adguard/api/./src/content-script/assistant.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","var assistant = {exports: {}};\n\n(function (module, exports) {\n\t(function webpackUniversalModuleDefinition(root, factory) {\n\t\tmodule.exports = factory();\n\t})(self, () => {\n\treturn (() => {\n\t \tvar __webpack_modules__ = ({\n\t 1503:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\tvar map = {\n\t\t\"./ar/messages.json\": 5443,\n\t\t\"./be/messages.json\": 24,\n\t\t\"./cs/messages.json\": 3337,\n\t\t\"./da/messages.json\": 7691,\n\t\t\"./de/messages.json\": 9947,\n\t\t\"./el/messages.json\": 1773,\n\t\t\"./en/messages.json\": 1272,\n\t\t\"./es/messages.json\": 8194,\n\t\t\"./fa/messages.json\": 5455,\n\t\t\"./fi/messages.json\": 6183,\n\t\t\"./fr/messages.json\": 4652,\n\t\t\"./he/messages.json\": 6514,\n\t\t\"./hi/messages.json\": 1996,\n\t\t\"./hr/messages.json\": 2178,\n\t\t\"./hu/messages.json\": 2698,\n\t\t\"./id/messages.json\": 710,\n\t\t\"./it/messages.json\": 7294,\n\t\t\"./ja/messages.json\": 9265,\n\t\t\"./ko/messages.json\": 1474,\n\t\t\"./lt/messages.json\": 8612,\n\t\t\"./nl/messages.json\": 8967,\n\t\t\"./no/messages.json\": 6251,\n\t\t\"./pl/messages.json\": 1549,\n\t\t\"./pt-PT/messages.json\": 1902,\n\t\t\"./pt/messages.json\": 9274,\n\t\t\"./ro/messages.json\": 6090,\n\t\t\"./ru/messages.json\": 3999,\n\t\t\"./sk/messages.json\": 89,\n\t\t\"./sl/messages.json\": 6058,\n\t\t\"./sr/messages.json\": 9177,\n\t\t\"./sv/messages.json\": 6105,\n\t\t\"./tr/messages.json\": 147,\n\t\t\"./uk/messages.json\": 1249,\n\t\t\"./vi/messages.json\": 4534,\n\t\t\"./zh-HK/messages.json\": 3476,\n\t\t\"./zh-TW/messages.json\": 5480,\n\t\t\"./zh/messages.json\": 8868\n\t};\n\tfunction webpackContext(req) {\n\t\tvar id = webpackContextResolve(req);\n\t\treturn __webpack_require__(id);\n\t}\n\tfunction webpackContextResolve(req) {\n\t\tif(!__webpack_require__.o(map, req)) {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t}\n\t\treturn map[req];\n\t}\n\twebpackContext.keys = function webpackContextKeys() {\n\t\treturn Object.keys(map);\n\t};\n\twebpackContext.resolve = webpackContextResolve;\n\tmodule.exports = webpackContext;\n\twebpackContext.id = 1503;\n\t }),\n\t 14:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\tfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\tfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\tfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\tfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\tfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\tvar _require = __webpack_require__(897),\n\t _require2 = _slicedToArray(_require, 1),\n\t _require2$ = _require2[0],\n\t BASE_LOCALE = _require2$.base_locale,\n\t PROJECT_ID = _require2$.project_id,\n\t LANGUAGES = _require2$.languages,\n\t LOCALIZABLE_FILES = _require2$.localizable_files;\n\tvar LOCALES_EQUIVALENTS_MAP = {\n\t 'pt-BR': 'pt',\n\t 'zh-CN': 'zh'\n\t};\n\tmodule.exports = {\n\t LOCALES_EQUIVALENTS_MAP: LOCALES_EQUIVALENTS_MAP,\n\t BASE_LOCALE: BASE_LOCALE,\n\t PROJECT_ID: PROJECT_ID,\n\t LANGUAGES: LANGUAGES,\n\t LOCALIZABLE_FILES: LOCALIZABLE_FILES\n\t};\n\t }),\n\t 4123:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(2668);\n\tvar ___CSS_LOADER_URL_IMPORT_1___ = __webpack_require__(1823);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n\texports.push([module.id, \"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\\n/**\\n * 1. Set default font family to sans-serif.\\n * 2. Prevent iOS text size adjust after orientation change, without disabling\\n * user zoom.\\n */\\nhtml {\\n font-family: sans-serif;\\n /* 1 */\\n -ms-text-size-adjust: 100%;\\n /* 2 */\\n -webkit-text-size-adjust: 100%;\\n /* 2 */\\n}\\n/**\\n * Remove default margin.\\n */\\nbody {\\n margin: 0;\\n}\\n/* HTML5 display definitions\\n========================================================================== */\\n/**\\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\\n * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\\n * Correct `block` display not defined for `main` in IE 11.\\n */\\narticle,\\naside,\\ndetails,\\nfigcaption,\\nfigure,\\nfooter,\\nheader,\\nhgroup,\\nmain,\\nnav,\\nsection,\\nsummary {\\n display: block;\\n}\\n/**\\n * 1. Correct `inline-block` display not defined in IE 8/9.\\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\\n */\\naudio,\\ncanvas,\\nprogress,\\nvideo {\\n display: inline-block;\\n /* 1 */\\n vertical-align: baseline;\\n /* 2 */\\n}\\n/**\\n * Prevent modern browsers from displaying `audio` without controls.\\n * Remove excess height in iOS 5 devices.\\n */\\naudio:not([controls]) {\\n display: none;\\n height: 0;\\n}\\n/**\\n * Address `[hidden]` styling not present in IE 8/9/10.\\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\\n */\\n[hidden],\\ntemplate {\\n display: none;\\n}\\n/* Links\\n========================================================================== */\\n/**\\n * Remove the gray background color from active links in IE 10.\\n */\\na {\\n background: transparent;\\n}\\n/**\\n * Improve readability when focused and also mouse hovered in all browsers.\\n */\\na:active,\\na:hover {\\n outline: 0;\\n}\\n/* Text-level semantics\\n========================================================================== */\\n/**\\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\\n */\\nabbr[title] {\\n border-bottom: 1px dotted;\\n}\\n/**\\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\\n */\\nb,\\nstrong {\\n font-weight: bold;\\n}\\n/**\\n * Address styling not present in Safari and Chrome.\\n */\\ndfn {\\n font-style: italic;\\n}\\n/**\\n * Address variable `h1` font-size and margin within `section` and `article`\\n * contexts in Firefox 4+, Safari, and Chrome.\\n */\\nh1 {\\n font-size: 2em;\\n margin: 0.67em 0;\\n}\\n/**\\n * Address styling not present in IE 8/9.\\n */\\nmark {\\n background: #ff0;\\n color: #000;\\n}\\n/**\\n * Address inconsistent and variable font size in all browsers.\\n */\\nsmall {\\n font-size: 80%;\\n}\\n/**\\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\\n */\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\nsup {\\n top: -0.5em;\\n}\\nsub {\\n bottom: -0.25em;\\n}\\n/* Embedded content\\n========================================================================== */\\n/**\\n * Remove border when inside `a` element in IE 8/9/10.\\n */\\nimg {\\n border: 0;\\n}\\n/**\\n * Correct overflow not hidden in IE 9/10/11.\\n */\\nsvg:not(:root) {\\n overflow: hidden;\\n}\\n/* Grouping content\\n========================================================================== */\\n/**\\n * Address margin not present in IE 8/9 and Safari.\\n */\\nfigure {\\n margin: 1em 40px;\\n}\\n/**\\n * Address differences between Firefox and other browsers.\\n */\\nhr {\\n -moz-box-sizing: content-box;\\n box-sizing: content-box;\\n height: 0;\\n}\\n/**\\n * Contain overflow in all browsers.\\n */\\npre {\\n overflow: auto;\\n}\\n/**\\n * Address odd `em`-unit font size rendering in all browsers.\\n */\\ncode,\\nkbd,\\npre,\\nsamp {\\n font-family: monospace, monospace;\\n font-size: 1em;\\n}\\n/* Forms\\n========================================================================== */\\n/**\\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\\n * styling of `select`, unless a `border` property is set.\\n */\\n/**\\n * 1. Correct color not being inherited.\\n * Known issue: affects color of disabled elements.\\n * 2. Correct font properties not being inherited.\\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\\n */\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n color: inherit;\\n /* 1 */\\n font: inherit;\\n /* 2 */\\n margin: 0;\\n /* 3 */\\n}\\n/**\\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\\n */\\nbutton {\\n overflow: visible;\\n}\\n/**\\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\\n * All other form control elements do not inherit `text-transform` values.\\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\\n * Correct `select` style inheritance in Firefox.\\n */\\nbutton,\\nselect {\\n text-transform: none;\\n}\\n/**\\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\\n * and `video` controls.\\n * 2. Correct inability to style clickable `input` types in iOS.\\n * 3. Improve usability and consistency of cursor style between image-type\\n * `input` and others.\\n */\\nbutton,\\nhtml input[type=\\\"button\\\"],\\ninput[type=\\\"reset\\\"],\\ninput[type=\\\"submit\\\"] {\\n -webkit-appearance: button;\\n /* 2 */\\n cursor: pointer;\\n /* 3 */\\n}\\n/**\\n * Re-set default cursor for disabled elements.\\n */\\nbutton[disabled],\\nhtml input[disabled] {\\n cursor: default;\\n}\\n/**\\n * Remove inner padding and border in Firefox 4+.\\n */\\nbutton::-moz-focus-inner,\\ninput::-moz-focus-inner {\\n border: 0;\\n padding: 0;\\n}\\n/**\\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\\n * the UA stylesheet.\\n */\\ninput {\\n line-height: normal;\\n}\\n/**\\n * It's recommended that you don't attempt to style these elements.\\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\\n *\\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\\n * 2. Remove excess padding in IE 8/9/10.\\n */\\ninput[type=\\\"checkbox\\\"],\\ninput[type=\\\"radio\\\"] {\\n box-sizing: border-box;\\n /* 1 */\\n padding: 0;\\n /* 2 */\\n}\\n/**\\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\\n * `font-size` values of the `input`, it causes the cursor style of the\\n * decrement button to change from `default` to `text`.\\n */\\ninput[type=\\\"number\\\"]::-webkit-inner-spin-button,\\ninput[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n height: auto;\\n}\\n/**\\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\\n * (include `-moz` to future-proof).\\n */\\ninput[type=\\\"search\\\"] {\\n -webkit-appearance: textfield;\\n /* 1 */\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n /* 2 */\\n box-sizing: content-box;\\n}\\n/**\\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\\n * Safari (but not Chrome) clips the cancel button when the search input has\\n * padding (and `textfield` appearance).\\n */\\ninput[type=\\\"search\\\"]::-webkit-search-cancel-button,\\ninput[type=\\\"search\\\"]::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n/**\\n * Define consistent border, margin, and padding.\\n */\\nfieldset {\\n border: 1px solid #c0c0c0;\\n margin: 0 2px;\\n padding: 0.35em 0.625em 0.75em;\\n}\\n/**\\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\\n */\\nlegend {\\n border: 0;\\n /* 1 */\\n padding: 0;\\n /* 2 */\\n}\\n/**\\n * Remove default vertical scrollbar in IE 8/9/10/11.\\n */\\ntextarea {\\n overflow: auto;\\n}\\n/**\\n * Don't inherit the `font-weight` (applied by a rule above).\\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\\n */\\noptgroup {\\n font-weight: bold;\\n}\\n/* Tables\\n========================================================================== */\\n/**\\n * Remove most spacing between table cells.\\n */\\ntable {\\n border-collapse: collapse;\\n border-spacing: 0;\\n}\\ntd,\\nth {\\n padding: 0;\\n}\\n* {\\n box-sizing: border-box;\\n}\\n*:after,\\n*:before {\\n box-sizing: border-box;\\n}\\nhtml {\\n font-size: 10px;\\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\nbody {\\n position: relative;\\n font-size: 1.3rem;\\n line-height: 1.42857143;\\n background-color: #e6e6e6;\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 400;\\n overflow-y: hidden;\\n}\\nbutton,\\ninput,\\nselect,\\ntextarea {\\n font-family: inherit;\\n font-size: inherit;\\n line-height: inherit;\\n outline: none;\\n border-radius: 0;\\n box-shadow: none;\\n}\\na {\\n color: #36ba53;\\n text-decoration: underline;\\n outline: 0;\\n}\\na:hover {\\n color: #257f39;\\n text-decoration: underline;\\n}\\nfigure {\\n margin: 0;\\n}\\nimg {\\n vertical-align: middle;\\n max-width: 100%;\\n}\\nform {\\n margin: 0;\\n}\\nfieldset {\\n padding: 0;\\n margin: 0;\\n border: 0;\\n min-width: 0;\\n}\\nlegend {\\n display: block;\\n width: 100%;\\n padding: 0;\\n margin-bottom: 1.57142857;\\n font-size: 21px;\\n line-height: inherit;\\n border: 0;\\n}\\nlabel {\\n display: inline-block;\\n}\\ninput[type=\\\"search\\\"] {\\n box-sizing: border-box;\\n}\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n display: none;\\n}\\ninput[type=\\\"file\\\"]:focus,\\ninput[type=\\\"radio\\\"]:focus,\\ninput[type=\\\"checkbox\\\"]:focus {\\n outline: thin dotted;\\n outline: 5px auto -webkit-focus-ring-color;\\n outline-offset: -2px;\\n}\\n.form-control {\\n display: block;\\n width: 100%;\\n height: 40px;\\n padding: 6px 15px 4px;\\n font-size: 14px;\\n line-height: 22px;\\n box-shadow: inset 0 3px 3px rgba(0, 0, 0, 0.04);\\n}\\n.form-control:focus {\\n border-color: #8c8c8c;\\n outline: 0;\\n}\\n.form-control::-moz-placeholder {\\n color: #777777;\\n opacity: 1;\\n}\\n.form-control:-ms-input-placeholder {\\n color: #777777;\\n}\\n.form-control::-webkit-input-placeholder {\\n color: #777777;\\n}\\n.form-control[disabled],\\n.form-control[readonly],\\nfieldset[disabled] .form-control {\\n cursor: not-allowed;\\n background-color: #fff;\\n opacity: 1;\\n}\\ntextarea.form-control {\\n height: auto;\\n}\\n/*\\n.fieldset.error{\\n .form-control{\\n border-color: @state-danger-text;\\n .placeholder(@state-danger-text);\\n }\\n}\\n*/\\ninput[type=\\\"search\\\"] {\\n -webkit-appearance: none;\\n}\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n line-height: 22px;\\n}\\n.form-group {\\n margin: 23px 0 0;\\n}\\n.form-group:first-child {\\n margin-top: 0;\\n}\\ninput[type=\\\"radio\\\"][disabled],\\ninput[type=\\\"checkbox\\\"][disabled],\\ninput[type=\\\"radio\\\"].disabled,\\ninput[type=\\\"checkbox\\\"].disabled,\\nfieldset[disabled] input[type=\\\"radio\\\"],\\nfieldset[disabled] input[type=\\\"checkbox\\\"] {\\n cursor: not-allowed;\\n}\\n@font-face {\\n font-family: 'Open Sans';\\n src: url('data:application/font-woff;base64,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') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n\\n@font-face {\\n font-family: 'Open Sans';\\n src: url('data:application/font-woff;base64,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') format('woff');\\n font-weight: 600;\\n font-style: normal;\\n}\\n\\n@font-face {\\n font-family: 'Open Sans';\\n src: url('data:application/font-woff;base64,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') format('woff');\\n font-weight: bold;\\n font-style: normal;\\n}\\n\\n.weight-regular {\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 400;\\n}\\n.weight-medium {\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 600;\\n}\\n.weight-bold {\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 700;\\n}\\n.form-ui {\\n position: relative;\\n display: inline-block;\\n vertical-align: top;\\n margin: 0;\\n line-height: 20px;\\n font-weight: 400;\\n cursor: pointer;\\n}\\n.form-ui-control {\\n position: absolute;\\n top: -9999px;\\n left: -9999px;\\n width: 0;\\n height: 0;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n outline: 0 none;\\n}\\n.form-ui-txt {\\n position: relative;\\n display: inline-block;\\n vertical-align: top;\\n padding: 2px 0 0 30px;\\n}\\n.form-ui-txt:before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 22px;\\n height: 22px;\\n}\\n.form-ui-txt:after {\\n content: '';\\n position: absolute;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n border-radius: 50%;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:after {\\n top: 7px;\\n left: 7px;\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n}\\ninput[type=\\\"radio\\\"]:disabled + .form-ui .form-ui-txt:before {\\n background: #f2f2f2;\\n opacity: 0.6;\\n}\\ninput[type=\\\"radio\\\"]:disabled + .form-ui .form-ui-txt:after {\\n opacity: 0.6;\\n}\\ninput[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:after {\\n top: 7px;\\n left: 5px;\\n width: 13px;\\n height: 6px;\\n border-bottom: 2px solid transparent;\\n border-left: 2px solid transparent;\\n transform: rotate(-45deg);\\n}\\ninput[type=\\\"checkbox\\\"]:disabled + .form-ui .form-ui-txt:before {\\n opacity: 0.6;\\n}\\ninput[type=\\\"checkbox\\\"]:disabled + .form-ui .form-ui-txt:after {\\n opacity: 0.6;\\n}\\n.btn {\\n display: inline-block;\\n margin-bottom: 0;\\n padding: 10px 20px;\\n font-size: 13px;\\n line-height: 18px;\\n text-align: center;\\n text-decoration: none;\\n vertical-align: middle;\\n cursor: pointer;\\n background-image: none;\\n border: 1px solid transparent;\\n white-space: nowrap;\\n user-select: none;\\n}\\n.btn:hover {\\n color: #000;\\n text-decoration: none;\\n}\\n.btn:active,\\n.btn.active {\\n outline: none;\\n}\\n.btn:focus {\\n outline: none;\\n box-shadow: inset 0 0 0 1px #fff;\\n}\\n.btn[disabled],\\n.btn.disabled {\\n cursor: default;\\n box-shadow: none;\\n opacity: 0.5;\\n pointer-events: none;\\n}\\n.btn-default {\\n border-color: #58595b;\\n background: #58595b;\\n color: #fff;\\n}\\n.btn-default:hover {\\n border-color: #717275;\\n background: #717275;\\n color: #fff;\\n}\\n.btn-default.active,\\n.btn-default:active {\\n border-color: #717275;\\n background: #717275;\\n}\\n.btn-default.disabled,\\n.btn-default[disabled] {\\n border-color: #58595b;\\n background: #58595b;\\n}\\n@media (max-width: 320px) {\\n .btn-another-el {\\n font-size: 9px;\\n padding-left: 0;\\n padding-right: 0;\\n background-color: transparent;\\n border: 0;\\n color: #000;\\n }\\n .btn-another-el:hover {\\n border-color: transparent;\\n background: transparent;\\n color: #000;\\n }\\n}\\n.btn-lg {\\n font-size: 20px;\\n padding: 14px 24px 12px;\\n}\\n.btn-sm {\\n font-size: 16px;\\n padding-top: 14px;\\n padding-bottom: 14px;\\n}\\n.btn-xs {\\n font-size: 14px;\\n padding-top: 12px;\\n padding-bottom: 12px;\\n}\\n.btn-block {\\n display: block;\\n width: 100%;\\n padding-left: 0;\\n padding-right: 0;\\n}\\n.btn-block + .btn-block {\\n margin-top: 5px;\\n}\\ninput[type=\\\"submit\\\"].btn-block,\\ninput[type=\\\"reset\\\"].btn-block,\\ninput[type=\\\"button\\\"].btn-block {\\n width: 100%;\\n}\\n.btn-upload {\\n position: relative;\\n overflow: hidden;\\n}\\n.btn-upload input[type=file] {\\n position: absolute;\\n top: 0;\\n right: 0;\\n margin: 0;\\n font-size: 600%;\\n line-height: 600%;\\n width: auto;\\n height: auto;\\n opacity: 0;\\n cursor: pointer;\\n}\\n@media (prefers-color-scheme: light) {\\n body {\\n color: #282828;\\n }\\n .main {\\n background: #ffffff;\\n }\\n .main-popup__btn {\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n }\\n .main-popup__btn:hover {\\n background-color: #efefef;\\n }\\n .main-menu__btn {\\n background-color: #ffffff;\\n }\\n .main-menu__btn:hover {\\n background-color: #efefef;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #f3f3f3;\\n }\\n .main-version {\\n color: #dfdfdf;\\n }\\n .head_title {\\n color: #343434;\\n }\\n .head_text {\\n color: #343434;\\n }\\n .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom: 1px solid #36ba53;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom-color: #36ba53;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #e0dfdb;\\n background: #f4f4ef;\\n }\\n .tick {\\n border: 20px solid #ffffff;\\n border-left: 1px solid #ffffff;\\n border-right: 1px solid #ffffff;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") no-repeat 0 0 / cover;\\n opacity: 0.6;\\n }\\n .close:hover {\\n opacity: 0.8;\\n }\\n .form-control {\\n color: #343434;\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n background: #ffffff;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #36ba53;\\n background: #36ba53;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #ffffff;\\n border-left-color: #ffffff;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #e0dfdb;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #e0dfdb;\\n }\\n .btn-primary {\\n border-color: #36ba53;\\n background: #36ba53;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #30a64a;\\n background: #30a64a;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #30a64a;\\n background: #30a64a;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #30a64a;\\n background: #30a64a;\\n }\\n .btn-cancel {\\n border-color: #f3523d;\\n background: #f3523d;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #ee290f;\\n background: #ee290f;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #ee290f;\\n background: #ee290f;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #ee290f;\\n background: #ee290f;\\n }\\n .ui-slider-handle:after {\\n background: #36ba53;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #36ba53;\\n background: #36ba53;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #ffffff;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #36ba53;\\n }\\n .menu-head_title {\\n color: #343434;\\n }\\n .menu-head_text {\\n color: #343434;\\n }\\n .menu-filter_handle {\\n background: #ffffff;\\n }\\n}\\n@media (prefers-color-scheme: dark) {\\n body {\\n color: #ddd;\\n }\\n .main {\\n background: #323232;\\n }\\n .main-popup__btn {\\n background: #323232;\\n border: 1px solid #666;\\n }\\n .main-popup__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn {\\n background-color: #323232;\\n }\\n .main-menu__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #4d4d4d;\\n }\\n .main-version {\\n color: #444;\\n }\\n .head_title {\\n color: #ccc;\\n }\\n .head_text {\\n color: #ccc;\\n }\\n .element-rule_expand-link_txt {\\n color: #67B279;\\n border-bottom: 1px solid #67B279;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #4D995F;\\n border-bottom-color: #4D995F;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #444;\\n background: #555;\\n }\\n .tick {\\n border: 20px solid #323232;\\n border-left: 1px solid #323232;\\n border-right: 1px solid #323232;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") no-repeat 0 0 / cover;\\n opacity: 0.7;\\n }\\n .close:hover {\\n opacity: 1;\\n }\\n .form-control {\\n color: #ccc;\\n background: #323232;\\n border: 1px solid #666;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #666;\\n background: #323232;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #323232;\\n border-left-color: #323232;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #444;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #444;\\n }\\n .btn-primary {\\n border-color: #4D995F;\\n background: #4D995F;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #39774C;\\n background: #39774C;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-cancel {\\n border-color: #8E2C13;\\n background: #8E2C13;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #732613;\\n background: #732613;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #732613;\\n background: #732613;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #732613;\\n background: #732613;\\n }\\n .ui-slider-handle:after {\\n background: #4D995F;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #323232;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #4D995F;\\n }\\n .menu-head_title {\\n color: #ccc;\\n }\\n .menu-head_text {\\n color: #ccc;\\n }\\n .menu-filter_handle {\\n background: #323232;\\n }\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 2571:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(9053);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\texports.push([module.id, \":host {\\n display: block!important;\\n position: relative!important;\\n width: 0!important;\\n height: 0!important;\\n margin: 0!important;\\n padding: 0!important;\\n z-index: 2147483647!important;\\n}\\n:host ::after,\\n:host ::before {\\n display: none!important;\\n}\\n.adguard-assistant-button-main-logo {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") !important;\\n}\\n.adguard-alert {\\n cursor: pointer;\\n left: 0;\\n top: 0;\\n position: fixed !important;\\n z-index: 2147483647 !important;\\n width: 40px !important;\\n height: 40px !important;\\n zoom: 1 !important;\\n display: inline-block !important;\\n margin: 0 !important;\\n border: 0 !important;\\n padding: 0 !important;\\n will-change: transform;\\n opacity: 1;\\n touch-action: none;\\n -ms-touch-action: none;\\n visibility: visible !important;\\n min-height: auto !important;\\n max-height: auto !important;\\n min-width: auto !important;\\n max-width: auto !important;\\n background-size: 21px!important;\\n background-position: center center!important;\\n background-repeat: no-repeat !important;\\n background-color: #fff !important;\\n border: none !important;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3) !important;\\n border-radius: 100% !important;\\n transition: background-color 0.3s ease;\\n}\\n.adguard-alert.sg_hide_element {\\n display: none!important;\\n}\\n.adguard-alert.logo-small {\\n width: 24px !important;\\n height: 24px !important;\\n background-position: 50% 6px!important;\\n background-size: 14px!important;\\n}\\n.adguard-alert:hover {\\n background-color: #ccf0d4 !important;\\n}\\n@media print {\\n .adguard-alert {\\n display: none!important;\\n }\\n}\\n.adguard-assistant-button-right {\\n left: auto;\\n right: 0;\\n}\\n.adguard-assistant-button-left {\\n left: 0;\\n right: auto;\\n}\\n.adguard-assistant-button-top {\\n top: 0;\\n bottom: auto;\\n}\\n.adguard-assistant-button-bottom {\\n top: auto;\\n bottom: 0;\\n}\\n.adguard-assistant-button-top.adguard-assistant-button-left {\\n left: 0;\\n right: auto;\\n transform: translate3d(10px, 10px, 0);\\n}\\n.adguard-assistant-button-top.adguard-assistant-button-right {\\n left: auto;\\n right: 0;\\n transform: translate3d(-10px, 10px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-left {\\n left: 0;\\n right: auto;\\n transform: translate3d(10px, -10px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-right {\\n left: auto;\\n right: 0;\\n transform: translate3d(-10px, -10px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-respect-vk {\\n transform: translate3d(-70px, -5px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-respect-fb {\\n transform: translate3d(-5px, -40px, 0);\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 6469:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(8115);\n\tvar ___CSS_LOADER_URL_IMPORT_1___ = __webpack_require__(1660);\n\tvar ___CSS_LOADER_URL_IMPORT_2___ = __webpack_require__(1372);\n\tvar ___CSS_LOADER_URL_IMPORT_3___ = __webpack_require__(6112);\n\tvar ___CSS_LOADER_URL_IMPORT_4___ = __webpack_require__(9919);\n\tvar ___CSS_LOADER_URL_IMPORT_5___ = __webpack_require__(9023);\n\tvar ___CSS_LOADER_URL_IMPORT_6___ = __webpack_require__(6810);\n\tvar ___CSS_LOADER_URL_IMPORT_7___ = __webpack_require__(2307);\n\tvar ___CSS_LOADER_URL_IMPORT_8___ = __webpack_require__(7062);\n\tvar ___CSS_LOADER_URL_IMPORT_9___ = __webpack_require__(6255);\n\tvar ___CSS_LOADER_URL_IMPORT_10___ = __webpack_require__(9385);\n\tvar ___CSS_LOADER_URL_IMPORT_11___ = __webpack_require__(8225);\n\tvar ___CSS_LOADER_URL_IMPORT_12___ = __webpack_require__(6523);\n\tvar ___CSS_LOADER_URL_IMPORT_13___ = __webpack_require__(2286);\n\tvar ___CSS_LOADER_URL_IMPORT_14___ = __webpack_require__(2668);\n\tvar ___CSS_LOADER_URL_IMPORT_15___ = __webpack_require__(1823);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_6___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_7___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_7___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_8___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_8___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_9___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_9___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_10___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_10___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_11___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_11___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_12___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_12___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_13___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_13___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_14___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_14___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_15___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_15___);\n\texports.push([module.id, \".close {\\n position: absolute;\\n top: 10px;\\n right: 10px;\\n display: inline-block;\\n vertical-align: top;\\n width: 1em;\\n font-size: 12px;\\n line-height: 1;\\n cursor: pointer;\\n transition: opacity 0.3s ease;\\n}\\n.close:before {\\n content: \\\"\\\\00a0\\\";\\n}\\n@media (max-width: 320px) {\\n .close {\\n font-size: 15px;\\n top: 18px;\\n right: 14px;\\n }\\n}\\n.a-logo {\\n display: inline-block;\\n vertical-align: top;\\n width: 40px;\\n height: 40px;\\n padding: 10px 0 0;\\n font-size: 20px;\\n text-align: center;\\n border: 1px solid #cdcdcd;\\n border-radius: 50%;\\n background: #fff;\\n}\\n.a-logo__small {\\n width: 24px;\\n height: 24px;\\n font-size: 12px;\\n padding: 6px 0 0;\\n}\\n.tooltip {\\n position: relative;\\n}\\n.tooltip:before {\\n display: none;\\n content: attr(data-title);\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n width: 170px;\\n margin: 7px 0 0 -85px;\\n padding: 6px 0 5px;\\n font-size: 10px;\\n font-style: normal;\\n font-weight: 500;\\n color: #fff;\\n text-align: center;\\n white-space: nowrap;\\n border-radius: 4px;\\n background: rgba(0, 0, 0, 0.8);\\n}\\n.tooltip:after {\\n display: none;\\n content: '';\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n margin: 3px 0 0 -4px;\\n border-bottom: 4px solid rgba(0, 0, 0, 0.8);\\n border-left: 4px solid transparent;\\n border-right: 4px solid transparent;\\n}\\n.tooltip:hover:before,\\n.tooltip:hover:after {\\n display: block;\\n}\\n.main {\\n position: relative;\\n}\\n.head {\\n padding: 18px 20px;\\n cursor: move;\\n}\\n.head_title {\\n font-size: 16px;\\n font-weight: 700;\\n}\\n.head_text {\\n margin: 4px 0 0;\\n font-size: 12px;\\n}\\n.foot {\\n padding: 20px;\\n}\\n.foot_action {\\n float: right;\\n}\\n.foot_action_btn {\\n font-size: 0;\\n}\\n.foot_action_btn .btn + .btn {\\n margin-left: 10px;\\n}\\n.foot .cf {\\n clear: right;\\n}\\n.element-rule {\\n padding: 20px;\\n}\\n.element-rule_slider {\\n margin: 5px 0 7px;\\n user-select: none;\\n}\\n@media (max-width: 320px) {\\n .element-rule_slider {\\n display: none;\\n }\\n}\\n.element-rule_expand-link {\\n font-size: 12px;\\n line-height: 15px;\\n font-weight: 500;\\n cursor: pointer;\\n}\\n.element-rule_expand-link_txt {\\n display: inline-block;\\n vertical-align: top;\\n}\\n.element-rule_expand-link_arr {\\n display: inline-block;\\n vertical-align: top;\\n width: 5px;\\n height: 5px;\\n margin: 3px 0 0 3px;\\n border-bottom: 1px solid #91a795;\\n border-left: 1px solid #91a795;\\n transform: rotate(-45deg);\\n transition: 0.2s;\\n}\\n.element-rule_expand-link.active .element-rule_expand-link_arr {\\n margin-top: 5px;\\n transform: rotate(-225deg);\\n}\\n.element-rule_form {\\n height: 0;\\n margin: 0 -20px;\\n overflow: hidden;\\n}\\n.element-rule_form.open {\\n height: auto;\\n margin-bottom: -20px;\\n}\\n@media (max-width: 320px) {\\n .element-rule_form.open {\\n padding: 20px;\\n padding-top: 0;\\n }\\n}\\n.element-rule_form-cont {\\n margin: 4px 0 0;\\n padding: 20px;\\n}\\n@media (max-width: 320px) {\\n .element-rule_form-cont {\\n margin-top: 0;\\n }\\n}\\n.element-rule_fieldset {\\n margin: 10px 0 0;\\n}\\n.element-rule_fieldset:first-child {\\n margin: 0;\\n}\\n.element-rule_more--mobile {\\n display: none;\\n}\\n@media (max-width: 320px) {\\n .element-rule_more--mobile {\\n display: block;\\n }\\n .element-rule_more--mobile .element-rule_expand-link {\\n display: none;\\n }\\n .element-rule_more--mobile #adg-cancel {\\n width: 106px;\\n padding: 10px 7px;\\n }\\n .element-rule_more--mobile #adg-accept {\\n padding: 10px 6px;\\n }\\n}\\n.adg-slide {\\n position: relative;\\n width: 500px;\\n height: 44px;\\n margin: auto;\\n transform: translate3d(0, 0, 0);\\n}\\n.adg-slide-clue-min,\\n.adg-slide-clue-max {\\n position: absolute;\\n top: 14px;\\n left: -40px;\\n width: 30px;\\n font-size: 12px;\\n font-weight: 500;\\n color: #8f9b92;\\n cursor: pointer;\\n}\\n.adg-slide-clue-min {\\n left: auto;\\n right: -40px;\\n text-align: right;\\n}\\n.adg-slide-btns {\\n display: none;\\n}\\n.adg-slide-btn {\\n position: relative;\\n width: 36px;\\n height: 36px;\\n border: 2px solid #e2e2e2;\\n border-radius: 2px;\\n}\\n.adg-slide-btn:after {\\n content: \\\"\\\";\\n position: absolute;\\n left: 8px;\\n top: 15.3px;\\n width: 18px;\\n height: 2px;\\n background-color: #4e4e4e;\\n border-radius: 2px;\\n}\\n.adg-slide-btn--plus {\\n margin-left: 9px;\\n}\\n.adg-slide-btn--plus:before {\\n content: \\\"\\\";\\n position: absolute;\\n left: 16px;\\n top: 8px;\\n height: 17px;\\n width: 2px;\\n background-color: #4e4e4e;\\n border-radius: 2px;\\n}\\n.ui-slider-handle {\\n position: absolute;\\n top: 22px;\\n z-index: 2;\\n cursor: pointer;\\n}\\n.ui-slider-handle:before {\\n content: '';\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 30px;\\n height: 30px;\\n margin: -15px 0 0 -15px;\\n background: rgba(0, 0, 0, 0.1);\\n border-radius: 50%;\\n transition: 0.2s;\\n}\\n.ui-slider-handle:after {\\n content: '';\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 20px;\\n height: 20px;\\n margin: -10px 0 0 -10px;\\n border-radius: 50%;\\n}\\n.ui-slider-handle:hover:active,\\n.ui-slider-handle:hover:before {\\n background: rgba(0, 0, 0, 0.15);\\n}\\n.tick {\\n position: absolute;\\n height: 44px;\\n}\\n.settings_fieldset {\\n padding: 20px;\\n}\\n.settings_fieldset:first-child {\\n border: 0;\\n}\\n.settings_fieldset_lbl {\\n float: left;\\n width: 126px;\\n margin: 1px 0 0;\\n font-weight: 500;\\n}\\n.settings_fieldset_lbl__pos {\\n margin-top: 21px;\\n}\\n.settings_fieldset_val {\\n margin: 0 0 0 126px;\\n}\\n.choice-size {\\n position: relative;\\n font-size: 14px;\\n}\\n.choice-size_field {\\n margin: 10px 0 0;\\n}\\n.choice-size_field:first-child {\\n margin: 0;\\n}\\n.choice-size_logo {\\n display: none;\\n position: absolute;\\n top: 10px;\\n right: 15px;\\n width: 40px;\\n height: 40px;\\n background-size: 21px;\\n background-position: 50% 11px;\\n background-repeat: no-repeat;\\n background-color: #fff;\\n border: none ;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n border-radius: 100% ;\\n}\\n.choice-size_logo.logo__small {\\n top: 15px;\\n right: 20px;\\n width: 24px;\\n height: 24px;\\n background-position: 50% 6px;\\n background-size: 14px;\\n}\\n.choice-size_input:checked ~ .choice-size_logo {\\n display: block;\\n}\\n[class^=\\\"s-position-arr-\\\"] {\\n display: block;\\n width: 11px;\\n height: 11px;\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") no-repeat;\\n background-size: 44px 22px;\\n}\\n.s-position-arr-top-left {\\n background-position: 0 0;\\n}\\n.s-position-arr-top-right {\\n background-position: -11px 0;\\n}\\n.s-position-arr-bottom-left {\\n background-position: 0 -11px;\\n}\\n.s-position-arr-bottom-right {\\n background-position: -11px -11px;\\n}\\n.change-position {\\n position: relative;\\n display: inline-block;\\n vertical-align: top;\\n width: 70px;\\n margin: -3px 0 0 -3px;\\n}\\n.change-position_i {\\n float: left;\\n margin: 3px 0 0 3px;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-top-left {\\n background-position: -22px 0;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-top-right {\\n background-position: -33px 0;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-bottom-left {\\n background-position: -22px -11px;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-bottom-right {\\n background-position: -33px -11px;\\n}\\n.change-position_input:checked ~ .change-position_val {\\n display: block;\\n}\\n.change-position_label {\\n display: block;\\n width: 32px;\\n height: 32px;\\n margin: 0;\\n padding: 9px 0 0 9px;\\n border: 1px solid #dfdedb;\\n cursor: pointer;\\n}\\n.change-position_val {\\n display: none;\\n position: absolute;\\n top: 27px;\\n left: 82px;\\n font-size: 12px;\\n white-space: nowrap;\\n}\\n.position-save .position-save_field {\\n margin-bottom: 10px;\\n}\\n.wot-indicator {\\n display: inline-block;\\n vertical-align: top;\\n margin-right: 5px;\\n}\\n#WotDescriptionText {\\n white-space: pre-line;\\n}\\n#WotDescriptionText #WotLogo {\\n cursor: pointer;\\n}\\n.adg-wot {\\n width: 18px;\\n height: 18px;\\n display: block;\\n border: 5px solid #000;\\n border-radius: 50%;\\n}\\n.adg-wot-unknown {\\n border-color: #ccc;\\n}\\n.adg-wot-red {\\n border-color: #b60000;\\n}\\n.adg-wot-lightRed {\\n border-color: #f21800;\\n}\\n.adg-wot-yellow {\\n border-color: #fac000;\\n}\\n.adg-wot-lightGreen {\\n border-color: #69d225;\\n}\\n.adg-wot-green {\\n border-color: #00ae17;\\n}\\n.adg-wot-confidence {\\n width: 52px;\\n height: 18px;\\n display: inline-block;\\n vertical-align: middle;\\n}\\n.adg-wot-confidence-0 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \");\\n}\\n.adg-wot-confidence-1 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \");\\n}\\n.adg-wot-confidence-2 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \");\\n}\\n.adg-wot-confidence-3 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \");\\n}\\n.adg-wot-confidence-4 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \");\\n}\\n.adg-wot-confidence-5 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \");\\n}\\n.confidence-indication,\\n.wot-indicator {\\n text-decoration: none;\\n vertical-align: middle;\\n}\\n.confidence-indication:hover,\\n.wot-indicator:hover {\\n text-decoration: none;\\n}\\n.confidence-indication {\\n display: inline-block;\\n margin-right: 10px;\\n}\\n.wot-logo {\\n display: inline-block;\\n vertical-align: top;\\n width: 31px;\\n height: 12px;\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \") no-repeat 0 0 / cover;\\n margin-top: 3px;\\n}\\n.wot-hide {\\n display: none;\\n}\\niframe#adguard-assistant-dialog {\\n position: fixed;\\n clip: auto;\\n border-radius: 3px;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n z-index: 2147483647;\\n display: block!important;\\n}\\n.sg_hide_element {\\n display: none!important;\\n}\\nimg.adguard_sg_selected {\\n border: 5px solid #0F0 !important;\\n}\\n#_sg_div.sg_top {\\n top: 5px !important;\\n}\\n#_sg_div.sg_bottom {\\n bottom: 5px !important;\\n}\\n#_sg_div input {\\n margin-right: 10px !important;\\n font-size: 15px !important;\\n}\\n#_sg_path_field {\\n width: 400px !important;\\n}\\n#_sg_div .sg_new_line {\\n clear: both !important;\\n}\\n#_sg_div .sg_option {\\n float: left !important;\\n}\\n#_sg_div .adguard_sg_selected_option {\\n text-decoration: underline;\\n}\\n.adguard-placeholder {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OUM5OUE4MEZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OUM5OUE4MUZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5Qzk5QTdFRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5Qzk5QTdGRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9rJm9wAAAAZQTFRF2+7g1OfZ+LX/EgAAACtJREFUeNpiYIQABhhA5TIyoHIhfCS1DKhcEB/FJAZG7AYzoNlLLy5AgAEAMigAar6TcqkAAAAASUVORK5CYII=);\\n}\\n.adguard-placeholder-icon {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAwCAYAAAB9sggoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpENkNBQTNGMkZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpENkNBQTNGM0ZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ2Q0FBM0YwRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ2Q0FBM0YxRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+49sbDwAAAl9JREFUeNrMmE0o5VEYxq9vJmpI2SBZjCSNKKGwkDE0m8mg2QwzEtkNCeUjGyVhYTbTUIZEMWmkbCVlw9QkG4mammbK5zAWuLqek3ch3W7v+Z8P/7d+u/cczz3neM7zP0Htg12eR6wUkA+eg2yQDOLAYegjiIkEr0AjyAPRfnp8toW9Be20QoHKa0tYEhgCVdwBNoQVgCmQKjPItLAKMAtiZAeaFFYM5sATJ4ODDYl6BuadijIlLAJMgHiFOWJMbGUfmaZsHYN98Bvs6haWA1olx2yCMfAd/DF1+Psl5rwGPWAYXJn8r3wNXjB7L0ENrZLRwy/m6ZDorw8kSqewUpDL7P0Epm3YRRBoYfbugW5bPpZDK8apTnBqS9h7WjWOLXyz5fxPQSWjz0dWcmPrEhdJNIEprIlW198Z7aUV1SasQWJnAp3Dzw+FqWxlOmV2HeXVecbegHBTYS5YYVy1yejrVJhIpxluFPaB6V1WhSWQTXjcJqyKjFVnhagabBhFFk7tgnPmlp+oChNbmMXM70XgL3Nen6qwj8y+xfv53fQZKweFzN5xW4c/Cgwwe9fAui1hIuBlMntHZOKNirAyiQ+NLbBkw8fEE9IM2QSnBv19I+oWVguWQSxzrnX6EVrqoV2I15kS0AxeSszjo+326hQm3hoSQRqR6mCeL2BV5x0VSjYQojDHNmgzcYn/Uxj/H9SBM7fkMQ951Tuw4aageEMpY8FUHnPy+XZECXbRTUFxhezEqCiZFfsFRnXdg1xhgcT9BF/BJG2htRKiDjx376EX9Md36HoR/NDp5jJ1K8AAcQBmooZhTgQAAAAASUVORK5CYII=);\\n background-position: center center;\\n background-repeat: no-repeat;\\n height: 100%;\\n}\\n.adguard-placeholder-domain {\\n background: #778b7c;\\n color: #ffffff;\\n left: 0;\\n top: 0;\\n padding: 2px 4px;\\n position: relative;\\n}\\n@media print {\\n .adguard-alert,\\n #adguard-assistant-dialog {\\n display: none!important;\\n opacity: 0!important;\\n visibility: hidden!important;\\n }\\n}\\n.menu-head {\\n padding: 18px 20px;\\n cursor: move;\\n touch-action: none;\\n -ms-touch-action: none;\\n}\\n.menu-head_title {\\n font-size: 16px;\\n font-weight: 700;\\n}\\n.menu-head_name {\\n display: inline-block;\\n vertical-align: top;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n max-width: 260px;\\n line-height: 26px;\\n margin: 0 10px 5px 0;\\n}\\n.menu-head_text {\\n margin: 4px 10px 0 0;\\n font-size: 12px;\\n}\\n.menu-filter {\\n width: 100%;\\n display: table;\\n padding: 20px;\\n}\\n.menu-filter_lbl {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.menu-filter_val {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.menu-filter_label {\\n position: relative;\\n width: 30px;\\n height: 12px;\\n border-radius: 25px;\\n background-color: #ed7865;\\n cursor: pointer;\\n transition: all 0.3s ease;\\n float: right;\\n}\\n.menu-filter_label:after {\\n content: \\\"\\\";\\n cursor: pointer;\\n border-radius: 100%;\\n position: absolute;\\n left: -3px;\\n top: -4px;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n width: 20px;\\n height: 20px;\\n background-color: #e85037;\\n transition: all 0.3s ease;\\n}\\n.menu-filter_handle {\\n position: absolute;\\n width: 20px;\\n height: 20px;\\n top: 1px;\\n left: 1px;\\n border-radius: 4px;\\n}\\n.menu-filter_input:checked + .menu-filter_label {\\n background-color: #bde5c1;\\n}\\n.menu-filter_input:checked + .menu-filter_label:after {\\n left: 12px;\\n background-color: #68bc72;\\n}\\n.menu__btn {\\n position: relative;\\n cursor: pointer;\\n line-height: 45px;\\n height: 45px;\\n background-repeat: no-repeat;\\n background-position: 20px 50%;\\n transition: 0.3s ease;\\n padding: 0 20px 0 60px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.menu__btn:hover {\\n background-color: rgba(104, 188, 113, 0.2);\\n}\\n.menu__btn--clock {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \");\\n background-size: 16px 19px;\\n}\\n.menu__btn--landscape {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_9___ + \");\\n background-size: 19px 17px;\\n}\\n.menu__btn--report {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_10___ + \");\\n background-size: 16px 17px;\\n}\\n.menu__btn--security {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_11___ + \");\\n background-size: 15px 16px;\\n}\\n.menu__btn--extensions {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_12___ + \");\\n background-size: 18px;\\n}\\n.menu__btn--settings {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_13___ + \");\\n background-size: 19px;\\n}\\n.menu__btn.hidden {\\n display: none;\\n}\\nbody {\\n color: #282828;\\n}\\n.main {\\n background: #ffffff;\\n}\\n.main-popup__btn {\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\n.main-popup__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn {\\n background-color: #ffffff;\\n}\\n.main-menu__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn:active,\\n.main-menu__btn.active {\\n background-color: #f3f3f3;\\n}\\n.main-version {\\n color: #dfdfdf;\\n}\\n.head_title {\\n color: #343434;\\n}\\n.head_text {\\n color: #343434;\\n}\\n.element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom: 1px solid #36ba53;\\n}\\n.element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom-color: #36ba53;\\n}\\n.element-rule_form-cont {\\n border-top: 1px solid #e0dfdb;\\n background: #f4f4ef;\\n}\\n.tick {\\n border: 20px solid #ffffff;\\n border-left: 1px solid #ffffff;\\n border-right: 1px solid #ffffff;\\n}\\n.close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_14___ + \") no-repeat 0 0 / cover;\\n opacity: 0.6;\\n}\\n.close:hover {\\n opacity: 0.8;\\n}\\n.form-control {\\n color: #343434;\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\ninput[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n background: #ffffff;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #ffffff;\\n border-left-color: #ffffff;\\n}\\n.menu,\\n.menu-filter,\\n.content,\\n.foot {\\n border-top: 1px solid #e0dfdb;\\n}\\n.settings_fieldset {\\n border-top: 1px solid #e0dfdb;\\n}\\n.btn-primary {\\n border-color: #36ba53;\\n background: #36ba53;\\n color: #fff;\\n}\\n.btn-primary:hover {\\n border-color: #30a64a;\\n background: #30a64a;\\n color: #fff;\\n}\\n.btn-primary.active,\\n.btn-primary:active {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-primary.disabled,\\n.btn-primary[disabled] {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-cancel {\\n border-color: #f3523d;\\n background: #f3523d;\\n color: #fff;\\n}\\n.btn-cancel:hover {\\n border-color: #ee290f;\\n background: #ee290f;\\n color: #fff;\\n}\\n.btn-cancel.active,\\n.btn-cancel:active {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.btn-cancel.disabled,\\n.btn-cancel[disabled] {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.ui-slider-handle:after {\\n background: #36ba53;\\n}\\n.change-position_input:checked + .change-position_label {\\n border-color: #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #ffffff;\\n}\\ninput[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #36ba53;\\n}\\n.menu-head_title {\\n color: #343434;\\n}\\n.menu-head_text {\\n color: #343434;\\n}\\n.menu-filter_handle {\\n background: #ffffff;\\n}\\n@media (prefers-color-scheme: dark) {\\n body {\\n color: #ddd;\\n }\\n .main {\\n background: #323232;\\n }\\n .main-popup__btn {\\n background: #323232;\\n border: 1px solid #666;\\n }\\n .main-popup__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn {\\n background-color: #323232;\\n }\\n .main-menu__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #4d4d4d;\\n }\\n .main-version {\\n color: #444;\\n }\\n .head_title {\\n color: #ccc;\\n }\\n .head_text {\\n color: #ccc;\\n }\\n .element-rule_expand-link_txt {\\n color: #67B279;\\n border-bottom: 1px solid #67B279;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #4D995F;\\n border-bottom-color: #4D995F;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #444;\\n background: #555;\\n }\\n .tick {\\n border: 20px solid #323232;\\n border-left: 1px solid #323232;\\n border-right: 1px solid #323232;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_15___ + \") no-repeat 0 0 / cover;\\n opacity: 0.7;\\n }\\n .close:hover {\\n opacity: 1;\\n }\\n .form-control {\\n color: #ccc;\\n background: #323232;\\n border: 1px solid #666;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #666;\\n background: #323232;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #323232;\\n border-left-color: #323232;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #444;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #444;\\n }\\n .btn-primary {\\n border-color: #4D995F;\\n background: #4D995F;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #39774C;\\n background: #39774C;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-cancel {\\n border-color: #8E2C13;\\n background: #8E2C13;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #732613;\\n background: #732613;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #732613;\\n background: #732613;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #732613;\\n background: #732613;\\n }\\n .ui-slider-handle:after {\\n background: #4D995F;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #323232;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #4D995F;\\n }\\n .menu-head_title {\\n color: #ccc;\\n }\\n .menu-head_text {\\n color: #ccc;\\n }\\n .menu-filter_handle {\\n background: #323232;\\n }\\n}\\n:host {\\n display: block!important;\\n position: relative!important;\\n width: 0!important;\\n height: 0!important;\\n margin: 0!important;\\n padding: 0!important;\\n z-index: 2147483647!important;\\n}\\n:host ::after,\\n:host ::before {\\n display: none!important;\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 817:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(2668);\n\tvar ___CSS_LOADER_URL_IMPORT_1___ = __webpack_require__(1823);\n\tvar ___CSS_LOADER_URL_IMPORT_2___ = __webpack_require__(9053);\n\tvar ___CSS_LOADER_URL_IMPORT_3___ = __webpack_require__(8269);\n\tvar ___CSS_LOADER_URL_IMPORT_4___ = __webpack_require__(2834);\n\tvar ___CSS_LOADER_URL_IMPORT_5___ = __webpack_require__(9713);\n\tvar ___CSS_LOADER_URL_IMPORT_6___ = __webpack_require__(7693);\n\tvar ___CSS_LOADER_URL_IMPORT_7___ = __webpack_require__(6265);\n\tvar ___CSS_LOADER_URL_IMPORT_8___ = __webpack_require__(1109);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_6___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_7___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_7___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_8___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_8___);\n\texports.push([module.id, \":host {\\n display: block!important;\\n position: relative!important;\\n width: 0!important;\\n height: 0!important;\\n margin: 0!important;\\n padding: 0!important;\\n z-index: 2147483647!important;\\n}\\n:host ::after,\\n:host ::before {\\n display: none!important;\\n}\\nbody {\\n color: #282828;\\n}\\n.main {\\n background: #ffffff;\\n}\\n.main-popup__btn {\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\n.main-popup__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn {\\n background-color: #ffffff;\\n}\\n.main-menu__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn:active,\\n.main-menu__btn.active {\\n background-color: #f3f3f3;\\n}\\n.main-version {\\n color: #dfdfdf;\\n}\\n.head_title {\\n color: #343434;\\n}\\n.head_text {\\n color: #343434;\\n}\\n.element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom: 1px solid #36ba53;\\n}\\n.element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom-color: #36ba53;\\n}\\n.element-rule_form-cont {\\n border-top: 1px solid #e0dfdb;\\n background: #f4f4ef;\\n}\\n.tick {\\n border: 20px solid #ffffff;\\n border-left: 1px solid #ffffff;\\n border-right: 1px solid #ffffff;\\n}\\n.close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") no-repeat 0 0 / cover;\\n opacity: 0.6;\\n}\\n.close:hover {\\n opacity: 0.8;\\n}\\n.form-control {\\n color: #343434;\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\ninput[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n background: #ffffff;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #ffffff;\\n border-left-color: #ffffff;\\n}\\n.menu,\\n.menu-filter,\\n.content,\\n.foot {\\n border-top: 1px solid #e0dfdb;\\n}\\n.settings_fieldset {\\n border-top: 1px solid #e0dfdb;\\n}\\n.btn-primary {\\n border-color: #36ba53;\\n background: #36ba53;\\n color: #fff;\\n}\\n.btn-primary:hover {\\n border-color: #30a64a;\\n background: #30a64a;\\n color: #fff;\\n}\\n.btn-primary.active,\\n.btn-primary:active {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-primary.disabled,\\n.btn-primary[disabled] {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-cancel {\\n border-color: #f3523d;\\n background: #f3523d;\\n color: #fff;\\n}\\n.btn-cancel:hover {\\n border-color: #ee290f;\\n background: #ee290f;\\n color: #fff;\\n}\\n.btn-cancel.active,\\n.btn-cancel:active {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.btn-cancel.disabled,\\n.btn-cancel[disabled] {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.ui-slider-handle:after {\\n background: #36ba53;\\n}\\n.change-position_input:checked + .change-position_label {\\n border-color: #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #ffffff;\\n}\\ninput[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #36ba53;\\n}\\n.menu-head_title {\\n color: #343434;\\n}\\n.menu-head_text {\\n color: #343434;\\n}\\n.menu-filter_handle {\\n background: #ffffff;\\n}\\n@media (prefers-color-scheme: dark) {\\n body {\\n color: #ddd;\\n }\\n .main {\\n background: #323232;\\n }\\n .main-popup__btn {\\n background: #323232;\\n border: 1px solid #666;\\n }\\n .main-popup__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn {\\n background-color: #323232;\\n }\\n .main-menu__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #4d4d4d;\\n }\\n .main-version {\\n color: #444;\\n }\\n .head_title {\\n color: #ccc;\\n }\\n .head_text {\\n color: #ccc;\\n }\\n .element-rule_expand-link_txt {\\n color: #67B279;\\n border-bottom: 1px solid #67B279;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #4D995F;\\n border-bottom-color: #4D995F;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #444;\\n background: #555;\\n }\\n .tick {\\n border: 20px solid #323232;\\n border-left: 1px solid #323232;\\n border-right: 1px solid #323232;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") no-repeat 0 0 / cover;\\n opacity: 0.7;\\n }\\n .close:hover {\\n opacity: 1;\\n }\\n .form-control {\\n color: #ccc;\\n background: #323232;\\n border: 1px solid #666;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #666;\\n background: #323232;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #323232;\\n border-left-color: #323232;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #444;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #444;\\n }\\n .btn-primary {\\n border-color: #4D995F;\\n background: #4D995F;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #39774C;\\n background: #39774C;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-cancel {\\n border-color: #8E2C13;\\n background: #8E2C13;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #732613;\\n background: #732613;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #732613;\\n background: #732613;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #732613;\\n background: #732613;\\n }\\n .ui-slider-handle:after {\\n background: #4D995F;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #323232;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #4D995F;\\n }\\n .menu-head_title {\\n color: #ccc;\\n }\\n .menu-head_text {\\n color: #ccc;\\n }\\n .menu-filter_handle {\\n background: #323232;\\n }\\n}\\nbody {\\n padding: 1vw;\\n background: transparent;\\n}\\n.main {\\n position: relative;\\n padding: 8vw 3vw;\\n}\\n.main .footer {\\n letter-spacing: 3vw;\\n}\\n.main-version {\\n position: absolute;\\n bottom: 0;\\n right: 7px;\\n font-size: 5vw;\\n}\\n.main-popup {\\n text-align: center;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n margin: 5vw;\\n box-shadow: 0 0px 5vw 0 rgba(0, 0, 0, 0.2);\\n}\\n.main-popup__logo {\\n width: 11vw;\\n height: 11vw;\\n}\\n.main-popup__logo.adguard-assistant-button-main-logo {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \");\\n background-repeat: no-repeat;\\n}\\n.main-popup__title {\\n font-size: 6vw;\\n margin: 3vw 0;\\n}\\n.main-popup__content {\\n font-size: 5vw;\\n padding: 0 3vw;\\n margin-bottom: 5vw;\\n border-top: none;\\n}\\n.main-popup__btn {\\n font-size: 5vw;\\n padding: 2vh 8vw;\\n border-radius: 3px;\\n letter-spacing: normal;\\n}\\n.main-popup__btn--green {\\n color: #ffffff;\\n border: 1px solid #66B574;\\n background-color: #66B574;\\n box-shadow: none;\\n}\\n.main-popup__btn--green:hover {\\n background-color: #5ea76b;\\n color: #fff;\\n}\\n.main-popup__btn:focus {\\n box-shadow: none;\\n}\\n.main-menu {\\n margin: 4vw;\\n padding: 4vw;\\n display: flex;\\n justify-content: space-between;\\n border-radius: 4vw;\\n box-shadow: 0 0 4vw -2px rgba(0, 0, 0, 0.3);\\n}\\n.main-menu__info {\\n width: 100%;\\n text-align: center;\\n}\\n.main-menu__btn {\\n border: 0;\\n font-size: 0;\\n width: 12vw;\\n height: 12vw;\\n border-radius: 2vw;\\n background-repeat: no-repeat;\\n background-position: 50%;\\n background-size: 100%;\\n position: relative;\\n}\\n.main-menu__btn:disabled {\\n opacity: 0.5;\\n pointer-events: none;\\n}\\n.main-menu__btn--accept {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \");\\n}\\n.main-menu__btn--preview {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \");\\n}\\n.main-menu__btn--preview:active,\\n.main-menu__btn--preview.active {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \");\\n}\\n.main-menu__btn--plus {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \");\\n}\\n.main-menu__btn--minus {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \");\\n}\\n.main-menu__btn--close {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \");\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 3596:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\texports.push([module.id, \"iframe#adguard-assistant-dialog {\\n position: fixed;\\n clip: auto;\\n border-radius: 3px;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n z-index: 2147483647;\\n display: block!important;\\n}\\n.sg_hide_element {\\n display: none!important;\\n}\\nimg.adguard_sg_selected {\\n border: 5px solid #0F0 !important;\\n}\\n#_sg_div.sg_top {\\n top: 5px !important;\\n}\\n#_sg_div.sg_bottom {\\n bottom: 5px !important;\\n}\\n#_sg_div input {\\n margin-right: 10px !important;\\n font-size: 15px !important;\\n}\\n#_sg_path_field {\\n width: 400px !important;\\n}\\n#_sg_div .sg_new_line {\\n clear: both !important;\\n}\\n#_sg_div .sg_option {\\n float: left !important;\\n}\\n#_sg_div .adguard_sg_selected_option {\\n text-decoration: underline;\\n}\\n.adguard-placeholder {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OUM5OUE4MEZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OUM5OUE4MUZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5Qzk5QTdFRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5Qzk5QTdGRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9rJm9wAAAAZQTFRF2+7g1OfZ+LX/EgAAACtJREFUeNpiYIQABhhA5TIyoHIhfCS1DKhcEB/FJAZG7AYzoNlLLy5AgAEAMigAar6TcqkAAAAASUVORK5CYII=);\\n}\\n.adguard-placeholder-icon {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAwCAYAAAB9sggoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpENkNBQTNGMkZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpENkNBQTNGM0ZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ2Q0FBM0YwRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ2Q0FBM0YxRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+49sbDwAAAl9JREFUeNrMmE0o5VEYxq9vJmpI2SBZjCSNKKGwkDE0m8mg2QwzEtkNCeUjGyVhYTbTUIZEMWmkbCVlw9QkG4mammbK5zAWuLqek3ch3W7v+Z8P/7d+u/cczz3neM7zP0Htg12eR6wUkA+eg2yQDOLAYegjiIkEr0AjyAPRfnp8toW9Be20QoHKa0tYEhgCVdwBNoQVgCmQKjPItLAKMAtiZAeaFFYM5sATJ4ODDYl6BuadijIlLAJMgHiFOWJMbGUfmaZsHYN98Bvs6haWA1olx2yCMfAd/DF1+Psl5rwGPWAYXJn8r3wNXjB7L0ENrZLRwy/m6ZDorw8kSqewUpDL7P0Epm3YRRBoYfbugW5bPpZDK8apTnBqS9h7WjWOLXyz5fxPQSWjz0dWcmPrEhdJNIEprIlW198Z7aUV1SasQWJnAp3Dzw+FqWxlOmV2HeXVecbegHBTYS5YYVy1yejrVJhIpxluFPaB6V1WhSWQTXjcJqyKjFVnhagabBhFFk7tgnPmlp+oChNbmMXM70XgL3Nen6qwj8y+xfv53fQZKweFzN5xW4c/Cgwwe9fAui1hIuBlMntHZOKNirAyiQ+NLbBkw8fEE9IM2QSnBv19I+oWVguWQSxzrnX6EVrqoV2I15kS0AxeSszjo+326hQm3hoSQRqR6mCeL2BV5x0VSjYQojDHNmgzcYn/Uxj/H9SBM7fkMQ951Tuw4aageEMpY8FUHnPy+XZECXbRTUFxhezEqCiZFfsFRnXdg1xhgcT9BF/BJG2htRKiDjx376EX9Md36HoR/NDp5jJ1K8AAcQBmooZhTgQAAAAASUVORK5CYII=);\\n background-position: center center;\\n background-repeat: no-repeat;\\n height: 100%;\\n}\\n.adguard-placeholder-domain {\\n background: #778b7c;\\n color: #ffffff;\\n left: 0;\\n top: 0;\\n padding: 2px 4px;\\n position: relative;\\n}\\n@media print {\\n .adguard-alert,\\n #adguard-assistant-dialog {\\n display: none!important;\\n opacity: 0!important;\\n visibility: hidden!important;\\n }\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 3645:\n\t ((module) => {\n\tmodule.exports = function (useSourceMap) {\n\t var list = [];\n\t list.toString = function toString() {\n\t return this.map(function (item) {\n\t var content = cssWithMappingToString(item, useSourceMap);\n\t if (item[2]) {\n\t return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n\t }\n\t return content;\n\t }).join('');\n\t };\n\t list.i = function (modules, mediaQuery, dedupe) {\n\t if (typeof modules === 'string') {\n\t modules = [[null, modules, '']];\n\t }\n\t var alreadyImportedModules = {};\n\t if (dedupe) {\n\t for (var i = 0; i < this.length; i++) {\n\t var id = this[i][0];\n\t if (id != null) {\n\t alreadyImportedModules[id] = true;\n\t }\n\t }\n\t }\n\t for (var _i = 0; _i < modules.length; _i++) {\n\t var item = [].concat(modules[_i]);\n\t if (dedupe && alreadyImportedModules[item[0]]) {\n\t continue;\n\t }\n\t if (mediaQuery) {\n\t if (!item[2]) {\n\t item[2] = mediaQuery;\n\t } else {\n\t item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n\t }\n\t }\n\t list.push(item);\n\t }\n\t };\n\t return list;\n\t};\n\tfunction cssWithMappingToString(item, useSourceMap) {\n\t var content = item[1] || '';\n\t var cssMapping = item[3];\n\t if (!cssMapping) {\n\t return content;\n\t }\n\t if (useSourceMap && typeof btoa === 'function') {\n\t var sourceMapping = toComment(cssMapping);\n\t var sourceURLs = cssMapping.sources.map(function (source) {\n\t return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n\t });\n\t return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t }\n\t return [content].join('\\n');\n\t}\n\tfunction toComment(sourceMap) {\n\t var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\t var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n\t return \"/*# \".concat(data, \" */\");\n\t}\n\t }),\n\t 1667:\n\t ((module) => {\n\tmodule.exports = function (url, options) {\n\t if (!options) {\n\t options = {};\n\t }\n\t url = url && url.__esModule ? url.default : url;\n\t if (typeof url !== 'string') {\n\t return url;\n\t }\n\t if (/^['\"].*['\"]$/.test(url)) {\n\t url = url.slice(1, -1);\n\t }\n\t if (options.hash) {\n\t url += options.hash;\n\t }\n\t if (/[\"'() \\t\\n]/.test(url) || options.needQuotes) {\n\t return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n'), \"\\\"\");\n\t }\n\t return url;\n\t};\n\t }),\n\t 5688:\n\t ((module) => {\n\tvar code = \"

\";\n\tmodule.exports = code;\n\t }),\n\t 6696:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 3317:\n\t ((module) => {\n\tvar code = \" \";\n\tmodule.exports = code;\n\t }),\n\t 4825:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 2115:\n\t ((module) => {\n\tvar code = \"

\";\n\tmodule.exports = code;\n\t }),\n\t 8514:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 4693:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 7726:\n\t ((module) => {\n\tvar code = \"
MAX
MIN
\";\n\tmodule.exports = code;\n\t }),\n\t 1403:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(4123);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 5487:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(2571);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 3228:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(6469);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 1953:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(817);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 5317:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(3596);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 8269:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUgMTEuNzY2NUwxMC41ODc4IDE3TDE5IDgiIHN0cm9rZT0iIzY3QjI3OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 7062:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTcgMTciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iQXJ0Ym9hcmQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4wMDAwMDAsIC0xNDQuMDAwMDAwKSI+CiAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTQxLjAwMDAwMCkiIHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1Ij4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgY3g9IjcuODcwMzYxMzMiIGN5PSIxMS4yNzU5NzY2IiByPSI3LjM3ODg1NzQyIj48L2NpcmNsZT4KICAgICAgICAgICAgPHBvbHlsaW5lIGlkPSJMaW5lLTIiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHBvaW50cz0iNy43Njc5Njg3NSA3LjQ2MzI4MTI1IDcuNzY3OTY4NzUgMTEuOTYzMjgxMiAxMS4zNjc5Njg3IDExLjk2MzI4MTIiPjwvcG9seWxpbmU+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 1823:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogICAgPGxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZWVlIiBzdHJva2Utd2lkdGg9IjIwIiB4MT0iNSIgeTE9IjUiIHgyPSI5NSIgeTI9Ijk1Ii8+CiAgICA8bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNlZWUiIHN0cm9rZS13aWR0aD0iMjAiIHgxPSI5NSIgeTE9IjUiIHgyPSI1IiB5Mj0iOTUiLz4KPC9zdmc+Cg==\");\n\t }),\n\t 2668:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogICAgPGxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIwIiB4MT0iNSIgeTE9IjUiIHgyPSI5NSIgeTI9Ijk1Ii8+CiAgICA8bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMjAiIHgxPSI5NSIgeTE9IjUiIHgyPSI1IiB5Mj0iOTUiLz4KPC9zdmc+Cg==\");\n\t }),\n\t 1109:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTYuNDI4NTcgNi40Mjg1N0wxNy42MDQzIDE3LjYwNDMiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNNi40Mjc3MyAxNy41NzE0TDE3LjYwMzUgNi4zOTU2MyIgc3Ryb2tlPSIjQTRBNEE0IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=\");\n\t }),\n\t 6523:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMTkiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBkPSJNMjcuNjE1NjkzMSwzMjIuMjg4MDg2IEwyMC43Njc5Njg3LDMyMi4yODgwODYgTDIwLjc2Nzk2ODcsMzE1LjQxNjAyNiBMMjEuOTU5OTMxNCwzMTUuNDE2MDI2IEMyMi41MTAyOTA4LDMxNS40MTYwMjYgMjIuOTU2NDQ1MywzMTQuOTY5ODcxIDIyLjk1NjQ0NTMsMzE0LjQxOTUxMiBDMjIuOTU2NDQ1MywzMTMuODY5MTUzIDIyLjUxMDI5MDgsMzEzLjQyMjk5OCAyMS45NTk5MzE0LDMxMy40MjI5OTggTDIwLjc2Nzk2ODcsMzEzLjQyMjk5OCBMMjAuNzY3OTY4NywzMDYuOTE3MTEgTDI1LjkzOTg5MjYsMzA2LjkxNzExIEwyNS45Mzk4OTI2LDMwNi44MTYzNjggQzI1LjkzOTg5MjYsMzA1LjMyNTE5OSAyNy4xNDg3MjM4LDMwNC4xMTYzNjggMjguNjM5ODkyNiwzMDQuMTE2MzY4IEMzMC4xMzEwNjE0LDMwNC4xMTYzNjggMzEuMzM5ODkyNiwzMDUuMzI1MTk5IDMxLjMzOTg5MjYsMzA2LjgxNjM2OCBMMzEuMzM5ODkyNiwzMDYuOTE3MTEgTDM2LjEzODk0NDUsMzA2LjkxNzExIEwzNi4xMzg5NDQ1LDMxMS45MDI1OTggTDM2LjMzMjA4MDEsMzExLjkwMjU5OCBDMzcuODIzMjQ4OSwzMTEuOTAyNTk4IDM5LjAzMjA4MDEsMzEzLjExMTQyOSAzOS4wMzIwODAxLDMxNC42MDI1OTggQzM5LjAzMjA4MDEsMzE2LjA5Mzc2NyAzNy44MjMyNDg5LDMxNy4zMDI1OTggMzYuMzMyMDgwMSwzMTcuMzAyNTk4IEwzNi4xMzg5NDQ1LDMxNy4zMDI1OTggTDM2LjEzODk0NDUsMzIyLjI4ODA4NiBMMjkuNjA4NzIwOSwzMjIuMjg4MDg2IEwyOS42MDg3MjA5LDMyMC41NzE2OSBDMjkuNjA4NzIwOSwzMjAuMDIxMzMgMjkuMTYyNTY2NSwzMTkuNTc1MTc2IDI4LjYxMjIwNywzMTkuNTc1MTc2IEMyOC4wNjE4NDc2LDMxOS41NzUxNzYgMjcuNjE1NjkzMSwzMjAuMDIxMzMgMjcuNjE1NjkzMSwzMjAuNTcxNjkgTDI3LjYxNTY5MzEsMzIyLjI4ODA4NiBaIgogICAgICAgICAgICBpZD0icGF0aC0xIj48L3BhdGg+CiAgICA8L2RlZnM+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAuMDAwMDAwLCAtMzA0LjAwMDAwMCkiPgogICAgICAgIDxnPgogICAgICAgICAgICA8dXNlIGZpbGwtcnVsZT0iZXZlbm9kZCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgICBzdHJva2U9IiM5Nzk3OTciCiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9IjEuMzUiCiAgICAgICAgICAgICAgICBkPSJNMjYuOTQwNjkzMSwzMjEuNjEzMDg2IEwyNi45NDA2OTMxLDMyMC41NzE2OSBDMjYuOTQwNjkzMSwzMTkuNjQ4NTM4IDI3LjY4OTA1NTQsMzE4LjkwMDE3NiAyOC42MTIyMDcsMzE4LjkwMDE3NiBDMjkuNTM1MzU4NywzMTguOTAwMTc2IDMwLjI4MzcyMDksMzE5LjY0ODUzOCAzMC4yODM3MjA5LDMyMC41NzE2OSBMMzAuMjgzNzIwOSwzMjEuNjEzMDg2IEwzNS40NjM5NDQ1LDMyMS42MTMwODYgTDM1LjQ2Mzk0NDUsMzE2LjYyNzU5OCBMMzYuMzMyMDgwMSwzMTYuNjI3NTk4IEMzNy40NTA0NTY3LDMxNi42Mjc1OTggMzguMzU3MDgwMSwzMTUuNzIwOTc1IDM4LjM1NzA4MDEsMzE0LjYwMjU5OCBDMzguMzU3MDgwMSwzMTMuNDg0MjIxIDM3LjQ1MDQ1NjcsMzEyLjU3NzU5OCAzNi4zMzIwODAxLDMxMi41Nzc1OTggTDM1LjQ2Mzk0NDUsMzEyLjU3NzU5OCBMMzUuNDYzOTQ0NSwzMDcuNTkyMTEgTDMwLjY2NDg5MjYsMzA3LjU5MjExIEwzMC42NjQ4OTI2LDMwNi44MTYzNjggQzMwLjY2NDg5MjYsMzA1LjY5Nzk5MSAyOS43NTgyNjkyLDMwNC43OTEzNjggMjguNjM5ODkyNiwzMDQuNzkxMzY4IEMyNy41MjE1MTYsMzA0Ljc5MTM2OCAyNi42MTQ4OTI2LDMwNS42OTc5OTEgMjYuNjE0ODkyNiwzMDYuODE2MzY4IEwyNi42MTQ4OTI2LDMwNy41OTIxMSBMMjEuNDQyOTY4NywzMDcuNTkyMTEgTDIxLjQ0Mjk2ODcsMzEyLjc0Nzk5OCBMMjEuOTU5OTMxNCwzMTIuNzQ3OTk4IEMyMi44ODMwODMxLDMxMi43NDc5OTggMjMuNjMxNDQ1MywzMTMuNDk2MzYgMjMuNjMxNDQ1MywzMTQuNDE5NTEyIEMyMy42MzE0NDUzLDMxNS4zNDI2NjQgMjIuODgzMDgzMSwzMTYuMDkxMDI2IDIxLjk1OTkzMTQsMzE2LjA5MTAyNiBMMjEuNDQyOTY4NywzMTYuMDkxMDI2IEwyMS40NDI5Njg3LDMyMS42MTMwODYgTDI2Ljk0MDY5MzEsMzIxLjYxMzA4NiBaIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 9713:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQgMTBDNCAxMCA4IDE0Ljc3MiAxMiAxNC43NzJDMTYgMTQuNzcyIDIwIDEwIDIwIDEwIiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTEyIDE1VjE3IiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTE4IDEzVjE1IiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTYgMTNWMTUiIHN0cm9rZT0iIzY3QjI3OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 2834:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDExLjc3MkM2LjY2NjY3IDguNTkwNjUgOS4zMzMzMyA3IDEyIDdDMTQuNjY2NyA3IDE3LjMzMzMgOC41OTA2NSAyMCAxMS43NzJDMjAgMTEuNzcyIDE2IDE2Ljc3MiAxMiAxNi43NzJDOCAxNi43NzIgNCAxMS43NzIgNCAxMS43NzJaIiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMiAxMEMxMy4xMDQ2IDEwIDE0IDEwLjg5NTQgMTQgMTJDMTQgMTMuMTA0NiAxMy4xMDQ2IDE0IDEyIDE0QzEwLjg5NTQgMTQgMTAgMTMuMTA0NiAxMCAxMkMxMCAxMC44OTU0IDEwLjg5NTQgMTAgMTIgMTBaIiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjwvc3ZnPgo=\");\n\t }),\n\t 6255:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTkgMTciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZGVmcz4KICAgICAgICA8cmVjdCBpZD0icGF0aC0xIiB4PSIwLjc2Nzk2ODc1IiB5PSIwLjk4MDY2NDA2MyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE1Ljg4MDUxNzYiIHJ4PSIxLjgiPjwvcmVjdD4KICAgIDwvZGVmcz4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMC4wMDAwMDAsIC0xODQuMDAwMDAwKSI+CiAgICAgICAgPGcgaWQ9Ikdyb3VwLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwLjAwMDAwMCwgMTg0LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iUmVjdGFuZ2xlIj4KICAgICAgICAgICAgICAgIDx1c2UgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgIDxyZWN0IHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1IiB4PSIxLjQ0Mjk2ODc1IiB5PSIxLjY1NTY2NDA2IiB3aWR0aD0iMTYuNjUiIGhlaWdodD0iMTQuNTMwNTE3NiIgcng9IjEuOCI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iTGluZS0zIiBzdHJva2U9IiM5Nzk3OTciIHN0cm9rZS13aWR0aD0iMS4zNSIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgcG9pbnRzPSIxLjYyNjY2MDE2IDEzLjA3MTMzNzkgNS4yMjY2NjAxNiA5LjQ3MTMzNzg5IDguMTc0MDcyMjcgMTIuMTE1NTI3MyAxMi45Mjk4MzQgNi43MjgyNzE0OCAxNy44Njc5Njg3IDEyLjMzMzA1NjYiPjwvcG9seWxpbmU+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 9053:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMzUgMzYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0LjAwMDAwMCwgLTIxOS4wMDAwMDApIj4KICAgICAgICA8ZyBpZD0iMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDAuMDAwMDAwLCAxOTAuMDAwMDAwKSI+CiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyNC41MDAwMDAsIDI5LjQxNDA2MikiPgogICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC40NTM2NTYsIDAuMjI2ODI4KSI+CiAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMTYuNzE1NzQ5MiwwIEMxMS40OTA5MTk1LDAgNS4xODg0Njg3NywxLjI2NTU4MzUxIDUuMTI2MjAxMTRlLTA2LDQuMDUxMjIyMzkgQzUuMTI2MjAxMTRlLTA2LDEwLjA2NzQ0OTUgLTAuMDcxNjEzNjMyNCwyNS4wNTU2OTI1IDE2LjcxNTc0OTIsMzUuMjk2Njc5OCBDMzMuNTAzNDgzLDI1LjA1NTY5MjUgMzMuNDMyMjM1NCwxMC4wNjc0NDk1IDMzLjQzMjIzNTQsNC4wNTEyMjIzOSBDMjguMjQzNDAwNiwxLjI2NTU4MzUxIDIxLjk0MDk0OTksMCAxNi43MTU3NDkyLDAgTDE2LjcxNTc0OTIsMCBaIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJQYXRoIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IiM2OEJDNzEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNi42OTg2NzQzLDM1LjI4NjI1ODIgQy0wLjA3MTU2NTA2MDUsMjUuMDQ1NTI2OCA1LjEyNjIwMTEzZS0wNiwxMC4wNjU0MDkxIDUuMTI2MjAxMTNlLTA2LDQuMDUxMjIyMzkgQzUuMTgyODE4MDIsMS4yNjg2MTczNCAxMS40NzcxOTI5LDAuMDAyNzU4NDkxMjQgMTYuNjk4Njc0Myw0LjUwMzc4MzExZS0wNiBMMTYuNjk4Njc0MywzNS4yODYyNjE3IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgZmlsbD0iIzY3QjI3OSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMTYuMTA2MDI0NywyMy41NTEwOTQgTDI2LjIxNDMxNTUsOS41MTgwMTg2OSBDMjUuNDczNjAwNSw4LjkwNjQ3MjQ5IDI0LjgyMzg4NzYsOS4zMzgwODkxNiAyNC40NjYyMjgxLDkuNjcyMjQ0IEwyNC40NTMxNzc0LDkuNjczMzE1MDEgTDE2LjAyNDg5ODcsMTguNzA0NDIwOCBMMTIuODQ5MzQ3NywxNC43NjgxMDUzIEMxMS4zMzQ0MDkxLDEyLjk2NTI0IDkuMjc0ODY4NjYsMTQuMzQwNDE1NyA4Ljc5Mzc1NjYyLDE0LjcwMzg0NDggTDE2LjEwNjAyNDcsMjMuNTUxMDk0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9IkZpbGwtMTEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 6265:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEwIDZWMTBINiIgc3Ryb2tlPSIjQTRBNEE0IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0xMCAxOFYxNEg2IiBzdHJva2U9IiNBNEE0QTQiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPHBhdGggZD0iTTE0IDZWMTBIMTgiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTQgMThWMTRIMTgiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 7693:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTYgMTBWNkgxME02IDE0VjE4SDEwTTE4IDEwVjZIMTRNMTggMTRWMThIMTQiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 8115:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyMDAiIHZpZXdCb3g9IjAgMCA0MDAgMjAwIj4KICAgIDxkZWZzPgogICAgICAgIDxnIGlkPSJhcnIiPgogICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9IjE4LjgsODQuNSAxOC44LDMyIDg2LjcsMTAwIDEwMCw4Ni43IDMyLDE4LjggODQuNSwxOC44IDg0LjUsMCAxOC44LDAgMCwwIDAsMTguOAogICAgICAgICAgICAgICAgMCw4NC41IAkiLz4KICAgICAgICA8L2c+CiAgICA8L2RlZnM+CgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjYWJhYmFiIi8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNhcnIiIGZpbGw9IiNhYmFiYWIiIHRyYW5zZm9ybT0icm90YXRlKDkwIDEwMCAxMDApIi8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNhcnIiIGZpbGw9IiNhYmFiYWIiIHRyYW5zZm9ybT0icm90YXRlKDE4MCAxMDAgMTAwKSIvPgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjYWJhYmFiIiB0cmFuc2Zvcm09InJvdGF0ZSgyNzAgMTAwIDEwMCkiLz4KCiAgICA8dXNlIHhsaW5rOmhyZWY9IiNhcnIiIGZpbGw9IiNmZmYiIHg9IjIwMCIvPgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjZmZmIiB5PSItMjAwIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAxMDAgMTAwKSIvPgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjZmZmIiB4PSItMjAwIiB0cmFuc2Zvcm09InJvdGF0ZSgxODAgMTAwIDEwMCkiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI2FyciIgZmlsbD0iI2ZmZiIgeT0iMjAwIiB0cmFuc2Zvcm09InJvdGF0ZSgyNzAgMTAwIDEwMCkiLz4KPC9zdmc+Cg==\");\n\t }),\n\t 9385:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTcgMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjIuMDAwMDAwLCAtMjI0LjAwMDAwMCkiPgogICAgICAgIDxwYXRoIGQ9Ik0yMi44MTc1NzgxLDIzNC40MTc0NTUgTDIyLjgxNzU3ODEsMjQwLjU1OTc0NyBMMzYuODk2MDY2LDIzMi43MjMwODkgTDIyLjgxNzU3ODEsMjI1LjY5OTEyMSBMMjIuODE3NTc4MSwyMzEuMDgwNTcyIEwyNS45Nzg4MzYzLDIzMi42NTc3NzEgTDIyLjgxNzU3ODEsMjM0LjQxNzQ1NSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1Ij48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPgo=\");\n\t }),\n\t 8225:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjEuMDAwMDAwLCAtMjYzLjAwMDAwMCkiPgogICAgICAgIDxwYXRoIGQ9Ik0zMC4wMjM1ODk1LDI4MC4xMTkwMjQgQzI5Ljk3MTAwMTYsMjgwLjExOTAyNCAyOS45MTgzNjI1LDI4MC4xMTA4OTggMjkuODY3NjY1NSwyODAuMDk0NjQ3IEMyOC4xNjM1OTE1LDI3OS41NDg3ODUgMjYuNzEyNzk4MSwyNzguNTAxNzc5IDI1LjU1NTUwNTcsMjc2Ljk4Mjc1OSBDMjQuNjQ0MzkwMywyNzUuNzg2ODMxIDIzLjkxNDg1NCwyNzQuMjk4MzczIDIzLjM4NzI4ODEsMjcyLjU1ODcyOSBDMjIuNDk3MzMwNSwyNjkuNjI0NDg1IDIyLjQ4NzEwOTQsMjY3LjAxMDUyMiAyMi40ODcxMDk0LDI2Ni45MDA2OTYgQzIyLjQ4NzEwOTQsMjY2LjYzNzUwMSAyMi42ODcwMzU1LDI2Ni40MTcyODYgMjIuOTQ5MDU1MywyNjYuMzkxOTg4IEMyMi45ODg1MDksMjY2LjM4ODE1NSAyNi45NTc2OTc0LDI2NS45ODA2ODggMjkuNzIzMjkxNCwyNjMuOTcyMjc5IEMyOS45MDIzNjY0LDI2My44NDIxNjMgMzAuMTQ0ODYzNywyNjMuODQyMzE2IDMwLjMyMzkzODcsMjYzLjk3MjMzIEMzMy4wODg3NjYyLDI2NS45ODA2ODggMzcuMDU4NDY1NiwyNjYuMzg4MTU1IDM3LjA5ODIyNTksMjY2LjM5MjAzOSBDMzcuMzYwMDQxMywyNjYuNDE3NTkyIDM3LjU1OTkxNjMsMjY2LjYzNzcwNSAzNy41NTk5MTYzLDI2Ni45MDA2OTYgQzM3LjU1OTkxNjMsMjY3LjAxMDUyMiAzNy41NDk2OTUyLDI2OS42MjQ0ODUgMzYuNjU5Nzg4NywyNzIuNTU4NzggQzM2LjEzMjE3MTcsMjc0LjI5ODQyNCAzNS40MDI2ODY1LDI3NS43ODY4ODIgMzQuNDkxNTcxMSwyNzYuOTgyODExIEMzMy4zMzQzMjk5LDI3OC41MDE4MyAzMS44ODM1MzY1LDI3OS41NDg4MzYgMzAuMTc5NDYyNCwyODAuMDk0Njk4IEMzMC4xMjg3NjU0LDI4MC4xMTA4OTggMzAuMDc2MTc3NSwyODAuMTE5MDI0IDMwLjAyMzU4OTUsMjgwLjExOTAyNCBMMzAuMDIzNTg5NSwyODAuMTE5MDI0IFoiIGlkPSJQYXRoIiBzdHJva2U9IiM5Nzk3OTciIHN0cm9rZS13aWR0aD0iMS4zNSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 2286:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTkgMTkiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAuMDAwMDAwLCAtMzQzLjAwMDAwMCkiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwLjE0MjM4MywgMzQzLjMwMzQ2NykiIHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1Ij4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgIGQ9Ik03LjcxMTUyMzQ0LDEuOTAwNjM0NzcgTDcuNzExNTIzNDQsMi44OTYzNDMxNSBMNy4yMjkwNjY5NCwzLjAzOTkyOTIyIEM2LjgxMTM1NTQzLDMuMTY0MjQ2MjUgNi40MDg2MjIwOCwzLjMzMTQ2NDY4IDYuMDI2NDg4NDEsMy41Mzg1MzQ3NyBMNS41ODM3MDgzMiwzLjc3ODQ2Nzg2IEw0Ljg3OTEwMjQyLDMuMDczODYxOTYgQzQuNDM5NzYyNiwyLjYzNDUyMjE0IDMuNzI3NDUxOTksMi42MzQ1MjIxNCAzLjI4ODExMjE3LDMuMDczODYxOTYgTDMuMDAyMjMxMSwzLjM1OTc0MzAzIEMyLjU2Mjg5MTI4LDMuNzk5MDgyODUgMi41NjI4OTEyOCw0LjUxMTM5MzQ2IDMuMDAyMjMxMSw0Ljk1MDczMzI4IEwzLjcwNjgzNyw1LjY1NTMzOTE4IEwzLjQ2NjkwMzkxLDYuMDk4MTE5MjcgQzMuMjU5ODMzODIsNi40ODAyNTI5MyAzLjA5MjYxNTM5LDYuODgyOTg2MjkgMi45NjgyOTgzNiw3LjMwMDY5NzggTDIuODI0NzEyMjksNy43ODMxNTQzIEwxLjgyOTAwMzkxLDcuNzgzMTU0MyBDMS4yMDc2ODM1Niw3Ljc4MzE1NDMgMC43MDQwMDM5MDYsOC4yODY4MzM5NSAwLjcwNDAwMzkwNiw4LjkwODE1NDMgTDAuNzA0MDAzOTA2LDkuMzEyNDUxMTcgQzAuNzA0MDAzOTA2LDkuOTMzNzcxNTIgMS4yMDc2ODM1NiwxMC40Mzc0NTEyIDEuODI5MDAzOTEsMTAuNDM3NDUxMiBMMi44MjQ3MTIyOSwxMC40Mzc0NTEyIEwyLjk2ODI5ODM2LDEwLjkxOTkwNzcgQzMuMDkyNjE1MzksMTEuMzM3NjE5MiAzLjI1OTgzMzgyLDExLjc0MDM1MjUgMy40NjY5MDM5MSwxMi4xMjI0ODYyIEwzLjcwNjgzNywxMi41NjUyNjYzIEwzLjAwMjIzMTEsMTMuMjY5ODcyMiBDMi41NjI4OTEyOCwxMy43MDkyMTIgMi41NjI4OTEyOCwxNC40MjE1MjI2IDMuMDAyMjMxMSwxNC44NjA4NjI0IEwzLjI4ODExMjE3LDE1LjE0Njc0MzUgQzMuNzI3NDUxOTksMTUuNTg2MDgzMyA0LjQzOTc2MjYsMTUuNTg2MDgzMyA0Ljg3OTEwMjQyLDE1LjE0Njc0MzUgTDUuNTgzNzA4MzIsMTQuNDQyMTM3NiBMNi4wMjY0ODg0MSwxNC42ODIwNzA3IEM2LjQwODYyMjA4LDE0Ljg4OTE0MDggNi44MTEzNTU0MywxNS4wNTYzNTkyIDcuMjI5MDY2OTQsMTUuMTgwNjc2MiBMNy43MTE1MjM0NCwxNS4zMjQyNjIzIEw3LjcxMTUyMzQ0LDE2LjMxOTk3MDcgQzcuNzExNTIzNDQsMTYuOTQxMjkxIDguMjE1MjAzMDksMTcuNDQ0OTcwNyA4LjgzNjUyMzQ0LDE3LjQ0NDk3MDcgTDkuMjQwODIwMzEsMTcuNDQ0OTcwNyBDOS44NjIxNDA2NiwxNy40NDQ5NzA3IDEwLjM2NTgyMDMsMTYuOTQxMjkxIDEwLjM2NTgyMDMsMTYuMzE5OTcwNyBMMTAuMzY1ODIwMywxNS4zMjQyNjIzIEwxMC44NDgyNzY4LDE1LjE4MDY3NjIgQzExLjI2NTk4ODMsMTUuMDU2MzU5MiAxMS42Njg3MjE3LDE0Ljg4OTE0MDggMTIuMDUwODU1MywxNC42ODIwNzA3IEwxMi40OTM2MzU0LDE0LjQ0MjEzNzYgTDEzLjE5ODI0MTMsMTUuMTQ2NzQzNSBDMTMuNjM3NTgxMiwxNS41ODYwODMzIDE0LjM0OTg5MTgsMTUuNTg2MDgzMyAxNC43ODkyMzE2LDE1LjE0Njc0MzUgTDE1LjA3NTExMjYsMTQuODYwODYyNCBDMTUuNTE0NDUyNSwxNC40MjE1MjI2IDE1LjUxNDQ1MjUsMTMuNzA5MjEyIDE1LjA3NTExMjYsMTMuMjY5ODcyMiBMMTQuMzcwNTA2NywxMi41NjUyNjYzIEwxNC42MTA0Mzk4LDEyLjEyMjQ4NjIgQzE0LjgxNzUwOTksMTEuNzQwMzUyNSAxNC45ODQ3Mjg0LDExLjMzNzYxOTIgMTUuMTA5MDQ1NCwxMC45MTk5MDc3IEwxNS4yNTI2MzE1LDEwLjQzNzQ1MTIgTDE2LjI0ODMzOTgsMTAuNDM3NDUxMiBDMTYuODY5NjYwMiwxMC40Mzc0NTEyIDE3LjM3MzMzOTgsOS45MzM3NzE1MiAxNy4zNzMzMzk4LDkuMzEyNDUxMTcgTDE3LjM3MzMzOTgsOC45MDgxNTQzIEMxNy4zNzMzMzk4LDguMjg2ODMzOTUgMTYuODY5NjYwMiw3Ljc4MzE1NDMgMTYuMjQ4MzM5OCw3Ljc4MzE1NDMgTDE1LjI1MjYzMTUsNy43ODMxNTQzIEwxNS4xMDkwNDU0LDcuMzAwNjk3OCBDMTQuOTg0NzI4NCw2Ljg4Mjk4NjI5IDE0LjgxNzUwOTksNi40ODAyNTI5MyAxNC42MTA0Mzk4LDYuMDk4MTE5MjcgTDE0LjM3MDUwNjcsNS42NTUzMzkxOCBMMTUuMDc1MTEyNiw0Ljk1MDczMzI4IEMxNS41MTQ0NTI1LDQuNTExMzkzNDYgMTUuNTE0NDUyNSwzLjc5OTA4Mjg1IDE1LjA3NTExMjYsMy4zNTk3NDMwMyBMMTQuNzg5MjMxNiwzLjA3Mzg2MTk2IEMxNC4zNDk4OTE4LDIuNjM0NTIyMTQgMTMuNjM3NTgxMiwyLjYzNDUyMjE0IDEzLjE5ODI0MTMsMy4wNzM4NjE5NiBMMTIuNDkzNjM1NCwzLjc3ODQ2Nzg2IEwxMi4wNTA4NTUzLDMuNTM4NTM0NzcgQzExLjY2ODcyMTcsMy4zMzE0NjQ2OCAxMS4yNjU5ODgzLDMuMTY0MjQ2MjUgMTAuODQ4Mjc2OCwzLjAzOTkyOTIyIEwxMC4zNjU4MjAzLDIuODk2MzQzMTUgTDEwLjM2NTgyMDMsMS45MDA2MzQ3NyBDMTAuMzY1ODIwMywxLjI3OTMxNDQyIDkuODYyMTQwNjYsMC43NzU2MzQ3NjYgOS4yNDA4MjAzMSwwLjc3NTYzNDc2NiBMOC44MzY1MjM0NCwwLjc3NTYzNDc2NiBDOC4yMTUyMDMwOSwwLjc3NTYzNDc2NiA3LjcxMTUyMzQ0LDEuMjc5MzE0NDIgNy43MTE1MjM0NCwxLjkwMDYzNDc3IFoiCiAgICAgICAgICAgICAgICBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0xNSIgY3g9IjkuMDM4NjcxODgiIGN5PSI5LjExMDMwMjczIiByPSIxLjgiPjwvY2lyY2xlPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==\");\n\t }),\n\t 1660:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiNENkQ2RDYiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 1372:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiNENkQ2RDYiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 6112:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiNENkQ2RDYiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 9919:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiM3MTcxNzEiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 9023:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiM3MTcxNzEiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjNzE3MTcxIi8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 6810:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiM3MTcxNzEiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjNzE3MTcxIi8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgo8L3N2Zz4K\");\n\t }),\n\t 2307:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDM4IDE1Ij4KICAgIDxwYXRoIGQ9Ik0yMS45MSwxLjA4MyBDMTguMDA4LDEuMDgzIDE0Ljg0Niw0LjA3IDE0Ljg0Niw3Ljc1OCBDMTQuODQ2LDExLjQ0NSAxOC4wMDgsMTQuNDMyIDIxLjkxLDE0LjQzMiBDMjUuODEzLDE0LjQzMiAyOC45NzcsMTEuNDQ1IDI4Ljk3Nyw3Ljc1OCBDMjguOTc4LDQuMDcgMjUuODEzLDEuMDgzIDIxLjkxLDEuMDgzIHogTTIxLjc3MSwxMS45IEMxOS41LDExLjkgMTcuNjU3LDEwLjA1NiAxNy42NTcsNy43ODMgQzE3LjY1Nyw1LjUwOCAxOS41MDEsMy42NjQgMjEuNzcxLDMuNjY0IEMyNC4wNDUsMy42NjQgMjUuODg2LDUuNTA4IDI1Ljg4Niw3Ljc4MyBDMjUuODg2LDEwLjA1NyAyNC4wNDUsMTEuOSAyMS43NzEsMTEuOSB6IiBmaWxsPSIjNzRCMDNFIi8+CiAgICA8cGF0aCBkPSJNMTYuNzUxLDAuNjQyIEwxNy4wMzEsMCBMMTQuMDYzLDAgTDExLjI3LDggTDguNjQ4LDAgTDguMjcyLDAgTDUuNjUsOCBMMywwIEwwLjAzMSwwIEw0LjksMTMuNDg2IEM0LjksMTMuNDg2IDUuMDc4LDEzLjg2IDUuMjc1LDEzLjg2IEM1LjQ1MSwxMy44NiA1LjY0OSwxMy40ODYgNS42NDksMTMuNDg2IEw4LjQ0NSw2LjQwNiBMMTEuMjY5LDEzLjQ4NiBDMTEuMjY5LDEzLjQ4NiAxMS40NTUsMTMuODYgMTEuNjQzLDEzLjg2IEMxMS44MjksMTMuODYgMTIuMDE4LDEzLjQ4NiAxMi4wMTgsMTMuNDg2IEwxMy42MTQsOS4wNjcgQzEzLjQ0NSw4LjQzMyAxMy4zNDUsNy43NzMgMTMuMzQ1LDcuMDg5IEMxMy4zNDYsNC40NTMgMTQuNjg2LDIuMTE4IDE2Ljc1MSwwLjY0MiB6IiBmaWxsPSIjRUUzNDI4Ii8+CiAgICA8cGF0aCBkPSJNMjcuMDMxLDAgTDI3LjAzMSwwLjYxMyBDMjcuOTQ0LDEuMjU4IDI4LjcxNSwyLjA2NyAyOS4yOTUsMyBMMzEuMDMxLDMgTDMxLjAzMSwxNCBMMzQuMDMxLDE0IEwzNC4wMzEsMyBMMzguMDMxLDMgTDM4LjAzMSwwIEwyNy4wMzEsMCB6IiBmaWxsPSIjRjA4NjE1Ii8+Cjwvc3ZnPgo=\");\n\t }),\n\t 897:\n\t ((module) => {\n\tmodule.exports = JSON.parse('[{\"project_id\":\"adguard-assistant\",\"base_locale\":\"en\",\"languages\":{\"en\":\"English\",\"ar\":\"Arabic\",\"be\":\"Belarusian\",\"cs\":\"Czech\",\"da\":\"Danish\",\"de\":\"German\",\"el\":\"Greek\",\"es\":\"Spanish\",\"fa\":\"Persian\",\"fi\":\"Finnish\",\"fr\":\"French\",\"he\":\"Hebrew\",\"hu\":\"Hungarian\",\"id\":\"Indonesian\",\"it\":\"Italian\",\"ja\":\"Japanese\",\"ko\":\"Korean\",\"lt\":\"Lithuanian\",\"no\":\"Norwegian\",\"nl\":\"Dutch\",\"pl\":\"Polish\",\"pt-BR\":\"Portuguese (Brazil)\",\"pt-PT\":\"Portuguese\",\"ro\":\"Romanian\",\"ru\":\"Russian\",\"sk\":\"Slovak\",\"sl\":\"Slovenian\",\"sr\":\"Serbian (latin)\",\"sv\":\"Swedish\",\"tr\":\"Turkish\",\"uk\":\"Ukrainian\",\"vi\":\"Vietnamese\",\"zh-CN\":\"Chinese Simplified (mainland China)\",\"zh-HK\":\"Chinese Traditional (Hong Kong)\",\"zh-TW\":\"Chinese Traditional (Taiwan)\",\"hi\":\"Hindi\",\"hr\":\"Croatian\"},\"localizable_files\":[\"locales/en/messages.json\",\"locales/en/messages.meta.json\"]}]');\n\t }),\n\t 5443:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"مواقع الويب\",\"settings_position_save_all\":\"كافة مواقع الويب\",\"settings_position_save_this\":\"هذا الموقع\",\"assistant_select_element_start\":\"بدء\",\"assistant_select_element_text\":\"اختر عنصرا في الصفحة للحظرقم بتحديث الصفحة لالغاء وضع حظر العنصر\",\"menu_filtration_status\":{\"message\":\"تفعيل الفلترةعلى هذا الموقع\"},\"menu_do_not_filter_30_sec\":{\"message\":\"عدم الفلترة لمده 30 ثانيه\"},\"menu_block_ad_on_site\":{\"message\":\"منع الإعلان على هذا الموقع\"},\"menu_report_abuse\":{\"message\":\"الإبلاغ عن هذا الموقع\"},\"menu_site_report\":{\"message\":\"تقرير أمن الموقع\"},\"menu_settings\":{\"message\":\"إعدادات المساعد\"},\"menu_wot_reputation_indicator\":{\"message\":\"مؤشر سمعة الموقع\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"مستوى الثقة في السمعة\"},\"assistant_select_element\":{\"message\":\"حظر العنصر\"},\"assistant_select_element_ext\":{\"message\":\"اختر عنصرا في الصفحة للحظر\"},\"assistant_select_element_cancel\":{\"message\":\"الغاء\"},\"assistant_block_element\":{\"message\":\"حظر العنصر\"},\"assistant_block_element_explain\":{\"message\":\"ضبط قاعدة حظر العنصر\"},\"assistant_slider_explain\":{\"message\":\"حرك شريط التمرير لتغيير حجم الإطار الذي ستعمل عليه القاعدة الجديدة:\"},\"assistant_extended_settings\":{\"message\":\"إعدادات متقدمة\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"تطبيق القاعدة علي كافة مواقع الويب\"},\"assistant_block_by_reference\":{\"message\":\"حظر حسب الارتباط المرجعي\"},\"assistant_block_similar\":{\"message\":\"حظر عنصر مما ثل\"},\"assistant_another_element\":{\"message\":\"حدد عنصرًا مختلفًا\"},\"assistant_preview\":{\"message\":\"المعاينه\"},\"assistant_block\":{\"message\":\"حظر\"},\"assistant_settings\":{\"message\":\"إعدادات المساعد\"},\"assistant_preview_header\":{\"message\":\"حجب عنصر--معاينه\"},\"assistant_preview_header_info\":{\"message\":\"تاكد من حظر هذا العنصر كما هو مقصود\"},\"assistant_preview_end\":{\"message\":\"إنهاء المعاينة\"},\"wot_unknown_description\":{\"message\":\"$1 لم يتم تعريف سمعه هذا الموقع من قبل\"},\"wot_bad_description\":{\"message\":\"$1هذا الموقع لديه سمعة سيئة للغاية \\\\nوفقاً لـ\"},\"wot_poor_description\":{\"message\":\"$1 هذا الموقع له سمعة سيئة \\\\nوفقا لـ\"},\"wot_unsatisfactory_description\":{\"message\":\"$1هذا الموقع له سمعة سيئة\\\\nوفقا لـ\"},\"wot_good_description\":{\"message\":\"$1يتمتع هذا الموقع بسمعة طيبة\\\\nوفقا لـ\"},\"wot_excellent_description\":{\"message\":\"هذا الموقع يتمتع بسمعة ممتازة\\\\nوفقاً لـ $1\"},\"settings_choose_size_and_position\":{\"message\":\"وموضعه AdGuard ضبط حجم مساعد\"},\"settings_icon_size\":{\"message\":\":حجم الرمز\"},\"settings_small\":{\"message\":\"صغير\"},\"settings_big\":{\"message\":\"كبير\"},\"settings_position\":{\"message\":\"وضع\"},\"settings_left_top\":{\"message\":\"اعلي اليسار\"},\"settings_right_top\":{\"message\":\"اعلي اليمين\"},\"settings_left_bottom\":{\"message\":\"أسفل لليسار\"},\"settings_right_bottom\":{\"message\":\"أسفل لليمين\"},\"settings_cancel\":{\"message\":\"الغاء\"},\"settings_save\":{\"message\":\"حفظ التغييرات\"}}');\n\t }),\n\t 24:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Сайты\",\"settings_position_save_all\":\"На ўсіх\",\"settings_position_save_this\":\"Толькі на гэтым\",\"assistant_select_element_start\":\"Пачаць\",\"assistant_select_element_text\":\"Абярыце на старонцы элемент для блакавання. Абнавіце старонку, каб скасаваць рэжым блакавання элементаў.\",\"menu_filtration_status\":{\"message\":\"Фільтрацыя на гэтым сайце\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Не фільтраваць 30 секундаў\"},\"menu_block_ad_on_site\":{\"message\":\"Заблакаваць рэкламу на сайце\"},\"menu_report_abuse\":{\"message\":\"Паскардзіцца на сайт\"},\"menu_site_report\":{\"message\":\"Справаздача пра бяспеку сайта\"},\"menu_settings\":{\"message\":\"Наладзіць памочнік\"},\"menu_wot_reputation_indicator\":{\"message\":\"Індыкатар рэпутацыі сайта\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Узровень верагоднасці рэпутацыі\"},\"assistant_select_element\":{\"message\":\"Блакаванне элемента\"},\"assistant_select_element_ext\":{\"message\":\"Абярыце на старонцы элемент, які трэба заблакаваць\"},\"assistant_select_element_cancel\":{\"message\":\"Скасаванне\"},\"assistant_block_element\":{\"message\":\"Блакаванне элемента\"},\"assistant_block_element_explain\":{\"message\":\"Наладзьце правіла блакавання элемента\"},\"assistant_slider_explain\":{\"message\":\"Перасоўвайце бегунок, каб змяніць памер блока, для якога будзе дзейнічаць правіла:\"},\"assistant_extended_settings\":{\"message\":\"Пашыраныя налады\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Ужыць правіла для ўсіх сайтаў\"},\"assistant_block_by_reference\":{\"message\":\"Блакаваць па спасылцы\"},\"assistant_block_similar\":{\"message\":\"Блакаваць падобныя\"},\"assistant_another_element\":{\"message\":\"Абраць іншы элемент\"},\"assistant_preview\":{\"message\":\"Перадпрагляд\"},\"assistant_block\":{\"message\":\"Заблакаваць\"},\"assistant_settings\":{\"message\":\"Налада памочніка\"},\"assistant_preview_header\":{\"message\":\"Блакаванне элемента - перадпрагляд\"},\"assistant_preview_header_info\":{\"message\":\"Пераканаецеся, што элемент заблакаваны як задумана\"},\"assistant_preview_end\":{\"message\":\"Скончыць перадпрагляд\"},\"wot_unknown_description\":{\"message\":\"Рэпутацыя не вызначана\"},\"wot_bad_description\":{\"message\":\"У сайта вельмі дрэнная рэпутацыя па дадзеных $1\"},\"wot_poor_description\":{\"message\":\"У сайта дрэнная рэпутацыя па дадзеных $1\"},\"wot_unsatisfactory_description\":{\"message\":\"У сайта нездавальняльная рэпутацыя па дадзеных $1\"},\"wot_good_description\":{\"message\":\"У сайта добрая рэпутацыя па дадзеных $1\"},\"wot_excellent_description\":{\"message\":\"У сайта выдатная рэпутацыя па дадзеных $1\"},\"settings_choose_size_and_position\":{\"message\":\"Наладзьце памер і становішча памочніка AdGuard\"},\"settings_icon_size\":{\"message\":\"Памер іконкі:\"},\"settings_small\":{\"message\":\"Маленькая\"},\"settings_big\":{\"message\":\"Вялікая\"},\"settings_position\":{\"message\":\"Месцаванне:\"},\"settings_left_top\":{\"message\":\"Уверсе злева\"},\"settings_right_top\":{\"message\":\"Уверсе справа\"},\"settings_left_bottom\":{\"message\":\"Унізе злева\"},\"settings_right_bottom\":{\"message\":\"Унізе справа\"},\"settings_cancel\":{\"message\":\"Скасаваць\"},\"settings_save\":{\"message\":\"Захаваць налады\"}}');\n\t }),\n\t 3337:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webové stránky\",\"settings_position_save_all\":\"Všechny webové stránky\",\"settings_position_save_this\":\"Tato webová stránka\",\"assistant_select_element_start\":\"Spustit\",\"assistant_select_element_text\":\"Vyberte prvek na stránce, který chcete zablokovat. Obnovte stránku pro zrušení režimu blokování prvků.\",\"menu_filtration_status\":{\"message\":\"Filtrování na těchto webových stránkách\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nefiltrovat po dobu 30 sekund\"},\"menu_block_ad_on_site\":{\"message\":\"Blokovat reklamy na této webové stránce\"},\"menu_report_abuse\":{\"message\":\"Nahlásit webovou stránku\"},\"menu_site_report\":{\"message\":\"Zpráva o bezpečnosti webové stránky\"},\"menu_settings\":{\"message\":\"Nastavení asistenta\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikátor reputace webu\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Úroveň důvěryhodnosti reputace\"},\"assistant_select_element\":{\"message\":\"Blokování prvku\"},\"assistant_select_element_ext\":{\"message\":\"Vyberte prvek na stránce, který chcete zablokovat\"},\"assistant_select_element_cancel\":{\"message\":\"Zrušit\"},\"assistant_block_element\":{\"message\":\"Blokování prvku\"},\"assistant_block_element_explain\":{\"message\":\"Upravit pravidlo blokování prvku\"},\"assistant_slider_explain\":{\"message\":\"Přesunutím posuvníku změňte velikost rámce, pro který bude nové pravidlo fungovat:\"},\"assistant_extended_settings\":{\"message\":\"Pokročilá nastavení\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Použít pravidlo pro všechny webové stránky\"},\"assistant_block_by_reference\":{\"message\":\"Blokovat referenčním odkazem\"},\"assistant_block_similar\":{\"message\":\"Blokovat podobné\"},\"assistant_another_element\":{\"message\":\"Vyber jiný prvek\"},\"assistant_preview\":{\"message\":\"Náhled\"},\"assistant_block\":{\"message\":\"Blokovat\"},\"assistant_settings\":{\"message\":\"Nastavení asistenta\"},\"assistant_preview_header\":{\"message\":\"Blokování prvku - náhled\"},\"assistant_preview_header_info\":{\"message\":\"Ujistěte se, že je prvek zablokován podle určení\"},\"assistant_preview_end\":{\"message\":\"Ukončit náhled\"},\"wot_unknown_description\":{\"message\":\"Pověst této webové stránky není definována podle $1\"},\"wot_bad_description\":{\"message\":\"Tato webová stránka má velmi špatnou pověst \\\\npodle $1\"},\"wot_poor_description\":{\"message\":\"Tato webová stránka má špatnou pověst \\\\npodle $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Tato webová stránka má špatnou pověst \\\\npodle $1\"},\"wot_good_description\":{\"message\":\"Tato webová stránka má dobrou pověst \\\\npodle $1\"},\"wot_excellent_description\":{\"message\":\"Tato webová stránka má výbornou pověst \\\\npodle $1\"},\"settings_choose_size_and_position\":{\"message\":\"Upravit velikost a pozici AdGuard Asistenta\"},\"settings_icon_size\":{\"message\":\"Velikost ikony:\"},\"settings_small\":{\"message\":\"Malá\"},\"settings_big\":{\"message\":\"Velká\"},\"settings_position\":{\"message\":\"Pozice:\"},\"settings_left_top\":{\"message\":\"Vlevo nahoře\"},\"settings_right_top\":{\"message\":\"Vpravo nahoře\"},\"settings_left_bottom\":{\"message\":\"Vlevo dole\"},\"settings_right_bottom\":{\"message\":\"Vpravo dole\"},\"settings_cancel\":{\"message\":\"Zrušit\"},\"settings_save\":{\"message\":\"Uložit změny\"}}');\n\t }),\n\t 7691:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Websteder\",\"settings_position_save_all\":\"Alle websteder\",\"settings_position_save_this\":\"Dette websted\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Vælg et element på denne side, der skal blokeres. Opfrisk siden for at afbryde elementblokeringstilstanden.\",\"menu_filtration_status\":{\"message\":\"Filtrering på dette websted\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Filtrér ikke i 30 sekunder\"},\"menu_block_ad_on_site\":{\"message\":\"Blokér annoncer på dette websted\"},\"menu_report_abuse\":{\"message\":\"Anmeld dette websted\"},\"menu_site_report\":{\"message\":\"Webstedssikkerhedsrapport\"},\"menu_settings\":{\"message\":\"Assistent-indstillinger\"},\"menu_wot_reputation_indicator\":{\"message\":\"Webstedsomdømmeindikator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Omdømmetillidsniveau\"},\"assistant_select_element\":{\"message\":\"Elementblokering\"},\"assistant_select_element_ext\":{\"message\":\"Vælg et element på siden, der skal blokeres\"},\"assistant_select_element_cancel\":{\"message\":\"Afbryd\"},\"assistant_block_element\":{\"message\":\"Elementblokering\"},\"assistant_block_element_explain\":{\"message\":\"Justér regel for elementblokering\"},\"assistant_slider_explain\":{\"message\":\"Flyt skyderen for at ændre størrelsen på den ramme, den nye regel vil fungere for:\"},\"assistant_extended_settings\":{\"message\":\"Avancerede indstillinger\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Anvend reglen på alle websteder\"},\"assistant_block_by_reference\":{\"message\":\"Blokér efter referencelink\"},\"assistant_block_similar\":{\"message\":\"Blokér lignende\"},\"assistant_another_element\":{\"message\":\"Vælg et andet element\"},\"assistant_preview\":{\"message\":\"Forhåndsvisning\"},\"assistant_block\":{\"message\":\"Blokér\"},\"assistant_settings\":{\"message\":\"Assistent-indstillinger\"},\"assistant_preview_header\":{\"message\":\"Elementblokering - forhåndsvisning\"},\"assistant_preview_header_info\":{\"message\":\"Sørg for, at elementet er blokeret som tilsigtet\"},\"assistant_preview_end\":{\"message\":\"Afslut forhåndsvisning\"},\"wot_unknown_description\":{\"message\":\"Dette websteds omdømme er ikke defineret af $1\"},\"wot_bad_description\":{\"message\":\"Dette websted har et meget dårligt omdømme jf. $1\"},\"wot_poor_description\":{\"message\":\"Dette websted har et dårligt omdømme jf. $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Dette websted har et ringe omdømme jf. $1\"},\"wot_good_description\":{\"message\":\"Dette websted har et godt omdømme jf. $1\"},\"wot_excellent_description\":{\"message\":\"Dette websted har et fremragende omdømme \\\\njf. $1\"},\"settings_choose_size_and_position\":{\"message\":\"Justér størrelse og position for AdGuard Assistent\"},\"settings_icon_size\":{\"message\":\"Ikonstørrelse:\"},\"settings_small\":{\"message\":\"Lille\"},\"settings_big\":{\"message\":\"Stor\"},\"settings_position\":{\"message\":\"Position:\"},\"settings_left_top\":{\"message\":\"Øverst til venstre\"},\"settings_right_top\":{\"message\":\"Øverst til højre\"},\"settings_left_bottom\":{\"message\":\"Nederst til venstre\"},\"settings_right_bottom\":{\"message\":\"Nederst til højre\"},\"settings_cancel\":{\"message\":\"Afbryd\"},\"settings_save\":{\"message\":\"Gem ændringer\"}}');\n\t }),\n\t 9947:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webseiten\",\"settings_position_save_all\":\"Alle Webseiten\",\"settings_position_save_this\":\"Diese Webseite\",\"assistant_select_element_start\":\"Starten\",\"assistant_select_element_text\":\"Wählen Sie ein zu sperrenden Element auf der Seite aus. Laden Sie die Seite neu, um den Sperrmodus zu verlassen.\",\"menu_filtration_status\":{\"message\":\"Diese Webseite filtern\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Schutz für 30 Sekunden deaktivieren\"},\"menu_block_ad_on_site\":{\"message\":\"Werbung auf dieser Seite sperren\"},\"menu_report_abuse\":{\"message\":\"Diese Webseite melden\"},\"menu_site_report\":{\"message\":\"Sicherheitsbericht dieser Webseite\"},\"menu_settings\":{\"message\":\"Assistent-Einstellungen\"},\"menu_wot_reputation_indicator\":{\"message\":\"Website-Reputations-Indikator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Reputationsvertrauensgrad\"},\"assistant_select_element\":{\"message\":\"Element sperren\"},\"assistant_select_element_ext\":{\"message\":\"Zu sperrendes Element auf der Seite auswählen\"},\"assistant_select_element_cancel\":{\"message\":\"Abbrechen\"},\"assistant_block_element\":{\"message\":\"Element sperren\"},\"assistant_block_element_explain\":{\"message\":\"Regel zum Sperren von Elementen anpassen\"},\"assistant_slider_explain\":{\"message\":\"Bewegen Sie den Schieberegler, um die Ausmaßgröße der neuen Regeln zu ändern:\"},\"assistant_extended_settings\":{\"message\":\"Erweiterte Einstellungen\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Regel auf alle Webseiten anwenden\"},\"assistant_block_by_reference\":{\"message\":\"Durch Referenzlink sperren\"},\"assistant_block_similar\":{\"message\":\"Ähnliche Elemente sperren\"},\"assistant_another_element\":{\"message\":\"Ein anderes Element wählen\"},\"assistant_preview\":{\"message\":\"Vorschau\"},\"assistant_block\":{\"message\":\"Sperren\"},\"assistant_settings\":{\"message\":\"Assistent-Einstellungen\"},\"assistant_preview_header\":{\"message\":\"Vorschau der zu sperrenden Elemente\"},\"assistant_preview_header_info\":{\"message\":\"Prüfen Sie, ob das Element wie vorgesehen gesperrt wurde.\"},\"assistant_preview_end\":{\"message\":\"Vorschau beenden\"},\"wot_unknown_description\":{\"message\":\"Der Ruf dieser Webseite wird nicht durch $1 festgelegt\"},\"wot_bad_description\":{\"message\":\"Diese Webseite hat einen sehr schlechten Ruf laut $1\"},\"wot_poor_description\":{\"message\":\"Diese Webseite hat einen schlechten Ruf laut $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Diese Webseite hat einen schlechten Ruf laut $1\"},\"wot_good_description\":{\"message\":\"Diese Webseite hat einen guten Ruf laut $1\"},\"wot_excellent_description\":{\"message\":\"Diese Webseite hat einen exzellenten Ruf laut $1\"},\"settings_choose_size_and_position\":{\"message\":\"Anpassen der Größe und Position des AdGuard-Assistent\"},\"settings_icon_size\":{\"message\":\"Symbol-Größe:\"},\"settings_small\":{\"message\":\"Klein\"},\"settings_big\":{\"message\":\"Groß\"},\"settings_position\":{\"message\":\"Position:\"},\"settings_left_top\":{\"message\":\"Oben links\"},\"settings_right_top\":{\"message\":\"Oben rechts\"},\"settings_left_bottom\":{\"message\":\"Unten links\"},\"settings_right_bottom\":{\"message\":\"Unten rechts\"},\"settings_cancel\":{\"message\":\"Abbrechen\"},\"settings_save\":{\"message\":\"Änderungen speichern\"}}');\n\t }),\n\t 1773:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Ιστοσελίδες\",\"settings_position_save_all\":\"Όλοι οι ιστότοποι\",\"settings_position_save_this\":\"Αυτός ο ιστότοπος\",\"assistant_select_element_start\":\"Εκκίνηση\",\"assistant_select_element_text\":\"Επιλέξτε ένα στοιχείο στη σελίδα για αποκλεισμό. Ανανεώστε τη σελίδα για να ακυρώσετε τη λειτουργία αποκλεισμού στοιχείων.\",\"menu_filtration_status\":{\"message\":\"Φιλτράρισμα σε αυτόν τον ιστότοπο\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Παύση φιλτραρίσματος για 30 δευτερόλεπτα\"},\"menu_block_ad_on_site\":{\"message\":\"Αποκλεισμός διαφήμισης σε αυτόν τον ιστότοπο\"},\"menu_report_abuse\":{\"message\":\"Αναφέρετε αυτόν τον ιστότοπο\"},\"menu_site_report\":{\"message\":\"Αναφορά ασφάλειας ιστότοπου\"},\"menu_settings\":{\"message\":\"Ρυθμίσεις βοηθού\"},\"menu_wot_reputation_indicator\":{\"message\":\"Δείκτης φήμης ιστότοπου\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Επίπεδο εμπιστοσύνης φήμης\"},\"assistant_select_element\":{\"message\":\"Αποκλεισμός στοιχείου\"},\"assistant_select_element_ext\":{\"message\":\"Επιλέξτε ένα στοιχείο στη σελίδα για αποκλεισμό\"},\"assistant_select_element_cancel\":{\"message\":\"Άκυρο\"},\"assistant_block_element\":{\"message\":\"Αποκλεισμός στοιχείου\"},\"assistant_block_element_explain\":{\"message\":\"Προσαρμόστε τον κανόνα αποκλεισμού στοιχείου\"},\"assistant_slider_explain\":{\"message\":\"Μετακινήστε το ρυθμιστικό για να αλλάξετε το μέγεθος του πλαισίου για τον οποίο θα λειτουργεί ο νέος κανόνας:\"},\"assistant_extended_settings\":{\"message\":\"Προηγμένες ρυθμίσεις\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Εφαρμογή του κανόνα σε όλες τις ιστοσελίδες\"},\"assistant_block_by_reference\":{\"message\":\"Αποκλεισμός μέσω συνδέσμου αναφοράς\"},\"assistant_block_similar\":{\"message\":\"Αποκλεισμός παρόμοιου\"},\"assistant_another_element\":{\"message\":\"Επιλέξτε ένα διαφορετικό στοιχείο\"},\"assistant_preview\":{\"message\":\"Προεπισκόπηση\"},\"assistant_block\":{\"message\":\"Αποκλεισμός\"},\"assistant_settings\":{\"message\":\"Ρυθμίσεις βοηθού\"},\"assistant_preview_header\":{\"message\":\"Αποκλεισμός στοιχείου - προεπισκόπηση\"},\"assistant_preview_header_info\":{\"message\":\"Βεβαιωθείτε ότι το στοιχείο είναι μπλοκαρισμένο όπως προορίζεται\"},\"assistant_preview_end\":{\"message\":\"Έξοδος προεπισκόπησης\"},\"wot_unknown_description\":{\"message\":\"Η φήμη αυτού του ιστότοπου δεν έχει καθοριστεί από το $1\"},\"wot_bad_description\":{\"message\":\"Αυτός ο ιστότοπος έχει πολύ κακή φήμη\\\\nσύμφωνα με το $1\"},\"wot_poor_description\":{\"message\":\"Αυτός ο ιστότοπος έχει κακή φήμη\\\\nσύμφωνα με το $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Αυτός ο ιστότοπος έχει κακή φήμη\\\\nσύμφωνα με το $1\"},\"wot_good_description\":{\"message\":\"Αυτός ο ιστότοπος έχει καλή φήμη\\\\nσύμφωνα με το $1\"},\"wot_excellent_description\":{\"message\":\"Αυτός ο ιστότοπος έχει εξαιρετική φήμη\\\\nσύμφωνα με το $1\"},\"settings_choose_size_and_position\":{\"message\":\"Προσαρμόστε το μέγεθος και τη θέση του Βοηθού AdGuard\"},\"settings_icon_size\":{\"message\":\"Μέγεθος εικονιδίου:\"},\"settings_small\":{\"message\":\"Μικρό\"},\"settings_big\":{\"message\":\"Μεγάλο\"},\"settings_position\":{\"message\":\"Θέση:\"},\"settings_left_top\":{\"message\":\"Πάνω αριστερά\"},\"settings_right_top\":{\"message\":\"Πάνω δεξιά\"},\"settings_left_bottom\":{\"message\":\"Κάτω αριστερά\"},\"settings_right_bottom\":{\"message\":\"Κάτω δεξιά\"},\"settings_cancel\":{\"message\":\"Άκυρο\"},\"settings_save\":{\"message\":\"Αποθήκευση αλλαγών\"}}');\n\t }),\n\t 1272:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Websites\",\"settings_position_save_all\":\"All websites\",\"settings_position_save_this\":\"This website\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Choose an element on the page to block. Refresh the page to cancel the element blocking mode.\",\"menu_filtration_status\":{\"message\":\"Filtering on this website\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Do not filter for 30 seconds\"},\"menu_block_ad_on_site\":{\"message\":\"Block ad on this website\"},\"menu_report_abuse\":{\"message\":\"Report the website\"},\"menu_site_report\":{\"message\":\"Website security report\"},\"menu_settings\":{\"message\":\"Assistant settings\"},\"menu_wot_reputation_indicator\":{\"message\":\"Site reputation indicator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Reputation Confidence Level\"},\"assistant_select_element\":{\"message\":\"Element blocking\"},\"assistant_select_element_ext\":{\"message\":\"Choose an element on the page to block\"},\"assistant_select_element_cancel\":{\"message\":\"Cancel\"},\"assistant_block_element\":{\"message\":\"Element blocking\"},\"assistant_block_element_explain\":{\"message\":\"Adjust element blocking rule\"},\"assistant_slider_explain\":{\"message\":\"Move the slider to change the size of the frame the new rule will work for:\"},\"assistant_extended_settings\":{\"message\":\"Advanced settings\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Apply the rule to all websites\"},\"assistant_block_by_reference\":{\"message\":\"Block by reference link\"},\"assistant_block_similar\":{\"message\":\"Block similar\"},\"assistant_another_element\":{\"message\":\"Select a different element\"},\"assistant_preview\":{\"message\":\"Preview\"},\"assistant_block\":{\"message\":\"Block\"},\"assistant_settings\":{\"message\":\"Assistant settings\"},\"assistant_preview_header\":{\"message\":\"Element blocking - preview\"},\"assistant_preview_header_info\":{\"message\":\"Make sure that element is blocked as intended\"},\"assistant_preview_end\":{\"message\":\"Exit preview\"},\"wot_unknown_description\":{\"message\":\"This website\\'s reputation is not defined by $1\"},\"wot_bad_description\":{\"message\":\"This website has a very bad reputation\\\\naccording to $1\"},\"wot_poor_description\":{\"message\":\"This website has a bad reputation \\\\naccording to $1\"},\"wot_unsatisfactory_description\":{\"message\":\"This website has a poor reputation\\\\naccording to $1\"},\"wot_good_description\":{\"message\":\"This website has a good reputation\\\\naccording to $1\"},\"wot_excellent_description\":{\"message\":\"This website has an excellent reputation\\\\naccording to $1\"},\"settings_choose_size_and_position\":{\"message\":\"Adjust AdGuard Assistant size and position\"},\"settings_icon_size\":{\"message\":\"Icon size:\"},\"settings_small\":{\"message\":\"Small\"},\"settings_big\":{\"message\":\"Large\"},\"settings_position\":{\"message\":\"Position:\"},\"settings_left_top\":{\"message\":\"Top left\"},\"settings_right_top\":{\"message\":\"Top right\"},\"settings_left_bottom\":{\"message\":\"Bottom left\"},\"settings_right_bottom\":{\"message\":\"Bottom right\"},\"settings_cancel\":{\"message\":\"Cancel\"},\"settings_save\":{\"message\":\"Save changes\"}}');\n\t }),\n\t 8194:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sitios web\",\"settings_position_save_all\":\"Todos los sitios web\",\"settings_position_save_this\":\"Este sitio web\",\"assistant_select_element_start\":\"Comenzar\",\"assistant_select_element_text\":\"Elige un elemento en la página para bloquear. Actualiza la página para cancelar el bloqueo de elementos.\",\"menu_filtration_status\":{\"message\":\"Filtrado en este sitio web\"},\"menu_do_not_filter_30_sec\":{\"message\":\"No filtrar durante 30 segundos\"},\"menu_block_ad_on_site\":{\"message\":\"Bloquear anuncios en este sitio web\"},\"menu_report_abuse\":{\"message\":\"Reportar el sitio web\"},\"menu_site_report\":{\"message\":\"Informe de seguridad del sitio web\"},\"menu_settings\":{\"message\":\"Configuración del asistente\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicador de reputación del sitio\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nivel de confianza de reputación\"},\"assistant_select_element\":{\"message\":\"Bloqueo de elementos\"},\"assistant_select_element_ext\":{\"message\":\"Elige un elemento en la página para bloquear\"},\"assistant_select_element_cancel\":{\"message\":\"Cancelar\"},\"assistant_block_element\":{\"message\":\"Bloqueo de elementos\"},\"assistant_block_element_explain\":{\"message\":\"Ajustar la regla de bloqueo del elemento\"},\"assistant_slider_explain\":{\"message\":\"Mueve el control deslizante para cambiar el tamaño del marco para el que funcionará la nueva regla:\"},\"assistant_extended_settings\":{\"message\":\"Configuración avanzada\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplicar la regla a todos los sitios web\"},\"assistant_block_by_reference\":{\"message\":\"Bloquear por enlace de referencia\"},\"assistant_block_similar\":{\"message\":\"Bloquear elemento similar\"},\"assistant_another_element\":{\"message\":\"Seleccionar otro elemento\"},\"assistant_preview\":{\"message\":\"Vista previa\"},\"assistant_block\":{\"message\":\"Bloquear\"},\"assistant_settings\":{\"message\":\"Configuración del asistente\"},\"assistant_preview_header\":{\"message\":\"Bloqueo de elementos - vista previa\"},\"assistant_preview_header_info\":{\"message\":\"Asegúrate de que el elemento esté bloqueado como se deseaba\"},\"assistant_preview_end\":{\"message\":\"Salir de vista previa\"},\"wot_unknown_description\":{\"message\":\"La reputación de este sitio web no está definida por $1\"},\"wot_bad_description\":{\"message\":\"Este sitio web tiene muy mala reputación\\\\nde acuerdo a $1\"},\"wot_poor_description\":{\"message\":\"Este sitio web tiene mala reputación\\\\nde acuerdo a $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Este sitio web tiene pobre reputación\\\\nde acuerdo a $1\"},\"wot_good_description\":{\"message\":\"Este sitio web tiene buena reputación\\\\nde acuerdo a $1\"},\"wot_excellent_description\":{\"message\":\"Este sitio web tiene excelente reputación\\\\nde acuerdo a $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajustar el tamaño y la posición del Asistente de AdGuard\"},\"settings_icon_size\":{\"message\":\"Tamaño del icono:\"},\"settings_small\":{\"message\":\"Pequeño\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posición:\"},\"settings_left_top\":{\"message\":\"Arriba a la izquierda\"},\"settings_right_top\":{\"message\":\"Arriba a la derecha\"},\"settings_left_bottom\":{\"message\":\"Abajo a la izquierda\"},\"settings_right_bottom\":{\"message\":\"Abajo a la derecha\"},\"settings_cancel\":{\"message\":\"Cancelar\"},\"settings_save\":{\"message\":\"Guardar cambios\"}}');\n\t }),\n\t 5455:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"وبسایت\",\"settings_position_save_all\":\"همه وبسایت ها\",\"settings_position_save_this\":\"این وبسایت\",\"assistant_select_element_start\":\"شروع\",\"assistant_select_element_text\":\"عنصری در صفحه برای مسدودسازی انتخاب کنید. برای لغو،صفحه را رفرش کنید.\",\"menu_filtration_status\":{\"message\":\"فیلترینگ در این وبسایت\"},\"menu_do_not_filter_30_sec\":{\"message\":\"به مدت 30 ثانیه فیلتر نکن\"},\"menu_block_ad_on_site\":{\"message\":\"مسدودسازی تبلیغ در این وبسایت\"},\"menu_report_abuse\":{\"message\":\"گزارش وبسایت\"},\"menu_site_report\":{\"message\":\"گزارش امنیتی وبسایت\"},\"menu_settings\":{\"message\":\"تنظیمات دستیار\"},\"menu_wot_reputation_indicator\":{\"message\":\"نشانگر اعتبار سایت\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"سطح اعتبار\"},\"assistant_select_element\":{\"message\":\"مسدودسازی عنصر\"},\"assistant_select_element_ext\":{\"message\":\"عنصری در صفحه برای مسدودسازی انتخاب کنید\"},\"assistant_select_element_cancel\":{\"message\":\"لغو\"},\"assistant_block_element\":{\"message\":\"مسدودسازی عنصر\"},\"assistant_block_element_explain\":{\"message\":\"تنظیم دستور مسدودسازی عنصر\"},\"assistant_slider_explain\":{\"message\":\"جابجایی لغزنده برای تغییر اندازه فریم که دستور جدیدی کار خواهد کرد:\"},\"assistant_extended_settings\":{\"message\":\"تنظیمات پیشرفته\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"اِعمال دستور در همه وبسایت ها\"},\"assistant_block_by_reference\":{\"message\":\"مسدودسازی با لینک مرجع\"},\"assistant_block_similar\":{\"message\":\"مسدودسازی مشابه\"},\"assistant_another_element\":{\"message\":\"عنصر دیگری انتخاب کنید\"},\"assistant_preview\":{\"message\":\"پیشنمایش\"},\"assistant_block\":{\"message\":\"مسدود\"},\"assistant_settings\":{\"message\":\"تنظیمات دستیار\"},\"assistant_preview_header\":{\"message\":\"مسدودسازی عنصر - پیشنمایش\"},\"assistant_preview_header_info\":{\"message\":\"مطمئن شوید عنصر به شکل دلخواه مسدود شود\"},\"assistant_preview_end\":{\"message\":\"خروج از پیشنمایش\"},\"wot_unknown_description\":{\"message\":\"اعتبار تعریف نشده است\"},\"wot_bad_description\":{\"message\":\"این وبسایت اعتبار خیلی بدی دارد\\\\nبر طبق \"},\"wot_poor_description\":{\"message\":\"این وبسایت اعتبار بدی دارد\\\\nبر طبق \"},\"wot_unsatisfactory_description\":{\"message\":\"این وبسایت اعتبار کمی دارد\\\\nبر طبق \"},\"wot_good_description\":{\"message\":\"این وبسایت اعتبار خوبی دارد\\\\nبر طبق \"},\"wot_excellent_description\":{\"message\":\"این وبسایت اعتبار عالی دارد\\\\nبر طبق \"},\"settings_choose_size_and_position\":{\"message\":\"تنظیم اندازه و موقعیت دستیار AdGuard\"},\"settings_icon_size\":{\"message\":\"اندازه آیکون:\"},\"settings_small\":{\"message\":\"کوچک\"},\"settings_big\":{\"message\":\"بزرگ\"},\"settings_position\":{\"message\":\"موقعیت:\"},\"settings_left_top\":{\"message\":\"بالا سمت چپ\"},\"settings_right_top\":{\"message\":\"بالا سمت راست\"},\"settings_left_bottom\":{\"message\":\"پایین سمت چپ\"},\"settings_right_bottom\":{\"message\":\"پایین سمت راست\"},\"settings_cancel\":{\"message\":\"لغو\"},\"settings_save\":{\"message\":\"ذخیره تغییرات\"}}');\n\t }),\n\t 6183:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Verkkosivustot\",\"settings_position_save_all\":\"Kaikki sivustot\",\"settings_position_save_this\":\"Tämä sivusto\",\"assistant_select_element_start\":\"Aloita\",\"assistant_select_element_text\":\"Valitse sivulta estettävä elementti. Päivitä sivu poistuaksesi elementtien estotilasta.\",\"menu_filtration_status\":{\"message\":\"Tämän sivuston suodatus\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Pysäytä suodatus 30 sekunnin ajaksi\"},\"menu_block_ad_on_site\":{\"message\":\"Estä mainos tältä sivustolta\"},\"menu_report_abuse\":{\"message\":\"Ilmoita ongelmasta\"},\"menu_site_report\":{\"message\":\"Sivuston suojausraportti\"},\"menu_settings\":{\"message\":\"Apurin asetukset\"},\"menu_wot_reputation_indicator\":{\"message\":\"Sivuston maine\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Mainearvion luotettavuus\"},\"assistant_select_element\":{\"message\":\"Elementin esto\"},\"assistant_select_element_ext\":{\"message\":\"Valitse sivulta estettävä elementti\"},\"assistant_select_element_cancel\":{\"message\":\"Peruuta\"},\"assistant_block_element\":{\"message\":\"Elementin esto\"},\"assistant_block_element_explain\":{\"message\":\"Muokkaa elementinestosääntöä\"},\"assistant_slider_explain\":{\"message\":\"Siirrä liukukytkintä muuttaaksesi sen kehyksen kokoa, johon tämä sääntö vaikuttaa:\"},\"assistant_extended_settings\":{\"message\":\"Edistyneet lisäasetukset\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Käytä kaikilla sivustoilla\"},\"assistant_block_by_reference\":{\"message\":\"Estä viitelinkillä\"},\"assistant_block_similar\":{\"message\":\"Estä samankaltaiset\"},\"assistant_another_element\":{\"message\":\"Valitse eri elementti\"},\"assistant_preview\":{\"message\":\"Esikatsele\"},\"assistant_block\":{\"message\":\"Estä\"},\"assistant_settings\":{\"message\":\"Apurin asetukset\"},\"assistant_preview_header\":{\"message\":\"Elementin estosäännön esikatselu\"},\"assistant_preview_header_info\":{\"message\":\"Varmista, että elementti estetään tarkoituksenmukaisesti\"},\"assistant_preview_end\":{\"message\":\"Sulje esikatselu\"},\"wot_unknown_description\":{\"message\":\"$1 ei tarjoa sivustolle mainearviointia\"},\"wot_bad_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on erittäin huono maine\"},\"wot_poor_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on huono maine\"},\"wot_unsatisfactory_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on heikko maine\"},\"wot_good_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on hyvä maine\"},\"wot_excellent_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on erinomainen maine\"},\"settings_choose_size_and_position\":{\"message\":\"Säädä AdGuard Avustajan kokoa ja sijaintia\"},\"settings_icon_size\":{\"message\":\"Kuvakkeen koko:\"},\"settings_small\":{\"message\":\"Pieni\"},\"settings_big\":{\"message\":\"Suuri\"},\"settings_position\":{\"message\":\"Sijainti:\"},\"settings_left_top\":{\"message\":\"Ylhäällä vasemmalla\"},\"settings_right_top\":{\"message\":\"Ylhäällä oikealla\"},\"settings_left_bottom\":{\"message\":\"Alhaalla vasemmalla\"},\"settings_right_bottom\":{\"message\":\"Alhaalla oikealla\"},\"settings_cancel\":{\"message\":\"Peruuta\"},\"settings_save\":{\"message\":\"Tallenna muutokset\"}}');\n\t }),\n\t 4652:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sites web\",\"settings_position_save_all\":\"Tous les sites web\",\"settings_position_save_this\":\"Ce site web\",\"assistant_select_element_start\":\"Démarrer\",\"assistant_select_element_text\":\"Choisissez un élément de la page à bloquer. Pour afficher l\\'élément de nouveau, rafraîchissez la page.\",\"menu_filtration_status\":{\"message\":\"Filtrages sur ce site\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne pas filtrer pendant 30 secondes \"},\"menu_block_ad_on_site\":{\"message\":\"Blocage des annonces sur ce site \"},\"menu_report_abuse\":{\"message\":\"Signaler le site\"},\"menu_site_report\":{\"message\":\"Rapport de sécurité du site\"},\"menu_settings\":{\"message\":\"Réglages de l\\'Assistant AdGuard\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indice de réputation du site\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Niveau de confiance\"},\"assistant_select_element\":{\"message\":\"Blocage d\\'éléments \"},\"assistant_select_element_ext\":{\"message\":\"Choisir un élément de la page à bloquer \"},\"assistant_select_element_cancel\":{\"message\":\"Annuler\"},\"assistant_block_element\":{\"message\":\"Blocage d\\'éléments \"},\"assistant_block_element_explain\":{\"message\":\"Affiner la règle de blocage d\\'elements\"},\"assistant_slider_explain\":{\"message\":\"Déplacez le curseur pour modifier la taille du cadre de travail de la nouvelle règle\"},\"assistant_extended_settings\":{\"message\":\"Paramétrages avancés \"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Appliquer la règle à tous les sites\"},\"assistant_block_by_reference\":{\"message\":\"Blocage par liens de reference\"},\"assistant_block_similar\":{\"message\":\"Blocage des objets similaires \"},\"assistant_another_element\":{\"message\":\"Sélectionner un élément différent\"},\"assistant_preview\":{\"message\":\"Previsualisation \"},\"assistant_block\":{\"message\":\"Blocage \"},\"assistant_settings\":{\"message\":\"Réglages de l\\'Assistant AdGuard\"},\"assistant_preview_header\":{\"message\":\"Blocage d\\'éléments - Previsualisation \"},\"assistant_preview_header_info\":{\"message\":\"Assurez-vous que l\\'élément est bloqué comme prévu\"},\"assistant_preview_end\":{\"message\":\"Sortir de la previsualisation \"},\"wot_unknown_description\":{\"message\":\"La définition de la réputation de ce site web n\\'est pas définie par $1\"},\"wot_bad_description\":{\"message\":\"Ce site web a très mauvaise réputation selon $1\"},\"wot_poor_description\":{\"message\":\"Ce site web a mauvaise réputation selon $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ce site web a une reputation médiocre selon $1\"},\"wot_good_description\":{\"message\":\"Ce site a bonne réputation selon $1\"},\"wot_excellent_description\":{\"message\":\"Ce site a une réputation excellente selon $1\"},\"settings_choose_size_and_position\":{\"message\":\"Affiner la taille et la position de l\\'assistant AdGuard \"},\"settings_icon_size\":{\"message\":\"Taille de l\\'icone\"},\"settings_small\":{\"message\":\"Petite\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Positionnement\"},\"settings_left_top\":{\"message\":\"En haut à gauche\"},\"settings_right_top\":{\"message\":\"En haut à droite\"},\"settings_left_bottom\":{\"message\":\"En bas à gauche\"},\"settings_right_bottom\":{\"message\":\"En bas à droite \"},\"settings_cancel\":{\"message\":\"Annuler\"},\"settings_save\":{\"message\":\"Sauvegarder les modifications \"}}');\n\t }),\n\t 6514:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"אתרים\",\"settings_position_save_all\":\"כל האתרים\",\"settings_position_save_this\":\"האתר הזה\",\"assistant_select_element_start\":\"התחל\",\"assistant_select_element_text\":\".בחר אלמנט בדף לחסימה .רענן את הדף כדי לבטל את מצב חסימת האלמנטים\",\"menu_filtration_status\":{\"message\":\"סינון באתר זה\"},\"menu_do_not_filter_30_sec\":{\"message\":\"אל תסנן למשך 30 שניות\"},\"menu_block_ad_on_site\":{\"message\":\"חסום פרסומת באתר זה\"},\"menu_report_abuse\":{\"message\":\"דווח על האתר\"},\"menu_site_report\":{\"message\":\"דוח אבטחת אתר\"},\"menu_settings\":{\"message\":\"הגדרות המסייע\"},\"menu_wot_reputation_indicator\":{\"message\":\"מד של מוניטין אתרים\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"רמת אמון מוניטין\"},\"assistant_select_element\":{\"message\":\"חסימת אלמנט\"},\"assistant_select_element_ext\":{\"message\":\"בחר אלמנט בדף לחסימה\"},\"assistant_select_element_cancel\":{\"message\":\"בטל\"},\"assistant_block_element\":{\"message\":\"חסימת אלמנט\"},\"assistant_block_element_explain\":{\"message\":\"התאם כלל של חסימת אלמנט\"},\"assistant_slider_explain\":{\"message\":\"הזז את המַחְלֵק כדי לשנות את גודל המסגרת שבה הכלל החדש יעבוד:\"},\"assistant_extended_settings\":{\"message\":\"הגדרות מתקדמות\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"החל את הכלל בכל האתרים\"},\"assistant_block_by_reference\":{\"message\":\"חסום לפי קישור הפניה\"},\"assistant_block_similar\":{\"message\":\"חסום דומה\"},\"assistant_another_element\":{\"message\":\"בחר אלמנט אחר\"},\"assistant_preview\":{\"message\":\"הצג מראש\"},\"assistant_block\":{\"message\":\"חסום\"},\"assistant_settings\":{\"message\":\"הגדרות המסייע\"},\"assistant_preview_header\":{\"message\":\"חסימת אלמנט - תצוגה מקדימה\"},\"assistant_preview_header_info\":{\"message\":\"ודא כי אלמנט זה חסום כמתוכנן\"},\"assistant_preview_end\":{\"message\":\"צא מתצוגה מקדימה\"},\"wot_unknown_description\":{\"message\":\"המוניטין של אתר זה אינו מוגדר על ידי $1\"},\"wot_bad_description\":{\"message\":\"לאתר זה יש מוניטין רע מאוד\\\\nעל פי $1\"},\"wot_poor_description\":{\"message\":\"לאתר זה יש מוניטין רע \\\\nעל פי $1\"},\"wot_unsatisfactory_description\":{\"message\":\"לאתר זה יש מוניטין ירוד\\\\nעל פי $1\"},\"wot_good_description\":{\"message\":\"לאתר זה יש מוניטין טוב\\\\nעל פי $1\"},\"wot_excellent_description\":{\"message\":\"לאתר זה יש מוניטין מצויין\\\\nעל פי $1\"},\"settings_choose_size_and_position\":{\"message\":\"התאם גודל ומיקום של מסייע AdGuard\"},\"settings_icon_size\":{\"message\":\"גודל איקון:\"},\"settings_small\":{\"message\":\"קטן\"},\"settings_big\":{\"message\":\"גדול\"},\"settings_position\":{\"message\":\"מיקום:\"},\"settings_left_top\":{\"message\":\"בחלק העליון משמאל\"},\"settings_right_top\":{\"message\":\"בחלק העליון מימין\"},\"settings_left_bottom\":{\"message\":\"צד שמאל למטה\"},\"settings_right_bottom\":{\"message\":\"צד ימין למטה\"},\"settings_cancel\":{\"message\":\"בטל\"},\"settings_save\":{\"message\":\"שמור שינויים\"}}');\n\t }),\n\t 1996:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"assistant_extended_settings\":{\"message\":\"उन्नत सेटिंग\"},\"assistant_block\":{\"message\":\"अवरुद्ध\"},\"settings_icon_size\":{\"message\":\"आइकन का आकार:\"},\"settings_small\":{\"message\":\"छोटा\"},\"settings_big\":{\"message\":\"बड़ा\"}}');\n\t }),\n\t 2178:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Web stranice\",\"settings_position_save_all\":\"Sve web stranice\",\"settings_position_save_this\":\"Ova web stranica\",\"assistant_select_element_start\":\"Započni\",\"assistant_select_element_text\":\"Odaberite element na stranici za blokiranje. Osvježite stranicu za izlazak iz načina blokade elemenata.\",\"menu_filtration_status\":{\"message\":\"Filtriranje na ovoj web stranici\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne filtriraj idućih 30 sekundi\"},\"menu_block_ad_on_site\":{\"message\":\"Blokiraj oglas na ovoj web stranici\"},\"menu_report_abuse\":{\"message\":\"Prijavi ovu stranicu\"},\"menu_site_report\":{\"message\":\"Sigurnosni izvještaj stranice\"},\"menu_settings\":{\"message\":\"Postavke pomoćnika\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikator reputacije stranice\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Razina povjerenja reputacije\"},\"assistant_select_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_select_element_ext\":{\"message\":\"Odaberite element na stranici za blokiranje\"},\"assistant_select_element_cancel\":{\"message\":\"Poništi\"},\"assistant_block_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_block_element_explain\":{\"message\":\"Prilagodite pravilo blokiranja elemenata\"},\"assistant_slider_explain\":{\"message\":\"Pomaknite klizač da biste promijenili veličinu okvira na koji će se primijeniti novo pravilo:\"},\"assistant_extended_settings\":{\"message\":\"Napredne postavke\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Primjeni pravilo na sve web stranice\"},\"assistant_block_by_reference\":{\"message\":\"Blokiraj referentnom vezom\"},\"assistant_block_similar\":{\"message\":\"Blokiraj slične\"},\"assistant_another_element\":{\"message\":\"Odaberite drugi element\"},\"assistant_preview\":{\"message\":\"Pregled\"},\"assistant_block\":{\"message\":\"Blokiraj\"},\"assistant_settings\":{\"message\":\"Postavke pomoćnika\"},\"assistant_preview_header\":{\"message\":\"Pregled blokiranja elementa\"},\"assistant_preview_header_info\":{\"message\":\"Provjerite da je li element blokiran kako ste željeli\"},\"assistant_preview_end\":{\"message\":\"Izlaz iz pregleda\"},\"wot_unknown_description\":{\"message\":\"Reputaciju stranice nije odredio $1\"},\"wot_bad_description\":{\"message\":\"Web stranica ima jako lošu reputaciju \\\\nprema $1\"},\"wot_poor_description\":{\"message\":\"Web stranica ima lošu reputaciju \\\\nprema $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Web stranica ima lošu reputaciju \\\\nprema $1\"},\"wot_good_description\":{\"message\":\"Web stranica ima dobru reputaciju \\\\nprema $1\"},\"wot_excellent_description\":{\"message\":\"Web stranica ima odličnu reputaciju \\\\nprema $1\"},\"settings_choose_size_and_position\":{\"message\":\"Podesite veličinu i poziciju AdGuard Pomoćnika\"},\"settings_icon_size\":{\"message\":\"Veličina ikone:\"},\"settings_small\":{\"message\":\"Malo\"},\"settings_big\":{\"message\":\"Veliko\"},\"settings_position\":{\"message\":\"Pozicija:\"},\"settings_left_top\":{\"message\":\"Gore lijevo\"},\"settings_right_top\":{\"message\":\"Gore desno\"},\"settings_left_bottom\":{\"message\":\"Dolje lijevo\"},\"settings_right_bottom\":{\"message\":\"Dolje desno\"},\"settings_cancel\":{\"message\":\"Poništi\"},\"settings_save\":{\"message\":\"Spremi promjene\"}}');\n\t }),\n\t 2698:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Weboldalak\",\"settings_position_save_all\":\"Minden weboldal\",\"settings_position_save_this\":\"Ez a weboldal\",\"assistant_select_element_start\":\"Indítás\",\"assistant_select_element_text\":\"Válassza ki az elemet az oldalon, amit blokkolni szeretne. Frissítse az oldalt, hogy kilépjen az elemblokkoló módból.\",\"menu_filtration_status\":{\"message\":\"Szűrés ezen a weboldalon\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Szüneteltetés 30 másodpercig\"},\"menu_block_ad_on_site\":{\"message\":\"Hirdetés blokkolása ezen a weboldalon\"},\"menu_report_abuse\":{\"message\":\"Weboldal jelentése\"},\"menu_site_report\":{\"message\":\"Weboldal biztonsági jelentése\"},\"menu_settings\":{\"message\":\"Asszisztens beállításai\"},\"menu_wot_reputation_indicator\":{\"message\":\"A webhely hírnevének mutatója\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"A hírnév bizalmi szintje\"},\"assistant_select_element\":{\"message\":\"Elem blokkolása\"},\"assistant_select_element_ext\":{\"message\":\"Válassza ki az elemet az oldalon, amit blokkolni szeretne\"},\"assistant_select_element_cancel\":{\"message\":\"Mégse\"},\"assistant_block_element\":{\"message\":\"Elem blokkolása\"},\"assistant_block_element_explain\":{\"message\":\"Állítsa be az elemet blokkoló szabályt\"},\"assistant_slider_explain\":{\"message\":\"Mozgassa a csúszkát a keret méretének megváltoztatásához, amelyre az új szabály működni fog:\"},\"assistant_extended_settings\":{\"message\":\"Haladó beállítások\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Szabály alkalmazása az összes weboldalra\"},\"assistant_block_by_reference\":{\"message\":\"Blokkolás link alapján\"},\"assistant_block_similar\":{\"message\":\"Hasonlók blokkolása\"},\"assistant_another_element\":{\"message\":\"Másik elem választása\"},\"assistant_preview\":{\"message\":\"Előnézet\"},\"assistant_block\":{\"message\":\"Blokkolás\"},\"assistant_settings\":{\"message\":\"Asszisztens beállításai\"},\"assistant_preview_header\":{\"message\":\"Elem blokkolása - előnézet\"},\"assistant_preview_header_info\":{\"message\":\"Ellenőrizze, hogy az elem blokkolva van-e a tervezett módon\"},\"assistant_preview_end\":{\"message\":\"Kilépés az előnézetből\"},\"wot_unknown_description\":{\"message\":\"Ez a weboldal nincs nyilvántartva a $1 alapján\"},\"wot_bad_description\":{\"message\":\"Ennek a weboldalnak nagyon rossz a megítélése a $1 alapján\"},\"wot_poor_description\":{\"message\":\"Ennek a weboldalnak rossz a megítélése a $1 alapján\"},\"wot_unsatisfactory_description\":{\"message\":\"Ennek a weboldalnak gyenge a megítélése a $1 alapján\"},\"wot_good_description\":{\"message\":\"Ennek a weboldalnak jó a megítélése a $1 alapján\"},\"wot_excellent_description\":{\"message\":\"Ennek a weboldalnak kitűnő a megítélése a $1 alapján\"},\"settings_choose_size_and_position\":{\"message\":\"Állítsa be az AdGuard Assistant méretét és pozícióját\"},\"settings_icon_size\":{\"message\":\"Ikon mérete:\"},\"settings_small\":{\"message\":\"Kicsi\"},\"settings_big\":{\"message\":\"Nagy\"},\"settings_position\":{\"message\":\"Pozíció:\"},\"settings_left_top\":{\"message\":\"Bal felül\"},\"settings_right_top\":{\"message\":\"Jobb felül\"},\"settings_left_bottom\":{\"message\":\"Bal alul\"},\"settings_right_bottom\":{\"message\":\"Jobb alul\"},\"settings_cancel\":{\"message\":\"Mégse\"},\"settings_save\":{\"message\":\"Változások mentése\"}}');\n\t }),\n\t 710:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Situs web\",\"settings_position_save_all\":\"Semua situs web\",\"settings_position_save_this\":\"Situs web ini\",\"assistant_select_element_start\":\"Mulai\",\"assistant_select_element_text\":\"Pilih elemen di halaman untuk diblokir. Segarkan halaman untuk membatalkan mode pemblokiran elemen.\",\"menu_filtration_status\":{\"message\":\"Penyaringan di situs ini\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nonaktifkan penyaring untuk 30 detik\"},\"menu_block_ad_on_site\":{\"message\":\"Blokir iklan di situs ini\"},\"menu_report_abuse\":{\"message\":\"Laporkan situs\"},\"menu_site_report\":{\"message\":\"Laporan keamanan situs\"},\"menu_settings\":{\"message\":\"Pengaturan Asisten\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikator reputasi situs\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Tingkat Keyakinan Reputasi\"},\"assistant_select_element\":{\"message\":\"Blok Elemen\"},\"assistant_select_element_ext\":{\"message\":\"Pilih elemen di halaman untuk diblok\"},\"assistant_select_element_cancel\":{\"message\":\"Batalkan\"},\"assistant_block_element\":{\"message\":\"Blok Elemen\"},\"assistant_block_element_explain\":{\"message\":\"Atur aturan blokir elemen\"},\"assistant_slider_explain\":{\"message\":\"Pindahkan slider untuk mengatur ukuran frame dimana aturan baru akan aktif:\"},\"assistant_extended_settings\":{\"message\":\"Pengaturan lanjutan\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aktifkan aturan untuk seluruh situs\"},\"assistant_block_by_reference\":{\"message\":\"Blok berdasarkan referensi situs\"},\"assistant_block_similar\":{\"message\":\"Blok semacamnya\"},\"assistant_another_element\":{\"message\":\"Pilih elemen lainnya\"},\"assistant_preview\":{\"message\":\"Pratinjau\"},\"assistant_block\":{\"message\":\"Blokir\"},\"assistant_settings\":{\"message\":\"Pengaturan Asisten\"},\"assistant_preview_header\":{\"message\":\"Blok elemen - pratinjau\"},\"assistant_preview_header_info\":{\"message\":\"Harap pastikan bahwa elemen diblok sesuai kemauan Anda\"},\"assistant_preview_end\":{\"message\":\"Keluar pratinjau\"},\"wot_unknown_description\":{\"message\":\"Reputasi tidak terdefinisi\"},\"wot_bad_description\":{\"message\":\"Situs ini mempunyai reputasi sangat buruk\\\\nberdasarkan $1\"},\"wot_poor_description\":{\"message\":\"Situs ini mempunyai reputasi buruk\\\\nberdasarkan $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Situs ini mempunyai reputasi biasa \\\\nberdasarkan $1\"},\"wot_good_description\":{\"message\":\"Situs ini mempunyai reputasi baik \\\\nberdasarkan $1\"},\"wot_excellent_description\":{\"message\":\"Situs ini mempunyai reputasi sempurna \\\\nberdasarkan $1\"},\"settings_choose_size_and_position\":{\"message\":\"Atur ukuran dan posisi AdGuard Assistant\"},\"settings_icon_size\":{\"message\":\"Ukuran ikon:\"},\"settings_small\":{\"message\":\"Kecil\"},\"settings_big\":{\"message\":\"Besar\"},\"settings_position\":{\"message\":\"Posisi:\"},\"settings_left_top\":{\"message\":\"Atas kiri\"},\"settings_right_top\":{\"message\":\"Atas kanan\"},\"settings_left_bottom\":{\"message\":\"Bawah kiri\"},\"settings_right_bottom\":{\"message\":\"Bawah kanan\"},\"settings_cancel\":{\"message\":\"Batal\"},\"settings_save\":{\"message\":\"Simpan perubahan\"}}');\n\t }),\n\t 7294:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Siti\",\"settings_position_save_all\":\"Tutti i siti\",\"settings_position_save_this\":\"Questo sito web\",\"assistant_select_element_start\":\"Inizio\",\"assistant_select_element_text\":\"Seleziona un elemento nella pagina per bloccarlo. Ricarica la pagina per annullare la modalità di blocco di un elemento.\",\"menu_filtration_status\":{\"message\":\"Filtraggio su questo sito web\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Non filtrare per 30 secondi\"},\"menu_block_ad_on_site\":{\"message\":\"Blocca annunci su questo sito web\"},\"menu_report_abuse\":{\"message\":\"Segnala il sito\"},\"menu_site_report\":{\"message\":\"Rapporto di sicurezza del sito\"},\"menu_settings\":{\"message\":\"Impostazioni di Assistant\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicatore reputazione sito\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Livello della reputazione\"},\"assistant_select_element\":{\"message\":\"Blocca elemento\"},\"assistant_select_element_ext\":{\"message\":\"Scegli un elemento da bloccare sulla pagina\"},\"assistant_select_element_cancel\":{\"message\":\"Annulla\"},\"assistant_block_element\":{\"message\":\"Blocca elemento\"},\"assistant_block_element_explain\":{\"message\":\"Modifica la regola di blocco di un elemento\"},\"assistant_slider_explain\":{\"message\":\"Muovi la barra per cambiare la grandezza del frame da per il quale la nuova regola funzionerà:\"},\"assistant_extended_settings\":{\"message\":\"Impostazioni avanzate\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Applica la regola a tutti i siti\"},\"assistant_block_by_reference\":{\"message\":\"Blocco mediante indirizzo di riferimento\"},\"assistant_block_similar\":{\"message\":\"Blocca simile\"},\"assistant_another_element\":{\"message\":\"Seleziona un altro elemento\"},\"assistant_preview\":{\"message\":\"Anteprima\"},\"assistant_block\":{\"message\":\"Blocca\"},\"assistant_settings\":{\"message\":\"Impostazioni di Assistant\"},\"assistant_preview_header\":{\"message\":\"Blocco elemento - anteprima\"},\"assistant_preview_header_info\":{\"message\":\"Assicurati che l\\'elemento è bloccato come richiesto\"},\"assistant_preview_end\":{\"message\":\"Esci dall\\'anteprima\"},\"wot_unknown_description\":{\"message\":\"La reputazione di questo sito web non è definita da $1\"},\"wot_bad_description\":{\"message\":\"Questo sito web ha una pessima reputazione\\\\nsecondo $1\"},\"wot_poor_description\":{\"message\":\"Questo sito web ha una brutta reputazione\\\\nsecondo $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Questo sito web ha una mediocre reputazione\\\\nsecondo $1\"},\"wot_good_description\":{\"message\":\"Questo sito web ha una buona reputazione\\\\nsecondo $1\"},\"wot_excellent_description\":{\"message\":\"Questo sito web ha una eccellente reputazione\\\\nsecondo $1\"},\"settings_choose_size_and_position\":{\"message\":\"Regola dimensione e posizione di AdGuard Assistant\"},\"settings_icon_size\":{\"message\":\"Grandezza dell\\'icona:\"},\"settings_small\":{\"message\":\"Piccola\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posizione:\"},\"settings_left_top\":{\"message\":\"In alto a sinistra\"},\"settings_right_top\":{\"message\":\"In alto a destra\"},\"settings_left_bottom\":{\"message\":\"In basso a sinistra\"},\"settings_right_bottom\":{\"message\":\"In basso a destra\"},\"settings_cancel\":{\"message\":\"Annulla\"},\"settings_save\":{\"message\":\"Salva cambiamenti\"}}');\n\t }),\n\t 9265:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"ウェブサイト\",\"settings_position_save_all\":\"すべてのウェブサイト\",\"settings_position_save_this\":\"このウェブサイト\",\"assistant_select_element_start\":\"開始\",\"assistant_select_element_text\":\"ブロックするページ上の要素を選択してください。 ページを更新し要素のブロックモードを解除します。\",\"menu_filtration_status\":{\"message\":\"このウェブサイトをフィルタリング\"},\"menu_do_not_filter_30_sec\":{\"message\":\"30秒間フィルタリングしない\"},\"menu_block_ad_on_site\":{\"message\":\"このサイトで広告を手動ブロックする\"},\"menu_report_abuse\":{\"message\":\"このサイトの問題を報告する\"},\"menu_site_report\":{\"message\":\"ウェブサイトのセキュリティレポート\"},\"menu_settings\":{\"message\":\"アシスタントの設定\"},\"assistant_select_element\":{\"message\":\"要素をブロック\"},\"assistant_select_element_ext\":{\"message\":\"ブロックする要素を選択\"},\"assistant_select_element_cancel\":{\"message\":\"キャンセル\"},\"assistant_block_element\":{\"message\":\"要素をブロック\"},\"assistant_block_element_explain\":{\"message\":\"要素のブロックルールを調整する\"},\"assistant_slider_explain\":{\"message\":\"スライダーを動かすと、ブロックするフレームのサイズを変更できます:\"},\"assistant_extended_settings\":{\"message\":\"高度な設定\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"全てのウェブサイトにこのルールを適用\"},\"assistant_block_by_reference\":{\"message\":\"参照リンクによるブロック\"},\"assistant_block_similar\":{\"message\":\"類似項目をブロック\"},\"assistant_another_element\":{\"message\":\"他の要素を選択\"},\"assistant_preview\":{\"message\":\"プレビュー\"},\"assistant_block\":{\"message\":\"ブロック\"},\"assistant_settings\":{\"message\":\"アシスタントの設定\"},\"assistant_preview_header\":{\"message\":\"要素のブロック - プレビュー\"},\"assistant_preview_header_info\":{\"message\":\"要素が意図したとおりにブロックされていることを確認します\"},\"assistant_preview_end\":{\"message\":\"プレビューを終了\"},\"wot_unknown_description\":{\"message\":\"評判が定義されていません\"},\"wot_bad_description\":{\"message\":\"このウェブサイトは非常に評判が悪いです: \"},\"wot_poor_description\":{\"message\":\"このウェブサイトは評判が悪いです: \"},\"wot_unsatisfactory_description\":{\"message\":\"このウェブサイトは評判がやや悪いです: \"},\"wot_good_description\":{\"message\":\"このウェブサイトは評判が良いです: \"},\"wot_excellent_description\":{\"message\":\"このウェブサイトはとても評判が良いです: \"},\"settings_choose_size_and_position\":{\"message\":\"AdGuardアシスタントのサイズと位置を調整する\"},\"settings_icon_size\":{\"message\":\"アイコンの大きさ:\"},\"settings_small\":{\"message\":\"小\"},\"settings_big\":{\"message\":\"大\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上\"},\"settings_right_top\":{\"message\":\"右上\"},\"settings_left_bottom\":{\"message\":\"左下\"},\"settings_right_bottom\":{\"message\":\"右下\"},\"settings_cancel\":{\"message\":\"キャンセル\"},\"settings_save\":{\"message\":\"設定を保存\"}}');\n\t }),\n\t 1474:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"웹사이트\",\"settings_position_save_all\":\"모든 웹사이트\",\"settings_position_save_this\":\"이 웹사이트\",\"assistant_select_element_start\":\"시작\",\"assistant_select_element_text\":\"페이지에서 차단할 요소를 선택하세요. 요소 차단 모드를 취소하려면 페이지를 새로 고침하세요.\",\"menu_filtration_status\":{\"message\":\"이 웹사이트에서의 보호\"},\"menu_do_not_filter_30_sec\":{\"message\":\"30초 동안 차단 일시정지\"},\"menu_block_ad_on_site\":{\"message\":\"이 웹사이트에서 광고 차단\"},\"menu_report_abuse\":{\"message\":\"이 웹사이트에 관한 불만 사항 제출\"},\"menu_site_report\":{\"message\":\"웹사이트 보안 보고\"},\"menu_settings\":{\"message\":\"어시스턴트 설정\"},\"menu_wot_reputation_indicator\":{\"message\":\"웹사이트 평판 표시기\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"평판 신뢰 수준\"},\"assistant_select_element\":{\"message\":\"선택 모드\"},\"assistant_select_element_ext\":{\"message\":\"페이지에서 아무 요소나 클릭하거나\"},\"assistant_select_element_cancel\":{\"message\":\"선택 모드 취소\"},\"assistant_block_element\":{\"message\":\"요소 차단\"},\"assistant_block_element_explain\":{\"message\":\"요소 차단 규칙 설정\"},\"assistant_slider_explain\":{\"message\":\"슬라이더로 차단할 요소의 범위를 지정하세요.\"},\"assistant_extended_settings\":{\"message\":\"고급 설정\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"모든 웹사이트에 이 규칙 적용\"},\"assistant_block_by_reference\":{\"message\":\"참조 링크가 차단\"},\"assistant_block_similar\":{\"message\":\"유사한 요소 차단\"},\"assistant_another_element\":{\"message\":\"다른 요소 선택\"},\"assistant_preview\":{\"message\":\"미리 보기\"},\"assistant_block\":{\"message\":\"차단\"},\"assistant_settings\":{\"message\":\"어시스턴트 설정\"},\"assistant_preview_header\":{\"message\":\"요소 차단 - 미리 보기\"},\"assistant_preview_header_info\":{\"message\":\"의도한 대로 요소가 차단되었는지 확인하세요.\"},\"assistant_preview_end\":{\"message\":\"미리 보기 종료\"},\"wot_unknown_description\":{\"message\":\"평판이 등록되지 않았습니다.\"},\"wot_bad_description\":{\"message\":\"이 웹사이트는 아주 나쁜 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_poor_description\":{\"message\":\"이 웹사이트는 나쁜 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_unsatisfactory_description\":{\"message\":\"이 웹사이트는 좋지 않은 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_good_description\":{\"message\":\"이 웹사이트는 좋은 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_excellent_description\":{\"message\":\"이 웹사이트는 아주 좋은 평판을 갖고 있습니다.\\\\n제공 \"},\"settings_choose_size_and_position\":{\"message\":\"AdGuard 어시스턴트 크기와 위치를 조정합니다\"},\"settings_icon_size\":{\"message\":\"아이콘 크기:\"},\"settings_small\":{\"message\":\"작게\"},\"settings_big\":{\"message\":\"크게\"},\"settings_position\":{\"message\":\"위치:\"},\"settings_left_top\":{\"message\":\"왼쪽 위\"},\"settings_right_top\":{\"message\":\"오른쪽 위\"},\"settings_left_bottom\":{\"message\":\"왼쪽 아래\"},\"settings_right_bottom\":{\"message\":\"오른쪽 아래\"},\"settings_cancel\":{\"message\":\"취소\"},\"settings_save\":{\"message\":\"저장\"}}');\n\t }),\n\t 8612:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Interneto svetainės\",\"settings_position_save_all\":\"Visos svetainės\",\"settings_position_save_this\":\"Ši svetainė\",\"assistant_select_element_start\":\"Pradėti\",\"assistant_select_element_text\":\"Pasirinkite elementą puslapyje, kurį norite blokuoti. Atnaujinkite puslapį, kad atšauktumėte elementų blokavimo režimą.\",\"menu_filtration_status\":{\"message\":\"Filtravimas šioje svetainėje\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nefiltruoti 30 sekundžių\"},\"menu_block_ad_on_site\":{\"message\":\"Blokuoti reklamą šioje svetainėje\"},\"menu_report_abuse\":{\"message\":\"Pranešti apie svetainę\"},\"menu_site_report\":{\"message\":\"Svetainės saugumo ataskaita\"},\"menu_settings\":{\"message\":\"Asistento nustatymai\"},\"menu_wot_reputation_indicator\":{\"message\":\"Svetainės reputacijos rodiklis\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Reputacijos pasitikėjimo lygis\"},\"assistant_select_element\":{\"message\":\"Elemento blokavimas\"},\"assistant_select_element_ext\":{\"message\":\"Pasirinkite elementą puslapyje, kurį norite blokuoti\"},\"assistant_select_element_cancel\":{\"message\":\"Atšaukti\"},\"assistant_block_element\":{\"message\":\"Elemento blokavimas\"},\"assistant_block_element_explain\":{\"message\":\"Nustatykite elemento blokavimo taisyklę\"},\"assistant_slider_explain\":{\"message\":\"Slankiklio pagalba, keiskite rėmelio dydį, kuriame galios nauja taisyklė:\"},\"assistant_extended_settings\":{\"message\":\"Išplėstiniai nustatymai\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Pritaikyti taisyklę visoms svetainėms\"},\"assistant_block_by_reference\":{\"message\":\"Blokuoti pagal nuorodą\"},\"assistant_block_similar\":{\"message\":\"Blokuoti panašius\"},\"assistant_another_element\":{\"message\":\"Pasirinkti kitą elementą\"},\"assistant_preview\":{\"message\":\"Peržiūra\"},\"assistant_block\":{\"message\":\"Užblokuoti\"},\"assistant_settings\":{\"message\":\"Asistento nustatymai\"},\"assistant_preview_header\":{\"message\":\"Elemento blokavimas - peržiūra\"},\"assistant_preview_header_info\":{\"message\":\"Įsitikinkite, kad elementas yra užblokuotas kaip sumanyta\"},\"assistant_preview_end\":{\"message\":\"Baigti peržiūrą\"},\"wot_unknown_description\":{\"message\":\"Šios svetainės reputacija nėra apibrėžta $1\"},\"wot_bad_description\":{\"message\":\"Ši svetainė turi labai blogą reputaciją\\\\npagal $1\"},\"wot_poor_description\":{\"message\":\"Ši svetainė turi blogą reputaciją pagal $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ši svetainė turi prastą reputaciją pagal $1\"},\"wot_good_description\":{\"message\":\"Ši svetainė turi gerą reputaciją pagal $1\"},\"wot_excellent_description\":{\"message\":\"Ši svetainė turi puikią reputaciją pagal $1\"},\"settings_choose_size_and_position\":{\"message\":\"Nustatykite AdGuard Asistento dydį ir padėtį\"},\"settings_icon_size\":{\"message\":\"Piktogramos dydis:\"},\"settings_small\":{\"message\":\"Maža\"},\"settings_big\":{\"message\":\"Didelė\"},\"settings_position\":{\"message\":\"Padėtis:\"},\"settings_left_top\":{\"message\":\"Viršuje kairėje\"},\"settings_right_top\":{\"message\":\"Viršuje dešinėje\"},\"settings_left_bottom\":{\"message\":\"Apačioje kairėje\"},\"settings_right_bottom\":{\"message\":\"Apačioje dešinėje\"},\"settings_cancel\":{\"message\":\"Atšaukti\"},\"settings_save\":{\"message\":\"Išsaugoti pakeitimus\"}}');\n\t }),\n\t 8967:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Websites\",\"settings_position_save_all\":\"Alle websites\",\"settings_position_save_this\":\"Deze website\",\"assistant_select_element_start\":\"Starten\",\"assistant_select_element_text\":\"Kies een element op deze webpagina om te blokkeren. Herlaad de pagina om het blokkeren van het element te stoppen.\",\"menu_filtration_status\":{\"message\":\"Filteren op deze website\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Niet filtreren voor 30 seconden\"},\"menu_block_ad_on_site\":{\"message\":\"Blokkeer ad op deze website\"},\"menu_report_abuse\":{\"message\":\"Rapporteer de website\"},\"menu_site_report\":{\"message\":\"Beveiligingsrapport van website\"},\"menu_settings\":{\"message\":\"Instelling van de assistent\"},\"menu_wot_reputation_indicator\":{\"message\":\"Website reputatie indicator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Vertrouwensniveau reputatie\"},\"assistant_select_element\":{\"message\":\"Element blokkeren\"},\"assistant_select_element_ext\":{\"message\":\"Kies een element op deze pagina dat je wil blokkeren\"},\"assistant_select_element_cancel\":{\"message\":\"Annuleren\"},\"assistant_block_element\":{\"message\":\"Element blokkeren\"},\"assistant_block_element_explain\":{\"message\":\"Pas de Element blokkeren regel aan\"},\"assistant_slider_explain\":{\"message\":\"Beweeg de schuifregelaar om de grootte van het frame te wijzigen waarvoor de nieuwe regel werkt:\"},\"assistant_extended_settings\":{\"message\":\"Geavanceerde instellingen\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Regel toepassen op alle websites\"},\"assistant_block_by_reference\":{\"message\":\"Blokkeren via referentielink\"},\"assistant_block_similar\":{\"message\":\"Blokkeer vergelijkbare\"},\"assistant_another_element\":{\"message\":\"Een ander element selecteren\"},\"assistant_preview\":{\"message\":\"Voorbeeldweergave\"},\"assistant_block\":{\"message\":\"Blokkeren\"},\"assistant_settings\":{\"message\":\"Assistent instellingen\"},\"assistant_preview_header\":{\"message\":\"Elementblokkering - voorbeeld\"},\"assistant_preview_header_info\":{\"message\":\"Zorg ervoor dat het element wordt geblokkeerd zoals bedoeld\"},\"assistant_preview_end\":{\"message\":\"Voorbeeldweergave afsluiten\"},\"wot_unknown_description\":{\"message\":\"De reputatie van deze website wordt niet bepaald door $1\"},\"wot_bad_description\":{\"message\":\"Deze website heeft een zeer slechte reputatie\\\\nvolgens $1\"},\"wot_poor_description\":{\"message\":\"Deze website heeft een slechte reputatie\\\\nvolgens $ 1\"},\"wot_unsatisfactory_description\":{\"message\":\"Deze website heeft een slechte reputatie volgens $1\"},\"wot_good_description\":{\"message\":\"Deze website heeft een goede reputatie volgens $1\"},\"wot_excellent_description\":{\"message\":\"Deze website heeft een uitstekende reputatie volgens $1\"},\"settings_choose_size_and_position\":{\"message\":\"Grootte en positie van AdGuard Assistent aanpassen\"},\"settings_icon_size\":{\"message\":\"Grootte pictogram:\"},\"settings_small\":{\"message\":\"Klein\"},\"settings_big\":{\"message\":\"Groot\"},\"settings_position\":{\"message\":\"Positie:\"},\"settings_left_top\":{\"message\":\"Linksboven\"},\"settings_right_top\":{\"message\":\"Rechtsboven\"},\"settings_left_bottom\":{\"message\":\"Linksonder\"},\"settings_right_bottom\":{\"message\":\"Rechtsonder\"},\"settings_cancel\":{\"message\":\"Annuleren\"},\"settings_save\":{\"message\":\"Wijzigingen opslaan\"}}');\n\t }),\n\t 6251:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Nettsider\",\"settings_position_save_all\":\"Alle nettsider\",\"settings_position_save_this\":\"Denne nettsiden\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Velg et element på siden som skal blokkeres. Oppdater siden for å avbryte elementblokkeringsmodusen.\",\"menu_filtration_status\":{\"message\":\"Filtrering på denne nettsiden\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ikke filtrer i 30 sekunder\"},\"menu_block_ad_on_site\":{\"message\":\"Blokker annonse på denne nettsiden\"},\"menu_report_abuse\":{\"message\":\"Rapporter denne nettsiden\"},\"menu_site_report\":{\"message\":\"Nettsidens sikkerhetsrapport\"},\"menu_settings\":{\"message\":\"Assistentinnstillinger\"},\"menu_wot_reputation_indicator\":{\"message\":\"Nettsteds-rykteindikator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Ryktepålitelighetsnivå\"},\"assistant_select_element\":{\"message\":\"Elementblokkering\"},\"assistant_select_element_ext\":{\"message\":\"Velg et element på siden som skal blokkeres\"},\"assistant_select_element_cancel\":{\"message\":\"Avbryt\"},\"assistant_block_element\":{\"message\":\"Elementblokkering\"},\"assistant_block_element_explain\":{\"message\":\"Juster elementblokkeringsregel\"},\"assistant_slider_explain\":{\"message\":\"Flytt glidebryteren for å endre størrelsen på rammen den nye regelen vil fungere for:\"},\"assistant_extended_settings\":{\"message\":\"Avanserte innstillinger\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Bruk regelen for alle nettsider\"},\"assistant_block_by_reference\":{\"message\":\"Blokker med referanselenke\"},\"assistant_block_similar\":{\"message\":\"Blokker lignende\"},\"assistant_another_element\":{\"message\":\"Velg et annet element\"},\"assistant_preview\":{\"message\":\"Forhåndsvisning\"},\"assistant_block\":{\"message\":\"Blokker\"},\"assistant_settings\":{\"message\":\"Assistentinnstillinger\"},\"assistant_preview_header\":{\"message\":\"Elementblokkering - forhåndsvisning\"},\"assistant_preview_header_info\":{\"message\":\"Kontroller at elementet er blokkert som det skal\"},\"assistant_preview_end\":{\"message\":\"Avslutt forhåndsvisning\"},\"wot_unknown_description\":{\"message\":\"Rykte er ikke definert\"},\"wot_bad_description\":{\"message\":\"Denne nettsiden har et veldig dårlig rykte\\\\ni følge $1\"},\"wot_poor_description\":{\"message\":\"Denne nettsiden har et dårlig rykte\\\\ni følge $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Denne nettsiden har et dårlig rykte\\\\ni følge $1\"},\"wot_good_description\":{\"message\":\"Denne nettsiden har et godt rykte\\\\ni følge $1\"},\"wot_excellent_description\":{\"message\":\"Denne nettsiden har et utmerket rykte\\\\ni følge $1\"},\"settings_choose_size_and_position\":{\"message\":\"Juster størrelsen og posisjonen til AdGuard-assistent\"},\"settings_icon_size\":{\"message\":\"Ikonstørrelse:\"},\"settings_small\":{\"message\":\"Liten\"},\"settings_big\":{\"message\":\"Stor\"},\"settings_position\":{\"message\":\"Posisjoner:\"},\"settings_left_top\":{\"message\":\"Øverst til venstre\"},\"settings_right_top\":{\"message\":\"Øverst til høyre\"},\"settings_left_bottom\":{\"message\":\"Nederst til venstre\"},\"settings_right_bottom\":{\"message\":\"Nederst til høyre\"},\"settings_cancel\":{\"message\":\"Avbryt\"},\"settings_save\":{\"message\":\"Lagre endringer\"}}');\n\t }),\n\t 1549:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Strony internetowe\",\"settings_position_save_all\":\"Wszystkie strony internetowe\",\"settings_position_save_this\":\"Ta strona internetowa\",\"assistant_select_element_start\":\"Rozpocznij\",\"assistant_select_element_text\":\"Wybierz element na stronie do zablokowania. Odśwież stronę, aby anulować tryb blokowania elementu.\",\"menu_filtration_status\":{\"message\":\"Filtrowanie na tej stronie internetowej\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nie filtruj przez 30 sekund\"},\"menu_block_ad_on_site\":{\"message\":\"Zablokuj reklamę na tej stronie internetowej\"},\"menu_report_abuse\":{\"message\":\"Raportuj stronę internetową\"},\"menu_site_report\":{\"message\":\"Raport bezpieczeństwa strony internetowej\"},\"menu_settings\":{\"message\":\"Ustawienia Asystenta\"},\"menu_wot_reputation_indicator\":{\"message\":\"Wskaźnik reputacji witryny\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Poziom zaufania do reputacji\"},\"assistant_select_element\":{\"message\":\"Blokowanie elementów\"},\"assistant_select_element_ext\":{\"message\":\"Wybierz element na stronie by zablokować\"},\"assistant_select_element_cancel\":{\"message\":\"Anuluj\"},\"assistant_block_element\":{\"message\":\"Blokowanie elementów\"},\"assistant_block_element_explain\":{\"message\":\"Dostosuj regułę blokowania elementów\"},\"assistant_slider_explain\":{\"message\":\"Przesuń suwak by zmienić rozmiar ramki, dla której będzie obowiązywać nowa reguła:\"},\"assistant_extended_settings\":{\"message\":\"Ustawienia zaawansowane\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Zastosuj regułę dla wszystkich stron internetowych\"},\"assistant_block_by_reference\":{\"message\":\"Blokuj używając linka referencyjnego\"},\"assistant_block_similar\":{\"message\":\"Blokuj podobne\"},\"assistant_another_element\":{\"message\":\"Wybierz inny element\"},\"assistant_preview\":{\"message\":\"Podgląd\"},\"assistant_block\":{\"message\":\"Blokuj\"},\"assistant_settings\":{\"message\":\"Ustawienia Asystenta\"},\"assistant_preview_header\":{\"message\":\"Blokowanie elementów - podgląd\"},\"assistant_preview_header_info\":{\"message\":\"Upewnij się, że element jest blokowany jak zamierzono\"},\"assistant_preview_end\":{\"message\":\"Zamknij podgląd\"},\"wot_unknown_description\":{\"message\":\"Reputacja nie jest zdefiniowana\"},\"wot_bad_description\":{\"message\":\"Ta strona internetowa ma bardzo złą reputację zgodnie z $1\"},\"wot_poor_description\":{\"message\":\"Ta strona internetowa ma złą reputację zgodnie z $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ta strona internetowa ma słabą reputację zgodnie z $1\"},\"wot_good_description\":{\"message\":\"Ta strona internetowa ma dobrą reputację zgodnie z $1\"},\"wot_excellent_description\":{\"message\":\"Ta strona internetowa ma doskonałą reputację zgodnie z $1\"},\"settings_choose_size_and_position\":{\"message\":\"Dostosuj rozmiar i pozycję Asystenta AdGuarda\"},\"settings_icon_size\":{\"message\":\"Rozmiar ikony:\"},\"settings_small\":{\"message\":\"Mały\"},\"settings_big\":{\"message\":\"Duży\"},\"settings_position\":{\"message\":\"Pozycja:\"},\"settings_left_top\":{\"message\":\"Lewy górny\"},\"settings_right_top\":{\"message\":\"Prawy górny\"},\"settings_left_bottom\":{\"message\":\"Na dole po lewej\"},\"settings_right_bottom\":{\"message\":\"Na dole po prawej\"},\"settings_cancel\":{\"message\":\"Anuluj\"},\"settings_save\":{\"message\":\"Zapisz zmiany\"}}');\n\t }),\n\t 1902:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sítios\",\"settings_position_save_all\":\"Todos os sítios\",\"settings_position_save_this\":\"Este sítio\",\"assistant_select_element_start\":\"Iniciar\",\"assistant_select_element_text\":\"Escolha um elemento na página para bloquear. Atualize a página para cancelar o bloqueio do elemento.\",\"menu_filtration_status\":{\"message\":\"A filtrar este sítio\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Não filtrar durante 30 segundos\"},\"menu_block_ad_on_site\":{\"message\":\"Bloquear publicidade neste sítio\"},\"menu_report_abuse\":{\"message\":\"Denunciar o sítio\"},\"menu_site_report\":{\"message\":\"Relatório de segurança do sítio\"},\"menu_settings\":{\"message\":\"Configurações do assistente\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicador de reputação do sítio\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nível de Confiança de Reputação\"},\"assistant_select_element\":{\"message\":\"Bloqueio de elemento\"},\"assistant_select_element_ext\":{\"message\":\"Escolha um elemento na página para bloquear\"},\"assistant_select_element_cancel\":{\"message\":\"Cancelar\"},\"assistant_block_element\":{\"message\":\"Bloqueio de elementos\"},\"assistant_block_element_explain\":{\"message\":\"Ajustar a regra de bloqueio do elemento\"},\"assistant_slider_explain\":{\"message\":\"Desloque o controlo deslizante para alterar o tamanho do quadro para o qual a nova regra irá funcionar:\"},\"assistant_extended_settings\":{\"message\":\"Definições avançadas\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplicar a regra para todos os sítios\"},\"assistant_block_by_reference\":{\"message\":\"Bloquear por link de referência\"},\"assistant_block_similar\":{\"message\":\"Bloquear semelhante\"},\"assistant_another_element\":{\"message\":\"Selecionar um elemento diferente\"},\"assistant_preview\":{\"message\":\"Pré-visualização\"},\"assistant_block\":{\"message\":\"Bloquear\"},\"assistant_settings\":{\"message\":\"Configurações do assistente\"},\"assistant_preview_header\":{\"message\":\"Bloquear elemento - pré-visualização\"},\"assistant_preview_header_info\":{\"message\":\"Certifique-se de que o elemento está bloqueado como pretendido\"},\"assistant_preview_end\":{\"message\":\"Sair da previsualização\"},\"wot_unknown_description\":{\"message\":\"A reputação deste sítio não está definida por $1\"},\"wot_bad_description\":{\"message\":\"Este sítio tem uma péssima reputação\\\\nde acordo com $1\"},\"wot_poor_description\":{\"message\":\"Este sítio tem uma má reputação\\\\nde acordo com $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Este sítio tem uma frágil reputação\\\\nde acordo com $1\"},\"wot_good_description\":{\"message\":\"Este sítio tem uma boa reputação\\\\nde acordo com $1\"},\"wot_excellent_description\":{\"message\":\"Este sítio tem uma excelente reputação\\\\nde acordo com $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajustar o tamanho e a posição do Assistente do AdGuard\"},\"settings_icon_size\":{\"message\":\"Tamanho do ícone:\"},\"settings_small\":{\"message\":\"Pequeno\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posição:\"},\"settings_left_top\":{\"message\":\"Canto superior esquerdo\"},\"settings_right_top\":{\"message\":\"Canto superior direito\"},\"settings_left_bottom\":{\"message\":\"Canto inferior esquerdo\"},\"settings_right_bottom\":{\"message\":\"Canto inferior direito\"},\"settings_cancel\":{\"message\":\"Cancelar\"},\"settings_save\":{\"message\":\"Guardar alterações\"}}');\n\t }),\n\t 9274:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sites\",\"settings_position_save_all\":\"Todos os sites\",\"settings_position_save_this\":\"Neste site\",\"assistant_select_element_start\":\"Iniciar\",\"assistant_select_element_text\":\"Escolha um elemento na página para bloquear. Atualize a página para cancelar o bloqueio do elemento.\",\"menu_filtration_status\":{\"message\":\"Filtragem neste site\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Não filtrar durante 30 segundos\"},\"menu_block_ad_on_site\":{\"message\":\"Bloquear anúncios neste site\"},\"menu_report_abuse\":{\"message\":\"Reportar o site\"},\"menu_site_report\":{\"message\":\"Relatório de segurança do site\"},\"menu_settings\":{\"message\":\"Configurações do assistente\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicador de reputação do site\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nível de confiança de reputação\"},\"assistant_select_element\":{\"message\":\"Bloqueio de elemento\"},\"assistant_select_element_ext\":{\"message\":\"Escolha um elemento na página para bloquear\"},\"assistant_select_element_cancel\":{\"message\":\"Cancelar\"},\"assistant_block_element\":{\"message\":\"Bloqueio de elemento\"},\"assistant_block_element_explain\":{\"message\":\"Ajustar a regra de bloqueio de elemento\"},\"assistant_slider_explain\":{\"message\":\"Mova o controle deslizante para alterar o tamanho do quadro para o qual a nova regra funcionará:\"},\"assistant_extended_settings\":{\"message\":\"Configurações avançadas\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplicar regra para todos os sites\"},\"assistant_block_by_reference\":{\"message\":\"Bloquear pelo link de referência\"},\"assistant_block_similar\":{\"message\":\"Bloquear semelhante\"},\"assistant_another_element\":{\"message\":\"Selecione um elemento diferente\"},\"assistant_preview\":{\"message\":\"Pré-visualização\"},\"assistant_block\":{\"message\":\"Bloquear\"},\"assistant_settings\":{\"message\":\"Configurações do assistente\"},\"assistant_preview_header\":{\"message\":\"Bloqueio de elemento - pré-visualização\"},\"assistant_preview_header_info\":{\"message\":\"Certifique-se de que o elemento esteja bloqueado como desejado\"},\"assistant_preview_end\":{\"message\":\"Sair da pré-visualização\"},\"wot_unknown_description\":{\"message\":\"A reputação deste site ainda não foi definida por $1\"},\"wot_bad_description\":{\"message\":\"Este site tem uma reputação muito ruim\\\\nde acordo com $1\"},\"wot_poor_description\":{\"message\":\"Este site tem uma má reputação\\\\nde acordo com $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Este site tem uma reputação ruim\\\\nde acordo com $1\"},\"wot_good_description\":{\"message\":\"Este site tem uma boa reputação\\\\nde acordo com $1\"},\"wot_excellent_description\":{\"message\":\"Este site tem uma excelente reputação\\\\nde acordo com $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajuste o tamanho e posição do Assistente do AdGuard\"},\"settings_icon_size\":{\"message\":\"Tamanho do ícone:\"},\"settings_small\":{\"message\":\"Pequeno\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posição:\"},\"settings_left_top\":{\"message\":\"Canto superior esquerdo\"},\"settings_right_top\":{\"message\":\"Canto superior direito\"},\"settings_left_bottom\":{\"message\":\"Canto inferior esquerdo\"},\"settings_right_bottom\":{\"message\":\"Canto inferior direito\"},\"settings_cancel\":{\"message\":\"Cancelar\"},\"settings_save\":{\"message\":\"Salvar alterações\"}}');\n\t }),\n\t 6090:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Site web\",\"settings_position_save_all\":\"Toate site-urile\",\"settings_position_save_this\":\"Acest site\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Alegeți elementul de blocat pe pagină. Actualizați pagina ca să anulați modul de blocare a elementului.\",\"menu_filtration_status\":{\"message\":\"Filtrare pe acest site web\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nu filtra pentru 30 secunde\"},\"menu_block_ad_on_site\":{\"message\":\"Blocare reclame pe acest site\"},\"menu_report_abuse\":{\"message\":\"Raportați site-ul\"},\"menu_site_report\":{\"message\":\"Raport de securitate site\"},\"menu_settings\":{\"message\":\"Setări asistent\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicator reputație site\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nivel de încredere în reputație\"},\"assistant_select_element\":{\"message\":\"Element de blocat\"},\"assistant_select_element_ext\":{\"message\":\"Alegeți un element de blocat pe pagină\"},\"assistant_select_element_cancel\":{\"message\":\"Anulare\"},\"assistant_block_element\":{\"message\":\"Blocare de element\"},\"assistant_block_element_explain\":{\"message\":\"Ajustați regula de blocare element\"},\"assistant_slider_explain\":{\"message\":\"Mișcarea glisorului schimbă talia cadrului în care va funcționa noua regulă:\"},\"assistant_extended_settings\":{\"message\":\"Setări avansate\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplică regula pe orice site\"},\"assistant_block_by_reference\":{\"message\":\"Blocare după link de referință\"},\"assistant_block_similar\":{\"message\":\"Blocare similare\"},\"assistant_another_element\":{\"message\":\"Alegeți un element diferit\"},\"assistant_preview\":{\"message\":\"Ecran\"},\"assistant_block\":{\"message\":\"Blocați\"},\"assistant_settings\":{\"message\":\"Setări asistent\"},\"assistant_preview_header\":{\"message\":\"Blocare element - previzualizare\"},\"assistant_preview_header_info\":{\"message\":\"Verificați blocarea elementului conform planului\"},\"assistant_preview_end\":{\"message\":\"Ieșire ecran\"},\"wot_unknown_description\":{\"message\":\"Reputația acestui site nu este definită de $1\"},\"wot_bad_description\":{\"message\":\"Acest site are o reputație foarte proastă\\\\nconform cu $1\"},\"wot_poor_description\":{\"message\":\"Acest site are o reputație proastă\\\\nconform cu $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Acest site are o reputație slabă\\\\nconform cu $1\"},\"wot_good_description\":{\"message\":\"Acest site are o reputație bună\\\\nconform cu $1\"},\"wot_excellent_description\":{\"message\":\"Acest site are o reputație excelentă\\\\nconform cu $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajustați talia și poziția Asistentului AdGuard\"},\"settings_icon_size\":{\"message\":\"Talie icoană:\"},\"settings_small\":{\"message\":\"Mică\"},\"settings_big\":{\"message\":\"Mare\"},\"settings_position\":{\"message\":\"Poziție:\"},\"settings_left_top\":{\"message\":\"Stânga sus\"},\"settings_right_top\":{\"message\":\"Dreapta sus\"},\"settings_left_bottom\":{\"message\":\"Stânga jos\"},\"settings_right_bottom\":{\"message\":\"Dreapta jos\"},\"settings_cancel\":{\"message\":\"Anulare\"},\"settings_save\":{\"message\":\"Salvare alegeri\"}}');\n\t }),\n\t 3999:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Сайты\",\"settings_position_save_all\":\"На всех\",\"settings_position_save_this\":\"Только на этом\",\"assistant_select_element_start\":\"Начать\",\"assistant_select_element_text\":\"Выберите на странице элемент для блокирования. Обновите страницу, чтобы отменить режим блокировки элементов.\",\"menu_filtration_status\":{\"message\":\"Фильтрация на этом сайте\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Не фильтровать 30 секунд\"},\"menu_block_ad_on_site\":{\"message\":\"Заблокировать рекламу на сайте\"},\"menu_report_abuse\":{\"message\":\"Пожаловаться на сайт\"},\"menu_site_report\":{\"message\":\"Отчёт о безопасности сайта\"},\"menu_settings\":{\"message\":\"Настроить помощник\"},\"menu_wot_reputation_indicator\":{\"message\":\"Индикатор репутации сайта\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Уровень доверия к репутации\"},\"assistant_select_element\":{\"message\":\" Блокировка элемента\"},\"assistant_select_element_ext\":{\"message\":\"Выберите на странице элемент, который надо заблокировать\"},\"assistant_select_element_cancel\":{\"message\":\"Отмена\"},\"assistant_block_element\":{\"message\":\"Блокировка элемента\"},\"assistant_block_element_explain\":{\"message\":\"Настройте правило блокирования элемента\"},\"assistant_slider_explain\":{\"message\":\"Перемещайте бегунок, чтобы изменить размер блока, для которого будет действовать правило:\"},\"assistant_extended_settings\":{\"message\":\"Расширенные настройки\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Применить правило для всех сайтов\"},\"assistant_block_by_reference\":{\"message\":\"Блокировать по ссылке\"},\"assistant_block_similar\":{\"message\":\"Блокировать похожие\"},\"assistant_another_element\":{\"message\":\"Выбрать другой элемент\"},\"assistant_preview\":{\"message\":\"Предпросмотр\"},\"assistant_block\":{\"message\":\"Заблокировать\"},\"assistant_settings\":{\"message\":\"Настройка помощника\"},\"assistant_preview_header\":{\"message\":\"Блокировка элемента – предпросмотр\"},\"assistant_preview_header_info\":{\"message\":\"Убедитесь, что элемент заблокирован как задумано\"},\"assistant_preview_end\":{\"message\":\"Закончить предпросмотр\"},\"wot_unknown_description\":{\"message\":\"Репутация не определена расширением $1\"},\"wot_bad_description\":{\"message\":\"У сайта очень плохая репутация по данным $1\"},\"wot_poor_description\":{\"message\":\"У сайта плохая репутация по данным $1\"},\"wot_unsatisfactory_description\":{\"message\":\"У сайта неудовлетворительная репутация по данным $1\"},\"wot_good_description\":{\"message\":\"У сайта хорошая репутация по данным $1\"},\"wot_excellent_description\":{\"message\":\"У сайта отличная репутация по данным $1\"},\"settings_choose_size_and_position\":{\"message\":\"Настройте размер и положение помощника AdGuard\"},\"settings_icon_size\":{\"message\":\"Размер иконки:\"},\"settings_small\":{\"message\":\"Маленькая\"},\"settings_big\":{\"message\":\"Большая\"},\"settings_position\":{\"message\":\"Расположение:\"},\"settings_left_top\":{\"message\":\"Вверху слева\"},\"settings_right_top\":{\"message\":\"Вверху справа\"},\"settings_left_bottom\":{\"message\":\"Внизу слева\"},\"settings_right_bottom\":{\"message\":\"Внизу справа\"},\"settings_cancel\":{\"message\":\"Отмена\"},\"settings_save\":{\"message\":\"Сохранить настройки\"}}');\n\t }),\n\t 89:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webové stránky\",\"settings_position_save_all\":\"Všetky stránky\",\"settings_position_save_this\":\"Táto stránka\",\"assistant_select_element_start\":\"Štart\",\"assistant_select_element_text\":\"Vyberte prvok na stránke, ktorý chcete zablokovať. Obnovte stránku pre zrušenie režimu blokovania prvkov.\",\"menu_filtration_status\":{\"message\":\"Filtrácia na tejto stránke\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nefiltrovať počas 30 sekúnd\"},\"menu_block_ad_on_site\":{\"message\":\"Blokovať reklamy na tejto stránke\"},\"menu_report_abuse\":{\"message\":\"Nahlásiť stránku\"},\"menu_site_report\":{\"message\":\"Bezpečnostná správa o stránke\"},\"menu_settings\":{\"message\":\"Nastavenia asistenta\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikátor reputácie stránok\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Úroveň spoľahlivosti reputácie\"},\"assistant_select_element\":{\"message\":\"Blokovanie prvku\"},\"assistant_select_element_ext\":{\"message\":\"Vyberte prvok stránky, ktorý sa má blokovať\"},\"assistant_select_element_cancel\":{\"message\":\"Zrušiť\"},\"assistant_block_element\":{\"message\":\"Blokovanie prvku\"},\"assistant_block_element_explain\":{\"message\":\"Upraviť pravidlo blokovania prvku\"},\"assistant_slider_explain\":{\"message\":\"Použite posuvník pre zmenu veľkosti rámu pre nové pravidlo, ktoré bude použité na:\"},\"assistant_extended_settings\":{\"message\":\"Pokročilé nastavenia\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Použiť pravidlo na všetky stránky\"},\"assistant_block_by_reference\":{\"message\":\"Blokovať referenčným odkazom\"},\"assistant_block_similar\":{\"message\":\"Blokovať podobné\"},\"assistant_another_element\":{\"message\":\"Zvoliť iný prvok\"},\"assistant_preview\":{\"message\":\"Náhľad\"},\"assistant_block\":{\"message\":\"Blokovať\"},\"assistant_settings\":{\"message\":\"Nastavenia asistenta\"},\"assistant_preview_header\":{\"message\":\"Blokovanie prvku - náhľad\"},\"assistant_preview_header_info\":{\"message\":\"Uistite sa, že prvok je blokovaný podľa Vašich predstáv\"},\"assistant_preview_end\":{\"message\":\"Ukončenie náhľadu\"},\"wot_unknown_description\":{\"message\":\"Reputácia tejto webovej stránky nie je v $1 definovaná\"},\"wot_bad_description\":{\"message\":\"Táto stránka má podľa $1\\\\nveľmi zlú reputáciu\"},\"wot_poor_description\":{\"message\":\"Táto stránka má podľa $1\\\\nzlú reputáciu\"},\"wot_unsatisfactory_description\":{\"message\":\"Táto stránka má podľa $1\\\\nslabú reputáciu\"},\"wot_good_description\":{\"message\":\"Táto stránka má podľa $1\\\\ndobrú reputáciu\"},\"wot_excellent_description\":{\"message\":\"Táto stránka má podľa $1\\\\nvýbornú reputáciu\"},\"settings_choose_size_and_position\":{\"message\":\"Prispôsobiť veľkosť a polohu AdGuard asistenta\"},\"settings_icon_size\":{\"message\":\"Veľkosť ikony:\"},\"settings_small\":{\"message\":\"Malá\"},\"settings_big\":{\"message\":\"Veľká\"},\"settings_position\":{\"message\":\"Poloha:\"},\"settings_left_top\":{\"message\":\"Vľavo hore\"},\"settings_right_top\":{\"message\":\"Vpravo hore\"},\"settings_left_bottom\":{\"message\":\"Vľavo dole\"},\"settings_right_bottom\":{\"message\":\"Vpravo dole\"},\"settings_cancel\":{\"message\":\"Zrušiť\"},\"settings_save\":{\"message\":\"Uložiť zmeny\"}}');\n\t }),\n\t 6058:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Spletne strani\",\"settings_position_save_all\":\"Vse pletne strani\",\"settings_position_save_this\":\"To spletno stran\",\"assistant_select_element_start\":\"Začni\",\"assistant_select_element_text\":\"Izberite element na strani, ki jo želite onemogočiti. Osvežite stran, da prekličete način zaviranja elementa.\",\"menu_filtration_status\":{\"message\":\"Filtriranje na tej spletni strani\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne filtriraj 30 sekund\"},\"menu_block_ad_on_site\":{\"message\":\"Onemogoči oglas na tej spletni strani\"},\"menu_report_abuse\":{\"message\":\"Prijavi spletno stran\"},\"menu_site_report\":{\"message\":\"Poročilo o varnosti spletne strani\"},\"menu_settings\":{\"message\":\"Nastavitve Pomočnika\"},\"menu_wot_reputation_indicator\":{\"message\":\"Kazalnik ugleda spletnestrani\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Raven ugleda zaupanja\"},\"assistant_select_element\":{\"message\":\"Onemogočanje elementa\"},\"assistant_select_element_ext\":{\"message\":\"Izberite element na strani, ki ga želite onemogočiti\"},\"assistant_select_element_cancel\":{\"message\":\"Prekliči\"},\"assistant_block_element\":{\"message\":\"Onemogočanje elementa\"},\"assistant_block_element_explain\":{\"message\":\"Prilagodite pravilo za onemogočanje elementa\"},\"assistant_slider_explain\":{\"message\":\"Premaknite drsnik, da spremenite velikost okvirja, za katerega bo delovalo novo pravilo:\"},\"assistant_extended_settings\":{\"message\":\"Napredne nastavitve\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Uporabi pravilo za vse spletne strani\"},\"assistant_block_by_reference\":{\"message\":\"Onemogočij z napotitveno povezavo\"},\"assistant_block_similar\":{\"message\":\"Onemogoči podobno\"},\"assistant_another_element\":{\"message\":\"Izberi drug element\"},\"assistant_preview\":{\"message\":\"Predogled\"},\"assistant_block\":{\"message\":\"Onemogoči\"},\"assistant_settings\":{\"message\":\"Nastavitve Pomočnika\"},\"assistant_preview_header\":{\"message\":\"Onemogočanje elementa - predogled\"},\"assistant_preview_header_info\":{\"message\":\"Prepričajte se, da je element bil onemogočen, kot je bilo predvideno\"},\"assistant_preview_end\":{\"message\":\"Zapusti predogled\"},\"wot_unknown_description\":{\"message\":\"Ugled te spletne strani ni opredeljen z $1\"},\"wot_bad_description\":{\"message\":\"Ta spletna stran ima zelo slab ugled\\\\nglede na $1\"},\"wot_poor_description\":{\"message\":\"Ta spletna stran ima slab ugled\\\\nglede na $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ta spletna stran ima zelo slab ugled\\\\nglede na $1\"},\"wot_good_description\":{\"message\":\"Ta spletna stran ima dober ugled\\\\nglede na $1\"},\"wot_excellent_description\":{\"message\":\"Ta spletna stran ima odličen ugled\\\\nglede na $1\"},\"settings_choose_size_and_position\":{\"message\":\"Prilagodi velikost in položaj AdGuard Pomočnika\"},\"settings_icon_size\":{\"message\":\"Velikost ikone:\"},\"settings_small\":{\"message\":\"Majhna\"},\"settings_big\":{\"message\":\"Velika\"},\"settings_position\":{\"message\":\"Položaj:\"},\"settings_left_top\":{\"message\":\"Zgoraj levo\"},\"settings_right_top\":{\"message\":\"Zgoraj desno\"},\"settings_left_bottom\":{\"message\":\"Spodaj levo\"},\"settings_right_bottom\":{\"message\":\"Spodaj desno\"},\"settings_cancel\":{\"message\":\"Prekliči\"},\"settings_save\":{\"message\":\"Shrani nastavitve\"}}');\n\t }),\n\t 9177:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sajtovi\",\"settings_position_save_all\":\"Svi sajtovi\",\"settings_position_save_this\":\"Ovaj sajt\",\"assistant_select_element_start\":\"Započni\",\"assistant_select_element_text\":\"Izaberite element na stranici koji želite da blokirate. Osvežite stranicu da otkažete blokiranje elemenata.\",\"menu_filtration_status\":{\"message\":\"Filtriranje na ovom sajtu\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne filtriraj u narednih 30 sekundi\"},\"menu_block_ad_on_site\":{\"message\":\"Blokiraj reklamu na ovom sajtu\"},\"menu_report_abuse\":{\"message\":\"Prijavi sajt\"},\"menu_site_report\":{\"message\":\"Bezbednosni izveštaj o sajtu\"},\"menu_settings\":{\"message\":\"Postavke pomoćnika\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikator reputacije sajta\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nivo poverljivosti reputacije\"},\"assistant_select_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_select_element_ext\":{\"message\":\"Izaberite element koji želite da blokirate na stranici\"},\"assistant_select_element_cancel\":{\"message\":\"Otkaži\"},\"assistant_block_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_block_element_explain\":{\"message\":\"Podesite pravilo blokiranja elementa\"},\"assistant_slider_explain\":{\"message\":\"Pomerajte klizač kako bi ste promenili veličinu okvira po kom će pravilo raditi:\"},\"assistant_extended_settings\":{\"message\":\"Napredne postavke\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Primeni pravilo na sve sajtove\"},\"assistant_block_by_reference\":{\"message\":\"Blokiraj po linku reference\"},\"assistant_block_similar\":{\"message\":\"Blokiraj slično\"},\"assistant_another_element\":{\"message\":\"Izaberite drugi element\"},\"assistant_preview\":{\"message\":\"Pregled\"},\"assistant_block\":{\"message\":\"Blokiraj\"},\"assistant_settings\":{\"message\":\"Postavke pomoćnika\"},\"assistant_preview_header\":{\"message\":\"Pregled blokiranja elementa\"},\"assistant_preview_header_info\":{\"message\":\"Uverite se da je element blokiran kako ste želeli\"},\"assistant_preview_end\":{\"message\":\"Napusti pregled\"},\"wot_unknown_description\":{\"message\":\"Reputacija nije definisana\"},\"wot_bad_description\":{\"message\":\"Ovaj sajt ima veoma lošu reputaciju\\\\nprema \"},\"wot_poor_description\":{\"message\":\"Ovaj sajt ima lošu reputaciju\\\\nprema \"},\"wot_unsatisfactory_description\":{\"message\":\"Ovaj sajt ima slabu reputaciju\\\\nprema \"},\"wot_good_description\":{\"message\":\"Ovaj sajt ima dobru reputaciju\\\\nprema \"},\"wot_excellent_description\":{\"message\":\"Ovaj sajt ima odličnu reputaciju\\\\nprema \"},\"settings_choose_size_and_position\":{\"message\":\"Podesite veličinu i poziciju AdGuard pomoćnika\"},\"settings_icon_size\":{\"message\":\"Veličina ikonice\"},\"settings_small\":{\"message\":\"Mala\"},\"settings_big\":{\"message\":\"Velika\"},\"settings_position\":{\"message\":\"Pozicija:\"},\"settings_left_top\":{\"message\":\"Gore levo\"},\"settings_right_top\":{\"message\":\"Gore desno\"},\"settings_left_bottom\":{\"message\":\"Dole levo\"},\"settings_right_bottom\":{\"message\":\"Dole desno\"},\"settings_cancel\":{\"message\":\"Otkaži\"},\"settings_save\":{\"message\":\"Sačuvaj promene\"}}');\n\t }),\n\t 6105:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webbplatser\",\"settings_position_save_all\":\"Alla webbplatser\",\"settings_position_save_this\":\"Den här webbplatsen\",\"assistant_select_element_text\":\"Välj ett element sidan att blockera. Återladda sidan för att återställa elementblockeringsläget.\",\"menu_filtration_status\":{\"message\":\"Webbplatsens filtrering\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Pausa filtrering 30 sekunder\"},\"menu_block_ad_on_site\":{\"message\":\"Blockera annons på den här webbplatsen\"},\"menu_report_abuse\":{\"message\":\"Rapportera webbplatsen\"},\"menu_site_report\":{\"message\":\"Säkerhetsrapport för webbplatsen\"},\"menu_settings\":{\"message\":\"Assistentinställningar\"},\"assistant_select_element\":{\"message\":\"Blockering av annonselement\"},\"assistant_select_element_ext\":{\"message\":\"Välj ett annonselement för blockering\"},\"assistant_select_element_cancel\":{\"message\":\"Avbryt\"},\"assistant_block_element\":{\"message\":\"Blockering av annonselement\"},\"assistant_block_element_explain\":{\"message\":\"Anpassa blockeringsregeln för annonselementet\"},\"assistant_slider_explain\":{\"message\":\"Justera storleken på annonselementet som den nya blockeringsregeln skall avse:\"},\"assistant_extended_settings\":{\"message\":\"Avancerade val\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Tillämpa regelns på alla webbplatster\"},\"assistant_block_by_reference\":{\"message\":\"Blockera med referenslänk\"},\"assistant_block_similar\":{\"message\":\"Blockera liknande\"},\"assistant_another_element\":{\"message\":\"Markera ett annat annonselement\"},\"assistant_preview\":{\"message\":\"Förhandsgranska\"},\"assistant_block\":{\"message\":\"Blockera\"},\"assistant_settings\":{\"message\":\"Assistentval\"},\"assistant_preview_header\":{\"message\":\"Förhandsgranskning av elementblockeringen\"},\"assistant_preview_header_info\":{\"message\":\"Kontrollera att elementet blockerats som avsett\"},\"assistant_preview_end\":{\"message\":\"Avsluta förhandsgranskningen\"},\"wot_unknown_description\":{\"message\":\"Den här sajtens anseende är inte klarlagd av $1\"},\"wot_bad_description\":{\"message\":\"Webbplatsen har ett mycket dåligt anseende\\\\nenligt $1\"},\"wot_poor_description\":{\"message\":\"Webbplatsen har dåligt anseende\\\\nenligt $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Webbplatsen har tveksamt anseende\\\\nenligt $1\"},\"wot_good_description\":{\"message\":\"Webbplatsen har gott anseende\\\\nenligt $1\"},\"wot_excellent_description\":{\"message\":\"Webbplatsen har ett mycket gott anseende\\\\nenligt $1\"},\"settings_choose_size_and_position\":{\"message\":\"Anpassas storlek och läge för AdGuardassistenten\"},\"settings_icon_size\":{\"message\":\"Ikonstorlek\"},\"settings_small\":{\"message\":\"Liten\"},\"settings_big\":{\"message\":\"Stor\"},\"settings_position\":{\"message\":\"Läge:\"},\"settings_left_top\":{\"message\":\"Ovan vänster\"},\"settings_right_top\":{\"message\":\"Ovan höger\"},\"settings_left_bottom\":{\"message\":\"Nedan vänster\"},\"settings_right_bottom\":{\"message\":\"Nedan höger\"},\"settings_cancel\":{\"message\":\"Avbryt\"},\"settings_save\":{\"message\":\"Spara ändringar\"}}');\n\t }),\n\t 147:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Siteler\",\"settings_position_save_all\":\"Tüm siteler\",\"settings_position_save_this\":\"Bu site\",\"assistant_select_element_start\":\"Başla\",\"assistant_select_element_text\":\"Engellemek için sayfada bir öğe seçin. Öğe engelleme modunu iptal etmek için sayfayı yenileyin.\",\"menu_filtration_status\":{\"message\":\"Bu sitedeki filtreleme\"},\"menu_do_not_filter_30_sec\":{\"message\":\"30 saniyeliğine filtreleme yapma\"},\"menu_block_ad_on_site\":{\"message\":\"Bu sitede reklam engelle\"},\"menu_report_abuse\":{\"message\":\"Siteyi bildir\"},\"menu_site_report\":{\"message\":\"Sitenin güvenlik raporu\"},\"menu_settings\":{\"message\":\"Asistan ayarları\"},\"menu_wot_reputation_indicator\":{\"message\":\"Site itibarı göstergesi\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"İtibarın Güven Seviyesi\"},\"assistant_select_element\":{\"message\":\"Öğe engelleme\"},\"assistant_select_element_ext\":{\"message\":\"Sayfada engellenecek bir öğe seçin\"},\"assistant_select_element_cancel\":{\"message\":\"İptal\"},\"assistant_block_element\":{\"message\":\"Öğe engelleme\"},\"assistant_block_element_explain\":{\"message\":\"Öğe engelleme kuralını ayarla\"},\"assistant_slider_explain\":{\"message\":\"Yeni kuralın çalışacağı çerçevenin boyutunu değiştirmek için kayar düğmeyi hareket ettirin\"},\"assistant_extended_settings\":{\"message\":\"Gelişmiş ayarlar\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Kuralı tüm sitelerde uygula\"},\"assistant_block_by_reference\":{\"message\":\"Referans bağlantı ile engelle\"},\"assistant_block_similar\":{\"message\":\"Benzerlerini engelle\"},\"assistant_another_element\":{\"message\":\"Farklı bir öğe seç\"},\"assistant_preview\":{\"message\":\"Önizleme\"},\"assistant_block\":{\"message\":\"Engelle\"},\"assistant_settings\":{\"message\":\"Asistan ayarları\"},\"assistant_preview_header\":{\"message\":\"Öğe engelleme - ön izleme\"},\"assistant_preview_header_info\":{\"message\":\"Öğenin istediğiniz gibi engellendiğinden emin olun\"},\"assistant_preview_end\":{\"message\":\"Önizlemeden çık\"},\"wot_unknown_description\":{\"message\":\"Bu sitenin itibarı $1 tarafından henüz belirlenmemiş\"},\"wot_bad_description\":{\"message\":\"1$\\'a göre bu site çok kötü \\\\nbir itibara sahip\"},\"wot_poor_description\":{\"message\":\"1$\\'a göre bu site kötü \\\\nbir itibara sahip\"},\"wot_unsatisfactory_description\":{\"message\":\"1$\\'a göre bu site zayıf\\\\nbir itibara sahip\"},\"wot_good_description\":{\"message\":\"1$\\'a göre bu site iyi\\\\nbir itibara sahip\"},\"wot_excellent_description\":{\"message\":\"1$\\'a göre bu site mükemmel\\\\nbir itibara sahip\"},\"settings_choose_size_and_position\":{\"message\":\"AdGuard Asistanın boyutunu ve konumunu ayarlayın\"},\"settings_icon_size\":{\"message\":\"Simge boyutu:\"},\"settings_small\":{\"message\":\"Küçük\"},\"settings_big\":{\"message\":\"Büyük\"},\"settings_position\":{\"message\":\"Konum:\"},\"settings_left_top\":{\"message\":\"Sol üst\"},\"settings_right_top\":{\"message\":\"Sağ üst\"},\"settings_left_bottom\":{\"message\":\"Sol alt\"},\"settings_right_bottom\":{\"message\":\"Sağ alt\"},\"settings_cancel\":{\"message\":\"İptal\"},\"settings_save\":{\"message\":\"Değişiklikleri kaydet\"}}');\n\t }),\n\t 1249:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Сайти\",\"settings_position_save_all\":\"На всіх\",\"settings_position_save_this\":\"Тільки на даному\",\"assistant_select_element_start\":\"Почати\",\"assistant_select_element_text\":\"Виберіть елемент на сторінці, який треба заблокувати. Оновіть сторінку, щоб скасувати режим блокування.\",\"menu_filtration_status\":{\"message\":\"Фільтрування на цьому сайті\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Не фільтрувати 30 секунд\"},\"menu_block_ad_on_site\":{\"message\":\"Заблокувати рекламу на даному сайті\"},\"menu_report_abuse\":{\"message\":\"Повідомити про сайт\"},\"menu_site_report\":{\"message\":\"Звіт про безпеку сайту\"},\"menu_settings\":{\"message\":\"Налаштування помічника\"},\"menu_wot_reputation_indicator\":{\"message\":\"Індикатор репутації сайту\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Рівень надійності репутації\"},\"assistant_select_element\":{\"message\":\"Блокування елементу\"},\"assistant_select_element_ext\":{\"message\":\"Виберіть елемент на сторінці, який треба заблокувати\"},\"assistant_select_element_cancel\":{\"message\":\"Скасувати\"},\"assistant_block_element\":{\"message\":\"Блокування елементу\"},\"assistant_block_element_explain\":{\"message\":\"Налаштуйте правило блокування елементу\"},\"assistant_slider_explain\":{\"message\":\"Пересувайте повзунок, щоб змінити розмір блоку, для якого діятиме правило:\"},\"assistant_extended_settings\":{\"message\":\"Розширені налаштування\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Застосувати правило для всіх сайтів\"},\"assistant_block_by_reference\":{\"message\":\"Блокувати за посиланням\"},\"assistant_block_similar\":{\"message\":\"Блокувати схожі елементи\"},\"assistant_another_element\":{\"message\":\"Вибрати інший елемент\"},\"assistant_preview\":{\"message\":\"Попередній перегляд\"},\"assistant_block\":{\"message\":\"Заблокувати\"},\"assistant_settings\":{\"message\":\"Налаштування помічника\"},\"assistant_preview_header\":{\"message\":\"Блокування елементу - попередній перегляд\"},\"assistant_preview_header_info\":{\"message\":\"Переконайтеся, що елемент заблокований як слід\"},\"assistant_preview_end\":{\"message\":\"Закінчити попередній перегляд\"},\"wot_unknown_description\":{\"message\":\"Репутація цього вебсайту не визначена\"},\"wot_bad_description\":{\"message\":\"Цей сайт має дуже погану репутацію\\\\nза версією $1\"},\"wot_poor_description\":{\"message\":\"Цей сайт має погану репутацію\\\\nза версією $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Цей сайт має незадовільну репутацію\\\\nза версією $1\"},\"wot_good_description\":{\"message\":\"Цей сайт має добру репутацію\\\\nза версією $1\"},\"wot_excellent_description\":{\"message\":\"Цей сайт має дуже відмінну репутацію\\\\nза версією $1\"},\"settings_choose_size_and_position\":{\"message\":\"Налаштуйте розмір і положення помічника AdGuard\"},\"settings_icon_size\":{\"message\":\"Розмір іконки:\"},\"settings_small\":{\"message\":\"Маленька\"},\"settings_big\":{\"message\":\"Велика\"},\"settings_position\":{\"message\":\"Позиція:\"},\"settings_left_top\":{\"message\":\"Зверху зліва\"},\"settings_right_top\":{\"message\":\"Зверху справа\"},\"settings_left_bottom\":{\"message\":\"Внизу зліва\"},\"settings_right_bottom\":{\"message\":\"Внизу справа\"},\"settings_cancel\":{\"message\":\"Скасувати\"},\"settings_save\":{\"message\":\"Зберегти зміни\"}}');\n\t }),\n\t 4534:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Trang Web\",\"settings_position_save_all\":\"Tất cả trang web\",\"settings_position_save_this\":\"Chỉ trang web này\",\"assistant_select_element_start\":\"Bắt đầu\",\"assistant_select_element_text\":\"Chọn một thành phần trên trang để chặn. Làm mới trang web để hủy bỏ chế độ chặn thành phần.\",\"menu_filtration_status\":{\"message\":\"Lọc trên website này\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Không lọc trong 30 giây\"},\"menu_block_ad_on_site\":{\"message\":\"Chặn quảng cáo đối với trang web này\"},\"menu_report_abuse\":{\"message\":\"Báo cáo trang web này\"},\"menu_site_report\":{\"message\":\"Báo cáo bảo mật website\"},\"menu_settings\":{\"message\":\"Cài đặt trợ lý\"},\"menu_wot_reputation_indicator\":{\"message\":\"Chỉ số danh tiếng của trang Web\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Mức độ đáng tin của danh tiếng\"},\"assistant_select_element\":{\"message\":\"Chặn thành phần\"},\"assistant_select_element_ext\":{\"message\":\"Chọn một thành phần trên trang để chặn\"},\"assistant_select_element_cancel\":{\"message\":\"Hủy bỏ\"},\"assistant_block_element\":{\"message\":\"Chặn thành phần\"},\"assistant_block_element_explain\":{\"message\":\"Điều chỉnh quy tắc chặn phần tử\"},\"assistant_slider_explain\":{\"message\":\"Di chuyển thanh trượt để thay đổi kích thước của khung, quy tắc mới sẽ hoạt động cho:\"},\"assistant_extended_settings\":{\"message\":\"Cài đặt nâng cao\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Áp dụng tất cả các điều luật đối với mọi trang web\"},\"assistant_block_by_reference\":{\"message\":\"Chặn theo liên kết tham chiếu\"},\"assistant_block_similar\":{\"message\":\"Chặn tương tự\"},\"assistant_another_element\":{\"message\":\"Chọn một phần tử khác\"},\"assistant_preview\":{\"message\":\"Xem trước\"},\"assistant_block\":{\"message\":\"Chặn\"},\"assistant_settings\":{\"message\":\"Cài đặt trợ lý\"},\"assistant_preview_header\":{\"message\":\"Element blocking-xem trước\"},\"assistant_preview_header_info\":{\"message\":\"Đảm bảo rằng thành phần đó bị chặn như dự định\"},\"assistant_preview_end\":{\"message\":\"Thoát xem trước\"},\"wot_unknown_description\":{\"message\":\"Website này danh tiếng chưa được xác định bởi $1\"},\"wot_bad_description\":{\"message\":\"Website này có danh tiếng cực xấu dựa theo $1\"},\"wot_poor_description\":{\"message\":\"Website này có danh tiếng xấu dựa theo $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Website này có danh tiếng không tốt dựa theo $1\"},\"wot_good_description\":{\"message\":\"Website này có danh tiếng tốt dựa theo $1\"},\"wot_excellent_description\":{\"message\":\"Website này có danh tiếng tuyệt vời dựa theo $1\"},\"settings_choose_size_and_position\":{\"message\":\"Điều chỉnh kích thước và vị trí của Trợ Lý AdGuard\"},\"settings_icon_size\":{\"message\":\"Kích thước biểu tượng:\"},\"settings_small\":{\"message\":\"Nhỏ\"},\"settings_big\":{\"message\":\"Lớn\"},\"settings_position\":{\"message\":\"Vị trí:\"},\"settings_left_top\":{\"message\":\"Trên cùng bên trái\"},\"settings_right_top\":{\"message\":\"Trên cùng bên phải\"},\"settings_left_bottom\":{\"message\":\"Dưới cùng bên trái\"},\"settings_right_bottom\":{\"message\":\"Dưới cùng bên phải\"},\"settings_cancel\":{\"message\":\"Hủy bỏ\"},\"settings_save\":{\"message\":\"Lưu các thay đổi\"}}');\n\t }),\n\t 3476:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"網站\",\"settings_position_save_all\":\"所有網站\",\"settings_position_save_this\":\"此網站\",\"assistant_select_element_start\":\"開始\",\"assistant_select_element_text\":\"選擇網頁上的元素來阻擋。若要取消重新整理網頁即可。\",\"menu_filtration_status\":{\"message\":\"過濾此網頁上的廣告\"},\"menu_do_not_filter_30_sec\":{\"message\":\"暫停過濾 30 秒\"},\"menu_block_ad_on_site\":{\"message\":\"封鎖此網頁上的廣告\"},\"menu_report_abuse\":{\"message\":\"回報此網站\"},\"menu_site_report\":{\"message\":\"網站安全性報告\"},\"menu_settings\":{\"message\":\"助手設定\"},\"menu_wot_reputation_indicator\":{\"message\":\"網頁名譽指標\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"名譽可信程度\"},\"assistant_select_element\":{\"message\":\"封鎖網頁元素\"},\"assistant_select_element_ext\":{\"message\":\"選取網頁上的元素來封鎖\"},\"assistant_select_element_cancel\":{\"message\":\"取消\"},\"assistant_block_element\":{\"message\":\"阻擋網頁元素\"},\"assistant_block_element_explain\":{\"message\":\"調整網頁元素阻擋條件\"},\"assistant_slider_explain\":{\"message\":\"移動滑桿可以更改阻擋元素範圍:\"},\"assistant_extended_settings\":{\"message\":\"進階設定\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"套用至所有網站\"},\"assistant_block_by_reference\":{\"message\":\"通過參考連結封鎖\"},\"assistant_block_similar\":{\"message\":\"封鎖相關或類似的\"},\"assistant_another_element\":{\"message\":\"選取其他網頁元素\"},\"assistant_preview\":{\"message\":\"預覽\"},\"assistant_block\":{\"message\":\"封鎖\"},\"assistant_settings\":{\"message\":\"助手設定\"},\"assistant_preview_header\":{\"message\":\"封鎖網頁元祖 - 預覽\"},\"assistant_preview_header_info\":{\"message\":\"確保網頁元素已被正確封鎖\"},\"assistant_preview_end\":{\"message\":\"關閉預覽\"},\"wot_unknown_description\":{\"message\":\"此網站名譽尚未被 $1 評定\"},\"wot_bad_description\":{\"message\":\"根據 $1\\\\n此網站名譽非常糟糕\"},\"wot_poor_description\":{\"message\":\"根據 $1\\\\n此網站擁有不良的名譽\"},\"wot_unsatisfactory_description\":{\"message\":\"根據 $1\\\\n此網站擁有不好的名譽\"},\"wot_good_description\":{\"message\":\"根據 $1\\\\n此網站擁有良好的名譽\"},\"wot_excellent_description\":{\"message\":\"根據 $1\\\\n此網站擁有非常優秀的名譽\"},\"settings_choose_size_and_position\":{\"message\":\"調整 AdGuard 小助手大小與位置\"},\"settings_icon_size\":{\"message\":\"圖示大小:\"},\"settings_small\":{\"message\":\"小\"},\"settings_big\":{\"message\":\"大\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上角\"},\"settings_right_top\":{\"message\":\"右上角\"},\"settings_left_bottom\":{\"message\":\"左下角\"},\"settings_right_bottom\":{\"message\":\"右下角\"},\"settings_cancel\":{\"message\":\"取消\"},\"settings_save\":{\"message\":\"儲存變更\"}}');\n\t }),\n\t 5480:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"網站\",\"settings_position_save_all\":\"所有的網站\",\"settings_position_save_this\":\"此網站\",\"assistant_select_element_start\":\"開始\",\"assistant_select_element_text\":\"選擇於該頁面上之元件以封鎖。重新整理該頁面以取消元件封鎖模式。\",\"menu_filtration_status\":{\"message\":\"對此網站之過濾\"},\"menu_do_not_filter_30_sec\":{\"message\":\"計 30 秒不過濾\"},\"menu_block_ad_on_site\":{\"message\":\"封鎖於此網站上之廣告\"},\"menu_report_abuse\":{\"message\":\"報告該網站\"},\"menu_site_report\":{\"message\":\"網站安全性報告\"},\"menu_settings\":{\"message\":\"助理設定\"},\"menu_wot_reputation_indicator\":{\"message\":\"網站信譽指標\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"信譽信賴等級\"},\"assistant_select_element\":{\"message\":\"元件封鎖\"},\"assistant_select_element_ext\":{\"message\":\"選擇於該頁面上之元件以封鎖\"},\"assistant_select_element_cancel\":{\"message\":\"取消\"},\"assistant_block_element\":{\"message\":\"元件封鎖\"},\"assistant_block_element_explain\":{\"message\":\"調整元件封鎖規則\"},\"assistant_slider_explain\":{\"message\":\"移動該滑標以更改新的規則將作用於的框架之尺寸:\"},\"assistant_extended_settings\":{\"message\":\"進階設定\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"對所有的網站套用該規則\"},\"assistant_block_by_reference\":{\"message\":\"按照參考連結封鎖\"},\"assistant_block_similar\":{\"message\":\"封鎖相似之物\"},\"assistant_another_element\":{\"message\":\"選擇不同的元件\"},\"assistant_preview\":{\"message\":\"預覽\"},\"assistant_block\":{\"message\":\"封鎖\"},\"assistant_settings\":{\"message\":\"助理設定\"},\"assistant_preview_header\":{\"message\":\"元件封鎖 - 預覽\"},\"assistant_preview_header_info\":{\"message\":\"確定元件如預期的被封鎖\"},\"assistant_preview_end\":{\"message\":\"離開預覽\"},\"wot_unknown_description\":{\"message\":\"此網站的信譽未被 $1 界定\"},\"wot_bad_description\":{\"message\":\"根據 $1,\\\\n此網站有非常壞的信譽\"},\"wot_poor_description\":{\"message\":\"根據 $1,\\\\n此網站有壞的信譽\"},\"wot_unsatisfactory_description\":{\"message\":\"根據 $1,\\\\n此網站有不好的信譽\"},\"wot_good_description\":{\"message\":\"根據 $1,\\\\n此網站有好的信譽\"},\"wot_excellent_description\":{\"message\":\"根據 $1,\\\\n此網站有極好的信譽\"},\"settings_choose_size_and_position\":{\"message\":\"調整 AdGuard 助理尺寸和位置\"},\"settings_icon_size\":{\"message\":\"圖示尺寸:\"},\"settings_small\":{\"message\":\"小的\"},\"settings_big\":{\"message\":\"大的\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上角\"},\"settings_right_top\":{\"message\":\"右上角\"},\"settings_left_bottom\":{\"message\":\"左下角\"},\"settings_right_bottom\":{\"message\":\"右下角\"},\"settings_cancel\":{\"message\":\"取消\"},\"settings_save\":{\"message\":\"儲存更改\"}}');\n\t }),\n\t 8868:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"网站\",\"settings_position_save_all\":\"所有网站\",\"settings_position_save_this\":\"此网站\",\"assistant_select_element_start\":\"开始\",\"assistant_select_element_text\":\"选择要拦截的网页元素。要取消元素拦截模式,请刷新网页。\",\"menu_filtration_status\":{\"message\":\"对此网站进行过滤\"},\"menu_do_not_filter_30_sec\":{\"message\":\"暂停过滤 30 秒\"},\"menu_block_ad_on_site\":{\"message\":\"拦截此网站上的广告\"},\"menu_report_abuse\":{\"message\":\"报告此网站\"},\"menu_site_report\":{\"message\":\"网站安全报告\"},\"menu_settings\":{\"message\":\"助手设置\"},\"menu_wot_reputation_indicator\":{\"message\":\"网站声誉指标\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"声望置信度\"},\"assistant_select_element\":{\"message\":\"拦截元素\"},\"assistant_select_element_ext\":{\"message\":\"选择此页面上需要拦截的元素\"},\"assistant_select_element_cancel\":{\"message\":\"取消\"},\"assistant_block_element\":{\"message\":\"拦截元素\"},\"assistant_block_element_explain\":{\"message\":\"调整元素拦截规则\"},\"assistant_slider_explain\":{\"message\":\"使用滑块改变要由新规则将要拦截的框架大小:\"},\"assistant_extended_settings\":{\"message\":\"高级设置\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"应用规则至所有网站\"},\"assistant_block_by_reference\":{\"message\":\"通过参考链接进行拦截\"},\"assistant_block_similar\":{\"message\":\"拦截类似元素\"},\"assistant_another_element\":{\"message\":\"选择其它元素\"},\"assistant_preview\":{\"message\":\"预览\"},\"assistant_block\":{\"message\":\"拦截\"},\"assistant_settings\":{\"message\":\"AdGuard 助手设置\"},\"assistant_preview_header\":{\"message\":\"元素拦截 - 预览\"},\"assistant_preview_header_info\":{\"message\":\"请确保元素拦截方式符合预期\"},\"assistant_preview_end\":{\"message\":\"退出预览\"},\"wot_unknown_description\":{\"message\":\"声望尚未定义\"},\"wot_bad_description\":{\"message\":\"此网站在以下数据库中声望极低\"},\"wot_poor_description\":{\"message\":\"此网站在以下数据库中声望低下 \"},\"wot_unsatisfactory_description\":{\"message\":\"此网站在以下数据库中声望不佳 \"},\"wot_good_description\":{\"message\":\"此网站在以下数据库中声望良好 \"},\"wot_excellent_description\":{\"message\":\"此网站在以下数据库中声望极佳 \"},\"settings_choose_size_and_position\":{\"message\":\"调整 AdGuard 助手的大小与位置\"},\"settings_icon_size\":{\"message\":\"图标大小:\"},\"settings_small\":{\"message\":\"小\"},\"settings_big\":{\"message\":\"大\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上角\"},\"settings_right_top\":{\"message\":\"右上角\"},\"settings_left_bottom\":{\"message\":\"左下角\"},\"settings_right_bottom\":{\"message\":\"右下角\"},\"settings_cancel\":{\"message\":\"取消\"},\"settings_save\":{\"message\":\"保存更改\"}}');\n\t })\n\t \t});\n\t \tvar __webpack_module_cache__ = {};\n\t \tfunction __webpack_require__(moduleId) {\n\t \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n\t \t\tif (cachedModule !== undefined) {\n\t \t\t\treturn cachedModule.exports;\n\t \t\t}\n\t \t\tvar module = __webpack_module_cache__[moduleId] = {\n\t \t\t\tid: moduleId,\n\t \t\t\texports: {}\n\t \t\t};\n\t \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\t \t\treturn module.exports;\n\t \t}\n\t \t(() => {\n\t \t\t__webpack_require__.n = (module) => {\n\t \t\t\tvar getter = module && module.__esModule ?\n\t \t\t\t\t() => (module['default']) :\n\t \t\t\t\t() => (module);\n\t \t\t\t__webpack_require__.d(getter, { a: getter });\n\t \t\t\treturn getter;\n\t \t\t};\n\t \t})();\n\t \t(() => {\n\t \t\t__webpack_require__.d = (exports, definition) => {\n\t \t\t\tfor(var key in definition) {\n\t \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t \t\t\t\t}\n\t \t\t\t}\n\t \t\t};\n\t \t})();\n\t \t(() => {\n\t \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop));\n\t \t})();\n\t \t(() => {\n\t \t\t__webpack_require__.r = (exports) => {\n\t \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t \t\t\t}\n\t \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n\t \t\t};\n\t \t})();\n\tvar __webpack_exports__ = {};\n\t(() => {\n\t__webpack_require__.r(__webpack_exports__);\n\t__webpack_require__.d(__webpack_exports__, {\n\t \"adguardAssistant\": () => ( adguardAssistant)\n\t});\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\tfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\tfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\tvar getArguments = function getArguments(func) {\n\t var FN_ARGS = /^function\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n\t var args = func.toString().match(FN_ARGS)[1].split(',');\n\t if (args[0] === '') {\n\t return [];\n\t }\n\t return args;\n\t};\n\tvar Ioc = function () {\n\t function Ioc() {\n\t _classCallCheck(this, Ioc);\n\t this.dependencies = {};\n\t }\n\t _createClass(Ioc, [{\n\t key: \"resolveDependencies\",\n\t value: function resolveDependencies(func) {\n\t var args = getArguments(func);\n\t var resolved = [];\n\t for (var i = 0; i < args.length; i += 1) {\n\t var depName = args[i].trim();\n\t var dep = this.dependencies[depName];\n\t if (!dep) {\n\t throw new Error(\"Can't find dependency: \".concat(depName));\n\t }\n\t resolved.push(this.dependencies[depName]);\n\t }\n\t return resolved;\n\t }\n\t }, {\n\t key: \"register\",\n\t value: function register(qualifier, obj) {\n\t this.dependencies[qualifier] = obj;\n\t }\n\t }, {\n\t key: \"get\",\n\t value: function get(func) {\n\t if (typeof func === 'string') {\n\t var resolved = this.dependencies[func];\n\t if (!resolved) {\n\t throw new Error(\"Can't resolve \".concat(func));\n\t }\n\t return resolved;\n\t }\n\t var resolvedDependencies = this.resolveDependencies(func);\n\t function FuncWrapper() {\n\t return func.apply(func, resolvedDependencies);\n\t }\n\t FuncWrapper.prototype = func.prototype;\n\t return new FuncWrapper();\n\t }\n\t }]);\n\t return Ioc;\n\t}();\n\tvar ioc = new Ioc();\n\t const src_ioc = (ioc);\n\tfunction ProtectedApi() {\n\t var win = window;\n\t var functionPType = Function.prototype;\n\t var originalGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\t var _document = document,\n\t documentMode = _document.documentMode,\n\t documentElement = _document.documentElement;\n\t var originalAppendChild = document.appendChild;\n\t var originalJSON = win.JSON;\n\t var functionApply = functionPType.apply;\n\t var functionBind = functionPType.bind;\n\t var COMPLETE = 'complete';\n\t var originalAttachShadow = documentElement.attachShadow;\n\t var apply = typeof Reflect !== 'undefined' ? Reflect.apply : function (target, _this, _arguments) {\n\t return functionApply.call(target, _this, _arguments);\n\t };\n\t var noop = function noop() {};\n\t var methodCallerFactory = function methodCallerFactory(owner, prop) {\n\t if (!owner) {\n\t return noop;\n\t }\n\t var method = owner[prop];\n\t return function () {\n\t if (method) {\n\t return apply(method, owner, arguments);\n\t }\n\t };\n\t };\n\t var getReadyState = function getReadyState() {\n\t if (typeof originalGetOwnPropertyDescriptor(Document.prototype, 'readyState') === 'undefined') {\n\t return COMPLETE;\n\t }\n\t var readyStateGetter = originalGetOwnPropertyDescriptor(Document.prototype, 'readyState').get;\n\t return apply(readyStateGetter, document, []);\n\t };\n\t var addListenerToWindow = methodCallerFactory(win, 'addEventListener');\n\t var removeListenerFromWindow = methodCallerFactory(win, 'removeEventListener');\n\t var querySelector = methodCallerFactory(document, 'querySelector');\n\t var appendChildToElement = function appendChildToElement(elem, child) {\n\t apply(originalAppendChild, elem, [child]);\n\t };\n\t var createElement = function createElement(markup) {\n\t var doc = document.implementation.createHTMLDocument('');\n\t if (markup && markup[0] !== '<') {\n\t markup = \"<\".concat(markup, \">\");\n\t }\n\t doc.body.innerHTML = markup;\n\t return doc.body.firstChild;\n\t };\n\t var json = {\n\t parse: methodCallerFactory(originalJSON, 'parse'),\n\t stringify: methodCallerFactory(originalJSON, 'stringify')\n\t };\n\t var createStylesElement = function createStylesElement(styles, nonce, id) {\n\t if (id && querySelector(\"#\".concat(id))) {\n\t return false;\n\t }\n\t var tagNode = createElement('style');\n\t tagNode.setAttribute('type', 'text/css');\n\t if (id) {\n\t tagNode.setAttribute('id', id);\n\t }\n\t tagNode.setAttribute('nonce', nonce);\n\t if (tagNode.styleSheet) {\n\t tagNode.styleSheet.cssText = styles;\n\t } else {\n\t appendChildToElement(tagNode, document.createTextNode(styles));\n\t }\n\t return tagNode;\n\t };\n\t var checkShadowDomSupport = function checkShadowDomSupport() {\n\t var SAFARI_UA_REGEX = /^((?!chrome|android).)*safari/i;\n\t var isSafari = window.safari !== undefined || SAFARI_UA_REGEX.test(navigator.userAgent);\n\t return typeof originalAttachShadow !== 'undefined' && !isSafari;\n\t };\n\t return {\n\t functionBind: functionBind,\n\t addListenerToWindow: addListenerToWindow,\n\t removeListenerFromWindow: removeListenerFromWindow,\n\t getReadyState: getReadyState,\n\t documentMode: documentMode,\n\t appendChildToElement: appendChildToElement,\n\t createElement: createElement,\n\t json: json,\n\t createStylesElement: createStylesElement,\n\t checkShadowDomSupport: checkShadowDomSupport\n\t };\n\t}\n\tvar protectedApi = new ProtectedApi();\n\t const src_protectedApi = (protectedApi);\n\tfunction Wot() {\n\t var wotUrlScorecardTemplate = 'https://link.adtidy.org/forward.html?action=wot_scorecard&from=main_menu&app=assistant&domain=';\n\t var WOT_URL = 'https://link.adtidy.org/forward.html?action=wot&from=main_menu&app=assistant';\n\t var wotData = null;\n\t var registerWotEventHandler = function registerWotEventHandler() {\n\t var wotDataCb = function wotDataCb(data) {\n\t wotData = data;\n\t };\n\t if (window.WotData) {\n\t wotData = window.WotData;\n\t } else {\n\t window.WotData = wotDataCb;\n\t }\n\t };\n\t var getWotData = function getWotData() {\n\t return wotData;\n\t };\n\t var getWotScorecardUrl = function getWotScorecardUrl(url) {\n\t return \"\".concat(wotUrlScorecardTemplate).concat(url);\n\t };\n\t return {\n\t registerWotEventHandler: registerWotEventHandler,\n\t getWotData: getWotData,\n\t getWotScorecardUrl: getWotScorecardUrl,\n\t WOT_URL: WOT_URL\n\t };\n\t}\n\tvar wot = new Wot();\n\t const src_wot = (wot);\n\tvar bypassCache = function bypassCache(callback) {\n\t var xhr = new XMLHttpRequest();\n\t xhr.open('GET', window.location.href, true);\n\t xhr.setRequestHeader('Pragma', 'no-cache');\n\t xhr.setRequestHeader('Expires', '-1');\n\t xhr.setRequestHeader('Cache-Control', 'no-cache');\n\t xhr.onreadystatechange = function () {\n\t if (xhr.readyState === 4 && callback) {\n\t callback();\n\t }\n\t };\n\t xhr.send();\n\t};\n\tvar reloadPageBypassCache = function reloadPageBypassCache() {\n\t bypassCache(function () {\n\t window.location.reload(true);\n\t });\n\t};\n\tvar events = {\n\t add: function add(elements, es, eventHandler, useCapture) {\n\t this.addRemoveEvents(true, elements, es, eventHandler, useCapture);\n\t },\n\t remove: function remove(elements, es, eventHandler, useCapture) {\n\t this.addRemoveEvents(false, elements, es, eventHandler, useCapture);\n\t },\n\t addRemoveEvents: function addRemoveEvents(add, elements, es, eventHandler, useCapture) {\n\t if (!elements || !es || !eventHandler) {\n\t return false;\n\t }\n\t var eventList = es.split(' ');\n\t if (!eventList || eventList.length < 1) {\n\t return false;\n\t }\n\t if (!elements.length) {\n\t elements = new Array(elements);\n\t }\n\t for (var el = 0; el < elements.length; el += 1) {\n\t for (var evt = 0; evt < eventList.length; evt += 1) {\n\t if (!eventList[evt] || !eventList[evt].length) {\n\t continue;\n\t }\n\t if (add) {\n\t elements[el].addEventListener(eventList[evt], eventHandler, !!useCapture);\n\t } else {\n\t elements[el].removeEventListener(eventList[evt], eventHandler, !!useCapture);\n\t }\n\t }\n\t }\n\t }\n\t};\n\tfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\tfunction Log() {\n\t var currentLevel = 'ERROR';\n\t var LogLevels = {\n\t ERROR: 1,\n\t WARN: 2,\n\t INFO: 3,\n\t DEBUG: 4\n\t };\n\t var print = function print(level, method, args) {\n\t if (LogLevels[currentLevel] < LogLevels[level]) {\n\t return;\n\t }\n\t if (!args || args.length === 0 || !args[0]) {\n\t return;\n\t }\n\t var formatted;\n\t if (_typeof(args[0]) === 'object') {\n\t formatted = args[0];\n\t } else {\n\t var str = \"\".concat(args[0]);\n\t args = Array.prototype.slice.call(args, 1);\n\t formatted = str.replace(/{(\\d+)}/g, function (match, number) {\n\t return typeof args[number] !== 'undefined' ? args[number] : match;\n\t });\n\t if (LogLevels[level] >= LogLevels[currentLevel]) {\n\t var now = new Date();\n\t formatted = \"\".concat(now.toISOString(), \": \").concat(formatted);\n\t }\n\t }\n\t console[method](formatted);\n\t };\n\t var debug = function debug() {\n\t for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\t print('DEBUG', 'log', args);\n\t };\n\t var info = function info() {\n\t for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t args[_key2] = arguments[_key2];\n\t }\n\t print('INFO', 'info', args);\n\t };\n\t var warn = function warn() {\n\t for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n\t args[_key3] = arguments[_key3];\n\t }\n\t print('WARN', 'info', args);\n\t };\n\t var error = function error() {\n\t for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n\t args[_key4] = arguments[_key4];\n\t }\n\t print('ERROR', 'error', args);\n\t };\n\t return {\n\t debug: debug,\n\t info: info,\n\t warn: warn,\n\t error: error\n\t };\n\t}\n\tvar log = new Log();\n\t const src_log = (log);\n\tfunction upgradeHelper_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\tfunction upgradeHelper_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\tfunction upgradeHelper_createClass(Constructor, protoProps, staticProps) { if (protoProps) upgradeHelper_defineProperties(Constructor.prototype, protoProps); if (staticProps) upgradeHelper_defineProperties(Constructor, staticProps); return Constructor; }\n\tvar UpgradeHelper = function () {\n\t function UpgradeHelper() {\n\t upgradeHelper_classCallCheck(this, UpgradeHelper);\n\t this.Constants = {\n\t BUTTON_POSITION_ITEM_NAME: '__adbpos'\n\t };\n\t }\n\t upgradeHelper_createClass(UpgradeHelper, [{\n\t key: \"getButtonPositionData\",\n\t value: function getButtonPositionData() {\n\t try {\n\t var userPosition = localStorage.getItem(this.Constants.BUTTON_POSITION_ITEM_NAME);\n\t if (userPosition) {\n\t return src_protectedApi.json.parse(userPosition);\n\t }\n\t return undefined;\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return undefined;\n\t }\n\t }\n\t }, {\n\t key: \"removeUserPositionForButton\",\n\t value: function removeUserPositionForButton() {\n\t try {\n\t localStorage.removeItem(this.Constants.BUTTON_POSITION_ITEM_NAME);\n\t } catch (ex) {\n\t src_log.error(ex);\n\t }\n\t }\n\t }, {\n\t key: \"upgradeGmStorage\",\n\t value: function upgradeGmStorage(settings, version) {\n\t settings.personal = {};\n\t settings.scriptVersion = version;\n\t settings.personalConfig = true;\n\t return settings;\n\t }\n\t }, {\n\t key: \"upgradeLocalStorage\",\n\t value: function upgradeLocalStorage(settings, sitename) {\n\t var position = this.getButtonPositionData();\n\t if (position) {\n\t if (!settings.personal[sitename]) {\n\t settings.personal[sitename] = {};\n\t }\n\t settings.personal[sitename].position = position;\n\t settings.personal[sitename].largeIcon = settings.largeIcon;\n\t }\n\t this.removeUserPositionForButton();\n\t return settings;\n\t }\n\t }]);\n\t return UpgradeHelper;\n\t}();\n\tvar upgradeHelper = new UpgradeHelper();\n\t const src_upgradeHelper = (upgradeHelper);\n\t const gm = ({});\n\tfunction settings_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { settings_typeof = function _typeof(obj) { return typeof obj; }; } else { settings_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return settings_typeof(obj); }\n\tfunction Settings() {\n\t var Constants = {\n\t MINIMUM_IE_SUPPORTED_VERSION: 10,\n\t MINIMUM_VISIBLE_HEIGHT_TO_SHOW_BUTTON: 250,\n\t IFRAME_ID: 'adguard-assistant-dialog',\n\t REPORT_URL: 'https://link.adtidy.org/forward.html?action=site_report_page&domain={0}&from=main_menu&app=assistant'\n\t };\n\t var MenuItemsNames = {\n\t DetailedMenu: 'mainMenu.html',\n\t SelectorMenu: 'selectorMenu.html',\n\t SliderMenu: 'sliderMenu.html',\n\t BlockPreview: 'blockPreview.html',\n\t SettingsMenu: 'settingsMenu.html'\n\t };\n\t var DefaultConfig = {\n\t buttonPositionTop: false,\n\t buttonPositionLeft: false,\n\t smallIcon: false,\n\t personalConfig: true,\n\t scriptVersion: 2,\n\t personal: {}\n\t };\n\t var wotData = null;\n\t var Config = null;\n\t var adguardSettings = null;\n\t var SITENAME = window.location.host;\n\t var getSettings = function getSettings() {\n\t return gm.getValue('settings').then(function (config) {\n\t try {\n\t return config && src_protectedApi.json.parse(config);\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return null;\n\t }\n\t });\n\t };\n\t var validateSettings = function validateSettings(settings) {\n\t if (!settings) {\n\t src_log.error('Invalid settings object');\n\t return false;\n\t }\n\t for (var prop in settings) {\n\t if (!settings.hasOwnProperty(prop)) {\n\t continue;\n\t }\n\t var property = DefaultConfig[prop];\n\t if (property && settings_typeof(property) !== settings_typeof(settings[prop])) {\n\t src_log.error('Invalid settings object');\n\t return false;\n\t }\n\t }\n\t if (settings.scriptVersion > DefaultConfig.scriptVersion) {\n\t src_log.error('Invalid settings object');\n\t return false;\n\t }\n\t if (settings.scriptVersion < DefaultConfig.scriptVersion) {\n\t src_log.info('Settings object is outdated. Updating...');\n\t settings = src_upgradeHelper.upgradeGmStorage(settings, DefaultConfig.scriptVersion);\n\t }\n\t settings = src_upgradeHelper.upgradeLocalStorage(settings, SITENAME);\n\t return settings;\n\t };\n\t var loadSettings = function loadSettings(showButton) {\n\t src_log.debug('Trying to get settings');\n\t getSettings().then(function (config) {\n\t var checkedConfig = config && validateSettings(config);\n\t if (checkedConfig) {\n\t Config = checkedConfig;\n\t src_log.debug('Settings parsed successfully');\n\t } else {\n\t Config = DefaultConfig;\n\t src_log.debug('No settings found');\n\t }\n\t showButton();\n\t });\n\t };\n\t var saveSettings = function saveSettings(config) {\n\t if (config) {\n\t Config = config;\n\t }\n\t src_log.debug('Update settings...');\n\t src_log.debug(Config);\n\t gm.setValue('settings', Config);\n\t bypassCache();\n\t };\n\t var getWotData = wotData;\n\t var setWotData = function setWotData(data) {\n\t wotData = data;\n\t };\n\t var setAdguardSettings = function setAdguardSettings(settings) {\n\t if (typeof settings === 'undefined') {\n\t src_log.info('No Adguard API Found');\n\t return;\n\t }\n\t adguardSettings = settings;\n\t };\n\t var getAdguardSettings = function getAdguardSettings() {\n\t return adguardSettings;\n\t };\n\t var getUserPositionForButton = function getUserPositionForButton() {\n\t var userPosition;\n\t if (Config.personalConfig) {\n\t if (Config.personal && Config.personal[SITENAME]) {\n\t userPosition = Config.personal[SITENAME].position;\n\t }\n\t } else {\n\t userPosition = Config.position;\n\t }\n\t if (userPosition) {\n\t return userPosition;\n\t }\n\t return null;\n\t };\n\t var setUserPositionForButton = function setUserPositionForButton(position) {\n\t if (Config.personalConfig) {\n\t if (!Config.personal[SITENAME]) {\n\t Config.personal[SITENAME] = {};\n\t }\n\t Config.personal[SITENAME].position = position;\n\t } else {\n\t Config.position = position;\n\t }\n\t saveSettings(Config);\n\t };\n\t var setIconSize = function setIconSize(smallIcon) {\n\t if (Config.personalConfig) {\n\t Config.personal[SITENAME].smallIcon = smallIcon;\n\t } else {\n\t Config.smallIcon = smallIcon;\n\t }\n\t };\n\t var getIconSize = function getIconSize() {\n\t if (Config.personalConfig && Config.personal && Config.personal[SITENAME]) {\n\t return Config.personal[SITENAME].smallIcon;\n\t }\n\t return Config.smallIcon;\n\t };\n\t var setButtonSide = function setButtonSide(buttonSides) {\n\t if (Config.personalConfig) {\n\t delete Config.personal[SITENAME].position;\n\t Config.personal[SITENAME].buttonPositionTop = buttonSides.top;\n\t Config.personal[SITENAME].buttonPositionLeft = buttonSides.left;\n\t } else {\n\t delete Config.position;\n\t Config.buttonPositionTop = buttonSides.top;\n\t Config.buttonPositionLeft = buttonSides.left;\n\t }\n\t };\n\t var setPersonalParam = function setPersonalParam(personalConfig) {\n\t Config.personalConfig = personalConfig;\n\t if (Config.personalConfig && !Config.personal) {\n\t Config.personal = {};\n\t }\n\t if (Config.personalConfig && !Config.personal[SITENAME]) {\n\t Config.personal[SITENAME] = {};\n\t Config.personal[SITENAME].position = Config.position;\n\t }\n\t if (!Config.personalConfig && Config.personal) {\n\t Config.position = Config.personal[SITENAME] && Config.personal[SITENAME].position;\n\t delete Config.personal;\n\t }\n\t };\n\t var getPersonalConfig = function getPersonalConfig() {\n\t return Config.personalConfig;\n\t };\n\t var getButtonSide = function getButtonSide() {\n\t var config = Config;\n\t if (config.personalConfig && config.personal && config.personal[SITENAME]) {\n\t return {\n\t top: config.personal[SITENAME].buttonPositionTop,\n\t left: config.personal[SITENAME].buttonPositionLeft\n\t };\n\t }\n\t return {\n\t top: config.buttonPositionTop,\n\t left: config.buttonPositionLeft\n\t };\n\t };\n\t return {\n\t Constants: Constants,\n\t MenuItemsNames: MenuItemsNames,\n\t getSettings: getSettings,\n\t loadSettings: loadSettings,\n\t getWotData: getWotData,\n\t setWotData: setWotData,\n\t saveSettings: saveSettings,\n\t getUserPositionForButton: getUserPositionForButton,\n\t getButtonSide: getButtonSide,\n\t setIconSize: setIconSize,\n\t setUserPositionForButton: setUserPositionForButton,\n\t setAdguardSettings: setAdguardSettings,\n\t setPersonalParam: setPersonalParam,\n\t setButtonSide: setButtonSide,\n\t getAdguardSettings: getAdguardSettings,\n\t getIconSize: getIconSize,\n\t getPersonalConfig: getPersonalConfig\n\t };\n\t}\n\tvar settings = new Settings();\n\t const src_settings = (settings);\n\tvar templates_button = __webpack_require__(6696);\n\tvar button_default = __webpack_require__.n(templates_button);\n\tvar mainMenu = __webpack_require__(3317);\n\tvar mainMenu_default = __webpack_require__.n(mainMenu);\n\tvar selectorMenu = __webpack_require__(8514);\n\tvar selectorMenu_default = __webpack_require__.n(selectorMenu);\n\tvar settingsMenu = __webpack_require__(4693);\n\tvar settingsMenu_default = __webpack_require__.n(settingsMenu);\n\tvar sliderMenu = __webpack_require__(7726);\n\tvar sliderMenu_default = __webpack_require__.n(sliderMenu);\n\tvar blockPreview = __webpack_require__(5688);\n\tvar blockPreview_default = __webpack_require__.n(blockPreview);\n\tvar mobilePopup = __webpack_require__(2115);\n\tvar mobilePopup_default = __webpack_require__.n(mobilePopup);\n\tvar mobileMenu = __webpack_require__(4825);\n\tvar mobileMenu_default = __webpack_require__.n(mobileMenu);\n\tvar base_common = __webpack_require__(1403);\n\tvar base_common_default = __webpack_require__.n(base_common);\n\tvar styles_button = __webpack_require__(5487);\n\tvar styles_button_default = __webpack_require__.n(styles_button);\n\tvar menu = __webpack_require__(3228);\n\tvar menu_default = __webpack_require__.n(menu);\n\tvar selector = __webpack_require__(5317);\n\tvar selector_default = __webpack_require__.n(selector);\n\tvar mobile_style = __webpack_require__(1953);\n\tvar mobile_style_default = __webpack_require__.n(mobile_style);\n\tvar CSS = {\n\t common: (base_common_default()),\n\t button: (styles_button_default()),\n\t iframe: (menu_default()),\n\t selector: (selector_default()),\n\t mobile: (mobile_style_default())\n\t};\n\tvar HTML = {\n\t button: (button_default()),\n\t detailed_menu: (mainMenu_default()),\n\t selector_menu: (selectorMenu_default()),\n\t settings_menu: (settingsMenu_default()),\n\t slider_menu: (sliderMenu_default()),\n\t preview: (blockPreview_default()),\n\t popup: (mobilePopup_default()),\n\t mobile_menu: (mobileMenu_default())\n\t};\n\tfunction CustomEvent() {\n\t var listeners = [];\n\t var attach = function attach(listener) {\n\t listeners.push(listener);\n\t };\n\t var notify = function notify(args) {\n\t for (var i = 0; i < listeners.length; i += 1) {\n\t listeners[i](args);\n\t }\n\t };\n\t return {\n\t attach: attach,\n\t notify: notify\n\t };\n\t}\n\tfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\tfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\tfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\tfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\tfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\tfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter); }\n\tfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\tfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\tvar getNodeName = function getNodeName(element) {\n\t return element && element.nodeName ? element.nodeName.toUpperCase() : '';\n\t};\n\tvar getParentsLevel = function getParentsLevel(element) {\n\t var parent = element;\n\t var parentArr = [];\n\t while ((parent = parent.parentNode) && getNodeName(parent) !== 'BODY') {\n\t parentArr.push(parent);\n\t }\n\t return parentArr;\n\t};\n\tvar getSingleChildren = function getSingleChildren(element) {\n\t var children = element.childNodes;\n\t if (children) {\n\t var count = 0;\n\t var child;\n\t for (var i = 0; i < children.length; i += 1) {\n\t if (children[i].nodeType === 1) {\n\t child = children[i];\n\t count += 1;\n\t }\n\t }\n\t return count === 1 ? child : null;\n\t }\n\t};\n\tvar getAllChildren = function getAllChildren(element) {\n\t var childArray = [];\n\t var child = element;\n\t while (child = getSingleChildren(child)) {\n\t childArray.push(child);\n\t }\n\t return childArray;\n\t};\n\tvar toArray = function toArray(elems) {\n\t return elems && elems.length !== undefined ? Array.prototype.slice.call(elems) : [elems];\n\t};\n\tvar addClass = function addClass(elem, className) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t var classList = item.classList;\n\t classList.add.apply(classList, _toConsumableArray(className.split(/\\s/)));\n\t });\n\t};\n\tvar removeClass = function removeClass(elem, className) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t var classList = item.classList;\n\t classList.remove.apply(classList, _toConsumableArray(className.split(/\\s/)));\n\t });\n\t};\n\tvar hasClass = function hasClass(elem, className) {\n\t var elems = toArray(elem);\n\t var _elems = _slicedToArray(elems, 1),\n\t target = _elems[0];\n\t return !!(target.classList && target.classList.contains(className));\n\t};\n\tvar show = function show(elem) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t item.style.display = 'block';\n\t });\n\t};\n\tvar hide = function hide(elem) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t item.style.display = 'none';\n\t });\n\t};\n\tvar addStyle = function addStyle(elem, attr, value) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t item.style[attr] = value;\n\t });\n\t};\n\tvar _require = __webpack_require__(14),\n\t LOCALES_EQUIVALENTS_MAP = _require.LOCALES_EQUIVALENTS_MAP,\n\t LANGUAGES = _require.LANGUAGES;\n\tvar locales = Object.keys(LANGUAGES).reduce(function (acc, language) {\n\t var resultLocale = LOCALES_EQUIVALENTS_MAP[language] || language;\n\t var dictionary = __webpack_require__(1503)(\"./\".concat(resultLocale, \"/messages.json\"));\n\t acc[resultLocale] = dictionary;\n\t return acc;\n\t}, {});\n\t const locales_0 = (locales);\n\tfunction localization_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { localization_typeof = function _typeof(obj) { return typeof obj; }; } else { localization_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return localization_typeof(obj); }\n\tfunction localization_slicedToArray(arr, i) { return localization_arrayWithHoles(arr) || localization_iterableToArrayLimit(arr, i) || localization_unsupportedIterableToArray(arr, i) || localization_nonIterableRest(); }\n\tfunction localization_nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction localization_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return localization_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return localization_arrayLikeToArray(o, minLen); }\n\tfunction localization_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\tfunction localization_iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\tfunction localization_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\tvar localization_require = __webpack_require__(897),\n\t _require2 = localization_slicedToArray(localization_require, 1),\n\t BASE_LOCALE = _require2[0].base_locale;\n\tfunction Localization() {\n\t var currentLocale = null;\n\t var locale;\n\t var supportedLocales = Object.keys(locales_0).reduce(function (acc, key) {\n\t var lowerCasedKey = key.toLowerCase();\n\t acc[lowerCasedKey] = locales_0[key];\n\t return acc;\n\t }, {});\n\t if (typeof AdguardSettings !== 'undefined') {\n\t locale = AdguardSettings.locale;\n\t } else if (typeof navigator.languages !== 'undefined') {\n\t locale = navigator.languages[0];\n\t } else if (navigator.language) {\n\t locale = navigator.language;\n\t } else if (navigator.browserLanguage) {\n\t locale = navigator.browserLanguage;\n\t } else {\n\t locale = BASE_LOCALE;\n\t }\n\t if (supportedLocales[locale]) {\n\t currentLocale = locale;\n\t } else if (supportedLocales[locale.toLowerCase()]) {\n\t currentLocale = locale.toLowerCase();\n\t } else {\n\t var langSplit = locale.split('-')[0];\n\t if (supportedLocales[langSplit]) {\n\t currentLocale = langSplit;\n\t } else {\n\t currentLocale = BASE_LOCALE;\n\t }\n\t }\n\t var getMessage = function getMessage(messageId) {\n\t var message = supportedLocales[currentLocale][messageId];\n\t if (!message) {\n\t return localization_typeof(supportedLocales[BASE_LOCALE][messageId]) === 'object' ? supportedLocales[BASE_LOCALE][messageId].message : supportedLocales[BASE_LOCALE][messageId] || '';\n\t }\n\t return supportedLocales[currentLocale][messageId].message || supportedLocales[currentLocale][messageId];\n\t };\n\t var createElement = function createElement(tagName, attributes) {\n\t var el = src_protectedApi.createElement(tagName);\n\t if (!attributes) {\n\t return el;\n\t }\n\t var attrs = attributes.split(/([a-z]+='[^']+')/);\n\t for (var i = 0; i < attrs.length; i += 1) {\n\t var attr = attrs[i].trim();\n\t if (!attr) {\n\t continue;\n\t }\n\t var index = attr.indexOf('=');\n\t var attrName = void 0;\n\t var attrValue = void 0;\n\t if (index > 0) {\n\t attrName = attr.substring(0, index);\n\t attrValue = attr.substring(index + 2, attr.length - 1);\n\t }\n\t if (attrName && attrValue) {\n\t el.setAttribute(attrName, attrValue);\n\t }\n\t }\n\t return el;\n\t };\n\t var processString = function processString(str, element) {\n\t var el;\n\t var match1 = /^([^]*?)<(a|strong|span|i)([^>]*)>(.*?)<\\/\\2>([^]*)$/m.exec(str);\n\t var match2 = /^([^]*?)<(br|input)([^>]*)\\/?>([^]*)$/m.exec(str);\n\t if (match1) {\n\t processString(match1[1], element);\n\t el = createElement(match1[2], match1[3]);\n\t processString(match1[4], el);\n\t element.appendChild(el);\n\t processString(match1[5], element);\n\t } else if (match2) {\n\t processString(match2[1], element);\n\t el = createElement(match2[2], match2[3]);\n\t element.appendChild(el);\n\t processString(match2[4], element);\n\t } else {\n\t element.appendChild(document.createTextNode(str.replace(/ /g, \"\\xA0\")));\n\t }\n\t };\n\t var translateElement = function translateElement(element, message) {\n\t try {\n\t while (element.lastChild) {\n\t element.removeChild(element.lastChild);\n\t }\n\t processString(message, element);\n\t } catch (ex) {\n\t }\n\t };\n\t return {\n\t getMessage: getMessage,\n\t translateElement: translateElement\n\t };\n\t}\n\tvar localization = new Localization();\n\t const src_localization = (localization);\n\tfunction DetailedMenuController(iframe) {\n\t var contentDocument = null;\n\t var iframeCtrl = iframe;\n\t var domain = null;\n\t var FILTERING_STATE_LS_PROPERTY = '__adfstate';\n\t var CONFIDENCE_LEVEL = {\n\t ZERO: {\n\t from: 0,\n\t to: 5\n\t },\n\t ONE: {\n\t from: 6,\n\t to: 11\n\t },\n\t TWO: {\n\t from: 12,\n\t to: 22\n\t },\n\t THREE: {\n\t from: 23,\n\t to: 33\n\t },\n\t FOUR: {\n\t from: 34,\n\t to: 44\n\t },\n\t FIVE: {\n\t from: 45,\n\t to: Infinity\n\t }\n\t };\n\t var setDomain = function setDomain() {\n\t domain = decodeURIComponent(window.location.hostname);\n\t contentDocument.getElementsByClassName('menu-head_name')[0].textContent = domain || 'unknown';\n\t };\n\t var truncateDecimals = function truncateDecimals(number) {\n\t return Math[number < 0 ? 'ceil' : 'floor'](number);\n\t };\n\t var getWotReputationSettings = function getWotReputationSettings(wotData) {\n\t if (!wotData) {\n\t return null;\n\t }\n\t var prefix = 'adg-wot-';\n\t var averageWot = wotData.reputation;\n\t var wotRatingText = null;\n\t var wotRating = null;\n\t if (averageWot === 0) {\n\t wotRatingText = src_localization.getMessage('wot_unknown_description');\n\t wotRating = \"\".concat(prefix, \"unknown\");\n\t return {\n\t text: wotRatingText,\n\t \"class\": wotRating\n\t };\n\t }\n\t var wotSettings = {\n\t 0: {\n\t color: 'red',\n\t string: src_localization.getMessage('wot_bad_description')\n\t },\n\t 1: {\n\t color: 'lightRed',\n\t string: src_localization.getMessage('wot_poor_description')\n\t },\n\t 2: {\n\t color: 'yellow',\n\t string: src_localization.getMessage('wot_unsatisfactory_description')\n\t },\n\t 3: {\n\t color: 'lightGreen',\n\t string: src_localization.getMessage('wot_good_description')\n\t },\n\t 4: {\n\t color: 'green',\n\t string: src_localization.getMessage('wot_excellent_description')\n\t },\n\t 5: {\n\t color: 'green',\n\t string: src_localization.getMessage('wot_excellent_description')\n\t }\n\t };\n\t var current = wotSettings[truncateDecimals(averageWot / 20)];\n\t wotRatingText = current.string;\n\t wotRating = prefix + current.color;\n\t return {\n\t text: wotRatingText,\n\t \"class\": wotRating\n\t };\n\t };\n\t var getWotConfidenceClass = function getWotConfidenceClass(wotData) {\n\t if (!wotData) {\n\t return null;\n\t }\n\t var prefix = 'adg-wot-confidence-';\n\t var isThisLevel = function isThisLevel(num, level) {\n\t return num >= level.from && num <= level.to;\n\t };\n\t var confidenceWot = wotData.confidence;\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.ZERO)) {\n\t return \"\".concat(prefix, \"0\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.ONE)) {\n\t return \"\".concat(prefix, \"1\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.TWO)) {\n\t return \"\".concat(prefix, \"2\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.THREE)) {\n\t return \"\".concat(prefix, \"3\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.FOUR)) {\n\t return \"\".concat(prefix, \"4\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.FIVE)) {\n\t return \"\".concat(prefix, \"5\");\n\t }\n\t return undefined;\n\t };\n\t var setWotData = function setWotData() {\n\t var wotData = src_wot.getWotData();\n\t var wotReputationSettings = getWotReputationSettings(wotData);\n\t if (!wotReputationSettings) {\n\t return;\n\t }\n\t var wotIndication = contentDocument.querySelector('#WotIndication');\n\t addClass(wotIndication, wotReputationSettings[\"class\"]);\n\t wotIndication.dataset.title = src_localization.getMessage('menu_wot_reputation_indicator');\n\t var wotDescriptionText = contentDocument.querySelector('#WotDescriptionText');\n\t var wotLogo = '';\n\t wotDescriptionText.innerHTML = wotReputationSettings.text.replace('$1', wotLogo);\n\t var confidenceIndication = contentDocument.querySelector('#ConfidenceIndication');\n\t var wotConfidenceClass = getWotConfidenceClass(wotData);\n\t addClass(confidenceIndication, wotConfidenceClass);\n\t wotIndication.dataset.title = src_localization.getMessage('menu_wot_reputation_confidence_level');\n\t var wotLinkElem = contentDocument.querySelector('.wot-indicator');\n\t wotLinkElem.href = src_wot.getWotScorecardUrl(domain);\n\t removeClass(contentDocument.querySelectorAll('.wot-hide'), 'wot-hide');\n\t };\n\t var startAdSelector = function startAdSelector() {\n\t iframeCtrl.showSelectorMenu();\n\t };\n\t var goToWotUrl = function goToWotUrl() {\n\t window.open(src_wot.WOT_URL, '_blank');\n\t };\n\t var doNotBlock = function doNotBlock() {\n\t gm.ADG_temporaryDontBlock(30, function () {\n\t reloadPageBypassCache();\n\t });\n\t };\n\t var reportAbuse = function reportAbuse() {\n\t gm.ADG_sendAbuse(function () {\n\t iframeCtrl.removeIframe();\n\t });\n\t };\n\t var goToSiteReport = function goToSiteReport() {\n\t var url = src_settings.Constants.REPORT_URL.replace('{0}', domain);\n\t window.open(url, '_blank');\n\t };\n\t var showHideBlockAdButton = function showHideBlockAdButton(isFilter) {\n\t var blockAd = contentDocument.querySelector('#block-ad');\n\t if (isFilter) {\n\t removeClass(blockAd, 'hidden');\n\t } else {\n\t addClass(blockAd, 'hidden');\n\t }\n\t iframeCtrl.resizeIframe();\n\t };\n\t var setFilteringStateToStore = function setFilteringStateToStore(state) {\n\t try {\n\t localStorage.setItem(FILTERING_STATE_LS_PROPERTY, src_protectedApi.json.stringify({\n\t state: state\n\t }));\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return null;\n\t }\n\t };\n\t var onIsFilterChange = function onIsFilterChange() {\n\t var isFilter = contentDocument.getElementById('is-filter').checked;\n\t addClass(contentDocument.querySelectorAll('.menu-filter_label'), 'animate');\n\t showHideBlockAdButton(isFilter);\n\t setFilteringStateToStore(isFilter);\n\t gm.ADG_changeFilteringState(isFilter, function () {\n\t reloadPageBypassCache();\n\t });\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': iframeCtrl.removeIframe,\n\t '#block-ad': startAdSelector,\n\t '#assistant-settings': iframeCtrl.showSettingsMenu,\n\t '#WotLogo': goToWotUrl,\n\t '#do-not-block-30-sec': doNotBlock,\n\t '#report-abuse': reportAbuse,\n\t '#site-report': goToSiteReport,\n\t '#is-filter': onIsFilterChange\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var getFilteringStateFromStore = function getFilteringStateFromStore() {\n\t try {\n\t var state = localStorage.getItem(FILTERING_STATE_LS_PROPERTY);\n\t if (state) {\n\t return src_protectedApi.json.parse(state).state;\n\t }\n\t return false;\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return false;\n\t }\n\t };\n\t var setInitFilteringState = function setInitFilteringState() {\n\t var input = contentDocument.getElementById('is-filter');\n\t input.checked = getFilteringStateFromStore();\n\t gm.ADG_isFiltered(function (isFiltered) {\n\t input.checked = isFiltered;\n\t setFilteringStateToStore(isFiltered);\n\t showHideBlockAdButton(isFiltered);\n\t });\n\t };\n\t var init = function init(iframe) {\n\t contentDocument = iframe.contentDocument;\n\t setDomain();\n\t setWotData();\n\t bindEvents();\n\t setInitFilteringState();\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction adguard_selector_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { adguard_selector_typeof = function _typeof(obj) { return typeof obj; }; } else { adguard_selector_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return adguard_selector_typeof(obj); }\n\tfunction AdguardSelector() {\n\t var api = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var PLACEHOLDER_PREFIX = 'adguard-placeholder';\n\t var placeholdedElements = null;\n\t var transparentPlaceholdedElement = null;\n\t var restrictedElements = null;\n\t var SELECTED_CLASS = 'adguard_sg_selected';\n\t var REJECTED_CLASS = 'adguard_sg_rejected';\n\t var IGNORED_CLASS = 'adguard_sg_ignore';\n\t var unbound = true;\n\t var onElementSelectedHandler = null;\n\t var ignoreTouchEvent = 0;\n\t var selectionRenderer;\n\t var removeClassName = function removeClassName(className) {\n\t var elem = document.querySelectorAll(\".\".concat(className));\n\t removeClass(elem, className);\n\t };\n\t var firstSelectedOrSuggestedParent = function firstSelectedOrSuggestedParent(element) {\n\t if (hasClass(element, SELECTED_CLASS)) {\n\t return element;\n\t }\n\t while (element.parentNode && (element = element.parentNode)) {\n\t if (restrictedElements.indexOf(element) === -1) {\n\t if (hasClass(element, SELECTED_CLASS)) {\n\t return element;\n\t }\n\t }\n\t }\n\t return null;\n\t };\n\t var px = function px(p) {\n\t return \"\".concat(p, \"px\");\n\t };\n\t var getTagPath = function getTagPath(element) {\n\t if (element.parentNode) {\n\t return \"\".concat(element.parentNode.tagName.toLowerCase(), \" \").concat(element.tagName.toLowerCase());\n\t }\n\t return element.tagName.toLowerCase();\n\t };\n\t var sgMouseoverHandler = function sgMouseoverHandler(e) {\n\t e.stopPropagation();\n\t if (unbound) {\n\t return true;\n\t }\n\t if (this === document.documentElement || this === document.documentElement.parentNode) {\n\t return false;\n\t }\n\t var parent = firstSelectedOrSuggestedParent(this);\n\t if (parent !== null && parent !== this) {\n\t selectionRenderer.add(parent);\n\t } else {\n\t selectionRenderer.add(this);\n\t }\n\t return false;\n\t };\n\t var sgMousedownHandler = function sgMousedownHandler(e) {\n\t if (e && e.isTrusted === false) {\n\t return false;\n\t }\n\t if (hasClass(e.target, IGNORED_CLASS)) {\n\t return false;\n\t }\n\t e.preventDefault();\n\t e.stopImmediatePropagation();\n\t if (unbound) {\n\t return true;\n\t }\n\t var elem = e.target;\n\t var borders = elem === selectionRenderer.borderTop || elem === selectionRenderer.borderLeft || elem === selectionRenderer.borderRight || elem === selectionRenderer.borderBottom;\n\t if (borders) {\n\t elem = elem.target_elem || elem;\n\t }\n\t if (elem === document.documentElement || elem === document.documentElement.parentNode) {\n\t return undefined;\n\t }\n\t selectionRenderer.remove();\n\t onElementSelectedHandler(elem);\n\t return false;\n\t };\n\t var touchElementSelectHandler = function touchElementSelectHandler(e) {\n\t e.preventDefault();\n\t e.stopImmediatePropagation();\n\t sgMouseoverHandler.call(this, e);\n\t sgMousedownHandler.call(this, e);\n\t };\n\t var removeElementToPreventEvents = function removeElementToPreventEvents() {\n\t if (!transparentPlaceholdedElement) {\n\t return false;\n\t }\n\t transparentPlaceholdedElement.removeEventListener('click', touchElementSelectHandler);\n\t transparentPlaceholdedElement.removeEventListener('touchstart', touchElementSelectHandler);\n\t transparentPlaceholdedElement.removeEventListener('pointerdown', touchElementSelectHandler);\n\t transparentPlaceholdedElement.parentNode.removeChild(transparentPlaceholdedElement);\n\t transparentPlaceholdedElement = null;\n\t return undefined;\n\t };\n\t var clearSelected = function clearSelected() {\n\t removeElementToPreventEvents();\n\t removeClassName(SELECTED_CLASS);\n\t removeClassName(REJECTED_CLASS);\n\t selectionRenderer.remove();\n\t };\n\t var getOffsetExtended = function getOffsetExtended(elem) {\n\t var bodyRect = document.documentElement.getBoundingClientRect();\n\t var elemRect = elem.getBoundingClientRect();\n\t var rectTop = elemRect.top - bodyRect.top;\n\t var rectLeft = elemRect.left - bodyRect.left;\n\t return {\n\t top: rectTop,\n\t left: rectLeft,\n\t outerWidth: elem.offsetWidth,\n\t outerHeight: elem.offsetHeight\n\t };\n\t };\n\t var BorderSelectionRenderer = function (api) {\n\t var BORDER_WIDTH = 5;\n\t var BORDER_PADDING = 2;\n\t var BORDER_CSS = {\n\t position: 'absolute',\n\t background: 'white',\n\t margin: '0px',\n\t padding: '0px',\n\t display: 'block',\n\t \"float\": 'none',\n\t border: '0',\n\t outline: '0',\n\t 'background-color': '#13a35e',\n\t 'font-style': 'normal',\n\t 'vertical-align': 'baseline',\n\t 'text-align': 'left',\n\t 'line-height': '12px',\n\t 'box-sizing': 'content-box',\n\t 'min-height': 'auto',\n\t 'max-height': 'auto',\n\t 'min-width': 'auto',\n\t 'max-width': 'auto',\n\t width: 0,\n\t height: 0,\n\t 'z-index': 2147483646,\n\t 'border-radius': 0\n\t };\n\t var BORDER_BOTTOM_CSS = {\n\t 'font-size': '10px',\n\t 'font-weight': 'bold',\n\t color: 'white',\n\t padding: '2px 0px 2px 5px',\n\t overflow: 'hidden'\n\t };\n\t var borderTop = null;\n\t var borderLeft = null;\n\t var borderRight = null;\n\t var borderBottom = null;\n\t var showBorders = function showBorders() {\n\t if (borderTop && borderBottom && borderLeft && borderRight) {\n\t show(borderTop);\n\t show(borderBottom);\n\t show(borderLeft);\n\t show(borderRight);\n\t }\n\t };\n\t var addBorderToDom = function addBorderToDom() {\n\t document.documentElement.appendChild(borderTop);\n\t document.documentElement.appendChild(borderBottom);\n\t document.documentElement.appendChild(borderLeft);\n\t document.documentElement.appendChild(borderRight);\n\t };\n\t var addBorderCSS = function addBorderCSS() {\n\t Object.keys(BORDER_CSS).forEach(function (item) {\n\t borderTop.style[item] = BORDER_CSS[item];\n\t borderBottom.style[item] = BORDER_CSS[item];\n\t borderLeft.style[item] = BORDER_CSS[item];\n\t borderRight.style[item] = BORDER_CSS[item];\n\t });\n\t Object.keys(BORDER_BOTTOM_CSS).forEach(function (item) {\n\t borderBottom.style[item] = BORDER_BOTTOM_CSS[item];\n\t });\n\t };\n\t var removeBorderFromDom = function removeBorderFromDom() {\n\t if (borderTop) {\n\t var parent = borderTop.parentNode;\n\t if (parent) {\n\t parent.removeChild(borderTop);\n\t parent.removeChild(borderBottom);\n\t parent.removeChild(borderLeft);\n\t parent.removeChild(borderRight);\n\t }\n\t }\n\t borderTop = null;\n\t borderBottom = null;\n\t borderRight = null;\n\t borderLeft = null;\n\t };\n\t api.init = function () {\n\t if (!borderTop) {\n\t var width = px(BORDER_WIDTH);\n\t var bottomHeight = px(BORDER_WIDTH + 6);\n\t borderTop = src_protectedApi.createElement('div');\n\t borderBottom = src_protectedApi.createElement('div');\n\t borderLeft = src_protectedApi.createElement('div');\n\t borderRight = src_protectedApi.createElement('div');\n\t borderTop.addEventListener('click', sgMousedownHandler);\n\t borderBottom.addEventListener('click', sgMousedownHandler);\n\t borderLeft.addEventListener('click', sgMousedownHandler);\n\t borderRight.addEventListener('click', sgMousedownHandler);\n\t addStyle(borderTop, 'height', width);\n\t addStyle(borderBottom, 'height', bottomHeight);\n\t addStyle(borderLeft, 'width', width);\n\t addStyle(borderRight, 'width', width);\n\t hide(borderTop);\n\t hide(borderBottom);\n\t hide(borderLeft);\n\t hide(borderRight);\n\t api.borderTop = borderTop;\n\t api.borderBottom = borderBottom;\n\t api.borderLeft = borderLeft;\n\t api.borderRight = borderRight;\n\t addBorderCSS();\n\t addBorderToDom();\n\t }\n\t };\n\t api.finalize = function () {\n\t removeBorderFromDom();\n\t };\n\t api.add = function (element) {\n\t api.remove();\n\t if (!element) {\n\t return;\n\t }\n\t var p = getOffsetExtended(element);\n\t var top = p.top;\n\t var left = p.left;\n\t var width = p.outerWidth;\n\t var height = p.outerHeight;\n\t addStyle(borderTop, 'width', px(width + BORDER_PADDING * 2 + BORDER_WIDTH * 2));\n\t addStyle(borderTop, 'height', px(5));\n\t addStyle(borderTop, 'top', px(top - BORDER_WIDTH - BORDER_PADDING));\n\t addStyle(borderTop, 'left', px(left - BORDER_PADDING - BORDER_WIDTH));\n\t addStyle(borderBottom, 'width', px(width + BORDER_PADDING * 2 + BORDER_WIDTH));\n\t addStyle(borderBottom, 'height', px(12));\n\t addStyle(borderBottom, 'top', px(top + height + BORDER_PADDING));\n\t addStyle(borderBottom, 'left', px(left - BORDER_PADDING - BORDER_WIDTH));\n\t addStyle(borderLeft, 'height', px(height + BORDER_PADDING * 2));\n\t addStyle(borderLeft, 'width', px(5));\n\t addStyle(borderLeft, 'top', px(top - BORDER_PADDING));\n\t addStyle(borderLeft, 'left', px(left - BORDER_PADDING - BORDER_WIDTH));\n\t addStyle(borderRight, 'height', px(height + BORDER_PADDING * 2));\n\t addStyle(borderRight, 'width', px(5));\n\t addStyle(borderRight, 'top', px(top - BORDER_PADDING));\n\t addStyle(borderRight, 'left', px(left + width + BORDER_PADDING));\n\t borderBottom.textContent = getTagPath(element);\n\t borderRight.target_elem = element;\n\t borderLeft.target_elem = element;\n\t borderTop.target_elem = element;\n\t borderBottom.target_elem = element;\n\t showBorders();\n\t };\n\t api.remove = function () {\n\t if (borderTop && borderBottom && borderLeft && borderRight) {\n\t hide(borderTop);\n\t hide(borderBottom);\n\t hide(borderLeft);\n\t hide(borderRight);\n\t }\n\t };\n\t return api;\n\t }(BorderSelectionRenderer || {});\n\t var linkHelper = src_protectedApi.createElement('a');\n\t var getHost = function getHost(url) {\n\t if (!url) {\n\t return '';\n\t }\n\t linkHelper.href = url;\n\t return linkHelper.hostname;\n\t };\n\t var makePlaceholderImage = function makePlaceholderImage(element) {\n\t var placeHolder = src_protectedApi.createElement('div');\n\t var style = window.getComputedStyle(element);\n\t placeHolder.style.height = style.height;\n\t placeHolder.style.width = style.width;\n\t placeHolder.style.position = style.position;\n\t placeHolder.style.top = style.top;\n\t placeHolder.style.bottom = style.bottom;\n\t placeHolder.style.left = style.left;\n\t placeHolder.style.right = style.right;\n\t placeHolder.className += \"\".concat(PLACEHOLDER_PREFIX, \" \").concat(IGNORED_CLASS);\n\t var icon = src_protectedApi.createElement('div');\n\t icon.className += \"\".concat(PLACEHOLDER_PREFIX, \"-icon \").concat(IGNORED_CLASS);\n\t var domain = src_protectedApi.createElement('div');\n\t domain.textContent = getHost(element.src);\n\t domain.className += \"\".concat(PLACEHOLDER_PREFIX, \"-domain \").concat(IGNORED_CLASS);\n\t icon.appendChild(domain);\n\t placeHolder.appendChild(icon);\n\t return placeHolder;\n\t };\n\t var removePlaceholders = function removePlaceholders() {\n\t removeElementToPreventEvents();\n\t if (!placeholdedElements) {\n\t return;\n\t }\n\t var elements = placeholdedElements;\n\t for (var i = 0; i < elements.length; i += 1) {\n\t var current = elements[i];\n\t var id = PLACEHOLDER_PREFIX + i;\n\t var placeHolder = document.querySelector(\"#\".concat(id));\n\t if (placeHolder) {\n\t var parent = placeHolder.parentNode;\n\t if (parent) {\n\t parent.replaceChild(current, placeHolder);\n\t }\n\t }\n\t }\n\t placeholdedElements = null;\n\t };\n\t var placeholderClick = function placeholderClick(element) {\n\t selectionRenderer.remove();\n\t removePlaceholders();\n\t onElementSelectedHandler(element);\n\t };\n\t var preventEvents = function preventEvents(element) {\n\t var placeHolder = src_protectedApi.createElement('div');\n\t var style = getOffsetExtended(element);\n\t placeHolder.style.height = px(style.outerHeight);\n\t placeHolder.style.width = px(style.outerWidth);\n\t placeHolder.style.top = px(style.top);\n\t placeHolder.style.left = px(style.left);\n\t placeHolder.style.background = 'transparent';\n\t placeHolder.style.position = 'absolute';\n\t placeHolder.style['pointer-events'] = 'all';\n\t placeHolder.style['box-sizing'] = 'content-box';\n\t placeHolder.style['z-index'] = '2147483646';\n\t placeHolder.className += IGNORED_CLASS;\n\t transparentPlaceholdedElement = placeHolder;\n\t placeHolder.addEventListener('click', touchElementSelectHandler);\n\t placeHolder.addEventListener('touchstart', touchElementSelectHandler);\n\t placeHolder.addEventListener('pointerdown', touchElementSelectHandler);\n\t document.documentElement.appendChild(placeHolder);\n\t };\n\t var gestureEndHandler = function gestureEndHandler() {\n\t ignoreTouchEvent = 2;\n\t return true;\n\t };\n\t var touchMoveHandler = function touchMoveHandler() {\n\t ignoreTouchEvent = 1;\n\t return true;\n\t };\n\t var needIgnoreTouchEvent = function needIgnoreTouchEvent() {\n\t if (ignoreTouchEvent > 0) {\n\t ignoreTouchEvent -= 1;\n\t return true;\n\t }\n\t return false;\n\t };\n\t var makeIFrameAndEmbeddedSelector = function makeIFrameAndEmbeddedSelector() {\n\t placeholdedElements = document.querySelectorAll(\"iframe:not(.\".concat(IGNORED_CLASS, \"),embed,object\"));\n\t toArray(placeholdedElements).filter(function (elem) {\n\t var isVisible = elem.style.display !== 'none';\n\t var isHaveSize = elem.offsetWidth !== 0 && elem.offsetHeight !== 0;\n\t return isVisible && isHaveSize;\n\t });\n\t var elements = placeholdedElements;\n\t var _loop = function _loop(i) {\n\t var current = elements[i];\n\t (function (current) {\n\t var placeHolder = makePlaceholderImage(current);\n\t var id = PLACEHOLDER_PREFIX + i;\n\t placeHolder.setAttribute('id', id);\n\t var parent = current.parentNode;\n\t if (parent) {\n\t parent.replaceChild(placeHolder, current);\n\t placeHolder.addEventListener('gestureend', gestureEndHandler);\n\t placeHolder.addEventListener('touchmove', touchMoveHandler);\n\t placeHolder.addEventListener('touchend', function (e) {\n\t e.preventDefault();\n\t if (needIgnoreTouchEvent()) {\n\t return true;\n\t }\n\t placeholderClick(current);\n\t });\n\t var elems = document.querySelectorAll(\"#\".concat(id));\n\t toArray(elems).forEach(function (elem) {\n\t elem.addEventListener('click', function (e) {\n\t e.preventDefault();\n\t placeholderClick(current);\n\t });\n\t });\n\t }\n\t })(current);\n\t };\n\t for (var i = 0; i < elements.length; i += 1) {\n\t _loop(i);\n\t }\n\t };\n\t var sgMouseoutHandler = function sgMouseoutHandler() {\n\t if (unbound) {\n\t return true;\n\t }\n\t if (this === document.documentElement || this === document.documentElement.parentNode) {\n\t return false;\n\t }\n\t selectionRenderer.remove();\n\t return false;\n\t };\n\t var elementTouchendHandler = function elementTouchendHandler(e) {\n\t if (hasClass(e.target, IGNORED_CLASS)) {\n\t return false;\n\t }\n\t e.stopPropagation();\n\t if (needIgnoreTouchEvent()) {\n\t return true;\n\t }\n\t touchElementSelectHandler.call(this, e);\n\t return false;\n\t };\n\t var emptyEventHandler = function emptyEventHandler(e) {\n\t e.stopPropagation();\n\t return false;\n\t };\n\t var setupEventHandlers = function setupEventHandlers() {\n\t makeIFrameAndEmbeddedSelector();\n\t var elements = document.querySelectorAll(\"body *:not(.\".concat(IGNORED_CLASS, \")\"));\n\t toArray(elements).forEach(function (el) {\n\t el.addEventListener('gestureend', gestureEndHandler);\n\t el.addEventListener('touchmove', touchMoveHandler);\n\t el.addEventListener('touchend', elementTouchendHandler, true);\n\t el.addEventListener('touchstart', emptyEventHandler);\n\t el.addEventListener('mouseover', sgMouseoverHandler);\n\t el.addEventListener('mouseout', sgMouseoutHandler);\n\t el.addEventListener('click', sgMousedownHandler, true);\n\t });\n\t };\n\t var deleteEventHandlers = function deleteEventHandlers() {\n\t removePlaceholders();\n\t var elements = document.querySelectorAll('body *');\n\t toArray(elements).forEach(function (el) {\n\t el.removeEventListener('gestureend', gestureEndHandler);\n\t el.removeEventListener('touchmove', touchMoveHandler);\n\t el.removeEventListener('touchend', elementTouchendHandler, true);\n\t el.removeEventListener('touchstart', emptyEventHandler);\n\t el.removeEventListener('mouseover', sgMouseoverHandler);\n\t el.removeEventListener('mouseout', sgMouseoutHandler);\n\t el.removeEventListener('click', sgMousedownHandler, true);\n\t });\n\t };\n\t selectionRenderer = BorderSelectionRenderer;\n\t api.init = function (onElementSelected, selectionRenderImpl) {\n\t onElementSelectedHandler = onElementSelected;\n\t if (selectionRenderImpl && adguard_selector_typeof(selectionRenderImpl) === 'object') {\n\t selectionRenderer = selectionRenderImpl;\n\t }\n\t restrictedElements = ['html', 'body', 'head', 'base'].map(function (selector) {\n\t return document.querySelector(selector);\n\t });\n\t selectionRenderer.init();\n\t setupEventHandlers();\n\t unbound = false;\n\t };\n\t api.reset = function () {\n\t clearSelected();\n\t };\n\t api.close = function () {\n\t unbound = true;\n\t selectionRenderer.finalize();\n\t deleteEventHandlers();\n\t };\n\t api.selectElement = function (element) {\n\t selectionRenderer.add(element);\n\t removePlaceholders();\n\t unbound = true;\n\t preventEvents(element);\n\t };\n\t api.ignoreClassName = function () {\n\t return IGNORED_CLASS;\n\t };\n\t return api;\n\t}\n\tvar adguard_selector_selector = new AdguardSelector();\n\t const adguard_selector = (adguard_selector_selector);\n\tfunction SelectorMenuController(iframe) {\n\t var contentDocument = null;\n\t var iframeCtrl = iframe;\n\t var close = function close() {\n\t iframeCtrl.removeIframe();\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '.btn-default': close\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var onElementSelected = function onElementSelected(element) {\n\t iframeCtrl.showSliderMenu(element);\n\t };\n\t var startSelector = function startSelector() {\n\t adguard_selector.reset();\n\t adguard_selector.init(onElementSelected);\n\t };\n\t var init = function init(iframe) {\n\t contentDocument = iframe.contentDocument;\n\t bindEvents();\n\t startSelector();\n\t };\n\t iframeCtrl.onCloseMenu.attach(adguard_selector.close);\n\t return {\n\t init: init,\n\t startSelector: startSelector\n\t };\n\t}\n\tvar BASIC_GREEN_COLOR = '#36BA53';\n\tvar DARK_GREEN_COLOR = '#4D995F';\n\tvar TICK_RIGHT_COLOR = '#E0DFDB';\n\tfunction SliderWidget() {\n\t var api = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var PLACEHOLDER_CLASS = 'adg-slide ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all';\n\t var HANDLE_CLASS = 'ui-slider-handle';\n\t var HANDLE_FULL_CLASS = 'ui-slider-handle ui-state-default ui-corner-all';\n\t var TICK_CLASS = 'tick';\n\t var TICK_FULL_CLASS = 'tick ui-widget-content';\n\t var tickLeftColor = BASIC_GREEN_COLOR;\n\t var placeholder = null;\n\t var min = 0;\n\t var max = 1;\n\t var value = 0;\n\t var sliderArea = null;\n\t var onValueChanged = null;\n\t if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n\t tickLeftColor = DARK_GREEN_COLOR;\n\t }\n\t var refresh = function refresh() {\n\t var handle = placeholder.querySelectorAll(\".\".concat(HANDLE_CLASS));\n\t addStyle(handle, 'left', \"\".concat((value - 1) * 100 / (max - min), \"%\"));\n\t var ticks = placeholder.querySelectorAll(\".\".concat(TICK_CLASS));\n\t for (var i = 0; i < ticks.length; i += 1) {\n\t if (i + 1 < value) {\n\t addStyle(ticks[i], 'background-color', tickLeftColor);\n\t } else {\n\t addStyle(ticks[i], 'background-color', TICK_RIGHT_COLOR);\n\t }\n\t }\n\t };\n\t var render = function render() {\n\t addClass(placeholder, PLACEHOLDER_CLASS);\n\t var handle = src_protectedApi.createElement('span');\n\t handle.setAttribute('class', HANDLE_FULL_CLASS);\n\t placeholder.appendChild(handle);\n\t var count = max - min;\n\t var prepare = function prepare(i) {\n\t var tick = src_protectedApi.createElement('div');\n\t tick.setAttribute('class', TICK_FULL_CLASS);\n\t tick.style.left = \"\".concat(100 / count * i, \"%\");\n\t tick.style.width = \"\".concat(100 / count, \"%\");\n\t placeholder.appendChild(tick);\n\t };\n\t for (var i = 0; i < count; i += 1) {\n\t prepare(i);\n\t }\n\t refresh();\n\t };\n\t var setValue = function setValue(v) {\n\t if (v < min) {\n\t value = min;\n\t } else if (v > max) {\n\t value = max;\n\t } else {\n\t value = v;\n\t }\n\t refresh();\n\t onValueChanged(value);\n\t };\n\t var bindEvents = function bindEvents() {\n\t var rect = placeholder.getBoundingClientRect();\n\t var sliderWidth = rect.width;\n\t var offsetLeft = rect.left + document.body.scrollLeft;\n\t var getSliderValue = function getSliderValue(pageX) {\n\t return Math.round((max - min) / sliderWidth * (pageX - offsetLeft) + min);\n\t };\n\t var onMouseMove = function onMouseMove(e) {\n\t var val = getSliderValue(e.pageX);\n\t setValue(val);\n\t };\n\t var onClick = function onClick(e) {\n\t var val = getSliderValue(e.pageX);\n\t setValue(val);\n\t };\n\t var onMouseDown = function onMouseDown(e) {\n\t e.stopPropagation();\n\t e.preventDefault();\n\t e.cancelBubble = true;\n\t e.returnValue = false;\n\t sliderArea.addEventListener('mousemove', onMouseMove);\n\t sliderArea.addEventListener('touchmove', onMouseMove);\n\t sliderArea.addEventListener('pointermove', onMouseMove);\n\t };\n\t var sliderAreaRemoveListeners = function sliderAreaRemoveListeners() {\n\t sliderArea.removeEventListener('mousemove', onMouseMove);\n\t sliderArea.removeEventListener('touchmove', onMouseMove);\n\t sliderArea.removeEventListener('pointermove', onMouseMove);\n\t };\n\t document.addEventListener('mouseup', sliderAreaRemoveListeners);\n\t document.addEventListener('touchend', sliderAreaRemoveListeners);\n\t document.addEventListener('pointerup', sliderAreaRemoveListeners);\n\t placeholder.addEventListener('click', onClick);\n\t placeholder.addEventListener('mousedown', onMouseDown);\n\t placeholder.addEventListener('touchstart', onMouseDown);\n\t sliderArea.addEventListener('mouseup', sliderAreaRemoveListeners);\n\t sliderArea.addEventListener('touchend', sliderAreaRemoveListeners);\n\t sliderArea.addEventListener('pointerup', sliderAreaRemoveListeners);\n\t sliderArea.addEventListener('mouseleave', sliderAreaRemoveListeners);\n\t };\n\t api.init = function (placeholderElement, options) {\n\t placeholder = placeholderElement;\n\t min = options.min;\n\t max = options.max;\n\t value = options.value;\n\t onValueChanged = options.onValueChanged;\n\t sliderArea = options.sliderArea;\n\t render();\n\t bindEvents();\n\t };\n\t return api;\n\t}\n\tvar sliderWidget = new SliderWidget();\n\t const slider_widget = (sliderWidget);\n\tfunction cssEscape(value) {\n\t if (arguments.length === 0) {\n\t throw new TypeError('`CSS.escape` requires an argument.');\n\t }\n\t var string = String(value);\n\t var length = string.length;\n\t var index = -1;\n\t var codeUnit;\n\t var result = '';\n\t var firstCodeUnit = string.charCodeAt(0);\n\t while (++index < length) {\n\t codeUnit = string.charCodeAt(index);\n\t if (codeUnit === 0x0000) {\n\t result += \"\\uFFFD\";\n\t continue;\n\t }\n\t if (\n\t codeUnit >= 0x0001 && codeUnit <= 0x001F || codeUnit == 0x007F\n\t || index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039\n\t || index === 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039\n\t && firstCodeUnit == 0x002D) {\n\t result += \"\\\\\".concat(codeUnit.toString(16), \" \");\n\t continue;\n\t }\n\t if (\n\t index === 0 && length === 1\n\t && codeUnit == 0x002D) {\n\t result += \"\\\\\".concat(string.charAt(index));\n\t continue;\n\t }\n\t if (codeUnit >= 0x0080\n\t || codeUnit == 0x002D\n\t || codeUnit == 0x005F || codeUnit >= 0x0030 && codeUnit <= 0x0039 || codeUnit >= 0x0041 && codeUnit <= 0x005A || codeUnit >= 0x0061 && codeUnit <= 0x007A) {\n\t result += string.charAt(index);\n\t continue;\n\t }\n\t result += \"\\\\\".concat(string.charAt(index));\n\t }\n\t return result;\n\t}\n\tfunction AdguardRulesConstructorLib() {\n\t var api = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var CSS_RULE_MARK = '##';\n\t var RULE_OPTIONS_MARK = '$';\n\t var URLBLOCK_ATTRIBUTES = ['src', 'data'];\n\t var linkHelper = src_protectedApi.createElement('a');\n\t var constructClassCssSelectorByAND = function constructClassCssSelectorByAND(classList) {\n\t var selectors = [];\n\t if (classList) {\n\t for (var i = 0; i < classList.length; i += 1) {\n\t selectors.push(\".\".concat(cssEscape(classList[i])));\n\t }\n\t }\n\t return selectors.join('');\n\t };\n\t var makeDefaultCssFilter = function makeDefaultCssFilter(element, classList, excludeTagName, excludeId) {\n\t var cssSelector = excludeTagName ? '' : element.tagName.toLowerCase();\n\t if (element.id && !excludeId) {\n\t cssSelector += \"#\".concat(cssEscape(element.id));\n\t }\n\t cssSelector += constructClassCssSelectorByAND(classList || element.classList);\n\t return cssSelector;\n\t };\n\t var makeCssNthChildFilter = function makeCssNthChildFilter(element, options) {\n\t options = options || {};\n\t var _options = options,\n\t classList = _options.classList,\n\t excludeTagName = _options.excludeTagName,\n\t excludeId = _options.excludeId;\n\t var excludeTagNameOverride = ('excludeTagName' in options);\n\t var excludeIdOverride = ('excludeId' in options);\n\t var path = [];\n\t var el = element;\n\t while (el.parentNode) {\n\t var nodeName = el && el.nodeName ? el.nodeName.toUpperCase() : '';\n\t if (nodeName === 'BODY') {\n\t break;\n\t }\n\t if (el.id) {\n\t var cssSelector = '';\n\t if (el === element) {\n\t cssSelector = makeDefaultCssFilter(el, classList || [], excludeTagNameOverride ? excludeTagName : true, excludeIdOverride ? excludeId : false);\n\t } else {\n\t cssSelector = makeDefaultCssFilter(el, [], true, false);\n\t }\n\t path.unshift(cssSelector);\n\t break;\n\t } else {\n\t var c = 1;\n\t for (var e = el; e.previousSibling; e = e.previousSibling) {\n\t if (e.previousSibling.nodeType === 1) {\n\t c += 1;\n\t }\n\t }\n\t var cldCount = 0;\n\t for (var i = 0; el.parentNode && i < el.parentNode.childNodes.length; i += 1) {\n\t cldCount += el.parentNode.childNodes[i].nodeType === 1 ? 1 : 0;\n\t }\n\t var ch = void 0;\n\t if (cldCount === 0 || cldCount === 1) {\n\t ch = '';\n\t } else if (c === 1) {\n\t ch = ':first-child';\n\t } else if (c === cldCount) {\n\t ch = ':last-child';\n\t } else {\n\t ch = \":nth-child(\".concat(c, \")\");\n\t }\n\t if (el === element) {\n\t var p = makeDefaultCssFilter(el, classList, excludeId, excludeTagNameOverride ? excludeTagName : false);\n\t p += ch;\n\t path.unshift(p);\n\t } else {\n\t path.unshift(makeDefaultCssFilter(el, el.classList, false, false) + ch);\n\t }\n\t el = el.parentNode;\n\t }\n\t }\n\t return path.join(' > ');\n\t };\n\t var constructClassCssSelectorByOR = function constructClassCssSelectorByOR(classList) {\n\t var selectors = [];\n\t if (classList) {\n\t for (var i = 0; i < classList.length; i += 1) {\n\t selectors.push(\".\".concat(cssEscape(classList[i])));\n\t }\n\t }\n\t return selectors.join(', ');\n\t };\n\t var makeSimilarCssFilter = function makeSimilarCssFilter(element, classList) {\n\t return constructClassCssSelectorByOR(classList || element.classList);\n\t };\n\t var constructCssRuleText = function constructCssRuleText(element, options) {\n\t if (!element) {\n\t return;\n\t }\n\t options = options || {};\n\t var cssSelectorType = options.cssSelectorType || 'STRICT_FULL';\n\t var selector;\n\t switch (cssSelectorType) {\n\t case 'STRICT_FULL':\n\t selector = makeCssNthChildFilter(element, options);\n\t break;\n\t case 'STRICT':\n\t selector = makeDefaultCssFilter(element, options.classList, options.excludeTagName, options.excludeId);\n\t break;\n\t case 'SIMILAR':\n\t selector = makeSimilarCssFilter(element, options.classList);\n\t break;\n\t }\n\t return selector ? CSS_RULE_MARK + selector : '';\n\t };\n\t var constructUrlBlockRuleText = function constructUrlBlockRuleText(element, urlBlockAttribute, oneDomain, domain) {\n\t if (!urlBlockAttribute) {\n\t return null;\n\t }\n\t var blockUrlRuleText = urlBlockAttribute.replace(/^http:\\/\\/(www\\.)?/, '||');\n\t if (blockUrlRuleText.indexOf('.') === 0) {\n\t blockUrlRuleText = blockUrlRuleText.substring(1);\n\t }\n\t if (!oneDomain) {\n\t blockUrlRuleText = \"\".concat(blockUrlRuleText).concat(RULE_OPTIONS_MARK, \"domain=\").concat(domain);\n\t }\n\t return blockUrlRuleText;\n\t };\n\t var isValidUrl = function isValidUrl(value) {\n\t if (value) {\n\t linkHelper.href = value;\n\t if (linkHelper.hostname) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t };\n\t var getUrlBlockAttribute = function getUrlBlockAttribute(element) {\n\t if (!element || !element.getAttribute) {\n\t return null;\n\t }\n\t for (var i = 0; i < URLBLOCK_ATTRIBUTES.length; i += 1) {\n\t var attr = URLBLOCK_ATTRIBUTES[i];\n\t var value = element.getAttribute(attr);\n\t if (isValidUrl(value)) {\n\t return value;\n\t }\n\t }\n\t return null;\n\t };\n\t var haveUrlBlockParameter = function haveUrlBlockParameter(element) {\n\t var value = getUrlBlockAttribute(element);\n\t return value && value !== '';\n\t };\n\t var haveClassAttribute = function haveClassAttribute(element) {\n\t return element.classList && element.classList.length > 0;\n\t };\n\t var haveIdAttribute = function haveIdAttribute(element) {\n\t return element.id && element.id.trim() !== '';\n\t };\n\t var getUrl = function getUrl(url) {\n\t var pattern = '^(([^:/\\\\?#]+):)?(//(([^:/\\\\?#]*)(?::([^/\\\\?#]*))?))?([^\\\\?#]*)(\\\\?([^#]*))?(#(.*))?$';\n\t var rx = new RegExp(pattern);\n\t var parts = rx.exec(url);\n\t return {\n\t host: parts[4] || '',\n\t path: parts[7] || ''\n\t };\n\t };\n\t var cropDomain = function cropDomain(url) {\n\t var domain = getUrl(url).host;\n\t return domain.replace('www.', '').replace(/:\\d+/, '');\n\t };\n\t api.makeCssNthChildFilter = makeCssNthChildFilter;\n\t api.getElementInfo = function (element) {\n\t var attributes = [];\n\t var elementAttributes = element.attributes;\n\t if (elementAttributes) {\n\t for (var i = 0; i < elementAttributes.length; i += 1) {\n\t var attr = elementAttributes[i];\n\t attributes.push({\n\t name: attr.name,\n\t value: attr.value\n\t });\n\t }\n\t }\n\t return {\n\t tagName: element.tagName,\n\t attributes: attributes,\n\t urlBlockAttributeValue: getUrlBlockAttribute(element),\n\t haveUrlBlockParameter: haveUrlBlockParameter(element),\n\t haveClassAttribute: haveClassAttribute(element),\n\t haveIdAttribute: haveIdAttribute(element)\n\t };\n\t };\n\t api.constructRuleCssSelector = function (ruleText) {\n\t if (!ruleText) {\n\t return null;\n\t }\n\t var index = ruleText.indexOf(CSS_RULE_MARK);\n\t var optionsIndex = ruleText.indexOf(RULE_OPTIONS_MARK);\n\t if (index >= 0) {\n\t return ruleText.substring(index + CSS_RULE_MARK.length, optionsIndex >= 0 ? optionsIndex : ruleText.length);\n\t }\n\t var s = ruleText.substring(0, optionsIndex);\n\t s = s.replace(/[|]|[\\^]/g, '');\n\t if (isValidUrl(s)) {\n\t return \"[src*=\\\"\".concat(s, \"\\\"]\");\n\t }\n\t return null;\n\t };\n\t api.constructRuleText = function (element, options) {\n\t var croppedDomain = cropDomain(options.url);\n\t var ruleType = options.ruleType;\n\t if (ruleType === 'URL') {\n\t var blockUrlRuleText = constructUrlBlockRuleText(element, options.urlMask, options.isBlockOneDomain, croppedDomain);\n\t if (blockUrlRuleText) {\n\t return blockUrlRuleText;\n\t }\n\t }\n\t var result;\n\t if (ruleType === 'CSS') {\n\t result = constructCssRuleText(element, options);\n\t if (options.attributes) {\n\t result = (result || CSS_RULE_MARK + result) + options.attributes;\n\t }\n\t }\n\t if (!options.isBlockOneDomain) {\n\t result = croppedDomain + result;\n\t }\n\t return result;\n\t };\n\t return api;\n\t}\n\tvar adguardRulesConstructor = new AdguardRulesConstructorLib();\n\t const adguard_rules_constructor = (adguardRulesConstructor);\n\tfunction SliderMenuController(addRule, iframe) {\n\t var contentDocument = null;\n\t var selectedElement = null;\n\t var startElement = null;\n\t var currentElement = null;\n\t var iframeCtrl = iframe;\n\t var getFilterRuleInputText = function getFilterRuleInputText() {\n\t return contentDocument.getElementById('filter-rule').value;\n\t };\n\t var close = function close() {\n\t iframeCtrl.removeIframe();\n\t };\n\t var expandAdvanced = function expandAdvanced() {\n\t var advancedSettings = contentDocument.querySelector('#advanced-settings');\n\t var extendedSettingsText = contentDocument.querySelector('#ExtendedSettingsText');\n\t var hidden = !hasClass(advancedSettings, 'open');\n\t if (hidden) {\n\t addClass(advancedSettings, 'open');\n\t addClass(extendedSettingsText, 'active');\n\t iframeCtrl.resizeSliderMenuToAdvanced();\n\t } else {\n\t removeClass(advancedSettings, 'open');\n\t removeClass(extendedSettingsText, 'active');\n\t iframeCtrl.resizeSliderMenuToNormal();\n\t }\n\t };\n\t var showPreview = function showPreview() {\n\t var options = {\n\t isBlockByUrl: contentDocument.getElementById('block-by-url-checkbox').checked,\n\t isBlockSimilar: contentDocument.getElementById('block-similar-checkbox').checked,\n\t isBlockOneDomain: contentDocument.getElementById('one-domain-checkbox').checked\n\t };\n\t iframeCtrl.showBlockPreview(selectedElement, getFilterRuleInputText(), startElement, options);\n\t };\n\t var blockElement = function blockElement() {\n\t var path = getFilterRuleInputText();\n\t iframeCtrl.blockElement(path, addRule);\n\t };\n\t var handleShowBlockSettings = function handleShowBlockSettings(showBlockByUrl, showBlockSimilar) {\n\t var blockByUrlBlock = contentDocument.querySelector('#block-by-url-checkbox-block');\n\t var blockSimilarBlock = contentDocument.querySelector('#block-similar-checkbox-block');\n\t if (showBlockByUrl) {\n\t show(blockByUrlBlock);\n\t } else {\n\t contentDocument.getElementById('block-by-url-checkbox').checked = false;\n\t hide(blockByUrlBlock);\n\t }\n\t if (showBlockSimilar) {\n\t show(blockSimilarBlock);\n\t } else {\n\t contentDocument.getElementById('block-similar-checkbox').checked = false;\n\t hide(blockSimilarBlock);\n\t }\n\t };\n\t var getUrlBlockAttribute = function getUrlBlockAttribute(element) {\n\t var urlBlockAttributes = ['src', 'data'];\n\t for (var i = 0; i < urlBlockAttributes.length; i += 1) {\n\t var attr = urlBlockAttributes[i];\n\t var value = element.getAttribute(attr);\n\t if (value) {\n\t return value;\n\t }\n\t }\n\t return null;\n\t };\n\t var haveUrlBlockParameter = function haveUrlBlockParameter(element) {\n\t var value = getUrlBlockAttribute(element);\n\t return value && value !== '';\n\t };\n\t var haveClassAttribute = function haveClassAttribute(element) {\n\t var className = element.className;\n\t return className && typeof className === 'string' && className.trim() !== '';\n\t };\n\t var setFilterRuleInputText = function setFilterRuleInputText(ruleText) {\n\t contentDocument.getElementById('filter-rule').value = ruleText;\n\t };\n\t var onScopeChange = function onScopeChange() {\n\t var isBlockByUrl = contentDocument.getElementById('block-by-url-checkbox').checked;\n\t var isBlockSimilar = contentDocument.getElementById('block-similar-checkbox').checked;\n\t var isBlockOneDomain = contentDocument.getElementById('one-domain-checkbox').checked;\n\t handleShowBlockSettings(haveUrlBlockParameter(selectedElement) && !isBlockSimilar, haveClassAttribute(selectedElement) && !isBlockByUrl);\n\t var options = {\n\t urlMask: getUrlBlockAttribute(selectedElement),\n\t cssSelectorType: isBlockSimilar ? 'SIMILAR' : 'STRICT_FULL',\n\t isBlockOneDomain: isBlockOneDomain,\n\t url: document.location,\n\t ruleType: isBlockByUrl ? 'URL' : 'CSS'\n\t };\n\t var ruleText = adguard_rules_constructor.constructRuleText(selectedElement, options);\n\t setFilterRuleInputText(ruleText);\n\t iframeCtrl.resizeIframe();\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '#ExtendedSettingsText': expandAdvanced,\n\t '#adg-cancel': iframeCtrl.showSelectorMenu,\n\t '#adg-preview': showPreview,\n\t '#adg-accept': blockElement,\n\t '#block-by-url-checkbox-block': onScopeChange,\n\t '#one-domain-checkbox-block': onScopeChange,\n\t '#block-similar-checkbox-block': onScopeChange\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var makeDefaultCheckboxesForDetailedMenu = function makeDefaultCheckboxesForDetailedMenu(options) {\n\t contentDocument.getElementById('block-by-url-checkbox').checked = options && options.isBlockByUrl;\n\t contentDocument.getElementById('block-similar-checkbox').checked = options && options.isBlockSimilar;\n\t contentDocument.getElementById('one-domain-checkbox').checked = options && options.isBlockOneDomain;\n\t if (options && (options.isBlockByUrl || options.isBlockSimilar)) {\n\t handleShowBlockSettings(options.isBlockByUrl, options.isBlockSimilar);\n\t }\n\t };\n\t var onSliderMove = function onSliderMove(element) {\n\t selectedElement = element;\n\t adguard_selector.selectElement(element);\n\t makeDefaultCheckboxesForDetailedMenu();\n\t onScopeChange();\n\t handleShowBlockSettings(haveUrlBlockParameter(element), haveClassAttribute(element));\n\t };\n\t var createSlider = function createSlider(setElement) {\n\t var parents = getParentsLevel(selectedElement);\n\t var children = getAllChildren(selectedElement);\n\t var value = Math.abs(parents.length + 1);\n\t var max = parents.length + children.length + 1;\n\t var min = 1;\n\t var options = {\n\t value: value,\n\t min: min,\n\t max: max\n\t };\n\t var slider = contentDocument.querySelector('#slider');\n\t var sliderArea = contentDocument.querySelector('#slider-area');\n\t if (min === max) {\n\t hide(slider);\n\t hide(contentDocument.querySelectorAll('.element-rule_text'));\n\t expandAdvanced();\n\t }\n\t options.onSliderMove = function (delta) {\n\t var elem;\n\t if (delta > 0) {\n\t elem = parents[delta - 1];\n\t }\n\t if (delta === 0) {\n\t elem = startElement;\n\t }\n\t if (delta < 0) {\n\t elem = children[Math.abs(delta + 1)];\n\t }\n\t onSliderMove(elem);\n\t };\n\t var currentVal = options.value;\n\t if (setElement) {\n\t var setElementparents = getParentsLevel(setElement);\n\t currentVal = setElementparents.length + 1;\n\t }\n\t slider_widget.init(slider, {\n\t min: options.min,\n\t max: options.max,\n\t value: currentVal,\n\t onValueChanged: function onValueChanged(value) {\n\t var delta = options.value - value;\n\t options.onSliderMove(delta);\n\t },\n\t sliderArea: sliderArea\n\t });\n\t };\n\t var init = function init(iframe, options) {\n\t selectedElement = options.element;\n\t startElement = selectedElement;\n\t contentDocument = iframe.contentDocument;\n\t currentElement = options.currentElement;\n\t bindEvents();\n\t createSlider(currentElement);\n\t onScopeChange();\n\t adguard_selector.selectElement(selectedElement);\n\t if (currentElement) {\n\t onSliderMove(currentElement);\n\t }\n\t events.add(contentDocument.getElementById('filter-rule'), 'contextmenu', function (e) {\n\t e.stopPropagation();\n\t });\n\t if (options.path) {\n\t setFilterRuleInputText(options.path);\n\t expandAdvanced();\n\t }\n\t if (options.options) {\n\t makeDefaultCheckboxesForDetailedMenu(options.options);\n\t }\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction BlockPreviewController(addRule, iframe) {\n\t var contentDocument = null;\n\t var currentElement = null;\n\t var selectedElement = null;\n\t var selectedPath = null;\n\t var optionsState = null;\n\t var iframeCtrl = iframe;\n\t var previewStyleID = 'ag-preview-style-id';\n\t var showElement = function showElement() {\n\t iframeCtrl.showHiddenElements(previewStyleID);\n\t };\n\t var close = function close() {\n\t showElement();\n\t iframeCtrl.removeIframe();\n\t };\n\t var selectAnotherElement = function selectAnotherElement() {\n\t showElement();\n\t iframeCtrl.showSelectorMenu();\n\t };\n\t var blockElement = function blockElement(e) {\n\t e.stopPropagation();\n\t iframeCtrl.blockElement(selectedPath, addRule);\n\t };\n\t var showDetailedMenu = function showDetailedMenu() {\n\t showElement();\n\t iframeCtrl.showSliderMenu(currentElement, selectedElement, selectedPath, optionsState);\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '#select-another-element': selectAnotherElement,\n\t '#end-preview': showDetailedMenu,\n\t '#block-element': blockElement\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var hideElement = function hideElement() {\n\t if (!selectedPath) {\n\t src_log.error('Can`t block element: `selector` path is empty');\n\t return;\n\t }\n\t iframeCtrl.hideElementsByPath(selectedPath, previewStyleID);\n\t };\n\t var init = function init(iframe, options) {\n\t selectedElement = options.element;\n\t selectedPath = options.path;\n\t currentElement = options.currentElement;\n\t contentDocument = iframe.contentDocument;\n\t optionsState = options.options;\n\t adguard_selector.reset();\n\t bindEvents();\n\t hideElement();\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction UIValidationUtils() {\n\t var _window = window,\n\t document = _window.document;\n\t var getViewPort = function getViewPort() {\n\t var width = window.innerWidth;\n\t var height = window.innerHeight;\n\t return {\n\t width: width,\n\t height: height\n\t };\n\t };\n\t var checkVisibleAreaSize = function checkVisibleAreaSize() {\n\t var viewPort = getViewPort();\n\t var visibleAreaSize = viewPort.height > src_settings.Constants.MINIMUM_VISIBLE_HEIGHT_TO_SHOW_BUTTON;\n\t if (!visibleAreaSize) {\n\t src_log.error(\"Viewport height is too small: \".concat(viewPort.height));\n\t }\n\t return visibleAreaSize;\n\t };\n\t var validateBrowser = function validateBrowser() {\n\t var valid = !document.documentMode || document.documentMode > src_settings.Constants.MINIMUM_IE_SUPPORTED_VERSION;\n\t if (!valid) {\n\t src_log.error(\"IE version is \".concat(document.documentMode));\n\t }\n\t return valid;\n\t };\n\t var validatePage = function validatePage() {\n\t if (window.window !== window.top) {\n\t return false;\n\t }\n\t return true;\n\t };\n\t return {\n\t checkVisibleAreaSize: checkVisibleAreaSize,\n\t validateBrowser: validateBrowser,\n\t validatePage: validatePage,\n\t getViewPort: getViewPort\n\t };\n\t}\n\tvar uiValidationUtils = new UIValidationUtils();\n\t const ui_validation_utils = (uiValidationUtils);\n\tfunction UIUtils() {\n\t var elWidth;\n\t var elHeight;\n\t var windowWidth;\n\t var windowHeight;\n\t var storedAnchor = {};\n\t var getOriginalEvent = function getOriginalEvent(e) {\n\t return e.targetTouches ? e.targetTouches[0] : e;\n\t };\n\t var outsidePosition = {\n\t top: function top(pos) {\n\t return storedAnchor.top && (pos.y + elHeight > windowHeight || pos.y < 0);\n\t },\n\t bottom: function bottom(pos) {\n\t return !storedAnchor.top && (Math.abs(pos.y) + elHeight > windowHeight || pos.y > 0);\n\t },\n\t left: function left(pos) {\n\t return storedAnchor.left && (pos.x + elWidth > windowWidth || pos.x < 0);\n\t },\n\t right: function right(pos) {\n\t return !storedAnchor.left && (Math.abs(pos.x) + elWidth > windowWidth || pos.x > 0);\n\t }\n\t };\n\t var moveElementTo = function moveElementTo(el, x, y) {\n\t var transform = \"translate3d(\".concat(x, \"px,\").concat(y, \"px, 0px)\");\n\t el.style.webkitTransform = transform;\n\t el.style.mozTransform = transform;\n\t el.style.msTransform = transform;\n\t el.style.oTransform = transform;\n\t el.style.transform = transform;\n\t };\n\t var getWindowSize = function getWindowSize() {\n\t return {\n\t width: Math.min(document.documentElement.clientWidth, window.innerWidth || window.screen.width),\n\t height: Math.min(document.documentElement.clientHeight, window.innerHeight || window.screen.height)\n\t };\n\t };\n\t var setAnchorPosition = {\n\t positionY: function positionY(element, anchor) {\n\t storedAnchor.top = anchor;\n\t if (storedAnchor.top) {\n\t addClass(element, 'adguard-assistant-button-top');\n\t removeClass(element, 'adguard-assistant-button-bottom');\n\t } else {\n\t addClass(element, 'adguard-assistant-button-bottom');\n\t removeClass(element, 'adguard-assistant-button-top');\n\t }\n\t },\n\t positionX: function positionX(element, anchor) {\n\t storedAnchor.left = anchor;\n\t if (storedAnchor.left) {\n\t addClass(element, 'adguard-assistant-button-left');\n\t removeClass(element, 'adguard-assistant-button-right');\n\t } else {\n\t addClass(element, 'adguard-assistant-button-right');\n\t removeClass(element, 'adguard-assistant-button-left');\n\t }\n\t }\n\t };\n\t function makeElementDraggable(element, onDragEnd, onClick) {\n\t var coords;\n\t var shiftX;\n\t var shiftY;\n\t var pauseEvent = function pauseEvent(e) {\n\t e.stopPropagation();\n\t e.preventDefault();\n\t e.cancelBubble = true;\n\t e.returnValue = false;\n\t return false;\n\t };\n\t var onMouseMove = function onMouseMove(e) {\n\t pauseEvent(e);\n\t moveAt(e);\n\t };\n\t var preventedEvent = function preventedEvent(e) {\n\t e.preventDefault();\n\t };\n\t var getCoords = function getCoords(elem) {\n\t var box = elem.getBoundingClientRect();\n\t return {\n\t top: box.top,\n\t left: box.left,\n\t bottom: box.bottom,\n\t right: box.right\n\t };\n\t };\n\t var onMouseUp = function onMouseUp(e, doNotOpenIframe) {\n\t e.stopPropagation();\n\t events.remove(document.documentElement, 'wheel mousewheel', preventedEvent);\n\t var lastX;\n\t var lastY;\n\t var lastCoords = getCoords(element);\n\t var topHalf = lastCoords.top < windowHeight / 2;\n\t var leftHalf = lastCoords.left < windowWidth / 2;\n\t setAnchorPosition.positionY(element, topHalf);\n\t setAnchorPosition.positionX(element, leftHalf);\n\t if (topHalf) {\n\t lastY = lastCoords.top;\n\t } else {\n\t lastY = lastCoords.bottom - windowHeight;\n\t }\n\t if (leftHalf) {\n\t lastX = lastCoords.left;\n\t } else {\n\t lastX = lastCoords.right - windowWidth;\n\t }\n\t moveElementTo(element, lastX, lastY);\n\t if (Math.abs(coords.left - lastCoords.left) > 5 || Math.abs(coords.top - lastCoords.top) > 5) {\n\t if (onDragEnd) {\n\t var store = {\n\t x: lastX,\n\t y: lastY,\n\t storedAnchor: storedAnchor\n\t };\n\t onDragEnd(store);\n\t }\n\t } else if (onClick && !doNotOpenIframe) {\n\t onClick(e);\n\t }\n\t events.remove(document.documentElement, 'mouseup touchend pointerup', onMouseUp);\n\t events.remove(document.documentElement, 'mousemove touchmove pointermove', onMouseMove);\n\t };\n\t var moveAt = function moveAt(e) {\n\t var position = {\n\t x: getOriginalEvent(e).pageX - shiftX,\n\t y: getOriginalEvent(e).pageY - shiftY\n\t };\n\t var out = outsidePosition.top(position) || outsidePosition.left(position) || outsidePosition.bottom(position) || outsidePosition.right(position);\n\t if (out) {\n\t onMouseUp(e, true);\n\t } else {\n\t moveElementTo(element, position.x, position.y);\n\t }\n\t };\n\t var mouseDown = function mouseDown(e) {\n\t pauseEvent(e);\n\t events.add(document.documentElement, 'wheel mousewheel', preventedEvent);\n\t if (e.button > 0) return;\n\t elWidth = element.clientWidth;\n\t elHeight = element.clientWidth;\n\t windowWidth = getWindowSize().width;\n\t windowHeight = getWindowSize().height;\n\t coords = getCoords(element);\n\t if (storedAnchor.top) {\n\t shiftY = getOriginalEvent(e).pageY - coords.top;\n\t } else {\n\t shiftY = windowHeight - (coords.bottom - getOriginalEvent(e).pageY);\n\t }\n\t if (storedAnchor.left) {\n\t shiftX = getOriginalEvent(e).pageX - coords.left;\n\t } else {\n\t shiftX = windowWidth - (coords.right - getOriginalEvent(e).pageX);\n\t }\n\t events.add(document.documentElement, 'mouseup touchend pointerup', onMouseUp);\n\t events.add(document.documentElement, 'mousemove touchmove pointermove', onMouseMove);\n\t };\n\t events.add(element, 'mousedown touchstart', src_protectedApi.functionBind.call(mouseDown, this));\n\t events.add(element, 'dragstart', function () {});\n\t }\n\t var makeIframeDraggable = function makeIframeDraggable(iframe, handleElement) {\n\t var iframeDoc = iframe.contentDocument;\n\t var offset = Object.create(null);\n\t var drag = function drag(x, y) {\n\t iframe.style.left = \"\".concat(x, \"px\");\n\t iframe.style.top = \"\".concat(y, \"px\");\n\t };\n\t var cancelIFrameSelection = function cancelIFrameSelection(e) {\n\t e.preventDefault();\n\t e.stopPropagation();\n\t };\n\t var onMouseMove = function onMouseMove(e) {\n\t var eventPosition = getOriginalEvent(e);\n\t drag(eventPosition.screenX + offset.x, eventPosition.screenY + offset.y);\n\t };\n\t var onMouseDown = function onMouseDown(e) {\n\t var eventPosition = getOriginalEvent(e);\n\t var rect = iframe.getBoundingClientRect();\n\t offset.x = rect.left + handleElement.offsetLeft - eventPosition.screenX;\n\t offset.y = rect.top + handleElement.offsetTop - eventPosition.screenY;\n\t events.add(iframeDoc, 'mousemove touchmove pointermove', onMouseMove);\n\t events.add(iframeDoc, 'selectstart', cancelIFrameSelection);\n\t };\n\t var onMouseUp = function onMouseUp() {\n\t events.remove(iframeDoc, 'mousemove touchmove pointermove', onMouseMove);\n\t events.remove(iframeDoc, 'selectstart', cancelIFrameSelection);\n\t };\n\t document.addEventListener('visibilitychange', onMouseUp);\n\t events.add(handleElement, 'mousedown touchstart', onMouseDown);\n\t events.add(iframeDoc, 'mouseup touchend pointerup', onMouseUp);\n\t events.add(iframeDoc, 'contextmenu', function (e) {\n\t e.preventDefault();\n\t return false;\n\t });\n\t };\n\t var checkElementPosition = function checkElementPosition(element, pos) {\n\t var position = pos;\n\t windowWidth = getWindowSize().width;\n\t windowHeight = getWindowSize().height;\n\t elWidth = element.clientWidth;\n\t elHeight = element.clientHeight;\n\t if (outsidePosition.top(position)) position.y = windowHeight - 60;\n\t if (outsidePosition.bottom(position)) position.y = -windowHeight + 60;\n\t if (outsidePosition.left(position)) position.x = windowWidth - 60;\n\t if (outsidePosition.right(position)) position.x = -windowWidth + 60;\n\t moveElementTo(element, position.x, position.y);\n\t };\n\t return {\n\t makeElementDraggable: makeElementDraggable,\n\t makeIframeDraggable: makeIframeDraggable,\n\t moveElementTo: moveElementTo,\n\t setAnchorPosition: setAnchorPosition,\n\t checkElementPosition: checkElementPosition\n\t };\n\t}\n\tvar uiUtils = new UIUtils();\n\t const ui_utils = (uiUtils);\n\tfunction UIButton() {\n\t var button = null;\n\t var buttonElement = null;\n\t var isFullScreenEventsRegistered = false;\n\t var iframeController = null;\n\t var getStyleNonce = function getStyleNonce() {\n\t var adgSettings = src_settings.getAdguardSettings();\n\t if (adgSettings === null) {\n\t return '';\n\t }\n\t return adgSettings.nonce;\n\t };\n\t var isButtonAlreadyInDOM = function isButtonAlreadyInDOM() {\n\t var alert = document.querySelector('.adguard-alert');\n\t if (alert) {\n\t src_log.error('Assistant button is already in DOM');\n\t return true;\n\t }\n\t return false;\n\t };\n\t var checkRequirements = function checkRequirements() {\n\t if (!ui_validation_utils.validateBrowser()) {\n\t return false;\n\t }\n\t if (!ui_validation_utils.validatePage()) {\n\t return false;\n\t }\n\t if (!ui_validation_utils.checkVisibleAreaSize()) {\n\t return false;\n\t }\n\t if (isButtonAlreadyInDOM()) {\n\t return false;\n\t }\n\t return true;\n\t };\n\t var respectPageElements = function respectPageElements(btn) {\n\t var buttonInRightBottom = hasClass(btn, 'adguard-assistant-button-bottom') && hasClass(btn, 'adguard-assistant-button-right');\n\t if (buttonInRightBottom && document.location.hostname.indexOf('vk.com') >= 0) {\n\t addClass(btn, 'adguard-assistant-button-respect adguard-assistant-button-respect-vk');\n\t }\n\t if (buttonInRightBottom && document.location.hostname.indexOf('facebook.com') >= 0) {\n\t addClass(btn, 'adguard-assistant-button-respect adguard-assistant-button-respect-fb');\n\t }\n\t return false;\n\t };\n\t var setPositionSettingsToButton = function setPositionSettingsToButton(btn) {\n\t var position = src_settings.getUserPositionForButton();\n\t if (src_settings.getIconSize()) {\n\t addClass(btn, 'logo-small');\n\t }\n\t if (position && position.storedAnchor) {\n\t ui_utils.setAnchorPosition.positionY(btn, position.storedAnchor.top);\n\t ui_utils.setAnchorPosition.positionX(btn, position.storedAnchor.left);\n\t ui_utils.moveElementTo(btn, position.x, position.y);\n\t ui_utils.checkElementPosition(btn, position);\n\t return false;\n\t }\n\t var side = src_settings.getButtonSide();\n\t if (side) {\n\t ui_utils.setAnchorPosition.positionY(btn, side.top);\n\t ui_utils.setAnchorPosition.positionX(btn, side.left);\n\t respectPageElements(btn);\n\t }\n\t return undefined;\n\t };\n\t var getButtonPosition = function getButtonPosition(btn) {\n\t var box = btn.getBoundingClientRect();\n\t return {\n\t top: box.top + btn.offsetHeight / 2,\n\t left: box.left + btn.offsetWidth / 2\n\t };\n\t };\n\t var hideButton = function hideButton() {\n\t if (!button) {\n\t return;\n\t }\n\t button.style.setProperty('display', 'none', 'important');\n\t };\n\t var showButton = function showButton() {\n\t if (!button) {\n\t return;\n\t }\n\t button.style.setProperty('display', 'block', 'important');\n\t };\n\t var hideRestoreOnFullScreen = function hideRestoreOnFullScreen() {\n\t if (isFullScreenEventsRegistered) {\n\t return;\n\t }\n\t var isFullScreen = false;\n\t var onFullScreen = function onFullScreen() {\n\t if (!isFullScreen) {\n\t hideButton();\n\t isFullScreen = true;\n\t } else {\n\t showButton();\n\t isFullScreen = false;\n\t }\n\t };\n\t document.addEventListener('webkitfullscreenchange', onFullScreen);\n\t document.addEventListener('mozfullscreenchange', onFullScreen);\n\t document.addEventListener('fullscreenchange', onFullScreen);\n\t isFullScreenEventsRegistered = true;\n\t };\n\t var registerEvents = function registerEvents(btn) {\n\t var onDragEnd = function onDragEnd(data) {\n\t src_settings.setUserPositionForButton(data);\n\t };\n\t var openMenu = function openMenu() {\n\t iframeController.setButtonPosition(getButtonPosition(btn));\n\t iframeController.showDetailedMenu();\n\t };\n\t ui_utils.makeElementDraggable(btn, onDragEnd, openMenu);\n\t hideRestoreOnFullScreen();\n\t };\n\t var show = function show() {\n\t iframeController = src_ioc.get('iframeController');\n\t iframeController.onCloseMenu.attach(showButton);\n\t iframeController.onShowMenuItem.attach(hideButton);\n\t if (!checkRequirements()) {\n\t src_log.info('Environment doesn\\'t satisfy requirements, so don\\'t show Adguard');\n\t return;\n\t }\n\t if (button) {\n\t return;\n\t }\n\t src_log.debug('Requirements checked, all ok');\n\t buttonElement = src_protectedApi.createElement('div');\n\t buttonElement.innerHTML = HTML.button;\n\t button = buttonElement.firstChild;\n\t var adgStylesButton;\n\t if (src_protectedApi.checkShadowDomSupport()) {\n\t var shadowbuttonElement = buttonElement.attachShadow({\n\t mode: 'closed'\n\t });\n\t adgStylesButton = src_protectedApi.createStylesElement(CSS.common + CSS.button, getStyleNonce());\n\t shadowbuttonElement.appendChild(adgStylesButton);\n\t shadowbuttonElement.appendChild(button);\n\t document.documentElement.appendChild(buttonElement);\n\t } else {\n\t adgStylesButton = src_protectedApi.createStylesElement(CSS.button, getStyleNonce(), 'adg-styles-button');\n\t if (adgStylesButton) {\n\t document.documentElement.appendChild(adgStylesButton);\n\t }\n\t document.documentElement.appendChild(button);\n\t buttonElement = button;\n\t }\n\t setPositionSettingsToButton(button);\n\t registerEvents(button);\n\t };\n\t var removeButton = function removeButton() {\n\t if (!button) {\n\t return;\n\t }\n\t document.documentElement.removeChild(buttonElement);\n\t button = null;\n\t };\n\t return {\n\t show: show,\n\t remove: removeButton\n\t };\n\t}\n\tvar button_button = new UIButton();\n\t const src_button = (button_button);\n\tfunction SettingsMenuController(iframe) {\n\t var contentDocument = null;\n\t var iframeCtrl = iframe;\n\t var buttonSides = {\n\t 'position-bottom-right': {\n\t top: false,\n\t left: false\n\t },\n\t 'position-bottom-left': {\n\t top: false,\n\t left: true\n\t },\n\t 'position-top-right': {\n\t top: true,\n\t left: false\n\t },\n\t 'position-top-left': {\n\t top: true,\n\t left: true\n\t }\n\t };\n\t var close = function close() {\n\t iframeCtrl.removeIframe();\n\t };\n\t var setIconSize = function setIconSize() {\n\t var smallIcon = contentDocument.getElementById('size-small').checked;\n\t src_settings.setIconSize(smallIcon);\n\t };\n\t var setPersonalParam = function setPersonalParam() {\n\t var personalConfig = contentDocument.getElementById('this-site').checked;\n\t src_settings.setPersonalParam(personalConfig);\n\t };\n\t var setButtonSide = function setButtonSide() {\n\t var sideItem = null;\n\t Object.keys(buttonSides).forEach(function (item) {\n\t if (contentDocument.getElementById(item).checked) {\n\t sideItem = item;\n\t }\n\t });\n\t if (sideItem) {\n\t src_settings.setButtonSide(buttonSides[sideItem]);\n\t }\n\t };\n\t var setDefaultSettings = function setDefaultSettings() {\n\t if (src_settings.getIconSize()) {\n\t contentDocument.getElementById('size-small').checked = true;\n\t } else {\n\t contentDocument.getElementById('size-big').checked = true;\n\t }\n\t if (src_settings.getPersonalConfig()) {\n\t contentDocument.getElementById('this-site').checked = true;\n\t } else {\n\t contentDocument.getElementById('all-site').checked = true;\n\t }\n\t var position = src_settings.getUserPositionForButton();\n\t if (position) {\n\t return;\n\t }\n\t var sideFromSettings = src_settings.getButtonSide();\n\t Object.keys(buttonSides).forEach(function (item) {\n\t var sideItem = buttonSides[item];\n\t if (sideItem.left === sideFromSettings.left && sideItem.top === sideFromSettings.top) {\n\t contentDocument.getElementById(item).checked = true;\n\t }\n\t });\n\t };\n\t var saveSettings = function saveSettings() {\n\t setPersonalParam();\n\t setIconSize();\n\t setButtonSide();\n\t src_settings.saveSettings();\n\t close();\n\t src_button.remove();\n\t src_button.show();\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '#cancel': iframeCtrl.showDetailedMenu,\n\t '#save-settings': saveSettings\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var init = function init(iframe) {\n\t contentDocument = iframe.contentDocument;\n\t bindEvents();\n\t setDefaultSettings();\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction IframeController() {\n\t var iframe = null;\n\t var iframeAnchor = null;\n\t var currentItem = null;\n\t var iframeMaxWidth = 320;\n\t var iframeMaxHeight = 407;\n\t var menuMaxWidth = 668;\n\t var iframePositionOffset = 20;\n\t var buttonPosition = null;\n\t var blockedElementsStyleID = 'ag-hide-elements-style-id';\n\t var views = {};\n\t views[src_settings.MenuItemsNames.DetailedMenu] = HTML.detailed_menu;\n\t views[src_settings.MenuItemsNames.SelectorMenu] = HTML.selector_menu;\n\t views[src_settings.MenuItemsNames.SliderMenu] = HTML.slider_menu;\n\t views[src_settings.MenuItemsNames.BlockPreview] = HTML.preview;\n\t views[src_settings.MenuItemsNames.SettingsMenu] = HTML.settings_menu;\n\t if (window.innerWidth < menuMaxWidth) menuMaxWidth = window.innerWidth;\n\t var onCloseMenu = new CustomEvent();\n\t var onShowMenuItem = new CustomEvent();\n\t var getStyleNonce = function getStyleNonce() {\n\t var adgSettings = src_settings.getAdguardSettings();\n\t if (adgSettings === null) {\n\t return '';\n\t }\n\t return adgSettings.nonce;\n\t };\n\t var createShadowRootElement = function createShadowRootElement(iframeAnc) {\n\t var shadowiframeAnchor = iframeAnc.attachShadow({\n\t mode: 'closed'\n\t });\n\t var stylesElement = src_protectedApi.createStylesElement(CSS.common + CSS.iframe, getStyleNonce());\n\t shadowiframeAnchor.appendChild(stylesElement);\n\t return shadowiframeAnchor;\n\t };\n\t var createIframe = function createIframe(onIframeLoadCallback) {\n\t src_log.debug('Creating iframe');\n\t iframe = src_protectedApi.createElement('iframe');\n\t if (navigator.userAgent.match(/msie/i)) {\n\t iframe.src = \"javascript:''\");\n\t }\n\t var attributes = {\n\t id: src_settings.Constants.IFRAME_ID,\n\t \"class\": adguard_selector.ignoreClassName(),\n\t frameBorder: 0,\n\t allowTransparency: 'true'\n\t };\n\t Object.keys(attributes).forEach(function (item) {\n\t iframe.setAttribute(item, attributes[item]);\n\t });\n\t var iframeAlreadyLoaded = false;\n\t iframe.addEventListener('load', function () {\n\t if (iframeAlreadyLoaded) {\n\t return;\n\t }\n\t iframeAlreadyLoaded = true;\n\t onIframeLoadCallback();\n\t });\n\t if (src_protectedApi.checkShadowDomSupport()) {\n\t iframeAnchor = src_protectedApi.createElement('div');\n\t createShadowRootElement(iframeAnchor).appendChild(iframe);\n\t } else {\n\t iframeAnchor = iframe;\n\t }\n\t document.documentElement.appendChild(iframeAnchor);\n\t };\n\t var getIframePosition = function getIframePosition() {\n\t var viewPort = ui_validation_utils.getViewPort();\n\t if (!buttonPosition) {\n\t return {\n\t left: iframe.offsetLeft <= 0 ? window.innerWidth : iframe.offsetLeft,\n\t top: parseInt(iframe.style.top, 10) || iframePositionOffset\n\t };\n\t }\n\t var defaultPosition = {\n\t left: buttonPosition.left,\n\t top: buttonPosition.top\n\t };\n\t var sides = [{\n\t left: buttonPosition.left - iframeMaxWidth - iframePositionOffset,\n\t top: buttonPosition.top - iframeMaxHeight - iframePositionOffset\n\t }, {\n\t left: buttonPosition.left + iframePositionOffset,\n\t checkLeft: buttonPosition.left + iframeMaxWidth + iframePositionOffset,\n\t top: buttonPosition.top - iframeMaxHeight - iframePositionOffset\n\t }, {\n\t left: buttonPosition.left + iframePositionOffset,\n\t checkLeft: buttonPosition.left + iframeMaxWidth + iframePositionOffset,\n\t checkTop: buttonPosition.top + iframeMaxHeight + iframePositionOffset,\n\t top: buttonPosition.top + iframePositionOffset\n\t }, {\n\t left: buttonPosition.left - iframeMaxWidth - iframePositionOffset,\n\t checkTop: buttonPosition.top + iframeMaxHeight + iframePositionOffset,\n\t top: buttonPosition.top + iframePositionOffset\n\t }];\n\t for (var i = 0; i < sides.length; i += 1) {\n\t var currentSide = sides[i];\n\t var left = currentSide.checkLeft ? currentSide.checkLeft : currentSide.left;\n\t var top = currentSide.checkTop ? currentSide.checkTop : currentSide.top;\n\t if (left < 0 || left > viewPort.width) {\n\t continue;\n\t }\n\t if (top < 0 || top > viewPort.height) {\n\t continue;\n\t }\n\t return currentSide;\n\t }\n\t return defaultPosition;\n\t };\n\t var specifyIframePosition = function specifyIframePosition() {\n\t var viewPort = ui_validation_utils.getViewPort();\n\t if (iframe.offsetLeft + iframe.offsetWidth > viewPort.width) {\n\t iframe.style.left = \"\".concat(Math.max(0, viewPort.width - iframe.offsetWidth - iframePositionOffset), \"px\");\n\t }\n\t if (iframe.offsetLeft < 0) {\n\t iframe.style.left = \"\".concat(iframePositionOffset, \"px\");\n\t }\n\t if (iframe.offsetTop + iframe.offsetHeight > viewPort.height) {\n\t iframe.style.top = \"\".concat(Math.max(0, viewPort.height - iframe.offsetHeight - iframePositionOffset), \"px\");\n\t }\n\t if (iframe.offsetHeight < 0) {\n\t iframe.style.top = \"\".concat(iframePositionOffset, \"px\");\n\t }\n\t };\n\t var appendContent = function appendContent(view) {\n\t var body = iframe.contentDocument.body;\n\t for (var i = 0; i < body.children.length; i += 1) {\n\t body.removeChild(body.children[i]);\n\t }\n\t body.appendChild(view);\n\t };\n\t var localize = function localize() {\n\t var elements = iframe.contentDocument.querySelectorAll('[i18n]');\n\t for (var i = 0; i < elements.length; i += 1) {\n\t var message = src_localization.getMessage(elements[i].getAttribute('i18n'));\n\t src_localization.translateElement(elements[i], message);\n\t }\n\t };\n\t var resizeIframe = function resizeIframe(width, height) {\n\t var frame = iframe;\n\t if (height === 'auto' || !height) {\n\t height = frame.contentWindow.document.body.querySelector('.main').clientHeight || iframeMaxHeight;\n\t }\n\t if (width) {\n\t frame.width = width;\n\t frame.style.setProperty('width', \"\".concat(width, \"px\"), 'important');\n\t }\n\t if (height) {\n\t frame.height = height;\n\t frame.style.setProperty('height', \"\".concat(height, \"px\"), 'important');\n\t }\n\t };\n\t var showMenuItem = function showMenuItem(viewName, controller, width, height, options) {\n\t src_log.debug(\"Showing menu item: \".concat(viewName));\n\t if (currentItem === viewName) {\n\t return;\n\t }\n\t var onIframeLoad = function onIframeLoad() {\n\t var frameElement = iframe;\n\t var view = src_protectedApi.createElement(views[viewName]);\n\t var stylesElement = src_protectedApi.createStylesElement(CSS.common + CSS.button + CSS.iframe, getStyleNonce());\n\t view.appendChild(stylesElement);\n\t appendContent(view);\n\t localize();\n\t if (!options) {\n\t options = {};\n\t }\n\t options.iframeAnchor = iframeAnchor;\n\t controller.init(frameElement, options);\n\t currentItem = viewName;\n\t onShowMenuItem.notify();\n\t if (options.dragElement) {\n\t ui_utils.makeIframeDraggable(iframe, iframe.contentDocument.querySelector(options.dragElement));\n\t }\n\t resizeIframe(width, height);\n\t var iframePosition = getIframePosition();\n\t iframe.style.left = \"\".concat(iframePosition.left, \"px\");\n\t iframe.style.top = \"\".concat(iframePosition.top, \"px\");\n\t specifyIframePosition();\n\t };\n\t if (!iframe) {\n\t var adgStylesSelector = src_protectedApi.createStylesElement(CSS.selector, getStyleNonce(), 'adg-styles-selector');\n\t if (adgStylesSelector) {\n\t document.documentElement.appendChild(adgStylesSelector);\n\t }\n\t createIframe(onIframeLoad);\n\t return;\n\t }\n\t onIframeLoad();\n\t };\n\t var setButtonPosition = function setButtonPosition(coords) {\n\t buttonPosition = coords;\n\t };\n\t var removeIframe = function removeIframe(e) {\n\t if (e && e.isTrusted === false) {\n\t return false;\n\t }\n\t if (!iframeAnchor) {\n\t return false;\n\t }\n\t document.removeEventListener('click', removeIframe);\n\t document.documentElement.removeChild(iframeAnchor);\n\t iframe = null;\n\t iframeAnchor = null;\n\t currentItem = null;\n\t adguard_selector.close();\n\t onCloseMenu.notify();\n\t return undefined;\n\t };\n\t var setCloseEventIfNotHitIframe = function setCloseEventIfNotHitIframe(setEvent) {\n\t document.removeEventListener('click', removeIframe);\n\t if (setEvent) {\n\t window.setTimeout(function () {\n\t document.addEventListener('click', removeIframe);\n\t }, 150);\n\t }\n\t };\n\t var showDetailedMenu = function showDetailedMenu() {\n\t var controller = new DetailedMenuController(src_ioc.get('iframeController'));\n\t var options = {\n\t dragElement: '.menu-head'\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.DetailedMenu, controller, iframeMaxWidth, 'auto', options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var showSelectorMenu = function showSelectorMenu() {\n\t var controller = new SelectorMenuController(src_ioc.get('iframeController'));\n\t var options = {\n\t dragElement: '.head'\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.SelectorMenu, controller, menuMaxWidth, 160, options);\n\t setCloseEventIfNotHitIframe(false);\n\t };\n\t var showSliderMenu = function showSliderMenu(initElement, currentElement, path, optionsState) {\n\t var controller = new SliderMenuController(src_ioc.get('addRule'), src_ioc.get('iframeController'));\n\t var options = {\n\t path: path,\n\t currentElement: currentElement,\n\t element: initElement,\n\t dragElement: '.head',\n\t options: optionsState\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.SliderMenu, controller, menuMaxWidth, 'auto', options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var showBlockPreview = function showBlockPreview(initElement, path, currentElement, optionsState) {\n\t var controller = new BlockPreviewController(src_ioc.get('addRule'), src_ioc.get('iframeController'));\n\t var options = {\n\t path: path,\n\t currentElement: currentElement,\n\t element: initElement,\n\t dragElement: '.head',\n\t options: optionsState\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.BlockPreview, controller, menuMaxWidth, 'auto', options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var showSettingsMenu = function showSettingsMenu() {\n\t var controller = new SettingsMenuController(src_ioc.get('iframeController'));\n\t var options = {\n\t dragElement: '.head'\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.SettingsMenu, controller, 400, 468, options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var resizeSliderMenuToAdvanced = function resizeSliderMenuToAdvanced() {\n\t resizeIframe(null, null);\n\t };\n\t var resizeSliderMenuToNormal = function resizeSliderMenuToNormal() {\n\t resizeIframe(null, null);\n\t };\n\t var hideElementsByPath = function hideElementsByPath(selectedPath, styleID) {\n\t if (!selectedPath) {\n\t return false;\n\t }\n\t var slctr;\n\t var style;\n\t if (selectedPath.indexOf('://') > 0) {\n\t slctr = \"[src*=\\\"\".concat(selectedPath.split('$domain=')[0], \"\\\"]\");\n\t } else {\n\t slctr = selectedPath.split('##')[1];\n\t }\n\t if (slctr) {\n\t style = \"\".concat(slctr, \"{display:none!important}\");\n\t } else {\n\t src_log.error('Can`t block element: `selector` path is empty');\n\t return false;\n\t }\n\t if (!styleID) {\n\t styleID = blockedElementsStyleID;\n\t }\n\t var stylesElement = document.documentElement.querySelector(\"#\".concat(styleID));\n\t if (stylesElement) {\n\t stylesElement.innerHTML = \"\".concat(stylesElement.innerHTML, \" \").concat(style);\n\t } else {\n\t document.documentElement.appendChild(src_protectedApi.createStylesElement(style, getStyleNonce(), styleID));\n\t }\n\t if (iframeAnchor) {\n\t iframeAnchor.style.setProperty('display', 'block', 'important');\n\t }\n\t return undefined;\n\t };\n\t var showHiddenElements = function showHiddenElements(styleID) {\n\t if (!styleID) {\n\t styleID = blockedElementsStyleID;\n\t }\n\t var stylesElement = document.documentElement.querySelector(\"#\".concat(styleID));\n\t if (stylesElement) {\n\t stylesElement.parentNode.removeChild(stylesElement);\n\t }\n\t };\n\t var blockElement = function blockElement(path, addRule) {\n\t if (gm.ADG_addRule) {\n\t gm.ADG_addRule(path, function () {\n\t removeIframe();\n\t hideElementsByPath(path);\n\t bypassCache();\n\t });\n\t } else {\n\t if (!addRule) {\n\t src_log.error('Callback function `addRule` can\\'t be undefined!');\n\t }\n\t addRule(path);\n\t removeIframe();\n\t hideElementsByPath(path);\n\t bypassCache();\n\t }\n\t };\n\t return {\n\t showDetailedMenu: showDetailedMenu,\n\t showSelectorMenu: showSelectorMenu,\n\t showSliderMenu: showSliderMenu,\n\t showBlockPreview: showBlockPreview,\n\t showSettingsMenu: showSettingsMenu,\n\t setButtonPosition: setButtonPosition,\n\t onCloseMenu: onCloseMenu,\n\t onShowMenuItem: onShowMenuItem,\n\t removeIframe: removeIframe,\n\t resizeSliderMenuToAdvanced: resizeSliderMenuToAdvanced,\n\t resizeSliderMenuToNormal: resizeSliderMenuToNormal,\n\t resizeIframe: resizeIframe,\n\t hideElementsByPath: hideElementsByPath,\n\t showHiddenElements: showHiddenElements,\n\t blockElement: blockElement\n\t };\n\t}\n\t const iframe = (IframeController);\n\tfunction SliderMenuControllerMobile(addRule, iframe) {\n\t var contentDocument = null;\n\t var selectedElement = null;\n\t var iframeCtrl = iframe;\n\t var nodeParentsCount = 0;\n\t var nodeChildsCount = 0;\n\t var parents;\n\t var children;\n\t var nodeNumber = 0;\n\t function showPreview() {\n\t adguard_selector.reset();\n\t if (this.classList.contains('active')) {\n\t removeClass(selectedElement, 'sg_hide_element');\n\t removeClass(this, 'active');\n\t adguard_selector.selectElement(selectedElement);\n\t contentDocument.querySelector('.adg-plus').removeAttribute('disabled');\n\t contentDocument.querySelector('.adg-minus').removeAttribute('disabled');\n\t contentDocument.querySelector('.adg-close').removeAttribute('disabled');\n\t } else {\n\t addClass(selectedElement, 'sg_hide_element');\n\t addClass(this, 'active');\n\t contentDocument.querySelector('.adg-plus').setAttribute('disabled', 'disabled');\n\t contentDocument.querySelector('.adg-minus').setAttribute('disabled', 'disabled');\n\t contentDocument.querySelector('.adg-close').setAttribute('disabled', 'disabled');\n\t }\n\t }\n\t var getUrlBlockAttribute = function getUrlBlockAttribute(element) {\n\t var urlBlockAttributes = ['src', 'data'];\n\t for (var i = 0; i < urlBlockAttributes.length; i += 1) {\n\t var attr = urlBlockAttributes[i];\n\t var value = element.getAttribute(attr);\n\t if (value) {\n\t return value;\n\t }\n\t }\n\t return null;\n\t };\n\t var getFilterText = function getFilterText() {\n\t var options = {\n\t urlMask: getUrlBlockAttribute(selectedElement),\n\t cssSelectorType: 'STRICT_FULL',\n\t isBlockOneDomain: false,\n\t url: document.location,\n\t ruleType: 'CSS'\n\t };\n\t return adguard_rules_constructor.constructRuleText(selectedElement, options);\n\t };\n\t var blockElement = function blockElement() {\n\t selectedElement.classList.remove('sg_hide_element');\n\t selectedElement.style.display = 'none';\n\t addRule(getFilterText());\n\t iframeCtrl.removeIframe();\n\t };\n\t var onSliderMove = function onSliderMove(element) {\n\t selectedElement = element;\n\t adguard_selector.selectElement(element);\n\t };\n\t var plus = function plus() {\n\t nodeNumber = nodeNumber + 1 > nodeParentsCount ? nodeNumber : nodeNumber + 1;\n\t if (nodeNumber >= 0) {\n\t if (parents[nodeNumber]) onSliderMove(parents[nodeNumber]);\n\t } else if (children[~nodeNumber]) onSliderMove(children[~nodeNumber]);\n\t };\n\t var minus = function minus() {\n\t nodeNumber <= -nodeChildsCount ? nodeNumber = nodeNumber : nodeNumber -= 1;\n\t if (nodeNumber >= 0) {\n\t if (parents[nodeNumber]) onSliderMove(parents[nodeNumber]);\n\t } else if (children[~nodeNumber]) onSliderMove(children[~nodeNumber]);\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.adg-close': iframeCtrl.showSelectorMenu,\n\t '.adg-preview': showPreview,\n\t '.adg-accept': blockElement,\n\t '.adg-plus': plus,\n\t '.adg-minus': minus\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t window.addEventListener('orientationchange', iframeCtrl.showSelectorMenu);\n\t };\n\t var init = function init(iframe, options) {\n\t selectedElement = options.element;\n\t contentDocument = iframe.contentDocument;\n\t bindEvents();\n\t adguard_selector.selectElement(selectedElement);\n\t children = getAllChildren(selectedElement);\n\t parents = getParentsLevel(selectedElement);\n\t parents.splice(0, 0, selectedElement);\n\t nodeParentsCount = parents.length;\n\t nodeChildsCount = children.length;\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tconst package_namespaceObject = {\"i8\":\"4.3.69\"};\n\tfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\tfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\tfunction IframeControllerMobile() {\n\t var iframe = null;\n\t var iframeElement = null;\n\t var currentItem = null;\n\t var onCloseMenu = new CustomEvent();\n\t var onShowMenuItem = new CustomEvent();\n\t var views = {};\n\t views['mobilePopup.html'] = HTML.popup;\n\t views['mobileMenu.html'] = HTML.mobile_menu;\n\t var defaultCSS = {\n\t clip: 'auto',\n\t 'z-index': 2147483647\n\t };\n\t var defaultAttributes = {\n\t \"class\": adguard_selector.ignoreClassName(),\n\t frameBorder: 0,\n\t allowTransparency: 'true',\n\t id: 'iframe-x2eRYVVQRsG9'\n\t };\n\t var updateIframeAttrs = function updateIframeAttrs(attrs) {\n\t iframe.removeAttribute('style');\n\t iframe.removeAttribute('height');\n\t var attributes = _objectSpread(_objectSpread({}, defaultAttributes), attrs);\n\t Object.keys(attributes).forEach(function (item) {\n\t iframe.setAttribute(item, attributes[item]);\n\t });\n\t };\n\t var updateIframeStyles = function updateIframeStyles(styles) {\n\t var css = _objectSpread(_objectSpread({}, defaultCSS), styles);\n\t Object.keys(css).forEach(function (item) {\n\t iframe.style[item] = css[item];\n\t });\n\t };\n\t var createIframe = function createIframe(onIframeLoadCallback, styles, attrs) {\n\t src_log.debug('Creating iframe');\n\t if (document.querySelector(\"#\".concat(defaultAttributes.id))) {\n\t src_log.error('Iframe already added');\n\t return;\n\t }\n\t iframe = src_protectedApi.createElement('iframe');\n\t iframe.addEventListener('load', function () {\n\t onIframeLoadCallback();\n\t updateIframeAttrs(attrs);\n\t updateIframeStyles(styles);\n\t });\n\t iframeElement = iframe;\n\t var adgStylesSelector = src_protectedApi.createStylesElement(CSS.selector, 'adg-styles-selector');\n\t if (adgStylesSelector) {\n\t document.documentElement.appendChild(adgStylesSelector);\n\t }\n\t document.documentElement.appendChild(iframeElement);\n\t };\n\t var appendContent = function appendContent(view) {\n\t var body = iframe.contentDocument.body;\n\t for (var i = 0; i < body.children.length; i += 1) {\n\t body.removeChild(body.children[i]);\n\t }\n\t body.appendChild(view);\n\t };\n\t var localize = function localize() {\n\t var elements = iframe.contentDocument.querySelectorAll('[i18n]');\n\t for (var i = 0; i < elements.length; i += 1) {\n\t var message = src_localization.getMessage(elements[i].getAttribute('i18n'));\n\t src_localization.translateElement(elements[i], message);\n\t }\n\t var elementsWithTitle = iframe.contentDocument.querySelectorAll('[i18n-title]');\n\t for (var j = 0; j < elementsWithTitle.length; j += 1) {\n\t var title = src_localization.getMessage(elementsWithTitle[j].getAttribute('i18n-title'));\n\t elementsWithTitle[j].setAttribute('title', title);\n\t }\n\t };\n\t var hideIframe = function hideIframe() {\n\t if (iframe) {\n\t iframe.style.display = 'none';\n\t }\n\t };\n\t var showIframe = function showIframe() {\n\t if (iframe) {\n\t iframe.style.display = 'block';\n\t }\n\t };\n\t var showMenuItem = function showMenuItem(viewName, controller, options, styles, attrs) {\n\t if (currentItem === viewName) {\n\t return;\n\t }\n\t var onIframeLoad = function onIframeLoad() {\n\t var frameElement = iframe;\n\t var view = src_protectedApi.createElement(views[viewName]);\n\t var iframeStyles = CSS.common + CSS.mobile;\n\t view.appendChild(src_protectedApi.createStylesElement(iframeStyles));\n\t appendContent(view);\n\t localize();\n\t if (!options) {\n\t options = {};\n\t }\n\t if (controller) {\n\t controller.init(frameElement, options);\n\t }\n\t updateIframeAttrs(attrs);\n\t updateIframeStyles(styles);\n\t currentItem = viewName;\n\t onShowMenuItem.notify();\n\t showIframe();\n\t };\n\t if (!iframe) {\n\t var adgStylesSelector = src_protectedApi.createStylesElement(CSS.selector, 'adg-styles-selector');\n\t if (adgStylesSelector) {\n\t document.documentElement.appendChild(adgStylesSelector);\n\t }\n\t createIframe(onIframeLoad, styles, attrs);\n\t return;\n\t }\n\t onIframeLoad();\n\t };\n\t var startSelect = function startSelect() {\n\t hideIframe();\n\t var controller = new SelectorMenuController(src_ioc.get('iframeController'));\n\t controller.startSelector();\n\t };\n\t var showSelectorMenu = function showSelectorMenu() {\n\t hideIframe();\n\t adguard_selector.close();\n\t var styles = {\n\t position: 'fixed',\n\t left: 0,\n\t top: 0,\n\t right: 0,\n\t bottom: 0,\n\t margin: 'auto',\n\t 'border-radius': '2px',\n\t background: 'transparent',\n\t width: '40vmax',\n\t height: '40vmax'\n\t };\n\t showMenuItem('mobilePopup.html', mobilePopupButtonsInit(), null, styles);\n\t };\n\t var removeIframe = function removeIframe(e) {\n\t if (e && e.isTrusted === false) {\n\t return false;\n\t }\n\t if (!iframeElement) {\n\t return false;\n\t }\n\t document.removeEventListener('click', removeIframe);\n\t window.removeEventListener('orientationchange', showSelectorMenu);\n\t document.documentElement.removeChild(iframeElement);\n\t iframe = null;\n\t iframeElement = null;\n\t currentItem = null;\n\t adguard_selector.close();\n\t onCloseMenu.notify();\n\t return undefined;\n\t };\n\t var mobilePopupButtonsInit = function mobilePopupButtonsInit() {\n\t return {\n\t init: function init() {\n\t var startSelectMode = iframe.contentDocument.querySelector('.start-select-mode');\n\t var cancelSelectMode = iframe.contentDocument.querySelector('.cancel-select-mode');\n\t var appVersionElem = iframe.contentDocument.querySelector('#appVersion');\n\t startSelectMode.addEventListener('click', startSelect);\n\t cancelSelectMode.addEventListener('click', removeIframe);\n\t appVersionElem.innerText = \"v\".concat(package_namespaceObject.i8);\n\t }\n\t };\n\t };\n\t var showSliderMenu = function showSliderMenu(element) {\n\t var controller = new SliderMenuControllerMobile(src_ioc.get('addRule'), src_ioc.get('iframeController'));\n\t var options = {\n\t element: element\n\t };\n\t var styles = {\n\t position: 'fixed',\n\t bottom: 0,\n\t left: '50%',\n\t transform: 'translateX(-50%)',\n\t width: '70vw',\n\t height: '27vw'\n\t };\n\t showMenuItem('mobileMenu.html', controller, options, styles);\n\t };\n\t return {\n\t showSelectorMenu: showSelectorMenu,\n\t showSliderMenu: showSliderMenu,\n\t onCloseMenu: onCloseMenu,\n\t onShowMenuItem: onShowMenuItem,\n\t removeIframe: removeIframe,\n\t startSelect: startSelect\n\t };\n\t}\n\tfunction adguardAssistantExtended() {\n\t var adguardSettings = typeof AdguardSettings === 'undefined' ? null : AdguardSettings;\n\t src_wot.registerWotEventHandler();\n\t src_settings.setAdguardSettings(adguardSettings);\n\t var iframeController = new iframe();\n\t src_ioc.register('iframeController', iframeController);\n\t return {\n\t start: function start(element, callback) {\n\t src_ioc.register('addRule', src_protectedApi.functionBind.call(callback, this));\n\t if (element) {\n\t iframeController.showSelectorMenu();\n\t iframeController.showSliderMenu(element);\n\t } else {\n\t iframeController.showSelectorMenu();\n\t }\n\t },\n\t close: function close() {\n\t iframeController.removeIframe();\n\t }\n\t };\n\t}\n\tfunction adguardAssistantMini() {\n\t var iframeController = new IframeControllerMobile();\n\t src_ioc.register('iframeController', iframeController);\n\t return {\n\t start: function start(element, callback) {\n\t src_ioc.register('addRule', src_protectedApi.functionBind.call(callback, this));\n\t if (element) {\n\t iframeController.showSelectorMenu();\n\t iframeController.showSliderMenu(element);\n\t } else {\n\t iframeController.showSelectorMenu();\n\t }\n\t },\n\t close: function close() {\n\t iframeController.removeIframe();\n\t }\n\t };\n\t}\n\tvar mobileReg = /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i;\n\tvar isMobile = function isMobile(ua) {\n\t return mobileReg.test(ua);\n\t};\n\tvar adguardAssistant = isMobile(navigator.userAgent) ? adguardAssistantMini : adguardAssistantExtended;\n\t})();\n\t \treturn __webpack_exports__;\n\t })()\n\t;\n\t});\n} (assistant));\n\n/**\n * @file\n * In this file we doing only lazy-load assistant and save it to the global\n * scope of the current content-script.\n */\nif (!window.adguardAssistant) {\n window.adguardAssistant = assistant.exports.adguardAssistant();\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\nimport \"@adguard/tswebextension/assistant-inject\";\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"adguard-assistant.js","mappings":"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ACN;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,cAAc;AACpE;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,sCAAsC,iCAAmB;AACzD,sBAAsB,iCAAmB;AACzC;AACA;AACA,WAAW;AACX;AACA;AACA,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA,6BAA6B,0BAAmB,EAAE,iCAAmB;AACrE,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,EAAE,iCAAmB,GAAG,0BAAmB;AAC3C;AACA,GAAG;AACH,0DAA0D;AAC1D,GAAG;AACH;AACA;AACA,gCAAgC,iEAAiE,iqBAAiqB,kFAAkF;AACp1B,GAAG;AACH;AACA;AACA,+BAA+B,sSAAsS,wCAAwC,8BAA8B,sCAAsC,0BAA0B,uCAAuC,sBAAsB,kCAAkC,qBAAqB,6BAA6B,kBAAkB,4BAA4B,kCAAkC,6BAA6B,yCAAyC,kCAAkC,6BAA6B,uBAAuB,iCAAiC,uCAAuC,oCAAoC,kBAAkB,4BAA4B,uBAAuB,oCAAoC,iCAAiC,6BAA6B,gFAAgF,gCAAgC,2BAA2B,sCAAsC,+CAA+C,iCAAiC,qCAAqC,4BAA4B,4BAA4B,8BAA8B,+BAA+B,sBAAsB,qBAAqB,oBAAoB,gBAAgB,uBAAuB,4BAA4B,6BAA6B,6BAA6B,kCAAkC,gDAAgD,0BAA0B,2BAA2B,4BAA4B,mDAAmD,wBAAwB,2DAA2D,yBAAyB,kDAAkD,mCAAmC,gDAAgD,yBAAyB,oDAAoD,8BAA8B,wDAAwD,sCAAsC,yCAAyC,uBAAuB,uBAAuB,mBAAmB,iBAAiB,iBAAiB,iBAAiB,sBAAsB,gBAAgB,sBAAsB,wBAAwB,uBAAuB,wBAAwB,yBAAyB,wBAAwB,0BAA0B,wBAAwB,oBAAoB,kBAAkB,kBAAkB,2BAA2B;AACxxF,GAAG;AACH;AACA;AACA,+BAA+B,uUAAuU,sCAAsC,8BAA8B,uCAAuC,0BAA0B,yCAAyC,sBAAsB,iCAAiC,qBAAqB,0CAA0C,kBAAkB,+BAA+B,kCAAkC,sCAAsC,yCAAyC,4CAA4C,6BAA6B,gCAAgC,iCAAiC,+DAA+D,oCAAoC,uBAAuB,4BAA4B,gCAAgC,oCAAoC,kDAAkD,6BAA6B,+FAA+F,gCAAgC,6BAA6B,sCAAsC,0CAA0C,iCAAiC,kCAAkC,4BAA4B,+BAA+B,8BAA8B,gCAAgC,sBAAsB,yBAAyB,oBAAoB,wBAAwB,uBAAuB,6BAA6B,6BAA6B,+CAA+C,kCAAkC,+DAA+D,0BAA0B,kCAAkC,4BAA4B,mCAAmC,wBAAwB,4DAA4D,yBAAyB,qDAAqD,mCAAmC,8DAA8D,yBAAyB,oDAAoD,8BAA8B,sDAAsD,sCAAsC,2DAA2D,uBAAuB,0BAA0B,mBAAmB,sBAAsB,iBAAiB,oBAAoB,sBAAsB,wBAAwB,sBAAsB,yBAAyB,uBAAuB,0BAA0B,yBAAyB,wBAAwB,0BAA0B,yBAAyB,oBAAoB,sBAAsB,kBAAkB,6BAA6B;AAC7gG,GAAG;AACH;AACA;AACA,+BAA+B,kWAAkW,oDAAoD,8BAA8B,0CAA0C,0BAA0B,oDAAoD,sBAAsB,qCAAqC,qBAAqB,gDAAgD,kBAAkB,gCAAgC,kCAAkC,oCAAoC,yCAAyC,2CAA2C,6BAA6B,4BAA4B,iCAAiC,8DAA8D,oCAAoC,mBAAmB,4BAA4B,4BAA4B,oCAAoC,6CAA6C,6BAA6B,+FAA+F,gCAAgC,gCAAgC,sCAAsC,uDAAuD,iCAAiC,yCAAyC,4BAA4B,6BAA6B,8BAA8B,6BAA6B,sBAAsB,mBAAmB,oBAAoB,qBAAqB,uBAAuB,gCAAgC,6BAA6B,qCAAqC,kCAAkC,6DAA6D,0BAA0B,2BAA2B,4BAA4B,gEAAgE,wBAAwB,oEAAoE,yBAAyB,8DAA8D,mCAAmC,8DAA8D,yBAAyB,6DAA6D,8BAA8B,+DAA+D,sCAAsC,wDAAwD,uBAAuB,4BAA4B,mBAAmB,iBAAiB,iBAAiB,kBAAkB,sBAAsB,oBAAoB,sBAAsB,yBAAyB,uBAAuB,0BAA0B,yBAAyB,uBAAuB,0BAA0B,wBAAwB,oBAAoB,mBAAmB,kBAAkB,0BAA0B;AAC/lG,GAAG;AACH;AACA;AACA,+BAA+B,kVAAkV,wCAAwC,8BAA8B,uCAAuC,0BAA0B,6CAA6C,sBAAsB,iCAAiC,qBAAqB,sCAAsC,kBAAkB,oCAAoC,kCAAkC,qCAAqC,yCAAyC,iCAAiC,6BAA6B,6BAA6B,iCAAiC,wDAAwD,oCAAoC,mBAAmB,4BAA4B,6BAA6B,oCAAoC,8CAA8C,6BAA6B,+FAA+F,gCAAgC,qCAAqC,sCAAsC,4CAA4C,iCAAiC,uCAAuC,4BAA4B,4BAA4B,8BAA8B,kCAAkC,sBAAsB,4BAA4B,oBAAoB,mBAAmB,uBAAuB,oCAAoC,6BAA6B,+CAA+C,kCAAkC,6DAA6D,0BAA0B,mCAAmC,4BAA4B,2DAA2D,wBAAwB,8DAA8D,yBAAyB,wDAAwD,mCAAmC,sDAAsD,yBAAyB,qDAAqD,8BAA8B,+DAA+D,sCAAsC,+DAA+D,uBAAuB,2BAA2B,mBAAmB,kBAAkB,iBAAiB,iBAAiB,sBAAsB,sBAAsB,sBAAsB,+BAA+B,uBAAuB,6BAA6B,yBAAyB,gCAAgC,0BAA0B,8BAA8B,oBAAoB,mBAAmB,kBAAkB,2BAA2B;AAC5jG,GAAG;AACH;AACA;AACA,+BAA+B,0VAA0V,mCAAmC,8BAA8B,gDAAgD,0BAA0B,6CAA6C,sBAAsB,kCAAkC,qBAAqB,+CAA+C,kBAAkB,oCAAoC,kCAAkC,0CAA0C,yCAAyC,sCAAsC,6BAA6B,4BAA4B,iCAAiC,0DAA0D,oCAAoC,sBAAsB,4BAA4B,4BAA4B,oCAAoC,qDAAqD,6BAA6B,0FAA0F,gCAAgC,qCAAqC,sCAAsC,8CAA8C,iCAAiC,uCAAuC,4BAA4B,sCAAsC,8BAA8B,uCAAuC,sBAAsB,qBAAqB,oBAAoB,oBAAoB,uBAAuB,oCAAoC,6BAA6B,gDAAgD,kCAAkC,sEAAsE,0BAA0B,6BAA6B,4BAA4B,mEAAmE,wBAAwB,iEAAiE,yBAAyB,4DAA4D,mCAAmC,4DAA4D,yBAAyB,uDAAuD,8BAA8B,6DAA6D,sCAAsC,kEAAkE,uBAAuB,0BAA0B,mBAAmB,kBAAkB,iBAAiB,iBAAiB,sBAAsB,sBAAsB,sBAAsB,uBAAuB,uBAAuB,wBAAwB,yBAAyB,wBAAwB,0BAA0B,yBAAyB,oBAAoB,sBAAsB,kBAAkB,kCAAkC;AACvnG,GAAG;AACH;AACA;AACA,+BAA+B,6WAA6W,8CAA8C,8BAA8B,qDAAqD,0BAA0B,yDAAyD,sBAAsB,yCAAyC,qBAAqB,wCAAwC,kBAAkB,6BAA6B,kCAAkC,oCAAoC,yCAAyC,uCAAuC,6BAA6B,kCAAkC,iCAAiC,4DAA4D,oCAAoC,kBAAkB,4BAA4B,kCAAkC,oCAAoC,yDAAyD,6BAA6B,0HAA0H,gCAAgC,iCAAiC,sCAAsC,wDAAwD,iCAAiC,gDAAgD,4BAA4B,kCAAkC,8BAA8B,8CAA8C,sBAAsB,0BAA0B,oBAAoB,wBAAwB,uBAAuB,6BAA6B,6BAA6B,kDAAkD,kCAAkC,6EAA6E,0BAA0B,kCAAkC,4BAA4B,qEAAqE,wBAAwB,qEAAqE,yBAAyB,gEAAgE,mCAAmC,gEAAgE,yBAAyB,gEAAgE,8BAA8B,sEAAsE,sCAAsC,kEAAkE,uBAAuB,gCAAgC,mBAAmB,kBAAkB,iBAAiB,mBAAmB,sBAAsB,kBAAkB,sBAAsB,0BAA0B,uBAAuB,uBAAuB,yBAAyB,0BAA0B,0BAA0B,uBAAuB,oBAAoB,kBAAkB,kBAAkB,gCAAgC;AAC1wG,GAAG;AACH;AACA;AACA,+BAA+B,gUAAgU,sCAAsC,8BAA8B,yCAAyC,0BAA0B,qCAAqC,sBAAsB,+BAA+B,qBAAqB,oCAAoC,kBAAkB,+BAA+B,kCAAkC,sCAAsC,yCAAyC,wCAAwC,6BAA6B,6BAA6B,iCAAiC,mDAAmD,oCAAoC,mBAAmB,4BAA4B,6BAA6B,oCAAoC,yCAAyC,6BAA6B,wFAAwF,gCAAgC,8BAA8B,sCAAsC,2CAA2C,iCAAiC,oCAAoC,4BAA4B,0BAA0B,8BAA8B,uCAAuC,sBAAsB,oBAAoB,oBAAoB,kBAAkB,uBAAuB,+BAA+B,6BAA6B,uCAAuC,kCAAkC,0DAA0D,0BAA0B,yBAAyB,4BAA4B,4DAA4D,wBAAwB,qEAAqE,yBAAyB,iEAAiE,mCAAmC,iEAAiE,yBAAyB,iEAAiE,8BAA8B,uEAAuE,sCAAsC,uDAAuD,uBAAuB,uBAAuB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,sBAAsB,sBAAsB,sBAAsB,qBAAqB,uBAAuB,sBAAsB,yBAAyB,wBAAwB,0BAA0B,yBAAyB,oBAAoB,mBAAmB,kBAAkB,0BAA0B;AAC3+F,GAAG;AACH;AACA;AACA,+BAA+B,0VAA0V,uCAAuC,8BAA8B,2CAA2C,0BAA0B,gDAAgD,sBAAsB,kCAAkC,qBAAqB,+CAA+C,kBAAkB,wCAAwC,kCAAkC,8CAA8C,yCAAyC,6CAA6C,6BAA6B,iCAAiC,iCAAiC,yDAAyD,oCAAoC,qBAAqB,4BAA4B,iCAAiC,oCAAoC,qDAAqD,6BAA6B,gHAAgH,gCAAgC,mCAAmC,sCAAsC,oDAAoD,iCAAiC,8CAA8C,4BAA4B,sCAAsC,8BAA8B,sCAAsC,sBAAsB,yBAAyB,oBAAoB,qBAAqB,uBAAuB,wCAAwC,6BAA6B,gDAAgD,kCAAkC,wEAAwE,0BAA0B,kCAAkC,4BAA4B,oEAAoE,wBAAwB,uEAAuE,yBAAyB,mEAAmE,mCAAmC,oEAAoE,yBAAyB,oEAAoE,8BAA8B,wEAAwE,sCAAsC,qEAAqE,uBAAuB,8BAA8B,mBAAmB,oBAAoB,iBAAiB,mBAAmB,sBAAsB,sBAAsB,sBAAsB,kCAAkC,uBAAuB,gCAAgC,yBAAyB,iCAAiC,0BAA0B,+BAA+B,oBAAoB,qBAAqB,kBAAkB,6BAA6B;AACrxG,GAAG;AACH;AACA;AACA,+BAA+B,oSAAoS,mCAAmC,8BAA8B,sCAAsC,0BAA0B,0CAA0C,sBAAsB,yBAAyB,qBAAqB,gCAAgC,kBAAkB,2BAA2B,kCAAkC,+BAA+B,yCAAyC,uBAAuB,6BAA6B,2BAA2B,iCAAiC,qDAAqD,oCAAoC,gBAAgB,4BAA4B,2BAA2B,oCAAoC,uCAAuC,6BAA6B,gFAAgF,gCAAgC,4BAA4B,sCAAsC,0CAA0C,iCAAiC,mCAAmC,4BAA4B,4BAA4B,8BAA8B,mCAAmC,sBAAsB,qBAAqB,oBAAoB,kBAAkB,uBAAuB,2BAA2B,6BAA6B,sCAAsC,kCAAkC,oDAAoD,0BAA0B,6BAA6B,4BAA4B,kCAAkC,wBAAwB,sDAAsD,yBAAyB,iDAAiD,mCAAmC,iDAAiD,yBAAyB,kDAAkD,8BAA8B,kDAAkD,sCAAsC,iDAAiD,uBAAuB,0BAA0B,mBAAmB,iBAAiB,iBAAiB,iBAAiB,sBAAsB,oBAAoB,sBAAsB,wBAAwB,uBAAuB,0BAA0B,yBAAyB,yBAAyB,0BAA0B,2BAA2B,oBAAoB,gBAAgB,kBAAkB,2BAA2B;AACjyF,GAAG;AACH;AACA;AACA,+BAA+B,oUAAoU,oCAAoC,8BAA8B,gDAAgD,0BAA0B,yCAAyC,sBAAsB,+BAA+B,qBAAqB,qCAAqC,kBAAkB,6BAA6B,kCAAkC,2BAA2B,yCAAyC,qCAAqC,6BAA6B,2BAA2B,iCAAiC,gDAAgD,oCAAoC,oBAAoB,4BAA4B,2BAA2B,oCAAoC,yCAAyC,6BAA6B,+FAA+F,gCAAgC,qCAAqC,sCAAsC,uCAAuC,iCAAiC,+BAA+B,4BAA4B,gCAAgC,8BAA8B,kCAAkC,sBAAsB,uBAAuB,oBAAoB,iBAAiB,uBAAuB,6BAA6B,6BAA6B,6CAA6C,kCAAkC,qEAAqE,0BAA0B,6BAA6B,4BAA4B,oDAAoD,wBAAwB,oEAAoE,yBAAyB,2DAA2D,mCAAmC,4DAA4D,yBAAyB,0DAA0D,8BAA8B,iEAAiE,sCAAsC,uDAAuD,uBAAuB,4BAA4B,mBAAmB,kBAAkB,iBAAiB,kBAAkB,sBAAsB,sBAAsB,sBAAsB,gCAAgC,uBAAuB,8BAA8B,yBAAyB,gCAAgC,0BAA0B,8BAA8B,oBAAoB,oBAAoB,kBAAkB,gCAAgC;AACzgG,GAAG;AACH;AACA;AACA,+BAA+B,mVAAmV,kCAAkC,8BAA8B,gDAAgD,0BAA0B,8CAA8C,sBAAsB,6BAA6B,qBAAqB,wCAAwC,kBAAkB,6CAA6C,kCAAkC,yCAAyC,yCAAyC,gCAAgC,6BAA6B,iCAAiC,iCAAiC,qDAAqD,oCAAoC,oBAAoB,4BAA4B,iCAAiC,oCAAoC,oDAAoD,6BAA6B,iGAAiG,gCAAgC,kCAAkC,sCAAsC,gDAAgD,iCAAiC,2CAA2C,4BAA4B,2CAA2C,8BAA8B,8CAA8C,sBAAsB,8BAA8B,oBAAoB,qBAAqB,uBAAuB,6CAA6C,6BAA6B,oDAAoD,kCAAkC,+DAA+D,0BAA0B,2CAA2C,4BAA4B,oFAAoF,wBAAwB,4DAA4D,yBAAyB,uDAAuD,mCAAmC,2DAA2D,yBAAyB,gDAAgD,8BAA8B,yDAAyD,sCAAsC,sEAAsE,uBAAuB,+BAA+B,mBAAmB,mBAAmB,iBAAiB,mBAAmB,sBAAsB,2BAA2B,sBAAsB,6BAA6B,uBAAuB,6BAA6B,yBAAyB,4BAA4B,0BAA0B,6BAA6B,oBAAoB,oBAAoB,kBAAkB,4CAA4C;AACnsG,GAAG;AACH;AACA;AACA,+BAA+B,yRAAyR,0BAA0B,8BAA8B,kCAAkC,0BAA0B,gCAAgC,sBAAsB,yBAAyB,qBAAqB,0BAA0B,kBAAkB,0BAA0B,kCAAkC,gCAAgC,yCAAyC,6BAA6B,6BAA6B,wBAAwB,iCAAiC,iCAAiC,oCAAoC,gBAAgB,4BAA4B,wBAAwB,oCAAoC,oCAAoC,6BAA6B,0EAA0E,gCAAgC,2BAA2B,sCAAsC,mCAAmC,iCAAiC,iCAAiC,4BAA4B,sBAAsB,8BAA8B,0BAA0B,sBAAsB,qBAAqB,oBAAoB,iBAAiB,uBAAuB,0BAA0B,6BAA6B,uCAAuC,kCAAkC,yCAAyC,0BAA0B,6BAA6B,4BAA4B,oDAAoD,wBAAwB,kDAAkD,yBAAyB,8CAA8C,mCAAmC,+CAA+C,yBAAyB,8CAA8C,8BAA8B,iDAAiD,sCAAsC,8CAA8C,uBAAuB,wBAAwB,mBAAmB,gBAAgB,iBAAiB,iBAAiB,sBAAsB,mBAAmB,sBAAsB,8BAA8B,uBAAuB,8BAA8B,yBAAyB,yBAAyB,0BAA0B,yBAAyB,oBAAoB,gBAAgB,kBAAkB,0BAA0B;AAC3rF,GAAG;AACH;AACA;AACA,+BAA+B,+BAA+B,yBAAyB,oBAAoB,oBAAoB,uBAAuB,0BAA0B,mBAAmB,iBAAiB,iBAAiB,kBAAkB;AACvP,GAAG;AACH;AACA;AACA,+BAA+B,wVAAwV,6CAA6C,8BAA8B,2CAA2C,0BAA0B,gDAAgD,sBAAsB,iCAAiC,qBAAqB,0CAA0C,kBAAkB,+BAA+B,kCAAkC,0CAA0C,yCAAyC,yCAAyC,6BAA6B,gCAAgC,iCAAiC,wDAAwD,oCAAoC,oBAAoB,4BAA4B,gCAAgC,oCAAoC,qDAAqD,6BAA6B,0GAA0G,gCAAgC,8BAA8B,sCAAsC,iDAAiD,iCAAiC,uCAAuC,4BAA4B,4BAA4B,8BAA8B,oCAAoC,sBAAsB,oBAAoB,oBAAoB,qBAAqB,uBAAuB,+BAA+B,6BAA6B,wCAAwC,kCAAkC,kEAAkE,0BAA0B,8BAA8B,4BAA4B,gDAAgD,wBAAwB,8DAA8D,yBAAyB,yDAAyD,mCAAmC,yDAAyD,yBAAyB,0DAA0D,8BAA8B,4DAA4D,sCAAsC,2DAA2D,uBAAuB,4BAA4B,mBAAmB,iBAAiB,iBAAiB,mBAAmB,sBAAsB,sBAAsB,sBAAsB,wBAAwB,uBAAuB,uBAAuB,yBAAyB,yBAAyB,0BAA0B,wBAAwB,oBAAoB,oBAAoB,kBAAkB,6BAA6B;AACnkG,GAAG;AACH;AACA;AACA,+BAA+B,gWAAgW,qCAAqC,8BAA8B,yCAAyC,0BAA0B,kDAAkD,sBAAsB,+BAA+B,qBAAqB,0CAA0C,kBAAkB,oCAAoC,kCAAkC,0CAA0C,yCAAyC,qCAAqC,6BAA6B,4BAA4B,iCAAiC,sEAAsE,oCAAoC,kBAAkB,4BAA4B,4BAA4B,oCAAoC,mDAAmD,6BAA6B,yGAAyG,gCAAgC,+BAA+B,sCAAsC,qDAAqD,iCAAiC,mCAAmC,4BAA4B,gCAAgC,8BAA8B,kCAAkC,sBAAsB,qBAAqB,oBAAoB,sBAAsB,uBAAuB,oCAAoC,6BAA6B,uCAAuC,kCAAkC,wEAAwE,0BAA0B,mCAAmC,4BAA4B,2DAA2D,wBAAwB,uEAAuE,yBAAyB,gEAAgE,mCAAmC,iEAAiE,yBAAyB,6DAA6D,8BAA8B,iEAAiE,sCAAsC,kEAAkE,uBAAuB,yBAAyB,mBAAmB,kBAAkB,iBAAiB,iBAAiB,sBAAsB,qBAAqB,sBAAsB,sBAAsB,uBAAuB,uBAAuB,yBAAyB,qBAAqB,0BAA0B,sBAAsB,oBAAoB,kBAAkB,kBAAkB,gCAAgC;AAC7nG,GAAG;AACH;AACA;AACA,+BAA+B,2UAA2U,qCAAqC,8BAA8B,iDAAiD,0BAA0B,sCAAsC,sBAAsB,2BAA2B,qBAAqB,mCAAmC,kBAAkB,+BAA+B,kCAAkC,qCAAqC,yCAAyC,uCAAuC,6BAA6B,wBAAwB,iCAAiC,iDAAiD,oCAAoC,qBAAqB,4BAA4B,wBAAwB,oCAAoC,sCAAsC,6BAA6B,wFAAwF,gCAAgC,gCAAgC,sCAAsC,gDAAgD,iCAAiC,6CAA6C,4BAA4B,4BAA4B,8BAA8B,iCAAiC,sBAAsB,sBAAsB,oBAAoB,mBAAmB,uBAAuB,+BAA+B,6BAA6B,oCAAoC,kCAAkC,mEAAmE,0BAA0B,6BAA6B,4BAA4B,uCAAuC,wBAAwB,uEAAuE,yBAAyB,gEAAgE,mCAAmC,iEAAiE,yBAAyB,gEAAgE,8BAA8B,oEAAoE,sCAAsC,qDAAqD,uBAAuB,yBAAyB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,sBAAsB,oBAAoB,sBAAsB,sBAAsB,uBAAuB,uBAAuB,yBAAyB,uBAAuB,0BAA0B,wBAAwB,oBAAoB,kBAAkB,kBAAkB,8BAA8B;AAC5+F,GAAG;AACH;AACA;AACA,+BAA+B,2VAA2V,0CAA0C,8BAA8B,wCAAwC,0BAA0B,8CAA8C,sBAAsB,4BAA4B,qBAAqB,2CAA2C,kBAAkB,sCAAsC,kCAAkC,wCAAwC,yCAAyC,sCAAsC,6BAA6B,4BAA4B,iCAAiC,wDAAwD,oCAAoC,oBAAoB,4BAA4B,4BAA4B,oCAAoC,wDAAwD,6BAA6B,2GAA2G,gCAAgC,kCAAkC,sCAAsC,6CAA6C,iCAAiC,qDAAqD,4BAA4B,0BAA0B,8BAA8B,wCAAwC,sBAAsB,sBAAsB,oBAAoB,mBAAmB,uBAAuB,sCAAsC,6BAA6B,wCAAwC,kCAAkC,iEAAiE,0BAA0B,iCAAiC,4BAA4B,mEAAmE,wBAAwB,oEAAoE,yBAAyB,mEAAmE,mCAAmC,qEAAqE,yBAAyB,kEAAkE,8BAA8B,uEAAuE,sCAAsC,+DAA+D,uBAAuB,mCAAmC,mBAAmB,oBAAoB,iBAAiB,mBAAmB,sBAAsB,uBAAuB,sBAAsB,+BAA+B,uBAAuB,6BAA6B,yBAAyB,gCAAgC,0BAA0B,8BAA8B,oBAAoB,oBAAoB,kBAAkB,+BAA+B;AAC9rG,GAAG;AACH;AACA;AACA,+BAA+B,wQAAwQ,6BAA6B,8BAA8B,2BAA2B,0BAA0B,8BAA8B,sBAAsB,0BAA0B,qBAAqB,8BAA8B,kBAAkB,sBAAsB,6BAA6B,oBAAoB,iCAAiC,wBAAwB,oCAAoC,kBAAkB,4BAA4B,oBAAoB,oCAAoC,4BAA4B,6BAA6B,8CAA8C,gCAAgC,kBAAkB,sCAAsC,+BAA+B,iCAAiC,yBAAyB,4BAA4B,sBAAsB,8BAA8B,oBAAoB,sBAAsB,kBAAkB,oBAAoB,iBAAiB,uBAAuB,sBAAsB,6BAA6B,4BAA4B,kCAAkC,yCAAyC,0BAA0B,qBAAqB,4BAA4B,yBAAyB,wBAAwB,kCAAkC,yBAAyB,+BAA+B,mCAAmC,iCAAiC,yBAAyB,+BAA+B,8BAA8B,kCAAkC,sCAAsC,sCAAsC,uBAAuB,sBAAsB,mBAAmB,cAAc,iBAAiB,cAAc,sBAAsB,gBAAgB,sBAAsB,eAAe,uBAAuB,eAAe,yBAAyB,eAAe,0BAA0B,eAAe,oBAAoB,kBAAkB,kBAAkB,mBAAmB;AACtwE,GAAG;AACH;AACA;AACA,+BAA+B,oQAAoQ,yBAAyB,8BAA8B,2BAA2B,0BAA0B,2BAA2B,sBAAsB,gCAAgC,qBAAqB,uBAAuB,kBAAkB,qBAAqB,kCAAkC,wBAAwB,yCAAyC,qBAAqB,6BAA6B,kBAAkB,iCAAiC,+BAA+B,oCAAoC,qBAAqB,4BAA4B,kBAAkB,oCAAoC,wBAAwB,6BAA6B,qCAAqC,gCAAgC,kBAAkB,sCAAsC,6BAA6B,iCAAiC,sBAAsB,4BAA4B,sBAAsB,8BAA8B,qBAAqB,sBAAsB,kBAAkB,oBAAoB,eAAe,uBAAuB,qBAAqB,6BAA6B,0BAA0B,kCAAkC,qCAAqC,0BAA0B,qBAAqB,4BAA4B,4BAA4B,wBAAwB,6CAA6C,yBAAyB,0CAA0C,mCAAmC,6CAA6C,yBAAyB,0CAA0C,8BAA8B,6CAA6C,sCAAsC,wCAAwC,uBAAuB,oBAAoB,mBAAmB,eAAe,iBAAiB,eAAe,sBAAsB,gBAAgB,sBAAsB,iBAAiB,uBAAuB,kBAAkB,yBAAyB,kBAAkB,0BAA0B,mBAAmB,oBAAoB,eAAe,kBAAkB,gBAAgB;AACh6E,GAAG;AACH;AACA;AACA,+BAA+B,yWAAyW,yCAAyC,8BAA8B,qCAAqC,0BAA0B,8CAA8C,sBAAsB,mCAAmC,qBAAqB,wCAAwC,kBAAkB,iCAAiC,kCAAkC,2CAA2C,yCAAyC,2CAA2C,6BAA6B,gCAAgC,iCAAiC,iEAAiE,oCAAoC,qBAAqB,4BAA4B,gCAAgC,oCAAoC,oDAAoD,6BAA6B,sFAAsF,gCAAgC,oCAAoC,sCAAsC,kDAAkD,iCAAiC,mCAAmC,4BAA4B,8BAA8B,8BAA8B,qCAAqC,sBAAsB,qBAAqB,oBAAoB,uBAAuB,uBAAuB,iCAAiC,6BAA6B,2CAA2C,kCAAkC,sEAAsE,0BAA0B,4BAA4B,4BAA4B,wDAAwD,wBAAwB,+DAA+D,yBAAyB,uDAAuD,mCAAmC,wDAAwD,yBAAyB,sDAAsD,8BAA8B,wDAAwD,sCAAsC,yDAAyD,uBAAuB,+BAA+B,mBAAmB,iBAAiB,iBAAiB,mBAAmB,sBAAsB,qBAAqB,sBAAsB,4BAA4B,uBAAuB,6BAA6B,yBAAyB,6BAA6B,0BAA0B,8BAA8B,oBAAoB,qBAAqB,kBAAkB,kCAAkC;AAC1mG,GAAG;AACH;AACA;AACA,+BAA+B,wVAAwV,qCAAqC,8BAA8B,4CAA4C,0BAA0B,wCAAwC,sBAAsB,kCAAkC,qBAAqB,4CAA4C,kBAAkB,wCAAwC,kCAAkC,wCAAwC,yCAAyC,wCAAwC,6BAA6B,8BAA8B,iCAAiC,iEAAiE,oCAAoC,sBAAsB,4BAA4B,8BAA8B,oCAAoC,+CAA+C,6BAA6B,6GAA6G,gCAAgC,sCAAsC,sCAAsC,6CAA6C,iCAAiC,yCAAyC,4BAA4B,mCAAmC,8BAA8B,yCAAyC,sBAAsB,8BAA8B,oBAAoB,sBAAsB,uBAAuB,mCAAmC,6BAA6B,0CAA0C,kCAAkC,wEAAwE,0BAA0B,wCAAwC,4BAA4B,qEAAqE,wBAAwB,uEAAuE,yBAAyB,mEAAmE,mCAAmC,gEAAgE,yBAAyB,8DAA8D,8BAA8B,oEAAoE,sCAAsC,+DAA+D,uBAAuB,+BAA+B,mBAAmB,kBAAkB,iBAAiB,kBAAkB,sBAAsB,qBAAqB,sBAAsB,uBAAuB,uBAAuB,wBAAwB,yBAAyB,uBAAuB,0BAA0B,wBAAwB,oBAAoB,sBAAsB,kBAAkB,iCAAiC;AACzrG,GAAG;AACH;AACA;AACA,+BAA+B,6UAA6U,0CAA0C,8BAA8B,uCAAuC,0BAA0B,+CAA+C,sBAAsB,sCAAsC,qBAAqB,yCAAyC,kBAAkB,mCAAmC,kCAAkC,qCAAqC,yCAAyC,mCAAmC,6BAA6B,8BAA8B,iCAAiC,wDAAwD,oCAAoC,mBAAmB,4BAA4B,8BAA8B,oCAAoC,2CAA2C,6BAA6B,kGAAkG,gCAAgC,oCAAoC,sCAAsC,4CAA4C,iCAAiC,uCAAuC,4BAA4B,6BAA6B,8BAA8B,kCAAkC,sBAAsB,4BAA4B,oBAAoB,oBAAoB,uBAAuB,mCAAmC,6BAA6B,gDAAgD,kCAAkC,6DAA6D,0BAA0B,oCAAoC,4BAA4B,mCAAmC,wBAAwB,oEAAoE,yBAAyB,6DAA6D,mCAAmC,6DAA6D,yBAAyB,2DAA2D,8BAA8B,+DAA+D,sCAAsC,kEAAkE,uBAAuB,2BAA2B,mBAAmB,kBAAkB,iBAAiB,iBAAiB,sBAAsB,wBAAwB,sBAAsB,+BAA+B,uBAAuB,6BAA6B,yBAAyB,gCAAgC,0BAA0B,8BAA8B,oBAAoB,mBAAmB,kBAAkB,6BAA6B;AAC/kG,GAAG;AACH;AACA;AACA,+BAA+B,6WAA6W,oDAAoD,8BAA8B,wCAAwC,0BAA0B,yDAAyD,sBAAsB,wCAAwC,qBAAqB,sDAAsD,kBAAkB,iCAAiC,kCAAkC,uCAAuC,yCAAyC,yCAAyC,6BAA6B,iCAAiC,iCAAiC,qDAAqD,oCAAoC,mBAAmB,4BAA4B,iCAAiC,oCAAoC,iDAAiD,6BAA6B,+FAA+F,gCAAgC,oCAAoC,sCAAsC,+DAA+D,iCAAiC,iDAAiD,4BAA4B,2BAA2B,8BAA8B,iCAAiC,sBAAsB,oBAAoB,oBAAoB,mBAAmB,uBAAuB,iCAAiC,6BAA6B,2CAA2C,kCAAkC,kEAAkE,0BAA0B,4BAA4B,4BAA4B,4CAA4C,wBAAwB,uEAAuE,yBAAyB,gEAAgE,mCAAmC,kEAAkE,yBAAyB,kEAAkE,8BAA8B,sEAAsE,sCAAsC,0DAA0D,uBAAuB,2BAA2B,mBAAmB,iBAAiB,iBAAiB,iBAAiB,sBAAsB,qBAAqB,sBAAsB,uBAAuB,uBAAuB,wBAAwB,yBAAyB,6BAA6B,0BAA0B,8BAA8B,oBAAoB,mBAAmB,kBAAkB,2BAA2B;AAC1qG,GAAG;AACH;AACA;AACA,+BAA+B,wUAAwU,iCAAiC,8BAA8B,4CAA4C,0BAA0B,6CAA6C,sBAAsB,8BAA8B,qBAAqB,4CAA4C,kBAAkB,wCAAwC,kCAAkC,4CAA4C,yCAAyC,4CAA4C,6BAA6B,iCAAiC,iCAAiC,wDAAwD,oCAAoC,qBAAqB,4BAA4B,kCAAkC,oCAAoC,oDAAoD,6BAA6B,oHAAoH,gCAAgC,iCAAiC,sCAAsC,iDAAiD,iCAAiC,4CAA4C,4BAA4B,gCAAgC,8BAA8B,6CAA6C,sBAAsB,6BAA6B,oBAAoB,qBAAqB,uBAAuB,wCAAwC,6BAA6B,iDAAiD,kCAAkC,2EAA2E,0BAA0B,oCAAoC,4BAA4B,6DAA6D,wBAAwB,oEAAoE,yBAAyB,+DAA+D,mCAAmC,mEAAmE,yBAAyB,gEAAgE,8BAA8B,sEAAsE,sCAAsC,mEAAmE,uBAAuB,8BAA8B,mBAAmB,oBAAoB,iBAAiB,mBAAmB,sBAAsB,qBAAqB,sBAAsB,oCAAoC,uBAAuB,mCAAmC,yBAAyB,oCAAoC,0BAA0B,mCAAmC,oBAAoB,qBAAqB,kBAAkB,gCAAgC;AAC/uG,GAAG;AACH;AACA;AACA,+BAA+B,sUAAsU,iCAAiC,8BAA8B,4CAA4C,0BAA0B,yCAAyC,sBAAsB,4BAA4B,qBAAqB,2CAA2C,kBAAkB,wCAAwC,kCAAkC,2CAA2C,yCAAyC,4CAA4C,6BAA6B,iCAAiC,iCAAiC,wDAAwD,oCAAoC,qBAAqB,4BAA4B,iCAAiC,oCAAoC,oDAAoD,6BAA6B,6GAA6G,gCAAgC,oCAAoC,sCAAsC,8CAA8C,iCAAiC,6CAA6C,4BAA4B,gCAAgC,8BAA8B,4CAA4C,sBAAsB,6BAA6B,oBAAoB,qBAAqB,uBAAuB,wCAAwC,6BAA6B,oDAAoD,kCAAkC,2EAA2E,0BAA0B,qCAAqC,4BAA4B,iEAAiE,wBAAwB,sEAAsE,yBAAyB,8DAA8D,mCAAmC,gEAAgE,yBAAyB,+DAA+D,8BAA8B,qEAAqE,sCAAsC,gEAAgE,uBAAuB,8BAA8B,mBAAmB,oBAAoB,iBAAiB,mBAAmB,sBAAsB,qBAAqB,sBAAsB,oCAAoC,uBAAuB,mCAAmC,yBAAyB,oCAAoC,0BAA0B,mCAAmC,oBAAoB,qBAAqB,kBAAkB,+BAA+B;AAC7tG,GAAG;AACH;AACA;AACA,+BAA+B,4UAA4U,uCAAuC,8BAA8B,wCAAwC,0BAA0B,0CAA0C,sBAAsB,8BAA8B,qBAAqB,sCAAsC,kBAAkB,4BAA4B,kCAAkC,qCAAqC,yCAAyC,4CAA4C,6BAA6B,8BAA8B,iCAAiC,mDAAmD,oCAAoC,oBAAoB,4BAA4B,+BAA+B,oCAAoC,+CAA+C,6BAA6B,yFAAyF,gCAAgC,4BAA4B,sCAAsC,wCAAwC,iCAAiC,2CAA2C,4BAA4B,6BAA6B,8BAA8B,uCAAuC,sBAAsB,kBAAkB,oBAAoB,oBAAoB,uBAAuB,4BAA4B,6BAA6B,6CAA6C,kCAAkC,6DAA6D,0BAA0B,yBAAyB,4BAA4B,0DAA0D,wBAAwB,sEAAsE,yBAAyB,+DAA+D,mCAAmC,6DAA6D,yBAAyB,4DAA4D,8BAA8B,iEAAiE,sCAAsC,2DAA2D,uBAAuB,0BAA0B,mBAAmB,iBAAiB,iBAAiB,iBAAiB,sBAAsB,qBAAqB,sBAAsB,uBAAuB,uBAAuB,wBAAwB,yBAAyB,uBAAuB,0BAA0B,wBAAwB,oBAAoB,oBAAoB,kBAAkB,6BAA6B;AAC3gG,GAAG;AACH;AACA;AACA,+BAA+B,0UAA0U,qCAAqC,8BAA8B,qCAAqC,0BAA0B,2CAA2C,sBAAsB,iCAAiC,qBAAqB,uCAAuC,kBAAkB,+BAA+B,kCAAkC,sCAAsC,yCAAyC,wCAAwC,6BAA6B,iCAAiC,iCAAiC,qEAAqE,oCAAoC,mBAAmB,4BAA4B,gCAAgC,oCAAoC,oDAAoD,6BAA6B,sGAAsG,gCAAgC,kCAAkC,sCAAsC,8CAA8C,iCAAiC,kCAAkC,4BAA4B,gCAAgC,8BAA8B,mCAAmC,sBAAsB,yBAAyB,oBAAoB,0BAA0B,uBAAuB,gCAAgC,6BAA6B,+CAA+C,kCAAkC,6DAA6D,0BAA0B,mCAAmC,4BAA4B,mDAAmD,wBAAwB,wDAAwD,yBAAyB,kDAAkD,mCAAmC,gEAAgE,yBAAyB,mDAAmD,8BAA8B,oDAAoD,sCAAsC,2DAA2D,uBAAuB,2BAA2B,mBAAmB,sBAAsB,iBAAiB,oBAAoB,sBAAsB,0BAA0B,sBAAsB,yBAAyB,uBAAuB,0BAA0B,yBAAyB,wBAAwB,0BAA0B,yBAAyB,oBAAoB,mBAAmB,kBAAkB,iCAAiC;AACjjG,GAAG;AACH;AACA;AACA,+BAA+B,oVAAoV,uCAAuC,8BAA8B,wCAAwC,0BAA0B,8CAA8C,sBAAsB,6BAA6B,qBAAqB,0CAA0C,kBAAkB,iCAAiC,kCAAkC,wCAAwC,yCAAyC,2CAA2C,6BAA6B,6BAA6B,iCAAiC,wDAAwD,oCAAoC,mBAAmB,4BAA4B,6BAA6B,oCAAoC,8CAA8C,6BAA6B,+FAA+F,gCAAgC,iCAAiC,sCAAsC,8CAA8C,iCAAiC,yCAAyC,4BAA4B,6BAA6B,8BAA8B,6BAA6B,sBAAsB,mBAAmB,oBAAoB,qBAAqB,uBAAuB,iCAAiC,6BAA6B,sCAAsC,kCAAkC,oEAAoE,0BAA0B,8BAA8B,4BAA4B,mEAAmE,wBAAwB,2DAA2D,yBAAyB,qDAAqD,mCAAmC,uDAAuD,yBAAyB,uDAAuD,8BAA8B,yDAAyD,sCAAsC,2DAA2D,uBAAuB,2BAA2B,mBAAmB,iBAAiB,iBAAiB,kBAAkB,sBAAsB,oBAAoB,sBAAsB,uBAAuB,uBAAuB,wBAAwB,yBAAyB,uBAAuB,0BAA0B,wBAAwB,oBAAoB,mBAAmB,kBAAkB,0BAA0B;AAChhG,GAAG;AACH;AACA;AACA,+BAA+B,+VAA+V,8CAA8C,8BAA8B,mCAAmC,0BAA0B,kDAAkD,sBAAsB,kCAAkC,qBAAqB,+CAA+C,kBAAkB,iCAAiC,kCAAkC,0CAA0C,yCAAyC,kCAAkC,6BAA6B,kCAAkC,iCAAiC,iEAAiE,oCAAoC,qBAAqB,4BAA4B,kCAAkC,oCAAoC,yDAAyD,6BAA6B,qGAAqG,gCAAgC,gCAAgC,sCAAsC,kDAAkD,iCAAiC,8CAA8C,4BAA4B,8BAA8B,8BAA8B,gCAAgC,sBAAsB,sBAAsB,oBAAoB,sBAAsB,uBAAuB,iCAAiC,6BAA6B,8CAA8C,kCAAkC,iFAAiF,0BAA0B,8BAA8B,4BAA4B,uDAAuD,wBAAwB,+DAA+D,yBAAyB,0DAA0D,mCAAmC,+DAA+D,yBAAyB,2DAA2D,8BAA8B,6DAA6D,sCAAsC,4DAA4D,uBAAuB,4BAA4B,mBAAmB,mBAAmB,iBAAiB,mBAAmB,sBAAsB,qBAAqB,sBAAsB,wBAAwB,uBAAuB,yBAAyB,yBAAyB,wBAAwB,0BAA0B,yBAAyB,oBAAoB,qBAAqB,kBAAkB,+BAA+B;AAC7oG,GAAG;AACH;AACA;AACA,+BAA+B,2UAA2U,sCAAsC,8BAA8B,+CAA+C,0BAA0B,2CAA2C,sBAAsB,yBAAyB,qBAAqB,yCAAyC,kBAAkB,+BAA+B,kCAAkC,uCAAuC,yCAAyC,0CAA0C,6BAA6B,gCAAgC,iCAAiC,mEAAmE,oCAAoC,mBAAmB,4BAA4B,gCAAgC,oCAAoC,iDAAiD,6BAA6B,6FAA6F,gCAAgC,8BAA8B,sCAAsC,2CAA2C,iCAAiC,wCAAwC,4BAA4B,4BAA4B,8BAA8B,oCAAoC,sBAAsB,oBAAoB,oBAAoB,qBAAqB,uBAAuB,+BAA+B,6BAA6B,wCAAwC,kCAAkC,8DAA8D,0BAA0B,4BAA4B,4BAA4B,uCAAuC,wBAAwB,yDAAyD,yBAAyB,mDAAmD,mCAAmC,oDAAoD,yBAAyB,oDAAoD,8BAA8B,sDAAsD,sCAAsC,2DAA2D,uBAAuB,6BAA6B,mBAAmB,iBAAiB,iBAAiB,mBAAmB,sBAAsB,sBAAsB,sBAAsB,sBAAsB,uBAAuB,uBAAuB,yBAAyB,sBAAsB,0BAA0B,uBAAuB,oBAAoB,mBAAmB,kBAAkB,6BAA6B;AACt+F,GAAG;AACH;AACA;AACA,+BAA+B,wSAAwS,oCAAoC,8BAA8B,yCAAyC,0BAA0B,mDAAmD,sBAAsB,mCAAmC,qBAAqB,6CAA6C,kBAAkB,mCAAmC,6BAA6B,wCAAwC,iCAAiC,kDAAkD,oCAAoC,mBAAmB,4BAA4B,wCAAwC,oCAAoC,0DAA0D,6BAA6B,2FAA2F,gCAAgC,2BAA2B,sCAAsC,kDAAkD,iCAAiC,sCAAsC,4BAA4B,8BAA8B,8BAA8B,4CAA4C,sBAAsB,4BAA4B,oBAAoB,qBAAqB,uBAAuB,yBAAyB,6BAA6B,sDAAsD,kCAAkC,4DAA4D,0BAA0B,yCAAyC,4BAA4B,4DAA4D,wBAAwB,mEAAmE,yBAAyB,wDAAwD,mCAAmC,0DAA0D,yBAAyB,sDAAsD,8BAA8B,iEAAiE,sCAAsC,6DAA6D,uBAAuB,wBAAwB,mBAAmB,kBAAkB,iBAAiB,iBAAiB,sBAAsB,kBAAkB,sBAAsB,yBAAyB,uBAAuB,uBAAuB,yBAAyB,0BAA0B,0BAA0B,wBAAwB,oBAAoB,mBAAmB,kBAAkB,6BAA6B;AAC75F,GAAG;AACH;AACA;AACA,+BAA+B,2TAA2T,mCAAmC,8BAA8B,6CAA6C,0BAA0B,qCAAqC,sBAAsB,0BAA0B,qBAAqB,oCAAoC,kBAAkB,6BAA6B,kCAAkC,oCAAoC,yCAAyC,oCAAoC,6BAA6B,0BAA0B,iCAAiC,+CAA+C,oCAAoC,kBAAkB,4BAA4B,0BAA0B,oCAAoC,0CAA0C,6BAA6B,uGAAuG,gCAAgC,6BAA6B,sCAAsC,wCAAwC,iCAAiC,0CAA0C,4BAA4B,iCAAiC,8BAA8B,+BAA+B,sBAAsB,qBAAqB,oBAAoB,oBAAoB,uBAAuB,6BAA6B,6BAA6B,sCAAsC,kCAAkC,+DAA+D,0BAA0B,4BAA4B,4BAA4B,iEAAiE,wBAAwB,6DAA6D,yBAAyB,yDAAyD,mCAAmC,yDAAyD,yBAAyB,uDAAuD,8BAA8B,4DAA4D,sCAAsC,6DAA6D,uBAAuB,0BAA0B,mBAAmB,kBAAkB,iBAAiB,kBAAkB,sBAAsB,mBAAmB,sBAAsB,oBAAoB,uBAAuB,oBAAoB,yBAAyB,oBAAoB,0BAA0B,oBAAoB,oBAAoB,kBAAkB,kBAAkB,mCAAmC;AACl8F,GAAG;AACH;AACA;AACA,+BAA+B,uUAAuU,wCAAwC,8BAA8B,qCAAqC,0BAA0B,gDAAgD,sBAAsB,gCAAgC,qBAAqB,mCAAmC,kBAAkB,mCAAmC,kCAAkC,sCAAsC,yCAAyC,wCAAwC,6BAA6B,gCAAgC,iCAAiC,iEAAiE,oCAAoC,sBAAsB,4BAA4B,gCAAgC,oCAAoC,mDAAmD,6BAA6B,uFAAuF,gCAAgC,mCAAmC,sCAAsC,gDAAgD,iCAAiC,oCAAoC,4BAA4B,qCAAqC,8BAA8B,kCAAkC,sBAAsB,gCAAgC,oBAAoB,wBAAwB,uBAAuB,mCAAmC,6BAA6B,sDAAsD,kCAAkC,2DAA2D,0BAA0B,0CAA0C,4BAA4B,kDAAkD,wBAAwB,+DAA+D,yBAAyB,0DAA0D,mCAAmC,gEAAgE,yBAAyB,yDAAyD,8BAA8B,iEAAiE,sCAAsC,4DAA4D,uBAAuB,2BAA2B,mBAAmB,qBAAqB,iBAAiB,mBAAmB,sBAAsB,qBAAqB,sBAAsB,yBAAyB,uBAAuB,0BAA0B,yBAAyB,wBAAwB,0BAA0B,yBAAyB,oBAAoB,sBAAsB,kBAAkB,4BAA4B;AACzlG,GAAG;AACH;AACA;AACA,+BAA+B,0UAA0U,iCAAiC,8BAA8B,oCAAoC,0BAA0B,iDAAiD,sBAAsB,kCAAkC,qBAAqB,oCAAoC,kBAAkB,2BAA2B,kCAAkC,4CAA4C,yCAAyC,2CAA2C,6BAA6B,4BAA4B,iCAAiC,mDAAmD,oCAAoC,mBAAmB,4BAA4B,4BAA4B,oCAAoC,4CAA4C,6BAA6B,kGAAkG,gCAAgC,6BAA6B,sCAAsC,+DAA+D,iCAAiC,0CAA0C,4BAA4B,0BAA0B,8BAA8B,kCAAkC,sBAAsB,sBAAsB,oBAAoB,iBAAiB,uBAAuB,2BAA2B,6BAA6B,uCAAuC,kCAAkC,2DAA2D,0BAA0B,4BAA4B,4BAA4B,6DAA6D,wBAAwB,0DAA0D,yBAAyB,sDAAsD,mCAAmC,4DAA4D,yBAAyB,sDAAsD,8BAA8B,4DAA4D,sCAAsC,+DAA+D,uBAAuB,mCAAmC,mBAAmB,gBAAgB,iBAAiB,gBAAgB,sBAAsB,oBAAoB,sBAAsB,+BAA+B,uBAAuB,+BAA+B,yBAAyB,+BAA+B,0BAA0B,+BAA+B,oBAAoB,mBAAmB,kBAAkB,8BAA8B;AACjiG,GAAG;AACH;AACA;AACA,+BAA+B,kOAAkO,sBAAsB,8BAA8B,sBAAsB,0BAA0B,sBAAsB,sBAAsB,kBAAkB,qBAAqB,oBAAoB,kBAAkB,iBAAiB,kCAAkC,mBAAmB,yCAAyC,mBAAmB,6BAA6B,mBAAmB,iCAAiC,wBAAwB,oCAAoC,eAAe,4BAA4B,mBAAmB,oCAAoC,uBAAuB,6BAA6B,4BAA4B,gCAAgC,iBAAiB,sCAAsC,oBAAoB,iCAAiC,qBAAqB,4BAA4B,qBAAqB,8BAA8B,qBAAqB,sBAAsB,eAAe,oBAAoB,eAAe,uBAAuB,iBAAiB,6BAA6B,wBAAwB,kCAAkC,yBAAyB,0BAA0B,iBAAiB,4BAA4B,2BAA2B,wBAAwB,8BAA8B,yBAAyB,+BAA+B,mCAAmC,+BAA+B,yBAAyB,+BAA+B,8BAA8B,iCAAiC,sCAAsC,gCAAgC,uBAAuB,kBAAkB,mBAAmB,cAAc,iBAAiB,cAAc,sBAAsB,gBAAgB,sBAAsB,gBAAgB,uBAAuB,gBAAgB,yBAAyB,gBAAgB,0BAA0B,gBAAgB,oBAAoB,eAAe,kBAAkB,kBAAkB;AACzsE,GAAG;AACH;AACA;AACA,+BAA+B,yOAAyO,oBAAoB,8BAA8B,sBAAsB,0BAA0B,uBAAuB,sBAAsB,kBAAkB,qBAAqB,oBAAoB,kBAAkB,iBAAiB,kCAAkC,mBAAmB,yCAAyC,mBAAmB,6BAA6B,iBAAiB,iCAAiC,0BAA0B,oCAAoC,eAAe,4BAA4B,iBAAiB,oCAAoC,qBAAqB,6BAA6B,oCAAoC,gCAAgC,iBAAiB,sCAAsC,wBAAwB,iCAAiC,qBAAqB,4BAA4B,mBAAmB,8BAA8B,oBAAoB,sBAAsB,eAAe,oBAAoB,eAAe,uBAAuB,iBAAiB,6BAA6B,sBAAsB,kCAAkC,wBAAwB,0BAA0B,iBAAiB,4BAA4B,2BAA2B,wBAAwB,gCAAgC,yBAAyB,8BAA8B,mCAAmC,+BAA+B,yBAAyB,8BAA8B,8BAA8B,+BAA+B,sCAAsC,+BAA+B,uBAAuB,kBAAkB,mBAAmB,eAAe,iBAAiB,eAAe,sBAAsB,gBAAgB,sBAAsB,gBAAgB,uBAAuB,gBAAgB,yBAAyB,gBAAgB,0BAA0B,gBAAgB,oBAAoB,eAAe,kBAAkB,kBAAkB;AAChtE,GAAG;AACH;AACA;AACA,+BAA+B,oOAAoO,qBAAqB,8BAA8B,sBAAsB,0BAA0B,sBAAsB,sBAAsB,kBAAkB,qBAAqB,mBAAmB,kBAAkB,iBAAiB,kCAAkC,mBAAmB,yCAAyC,kBAAkB,6BAA6B,iBAAiB,iCAAiC,0BAA0B,oCAAoC,eAAe,4BAA4B,iBAAiB,oCAAoC,qBAAqB,6BAA6B,kCAAkC,gCAAgC,iBAAiB,sCAAsC,sBAAsB,iCAAiC,uBAAuB,4BAA4B,mBAAmB,8BAA8B,mBAAmB,sBAAsB,eAAe,oBAAoB,eAAe,uBAAuB,yBAAyB,6BAA6B,sBAAsB,kCAAkC,0BAA0B,0BAA0B,iBAAiB,4BAA4B,mBAAmB,wBAAwB,2BAA2B,yBAAyB,4BAA4B,mCAAmC,4BAA4B,yBAAyB,4BAA4B,8BAA8B,4BAA4B,sCAAsC,gCAAgC,uBAAuB,kBAAkB,mBAAmB,cAAc,iBAAiB,cAAc,sBAAsB,gBAAgB,sBAAsB,gBAAgB,uBAAuB,gBAAgB,yBAAyB,gBAAgB,0BAA0B,gBAAgB,oBAAoB,eAAe,kBAAkB,kBAAkB;AACxrE,GAAG;AACH,IAAI;AACJ;AACA,YAAY,iCAAmB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,iCAAmB;AAC7E;AACA;AACA;AACA,IAAI,iCAAmB;AACvB;AACA;AACA;AACA,KAAK,iCAAmB,aAAa,WAAW;AAChD;AACA;AACA,IAAI;AACJ;AACA,IAAI,iCAAmB;AACvB;AACA,SAAS,iCAAmB,wBAAwB,iCAAmB;AACvE,6CAA6C,wCAAwC;AACrF;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI,iCAAmB;AACvB,IAAI;AACJ;AACA,IAAI,iCAAmB;AACvB;AACA,2DAA2D,iBAAiB;AAC5E;AACA,oDAAoD,aAAa;AACjE;AACA,IAAI;AACJ,KAAK,0BAAmB;AACxB;AACA,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C,CAAC,iCAAmB,GAAG,0BAAmB;AAC1C;AACA,EAAE;AACF,mDAAmD,0CAA0C;AAC7F,6CAA6C,gBAAgB,kBAAkB,OAAO,2BAA2B,wDAAwD,gCAAgC,uDAAuD;AAChQ,+DAA+D,sEAAsE,8DAA8D;AACnM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C,yBAAyB,wBAAwB;AACjD;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,2BAA2B,2EAA2E,kCAAkC,wBAAwB,OAAO,kCAAkC,mIAAmI;AACrW;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,iCAAiC,MAAM;AACvC;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,aAAa;AACtF;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA;AACA;AACA;AACA;AACA,4EAA4E,eAAe;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,0CAA0C;AAC1G,0DAA0D,gBAAgB,kBAAkB,OAAO,2BAA2B,wDAAwD,gCAAgC,uDAAuD;AAC7Q,4EAA4E,mFAAmF,2EAA2E;AAC1O;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,EAAE;AACF;AACA;AACA,gBAAgB;AAChB,iCAAiC,2BAA2B,2EAA2E,0CAA0C,wBAAwB,OAAO,0CAA0C,mIAAmI;AAC7X;AACA;AACA;AACA;AACA;AACA,uFAAuF,EAAE;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iCAAmB;AAC3C,sBAAsB,iCAAmB;AACzC,gBAAgB,iCAAmB;AACnC,wBAAwB,iCAAmB;AAC3C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C,kBAAkB,iCAAmB;AACrC,0BAA0B,iCAAmB;AAC7C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C,mBAAmB,iCAAmB;AACtC,2BAA2B,iCAAmB;AAC9C,kBAAkB,iCAAmB;AACrC,0BAA0B,iCAAmB;AAC7C,mBAAmB,iCAAmB;AACtC,2BAA2B,iCAAmB;AAC9C,qBAAqB,iCAAmB;AACxC,6BAA6B,iCAAmB;AAChD,YAAY,iCAAmB;AAC/B,oBAAoB,iCAAmB;AACvC,gBAAgB,iCAAmB;AACnC,wBAAwB,iCAAmB;AAC3C,oBAAoB,iCAAmB;AACvC,4BAA4B,iCAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,+BAA+B;AAC/B,0CAA0C,gFAAgF,eAAe,eAAe,gBAAgB,oBAAoB,MAAM,0CAA0C,+BAA+B,aAAa,qBAAqB,uCAAuC,cAAc,WAAW,YAAY,UAAU,MAAM,mDAAmD,UAAU,sBAAsB;AAC5d,iCAAiC;AACjC,oCAAoC;AACpC,iCAAiC;AACjC,mDAAmD,gBAAgB,gEAAgE,wDAAwD,6DAA6D,sDAAsD;AAC9S,mCAAmC;AACnC,oCAAoC;AACpC,wCAAwC,uDAAuD,uCAAuC,SAAS,OAAO,oBAAoB;AAC1K;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,gBAAgB,iCAAmB;AACnC;AACA;AACA;AACA;AACA,oBAAoB,iCAAmB;AACvC;AACA;AACA,EAAE,IAAI;AACN;AACA,qCAAqC,2BAA2B,2EAA2E,8CAA8C,wBAAwB,OAAO,8CAA8C,mIAAmI;AACzY,+CAA+C;AAC/C,2CAA2C;AAC3C,+DAA+D,gBAAgB,4EAA4E,wDAAwD,6DAA6D,sDAAsD;AACtU,oDAAoD,uDAAuD,uCAAuC,SAAS,OAAO,oBAAoB;AACtL,sDAAsD,gFAAgF,eAAe,eAAe,gBAAgB,oBAAoB,MAAM,0CAA0C,+BAA+B,aAAa,qBAAqB,uCAAuC,cAAc,WAAW,YAAY,UAAU,MAAM,mDAAmD,UAAU,sBAAsB;AACxe,6CAA6C;AAC7C,4BAA4B,iCAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI;AACR;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,2DAA2D,EAAE;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,2BAA2B,2EAA2E,kDAAkD,wBAAwB,OAAO,kDAAkD,mIAAmI;AACrZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,8BAA8B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA,QAAQ;AACR;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,kBAAkB;AACvC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,0BAA0B,mBAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA,yBAAyB,sDAAsD;AAC/E;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,gCAAgC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,8BAA8B;AACrD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,8EAA8E,kBAAkB,mBAAmB;AACrL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,+BAA+B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,4CAA4C,gCAAgC,oCAAoC,oDAAoD,8DAA8D,iEAAiE,GAAG,kCAAkC;AACxU,kCAAkC,gBAAgB,sBAAsB,OAAO,uDAAuD,aAAa,uDAAuD,4CAA4C,KAAK,6CAA6C,6EAA6E,OAAO,iDAAiD,mFAAmF,OAAO;AACvgB,6CAA6C,kBAAkB,kCAAkC,oEAAoE,KAAK,OAAO,oBAAoB;AACrM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA,MAAM;AACN;AACA;AACA,6CAA6C;AAC7C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA;AACA;AACA,qBAAqB,8BAA8B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,UAAU,0BAAmB;AAC7B,GAAG;AACH;AACA,EAAE;AACF,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;UC7kIA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;ACNA;;;;;;;;;;;;;;;;CAgBC,GACiD","sources":["webpack://@adguard/api/webpack/universalModuleDefinition","webpack://@adguard/api/../tswebextension/dist/assistant-inject.js","webpack://@adguard/api/webpack/bootstrap","webpack://@adguard/api/webpack/runtime/compat get default export","webpack://@adguard/api/webpack/runtime/define property getters","webpack://@adguard/api/webpack/runtime/hasOwnProperty shorthand","webpack://@adguard/api/webpack/runtime/make namespace object","webpack://@adguard/api/./src/content-script/assistant.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","var assistant = {exports: {}};\n\n(function (module, exports) {\n\t(function webpackUniversalModuleDefinition(root, factory) {\n\t\tmodule.exports = factory();\n\t})(self, () => {\n\treturn (() => {\n\t \tvar __webpack_modules__ = ({\n\t 1503:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\tvar map = {\n\t\t\"./ar/messages.json\": 5443,\n\t\t\"./be/messages.json\": 24,\n\t\t\"./cs/messages.json\": 3337,\n\t\t\"./da/messages.json\": 7691,\n\t\t\"./de/messages.json\": 9947,\n\t\t\"./el/messages.json\": 1773,\n\t\t\"./en/messages.json\": 1272,\n\t\t\"./es/messages.json\": 8194,\n\t\t\"./fa/messages.json\": 5455,\n\t\t\"./fi/messages.json\": 6183,\n\t\t\"./fr/messages.json\": 4652,\n\t\t\"./he/messages.json\": 6514,\n\t\t\"./hi/messages.json\": 1996,\n\t\t\"./hr/messages.json\": 2178,\n\t\t\"./hu/messages.json\": 2698,\n\t\t\"./id/messages.json\": 710,\n\t\t\"./it/messages.json\": 7294,\n\t\t\"./ja/messages.json\": 9265,\n\t\t\"./ko/messages.json\": 1474,\n\t\t\"./lt/messages.json\": 8612,\n\t\t\"./nl/messages.json\": 8967,\n\t\t\"./no/messages.json\": 6251,\n\t\t\"./pl/messages.json\": 1549,\n\t\t\"./pt-PT/messages.json\": 1902,\n\t\t\"./pt/messages.json\": 9274,\n\t\t\"./ro/messages.json\": 6090,\n\t\t\"./ru/messages.json\": 3999,\n\t\t\"./sk/messages.json\": 89,\n\t\t\"./sl/messages.json\": 6058,\n\t\t\"./sr/messages.json\": 9177,\n\t\t\"./sv/messages.json\": 6105,\n\t\t\"./tr/messages.json\": 147,\n\t\t\"./uk/messages.json\": 1249,\n\t\t\"./vi/messages.json\": 4534,\n\t\t\"./zh-HK/messages.json\": 3476,\n\t\t\"./zh-TW/messages.json\": 5480,\n\t\t\"./zh/messages.json\": 8868\n\t};\n\tfunction webpackContext(req) {\n\t\tvar id = webpackContextResolve(req);\n\t\treturn __webpack_require__(id);\n\t}\n\tfunction webpackContextResolve(req) {\n\t\tif(!__webpack_require__.o(map, req)) {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t}\n\t\treturn map[req];\n\t}\n\twebpackContext.keys = function webpackContextKeys() {\n\t\treturn Object.keys(map);\n\t};\n\twebpackContext.resolve = webpackContextResolve;\n\tmodule.exports = webpackContext;\n\twebpackContext.id = 1503;\n\t }),\n\t 14:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\tfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\tfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\tfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\tfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\tfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\tvar _require = __webpack_require__(897),\n\t _require2 = _slicedToArray(_require, 1),\n\t _require2$ = _require2[0],\n\t BASE_LOCALE = _require2$.base_locale,\n\t PROJECT_ID = _require2$.project_id,\n\t LANGUAGES = _require2$.languages,\n\t LOCALIZABLE_FILES = _require2$.localizable_files;\n\tvar LOCALES_EQUIVALENTS_MAP = {\n\t 'pt-BR': 'pt',\n\t 'zh-CN': 'zh'\n\t};\n\tmodule.exports = {\n\t LOCALES_EQUIVALENTS_MAP: LOCALES_EQUIVALENTS_MAP,\n\t BASE_LOCALE: BASE_LOCALE,\n\t PROJECT_ID: PROJECT_ID,\n\t LANGUAGES: LANGUAGES,\n\t LOCALIZABLE_FILES: LOCALIZABLE_FILES\n\t};\n\t }),\n\t 4123:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(2668);\n\tvar ___CSS_LOADER_URL_IMPORT_1___ = __webpack_require__(1823);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n\texports.push([module.id, \"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\\n/**\\n * 1. Set default font family to sans-serif.\\n * 2. Prevent iOS text size adjust after orientation change, without disabling\\n * user zoom.\\n */\\nhtml {\\n font-family: sans-serif;\\n /* 1 */\\n -ms-text-size-adjust: 100%;\\n /* 2 */\\n -webkit-text-size-adjust: 100%;\\n /* 2 */\\n}\\n/**\\n * Remove default margin.\\n */\\nbody {\\n margin: 0;\\n}\\n/* HTML5 display definitions\\n========================================================================== */\\n/**\\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\\n * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\\n * Correct `block` display not defined for `main` in IE 11.\\n */\\narticle,\\naside,\\ndetails,\\nfigcaption,\\nfigure,\\nfooter,\\nheader,\\nhgroup,\\nmain,\\nnav,\\nsection,\\nsummary {\\n display: block;\\n}\\n/**\\n * 1. Correct `inline-block` display not defined in IE 8/9.\\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\\n */\\naudio,\\ncanvas,\\nprogress,\\nvideo {\\n display: inline-block;\\n /* 1 */\\n vertical-align: baseline;\\n /* 2 */\\n}\\n/**\\n * Prevent modern browsers from displaying `audio` without controls.\\n * Remove excess height in iOS 5 devices.\\n */\\naudio:not([controls]) {\\n display: none;\\n height: 0;\\n}\\n/**\\n * Address `[hidden]` styling not present in IE 8/9/10.\\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\\n */\\n[hidden],\\ntemplate {\\n display: none;\\n}\\n/* Links\\n========================================================================== */\\n/**\\n * Remove the gray background color from active links in IE 10.\\n */\\na {\\n background: transparent;\\n}\\n/**\\n * Improve readability when focused and also mouse hovered in all browsers.\\n */\\na:active,\\na:hover {\\n outline: 0;\\n}\\n/* Text-level semantics\\n========================================================================== */\\n/**\\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\\n */\\nabbr[title] {\\n border-bottom: 1px dotted;\\n}\\n/**\\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\\n */\\nb,\\nstrong {\\n font-weight: bold;\\n}\\n/**\\n * Address styling not present in Safari and Chrome.\\n */\\ndfn {\\n font-style: italic;\\n}\\n/**\\n * Address variable `h1` font-size and margin within `section` and `article`\\n * contexts in Firefox 4+, Safari, and Chrome.\\n */\\nh1 {\\n font-size: 2em;\\n margin: 0.67em 0;\\n}\\n/**\\n * Address styling not present in IE 8/9.\\n */\\nmark {\\n background: #ff0;\\n color: #000;\\n}\\n/**\\n * Address inconsistent and variable font size in all browsers.\\n */\\nsmall {\\n font-size: 80%;\\n}\\n/**\\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\\n */\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\nsup {\\n top: -0.5em;\\n}\\nsub {\\n bottom: -0.25em;\\n}\\n/* Embedded content\\n========================================================================== */\\n/**\\n * Remove border when inside `a` element in IE 8/9/10.\\n */\\nimg {\\n border: 0;\\n}\\n/**\\n * Correct overflow not hidden in IE 9/10/11.\\n */\\nsvg:not(:root) {\\n overflow: hidden;\\n}\\n/* Grouping content\\n========================================================================== */\\n/**\\n * Address margin not present in IE 8/9 and Safari.\\n */\\nfigure {\\n margin: 1em 40px;\\n}\\n/**\\n * Address differences between Firefox and other browsers.\\n */\\nhr {\\n -moz-box-sizing: content-box;\\n box-sizing: content-box;\\n height: 0;\\n}\\n/**\\n * Contain overflow in all browsers.\\n */\\npre {\\n overflow: auto;\\n}\\n/**\\n * Address odd `em`-unit font size rendering in all browsers.\\n */\\ncode,\\nkbd,\\npre,\\nsamp {\\n font-family: monospace, monospace;\\n font-size: 1em;\\n}\\n/* Forms\\n========================================================================== */\\n/**\\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\\n * styling of `select`, unless a `border` property is set.\\n */\\n/**\\n * 1. Correct color not being inherited.\\n * Known issue: affects color of disabled elements.\\n * 2. Correct font properties not being inherited.\\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\\n */\\nbutton,\\ninput,\\noptgroup,\\nselect,\\ntextarea {\\n color: inherit;\\n /* 1 */\\n font: inherit;\\n /* 2 */\\n margin: 0;\\n /* 3 */\\n}\\n/**\\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\\n */\\nbutton {\\n overflow: visible;\\n}\\n/**\\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\\n * All other form control elements do not inherit `text-transform` values.\\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\\n * Correct `select` style inheritance in Firefox.\\n */\\nbutton,\\nselect {\\n text-transform: none;\\n}\\n/**\\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\\n * and `video` controls.\\n * 2. Correct inability to style clickable `input` types in iOS.\\n * 3. Improve usability and consistency of cursor style between image-type\\n * `input` and others.\\n */\\nbutton,\\nhtml input[type=\\\"button\\\"],\\ninput[type=\\\"reset\\\"],\\ninput[type=\\\"submit\\\"] {\\n -webkit-appearance: button;\\n /* 2 */\\n cursor: pointer;\\n /* 3 */\\n}\\n/**\\n * Re-set default cursor for disabled elements.\\n */\\nbutton[disabled],\\nhtml input[disabled] {\\n cursor: default;\\n}\\n/**\\n * Remove inner padding and border in Firefox 4+.\\n */\\nbutton::-moz-focus-inner,\\ninput::-moz-focus-inner {\\n border: 0;\\n padding: 0;\\n}\\n/**\\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\\n * the UA stylesheet.\\n */\\ninput {\\n line-height: normal;\\n}\\n/**\\n * It's recommended that you don't attempt to style these elements.\\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\\n *\\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\\n * 2. Remove excess padding in IE 8/9/10.\\n */\\ninput[type=\\\"checkbox\\\"],\\ninput[type=\\\"radio\\\"] {\\n box-sizing: border-box;\\n /* 1 */\\n padding: 0;\\n /* 2 */\\n}\\n/**\\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\\n * `font-size` values of the `input`, it causes the cursor style of the\\n * decrement button to change from `default` to `text`.\\n */\\ninput[type=\\\"number\\\"]::-webkit-inner-spin-button,\\ninput[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n height: auto;\\n}\\n/**\\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\\n * (include `-moz` to future-proof).\\n */\\ninput[type=\\\"search\\\"] {\\n -webkit-appearance: textfield;\\n /* 1 */\\n -moz-box-sizing: content-box;\\n -webkit-box-sizing: content-box;\\n /* 2 */\\n box-sizing: content-box;\\n}\\n/**\\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\\n * Safari (but not Chrome) clips the cancel button when the search input has\\n * padding (and `textfield` appearance).\\n */\\ninput[type=\\\"search\\\"]::-webkit-search-cancel-button,\\ninput[type=\\\"search\\\"]::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n/**\\n * Define consistent border, margin, and padding.\\n */\\nfieldset {\\n border: 1px solid #c0c0c0;\\n margin: 0 2px;\\n padding: 0.35em 0.625em 0.75em;\\n}\\n/**\\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\\n */\\nlegend {\\n border: 0;\\n /* 1 */\\n padding: 0;\\n /* 2 */\\n}\\n/**\\n * Remove default vertical scrollbar in IE 8/9/10/11.\\n */\\ntextarea {\\n overflow: auto;\\n}\\n/**\\n * Don't inherit the `font-weight` (applied by a rule above).\\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\\n */\\noptgroup {\\n font-weight: bold;\\n}\\n/* Tables\\n========================================================================== */\\n/**\\n * Remove most spacing between table cells.\\n */\\ntable {\\n border-collapse: collapse;\\n border-spacing: 0;\\n}\\ntd,\\nth {\\n padding: 0;\\n}\\n* {\\n box-sizing: border-box;\\n}\\n*:after,\\n*:before {\\n box-sizing: border-box;\\n}\\nhtml {\\n font-size: 10px;\\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\nbody {\\n position: relative;\\n font-size: 1.3rem;\\n line-height: 1.42857143;\\n background-color: #e6e6e6;\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 400;\\n overflow-y: hidden;\\n}\\nbutton,\\ninput,\\nselect,\\ntextarea {\\n font-family: inherit;\\n font-size: inherit;\\n line-height: inherit;\\n outline: none;\\n border-radius: 0;\\n box-shadow: none;\\n}\\na {\\n color: #36ba53;\\n text-decoration: underline;\\n outline: 0;\\n}\\na:hover {\\n color: #257f39;\\n text-decoration: underline;\\n}\\nfigure {\\n margin: 0;\\n}\\nimg {\\n vertical-align: middle;\\n max-width: 100%;\\n}\\nform {\\n margin: 0;\\n}\\nfieldset {\\n padding: 0;\\n margin: 0;\\n border: 0;\\n min-width: 0;\\n}\\nlegend {\\n display: block;\\n width: 100%;\\n padding: 0;\\n margin-bottom: 1.57142857;\\n font-size: 21px;\\n line-height: inherit;\\n border: 0;\\n}\\nlabel {\\n display: inline-block;\\n}\\ninput[type=\\\"search\\\"] {\\n box-sizing: border-box;\\n}\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n display: none;\\n}\\ninput[type=\\\"file\\\"]:focus,\\ninput[type=\\\"radio\\\"]:focus,\\ninput[type=\\\"checkbox\\\"]:focus {\\n outline: thin dotted;\\n outline: 5px auto -webkit-focus-ring-color;\\n outline-offset: -2px;\\n}\\n.form-control {\\n display: block;\\n width: 100%;\\n height: 40px;\\n padding: 6px 15px 4px;\\n font-size: 14px;\\n line-height: 22px;\\n box-shadow: inset 0 3px 3px rgba(0, 0, 0, 0.04);\\n}\\n.form-control:focus {\\n border-color: #8c8c8c;\\n outline: 0;\\n}\\n.form-control::-moz-placeholder {\\n color: #777777;\\n opacity: 1;\\n}\\n.form-control:-ms-input-placeholder {\\n color: #777777;\\n}\\n.form-control::-webkit-input-placeholder {\\n color: #777777;\\n}\\n.form-control[disabled],\\n.form-control[readonly],\\nfieldset[disabled] .form-control {\\n cursor: not-allowed;\\n background-color: #fff;\\n opacity: 1;\\n}\\ntextarea.form-control {\\n height: auto;\\n}\\n/*\\n.fieldset.error{\\n .form-control{\\n border-color: @state-danger-text;\\n .placeholder(@state-danger-text);\\n }\\n}\\n*/\\ninput[type=\\\"search\\\"] {\\n -webkit-appearance: none;\\n}\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n line-height: 22px;\\n}\\n.form-group {\\n margin: 23px 0 0;\\n}\\n.form-group:first-child {\\n margin-top: 0;\\n}\\ninput[type=\\\"radio\\\"][disabled],\\ninput[type=\\\"checkbox\\\"][disabled],\\ninput[type=\\\"radio\\\"].disabled,\\ninput[type=\\\"checkbox\\\"].disabled,\\nfieldset[disabled] input[type=\\\"radio\\\"],\\nfieldset[disabled] input[type=\\\"checkbox\\\"] {\\n cursor: not-allowed;\\n}\\n@font-face {\\n font-family: 'Open Sans';\\n src: url('data:application/font-woff;base64,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') format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n\\n@font-face {\\n font-family: 'Open Sans';\\n src: url('data:application/font-woff;base64,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') format('woff');\\n font-weight: 600;\\n font-style: normal;\\n}\\n\\n@font-face {\\n font-family: 'Open Sans';\\n src: url('data:application/font-woff;base64,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') format('woff');\\n font-weight: bold;\\n font-style: normal;\\n}\\n\\n.weight-regular {\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 400;\\n}\\n.weight-medium {\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 600;\\n}\\n.weight-bold {\\n font-family: \\\"Open Sans\\\", Arial, sans-serif;\\n font-weight: 700;\\n}\\n.form-ui {\\n position: relative;\\n display: inline-block;\\n vertical-align: top;\\n margin: 0;\\n line-height: 20px;\\n font-weight: 400;\\n cursor: pointer;\\n}\\n.form-ui-control {\\n position: absolute;\\n top: -9999px;\\n left: -9999px;\\n width: 0;\\n height: 0;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n outline: 0 none;\\n}\\n.form-ui-txt {\\n position: relative;\\n display: inline-block;\\n vertical-align: top;\\n padding: 2px 0 0 30px;\\n}\\n.form-ui-txt:before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 22px;\\n height: 22px;\\n}\\n.form-ui-txt:after {\\n content: '';\\n position: absolute;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n border-radius: 50%;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:after {\\n top: 7px;\\n left: 7px;\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n}\\ninput[type=\\\"radio\\\"]:disabled + .form-ui .form-ui-txt:before {\\n background: #f2f2f2;\\n opacity: 0.6;\\n}\\ninput[type=\\\"radio\\\"]:disabled + .form-ui .form-ui-txt:after {\\n opacity: 0.6;\\n}\\ninput[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:after {\\n top: 7px;\\n left: 5px;\\n width: 13px;\\n height: 6px;\\n border-bottom: 2px solid transparent;\\n border-left: 2px solid transparent;\\n transform: rotate(-45deg);\\n}\\ninput[type=\\\"checkbox\\\"]:disabled + .form-ui .form-ui-txt:before {\\n opacity: 0.6;\\n}\\ninput[type=\\\"checkbox\\\"]:disabled + .form-ui .form-ui-txt:after {\\n opacity: 0.6;\\n}\\n.btn {\\n display: inline-block;\\n margin-bottom: 0;\\n padding: 10px 20px;\\n font-size: 13px;\\n line-height: 18px;\\n text-align: center;\\n text-decoration: none;\\n vertical-align: middle;\\n cursor: pointer;\\n background-image: none;\\n border: 1px solid transparent;\\n white-space: nowrap;\\n user-select: none;\\n}\\n.btn:hover {\\n color: #000;\\n text-decoration: none;\\n}\\n.btn:active,\\n.btn.active {\\n outline: none;\\n}\\n.btn:focus {\\n outline: none;\\n box-shadow: inset 0 0 0 1px #fff;\\n}\\n.btn[disabled],\\n.btn.disabled {\\n cursor: default;\\n box-shadow: none;\\n opacity: 0.5;\\n pointer-events: none;\\n}\\n.btn-default {\\n border-color: #58595b;\\n background: #58595b;\\n color: #fff;\\n}\\n.btn-default:hover {\\n border-color: #717275;\\n background: #717275;\\n color: #fff;\\n}\\n.btn-default.active,\\n.btn-default:active {\\n border-color: #717275;\\n background: #717275;\\n}\\n.btn-default.disabled,\\n.btn-default[disabled] {\\n border-color: #58595b;\\n background: #58595b;\\n}\\n@media (max-width: 320px) {\\n .btn-another-el {\\n font-size: 9px;\\n padding-left: 0;\\n padding-right: 0;\\n background-color: transparent;\\n border: 0;\\n color: #000;\\n }\\n .btn-another-el:hover {\\n border-color: transparent;\\n background: transparent;\\n color: #000;\\n }\\n}\\n.btn-lg {\\n font-size: 20px;\\n padding: 14px 24px 12px;\\n}\\n.btn-sm {\\n font-size: 16px;\\n padding-top: 14px;\\n padding-bottom: 14px;\\n}\\n.btn-xs {\\n font-size: 14px;\\n padding-top: 12px;\\n padding-bottom: 12px;\\n}\\n.btn-block {\\n display: block;\\n width: 100%;\\n padding-left: 0;\\n padding-right: 0;\\n}\\n.btn-block + .btn-block {\\n margin-top: 5px;\\n}\\ninput[type=\\\"submit\\\"].btn-block,\\ninput[type=\\\"reset\\\"].btn-block,\\ninput[type=\\\"button\\\"].btn-block {\\n width: 100%;\\n}\\n.btn-upload {\\n position: relative;\\n overflow: hidden;\\n}\\n.btn-upload input[type=file] {\\n position: absolute;\\n top: 0;\\n right: 0;\\n margin: 0;\\n font-size: 600%;\\n line-height: 600%;\\n width: auto;\\n height: auto;\\n opacity: 0;\\n cursor: pointer;\\n}\\n@media (prefers-color-scheme: light) {\\n body {\\n color: #282828;\\n }\\n .main {\\n background: #ffffff;\\n }\\n .main-popup__btn {\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n }\\n .main-popup__btn:hover {\\n background-color: #efefef;\\n }\\n .main-menu__btn {\\n background-color: #ffffff;\\n }\\n .main-menu__btn:hover {\\n background-color: #efefef;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #f3f3f3;\\n }\\n .main-version {\\n color: #dfdfdf;\\n }\\n .head_title {\\n color: #343434;\\n }\\n .head_text {\\n color: #343434;\\n }\\n .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom: 1px solid #36ba53;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom-color: #36ba53;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #e0dfdb;\\n background: #f4f4ef;\\n }\\n .tick {\\n border: 20px solid #ffffff;\\n border-left: 1px solid #ffffff;\\n border-right: 1px solid #ffffff;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") no-repeat 0 0 / cover;\\n opacity: 0.6;\\n }\\n .close:hover {\\n opacity: 0.8;\\n }\\n .form-control {\\n color: #343434;\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n background: #ffffff;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #36ba53;\\n background: #36ba53;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #ffffff;\\n border-left-color: #ffffff;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #e0dfdb;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #e0dfdb;\\n }\\n .btn-primary {\\n border-color: #36ba53;\\n background: #36ba53;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #30a64a;\\n background: #30a64a;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #30a64a;\\n background: #30a64a;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #30a64a;\\n background: #30a64a;\\n }\\n .btn-cancel {\\n border-color: #f3523d;\\n background: #f3523d;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #ee290f;\\n background: #ee290f;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #ee290f;\\n background: #ee290f;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #ee290f;\\n background: #ee290f;\\n }\\n .ui-slider-handle:after {\\n background: #36ba53;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #36ba53;\\n background: #36ba53;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #ffffff;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #36ba53;\\n }\\n .menu-head_title {\\n color: #343434;\\n }\\n .menu-head_text {\\n color: #343434;\\n }\\n .menu-filter_handle {\\n background: #ffffff;\\n }\\n}\\n@media (prefers-color-scheme: dark) {\\n body {\\n color: #ddd;\\n }\\n .main {\\n background: #323232;\\n }\\n .main-popup__btn {\\n background: #323232;\\n border: 1px solid #666;\\n }\\n .main-popup__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn {\\n background-color: #323232;\\n }\\n .main-menu__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #4d4d4d;\\n }\\n .main-version {\\n color: #444;\\n }\\n .head_title {\\n color: #ccc;\\n }\\n .head_text {\\n color: #ccc;\\n }\\n .element-rule_expand-link_txt {\\n color: #67B279;\\n border-bottom: 1px solid #67B279;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #4D995F;\\n border-bottom-color: #4D995F;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #444;\\n background: #555;\\n }\\n .tick {\\n border: 20px solid #323232;\\n border-left: 1px solid #323232;\\n border-right: 1px solid #323232;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") no-repeat 0 0 / cover;\\n opacity: 0.7;\\n }\\n .close:hover {\\n opacity: 1;\\n }\\n .form-control {\\n color: #ccc;\\n background: #323232;\\n border: 1px solid #666;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #666;\\n background: #323232;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #323232;\\n border-left-color: #323232;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #444;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #444;\\n }\\n .btn-primary {\\n border-color: #4D995F;\\n background: #4D995F;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #39774C;\\n background: #39774C;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-cancel {\\n border-color: #8E2C13;\\n background: #8E2C13;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #732613;\\n background: #732613;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #732613;\\n background: #732613;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #732613;\\n background: #732613;\\n }\\n .ui-slider-handle:after {\\n background: #4D995F;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #323232;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #4D995F;\\n }\\n .menu-head_title {\\n color: #ccc;\\n }\\n .menu-head_text {\\n color: #ccc;\\n }\\n .menu-filter_handle {\\n background: #323232;\\n }\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 2571:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(9053);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\texports.push([module.id, \":host {\\n display: block!important;\\n position: relative!important;\\n width: 0!important;\\n height: 0!important;\\n margin: 0!important;\\n padding: 0!important;\\n z-index: 2147483647!important;\\n}\\n:host ::after,\\n:host ::before {\\n display: none!important;\\n}\\n.adguard-assistant-button-main-logo {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") !important;\\n}\\n.adguard-alert {\\n cursor: pointer;\\n left: 0;\\n top: 0;\\n position: fixed !important;\\n z-index: 2147483647 !important;\\n width: 40px !important;\\n height: 40px !important;\\n zoom: 1 !important;\\n display: inline-block !important;\\n margin: 0 !important;\\n border: 0 !important;\\n padding: 0 !important;\\n will-change: transform;\\n opacity: 1;\\n touch-action: none;\\n -ms-touch-action: none;\\n visibility: visible !important;\\n min-height: auto !important;\\n max-height: auto !important;\\n min-width: auto !important;\\n max-width: auto !important;\\n background-size: 21px!important;\\n background-position: center center!important;\\n background-repeat: no-repeat !important;\\n background-color: #fff !important;\\n border: none !important;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3) !important;\\n border-radius: 100% !important;\\n transition: background-color 0.3s ease;\\n}\\n.adguard-alert.sg_hide_element {\\n display: none!important;\\n}\\n.adguard-alert.logo-small {\\n width: 24px !important;\\n height: 24px !important;\\n background-position: 50% 6px!important;\\n background-size: 14px!important;\\n}\\n.adguard-alert:hover {\\n background-color: #ccf0d4 !important;\\n}\\n@media print {\\n .adguard-alert {\\n display: none!important;\\n }\\n}\\n.adguard-assistant-button-right {\\n left: auto;\\n right: 0;\\n}\\n.adguard-assistant-button-left {\\n left: 0;\\n right: auto;\\n}\\n.adguard-assistant-button-top {\\n top: 0;\\n bottom: auto;\\n}\\n.adguard-assistant-button-bottom {\\n top: auto;\\n bottom: 0;\\n}\\n.adguard-assistant-button-top.adguard-assistant-button-left {\\n left: 0;\\n right: auto;\\n transform: translate3d(10px, 10px, 0);\\n}\\n.adguard-assistant-button-top.adguard-assistant-button-right {\\n left: auto;\\n right: 0;\\n transform: translate3d(-10px, 10px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-left {\\n left: 0;\\n right: auto;\\n transform: translate3d(10px, -10px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-right {\\n left: auto;\\n right: 0;\\n transform: translate3d(-10px, -10px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-respect-vk {\\n transform: translate3d(-70px, -5px, 0);\\n}\\n.adguard-assistant-button-bottom.adguard-assistant-button-respect-fb {\\n transform: translate3d(-5px, -40px, 0);\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 6469:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(8115);\n\tvar ___CSS_LOADER_URL_IMPORT_1___ = __webpack_require__(1660);\n\tvar ___CSS_LOADER_URL_IMPORT_2___ = __webpack_require__(1372);\n\tvar ___CSS_LOADER_URL_IMPORT_3___ = __webpack_require__(6112);\n\tvar ___CSS_LOADER_URL_IMPORT_4___ = __webpack_require__(9919);\n\tvar ___CSS_LOADER_URL_IMPORT_5___ = __webpack_require__(9023);\n\tvar ___CSS_LOADER_URL_IMPORT_6___ = __webpack_require__(6810);\n\tvar ___CSS_LOADER_URL_IMPORT_7___ = __webpack_require__(2307);\n\tvar ___CSS_LOADER_URL_IMPORT_8___ = __webpack_require__(7062);\n\tvar ___CSS_LOADER_URL_IMPORT_9___ = __webpack_require__(6255);\n\tvar ___CSS_LOADER_URL_IMPORT_10___ = __webpack_require__(9385);\n\tvar ___CSS_LOADER_URL_IMPORT_11___ = __webpack_require__(8225);\n\tvar ___CSS_LOADER_URL_IMPORT_12___ = __webpack_require__(6523);\n\tvar ___CSS_LOADER_URL_IMPORT_13___ = __webpack_require__(2286);\n\tvar ___CSS_LOADER_URL_IMPORT_14___ = __webpack_require__(2668);\n\tvar ___CSS_LOADER_URL_IMPORT_15___ = __webpack_require__(1823);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_6___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_7___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_7___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_8___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_8___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_9___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_9___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_10___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_10___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_11___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_11___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_12___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_12___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_13___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_13___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_14___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_14___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_15___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_15___);\n\texports.push([module.id, \".close {\\n position: absolute;\\n top: 10px;\\n right: 10px;\\n display: inline-block;\\n vertical-align: top;\\n width: 1em;\\n font-size: 12px;\\n line-height: 1;\\n cursor: pointer;\\n transition: opacity 0.3s ease;\\n}\\n.close:before {\\n content: \\\"\\\\00a0\\\";\\n}\\n@media (max-width: 320px) {\\n .close {\\n font-size: 15px;\\n top: 18px;\\n right: 14px;\\n }\\n}\\n.a-logo {\\n display: inline-block;\\n vertical-align: top;\\n width: 40px;\\n height: 40px;\\n padding: 10px 0 0;\\n font-size: 20px;\\n text-align: center;\\n border: 1px solid #cdcdcd;\\n border-radius: 50%;\\n background: #fff;\\n}\\n.a-logo__small {\\n width: 24px;\\n height: 24px;\\n font-size: 12px;\\n padding: 6px 0 0;\\n}\\n.tooltip {\\n position: relative;\\n}\\n.tooltip:before {\\n display: none;\\n content: attr(data-title);\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n width: 170px;\\n margin: 7px 0 0 -85px;\\n padding: 6px 0 5px;\\n font-size: 10px;\\n font-style: normal;\\n font-weight: 500;\\n color: #fff;\\n text-align: center;\\n white-space: nowrap;\\n border-radius: 4px;\\n background: rgba(0, 0, 0, 0.8);\\n}\\n.tooltip:after {\\n display: none;\\n content: '';\\n position: absolute;\\n top: 100%;\\n left: 50%;\\n margin: 3px 0 0 -4px;\\n border-bottom: 4px solid rgba(0, 0, 0, 0.8);\\n border-left: 4px solid transparent;\\n border-right: 4px solid transparent;\\n}\\n.tooltip:hover:before,\\n.tooltip:hover:after {\\n display: block;\\n}\\n.main {\\n position: relative;\\n}\\n.head {\\n padding: 18px 20px;\\n cursor: move;\\n}\\n.head_title {\\n font-size: 16px;\\n font-weight: 700;\\n}\\n.head_text {\\n margin: 4px 0 0;\\n font-size: 12px;\\n}\\n.foot {\\n padding: 20px;\\n}\\n.foot_action {\\n float: right;\\n}\\n.foot_action_btn {\\n font-size: 0;\\n}\\n.foot_action_btn .btn + .btn {\\n margin-left: 10px;\\n}\\n.foot .cf {\\n clear: right;\\n}\\n.element-rule {\\n padding: 20px;\\n}\\n.element-rule_slider {\\n margin: 5px 0 7px;\\n user-select: none;\\n}\\n@media (max-width: 320px) {\\n .element-rule_slider {\\n display: none;\\n }\\n}\\n.element-rule_expand-link {\\n font-size: 12px;\\n line-height: 15px;\\n font-weight: 500;\\n cursor: pointer;\\n}\\n.element-rule_expand-link_txt {\\n display: inline-block;\\n vertical-align: top;\\n}\\n.element-rule_expand-link_arr {\\n display: inline-block;\\n vertical-align: top;\\n width: 5px;\\n height: 5px;\\n margin: 3px 0 0 3px;\\n border-bottom: 1px solid #91a795;\\n border-left: 1px solid #91a795;\\n transform: rotate(-45deg);\\n transition: 0.2s;\\n}\\n.element-rule_expand-link.active .element-rule_expand-link_arr {\\n margin-top: 5px;\\n transform: rotate(-225deg);\\n}\\n.element-rule_form {\\n height: 0;\\n margin: 0 -20px;\\n overflow: hidden;\\n}\\n.element-rule_form.open {\\n height: auto;\\n margin-bottom: -20px;\\n}\\n@media (max-width: 320px) {\\n .element-rule_form.open {\\n padding: 20px;\\n padding-top: 0;\\n }\\n}\\n.element-rule_form-cont {\\n margin: 4px 0 0;\\n padding: 20px;\\n}\\n@media (max-width: 320px) {\\n .element-rule_form-cont {\\n margin-top: 0;\\n }\\n}\\n.element-rule_fieldset {\\n margin: 10px 0 0;\\n}\\n.element-rule_fieldset:first-child {\\n margin: 0;\\n}\\n.element-rule_more--mobile {\\n display: none;\\n}\\n@media (max-width: 320px) {\\n .element-rule_more--mobile {\\n display: block;\\n }\\n .element-rule_more--mobile .element-rule_expand-link {\\n display: none;\\n }\\n .element-rule_more--mobile #adg-cancel {\\n width: 106px;\\n padding: 10px 7px;\\n }\\n .element-rule_more--mobile #adg-accept {\\n padding: 10px 6px;\\n }\\n}\\n.adg-slide {\\n position: relative;\\n width: 500px;\\n height: 44px;\\n margin: auto;\\n transform: translate3d(0, 0, 0);\\n}\\n.adg-slide-clue-min,\\n.adg-slide-clue-max {\\n position: absolute;\\n top: 14px;\\n left: -40px;\\n width: 30px;\\n font-size: 12px;\\n font-weight: 500;\\n color: #8f9b92;\\n cursor: pointer;\\n}\\n.adg-slide-clue-min {\\n left: auto;\\n right: -40px;\\n text-align: right;\\n}\\n.adg-slide-btns {\\n display: none;\\n}\\n.adg-slide-btn {\\n position: relative;\\n width: 36px;\\n height: 36px;\\n border: 2px solid #e2e2e2;\\n border-radius: 2px;\\n}\\n.adg-slide-btn:after {\\n content: \\\"\\\";\\n position: absolute;\\n left: 8px;\\n top: 15.3px;\\n width: 18px;\\n height: 2px;\\n background-color: #4e4e4e;\\n border-radius: 2px;\\n}\\n.adg-slide-btn--plus {\\n margin-left: 9px;\\n}\\n.adg-slide-btn--plus:before {\\n content: \\\"\\\";\\n position: absolute;\\n left: 16px;\\n top: 8px;\\n height: 17px;\\n width: 2px;\\n background-color: #4e4e4e;\\n border-radius: 2px;\\n}\\n.ui-slider-handle {\\n position: absolute;\\n top: 22px;\\n z-index: 2;\\n cursor: pointer;\\n}\\n.ui-slider-handle:before {\\n content: '';\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 30px;\\n height: 30px;\\n margin: -15px 0 0 -15px;\\n background: rgba(0, 0, 0, 0.1);\\n border-radius: 50%;\\n transition: 0.2s;\\n}\\n.ui-slider-handle:after {\\n content: '';\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 20px;\\n height: 20px;\\n margin: -10px 0 0 -10px;\\n border-radius: 50%;\\n}\\n.ui-slider-handle:hover:active,\\n.ui-slider-handle:hover:before {\\n background: rgba(0, 0, 0, 0.15);\\n}\\n.tick {\\n position: absolute;\\n height: 44px;\\n}\\n.settings_fieldset {\\n padding: 20px;\\n}\\n.settings_fieldset:first-child {\\n border: 0;\\n}\\n.settings_fieldset_lbl {\\n float: left;\\n width: 126px;\\n margin: 1px 0 0;\\n font-weight: 500;\\n}\\n.settings_fieldset_lbl__pos {\\n margin-top: 21px;\\n}\\n.settings_fieldset_val {\\n margin: 0 0 0 126px;\\n}\\n.choice-size {\\n position: relative;\\n font-size: 14px;\\n}\\n.choice-size_field {\\n margin: 10px 0 0;\\n}\\n.choice-size_field:first-child {\\n margin: 0;\\n}\\n.choice-size_logo {\\n display: none;\\n position: absolute;\\n top: 10px;\\n right: 15px;\\n width: 40px;\\n height: 40px;\\n background-size: 21px;\\n background-position: 50% 11px;\\n background-repeat: no-repeat;\\n background-color: #fff;\\n border: none ;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n border-radius: 100% ;\\n}\\n.choice-size_logo.logo__small {\\n top: 15px;\\n right: 20px;\\n width: 24px;\\n height: 24px;\\n background-position: 50% 6px;\\n background-size: 14px;\\n}\\n.choice-size_input:checked ~ .choice-size_logo {\\n display: block;\\n}\\n[class^=\\\"s-position-arr-\\\"] {\\n display: block;\\n width: 11px;\\n height: 11px;\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") no-repeat;\\n background-size: 44px 22px;\\n}\\n.s-position-arr-top-left {\\n background-position: 0 0;\\n}\\n.s-position-arr-top-right {\\n background-position: -11px 0;\\n}\\n.s-position-arr-bottom-left {\\n background-position: 0 -11px;\\n}\\n.s-position-arr-bottom-right {\\n background-position: -11px -11px;\\n}\\n.change-position {\\n position: relative;\\n display: inline-block;\\n vertical-align: top;\\n width: 70px;\\n margin: -3px 0 0 -3px;\\n}\\n.change-position_i {\\n float: left;\\n margin: 3px 0 0 3px;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-top-left {\\n background-position: -22px 0;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-top-right {\\n background-position: -33px 0;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-bottom-left {\\n background-position: -22px -11px;\\n}\\n.change-position_input:checked + .change-position_label .s-position-arr-bottom-right {\\n background-position: -33px -11px;\\n}\\n.change-position_input:checked ~ .change-position_val {\\n display: block;\\n}\\n.change-position_label {\\n display: block;\\n width: 32px;\\n height: 32px;\\n margin: 0;\\n padding: 9px 0 0 9px;\\n border: 1px solid #dfdedb;\\n cursor: pointer;\\n}\\n.change-position_val {\\n display: none;\\n position: absolute;\\n top: 27px;\\n left: 82px;\\n font-size: 12px;\\n white-space: nowrap;\\n}\\n.position-save .position-save_field {\\n margin-bottom: 10px;\\n}\\n.wot-indicator {\\n display: inline-block;\\n vertical-align: top;\\n margin-right: 5px;\\n}\\n#WotDescriptionText {\\n white-space: pre-line;\\n}\\n#WotDescriptionText #WotLogo {\\n cursor: pointer;\\n}\\n.adg-wot {\\n width: 18px;\\n height: 18px;\\n display: block;\\n border: 5px solid #000;\\n border-radius: 50%;\\n}\\n.adg-wot-unknown {\\n border-color: #ccc;\\n}\\n.adg-wot-red {\\n border-color: #b60000;\\n}\\n.adg-wot-lightRed {\\n border-color: #f21800;\\n}\\n.adg-wot-yellow {\\n border-color: #fac000;\\n}\\n.adg-wot-lightGreen {\\n border-color: #69d225;\\n}\\n.adg-wot-green {\\n border-color: #00ae17;\\n}\\n.adg-wot-confidence {\\n width: 52px;\\n height: 18px;\\n display: inline-block;\\n vertical-align: middle;\\n}\\n.adg-wot-confidence-0 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \");\\n}\\n.adg-wot-confidence-1 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \");\\n}\\n.adg-wot-confidence-2 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \");\\n}\\n.adg-wot-confidence-3 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \");\\n}\\n.adg-wot-confidence-4 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \");\\n}\\n.adg-wot-confidence-5 {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \");\\n}\\n.confidence-indication,\\n.wot-indicator {\\n text-decoration: none;\\n vertical-align: middle;\\n}\\n.confidence-indication:hover,\\n.wot-indicator:hover {\\n text-decoration: none;\\n}\\n.confidence-indication {\\n display: inline-block;\\n margin-right: 10px;\\n}\\n.wot-logo {\\n display: inline-block;\\n vertical-align: top;\\n width: 31px;\\n height: 12px;\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \") no-repeat 0 0 / cover;\\n margin-top: 3px;\\n}\\n.wot-hide {\\n display: none;\\n}\\niframe#adguard-assistant-dialog {\\n position: fixed;\\n clip: auto;\\n border-radius: 3px;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n z-index: 2147483647;\\n display: block!important;\\n}\\n.sg_hide_element {\\n display: none!important;\\n}\\nimg.adguard_sg_selected {\\n border: 5px solid #0F0 !important;\\n}\\n#_sg_div.sg_top {\\n top: 5px !important;\\n}\\n#_sg_div.sg_bottom {\\n bottom: 5px !important;\\n}\\n#_sg_div input {\\n margin-right: 10px !important;\\n font-size: 15px !important;\\n}\\n#_sg_path_field {\\n width: 400px !important;\\n}\\n#_sg_div .sg_new_line {\\n clear: both !important;\\n}\\n#_sg_div .sg_option {\\n float: left !important;\\n}\\n#_sg_div .adguard_sg_selected_option {\\n text-decoration: underline;\\n}\\n.adguard-placeholder {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OUM5OUE4MEZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OUM5OUE4MUZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5Qzk5QTdFRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5Qzk5QTdGRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9rJm9wAAAAZQTFRF2+7g1OfZ+LX/EgAAACtJREFUeNpiYIQABhhA5TIyoHIhfCS1DKhcEB/FJAZG7AYzoNlLLy5AgAEAMigAar6TcqkAAAAASUVORK5CYII=);\\n}\\n.adguard-placeholder-icon {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAwCAYAAAB9sggoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpENkNBQTNGMkZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpENkNBQTNGM0ZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ2Q0FBM0YwRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ2Q0FBM0YxRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+49sbDwAAAl9JREFUeNrMmE0o5VEYxq9vJmpI2SBZjCSNKKGwkDE0m8mg2QwzEtkNCeUjGyVhYTbTUIZEMWmkbCVlw9QkG4mammbK5zAWuLqek3ch3W7v+Z8P/7d+u/cczz3neM7zP0Htg12eR6wUkA+eg2yQDOLAYegjiIkEr0AjyAPRfnp8toW9Be20QoHKa0tYEhgCVdwBNoQVgCmQKjPItLAKMAtiZAeaFFYM5sATJ4ODDYl6BuadijIlLAJMgHiFOWJMbGUfmaZsHYN98Bvs6haWA1olx2yCMfAd/DF1+Psl5rwGPWAYXJn8r3wNXjB7L0ENrZLRwy/m6ZDorw8kSqewUpDL7P0Epm3YRRBoYfbugW5bPpZDK8apTnBqS9h7WjWOLXyz5fxPQSWjz0dWcmPrEhdJNIEprIlW198Z7aUV1SasQWJnAp3Dzw+FqWxlOmV2HeXVecbegHBTYS5YYVy1yejrVJhIpxluFPaB6V1WhSWQTXjcJqyKjFVnhagabBhFFk7tgnPmlp+oChNbmMXM70XgL3Nen6qwj8y+xfv53fQZKweFzN5xW4c/Cgwwe9fAui1hIuBlMntHZOKNirAyiQ+NLbBkw8fEE9IM2QSnBv19I+oWVguWQSxzrnX6EVrqoV2I15kS0AxeSszjo+326hQm3hoSQRqR6mCeL2BV5x0VSjYQojDHNmgzcYn/Uxj/H9SBM7fkMQ951Tuw4aageEMpY8FUHnPy+XZECXbRTUFxhezEqCiZFfsFRnXdg1xhgcT9BF/BJG2htRKiDjx376EX9Md36HoR/NDp5jJ1K8AAcQBmooZhTgQAAAAASUVORK5CYII=);\\n background-position: center center;\\n background-repeat: no-repeat;\\n height: 100%;\\n}\\n.adguard-placeholder-domain {\\n background: #778b7c;\\n color: #ffffff;\\n left: 0;\\n top: 0;\\n padding: 2px 4px;\\n position: relative;\\n}\\n@media print {\\n .adguard-alert,\\n #adguard-assistant-dialog {\\n display: none!important;\\n opacity: 0!important;\\n visibility: hidden!important;\\n }\\n}\\n.menu-head {\\n padding: 18px 20px;\\n cursor: move;\\n touch-action: none;\\n -ms-touch-action: none;\\n}\\n.menu-head_title {\\n font-size: 16px;\\n font-weight: 700;\\n}\\n.menu-head_name {\\n display: inline-block;\\n vertical-align: top;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n white-space: nowrap;\\n max-width: 260px;\\n line-height: 26px;\\n margin: 0 10px 5px 0;\\n}\\n.menu-head_text {\\n margin: 4px 10px 0 0;\\n font-size: 12px;\\n}\\n.menu-filter {\\n width: 100%;\\n display: table;\\n padding: 20px;\\n}\\n.menu-filter_lbl {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.menu-filter_val {\\n display: table-cell;\\n vertical-align: middle;\\n}\\n.menu-filter_label {\\n position: relative;\\n width: 30px;\\n height: 12px;\\n border-radius: 25px;\\n background-color: #ed7865;\\n cursor: pointer;\\n transition: all 0.3s ease;\\n float: right;\\n}\\n.menu-filter_label:after {\\n content: \\\"\\\";\\n cursor: pointer;\\n border-radius: 100%;\\n position: absolute;\\n left: -3px;\\n top: -4px;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n width: 20px;\\n height: 20px;\\n background-color: #e85037;\\n transition: all 0.3s ease;\\n}\\n.menu-filter_handle {\\n position: absolute;\\n width: 20px;\\n height: 20px;\\n top: 1px;\\n left: 1px;\\n border-radius: 4px;\\n}\\n.menu-filter_input:checked + .menu-filter_label {\\n background-color: #bde5c1;\\n}\\n.menu-filter_input:checked + .menu-filter_label:after {\\n left: 12px;\\n background-color: #68bc72;\\n}\\n.menu__btn {\\n position: relative;\\n cursor: pointer;\\n line-height: 45px;\\n height: 45px;\\n background-repeat: no-repeat;\\n background-position: 20px 50%;\\n transition: 0.3s ease;\\n padding: 0 20px 0 60px;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.menu__btn:hover {\\n background-color: rgba(104, 188, 113, 0.2);\\n}\\n.menu__btn--clock {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \");\\n background-size: 16px 19px;\\n}\\n.menu__btn--landscape {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_9___ + \");\\n background-size: 19px 17px;\\n}\\n.menu__btn--report {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_10___ + \");\\n background-size: 16px 17px;\\n}\\n.menu__btn--security {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_11___ + \");\\n background-size: 15px 16px;\\n}\\n.menu__btn--extensions {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_12___ + \");\\n background-size: 18px;\\n}\\n.menu__btn--settings {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_13___ + \");\\n background-size: 19px;\\n}\\n.menu__btn.hidden {\\n display: none;\\n}\\nbody {\\n color: #282828;\\n}\\n.main {\\n background: #ffffff;\\n}\\n.main-popup__btn {\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\n.main-popup__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn {\\n background-color: #ffffff;\\n}\\n.main-menu__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn:active,\\n.main-menu__btn.active {\\n background-color: #f3f3f3;\\n}\\n.main-version {\\n color: #dfdfdf;\\n}\\n.head_title {\\n color: #343434;\\n}\\n.head_text {\\n color: #343434;\\n}\\n.element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom: 1px solid #36ba53;\\n}\\n.element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom-color: #36ba53;\\n}\\n.element-rule_form-cont {\\n border-top: 1px solid #e0dfdb;\\n background: #f4f4ef;\\n}\\n.tick {\\n border: 20px solid #ffffff;\\n border-left: 1px solid #ffffff;\\n border-right: 1px solid #ffffff;\\n}\\n.close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_14___ + \") no-repeat 0 0 / cover;\\n opacity: 0.6;\\n}\\n.close:hover {\\n opacity: 0.8;\\n}\\n.form-control {\\n color: #343434;\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\ninput[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n background: #ffffff;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #ffffff;\\n border-left-color: #ffffff;\\n}\\n.menu,\\n.menu-filter,\\n.content,\\n.foot {\\n border-top: 1px solid #e0dfdb;\\n}\\n.settings_fieldset {\\n border-top: 1px solid #e0dfdb;\\n}\\n.btn-primary {\\n border-color: #36ba53;\\n background: #36ba53;\\n color: #fff;\\n}\\n.btn-primary:hover {\\n border-color: #30a64a;\\n background: #30a64a;\\n color: #fff;\\n}\\n.btn-primary.active,\\n.btn-primary:active {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-primary.disabled,\\n.btn-primary[disabled] {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-cancel {\\n border-color: #f3523d;\\n background: #f3523d;\\n color: #fff;\\n}\\n.btn-cancel:hover {\\n border-color: #ee290f;\\n background: #ee290f;\\n color: #fff;\\n}\\n.btn-cancel.active,\\n.btn-cancel:active {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.btn-cancel.disabled,\\n.btn-cancel[disabled] {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.ui-slider-handle:after {\\n background: #36ba53;\\n}\\n.change-position_input:checked + .change-position_label {\\n border-color: #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #ffffff;\\n}\\ninput[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #36ba53;\\n}\\n.menu-head_title {\\n color: #343434;\\n}\\n.menu-head_text {\\n color: #343434;\\n}\\n.menu-filter_handle {\\n background: #ffffff;\\n}\\n@media (prefers-color-scheme: dark) {\\n body {\\n color: #ddd;\\n }\\n .main {\\n background: #323232;\\n }\\n .main-popup__btn {\\n background: #323232;\\n border: 1px solid #666;\\n }\\n .main-popup__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn {\\n background-color: #323232;\\n }\\n .main-menu__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #4d4d4d;\\n }\\n .main-version {\\n color: #444;\\n }\\n .head_title {\\n color: #ccc;\\n }\\n .head_text {\\n color: #ccc;\\n }\\n .element-rule_expand-link_txt {\\n color: #67B279;\\n border-bottom: 1px solid #67B279;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #4D995F;\\n border-bottom-color: #4D995F;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #444;\\n background: #555;\\n }\\n .tick {\\n border: 20px solid #323232;\\n border-left: 1px solid #323232;\\n border-right: 1px solid #323232;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_15___ + \") no-repeat 0 0 / cover;\\n opacity: 0.7;\\n }\\n .close:hover {\\n opacity: 1;\\n }\\n .form-control {\\n color: #ccc;\\n background: #323232;\\n border: 1px solid #666;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #666;\\n background: #323232;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #323232;\\n border-left-color: #323232;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #444;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #444;\\n }\\n .btn-primary {\\n border-color: #4D995F;\\n background: #4D995F;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #39774C;\\n background: #39774C;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-cancel {\\n border-color: #8E2C13;\\n background: #8E2C13;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #732613;\\n background: #732613;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #732613;\\n background: #732613;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #732613;\\n background: #732613;\\n }\\n .ui-slider-handle:after {\\n background: #4D995F;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #323232;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #4D995F;\\n }\\n .menu-head_title {\\n color: #ccc;\\n }\\n .menu-head_text {\\n color: #ccc;\\n }\\n .menu-filter_handle {\\n background: #323232;\\n }\\n}\\n:host {\\n display: block!important;\\n position: relative!important;\\n width: 0!important;\\n height: 0!important;\\n margin: 0!important;\\n padding: 0!important;\\n z-index: 2147483647!important;\\n}\\n:host ::after,\\n:host ::before {\\n display: none!important;\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 817:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\tvar ___CSS_LOADER_GET_URL_IMPORT___ = __webpack_require__(1667);\n\tvar ___CSS_LOADER_URL_IMPORT_0___ = __webpack_require__(2668);\n\tvar ___CSS_LOADER_URL_IMPORT_1___ = __webpack_require__(1823);\n\tvar ___CSS_LOADER_URL_IMPORT_2___ = __webpack_require__(9053);\n\tvar ___CSS_LOADER_URL_IMPORT_3___ = __webpack_require__(8269);\n\tvar ___CSS_LOADER_URL_IMPORT_4___ = __webpack_require__(2834);\n\tvar ___CSS_LOADER_URL_IMPORT_5___ = __webpack_require__(9713);\n\tvar ___CSS_LOADER_URL_IMPORT_6___ = __webpack_require__(7693);\n\tvar ___CSS_LOADER_URL_IMPORT_7___ = __webpack_require__(6265);\n\tvar ___CSS_LOADER_URL_IMPORT_8___ = __webpack_require__(1109);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_6___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_7___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_7___);\n\tvar ___CSS_LOADER_URL_REPLACEMENT_8___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_8___);\n\texports.push([module.id, \":host {\\n display: block!important;\\n position: relative!important;\\n width: 0!important;\\n height: 0!important;\\n margin: 0!important;\\n padding: 0!important;\\n z-index: 2147483647!important;\\n}\\n:host ::after,\\n:host ::before {\\n display: none!important;\\n}\\nbody {\\n color: #282828;\\n}\\n.main {\\n background: #ffffff;\\n}\\n.main-popup__btn {\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\n.main-popup__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn {\\n background-color: #ffffff;\\n}\\n.main-menu__btn:hover {\\n background-color: #efefef;\\n}\\n.main-menu__btn:active,\\n.main-menu__btn.active {\\n background-color: #f3f3f3;\\n}\\n.main-version {\\n color: #dfdfdf;\\n}\\n.head_title {\\n color: #343434;\\n}\\n.head_text {\\n color: #343434;\\n}\\n.element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom: 1px solid #36ba53;\\n}\\n.element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #36ba53;\\n border-bottom-color: #36ba53;\\n}\\n.element-rule_form-cont {\\n border-top: 1px solid #e0dfdb;\\n background: #f4f4ef;\\n}\\n.tick {\\n border: 20px solid #ffffff;\\n border-left: 1px solid #ffffff;\\n border-right: 1px solid #ffffff;\\n}\\n.close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") no-repeat 0 0 / cover;\\n opacity: 0.6;\\n}\\n.close:hover {\\n opacity: 0.8;\\n}\\n.form-control {\\n color: #343434;\\n background: #ffffff;\\n border: 1px solid #cfcfcf;\\n}\\ninput[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #cfcfcf;\\n background: #ffffff;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #ffffff;\\n border-left-color: #ffffff;\\n}\\n.menu,\\n.menu-filter,\\n.content,\\n.foot {\\n border-top: 1px solid #e0dfdb;\\n}\\n.settings_fieldset {\\n border-top: 1px solid #e0dfdb;\\n}\\n.btn-primary {\\n border-color: #36ba53;\\n background: #36ba53;\\n color: #fff;\\n}\\n.btn-primary:hover {\\n border-color: #30a64a;\\n background: #30a64a;\\n color: #fff;\\n}\\n.btn-primary.active,\\n.btn-primary:active {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-primary.disabled,\\n.btn-primary[disabled] {\\n border-color: #30a64a;\\n background: #30a64a;\\n}\\n.btn-cancel {\\n border-color: #f3523d;\\n background: #f3523d;\\n color: #fff;\\n}\\n.btn-cancel:hover {\\n border-color: #ee290f;\\n background: #ee290f;\\n color: #fff;\\n}\\n.btn-cancel.active,\\n.btn-cancel:active {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.btn-cancel.disabled,\\n.btn-cancel[disabled] {\\n border-color: #ee290f;\\n background: #ee290f;\\n}\\n.ui-slider-handle:after {\\n background: #36ba53;\\n}\\n.change-position_input:checked + .change-position_label {\\n border-color: #36ba53;\\n background: #36ba53;\\n}\\ninput[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #ffffff;\\n}\\ninput[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #36ba53;\\n}\\n.menu-head_title {\\n color: #343434;\\n}\\n.menu-head_text {\\n color: #343434;\\n}\\n.menu-filter_handle {\\n background: #ffffff;\\n}\\n@media (prefers-color-scheme: dark) {\\n body {\\n color: #ddd;\\n }\\n .main {\\n background: #323232;\\n }\\n .main-popup__btn {\\n background: #323232;\\n border: 1px solid #666;\\n }\\n .main-popup__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn {\\n background-color: #323232;\\n }\\n .main-menu__btn:hover {\\n background-color: #555555;\\n }\\n .main-menu__btn:active,\\n .main-menu__btn.active {\\n background-color: #4d4d4d;\\n }\\n .main-version {\\n color: #444;\\n }\\n .head_title {\\n color: #ccc;\\n }\\n .head_text {\\n color: #ccc;\\n }\\n .element-rule_expand-link_txt {\\n color: #67B279;\\n border-bottom: 1px solid #67B279;\\n }\\n .element-rule_expand-link:hover .element-rule_expand-link_txt {\\n color: #4D995F;\\n border-bottom-color: #4D995F;\\n }\\n .element-rule_form-cont {\\n border-top: 1px solid #444;\\n background: #555;\\n }\\n .tick {\\n border: 20px solid #323232;\\n border-left: 1px solid #323232;\\n border-right: 1px solid #323232;\\n }\\n .close {\\n background: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") no-repeat 0 0 / cover;\\n opacity: 0.7;\\n }\\n .close:hover {\\n opacity: 1;\\n }\\n .form-control {\\n color: #ccc;\\n background: #323232;\\n border: 1px solid #666;\\n }\\n input[type=\\\"checkbox\\\"] + .form-ui .form-ui-txt:before {\\n border: 1px solid #666;\\n background: #323232;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:before {\\n border: 1px solid #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"checkbox\\\"]:checked + .form-ui .form-ui-txt:after {\\n border-bottom-color: #323232;\\n border-left-color: #323232;\\n }\\n .menu,\\n .menu-filter,\\n .content,\\n .foot {\\n border-top: 1px solid #444;\\n }\\n .settings_fieldset {\\n border-top: 1px solid #444;\\n }\\n .btn-primary {\\n border-color: #4D995F;\\n background: #4D995F;\\n color: #fff;\\n }\\n .btn-primary:hover {\\n border-color: #39774C;\\n background: #39774C;\\n color: #fff;\\n }\\n .btn-primary.active,\\n .btn-primary:active {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-primary.disabled,\\n .btn-primary[disabled] {\\n border-color: #39774C;\\n background: #39774C;\\n }\\n .btn-cancel {\\n border-color: #8E2C13;\\n background: #8E2C13;\\n color: #fff;\\n }\\n .btn-cancel:hover {\\n border-color: #732613;\\n background: #732613;\\n color: #fff;\\n }\\n .btn-cancel.active,\\n .btn-cancel:active {\\n border-color: #732613;\\n background: #732613;\\n }\\n .btn-cancel.disabled,\\n .btn-cancel[disabled] {\\n border-color: #732613;\\n background: #732613;\\n }\\n .ui-slider-handle:after {\\n background: #4D995F;\\n }\\n .change-position_input:checked + .change-position_label {\\n border-color: #4D995F;\\n background: #4D995F;\\n }\\n input[type=\\\"radio\\\"] + .form-ui .form-ui-txt:before {\\n background: #323232;\\n }\\n input[type=\\\"radio\\\"]:checked + .form-ui .form-ui-txt:after {\\n background: #4D995F;\\n }\\n .menu-head_title {\\n color: #ccc;\\n }\\n .menu-head_text {\\n color: #ccc;\\n }\\n .menu-filter_handle {\\n background: #323232;\\n }\\n}\\nbody {\\n padding: 1vw;\\n background: transparent;\\n}\\n.main {\\n position: relative;\\n padding: 8vw 3vw;\\n}\\n.main .footer {\\n letter-spacing: 3vw;\\n}\\n.main-version {\\n position: absolute;\\n bottom: 0;\\n right: 7px;\\n font-size: 5vw;\\n}\\n.main-popup {\\n text-align: center;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n margin: 5vw;\\n box-shadow: 0 0px 5vw 0 rgba(0, 0, 0, 0.2);\\n}\\n.main-popup__logo {\\n width: 11vw;\\n height: 11vw;\\n}\\n.main-popup__logo.adguard-assistant-button-main-logo {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \");\\n background-repeat: no-repeat;\\n}\\n.main-popup__title {\\n font-size: 6vw;\\n margin: 3vw 0;\\n}\\n.main-popup__content {\\n font-size: 5vw;\\n padding: 0 3vw;\\n margin-bottom: 5vw;\\n border-top: none;\\n}\\n.main-popup__btn {\\n font-size: 5vw;\\n padding: 2vh 8vw;\\n border-radius: 3px;\\n letter-spacing: normal;\\n}\\n.main-popup__btn--green {\\n color: #ffffff;\\n border: 1px solid #66B574;\\n background-color: #66B574;\\n box-shadow: none;\\n}\\n.main-popup__btn--green:hover {\\n background-color: #5ea76b;\\n color: #fff;\\n}\\n.main-popup__btn:focus {\\n box-shadow: none;\\n}\\n.main-menu {\\n margin: 4vw;\\n padding: 4vw;\\n display: flex;\\n justify-content: space-between;\\n border-radius: 4vw;\\n box-shadow: 0 0 4vw -2px rgba(0, 0, 0, 0.3);\\n}\\n.main-menu__info {\\n width: 100%;\\n text-align: center;\\n}\\n.main-menu__btn {\\n border: 0;\\n font-size: 0;\\n width: 12vw;\\n height: 12vw;\\n border-radius: 2vw;\\n background-repeat: no-repeat;\\n background-position: 50%;\\n background-size: 100%;\\n position: relative;\\n}\\n.main-menu__btn:disabled {\\n opacity: 0.5;\\n pointer-events: none;\\n}\\n.main-menu__btn--accept {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \");\\n}\\n.main-menu__btn--preview {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \");\\n}\\n.main-menu__btn--preview:active,\\n.main-menu__btn--preview.active {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \");\\n}\\n.main-menu__btn--plus {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \");\\n}\\n.main-menu__btn--minus {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \");\\n}\\n.main-menu__btn--close {\\n background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \");\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 3596:\n\t ((module, exports, __webpack_require__) => {\n\tvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3645);\n\texports = ___CSS_LOADER_API_IMPORT___(false);\n\texports.push([module.id, \"iframe#adguard-assistant-dialog {\\n position: fixed;\\n clip: auto;\\n border-radius: 3px;\\n box-shadow: 0 0 10px 3px rgba(162, 161, 161, 0.3);\\n z-index: 2147483647;\\n display: block!important;\\n}\\n.sg_hide_element {\\n display: none!important;\\n}\\nimg.adguard_sg_selected {\\n border: 5px solid #0F0 !important;\\n}\\n#_sg_div.sg_top {\\n top: 5px !important;\\n}\\n#_sg_div.sg_bottom {\\n bottom: 5px !important;\\n}\\n#_sg_div input {\\n margin-right: 10px !important;\\n font-size: 15px !important;\\n}\\n#_sg_path_field {\\n width: 400px !important;\\n}\\n#_sg_div .sg_new_line {\\n clear: both !important;\\n}\\n#_sg_div .sg_option {\\n float: left !important;\\n}\\n#_sg_div .adguard_sg_selected_option {\\n text-decoration: underline;\\n}\\n.adguard-placeholder {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OUM5OUE4MEZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OUM5OUE4MUZEQzUxMUUyOTAzM0EyODQyRjc5QjI2QyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5Qzk5QTdFRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5Qzk5QTdGRkRDNTExRTI5MDMzQTI4NDJGNzlCMjZDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9rJm9wAAAAZQTFRF2+7g1OfZ+LX/EgAAACtJREFUeNpiYIQABhhA5TIyoHIhfCS1DKhcEB/FJAZG7AYzoNlLLy5AgAEAMigAar6TcqkAAAAASUVORK5CYII=);\\n}\\n.adguard-placeholder-icon {\\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAwCAYAAAB9sggoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpENkNBQTNGMkZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpENkNBQTNGM0ZEQzUxMUUyQjVFMkZEMUFFRjlGOEQyMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ2Q0FBM0YwRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ2Q0FBM0YxRkRDNTExRTJCNUUyRkQxQUVGOUY4RDIzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+49sbDwAAAl9JREFUeNrMmE0o5VEYxq9vJmpI2SBZjCSNKKGwkDE0m8mg2QwzEtkNCeUjGyVhYTbTUIZEMWmkbCVlw9QkG4mammbK5zAWuLqek3ch3W7v+Z8P/7d+u/cczz3neM7zP0Htg12eR6wUkA+eg2yQDOLAYegjiIkEr0AjyAPRfnp8toW9Be20QoHKa0tYEhgCVdwBNoQVgCmQKjPItLAKMAtiZAeaFFYM5sATJ4ODDYl6BuadijIlLAJMgHiFOWJMbGUfmaZsHYN98Bvs6haWA1olx2yCMfAd/DF1+Psl5rwGPWAYXJn8r3wNXjB7L0ENrZLRwy/m6ZDorw8kSqewUpDL7P0Epm3YRRBoYfbugW5bPpZDK8apTnBqS9h7WjWOLXyz5fxPQSWjz0dWcmPrEhdJNIEprIlW198Z7aUV1SasQWJnAp3Dzw+FqWxlOmV2HeXVecbegHBTYS5YYVy1yejrVJhIpxluFPaB6V1WhSWQTXjcJqyKjFVnhagabBhFFk7tgnPmlp+oChNbmMXM70XgL3Nen6qwj8y+xfv53fQZKweFzN5xW4c/Cgwwe9fAui1hIuBlMntHZOKNirAyiQ+NLbBkw8fEE9IM2QSnBv19I+oWVguWQSxzrnX6EVrqoV2I15kS0AxeSszjo+326hQm3hoSQRqR6mCeL2BV5x0VSjYQojDHNmgzcYn/Uxj/H9SBM7fkMQ951Tuw4aageEMpY8FUHnPy+XZECXbRTUFxhezEqCiZFfsFRnXdg1xhgcT9BF/BJG2htRKiDjx376EX9Md36HoR/NDp5jJ1K8AAcQBmooZhTgQAAAAASUVORK5CYII=);\\n background-position: center center;\\n background-repeat: no-repeat;\\n height: 100%;\\n}\\n.adguard-placeholder-domain {\\n background: #778b7c;\\n color: #ffffff;\\n left: 0;\\n top: 0;\\n padding: 2px 4px;\\n position: relative;\\n}\\n@media print {\\n .adguard-alert,\\n #adguard-assistant-dialog {\\n display: none!important;\\n opacity: 0!important;\\n visibility: hidden!important;\\n }\\n}\\n\", \"\"]);\n\tmodule.exports = exports;\n\t }),\n\t 3645:\n\t ((module) => {\n\tmodule.exports = function (useSourceMap) {\n\t var list = [];\n\t list.toString = function toString() {\n\t return this.map(function (item) {\n\t var content = cssWithMappingToString(item, useSourceMap);\n\t if (item[2]) {\n\t return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n\t }\n\t return content;\n\t }).join('');\n\t };\n\t list.i = function (modules, mediaQuery, dedupe) {\n\t if (typeof modules === 'string') {\n\t modules = [[null, modules, '']];\n\t }\n\t var alreadyImportedModules = {};\n\t if (dedupe) {\n\t for (var i = 0; i < this.length; i++) {\n\t var id = this[i][0];\n\t if (id != null) {\n\t alreadyImportedModules[id] = true;\n\t }\n\t }\n\t }\n\t for (var _i = 0; _i < modules.length; _i++) {\n\t var item = [].concat(modules[_i]);\n\t if (dedupe && alreadyImportedModules[item[0]]) {\n\t continue;\n\t }\n\t if (mediaQuery) {\n\t if (!item[2]) {\n\t item[2] = mediaQuery;\n\t } else {\n\t item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n\t }\n\t }\n\t list.push(item);\n\t }\n\t };\n\t return list;\n\t};\n\tfunction cssWithMappingToString(item, useSourceMap) {\n\t var content = item[1] || '';\n\t var cssMapping = item[3];\n\t if (!cssMapping) {\n\t return content;\n\t }\n\t if (useSourceMap && typeof btoa === 'function') {\n\t var sourceMapping = toComment(cssMapping);\n\t var sourceURLs = cssMapping.sources.map(function (source) {\n\t return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n\t });\n\t return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t }\n\t return [content].join('\\n');\n\t}\n\tfunction toComment(sourceMap) {\n\t var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\t var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n\t return \"/*# \".concat(data, \" */\");\n\t}\n\t }),\n\t 1667:\n\t ((module) => {\n\tmodule.exports = function (url, options) {\n\t if (!options) {\n\t options = {};\n\t }\n\t url = url && url.__esModule ? url.default : url;\n\t if (typeof url !== 'string') {\n\t return url;\n\t }\n\t if (/^['\"].*['\"]$/.test(url)) {\n\t url = url.slice(1, -1);\n\t }\n\t if (options.hash) {\n\t url += options.hash;\n\t }\n\t if (/[\"'() \\t\\n]/.test(url) || options.needQuotes) {\n\t return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n'), \"\\\"\");\n\t }\n\t return url;\n\t};\n\t }),\n\t 5688:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 6696:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 3317:\n\t ((module) => {\n\tvar code = \" \";\n\tmodule.exports = code;\n\t }),\n\t 4825:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 2115:\n\t ((module) => {\n\tvar code = \"

\";\n\tmodule.exports = code;\n\t }),\n\t 8514:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 4693:\n\t ((module) => {\n\tvar code = \"
\";\n\tmodule.exports = code;\n\t }),\n\t 7726:\n\t ((module) => {\n\tvar code = \"
MAX
MIN
\";\n\tmodule.exports = code;\n\t }),\n\t 1403:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(4123);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 5487:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(2571);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 3228:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(6469);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 1953:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(817);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 5317:\n\t ((module, __unused_webpack_exports, __webpack_require__) => {\n\t var result = __webpack_require__(3596);\n\t if (typeof result === \"string\") {\n\t module.exports = result;\n\t } else {\n\t module.exports = result.toString();\n\t }\n\t }),\n\t 8269:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUgMTEuNzY2NUwxMC41ODc4IDE3TDE5IDgiIHN0cm9rZT0iIzY3QjI3OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 7062:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTcgMTciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBpZD0iQXJ0Ym9hcmQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMi4wMDAwMDAsIC0xNDQuMDAwMDAwKSI+CiAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTQxLjAwMDAwMCkiIHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1Ij4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgY3g9IjcuODcwMzYxMzMiIGN5PSIxMS4yNzU5NzY2IiByPSI3LjM3ODg1NzQyIj48L2NpcmNsZT4KICAgICAgICAgICAgPHBvbHlsaW5lIGlkPSJMaW5lLTIiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHBvaW50cz0iNy43Njc5Njg3NSA3LjQ2MzI4MTI1IDcuNzY3OTY4NzUgMTEuOTYzMjgxMiAxMS4zNjc5Njg3IDExLjk2MzI4MTIiPjwvcG9seWxpbmU+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 1823:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogICAgPGxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZWVlIiBzdHJva2Utd2lkdGg9IjIwIiB4MT0iNSIgeTE9IjUiIHgyPSI5NSIgeTI9Ijk1Ii8+CiAgICA8bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNlZWUiIHN0cm9rZS13aWR0aD0iMjAiIHgxPSI5NSIgeTE9IjUiIHgyPSI1IiB5Mj0iOTUiLz4KPC9zdmc+Cg==\");\n\t }),\n\t 2668:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogICAgPGxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIwIiB4MT0iNSIgeTE9IjUiIHgyPSI5NSIgeTI9Ijk1Ii8+CiAgICA8bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMjAiIHgxPSI5NSIgeTE9IjUiIHgyPSI1IiB5Mj0iOTUiLz4KPC9zdmc+Cg==\");\n\t }),\n\t 1109:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTYuNDI4NTcgNi40Mjg1N0wxNy42MDQzIDE3LjYwNDMiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8cGF0aCBkPSJNNi40Mjc3MyAxNy41NzE0TDE3LjYwMzUgNi4zOTU2MyIgc3Ryb2tlPSIjQTRBNEE0IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=\");\n\t }),\n\t 6523:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMTkiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aAogICAgICAgICAgICBkPSJNMjcuNjE1NjkzMSwzMjIuMjg4MDg2IEwyMC43Njc5Njg3LDMyMi4yODgwODYgTDIwLjc2Nzk2ODcsMzE1LjQxNjAyNiBMMjEuOTU5OTMxNCwzMTUuNDE2MDI2IEMyMi41MTAyOTA4LDMxNS40MTYwMjYgMjIuOTU2NDQ1MywzMTQuOTY5ODcxIDIyLjk1NjQ0NTMsMzE0LjQxOTUxMiBDMjIuOTU2NDQ1MywzMTMuODY5MTUzIDIyLjUxMDI5MDgsMzEzLjQyMjk5OCAyMS45NTk5MzE0LDMxMy40MjI5OTggTDIwLjc2Nzk2ODcsMzEzLjQyMjk5OCBMMjAuNzY3OTY4NywzMDYuOTE3MTEgTDI1LjkzOTg5MjYsMzA2LjkxNzExIEwyNS45Mzk4OTI2LDMwNi44MTYzNjggQzI1LjkzOTg5MjYsMzA1LjMyNTE5OSAyNy4xNDg3MjM4LDMwNC4xMTYzNjggMjguNjM5ODkyNiwzMDQuMTE2MzY4IEMzMC4xMzEwNjE0LDMwNC4xMTYzNjggMzEuMzM5ODkyNiwzMDUuMzI1MTk5IDMxLjMzOTg5MjYsMzA2LjgxNjM2OCBMMzEuMzM5ODkyNiwzMDYuOTE3MTEgTDM2LjEzODk0NDUsMzA2LjkxNzExIEwzNi4xMzg5NDQ1LDMxMS45MDI1OTggTDM2LjMzMjA4MDEsMzExLjkwMjU5OCBDMzcuODIzMjQ4OSwzMTEuOTAyNTk4IDM5LjAzMjA4MDEsMzEzLjExMTQyOSAzOS4wMzIwODAxLDMxNC42MDI1OTggQzM5LjAzMjA4MDEsMzE2LjA5Mzc2NyAzNy44MjMyNDg5LDMxNy4zMDI1OTggMzYuMzMyMDgwMSwzMTcuMzAyNTk4IEwzNi4xMzg5NDQ1LDMxNy4zMDI1OTggTDM2LjEzODk0NDUsMzIyLjI4ODA4NiBMMjkuNjA4NzIwOSwzMjIuMjg4MDg2IEwyOS42MDg3MjA5LDMyMC41NzE2OSBDMjkuNjA4NzIwOSwzMjAuMDIxMzMgMjkuMTYyNTY2NSwzMTkuNTc1MTc2IDI4LjYxMjIwNywzMTkuNTc1MTc2IEMyOC4wNjE4NDc2LDMxOS41NzUxNzYgMjcuNjE1NjkzMSwzMjAuMDIxMzMgMjcuNjE1NjkzMSwzMjAuNTcxNjkgTDI3LjYxNTY5MzEsMzIyLjI4ODA4NiBaIgogICAgICAgICAgICBpZD0icGF0aC0xIj48L3BhdGg+CiAgICA8L2RlZnM+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAuMDAwMDAwLCAtMzA0LjAwMDAwMCkiPgogICAgICAgIDxnPgogICAgICAgICAgICA8dXNlIGZpbGwtcnVsZT0iZXZlbm9kZCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgICBzdHJva2U9IiM5Nzk3OTciCiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9IjEuMzUiCiAgICAgICAgICAgICAgICBkPSJNMjYuOTQwNjkzMSwzMjEuNjEzMDg2IEwyNi45NDA2OTMxLDMyMC41NzE2OSBDMjYuOTQwNjkzMSwzMTkuNjQ4NTM4IDI3LjY4OTA1NTQsMzE4LjkwMDE3NiAyOC42MTIyMDcsMzE4LjkwMDE3NiBDMjkuNTM1MzU4NywzMTguOTAwMTc2IDMwLjI4MzcyMDksMzE5LjY0ODUzOCAzMC4yODM3MjA5LDMyMC41NzE2OSBMMzAuMjgzNzIwOSwzMjEuNjEzMDg2IEwzNS40NjM5NDQ1LDMyMS42MTMwODYgTDM1LjQ2Mzk0NDUsMzE2LjYyNzU5OCBMMzYuMzMyMDgwMSwzMTYuNjI3NTk4IEMzNy40NTA0NTY3LDMxNi42Mjc1OTggMzguMzU3MDgwMSwzMTUuNzIwOTc1IDM4LjM1NzA4MDEsMzE0LjYwMjU5OCBDMzguMzU3MDgwMSwzMTMuNDg0MjIxIDM3LjQ1MDQ1NjcsMzEyLjU3NzU5OCAzNi4zMzIwODAxLDMxMi41Nzc1OTggTDM1LjQ2Mzk0NDUsMzEyLjU3NzU5OCBMMzUuNDYzOTQ0NSwzMDcuNTkyMTEgTDMwLjY2NDg5MjYsMzA3LjU5MjExIEwzMC42NjQ4OTI2LDMwNi44MTYzNjggQzMwLjY2NDg5MjYsMzA1LjY5Nzk5MSAyOS43NTgyNjkyLDMwNC43OTEzNjggMjguNjM5ODkyNiwzMDQuNzkxMzY4IEMyNy41MjE1MTYsMzA0Ljc5MTM2OCAyNi42MTQ4OTI2LDMwNS42OTc5OTEgMjYuNjE0ODkyNiwzMDYuODE2MzY4IEwyNi42MTQ4OTI2LDMwNy41OTIxMSBMMjEuNDQyOTY4NywzMDcuNTkyMTEgTDIxLjQ0Mjk2ODcsMzEyLjc0Nzk5OCBMMjEuOTU5OTMxNCwzMTIuNzQ3OTk4IEMyMi44ODMwODMxLDMxMi43NDc5OTggMjMuNjMxNDQ1MywzMTMuNDk2MzYgMjMuNjMxNDQ1MywzMTQuNDE5NTEyIEMyMy42MzE0NDUzLDMxNS4zNDI2NjQgMjIuODgzMDgzMSwzMTYuMDkxMDI2IDIxLjk1OTkzMTQsMzE2LjA5MTAyNiBMMjEuNDQyOTY4NywzMTYuMDkxMDI2IEwyMS40NDI5Njg3LDMyMS42MTMwODYgTDI2Ljk0MDY5MzEsMzIxLjYxMzA4NiBaIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 9713:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQgMTBDNCAxMCA4IDE0Ljc3MiAxMiAxNC43NzJDMTYgMTQuNzcyIDIwIDEwIDIwIDEwIiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTEyIDE1VjE3IiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTE4IDEzVjE1IiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPHBhdGggZD0iTTYgMTNWMTUiIHN0cm9rZT0iIzY3QjI3OSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 2834:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDExLjc3MkM2LjY2NjY3IDguNTkwNjUgOS4zMzMzMyA3IDEyIDdDMTQuNjY2NyA3IDE3LjMzMzMgOC41OTA2NSAyMCAxMS43NzJDMjAgMTEuNzcyIDE2IDE2Ljc3MiAxMiAxNi43NzJDOCAxNi43NzIgNCAxMS43NzIgNCAxMS43NzJaIiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMiAxMEMxMy4xMDQ2IDEwIDE0IDEwLjg5NTQgMTQgMTJDMTQgMTMuMTA0NiAxMy4xMDQ2IDE0IDEyIDE0QzEwLjg5NTQgMTQgMTAgMTMuMTA0NiAxMCAxMkMxMCAxMC44OTU0IDEwLjg5NTQgMTAgMTIgMTBaIiBzdHJva2U9IiM2N0IyNzkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjwvc3ZnPgo=\");\n\t }),\n\t 6255:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTkgMTciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZGVmcz4KICAgICAgICA8cmVjdCBpZD0icGF0aC0xIiB4PSIwLjc2Nzk2ODc1IiB5PSIwLjk4MDY2NDA2MyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE1Ljg4MDUxNzYiIHJ4PSIxLjgiPjwvcmVjdD4KICAgIDwvZGVmcz4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMC4wMDAwMDAsIC0xODQuMDAwMDAwKSI+CiAgICAgICAgPGcgaWQ9Ikdyb3VwLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwLjAwMDAwMCwgMTg0LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iUmVjdGFuZ2xlIj4KICAgICAgICAgICAgICAgIDx1c2UgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgIDxyZWN0IHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1IiB4PSIxLjQ0Mjk2ODc1IiB5PSIxLjY1NTY2NDA2IiB3aWR0aD0iMTYuNjUiIGhlaWdodD0iMTQuNTMwNTE3NiIgcng9IjEuOCI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iTGluZS0zIiBzdHJva2U9IiM5Nzk3OTciIHN0cm9rZS13aWR0aD0iMS4zNSIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgcG9pbnRzPSIxLjYyNjY2MDE2IDEzLjA3MTMzNzkgNS4yMjY2NjAxNiA5LjQ3MTMzNzg5IDguMTc0MDcyMjcgMTIuMTE1NTI3MyAxMi45Mjk4MzQgNi43MjgyNzE0OCAxNy44Njc5Njg3IDEyLjMzMzA1NjYiPjwvcG9seWxpbmU+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 9053:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMzUgMzYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0LjAwMDAwMCwgLTIxOS4wMDAwMDApIj4KICAgICAgICA8ZyBpZD0iMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDAuMDAwMDAwLCAxOTAuMDAwMDAwKSI+CiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyNC41MDAwMDAsIDI5LjQxNDA2MikiPgogICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC40NTM2NTYsIDAuMjI2ODI4KSI+CiAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMTYuNzE1NzQ5MiwwIEMxMS40OTA5MTk1LDAgNS4xODg0Njg3NywxLjI2NTU4MzUxIDUuMTI2MjAxMTRlLTA2LDQuMDUxMjIyMzkgQzUuMTI2MjAxMTRlLTA2LDEwLjA2NzQ0OTUgLTAuMDcxNjEzNjMyNCwyNS4wNTU2OTI1IDE2LjcxNTc0OTIsMzUuMjk2Njc5OCBDMzMuNTAzNDgzLDI1LjA1NTY5MjUgMzMuNDMyMjM1NCwxMC4wNjc0NDk1IDMzLjQzMjIzNTQsNC4wNTEyMjIzOSBDMjguMjQzNDAwNiwxLjI2NTU4MzUxIDIxLjk0MDk0OTksMCAxNi43MTU3NDkyLDAgTDE2LjcxNTc0OTIsMCBaIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJQYXRoIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IiM2OEJDNzEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNi42OTg2NzQzLDM1LjI4NjI1ODIgQy0wLjA3MTU2NTA2MDUsMjUuMDQ1NTI2OCA1LjEyNjIwMTEzZS0wNiwxMC4wNjU0MDkxIDUuMTI2MjAxMTNlLTA2LDQuMDUxMjIyMzkgQzUuMTgyODE4MDIsMS4yNjg2MTczNCAxMS40NzcxOTI5LDAuMDAyNzU4NDkxMjQgMTYuNjk4Njc0Myw0LjUwMzc4MzExZS0wNiBMMTYuNjk4Njc0MywzNS4yODYyNjE3IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgZmlsbD0iIzY3QjI3OSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMTYuMTA2MDI0NywyMy41NTEwOTQgTDI2LjIxNDMxNTUsOS41MTgwMTg2OSBDMjUuNDczNjAwNSw4LjkwNjQ3MjQ5IDI0LjgyMzg4NzYsOS4zMzgwODkxNiAyNC40NjYyMjgxLDkuNjcyMjQ0IEwyNC40NTMxNzc0LDkuNjczMzE1MDEgTDE2LjAyNDg5ODcsMTguNzA0NDIwOCBMMTIuODQ5MzQ3NywxNC43NjgxMDUzIEMxMS4zMzQ0MDkxLDEyLjk2NTI0IDkuMjc0ODY4NjYsMTQuMzQwNDE1NyA4Ljc5Mzc1NjYyLDE0LjcwMzg0NDggTDE2LjEwNjAyNDcsMjMuNTUxMDk0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9IkZpbGwtMTEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 6265:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEwIDZWMTBINiIgc3Ryb2tlPSIjQTRBNEE0IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0xMCAxOFYxNEg2IiBzdHJva2U9IiNBNEE0QTQiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPHBhdGggZD0iTTE0IDZWMTBIMTgiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTQgMThWMTRIMTgiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 7693:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTYgMTBWNkgxME02IDE0VjE4SDEwTTE4IDEwVjZIMTRNMTggMTRWMThIMTQiIHN0cm9rZT0iI0E0QTRBNCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K\");\n\t }),\n\t 8115:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyMDAiIHZpZXdCb3g9IjAgMCA0MDAgMjAwIj4KICAgIDxkZWZzPgogICAgICAgIDxnIGlkPSJhcnIiPgogICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9IjE4LjgsODQuNSAxOC44LDMyIDg2LjcsMTAwIDEwMCw4Ni43IDMyLDE4LjggODQuNSwxOC44IDg0LjUsMCAxOC44LDAgMCwwIDAsMTguOAogICAgICAgICAgICAgICAgMCw4NC41IAkiLz4KICAgICAgICA8L2c+CiAgICA8L2RlZnM+CgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjYWJhYmFiIi8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNhcnIiIGZpbGw9IiNhYmFiYWIiIHRyYW5zZm9ybT0icm90YXRlKDkwIDEwMCAxMDApIi8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNhcnIiIGZpbGw9IiNhYmFiYWIiIHRyYW5zZm9ybT0icm90YXRlKDE4MCAxMDAgMTAwKSIvPgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjYWJhYmFiIiB0cmFuc2Zvcm09InJvdGF0ZSgyNzAgMTAwIDEwMCkiLz4KCiAgICA8dXNlIHhsaW5rOmhyZWY9IiNhcnIiIGZpbGw9IiNmZmYiIHg9IjIwMCIvPgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjZmZmIiB5PSItMjAwIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAxMDAgMTAwKSIvPgogICAgPHVzZSB4bGluazpocmVmPSIjYXJyIiBmaWxsPSIjZmZmIiB4PSItMjAwIiB0cmFuc2Zvcm09InJvdGF0ZSgxODAgMTAwIDEwMCkiLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI2FyciIgZmlsbD0iI2ZmZiIgeT0iMjAwIiB0cmFuc2Zvcm09InJvdGF0ZSgyNzAgMTAwIDEwMCkiLz4KPC9zdmc+Cg==\");\n\t }),\n\t 9385:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTcgMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjIuMDAwMDAwLCAtMjI0LjAwMDAwMCkiPgogICAgICAgIDxwYXRoIGQ9Ik0yMi44MTc1NzgxLDIzNC40MTc0NTUgTDIyLjgxNzU3ODEsMjQwLjU1OTc0NyBMMzYuODk2MDY2LDIzMi43MjMwODkgTDIyLjgxNzU3ODEsMjI1LjY5OTEyMSBMMjIuODE3NTc4MSwyMzEuMDgwNTcyIEwyNS45Nzg4MzYzLDIzMi42NTc3NzEgTDIyLjgxNzU3ODEsMjM0LjQxNzQ1NSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1Ij48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPgo=\");\n\t }),\n\t 8225:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjEuMDAwMDAwLCAtMjYzLjAwMDAwMCkiPgogICAgICAgIDxwYXRoIGQ9Ik0zMC4wMjM1ODk1LDI4MC4xMTkwMjQgQzI5Ljk3MTAwMTYsMjgwLjExOTAyNCAyOS45MTgzNjI1LDI4MC4xMTA4OTggMjkuODY3NjY1NSwyODAuMDk0NjQ3IEMyOC4xNjM1OTE1LDI3OS41NDg3ODUgMjYuNzEyNzk4MSwyNzguNTAxNzc5IDI1LjU1NTUwNTcsMjc2Ljk4Mjc1OSBDMjQuNjQ0MzkwMywyNzUuNzg2ODMxIDIzLjkxNDg1NCwyNzQuMjk4MzczIDIzLjM4NzI4ODEsMjcyLjU1ODcyOSBDMjIuNDk3MzMwNSwyNjkuNjI0NDg1IDIyLjQ4NzEwOTQsMjY3LjAxMDUyMiAyMi40ODcxMDk0LDI2Ni45MDA2OTYgQzIyLjQ4NzEwOTQsMjY2LjYzNzUwMSAyMi42ODcwMzU1LDI2Ni40MTcyODYgMjIuOTQ5MDU1MywyNjYuMzkxOTg4IEMyMi45ODg1MDksMjY2LjM4ODE1NSAyNi45NTc2OTc0LDI2NS45ODA2ODggMjkuNzIzMjkxNCwyNjMuOTcyMjc5IEMyOS45MDIzNjY0LDI2My44NDIxNjMgMzAuMTQ0ODYzNywyNjMuODQyMzE2IDMwLjMyMzkzODcsMjYzLjk3MjMzIEMzMy4wODg3NjYyLDI2NS45ODA2ODggMzcuMDU4NDY1NiwyNjYuMzg4MTU1IDM3LjA5ODIyNTksMjY2LjM5MjAzOSBDMzcuMzYwMDQxMywyNjYuNDE3NTkyIDM3LjU1OTkxNjMsMjY2LjYzNzcwNSAzNy41NTk5MTYzLDI2Ni45MDA2OTYgQzM3LjU1OTkxNjMsMjY3LjAxMDUyMiAzNy41NDk2OTUyLDI2OS42MjQ0ODUgMzYuNjU5Nzg4NywyNzIuNTU4NzggQzM2LjEzMjE3MTcsMjc0LjI5ODQyNCAzNS40MDI2ODY1LDI3NS43ODY4ODIgMzQuNDkxNTcxMSwyNzYuOTgyODExIEMzMy4zMzQzMjk5LDI3OC41MDE4MyAzMS44ODM1MzY1LDI3OS41NDg4MzYgMzAuMTc5NDYyNCwyODAuMDk0Njk4IEMzMC4xMjg3NjU0LDI4MC4xMTA4OTggMzAuMDc2MTc3NSwyODAuMTE5MDI0IDMwLjAyMzU4OTUsMjgwLjExOTAyNCBMMzAuMDIzNTg5NSwyODAuMTE5MDI0IFoiIGlkPSJQYXRoIiBzdHJva2U9IiM5Nzk3OTciIHN0cm9rZS13aWR0aD0iMS4zNSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4K\");\n\t }),\n\t 2286:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTkgMTkiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAuMDAwMDAwLCAtMzQzLjAwMDAwMCkiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwLjE0MjM4MywgMzQzLjMwMzQ2NykiIHN0cm9rZT0iIzk3OTc5NyIgc3Ryb2tlLXdpZHRoPSIxLjM1Ij4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgIGQ9Ik03LjcxMTUyMzQ0LDEuOTAwNjM0NzcgTDcuNzExNTIzNDQsMi44OTYzNDMxNSBMNy4yMjkwNjY5NCwzLjAzOTkyOTIyIEM2LjgxMTM1NTQzLDMuMTY0MjQ2MjUgNi40MDg2MjIwOCwzLjMzMTQ2NDY4IDYuMDI2NDg4NDEsMy41Mzg1MzQ3NyBMNS41ODM3MDgzMiwzLjc3ODQ2Nzg2IEw0Ljg3OTEwMjQyLDMuMDczODYxOTYgQzQuNDM5NzYyNiwyLjYzNDUyMjE0IDMuNzI3NDUxOTksMi42MzQ1MjIxNCAzLjI4ODExMjE3LDMuMDczODYxOTYgTDMuMDAyMjMxMSwzLjM1OTc0MzAzIEMyLjU2Mjg5MTI4LDMuNzk5MDgyODUgMi41NjI4OTEyOCw0LjUxMTM5MzQ2IDMuMDAyMjMxMSw0Ljk1MDczMzI4IEwzLjcwNjgzNyw1LjY1NTMzOTE4IEwzLjQ2NjkwMzkxLDYuMDk4MTE5MjcgQzMuMjU5ODMzODIsNi40ODAyNTI5MyAzLjA5MjYxNTM5LDYuODgyOTg2MjkgMi45NjgyOTgzNiw3LjMwMDY5NzggTDIuODI0NzEyMjksNy43ODMxNTQzIEwxLjgyOTAwMzkxLDcuNzgzMTU0MyBDMS4yMDc2ODM1Niw3Ljc4MzE1NDMgMC43MDQwMDM5MDYsOC4yODY4MzM5NSAwLjcwNDAwMzkwNiw4LjkwODE1NDMgTDAuNzA0MDAzOTA2LDkuMzEyNDUxMTcgQzAuNzA0MDAzOTA2LDkuOTMzNzcxNTIgMS4yMDc2ODM1NiwxMC40Mzc0NTEyIDEuODI5MDAzOTEsMTAuNDM3NDUxMiBMMi44MjQ3MTIyOSwxMC40Mzc0NTEyIEwyLjk2ODI5ODM2LDEwLjkxOTkwNzcgQzMuMDkyNjE1MzksMTEuMzM3NjE5MiAzLjI1OTgzMzgyLDExLjc0MDM1MjUgMy40NjY5MDM5MSwxMi4xMjI0ODYyIEwzLjcwNjgzNywxMi41NjUyNjYzIEwzLjAwMjIzMTEsMTMuMjY5ODcyMiBDMi41NjI4OTEyOCwxMy43MDkyMTIgMi41NjI4OTEyOCwxNC40MjE1MjI2IDMuMDAyMjMxMSwxNC44NjA4NjI0IEwzLjI4ODExMjE3LDE1LjE0Njc0MzUgQzMuNzI3NDUxOTksMTUuNTg2MDgzMyA0LjQzOTc2MjYsMTUuNTg2MDgzMyA0Ljg3OTEwMjQyLDE1LjE0Njc0MzUgTDUuNTgzNzA4MzIsMTQuNDQyMTM3NiBMNi4wMjY0ODg0MSwxNC42ODIwNzA3IEM2LjQwODYyMjA4LDE0Ljg4OTE0MDggNi44MTEzNTU0MywxNS4wNTYzNTkyIDcuMjI5MDY2OTQsMTUuMTgwNjc2MiBMNy43MTE1MjM0NCwxNS4zMjQyNjIzIEw3LjcxMTUyMzQ0LDE2LjMxOTk3MDcgQzcuNzExNTIzNDQsMTYuOTQxMjkxIDguMjE1MjAzMDksMTcuNDQ0OTcwNyA4LjgzNjUyMzQ0LDE3LjQ0NDk3MDcgTDkuMjQwODIwMzEsMTcuNDQ0OTcwNyBDOS44NjIxNDA2NiwxNy40NDQ5NzA3IDEwLjM2NTgyMDMsMTYuOTQxMjkxIDEwLjM2NTgyMDMsMTYuMzE5OTcwNyBMMTAuMzY1ODIwMywxNS4zMjQyNjIzIEwxMC44NDgyNzY4LDE1LjE4MDY3NjIgQzExLjI2NTk4ODMsMTUuMDU2MzU5MiAxMS42Njg3MjE3LDE0Ljg4OTE0MDggMTIuMDUwODU1MywxNC42ODIwNzA3IEwxMi40OTM2MzU0LDE0LjQ0MjEzNzYgTDEzLjE5ODI0MTMsMTUuMTQ2NzQzNSBDMTMuNjM3NTgxMiwxNS41ODYwODMzIDE0LjM0OTg5MTgsMTUuNTg2MDgzMyAxNC43ODkyMzE2LDE1LjE0Njc0MzUgTDE1LjA3NTExMjYsMTQuODYwODYyNCBDMTUuNTE0NDUyNSwxNC40MjE1MjI2IDE1LjUxNDQ1MjUsMTMuNzA5MjEyIDE1LjA3NTExMjYsMTMuMjY5ODcyMiBMMTQuMzcwNTA2NywxMi41NjUyNjYzIEwxNC42MTA0Mzk4LDEyLjEyMjQ4NjIgQzE0LjgxNzUwOTksMTEuNzQwMzUyNSAxNC45ODQ3Mjg0LDExLjMzNzYxOTIgMTUuMTA5MDQ1NCwxMC45MTk5MDc3IEwxNS4yNTI2MzE1LDEwLjQzNzQ1MTIgTDE2LjI0ODMzOTgsMTAuNDM3NDUxMiBDMTYuODY5NjYwMiwxMC40Mzc0NTEyIDE3LjM3MzMzOTgsOS45MzM3NzE1MiAxNy4zNzMzMzk4LDkuMzEyNDUxMTcgTDE3LjM3MzMzOTgsOC45MDgxNTQzIEMxNy4zNzMzMzk4LDguMjg2ODMzOTUgMTYuODY5NjYwMiw3Ljc4MzE1NDMgMTYuMjQ4MzM5OCw3Ljc4MzE1NDMgTDE1LjI1MjYzMTUsNy43ODMxNTQzIEwxNS4xMDkwNDU0LDcuMzAwNjk3OCBDMTQuOTg0NzI4NCw2Ljg4Mjk4NjI5IDE0LjgxNzUwOTksNi40ODAyNTI5MyAxNC42MTA0Mzk4LDYuMDk4MTE5MjcgTDE0LjM3MDUwNjcsNS42NTUzMzkxOCBMMTUuMDc1MTEyNiw0Ljk1MDczMzI4IEMxNS41MTQ0NTI1LDQuNTExMzkzNDYgMTUuNTE0NDUyNSwzLjc5OTA4Mjg1IDE1LjA3NTExMjYsMy4zNTk3NDMwMyBMMTQuNzg5MjMxNiwzLjA3Mzg2MTk2IEMxNC4zNDk4OTE4LDIuNjM0NTIyMTQgMTMuNjM3NTgxMiwyLjYzNDUyMjE0IDEzLjE5ODI0MTMsMy4wNzM4NjE5NiBMMTIuNDkzNjM1NCwzLjc3ODQ2Nzg2IEwxMi4wNTA4NTUzLDMuNTM4NTM0NzcgQzExLjY2ODcyMTcsMy4zMzE0NjQ2OCAxMS4yNjU5ODgzLDMuMTY0MjQ2MjUgMTAuODQ4Mjc2OCwzLjAzOTkyOTIyIEwxMC4zNjU4MjAzLDIuODk2MzQzMTUgTDEwLjM2NTgyMDMsMS45MDA2MzQ3NyBDMTAuMzY1ODIwMywxLjI3OTMxNDQyIDkuODYyMTQwNjYsMC43NzU2MzQ3NjYgOS4yNDA4MjAzMSwwLjc3NTYzNDc2NiBMOC44MzY1MjM0NCwwLjc3NTYzNDc2NiBDOC4yMTUyMDMwOSwwLjc3NTYzNDc2NiA3LjcxMTUyMzQ0LDEuMjc5MzE0NDIgNy43MTE1MjM0NCwxLjkwMDYzNDc3IFoiCiAgICAgICAgICAgICAgICBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0xNSIgY3g9IjkuMDM4NjcxODgiIGN5PSI5LjExMDMwMjczIiByPSIxLjgiPjwvY2lyY2xlPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==\");\n\t }),\n\t 1660:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiNENkQ2RDYiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 1372:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiNENkQ2RDYiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 6112:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiNENkQ2RDYiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 9919:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiM3MTcxNzEiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjRDZENkQ2Ii8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 9023:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiM3MTcxNzEiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjNzE3MTcxIi8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iI0Q2RDZENiIvPgo8L3N2Zz4K\");\n\t }),\n\t 6810:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUyIDE4Ij4KICAgIDxwYXRoIGQ9Ik01LjM1Myw3LjQxMiBMNS4zMDQsNy4zNjMgQzcuMTIxLDcuMTI1IDguNTI5LDUuNTg3IDguNTI5LDMuNzA2IEM4LjUyOSwxLjY1OSA2Ljg3LDAgNC44MjQsMCBDMi43NzcsMCAxLjExOCwxLjY1OSAxLjExOCwzLjcwNiBDMS4xMTgsNS41NzIgMi41MDIsNy4wOTkgNC4yOTQsNy4zNTggTDQuMjk0LDcuNDEyIEMxLjExOCw3LjQxMiAwLjA1OSw5LjUyOSAwLjA1OSw5LjUyOSBMMS4xMTgsMTUuODgyIEMxLjExOCwxNi45MzggMi40NzUsMTcuODA2IDQuMjQ0LDE3Ljk2NyBMNC4yOTQsMTggTDUuMzUzLDE4IEw1LjQwMywxNy45NjcgQzcuMTcyLDE3LjgwNiA4LjUyOSwxNi45MzggOC41MjksMTUuODgyIEw5LjU4OCw5LjUyOSBDOS41ODgsOS41MjkgOC41MjksNy40MTIgNS4zNTMsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTE1Ljk0MSw3LjQxMiBMMTUuODkyLDcuMzYzIEMxNy43MDksNy4xMjUgMTkuMTE4LDUuNTg3IDE5LjExOCwzLjcwNiBDMTkuMTE4LDEuNjU5IDE3LjQ1OCwwIDE1LjQxMiwwIEMxMy4zNjUsMCAxMS43MDYsMS42NTkgMTEuNzA2LDMuNzA2IEMxMS43MDYsNS41NzIgMTMuMDksNy4wOTkgMTQuODgyLDcuMzU4IEwxNC44ODIsNy40MTIgQzExLjcwNiw3LjQxMiAxMC42NDcsOS41MjkgMTAuNjQ3LDkuNTI5IEwxMS43MDYsMTUuODgyIEMxMS43MDYsMTYuOTM4IDEzLjA2MywxNy44MDYgMTQuODMzLDE3Ljk2NyBMMTQuODgyLDE4IEwxNS45NDEsMTggTDE1Ljk5MSwxNy45NjcgQzE3Ljc2LDE3LjgwNiAxOS4xMTgsMTYuOTM4IDE5LjExOCwxNS44ODIgTDIwLjE3Niw5LjUyOSBDMjAuMTc2LDkuNTI5IDE5LjExOCw3LjQxMiAxNS45NDEsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgogICAgPHBhdGggZD0iTTI2LjUyOSw3LjQxMiBMMjYuNDgxLDcuMzYzIEMyOC4yOTgsNy4xMjUgMjkuNzA2LDUuNTg3IDI5LjcwNiwzLjcwNiBDMjkuNzA2LDEuNjU5IDI4LjA0NywwIDI2LDAgQzIzLjk1MywwIDIyLjI5NCwxLjY1OSAyMi4yOTQsMy43MDYgQzIyLjI5NCw1LjU3MiAyMy42NzgsNy4wOTkgMjUuNDcxLDcuMzU4IEwyNS40NzEsNy40MTIgQzIyLjI5NCw3LjQxMiAyMS4yMzUsOS41MjkgMjEuMjM1LDkuNTI5IEwyMi4yOTQsMTUuODgyIEMyMi4yOTQsMTYuOTM4IDIzLjY1MiwxNy44MDYgMjUuNDIxLDE3Ljk2NyBMMjUuNDcxLDE4IEwyNi41MjksMTggTDI2LjU3OSwxNy45NjcgQzI4LjM0OCwxNy44MDYgMjkuNzA2LDE2LjkzOCAyOS43MDYsMTUuODgyIEwzMC43NjUsOS41MjkgQzMwLjc2NSw5LjUyOSAyOS43MDYsNy40MTIgMjYuNTI5LDcuNDEyIHoiIGZpbGw9IiM3MTcxNzEiLz4KICAgIDxwYXRoIGQ9Ik0zNy4xMTgsNy40MTIgTDM3LjA2OSw3LjM2MyBDMzguODg2LDcuMTI1IDQwLjI5NCw1LjU4NyA0MC4yOTQsMy43MDYgQzQwLjI5NCwxLjY1OSAzOC42MzUsMCAzNi41ODgsMCBDMzQuNTQyLDAgMzIuODgyLDEuNjU5IDMyLjg4MiwzLjcwNiBDMzIuODgyLDUuNTcyIDM0LjI2Niw3LjA5OSAzNi4wNTksNy4zNTggTDM2LjA1OSw3LjQxMiBDMzIuODgyLDcuNDEyIDMxLjgyNCw5LjUyOSAzMS44MjQsOS41MjkgTDMyLjg4MiwxNS44ODIgQzMyLjg4MiwxNi45MzggMzQuMjQsMTcuODA2IDM2LjAwOSwxNy45NjcgTDM2LjA1OSwxOCBMMzcuMTE4LDE4IEwzNy4xNjcsMTcuOTY3IEMzOC45MzcsMTcuODA2IDQwLjI5NCwxNi45MzggNDAuMjk0LDE1Ljg4MiBMNDEuMzUzLDkuNTI5IEM0MS4zNTMsOS41MjkgNDAuMjk0LDcuNDEyIDM3LjExOCw3LjQxMiB6IiBmaWxsPSIjNzE3MTcxIi8+CiAgICA8cGF0aCBkPSJNNDcuNzA2LDcuNDEyIEw0Ny42NTcsNy4zNjMgQzQ5LjQ3NCw3LjEyNSA1MC44ODIsNS41ODcgNTAuODgyLDMuNzA2IEM1MC44ODIsMS42NTkgNDkuMjIzLDAgNDcuMTc2LDAgQzQ1LjEzLDAgNDMuNDcxLDEuNjU5IDQzLjQ3MSwzLjcwNiBDNDMuNDcxLDUuNTcyIDQ0Ljg1NCw3LjA5OSA0Ni42NDcsNy4zNTggTDQ2LjY0Nyw3LjQxMiBDNDMuNDcxLDcuNDEyIDQyLjQxMiw5LjUyOSA0Mi40MTIsOS41MjkgTDQzLjQ3MSwxNS44ODIgQzQzLjQ3MSwxNi45MzggNDQuODI4LDE3LjgwNiA0Ni41OTcsMTcuOTY3IEw0Ni42NDcsMTggTDQ3LjcwNiwxOCBMNDcuNzU2LDE3Ljk2NyBDNDkuNTI1LDE3LjgwNiA1MC44ODIsMTYuOTM4IDUwLjg4MiwxNS44ODIgTDUxLjk0MSw5LjUyOSBDNTEuOTQxLDkuNTI5IDUwLjg4Miw3LjQxMiA0Ny43MDYsNy40MTIgeiIgZmlsbD0iIzcxNzE3MSIvPgo8L3N2Zz4K\");\n\t }),\n\t 2307:\n\t ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\t__webpack_require__.r(__webpack_exports__);\n\t __webpack_require__.d(__webpack_exports__, {\n\t \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n\t });\n\t const __WEBPACK_DEFAULT_EXPORT__ = (\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDM4IDE1Ij4KICAgIDxwYXRoIGQ9Ik0yMS45MSwxLjA4MyBDMTguMDA4LDEuMDgzIDE0Ljg0Niw0LjA3IDE0Ljg0Niw3Ljc1OCBDMTQuODQ2LDExLjQ0NSAxOC4wMDgsMTQuNDMyIDIxLjkxLDE0LjQzMiBDMjUuODEzLDE0LjQzMiAyOC45NzcsMTEuNDQ1IDI4Ljk3Nyw3Ljc1OCBDMjguOTc4LDQuMDcgMjUuODEzLDEuMDgzIDIxLjkxLDEuMDgzIHogTTIxLjc3MSwxMS45IEMxOS41LDExLjkgMTcuNjU3LDEwLjA1NiAxNy42NTcsNy43ODMgQzE3LjY1Nyw1LjUwOCAxOS41MDEsMy42NjQgMjEuNzcxLDMuNjY0IEMyNC4wNDUsMy42NjQgMjUuODg2LDUuNTA4IDI1Ljg4Niw3Ljc4MyBDMjUuODg2LDEwLjA1NyAyNC4wNDUsMTEuOSAyMS43NzEsMTEuOSB6IiBmaWxsPSIjNzRCMDNFIi8+CiAgICA8cGF0aCBkPSJNMTYuNzUxLDAuNjQyIEwxNy4wMzEsMCBMMTQuMDYzLDAgTDExLjI3LDggTDguNjQ4LDAgTDguMjcyLDAgTDUuNjUsOCBMMywwIEwwLjAzMSwwIEw0LjksMTMuNDg2IEM0LjksMTMuNDg2IDUuMDc4LDEzLjg2IDUuMjc1LDEzLjg2IEM1LjQ1MSwxMy44NiA1LjY0OSwxMy40ODYgNS42NDksMTMuNDg2IEw4LjQ0NSw2LjQwNiBMMTEuMjY5LDEzLjQ4NiBDMTEuMjY5LDEzLjQ4NiAxMS40NTUsMTMuODYgMTEuNjQzLDEzLjg2IEMxMS44MjksMTMuODYgMTIuMDE4LDEzLjQ4NiAxMi4wMTgsMTMuNDg2IEwxMy42MTQsOS4wNjcgQzEzLjQ0NSw4LjQzMyAxMy4zNDUsNy43NzMgMTMuMzQ1LDcuMDg5IEMxMy4zNDYsNC40NTMgMTQuNjg2LDIuMTE4IDE2Ljc1MSwwLjY0MiB6IiBmaWxsPSIjRUUzNDI4Ii8+CiAgICA8cGF0aCBkPSJNMjcuMDMxLDAgTDI3LjAzMSwwLjYxMyBDMjcuOTQ0LDEuMjU4IDI4LjcxNSwyLjA2NyAyOS4yOTUsMyBMMzEuMDMxLDMgTDMxLjAzMSwxNCBMMzQuMDMxLDE0IEwzNC4wMzEsMyBMMzguMDMxLDMgTDM4LjAzMSwwIEwyNy4wMzEsMCB6IiBmaWxsPSIjRjA4NjE1Ii8+Cjwvc3ZnPgo=\");\n\t }),\n\t 897:\n\t ((module) => {\n\tmodule.exports = JSON.parse('[{\"project_id\":\"adguard-assistant\",\"base_locale\":\"en\",\"languages\":{\"en\":\"English\",\"ar\":\"Arabic\",\"be\":\"Belarusian\",\"cs\":\"Czech\",\"da\":\"Danish\",\"de\":\"German\",\"el\":\"Greek\",\"es\":\"Spanish\",\"fa\":\"Persian\",\"fi\":\"Finnish\",\"fr\":\"French\",\"he\":\"Hebrew\",\"hu\":\"Hungarian\",\"id\":\"Indonesian\",\"it\":\"Italian\",\"ja\":\"Japanese\",\"ko\":\"Korean\",\"lt\":\"Lithuanian\",\"no\":\"Norwegian\",\"nl\":\"Dutch\",\"pl\":\"Polish\",\"pt-BR\":\"Portuguese (Brazil)\",\"pt-PT\":\"Portuguese\",\"ro\":\"Romanian\",\"ru\":\"Russian\",\"sk\":\"Slovak\",\"sl\":\"Slovenian\",\"sr\":\"Serbian (latin)\",\"sv\":\"Swedish\",\"tr\":\"Turkish\",\"uk\":\"Ukrainian\",\"vi\":\"Vietnamese\",\"zh-CN\":\"Chinese Simplified (mainland China)\",\"zh-HK\":\"Chinese Traditional (Hong Kong)\",\"zh-TW\":\"Chinese Traditional (Taiwan)\",\"hi\":\"Hindi\",\"hr\":\"Croatian\"},\"localizable_files\":[\"locales/en/messages.json\",\"locales/en/messages.meta.json\"]}]');\n\t }),\n\t 5443:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"مواقع الويب\",\"settings_position_save_all\":\"كافة مواقع الويب\",\"settings_position_save_this\":\"هذا الموقع\",\"assistant_select_element_start\":\"بدء\",\"assistant_select_element_text\":\"اختر عنصرا في الصفحة للحظرقم بتحديث الصفحة لالغاء وضع حظر العنصر\",\"menu_filtration_status\":{\"message\":\"تفعيل الفلترةعلى هذا الموقع\"},\"menu_do_not_filter_30_sec\":{\"message\":\"عدم الفلترة لمده 30 ثانيه\"},\"menu_block_ad_on_site\":{\"message\":\"منع الإعلان على هذا الموقع\"},\"menu_report_abuse\":{\"message\":\"الإبلاغ عن هذا الموقع\"},\"menu_site_report\":{\"message\":\"تقرير أمن الموقع\"},\"menu_settings\":{\"message\":\"إعدادات المساعد\"},\"menu_wot_reputation_indicator\":{\"message\":\"مؤشر سمعة الموقع\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"مستوى الثقة في السمعة\"},\"assistant_select_element\":{\"message\":\"حظر العنصر\"},\"assistant_select_element_ext\":{\"message\":\"اختر عنصرا في الصفحة للحظر\"},\"assistant_select_element_cancel\":{\"message\":\"الغاء\"},\"assistant_block_element\":{\"message\":\"حظر العنصر\"},\"assistant_block_element_explain\":{\"message\":\"ضبط قاعدة حظر العنصر\"},\"assistant_slider_explain\":{\"message\":\"حرك شريط التمرير لتغيير حجم الإطار الذي ستعمل عليه القاعدة الجديدة:\"},\"assistant_extended_settings\":{\"message\":\"إعدادات متقدمة\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"تطبيق القاعدة علي كافة مواقع الويب\"},\"assistant_block_by_reference\":{\"message\":\"حظر حسب الارتباط المرجعي\"},\"assistant_block_similar\":{\"message\":\"حظر عنصر مما ثل\"},\"assistant_another_element\":{\"message\":\"حدد عنصرًا مختلفًا\"},\"assistant_preview\":{\"message\":\"المعاينه\"},\"assistant_block\":{\"message\":\"حظر\"},\"assistant_settings\":{\"message\":\"إعدادات المساعد\"},\"assistant_preview_header\":{\"message\":\"حجب عنصر--معاينه\"},\"assistant_preview_header_info\":{\"message\":\"تاكد من حظر هذا العنصر كما هو مقصود\"},\"assistant_preview_end\":{\"message\":\"إنهاء المعاينة\"},\"wot_unknown_description\":{\"message\":\"$1 لم يتم تعريف سمعه هذا الموقع من قبل\"},\"wot_bad_description\":{\"message\":\"$1هذا الموقع لديه سمعة سيئة للغاية \\\\nوفقاً لـ\"},\"wot_poor_description\":{\"message\":\"$1 هذا الموقع له سمعة سيئة \\\\nوفقا لـ\"},\"wot_unsatisfactory_description\":{\"message\":\"$1هذا الموقع له سمعة سيئة\\\\nوفقا لـ\"},\"wot_good_description\":{\"message\":\"$1يتمتع هذا الموقع بسمعة طيبة\\\\nوفقا لـ\"},\"wot_excellent_description\":{\"message\":\"هذا الموقع يتمتع بسمعة ممتازة\\\\nوفقاً لـ $1\"},\"settings_choose_size_and_position\":{\"message\":\"وموضعه AdGuard ضبط حجم مساعد\"},\"settings_icon_size\":{\"message\":\":حجم الرمز\"},\"settings_small\":{\"message\":\"صغير\"},\"settings_big\":{\"message\":\"كبير\"},\"settings_position\":{\"message\":\"وضع\"},\"settings_left_top\":{\"message\":\"اعلي اليسار\"},\"settings_right_top\":{\"message\":\"اعلي اليمين\"},\"settings_left_bottom\":{\"message\":\"أسفل لليسار\"},\"settings_right_bottom\":{\"message\":\"أسفل لليمين\"},\"settings_cancel\":{\"message\":\"الغاء\"},\"settings_save\":{\"message\":\"حفظ التغييرات\"}}');\n\t }),\n\t 24:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Сайты\",\"settings_position_save_all\":\"На ўсіх\",\"settings_position_save_this\":\"Толькі на гэтым\",\"assistant_select_element_start\":\"Пачаць\",\"assistant_select_element_text\":\"Абярыце на старонцы элемент для блакавання. Абнавіце старонку, каб скасаваць рэжым блакавання элементаў.\",\"menu_filtration_status\":{\"message\":\"Фільтрацыя на гэтым сайце\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Не фільтраваць 30 секундаў\"},\"menu_block_ad_on_site\":{\"message\":\"Заблакаваць рэкламу на сайце\"},\"menu_report_abuse\":{\"message\":\"Паскардзіцца на сайт\"},\"menu_site_report\":{\"message\":\"Справаздача пра бяспеку сайта\"},\"menu_settings\":{\"message\":\"Наладзіць памочнік\"},\"menu_wot_reputation_indicator\":{\"message\":\"Індыкатар рэпутацыі сайта\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Узровень верагоднасці рэпутацыі\"},\"assistant_select_element\":{\"message\":\"Блакаванне элемента\"},\"assistant_select_element_ext\":{\"message\":\"Абярыце на старонцы элемент, які трэба заблакаваць\"},\"assistant_select_element_cancel\":{\"message\":\"Скасаванне\"},\"assistant_block_element\":{\"message\":\"Блакаванне элемента\"},\"assistant_block_element_explain\":{\"message\":\"Наладзьце правіла блакавання элемента\"},\"assistant_slider_explain\":{\"message\":\"Перасоўвайце бегунок, каб змяніць памер блока, для якога будзе дзейнічаць правіла:\"},\"assistant_extended_settings\":{\"message\":\"Пашыраныя налады\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Ужыць правіла для ўсіх сайтаў\"},\"assistant_block_by_reference\":{\"message\":\"Блакаваць па спасылцы\"},\"assistant_block_similar\":{\"message\":\"Блакаваць падобныя\"},\"assistant_another_element\":{\"message\":\"Абраць іншы элемент\"},\"assistant_preview\":{\"message\":\"Перадпрагляд\"},\"assistant_block\":{\"message\":\"Заблакаваць\"},\"assistant_settings\":{\"message\":\"Налада памочніка\"},\"assistant_preview_header\":{\"message\":\"Блакаванне элемента - перадпрагляд\"},\"assistant_preview_header_info\":{\"message\":\"Пераканаецеся, што элемент заблакаваны як задумана\"},\"assistant_preview_end\":{\"message\":\"Скончыць перадпрагляд\"},\"wot_unknown_description\":{\"message\":\"Рэпутацыя не вызначана\"},\"wot_bad_description\":{\"message\":\"У сайта вельмі дрэнная рэпутацыя па дадзеных $1\"},\"wot_poor_description\":{\"message\":\"У сайта дрэнная рэпутацыя па дадзеных $1\"},\"wot_unsatisfactory_description\":{\"message\":\"У сайта нездавальняльная рэпутацыя па дадзеных $1\"},\"wot_good_description\":{\"message\":\"У сайта добрая рэпутацыя па дадзеных $1\"},\"wot_excellent_description\":{\"message\":\"У сайта выдатная рэпутацыя па дадзеных $1\"},\"settings_choose_size_and_position\":{\"message\":\"Наладзьце памер і становішча памочніка AdGuard\"},\"settings_icon_size\":{\"message\":\"Памер іконкі:\"},\"settings_small\":{\"message\":\"Маленькая\"},\"settings_big\":{\"message\":\"Вялікая\"},\"settings_position\":{\"message\":\"Месцаванне:\"},\"settings_left_top\":{\"message\":\"Уверсе злева\"},\"settings_right_top\":{\"message\":\"Уверсе справа\"},\"settings_left_bottom\":{\"message\":\"Унізе злева\"},\"settings_right_bottom\":{\"message\":\"Унізе справа\"},\"settings_cancel\":{\"message\":\"Скасаваць\"},\"settings_save\":{\"message\":\"Захаваць налады\"}}');\n\t }),\n\t 3337:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webové stránky\",\"settings_position_save_all\":\"Všechny webové stránky\",\"settings_position_save_this\":\"Tato webová stránka\",\"assistant_select_element_start\":\"Spustit\",\"assistant_select_element_text\":\"Vyberte prvek na stránce, který chcete zablokovat. Obnovte stránku pro zrušení režimu blokování prvků.\",\"menu_filtration_status\":{\"message\":\"Filtrování na těchto webových stránkách\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nefiltrovat po dobu 30 sekund\"},\"menu_block_ad_on_site\":{\"message\":\"Blokovat reklamy na této webové stránce\"},\"menu_report_abuse\":{\"message\":\"Nahlásit webovou stránku\"},\"menu_site_report\":{\"message\":\"Zpráva o bezpečnosti webové stránky\"},\"menu_settings\":{\"message\":\"Nastavení asistenta\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikátor reputace webu\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Úroveň důvěryhodnosti reputace\"},\"assistant_select_element\":{\"message\":\"Blokování prvku\"},\"assistant_select_element_ext\":{\"message\":\"Vyberte prvek na stránce, který chcete zablokovat\"},\"assistant_select_element_cancel\":{\"message\":\"Zrušit\"},\"assistant_block_element\":{\"message\":\"Blokování prvku\"},\"assistant_block_element_explain\":{\"message\":\"Upravit pravidlo blokování prvku\"},\"assistant_slider_explain\":{\"message\":\"Přesunutím posuvníku změňte velikost rámce, pro který bude nové pravidlo fungovat:\"},\"assistant_extended_settings\":{\"message\":\"Pokročilá nastavení\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Použít pravidlo pro všechny webové stránky\"},\"assistant_block_by_reference\":{\"message\":\"Blokovat referenčním odkazem\"},\"assistant_block_similar\":{\"message\":\"Blokovat podobné\"},\"assistant_another_element\":{\"message\":\"Vyber jiný prvek\"},\"assistant_preview\":{\"message\":\"Náhled\"},\"assistant_block\":{\"message\":\"Blokovat\"},\"assistant_settings\":{\"message\":\"Nastavení asistenta\"},\"assistant_preview_header\":{\"message\":\"Blokování prvku - náhled\"},\"assistant_preview_header_info\":{\"message\":\"Ujistěte se, že je prvek zablokován podle určení\"},\"assistant_preview_end\":{\"message\":\"Ukončit náhled\"},\"wot_unknown_description\":{\"message\":\"Pověst této webové stránky není definována podle $1\"},\"wot_bad_description\":{\"message\":\"Tato webová stránka má velmi špatnou pověst \\\\npodle $1\"},\"wot_poor_description\":{\"message\":\"Tato webová stránka má špatnou pověst \\\\npodle $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Tato webová stránka má špatnou pověst \\\\npodle $1\"},\"wot_good_description\":{\"message\":\"Tato webová stránka má dobrou pověst \\\\npodle $1\"},\"wot_excellent_description\":{\"message\":\"Tato webová stránka má výbornou pověst \\\\npodle $1\"},\"settings_choose_size_and_position\":{\"message\":\"Upravit velikost a pozici AdGuard Asistenta\"},\"settings_icon_size\":{\"message\":\"Velikost ikony:\"},\"settings_small\":{\"message\":\"Malá\"},\"settings_big\":{\"message\":\"Velká\"},\"settings_position\":{\"message\":\"Pozice:\"},\"settings_left_top\":{\"message\":\"Vlevo nahoře\"},\"settings_right_top\":{\"message\":\"Vpravo nahoře\"},\"settings_left_bottom\":{\"message\":\"Vlevo dole\"},\"settings_right_bottom\":{\"message\":\"Vpravo dole\"},\"settings_cancel\":{\"message\":\"Zrušit\"},\"settings_save\":{\"message\":\"Uložit změny\"}}');\n\t }),\n\t 7691:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Websteder\",\"settings_position_save_all\":\"Alle websteder\",\"settings_position_save_this\":\"Dette websted\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Vælg et element på denne side, der skal blokeres. Opfrisk siden for at afbryde elementblokeringstilstanden.\",\"menu_filtration_status\":{\"message\":\"Filtrering på dette websted\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Filtrér ikke i 30 sekunder\"},\"menu_block_ad_on_site\":{\"message\":\"Blokér annoncer på dette websted\"},\"menu_report_abuse\":{\"message\":\"Anmeld dette websted\"},\"menu_site_report\":{\"message\":\"Webstedssikkerhedsrapport\"},\"menu_settings\":{\"message\":\"Assistent-indstillinger\"},\"menu_wot_reputation_indicator\":{\"message\":\"Webstedsomdømmeindikator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Omdømmetillidsniveau\"},\"assistant_select_element\":{\"message\":\"Elementblokering\"},\"assistant_select_element_ext\":{\"message\":\"Vælg et element på siden, der skal blokeres\"},\"assistant_select_element_cancel\":{\"message\":\"Afbryd\"},\"assistant_block_element\":{\"message\":\"Elementblokering\"},\"assistant_block_element_explain\":{\"message\":\"Justér regel for elementblokering\"},\"assistant_slider_explain\":{\"message\":\"Flyt skyderen for at ændre størrelsen på den ramme, den nye regel vil fungere for:\"},\"assistant_extended_settings\":{\"message\":\"Avancerede indstillinger\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Anvend reglen på alle websteder\"},\"assistant_block_by_reference\":{\"message\":\"Blokér efter referencelink\"},\"assistant_block_similar\":{\"message\":\"Blokér lignende\"},\"assistant_another_element\":{\"message\":\"Vælg et andet element\"},\"assistant_preview\":{\"message\":\"Forhåndsvisning\"},\"assistant_block\":{\"message\":\"Blokér\"},\"assistant_settings\":{\"message\":\"Assistent-indstillinger\"},\"assistant_preview_header\":{\"message\":\"Elementblokering - forhåndsvisning\"},\"assistant_preview_header_info\":{\"message\":\"Sørg for, at elementet er blokeret som tilsigtet\"},\"assistant_preview_end\":{\"message\":\"Afslut forhåndsvisning\"},\"wot_unknown_description\":{\"message\":\"Dette websteds omdømme er ikke defineret af $1\"},\"wot_bad_description\":{\"message\":\"Dette websted har et meget dårligt omdømme jf. $1\"},\"wot_poor_description\":{\"message\":\"Dette websted har et dårligt omdømme jf. $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Dette websted har et ringe omdømme jf. $1\"},\"wot_good_description\":{\"message\":\"Dette websted har et godt omdømme jf. $1\"},\"wot_excellent_description\":{\"message\":\"Dette websted har et fremragende omdømme \\\\njf. $1\"},\"settings_choose_size_and_position\":{\"message\":\"Justér størrelse og position for AdGuard Assistent\"},\"settings_icon_size\":{\"message\":\"Ikonstørrelse:\"},\"settings_small\":{\"message\":\"Lille\"},\"settings_big\":{\"message\":\"Stor\"},\"settings_position\":{\"message\":\"Position:\"},\"settings_left_top\":{\"message\":\"Øverst til venstre\"},\"settings_right_top\":{\"message\":\"Øverst til højre\"},\"settings_left_bottom\":{\"message\":\"Nederst til venstre\"},\"settings_right_bottom\":{\"message\":\"Nederst til højre\"},\"settings_cancel\":{\"message\":\"Afbryd\"},\"settings_save\":{\"message\":\"Gem ændringer\"}}');\n\t }),\n\t 9947:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webseiten\",\"settings_position_save_all\":\"Alle Webseiten\",\"settings_position_save_this\":\"Diese Webseite\",\"assistant_select_element_start\":\"Starten\",\"assistant_select_element_text\":\"Wählen Sie ein zu sperrenden Element auf der Seite aus. Laden Sie die Seite neu, um den Sperrmodus zu verlassen.\",\"menu_filtration_status\":{\"message\":\"Diese Webseite filtern\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Schutz für 30 Sekunden deaktivieren\"},\"menu_block_ad_on_site\":{\"message\":\"Werbung auf dieser Seite sperren\"},\"menu_report_abuse\":{\"message\":\"Diese Webseite melden\"},\"menu_site_report\":{\"message\":\"Sicherheitsbericht dieser Webseite\"},\"menu_settings\":{\"message\":\"Assistent-Einstellungen\"},\"menu_wot_reputation_indicator\":{\"message\":\"Website-Reputations-Indikator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Reputationsvertrauensgrad\"},\"assistant_select_element\":{\"message\":\"Element sperren\"},\"assistant_select_element_ext\":{\"message\":\"Zu sperrendes Element auf der Seite auswählen\"},\"assistant_select_element_cancel\":{\"message\":\"Abbrechen\"},\"assistant_block_element\":{\"message\":\"Element sperren\"},\"assistant_block_element_explain\":{\"message\":\"Regel zum Sperren von Elementen anpassen\"},\"assistant_slider_explain\":{\"message\":\"Bewegen Sie den Schieberegler, um die Ausmaßgröße der neuen Regeln zu ändern:\"},\"assistant_extended_settings\":{\"message\":\"Erweiterte Einstellungen\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Regel auf alle Webseiten anwenden\"},\"assistant_block_by_reference\":{\"message\":\"Durch Referenzlink sperren\"},\"assistant_block_similar\":{\"message\":\"Ähnliche Elemente sperren\"},\"assistant_another_element\":{\"message\":\"Ein anderes Element wählen\"},\"assistant_preview\":{\"message\":\"Vorschau\"},\"assistant_block\":{\"message\":\"Sperren\"},\"assistant_settings\":{\"message\":\"Assistent-Einstellungen\"},\"assistant_preview_header\":{\"message\":\"Vorschau der zu sperrenden Elemente\"},\"assistant_preview_header_info\":{\"message\":\"Prüfen Sie, ob das Element wie vorgesehen gesperrt wurde.\"},\"assistant_preview_end\":{\"message\":\"Vorschau beenden\"},\"wot_unknown_description\":{\"message\":\"Der Ruf dieser Webseite wird nicht durch $1 festgelegt\"},\"wot_bad_description\":{\"message\":\"Diese Webseite hat einen sehr schlechten Ruf laut $1\"},\"wot_poor_description\":{\"message\":\"Diese Webseite hat einen schlechten Ruf laut $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Diese Webseite hat einen schlechten Ruf laut $1\"},\"wot_good_description\":{\"message\":\"Diese Webseite hat einen guten Ruf laut $1\"},\"wot_excellent_description\":{\"message\":\"Diese Webseite hat einen exzellenten Ruf laut $1\"},\"settings_choose_size_and_position\":{\"message\":\"Anpassen der Größe und Position des AdGuard-Assistent\"},\"settings_icon_size\":{\"message\":\"Symbol-Größe:\"},\"settings_small\":{\"message\":\"Klein\"},\"settings_big\":{\"message\":\"Groß\"},\"settings_position\":{\"message\":\"Position:\"},\"settings_left_top\":{\"message\":\"Oben links\"},\"settings_right_top\":{\"message\":\"Oben rechts\"},\"settings_left_bottom\":{\"message\":\"Unten links\"},\"settings_right_bottom\":{\"message\":\"Unten rechts\"},\"settings_cancel\":{\"message\":\"Abbrechen\"},\"settings_save\":{\"message\":\"Änderungen speichern\"}}');\n\t }),\n\t 1773:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Ιστοσελίδες\",\"settings_position_save_all\":\"Όλοι οι ιστότοποι\",\"settings_position_save_this\":\"Αυτός ο ιστότοπος\",\"assistant_select_element_start\":\"Εκκίνηση\",\"assistant_select_element_text\":\"Επιλέξτε ένα στοιχείο στη σελίδα για αποκλεισμό. Ανανεώστε τη σελίδα για να ακυρώσετε τη λειτουργία αποκλεισμού στοιχείων.\",\"menu_filtration_status\":{\"message\":\"Φιλτράρισμα σε αυτόν τον ιστότοπο\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Παύση φιλτραρίσματος για 30 δευτερόλεπτα\"},\"menu_block_ad_on_site\":{\"message\":\"Αποκλεισμός διαφήμισης σε αυτόν τον ιστότοπο\"},\"menu_report_abuse\":{\"message\":\"Αναφέρετε αυτόν τον ιστότοπο\"},\"menu_site_report\":{\"message\":\"Αναφορά ασφάλειας ιστότοπου\"},\"menu_settings\":{\"message\":\"Ρυθμίσεις βοηθού\"},\"menu_wot_reputation_indicator\":{\"message\":\"Δείκτης φήμης ιστότοπου\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Επίπεδο εμπιστοσύνης φήμης\"},\"assistant_select_element\":{\"message\":\"Αποκλεισμός στοιχείου\"},\"assistant_select_element_ext\":{\"message\":\"Επιλέξτε ένα στοιχείο στη σελίδα για αποκλεισμό\"},\"assistant_select_element_cancel\":{\"message\":\"Άκυρο\"},\"assistant_block_element\":{\"message\":\"Αποκλεισμός στοιχείου\"},\"assistant_block_element_explain\":{\"message\":\"Προσαρμόστε τον κανόνα αποκλεισμού στοιχείου\"},\"assistant_slider_explain\":{\"message\":\"Μετακινήστε το ρυθμιστικό για να αλλάξετε το μέγεθος του πλαισίου για τον οποίο θα λειτουργεί ο νέος κανόνας:\"},\"assistant_extended_settings\":{\"message\":\"Προηγμένες ρυθμίσεις\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Εφαρμογή του κανόνα σε όλες τις ιστοσελίδες\"},\"assistant_block_by_reference\":{\"message\":\"Αποκλεισμός μέσω συνδέσμου αναφοράς\"},\"assistant_block_similar\":{\"message\":\"Αποκλεισμός παρόμοιου\"},\"assistant_another_element\":{\"message\":\"Επιλέξτε ένα διαφορετικό στοιχείο\"},\"assistant_preview\":{\"message\":\"Προεπισκόπηση\"},\"assistant_block\":{\"message\":\"Αποκλεισμός\"},\"assistant_settings\":{\"message\":\"Ρυθμίσεις βοηθού\"},\"assistant_preview_header\":{\"message\":\"Αποκλεισμός στοιχείου - προεπισκόπηση\"},\"assistant_preview_header_info\":{\"message\":\"Βεβαιωθείτε ότι το στοιχείο είναι μπλοκαρισμένο όπως προορίζεται\"},\"assistant_preview_end\":{\"message\":\"Έξοδος προεπισκόπησης\"},\"wot_unknown_description\":{\"message\":\"Η φήμη αυτού του ιστότοπου δεν έχει καθοριστεί από το $1\"},\"wot_bad_description\":{\"message\":\"Αυτός ο ιστότοπος έχει πολύ κακή φήμη\\\\nσύμφωνα με το $1\"},\"wot_poor_description\":{\"message\":\"Αυτός ο ιστότοπος έχει κακή φήμη\\\\nσύμφωνα με το $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Αυτός ο ιστότοπος έχει κακή φήμη\\\\nσύμφωνα με το $1\"},\"wot_good_description\":{\"message\":\"Αυτός ο ιστότοπος έχει καλή φήμη\\\\nσύμφωνα με το $1\"},\"wot_excellent_description\":{\"message\":\"Αυτός ο ιστότοπος έχει εξαιρετική φήμη\\\\nσύμφωνα με το $1\"},\"settings_choose_size_and_position\":{\"message\":\"Προσαρμόστε το μέγεθος και τη θέση του Βοηθού AdGuard\"},\"settings_icon_size\":{\"message\":\"Μέγεθος εικονιδίου:\"},\"settings_small\":{\"message\":\"Μικρό\"},\"settings_big\":{\"message\":\"Μεγάλο\"},\"settings_position\":{\"message\":\"Θέση:\"},\"settings_left_top\":{\"message\":\"Πάνω αριστερά\"},\"settings_right_top\":{\"message\":\"Πάνω δεξιά\"},\"settings_left_bottom\":{\"message\":\"Κάτω αριστερά\"},\"settings_right_bottom\":{\"message\":\"Κάτω δεξιά\"},\"settings_cancel\":{\"message\":\"Άκυρο\"},\"settings_save\":{\"message\":\"Αποθήκευση αλλαγών\"}}');\n\t }),\n\t 1272:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Websites\",\"settings_position_save_all\":\"All websites\",\"settings_position_save_this\":\"This website\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Choose an element on the page to block. Refresh the page to cancel the element blocking mode.\",\"menu_filtration_status\":{\"message\":\"Filtering on this website\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Do not filter for 30 seconds\"},\"menu_block_ad_on_site\":{\"message\":\"Block ad on this website\"},\"menu_report_abuse\":{\"message\":\"Report the website\"},\"menu_site_report\":{\"message\":\"Website security report\"},\"menu_settings\":{\"message\":\"Assistant settings\"},\"menu_wot_reputation_indicator\":{\"message\":\"Site reputation indicator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Reputation Confidence Level\"},\"assistant_select_element\":{\"message\":\"Element blocking\"},\"assistant_select_element_ext\":{\"message\":\"Choose an element on the page to block\"},\"assistant_select_element_cancel\":{\"message\":\"Cancel\"},\"assistant_block_element\":{\"message\":\"Element blocking\"},\"assistant_block_element_explain\":{\"message\":\"Adjust element blocking rule\"},\"assistant_slider_explain\":{\"message\":\"Move the slider to change the size of the frame the new rule will work for:\"},\"assistant_extended_settings\":{\"message\":\"Advanced settings\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Apply the rule to all websites\"},\"assistant_block_by_reference\":{\"message\":\"Block by reference link\"},\"assistant_block_similar\":{\"message\":\"Block similar\"},\"assistant_another_element\":{\"message\":\"Select a different element\"},\"assistant_preview\":{\"message\":\"Preview\"},\"assistant_block\":{\"message\":\"Block\"},\"assistant_settings\":{\"message\":\"Assistant settings\"},\"assistant_preview_header\":{\"message\":\"Element blocking - preview\"},\"assistant_preview_header_info\":{\"message\":\"Make sure that element is blocked as intended\"},\"assistant_preview_end\":{\"message\":\"Exit preview\"},\"wot_unknown_description\":{\"message\":\"This website\\'s reputation is not defined by $1\"},\"wot_bad_description\":{\"message\":\"This website has a very bad reputation\\\\naccording to $1\"},\"wot_poor_description\":{\"message\":\"This website has a bad reputation \\\\naccording to $1\"},\"wot_unsatisfactory_description\":{\"message\":\"This website has a poor reputation\\\\naccording to $1\"},\"wot_good_description\":{\"message\":\"This website has a good reputation\\\\naccording to $1\"},\"wot_excellent_description\":{\"message\":\"This website has an excellent reputation\\\\naccording to $1\"},\"settings_choose_size_and_position\":{\"message\":\"Adjust AdGuard Assistant size and position\"},\"settings_icon_size\":{\"message\":\"Icon size:\"},\"settings_small\":{\"message\":\"Small\"},\"settings_big\":{\"message\":\"Large\"},\"settings_position\":{\"message\":\"Position:\"},\"settings_left_top\":{\"message\":\"Top left\"},\"settings_right_top\":{\"message\":\"Top right\"},\"settings_left_bottom\":{\"message\":\"Bottom left\"},\"settings_right_bottom\":{\"message\":\"Bottom right\"},\"settings_cancel\":{\"message\":\"Cancel\"},\"settings_save\":{\"message\":\"Save changes\"}}');\n\t }),\n\t 8194:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sitios web\",\"settings_position_save_all\":\"Todos los sitios web\",\"settings_position_save_this\":\"Este sitio web\",\"assistant_select_element_start\":\"Comenzar\",\"assistant_select_element_text\":\"Elige un elemento en la página para bloquear. Actualiza la página para cancelar el bloqueo de elementos.\",\"menu_filtration_status\":{\"message\":\"Filtrado en este sitio web\"},\"menu_do_not_filter_30_sec\":{\"message\":\"No filtrar durante 30 segundos\"},\"menu_block_ad_on_site\":{\"message\":\"Bloquear anuncios en este sitio web\"},\"menu_report_abuse\":{\"message\":\"Reportar el sitio web\"},\"menu_site_report\":{\"message\":\"Informe de seguridad del sitio web\"},\"menu_settings\":{\"message\":\"Configuración del asistente\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicador de reputación del sitio\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nivel de confianza de reputación\"},\"assistant_select_element\":{\"message\":\"Bloqueo de elementos\"},\"assistant_select_element_ext\":{\"message\":\"Elige un elemento en la página para bloquear\"},\"assistant_select_element_cancel\":{\"message\":\"Cancelar\"},\"assistant_block_element\":{\"message\":\"Bloqueo de elementos\"},\"assistant_block_element_explain\":{\"message\":\"Ajustar la regla de bloqueo del elemento\"},\"assistant_slider_explain\":{\"message\":\"Mueve el control deslizante para cambiar el tamaño del marco para el que funcionará la nueva regla:\"},\"assistant_extended_settings\":{\"message\":\"Configuración avanzada\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplicar la regla a todos los sitios web\"},\"assistant_block_by_reference\":{\"message\":\"Bloquear por enlace de referencia\"},\"assistant_block_similar\":{\"message\":\"Bloquear elemento similar\"},\"assistant_another_element\":{\"message\":\"Seleccionar otro elemento\"},\"assistant_preview\":{\"message\":\"Vista previa\"},\"assistant_block\":{\"message\":\"Bloquear\"},\"assistant_settings\":{\"message\":\"Configuración del asistente\"},\"assistant_preview_header\":{\"message\":\"Bloqueo de elementos - vista previa\"},\"assistant_preview_header_info\":{\"message\":\"Asegúrate de que el elemento esté bloqueado como se deseaba\"},\"assistant_preview_end\":{\"message\":\"Salir de vista previa\"},\"wot_unknown_description\":{\"message\":\"La reputación de este sitio web no está definida por $1\"},\"wot_bad_description\":{\"message\":\"Este sitio web tiene muy mala reputación\\\\nde acuerdo a $1\"},\"wot_poor_description\":{\"message\":\"Este sitio web tiene mala reputación\\\\nde acuerdo a $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Este sitio web tiene pobre reputación\\\\nde acuerdo a $1\"},\"wot_good_description\":{\"message\":\"Este sitio web tiene buena reputación\\\\nde acuerdo a $1\"},\"wot_excellent_description\":{\"message\":\"Este sitio web tiene excelente reputación\\\\nde acuerdo a $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajustar el tamaño y la posición del Asistente de AdGuard\"},\"settings_icon_size\":{\"message\":\"Tamaño del icono:\"},\"settings_small\":{\"message\":\"Pequeño\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posición:\"},\"settings_left_top\":{\"message\":\"Arriba a la izquierda\"},\"settings_right_top\":{\"message\":\"Arriba a la derecha\"},\"settings_left_bottom\":{\"message\":\"Abajo a la izquierda\"},\"settings_right_bottom\":{\"message\":\"Abajo a la derecha\"},\"settings_cancel\":{\"message\":\"Cancelar\"},\"settings_save\":{\"message\":\"Guardar cambios\"}}');\n\t }),\n\t 5455:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"وبسایت\",\"settings_position_save_all\":\"همه وبسایت ها\",\"settings_position_save_this\":\"این وبسایت\",\"assistant_select_element_start\":\"شروع\",\"assistant_select_element_text\":\"عنصری در صفحه برای مسدودسازی انتخاب کنید. برای لغو،صفحه را رفرش کنید.\",\"menu_filtration_status\":{\"message\":\"فیلترینگ در این وبسایت\"},\"menu_do_not_filter_30_sec\":{\"message\":\"به مدت 30 ثانیه فیلتر نکن\"},\"menu_block_ad_on_site\":{\"message\":\"مسدودسازی تبلیغ در این وبسایت\"},\"menu_report_abuse\":{\"message\":\"گزارش وبسایت\"},\"menu_site_report\":{\"message\":\"گزارش امنیتی وبسایت\"},\"menu_settings\":{\"message\":\"تنظیمات دستیار\"},\"menu_wot_reputation_indicator\":{\"message\":\"نشانگر اعتبار سایت\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"سطح اعتبار\"},\"assistant_select_element\":{\"message\":\"مسدودسازی عنصر\"},\"assistant_select_element_ext\":{\"message\":\"عنصری در صفحه برای مسدودسازی انتخاب کنید\"},\"assistant_select_element_cancel\":{\"message\":\"لغو\"},\"assistant_block_element\":{\"message\":\"مسدودسازی عنصر\"},\"assistant_block_element_explain\":{\"message\":\"تنظیم دستور مسدودسازی عنصر\"},\"assistant_slider_explain\":{\"message\":\"جابجایی لغزنده برای تغییر اندازه فریم که دستور جدیدی کار خواهد کرد:\"},\"assistant_extended_settings\":{\"message\":\"تنظیمات پیشرفته\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"اِعمال دستور در همه وبسایت ها\"},\"assistant_block_by_reference\":{\"message\":\"مسدودسازی با لینک مرجع\"},\"assistant_block_similar\":{\"message\":\"مسدودسازی مشابه\"},\"assistant_another_element\":{\"message\":\"عنصر دیگری انتخاب کنید\"},\"assistant_preview\":{\"message\":\"پیشنمایش\"},\"assistant_block\":{\"message\":\"مسدود\"},\"assistant_settings\":{\"message\":\"تنظیمات دستیار\"},\"assistant_preview_header\":{\"message\":\"مسدودسازی عنصر - پیشنمایش\"},\"assistant_preview_header_info\":{\"message\":\"مطمئن شوید عنصر به شکل دلخواه مسدود شود\"},\"assistant_preview_end\":{\"message\":\"خروج از پیشنمایش\"},\"wot_unknown_description\":{\"message\":\"اعتبار تعریف نشده است\"},\"wot_bad_description\":{\"message\":\"این وبسایت اعتبار خیلی بدی دارد\\\\nبر طبق \"},\"wot_poor_description\":{\"message\":\"این وبسایت اعتبار بدی دارد\\\\nبر طبق \"},\"wot_unsatisfactory_description\":{\"message\":\"این وبسایت اعتبار کمی دارد\\\\nبر طبق \"},\"wot_good_description\":{\"message\":\"این وبسایت اعتبار خوبی دارد\\\\nبر طبق \"},\"wot_excellent_description\":{\"message\":\"این وبسایت اعتبار عالی دارد\\\\nبر طبق \"},\"settings_choose_size_and_position\":{\"message\":\"تنظیم اندازه و موقعیت دستیار AdGuard\"},\"settings_icon_size\":{\"message\":\"اندازه آیکون:\"},\"settings_small\":{\"message\":\"کوچک\"},\"settings_big\":{\"message\":\"بزرگ\"},\"settings_position\":{\"message\":\"موقعیت:\"},\"settings_left_top\":{\"message\":\"بالا سمت چپ\"},\"settings_right_top\":{\"message\":\"بالا سمت راست\"},\"settings_left_bottom\":{\"message\":\"پایین سمت چپ\"},\"settings_right_bottom\":{\"message\":\"پایین سمت راست\"},\"settings_cancel\":{\"message\":\"لغو\"},\"settings_save\":{\"message\":\"ذخیره تغییرات\"}}');\n\t }),\n\t 6183:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Verkkosivustot\",\"settings_position_save_all\":\"Kaikki sivustot\",\"settings_position_save_this\":\"Tämä sivusto\",\"assistant_select_element_start\":\"Aloita\",\"assistant_select_element_text\":\"Valitse sivulta estettävä elementti. Päivitä sivu poistuaksesi elementtien estotilasta.\",\"menu_filtration_status\":{\"message\":\"Tämän sivuston suodatus\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Pysäytä suodatus 30 sekunnin ajaksi\"},\"menu_block_ad_on_site\":{\"message\":\"Estä mainos tältä sivustolta\"},\"menu_report_abuse\":{\"message\":\"Ilmoita ongelmasta\"},\"menu_site_report\":{\"message\":\"Sivuston suojausraportti\"},\"menu_settings\":{\"message\":\"Apurin asetukset\"},\"menu_wot_reputation_indicator\":{\"message\":\"Sivuston maine\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Mainearvion luotettavuus\"},\"assistant_select_element\":{\"message\":\"Elementin esto\"},\"assistant_select_element_ext\":{\"message\":\"Valitse sivulta estettävä elementti\"},\"assistant_select_element_cancel\":{\"message\":\"Peruuta\"},\"assistant_block_element\":{\"message\":\"Elementin esto\"},\"assistant_block_element_explain\":{\"message\":\"Muokkaa elementinestosääntöä\"},\"assistant_slider_explain\":{\"message\":\"Siirrä liukukytkintä muuttaaksesi sen kehyksen kokoa, johon tämä sääntö vaikuttaa:\"},\"assistant_extended_settings\":{\"message\":\"Edistyneet lisäasetukset\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Käytä kaikilla sivustoilla\"},\"assistant_block_by_reference\":{\"message\":\"Estä viitelinkillä\"},\"assistant_block_similar\":{\"message\":\"Estä samankaltaiset\"},\"assistant_another_element\":{\"message\":\"Valitse eri elementti\"},\"assistant_preview\":{\"message\":\"Esikatsele\"},\"assistant_block\":{\"message\":\"Estä\"},\"assistant_settings\":{\"message\":\"Apurin asetukset\"},\"assistant_preview_header\":{\"message\":\"Elementin estosäännön esikatselu\"},\"assistant_preview_header_info\":{\"message\":\"Varmista, että elementti estetään tarkoituksenmukaisesti\"},\"assistant_preview_end\":{\"message\":\"Sulje esikatselu\"},\"wot_unknown_description\":{\"message\":\"$1 ei tarjoa sivustolle mainearviointia\"},\"wot_bad_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on erittäin huono maine\"},\"wot_poor_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on huono maine\"},\"wot_unsatisfactory_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on heikko maine\"},\"wot_good_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on hyvä maine\"},\"wot_excellent_description\":{\"message\":\"$1 arvioinnin mukaan sivustolla on erinomainen maine\"},\"settings_choose_size_and_position\":{\"message\":\"Säädä AdGuard Avustajan kokoa ja sijaintia\"},\"settings_icon_size\":{\"message\":\"Kuvakkeen koko:\"},\"settings_small\":{\"message\":\"Pieni\"},\"settings_big\":{\"message\":\"Suuri\"},\"settings_position\":{\"message\":\"Sijainti:\"},\"settings_left_top\":{\"message\":\"Ylhäällä vasemmalla\"},\"settings_right_top\":{\"message\":\"Ylhäällä oikealla\"},\"settings_left_bottom\":{\"message\":\"Alhaalla vasemmalla\"},\"settings_right_bottom\":{\"message\":\"Alhaalla oikealla\"},\"settings_cancel\":{\"message\":\"Peruuta\"},\"settings_save\":{\"message\":\"Tallenna muutokset\"}}');\n\t }),\n\t 4652:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sites web\",\"settings_position_save_all\":\"Tous les sites web\",\"settings_position_save_this\":\"Ce site web\",\"assistant_select_element_start\":\"Démarrer\",\"assistant_select_element_text\":\"Choisissez un élément de la page à bloquer. Pour afficher l\\'élément de nouveau, rafraîchissez la page.\",\"menu_filtration_status\":{\"message\":\"Filtrages sur ce site\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne pas filtrer pendant 30 secondes \"},\"menu_block_ad_on_site\":{\"message\":\"Blocage des annonces sur ce site \"},\"menu_report_abuse\":{\"message\":\"Signaler le site\"},\"menu_site_report\":{\"message\":\"Rapport de sécurité du site\"},\"menu_settings\":{\"message\":\"Réglages de l\\'Assistant AdGuard\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indice de réputation du site\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Niveau de confiance\"},\"assistant_select_element\":{\"message\":\"Blocage d\\'éléments \"},\"assistant_select_element_ext\":{\"message\":\"Choisir un élément de la page à bloquer \"},\"assistant_select_element_cancel\":{\"message\":\"Annuler\"},\"assistant_block_element\":{\"message\":\"Blocage d\\'éléments \"},\"assistant_block_element_explain\":{\"message\":\"Affiner la règle de blocage d\\'elements\"},\"assistant_slider_explain\":{\"message\":\"Déplacez le curseur pour modifier la taille du cadre de travail de la nouvelle règle\"},\"assistant_extended_settings\":{\"message\":\"Paramétrages avancés \"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Appliquer la règle à tous les sites\"},\"assistant_block_by_reference\":{\"message\":\"Blocage par liens de reference\"},\"assistant_block_similar\":{\"message\":\"Blocage des objets similaires \"},\"assistant_another_element\":{\"message\":\"Sélectionner un élément différent\"},\"assistant_preview\":{\"message\":\"Previsualisation \"},\"assistant_block\":{\"message\":\"Blocage \"},\"assistant_settings\":{\"message\":\"Réglages de l\\'Assistant AdGuard\"},\"assistant_preview_header\":{\"message\":\"Blocage d\\'éléments - Previsualisation \"},\"assistant_preview_header_info\":{\"message\":\"Assurez-vous que l\\'élément est bloqué comme prévu\"},\"assistant_preview_end\":{\"message\":\"Sortir de la previsualisation \"},\"wot_unknown_description\":{\"message\":\"La définition de la réputation de ce site web n\\'est pas définie par $1\"},\"wot_bad_description\":{\"message\":\"Ce site web a très mauvaise réputation selon $1\"},\"wot_poor_description\":{\"message\":\"Ce site web a mauvaise réputation selon $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ce site web a une reputation médiocre selon $1\"},\"wot_good_description\":{\"message\":\"Ce site a bonne réputation selon $1\"},\"wot_excellent_description\":{\"message\":\"Ce site a une réputation excellente selon $1\"},\"settings_choose_size_and_position\":{\"message\":\"Affiner la taille et la position de l\\'assistant AdGuard \"},\"settings_icon_size\":{\"message\":\"Taille de l\\'icone\"},\"settings_small\":{\"message\":\"Petite\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Positionnement\"},\"settings_left_top\":{\"message\":\"En haut à gauche\"},\"settings_right_top\":{\"message\":\"En haut à droite\"},\"settings_left_bottom\":{\"message\":\"En bas à gauche\"},\"settings_right_bottom\":{\"message\":\"En bas à droite \"},\"settings_cancel\":{\"message\":\"Annuler\"},\"settings_save\":{\"message\":\"Sauvegarder les modifications \"}}');\n\t }),\n\t 6514:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"אתרים\",\"settings_position_save_all\":\"כל האתרים\",\"settings_position_save_this\":\"האתר הזה\",\"assistant_select_element_start\":\"התחל\",\"assistant_select_element_text\":\".בחר אלמנט בדף לחסימה .רענן את הדף כדי לבטל את מצב חסימת האלמנטים\",\"menu_filtration_status\":{\"message\":\"סינון באתר זה\"},\"menu_do_not_filter_30_sec\":{\"message\":\"אל תסנן למשך 30 שניות\"},\"menu_block_ad_on_site\":{\"message\":\"חסום פרסומת באתר זה\"},\"menu_report_abuse\":{\"message\":\"דווח על האתר\"},\"menu_site_report\":{\"message\":\"דוח אבטחת אתר\"},\"menu_settings\":{\"message\":\"הגדרות המסייע\"},\"menu_wot_reputation_indicator\":{\"message\":\"מד של מוניטין אתרים\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"רמת אמון מוניטין\"},\"assistant_select_element\":{\"message\":\"חסימת אלמנט\"},\"assistant_select_element_ext\":{\"message\":\"בחר אלמנט בדף לחסימה\"},\"assistant_select_element_cancel\":{\"message\":\"בטל\"},\"assistant_block_element\":{\"message\":\"חסימת אלמנט\"},\"assistant_block_element_explain\":{\"message\":\"התאם כלל של חסימת אלמנט\"},\"assistant_slider_explain\":{\"message\":\"הזז את המַחְלֵק כדי לשנות את גודל המסגרת שבה הכלל החדש יעבוד:\"},\"assistant_extended_settings\":{\"message\":\"הגדרות מתקדמות\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"החל את הכלל בכל האתרים\"},\"assistant_block_by_reference\":{\"message\":\"חסום לפי קישור הפניה\"},\"assistant_block_similar\":{\"message\":\"חסום דומה\"},\"assistant_another_element\":{\"message\":\"בחר אלמנט אחר\"},\"assistant_preview\":{\"message\":\"הצג מראש\"},\"assistant_block\":{\"message\":\"חסום\"},\"assistant_settings\":{\"message\":\"הגדרות המסייע\"},\"assistant_preview_header\":{\"message\":\"חסימת אלמנט - תצוגה מקדימה\"},\"assistant_preview_header_info\":{\"message\":\"ודא כי אלמנט זה חסום כמתוכנן\"},\"assistant_preview_end\":{\"message\":\"צא מתצוגה מקדימה\"},\"wot_unknown_description\":{\"message\":\"המוניטין של אתר זה אינו מוגדר על ידי $1\"},\"wot_bad_description\":{\"message\":\"לאתר זה יש מוניטין רע מאוד\\\\nעל פי $1\"},\"wot_poor_description\":{\"message\":\"לאתר זה יש מוניטין רע \\\\nעל פי $1\"},\"wot_unsatisfactory_description\":{\"message\":\"לאתר זה יש מוניטין ירוד\\\\nעל פי $1\"},\"wot_good_description\":{\"message\":\"לאתר זה יש מוניטין טוב\\\\nעל פי $1\"},\"wot_excellent_description\":{\"message\":\"לאתר זה יש מוניטין מצויין\\\\nעל פי $1\"},\"settings_choose_size_and_position\":{\"message\":\"התאם גודל ומיקום של מסייע AdGuard\"},\"settings_icon_size\":{\"message\":\"גודל איקון:\"},\"settings_small\":{\"message\":\"קטן\"},\"settings_big\":{\"message\":\"גדול\"},\"settings_position\":{\"message\":\"מיקום:\"},\"settings_left_top\":{\"message\":\"בחלק העליון משמאל\"},\"settings_right_top\":{\"message\":\"בחלק העליון מימין\"},\"settings_left_bottom\":{\"message\":\"צד שמאל למטה\"},\"settings_right_bottom\":{\"message\":\"צד ימין למטה\"},\"settings_cancel\":{\"message\":\"בטל\"},\"settings_save\":{\"message\":\"שמור שינויים\"}}');\n\t }),\n\t 1996:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"assistant_extended_settings\":{\"message\":\"उन्नत सेटिंग\"},\"assistant_block\":{\"message\":\"अवरुद्ध\"},\"settings_icon_size\":{\"message\":\"आइकन का आकार:\"},\"settings_small\":{\"message\":\"छोटा\"},\"settings_big\":{\"message\":\"बड़ा\"}}');\n\t }),\n\t 2178:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Web stranice\",\"settings_position_save_all\":\"Sve web stranice\",\"settings_position_save_this\":\"Ova web stranica\",\"assistant_select_element_start\":\"Započni\",\"assistant_select_element_text\":\"Odaberite element na stranici za blokiranje. Osvježite stranicu za izlazak iz načina blokade elemenata.\",\"menu_filtration_status\":{\"message\":\"Filtriranje na ovoj web stranici\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne filtriraj idućih 30 sekundi\"},\"menu_block_ad_on_site\":{\"message\":\"Blokiraj oglas na ovoj web stranici\"},\"menu_report_abuse\":{\"message\":\"Prijavi ovu stranicu\"},\"menu_site_report\":{\"message\":\"Sigurnosni izvještaj stranice\"},\"menu_settings\":{\"message\":\"Postavke pomoćnika\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikator reputacije stranice\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Razina povjerenja reputacije\"},\"assistant_select_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_select_element_ext\":{\"message\":\"Odaberite element na stranici za blokiranje\"},\"assistant_select_element_cancel\":{\"message\":\"Poništi\"},\"assistant_block_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_block_element_explain\":{\"message\":\"Prilagodite pravilo blokiranja elemenata\"},\"assistant_slider_explain\":{\"message\":\"Pomaknite klizač da biste promijenili veličinu okvira na koji će se primijeniti novo pravilo:\"},\"assistant_extended_settings\":{\"message\":\"Napredne postavke\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Primjeni pravilo na sve web stranice\"},\"assistant_block_by_reference\":{\"message\":\"Blokiraj referentnom vezom\"},\"assistant_block_similar\":{\"message\":\"Blokiraj slične\"},\"assistant_another_element\":{\"message\":\"Odaberite drugi element\"},\"assistant_preview\":{\"message\":\"Pregled\"},\"assistant_block\":{\"message\":\"Blokiraj\"},\"assistant_settings\":{\"message\":\"Postavke pomoćnika\"},\"assistant_preview_header\":{\"message\":\"Pregled blokiranja elementa\"},\"assistant_preview_header_info\":{\"message\":\"Provjerite da je li element blokiran kako ste željeli\"},\"assistant_preview_end\":{\"message\":\"Izlaz iz pregleda\"},\"wot_unknown_description\":{\"message\":\"Reputaciju stranice nije odredio $1\"},\"wot_bad_description\":{\"message\":\"Web stranica ima jako lošu reputaciju \\\\nprema $1\"},\"wot_poor_description\":{\"message\":\"Web stranica ima lošu reputaciju \\\\nprema $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Web stranica ima lošu reputaciju \\\\nprema $1\"},\"wot_good_description\":{\"message\":\"Web stranica ima dobru reputaciju \\\\nprema $1\"},\"wot_excellent_description\":{\"message\":\"Web stranica ima odličnu reputaciju \\\\nprema $1\"},\"settings_choose_size_and_position\":{\"message\":\"Podesite veličinu i poziciju AdGuard Pomoćnika\"},\"settings_icon_size\":{\"message\":\"Veličina ikone:\"},\"settings_small\":{\"message\":\"Malo\"},\"settings_big\":{\"message\":\"Veliko\"},\"settings_position\":{\"message\":\"Pozicija:\"},\"settings_left_top\":{\"message\":\"Gore lijevo\"},\"settings_right_top\":{\"message\":\"Gore desno\"},\"settings_left_bottom\":{\"message\":\"Dolje lijevo\"},\"settings_right_bottom\":{\"message\":\"Dolje desno\"},\"settings_cancel\":{\"message\":\"Poništi\"},\"settings_save\":{\"message\":\"Spremi promjene\"}}');\n\t }),\n\t 2698:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Weboldalak\",\"settings_position_save_all\":\"Minden weboldal\",\"settings_position_save_this\":\"Ez a weboldal\",\"assistant_select_element_start\":\"Indítás\",\"assistant_select_element_text\":\"Válassza ki az elemet az oldalon, amit blokkolni szeretne. Frissítse az oldalt, hogy kilépjen az elemblokkoló módból.\",\"menu_filtration_status\":{\"message\":\"Szűrés ezen a weboldalon\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Szüneteltetés 30 másodpercig\"},\"menu_block_ad_on_site\":{\"message\":\"Hirdetés blokkolása ezen a weboldalon\"},\"menu_report_abuse\":{\"message\":\"Weboldal jelentése\"},\"menu_site_report\":{\"message\":\"Weboldal biztonsági jelentése\"},\"menu_settings\":{\"message\":\"Asszisztens beállításai\"},\"menu_wot_reputation_indicator\":{\"message\":\"A webhely hírnevének mutatója\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"A hírnév bizalmi szintje\"},\"assistant_select_element\":{\"message\":\"Elem blokkolása\"},\"assistant_select_element_ext\":{\"message\":\"Válassza ki az elemet az oldalon, amit blokkolni szeretne\"},\"assistant_select_element_cancel\":{\"message\":\"Mégse\"},\"assistant_block_element\":{\"message\":\"Elem blokkolása\"},\"assistant_block_element_explain\":{\"message\":\"Állítsa be az elemet blokkoló szabályt\"},\"assistant_slider_explain\":{\"message\":\"Mozgassa a csúszkát a keret méretének megváltoztatásához, amelyre az új szabály működni fog:\"},\"assistant_extended_settings\":{\"message\":\"Haladó beállítások\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Szabály alkalmazása az összes weboldalra\"},\"assistant_block_by_reference\":{\"message\":\"Blokkolás link alapján\"},\"assistant_block_similar\":{\"message\":\"Hasonlók blokkolása\"},\"assistant_another_element\":{\"message\":\"Másik elem választása\"},\"assistant_preview\":{\"message\":\"Előnézet\"},\"assistant_block\":{\"message\":\"Blokkolás\"},\"assistant_settings\":{\"message\":\"Asszisztens beállításai\"},\"assistant_preview_header\":{\"message\":\"Elem blokkolása - előnézet\"},\"assistant_preview_header_info\":{\"message\":\"Ellenőrizze, hogy az elem blokkolva van-e a tervezett módon\"},\"assistant_preview_end\":{\"message\":\"Kilépés az előnézetből\"},\"wot_unknown_description\":{\"message\":\"Ez a weboldal nincs nyilvántartva a $1 alapján\"},\"wot_bad_description\":{\"message\":\"Ennek a weboldalnak nagyon rossz a megítélése a $1 alapján\"},\"wot_poor_description\":{\"message\":\"Ennek a weboldalnak rossz a megítélése a $1 alapján\"},\"wot_unsatisfactory_description\":{\"message\":\"Ennek a weboldalnak gyenge a megítélése a $1 alapján\"},\"wot_good_description\":{\"message\":\"Ennek a weboldalnak jó a megítélése a $1 alapján\"},\"wot_excellent_description\":{\"message\":\"Ennek a weboldalnak kitűnő a megítélése a $1 alapján\"},\"settings_choose_size_and_position\":{\"message\":\"Állítsa be az AdGuard Assistant méretét és pozícióját\"},\"settings_icon_size\":{\"message\":\"Ikon mérete:\"},\"settings_small\":{\"message\":\"Kicsi\"},\"settings_big\":{\"message\":\"Nagy\"},\"settings_position\":{\"message\":\"Pozíció:\"},\"settings_left_top\":{\"message\":\"Bal felül\"},\"settings_right_top\":{\"message\":\"Jobb felül\"},\"settings_left_bottom\":{\"message\":\"Bal alul\"},\"settings_right_bottom\":{\"message\":\"Jobb alul\"},\"settings_cancel\":{\"message\":\"Mégse\"},\"settings_save\":{\"message\":\"Változások mentése\"}}');\n\t }),\n\t 710:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Situs web\",\"settings_position_save_all\":\"Semua situs web\",\"settings_position_save_this\":\"Situs web ini\",\"assistant_select_element_start\":\"Mulai\",\"assistant_select_element_text\":\"Pilih elemen di halaman untuk diblokir. Segarkan halaman untuk membatalkan mode pemblokiran elemen.\",\"menu_filtration_status\":{\"message\":\"Penyaringan di situs ini\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nonaktifkan penyaring untuk 30 detik\"},\"menu_block_ad_on_site\":{\"message\":\"Blokir iklan di situs ini\"},\"menu_report_abuse\":{\"message\":\"Laporkan situs\"},\"menu_site_report\":{\"message\":\"Laporan keamanan situs\"},\"menu_settings\":{\"message\":\"Pengaturan Asisten\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikator reputasi situs\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Tingkat Keyakinan Reputasi\"},\"assistant_select_element\":{\"message\":\"Blok Elemen\"},\"assistant_select_element_ext\":{\"message\":\"Pilih elemen di halaman untuk diblok\"},\"assistant_select_element_cancel\":{\"message\":\"Batalkan\"},\"assistant_block_element\":{\"message\":\"Blok Elemen\"},\"assistant_block_element_explain\":{\"message\":\"Atur aturan blokir elemen\"},\"assistant_slider_explain\":{\"message\":\"Pindahkan slider untuk mengatur ukuran frame dimana aturan baru akan aktif:\"},\"assistant_extended_settings\":{\"message\":\"Pengaturan lanjutan\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aktifkan aturan untuk seluruh situs\"},\"assistant_block_by_reference\":{\"message\":\"Blok berdasarkan referensi situs\"},\"assistant_block_similar\":{\"message\":\"Blok semacamnya\"},\"assistant_another_element\":{\"message\":\"Pilih elemen lainnya\"},\"assistant_preview\":{\"message\":\"Pratinjau\"},\"assistant_block\":{\"message\":\"Blokir\"},\"assistant_settings\":{\"message\":\"Pengaturan Asisten\"},\"assistant_preview_header\":{\"message\":\"Blok elemen - pratinjau\"},\"assistant_preview_header_info\":{\"message\":\"Harap pastikan bahwa elemen diblok sesuai kemauan Anda\"},\"assistant_preview_end\":{\"message\":\"Keluar pratinjau\"},\"wot_unknown_description\":{\"message\":\"Reputasi tidak terdefinisi\"},\"wot_bad_description\":{\"message\":\"Situs ini mempunyai reputasi sangat buruk\\\\nberdasarkan $1\"},\"wot_poor_description\":{\"message\":\"Situs ini mempunyai reputasi buruk\\\\nberdasarkan $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Situs ini mempunyai reputasi biasa \\\\nberdasarkan $1\"},\"wot_good_description\":{\"message\":\"Situs ini mempunyai reputasi baik \\\\nberdasarkan $1\"},\"wot_excellent_description\":{\"message\":\"Situs ini mempunyai reputasi sempurna \\\\nberdasarkan $1\"},\"settings_choose_size_and_position\":{\"message\":\"Atur ukuran dan posisi AdGuard Assistant\"},\"settings_icon_size\":{\"message\":\"Ukuran ikon:\"},\"settings_small\":{\"message\":\"Kecil\"},\"settings_big\":{\"message\":\"Besar\"},\"settings_position\":{\"message\":\"Posisi:\"},\"settings_left_top\":{\"message\":\"Atas kiri\"},\"settings_right_top\":{\"message\":\"Atas kanan\"},\"settings_left_bottom\":{\"message\":\"Bawah kiri\"},\"settings_right_bottom\":{\"message\":\"Bawah kanan\"},\"settings_cancel\":{\"message\":\"Batal\"},\"settings_save\":{\"message\":\"Simpan perubahan\"}}');\n\t }),\n\t 7294:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Siti\",\"settings_position_save_all\":\"Tutti i siti\",\"settings_position_save_this\":\"Questo sito web\",\"assistant_select_element_start\":\"Inizio\",\"assistant_select_element_text\":\"Seleziona un elemento nella pagina per bloccarlo. Ricarica la pagina per annullare la modalità di blocco di un elemento.\",\"menu_filtration_status\":{\"message\":\"Filtraggio su questo sito web\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Non filtrare per 30 secondi\"},\"menu_block_ad_on_site\":{\"message\":\"Blocca annunci su questo sito web\"},\"menu_report_abuse\":{\"message\":\"Segnala il sito\"},\"menu_site_report\":{\"message\":\"Rapporto di sicurezza del sito\"},\"menu_settings\":{\"message\":\"Impostazioni di Assistant\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicatore reputazione sito\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Livello della reputazione\"},\"assistant_select_element\":{\"message\":\"Blocca elemento\"},\"assistant_select_element_ext\":{\"message\":\"Scegli un elemento da bloccare sulla pagina\"},\"assistant_select_element_cancel\":{\"message\":\"Annulla\"},\"assistant_block_element\":{\"message\":\"Blocca elemento\"},\"assistant_block_element_explain\":{\"message\":\"Modifica la regola di blocco di un elemento\"},\"assistant_slider_explain\":{\"message\":\"Muovi la barra per cambiare la grandezza del frame da per il quale la nuova regola funzionerà:\"},\"assistant_extended_settings\":{\"message\":\"Impostazioni avanzate\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Applica la regola a tutti i siti\"},\"assistant_block_by_reference\":{\"message\":\"Blocco mediante indirizzo di riferimento\"},\"assistant_block_similar\":{\"message\":\"Blocca simile\"},\"assistant_another_element\":{\"message\":\"Seleziona un altro elemento\"},\"assistant_preview\":{\"message\":\"Anteprima\"},\"assistant_block\":{\"message\":\"Blocca\"},\"assistant_settings\":{\"message\":\"Impostazioni di Assistant\"},\"assistant_preview_header\":{\"message\":\"Blocco elemento - anteprima\"},\"assistant_preview_header_info\":{\"message\":\"Assicurati che l\\'elemento è bloccato come richiesto\"},\"assistant_preview_end\":{\"message\":\"Esci dall\\'anteprima\"},\"wot_unknown_description\":{\"message\":\"La reputazione di questo sito web non è definita da $1\"},\"wot_bad_description\":{\"message\":\"Questo sito web ha una pessima reputazione\\\\nsecondo $1\"},\"wot_poor_description\":{\"message\":\"Questo sito web ha una brutta reputazione\\\\nsecondo $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Questo sito web ha una mediocre reputazione\\\\nsecondo $1\"},\"wot_good_description\":{\"message\":\"Questo sito web ha una buona reputazione\\\\nsecondo $1\"},\"wot_excellent_description\":{\"message\":\"Questo sito web ha una eccellente reputazione\\\\nsecondo $1\"},\"settings_choose_size_and_position\":{\"message\":\"Regola dimensione e posizione di AdGuard Assistant\"},\"settings_icon_size\":{\"message\":\"Grandezza dell\\'icona:\"},\"settings_small\":{\"message\":\"Piccola\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posizione:\"},\"settings_left_top\":{\"message\":\"In alto a sinistra\"},\"settings_right_top\":{\"message\":\"In alto a destra\"},\"settings_left_bottom\":{\"message\":\"In basso a sinistra\"},\"settings_right_bottom\":{\"message\":\"In basso a destra\"},\"settings_cancel\":{\"message\":\"Annulla\"},\"settings_save\":{\"message\":\"Salva cambiamenti\"}}');\n\t }),\n\t 9265:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"ウェブサイト\",\"settings_position_save_all\":\"すべてのウェブサイト\",\"settings_position_save_this\":\"このウェブサイト\",\"assistant_select_element_start\":\"開始\",\"assistant_select_element_text\":\"ブロックするページ上の要素を選択してください。 ページを更新し要素のブロックモードを解除します。\",\"menu_filtration_status\":{\"message\":\"このウェブサイトをフィルタリング\"},\"menu_do_not_filter_30_sec\":{\"message\":\"30秒間フィルタリングしない\"},\"menu_block_ad_on_site\":{\"message\":\"このサイトで広告を手動ブロックする\"},\"menu_report_abuse\":{\"message\":\"このサイトの問題を報告する\"},\"menu_site_report\":{\"message\":\"ウェブサイトのセキュリティレポート\"},\"menu_settings\":{\"message\":\"アシスタントの設定\"},\"assistant_select_element\":{\"message\":\"要素をブロック\"},\"assistant_select_element_ext\":{\"message\":\"ブロックする要素を選択\"},\"assistant_select_element_cancel\":{\"message\":\"キャンセル\"},\"assistant_block_element\":{\"message\":\"要素をブロック\"},\"assistant_block_element_explain\":{\"message\":\"要素のブロックルールを調整する\"},\"assistant_slider_explain\":{\"message\":\"スライダーを動かすと、ブロックするフレームのサイズを変更できます:\"},\"assistant_extended_settings\":{\"message\":\"高度な設定\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"全てのウェブサイトにこのルールを適用\"},\"assistant_block_by_reference\":{\"message\":\"参照リンクによるブロック\"},\"assistant_block_similar\":{\"message\":\"類似項目をブロック\"},\"assistant_another_element\":{\"message\":\"他の要素を選択\"},\"assistant_preview\":{\"message\":\"プレビュー\"},\"assistant_block\":{\"message\":\"ブロック\"},\"assistant_settings\":{\"message\":\"アシスタントの設定\"},\"assistant_preview_header\":{\"message\":\"要素のブロック - プレビュー\"},\"assistant_preview_header_info\":{\"message\":\"要素が意図したとおりにブロックされていることを確認します\"},\"assistant_preview_end\":{\"message\":\"プレビューを終了\"},\"wot_unknown_description\":{\"message\":\"評判が定義されていません\"},\"wot_bad_description\":{\"message\":\"このウェブサイトは非常に評判が悪いです: \"},\"wot_poor_description\":{\"message\":\"このウェブサイトは評判が悪いです: \"},\"wot_unsatisfactory_description\":{\"message\":\"このウェブサイトは評判がやや悪いです: \"},\"wot_good_description\":{\"message\":\"このウェブサイトは評判が良いです: \"},\"wot_excellent_description\":{\"message\":\"このウェブサイトはとても評判が良いです: \"},\"settings_choose_size_and_position\":{\"message\":\"AdGuardアシスタントのサイズと位置を調整する\"},\"settings_icon_size\":{\"message\":\"アイコンの大きさ:\"},\"settings_small\":{\"message\":\"小\"},\"settings_big\":{\"message\":\"大\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上\"},\"settings_right_top\":{\"message\":\"右上\"},\"settings_left_bottom\":{\"message\":\"左下\"},\"settings_right_bottom\":{\"message\":\"右下\"},\"settings_cancel\":{\"message\":\"キャンセル\"},\"settings_save\":{\"message\":\"設定を保存\"}}');\n\t }),\n\t 1474:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"웹사이트\",\"settings_position_save_all\":\"모든 웹사이트\",\"settings_position_save_this\":\"이 웹사이트\",\"assistant_select_element_start\":\"시작\",\"assistant_select_element_text\":\"페이지에서 차단할 요소를 선택하세요. 요소 차단 모드를 취소하려면 페이지를 새로 고침하세요.\",\"menu_filtration_status\":{\"message\":\"이 웹사이트에서의 보호\"},\"menu_do_not_filter_30_sec\":{\"message\":\"30초 동안 차단 일시정지\"},\"menu_block_ad_on_site\":{\"message\":\"이 웹사이트에서 광고 차단\"},\"menu_report_abuse\":{\"message\":\"이 웹사이트에 관한 불만 사항 제출\"},\"menu_site_report\":{\"message\":\"웹사이트 보안 보고\"},\"menu_settings\":{\"message\":\"어시스턴트 설정\"},\"menu_wot_reputation_indicator\":{\"message\":\"웹사이트 평판 표시기\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"평판 신뢰 수준\"},\"assistant_select_element\":{\"message\":\"선택 모드\"},\"assistant_select_element_ext\":{\"message\":\"페이지에서 아무 요소나 클릭하거나\"},\"assistant_select_element_cancel\":{\"message\":\"선택 모드 취소\"},\"assistant_block_element\":{\"message\":\"요소 차단\"},\"assistant_block_element_explain\":{\"message\":\"요소 차단 규칙 설정\"},\"assistant_slider_explain\":{\"message\":\"슬라이더로 차단할 요소의 범위를 지정하세요.\"},\"assistant_extended_settings\":{\"message\":\"고급 설정\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"모든 웹사이트에 이 규칙 적용\"},\"assistant_block_by_reference\":{\"message\":\"참조 링크가 차단\"},\"assistant_block_similar\":{\"message\":\"유사한 요소 차단\"},\"assistant_another_element\":{\"message\":\"다른 요소 선택\"},\"assistant_preview\":{\"message\":\"미리 보기\"},\"assistant_block\":{\"message\":\"차단\"},\"assistant_settings\":{\"message\":\"어시스턴트 설정\"},\"assistant_preview_header\":{\"message\":\"요소 차단 - 미리 보기\"},\"assistant_preview_header_info\":{\"message\":\"의도한 대로 요소가 차단되었는지 확인하세요.\"},\"assistant_preview_end\":{\"message\":\"미리 보기 종료\"},\"wot_unknown_description\":{\"message\":\"평판이 등록되지 않았습니다.\"},\"wot_bad_description\":{\"message\":\"이 웹사이트는 아주 나쁜 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_poor_description\":{\"message\":\"이 웹사이트는 나쁜 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_unsatisfactory_description\":{\"message\":\"이 웹사이트는 좋지 않은 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_good_description\":{\"message\":\"이 웹사이트는 좋은 평판을 갖고 있습니다.\\\\n제공 \"},\"wot_excellent_description\":{\"message\":\"이 웹사이트는 아주 좋은 평판을 갖고 있습니다.\\\\n제공 \"},\"settings_choose_size_and_position\":{\"message\":\"AdGuard 어시스턴트 크기와 위치를 조정합니다\"},\"settings_icon_size\":{\"message\":\"아이콘 크기:\"},\"settings_small\":{\"message\":\"작게\"},\"settings_big\":{\"message\":\"크게\"},\"settings_position\":{\"message\":\"위치:\"},\"settings_left_top\":{\"message\":\"왼쪽 위\"},\"settings_right_top\":{\"message\":\"오른쪽 위\"},\"settings_left_bottom\":{\"message\":\"왼쪽 아래\"},\"settings_right_bottom\":{\"message\":\"오른쪽 아래\"},\"settings_cancel\":{\"message\":\"취소\"},\"settings_save\":{\"message\":\"저장\"}}');\n\t }),\n\t 8612:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Interneto svetainės\",\"settings_position_save_all\":\"Visos svetainės\",\"settings_position_save_this\":\"Ši svetainė\",\"assistant_select_element_start\":\"Pradėti\",\"assistant_select_element_text\":\"Pasirinkite elementą puslapyje, kurį norite blokuoti. Atnaujinkite puslapį, kad atšauktumėte elementų blokavimo režimą.\",\"menu_filtration_status\":{\"message\":\"Filtravimas šioje svetainėje\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nefiltruoti 30 sekundžių\"},\"menu_block_ad_on_site\":{\"message\":\"Blokuoti reklamą šioje svetainėje\"},\"menu_report_abuse\":{\"message\":\"Pranešti apie svetainę\"},\"menu_site_report\":{\"message\":\"Svetainės saugumo ataskaita\"},\"menu_settings\":{\"message\":\"Asistento nustatymai\"},\"menu_wot_reputation_indicator\":{\"message\":\"Svetainės reputacijos rodiklis\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Reputacijos pasitikėjimo lygis\"},\"assistant_select_element\":{\"message\":\"Elemento blokavimas\"},\"assistant_select_element_ext\":{\"message\":\"Pasirinkite elementą puslapyje, kurį norite blokuoti\"},\"assistant_select_element_cancel\":{\"message\":\"Atšaukti\"},\"assistant_block_element\":{\"message\":\"Elemento blokavimas\"},\"assistant_block_element_explain\":{\"message\":\"Nustatykite elemento blokavimo taisyklę\"},\"assistant_slider_explain\":{\"message\":\"Slankiklio pagalba, keiskite rėmelio dydį, kuriame galios nauja taisyklė:\"},\"assistant_extended_settings\":{\"message\":\"Išplėstiniai nustatymai\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Pritaikyti taisyklę visoms svetainėms\"},\"assistant_block_by_reference\":{\"message\":\"Blokuoti pagal nuorodą\"},\"assistant_block_similar\":{\"message\":\"Blokuoti panašius\"},\"assistant_another_element\":{\"message\":\"Pasirinkti kitą elementą\"},\"assistant_preview\":{\"message\":\"Peržiūra\"},\"assistant_block\":{\"message\":\"Užblokuoti\"},\"assistant_settings\":{\"message\":\"Asistento nustatymai\"},\"assistant_preview_header\":{\"message\":\"Elemento blokavimas - peržiūra\"},\"assistant_preview_header_info\":{\"message\":\"Įsitikinkite, kad elementas yra užblokuotas kaip sumanyta\"},\"assistant_preview_end\":{\"message\":\"Baigti peržiūrą\"},\"wot_unknown_description\":{\"message\":\"Šios svetainės reputacija nėra apibrėžta $1\"},\"wot_bad_description\":{\"message\":\"Ši svetainė turi labai blogą reputaciją\\\\npagal $1\"},\"wot_poor_description\":{\"message\":\"Ši svetainė turi blogą reputaciją pagal $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ši svetainė turi prastą reputaciją pagal $1\"},\"wot_good_description\":{\"message\":\"Ši svetainė turi gerą reputaciją pagal $1\"},\"wot_excellent_description\":{\"message\":\"Ši svetainė turi puikią reputaciją pagal $1\"},\"settings_choose_size_and_position\":{\"message\":\"Nustatykite AdGuard Asistento dydį ir padėtį\"},\"settings_icon_size\":{\"message\":\"Piktogramos dydis:\"},\"settings_small\":{\"message\":\"Maža\"},\"settings_big\":{\"message\":\"Didelė\"},\"settings_position\":{\"message\":\"Padėtis:\"},\"settings_left_top\":{\"message\":\"Viršuje kairėje\"},\"settings_right_top\":{\"message\":\"Viršuje dešinėje\"},\"settings_left_bottom\":{\"message\":\"Apačioje kairėje\"},\"settings_right_bottom\":{\"message\":\"Apačioje dešinėje\"},\"settings_cancel\":{\"message\":\"Atšaukti\"},\"settings_save\":{\"message\":\"Išsaugoti pakeitimus\"}}');\n\t }),\n\t 8967:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Websites\",\"settings_position_save_all\":\"Alle websites\",\"settings_position_save_this\":\"Deze website\",\"assistant_select_element_start\":\"Starten\",\"assistant_select_element_text\":\"Kies een element op deze webpagina om te blokkeren. Herlaad de pagina om het blokkeren van het element te stoppen.\",\"menu_filtration_status\":{\"message\":\"Filteren op deze website\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Niet filtreren voor 30 seconden\"},\"menu_block_ad_on_site\":{\"message\":\"Blokkeer ad op deze website\"},\"menu_report_abuse\":{\"message\":\"Rapporteer de website\"},\"menu_site_report\":{\"message\":\"Beveiligingsrapport van website\"},\"menu_settings\":{\"message\":\"Instelling van de assistent\"},\"menu_wot_reputation_indicator\":{\"message\":\"Website reputatie indicator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Vertrouwensniveau reputatie\"},\"assistant_select_element\":{\"message\":\"Element blokkeren\"},\"assistant_select_element_ext\":{\"message\":\"Kies een element op deze pagina dat je wil blokkeren\"},\"assistant_select_element_cancel\":{\"message\":\"Annuleren\"},\"assistant_block_element\":{\"message\":\"Element blokkeren\"},\"assistant_block_element_explain\":{\"message\":\"Pas de Element blokkeren regel aan\"},\"assistant_slider_explain\":{\"message\":\"Beweeg de schuifregelaar om de grootte van het frame te wijzigen waarvoor de nieuwe regel werkt:\"},\"assistant_extended_settings\":{\"message\":\"Geavanceerde instellingen\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Regel toepassen op alle websites\"},\"assistant_block_by_reference\":{\"message\":\"Blokkeren via referentielink\"},\"assistant_block_similar\":{\"message\":\"Blokkeer vergelijkbare\"},\"assistant_another_element\":{\"message\":\"Een ander element selecteren\"},\"assistant_preview\":{\"message\":\"Voorbeeldweergave\"},\"assistant_block\":{\"message\":\"Blokkeren\"},\"assistant_settings\":{\"message\":\"Assistent instellingen\"},\"assistant_preview_header\":{\"message\":\"Elementblokkering - voorbeeld\"},\"assistant_preview_header_info\":{\"message\":\"Zorg ervoor dat het element wordt geblokkeerd zoals bedoeld\"},\"assistant_preview_end\":{\"message\":\"Voorbeeldweergave afsluiten\"},\"wot_unknown_description\":{\"message\":\"De reputatie van deze website wordt niet bepaald door $1\"},\"wot_bad_description\":{\"message\":\"Deze website heeft een zeer slechte reputatie\\\\nvolgens $1\"},\"wot_poor_description\":{\"message\":\"Deze website heeft een slechte reputatie\\\\nvolgens $ 1\"},\"wot_unsatisfactory_description\":{\"message\":\"Deze website heeft een slechte reputatie volgens $1\"},\"wot_good_description\":{\"message\":\"Deze website heeft een goede reputatie volgens $1\"},\"wot_excellent_description\":{\"message\":\"Deze website heeft een uitstekende reputatie volgens $1\"},\"settings_choose_size_and_position\":{\"message\":\"Grootte en positie van AdGuard Assistent aanpassen\"},\"settings_icon_size\":{\"message\":\"Grootte pictogram:\"},\"settings_small\":{\"message\":\"Klein\"},\"settings_big\":{\"message\":\"Groot\"},\"settings_position\":{\"message\":\"Positie:\"},\"settings_left_top\":{\"message\":\"Linksboven\"},\"settings_right_top\":{\"message\":\"Rechtsboven\"},\"settings_left_bottom\":{\"message\":\"Linksonder\"},\"settings_right_bottom\":{\"message\":\"Rechtsonder\"},\"settings_cancel\":{\"message\":\"Annuleren\"},\"settings_save\":{\"message\":\"Wijzigingen opslaan\"}}');\n\t }),\n\t 6251:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Nettsider\",\"settings_position_save_all\":\"Alle nettsider\",\"settings_position_save_this\":\"Denne nettsiden\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Velg et element på siden som skal blokkeres. Oppdater siden for å avbryte elementblokkeringsmodusen.\",\"menu_filtration_status\":{\"message\":\"Filtrering på denne nettsiden\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ikke filtrer i 30 sekunder\"},\"menu_block_ad_on_site\":{\"message\":\"Blokker annonse på denne nettsiden\"},\"menu_report_abuse\":{\"message\":\"Rapporter denne nettsiden\"},\"menu_site_report\":{\"message\":\"Nettsidens sikkerhetsrapport\"},\"menu_settings\":{\"message\":\"Assistentinnstillinger\"},\"menu_wot_reputation_indicator\":{\"message\":\"Nettsteds-rykteindikator\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Ryktepålitelighetsnivå\"},\"assistant_select_element\":{\"message\":\"Elementblokkering\"},\"assistant_select_element_ext\":{\"message\":\"Velg et element på siden som skal blokkeres\"},\"assistant_select_element_cancel\":{\"message\":\"Avbryt\"},\"assistant_block_element\":{\"message\":\"Elementblokkering\"},\"assistant_block_element_explain\":{\"message\":\"Juster elementblokkeringsregel\"},\"assistant_slider_explain\":{\"message\":\"Flytt glidebryteren for å endre størrelsen på rammen den nye regelen vil fungere for:\"},\"assistant_extended_settings\":{\"message\":\"Avanserte innstillinger\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Bruk regelen for alle nettsider\"},\"assistant_block_by_reference\":{\"message\":\"Blokker med referanselenke\"},\"assistant_block_similar\":{\"message\":\"Blokker lignende\"},\"assistant_another_element\":{\"message\":\"Velg et annet element\"},\"assistant_preview\":{\"message\":\"Forhåndsvisning\"},\"assistant_block\":{\"message\":\"Blokker\"},\"assistant_settings\":{\"message\":\"Assistentinnstillinger\"},\"assistant_preview_header\":{\"message\":\"Elementblokkering - forhåndsvisning\"},\"assistant_preview_header_info\":{\"message\":\"Kontroller at elementet er blokkert som det skal\"},\"assistant_preview_end\":{\"message\":\"Avslutt forhåndsvisning\"},\"wot_unknown_description\":{\"message\":\"Rykte er ikke definert\"},\"wot_bad_description\":{\"message\":\"Denne nettsiden har et veldig dårlig rykte\\\\ni følge $1\"},\"wot_poor_description\":{\"message\":\"Denne nettsiden har et dårlig rykte\\\\ni følge $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Denne nettsiden har et dårlig rykte\\\\ni følge $1\"},\"wot_good_description\":{\"message\":\"Denne nettsiden har et godt rykte\\\\ni følge $1\"},\"wot_excellent_description\":{\"message\":\"Denne nettsiden har et utmerket rykte\\\\ni følge $1\"},\"settings_choose_size_and_position\":{\"message\":\"Juster størrelsen og posisjonen til AdGuard-assistent\"},\"settings_icon_size\":{\"message\":\"Ikonstørrelse:\"},\"settings_small\":{\"message\":\"Liten\"},\"settings_big\":{\"message\":\"Stor\"},\"settings_position\":{\"message\":\"Posisjoner:\"},\"settings_left_top\":{\"message\":\"Øverst til venstre\"},\"settings_right_top\":{\"message\":\"Øverst til høyre\"},\"settings_left_bottom\":{\"message\":\"Nederst til venstre\"},\"settings_right_bottom\":{\"message\":\"Nederst til høyre\"},\"settings_cancel\":{\"message\":\"Avbryt\"},\"settings_save\":{\"message\":\"Lagre endringer\"}}');\n\t }),\n\t 1549:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Strony internetowe\",\"settings_position_save_all\":\"Wszystkie strony internetowe\",\"settings_position_save_this\":\"Ta strona internetowa\",\"assistant_select_element_start\":\"Rozpocznij\",\"assistant_select_element_text\":\"Wybierz element na stronie do zablokowania. Odśwież stronę, aby anulować tryb blokowania elementu.\",\"menu_filtration_status\":{\"message\":\"Filtrowanie na tej stronie internetowej\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nie filtruj przez 30 sekund\"},\"menu_block_ad_on_site\":{\"message\":\"Zablokuj reklamę na tej stronie internetowej\"},\"menu_report_abuse\":{\"message\":\"Raportuj stronę internetową\"},\"menu_site_report\":{\"message\":\"Raport bezpieczeństwa strony internetowej\"},\"menu_settings\":{\"message\":\"Ustawienia Asystenta\"},\"menu_wot_reputation_indicator\":{\"message\":\"Wskaźnik reputacji witryny\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Poziom zaufania do reputacji\"},\"assistant_select_element\":{\"message\":\"Blokowanie elementów\"},\"assistant_select_element_ext\":{\"message\":\"Wybierz element na stronie by zablokować\"},\"assistant_select_element_cancel\":{\"message\":\"Anuluj\"},\"assistant_block_element\":{\"message\":\"Blokowanie elementów\"},\"assistant_block_element_explain\":{\"message\":\"Dostosuj regułę blokowania elementów\"},\"assistant_slider_explain\":{\"message\":\"Przesuń suwak by zmienić rozmiar ramki, dla której będzie obowiązywać nowa reguła:\"},\"assistant_extended_settings\":{\"message\":\"Ustawienia zaawansowane\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Zastosuj regułę dla wszystkich stron internetowych\"},\"assistant_block_by_reference\":{\"message\":\"Blokuj używając linka referencyjnego\"},\"assistant_block_similar\":{\"message\":\"Blokuj podobne\"},\"assistant_another_element\":{\"message\":\"Wybierz inny element\"},\"assistant_preview\":{\"message\":\"Podgląd\"},\"assistant_block\":{\"message\":\"Blokuj\"},\"assistant_settings\":{\"message\":\"Ustawienia Asystenta\"},\"assistant_preview_header\":{\"message\":\"Blokowanie elementów - podgląd\"},\"assistant_preview_header_info\":{\"message\":\"Upewnij się, że element jest blokowany jak zamierzono\"},\"assistant_preview_end\":{\"message\":\"Zamknij podgląd\"},\"wot_unknown_description\":{\"message\":\"Reputacja nie jest zdefiniowana\"},\"wot_bad_description\":{\"message\":\"Ta strona internetowa ma bardzo złą reputację zgodnie z $1\"},\"wot_poor_description\":{\"message\":\"Ta strona internetowa ma złą reputację zgodnie z $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ta strona internetowa ma słabą reputację zgodnie z $1\"},\"wot_good_description\":{\"message\":\"Ta strona internetowa ma dobrą reputację zgodnie z $1\"},\"wot_excellent_description\":{\"message\":\"Ta strona internetowa ma doskonałą reputację zgodnie z $1\"},\"settings_choose_size_and_position\":{\"message\":\"Dostosuj rozmiar i pozycję Asystenta AdGuarda\"},\"settings_icon_size\":{\"message\":\"Rozmiar ikony:\"},\"settings_small\":{\"message\":\"Mały\"},\"settings_big\":{\"message\":\"Duży\"},\"settings_position\":{\"message\":\"Pozycja:\"},\"settings_left_top\":{\"message\":\"Lewy górny\"},\"settings_right_top\":{\"message\":\"Prawy górny\"},\"settings_left_bottom\":{\"message\":\"Na dole po lewej\"},\"settings_right_bottom\":{\"message\":\"Na dole po prawej\"},\"settings_cancel\":{\"message\":\"Anuluj\"},\"settings_save\":{\"message\":\"Zapisz zmiany\"}}');\n\t }),\n\t 1902:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sítios\",\"settings_position_save_all\":\"Todos os sítios\",\"settings_position_save_this\":\"Este sítio\",\"assistant_select_element_start\":\"Iniciar\",\"assistant_select_element_text\":\"Escolha um elemento na página para bloquear. Atualize a página para cancelar o bloqueio do elemento.\",\"menu_filtration_status\":{\"message\":\"A filtrar este sítio\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Não filtrar durante 30 segundos\"},\"menu_block_ad_on_site\":{\"message\":\"Bloquear publicidade neste sítio\"},\"menu_report_abuse\":{\"message\":\"Denunciar o sítio\"},\"menu_site_report\":{\"message\":\"Relatório de segurança do sítio\"},\"menu_settings\":{\"message\":\"Configurações do assistente\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicador de reputação do sítio\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nível de Confiança de Reputação\"},\"assistant_select_element\":{\"message\":\"Bloqueio de elemento\"},\"assistant_select_element_ext\":{\"message\":\"Escolha um elemento na página para bloquear\"},\"assistant_select_element_cancel\":{\"message\":\"Cancelar\"},\"assistant_block_element\":{\"message\":\"Bloqueio de elementos\"},\"assistant_block_element_explain\":{\"message\":\"Ajustar a regra de bloqueio do elemento\"},\"assistant_slider_explain\":{\"message\":\"Desloque o controlo deslizante para alterar o tamanho do quadro para o qual a nova regra irá funcionar:\"},\"assistant_extended_settings\":{\"message\":\"Definições avançadas\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplicar a regra para todos os sítios\"},\"assistant_block_by_reference\":{\"message\":\"Bloquear por link de referência\"},\"assistant_block_similar\":{\"message\":\"Bloquear semelhante\"},\"assistant_another_element\":{\"message\":\"Selecionar um elemento diferente\"},\"assistant_preview\":{\"message\":\"Pré-visualização\"},\"assistant_block\":{\"message\":\"Bloquear\"},\"assistant_settings\":{\"message\":\"Configurações do assistente\"},\"assistant_preview_header\":{\"message\":\"Bloquear elemento - pré-visualização\"},\"assistant_preview_header_info\":{\"message\":\"Certifique-se de que o elemento está bloqueado como pretendido\"},\"assistant_preview_end\":{\"message\":\"Sair da previsualização\"},\"wot_unknown_description\":{\"message\":\"A reputação deste sítio não está definida por $1\"},\"wot_bad_description\":{\"message\":\"Este sítio tem uma péssima reputação\\\\nde acordo com $1\"},\"wot_poor_description\":{\"message\":\"Este sítio tem uma má reputação\\\\nde acordo com $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Este sítio tem uma frágil reputação\\\\nde acordo com $1\"},\"wot_good_description\":{\"message\":\"Este sítio tem uma boa reputação\\\\nde acordo com $1\"},\"wot_excellent_description\":{\"message\":\"Este sítio tem uma excelente reputação\\\\nde acordo com $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajustar o tamanho e a posição do Assistente do AdGuard\"},\"settings_icon_size\":{\"message\":\"Tamanho do ícone:\"},\"settings_small\":{\"message\":\"Pequeno\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posição:\"},\"settings_left_top\":{\"message\":\"Canto superior esquerdo\"},\"settings_right_top\":{\"message\":\"Canto superior direito\"},\"settings_left_bottom\":{\"message\":\"Canto inferior esquerdo\"},\"settings_right_bottom\":{\"message\":\"Canto inferior direito\"},\"settings_cancel\":{\"message\":\"Cancelar\"},\"settings_save\":{\"message\":\"Guardar alterações\"}}');\n\t }),\n\t 9274:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sites\",\"settings_position_save_all\":\"Todos os sites\",\"settings_position_save_this\":\"Neste site\",\"assistant_select_element_start\":\"Iniciar\",\"assistant_select_element_text\":\"Escolha um elemento na página para bloquear. Atualize a página para cancelar o bloqueio do elemento.\",\"menu_filtration_status\":{\"message\":\"Filtragem neste site\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Não filtrar durante 30 segundos\"},\"menu_block_ad_on_site\":{\"message\":\"Bloquear anúncios neste site\"},\"menu_report_abuse\":{\"message\":\"Reportar o site\"},\"menu_site_report\":{\"message\":\"Relatório de segurança do site\"},\"menu_settings\":{\"message\":\"Configurações do assistente\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicador de reputação do site\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nível de confiança de reputação\"},\"assistant_select_element\":{\"message\":\"Bloqueio de elemento\"},\"assistant_select_element_ext\":{\"message\":\"Escolha um elemento na página para bloquear\"},\"assistant_select_element_cancel\":{\"message\":\"Cancelar\"},\"assistant_block_element\":{\"message\":\"Bloqueio de elemento\"},\"assistant_block_element_explain\":{\"message\":\"Ajustar a regra de bloqueio de elemento\"},\"assistant_slider_explain\":{\"message\":\"Mova o controle deslizante para alterar o tamanho do quadro para o qual a nova regra funcionará:\"},\"assistant_extended_settings\":{\"message\":\"Configurações avançadas\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplicar regra para todos os sites\"},\"assistant_block_by_reference\":{\"message\":\"Bloquear pelo link de referência\"},\"assistant_block_similar\":{\"message\":\"Bloquear semelhante\"},\"assistant_another_element\":{\"message\":\"Selecione um elemento diferente\"},\"assistant_preview\":{\"message\":\"Pré-visualização\"},\"assistant_block\":{\"message\":\"Bloquear\"},\"assistant_settings\":{\"message\":\"Configurações do assistente\"},\"assistant_preview_header\":{\"message\":\"Bloqueio de elemento - pré-visualização\"},\"assistant_preview_header_info\":{\"message\":\"Certifique-se de que o elemento esteja bloqueado como desejado\"},\"assistant_preview_end\":{\"message\":\"Sair da pré-visualização\"},\"wot_unknown_description\":{\"message\":\"A reputação deste site ainda não foi definida por $1\"},\"wot_bad_description\":{\"message\":\"Este site tem uma reputação muito ruim\\\\nde acordo com $1\"},\"wot_poor_description\":{\"message\":\"Este site tem uma má reputação\\\\nde acordo com $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Este site tem uma reputação ruim\\\\nde acordo com $1\"},\"wot_good_description\":{\"message\":\"Este site tem uma boa reputação\\\\nde acordo com $1\"},\"wot_excellent_description\":{\"message\":\"Este site tem uma excelente reputação\\\\nde acordo com $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajuste o tamanho e posição do Assistente do AdGuard\"},\"settings_icon_size\":{\"message\":\"Tamanho do ícone:\"},\"settings_small\":{\"message\":\"Pequeno\"},\"settings_big\":{\"message\":\"Grande\"},\"settings_position\":{\"message\":\"Posição:\"},\"settings_left_top\":{\"message\":\"Canto superior esquerdo\"},\"settings_right_top\":{\"message\":\"Canto superior direito\"},\"settings_left_bottom\":{\"message\":\"Canto inferior esquerdo\"},\"settings_right_bottom\":{\"message\":\"Canto inferior direito\"},\"settings_cancel\":{\"message\":\"Cancelar\"},\"settings_save\":{\"message\":\"Salvar alterações\"}}');\n\t }),\n\t 6090:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Site web\",\"settings_position_save_all\":\"Toate site-urile\",\"settings_position_save_this\":\"Acest site\",\"assistant_select_element_start\":\"Start\",\"assistant_select_element_text\":\"Alegeți elementul de blocat pe pagină. Actualizați pagina ca să anulați modul de blocare a elementului.\",\"menu_filtration_status\":{\"message\":\"Filtrare pe acest site web\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nu filtra pentru 30 secunde\"},\"menu_block_ad_on_site\":{\"message\":\"Blocare reclame pe acest site\"},\"menu_report_abuse\":{\"message\":\"Raportați site-ul\"},\"menu_site_report\":{\"message\":\"Raport de securitate site\"},\"menu_settings\":{\"message\":\"Setări asistent\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indicator reputație site\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nivel de încredere în reputație\"},\"assistant_select_element\":{\"message\":\"Element de blocat\"},\"assistant_select_element_ext\":{\"message\":\"Alegeți un element de blocat pe pagină\"},\"assistant_select_element_cancel\":{\"message\":\"Anulare\"},\"assistant_block_element\":{\"message\":\"Blocare de element\"},\"assistant_block_element_explain\":{\"message\":\"Ajustați regula de blocare element\"},\"assistant_slider_explain\":{\"message\":\"Mișcarea glisorului schimbă talia cadrului în care va funcționa noua regulă:\"},\"assistant_extended_settings\":{\"message\":\"Setări avansate\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Aplică regula pe orice site\"},\"assistant_block_by_reference\":{\"message\":\"Blocare după link de referință\"},\"assistant_block_similar\":{\"message\":\"Blocare similare\"},\"assistant_another_element\":{\"message\":\"Alegeți un element diferit\"},\"assistant_preview\":{\"message\":\"Ecran\"},\"assistant_block\":{\"message\":\"Blocați\"},\"assistant_settings\":{\"message\":\"Setări asistent\"},\"assistant_preview_header\":{\"message\":\"Blocare element - previzualizare\"},\"assistant_preview_header_info\":{\"message\":\"Verificați blocarea elementului conform planului\"},\"assistant_preview_end\":{\"message\":\"Ieșire ecran\"},\"wot_unknown_description\":{\"message\":\"Reputația acestui site nu este definită de $1\"},\"wot_bad_description\":{\"message\":\"Acest site are o reputație foarte proastă\\\\nconform cu $1\"},\"wot_poor_description\":{\"message\":\"Acest site are o reputație proastă\\\\nconform cu $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Acest site are o reputație slabă\\\\nconform cu $1\"},\"wot_good_description\":{\"message\":\"Acest site are o reputație bună\\\\nconform cu $1\"},\"wot_excellent_description\":{\"message\":\"Acest site are o reputație excelentă\\\\nconform cu $1\"},\"settings_choose_size_and_position\":{\"message\":\"Ajustați talia și poziția Asistentului AdGuard\"},\"settings_icon_size\":{\"message\":\"Talie icoană:\"},\"settings_small\":{\"message\":\"Mică\"},\"settings_big\":{\"message\":\"Mare\"},\"settings_position\":{\"message\":\"Poziție:\"},\"settings_left_top\":{\"message\":\"Stânga sus\"},\"settings_right_top\":{\"message\":\"Dreapta sus\"},\"settings_left_bottom\":{\"message\":\"Stânga jos\"},\"settings_right_bottom\":{\"message\":\"Dreapta jos\"},\"settings_cancel\":{\"message\":\"Anulare\"},\"settings_save\":{\"message\":\"Salvare alegeri\"}}');\n\t }),\n\t 3999:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Сайты\",\"settings_position_save_all\":\"На всех\",\"settings_position_save_this\":\"Только на этом\",\"assistant_select_element_start\":\"Начать\",\"assistant_select_element_text\":\"Выберите на странице элемент для блокирования. Обновите страницу, чтобы отменить режим блокировки элементов.\",\"menu_filtration_status\":{\"message\":\"Фильтрация на этом сайте\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Не фильтровать 30 секунд\"},\"menu_block_ad_on_site\":{\"message\":\"Заблокировать рекламу на сайте\"},\"menu_report_abuse\":{\"message\":\"Пожаловаться на сайт\"},\"menu_site_report\":{\"message\":\"Отчёт о безопасности сайта\"},\"menu_settings\":{\"message\":\"Настроить помощник\"},\"menu_wot_reputation_indicator\":{\"message\":\"Индикатор репутации сайта\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Уровень доверия к репутации\"},\"assistant_select_element\":{\"message\":\" Блокировка элемента\"},\"assistant_select_element_ext\":{\"message\":\"Выберите на странице элемент, который надо заблокировать\"},\"assistant_select_element_cancel\":{\"message\":\"Отмена\"},\"assistant_block_element\":{\"message\":\"Блокировка элемента\"},\"assistant_block_element_explain\":{\"message\":\"Настройте правило блокирования элемента\"},\"assistant_slider_explain\":{\"message\":\"Перемещайте бегунок, чтобы изменить размер блока, для которого будет действовать правило:\"},\"assistant_extended_settings\":{\"message\":\"Расширенные настройки\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Применить правило для всех сайтов\"},\"assistant_block_by_reference\":{\"message\":\"Блокировать по ссылке\"},\"assistant_block_similar\":{\"message\":\"Блокировать похожие\"},\"assistant_another_element\":{\"message\":\"Выбрать другой элемент\"},\"assistant_preview\":{\"message\":\"Предпросмотр\"},\"assistant_block\":{\"message\":\"Заблокировать\"},\"assistant_settings\":{\"message\":\"Настройка помощника\"},\"assistant_preview_header\":{\"message\":\"Блокировка элемента – предпросмотр\"},\"assistant_preview_header_info\":{\"message\":\"Убедитесь, что элемент заблокирован как задумано\"},\"assistant_preview_end\":{\"message\":\"Закончить предпросмотр\"},\"wot_unknown_description\":{\"message\":\"Репутация не определена расширением $1\"},\"wot_bad_description\":{\"message\":\"У сайта очень плохая репутация по данным $1\"},\"wot_poor_description\":{\"message\":\"У сайта плохая репутация по данным $1\"},\"wot_unsatisfactory_description\":{\"message\":\"У сайта неудовлетворительная репутация по данным $1\"},\"wot_good_description\":{\"message\":\"У сайта хорошая репутация по данным $1\"},\"wot_excellent_description\":{\"message\":\"У сайта отличная репутация по данным $1\"},\"settings_choose_size_and_position\":{\"message\":\"Настройте размер и положение помощника AdGuard\"},\"settings_icon_size\":{\"message\":\"Размер иконки:\"},\"settings_small\":{\"message\":\"Маленькая\"},\"settings_big\":{\"message\":\"Большая\"},\"settings_position\":{\"message\":\"Расположение:\"},\"settings_left_top\":{\"message\":\"Вверху слева\"},\"settings_right_top\":{\"message\":\"Вверху справа\"},\"settings_left_bottom\":{\"message\":\"Внизу слева\"},\"settings_right_bottom\":{\"message\":\"Внизу справа\"},\"settings_cancel\":{\"message\":\"Отмена\"},\"settings_save\":{\"message\":\"Сохранить настройки\"}}');\n\t }),\n\t 89:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webové stránky\",\"settings_position_save_all\":\"Všetky stránky\",\"settings_position_save_this\":\"Táto stránka\",\"assistant_select_element_start\":\"Štart\",\"assistant_select_element_text\":\"Vyberte prvok na stránke, ktorý chcete zablokovať. Obnovte stránku pre zrušenie režimu blokovania prvkov.\",\"menu_filtration_status\":{\"message\":\"Filtrácia na tejto stránke\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Nefiltrovať počas 30 sekúnd\"},\"menu_block_ad_on_site\":{\"message\":\"Blokovať reklamy na tejto stránke\"},\"menu_report_abuse\":{\"message\":\"Nahlásiť stránku\"},\"menu_site_report\":{\"message\":\"Bezpečnostná správa o stránke\"},\"menu_settings\":{\"message\":\"Nastavenia asistenta\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikátor reputácie stránok\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Úroveň spoľahlivosti reputácie\"},\"assistant_select_element\":{\"message\":\"Blokovanie prvku\"},\"assistant_select_element_ext\":{\"message\":\"Vyberte prvok stránky, ktorý sa má blokovať\"},\"assistant_select_element_cancel\":{\"message\":\"Zrušiť\"},\"assistant_block_element\":{\"message\":\"Blokovanie prvku\"},\"assistant_block_element_explain\":{\"message\":\"Upraviť pravidlo blokovania prvku\"},\"assistant_slider_explain\":{\"message\":\"Použite posuvník pre zmenu veľkosti rámu pre nové pravidlo, ktoré bude použité na:\"},\"assistant_extended_settings\":{\"message\":\"Pokročilé nastavenia\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Použiť pravidlo na všetky stránky\"},\"assistant_block_by_reference\":{\"message\":\"Blokovať referenčným odkazom\"},\"assistant_block_similar\":{\"message\":\"Blokovať podobné\"},\"assistant_another_element\":{\"message\":\"Zvoliť iný prvok\"},\"assistant_preview\":{\"message\":\"Náhľad\"},\"assistant_block\":{\"message\":\"Blokovať\"},\"assistant_settings\":{\"message\":\"Nastavenia asistenta\"},\"assistant_preview_header\":{\"message\":\"Blokovanie prvku - náhľad\"},\"assistant_preview_header_info\":{\"message\":\"Uistite sa, že prvok je blokovaný podľa Vašich predstáv\"},\"assistant_preview_end\":{\"message\":\"Ukončenie náhľadu\"},\"wot_unknown_description\":{\"message\":\"Reputácia tejto webovej stránky nie je v $1 definovaná\"},\"wot_bad_description\":{\"message\":\"Táto stránka má podľa $1\\\\nveľmi zlú reputáciu\"},\"wot_poor_description\":{\"message\":\"Táto stránka má podľa $1\\\\nzlú reputáciu\"},\"wot_unsatisfactory_description\":{\"message\":\"Táto stránka má podľa $1\\\\nslabú reputáciu\"},\"wot_good_description\":{\"message\":\"Táto stránka má podľa $1\\\\ndobrú reputáciu\"},\"wot_excellent_description\":{\"message\":\"Táto stránka má podľa $1\\\\nvýbornú reputáciu\"},\"settings_choose_size_and_position\":{\"message\":\"Prispôsobiť veľkosť a polohu AdGuard asistenta\"},\"settings_icon_size\":{\"message\":\"Veľkosť ikony:\"},\"settings_small\":{\"message\":\"Malá\"},\"settings_big\":{\"message\":\"Veľká\"},\"settings_position\":{\"message\":\"Poloha:\"},\"settings_left_top\":{\"message\":\"Vľavo hore\"},\"settings_right_top\":{\"message\":\"Vpravo hore\"},\"settings_left_bottom\":{\"message\":\"Vľavo dole\"},\"settings_right_bottom\":{\"message\":\"Vpravo dole\"},\"settings_cancel\":{\"message\":\"Zrušiť\"},\"settings_save\":{\"message\":\"Uložiť zmeny\"}}');\n\t }),\n\t 6058:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Spletne strani\",\"settings_position_save_all\":\"Vse pletne strani\",\"settings_position_save_this\":\"To spletno stran\",\"assistant_select_element_start\":\"Začni\",\"assistant_select_element_text\":\"Izberite element na strani, ki jo želite onemogočiti. Osvežite stran, da prekličete način zaviranja elementa.\",\"menu_filtration_status\":{\"message\":\"Filtriranje na tej spletni strani\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne filtriraj 30 sekund\"},\"menu_block_ad_on_site\":{\"message\":\"Onemogoči oglas na tej spletni strani\"},\"menu_report_abuse\":{\"message\":\"Prijavi spletno stran\"},\"menu_site_report\":{\"message\":\"Poročilo o varnosti spletne strani\"},\"menu_settings\":{\"message\":\"Nastavitve Pomočnika\"},\"menu_wot_reputation_indicator\":{\"message\":\"Kazalnik ugleda spletnestrani\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Raven ugleda zaupanja\"},\"assistant_select_element\":{\"message\":\"Onemogočanje elementa\"},\"assistant_select_element_ext\":{\"message\":\"Izberite element na strani, ki ga želite onemogočiti\"},\"assistant_select_element_cancel\":{\"message\":\"Prekliči\"},\"assistant_block_element\":{\"message\":\"Onemogočanje elementa\"},\"assistant_block_element_explain\":{\"message\":\"Prilagodite pravilo za onemogočanje elementa\"},\"assistant_slider_explain\":{\"message\":\"Premaknite drsnik, da spremenite velikost okvirja, za katerega bo delovalo novo pravilo:\"},\"assistant_extended_settings\":{\"message\":\"Napredne nastavitve\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Uporabi pravilo za vse spletne strani\"},\"assistant_block_by_reference\":{\"message\":\"Onemogočij z napotitveno povezavo\"},\"assistant_block_similar\":{\"message\":\"Onemogoči podobno\"},\"assistant_another_element\":{\"message\":\"Izberi drug element\"},\"assistant_preview\":{\"message\":\"Predogled\"},\"assistant_block\":{\"message\":\"Onemogoči\"},\"assistant_settings\":{\"message\":\"Nastavitve Pomočnika\"},\"assistant_preview_header\":{\"message\":\"Onemogočanje elementa - predogled\"},\"assistant_preview_header_info\":{\"message\":\"Prepričajte se, da je element bil onemogočen, kot je bilo predvideno\"},\"assistant_preview_end\":{\"message\":\"Zapusti predogled\"},\"wot_unknown_description\":{\"message\":\"Ugled te spletne strani ni opredeljen z $1\"},\"wot_bad_description\":{\"message\":\"Ta spletna stran ima zelo slab ugled\\\\nglede na $1\"},\"wot_poor_description\":{\"message\":\"Ta spletna stran ima slab ugled\\\\nglede na $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Ta spletna stran ima zelo slab ugled\\\\nglede na $1\"},\"wot_good_description\":{\"message\":\"Ta spletna stran ima dober ugled\\\\nglede na $1\"},\"wot_excellent_description\":{\"message\":\"Ta spletna stran ima odličen ugled\\\\nglede na $1\"},\"settings_choose_size_and_position\":{\"message\":\"Prilagodi velikost in položaj AdGuard Pomočnika\"},\"settings_icon_size\":{\"message\":\"Velikost ikone:\"},\"settings_small\":{\"message\":\"Majhna\"},\"settings_big\":{\"message\":\"Velika\"},\"settings_position\":{\"message\":\"Položaj:\"},\"settings_left_top\":{\"message\":\"Zgoraj levo\"},\"settings_right_top\":{\"message\":\"Zgoraj desno\"},\"settings_left_bottom\":{\"message\":\"Spodaj levo\"},\"settings_right_bottom\":{\"message\":\"Spodaj desno\"},\"settings_cancel\":{\"message\":\"Prekliči\"},\"settings_save\":{\"message\":\"Shrani nastavitve\"}}');\n\t }),\n\t 9177:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Sajtovi\",\"settings_position_save_all\":\"Svi sajtovi\",\"settings_position_save_this\":\"Ovaj sajt\",\"assistant_select_element_start\":\"Započni\",\"assistant_select_element_text\":\"Izaberite element na stranici koji želite da blokirate. Osvežite stranicu da otkažete blokiranje elemenata.\",\"menu_filtration_status\":{\"message\":\"Filtriranje na ovom sajtu\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Ne filtriraj u narednih 30 sekundi\"},\"menu_block_ad_on_site\":{\"message\":\"Blokiraj reklamu na ovom sajtu\"},\"menu_report_abuse\":{\"message\":\"Prijavi sajt\"},\"menu_site_report\":{\"message\":\"Bezbednosni izveštaj o sajtu\"},\"menu_settings\":{\"message\":\"Postavke pomoćnika\"},\"menu_wot_reputation_indicator\":{\"message\":\"Indikator reputacije sajta\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Nivo poverljivosti reputacije\"},\"assistant_select_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_select_element_ext\":{\"message\":\"Izaberite element koji želite da blokirate na stranici\"},\"assistant_select_element_cancel\":{\"message\":\"Otkaži\"},\"assistant_block_element\":{\"message\":\"Blokiranje elementa\"},\"assistant_block_element_explain\":{\"message\":\"Podesite pravilo blokiranja elementa\"},\"assistant_slider_explain\":{\"message\":\"Pomerajte klizač kako bi ste promenili veličinu okvira po kom će pravilo raditi:\"},\"assistant_extended_settings\":{\"message\":\"Napredne postavke\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Primeni pravilo na sve sajtove\"},\"assistant_block_by_reference\":{\"message\":\"Blokiraj po linku reference\"},\"assistant_block_similar\":{\"message\":\"Blokiraj slično\"},\"assistant_another_element\":{\"message\":\"Izaberite drugi element\"},\"assistant_preview\":{\"message\":\"Pregled\"},\"assistant_block\":{\"message\":\"Blokiraj\"},\"assistant_settings\":{\"message\":\"Postavke pomoćnika\"},\"assistant_preview_header\":{\"message\":\"Pregled blokiranja elementa\"},\"assistant_preview_header_info\":{\"message\":\"Uverite se da je element blokiran kako ste želeli\"},\"assistant_preview_end\":{\"message\":\"Napusti pregled\"},\"wot_unknown_description\":{\"message\":\"Reputacija nije definisana\"},\"wot_bad_description\":{\"message\":\"Ovaj sajt ima veoma lošu reputaciju\\\\nprema \"},\"wot_poor_description\":{\"message\":\"Ovaj sajt ima lošu reputaciju\\\\nprema \"},\"wot_unsatisfactory_description\":{\"message\":\"Ovaj sajt ima slabu reputaciju\\\\nprema \"},\"wot_good_description\":{\"message\":\"Ovaj sajt ima dobru reputaciju\\\\nprema \"},\"wot_excellent_description\":{\"message\":\"Ovaj sajt ima odličnu reputaciju\\\\nprema \"},\"settings_choose_size_and_position\":{\"message\":\"Podesite veličinu i poziciju AdGuard pomoćnika\"},\"settings_icon_size\":{\"message\":\"Veličina ikonice\"},\"settings_small\":{\"message\":\"Mala\"},\"settings_big\":{\"message\":\"Velika\"},\"settings_position\":{\"message\":\"Pozicija:\"},\"settings_left_top\":{\"message\":\"Gore levo\"},\"settings_right_top\":{\"message\":\"Gore desno\"},\"settings_left_bottom\":{\"message\":\"Dole levo\"},\"settings_right_bottom\":{\"message\":\"Dole desno\"},\"settings_cancel\":{\"message\":\"Otkaži\"},\"settings_save\":{\"message\":\"Sačuvaj promene\"}}');\n\t }),\n\t 6105:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Webbplatser\",\"settings_position_save_all\":\"Alla webbplatser\",\"settings_position_save_this\":\"Den här webbplatsen\",\"assistant_select_element_text\":\"Välj ett element sidan att blockera. Återladda sidan för att återställa elementblockeringsläget.\",\"menu_filtration_status\":{\"message\":\"Webbplatsens filtrering\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Pausa filtrering 30 sekunder\"},\"menu_block_ad_on_site\":{\"message\":\"Blockera annons på den här webbplatsen\"},\"menu_report_abuse\":{\"message\":\"Rapportera webbplatsen\"},\"menu_site_report\":{\"message\":\"Säkerhetsrapport för webbplatsen\"},\"menu_settings\":{\"message\":\"Assistentinställningar\"},\"assistant_select_element\":{\"message\":\"Blockering av annonselement\"},\"assistant_select_element_ext\":{\"message\":\"Välj ett annonselement för blockering\"},\"assistant_select_element_cancel\":{\"message\":\"Avbryt\"},\"assistant_block_element\":{\"message\":\"Blockering av annonselement\"},\"assistant_block_element_explain\":{\"message\":\"Anpassa blockeringsregeln för annonselementet\"},\"assistant_slider_explain\":{\"message\":\"Justera storleken på annonselementet som den nya blockeringsregeln skall avse:\"},\"assistant_extended_settings\":{\"message\":\"Avancerade val\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Tillämpa regelns på alla webbplatster\"},\"assistant_block_by_reference\":{\"message\":\"Blockera med referenslänk\"},\"assistant_block_similar\":{\"message\":\"Blockera liknande\"},\"assistant_another_element\":{\"message\":\"Markera ett annat annonselement\"},\"assistant_preview\":{\"message\":\"Förhandsgranska\"},\"assistant_block\":{\"message\":\"Blockera\"},\"assistant_settings\":{\"message\":\"Assistentval\"},\"assistant_preview_header\":{\"message\":\"Förhandsgranskning av elementblockeringen\"},\"assistant_preview_header_info\":{\"message\":\"Kontrollera att elementet blockerats som avsett\"},\"assistant_preview_end\":{\"message\":\"Avsluta förhandsgranskningen\"},\"wot_unknown_description\":{\"message\":\"Den här sajtens anseende är inte klarlagd av $1\"},\"wot_bad_description\":{\"message\":\"Webbplatsen har ett mycket dåligt anseende\\\\nenligt $1\"},\"wot_poor_description\":{\"message\":\"Webbplatsen har dåligt anseende\\\\nenligt $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Webbplatsen har tveksamt anseende\\\\nenligt $1\"},\"wot_good_description\":{\"message\":\"Webbplatsen har gott anseende\\\\nenligt $1\"},\"wot_excellent_description\":{\"message\":\"Webbplatsen har ett mycket gott anseende\\\\nenligt $1\"},\"settings_choose_size_and_position\":{\"message\":\"Anpassas storlek och läge för AdGuardassistenten\"},\"settings_icon_size\":{\"message\":\"Ikonstorlek\"},\"settings_small\":{\"message\":\"Liten\"},\"settings_big\":{\"message\":\"Stor\"},\"settings_position\":{\"message\":\"Läge:\"},\"settings_left_top\":{\"message\":\"Ovan vänster\"},\"settings_right_top\":{\"message\":\"Ovan höger\"},\"settings_left_bottom\":{\"message\":\"Nedan vänster\"},\"settings_right_bottom\":{\"message\":\"Nedan höger\"},\"settings_cancel\":{\"message\":\"Avbryt\"},\"settings_save\":{\"message\":\"Spara ändringar\"}}');\n\t }),\n\t 147:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Siteler\",\"settings_position_save_all\":\"Tüm siteler\",\"settings_position_save_this\":\"Bu site\",\"assistant_select_element_start\":\"Başla\",\"assistant_select_element_text\":\"Engellemek için sayfada bir öğe seçin. Öğe engelleme modunu iptal etmek için sayfayı yenileyin.\",\"menu_filtration_status\":{\"message\":\"Bu sitedeki filtreleme\"},\"menu_do_not_filter_30_sec\":{\"message\":\"30 saniyeliğine filtreleme yapma\"},\"menu_block_ad_on_site\":{\"message\":\"Bu sitede reklam engelle\"},\"menu_report_abuse\":{\"message\":\"Siteyi bildir\"},\"menu_site_report\":{\"message\":\"Sitenin güvenlik raporu\"},\"menu_settings\":{\"message\":\"Asistan ayarları\"},\"menu_wot_reputation_indicator\":{\"message\":\"Site itibarı göstergesi\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"İtibarın Güven Seviyesi\"},\"assistant_select_element\":{\"message\":\"Öğe engelleme\"},\"assistant_select_element_ext\":{\"message\":\"Sayfada engellenecek bir öğe seçin\"},\"assistant_select_element_cancel\":{\"message\":\"İptal\"},\"assistant_block_element\":{\"message\":\"Öğe engelleme\"},\"assistant_block_element_explain\":{\"message\":\"Öğe engelleme kuralını ayarla\"},\"assistant_slider_explain\":{\"message\":\"Yeni kuralın çalışacağı çerçevenin boyutunu değiştirmek için kayar düğmeyi hareket ettirin\"},\"assistant_extended_settings\":{\"message\":\"Gelişmiş ayarlar\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Kuralı tüm sitelerde uygula\"},\"assistant_block_by_reference\":{\"message\":\"Referans bağlantı ile engelle\"},\"assistant_block_similar\":{\"message\":\"Benzerlerini engelle\"},\"assistant_another_element\":{\"message\":\"Farklı bir öğe seç\"},\"assistant_preview\":{\"message\":\"Önizleme\"},\"assistant_block\":{\"message\":\"Engelle\"},\"assistant_settings\":{\"message\":\"Asistan ayarları\"},\"assistant_preview_header\":{\"message\":\"Öğe engelleme - ön izleme\"},\"assistant_preview_header_info\":{\"message\":\"Öğenin istediğiniz gibi engellendiğinden emin olun\"},\"assistant_preview_end\":{\"message\":\"Önizlemeden çık\"},\"wot_unknown_description\":{\"message\":\"Bu sitenin itibarı $1 tarafından henüz belirlenmemiş\"},\"wot_bad_description\":{\"message\":\"1$\\'a göre bu site çok kötü \\\\nbir itibara sahip\"},\"wot_poor_description\":{\"message\":\"1$\\'a göre bu site kötü \\\\nbir itibara sahip\"},\"wot_unsatisfactory_description\":{\"message\":\"1$\\'a göre bu site zayıf\\\\nbir itibara sahip\"},\"wot_good_description\":{\"message\":\"1$\\'a göre bu site iyi\\\\nbir itibara sahip\"},\"wot_excellent_description\":{\"message\":\"1$\\'a göre bu site mükemmel\\\\nbir itibara sahip\"},\"settings_choose_size_and_position\":{\"message\":\"AdGuard Asistanın boyutunu ve konumunu ayarlayın\"},\"settings_icon_size\":{\"message\":\"Simge boyutu:\"},\"settings_small\":{\"message\":\"Küçük\"},\"settings_big\":{\"message\":\"Büyük\"},\"settings_position\":{\"message\":\"Konum:\"},\"settings_left_top\":{\"message\":\"Sol üst\"},\"settings_right_top\":{\"message\":\"Sağ üst\"},\"settings_left_bottom\":{\"message\":\"Sol alt\"},\"settings_right_bottom\":{\"message\":\"Sağ alt\"},\"settings_cancel\":{\"message\":\"İptal\"},\"settings_save\":{\"message\":\"Değişiklikleri kaydet\"}}');\n\t }),\n\t 1249:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Сайти\",\"settings_position_save_all\":\"На всіх\",\"settings_position_save_this\":\"Тільки на даному\",\"assistant_select_element_start\":\"Почати\",\"assistant_select_element_text\":\"Виберіть елемент на сторінці, який треба заблокувати. Оновіть сторінку, щоб скасувати режим блокування.\",\"menu_filtration_status\":{\"message\":\"Фільтрування на цьому сайті\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Не фільтрувати 30 секунд\"},\"menu_block_ad_on_site\":{\"message\":\"Заблокувати рекламу на даному сайті\"},\"menu_report_abuse\":{\"message\":\"Повідомити про сайт\"},\"menu_site_report\":{\"message\":\"Звіт про безпеку сайту\"},\"menu_settings\":{\"message\":\"Налаштування помічника\"},\"menu_wot_reputation_indicator\":{\"message\":\"Індикатор репутації сайту\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Рівень надійності репутації\"},\"assistant_select_element\":{\"message\":\"Блокування елементу\"},\"assistant_select_element_ext\":{\"message\":\"Виберіть елемент на сторінці, який треба заблокувати\"},\"assistant_select_element_cancel\":{\"message\":\"Скасувати\"},\"assistant_block_element\":{\"message\":\"Блокування елементу\"},\"assistant_block_element_explain\":{\"message\":\"Налаштуйте правило блокування елементу\"},\"assistant_slider_explain\":{\"message\":\"Пересувайте повзунок, щоб змінити розмір блоку, для якого діятиме правило:\"},\"assistant_extended_settings\":{\"message\":\"Розширені налаштування\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Застосувати правило для всіх сайтів\"},\"assistant_block_by_reference\":{\"message\":\"Блокувати за посиланням\"},\"assistant_block_similar\":{\"message\":\"Блокувати схожі елементи\"},\"assistant_another_element\":{\"message\":\"Вибрати інший елемент\"},\"assistant_preview\":{\"message\":\"Попередній перегляд\"},\"assistant_block\":{\"message\":\"Заблокувати\"},\"assistant_settings\":{\"message\":\"Налаштування помічника\"},\"assistant_preview_header\":{\"message\":\"Блокування елементу - попередній перегляд\"},\"assistant_preview_header_info\":{\"message\":\"Переконайтеся, що елемент заблокований як слід\"},\"assistant_preview_end\":{\"message\":\"Закінчити попередній перегляд\"},\"wot_unknown_description\":{\"message\":\"Репутація цього вебсайту не визначена\"},\"wot_bad_description\":{\"message\":\"Цей сайт має дуже погану репутацію\\\\nза версією $1\"},\"wot_poor_description\":{\"message\":\"Цей сайт має погану репутацію\\\\nза версією $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Цей сайт має незадовільну репутацію\\\\nза версією $1\"},\"wot_good_description\":{\"message\":\"Цей сайт має добру репутацію\\\\nза версією $1\"},\"wot_excellent_description\":{\"message\":\"Цей сайт має дуже відмінну репутацію\\\\nза версією $1\"},\"settings_choose_size_and_position\":{\"message\":\"Налаштуйте розмір і положення помічника AdGuard\"},\"settings_icon_size\":{\"message\":\"Розмір іконки:\"},\"settings_small\":{\"message\":\"Маленька\"},\"settings_big\":{\"message\":\"Велика\"},\"settings_position\":{\"message\":\"Позиція:\"},\"settings_left_top\":{\"message\":\"Зверху зліва\"},\"settings_right_top\":{\"message\":\"Зверху справа\"},\"settings_left_bottom\":{\"message\":\"Внизу зліва\"},\"settings_right_bottom\":{\"message\":\"Внизу справа\"},\"settings_cancel\":{\"message\":\"Скасувати\"},\"settings_save\":{\"message\":\"Зберегти зміни\"}}');\n\t }),\n\t 4534:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"Trang Web\",\"settings_position_save_all\":\"Tất cả trang web\",\"settings_position_save_this\":\"Chỉ trang web này\",\"assistant_select_element_start\":\"Bắt đầu\",\"assistant_select_element_text\":\"Chọn một thành phần trên trang để chặn. Làm mới trang web để hủy bỏ chế độ chặn thành phần.\",\"menu_filtration_status\":{\"message\":\"Lọc trên website này\"},\"menu_do_not_filter_30_sec\":{\"message\":\"Không lọc trong 30 giây\"},\"menu_block_ad_on_site\":{\"message\":\"Chặn quảng cáo đối với trang web này\"},\"menu_report_abuse\":{\"message\":\"Báo cáo trang web này\"},\"menu_site_report\":{\"message\":\"Báo cáo bảo mật website\"},\"menu_settings\":{\"message\":\"Cài đặt trợ lý\"},\"menu_wot_reputation_indicator\":{\"message\":\"Chỉ số danh tiếng của trang Web\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"Mức độ đáng tin của danh tiếng\"},\"assistant_select_element\":{\"message\":\"Chặn thành phần\"},\"assistant_select_element_ext\":{\"message\":\"Chọn một thành phần trên trang để chặn\"},\"assistant_select_element_cancel\":{\"message\":\"Hủy bỏ\"},\"assistant_block_element\":{\"message\":\"Chặn thành phần\"},\"assistant_block_element_explain\":{\"message\":\"Điều chỉnh quy tắc chặn phần tử\"},\"assistant_slider_explain\":{\"message\":\"Di chuyển thanh trượt để thay đổi kích thước của khung, quy tắc mới sẽ hoạt động cho:\"},\"assistant_extended_settings\":{\"message\":\"Cài đặt nâng cao\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"Áp dụng tất cả các điều luật đối với mọi trang web\"},\"assistant_block_by_reference\":{\"message\":\"Chặn theo liên kết tham chiếu\"},\"assistant_block_similar\":{\"message\":\"Chặn tương tự\"},\"assistant_another_element\":{\"message\":\"Chọn một phần tử khác\"},\"assistant_preview\":{\"message\":\"Xem trước\"},\"assistant_block\":{\"message\":\"Chặn\"},\"assistant_settings\":{\"message\":\"Cài đặt trợ lý\"},\"assistant_preview_header\":{\"message\":\"Element blocking-xem trước\"},\"assistant_preview_header_info\":{\"message\":\"Đảm bảo rằng thành phần đó bị chặn như dự định\"},\"assistant_preview_end\":{\"message\":\"Thoát xem trước\"},\"wot_unknown_description\":{\"message\":\"Website này danh tiếng chưa được xác định bởi $1\"},\"wot_bad_description\":{\"message\":\"Website này có danh tiếng cực xấu dựa theo $1\"},\"wot_poor_description\":{\"message\":\"Website này có danh tiếng xấu dựa theo $1\"},\"wot_unsatisfactory_description\":{\"message\":\"Website này có danh tiếng không tốt dựa theo $1\"},\"wot_good_description\":{\"message\":\"Website này có danh tiếng tốt dựa theo $1\"},\"wot_excellent_description\":{\"message\":\"Website này có danh tiếng tuyệt vời dựa theo $1\"},\"settings_choose_size_and_position\":{\"message\":\"Điều chỉnh kích thước và vị trí của Trợ Lý AdGuard\"},\"settings_icon_size\":{\"message\":\"Kích thước biểu tượng:\"},\"settings_small\":{\"message\":\"Nhỏ\"},\"settings_big\":{\"message\":\"Lớn\"},\"settings_position\":{\"message\":\"Vị trí:\"},\"settings_left_top\":{\"message\":\"Trên cùng bên trái\"},\"settings_right_top\":{\"message\":\"Trên cùng bên phải\"},\"settings_left_bottom\":{\"message\":\"Dưới cùng bên trái\"},\"settings_right_bottom\":{\"message\":\"Dưới cùng bên phải\"},\"settings_cancel\":{\"message\":\"Hủy bỏ\"},\"settings_save\":{\"message\":\"Lưu các thay đổi\"}}');\n\t }),\n\t 3476:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"網站\",\"settings_position_save_all\":\"所有網站\",\"settings_position_save_this\":\"此網站\",\"assistant_select_element_start\":\"開始\",\"assistant_select_element_text\":\"選擇網頁上的元素來阻擋。若要取消重新整理網頁即可。\",\"menu_filtration_status\":{\"message\":\"過濾此網頁上的廣告\"},\"menu_do_not_filter_30_sec\":{\"message\":\"暫停過濾 30 秒\"},\"menu_block_ad_on_site\":{\"message\":\"封鎖此網頁上的廣告\"},\"menu_report_abuse\":{\"message\":\"回報此網站\"},\"menu_site_report\":{\"message\":\"網站安全性報告\"},\"menu_settings\":{\"message\":\"助手設定\"},\"menu_wot_reputation_indicator\":{\"message\":\"網頁名譽指標\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"名譽可信程度\"},\"assistant_select_element\":{\"message\":\"封鎖網頁元素\"},\"assistant_select_element_ext\":{\"message\":\"選取網頁上的元素來封鎖\"},\"assistant_select_element_cancel\":{\"message\":\"取消\"},\"assistant_block_element\":{\"message\":\"阻擋網頁元素\"},\"assistant_block_element_explain\":{\"message\":\"調整網頁元素阻擋條件\"},\"assistant_slider_explain\":{\"message\":\"移動滑桿可以更改阻擋元素範圍:\"},\"assistant_extended_settings\":{\"message\":\"進階設定\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"套用至所有網站\"},\"assistant_block_by_reference\":{\"message\":\"通過參考連結封鎖\"},\"assistant_block_similar\":{\"message\":\"封鎖相關或類似的\"},\"assistant_another_element\":{\"message\":\"選取其他網頁元素\"},\"assistant_preview\":{\"message\":\"預覽\"},\"assistant_block\":{\"message\":\"封鎖\"},\"assistant_settings\":{\"message\":\"助手設定\"},\"assistant_preview_header\":{\"message\":\"封鎖網頁元祖 - 預覽\"},\"assistant_preview_header_info\":{\"message\":\"確保網頁元素已被正確封鎖\"},\"assistant_preview_end\":{\"message\":\"關閉預覽\"},\"wot_unknown_description\":{\"message\":\"此網站名譽尚未被 $1 評定\"},\"wot_bad_description\":{\"message\":\"根據 $1\\\\n此網站名譽非常糟糕\"},\"wot_poor_description\":{\"message\":\"根據 $1\\\\n此網站擁有不良的名譽\"},\"wot_unsatisfactory_description\":{\"message\":\"根據 $1\\\\n此網站擁有不好的名譽\"},\"wot_good_description\":{\"message\":\"根據 $1\\\\n此網站擁有良好的名譽\"},\"wot_excellent_description\":{\"message\":\"根據 $1\\\\n此網站擁有非常優秀的名譽\"},\"settings_choose_size_and_position\":{\"message\":\"調整 AdGuard 小助手大小與位置\"},\"settings_icon_size\":{\"message\":\"圖示大小:\"},\"settings_small\":{\"message\":\"小\"},\"settings_big\":{\"message\":\"大\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上角\"},\"settings_right_top\":{\"message\":\"右上角\"},\"settings_left_bottom\":{\"message\":\"左下角\"},\"settings_right_bottom\":{\"message\":\"右下角\"},\"settings_cancel\":{\"message\":\"取消\"},\"settings_save\":{\"message\":\"儲存變更\"}}');\n\t }),\n\t 5480:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"網站\",\"settings_position_save_all\":\"所有的網站\",\"settings_position_save_this\":\"此網站\",\"assistant_select_element_start\":\"開始\",\"assistant_select_element_text\":\"選擇於該頁面上之元件以封鎖。重新整理該頁面以取消元件封鎖模式。\",\"menu_filtration_status\":{\"message\":\"對此網站之過濾\"},\"menu_do_not_filter_30_sec\":{\"message\":\"計 30 秒不過濾\"},\"menu_block_ad_on_site\":{\"message\":\"封鎖於此網站上之廣告\"},\"menu_report_abuse\":{\"message\":\"報告該網站\"},\"menu_site_report\":{\"message\":\"網站安全性報告\"},\"menu_settings\":{\"message\":\"助理設定\"},\"menu_wot_reputation_indicator\":{\"message\":\"網站信譽指標\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"信譽信賴等級\"},\"assistant_select_element\":{\"message\":\"元件封鎖\"},\"assistant_select_element_ext\":{\"message\":\"選擇於該頁面上之元件以封鎖\"},\"assistant_select_element_cancel\":{\"message\":\"取消\"},\"assistant_block_element\":{\"message\":\"元件封鎖\"},\"assistant_block_element_explain\":{\"message\":\"調整元件封鎖規則\"},\"assistant_slider_explain\":{\"message\":\"移動該滑標以更改新的規則將作用於的框架之尺寸:\"},\"assistant_extended_settings\":{\"message\":\"進階設定\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"對所有的網站套用該規則\"},\"assistant_block_by_reference\":{\"message\":\"按照參考連結封鎖\"},\"assistant_block_similar\":{\"message\":\"封鎖相似之物\"},\"assistant_another_element\":{\"message\":\"選擇不同的元件\"},\"assistant_preview\":{\"message\":\"預覽\"},\"assistant_block\":{\"message\":\"封鎖\"},\"assistant_settings\":{\"message\":\"助理設定\"},\"assistant_preview_header\":{\"message\":\"元件封鎖 - 預覽\"},\"assistant_preview_header_info\":{\"message\":\"確定元件如預期的被封鎖\"},\"assistant_preview_end\":{\"message\":\"離開預覽\"},\"wot_unknown_description\":{\"message\":\"此網站的信譽未被 $1 界定\"},\"wot_bad_description\":{\"message\":\"根據 $1,\\\\n此網站有非常壞的信譽\"},\"wot_poor_description\":{\"message\":\"根據 $1,\\\\n此網站有壞的信譽\"},\"wot_unsatisfactory_description\":{\"message\":\"根據 $1,\\\\n此網站有不好的信譽\"},\"wot_good_description\":{\"message\":\"根據 $1,\\\\n此網站有好的信譽\"},\"wot_excellent_description\":{\"message\":\"根據 $1,\\\\n此網站有極好的信譽\"},\"settings_choose_size_and_position\":{\"message\":\"調整 AdGuard 助理尺寸和位置\"},\"settings_icon_size\":{\"message\":\"圖示尺寸:\"},\"settings_small\":{\"message\":\"小的\"},\"settings_big\":{\"message\":\"大的\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上角\"},\"settings_right_top\":{\"message\":\"右上角\"},\"settings_left_bottom\":{\"message\":\"左下角\"},\"settings_right_bottom\":{\"message\":\"右下角\"},\"settings_cancel\":{\"message\":\"取消\"},\"settings_save\":{\"message\":\"儲存更改\"}}');\n\t }),\n\t 8868:\n\t ((module) => {\n\tmodule.exports = JSON.parse('{\"settings_position_save\":\"网站\",\"settings_position_save_all\":\"所有网站\",\"settings_position_save_this\":\"此网站\",\"assistant_select_element_start\":\"开始\",\"assistant_select_element_text\":\"选择要拦截的网页元素。要取消元素拦截模式,请刷新网页。\",\"menu_filtration_status\":{\"message\":\"对此网站进行过滤\"},\"menu_do_not_filter_30_sec\":{\"message\":\"暂停过滤 30 秒\"},\"menu_block_ad_on_site\":{\"message\":\"拦截此网站上的广告\"},\"menu_report_abuse\":{\"message\":\"报告此网站\"},\"menu_site_report\":{\"message\":\"网站安全报告\"},\"menu_settings\":{\"message\":\"助手设置\"},\"menu_wot_reputation_indicator\":{\"message\":\"网站声誉指标\"},\"menu_wot_reputation_confidence_level\":{\"message\":\"声望置信度\"},\"assistant_select_element\":{\"message\":\"拦截元素\"},\"assistant_select_element_ext\":{\"message\":\"选择此页面上需要拦截的元素\"},\"assistant_select_element_cancel\":{\"message\":\"取消\"},\"assistant_block_element\":{\"message\":\"拦截元素\"},\"assistant_block_element_explain\":{\"message\":\"调整元素拦截规则\"},\"assistant_slider_explain\":{\"message\":\"使用滑块改变要由新规则将要拦截的框架大小:\"},\"assistant_extended_settings\":{\"message\":\"高级设置\"},\"assistant_apply_rule_to_all_sites\":{\"message\":\"应用规则至所有网站\"},\"assistant_block_by_reference\":{\"message\":\"通过参考链接进行拦截\"},\"assistant_block_similar\":{\"message\":\"拦截类似元素\"},\"assistant_another_element\":{\"message\":\"选择其它元素\"},\"assistant_preview\":{\"message\":\"预览\"},\"assistant_block\":{\"message\":\"拦截\"},\"assistant_settings\":{\"message\":\"AdGuard 助手设置\"},\"assistant_preview_header\":{\"message\":\"元素拦截 - 预览\"},\"assistant_preview_header_info\":{\"message\":\"请确保元素拦截方式符合预期\"},\"assistant_preview_end\":{\"message\":\"退出预览\"},\"wot_unknown_description\":{\"message\":\"声望尚未定义\"},\"wot_bad_description\":{\"message\":\"此网站在以下数据库中声望极低\"},\"wot_poor_description\":{\"message\":\"此网站在以下数据库中声望低下 \"},\"wot_unsatisfactory_description\":{\"message\":\"此网站在以下数据库中声望不佳 \"},\"wot_good_description\":{\"message\":\"此网站在以下数据库中声望良好 \"},\"wot_excellent_description\":{\"message\":\"此网站在以下数据库中声望极佳 \"},\"settings_choose_size_and_position\":{\"message\":\"调整 AdGuard 助手的大小与位置\"},\"settings_icon_size\":{\"message\":\"图标大小:\"},\"settings_small\":{\"message\":\"小\"},\"settings_big\":{\"message\":\"大\"},\"settings_position\":{\"message\":\"位置:\"},\"settings_left_top\":{\"message\":\"左上角\"},\"settings_right_top\":{\"message\":\"右上角\"},\"settings_left_bottom\":{\"message\":\"左下角\"},\"settings_right_bottom\":{\"message\":\"右下角\"},\"settings_cancel\":{\"message\":\"取消\"},\"settings_save\":{\"message\":\"保存更改\"}}');\n\t })\n\t \t});\n\t \tvar __webpack_module_cache__ = {};\n\t \tfunction __webpack_require__(moduleId) {\n\t \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n\t \t\tif (cachedModule !== undefined) {\n\t \t\t\treturn cachedModule.exports;\n\t \t\t}\n\t \t\tvar module = __webpack_module_cache__[moduleId] = {\n\t \t\t\tid: moduleId,\n\t \t\t\texports: {}\n\t \t\t};\n\t \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\t \t\treturn module.exports;\n\t \t}\n\t \t(() => {\n\t \t\t__webpack_require__.n = (module) => {\n\t \t\t\tvar getter = module && module.__esModule ?\n\t \t\t\t\t() => (module['default']) :\n\t \t\t\t\t() => (module);\n\t \t\t\t__webpack_require__.d(getter, { a: getter });\n\t \t\t\treturn getter;\n\t \t\t};\n\t \t})();\n\t \t(() => {\n\t \t\t__webpack_require__.d = (exports, definition) => {\n\t \t\t\tfor(var key in definition) {\n\t \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t \t\t\t\t}\n\t \t\t\t}\n\t \t\t};\n\t \t})();\n\t \t(() => {\n\t \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop));\n\t \t})();\n\t \t(() => {\n\t \t\t__webpack_require__.r = (exports) => {\n\t \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t \t\t\t}\n\t \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n\t \t\t};\n\t \t})();\n\tvar __webpack_exports__ = {};\n\t(() => {\n\t__webpack_require__.r(__webpack_exports__);\n\t__webpack_require__.d(__webpack_exports__, {\n\t \"adguardAssistant\": () => ( adguardAssistant)\n\t});\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\tfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\tfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\tvar getArguments = function getArguments(func) {\n\t var FN_ARGS = /^function\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n\t var args = func.toString().match(FN_ARGS)[1].split(',');\n\t if (args[0] === '') {\n\t return [];\n\t }\n\t return args;\n\t};\n\tvar Ioc = function () {\n\t function Ioc() {\n\t _classCallCheck(this, Ioc);\n\t this.dependencies = {};\n\t }\n\t _createClass(Ioc, [{\n\t key: \"resolveDependencies\",\n\t value: function resolveDependencies(func) {\n\t var args = getArguments(func);\n\t var resolved = [];\n\t for (var i = 0; i < args.length; i += 1) {\n\t var depName = args[i].trim();\n\t var dep = this.dependencies[depName];\n\t if (!dep) {\n\t throw new Error(\"Can't find dependency: \".concat(depName));\n\t }\n\t resolved.push(this.dependencies[depName]);\n\t }\n\t return resolved;\n\t }\n\t }, {\n\t key: \"register\",\n\t value: function register(qualifier, obj) {\n\t this.dependencies[qualifier] = obj;\n\t }\n\t }, {\n\t key: \"get\",\n\t value: function get(func) {\n\t if (typeof func === 'string') {\n\t var resolved = this.dependencies[func];\n\t if (!resolved) {\n\t throw new Error(\"Can't resolve \".concat(func));\n\t }\n\t return resolved;\n\t }\n\t var resolvedDependencies = this.resolveDependencies(func);\n\t function FuncWrapper() {\n\t return func.apply(func, resolvedDependencies);\n\t }\n\t FuncWrapper.prototype = func.prototype;\n\t return new FuncWrapper();\n\t }\n\t }]);\n\t return Ioc;\n\t}();\n\tvar ioc = new Ioc();\n\t const src_ioc = (ioc);\n\tfunction ProtectedApi() {\n\t var win = window;\n\t var functionPType = Function.prototype;\n\t var originalGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\t var _document = document,\n\t documentMode = _document.documentMode,\n\t documentElement = _document.documentElement;\n\t var originalAppendChild = document.appendChild;\n\t var originalJSON = win.JSON;\n\t var functionApply = functionPType.apply;\n\t var functionBind = functionPType.bind;\n\t var COMPLETE = 'complete';\n\t var originalAttachShadow = documentElement.attachShadow;\n\t var apply = typeof Reflect !== 'undefined' ? Reflect.apply : function (target, _this, _arguments) {\n\t return functionApply.call(target, _this, _arguments);\n\t };\n\t var noop = function noop() {};\n\t var methodCallerFactory = function methodCallerFactory(owner, prop) {\n\t if (!owner) {\n\t return noop;\n\t }\n\t var method = owner[prop];\n\t return function () {\n\t if (method) {\n\t return apply(method, owner, arguments);\n\t }\n\t };\n\t };\n\t var getReadyState = function getReadyState() {\n\t if (typeof originalGetOwnPropertyDescriptor(Document.prototype, 'readyState') === 'undefined') {\n\t return COMPLETE;\n\t }\n\t var readyStateGetter = originalGetOwnPropertyDescriptor(Document.prototype, 'readyState').get;\n\t return apply(readyStateGetter, document, []);\n\t };\n\t var addListenerToWindow = methodCallerFactory(win, 'addEventListener');\n\t var removeListenerFromWindow = methodCallerFactory(win, 'removeEventListener');\n\t var querySelector = methodCallerFactory(document, 'querySelector');\n\t var appendChildToElement = function appendChildToElement(elem, child) {\n\t apply(originalAppendChild, elem, [child]);\n\t };\n\t var createElement = function createElement(markup) {\n\t var doc = document.implementation.createHTMLDocument('');\n\t if (markup && markup[0] !== '<') {\n\t markup = \"<\".concat(markup, \">\");\n\t }\n\t doc.body.innerHTML = markup;\n\t return doc.body.firstChild;\n\t };\n\t var json = {\n\t parse: methodCallerFactory(originalJSON, 'parse'),\n\t stringify: methodCallerFactory(originalJSON, 'stringify')\n\t };\n\t var createStylesElement = function createStylesElement(styles, nonce, id) {\n\t if (id && querySelector(\"#\".concat(id))) {\n\t return false;\n\t }\n\t var tagNode = createElement('style');\n\t tagNode.setAttribute('type', 'text/css');\n\t if (id) {\n\t tagNode.setAttribute('id', id);\n\t }\n\t tagNode.setAttribute('nonce', nonce);\n\t if (tagNode.styleSheet) {\n\t tagNode.styleSheet.cssText = styles;\n\t } else {\n\t appendChildToElement(tagNode, document.createTextNode(styles));\n\t }\n\t return tagNode;\n\t };\n\t var checkShadowDomSupport = function checkShadowDomSupport() {\n\t var SAFARI_UA_REGEX = /^((?!chrome|android).)*safari/i;\n\t var isSafari = window.safari !== undefined || SAFARI_UA_REGEX.test(navigator.userAgent);\n\t return typeof originalAttachShadow !== 'undefined' && !isSafari;\n\t };\n\t return {\n\t functionBind: functionBind,\n\t addListenerToWindow: addListenerToWindow,\n\t removeListenerFromWindow: removeListenerFromWindow,\n\t getReadyState: getReadyState,\n\t documentMode: documentMode,\n\t appendChildToElement: appendChildToElement,\n\t createElement: createElement,\n\t json: json,\n\t createStylesElement: createStylesElement,\n\t checkShadowDomSupport: checkShadowDomSupport\n\t };\n\t}\n\tvar protectedApi = new ProtectedApi();\n\t const src_protectedApi = (protectedApi);\n\tfunction Wot() {\n\t var wotUrlScorecardTemplate = 'https://link.adtidy.org/forward.html?action=wot_scorecard&from=main_menu&app=assistant&domain=';\n\t var WOT_URL = 'https://link.adtidy.org/forward.html?action=wot&from=main_menu&app=assistant';\n\t var wotData = null;\n\t var registerWotEventHandler = function registerWotEventHandler() {\n\t var wotDataCb = function wotDataCb(data) {\n\t wotData = data;\n\t };\n\t if (window.WotData) {\n\t wotData = window.WotData;\n\t } else {\n\t window.WotData = wotDataCb;\n\t }\n\t };\n\t var getWotData = function getWotData() {\n\t return wotData;\n\t };\n\t var getWotScorecardUrl = function getWotScorecardUrl(url) {\n\t return \"\".concat(wotUrlScorecardTemplate).concat(url);\n\t };\n\t return {\n\t registerWotEventHandler: registerWotEventHandler,\n\t getWotData: getWotData,\n\t getWotScorecardUrl: getWotScorecardUrl,\n\t WOT_URL: WOT_URL\n\t };\n\t}\n\tvar wot = new Wot();\n\t const src_wot = (wot);\n\tvar bypassCache = function bypassCache(callback) {\n\t var xhr = new XMLHttpRequest();\n\t xhr.open('GET', window.location.href, true);\n\t xhr.setRequestHeader('Pragma', 'no-cache');\n\t xhr.setRequestHeader('Expires', '-1');\n\t xhr.setRequestHeader('Cache-Control', 'no-cache');\n\t xhr.onreadystatechange = function () {\n\t if (xhr.readyState === 4 && callback) {\n\t callback();\n\t }\n\t };\n\t xhr.send();\n\t};\n\tvar reloadPageBypassCache = function reloadPageBypassCache() {\n\t bypassCache(function () {\n\t window.location.reload(true);\n\t });\n\t};\n\tvar events = {\n\t add: function add(elements, es, eventHandler, useCapture) {\n\t this.addRemoveEvents(true, elements, es, eventHandler, useCapture);\n\t },\n\t remove: function remove(elements, es, eventHandler, useCapture) {\n\t this.addRemoveEvents(false, elements, es, eventHandler, useCapture);\n\t },\n\t addRemoveEvents: function addRemoveEvents(add, elements, es, eventHandler, useCapture) {\n\t if (!elements || !es || !eventHandler) {\n\t return false;\n\t }\n\t var eventList = es.split(' ');\n\t if (!eventList || eventList.length < 1) {\n\t return false;\n\t }\n\t if (!elements.length) {\n\t elements = new Array(elements);\n\t }\n\t for (var el = 0; el < elements.length; el += 1) {\n\t for (var evt = 0; evt < eventList.length; evt += 1) {\n\t if (!eventList[evt] || !eventList[evt].length) {\n\t continue;\n\t }\n\t if (add) {\n\t elements[el].addEventListener(eventList[evt], eventHandler, !!useCapture);\n\t } else {\n\t elements[el].removeEventListener(eventList[evt], eventHandler, !!useCapture);\n\t }\n\t }\n\t }\n\t }\n\t};\n\tfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\tfunction Log() {\n\t var currentLevel = 'ERROR';\n\t var LogLevels = {\n\t ERROR: 1,\n\t WARN: 2,\n\t INFO: 3,\n\t DEBUG: 4\n\t };\n\t var print = function print(level, method, args) {\n\t if (LogLevels[currentLevel] < LogLevels[level]) {\n\t return;\n\t }\n\t if (!args || args.length === 0 || !args[0]) {\n\t return;\n\t }\n\t var formatted;\n\t if (_typeof(args[0]) === 'object') {\n\t formatted = args[0];\n\t } else {\n\t var str = \"\".concat(args[0]);\n\t args = Array.prototype.slice.call(args, 1);\n\t formatted = str.replace(/{(\\d+)}/g, function (match, number) {\n\t return typeof args[number] !== 'undefined' ? args[number] : match;\n\t });\n\t if (LogLevels[level] >= LogLevels[currentLevel]) {\n\t var now = new Date();\n\t formatted = \"\".concat(now.toISOString(), \": \").concat(formatted);\n\t }\n\t }\n\t console[method](formatted);\n\t };\n\t var debug = function debug() {\n\t for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\t print('DEBUG', 'log', args);\n\t };\n\t var info = function info() {\n\t for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t args[_key2] = arguments[_key2];\n\t }\n\t print('INFO', 'info', args);\n\t };\n\t var warn = function warn() {\n\t for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n\t args[_key3] = arguments[_key3];\n\t }\n\t print('WARN', 'info', args);\n\t };\n\t var error = function error() {\n\t for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n\t args[_key4] = arguments[_key4];\n\t }\n\t print('ERROR', 'error', args);\n\t };\n\t return {\n\t debug: debug,\n\t info: info,\n\t warn: warn,\n\t error: error\n\t };\n\t}\n\tvar log = new Log();\n\t const src_log = (log);\n\tfunction upgradeHelper_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\tfunction upgradeHelper_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\tfunction upgradeHelper_createClass(Constructor, protoProps, staticProps) { if (protoProps) upgradeHelper_defineProperties(Constructor.prototype, protoProps); if (staticProps) upgradeHelper_defineProperties(Constructor, staticProps); return Constructor; }\n\tvar UpgradeHelper = function () {\n\t function UpgradeHelper() {\n\t upgradeHelper_classCallCheck(this, UpgradeHelper);\n\t this.Constants = {\n\t BUTTON_POSITION_ITEM_NAME: '__adbpos'\n\t };\n\t }\n\t upgradeHelper_createClass(UpgradeHelper, [{\n\t key: \"getButtonPositionData\",\n\t value: function getButtonPositionData() {\n\t try {\n\t var userPosition = localStorage.getItem(this.Constants.BUTTON_POSITION_ITEM_NAME);\n\t if (userPosition) {\n\t return src_protectedApi.json.parse(userPosition);\n\t }\n\t return undefined;\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return undefined;\n\t }\n\t }\n\t }, {\n\t key: \"removeUserPositionForButton\",\n\t value: function removeUserPositionForButton() {\n\t try {\n\t localStorage.removeItem(this.Constants.BUTTON_POSITION_ITEM_NAME);\n\t } catch (ex) {\n\t src_log.error(ex);\n\t }\n\t }\n\t }, {\n\t key: \"upgradeGmStorage\",\n\t value: function upgradeGmStorage(settings, version) {\n\t settings.personal = {};\n\t settings.scriptVersion = version;\n\t settings.personalConfig = true;\n\t return settings;\n\t }\n\t }, {\n\t key: \"upgradeLocalStorage\",\n\t value: function upgradeLocalStorage(settings, sitename) {\n\t var position = this.getButtonPositionData();\n\t if (position) {\n\t if (!settings.personal[sitename]) {\n\t settings.personal[sitename] = {};\n\t }\n\t settings.personal[sitename].position = position;\n\t settings.personal[sitename].largeIcon = settings.largeIcon;\n\t }\n\t this.removeUserPositionForButton();\n\t return settings;\n\t }\n\t }]);\n\t return UpgradeHelper;\n\t}();\n\tvar upgradeHelper = new UpgradeHelper();\n\t const src_upgradeHelper = (upgradeHelper);\n\t const gm = ({});\n\tfunction settings_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { settings_typeof = function _typeof(obj) { return typeof obj; }; } else { settings_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return settings_typeof(obj); }\n\tfunction Settings() {\n\t var Constants = {\n\t MINIMUM_IE_SUPPORTED_VERSION: 10,\n\t MINIMUM_VISIBLE_HEIGHT_TO_SHOW_BUTTON: 250,\n\t IFRAME_ID: 'adguard-assistant-dialog',\n\t REPORT_URL: 'https://link.adtidy.org/forward.html?action=site_report_page&domain={0}&from=main_menu&app=assistant'\n\t };\n\t var MenuItemsNames = {\n\t DetailedMenu: 'mainMenu.html',\n\t SelectorMenu: 'selectorMenu.html',\n\t SliderMenu: 'sliderMenu.html',\n\t BlockPreview: 'blockPreview.html',\n\t SettingsMenu: 'settingsMenu.html'\n\t };\n\t var DefaultConfig = {\n\t buttonPositionTop: false,\n\t buttonPositionLeft: false,\n\t smallIcon: false,\n\t personalConfig: true,\n\t scriptVersion: 2,\n\t personal: {}\n\t };\n\t var wotData = null;\n\t var Config = null;\n\t var adguardSettings = null;\n\t var SITENAME = window.location.host;\n\t var getSettings = function getSettings() {\n\t return gm.getValue('settings').then(function (config) {\n\t try {\n\t return config && src_protectedApi.json.parse(config);\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return null;\n\t }\n\t });\n\t };\n\t var validateSettings = function validateSettings(settings) {\n\t if (!settings) {\n\t src_log.error('Invalid settings object');\n\t return false;\n\t }\n\t for (var prop in settings) {\n\t if (!settings.hasOwnProperty(prop)) {\n\t continue;\n\t }\n\t var property = DefaultConfig[prop];\n\t if (property && settings_typeof(property) !== settings_typeof(settings[prop])) {\n\t src_log.error('Invalid settings object');\n\t return false;\n\t }\n\t }\n\t if (settings.scriptVersion > DefaultConfig.scriptVersion) {\n\t src_log.error('Invalid settings object');\n\t return false;\n\t }\n\t if (settings.scriptVersion < DefaultConfig.scriptVersion) {\n\t src_log.info('Settings object is outdated. Updating...');\n\t settings = src_upgradeHelper.upgradeGmStorage(settings, DefaultConfig.scriptVersion);\n\t }\n\t settings = src_upgradeHelper.upgradeLocalStorage(settings, SITENAME);\n\t return settings;\n\t };\n\t var loadSettings = function loadSettings(showButton) {\n\t src_log.debug('Trying to get settings');\n\t getSettings().then(function (config) {\n\t var checkedConfig = config && validateSettings(config);\n\t if (checkedConfig) {\n\t Config = checkedConfig;\n\t src_log.debug('Settings parsed successfully');\n\t } else {\n\t Config = DefaultConfig;\n\t src_log.debug('No settings found');\n\t }\n\t showButton();\n\t });\n\t };\n\t var saveSettings = function saveSettings(config) {\n\t if (config) {\n\t Config = config;\n\t }\n\t src_log.debug('Update settings...');\n\t src_log.debug(Config);\n\t gm.setValue('settings', Config);\n\t bypassCache();\n\t };\n\t var getWotData = wotData;\n\t var setWotData = function setWotData(data) {\n\t wotData = data;\n\t };\n\t var setAdguardSettings = function setAdguardSettings(settings) {\n\t if (typeof settings === 'undefined') {\n\t src_log.info('No Adguard API Found');\n\t return;\n\t }\n\t adguardSettings = settings;\n\t };\n\t var getAdguardSettings = function getAdguardSettings() {\n\t return adguardSettings;\n\t };\n\t var getUserPositionForButton = function getUserPositionForButton() {\n\t var userPosition;\n\t if (Config.personalConfig) {\n\t if (Config.personal && Config.personal[SITENAME]) {\n\t userPosition = Config.personal[SITENAME].position;\n\t }\n\t } else {\n\t userPosition = Config.position;\n\t }\n\t if (userPosition) {\n\t return userPosition;\n\t }\n\t return null;\n\t };\n\t var setUserPositionForButton = function setUserPositionForButton(position) {\n\t if (Config.personalConfig) {\n\t if (!Config.personal[SITENAME]) {\n\t Config.personal[SITENAME] = {};\n\t }\n\t Config.personal[SITENAME].position = position;\n\t } else {\n\t Config.position = position;\n\t }\n\t saveSettings(Config);\n\t };\n\t var setIconSize = function setIconSize(smallIcon) {\n\t if (Config.personalConfig) {\n\t Config.personal[SITENAME].smallIcon = smallIcon;\n\t } else {\n\t Config.smallIcon = smallIcon;\n\t }\n\t };\n\t var getIconSize = function getIconSize() {\n\t if (Config.personalConfig && Config.personal && Config.personal[SITENAME]) {\n\t return Config.personal[SITENAME].smallIcon;\n\t }\n\t return Config.smallIcon;\n\t };\n\t var setButtonSide = function setButtonSide(buttonSides) {\n\t if (Config.personalConfig) {\n\t delete Config.personal[SITENAME].position;\n\t Config.personal[SITENAME].buttonPositionTop = buttonSides.top;\n\t Config.personal[SITENAME].buttonPositionLeft = buttonSides.left;\n\t } else {\n\t delete Config.position;\n\t Config.buttonPositionTop = buttonSides.top;\n\t Config.buttonPositionLeft = buttonSides.left;\n\t }\n\t };\n\t var setPersonalParam = function setPersonalParam(personalConfig) {\n\t Config.personalConfig = personalConfig;\n\t if (Config.personalConfig && !Config.personal) {\n\t Config.personal = {};\n\t }\n\t if (Config.personalConfig && !Config.personal[SITENAME]) {\n\t Config.personal[SITENAME] = {};\n\t Config.personal[SITENAME].position = Config.position;\n\t }\n\t if (!Config.personalConfig && Config.personal) {\n\t Config.position = Config.personal[SITENAME] && Config.personal[SITENAME].position;\n\t delete Config.personal;\n\t }\n\t };\n\t var getPersonalConfig = function getPersonalConfig() {\n\t return Config.personalConfig;\n\t };\n\t var getButtonSide = function getButtonSide() {\n\t var config = Config;\n\t if (config.personalConfig && config.personal && config.personal[SITENAME]) {\n\t return {\n\t top: config.personal[SITENAME].buttonPositionTop,\n\t left: config.personal[SITENAME].buttonPositionLeft\n\t };\n\t }\n\t return {\n\t top: config.buttonPositionTop,\n\t left: config.buttonPositionLeft\n\t };\n\t };\n\t return {\n\t Constants: Constants,\n\t MenuItemsNames: MenuItemsNames,\n\t getSettings: getSettings,\n\t loadSettings: loadSettings,\n\t getWotData: getWotData,\n\t setWotData: setWotData,\n\t saveSettings: saveSettings,\n\t getUserPositionForButton: getUserPositionForButton,\n\t getButtonSide: getButtonSide,\n\t setIconSize: setIconSize,\n\t setUserPositionForButton: setUserPositionForButton,\n\t setAdguardSettings: setAdguardSettings,\n\t setPersonalParam: setPersonalParam,\n\t setButtonSide: setButtonSide,\n\t getAdguardSettings: getAdguardSettings,\n\t getIconSize: getIconSize,\n\t getPersonalConfig: getPersonalConfig\n\t };\n\t}\n\tvar settings = new Settings();\n\t const src_settings = (settings);\n\tvar templates_button = __webpack_require__(6696);\n\tvar button_default = __webpack_require__.n(templates_button);\n\tvar mainMenu = __webpack_require__(3317);\n\tvar mainMenu_default = __webpack_require__.n(mainMenu);\n\tvar selectorMenu = __webpack_require__(8514);\n\tvar selectorMenu_default = __webpack_require__.n(selectorMenu);\n\tvar settingsMenu = __webpack_require__(4693);\n\tvar settingsMenu_default = __webpack_require__.n(settingsMenu);\n\tvar sliderMenu = __webpack_require__(7726);\n\tvar sliderMenu_default = __webpack_require__.n(sliderMenu);\n\tvar blockPreview = __webpack_require__(5688);\n\tvar blockPreview_default = __webpack_require__.n(blockPreview);\n\tvar mobilePopup = __webpack_require__(2115);\n\tvar mobilePopup_default = __webpack_require__.n(mobilePopup);\n\tvar mobileMenu = __webpack_require__(4825);\n\tvar mobileMenu_default = __webpack_require__.n(mobileMenu);\n\tvar base_common = __webpack_require__(1403);\n\tvar base_common_default = __webpack_require__.n(base_common);\n\tvar styles_button = __webpack_require__(5487);\n\tvar styles_button_default = __webpack_require__.n(styles_button);\n\tvar menu = __webpack_require__(3228);\n\tvar menu_default = __webpack_require__.n(menu);\n\tvar selector = __webpack_require__(5317);\n\tvar selector_default = __webpack_require__.n(selector);\n\tvar mobile_style = __webpack_require__(1953);\n\tvar mobile_style_default = __webpack_require__.n(mobile_style);\n\tvar CSS = {\n\t common: (base_common_default()),\n\t button: (styles_button_default()),\n\t iframe: (menu_default()),\n\t selector: (selector_default()),\n\t mobile: (mobile_style_default())\n\t};\n\tvar HTML = {\n\t button: (button_default()),\n\t detailed_menu: (mainMenu_default()),\n\t selector_menu: (selectorMenu_default()),\n\t settings_menu: (settingsMenu_default()),\n\t slider_menu: (sliderMenu_default()),\n\t preview: (blockPreview_default()),\n\t popup: (mobilePopup_default()),\n\t mobile_menu: (mobileMenu_default())\n\t};\n\tfunction CustomEvent() {\n\t var listeners = [];\n\t var attach = function attach(listener) {\n\t listeners.push(listener);\n\t };\n\t var notify = function notify(args) {\n\t for (var i = 0; i < listeners.length; i += 1) {\n\t listeners[i](args);\n\t }\n\t };\n\t return {\n\t attach: attach,\n\t notify: notify\n\t };\n\t}\n\tfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\tfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\tfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\tfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\tfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\tfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter); }\n\tfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\tfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\tvar getNodeName = function getNodeName(element) {\n\t return element && element.nodeName ? element.nodeName.toUpperCase() : '';\n\t};\n\tvar getParentsLevel = function getParentsLevel(element) {\n\t var parent = element;\n\t var parentArr = [];\n\t while ((parent = parent.parentNode) && getNodeName(parent) !== 'BODY') {\n\t parentArr.push(parent);\n\t }\n\t return parentArr;\n\t};\n\tvar getSingleChildren = function getSingleChildren(element) {\n\t var children = element.childNodes;\n\t if (children) {\n\t var count = 0;\n\t var child;\n\t for (var i = 0; i < children.length; i += 1) {\n\t if (children[i].nodeType === 1) {\n\t child = children[i];\n\t count += 1;\n\t }\n\t }\n\t return count === 1 ? child : null;\n\t }\n\t};\n\tvar getAllChildren = function getAllChildren(element) {\n\t var childArray = [];\n\t var child = element;\n\t while (child = getSingleChildren(child)) {\n\t childArray.push(child);\n\t }\n\t return childArray;\n\t};\n\tvar toArray = function toArray(elems) {\n\t return elems && elems.length !== undefined ? Array.prototype.slice.call(elems) : [elems];\n\t};\n\tvar addClass = function addClass(elem, className) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t var classList = item.classList;\n\t classList.add.apply(classList, _toConsumableArray(className.split(/\\s/)));\n\t });\n\t};\n\tvar removeClass = function removeClass(elem, className) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t var classList = item.classList;\n\t classList.remove.apply(classList, _toConsumableArray(className.split(/\\s/)));\n\t });\n\t};\n\tvar hasClass = function hasClass(elem, className) {\n\t var elems = toArray(elem);\n\t var _elems = _slicedToArray(elems, 1),\n\t target = _elems[0];\n\t return !!(target.classList && target.classList.contains(className));\n\t};\n\tvar show = function show(elem) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t item.style.display = 'block';\n\t });\n\t};\n\tvar hide = function hide(elem) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t item.style.display = 'none';\n\t });\n\t};\n\tvar addStyle = function addStyle(elem, attr, value) {\n\t var elems = toArray(elem);\n\t elems.forEach(function (item) {\n\t item.style[attr] = value;\n\t });\n\t};\n\tvar _require = __webpack_require__(14),\n\t LOCALES_EQUIVALENTS_MAP = _require.LOCALES_EQUIVALENTS_MAP,\n\t LANGUAGES = _require.LANGUAGES;\n\tvar locales = Object.keys(LANGUAGES).reduce(function (acc, language) {\n\t var resultLocale = LOCALES_EQUIVALENTS_MAP[language] || language;\n\t var dictionary = __webpack_require__(1503)(\"./\".concat(resultLocale, \"/messages.json\"));\n\t acc[resultLocale] = dictionary;\n\t return acc;\n\t}, {});\n\t const locales_0 = (locales);\n\tfunction localization_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { localization_typeof = function _typeof(obj) { return typeof obj; }; } else { localization_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return localization_typeof(obj); }\n\tfunction localization_slicedToArray(arr, i) { return localization_arrayWithHoles(arr) || localization_iterableToArrayLimit(arr, i) || localization_unsupportedIterableToArray(arr, i) || localization_nonIterableRest(); }\n\tfunction localization_nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\tfunction localization_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return localization_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return localization_arrayLikeToArray(o, minLen); }\n\tfunction localization_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\tfunction localization_iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\tfunction localization_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\tvar localization_require = __webpack_require__(897),\n\t _require2 = localization_slicedToArray(localization_require, 1),\n\t BASE_LOCALE = _require2[0].base_locale;\n\tfunction Localization() {\n\t var currentLocale = null;\n\t var locale;\n\t var supportedLocales = Object.keys(locales_0).reduce(function (acc, key) {\n\t var lowerCasedKey = key.toLowerCase();\n\t acc[lowerCasedKey] = locales_0[key];\n\t return acc;\n\t }, {});\n\t if (typeof AdguardSettings !== 'undefined') {\n\t locale = AdguardSettings.locale;\n\t } else if (typeof navigator.languages !== 'undefined') {\n\t locale = navigator.languages[0];\n\t } else if (navigator.language) {\n\t locale = navigator.language;\n\t } else if (navigator.browserLanguage) {\n\t locale = navigator.browserLanguage;\n\t } else {\n\t locale = BASE_LOCALE;\n\t }\n\t if (supportedLocales[locale]) {\n\t currentLocale = locale;\n\t } else if (supportedLocales[locale.toLowerCase()]) {\n\t currentLocale = locale.toLowerCase();\n\t } else {\n\t var langSplit = locale.split('-')[0];\n\t if (supportedLocales[langSplit]) {\n\t currentLocale = langSplit;\n\t } else {\n\t currentLocale = BASE_LOCALE;\n\t }\n\t }\n\t var getMessage = function getMessage(messageId) {\n\t var message = supportedLocales[currentLocale][messageId];\n\t if (!message) {\n\t return localization_typeof(supportedLocales[BASE_LOCALE][messageId]) === 'object' ? supportedLocales[BASE_LOCALE][messageId].message : supportedLocales[BASE_LOCALE][messageId] || '';\n\t }\n\t return supportedLocales[currentLocale][messageId].message || supportedLocales[currentLocale][messageId];\n\t };\n\t var createElement = function createElement(tagName, attributes) {\n\t var el = src_protectedApi.createElement(tagName);\n\t if (!attributes) {\n\t return el;\n\t }\n\t var attrs = attributes.split(/([a-z]+='[^']+')/);\n\t for (var i = 0; i < attrs.length; i += 1) {\n\t var attr = attrs[i].trim();\n\t if (!attr) {\n\t continue;\n\t }\n\t var index = attr.indexOf('=');\n\t var attrName = void 0;\n\t var attrValue = void 0;\n\t if (index > 0) {\n\t attrName = attr.substring(0, index);\n\t attrValue = attr.substring(index + 2, attr.length - 1);\n\t }\n\t if (attrName && attrValue) {\n\t el.setAttribute(attrName, attrValue);\n\t }\n\t }\n\t return el;\n\t };\n\t var processString = function processString(str, element) {\n\t var el;\n\t var match1 = /^([^]*?)<(a|strong|span|i)([^>]*)>(.*?)<\\/\\2>([^]*)$/m.exec(str);\n\t var match2 = /^([^]*?)<(br|input)([^>]*)\\/?>([^]*)$/m.exec(str);\n\t if (match1) {\n\t processString(match1[1], element);\n\t el = createElement(match1[2], match1[3]);\n\t processString(match1[4], el);\n\t element.appendChild(el);\n\t processString(match1[5], element);\n\t } else if (match2) {\n\t processString(match2[1], element);\n\t el = createElement(match2[2], match2[3]);\n\t element.appendChild(el);\n\t processString(match2[4], element);\n\t } else {\n\t element.appendChild(document.createTextNode(str.replace(/ /g, \"\\xA0\")));\n\t }\n\t };\n\t var translateElement = function translateElement(element, message) {\n\t try {\n\t while (element.lastChild) {\n\t element.removeChild(element.lastChild);\n\t }\n\t processString(message, element);\n\t } catch (ex) {\n\t }\n\t };\n\t return {\n\t getMessage: getMessage,\n\t translateElement: translateElement\n\t };\n\t}\n\tvar localization = new Localization();\n\t const src_localization = (localization);\n\tfunction DetailedMenuController(iframe) {\n\t var contentDocument = null;\n\t var iframeCtrl = iframe;\n\t var domain = null;\n\t var FILTERING_STATE_LS_PROPERTY = '__adfstate';\n\t var CONFIDENCE_LEVEL = {\n\t ZERO: {\n\t from: 0,\n\t to: 5\n\t },\n\t ONE: {\n\t from: 6,\n\t to: 11\n\t },\n\t TWO: {\n\t from: 12,\n\t to: 22\n\t },\n\t THREE: {\n\t from: 23,\n\t to: 33\n\t },\n\t FOUR: {\n\t from: 34,\n\t to: 44\n\t },\n\t FIVE: {\n\t from: 45,\n\t to: Infinity\n\t }\n\t };\n\t var setDomain = function setDomain() {\n\t domain = decodeURIComponent(window.location.hostname);\n\t contentDocument.getElementsByClassName('menu-head_name')[0].textContent = domain || 'unknown';\n\t };\n\t var truncateDecimals = function truncateDecimals(number) {\n\t return Math[number < 0 ? 'ceil' : 'floor'](number);\n\t };\n\t var getWotReputationSettings = function getWotReputationSettings(wotData) {\n\t if (!wotData) {\n\t return null;\n\t }\n\t var prefix = 'adg-wot-';\n\t var averageWot = wotData.reputation;\n\t var wotRatingText = null;\n\t var wotRating = null;\n\t if (averageWot === 0) {\n\t wotRatingText = src_localization.getMessage('wot_unknown_description');\n\t wotRating = \"\".concat(prefix, \"unknown\");\n\t return {\n\t text: wotRatingText,\n\t \"class\": wotRating\n\t };\n\t }\n\t var wotSettings = {\n\t 0: {\n\t color: 'red',\n\t string: src_localization.getMessage('wot_bad_description')\n\t },\n\t 1: {\n\t color: 'lightRed',\n\t string: src_localization.getMessage('wot_poor_description')\n\t },\n\t 2: {\n\t color: 'yellow',\n\t string: src_localization.getMessage('wot_unsatisfactory_description')\n\t },\n\t 3: {\n\t color: 'lightGreen',\n\t string: src_localization.getMessage('wot_good_description')\n\t },\n\t 4: {\n\t color: 'green',\n\t string: src_localization.getMessage('wot_excellent_description')\n\t },\n\t 5: {\n\t color: 'green',\n\t string: src_localization.getMessage('wot_excellent_description')\n\t }\n\t };\n\t var current = wotSettings[truncateDecimals(averageWot / 20)];\n\t wotRatingText = current.string;\n\t wotRating = prefix + current.color;\n\t return {\n\t text: wotRatingText,\n\t \"class\": wotRating\n\t };\n\t };\n\t var getWotConfidenceClass = function getWotConfidenceClass(wotData) {\n\t if (!wotData) {\n\t return null;\n\t }\n\t var prefix = 'adg-wot-confidence-';\n\t var isThisLevel = function isThisLevel(num, level) {\n\t return num >= level.from && num <= level.to;\n\t };\n\t var confidenceWot = wotData.confidence;\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.ZERO)) {\n\t return \"\".concat(prefix, \"0\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.ONE)) {\n\t return \"\".concat(prefix, \"1\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.TWO)) {\n\t return \"\".concat(prefix, \"2\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.THREE)) {\n\t return \"\".concat(prefix, \"3\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.FOUR)) {\n\t return \"\".concat(prefix, \"4\");\n\t }\n\t if (isThisLevel(confidenceWot, CONFIDENCE_LEVEL.FIVE)) {\n\t return \"\".concat(prefix, \"5\");\n\t }\n\t return undefined;\n\t };\n\t var setWotData = function setWotData() {\n\t var wotData = src_wot.getWotData();\n\t var wotReputationSettings = getWotReputationSettings(wotData);\n\t if (!wotReputationSettings) {\n\t return;\n\t }\n\t var wotIndication = contentDocument.querySelector('#WotIndication');\n\t addClass(wotIndication, wotReputationSettings[\"class\"]);\n\t wotIndication.dataset.title = src_localization.getMessage('menu_wot_reputation_indicator');\n\t var wotDescriptionText = contentDocument.querySelector('#WotDescriptionText');\n\t var wotLogo = '';\n\t wotDescriptionText.innerHTML = wotReputationSettings.text.replace('$1', wotLogo);\n\t var confidenceIndication = contentDocument.querySelector('#ConfidenceIndication');\n\t var wotConfidenceClass = getWotConfidenceClass(wotData);\n\t addClass(confidenceIndication, wotConfidenceClass);\n\t wotIndication.dataset.title = src_localization.getMessage('menu_wot_reputation_confidence_level');\n\t var wotLinkElem = contentDocument.querySelector('.wot-indicator');\n\t wotLinkElem.href = src_wot.getWotScorecardUrl(domain);\n\t removeClass(contentDocument.querySelectorAll('.wot-hide'), 'wot-hide');\n\t };\n\t var startAdSelector = function startAdSelector() {\n\t iframeCtrl.showSelectorMenu();\n\t };\n\t var goToWotUrl = function goToWotUrl() {\n\t window.open(src_wot.WOT_URL, '_blank');\n\t };\n\t var doNotBlock = function doNotBlock() {\n\t gm.ADG_temporaryDontBlock(30, function () {\n\t reloadPageBypassCache();\n\t });\n\t };\n\t var reportAbuse = function reportAbuse() {\n\t gm.ADG_sendAbuse(function () {\n\t iframeCtrl.removeIframe();\n\t });\n\t };\n\t var goToSiteReport = function goToSiteReport() {\n\t var url = src_settings.Constants.REPORT_URL.replace('{0}', domain);\n\t window.open(url, '_blank');\n\t };\n\t var showHideBlockAdButton = function showHideBlockAdButton(isFilter) {\n\t var blockAd = contentDocument.querySelector('#block-ad');\n\t if (isFilter) {\n\t removeClass(blockAd, 'hidden');\n\t } else {\n\t addClass(blockAd, 'hidden');\n\t }\n\t iframeCtrl.resizeIframe();\n\t };\n\t var setFilteringStateToStore = function setFilteringStateToStore(state) {\n\t try {\n\t localStorage.setItem(FILTERING_STATE_LS_PROPERTY, src_protectedApi.json.stringify({\n\t state: state\n\t }));\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return null;\n\t }\n\t };\n\t var onIsFilterChange = function onIsFilterChange() {\n\t var isFilter = contentDocument.getElementById('is-filter').checked;\n\t addClass(contentDocument.querySelectorAll('.menu-filter_label'), 'animate');\n\t showHideBlockAdButton(isFilter);\n\t setFilteringStateToStore(isFilter);\n\t gm.ADG_changeFilteringState(isFilter, function () {\n\t reloadPageBypassCache();\n\t });\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': iframeCtrl.removeIframe,\n\t '#block-ad': startAdSelector,\n\t '#assistant-settings': iframeCtrl.showSettingsMenu,\n\t '#WotLogo': goToWotUrl,\n\t '#do-not-block-30-sec': doNotBlock,\n\t '#report-abuse': reportAbuse,\n\t '#site-report': goToSiteReport,\n\t '#is-filter': onIsFilterChange\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var getFilteringStateFromStore = function getFilteringStateFromStore() {\n\t try {\n\t var state = localStorage.getItem(FILTERING_STATE_LS_PROPERTY);\n\t if (state) {\n\t return src_protectedApi.json.parse(state).state;\n\t }\n\t return false;\n\t } catch (ex) {\n\t src_log.error(ex);\n\t return false;\n\t }\n\t };\n\t var setInitFilteringState = function setInitFilteringState() {\n\t var input = contentDocument.getElementById('is-filter');\n\t input.checked = getFilteringStateFromStore();\n\t gm.ADG_isFiltered(function (isFiltered) {\n\t input.checked = isFiltered;\n\t setFilteringStateToStore(isFiltered);\n\t showHideBlockAdButton(isFiltered);\n\t });\n\t };\n\t var init = function init(iframe) {\n\t contentDocument = iframe.contentDocument;\n\t setDomain();\n\t setWotData();\n\t bindEvents();\n\t setInitFilteringState();\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction adguard_selector_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { adguard_selector_typeof = function _typeof(obj) { return typeof obj; }; } else { adguard_selector_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return adguard_selector_typeof(obj); }\n\tfunction AdguardSelector() {\n\t var api = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var PLACEHOLDER_PREFIX = 'adguard-placeholder';\n\t var placeholdedElements = null;\n\t var transparentPlaceholdedElement = null;\n\t var restrictedElements = null;\n\t var SELECTED_CLASS = 'adguard_sg_selected';\n\t var REJECTED_CLASS = 'adguard_sg_rejected';\n\t var IGNORED_CLASS = 'adguard_sg_ignore';\n\t var unbound = true;\n\t var onElementSelectedHandler = null;\n\t var ignoreTouchEvent = 0;\n\t var selectionRenderer;\n\t var removeClassName = function removeClassName(className) {\n\t var elem = document.querySelectorAll(\".\".concat(className));\n\t removeClass(elem, className);\n\t };\n\t var firstSelectedOrSuggestedParent = function firstSelectedOrSuggestedParent(element) {\n\t if (hasClass(element, SELECTED_CLASS)) {\n\t return element;\n\t }\n\t while (element.parentNode && (element = element.parentNode)) {\n\t if (restrictedElements.indexOf(element) === -1) {\n\t if (hasClass(element, SELECTED_CLASS)) {\n\t return element;\n\t }\n\t }\n\t }\n\t return null;\n\t };\n\t var px = function px(p) {\n\t return \"\".concat(p, \"px\");\n\t };\n\t var getTagPath = function getTagPath(element) {\n\t if (element.parentNode) {\n\t return \"\".concat(element.parentNode.tagName.toLowerCase(), \" \").concat(element.tagName.toLowerCase());\n\t }\n\t return element.tagName.toLowerCase();\n\t };\n\t var sgMouseoverHandler = function sgMouseoverHandler(e) {\n\t e.stopPropagation();\n\t if (unbound) {\n\t return true;\n\t }\n\t if (this === document.documentElement || this === document.documentElement.parentNode) {\n\t return false;\n\t }\n\t var parent = firstSelectedOrSuggestedParent(this);\n\t if (parent !== null && parent !== this) {\n\t selectionRenderer.add(parent);\n\t } else {\n\t selectionRenderer.add(this);\n\t }\n\t return false;\n\t };\n\t var sgMousedownHandler = function sgMousedownHandler(e) {\n\t if (e && e.isTrusted === false) {\n\t return false;\n\t }\n\t if (hasClass(e.target, IGNORED_CLASS)) {\n\t return false;\n\t }\n\t e.preventDefault();\n\t e.stopImmediatePropagation();\n\t if (unbound) {\n\t return true;\n\t }\n\t var elem = e.target;\n\t var borders = elem === selectionRenderer.borderTop || elem === selectionRenderer.borderLeft || elem === selectionRenderer.borderRight || elem === selectionRenderer.borderBottom;\n\t if (borders) {\n\t elem = elem.target_elem || elem;\n\t }\n\t if (elem === document.documentElement || elem === document.documentElement.parentNode) {\n\t return undefined;\n\t }\n\t selectionRenderer.remove();\n\t onElementSelectedHandler(elem);\n\t return false;\n\t };\n\t var touchElementSelectHandler = function touchElementSelectHandler(e) {\n\t e.preventDefault();\n\t e.stopImmediatePropagation();\n\t sgMouseoverHandler.call(this, e);\n\t sgMousedownHandler.call(this, e);\n\t };\n\t var removeElementToPreventEvents = function removeElementToPreventEvents() {\n\t if (!transparentPlaceholdedElement) {\n\t return false;\n\t }\n\t transparentPlaceholdedElement.removeEventListener('click', touchElementSelectHandler);\n\t transparentPlaceholdedElement.removeEventListener('touchstart', touchElementSelectHandler);\n\t transparentPlaceholdedElement.removeEventListener('pointerdown', touchElementSelectHandler);\n\t transparentPlaceholdedElement.parentNode.removeChild(transparentPlaceholdedElement);\n\t transparentPlaceholdedElement = null;\n\t return undefined;\n\t };\n\t var clearSelected = function clearSelected() {\n\t removeElementToPreventEvents();\n\t removeClassName(SELECTED_CLASS);\n\t removeClassName(REJECTED_CLASS);\n\t selectionRenderer.remove();\n\t };\n\t var getOffsetExtended = function getOffsetExtended(elem) {\n\t var bodyRect = document.documentElement.getBoundingClientRect();\n\t var elemRect = elem.getBoundingClientRect();\n\t var rectTop = elemRect.top - bodyRect.top;\n\t var rectLeft = elemRect.left - bodyRect.left;\n\t return {\n\t top: rectTop,\n\t left: rectLeft,\n\t outerWidth: elem.offsetWidth,\n\t outerHeight: elem.offsetHeight\n\t };\n\t };\n\t var BorderSelectionRenderer = function (api) {\n\t var BORDER_WIDTH = 5;\n\t var BORDER_PADDING = 2;\n\t var BORDER_CSS = {\n\t position: 'absolute',\n\t background: 'white',\n\t margin: '0px',\n\t padding: '0px',\n\t display: 'block',\n\t \"float\": 'none',\n\t border: '0',\n\t outline: '0',\n\t 'background-color': '#13a35e',\n\t 'font-style': 'normal',\n\t 'vertical-align': 'baseline',\n\t 'text-align': 'left',\n\t 'line-height': '12px',\n\t 'box-sizing': 'content-box',\n\t 'min-height': 'auto',\n\t 'max-height': 'auto',\n\t 'min-width': 'auto',\n\t 'max-width': 'auto',\n\t width: 0,\n\t height: 0,\n\t 'z-index': 2147483646,\n\t 'border-radius': 0\n\t };\n\t var BORDER_BOTTOM_CSS = {\n\t 'font-size': '10px',\n\t 'font-weight': 'bold',\n\t color: 'white',\n\t padding: '2px 0px 2px 5px',\n\t overflow: 'hidden'\n\t };\n\t var borderTop = null;\n\t var borderLeft = null;\n\t var borderRight = null;\n\t var borderBottom = null;\n\t var showBorders = function showBorders() {\n\t if (borderTop && borderBottom && borderLeft && borderRight) {\n\t show(borderTop);\n\t show(borderBottom);\n\t show(borderLeft);\n\t show(borderRight);\n\t }\n\t };\n\t var addBorderToDom = function addBorderToDom() {\n\t document.documentElement.appendChild(borderTop);\n\t document.documentElement.appendChild(borderBottom);\n\t document.documentElement.appendChild(borderLeft);\n\t document.documentElement.appendChild(borderRight);\n\t };\n\t var addBorderCSS = function addBorderCSS() {\n\t Object.keys(BORDER_CSS).forEach(function (item) {\n\t borderTop.style[item] = BORDER_CSS[item];\n\t borderBottom.style[item] = BORDER_CSS[item];\n\t borderLeft.style[item] = BORDER_CSS[item];\n\t borderRight.style[item] = BORDER_CSS[item];\n\t });\n\t Object.keys(BORDER_BOTTOM_CSS).forEach(function (item) {\n\t borderBottom.style[item] = BORDER_BOTTOM_CSS[item];\n\t });\n\t };\n\t var removeBorderFromDom = function removeBorderFromDom() {\n\t if (borderTop) {\n\t var parent = borderTop.parentNode;\n\t if (parent) {\n\t parent.removeChild(borderTop);\n\t parent.removeChild(borderBottom);\n\t parent.removeChild(borderLeft);\n\t parent.removeChild(borderRight);\n\t }\n\t }\n\t borderTop = null;\n\t borderBottom = null;\n\t borderRight = null;\n\t borderLeft = null;\n\t };\n\t api.init = function () {\n\t if (!borderTop) {\n\t var width = px(BORDER_WIDTH);\n\t var bottomHeight = px(BORDER_WIDTH + 6);\n\t borderTop = src_protectedApi.createElement('div');\n\t borderBottom = src_protectedApi.createElement('div');\n\t borderLeft = src_protectedApi.createElement('div');\n\t borderRight = src_protectedApi.createElement('div');\n\t borderTop.addEventListener('click', sgMousedownHandler);\n\t borderBottom.addEventListener('click', sgMousedownHandler);\n\t borderLeft.addEventListener('click', sgMousedownHandler);\n\t borderRight.addEventListener('click', sgMousedownHandler);\n\t addStyle(borderTop, 'height', width);\n\t addStyle(borderBottom, 'height', bottomHeight);\n\t addStyle(borderLeft, 'width', width);\n\t addStyle(borderRight, 'width', width);\n\t hide(borderTop);\n\t hide(borderBottom);\n\t hide(borderLeft);\n\t hide(borderRight);\n\t api.borderTop = borderTop;\n\t api.borderBottom = borderBottom;\n\t api.borderLeft = borderLeft;\n\t api.borderRight = borderRight;\n\t addBorderCSS();\n\t addBorderToDom();\n\t }\n\t };\n\t api.finalize = function () {\n\t removeBorderFromDom();\n\t };\n\t api.add = function (element) {\n\t api.remove();\n\t if (!element) {\n\t return;\n\t }\n\t var p = getOffsetExtended(element);\n\t var top = p.top;\n\t var left = p.left;\n\t var width = p.outerWidth;\n\t var height = p.outerHeight;\n\t addStyle(borderTop, 'width', px(width + BORDER_PADDING * 2 + BORDER_WIDTH * 2));\n\t addStyle(borderTop, 'height', px(5));\n\t addStyle(borderTop, 'top', px(top - BORDER_WIDTH - BORDER_PADDING));\n\t addStyle(borderTop, 'left', px(left - BORDER_PADDING - BORDER_WIDTH));\n\t addStyle(borderBottom, 'width', px(width + BORDER_PADDING * 2 + BORDER_WIDTH));\n\t addStyle(borderBottom, 'height', px(12));\n\t addStyle(borderBottom, 'top', px(top + height + BORDER_PADDING));\n\t addStyle(borderBottom, 'left', px(left - BORDER_PADDING - BORDER_WIDTH));\n\t addStyle(borderLeft, 'height', px(height + BORDER_PADDING * 2));\n\t addStyle(borderLeft, 'width', px(5));\n\t addStyle(borderLeft, 'top', px(top - BORDER_PADDING));\n\t addStyle(borderLeft, 'left', px(left - BORDER_PADDING - BORDER_WIDTH));\n\t addStyle(borderRight, 'height', px(height + BORDER_PADDING * 2));\n\t addStyle(borderRight, 'width', px(5));\n\t addStyle(borderRight, 'top', px(top - BORDER_PADDING));\n\t addStyle(borderRight, 'left', px(left + width + BORDER_PADDING));\n\t borderBottom.textContent = getTagPath(element);\n\t borderRight.target_elem = element;\n\t borderLeft.target_elem = element;\n\t borderTop.target_elem = element;\n\t borderBottom.target_elem = element;\n\t showBorders();\n\t };\n\t api.remove = function () {\n\t if (borderTop && borderBottom && borderLeft && borderRight) {\n\t hide(borderTop);\n\t hide(borderBottom);\n\t hide(borderLeft);\n\t hide(borderRight);\n\t }\n\t };\n\t return api;\n\t }(BorderSelectionRenderer || {});\n\t var linkHelper = src_protectedApi.createElement('a');\n\t var getHost = function getHost(url) {\n\t if (!url) {\n\t return '';\n\t }\n\t linkHelper.href = url;\n\t return linkHelper.hostname;\n\t };\n\t var makePlaceholderImage = function makePlaceholderImage(element) {\n\t var placeHolder = src_protectedApi.createElement('div');\n\t var style = window.getComputedStyle(element);\n\t placeHolder.style.height = style.height;\n\t placeHolder.style.width = style.width;\n\t placeHolder.style.position = style.position;\n\t placeHolder.style.top = style.top;\n\t placeHolder.style.bottom = style.bottom;\n\t placeHolder.style.left = style.left;\n\t placeHolder.style.right = style.right;\n\t placeHolder.className += \"\".concat(PLACEHOLDER_PREFIX, \" \").concat(IGNORED_CLASS);\n\t var icon = src_protectedApi.createElement('div');\n\t icon.className += \"\".concat(PLACEHOLDER_PREFIX, \"-icon \").concat(IGNORED_CLASS);\n\t var domain = src_protectedApi.createElement('div');\n\t domain.textContent = getHost(element.src);\n\t domain.className += \"\".concat(PLACEHOLDER_PREFIX, \"-domain \").concat(IGNORED_CLASS);\n\t icon.appendChild(domain);\n\t placeHolder.appendChild(icon);\n\t return placeHolder;\n\t };\n\t var removePlaceholders = function removePlaceholders() {\n\t removeElementToPreventEvents();\n\t if (!placeholdedElements) {\n\t return;\n\t }\n\t var elements = placeholdedElements;\n\t for (var i = 0; i < elements.length; i += 1) {\n\t var current = elements[i];\n\t var id = PLACEHOLDER_PREFIX + i;\n\t var placeHolder = document.querySelector(\"#\".concat(id));\n\t if (placeHolder) {\n\t var parent = placeHolder.parentNode;\n\t if (parent) {\n\t parent.replaceChild(current, placeHolder);\n\t }\n\t }\n\t }\n\t placeholdedElements = null;\n\t };\n\t var placeholderClick = function placeholderClick(element) {\n\t selectionRenderer.remove();\n\t removePlaceholders();\n\t onElementSelectedHandler(element);\n\t };\n\t var preventEvents = function preventEvents(element) {\n\t var placeHolder = src_protectedApi.createElement('div');\n\t var style = getOffsetExtended(element);\n\t placeHolder.style.height = px(style.outerHeight);\n\t placeHolder.style.width = px(style.outerWidth);\n\t placeHolder.style.top = px(style.top);\n\t placeHolder.style.left = px(style.left);\n\t placeHolder.style.background = 'transparent';\n\t placeHolder.style.position = 'absolute';\n\t placeHolder.style['pointer-events'] = 'all';\n\t placeHolder.style['box-sizing'] = 'content-box';\n\t placeHolder.style['z-index'] = '2147483646';\n\t placeHolder.className += IGNORED_CLASS;\n\t transparentPlaceholdedElement = placeHolder;\n\t placeHolder.addEventListener('click', touchElementSelectHandler);\n\t placeHolder.addEventListener('touchstart', touchElementSelectHandler);\n\t placeHolder.addEventListener('pointerdown', touchElementSelectHandler);\n\t document.documentElement.appendChild(placeHolder);\n\t };\n\t var gestureEndHandler = function gestureEndHandler() {\n\t ignoreTouchEvent = 2;\n\t return true;\n\t };\n\t var touchMoveHandler = function touchMoveHandler() {\n\t ignoreTouchEvent = 1;\n\t return true;\n\t };\n\t var needIgnoreTouchEvent = function needIgnoreTouchEvent() {\n\t if (ignoreTouchEvent > 0) {\n\t ignoreTouchEvent -= 1;\n\t return true;\n\t }\n\t return false;\n\t };\n\t var makeIFrameAndEmbeddedSelector = function makeIFrameAndEmbeddedSelector() {\n\t placeholdedElements = document.querySelectorAll(\"iframe:not(.\".concat(IGNORED_CLASS, \"),embed,object\"));\n\t toArray(placeholdedElements).filter(function (elem) {\n\t var isVisible = elem.style.display !== 'none';\n\t var isHaveSize = elem.offsetWidth !== 0 && elem.offsetHeight !== 0;\n\t return isVisible && isHaveSize;\n\t });\n\t var elements = placeholdedElements;\n\t var _loop = function _loop(i) {\n\t var current = elements[i];\n\t (function (current) {\n\t var placeHolder = makePlaceholderImage(current);\n\t var id = PLACEHOLDER_PREFIX + i;\n\t placeHolder.setAttribute('id', id);\n\t var parent = current.parentNode;\n\t if (parent) {\n\t parent.replaceChild(placeHolder, current);\n\t placeHolder.addEventListener('gestureend', gestureEndHandler);\n\t placeHolder.addEventListener('touchmove', touchMoveHandler);\n\t placeHolder.addEventListener('touchend', function (e) {\n\t e.preventDefault();\n\t if (needIgnoreTouchEvent()) {\n\t return true;\n\t }\n\t placeholderClick(current);\n\t });\n\t var elems = document.querySelectorAll(\"#\".concat(id));\n\t toArray(elems).forEach(function (elem) {\n\t elem.addEventListener('click', function (e) {\n\t e.preventDefault();\n\t placeholderClick(current);\n\t });\n\t });\n\t }\n\t })(current);\n\t };\n\t for (var i = 0; i < elements.length; i += 1) {\n\t _loop(i);\n\t }\n\t };\n\t var sgMouseoutHandler = function sgMouseoutHandler() {\n\t if (unbound) {\n\t return true;\n\t }\n\t if (this === document.documentElement || this === document.documentElement.parentNode) {\n\t return false;\n\t }\n\t selectionRenderer.remove();\n\t return false;\n\t };\n\t var elementTouchendHandler = function elementTouchendHandler(e) {\n\t if (hasClass(e.target, IGNORED_CLASS)) {\n\t return false;\n\t }\n\t e.stopPropagation();\n\t if (needIgnoreTouchEvent()) {\n\t return true;\n\t }\n\t touchElementSelectHandler.call(this, e);\n\t return false;\n\t };\n\t var emptyEventHandler = function emptyEventHandler(e) {\n\t e.stopPropagation();\n\t return false;\n\t };\n\t var setupEventHandlers = function setupEventHandlers() {\n\t makeIFrameAndEmbeddedSelector();\n\t var elements = document.querySelectorAll(\"body *:not(.\".concat(IGNORED_CLASS, \")\"));\n\t toArray(elements).forEach(function (el) {\n\t el.addEventListener('gestureend', gestureEndHandler);\n\t el.addEventListener('touchmove', touchMoveHandler);\n\t el.addEventListener('touchend', elementTouchendHandler, true);\n\t el.addEventListener('touchstart', emptyEventHandler);\n\t el.addEventListener('mouseover', sgMouseoverHandler);\n\t el.addEventListener('mouseout', sgMouseoutHandler);\n\t el.addEventListener('click', sgMousedownHandler, true);\n\t });\n\t };\n\t var deleteEventHandlers = function deleteEventHandlers() {\n\t removePlaceholders();\n\t var elements = document.querySelectorAll('body *');\n\t toArray(elements).forEach(function (el) {\n\t el.removeEventListener('gestureend', gestureEndHandler);\n\t el.removeEventListener('touchmove', touchMoveHandler);\n\t el.removeEventListener('touchend', elementTouchendHandler, true);\n\t el.removeEventListener('touchstart', emptyEventHandler);\n\t el.removeEventListener('mouseover', sgMouseoverHandler);\n\t el.removeEventListener('mouseout', sgMouseoutHandler);\n\t el.removeEventListener('click', sgMousedownHandler, true);\n\t });\n\t };\n\t selectionRenderer = BorderSelectionRenderer;\n\t api.init = function (onElementSelected, selectionRenderImpl) {\n\t onElementSelectedHandler = onElementSelected;\n\t if (selectionRenderImpl && adguard_selector_typeof(selectionRenderImpl) === 'object') {\n\t selectionRenderer = selectionRenderImpl;\n\t }\n\t restrictedElements = ['html', 'body', 'head', 'base'].map(function (selector) {\n\t return document.querySelector(selector);\n\t });\n\t selectionRenderer.init();\n\t setupEventHandlers();\n\t unbound = false;\n\t };\n\t api.reset = function () {\n\t clearSelected();\n\t };\n\t api.close = function () {\n\t unbound = true;\n\t selectionRenderer.finalize();\n\t deleteEventHandlers();\n\t };\n\t api.selectElement = function (element) {\n\t selectionRenderer.add(element);\n\t removePlaceholders();\n\t unbound = true;\n\t preventEvents(element);\n\t };\n\t api.ignoreClassName = function () {\n\t return IGNORED_CLASS;\n\t };\n\t return api;\n\t}\n\tvar adguard_selector_selector = new AdguardSelector();\n\t const adguard_selector = (adguard_selector_selector);\n\tfunction SelectorMenuController(iframe) {\n\t var contentDocument = null;\n\t var iframeCtrl = iframe;\n\t var close = function close() {\n\t iframeCtrl.removeIframe();\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '.btn-default': close\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var onElementSelected = function onElementSelected(element) {\n\t iframeCtrl.showSliderMenu(element);\n\t };\n\t var startSelector = function startSelector() {\n\t adguard_selector.reset();\n\t adguard_selector.init(onElementSelected);\n\t };\n\t var init = function init(iframe) {\n\t contentDocument = iframe.contentDocument;\n\t bindEvents();\n\t startSelector();\n\t };\n\t iframeCtrl.onCloseMenu.attach(adguard_selector.close);\n\t return {\n\t init: init,\n\t startSelector: startSelector\n\t };\n\t}\n\tvar BASIC_GREEN_COLOR = '#36BA53';\n\tvar DARK_GREEN_COLOR = '#4D995F';\n\tvar TICK_RIGHT_COLOR = '#E0DFDB';\n\tfunction SliderWidget() {\n\t var api = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var PLACEHOLDER_CLASS = 'adg-slide ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all';\n\t var HANDLE_CLASS = 'ui-slider-handle';\n\t var HANDLE_FULL_CLASS = 'ui-slider-handle ui-state-default ui-corner-all';\n\t var TICK_CLASS = 'tick';\n\t var TICK_FULL_CLASS = 'tick ui-widget-content';\n\t var tickLeftColor = BASIC_GREEN_COLOR;\n\t var placeholder = null;\n\t var min = 0;\n\t var max = 1;\n\t var value = 0;\n\t var sliderArea = null;\n\t var onValueChanged = null;\n\t if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n\t tickLeftColor = DARK_GREEN_COLOR;\n\t }\n\t var refresh = function refresh() {\n\t var handle = placeholder.querySelectorAll(\".\".concat(HANDLE_CLASS));\n\t addStyle(handle, 'left', \"\".concat((value - 1) * 100 / (max - min), \"%\"));\n\t var ticks = placeholder.querySelectorAll(\".\".concat(TICK_CLASS));\n\t for (var i = 0; i < ticks.length; i += 1) {\n\t if (i + 1 < value) {\n\t addStyle(ticks[i], 'background-color', tickLeftColor);\n\t } else {\n\t addStyle(ticks[i], 'background-color', TICK_RIGHT_COLOR);\n\t }\n\t }\n\t };\n\t var render = function render() {\n\t addClass(placeholder, PLACEHOLDER_CLASS);\n\t var handle = src_protectedApi.createElement('span');\n\t handle.setAttribute('class', HANDLE_FULL_CLASS);\n\t placeholder.appendChild(handle);\n\t var count = max - min;\n\t var prepare = function prepare(i) {\n\t var tick = src_protectedApi.createElement('div');\n\t tick.setAttribute('class', TICK_FULL_CLASS);\n\t tick.style.left = \"\".concat(100 / count * i, \"%\");\n\t tick.style.width = \"\".concat(100 / count, \"%\");\n\t placeholder.appendChild(tick);\n\t };\n\t for (var i = 0; i < count; i += 1) {\n\t prepare(i);\n\t }\n\t refresh();\n\t };\n\t var setValue = function setValue(v) {\n\t if (v < min) {\n\t value = min;\n\t } else if (v > max) {\n\t value = max;\n\t } else {\n\t value = v;\n\t }\n\t refresh();\n\t onValueChanged(value);\n\t };\n\t var bindEvents = function bindEvents() {\n\t var rect = placeholder.getBoundingClientRect();\n\t var sliderWidth = rect.width;\n\t var offsetLeft = rect.left + document.body.scrollLeft;\n\t var getSliderValue = function getSliderValue(pageX) {\n\t return Math.round((max - min) / sliderWidth * (pageX - offsetLeft) + min);\n\t };\n\t var onMouseMove = function onMouseMove(e) {\n\t var val = getSliderValue(e.pageX);\n\t setValue(val);\n\t };\n\t var onClick = function onClick(e) {\n\t var val = getSliderValue(e.pageX);\n\t setValue(val);\n\t };\n\t var onMouseDown = function onMouseDown(e) {\n\t e.stopPropagation();\n\t e.preventDefault();\n\t e.cancelBubble = true;\n\t e.returnValue = false;\n\t sliderArea.addEventListener('mousemove', onMouseMove);\n\t sliderArea.addEventListener('touchmove', onMouseMove);\n\t sliderArea.addEventListener('pointermove', onMouseMove);\n\t };\n\t var sliderAreaRemoveListeners = function sliderAreaRemoveListeners() {\n\t sliderArea.removeEventListener('mousemove', onMouseMove);\n\t sliderArea.removeEventListener('touchmove', onMouseMove);\n\t sliderArea.removeEventListener('pointermove', onMouseMove);\n\t };\n\t document.addEventListener('mouseup', sliderAreaRemoveListeners);\n\t document.addEventListener('touchend', sliderAreaRemoveListeners);\n\t document.addEventListener('pointerup', sliderAreaRemoveListeners);\n\t placeholder.addEventListener('click', onClick);\n\t placeholder.addEventListener('mousedown', onMouseDown);\n\t placeholder.addEventListener('touchstart', onMouseDown);\n\t sliderArea.addEventListener('mouseup', sliderAreaRemoveListeners);\n\t sliderArea.addEventListener('touchend', sliderAreaRemoveListeners);\n\t sliderArea.addEventListener('pointerup', sliderAreaRemoveListeners);\n\t sliderArea.addEventListener('mouseleave', sliderAreaRemoveListeners);\n\t };\n\t api.init = function (placeholderElement, options) {\n\t placeholder = placeholderElement;\n\t min = options.min;\n\t max = options.max;\n\t value = options.value;\n\t onValueChanged = options.onValueChanged;\n\t sliderArea = options.sliderArea;\n\t render();\n\t bindEvents();\n\t };\n\t return api;\n\t}\n\tvar sliderWidget = new SliderWidget();\n\t const slider_widget = (sliderWidget);\n\tfunction cssEscape(value) {\n\t if (arguments.length === 0) {\n\t throw new TypeError('`CSS.escape` requires an argument.');\n\t }\n\t var string = String(value);\n\t var length = string.length;\n\t var index = -1;\n\t var codeUnit;\n\t var result = '';\n\t var firstCodeUnit = string.charCodeAt(0);\n\t while (++index < length) {\n\t codeUnit = string.charCodeAt(index);\n\t if (codeUnit === 0x0000) {\n\t result += \"\\uFFFD\";\n\t continue;\n\t }\n\t if (\n\t codeUnit >= 0x0001 && codeUnit <= 0x001F || codeUnit == 0x007F\n\t || index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039\n\t || index === 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039\n\t && firstCodeUnit == 0x002D) {\n\t result += \"\\\\\".concat(codeUnit.toString(16), \" \");\n\t continue;\n\t }\n\t if (\n\t index === 0 && length === 1\n\t && codeUnit == 0x002D) {\n\t result += \"\\\\\".concat(string.charAt(index));\n\t continue;\n\t }\n\t if (codeUnit >= 0x0080\n\t || codeUnit == 0x002D\n\t || codeUnit == 0x005F || codeUnit >= 0x0030 && codeUnit <= 0x0039 || codeUnit >= 0x0041 && codeUnit <= 0x005A || codeUnit >= 0x0061 && codeUnit <= 0x007A) {\n\t result += string.charAt(index);\n\t continue;\n\t }\n\t result += \"\\\\\".concat(string.charAt(index));\n\t }\n\t return result;\n\t}\n\tfunction AdguardRulesConstructorLib() {\n\t var api = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var CSS_RULE_MARK = '##';\n\t var RULE_OPTIONS_MARK = '$';\n\t var URLBLOCK_ATTRIBUTES = ['src', 'data'];\n\t var linkHelper = src_protectedApi.createElement('a');\n\t var constructClassCssSelectorByAND = function constructClassCssSelectorByAND(classList) {\n\t var selectors = [];\n\t if (classList) {\n\t for (var i = 0; i < classList.length; i += 1) {\n\t selectors.push(\".\".concat(cssEscape(classList[i])));\n\t }\n\t }\n\t return selectors.join('');\n\t };\n\t var makeDefaultCssFilter = function makeDefaultCssFilter(element, classList, excludeTagName, excludeId) {\n\t var cssSelector = excludeTagName ? '' : element.tagName.toLowerCase();\n\t if (element.id && !excludeId) {\n\t cssSelector += \"#\".concat(cssEscape(element.id));\n\t }\n\t cssSelector += constructClassCssSelectorByAND(classList || element.classList);\n\t return cssSelector;\n\t };\n\t var makeCssNthChildFilter = function makeCssNthChildFilter(element, options) {\n\t options = options || {};\n\t var _options = options,\n\t classList = _options.classList,\n\t excludeTagName = _options.excludeTagName,\n\t excludeId = _options.excludeId;\n\t var excludeTagNameOverride = ('excludeTagName' in options);\n\t var excludeIdOverride = ('excludeId' in options);\n\t var path = [];\n\t var el = element;\n\t while (el.parentNode) {\n\t var nodeName = el && el.nodeName ? el.nodeName.toUpperCase() : '';\n\t if (nodeName === 'BODY') {\n\t break;\n\t }\n\t if (el.id) {\n\t var cssSelector = '';\n\t if (el === element) {\n\t cssSelector = makeDefaultCssFilter(el, classList || [], excludeTagNameOverride ? excludeTagName : true, excludeIdOverride ? excludeId : false);\n\t } else {\n\t cssSelector = makeDefaultCssFilter(el, [], true, false);\n\t }\n\t path.unshift(cssSelector);\n\t break;\n\t } else {\n\t var c = 1;\n\t for (var e = el; e.previousSibling; e = e.previousSibling) {\n\t if (e.previousSibling.nodeType === 1) {\n\t c += 1;\n\t }\n\t }\n\t var cldCount = 0;\n\t for (var i = 0; el.parentNode && i < el.parentNode.childNodes.length; i += 1) {\n\t cldCount += el.parentNode.childNodes[i].nodeType === 1 ? 1 : 0;\n\t }\n\t var ch = void 0;\n\t if (cldCount === 0 || cldCount === 1) {\n\t ch = '';\n\t } else if (c === 1) {\n\t ch = ':first-child';\n\t } else if (c === cldCount) {\n\t ch = ':last-child';\n\t } else {\n\t ch = \":nth-child(\".concat(c, \")\");\n\t }\n\t if (el === element) {\n\t var p = makeDefaultCssFilter(el, classList, excludeId, excludeTagNameOverride ? excludeTagName : false);\n\t p += ch;\n\t path.unshift(p);\n\t } else {\n\t path.unshift(makeDefaultCssFilter(el, el.classList, false, false) + ch);\n\t }\n\t el = el.parentNode;\n\t }\n\t }\n\t return path.join(' > ');\n\t };\n\t var constructClassCssSelectorByOR = function constructClassCssSelectorByOR(classList) {\n\t var selectors = [];\n\t if (classList) {\n\t for (var i = 0; i < classList.length; i += 1) {\n\t selectors.push(\".\".concat(cssEscape(classList[i])));\n\t }\n\t }\n\t return selectors.join(', ');\n\t };\n\t var makeSimilarCssFilter = function makeSimilarCssFilter(element, classList) {\n\t return constructClassCssSelectorByOR(classList || element.classList);\n\t };\n\t var constructCssRuleText = function constructCssRuleText(element, options) {\n\t if (!element) {\n\t return;\n\t }\n\t options = options || {};\n\t var cssSelectorType = options.cssSelectorType || 'STRICT_FULL';\n\t var selector;\n\t switch (cssSelectorType) {\n\t case 'STRICT_FULL':\n\t selector = makeCssNthChildFilter(element, options);\n\t break;\n\t case 'STRICT':\n\t selector = makeDefaultCssFilter(element, options.classList, options.excludeTagName, options.excludeId);\n\t break;\n\t case 'SIMILAR':\n\t selector = makeSimilarCssFilter(element, options.classList);\n\t break;\n\t }\n\t return selector ? CSS_RULE_MARK + selector : '';\n\t };\n\t var constructUrlBlockRuleText = function constructUrlBlockRuleText(element, urlBlockAttribute, oneDomain, domain) {\n\t if (!urlBlockAttribute) {\n\t return null;\n\t }\n\t var blockUrlRuleText = urlBlockAttribute.replace(/^http:\\/\\/(www\\.)?/, '||');\n\t if (blockUrlRuleText.indexOf('.') === 0) {\n\t blockUrlRuleText = blockUrlRuleText.substring(1);\n\t }\n\t if (!oneDomain) {\n\t blockUrlRuleText = \"\".concat(blockUrlRuleText).concat(RULE_OPTIONS_MARK, \"domain=\").concat(domain);\n\t }\n\t return blockUrlRuleText;\n\t };\n\t var isValidUrl = function isValidUrl(value) {\n\t if (value) {\n\t linkHelper.href = value;\n\t if (linkHelper.hostname) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t };\n\t var getUrlBlockAttribute = function getUrlBlockAttribute(element) {\n\t if (!element || !element.getAttribute) {\n\t return null;\n\t }\n\t for (var i = 0; i < URLBLOCK_ATTRIBUTES.length; i += 1) {\n\t var attr = URLBLOCK_ATTRIBUTES[i];\n\t var value = element.getAttribute(attr);\n\t if (isValidUrl(value)) {\n\t return value;\n\t }\n\t }\n\t return null;\n\t };\n\t var haveUrlBlockParameter = function haveUrlBlockParameter(element) {\n\t var value = getUrlBlockAttribute(element);\n\t return value && value !== '';\n\t };\n\t var haveClassAttribute = function haveClassAttribute(element) {\n\t return element.classList && element.classList.length > 0;\n\t };\n\t var haveIdAttribute = function haveIdAttribute(element) {\n\t return element.id && element.id.trim() !== '';\n\t };\n\t var getUrl = function getUrl(url) {\n\t var pattern = '^(([^:/\\\\?#]+):)?(//(([^:/\\\\?#]*)(?::([^/\\\\?#]*))?))?([^\\\\?#]*)(\\\\?([^#]*))?(#(.*))?$';\n\t var rx = new RegExp(pattern);\n\t var parts = rx.exec(url);\n\t return {\n\t host: parts[4] || '',\n\t path: parts[7] || ''\n\t };\n\t };\n\t var cropDomain = function cropDomain(url) {\n\t var domain = getUrl(url).host;\n\t return domain.replace('www.', '').replace(/:\\d+/, '');\n\t };\n\t api.makeCssNthChildFilter = makeCssNthChildFilter;\n\t api.getElementInfo = function (element) {\n\t var attributes = [];\n\t var elementAttributes = element.attributes;\n\t if (elementAttributes) {\n\t for (var i = 0; i < elementAttributes.length; i += 1) {\n\t var attr = elementAttributes[i];\n\t attributes.push({\n\t name: attr.name,\n\t value: attr.value\n\t });\n\t }\n\t }\n\t return {\n\t tagName: element.tagName,\n\t attributes: attributes,\n\t urlBlockAttributeValue: getUrlBlockAttribute(element),\n\t haveUrlBlockParameter: haveUrlBlockParameter(element),\n\t haveClassAttribute: haveClassAttribute(element),\n\t haveIdAttribute: haveIdAttribute(element)\n\t };\n\t };\n\t api.constructRuleCssSelector = function (ruleText) {\n\t if (!ruleText) {\n\t return null;\n\t }\n\t var index = ruleText.indexOf(CSS_RULE_MARK);\n\t var optionsIndex = ruleText.indexOf(RULE_OPTIONS_MARK);\n\t if (index >= 0) {\n\t return ruleText.substring(index + CSS_RULE_MARK.length, optionsIndex >= 0 ? optionsIndex : ruleText.length);\n\t }\n\t var s = ruleText.substring(0, optionsIndex);\n\t s = s.replace(/[|]|[\\^]/g, '');\n\t if (isValidUrl(s)) {\n\t return \"[src*=\\\"\".concat(s, \"\\\"]\");\n\t }\n\t return null;\n\t };\n\t api.constructRuleText = function (element, options) {\n\t var croppedDomain = cropDomain(options.url);\n\t var ruleType = options.ruleType;\n\t if (ruleType === 'URL') {\n\t var blockUrlRuleText = constructUrlBlockRuleText(element, options.urlMask, options.isBlockOneDomain, croppedDomain);\n\t if (blockUrlRuleText) {\n\t return blockUrlRuleText;\n\t }\n\t }\n\t var result;\n\t if (ruleType === 'CSS') {\n\t result = constructCssRuleText(element, options);\n\t if (options.attributes) {\n\t result = (result || CSS_RULE_MARK + result) + options.attributes;\n\t }\n\t }\n\t if (!options.isBlockOneDomain) {\n\t result = croppedDomain + result;\n\t }\n\t return result;\n\t };\n\t return api;\n\t}\n\tvar adguardRulesConstructor = new AdguardRulesConstructorLib();\n\t const adguard_rules_constructor = (adguardRulesConstructor);\n\tfunction SliderMenuController(addRule, iframe) {\n\t var contentDocument = null;\n\t var selectedElement = null;\n\t var startElement = null;\n\t var currentElement = null;\n\t var iframeCtrl = iframe;\n\t var getFilterRuleInputText = function getFilterRuleInputText() {\n\t return contentDocument.getElementById('filter-rule').value;\n\t };\n\t var close = function close() {\n\t iframeCtrl.removeIframe();\n\t };\n\t var expandAdvanced = function expandAdvanced() {\n\t var advancedSettings = contentDocument.querySelector('#advanced-settings');\n\t var extendedSettingsText = contentDocument.querySelector('#ExtendedSettingsText');\n\t var hidden = !hasClass(advancedSettings, 'open');\n\t if (hidden) {\n\t addClass(advancedSettings, 'open');\n\t addClass(extendedSettingsText, 'active');\n\t iframeCtrl.resizeSliderMenuToAdvanced();\n\t } else {\n\t removeClass(advancedSettings, 'open');\n\t removeClass(extendedSettingsText, 'active');\n\t iframeCtrl.resizeSliderMenuToNormal();\n\t }\n\t };\n\t var showPreview = function showPreview() {\n\t var options = {\n\t isBlockByUrl: contentDocument.getElementById('block-by-url-checkbox').checked,\n\t isBlockSimilar: contentDocument.getElementById('block-similar-checkbox').checked,\n\t isBlockOneDomain: contentDocument.getElementById('one-domain-checkbox').checked\n\t };\n\t iframeCtrl.showBlockPreview(selectedElement, getFilterRuleInputText(), startElement, options);\n\t };\n\t var blockElement = function blockElement() {\n\t var path = getFilterRuleInputText();\n\t iframeCtrl.blockElement(path, addRule);\n\t };\n\t var handleShowBlockSettings = function handleShowBlockSettings(showBlockByUrl, showBlockSimilar) {\n\t var blockByUrlBlock = contentDocument.querySelector('#block-by-url-checkbox-block');\n\t var blockSimilarBlock = contentDocument.querySelector('#block-similar-checkbox-block');\n\t if (showBlockByUrl) {\n\t show(blockByUrlBlock);\n\t } else {\n\t contentDocument.getElementById('block-by-url-checkbox').checked = false;\n\t hide(blockByUrlBlock);\n\t }\n\t if (showBlockSimilar) {\n\t show(blockSimilarBlock);\n\t } else {\n\t contentDocument.getElementById('block-similar-checkbox').checked = false;\n\t hide(blockSimilarBlock);\n\t }\n\t };\n\t var getUrlBlockAttribute = function getUrlBlockAttribute(element) {\n\t var urlBlockAttributes = ['src', 'data'];\n\t for (var i = 0; i < urlBlockAttributes.length; i += 1) {\n\t var attr = urlBlockAttributes[i];\n\t var value = element.getAttribute(attr);\n\t if (value) {\n\t return value;\n\t }\n\t }\n\t return null;\n\t };\n\t var haveUrlBlockParameter = function haveUrlBlockParameter(element) {\n\t var value = getUrlBlockAttribute(element);\n\t return value && value !== '';\n\t };\n\t var haveClassAttribute = function haveClassAttribute(element) {\n\t var className = element.className;\n\t return className && typeof className === 'string' && className.trim() !== '';\n\t };\n\t var setFilterRuleInputText = function setFilterRuleInputText(ruleText) {\n\t contentDocument.getElementById('filter-rule').value = ruleText;\n\t };\n\t var onScopeChange = function onScopeChange() {\n\t var isBlockByUrl = contentDocument.getElementById('block-by-url-checkbox').checked;\n\t var isBlockSimilar = contentDocument.getElementById('block-similar-checkbox').checked;\n\t var isBlockOneDomain = contentDocument.getElementById('one-domain-checkbox').checked;\n\t handleShowBlockSettings(haveUrlBlockParameter(selectedElement) && !isBlockSimilar, haveClassAttribute(selectedElement) && !isBlockByUrl);\n\t var options = {\n\t urlMask: getUrlBlockAttribute(selectedElement),\n\t cssSelectorType: isBlockSimilar ? 'SIMILAR' : 'STRICT_FULL',\n\t isBlockOneDomain: isBlockOneDomain,\n\t url: document.location,\n\t ruleType: isBlockByUrl ? 'URL' : 'CSS'\n\t };\n\t var ruleText = adguard_rules_constructor.constructRuleText(selectedElement, options);\n\t setFilterRuleInputText(ruleText);\n\t iframeCtrl.resizeIframe();\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '#ExtendedSettingsText': expandAdvanced,\n\t '#adg-cancel': iframeCtrl.showSelectorMenu,\n\t '#adg-preview': showPreview,\n\t '#adg-accept': blockElement,\n\t '#block-by-url-checkbox-block': onScopeChange,\n\t '#one-domain-checkbox-block': onScopeChange,\n\t '#block-similar-checkbox-block': onScopeChange\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var makeDefaultCheckboxesForDetailedMenu = function makeDefaultCheckboxesForDetailedMenu(options) {\n\t contentDocument.getElementById('block-by-url-checkbox').checked = options && options.isBlockByUrl;\n\t contentDocument.getElementById('block-similar-checkbox').checked = options && options.isBlockSimilar;\n\t contentDocument.getElementById('one-domain-checkbox').checked = options && options.isBlockOneDomain;\n\t if (options && (options.isBlockByUrl || options.isBlockSimilar)) {\n\t handleShowBlockSettings(options.isBlockByUrl, options.isBlockSimilar);\n\t }\n\t };\n\t var onSliderMove = function onSliderMove(element) {\n\t selectedElement = element;\n\t adguard_selector.selectElement(element);\n\t makeDefaultCheckboxesForDetailedMenu();\n\t onScopeChange();\n\t handleShowBlockSettings(haveUrlBlockParameter(element), haveClassAttribute(element));\n\t };\n\t var createSlider = function createSlider(setElement) {\n\t var parents = getParentsLevel(selectedElement);\n\t var children = getAllChildren(selectedElement);\n\t var value = Math.abs(parents.length + 1);\n\t var max = parents.length + children.length + 1;\n\t var min = 1;\n\t var options = {\n\t value: value,\n\t min: min,\n\t max: max\n\t };\n\t var slider = contentDocument.querySelector('#slider');\n\t var sliderArea = contentDocument.querySelector('#slider-area');\n\t if (min === max) {\n\t hide(slider);\n\t hide(contentDocument.querySelectorAll('.element-rule_text'));\n\t expandAdvanced();\n\t }\n\t options.onSliderMove = function (delta) {\n\t var elem;\n\t if (delta > 0) {\n\t elem = parents[delta - 1];\n\t }\n\t if (delta === 0) {\n\t elem = startElement;\n\t }\n\t if (delta < 0) {\n\t elem = children[Math.abs(delta + 1)];\n\t }\n\t onSliderMove(elem);\n\t };\n\t var currentVal = options.value;\n\t if (setElement) {\n\t var setElementparents = getParentsLevel(setElement);\n\t currentVal = setElementparents.length + 1;\n\t }\n\t slider_widget.init(slider, {\n\t min: options.min,\n\t max: options.max,\n\t value: currentVal,\n\t onValueChanged: function onValueChanged(value) {\n\t var delta = options.value - value;\n\t options.onSliderMove(delta);\n\t },\n\t sliderArea: sliderArea\n\t });\n\t };\n\t var init = function init(iframe, options) {\n\t selectedElement = options.element;\n\t startElement = selectedElement;\n\t contentDocument = iframe.contentDocument;\n\t currentElement = options.currentElement;\n\t bindEvents();\n\t createSlider(currentElement);\n\t onScopeChange();\n\t adguard_selector.selectElement(selectedElement);\n\t if (currentElement) {\n\t onSliderMove(currentElement);\n\t }\n\t events.add(contentDocument.getElementById('filter-rule'), 'contextmenu', function (e) {\n\t e.stopPropagation();\n\t });\n\t if (options.path) {\n\t setFilterRuleInputText(options.path);\n\t expandAdvanced();\n\t }\n\t if (options.options) {\n\t makeDefaultCheckboxesForDetailedMenu(options.options);\n\t }\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction BlockPreviewController(addRule, iframe) {\n\t var contentDocument = null;\n\t var currentElement = null;\n\t var selectedElement = null;\n\t var selectedPath = null;\n\t var optionsState = null;\n\t var iframeCtrl = iframe;\n\t var previewStyleID = 'ag-preview-style-id';\n\t var showElement = function showElement() {\n\t iframeCtrl.showHiddenElements(previewStyleID);\n\t };\n\t var close = function close() {\n\t showElement();\n\t iframeCtrl.removeIframe();\n\t };\n\t var selectAnotherElement = function selectAnotherElement() {\n\t showElement();\n\t iframeCtrl.showSelectorMenu();\n\t };\n\t var blockElement = function blockElement(e) {\n\t e.stopPropagation();\n\t iframeCtrl.blockElement(selectedPath, addRule);\n\t };\n\t var showDetailedMenu = function showDetailedMenu() {\n\t showElement();\n\t iframeCtrl.showSliderMenu(currentElement, selectedElement, selectedPath, optionsState);\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '#select-another-element': selectAnotherElement,\n\t '#end-preview': showDetailedMenu,\n\t '#block-element': blockElement\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var hideElement = function hideElement() {\n\t if (!selectedPath) {\n\t src_log.error('Can`t block element: `selector` path is empty');\n\t return;\n\t }\n\t iframeCtrl.hideElementsByPath(selectedPath, previewStyleID);\n\t };\n\t var init = function init(iframe, options) {\n\t selectedElement = options.element;\n\t selectedPath = options.path;\n\t currentElement = options.currentElement;\n\t contentDocument = iframe.contentDocument;\n\t optionsState = options.options;\n\t adguard_selector.reset();\n\t bindEvents();\n\t hideElement();\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction UIValidationUtils() {\n\t var _window = window,\n\t document = _window.document;\n\t var getViewPort = function getViewPort() {\n\t var width = window.innerWidth;\n\t var height = window.innerHeight;\n\t return {\n\t width: width,\n\t height: height\n\t };\n\t };\n\t var checkVisibleAreaSize = function checkVisibleAreaSize() {\n\t var viewPort = getViewPort();\n\t var visibleAreaSize = viewPort.height > src_settings.Constants.MINIMUM_VISIBLE_HEIGHT_TO_SHOW_BUTTON;\n\t if (!visibleAreaSize) {\n\t src_log.error(\"Viewport height is too small: \".concat(viewPort.height));\n\t }\n\t return visibleAreaSize;\n\t };\n\t var validateBrowser = function validateBrowser() {\n\t var valid = !document.documentMode || document.documentMode > src_settings.Constants.MINIMUM_IE_SUPPORTED_VERSION;\n\t if (!valid) {\n\t src_log.error(\"IE version is \".concat(document.documentMode));\n\t }\n\t return valid;\n\t };\n\t var validatePage = function validatePage() {\n\t if (window.window !== window.top) {\n\t return false;\n\t }\n\t return true;\n\t };\n\t return {\n\t checkVisibleAreaSize: checkVisibleAreaSize,\n\t validateBrowser: validateBrowser,\n\t validatePage: validatePage,\n\t getViewPort: getViewPort\n\t };\n\t}\n\tvar uiValidationUtils = new UIValidationUtils();\n\t const ui_validation_utils = (uiValidationUtils);\n\tfunction UIUtils() {\n\t var elWidth;\n\t var elHeight;\n\t var windowWidth;\n\t var windowHeight;\n\t var storedAnchor = {};\n\t var getOriginalEvent = function getOriginalEvent(e) {\n\t return e.targetTouches ? e.targetTouches[0] : e;\n\t };\n\t var outsidePosition = {\n\t top: function top(pos) {\n\t return storedAnchor.top && (pos.y + elHeight > windowHeight || pos.y < 0);\n\t },\n\t bottom: function bottom(pos) {\n\t return !storedAnchor.top && (Math.abs(pos.y) + elHeight > windowHeight || pos.y > 0);\n\t },\n\t left: function left(pos) {\n\t return storedAnchor.left && (pos.x + elWidth > windowWidth || pos.x < 0);\n\t },\n\t right: function right(pos) {\n\t return !storedAnchor.left && (Math.abs(pos.x) + elWidth > windowWidth || pos.x > 0);\n\t }\n\t };\n\t var moveElementTo = function moveElementTo(el, x, y) {\n\t var transform = \"translate3d(\".concat(x, \"px,\").concat(y, \"px, 0px)\");\n\t el.style.webkitTransform = transform;\n\t el.style.mozTransform = transform;\n\t el.style.msTransform = transform;\n\t el.style.oTransform = transform;\n\t el.style.transform = transform;\n\t };\n\t var getWindowSize = function getWindowSize() {\n\t return {\n\t width: Math.min(document.documentElement.clientWidth, window.innerWidth || window.screen.width),\n\t height: Math.min(document.documentElement.clientHeight, window.innerHeight || window.screen.height)\n\t };\n\t };\n\t var setAnchorPosition = {\n\t positionY: function positionY(element, anchor) {\n\t storedAnchor.top = anchor;\n\t if (storedAnchor.top) {\n\t addClass(element, 'adguard-assistant-button-top');\n\t removeClass(element, 'adguard-assistant-button-bottom');\n\t } else {\n\t addClass(element, 'adguard-assistant-button-bottom');\n\t removeClass(element, 'adguard-assistant-button-top');\n\t }\n\t },\n\t positionX: function positionX(element, anchor) {\n\t storedAnchor.left = anchor;\n\t if (storedAnchor.left) {\n\t addClass(element, 'adguard-assistant-button-left');\n\t removeClass(element, 'adguard-assistant-button-right');\n\t } else {\n\t addClass(element, 'adguard-assistant-button-right');\n\t removeClass(element, 'adguard-assistant-button-left');\n\t }\n\t }\n\t };\n\t function makeElementDraggable(element, onDragEnd, onClick) {\n\t var coords;\n\t var shiftX;\n\t var shiftY;\n\t var pauseEvent = function pauseEvent(e) {\n\t e.stopPropagation();\n\t e.preventDefault();\n\t e.cancelBubble = true;\n\t e.returnValue = false;\n\t return false;\n\t };\n\t var onMouseMove = function onMouseMove(e) {\n\t pauseEvent(e);\n\t moveAt(e);\n\t };\n\t var preventedEvent = function preventedEvent(e) {\n\t e.preventDefault();\n\t };\n\t var getCoords = function getCoords(elem) {\n\t var box = elem.getBoundingClientRect();\n\t return {\n\t top: box.top,\n\t left: box.left,\n\t bottom: box.bottom,\n\t right: box.right\n\t };\n\t };\n\t var onMouseUp = function onMouseUp(e, doNotOpenIframe) {\n\t e.stopPropagation();\n\t events.remove(document.documentElement, 'wheel mousewheel', preventedEvent);\n\t var lastX;\n\t var lastY;\n\t var lastCoords = getCoords(element);\n\t var topHalf = lastCoords.top < windowHeight / 2;\n\t var leftHalf = lastCoords.left < windowWidth / 2;\n\t setAnchorPosition.positionY(element, topHalf);\n\t setAnchorPosition.positionX(element, leftHalf);\n\t if (topHalf) {\n\t lastY = lastCoords.top;\n\t } else {\n\t lastY = lastCoords.bottom - windowHeight;\n\t }\n\t if (leftHalf) {\n\t lastX = lastCoords.left;\n\t } else {\n\t lastX = lastCoords.right - windowWidth;\n\t }\n\t moveElementTo(element, lastX, lastY);\n\t if (Math.abs(coords.left - lastCoords.left) > 5 || Math.abs(coords.top - lastCoords.top) > 5) {\n\t if (onDragEnd) {\n\t var store = {\n\t x: lastX,\n\t y: lastY,\n\t storedAnchor: storedAnchor\n\t };\n\t onDragEnd(store);\n\t }\n\t } else if (onClick && !doNotOpenIframe) {\n\t onClick(e);\n\t }\n\t events.remove(document.documentElement, 'mouseup touchend pointerup', onMouseUp);\n\t events.remove(document.documentElement, 'mousemove touchmove pointermove', onMouseMove);\n\t };\n\t var moveAt = function moveAt(e) {\n\t var position = {\n\t x: getOriginalEvent(e).pageX - shiftX,\n\t y: getOriginalEvent(e).pageY - shiftY\n\t };\n\t var out = outsidePosition.top(position) || outsidePosition.left(position) || outsidePosition.bottom(position) || outsidePosition.right(position);\n\t if (out) {\n\t onMouseUp(e, true);\n\t } else {\n\t moveElementTo(element, position.x, position.y);\n\t }\n\t };\n\t var mouseDown = function mouseDown(e) {\n\t pauseEvent(e);\n\t events.add(document.documentElement, 'wheel mousewheel', preventedEvent);\n\t if (e.button > 0) return;\n\t elWidth = element.clientWidth;\n\t elHeight = element.clientWidth;\n\t windowWidth = getWindowSize().width;\n\t windowHeight = getWindowSize().height;\n\t coords = getCoords(element);\n\t if (storedAnchor.top) {\n\t shiftY = getOriginalEvent(e).pageY - coords.top;\n\t } else {\n\t shiftY = windowHeight - (coords.bottom - getOriginalEvent(e).pageY);\n\t }\n\t if (storedAnchor.left) {\n\t shiftX = getOriginalEvent(e).pageX - coords.left;\n\t } else {\n\t shiftX = windowWidth - (coords.right - getOriginalEvent(e).pageX);\n\t }\n\t events.add(document.documentElement, 'mouseup touchend pointerup', onMouseUp);\n\t events.add(document.documentElement, 'mousemove touchmove pointermove', onMouseMove);\n\t };\n\t events.add(element, 'mousedown touchstart', src_protectedApi.functionBind.call(mouseDown, this));\n\t events.add(element, 'dragstart', function () {});\n\t }\n\t var makeIframeDraggable = function makeIframeDraggable(iframe, handleElement) {\n\t var iframeDoc = iframe.contentDocument;\n\t var offset = Object.create(null);\n\t var drag = function drag(x, y) {\n\t iframe.style.left = \"\".concat(x, \"px\");\n\t iframe.style.top = \"\".concat(y, \"px\");\n\t };\n\t var cancelIFrameSelection = function cancelIFrameSelection(e) {\n\t e.preventDefault();\n\t e.stopPropagation();\n\t };\n\t var onMouseMove = function onMouseMove(e) {\n\t var eventPosition = getOriginalEvent(e);\n\t drag(eventPosition.screenX + offset.x, eventPosition.screenY + offset.y);\n\t };\n\t var onMouseDown = function onMouseDown(e) {\n\t var eventPosition = getOriginalEvent(e);\n\t var rect = iframe.getBoundingClientRect();\n\t offset.x = rect.left + handleElement.offsetLeft - eventPosition.screenX;\n\t offset.y = rect.top + handleElement.offsetTop - eventPosition.screenY;\n\t events.add(iframeDoc, 'mousemove touchmove pointermove', onMouseMove);\n\t events.add(iframeDoc, 'selectstart', cancelIFrameSelection);\n\t };\n\t var onMouseUp = function onMouseUp() {\n\t events.remove(iframeDoc, 'mousemove touchmove pointermove', onMouseMove);\n\t events.remove(iframeDoc, 'selectstart', cancelIFrameSelection);\n\t };\n\t document.addEventListener('visibilitychange', onMouseUp);\n\t events.add(handleElement, 'mousedown touchstart', onMouseDown);\n\t events.add(iframeDoc, 'mouseup touchend pointerup', onMouseUp);\n\t events.add(iframeDoc, 'contextmenu', function (e) {\n\t e.preventDefault();\n\t return false;\n\t });\n\t };\n\t var checkElementPosition = function checkElementPosition(element, pos) {\n\t var position = pos;\n\t windowWidth = getWindowSize().width;\n\t windowHeight = getWindowSize().height;\n\t elWidth = element.clientWidth;\n\t elHeight = element.clientHeight;\n\t if (outsidePosition.top(position)) position.y = windowHeight - 60;\n\t if (outsidePosition.bottom(position)) position.y = -windowHeight + 60;\n\t if (outsidePosition.left(position)) position.x = windowWidth - 60;\n\t if (outsidePosition.right(position)) position.x = -windowWidth + 60;\n\t moveElementTo(element, position.x, position.y);\n\t };\n\t return {\n\t makeElementDraggable: makeElementDraggable,\n\t makeIframeDraggable: makeIframeDraggable,\n\t moveElementTo: moveElementTo,\n\t setAnchorPosition: setAnchorPosition,\n\t checkElementPosition: checkElementPosition\n\t };\n\t}\n\tvar uiUtils = new UIUtils();\n\t const ui_utils = (uiUtils);\n\tfunction UIButton() {\n\t var button = null;\n\t var buttonElement = null;\n\t var isFullScreenEventsRegistered = false;\n\t var iframeController = null;\n\t var getStyleNonce = function getStyleNonce() {\n\t var adgSettings = src_settings.getAdguardSettings();\n\t if (adgSettings === null) {\n\t return '';\n\t }\n\t return adgSettings.nonce;\n\t };\n\t var isButtonAlreadyInDOM = function isButtonAlreadyInDOM() {\n\t var alert = document.querySelector('.adguard-alert');\n\t if (alert) {\n\t src_log.error('Assistant button is already in DOM');\n\t return true;\n\t }\n\t return false;\n\t };\n\t var checkRequirements = function checkRequirements() {\n\t if (!ui_validation_utils.validateBrowser()) {\n\t return false;\n\t }\n\t if (!ui_validation_utils.validatePage()) {\n\t return false;\n\t }\n\t if (!ui_validation_utils.checkVisibleAreaSize()) {\n\t return false;\n\t }\n\t if (isButtonAlreadyInDOM()) {\n\t return false;\n\t }\n\t return true;\n\t };\n\t var respectPageElements = function respectPageElements(btn) {\n\t var buttonInRightBottom = hasClass(btn, 'adguard-assistant-button-bottom') && hasClass(btn, 'adguard-assistant-button-right');\n\t if (buttonInRightBottom && document.location.hostname.indexOf('vk.com') >= 0) {\n\t addClass(btn, 'adguard-assistant-button-respect adguard-assistant-button-respect-vk');\n\t }\n\t if (buttonInRightBottom && document.location.hostname.indexOf('facebook.com') >= 0) {\n\t addClass(btn, 'adguard-assistant-button-respect adguard-assistant-button-respect-fb');\n\t }\n\t return false;\n\t };\n\t var setPositionSettingsToButton = function setPositionSettingsToButton(btn) {\n\t var position = src_settings.getUserPositionForButton();\n\t if (src_settings.getIconSize()) {\n\t addClass(btn, 'logo-small');\n\t }\n\t if (position && position.storedAnchor) {\n\t ui_utils.setAnchorPosition.positionY(btn, position.storedAnchor.top);\n\t ui_utils.setAnchorPosition.positionX(btn, position.storedAnchor.left);\n\t ui_utils.moveElementTo(btn, position.x, position.y);\n\t ui_utils.checkElementPosition(btn, position);\n\t return false;\n\t }\n\t var side = src_settings.getButtonSide();\n\t if (side) {\n\t ui_utils.setAnchorPosition.positionY(btn, side.top);\n\t ui_utils.setAnchorPosition.positionX(btn, side.left);\n\t respectPageElements(btn);\n\t }\n\t return undefined;\n\t };\n\t var getButtonPosition = function getButtonPosition(btn) {\n\t var box = btn.getBoundingClientRect();\n\t return {\n\t top: box.top + btn.offsetHeight / 2,\n\t left: box.left + btn.offsetWidth / 2\n\t };\n\t };\n\t var hideButton = function hideButton() {\n\t if (!button) {\n\t return;\n\t }\n\t button.style.setProperty('display', 'none', 'important');\n\t };\n\t var showButton = function showButton() {\n\t if (!button) {\n\t return;\n\t }\n\t button.style.setProperty('display', 'block', 'important');\n\t };\n\t var hideRestoreOnFullScreen = function hideRestoreOnFullScreen() {\n\t if (isFullScreenEventsRegistered) {\n\t return;\n\t }\n\t var isFullScreen = false;\n\t var onFullScreen = function onFullScreen() {\n\t if (!isFullScreen) {\n\t hideButton();\n\t isFullScreen = true;\n\t } else {\n\t showButton();\n\t isFullScreen = false;\n\t }\n\t };\n\t document.addEventListener('webkitfullscreenchange', onFullScreen);\n\t document.addEventListener('mozfullscreenchange', onFullScreen);\n\t document.addEventListener('fullscreenchange', onFullScreen);\n\t isFullScreenEventsRegistered = true;\n\t };\n\t var registerEvents = function registerEvents(btn) {\n\t var onDragEnd = function onDragEnd(data) {\n\t src_settings.setUserPositionForButton(data);\n\t };\n\t var openMenu = function openMenu() {\n\t iframeController.setButtonPosition(getButtonPosition(btn));\n\t iframeController.showDetailedMenu();\n\t };\n\t ui_utils.makeElementDraggable(btn, onDragEnd, openMenu);\n\t hideRestoreOnFullScreen();\n\t };\n\t var show = function show() {\n\t iframeController = src_ioc.get('iframeController');\n\t iframeController.onCloseMenu.attach(showButton);\n\t iframeController.onShowMenuItem.attach(hideButton);\n\t if (!checkRequirements()) {\n\t src_log.info('Environment doesn\\'t satisfy requirements, so don\\'t show Adguard');\n\t return;\n\t }\n\t if (button) {\n\t return;\n\t }\n\t src_log.debug('Requirements checked, all ok');\n\t buttonElement = src_protectedApi.createElement('div');\n\t buttonElement.innerHTML = HTML.button;\n\t button = buttonElement.firstChild;\n\t var adgStylesButton;\n\t if (src_protectedApi.checkShadowDomSupport()) {\n\t var shadowbuttonElement = buttonElement.attachShadow({\n\t mode: 'closed'\n\t });\n\t adgStylesButton = src_protectedApi.createStylesElement(CSS.common + CSS.button, getStyleNonce());\n\t shadowbuttonElement.appendChild(adgStylesButton);\n\t shadowbuttonElement.appendChild(button);\n\t document.documentElement.appendChild(buttonElement);\n\t } else {\n\t adgStylesButton = src_protectedApi.createStylesElement(CSS.button, getStyleNonce(), 'adg-styles-button');\n\t if (adgStylesButton) {\n\t document.documentElement.appendChild(adgStylesButton);\n\t }\n\t document.documentElement.appendChild(button);\n\t buttonElement = button;\n\t }\n\t setPositionSettingsToButton(button);\n\t registerEvents(button);\n\t };\n\t var removeButton = function removeButton() {\n\t if (!button) {\n\t return;\n\t }\n\t document.documentElement.removeChild(buttonElement);\n\t button = null;\n\t };\n\t return {\n\t show: show,\n\t remove: removeButton\n\t };\n\t}\n\tvar button_button = new UIButton();\n\t const src_button = (button_button);\n\tfunction SettingsMenuController(iframe) {\n\t var contentDocument = null;\n\t var iframeCtrl = iframe;\n\t var buttonSides = {\n\t 'position-bottom-right': {\n\t top: false,\n\t left: false\n\t },\n\t 'position-bottom-left': {\n\t top: false,\n\t left: true\n\t },\n\t 'position-top-right': {\n\t top: true,\n\t left: false\n\t },\n\t 'position-top-left': {\n\t top: true,\n\t left: true\n\t }\n\t };\n\t var close = function close() {\n\t iframeCtrl.removeIframe();\n\t };\n\t var setIconSize = function setIconSize() {\n\t var smallIcon = contentDocument.getElementById('size-small').checked;\n\t src_settings.setIconSize(smallIcon);\n\t };\n\t var setPersonalParam = function setPersonalParam() {\n\t var personalConfig = contentDocument.getElementById('this-site').checked;\n\t src_settings.setPersonalParam(personalConfig);\n\t };\n\t var setButtonSide = function setButtonSide() {\n\t var sideItem = null;\n\t Object.keys(buttonSides).forEach(function (item) {\n\t if (contentDocument.getElementById(item).checked) {\n\t sideItem = item;\n\t }\n\t });\n\t if (sideItem) {\n\t src_settings.setButtonSide(buttonSides[sideItem]);\n\t }\n\t };\n\t var setDefaultSettings = function setDefaultSettings() {\n\t if (src_settings.getIconSize()) {\n\t contentDocument.getElementById('size-small').checked = true;\n\t } else {\n\t contentDocument.getElementById('size-big').checked = true;\n\t }\n\t if (src_settings.getPersonalConfig()) {\n\t contentDocument.getElementById('this-site').checked = true;\n\t } else {\n\t contentDocument.getElementById('all-site').checked = true;\n\t }\n\t var position = src_settings.getUserPositionForButton();\n\t if (position) {\n\t return;\n\t }\n\t var sideFromSettings = src_settings.getButtonSide();\n\t Object.keys(buttonSides).forEach(function (item) {\n\t var sideItem = buttonSides[item];\n\t if (sideItem.left === sideFromSettings.left && sideItem.top === sideFromSettings.top) {\n\t contentDocument.getElementById(item).checked = true;\n\t }\n\t });\n\t };\n\t var saveSettings = function saveSettings() {\n\t setPersonalParam();\n\t setIconSize();\n\t setButtonSide();\n\t src_settings.saveSettings();\n\t close();\n\t src_button.remove();\n\t src_button.show();\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.close': close,\n\t '#cancel': iframeCtrl.showDetailedMenu,\n\t '#save-settings': saveSettings\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t };\n\t var init = function init(iframe) {\n\t contentDocument = iframe.contentDocument;\n\t bindEvents();\n\t setDefaultSettings();\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tfunction IframeController() {\n\t var iframe = null;\n\t var iframeAnchor = null;\n\t var currentItem = null;\n\t var iframeMaxWidth = 320;\n\t var iframeMaxHeight = 407;\n\t var menuMaxWidth = 668;\n\t var iframePositionOffset = 20;\n\t var buttonPosition = null;\n\t var blockedElementsStyleID = 'ag-hide-elements-style-id';\n\t var views = {};\n\t views[src_settings.MenuItemsNames.DetailedMenu] = HTML.detailed_menu;\n\t views[src_settings.MenuItemsNames.SelectorMenu] = HTML.selector_menu;\n\t views[src_settings.MenuItemsNames.SliderMenu] = HTML.slider_menu;\n\t views[src_settings.MenuItemsNames.BlockPreview] = HTML.preview;\n\t views[src_settings.MenuItemsNames.SettingsMenu] = HTML.settings_menu;\n\t if (window.innerWidth < menuMaxWidth) menuMaxWidth = window.innerWidth;\n\t var onCloseMenu = new CustomEvent();\n\t var onShowMenuItem = new CustomEvent();\n\t var getStyleNonce = function getStyleNonce() {\n\t var adgSettings = src_settings.getAdguardSettings();\n\t if (adgSettings === null) {\n\t return '';\n\t }\n\t return adgSettings.nonce;\n\t };\n\t var createShadowRootElement = function createShadowRootElement(iframeAnc) {\n\t var shadowiframeAnchor = iframeAnc.attachShadow({\n\t mode: 'closed'\n\t });\n\t var stylesElement = src_protectedApi.createStylesElement(CSS.common + CSS.iframe, getStyleNonce());\n\t shadowiframeAnchor.appendChild(stylesElement);\n\t return shadowiframeAnchor;\n\t };\n\t var createIframe = function createIframe(onIframeLoadCallback) {\n\t src_log.debug('Creating iframe');\n\t iframe = src_protectedApi.createElement('iframe');\n\t if (navigator.userAgent.match(/msie/i)) {\n\t iframe.src = \"javascript:''\");\n\t }\n\t var attributes = {\n\t id: src_settings.Constants.IFRAME_ID,\n\t \"class\": adguard_selector.ignoreClassName(),\n\t frameBorder: 0,\n\t allowTransparency: 'true'\n\t };\n\t Object.keys(attributes).forEach(function (item) {\n\t iframe.setAttribute(item, attributes[item]);\n\t });\n\t var iframeAlreadyLoaded = false;\n\t iframe.addEventListener('load', function () {\n\t if (iframeAlreadyLoaded) {\n\t return;\n\t }\n\t iframeAlreadyLoaded = true;\n\t onIframeLoadCallback();\n\t });\n\t if (src_protectedApi.checkShadowDomSupport()) {\n\t iframeAnchor = src_protectedApi.createElement('div');\n\t createShadowRootElement(iframeAnchor).appendChild(iframe);\n\t } else {\n\t iframeAnchor = iframe;\n\t }\n\t document.documentElement.appendChild(iframeAnchor);\n\t };\n\t var getIframePosition = function getIframePosition() {\n\t var viewPort = ui_validation_utils.getViewPort();\n\t if (!buttonPosition) {\n\t return {\n\t left: iframe.offsetLeft <= 0 ? window.innerWidth : iframe.offsetLeft,\n\t top: parseInt(iframe.style.top, 10) || iframePositionOffset\n\t };\n\t }\n\t var defaultPosition = {\n\t left: buttonPosition.left,\n\t top: buttonPosition.top\n\t };\n\t var sides = [{\n\t left: buttonPosition.left - iframeMaxWidth - iframePositionOffset,\n\t top: buttonPosition.top - iframeMaxHeight - iframePositionOffset\n\t }, {\n\t left: buttonPosition.left + iframePositionOffset,\n\t checkLeft: buttonPosition.left + iframeMaxWidth + iframePositionOffset,\n\t top: buttonPosition.top - iframeMaxHeight - iframePositionOffset\n\t }, {\n\t left: buttonPosition.left + iframePositionOffset,\n\t checkLeft: buttonPosition.left + iframeMaxWidth + iframePositionOffset,\n\t checkTop: buttonPosition.top + iframeMaxHeight + iframePositionOffset,\n\t top: buttonPosition.top + iframePositionOffset\n\t }, {\n\t left: buttonPosition.left - iframeMaxWidth - iframePositionOffset,\n\t checkTop: buttonPosition.top + iframeMaxHeight + iframePositionOffset,\n\t top: buttonPosition.top + iframePositionOffset\n\t }];\n\t for (var i = 0; i < sides.length; i += 1) {\n\t var currentSide = sides[i];\n\t var left = currentSide.checkLeft ? currentSide.checkLeft : currentSide.left;\n\t var top = currentSide.checkTop ? currentSide.checkTop : currentSide.top;\n\t if (left < 0 || left > viewPort.width) {\n\t continue;\n\t }\n\t if (top < 0 || top > viewPort.height) {\n\t continue;\n\t }\n\t return currentSide;\n\t }\n\t return defaultPosition;\n\t };\n\t var specifyIframePosition = function specifyIframePosition() {\n\t var viewPort = ui_validation_utils.getViewPort();\n\t if (iframe.offsetLeft + iframe.offsetWidth > viewPort.width) {\n\t iframe.style.left = \"\".concat(Math.max(0, viewPort.width - iframe.offsetWidth - iframePositionOffset), \"px\");\n\t }\n\t if (iframe.offsetLeft < 0) {\n\t iframe.style.left = \"\".concat(iframePositionOffset, \"px\");\n\t }\n\t if (iframe.offsetTop + iframe.offsetHeight > viewPort.height) {\n\t iframe.style.top = \"\".concat(Math.max(0, viewPort.height - iframe.offsetHeight - iframePositionOffset), \"px\");\n\t }\n\t if (iframe.offsetHeight < 0) {\n\t iframe.style.top = \"\".concat(iframePositionOffset, \"px\");\n\t }\n\t };\n\t var appendContent = function appendContent(view) {\n\t var body = iframe.contentDocument.body;\n\t for (var i = 0; i < body.children.length; i += 1) {\n\t body.removeChild(body.children[i]);\n\t }\n\t body.appendChild(view);\n\t };\n\t var localize = function localize() {\n\t var elements = iframe.contentDocument.querySelectorAll('[i18n]');\n\t for (var i = 0; i < elements.length; i += 1) {\n\t var message = src_localization.getMessage(elements[i].getAttribute('i18n'));\n\t src_localization.translateElement(elements[i], message);\n\t }\n\t };\n\t var resizeIframe = function resizeIframe(width, height) {\n\t var frame = iframe;\n\t if (height === 'auto' || !height) {\n\t height = frame.contentWindow.document.body.querySelector('.main').clientHeight || iframeMaxHeight;\n\t }\n\t if (width) {\n\t frame.width = width;\n\t frame.style.setProperty('width', \"\".concat(width, \"px\"), 'important');\n\t }\n\t if (height) {\n\t frame.height = height;\n\t frame.style.setProperty('height', \"\".concat(height, \"px\"), 'important');\n\t }\n\t };\n\t var showMenuItem = function showMenuItem(viewName, controller, width, height, options) {\n\t src_log.debug(\"Showing menu item: \".concat(viewName));\n\t if (currentItem === viewName) {\n\t return;\n\t }\n\t var onIframeLoad = function onIframeLoad() {\n\t var frameElement = iframe;\n\t var view = src_protectedApi.createElement(views[viewName]);\n\t var stylesElement = src_protectedApi.createStylesElement(CSS.common + CSS.button + CSS.iframe, getStyleNonce());\n\t view.appendChild(stylesElement);\n\t appendContent(view);\n\t localize();\n\t if (!options) {\n\t options = {};\n\t }\n\t options.iframeAnchor = iframeAnchor;\n\t controller.init(frameElement, options);\n\t currentItem = viewName;\n\t onShowMenuItem.notify();\n\t if (options.dragElement) {\n\t ui_utils.makeIframeDraggable(iframe, iframe.contentDocument.querySelector(options.dragElement));\n\t }\n\t resizeIframe(width, height);\n\t var iframePosition = getIframePosition();\n\t iframe.style.left = \"\".concat(iframePosition.left, \"px\");\n\t iframe.style.top = \"\".concat(iframePosition.top, \"px\");\n\t specifyIframePosition();\n\t };\n\t if (!iframe) {\n\t var adgStylesSelector = src_protectedApi.createStylesElement(CSS.selector, getStyleNonce(), 'adg-styles-selector');\n\t if (adgStylesSelector) {\n\t document.documentElement.appendChild(adgStylesSelector);\n\t }\n\t createIframe(onIframeLoad);\n\t return;\n\t }\n\t onIframeLoad();\n\t };\n\t var setButtonPosition = function setButtonPosition(coords) {\n\t buttonPosition = coords;\n\t };\n\t var removeIframe = function removeIframe(e) {\n\t if (e && e.isTrusted === false) {\n\t return false;\n\t }\n\t if (!iframeAnchor) {\n\t return false;\n\t }\n\t document.removeEventListener('click', removeIframe);\n\t document.documentElement.removeChild(iframeAnchor);\n\t iframe = null;\n\t iframeAnchor = null;\n\t currentItem = null;\n\t adguard_selector.close();\n\t onCloseMenu.notify();\n\t return undefined;\n\t };\n\t var setCloseEventIfNotHitIframe = function setCloseEventIfNotHitIframe(setEvent) {\n\t document.removeEventListener('click', removeIframe);\n\t if (setEvent) {\n\t window.setTimeout(function () {\n\t document.addEventListener('click', removeIframe);\n\t }, 150);\n\t }\n\t };\n\t var showDetailedMenu = function showDetailedMenu() {\n\t var controller = new DetailedMenuController(src_ioc.get('iframeController'));\n\t var options = {\n\t dragElement: '.menu-head'\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.DetailedMenu, controller, iframeMaxWidth, 'auto', options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var showSelectorMenu = function showSelectorMenu() {\n\t var controller = new SelectorMenuController(src_ioc.get('iframeController'));\n\t var options = {\n\t dragElement: '.head'\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.SelectorMenu, controller, menuMaxWidth, 160, options);\n\t setCloseEventIfNotHitIframe(false);\n\t };\n\t var showSliderMenu = function showSliderMenu(initElement, currentElement, path, optionsState) {\n\t var controller = new SliderMenuController(src_ioc.get('addRule'), src_ioc.get('iframeController'));\n\t var options = {\n\t path: path,\n\t currentElement: currentElement,\n\t element: initElement,\n\t dragElement: '.head',\n\t options: optionsState\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.SliderMenu, controller, menuMaxWidth, 'auto', options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var showBlockPreview = function showBlockPreview(initElement, path, currentElement, optionsState) {\n\t var controller = new BlockPreviewController(src_ioc.get('addRule'), src_ioc.get('iframeController'));\n\t var options = {\n\t path: path,\n\t currentElement: currentElement,\n\t element: initElement,\n\t dragElement: '.head',\n\t options: optionsState\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.BlockPreview, controller, menuMaxWidth, 'auto', options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var showSettingsMenu = function showSettingsMenu() {\n\t var controller = new SettingsMenuController(src_ioc.get('iframeController'));\n\t var options = {\n\t dragElement: '.head'\n\t };\n\t showMenuItem(src_settings.MenuItemsNames.SettingsMenu, controller, 400, 468, options);\n\t setCloseEventIfNotHitIframe(true);\n\t };\n\t var resizeSliderMenuToAdvanced = function resizeSliderMenuToAdvanced() {\n\t resizeIframe(null, null);\n\t };\n\t var resizeSliderMenuToNormal = function resizeSliderMenuToNormal() {\n\t resizeIframe(null, null);\n\t };\n\t var hideElementsByPath = function hideElementsByPath(selectedPath, styleID) {\n\t if (!selectedPath) {\n\t return false;\n\t }\n\t var slctr;\n\t var style;\n\t if (selectedPath.indexOf('://') > 0) {\n\t slctr = \"[src*=\\\"\".concat(selectedPath.split('$domain=')[0], \"\\\"]\");\n\t } else {\n\t slctr = selectedPath.split('##')[1];\n\t }\n\t if (slctr) {\n\t style = \"\".concat(slctr, \"{display:none!important}\");\n\t } else {\n\t src_log.error('Can`t block element: `selector` path is empty');\n\t return false;\n\t }\n\t if (!styleID) {\n\t styleID = blockedElementsStyleID;\n\t }\n\t var stylesElement = document.documentElement.querySelector(\"#\".concat(styleID));\n\t if (stylesElement) {\n\t stylesElement.innerHTML = \"\".concat(stylesElement.innerHTML, \" \").concat(style);\n\t } else {\n\t document.documentElement.appendChild(src_protectedApi.createStylesElement(style, getStyleNonce(), styleID));\n\t }\n\t if (iframeAnchor) {\n\t iframeAnchor.style.setProperty('display', 'block', 'important');\n\t }\n\t return undefined;\n\t };\n\t var showHiddenElements = function showHiddenElements(styleID) {\n\t if (!styleID) {\n\t styleID = blockedElementsStyleID;\n\t }\n\t var stylesElement = document.documentElement.querySelector(\"#\".concat(styleID));\n\t if (stylesElement) {\n\t stylesElement.parentNode.removeChild(stylesElement);\n\t }\n\t };\n\t var blockElement = function blockElement(path, addRule) {\n\t if (gm.ADG_addRule) {\n\t gm.ADG_addRule(path, function () {\n\t removeIframe();\n\t hideElementsByPath(path);\n\t bypassCache();\n\t });\n\t } else {\n\t if (!addRule) {\n\t src_log.error('Callback function `addRule` can\\'t be undefined!');\n\t }\n\t addRule(path);\n\t removeIframe();\n\t hideElementsByPath(path);\n\t bypassCache();\n\t }\n\t };\n\t return {\n\t showDetailedMenu: showDetailedMenu,\n\t showSelectorMenu: showSelectorMenu,\n\t showSliderMenu: showSliderMenu,\n\t showBlockPreview: showBlockPreview,\n\t showSettingsMenu: showSettingsMenu,\n\t setButtonPosition: setButtonPosition,\n\t onCloseMenu: onCloseMenu,\n\t onShowMenuItem: onShowMenuItem,\n\t removeIframe: removeIframe,\n\t resizeSliderMenuToAdvanced: resizeSliderMenuToAdvanced,\n\t resizeSliderMenuToNormal: resizeSliderMenuToNormal,\n\t resizeIframe: resizeIframe,\n\t hideElementsByPath: hideElementsByPath,\n\t showHiddenElements: showHiddenElements,\n\t blockElement: blockElement\n\t };\n\t}\n\t const iframe = (IframeController);\n\tfunction SliderMenuControllerMobile(addRule, iframe) {\n\t var contentDocument = null;\n\t var selectedElement = null;\n\t var iframeCtrl = iframe;\n\t var nodeParentsCount = 0;\n\t var nodeChildsCount = 0;\n\t var parents;\n\t var children;\n\t var nodeNumber = 0;\n\t function showPreview() {\n\t adguard_selector.reset();\n\t if (this.classList.contains('active')) {\n\t removeClass(selectedElement, 'sg_hide_element');\n\t removeClass(this, 'active');\n\t adguard_selector.selectElement(selectedElement);\n\t contentDocument.querySelector('.adg-plus').removeAttribute('disabled');\n\t contentDocument.querySelector('.adg-minus').removeAttribute('disabled');\n\t contentDocument.querySelector('.adg-close').removeAttribute('disabled');\n\t } else {\n\t addClass(selectedElement, 'sg_hide_element');\n\t addClass(this, 'active');\n\t contentDocument.querySelector('.adg-plus').setAttribute('disabled', 'disabled');\n\t contentDocument.querySelector('.adg-minus').setAttribute('disabled', 'disabled');\n\t contentDocument.querySelector('.adg-close').setAttribute('disabled', 'disabled');\n\t }\n\t }\n\t var getUrlBlockAttribute = function getUrlBlockAttribute(element) {\n\t var urlBlockAttributes = ['src', 'data'];\n\t for (var i = 0; i < urlBlockAttributes.length; i += 1) {\n\t var attr = urlBlockAttributes[i];\n\t var value = element.getAttribute(attr);\n\t if (value) {\n\t return value;\n\t }\n\t }\n\t return null;\n\t };\n\t var getFilterText = function getFilterText() {\n\t var options = {\n\t urlMask: getUrlBlockAttribute(selectedElement),\n\t cssSelectorType: 'STRICT_FULL',\n\t isBlockOneDomain: false,\n\t url: document.location,\n\t ruleType: 'CSS'\n\t };\n\t return adguard_rules_constructor.constructRuleText(selectedElement, options);\n\t };\n\t var blockElement = function blockElement() {\n\t selectedElement.classList.remove('sg_hide_element');\n\t selectedElement.style.display = 'none';\n\t addRule(getFilterText());\n\t iframeCtrl.removeIframe();\n\t };\n\t var onSliderMove = function onSliderMove(element) {\n\t selectedElement = element;\n\t adguard_selector.selectElement(element);\n\t };\n\t var plus = function plus() {\n\t nodeNumber = nodeNumber + 1 > nodeParentsCount ? nodeNumber : nodeNumber + 1;\n\t if (nodeNumber >= 0) {\n\t if (parents[nodeNumber]) onSliderMove(parents[nodeNumber]);\n\t } else if (children[~nodeNumber]) onSliderMove(children[~nodeNumber]);\n\t };\n\t var minus = function minus() {\n\t nodeNumber <= -nodeChildsCount ? nodeNumber = nodeNumber : nodeNumber -= 1;\n\t if (nodeNumber >= 0) {\n\t if (parents[nodeNumber]) onSliderMove(parents[nodeNumber]);\n\t } else if (children[~nodeNumber]) onSliderMove(children[~nodeNumber]);\n\t };\n\t var bindEvents = function bindEvents() {\n\t var menuEvents = {\n\t '.adg-close': iframeCtrl.showSelectorMenu,\n\t '.adg-preview': showPreview,\n\t '.adg-accept': blockElement,\n\t '.adg-plus': plus,\n\t '.adg-minus': minus\n\t };\n\t Object.keys(menuEvents).forEach(function (item) {\n\t var elems = contentDocument.querySelectorAll(item);\n\t toArray(elems).forEach(function (elem) {\n\t return elem.addEventListener('click', menuEvents[item]);\n\t });\n\t });\n\t window.addEventListener('orientationchange', iframeCtrl.showSelectorMenu);\n\t };\n\t var init = function init(iframe, options) {\n\t selectedElement = options.element;\n\t contentDocument = iframe.contentDocument;\n\t bindEvents();\n\t adguard_selector.selectElement(selectedElement);\n\t children = getAllChildren(selectedElement);\n\t parents = getParentsLevel(selectedElement);\n\t parents.splice(0, 0, selectedElement);\n\t nodeParentsCount = parents.length;\n\t nodeChildsCount = children.length;\n\t };\n\t return {\n\t init: init\n\t };\n\t}\n\tconst package_namespaceObject = {\"i8\":\"4.3.70\"};\n\tfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\tfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\tfunction IframeControllerMobile() {\n\t var iframe = null;\n\t var iframeElement = null;\n\t var currentItem = null;\n\t var onCloseMenu = new CustomEvent();\n\t var onShowMenuItem = new CustomEvent();\n\t var views = {};\n\t views['mobilePopup.html'] = HTML.popup;\n\t views['mobileMenu.html'] = HTML.mobile_menu;\n\t var defaultCSS = {\n\t clip: 'auto',\n\t 'z-index': 2147483647\n\t };\n\t var defaultAttributes = {\n\t \"class\": adguard_selector.ignoreClassName(),\n\t frameBorder: 0,\n\t allowTransparency: 'true',\n\t id: 'iframe-x2eRYVVQRsG9'\n\t };\n\t var updateIframeAttrs = function updateIframeAttrs(attrs) {\n\t iframe.removeAttribute('style');\n\t iframe.removeAttribute('height');\n\t var attributes = _objectSpread(_objectSpread({}, defaultAttributes), attrs);\n\t Object.keys(attributes).forEach(function (item) {\n\t iframe.setAttribute(item, attributes[item]);\n\t });\n\t };\n\t var updateIframeStyles = function updateIframeStyles(styles) {\n\t var css = _objectSpread(_objectSpread({}, defaultCSS), styles);\n\t Object.keys(css).forEach(function (item) {\n\t iframe.style[item] = css[item];\n\t });\n\t };\n\t var createIframe = function createIframe(onIframeLoadCallback, styles, attrs) {\n\t src_log.debug('Creating iframe');\n\t if (document.querySelector(\"#\".concat(defaultAttributes.id))) {\n\t src_log.error('Iframe already added');\n\t return;\n\t }\n\t iframe = src_protectedApi.createElement('iframe');\n\t iframe.addEventListener('load', function () {\n\t onIframeLoadCallback();\n\t updateIframeAttrs(attrs);\n\t updateIframeStyles(styles);\n\t });\n\t iframeElement = iframe;\n\t var adgStylesSelector = src_protectedApi.createStylesElement(CSS.selector, 'adg-styles-selector');\n\t if (adgStylesSelector) {\n\t document.documentElement.appendChild(adgStylesSelector);\n\t }\n\t document.documentElement.appendChild(iframeElement);\n\t };\n\t var appendContent = function appendContent(view) {\n\t var body = iframe.contentDocument.body;\n\t for (var i = 0; i < body.children.length; i += 1) {\n\t body.removeChild(body.children[i]);\n\t }\n\t body.appendChild(view);\n\t };\n\t var localize = function localize() {\n\t var elements = iframe.contentDocument.querySelectorAll('[i18n]');\n\t for (var i = 0; i < elements.length; i += 1) {\n\t var message = src_localization.getMessage(elements[i].getAttribute('i18n'));\n\t src_localization.translateElement(elements[i], message);\n\t }\n\t var elementsWithTitle = iframe.contentDocument.querySelectorAll('[i18n-title]');\n\t for (var j = 0; j < elementsWithTitle.length; j += 1) {\n\t var title = src_localization.getMessage(elementsWithTitle[j].getAttribute('i18n-title'));\n\t elementsWithTitle[j].setAttribute('title', title);\n\t }\n\t };\n\t var hideIframe = function hideIframe() {\n\t if (iframe) {\n\t iframe.style.display = 'none';\n\t }\n\t };\n\t var showIframe = function showIframe() {\n\t if (iframe) {\n\t iframe.style.display = 'block';\n\t }\n\t };\n\t var showMenuItem = function showMenuItem(viewName, controller, options, styles, attrs) {\n\t if (currentItem === viewName) {\n\t return;\n\t }\n\t var onIframeLoad = function onIframeLoad() {\n\t var frameElement = iframe;\n\t var view = src_protectedApi.createElement(views[viewName]);\n\t var iframeStyles = CSS.common + CSS.mobile;\n\t view.appendChild(src_protectedApi.createStylesElement(iframeStyles));\n\t appendContent(view);\n\t localize();\n\t if (!options) {\n\t options = {};\n\t }\n\t if (controller) {\n\t controller.init(frameElement, options);\n\t }\n\t updateIframeAttrs(attrs);\n\t updateIframeStyles(styles);\n\t currentItem = viewName;\n\t onShowMenuItem.notify();\n\t showIframe();\n\t };\n\t if (!iframe) {\n\t var adgStylesSelector = src_protectedApi.createStylesElement(CSS.selector, 'adg-styles-selector');\n\t if (adgStylesSelector) {\n\t document.documentElement.appendChild(adgStylesSelector);\n\t }\n\t createIframe(onIframeLoad, styles, attrs);\n\t return;\n\t }\n\t onIframeLoad();\n\t };\n\t var startSelect = function startSelect() {\n\t hideIframe();\n\t var controller = new SelectorMenuController(src_ioc.get('iframeController'));\n\t controller.startSelector();\n\t };\n\t var showSelectorMenu = function showSelectorMenu() {\n\t hideIframe();\n\t adguard_selector.close();\n\t var styles = {\n\t position: 'fixed',\n\t left: 0,\n\t top: 0,\n\t right: 0,\n\t bottom: 0,\n\t margin: 'auto',\n\t 'border-radius': '2px',\n\t background: 'transparent',\n\t width: '40vmax',\n\t height: '40vmax'\n\t };\n\t showMenuItem('mobilePopup.html', mobilePopupButtonsInit(), null, styles);\n\t };\n\t var removeIframe = function removeIframe(e) {\n\t if (e && e.isTrusted === false) {\n\t return false;\n\t }\n\t if (!iframeElement) {\n\t return false;\n\t }\n\t document.removeEventListener('click', removeIframe);\n\t window.removeEventListener('orientationchange', showSelectorMenu);\n\t document.documentElement.removeChild(iframeElement);\n\t iframe = null;\n\t iframeElement = null;\n\t currentItem = null;\n\t adguard_selector.close();\n\t onCloseMenu.notify();\n\t return undefined;\n\t };\n\t var mobilePopupButtonsInit = function mobilePopupButtonsInit() {\n\t return {\n\t init: function init() {\n\t var startSelectMode = iframe.contentDocument.querySelector('.start-select-mode');\n\t var cancelSelectMode = iframe.contentDocument.querySelector('.cancel-select-mode');\n\t var appVersionElem = iframe.contentDocument.querySelector('#appVersion');\n\t startSelectMode.addEventListener('click', startSelect);\n\t cancelSelectMode.addEventListener('click', removeIframe);\n\t appVersionElem.innerText = \"v\".concat(package_namespaceObject.i8);\n\t }\n\t };\n\t };\n\t var showSliderMenu = function showSliderMenu(element) {\n\t var controller = new SliderMenuControllerMobile(src_ioc.get('addRule'), src_ioc.get('iframeController'));\n\t var options = {\n\t element: element\n\t };\n\t var styles = {\n\t position: 'fixed',\n\t bottom: 0,\n\t left: '50%',\n\t transform: 'translateX(-50%)',\n\t width: '70vw',\n\t height: '27vw'\n\t };\n\t showMenuItem('mobileMenu.html', controller, options, styles);\n\t };\n\t return {\n\t showSelectorMenu: showSelectorMenu,\n\t showSliderMenu: showSliderMenu,\n\t onCloseMenu: onCloseMenu,\n\t onShowMenuItem: onShowMenuItem,\n\t removeIframe: removeIframe,\n\t startSelect: startSelect\n\t };\n\t}\n\tfunction adguardAssistantExtended() {\n\t var adguardSettings = typeof AdguardSettings === 'undefined' ? null : AdguardSettings;\n\t src_wot.registerWotEventHandler();\n\t src_settings.setAdguardSettings(adguardSettings);\n\t var iframeController = new iframe();\n\t src_ioc.register('iframeController', iframeController);\n\t return {\n\t start: function start(element, callback) {\n\t src_ioc.register('addRule', src_protectedApi.functionBind.call(callback, this));\n\t if (element) {\n\t iframeController.showSelectorMenu();\n\t iframeController.showSliderMenu(element);\n\t } else {\n\t iframeController.showSelectorMenu();\n\t }\n\t },\n\t close: function close() {\n\t iframeController.removeIframe();\n\t }\n\t };\n\t}\n\tfunction adguardAssistantMini() {\n\t var iframeController = new IframeControllerMobile();\n\t src_ioc.register('iframeController', iframeController);\n\t return {\n\t start: function start(element, callback) {\n\t src_ioc.register('addRule', src_protectedApi.functionBind.call(callback, this));\n\t if (element) {\n\t iframeController.showSelectorMenu();\n\t iframeController.showSliderMenu(element);\n\t } else {\n\t iframeController.showSelectorMenu();\n\t }\n\t },\n\t close: function close() {\n\t iframeController.removeIframe();\n\t }\n\t };\n\t}\n\tvar mobileReg = /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i;\n\tvar isMobile = function isMobile(ua) {\n\t return mobileReg.test(ua);\n\t};\n\tvar adguardAssistant = isMobile(navigator.userAgent) ? adguardAssistantMini : adguardAssistantExtended;\n\t})();\n\t \treturn __webpack_exports__;\n\t })()\n\t;\n\t}); \n} (assistant));\n\nvar assistantExports = assistant.exports;\n\n/**\n * @file\n * In this file we doing only lazy-load assistant and save it to the global\n * scope of the current content-script.\n */\nif (!window.adguardAssistant) {\n window.adguardAssistant = assistantExports.adguardAssistant();\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\nimport \"@adguard/tswebextension/assistant-inject\";\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/packages/adguard-api/dist/adguard-content.js b/packages/adguard-api/dist/adguard-content.js index c051351a7..39e361955 100644 --- a/packages/adguard-api/dist/adguard-content.js +++ b/packages/adguard-api/dist/adguard-content.js @@ -11,7 +11,7 @@ return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ -/***/ 2565: +/***/ 554: /***/ (function(module, exports) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) { @@ -1357,10 +1357,10 @@ var __webpack_exports__ = {}; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); -// EXTERNAL MODULE: ../../node_modules/webextension-polyfill/dist/browser-polyfill.js -var browser_polyfill = __webpack_require__(2565); +// EXTERNAL MODULE: ../tswebextension/node_modules/webextension-polyfill/dist/browser-polyfill.js +var browser_polyfill = __webpack_require__(554); var browser_polyfill_default = /*#__PURE__*/__webpack_require__.n(browser_polyfill); -;// CONCATENATED MODULE: ../../node_modules/@adguard/extended-css/dist/extended-css.esm.js +;// CONCATENATED MODULE: ../tswebextension/node_modules/@adguard/extended-css/dist/extended-css.esm.js /** * @adguard/extended-css - v2.0.52 - Fri Apr 14 2023 * https://github.com/AdguardTeam/ExtendedCss#homepage @@ -8412,6 +8412,7 @@ CssHitsCounter.CONTENT_ATTR_PREFIX = 'adguard'; CssHitsCounter.COUNT_ALL_CSS_HITS_TIMEOUT_MS = 500; var RequestType = { + NotSet: 0, Document: 1, SubDocument: 2, Script: 4, @@ -8426,25 +8427,115 @@ var RequestType = { Other: 2048, }; +/** + * Css, injected to broken element for hiding. + */ +// eslint-disable-next-line max-len +const HIDING_STYLE = '{ display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important; }'; +/** + * Creates hiding css rule for specified tag with src attribute. + * + * @param tag Element tag for css selector. + * @param src `src` attribute value for css selector. If value is the empty string + * then the selector does not represent anything. + * @param matching Attribute matching type. Currently support strict (=) and suffix ($=) matching. + * Default to strict. + * + * @returns Css rule text. + */ +function createHidingCssRule(tag, src, matching = "=" /* AttributeMatching.Strict */) { + return `${tag}[src${matching}"${src}"] ${HIDING_STYLE}\n`; +} + /** * Hides broken items after blocking a network request. */ class ElementCollapser { /** - * Start listening for error events. + * Creates new element collapser. + */ + constructor() { + this.shouldCollapseElement = this.shouldCollapseElement.bind(this); + } + /** + * Starts listening for error events. */ - static start() { - document.addEventListener('error', ElementCollapser.shouldCollapseElement, true); + start() { + document.addEventListener('error', this.shouldCollapseElement, true); // We need to listen for load events to hide blocked iframes (they don't raise error event) - document.addEventListener('load', ElementCollapser.shouldCollapseElement, true); + document.addEventListener('load', this.shouldCollapseElement, true); } /** - * Stop listening for error events. + * Stops listening for error events. */ - static stop() { - document.removeEventListener('error', ElementCollapser.shouldCollapseElement, true); + stop() { + document.removeEventListener('error', this.shouldCollapseElement, true); // We need to listen for load events to hide blocked iframes (they don't raise error event) - document.removeEventListener('load', ElementCollapser.shouldCollapseElement, true); + document.removeEventListener('load', this.shouldCollapseElement, true); + } + /** + * Appends Css rule to {@link #styleNode} sheet. + * + * @param rule - Css rule text. + */ + appendCssRule(rule) { + if (!this.styleNode) { + this.styleNode = document.createElement('style'); + this.styleNode.setAttribute('type', 'text/css'); + (document.head || document.documentElement).appendChild(this.styleNode); + } + if (this.styleNode.sheet) { + this.styleNode.sheet.insertRule(rule, this.styleNode.sheet.cssRules.length); + } + } + /** + * Checks if element should be collapsed by requirements. + * + * @param event Error or load event. + */ + shouldCollapseElement(event) { + return __awaiter(this, void 0, void 0, function* () { + const eventType = event.type; + const element = event.target; + const tagName = element.tagName.toLowerCase(); + const expectedEventType = (tagName === 'iframe' + || tagName === 'frame' + || tagName === 'embed') ? 'load' : 'error'; + if (eventType !== expectedEventType) { + return; + } + const requestType = ElementCollapser.getRequestTypeByInitiatorTagName(element.localName); + if (!requestType) { + return; + } + const elementUrl = ElementCollapser.getElementUrl(element); + if (!elementUrl) { + return; + } + if (ElementCollapser.isElementCollapsed(element)) { + return; + } + const payload = { + elementUrl, + documentUrl: document.URL, + requestType, + }; + const shouldCollapse = yield sendAppMessage({ + type: MessageType.ProcessShouldCollapse, + payload, + }); + if (!shouldCollapse) { + return; + } + const srcAttribute = element.getAttribute('src'); + if (srcAttribute) { + const rule = createHidingCssRule(tagName, CSS.escape(srcAttribute)); + this.appendCssRule(rule); + } + else { + element.setAttribute('style', HIDING_STYLE); + } + }); } /** * Returns request type by tag name. @@ -8507,48 +8598,6 @@ class ElementCollapser { const computedStyle = window.getComputedStyle(element); return (computedStyle && computedStyle.display === 'none'); } - /** - * Checks if element should be collapsed by requirements. - * - * @param event Error or load event. - */ - static shouldCollapseElement(event) { - return __awaiter(this, void 0, void 0, function* () { - const eventType = event.type; - const element = event.target; - const tagName = element.tagName.toLowerCase(); - const expectedEventType = (tagName === 'iframe' - || tagName === 'frame' - || tagName === 'embed') ? 'load' : 'error'; - if (eventType !== expectedEventType) { - return; - } - const requestType = ElementCollapser.getRequestTypeByInitiatorTagName(element.localName); - if (!requestType) { - return; - } - const elementUrl = ElementCollapser.getElementUrl(element); - if (!elementUrl) { - return; - } - if (ElementCollapser.isElementCollapsed(element)) { - return; - } - const payload = { - elementUrl, - documentUrl: document.URL, - requestType, - }; - const shouldCollapse = yield sendAppMessage({ - type: MessageType.ProcessShouldCollapse, - payload, - }); - if (!shouldCollapse) { - return; - } - element.setAttribute('style', 'display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important;'); - }); - } } /** @@ -8570,7 +8619,8 @@ class CosmeticController { * Init cosmetic processing. */ init() { - ElementCollapser.start(); + const elementCollapser = new ElementCollapser(); + elementCollapser.start(); this.process(); } /** diff --git a/packages/adguard-api/dist/adguard-content.js.map b/packages/adguard-api/dist/adguard-content.js.map index cf7f196b8..b367d13c7 100644 --- a/packages/adguard-api/dist/adguard-content.js.map +++ b/packages/adguard-api/dist/adguard-content.js.map @@ -1 +1 @@ -{"version":3,"file":"adguard-content.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;ACVA;AACA,MAAM,IAA0C;AAChD,IAAI,iCAAgC,CAAC,MAAQ,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AACxD,IAAI,KAAK,YAQN;AACH,CAAC;AACD;;AAEA,sCAAsC;;AAEtC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wHAAwH;AACxH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB,SAAS;AAC5B;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA,iDAAiD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC5I;;AAEA;AACA,gDAAgD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC3I;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB,gCAAgC,MAAM;AACtC,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA,6DAA6D,gBAAgB;AAC7E;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,mBAAmB;AACnB;;AAEA,+CAA+C,eAAe;AAC9D;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA,eAAe;AACf;AACA;;AAEA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA,WAAW;;AAEX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oCAAoC;AACrD;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;;AAGA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,GAAG;AACtB;AACA,mBAAmB,QAAQ;AAC3B;AACA,mBAAmB,aAAa;AAChC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA,0EAA0E;AAC1E;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA,aAAa;AACb,aAAa;AACb;AACA;;;AAGA;AACA;AACA,YAAY;AACZ;AACA,YAAY;;;AAGZ;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,+CAA+C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC1I;;AAEA;AACA,8CAA8C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AACzI;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,IAAI;AACJ;AACA;AACA,CAAC;AACD;;;;;;;UCpvCA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;;AAEpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,wEAAwE;AACjF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,0BAA0B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,0BAA0B;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C,UAAU;AACpD,0CAA0C,UAAU;AACpD,aAAa,KAAK,GAAG,MAAM;AAC3B,GAAG;AACH;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,oBAAoB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,kMAAkM;AAClM;;AAEA;AACA,kEAAkE,SAAS;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,GAAG;;AAEZ;AACA,QAAQ;;;AAGR;AACA;AACA;AACA,OAAO;AACP;AACA,MAAM;;;AAGN;AACA,GAAG,GAAG;;AAEN;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oEAAoE,MAAM;AAC1E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+DAA+D,6BAA6B;AAC5F;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA,0DAA0D,gBAAgB;AAC1E,mDAAmD,4BAA4B,kBAAkB,WAAW;AAC5G,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;;AAGA,qEAAqE;;AAErE;AACA;AACA;AACA,oHAAoH;AACpH;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB,sCAAsC,oBAAoB;AAC3G;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,wBAAwB,sCAAsC,WAAW;AAClG;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA,gEAAgE;;AAEhE,qHAAqH;AACrH;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;;;AAGA,yBAAyB,wBAAwB;AACjD,IAAI;AACJ;AACA;;;AAGA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oDAAoD,QAAQ;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kEAAkE,SAAS;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mCAAmC,KAAK,SAAS;AAC1E,MAAM;AACN;AACA;;;AAGA,2CAA2C;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mCAAmC,eAAe,yDAAyD,0CAA0C;AACrJ,MAAM;AACN;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;;AAEA;;AAEA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,sCAAsC,MAAM,EAAE,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA;AACA,+GAA+G;;AAE/G;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA,QAAQ;AACR;;;AAGA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6DAA6D;;AAE7D,oCAAoC,MAAM,EAAE,WAAW,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,0BAA0B;AACxI,uCAAuC,sCAAsC,EAAE,qBAAqB;AACpG;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,sBAAsB,uBAAuB,EAAE,MAAM,EAAE,sBAAsB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,yDAAyD;;AAEzD;AACA,wBAAwB;;AAExB;AACA,oHAAoH;;AAEpH;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,8CAA8C;;AAE9C,iFAAiF;AACjF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,iEAAiE;;AAEjE;AACA,yEAAyE;AACzE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA,MAAM,SAAS;;AAEf;AACA;AACA,kGAAkG;AAClG;AACA;AACA;;AAEA;AACA,0HAA0H;AAC1H;AACA;;AAEA;AACA;AACA,8GAA8G;AAC9G;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,+BAA+B,2BAA2B,KAAK,SAAS;AACxE;;AAEA,gEAAgE;;AAEhE,sEAAsE;AACtE;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA,wFAAwF;;AAExF;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C,cAAc;AACd;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,eAAe;AAC7E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS;AAC7C,gBAAgB;AAChB;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS;AAC7C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,+BAA+B;AAC/B,oCAAoC,SAAS;AAC7C,gBAAgB;;;AAGhB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,qDAAqD;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,wDAAwD;;AAExD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS,oCAAoC,WAAW,WAAW,yBAAyB;AAChI,gBAAgB;AAChB;;;AAGA;AACA,yDAAyD;;AAEzD;AACA,gBAAgB;;;AAGhB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC,2BAA2B,KAAK,SAAS;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mCAAmC,0BAA0B,UAAU,eAAe;AACtF,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;;;AAGhB;AACA;;AAEA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;;AAEA,gEAAgE;;AAEhE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,8EAA8E,SAAS;AACvF,gBAAgB;AAChB;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mCAAmC,mCAAmC,KAAK,SAAS;AACpF,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0FAA0F,SAAS;AACnG,gBAAgB;AAChB;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,qFAAqF,SAAS;AAC9F,gBAAgB;AAChB;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA,uDAAuD;AACvD;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF;AACrF;AACA,gBAAgB;AAChB;AACA;AACA,sEAAsE;;AAEtE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uDAAuD;;AAEvD;AACA;;AAEA;AACA;AACA;AACA,sEAAsE,SAAS;AAC/E,kBAAkB;AAClB;;;AAGA;AACA;AACA;AACA;AACA;AACA,+CAA+C,qBAAqB,oEAAoE,mBAAmB;AAC3J;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,SAAS;;AAEzC;AACA;AACA;AACA,qDAAqD,iBAAiB;AACtE;AACA;AACA;AACA,cAAc;AACd;AACA,kCAAkC,SAAS;AAC3C;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD,WAAW;AAC9D;;AAEA;AACA;;AAEA;AACA,wBAAwB,SAAS;AACjC;;AAEA;AACA;AACA,uEAAuE,0CAA0C;AACjH;;AAEA;AACA,mEAAmE,SAAS;AAC5E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,UAAU,IAAI,gCAAgC;AAC7D,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA,sBAAsB,MAAM;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,IAAI;AACtC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iDAAiD,EAAE;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,0BAA0B,EAAE,OAAO,EAAE;AACrC,uCAAuC;AACvC;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;AACA,0CAA0C,KAAK;AAC/C,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4EAA4E,WAAW,WAAW,OAAO;AACzG,IAAI;;;AAGJ;AACA;AACA;AACA;AACA,8BAA8B,MAAM,EAAE,MAAM,EAAE,qBAAqB;AACnE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;;AAEJ;AACA,sEAAsE,WAAW,WAAW,cAAc;AAC1G;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,4CAA4C,WAAW,oBAAoB,cAAc;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,0CAA0C,OAAO;AACjD;AACA,IAAI;AACJ;AACA;AACA,+DAA+D,OAAO;AACtE;;AAEA;AACA;AACA,IAAI;AACJ;AACA,4CAA4C,OAAO;AACnD;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,8DAA8D,YAAY,OAAO,UAAU;AAC3F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,mDAAmD;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+EAA+E,MAAM;;AAErF;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,+BAA+B;AAC/B,0BAA0B,IAAI;;AAE9B,2BAA2B,MAAM;AACjC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,wDAAwD,MAAM;AAC9D;;AAEA;AACA;AACA;AACA,wCAAwC,QAAQ,yBAAyB,MAAM;AAC/E;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA,mDAAmD,QAAQ,uBAAuB,MAAM;AACxF;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA,IAAI;AACJ;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI,6CAA6C;AACjD;;AAEA;AACA,gCAAgC,YAAY,gBAAgB,gBAAgB;AAC5E;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,wBAAwB;AAC9C;;AAEA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN,8CAA8C,WAAW,mBAAmB,UAAU;AACtF;;AAEA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,YAAY,iBAAiB,OAAO;AAChF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kDAAkD,WAAW,gCAAgC,IAAI;AACjG;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,YAAY,+BAA+B,EAAE,SAAS,oBAAoB,WAAW,wBAAwB,UAAU;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wDAAwD,WAAW;AACnE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,uEAAuE,aAAa;AACpF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,aAAa;AACjF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B,uBAAuB,EAAE,iBAAiB;AACzE;AACA;AACA;;AAEA,4BAA4B,uBAAuB,EAAE,sBAAsB;AAC3E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,WAAW;AACnG,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,6BAA6B,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB;AACzF,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB,EAAE,SAAS;AACzD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB,EAAE,gBAAgB;AAChE;AACA;;AAEA;AACA,uCAAuC,WAAW;AAClD;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN,wCAAwC;;AAExC,+CAA+C,WAAW,oBAAoB,gBAAgB;AAC9F;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4DAA4D,WAAW;AACvE;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,oBAAoB,EAAE,sCAAsC;AAC7F;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;;;AAGA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4DAA4D,WAAW;AACvE;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,oBAAoB,EAAE,sCAAsC;AAC7F;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,wCAAwC;;AAExC,+CAA+C,WAAW,oBAAoB,sCAAsC;AACpH,MAAM;AACN;AACA;;;AAGA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,wBAAwB;AAC1D;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,mDAAmD,aAAa,MAAM,mBAAmB;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,wFAAwF,WAAW;;AAEnG;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR,gDAAgD,WAAW,oBAAoB,kBAAkB;AACjG;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA,2DAA2D,WAAW;AACtE;;AAEA;AACA,IAAI;AACJ;AACA,uDAAuD,WAAW;AAClE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC,uBAAuB,EAAE,MAAM;AAClE;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,oBAAoB,EAAE,oBAAoB,EAAE,MAAM;AACrF;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,mCAAmC,iBAAiB,EAAE,kCAAkC;AACxF;AACA,KAAK;AACL,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA,GAAG,GAAG;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,0BAA0B,GAAG;;AAExH,mCAAmC,MAAM,EAAE,qBAAqB,EAAE,yBAAyB;AAC3F;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,uCAAuC,KAAK,YAAY;AAC/E,IAAI;AACJ;AACA;AACA;AACA,yBAAyB,mCAAmC,KAAK,YAAY;AAC7E,MAAM;AACN;AACA;AACA,yBAAyB,qCAAqC,KAAK,YAAY;AAC/E,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB,mCAAmC,KAAK,YAAY;AAC3E,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,uBAAuB,wBAAwB,KAAK,SAAS;AAC7D;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,uBAAuB,mCAAmC,KAAK,SAAS;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,2DAA2D,SAAS;AACpE;;AAEA;AACA,oDAAoD,SAAS;AAC7D;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,2DAA2D,SAAS;AACpE;;AAEA;AACA,8DAA8D,SAAS;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8EAA8E;AAC9E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,4EAA4E,QAAQ;AACpF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,GAAG,GAAG;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,gCAAgC;AAChC,mEAAmE,WAAW;AAC9E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,SAAS;AAChD,gFAAgF,WAAW;AAC3F,UAAU;;;AAGV,gEAAgE;;AAEhE,qDAAqD;AACrD,QAAQ,wDAAwD;AAChE;AACA;AACA,sEAAsE,WAAW;AACjF;;AAEA;;AAEA;AACA,gEAAgE,WAAW,qBAAqB,WAAW;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB,qBAAqB,WAAW;AACtH,UAAU;AACV;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,eAAe;AACf,kCAAkC;AAClC;AACA,UAAU;AACV;AACA;AACA,iCAAiC;;AAEjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,+DAA+D,uBAAuB,qBAAqB,WAAW;AACtH,UAAU;AACV;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;;AAGA;;AAEA;AACA,6DAA6D,WAAW;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AAC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C7E;;AAEA;AACA;AACA;AACA,KAAK,GAAG,6BAA6B;AACrC,eAAe,eAAe,UAAU;;AAExC;AACA;AACA;AACA,IAAI,0CAA0C;AAC9C;;;AAGA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,iEAAiE;;AAEjE;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gCAAgC;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,uDAAuD;AACvD;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA,6BAA6B,MAAM,EAAE,SAAS,6BAA6B,SAAS,EAAE,MAAM;AAC5F,uBAAuB,+BAA+B,kBAAkB,WAAW;AACnF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA,0EAA0E;AAC1E,iBAAiB,gBAAgB;;AAEjC;AACA,2BAA2B,+BAA+B,KAAK,mBAAmB;AAClF;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA,6DAA6D;;AAE7D;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,sDAAsD,YAAY;;AAElE;AACA;AACA,MAAM;AACN;;AAEA;AACA,oDAAoD;AACpD,kCAAkC,cAAc;;AAEhD,mKAAmK;;AAEnK;AACA,6BAA6B;;AAE7B,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,gBAAgB,wCAAwC,wCAAwC;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA,YAAY,eAAe;AAC3B;AACA,YAAY,mBAAmB;AAC/B,gBAAgB,wCAAwC;AACxD;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,uMAAuM;AACvM;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,mCAAmC;AAChD;AACA;AACA;;;AAGA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,oBAAoB,kCAAkC;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;;AAGJ;;AAEA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,wDAAwD;;AAExD,kFAAkF;;AAElF;AACA,yEAAyE,gBAAgB;AACzF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;;;AAGA;AACA;AACA,QAAQ;;;AAGR;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA,0EAA0E;AAC1E,4BAA4B,aAAa;;AAEzC;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA,qEAAqE,SAAS;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,YAAY;AAClB,4BAA4B,aAAa;AACzC;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,YAAY;AACpB,8BAA8B,aAAa;;AAE3C;AACA,6EAA6E,SAAS;AACtF;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA,qCAAqC;AACrC,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,IAAI;;;AAGJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,mCAAmC,cAAc;AACjD;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA;AACA,GAAG,GAAG;;AAEN,mDAAmD;;AAEnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;;AAGJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA,MAAM;AACN;AACA;;;AAGA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,iIAAiI,mBAAmB;AACpJ;AACA;;AAEA;AACA;AACA,MAAM;AACN;;;AAGA;AACA;AACA,KAAK;;AAEL;AACA;AACA,8GAA8G,uCAAuC;AACrJ;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA,SAAS,uBAAuB;AAChC;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA,8CAA8C,kCAAkC;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,iDAAiD,cAAc,OAAO,mBAAmB;AACzF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEuB;;;ACvoMqB;AACQ;;AAEpD;AACA,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,8CAA2B,iBAAiB,mCAAmC;AAC1F,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,WAAW;AACzC,2BAA2B,SAAS,SAAS;AAC7C,2BAA2B,UAAU,SAAS;AAC9C,wBAAwB;AACxB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB,WAAW,SAAS;AACzF,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB,WAAW,UAAU,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,uBAAuB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sCAAsC;AACtE;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,oEAAoE,8BAA8B,uBAAuB,0BAA0B;AACnJ,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA,sBAAsB,mCAAmC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mCAAmC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,mCAAmC;AACnD;AACA,WAAW,iCAAiC;AAC5C,sBAAsB,0CAA0C;AAChE,2CAA2C;AAC3C,mBAAmB,sBAAsB,IAAI,0CAA0C;AACvF;AACA;AACA;AACA;AACA,gBAAgB,oDAAoD;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA,mBAAmB,wBAAwB,KAAK,mBAAmB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,sBAAsB,mCAAmC;AACzD;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,wDAAqC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB;AACpD,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,6DAA6D,8EAA8E;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE0D;;;AC9mC3D;;;;;;;;;;;;;;;;CAgBC,GAE+C","sources":["webpack://@adguard/api/webpack/universalModuleDefinition","webpack://@adguard/api/../../node_modules/webextension-polyfill/dist/browser-polyfill.js","webpack://@adguard/api/webpack/bootstrap","webpack://@adguard/api/webpack/runtime/compat get default export","webpack://@adguard/api/webpack/runtime/define property getters","webpack://@adguard/api/webpack/runtime/hasOwnProperty shorthand","webpack://@adguard/api/webpack/runtime/make namespace object","webpack://@adguard/api/../../node_modules/@adguard/extended-css/dist/extended-css.esm.js","webpack://@adguard/api/../tswebextension/dist/content-script.js","webpack://@adguard/api/./src/content-script/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */\n\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n\n /* vim: set sts=2 sw=2 et tw=80: */\n\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!globalThis.chrome?.runtime?.id) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n\n if (typeof globalThis.browser === \"undefined\" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n\n\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n\n return super.get(key);\n }\n\n }\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n\n\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n\n\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n\n\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args); // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n\n\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n\n });\n };\n\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy}\n */\n\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n\n if (!(prop in target)) {\n return undefined;\n }\n\n let value = target[prop];\n\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n\n get() {\n return target[prop];\n },\n\n set(value) {\n target[prop] = value;\n }\n\n });\n return value;\n }\n\n cache[prop] = value;\n return value;\n },\n\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n\n return true;\n },\n\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n\n }; // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n\n\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n\n });\n\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n\n\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {}\n /* wrappers */\n , {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n\n\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n\n const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n } // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n\n\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n }; // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n\n\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n } // Let Chrome know that the listener is replying.\n\n\n return true;\n };\n });\n\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n }; // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n\n\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @adguard/extended-css - v2.0.52 - Fri Apr 14 2023\n * https://github.com/AdguardTeam/ExtendedCss#homepage\n * Copyright (c) 2023 AdGuard. Licensed GPL-3.0\n */\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\n/**\n * Possible ast node types.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\nconst NODE = {\n SELECTOR_LIST: 'SelectorList',\n SELECTOR: 'Selector',\n REGULAR_SELECTOR: 'RegularSelector',\n EXTENDED_SELECTOR: 'ExtendedSelector',\n ABSOLUTE_PSEUDO_CLASS: 'AbsolutePseudoClass',\n RELATIVE_PSEUDO_CLASS: 'RelativePseudoClass'\n};\n\n/**\n * Class needed for creating ast nodes while selector parsing.\n * Used for SelectorList, Selector, ExtendedSelector.\n */\nclass AnySelectorNode {\n /**\n * Creates new ast node.\n *\n * @param type Ast node type.\n */\n constructor(type) {\n _defineProperty(this, \"children\", []);\n\n this.type = type;\n }\n /**\n * Adds child node to children array.\n *\n * @param child Ast node.\n */\n\n\n addChild(child) {\n this.children.push(child);\n }\n\n}\n/**\n * Class needed for creating RegularSelector ast node while selector parsing.\n */\n\nclass RegularSelectorNode extends AnySelectorNode {\n /**\n * Creates RegularSelector ast node.\n *\n * @param value Value of RegularSelector node.\n */\n constructor(value) {\n super(NODE.REGULAR_SELECTOR);\n this.value = value;\n }\n\n}\n/**\n * Class needed for creating RelativePseudoClass ast node while selector parsing.\n */\n\nclass RelativePseudoClassNode extends AnySelectorNode {\n /**\n * Creates RegularSelector ast node.\n *\n * @param name Name of RelativePseudoClass node.\n */\n constructor(name) {\n super(NODE.RELATIVE_PSEUDO_CLASS);\n this.name = name;\n }\n\n}\n/**\n * Class needed for creating AbsolutePseudoClass ast node while selector parsing.\n */\n\nclass AbsolutePseudoClassNode extends AnySelectorNode {\n /**\n * Creates AbsolutePseudoClass ast node.\n *\n * @param name Name of AbsolutePseudoClass node.\n */\n constructor(name) {\n super(NODE.ABSOLUTE_PSEUDO_CLASS);\n\n _defineProperty(this, \"value\", '');\n\n this.name = name;\n }\n\n}\n/* eslint-disable jsdoc/require-description-complete-sentence */\n\n/**\n * Root node.\n *\n * SelectorList\n * : Selector\n * ...\n * ;\n */\n\n/**\n * Selector node.\n *\n * Selector\n * : RegularSelector\n * | ExtendedSelector\n * ...\n * ;\n */\n\n/**\n * Regular selector node.\n * It can be selected by querySelectorAll().\n *\n * RegularSelector\n * : type\n * : value\n * ;\n */\n\n/**\n * Extended selector node.\n *\n * ExtendedSelector\n * : AbsolutePseudoClass\n * | RelativePseudoClass\n * ;\n */\n\n/**\n * Absolute extended pseudo-class node,\n * i.e. none-selector args.\n *\n * AbsolutePseudoClass\n * : type\n * : name\n * : value\n * ;\n */\n\n/**\n * Relative extended pseudo-class node\n * i.e. selector as arg.\n *\n * RelativePseudoClass\n * : type\n * : name\n * : SelectorList\n * ;\n */\n//\n// ast example\n//\n// div.banner > div:has(span, p), a img.ad\n//\n// SelectorList - div.banner > div:has(span, p), a img.ad\n// Selector - div.banner > div:has(span, p)\n// RegularSelector - div.banner > div\n// ExtendedSelector - :has(span, p)\n// PseudoClassSelector - :has\n// SelectorList - span, p\n// Selector - span\n// RegularSelector - span\n// Selector - p\n// RegularSelector - p\n// Selector - a img.ad\n// RegularSelector - a img.ad\n//\n\nconst LEFT_SQUARE_BRACKET = '[';\nconst RIGHT_SQUARE_BRACKET = ']';\nconst LEFT_PARENTHESIS = '(';\nconst RIGHT_PARENTHESIS = ')';\nconst LEFT_CURLY_BRACKET = '{';\nconst RIGHT_CURLY_BRACKET = '}';\nconst BRACKET = {\n SQUARE: {\n LEFT: LEFT_SQUARE_BRACKET,\n RIGHT: RIGHT_SQUARE_BRACKET\n },\n PARENTHESES: {\n LEFT: LEFT_PARENTHESIS,\n RIGHT: RIGHT_PARENTHESIS\n },\n CURLY: {\n LEFT: LEFT_CURLY_BRACKET,\n RIGHT: RIGHT_CURLY_BRACKET\n }\n};\nconst SLASH = '/';\nconst BACKSLASH = '\\\\';\nconst SPACE = ' ';\nconst COMMA = ',';\nconst DOT = '.';\nconst SEMICOLON = ';';\nconst COLON = ':';\nconst SINGLE_QUOTE = '\\'';\nconst DOUBLE_QUOTE = '\"'; // do not consider hyphen `-` as separated mark\n// to avoid pseudo-class names splitting\n// e.g. 'matches-css' or 'if-not'\n\nconst CARET = '^';\nconst DOLLAR_SIGN = '$';\nconst EQUAL_SIGN = '=';\nconst TAB = '\\t';\nconst CARRIAGE_RETURN = '\\r';\nconst LINE_FEED = '\\n';\nconst FORM_FEED = '\\f';\nconst WHITE_SPACE_CHARACTERS = [SPACE, TAB, CARRIAGE_RETURN, LINE_FEED, FORM_FEED]; // for universal selector and attributes\n\nconst ASTERISK = '*';\nconst ID_MARKER = '#';\nconst CLASS_MARKER = DOT;\nconst DESCENDANT_COMBINATOR = SPACE;\nconst CHILD_COMBINATOR = '>';\nconst NEXT_SIBLING_COMBINATOR = '+';\nconst SUBSEQUENT_SIBLING_COMBINATOR = '~';\nconst COMBINATORS = [DESCENDANT_COMBINATOR, CHILD_COMBINATOR, NEXT_SIBLING_COMBINATOR, SUBSEQUENT_SIBLING_COMBINATOR];\nconst SUPPORTED_SELECTOR_MARKS = [LEFT_SQUARE_BRACKET, RIGHT_SQUARE_BRACKET, LEFT_PARENTHESIS, RIGHT_PARENTHESIS, LEFT_CURLY_BRACKET, RIGHT_CURLY_BRACKET, SLASH, BACKSLASH, SEMICOLON, COLON, COMMA, SINGLE_QUOTE, DOUBLE_QUOTE, CARET, DOLLAR_SIGN, ASTERISK, ID_MARKER, CLASS_MARKER, DESCENDANT_COMBINATOR, CHILD_COMBINATOR, NEXT_SIBLING_COMBINATOR, SUBSEQUENT_SIBLING_COMBINATOR, TAB, CARRIAGE_RETURN, LINE_FEED, FORM_FEED];\nconst SUPPORTED_STYLE_DECLARATION_MARKS = [// divider between property and value in declaration\nCOLON, // divider between declarations\nSEMICOLON, // sometimes is needed for value wrapping\n// e.g. 'content: \"-\"'\nSINGLE_QUOTE, DOUBLE_QUOTE, // needed for quote escaping inside the same-type quotes\nBACKSLASH, // whitespaces\nSPACE, TAB, CARRIAGE_RETURN, LINE_FEED, FORM_FEED]; // absolute:\n\nconst CONTAINS_PSEUDO = 'contains';\nconst HAS_TEXT_PSEUDO = 'has-text';\nconst ABP_CONTAINS_PSEUDO = '-abp-contains';\nconst MATCHES_CSS_PSEUDO = 'matches-css';\nconst MATCHES_CSS_BEFORE_PSEUDO = 'matches-css-before';\nconst MATCHES_CSS_AFTER_PSEUDO = 'matches-css-after';\nconst MATCHES_ATTR_PSEUDO_CLASS_MARKER = 'matches-attr';\nconst MATCHES_PROPERTY_PSEUDO_CLASS_MARKER = 'matches-property';\nconst XPATH_PSEUDO_CLASS_MARKER = 'xpath';\nconst NTH_ANCESTOR_PSEUDO_CLASS_MARKER = 'nth-ancestor';\nconst CONTAINS_PSEUDO_NAMES = [CONTAINS_PSEUDO, HAS_TEXT_PSEUDO, ABP_CONTAINS_PSEUDO];\n/**\n * Pseudo-class :upward() can get number or selector arg\n * and if the arg is selector it should be standard, not extended\n * so :upward pseudo-class is always absolute.\n */\n\nconst UPWARD_PSEUDO_CLASS_MARKER = 'upward';\n/**\n * Pseudo-class `:remove()` and pseudo-property `remove`\n * are used for element actions, not for element selecting.\n *\n * Selector text should not contain the pseudo-class\n * so selector parser should consider it as invalid\n * and both are handled by stylesheet parser.\n */\n\nconst REMOVE_PSEUDO_MARKER = 'remove'; // relative:\n\nconst HAS_PSEUDO_CLASS_MARKER = 'has';\nconst ABP_HAS_PSEUDO_CLASS_MARKER = '-abp-has';\nconst HAS_PSEUDO_CLASS_MARKERS = [HAS_PSEUDO_CLASS_MARKER, ABP_HAS_PSEUDO_CLASS_MARKER];\nconst IS_PSEUDO_CLASS_MARKER = 'is';\nconst NOT_PSEUDO_CLASS_MARKER = 'not';\nconst ABSOLUTE_PSEUDO_CLASSES = [CONTAINS_PSEUDO, HAS_TEXT_PSEUDO, ABP_CONTAINS_PSEUDO, MATCHES_CSS_PSEUDO, MATCHES_CSS_BEFORE_PSEUDO, MATCHES_CSS_AFTER_PSEUDO, MATCHES_ATTR_PSEUDO_CLASS_MARKER, MATCHES_PROPERTY_PSEUDO_CLASS_MARKER, XPATH_PSEUDO_CLASS_MARKER, NTH_ANCESTOR_PSEUDO_CLASS_MARKER, UPWARD_PSEUDO_CLASS_MARKER];\nconst RELATIVE_PSEUDO_CLASSES = [...HAS_PSEUDO_CLASS_MARKERS, IS_PSEUDO_CLASS_MARKER, NOT_PSEUDO_CLASS_MARKER];\nconst SUPPORTED_PSEUDO_CLASSES = [...ABSOLUTE_PSEUDO_CLASSES, ...RELATIVE_PSEUDO_CLASSES]; // these pseudo-classes should be part of RegularSelector value\n// if its arg does not contain extended selectors.\n// the ast will be checked after the selector is completely parsed\n\nconst OPTIMIZATION_PSEUDO_CLASSES = [NOT_PSEUDO_CLASS_MARKER, IS_PSEUDO_CLASS_MARKER];\n/**\n * ':scope' is used for extended pseudo-class :has(), if-not(), :is() and :not().\n */\n\nconst SCOPE_CSS_PSEUDO_CLASS = ':scope';\n/**\n * ':after' and ':before' are needed for :matches-css() pseudo-class\n * all other are needed for :has() limitation after regular pseudo-elements.\n *\n * @see {@link https://bugs.chromium.org/p/chromium/issues/detail?id=669058#c54} [case 3]\n */\n\nconst REGULAR_PSEUDO_ELEMENTS = {\n AFTER: 'after',\n BACKDROP: 'backdrop',\n BEFORE: 'before',\n CUE: 'cue',\n CUE_REGION: 'cue-region',\n FIRST_LETTER: 'first-letter',\n FIRST_LINE: 'first-line',\n FILE_SELECTION_BUTTON: 'file-selector-button',\n GRAMMAR_ERROR: 'grammar-error',\n MARKER: 'marker',\n PART: 'part',\n PLACEHOLDER: 'placeholder',\n SELECTION: 'selection',\n SLOTTED: 'slotted',\n SPELLING_ERROR: 'spelling-error',\n TARGET_TEXT: 'target-text'\n}; // ExtendedCss does not support at-rules\n// https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule\n\nconst AT_RULE_MARKER = '@';\nconst CONTENT_CSS_PROPERTY = 'content';\nconst PSEUDO_PROPERTY_POSITIVE_VALUE = 'true';\nconst DEBUG_PSEUDO_PROPERTY_GLOBAL_VALUE = 'global';\nconst NO_SELECTOR_ERROR_PREFIX = 'Selector should be defined';\nconst STYLE_ERROR_PREFIX = {\n NO_STYLE: 'No style declaration found',\n NO_SELECTOR: `${NO_SELECTOR_ERROR_PREFIX} before style declaration in stylesheet`,\n INVALID_STYLE: 'Invalid style declaration',\n UNCLOSED_STYLE: 'Unclosed style declaration',\n NO_PROPERTY: 'Missing style property in declaration',\n NO_VALUE: 'Missing style value in declaration',\n NO_STYLE_OR_REMOVE: 'Style should be declared or :remove() pseudo-class should used',\n NO_COMMENT: 'Comments are not supported'\n};\nconst NO_AT_RULE_ERROR_PREFIX = 'At-rules are not supported';\nconst REMOVE_ERROR_PREFIX = {\n INVALID_REMOVE: 'Invalid :remove() pseudo-class in selector',\n NO_TARGET_SELECTOR: `${NO_SELECTOR_ERROR_PREFIX} before :remove() pseudo-class`,\n MULTIPLE_USAGE: 'Pseudo-class :remove() appears more than once in selector',\n INVALID_POSITION: 'Pseudo-class :remove() should be at the end of selector'\n};\nconst MATCHING_ELEMENT_ERROR_PREFIX = 'Error while matching element';\nconst MAX_STYLE_PROTECTION_COUNT = 50;\n\n/**\n * Regexp that matches backward compatible syntaxes.\n */\n\nconst REGEXP_VALID_OLD_SYNTAX = /\\[-(?:ext)-([a-z-_]+)=([\"'])((?:(?=(\\\\?))\\4.)*?)\\2\\]/g;\n/**\n * Marker for checking invalid selector after old-syntax normalizing by selector converter.\n */\n\nconst INVALID_OLD_SYNTAX_MARKER = '[-ext-';\n/**\n * Complex replacement function.\n * Undo quote escaping inside of an extended selector.\n *\n * @param match Whole matched string.\n * @param name Group 1.\n * @param quoteChar Group 2.\n * @param rawValue Group 3.\n *\n * @returns Converted string.\n */\n\nconst evaluateMatch = (match, name, quoteChar, rawValue) => {\n // Unescape quotes\n const re = new RegExp(`([^\\\\\\\\]|^)\\\\\\\\${quoteChar}`, 'g');\n const value = rawValue.replace(re, `$1${quoteChar}`);\n return `:${name}(${value})`;\n}; // ':scope' pseudo may be at start of :has() argument\n// but ExtCssDocument.querySelectorAll() already use it for selecting exact element descendants\n\n\nconst SCOPE_MARKER_REGEXP = /\\(:scope >/g;\nconst SCOPE_REPLACER = '(>';\nconst MATCHES_CSS_PSEUDO_ELEMENT_REGEXP = /(:matches-css)-(before|after)\\(/g;\n\nconst convertMatchesCss = (match, extendedPseudoClass, regularPseudoElement) => {\n // ':matches-css-before(' --> ':matches-css(before, '\n // ':matches-css-after(' --> ':matches-css(after, '\n return `${extendedPseudoClass}${BRACKET.PARENTHESES.LEFT}${regularPseudoElement}${COMMA}`;\n};\n/**\n * Handles old syntax and :scope inside :has().\n *\n * @param selector Trimmed selector to normalize.\n *\n * @returns Normalized selector.\n * @throws An error on invalid old extended syntax selector.\n */\n\n\nconst normalize = selector => {\n const normalizedSelector = selector.replace(REGEXP_VALID_OLD_SYNTAX, evaluateMatch).replace(SCOPE_MARKER_REGEXP, SCOPE_REPLACER).replace(MATCHES_CSS_PSEUDO_ELEMENT_REGEXP, convertMatchesCss); // validate old syntax after normalizing\n // e.g. '[-ext-matches-css-before=\\'content: /^[A-Z][a-z]'\n\n if (normalizedSelector.includes(INVALID_OLD_SYNTAX_MARKER)) {\n throw new Error(`Invalid extended-css old syntax selector: '${selector}'`);\n }\n\n return normalizedSelector;\n};\n/**\n * Prepares the rawSelector before tokenization:\n * 1. Trims it.\n * 2. Converts old syntax `[-ext-pseudo-class=\"...\"]` to new one `:pseudo-class(...)`.\n * 3. Handles :scope pseudo inside :has() pseudo-class arg.\n *\n * @param rawSelector Selector with no style declaration.\n * @returns Prepared selector with no style declaration.\n */\n\n\nconst convert = rawSelector => {\n const trimmedSelector = rawSelector.trim();\n return normalize(trimmedSelector);\n};\n\n/**\n * Possible token types.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\nconst TOKEN_TYPE = {\n MARK: 'mark',\n WORD: 'word'\n};\n\n/**\n * Splits `input` string into tokens.\n *\n * @param input Input string to tokenize.\n * @param supportedMarks Array of supported marks to considered as `TOKEN_TYPE.MARK`;\n * all other will be considered as `TOKEN_TYPE.WORD`.\n *\n * @returns Array of tokens.\n */\nconst tokenize = (input, supportedMarks) => {\n // buffer is needed for words collecting while iterating\n let wordBuffer = ''; // result collection\n\n const tokens = [];\n const selectorSymbols = input.split(''); // iterate through selector chars and collect tokens\n\n selectorSymbols.forEach(symbol => {\n if (supportedMarks.includes(symbol)) {\n // if anything was collected to the buffer before\n if (wordBuffer.length > 0) {\n // now it is time to stop buffer collecting and save is as \"word\"\n tokens.push({\n type: TOKEN_TYPE.WORD,\n value: wordBuffer\n }); // reset the buffer\n\n wordBuffer = '';\n } // save current symbol as \"mark\"\n\n\n tokens.push({\n type: TOKEN_TYPE.MARK,\n value: symbol\n });\n return;\n } // otherwise collect symbol to the buffer\n\n\n wordBuffer += symbol;\n }); // save the last collected word\n\n if (wordBuffer.length > 0) {\n tokens.push({\n type: TOKEN_TYPE.WORD,\n value: wordBuffer\n });\n }\n\n return tokens;\n};\n\n/**\n * Prepares `rawSelector` and splits it into tokens.\n *\n * @param rawSelector Raw css selector.\n *\n * @returns Array of tokens supported for selector.\n */\n\nconst tokenizeSelector = rawSelector => {\n const selector = convert(rawSelector);\n return tokenize(selector, SUPPORTED_SELECTOR_MARKS);\n};\n/**\n * Splits `attribute` into tokens.\n *\n * @param attribute Input attribute.\n *\n * @returns Array of tokens supported for attribute.\n */\n\nconst tokenizeAttribute = attribute => {\n // equal sigh `=` in attribute is considered as `TOKEN_TYPE.MARK`\n return tokenize(attribute, [...SUPPORTED_SELECTOR_MARKS, EQUAL_SIGN]);\n};\n\n/**\n * Some browsers do not support Array.prototype.flat()\n * e.g. Opera 42 which is used for browserstack tests.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat}\n *\n * @param input Array needed to be flatten.\n *\n * @returns Flatten array.\n * @throws An error if array cannot be flatten.\n */\nconst flatten = input => {\n const stack = [];\n input.forEach(el => stack.push(el));\n const res = [];\n\n while (stack.length) {\n // pop value from stack\n const next = stack.pop();\n\n if (!next) {\n throw new Error('Unable to make array flat');\n }\n\n if (Array.isArray(next)) {\n // push back array items, won't modify the original input\n next.forEach(el => stack.push(el));\n } else {\n res.push(next);\n }\n } // reverse to restore input order\n\n\n return res.reverse();\n};\n/**\n * Returns first item from `array`.\n *\n * @param array Input array.\n *\n * @returns First array item, or `undefined` if there is no such item.\n */\n\nconst getFirst = array => {\n return array[0];\n};\n/**\n * Returns last item from array.\n *\n * @param array Input array.\n *\n * @returns Last array item, or `undefined` if there is no such item.\n */\n\nconst getLast = array => {\n return array[array.length - 1];\n};\n/**\n * Returns array item which is previous to the last one\n * e.g. for `[5, 6, 7, 8]` returns `7`.\n *\n * @param array Input array.\n *\n * @returns Previous to last array item, or `undefined` if there is no such item.\n */\n\nconst getPrevToLast = array => {\n return array[array.length - 2];\n};\n/**\n * Takes array of ast node `children` and returns the child by the `index`.\n *\n * @param array Array of ast node children.\n * @param index Index of needed child in the array.\n * @param errorMessage Optional error message to throw.\n *\n * @returns Array item at `index` position.\n * @throws An error if there is no child with specified `index` in array.\n */\n\nconst getItemByIndex = (array, index, errorMessage) => {\n const indexChild = array[index];\n\n if (!indexChild) {\n throw new Error(errorMessage || `No array item found by index ${index}`);\n }\n\n return indexChild;\n};\n\nconst NO_REGULAR_SELECTOR_ERROR = 'At least one of Selector node children should be RegularSelector';\n/**\n * Checks whether the type of `astNode` is SelectorList.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === SelectorList.\n */\n\nconst isSelectorListNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.SELECTOR_LIST;\n};\n/**\n * Checks whether the type of `astNode` is Selector.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === Selector.\n */\n\nconst isSelectorNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.SELECTOR;\n};\n/**\n * Checks whether the type of `astNode` is RegularSelector.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === RegularSelector.\n */\n\nconst isRegularSelectorNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.REGULAR_SELECTOR;\n};\n/**\n * Checks whether the type of `astNode` is ExtendedSelector.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === ExtendedSelector.\n */\n\nconst isExtendedSelectorNode = astNode => {\n return astNode.type === NODE.EXTENDED_SELECTOR;\n};\n/**\n * Checks whether the type of `astNode` is AbsolutePseudoClass.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === AbsolutePseudoClass.\n */\n\nconst isAbsolutePseudoClassNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.ABSOLUTE_PSEUDO_CLASS;\n};\n/**\n * Checks whether the type of `astNode` is RelativePseudoClass.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === RelativePseudoClass.\n */\n\nconst isRelativePseudoClassNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.RELATIVE_PSEUDO_CLASS;\n};\n/**\n * Returns name of `astNode`.\n *\n * @param astNode AbsolutePseudoClass or RelativePseudoClass node.\n *\n * @returns Name of `astNode`.\n * @throws An error on unsupported ast node or no name found.\n */\n\nconst getNodeName = astNode => {\n if (astNode === null) {\n throw new Error('Ast node should be defined');\n }\n\n if (!isAbsolutePseudoClassNode(astNode) && !isRelativePseudoClassNode(astNode)) {\n throw new Error('Only AbsolutePseudoClass or RelativePseudoClass ast node can have a name');\n }\n\n if (!astNode.name) {\n throw new Error('Extended pseudo-class should have a name');\n }\n\n return astNode.name;\n};\n/**\n * Returns value of `astNode`.\n *\n * @param astNode RegularSelector or AbsolutePseudoClass node.\n * @param errorMessage Optional error message if no value found.\n *\n * @returns Value of `astNode`.\n * @throws An error on unsupported ast node or no value found.\n */\n\nconst getNodeValue = (astNode, errorMessage) => {\n if (astNode === null) {\n throw new Error('Ast node should be defined');\n }\n\n if (!isRegularSelectorNode(astNode) && !isAbsolutePseudoClassNode(astNode)) {\n throw new Error('Only RegularSelector ot AbsolutePseudoClass ast node can have a value');\n }\n\n if (!astNode.value) {\n throw new Error(errorMessage || 'Ast RegularSelector ot AbsolutePseudoClass node should have a value');\n }\n\n return astNode.value;\n};\n/**\n * Returns only RegularSelector nodes from `children`.\n *\n * @param children Array of ast node children.\n *\n * @returns Array of RegularSelector nodes.\n */\n\nconst getRegularSelectorNodes = children => {\n return children.filter(isRegularSelectorNode);\n};\n/**\n * Returns the first RegularSelector node from `children`.\n *\n * @param children Array of ast node children.\n * @param errorMessage Optional error message if no value found.\n *\n * @returns Ast RegularSelector node.\n * @throws An error if no RegularSelector node found.\n */\n\n\nconst getFirstRegularChild = (children, errorMessage) => {\n const regularSelectorNodes = getRegularSelectorNodes(children);\n const firstRegularSelectorNode = getFirst(regularSelectorNodes);\n\n if (!firstRegularSelectorNode) {\n throw new Error(errorMessage || NO_REGULAR_SELECTOR_ERROR);\n }\n\n return firstRegularSelectorNode;\n};\n/**\n * Returns the last RegularSelector node from `children`.\n *\n * @param children Array of ast node children.\n *\n * @returns Ast RegularSelector node.\n * @throws An error if no RegularSelector node found.\n */\n\nconst getLastRegularChild = children => {\n const regularSelectorNodes = getRegularSelectorNodes(children);\n const lastRegularSelectorNode = getLast(regularSelectorNodes);\n\n if (!lastRegularSelectorNode) {\n throw new Error(NO_REGULAR_SELECTOR_ERROR);\n }\n\n return lastRegularSelectorNode;\n};\n/**\n * Returns the only child of `node`.\n *\n * @param node Ast node.\n * @param errorMessage Error message.\n *\n * @returns The only child of ast node.\n * @throws An error if none or more than one child found.\n */\n\nconst getNodeOnlyChild = (node, errorMessage) => {\n if (node.children.length !== 1) {\n throw new Error(errorMessage);\n }\n\n const onlyChild = getFirst(node.children);\n\n if (!onlyChild) {\n throw new Error(errorMessage);\n }\n\n return onlyChild;\n};\n/**\n * Takes ExtendedSelector node and returns its only child.\n *\n * @param extendedSelectorNode ExtendedSelector ast node.\n *\n * @returns AbsolutePseudoClass or RelativePseudoClass.\n * @throws An error if there is no specific pseudo-class ast node.\n */\n\nconst getPseudoClassNode = extendedSelectorNode => {\n return getNodeOnlyChild(extendedSelectorNode, 'Extended selector should be specified');\n};\n/**\n * Takes RelativePseudoClass node and returns its only child\n * which is relative SelectorList node.\n *\n * @param pseudoClassNode RelativePseudoClass.\n *\n * @returns Relative SelectorList node.\n * @throws An error if no selector list found.\n */\n\nconst getRelativeSelectorListNode = pseudoClassNode => {\n if (!isRelativePseudoClassNode(pseudoClassNode)) {\n throw new Error('Only RelativePseudoClass node can have relative SelectorList node as child');\n }\n\n return getNodeOnlyChild(pseudoClassNode, `Missing arg for :${getNodeName(pseudoClassNode)}() pseudo-class`);\n};\n\nconst ATTRIBUTE_CASE_INSENSITIVE_FLAG = 'i';\n/**\n * Limited list of available symbols before slash `/`\n * to check whether it is valid regexp pattern opening.\n */\n\nconst POSSIBLE_MARKS_BEFORE_REGEXP = {\n COMMON: [// e.g. ':matches-attr(/data-/)'\n BRACKET.PARENTHESES.LEFT, // e.g. `:matches-attr('/data-/')`\n SINGLE_QUOTE, // e.g. ':matches-attr(\"/data-/\")'\n DOUBLE_QUOTE, // e.g. ':matches-attr(check=/data-v-/)'\n EQUAL_SIGN, // e.g. ':matches-property(inner./_test/=null)'\n DOT, // e.g. ':matches-css(height:/20px/)'\n COLON, // ':matches-css-after( content : /(\\\\d+\\\\s)*me/ )'\n SPACE],\n CONTAINS: [// e.g. ':contains(/text/)'\n BRACKET.PARENTHESES.LEFT, // e.g. `:contains('/text/')`\n SINGLE_QUOTE, // e.g. ':contains(\"/text/\")'\n DOUBLE_QUOTE]\n};\n/**\n * Checks whether the passed token is supported extended pseudo-class.\n *\n * @param tokenValue Token value to check.\n *\n * @returns True if `tokenValue` is one of supported extended pseudo-class names.\n */\n\nconst isSupportedPseudoClass = tokenValue => {\n return SUPPORTED_PSEUDO_CLASSES.includes(tokenValue);\n};\n/**\n * Checks whether the passed pseudo-class `name` should be optimized,\n * i.e. :not() and :is().\n *\n * @param name Pseudo-class name.\n *\n * @returns True if `name` is one if pseudo-class which should be optimized.\n */\n\nconst isOptimizationPseudoClass = name => {\n return OPTIMIZATION_PSEUDO_CLASSES.includes(name);\n};\n/**\n * Checks whether next to \"space\" token is a continuation of regular selector being processed.\n *\n * @param nextTokenType Type of token next to current one.\n * @param nextTokenValue Value of token next to current one.\n *\n * @returns True if next token seems to be a part of current regular selector.\n */\n\nconst doesRegularContinueAfterSpace = (nextTokenType, nextTokenValue) => {\n // regular selector does not continues after the current token\n if (!nextTokenType || !nextTokenValue) {\n return false;\n }\n\n return COMBINATORS.includes(nextTokenValue) || nextTokenType === TOKEN_TYPE.WORD // e.g. '#main *:has(> .ad)'\n || nextTokenValue === ASTERISK || nextTokenValue === ID_MARKER || nextTokenValue === CLASS_MARKER // e.g. 'div :where(.content)'\n || nextTokenValue === COLON // e.g. \"div[class*=' ']\"\n || nextTokenValue === SINGLE_QUOTE // e.g. 'div[class*=\" \"]'\n || nextTokenValue === DOUBLE_QUOTE || nextTokenValue === BRACKET.SQUARE.LEFT;\n};\n/**\n * Checks whether the regexp pattern for pseudo-class arg starts.\n * Needed for `context.isRegexpOpen` flag.\n *\n * @param context Selector parser context.\n * @param prevTokenValue Value of previous token.\n * @param bufferNodeValue Value of bufferNode.\n *\n * @returns True if current token seems to be a start of regexp pseudo-class arg pattern.\n * @throws An error on invalid regexp pattern.\n */\n\nconst isRegexpOpening = (context, prevTokenValue, bufferNodeValue) => {\n const lastExtendedPseudoClassName = getLast(context.extendedPseudoNamesStack);\n\n if (!lastExtendedPseudoClassName) {\n throw new Error('Regexp pattern allowed only in arg of extended pseudo-class');\n } // for regexp pattens the slash should not be escaped\n // const isRegexpPatternSlash = prevTokenValue !== BACKSLASH;\n // regexp pattern can be set as arg of pseudo-class\n // which means limited list of available symbols before slash `/`;\n // for :contains() pseudo-class regexp pattern should be at the beginning of arg\n\n\n if (CONTAINS_PSEUDO_NAMES.includes(lastExtendedPseudoClassName)) {\n return POSSIBLE_MARKS_BEFORE_REGEXP.CONTAINS.includes(prevTokenValue);\n }\n\n if (prevTokenValue === SLASH && lastExtendedPseudoClassName !== XPATH_PSEUDO_CLASS_MARKER) {\n const rawArgDesc = bufferNodeValue ? `in arg part: '${bufferNodeValue}'` : 'arg';\n throw new Error(`Invalid regexp pattern for :${lastExtendedPseudoClassName}() pseudo-class ${rawArgDesc}`);\n } // for other pseudo-classes regexp pattern can be either the whole arg or its part\n\n\n return POSSIBLE_MARKS_BEFORE_REGEXP.COMMON.includes(prevTokenValue);\n};\n/**\n * Checks whether the attribute starts.\n *\n * @param tokenValue Value of current token.\n * @param prevTokenValue Previous token value.\n *\n * @returns True if combination of current and previous token seems to be **a start** of attribute.\n */\n\nconst isAttributeOpening = (tokenValue, prevTokenValue) => {\n return tokenValue === BRACKET.SQUARE.LEFT && prevTokenValue !== BACKSLASH;\n};\n/**\n * Checks whether the attribute ends.\n *\n * @param context Selector parser context.\n *\n * @returns True if combination of current and previous token seems to be **an end** of attribute.\n * @throws An error on invalid attribute.\n */\n\nconst isAttributeClosing = context => {\n var _getPrevToLast;\n\n if (!context.isAttributeBracketsOpen) {\n return false;\n } // valid attributes may have extra spaces inside.\n // we get rid of them just to simplify the checking and they are skipped only here:\n // - spaces will be collected to the ast with spaces as they were declared is selector\n // - extra spaces in attribute are not relevant to attribute syntax validity\n // e.g. 'a[ title ]' is the same as 'a[title]'\n // 'div[style *= \"MARGIN\" i]' is the same as 'div[style*=\"MARGIN\"i]'\n\n\n const noSpaceAttr = context.attributeBuffer.split(SPACE).join(''); // tokenize the prepared attribute string\n\n const attrTokens = tokenizeAttribute(noSpaceAttr);\n const firstAttrToken = getFirst(attrTokens);\n const firstAttrTokenType = firstAttrToken === null || firstAttrToken === void 0 ? void 0 : firstAttrToken.type;\n const firstAttrTokenValue = firstAttrToken === null || firstAttrToken === void 0 ? void 0 : firstAttrToken.value; // signal an error on any mark-type token except backslash\n // e.g. '[=\"margin\"]'\n\n if (firstAttrTokenType === TOKEN_TYPE.MARK // backslash is allowed at start of attribute\n // e.g. '[\\\\:data-service-slot]'\n && firstAttrTokenValue !== BACKSLASH) {\n // eslint-disable-next-line max-len\n throw new Error(`'[${context.attributeBuffer}]' is not a valid attribute due to '${firstAttrTokenValue}' at start of it`);\n }\n\n const lastAttrToken = getLast(attrTokens);\n const lastAttrTokenType = lastAttrToken === null || lastAttrToken === void 0 ? void 0 : lastAttrToken.type;\n const lastAttrTokenValue = lastAttrToken === null || lastAttrToken === void 0 ? void 0 : lastAttrToken.value;\n\n if (lastAttrTokenValue === EQUAL_SIGN) {\n // e.g. '[style=]'\n throw new Error(`'[${context.attributeBuffer}]' is not a valid attribute due to '${EQUAL_SIGN}'`);\n }\n\n const equalSignIndex = attrTokens.findIndex(token => {\n return token.type === TOKEN_TYPE.MARK && token.value === EQUAL_SIGN;\n });\n const prevToLastAttrTokenValue = (_getPrevToLast = getPrevToLast(attrTokens)) === null || _getPrevToLast === void 0 ? void 0 : _getPrevToLast.value;\n\n if (equalSignIndex === -1) {\n // if there is no '=' inside attribute,\n // it must be just attribute name which means the word-type token before closing bracket\n // e.g. 'div[style]'\n if (lastAttrTokenType === TOKEN_TYPE.WORD) {\n return true;\n }\n\n return prevToLastAttrTokenValue === BACKSLASH // some weird attribute are valid too\n // e.g. '[class\\\\\"ads-article\\\\\"]'\n && (lastAttrTokenValue === DOUBLE_QUOTE // e.g. \"[class\\\\'ads-article\\\\']\"\n || lastAttrTokenValue === SINGLE_QUOTE);\n } // get the value of token next to `=`\n\n\n const nextToEqualSignToken = getItemByIndex(attrTokens, equalSignIndex + 1);\n const nextToEqualSignTokenValue = nextToEqualSignToken.value; // check whether the attribute value wrapper in quotes\n\n const isAttrValueQuote = nextToEqualSignTokenValue === SINGLE_QUOTE || nextToEqualSignTokenValue === DOUBLE_QUOTE; // for no quotes after `=` the last token before `]` should be a word-type one\n // e.g. 'div[style*=margin]'\n // 'div[style*=MARGIN i]'\n\n if (!isAttrValueQuote) {\n if (lastAttrTokenType === TOKEN_TYPE.WORD) {\n return true;\n } // otherwise signal an error\n // e.g. 'table[style*=border: 0px\"]'\n\n\n throw new Error(`'[${context.attributeBuffer}]' is not a valid attribute`);\n } // otherwise if quotes for value are present\n // the last token before `]` can still be word-type token\n // e.g. 'div[style*=\"MARGIN\" i]'\n\n\n if (lastAttrTokenType === TOKEN_TYPE.WORD && (lastAttrTokenValue === null || lastAttrTokenValue === void 0 ? void 0 : lastAttrTokenValue.toLocaleLowerCase()) === ATTRIBUTE_CASE_INSENSITIVE_FLAG) {\n return prevToLastAttrTokenValue === nextToEqualSignTokenValue;\n } // eventually if there is quotes for attribute value and last token is not a word,\n // the closing mark should be the same quote as opening one\n\n\n return lastAttrTokenValue === nextToEqualSignTokenValue;\n};\n/**\n * Checks whether the `tokenValue` is a whitespace character.\n *\n * @param tokenValue Token value.\n *\n * @returns True if `tokenValue` is a whitespace character.\n */\n\nconst isWhiteSpaceChar = tokenValue => {\n if (!tokenValue) {\n return false;\n }\n\n return WHITE_SPACE_CHARACTERS.includes(tokenValue);\n};\n\n/**\n * Checks whether the passed `str` is a name of supported absolute extended pseudo-class,\n * e.g. :contains(), :matches-css() etc.\n *\n * @param str Token value to check.\n *\n * @returns True if `str` is one of absolute extended pseudo-class names.\n */\n\nconst isAbsolutePseudoClass = str => {\n return ABSOLUTE_PSEUDO_CLASSES.includes(str);\n};\n/**\n * Checks whether the passed `str` is a name of supported relative extended pseudo-class,\n * e.g. :has(), :not() etc.\n *\n * @param str Token value to check.\n *\n * @returns True if `str` is one of relative extended pseudo-class names.\n */\n\nconst isRelativePseudoClass = str => {\n return RELATIVE_PSEUDO_CLASSES.includes(str);\n};\n\n/**\n * Returns the node which is being collected\n * or null if there is no such one.\n *\n * @param context Selector parser context.\n *\n * @returns Buffer node or null.\n */\n\nconst getBufferNode = context => {\n if (context.pathToBufferNode.length === 0) {\n return null;\n } // buffer node is always the last in the pathToBufferNode stack\n\n\n return getLast(context.pathToBufferNode) || null;\n};\n/**\n * Returns the parent node to the 'buffer node' — which is the one being collected —\n * or null if there is no such one.\n *\n * @param context Selector parser context.\n *\n * @returns Parent node of buffer node or null.\n */\n\nconst getBufferNodeParent = context => {\n // at least two nodes should exist — the buffer node and its parent\n // otherwise return null\n if (context.pathToBufferNode.length < 2) {\n return null;\n } // since the buffer node is always the last in the pathToBufferNode stack\n // its parent is previous to it in the stack\n\n\n return getPrevToLast(context.pathToBufferNode) || null;\n};\n/**\n * Returns last RegularSelector ast node.\n * Needed for parsing of the complex selector with extended pseudo-class inside it.\n *\n * @param context Selector parser context.\n *\n * @returns Ast RegularSelector node.\n * @throws An error if:\n * - bufferNode is absent;\n * - type of bufferNode is unsupported;\n * - no RegularSelector in bufferNode.\n */\n\nconst getContextLastRegularSelectorNode = context => {\n const bufferNode = getBufferNode(context);\n\n if (!bufferNode) {\n throw new Error('No bufferNode found');\n }\n\n if (!isSelectorNode(bufferNode)) {\n throw new Error('Unsupported bufferNode type');\n }\n\n const lastRegularSelectorNode = getLastRegularChild(bufferNode.children);\n context.pathToBufferNode.push(lastRegularSelectorNode);\n return lastRegularSelectorNode;\n};\n/**\n * Updates needed buffer node value while tokens iterating.\n * For RegularSelector also collects token values to context.attributeBuffer\n * for proper attribute parsing.\n *\n * @param context Selector parser context.\n * @param tokenValue Value of current token.\n *\n * @throws An error if:\n * - no bufferNode;\n * - bufferNode.type is not RegularSelector or AbsolutePseudoClass.\n */\n\nconst updateBufferNode = (context, tokenValue) => {\n const bufferNode = getBufferNode(context);\n\n if (bufferNode === null) {\n throw new Error('No bufferNode to update');\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n bufferNode.value += tokenValue;\n } else if (isRegularSelectorNode(bufferNode)) {\n bufferNode.value += tokenValue;\n\n if (context.isAttributeBracketsOpen) {\n context.attributeBuffer += tokenValue;\n }\n } else {\n // eslint-disable-next-line max-len\n throw new Error(`${bufferNode.type} node cannot be updated. Only RegularSelector and AbsolutePseudoClass are supported`);\n }\n};\n/**\n * Adds SelectorList node to context.ast at the start of ast collecting.\n *\n * @param context Selector parser context.\n */\n\nconst addSelectorListNode = context => {\n const selectorListNode = new AnySelectorNode(NODE.SELECTOR_LIST);\n context.ast = selectorListNode;\n context.pathToBufferNode.push(selectorListNode);\n};\n/**\n * Adds new node to buffer node children.\n * New added node will be considered as buffer node after it.\n *\n * @param context Selector parser context.\n * @param type Type of node to add.\n * @param tokenValue Optional, defaults to `''`, value of processing token.\n *\n * @throws An error if no bufferNode.\n */\n\nconst addAstNodeByType = function (context, type) {\n let tokenValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n const bufferNode = getBufferNode(context);\n\n if (bufferNode === null) {\n throw new Error('No buffer node');\n }\n\n let node;\n\n if (type === NODE.REGULAR_SELECTOR) {\n node = new RegularSelectorNode(tokenValue);\n } else if (type === NODE.ABSOLUTE_PSEUDO_CLASS) {\n node = new AbsolutePseudoClassNode(tokenValue);\n } else if (type === NODE.RELATIVE_PSEUDO_CLASS) {\n node = new RelativePseudoClassNode(tokenValue);\n } else {\n // SelectorList || Selector || ExtendedSelector\n node = new AnySelectorNode(type);\n }\n\n bufferNode.addChild(node);\n context.pathToBufferNode.push(node);\n};\n/**\n * The very beginning of ast collecting.\n *\n * @param context Selector parser context.\n * @param tokenValue Value of regular selector.\n */\n\nconst initAst = (context, tokenValue) => {\n addSelectorListNode(context);\n addAstNodeByType(context, NODE.SELECTOR); // RegularSelector node is always the first child of Selector node\n\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n};\n/**\n * Inits selector list subtree for relative extended pseudo-classes, e.g. :has(), :not().\n *\n * @param context Selector parser context.\n * @param tokenValue Optional, defaults to `''`, value of inner regular selector.\n */\n\nconst initRelativeSubtree = function (context) {\n let tokenValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n addAstNodeByType(context, NODE.SELECTOR_LIST);\n addAstNodeByType(context, NODE.SELECTOR);\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n};\n/**\n * Goes to closest parent specified by type.\n * Actually updates path to buffer node for proper ast collecting of selectors while parsing.\n *\n * @param context Selector parser context.\n * @param parentType Type of needed parent node in ast.\n */\n\nconst upToClosest = (context, parentType) => {\n for (let i = context.pathToBufferNode.length - 1; i >= 0; i -= 1) {\n var _context$pathToBuffer;\n\n if (((_context$pathToBuffer = context.pathToBufferNode[i]) === null || _context$pathToBuffer === void 0 ? void 0 : _context$pathToBuffer.type) === parentType) {\n context.pathToBufferNode = context.pathToBufferNode.slice(0, i + 1);\n break;\n }\n }\n};\n/**\n * Returns needed buffer node updated due to complex selector parsing.\n *\n * @param context Selector parser context.\n *\n * @returns Ast node for following selector parsing.\n * @throws An error if there is no upper SelectorNode is ast.\n */\n\nconst getUpdatedBufferNode = context => {\n // it may happen during the parsing of selector list\n // which is an argument of relative pseudo-class\n // e.g. '.banner:has(~span, ~p)'\n // parser position is here ↑\n // so if after the comma the buffer node type is SelectorList and parent type is RelativePseudoClass\n // we should simply return the current buffer node\n const bufferNode = getBufferNode(context);\n\n if (bufferNode && isSelectorListNode(bufferNode) && isRelativePseudoClassNode(getBufferNodeParent(context))) {\n return bufferNode;\n }\n\n upToClosest(context, NODE.SELECTOR);\n const selectorNode = getBufferNode(context);\n\n if (!selectorNode) {\n throw new Error('No SelectorNode, impossible to continue selector parsing by ExtendedCss');\n }\n\n const lastSelectorNodeChild = getLast(selectorNode.children);\n const hasExtended = lastSelectorNodeChild && isExtendedSelectorNode(lastSelectorNodeChild) // parser position might be inside standard pseudo-class brackets which has space\n // e.g. 'div:contains(/а/):nth-child(100n + 2)'\n && context.standardPseudoBracketsStack.length === 0;\n const supposedPseudoClassNode = hasExtended && getFirst(lastSelectorNodeChild.children);\n let newNeededBufferNode = selectorNode;\n\n if (supposedPseudoClassNode) {\n // name of pseudo-class for last extended-node child for Selector node\n const lastExtendedPseudoName = hasExtended && supposedPseudoClassNode.name;\n const isLastExtendedNameRelative = lastExtendedPseudoName && isRelativePseudoClass(lastExtendedPseudoName);\n const isLastExtendedNameAbsolute = lastExtendedPseudoName && isAbsolutePseudoClass(lastExtendedPseudoName);\n const hasRelativeExtended = isLastExtendedNameRelative && context.extendedPseudoBracketsStack.length > 0 && context.extendedPseudoBracketsStack.length === context.extendedPseudoNamesStack.length;\n const hasAbsoluteExtended = isLastExtendedNameAbsolute && lastExtendedPseudoName === getLast(context.extendedPseudoNamesStack);\n\n if (hasRelativeExtended) {\n // return relative selector node to update later\n context.pathToBufferNode.push(lastSelectorNodeChild);\n newNeededBufferNode = supposedPseudoClassNode;\n } else if (hasAbsoluteExtended) {\n // return absolute selector node to update later\n context.pathToBufferNode.push(lastSelectorNodeChild);\n newNeededBufferNode = supposedPseudoClassNode;\n }\n } else if (hasExtended) {\n // return selector node to add new regular selector node later\n newNeededBufferNode = selectorNode;\n } else {\n // otherwise return last regular selector node to update later\n newNeededBufferNode = getContextLastRegularSelectorNode(context);\n } // update the path to buffer node properly\n\n\n context.pathToBufferNode.push(newNeededBufferNode);\n return newNeededBufferNode;\n};\n/**\n * Checks values of few next tokens on colon token `:` and:\n * - updates buffer node for following standard pseudo-class;\n * - adds extended selector ast node for following extended pseudo-class;\n * - validates some cases of `:remove()` and `:has()` usage.\n *\n * @param context Selector parser context.\n * @param selector Selector.\n * @param tokenValue Value of current token.\n * @param nextTokenValue Value of token next to current one.\n * @param nextToNextTokenValue Value of token next to next to current one.\n *\n * @throws An error on :remove() pseudo-class in selector\n * or :has() inside regular pseudo limitation.\n */\n\nconst handleNextTokenOnColon = (context, selector, tokenValue, nextTokenValue, nextToNextTokenValue) => {\n if (!nextTokenValue) {\n throw new Error(`Invalid colon ':' at the end of selector: '${selector}'`);\n }\n\n if (!isSupportedPseudoClass(nextTokenValue.toLowerCase())) {\n if (nextTokenValue.toLowerCase() === REMOVE_PSEUDO_MARKER) {\n // :remove() pseudo-class should be handled before\n // as it is not about element selecting but actions with elements\n // e.g. 'body > div:empty:remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n } // if following token is not an extended pseudo\n // the colon should be collected to value of RegularSelector\n // e.g. '.entry_text:nth-child(2)'\n\n\n updateBufferNode(context, tokenValue); // check the token after the pseudo and do balance parentheses later\n // only if it is functional pseudo-class (standard with brackets, e.g. ':lang()').\n // no brackets balance needed for such case,\n // parser position is on first colon after the 'div':\n // e.g. 'div:last-child:has(button.privacy-policy__btn)'\n\n if (nextToNextTokenValue && nextToNextTokenValue === BRACKET.PARENTHESES.LEFT // no brackets balance needed for parentheses inside attribute value\n // e.g. 'a[href=\"javascript:void(0)\"]' <-- parser position is on colon `:`\n // before `void` ↑\n && !context.isAttributeBracketsOpen) {\n context.standardPseudoNamesStack.push(nextTokenValue);\n }\n } else {\n // it is supported extended pseudo-class.\n // Disallow :has() inside the pseudos accepting only compound selectors\n // https://bugs.chromium.org/p/chromium/issues/detail?id=669058#c54 [2]\n if (HAS_PSEUDO_CLASS_MARKERS.includes(nextTokenValue) && context.standardPseudoNamesStack.length > 0) {\n // eslint-disable-next-line max-len\n throw new Error(`Usage of :${nextTokenValue}() pseudo-class is not allowed inside regular pseudo: '${getLast(context.standardPseudoNamesStack)}'`);\n } else {\n // stop RegularSelector value collecting\n upToClosest(context, NODE.SELECTOR); // add ExtendedSelector to Selector children\n\n addAstNodeByType(context, NODE.EXTENDED_SELECTOR);\n }\n }\n};\n\n// e.g. ':is(.page, .main) > .banner' or '*:not(span):not(p)'\n\nconst IS_OR_NOT_PSEUDO_SELECTING_ROOT = `html ${ASTERISK}`;\n/**\n * Checks if there are any ExtendedSelector node in selector list.\n *\n * @param selectorList Ast SelectorList node.\n *\n * @returns True if `selectorList` has any inner ExtendedSelector node.\n */\n\nconst hasExtendedSelector = selectorList => {\n return selectorList.children.some(selectorNode => {\n return selectorNode.children.some(selectorNodeChild => {\n return isExtendedSelectorNode(selectorNodeChild);\n });\n });\n};\n/**\n * Converts selector list of RegularSelector nodes to string.\n *\n * @param selectorList Ast SelectorList node.\n *\n * @returns String representation for selector list of regular selectors.\n */\n\n\nconst selectorListOfRegularsToString = selectorList => {\n // if there is no ExtendedSelector in relative SelectorList\n // it means that each Selector node has single child — RegularSelector node\n // and their values should be combined to string\n const standardCssSelectors = selectorList.children.map(selectorNode => {\n const selectorOnlyChild = getNodeOnlyChild(selectorNode, 'Ast Selector node should have RegularSelector node');\n return getNodeValue(selectorOnlyChild);\n });\n return standardCssSelectors.join(`${COMMA}${SPACE}`);\n};\n/**\n * Updates children of `node` replacing them with `newChildren`.\n * Important: modifies input `node` which is passed by reference.\n *\n * @param node Ast node to update.\n * @param newChildren Array of new children for ast node.\n *\n * @returns Updated ast node.\n */\n\n\nconst updateNodeChildren = (node, newChildren) => {\n node.children = newChildren;\n return node;\n};\n/**\n * Recursively checks whether the ExtendedSelector node should be optimized.\n * It has to be recursive because RelativePseudoClass has inner SelectorList node.\n *\n * @param currExtendedSelectorNode Ast ExtendedSelector node.\n *\n * @returns True is ExtendedSelector should be optimized.\n */\n\n\nconst shouldOptimizeExtendedSelector = currExtendedSelectorNode => {\n if (currExtendedSelectorNode === null) {\n return false;\n }\n\n const extendedPseudoClassNode = getPseudoClassNode(currExtendedSelectorNode);\n const pseudoName = getNodeName(extendedPseudoClassNode);\n\n if (isAbsolutePseudoClass(pseudoName)) {\n return false;\n }\n\n const relativeSelectorList = getRelativeSelectorListNode(extendedPseudoClassNode);\n const innerSelectorNodes = relativeSelectorList.children; // simple checking for standard selectors in arg of :not() or :is() pseudo-class\n // e.g. 'div > *:is(div, a, span)'\n\n if (isOptimizationPseudoClass(pseudoName)) {\n const areAllSelectorNodeChildrenRegular = innerSelectorNodes.every(selectorNode => {\n try {\n const selectorOnlyChild = getNodeOnlyChild(selectorNode, 'Selector node should have RegularSelector'); // it means that the only child is RegularSelector and it can be optimized\n\n return isRegularSelectorNode(selectorOnlyChild);\n } catch (e) {\n return false;\n }\n });\n\n if (areAllSelectorNodeChildrenRegular) {\n return true;\n }\n } // for other extended pseudo-classes than :not() and :is()\n\n\n return innerSelectorNodes.some(selectorNode => {\n return selectorNode.children.some(selectorNodeChild => {\n if (!isExtendedSelectorNode(selectorNodeChild)) {\n return false;\n } // check inner ExtendedSelector recursively\n // e.g. 'div:has(*:not(.header))'\n\n\n return shouldOptimizeExtendedSelector(selectorNodeChild);\n });\n });\n};\n/**\n * Returns optimized ExtendedSelector node if it can be optimized\n * or null if ExtendedSelector is fully optimized while function execution\n * which means that value of `prevRegularSelectorNode` is updated.\n *\n * @param currExtendedSelectorNode Current ExtendedSelector node to optimize.\n * @param prevRegularSelectorNode Previous RegularSelector node.\n *\n * @returns Ast node or null.\n */\n\n\nconst getOptimizedExtendedSelector = (currExtendedSelectorNode, prevRegularSelectorNode) => {\n if (!currExtendedSelectorNode) {\n return null;\n }\n\n const extendedPseudoClassNode = getPseudoClassNode(currExtendedSelectorNode);\n const relativeSelectorList = getRelativeSelectorListNode(extendedPseudoClassNode);\n const hasInnerExtendedSelector = hasExtendedSelector(relativeSelectorList);\n\n if (!hasInnerExtendedSelector) {\n // if there is no extended selectors for :not() or :is()\n // e.g. 'div:not(.content, .main)'\n const relativeSelectorListStr = selectorListOfRegularsToString(relativeSelectorList);\n const pseudoName = getNodeName(extendedPseudoClassNode); // eslint-disable-next-line max-len\n\n const optimizedExtendedStr = `${COLON}${pseudoName}${BRACKET.PARENTHESES.LEFT}${relativeSelectorListStr}${BRACKET.PARENTHESES.RIGHT}`;\n prevRegularSelectorNode.value = `${getNodeValue(prevRegularSelectorNode)}${optimizedExtendedStr}`;\n return null;\n } // eslint-disable-next-line @typescript-eslint/no-use-before-define\n\n\n const optimizedRelativeSelectorList = optimizeSelectorListNode(relativeSelectorList);\n const optimizedExtendedPseudoClassNode = updateNodeChildren(extendedPseudoClassNode, [optimizedRelativeSelectorList]);\n return updateNodeChildren(currExtendedSelectorNode, [optimizedExtendedPseudoClassNode]);\n};\n/**\n * Combines values of `previous` and `current` RegularSelector nodes.\n * It may happen during the optimization when ExtendedSelector between RegularSelector node was optimized.\n *\n * @param current Current RegularSelector node.\n * @param previous Previous RegularSelector node.\n */\n\n\nconst optimizeCurrentRegularSelector = (current, previous) => {\n previous.value = `${getNodeValue(previous)}${SPACE}${getNodeValue(current)}`;\n};\n/**\n * Optimizes ast Selector node.\n *\n * @param selectorNode Ast Selector node.\n *\n * @returns Optimized ast node.\n * @throws An error while collecting optimized nodes.\n */\n\n\nconst optimizeSelectorNode = selectorNode => {\n // non-optimized list of SelectorNode children\n const rawSelectorNodeChildren = selectorNode.children; // for collecting optimized children list\n\n const optimizedChildrenList = [];\n let currentIndex = 0; // iterate through all children in non-optimized ast Selector node\n\n while (currentIndex < rawSelectorNodeChildren.length) {\n const currentChild = getItemByIndex(rawSelectorNodeChildren, currentIndex, 'currentChild should be specified'); // no need to optimize the very first child which is always RegularSelector node\n\n if (currentIndex === 0) {\n optimizedChildrenList.push(currentChild);\n } else {\n const prevRegularChild = getLastRegularChild(optimizedChildrenList);\n\n if (isExtendedSelectorNode(currentChild)) {\n // start checking with point is null\n let optimizedExtendedSelector = null; // check whether the optimization is needed\n\n let isOptimizationNeeded = shouldOptimizeExtendedSelector(currentChild); // update optimizedExtendedSelector so it can be optimized recursively\n // i.e. `getOptimizedExtendedSelector(optimizedExtendedSelector)` below\n\n optimizedExtendedSelector = currentChild;\n\n while (isOptimizationNeeded) {\n // recursively optimize ExtendedSelector until no optimization needed\n // e.g. div > *:is(.banner:not(.block))\n optimizedExtendedSelector = getOptimizedExtendedSelector(optimizedExtendedSelector, prevRegularChild);\n isOptimizationNeeded = shouldOptimizeExtendedSelector(optimizedExtendedSelector);\n } // if it was simple :not() of :is() with standard selector arg\n // e.g. 'div:not([class][id])'\n // or '.main > *:is([data-loaded], .banner)'\n // after the optimization the ExtendedSelector node become part of RegularSelector\n // so nothing to save eventually\n // otherwise the optimized ExtendedSelector should be saved\n // e.g. 'div:has(:not([class]))'\n\n\n if (optimizedExtendedSelector !== null) {\n optimizedChildrenList.push(optimizedExtendedSelector); // if optimization is not needed\n\n const optimizedPseudoClass = getPseudoClassNode(optimizedExtendedSelector);\n const optimizedPseudoName = getNodeName(optimizedPseudoClass); // parent element checking is used to apply :is() and :not() pseudo-classes as extended.\n // as there is no parentNode for root element (html)\n // so element selection should be limited to it's children\n // e.g. '*:is(:has(.page))' -> 'html *:is(has(.page))'\n // or '*:not(:has(span))' -> 'html *:not(:has(span))'\n\n if (getNodeValue(prevRegularChild) === ASTERISK && isOptimizationPseudoClass(optimizedPseudoName)) {\n prevRegularChild.value = IS_OR_NOT_PSEUDO_SELECTING_ROOT;\n }\n }\n } else if (isRegularSelectorNode(currentChild)) {\n // in non-optimized ast, RegularSelector node may follow ExtendedSelector which should be optimized\n // for example, for 'div:not(.content) > .banner' schematically it looks like\n // non-optimized ast: [\n // 1. RegularSelector: 'div'\n // 2. ExtendedSelector: 'not(.content)'\n // 3. RegularSelector: '> .banner'\n // ]\n // which after the ExtendedSelector looks like\n // partly optimized ast: [\n // 1. RegularSelector: 'div:not(.content)'\n // 2. RegularSelector: '> .banner'\n // ]\n // so second RegularSelector value should be combined with first one\n // optimized ast: [\n // 1. RegularSelector: 'div:not(.content) > .banner'\n // ]\n // here we check **children of selectorNode** after previous optimization if it was\n const lastOptimizedChild = getLast(optimizedChildrenList) || null;\n\n if (isRegularSelectorNode(lastOptimizedChild)) {\n optimizeCurrentRegularSelector(currentChild, prevRegularChild);\n }\n }\n }\n\n currentIndex += 1;\n }\n\n return updateNodeChildren(selectorNode, optimizedChildrenList);\n};\n/**\n * Optimizes ast SelectorList node.\n *\n * @param selectorListNode SelectorList node.\n *\n * @returns Optimized ast node.\n */\n\n\nconst optimizeSelectorListNode = selectorListNode => {\n return updateNodeChildren(selectorListNode, selectorListNode.children.map(s => optimizeSelectorNode(s)));\n};\n/**\n * Optimizes ast:\n * If arg of :not() and :is() pseudo-classes does not contain extended selectors,\n * native Document.querySelectorAll() can be used to query elements.\n * It means that ExtendedSelector ast nodes can be removed\n * and value of relevant RegularSelector node should be updated accordingly.\n *\n * @param ast Non-optimized ast.\n *\n * @returns Optimized ast.\n */\n\n\nconst optimizeAst = ast => {\n // ast is basically the selector list of selectors\n return optimizeSelectorListNode(ast);\n};\n\n// https://github.com/AdguardTeam/ExtendedCss/issues/115\n\nconst XPATH_PSEUDO_SELECTING_ROOT = 'body';\nconst NO_WHITESPACE_ERROR_PREFIX = 'No white space is allowed before or after extended pseudo-class name in selector';\n/**\n * Parses selector into ast for following element selection.\n *\n * @param selector Selector to parse.\n *\n * @returns Parsed ast.\n * @throws An error on invalid selector.\n */\n\nconst parse = selector => {\n const tokens = tokenizeSelector(selector);\n const context = {\n ast: null,\n pathToBufferNode: [],\n extendedPseudoNamesStack: [],\n extendedPseudoBracketsStack: [],\n standardPseudoNamesStack: [],\n standardPseudoBracketsStack: [],\n isAttributeBracketsOpen: false,\n attributeBuffer: '',\n isRegexpOpen: false,\n shouldOptimize: false\n };\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n if (!token) {\n break;\n } // Token to process\n\n\n const {\n type: tokenType,\n value: tokenValue\n } = token; // needed for SPACE and COLON tokens checking\n\n const nextToken = tokens[i + 1];\n const nextTokenType = nextToken === null || nextToken === void 0 ? void 0 : nextToken.type;\n const nextTokenValue = nextToken === null || nextToken === void 0 ? void 0 : nextToken.value; // needed for limitations\n // - :not() and :is() root element\n // - :has() usage\n // - white space before and after pseudo-class name\n\n const nextToNextToken = tokens[i + 2];\n const nextToNextTokenValue = nextToNextToken === null || nextToNextToken === void 0 ? void 0 : nextToNextToken.value; // needed for COLON token checking for none-specified regular selector before extended one\n // e.g. 'p, :hover'\n // or '.banner, :contains(ads)'\n\n const previousToken = tokens[i - 1];\n const prevTokenType = previousToken === null || previousToken === void 0 ? void 0 : previousToken.type;\n const prevTokenValue = previousToken === null || previousToken === void 0 ? void 0 : previousToken.value; // needed for proper parsing of regexp pattern arg\n // e.g. ':matches-css(background-image: /^url\\(https:\\/\\/example\\.org\\//)'\n\n const previousToPreviousToken = tokens[i - 2];\n const prevToPrevTokenValue = previousToPreviousToken === null || previousToPreviousToken === void 0 ? void 0 : previousToPreviousToken.value;\n let bufferNode = getBufferNode(context);\n\n switch (tokenType) {\n case TOKEN_TYPE.WORD:\n if (bufferNode === null) {\n // there is no buffer node only in one case — no ast collecting has been started\n initAst(context, tokenValue);\n } else if (isSelectorListNode(bufferNode)) {\n // add new selector to selector list\n addAstNodeByType(context, NODE.SELECTOR);\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n } else if (isRegularSelectorNode(bufferNode)) {\n updateBufferNode(context, tokenValue);\n } else if (isExtendedSelectorNode(bufferNode)) {\n // No white space is allowed between the name of extended pseudo-class\n // and its opening parenthesis\n // https://www.w3.org/TR/selectors-4/#pseudo-classes\n // e.g. 'span:contains (text)'\n if (isWhiteSpaceChar(nextTokenValue) && nextToNextTokenValue === BRACKET.PARENTHESES.LEFT) {\n throw new Error(`${NO_WHITESPACE_ERROR_PREFIX}: '${selector}'`);\n }\n\n const lowerCaseTokenValue = tokenValue.toLowerCase(); // save pseudo-class name for brackets balance checking\n\n context.extendedPseudoNamesStack.push(lowerCaseTokenValue); // extended pseudo-class name are parsed in lower case\n // as they should be case-insensitive\n // https://www.w3.org/TR/selectors-4/#pseudo-classes\n\n if (isAbsolutePseudoClass(lowerCaseTokenValue)) {\n addAstNodeByType(context, NODE.ABSOLUTE_PSEUDO_CLASS, lowerCaseTokenValue);\n } else {\n // if it is not absolute pseudo-class, it must be relative one\n // add RelativePseudoClass with tokenValue as pseudo-class name to ExtendedSelector children\n addAstNodeByType(context, NODE.RELATIVE_PSEUDO_CLASS, lowerCaseTokenValue); // for :not() and :is() pseudo-classes parsed ast should be optimized later\n\n if (isOptimizationPseudoClass(lowerCaseTokenValue)) {\n context.shouldOptimize = true;\n }\n }\n } else if (isAbsolutePseudoClassNode(bufferNode)) {\n // collect absolute pseudo-class arg\n updateBufferNode(context, tokenValue);\n } else if (isRelativePseudoClassNode(bufferNode)) {\n initRelativeSubtree(context, tokenValue);\n }\n\n break;\n\n case TOKEN_TYPE.MARK:\n switch (tokenValue) {\n case COMMA:\n if (!bufferNode || typeof bufferNode !== 'undefined' && !nextTokenValue) {\n // consider the selector is invalid if there is no bufferNode yet (e.g. ', a')\n // or there is nothing after the comma while bufferNode is defined (e.g. 'div, ')\n throw new Error(`'${selector}' is not a valid selector`);\n } else if (isRegularSelectorNode(bufferNode)) {\n if (context.isAttributeBracketsOpen) {\n // the comma might be inside element attribute value\n // e.g. 'div[data-comma=\"0,1\"]'\n updateBufferNode(context, tokenValue);\n } else {\n // new Selector should be collected to upper SelectorList\n upToClosest(context, NODE.SELECTOR_LIST);\n }\n } else if (isAbsolutePseudoClassNode(bufferNode)) {\n // the comma inside arg of absolute extended pseudo\n // e.g. 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n updateBufferNode(context, tokenValue);\n } else if (isSelectorNode(bufferNode)) {\n // new Selector should be collected to upper SelectorList\n // if parser position is on Selector node\n upToClosest(context, NODE.SELECTOR_LIST);\n }\n\n break;\n\n case SPACE:\n // it might be complex selector with extended pseudo-class inside it\n // and the space is between that complex selector and following regular selector\n // parser position is on ` ` before `span` now:\n // e.g. 'div:has(img).banner span'\n // so we need to check whether the new ast node should be added (example above)\n // or previous regular selector node should be updated\n if (isRegularSelectorNode(bufferNode) // no need to update the buffer node if attribute value is being parsed\n // e.g. 'div:not([id])[style=\"position: absolute; z-index: 10000;\"]'\n // parser position inside attribute ↑\n && !context.isAttributeBracketsOpen) {\n bufferNode = getUpdatedBufferNode(context);\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n // standard selectors with white space between colon and name of pseudo\n // are invalid for native document.querySelectorAll() anyway,\n // so throwing the error here is better\n // than proper parsing of invalid selector and passing it further.\n // first of all do not check attributes\n // e.g. div[style=\"text-align: center\"]\n if (!context.isAttributeBracketsOpen // check the space after the colon and before the pseudo\n // e.g. '.block: nth-child(2)\n && (prevTokenValue === COLON && nextTokenType === TOKEN_TYPE.WORD // or after the pseudo and before the opening parenthesis\n // e.g. '.block:nth-child (2)\n || prevTokenType === TOKEN_TYPE.WORD && nextTokenValue === BRACKET.PARENTHESES.LEFT)) {\n throw new Error(`'${selector}' is not a valid selector`);\n } // collect current tokenValue to value of RegularSelector\n // if it is the last token or standard selector continues after the space.\n // otherwise it will be skipped\n\n\n if (!nextTokenValue || doesRegularContinueAfterSpace(nextTokenType, nextTokenValue) // we also should collect space inside attribute value\n // e.g. `[onclick^=\"window.open ('https://example.com/share?url=\"]`\n // parser position ↑\n || context.isAttributeBracketsOpen) {\n updateBufferNode(context, tokenValue);\n }\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // space inside extended pseudo-class arg\n // e.g. 'span:contains(some text)'\n updateBufferNode(context, tokenValue);\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n // init with empty value RegularSelector\n // as the space is not needed for selector value\n // e.g. 'p:not( .content )'\n initRelativeSubtree(context);\n }\n\n if (isSelectorNode(bufferNode)) {\n // do NOT add RegularSelector if parser position on space BEFORE the comma in selector list\n // e.g. '.block:has(> img) , .banner)'\n if (doesRegularContinueAfterSpace(nextTokenType, nextTokenValue)) {\n // regular selector might be after the extended one.\n // extra space before combinator or selector should not be collected\n // e.g. '.banner:upward(2) .block'\n // '.banner:upward(2) > .block'\n // so no tokenValue passed to addAnySelectorNode()\n addAstNodeByType(context, NODE.REGULAR_SELECTOR);\n }\n }\n\n break;\n\n case DESCENDANT_COMBINATOR:\n case CHILD_COMBINATOR:\n case NEXT_SIBLING_COMBINATOR:\n case SUBSEQUENT_SIBLING_COMBINATOR:\n case SEMICOLON:\n case SLASH:\n case BACKSLASH:\n case SINGLE_QUOTE:\n case DOUBLE_QUOTE:\n case CARET:\n case DOLLAR_SIGN:\n case BRACKET.CURLY.LEFT:\n case BRACKET.CURLY.RIGHT:\n case ASTERISK:\n case ID_MARKER:\n case CLASS_MARKER:\n case BRACKET.SQUARE.LEFT:\n // it might be complex selector with extended pseudo-class inside it\n // and the space is between that complex selector and following regular selector\n // e.g. 'div:has(img).banner' // parser position is on `.` before `banner` now\n // 'div:has(img)[attr]' // parser position is on `[` before `attr` now\n // so we need to check whether the new ast node should be added (example above)\n // or previous regular selector node should be updated\n if (COMBINATORS.includes(tokenValue)) {\n if (bufferNode === null) {\n // cases where combinator at very beginning of a selector\n // e.g. '> div'\n // or '~ .banner'\n // or even '+js(overlay-buster)' which not a selector at all\n // but may be validated by FilterCompiler so error message should be appropriate\n throw new Error(`'${selector}' is not a valid selector`);\n }\n\n bufferNode = getUpdatedBufferNode(context);\n }\n\n if (bufferNode === null) {\n // no ast collecting has been started\n // e.g. '.banner > p'\n // or '#top > div.ad'\n // or '[class][style][attr]'\n // or '*:not(span)'\n initAst(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // e.g. '[class^=\"banner-\"]'\n context.isAttributeBracketsOpen = true;\n }\n } else if (isRegularSelectorNode(bufferNode)) {\n if (tokenValue === BRACKET.CURLY.LEFT && !(context.isAttributeBracketsOpen || context.isRegexpOpen)) {\n // e.g. 'div { content: \"'\n throw new Error(`'${selector}' is not a valid selector`);\n } // collect the mark to the value of RegularSelector node\n\n\n updateBufferNode(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // needed for proper handling element attribute value with comma\n // e.g. 'div[data-comma=\"0,1\"]'\n context.isAttributeBracketsOpen = true;\n }\n } else if (isAbsolutePseudoClassNode(bufferNode)) {\n // collect the mark to the arg of AbsolutePseudoClass node\n updateBufferNode(context, tokenValue); // 'isRegexpOpen' flag is needed for brackets balancing inside extended pseudo-class arg\n\n if (tokenValue === SLASH && context.extendedPseudoNamesStack.length > 0) {\n if (prevTokenValue === SLASH && prevToPrevTokenValue === BACKSLASH) {\n // it may be specific url regexp pattern in arg of pseudo-class\n // e.g. ':matches-css(background-image: /^url\\(https:\\/\\/example\\.org\\//)'\n // parser position is on final slash before `)` ↑\n context.isRegexpOpen = false;\n } else if (prevTokenValue && prevTokenValue !== BACKSLASH) {\n if (isRegexpOpening(context, prevTokenValue, getNodeValue(bufferNode))) {\n context.isRegexpOpen = !context.isRegexpOpen;\n } else {\n // otherwise force `isRegexpOpen` flag to `false`\n context.isRegexpOpen = false;\n }\n }\n }\n } else if (isRelativePseudoClassNode(bufferNode)) {\n // add SelectorList to children of RelativePseudoClass node\n initRelativeSubtree(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // besides of creating the relative subtree\n // opening square bracket means start of attribute\n // e.g. 'div:not([class=\"content\"])'\n // 'div:not([href*=\"window.print()\"])'\n context.isAttributeBracketsOpen = true;\n }\n } else if (isSelectorNode(bufferNode)) {\n // after the extended pseudo closing parentheses\n // parser position is on Selector node\n // and regular selector can be after the extended one\n // e.g. '.banner:upward(2)> .block'\n // or '.inner:nth-ancestor(1)~ .banner'\n if (COMBINATORS.includes(tokenValue)) {\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n } else if (!context.isRegexpOpen) {\n // it might be complex selector with extended pseudo-class inside it.\n // parser position is on `.` now:\n // e.g. 'div:has(img).banner'\n // so we need to get last regular selector node and update its value\n bufferNode = getContextLastRegularSelectorNode(context);\n updateBufferNode(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // handle attribute in compound selector after extended pseudo-class\n // e.g. 'div:not(.top)[style=\"z-index: 10000;\"]'\n // parser position ↑\n context.isAttributeBracketsOpen = true;\n }\n }\n } else if (isSelectorListNode(bufferNode)) {\n // add Selector to SelectorList\n addAstNodeByType(context, NODE.SELECTOR); // and RegularSelector as it is always the first child of Selector\n\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // handle simple attribute selector in selector list\n // e.g. '.banner, [class^=\"ad-\"]'\n context.isAttributeBracketsOpen = true;\n }\n }\n\n break;\n\n case BRACKET.SQUARE.RIGHT:\n if (isRegularSelectorNode(bufferNode)) {\n // unescaped `]` in regular selector allowed only inside attribute value\n if (!context.isAttributeBracketsOpen && prevTokenValue !== BACKSLASH) {\n // e.g. 'div]'\n // eslint-disable-next-line max-len\n throw new Error(`'${selector}' is not a valid selector due to '${tokenValue}' after '${getNodeValue(bufferNode)}'`);\n } // needed for proper parsing regular selectors after the attributes with comma\n // e.g. 'div[data-comma=\"0,1\"] > img'\n\n\n if (isAttributeClosing(context)) {\n context.isAttributeBracketsOpen = false; // reset attribute buffer on closing `]`\n\n context.attributeBuffer = '';\n } // collect the bracket to the value of RegularSelector node\n\n\n updateBufferNode(context, tokenValue);\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // :xpath() expended pseudo-class arg might contain square bracket\n // so it should be collected\n // e.g. 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n updateBufferNode(context, tokenValue);\n }\n\n break;\n\n case COLON:\n // No white space is allowed between the colon and the following name of the pseudo-class\n // https://www.w3.org/TR/selectors-4/#pseudo-classes\n // e.g. 'span: contains(text)'\n if (isWhiteSpaceChar(nextTokenValue) && nextToNextTokenValue && SUPPORTED_PSEUDO_CLASSES.includes(nextToNextTokenValue)) {\n throw new Error(`${NO_WHITESPACE_ERROR_PREFIX}: '${selector}'`);\n }\n\n if (bufferNode === null) {\n // no ast collecting has been started\n if (nextTokenValue === XPATH_PSEUDO_CLASS_MARKER) {\n // limit applying of \"naked\" :xpath pseudo-class\n // https://github.com/AdguardTeam/ExtendedCss/issues/115\n initAst(context, XPATH_PSEUDO_SELECTING_ROOT);\n } else if (nextTokenValue === UPWARD_PSEUDO_CLASS_MARKER || nextTokenValue === NTH_ANCESTOR_PSEUDO_CLASS_MARKER) {\n // selector should be specified before :nth-ancestor() or :upward()\n // e.g. ':nth-ancestor(3)'\n // or ':upward(span)'\n throw new Error(`${NO_SELECTOR_ERROR_PREFIX} before :${nextTokenValue}() pseudo-class`);\n } else {\n // make it more obvious if selector starts with pseudo with no tag specified\n // e.g. ':has(a)' -> '*:has(a)'\n // or ':empty' -> '*:empty'\n initAst(context, ASTERISK);\n } // bufferNode should be updated for following checking\n\n\n bufferNode = getBufferNode(context);\n }\n\n if (isSelectorListNode(bufferNode)) {\n // bufferNode is SelectorList after comma has been parsed.\n // parser position is on colon now:\n // e.g. 'img,:not(.content)'\n addAstNodeByType(context, NODE.SELECTOR); // add empty value RegularSelector anyway as any selector should start with it\n // and check previous token on the next step\n\n addAstNodeByType(context, NODE.REGULAR_SELECTOR); // bufferNode should be updated for following checking\n\n bufferNode = getBufferNode(context);\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n // it can be extended or standard pseudo\n // e.g. '#share, :contains(share it)'\n // or 'div,:hover'\n // of 'div:has(+:contains(text))' // position is after '+'\n if (prevTokenValue && COMBINATORS.includes(prevTokenValue) || prevTokenValue === COMMA) {\n // case with colon at the start of string - e.g. ':contains(text)'\n // is covered by 'bufferNode === null' above at start of COLON checking\n updateBufferNode(context, ASTERISK);\n }\n\n handleNextTokenOnColon(context, selector, tokenValue, nextTokenValue, nextToNextTokenValue);\n }\n\n if (isSelectorNode(bufferNode)) {\n // e.g. 'div:contains(text):'\n if (!nextTokenValue) {\n throw new Error(`Invalid colon ':' at the end of selector: '${selector}'`);\n } // after the extended pseudo closing parentheses\n // parser position is on Selector node\n // and there is might be another extended selector.\n // parser position is on colon before 'upward':\n // e.g. 'p:contains(PR):upward(2)'\n\n\n if (isSupportedPseudoClass(nextTokenValue.toLowerCase())) {\n // if supported extended pseudo-class is next to colon\n // add ExtendedSelector to Selector children\n addAstNodeByType(context, NODE.EXTENDED_SELECTOR);\n } else if (nextTokenValue.toLowerCase() === REMOVE_PSEUDO_MARKER) {\n // :remove() pseudo-class should be handled before\n // as it is not about element selecting but actions with elements\n // e.g. '#banner:upward(2):remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n } else {\n // otherwise it is standard pseudo after extended pseudo-class in complex selector\n // and colon should be collected to value of previous RegularSelector\n // e.g. 'body *:not(input)::selection'\n // 'input:matches-css(padding: 10):checked'\n bufferNode = getContextLastRegularSelectorNode(context);\n handleNextTokenOnColon(context, selector, tokenValue, nextTokenType, nextToNextTokenValue);\n }\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // :xpath() pseudo-class should be the last of extended pseudo-classes\n if (getNodeName(bufferNode) === XPATH_PSEUDO_CLASS_MARKER && nextTokenValue && SUPPORTED_PSEUDO_CLASSES.includes(nextTokenValue) && nextToNextTokenValue === BRACKET.PARENTHESES.LEFT) {\n throw new Error(`:xpath() pseudo-class should be the last in selector: '${selector}'`);\n } // collecting arg for absolute pseudo-class\n // e.g. 'div:matches-css(width:400px)'\n\n\n updateBufferNode(context, tokenValue);\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n if (!nextTokenValue) {\n // e.g. 'div:has(:'\n throw new Error(`Invalid pseudo-class arg at the end of selector: '${selector}'`);\n } // make it more obvious if selector starts with pseudo with no tag specified\n // parser position is on colon inside :has() arg\n // e.g. 'div:has(:contains(text))'\n // or 'div:not(:empty)'\n\n\n initRelativeSubtree(context, ASTERISK);\n\n if (!isSupportedPseudoClass(nextTokenValue.toLowerCase())) {\n // collect the colon to value of RegularSelector\n // e.g. 'div:not(:empty)'\n updateBufferNode(context, tokenValue); // parentheses should be balanced only for functional pseudo-classes\n // e.g. '.yellow:not(:nth-child(3))'\n\n if (nextToNextTokenValue === BRACKET.PARENTHESES.LEFT) {\n context.standardPseudoNamesStack.push(nextTokenValue);\n }\n } else {\n // add ExtendedSelector to Selector children\n // e.g. 'div:has(:contains(text))'\n upToClosest(context, NODE.SELECTOR);\n addAstNodeByType(context, NODE.EXTENDED_SELECTOR);\n }\n }\n\n break;\n\n case BRACKET.PARENTHESES.LEFT:\n // start of pseudo-class arg\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // no brackets balancing needed inside\n // 1. :xpath() extended pseudo-class arg\n // 2. regexp arg for other extended pseudo-classes\n if (getNodeName(bufferNode) !== XPATH_PSEUDO_CLASS_MARKER && context.isRegexpOpen) {\n // if the parentheses is escaped it should be part of regexp\n // collect it to arg of AbsolutePseudoClass\n // e.g. 'div:matches-css(background-image: /^url\\\\(\"data:image\\\\/gif;base64.+/)'\n updateBufferNode(context, tokenValue);\n } else {\n // otherwise brackets should be balanced\n // e.g. 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n context.extendedPseudoBracketsStack.push(tokenValue); // eslint-disable-next-line max-len\n\n if (context.extendedPseudoBracketsStack.length > context.extendedPseudoNamesStack.length) {\n updateBufferNode(context, tokenValue);\n }\n }\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n // continue RegularSelector value collecting for standard pseudo-classes\n // e.g. '.banner:where(div)'\n if (context.standardPseudoNamesStack.length > 0) {\n updateBufferNode(context, tokenValue);\n context.standardPseudoBracketsStack.push(tokenValue);\n } // parentheses inside attribute value should be part of RegularSelector value\n // e.g. 'div:not([href*=\"window.print()\"])' <-- parser position\n // is on the `(` after `print` ↑\n\n\n if (context.isAttributeBracketsOpen) {\n updateBufferNode(context, tokenValue);\n }\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n // save opening bracket for balancing\n // e.g. 'div:not()' // position is on `(`\n context.extendedPseudoBracketsStack.push(tokenValue);\n }\n\n break;\n\n case BRACKET.PARENTHESES.RIGHT:\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // no brackets balancing needed inside\n // 1. :xpath() extended pseudo-class arg\n // 2. regexp arg for other extended pseudo-classes\n if (getNodeName(bufferNode) !== XPATH_PSEUDO_CLASS_MARKER && context.isRegexpOpen) {\n // if closing bracket is part of regexp\n // simply save it to pseudo-class arg\n updateBufferNode(context, tokenValue);\n } else {\n // remove stacked open parentheses for brackets balance\n // e.g. 'h3:contains((Ads))'\n // or 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n context.extendedPseudoBracketsStack.pop();\n\n if (getNodeName(bufferNode) !== XPATH_PSEUDO_CLASS_MARKER) {\n // for all other absolute pseudo-classes except :xpath()\n // remove stacked name of extended pseudo-class\n context.extendedPseudoNamesStack.pop(); // eslint-disable-next-line max-len\n\n if (context.extendedPseudoBracketsStack.length > context.extendedPseudoNamesStack.length) {\n // if brackets stack is not empty yet,\n // save tokenValue to arg of AbsolutePseudoClass\n // parser position on first closing bracket after 'Ads':\n // e.g. 'h3:contains((Ads))'\n updateBufferNode(context, tokenValue);\n } else if (context.extendedPseudoBracketsStack.length >= 0 && context.extendedPseudoNamesStack.length >= 0) {\n // assume it is combined extended pseudo-classes\n // parser position on first closing bracket after 'advert':\n // e.g. 'div:has(.banner, :contains(advert))'\n upToClosest(context, NODE.SELECTOR);\n }\n } else {\n // for :xpath()\n // eslint-disable-next-line max-len\n if (context.extendedPseudoBracketsStack.length < context.extendedPseudoNamesStack.length) {\n // remove stacked name of extended pseudo-class\n // if there are less brackets than pseudo-class names\n // with means last removes bracket was closing for pseudo-class\n context.extendedPseudoNamesStack.pop();\n } else {\n // otherwise the bracket is part of arg\n updateBufferNode(context, tokenValue);\n }\n }\n }\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n if (context.isAttributeBracketsOpen) {\n // parentheses inside attribute value should be part of RegularSelector value\n // e.g. 'div:not([href*=\"window.print()\"])' <-- parser position\n // is on the `)` after `print(` ↑\n updateBufferNode(context, tokenValue);\n } else if (context.standardPseudoNamesStack.length > 0 && context.standardPseudoBracketsStack.length > 0) {\n // standard pseudo-class was processing.\n // collect the closing bracket to value of RegularSelector\n // parser position is on bracket after 'class' now:\n // e.g. 'div:where(.class)'\n updateBufferNode(context, tokenValue); // remove bracket and pseudo name from stacks\n\n context.standardPseudoBracketsStack.pop();\n const lastStandardPseudo = context.standardPseudoNamesStack.pop();\n\n if (!lastStandardPseudo) {\n // standard pseudo should be in standardPseudoNamesStack\n // as related to standardPseudoBracketsStack\n throw new Error(`Parsing error. Invalid selector: ${selector}`);\n } // Disallow :has() after regular pseudo-elements\n // https://bugs.chromium.org/p/chromium/issues/detail?id=669058#c54 [3]\n\n\n if (Object.values(REGULAR_PSEUDO_ELEMENTS).includes(lastStandardPseudo) // check token which is next to closing parentheses and token after it\n // parser position is on bracket after 'foo' now:\n // e.g. '::part(foo):has(.a)'\n && nextTokenValue === COLON && nextToNextTokenValue && HAS_PSEUDO_CLASS_MARKERS.includes(nextToNextTokenValue)) {\n // eslint-disable-next-line max-len\n throw new Error(`Usage of :${nextToNextTokenValue}() pseudo-class is not allowed after any regular pseudo-element: '${lastStandardPseudo}'`);\n }\n } else {\n // extended pseudo-class was processing.\n // e.g. 'div:has(h3)'\n // remove bracket and pseudo name from stacks\n context.extendedPseudoBracketsStack.pop();\n context.extendedPseudoNamesStack.pop();\n upToClosest(context, NODE.EXTENDED_SELECTOR); // go to upper selector for possible selector continuation after extended pseudo-class\n // e.g. 'div:has(h3) > img'\n\n upToClosest(context, NODE.SELECTOR);\n }\n }\n\n if (isSelectorNode(bufferNode)) {\n // after inner extended pseudo-class bufferNode is Selector.\n // parser position is on last bracket now:\n // e.g. 'div:has(.banner, :contains(ads))'\n context.extendedPseudoBracketsStack.pop();\n context.extendedPseudoNamesStack.pop();\n upToClosest(context, NODE.EXTENDED_SELECTOR);\n upToClosest(context, NODE.SELECTOR);\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n // save opening bracket for balancing\n // e.g. 'div:not()' // position is on `)`\n // context.extendedPseudoBracketsStack.push(tokenValue);\n if (context.extendedPseudoNamesStack.length > 0 && context.extendedPseudoBracketsStack.length > 0) {\n context.extendedPseudoBracketsStack.pop();\n context.extendedPseudoNamesStack.pop();\n }\n }\n\n break;\n\n case LINE_FEED:\n case FORM_FEED:\n case CARRIAGE_RETURN:\n // such characters at start and end of selector should be trimmed\n // so is there is one them among tokens, it is not valid selector\n throw new Error(`'${selector}' is not a valid selector`);\n\n case TAB:\n // allow tab only inside attribute value\n // as there are such valid rules in filter lists\n // e.g. 'div[style^=\"margin-right: auto;\ttext-align: left;',\n // parser position ↑\n if (isRegularSelectorNode(bufferNode) && context.isAttributeBracketsOpen) {\n updateBufferNode(context, tokenValue);\n } else {\n // otherwise not valid\n throw new Error(`'${selector}' is not a valid selector`);\n }\n\n }\n\n break;\n // no default statement for Marks as they are limited to SUPPORTED_SELECTOR_MARKS\n // and all other symbol combinations are tokenized as Word\n // so error for invalid Word will be thrown later while element selecting by parsed ast\n\n default:\n throw new Error(`Unknown type of token: '${tokenValue}'`);\n }\n\n i += 1;\n }\n\n if (context.ast === null) {\n throw new Error(`'${selector}' is not a valid selector`);\n }\n\n if (context.extendedPseudoNamesStack.length > 0 || context.extendedPseudoBracketsStack.length > 0) {\n // eslint-disable-next-line max-len\n throw new Error(`Unbalanced brackets for extended pseudo-class: '${getLast(context.extendedPseudoNamesStack)}'`);\n }\n\n if (context.isAttributeBracketsOpen) {\n throw new Error(`Unbalanced attribute brackets in selector: '${selector}'`);\n }\n\n return context.shouldOptimize ? optimizeAst(context.ast) : context.ast;\n};\n\nconst natives = {\n MutationObserver: window.MutationObserver || window.WebKitMutationObserver\n};\n/**\n * Class NativeTextContent is needed to intercept and save the native Node textContent getter\n * for proper work of :contains() pseudo-class as it may be mocked.\n *\n * @see {@link https://github.com/AdguardTeam/ExtendedCss/issues/127}\n */\n\nclass NativeTextContent {\n /**\n * Native Node.\n */\n\n /**\n * Native Node textContent getter.\n */\n\n /**\n * Stores native node.\n */\n constructor() {\n this.nativeNode = window.Node || Node;\n }\n /**\n * Sets native Node textContext getter to `getter` class field.\n */\n\n\n setGetter() {\n var _Object$getOwnPropert;\n\n this.getter = (_Object$getOwnPropert = Object.getOwnPropertyDescriptor(this.nativeNode.prototype, 'textContent')) === null || _Object$getOwnPropert === void 0 ? void 0 : _Object$getOwnPropert.get;\n }\n\n}\nconst nativeTextContent = new NativeTextContent();\n\n/**\n * Returns textContent of passed domElement.\n *\n * @param domElement DOM element.\n *\n * @returns DOM element textContent.\n */\n\nconst getNodeTextContent = domElement => {\n if (nativeTextContent.getter) {\n return nativeTextContent.getter.apply(domElement);\n } // if ExtendedCss.init() has not been executed and there is no nodeTextContentGetter,\n // use simple approach, especially when init() is not really needed, e.g. local tests\n\n\n return domElement.textContent || '';\n};\n/**\n * Returns element selector text based on it's tagName and attributes.\n *\n * @param element DOM element.\n *\n * @returns String representation of `element`.\n */\n\nconst getElementSelectorDesc = element => {\n let selectorText = element.tagName.toLowerCase();\n selectorText += Array.from(element.attributes).map(attr => {\n return `[${attr.name}=\"${element.getAttribute(attr.name)}\"]`;\n }).join('');\n return selectorText;\n};\n/**\n * Returns path to a DOM element as a selector string.\n *\n * @param inputEl Input element.\n *\n * @returns String path to a DOM element.\n * @throws An error if `inputEl` in not instance of `Element`.\n */\n\nconst getElementSelectorPath = inputEl => {\n if (!(inputEl instanceof Element)) {\n throw new Error('Function received argument with wrong type');\n }\n\n let el;\n el = inputEl;\n const path = []; // we need to check '!!el' first because it is possible\n // that some ancestor of the inputEl was removed before it\n\n while (!!el && el.nodeType === Node.ELEMENT_NODE) {\n let selector = el.nodeName.toLowerCase();\n\n if (el.id && typeof el.id === 'string') {\n selector += `#${el.id}`;\n path.unshift(selector);\n break;\n }\n\n let sibling = el;\n let nth = 1;\n\n while (sibling.previousElementSibling) {\n sibling = sibling.previousElementSibling;\n\n if (sibling.nodeType === Node.ELEMENT_NODE && sibling.nodeName.toLowerCase() === selector) {\n nth += 1;\n }\n }\n\n if (nth !== 1) {\n selector += `:nth-of-type(${nth})`;\n }\n\n path.unshift(selector);\n el = el.parentElement;\n }\n\n return path.join(' > ');\n};\n/**\n * Checks whether the element is instance of HTMLElement.\n *\n * @param element Element to check.\n *\n * @returns True if `element` is HTMLElement.\n */\n\nconst isHtmlElement = element => {\n return element instanceof HTMLElement;\n};\n/**\n * Takes `element` and returns its parent element.\n *\n * @param element Element.\n * @param errorMessage Optional error message to throw.\n *\n * @returns Parent of `element`.\n * @throws An error if element has no parent element.\n */\n\nconst getParent = (element, errorMessage) => {\n const {\n parentElement\n } = element;\n\n if (!parentElement) {\n throw new Error(errorMessage || 'Element does no have parent element');\n }\n\n return parentElement;\n};\n\n/**\n * Checks whether the `error` has `message` property which type is string.\n *\n * @param error Error object.\n *\n * @returns True if `error` has message.\n */\nconst isErrorWithMessage = error => {\n return typeof error === 'object' && error !== null && 'message' in error && typeof error.message === 'string';\n};\n/**\n * Converts `maybeError` to error object with message.\n *\n * @param maybeError Possible error.\n *\n * @returns Error object with defined `message` property.\n */\n\n\nconst toErrorWithMessage = maybeError => {\n if (isErrorWithMessage(maybeError)) {\n return maybeError;\n }\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case if there is an error happened during the maybeError stringifying\n // like with circular references for example\n return new Error(String(maybeError));\n }\n};\n/**\n * Returns error message from `error`.\n * May be helpful to handle caught errors.\n *\n * @param error Error object.\n *\n * @returns Message of `error`.\n */\n\n\nconst getErrorMessage = error => {\n return toErrorWithMessage(error).message;\n};\n\nconst logger = {\n /**\n * Safe console.error version.\n */\n error: typeof console !== 'undefined' && console.error && console.error.bind ? console.error.bind(window.console) : console.error,\n\n /**\n * Safe console.info version.\n */\n info: typeof console !== 'undefined' && console.info && console.info.bind ? console.info.bind(window.console) : console.info\n};\n\n/**\n * Returns string without suffix.\n *\n * @param str Input string.\n * @param suffix Needed to remove.\n *\n * @returns String without suffix.\n */\n\nconst removeSuffix = (str, suffix) => {\n const index = str.indexOf(suffix, str.length - suffix.length);\n\n if (index >= 0) {\n return str.substring(0, index);\n }\n\n return str;\n};\n/**\n * Replaces all `pattern`s with `replacement` in `input` string.\n * String.replaceAll() polyfill because it is not supported by old browsers, e.g. Chrome 55.\n *\n * @see {@link https://caniuse.com/?search=String.replaceAll}\n *\n * @param input Input string to process.\n * @param pattern Find in the input string.\n * @param replacement Replace the pattern with.\n *\n * @returns Modified string.\n */\n\nconst replaceAll = (input, pattern, replacement) => {\n if (!input) {\n return input;\n }\n\n return input.split(pattern).join(replacement);\n};\n/**\n * Converts string pattern to regular expression.\n *\n * @param str String to convert.\n *\n * @returns Regular expression converted from pattern `str`.\n */\n\nconst toRegExp = str => {\n if (str.startsWith(SLASH) && str.endsWith(SLASH)) {\n return new RegExp(str.slice(1, -1));\n }\n\n const escaped = str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(escaped);\n};\n/**\n * Converts any simple type value to string type,\n * e.g. `undefined` -> `'undefined'`.\n *\n * @param value Any type value.\n *\n * @returns String representation of `value`.\n */\n\nconst convertTypeIntoString = value => {\n let output;\n\n switch (value) {\n case undefined:\n output = 'undefined';\n break;\n\n case null:\n output = 'null';\n break;\n\n default:\n output = value.toString();\n }\n\n return output;\n};\n/**\n * Converts instance of string value into other simple types,\n * e.g. `'null'` -> `null`, `'true'` -> `true`.\n *\n * @param value String-type value.\n *\n * @returns Its own type representation of string-type `value`.\n */\n\nconst convertTypeFromString = value => {\n const numValue = Number(value);\n let output;\n\n if (!Number.isNaN(numValue)) {\n output = numValue;\n } else {\n switch (value) {\n case 'undefined':\n output = undefined;\n break;\n\n case 'null':\n output = null;\n break;\n\n case 'true':\n output = true;\n break;\n\n case 'false':\n output = false;\n break;\n\n default:\n output = value;\n }\n }\n\n return output;\n};\n\nconst SAFARI_USER_AGENT_REGEXP = /\\sVersion\\/(\\d{2}\\.\\d)(.+\\s|\\s)(Safari)\\//;\nconst isSafariBrowser = SAFARI_USER_AGENT_REGEXP.test(navigator.userAgent);\n/**\n * Checks whether the browser userAgent is supported.\n *\n * @param userAgent User agent of browser.\n *\n * @returns False only for Internet Explorer.\n */\n\nconst isUserAgentSupported = userAgent => {\n // do not support Internet Explorer\n if (userAgent.includes('MSIE') || userAgent.includes('Trident/')) {\n return false;\n }\n\n return true;\n};\n/**\n * Checks whether the current browser is supported.\n *\n * @returns False for Internet Explorer, otherwise true.\n */\n\nconst isBrowserSupported = () => {\n return isUserAgentSupported(navigator.userAgent);\n};\n\n/**\n * CSS_PROPERTY is needed for style values normalization.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\n\nconst CSS_PROPERTY = {\n BACKGROUND: 'background',\n BACKGROUND_IMAGE: 'background-image',\n CONTENT: 'content',\n OPACITY: 'opacity'\n};\nconst REGEXP_ANY_SYMBOL = '.*';\nconst REGEXP_WITH_FLAGS_REGEXP = /^\\s*\\/.*\\/[gmisuy]*\\s*$/;\n\n/**\n * Removes quotes for specified content value.\n *\n * For example, content style declaration with `::before` can be set as '-' (e.g. unordered list)\n * which displayed as simple dash `-` with no quotes.\n * But CSSStyleDeclaration.getPropertyValue('content') will return value\n * wrapped into quotes, e.g. '\"-\"', which should be removed\n * because filters maintainers does not use any quotes in real rules.\n *\n * @param str Input string.\n *\n * @returns String with no quotes for content value.\n */\nconst removeContentQuotes = str => {\n return str.replace(/^([\"'])([\\s\\S]*)\\1$/, '$2');\n};\n/**\n * Adds quotes for specified background url value.\n *\n * If background-image is specified **without** quotes:\n * e.g. 'background: url(data:image/gif;base64,R0lGODlhAQA7)'.\n *\n * CSSStyleDeclaration.getPropertyValue('background-image') may return value **with** quotes:\n * e.g. 'background: url(\"data:image/gif;base64,R0lGODlhAQA7\")'.\n *\n * So we add quotes for compatibility since filters maintainers might use quotes in real rules.\n *\n * @param str Input string.\n *\n * @returns String with unified quotes for background url value.\n */\n\n\nconst addUrlPropertyQuotes = str => {\n if (!str.includes('url(\"')) {\n const re = /url\\((.*?)\\)/g;\n return str.replace(re, 'url(\"$1\")');\n }\n\n return str;\n};\n/**\n * Adds quotes to url arg for consistent property value matching.\n */\n\n\nconst addUrlQuotesTo = {\n regexpArg: str => {\n // e.g. /^url\\\\([a-z]{4}:[a-z]{5}/\n // or /^url\\\\(data\\\\:\\\\image\\\\/gif;base64.+/\n const re = /(\\^)?url(\\\\)?\\\\\\((\\w|\\[\\w)/g;\n return str.replace(re, '$1url$2\\\\(\\\\\"?$3');\n },\n noneRegexpArg: addUrlPropertyQuotes\n};\n/**\n * Escapes regular expression string.\n *\n * @see {@link https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp}\n *\n * @param str Input string.\n *\n * @returns Escaped regular expression string.\n */\n\nconst escapeRegExp = str => {\n // should be escaped . * + ? ^ $ { } ( ) | [ ] / \\\n // except of * | ^\n const specials = ['.', '+', '?', '$', '{', '}', '(', ')', '[', ']', '\\\\', '/'];\n const specialsRegex = new RegExp(`[${specials.join('\\\\')}]`, 'g');\n return str.replace(specialsRegex, '\\\\$&');\n};\n/**\n * Converts :matches-css() arg property value match to regexp.\n *\n * @param rawValue Style match value pattern.\n *\n * @returns Arg of :matches-css() converted to regular expression.\n */\n\n\nconst convertStyleMatchValueToRegexp = rawValue => {\n let value;\n\n if (rawValue.startsWith(SLASH) && rawValue.endsWith(SLASH)) {\n // For regex patterns double quotes `\"` and backslashes `\\` should be escaped\n value = addUrlQuotesTo.regexpArg(rawValue);\n value = value.slice(1, -1);\n } else {\n // For non-regex patterns parentheses `(` `)` and square brackets `[` `]`\n // should be unescaped, because their escaping in filter rules is required\n value = addUrlQuotesTo.noneRegexpArg(rawValue);\n value = value.replace(/\\\\([\\\\()[\\]\"])/g, '$1');\n value = escapeRegExp(value); // e.g. div:matches-css(background-image: url(data:*))\n\n value = replaceAll(value, ASTERISK, REGEXP_ANY_SYMBOL);\n }\n\n return new RegExp(value, 'i');\n};\n/**\n * Makes some properties values compatible.\n *\n * @param propertyName Name of style property.\n * @param propertyValue Value of style property.\n *\n * @returns Normalized values for some CSS properties.\n */\n\n\nconst normalizePropertyValue = (propertyName, propertyValue) => {\n let normalized = '';\n\n switch (propertyName) {\n case CSS_PROPERTY.BACKGROUND:\n case CSS_PROPERTY.BACKGROUND_IMAGE:\n // sometimes url property does not have quotes\n // so we add them for consistent matching\n normalized = addUrlPropertyQuotes(propertyValue);\n break;\n\n case CSS_PROPERTY.CONTENT:\n normalized = removeContentQuotes(propertyValue);\n break;\n\n case CSS_PROPERTY.OPACITY:\n // https://bugs.webkit.org/show_bug.cgi?id=93445\n normalized = isSafariBrowser ? (Math.round(parseFloat(propertyValue) * 100) / 100).toString() : propertyValue;\n break;\n\n default:\n normalized = propertyValue;\n }\n\n return normalized;\n};\n/**\n * Returns domElement style property value\n * by css property name and standard pseudo-element.\n *\n * @param domElement DOM element.\n * @param propertyName CSS property name.\n * @param regularPseudoElement Standard pseudo-element — '::before', '::after' etc.\n *\n * @returns String containing the value of a specified CSS property.\n */\n\n\nconst getComputedStylePropertyValue = (domElement, propertyName, regularPseudoElement) => {\n const style = window.getComputedStyle(domElement, regularPseudoElement);\n const propertyValue = style.getPropertyValue(propertyName);\n return normalizePropertyValue(propertyName, propertyValue);\n};\n\n/**\n * Parses arg of absolute pseudo-class into 'name' and 'value' if set.\n *\n * Used for :matches-css() - with COLON as separator,\n * for :matches-attr() and :matches-property() - with EQUAL_SIGN as separator.\n *\n * @param pseudoArg Arg of pseudo-class.\n * @param separator Divider symbol.\n *\n * @returns Parsed 'matches' pseudo-class arg data.\n */\nconst getPseudoArgData = (pseudoArg, separator) => {\n const index = pseudoArg.indexOf(separator);\n let name;\n let value;\n\n if (index > -1) {\n name = pseudoArg.substring(0, index).trim();\n value = pseudoArg.substring(index + 1).trim();\n } else {\n name = pseudoArg;\n }\n\n return {\n name,\n value\n };\n};\n\n/**\n * Parses :matches-css() pseudo-class arg\n * where regular pseudo-element can be a part of arg\n * e.g. 'div:matches-css(before, color: rgb(255, 255, 255))' <-- obsolete `:matches-css-before()`.\n *\n * @param pseudoName Pseudo-class name.\n * @param rawArg Pseudo-class arg.\n *\n * @returns Parsed :matches-css() pseudo-class arg data.\n * @throws An error on invalid `rawArg`.\n */\nconst parseStyleMatchArg = (pseudoName, rawArg) => {\n const {\n name,\n value\n } = getPseudoArgData(rawArg, COMMA);\n let regularPseudoElement = name;\n let styleMatchArg = value; // check whether the string part before the separator is valid regular pseudo-element,\n // otherwise `regularPseudoElement` is null, and `styleMatchArg` is rawArg\n\n if (!Object.values(REGULAR_PSEUDO_ELEMENTS).includes(name)) {\n regularPseudoElement = null;\n styleMatchArg = rawArg;\n }\n\n if (!styleMatchArg) {\n throw new Error(`Required style property argument part is missing in :${pseudoName}() arg: '${rawArg}'`);\n } // if regularPseudoElement is not `null`\n\n\n if (regularPseudoElement) {\n // pseudo-element should have two colon marks for Window.getComputedStyle() due to the syntax:\n // https://www.w3.org/TR/selectors-4/#pseudo-element-syntax\n // ':matches-css(before, content: ads)' ->> '::before'\n regularPseudoElement = `${COLON}${COLON}${regularPseudoElement}`;\n }\n\n return {\n regularPseudoElement,\n styleMatchArg\n };\n};\n/**\n * Checks whether the domElement is matched by :matches-css() arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid pseudo-class arg.\n */\n\n\nconst isStyleMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const {\n regularPseudoElement,\n styleMatchArg\n } = parseStyleMatchArg(pseudoName, pseudoArg);\n const {\n name: matchName,\n value: matchValue\n } = getPseudoArgData(styleMatchArg, COLON);\n\n if (!matchName || !matchValue) {\n throw new Error(`Required property name or value is missing in :${pseudoName}() arg: '${styleMatchArg}'`);\n }\n\n let valueRegexp;\n\n try {\n valueRegexp = convertStyleMatchValueToRegexp(matchValue);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`Invalid argument of :${pseudoName}() pseudo-class: '${styleMatchArg}'`);\n }\n\n const value = getComputedStylePropertyValue(domElement, matchName, regularPseudoElement);\n return valueRegexp && valueRegexp.test(value);\n};\n/**\n * Validates string arg for :matches-attr() and :matches-property().\n *\n * @param arg Pseudo-class arg.\n *\n * @returns True if 'matches' pseudo-class string arg is valid.\n */\n\nconst validateStrMatcherArg = arg => {\n if (arg.includes(SLASH)) {\n return false;\n }\n\n if (!/^[\\w-]+$/.test(arg)) {\n return false;\n }\n\n return true;\n};\n/**\n * Returns valid arg for :matches-attr() and :matcher-property().\n *\n * @param rawArg Arg pattern.\n * @param [isWildcardAllowed=false] Flag for wildcard (`*`) using as pseudo-class arg.\n *\n * @returns Valid arg for :matches-attr() and :matcher-property().\n * @throws An error on invalid `rawArg`.\n */\n\n\nconst getValidMatcherArg = function (rawArg) {\n let isWildcardAllowed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n // if rawArg is missing for pseudo-class\n // e.g. :matches-attr()\n // error will be thrown before getValidMatcherArg() is called:\n // name or arg is missing in AbsolutePseudoClass\n let arg;\n\n if (rawArg.length > 1 && rawArg.startsWith(DOUBLE_QUOTE) && rawArg.endsWith(DOUBLE_QUOTE)) {\n rawArg = rawArg.slice(1, -1);\n }\n\n if (rawArg === '') {\n // e.g. :matches-property(\"\")\n throw new Error('Argument should be specified. Empty arg is invalid.');\n }\n\n if (rawArg.startsWith(SLASH) && rawArg.endsWith(SLASH)) {\n // e.g. :matches-property(\"//\")\n if (rawArg.length > 2) {\n arg = toRegExp(rawArg);\n } else {\n throw new Error(`Invalid regexp: '${rawArg}'`);\n }\n } else if (rawArg.includes(ASTERISK)) {\n if (rawArg === ASTERISK && !isWildcardAllowed) {\n // e.g. :matches-attr(*)\n throw new Error(`Argument should be more specific than ${rawArg}`);\n }\n\n arg = replaceAll(rawArg, ASTERISK, REGEXP_ANY_SYMBOL);\n arg = new RegExp(arg);\n } else {\n if (!validateStrMatcherArg(rawArg)) {\n throw new Error(`Invalid argument: '${rawArg}'`);\n }\n\n arg = rawArg;\n }\n\n return arg;\n};\n\n/**\n * Parses pseudo-class argument and returns parsed data.\n *\n * @param pseudoName Extended pseudo-class name.\n * @param pseudoArg Extended pseudo-class argument.\n *\n * @returns Parsed pseudo-class argument data.\n * @throws An error if attribute name is missing in pseudo-class arg.\n */\nconst getRawMatchingData = (pseudoName, pseudoArg) => {\n const {\n name: rawName,\n value: rawValue\n } = getPseudoArgData(pseudoArg, EQUAL_SIGN);\n\n if (!rawName) {\n throw new Error(`Required attribute name is missing in :${pseudoName} arg: ${pseudoArg}`);\n }\n\n return {\n rawName,\n rawValue\n };\n};\n/**\n * Checks whether the domElement is matched by :matches-attr() arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid arg of pseudo-class.\n */\n\nconst isAttributeMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const elementAttributes = domElement.attributes; // no match if dom element has no attributes\n\n if (elementAttributes.length === 0) {\n return false;\n }\n\n const {\n rawName: rawAttrName,\n rawValue: rawAttrValue\n } = getRawMatchingData(pseudoName, pseudoArg);\n let attrNameMatch;\n\n try {\n attrNameMatch = getValidMatcherArg(rawAttrName);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n let isMatched = false;\n let i = 0;\n\n while (i < elementAttributes.length && !isMatched) {\n const attr = elementAttributes[i];\n\n if (!attr) {\n break;\n }\n\n const isNameMatched = attrNameMatch instanceof RegExp ? attrNameMatch.test(attr.name) : attrNameMatch === attr.name;\n\n if (!rawAttrValue) {\n // for rules with no attribute value specified\n // e.g. :matches-attr(\"/regex/\") or :matches-attr(\"attr-name\")\n isMatched = isNameMatched;\n } else {\n let attrValueMatch;\n\n try {\n attrValueMatch = getValidMatcherArg(rawAttrValue);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n const isValueMatched = attrValueMatch instanceof RegExp ? attrValueMatch.test(attr.value) : attrValueMatch === attr.value;\n isMatched = isNameMatched && isValueMatched;\n }\n\n i += 1;\n }\n\n return isMatched;\n};\n/**\n * Parses raw :matches-property() arg which may be chain of properties.\n *\n * @param input Argument of :matches-property().\n *\n * @returns Arg of :matches-property() as array of strings or regular expressions.\n * @throws An error on invalid chain.\n */\n\nconst parseRawPropChain = input => {\n if (input.length > 1 && input.startsWith(DOUBLE_QUOTE) && input.endsWith(DOUBLE_QUOTE)) {\n input = input.slice(1, -1);\n }\n\n const chainChunks = input.split(DOT);\n const chainPatterns = [];\n let patternBuffer = '';\n let isRegexpPattern = false;\n let i = 0;\n\n while (i < chainChunks.length) {\n const chunk = getItemByIndex(chainChunks, i, `Invalid pseudo-class arg: '${input}'`);\n\n if (chunk.startsWith(SLASH) && chunk.endsWith(SLASH) && chunk.length > 2) {\n // regexp pattern with no dot in it, e.g. /propName/\n chainPatterns.push(chunk);\n } else if (chunk.startsWith(SLASH)) {\n // if chunk is a start of regexp pattern\n isRegexpPattern = true;\n patternBuffer += chunk;\n } else if (chunk.endsWith(SLASH)) {\n isRegexpPattern = false; // restore dot removed while splitting\n // e.g. testProp./.{1,5}/\n\n patternBuffer += `.${chunk}`;\n chainPatterns.push(patternBuffer);\n patternBuffer = '';\n } else {\n // if there are few dots in regexp pattern\n // so chunk might be in the middle of it\n if (isRegexpPattern) {\n patternBuffer += chunk;\n } else {\n // otherwise it is string pattern\n chainPatterns.push(chunk);\n }\n }\n\n i += 1;\n }\n\n if (patternBuffer.length > 0) {\n throw new Error(`Invalid regexp property pattern '${input}'`);\n }\n\n const chainMatchPatterns = chainPatterns.map(pattern => {\n if (pattern.length === 0) {\n // e.g. '.prop.id' or 'nested..test'\n throw new Error(`Empty pattern '${pattern}' is invalid in chain '${input}'`);\n }\n\n let validPattern;\n\n try {\n validPattern = getValidMatcherArg(pattern, true);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`Invalid property pattern '${pattern}' in property chain '${input}'`);\n }\n\n return validPattern;\n });\n return chainMatchPatterns;\n};\n\n/**\n * Checks if the property exists in the base object (recursively).\n *\n * @param base Element to check.\n * @param chain Array of objects - parsed string property chain.\n * @param [output=[]] Result acc.\n *\n * @returns Array of parsed data — representation of `base`-related `chain`.\n */\nconst filterRootsByRegexpChain = function (base, chain) {\n let output = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const tempProp = getFirst(chain);\n\n if (chain.length === 1) {\n let key;\n\n for (key in base) {\n if (tempProp instanceof RegExp) {\n if (tempProp.test(key)) {\n output.push({\n base,\n prop: key,\n value: base[key]\n });\n }\n } else if (tempProp === key) {\n output.push({\n base,\n prop: tempProp,\n value: base[key]\n });\n }\n }\n\n return output;\n } // if there is a regexp prop in input chain\n // e.g. 'unit./^ad.+/.src' for 'unit.ad-1gf2.src unit.ad-fgd34.src'),\n // every base keys should be tested by regexp and it can be more that one results\n\n\n if (tempProp instanceof RegExp) {\n const nextProp = chain.slice(1);\n const baseKeys = [];\n\n for (const key in base) {\n if (tempProp.test(key)) {\n baseKeys.push(key);\n }\n }\n\n baseKeys.forEach(key => {\n var _Object$getOwnPropert;\n\n const item = (_Object$getOwnPropert = Object.getOwnPropertyDescriptor(base, key)) === null || _Object$getOwnPropert === void 0 ? void 0 : _Object$getOwnPropert.value;\n filterRootsByRegexpChain(item, nextProp, output);\n });\n }\n\n if (base && typeof tempProp === 'string') {\n var _Object$getOwnPropert2;\n\n const nextBase = (_Object$getOwnPropert2 = Object.getOwnPropertyDescriptor(base, tempProp)) === null || _Object$getOwnPropert2 === void 0 ? void 0 : _Object$getOwnPropert2.value;\n chain = chain.slice(1);\n\n if (nextBase !== undefined) {\n filterRootsByRegexpChain(nextBase, chain, output);\n }\n }\n\n return output;\n};\n/**\n * Checks whether the domElement is matched by :matches-property() arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid prop in chain.\n */\n\n\nconst isPropertyMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const {\n rawName: rawPropertyName,\n rawValue: rawPropertyValue\n } = getRawMatchingData(pseudoName, pseudoArg); // chained property name cannot include '/' or '.'\n // so regex prop names with such escaped characters are invalid\n\n if (rawPropertyName.includes('\\\\/') || rawPropertyName.includes('\\\\.')) {\n throw new Error(`Invalid :${pseudoName} name pattern: ${rawPropertyName}`);\n }\n\n let propChainMatches;\n\n try {\n propChainMatches = parseRawPropChain(rawPropertyName);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n const ownerObjArr = filterRootsByRegexpChain(domElement, propChainMatches);\n\n if (ownerObjArr.length === 0) {\n return false;\n }\n\n let isMatched = true;\n\n if (rawPropertyValue) {\n let propValueMatch;\n\n try {\n propValueMatch = getValidMatcherArg(rawPropertyValue);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n if (propValueMatch) {\n for (let i = 0; i < ownerObjArr.length; i += 1) {\n var _ownerObjArr$i;\n\n const realValue = (_ownerObjArr$i = ownerObjArr[i]) === null || _ownerObjArr$i === void 0 ? void 0 : _ownerObjArr$i.value;\n\n if (propValueMatch instanceof RegExp) {\n isMatched = propValueMatch.test(convertTypeIntoString(realValue));\n } else {\n // handle 'null' and 'undefined' property values set as string\n if (realValue === 'null' || realValue === 'undefined') {\n isMatched = propValueMatch === realValue;\n break;\n }\n\n isMatched = convertTypeFromString(propValueMatch) === realValue;\n }\n\n if (isMatched) {\n break;\n }\n }\n }\n }\n\n return isMatched;\n};\n/**\n * Checks whether the textContent is matched by :contains arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid arg of pseudo-class.\n */\n\nconst isTextMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const textContent = getNodeTextContent(domElement);\n let isTextContentMatched;\n let pseudoArgToMatch = pseudoArg;\n\n if (pseudoArgToMatch.startsWith(SLASH) && REGEXP_WITH_FLAGS_REGEXP.test(pseudoArgToMatch)) {\n // regexp arg\n const flagsIndex = pseudoArgToMatch.lastIndexOf('/');\n const flagsStr = pseudoArgToMatch.substring(flagsIndex + 1);\n pseudoArgToMatch = pseudoArgToMatch.substring(0, flagsIndex + 1).slice(1, -1).replace(/\\\\([\\\\\"])/g, '$1');\n let regex;\n\n try {\n regex = new RegExp(pseudoArgToMatch, flagsStr);\n } catch (e) {\n throw new Error(`Invalid argument of :${pseudoName}() pseudo-class: ${pseudoArg}`);\n }\n\n isTextContentMatched = regex.test(textContent);\n } else {\n // none-regexp arg\n pseudoArgToMatch = pseudoArgToMatch.replace(/\\\\([\\\\()[\\]\"])/g, '$1');\n isTextContentMatched = textContent.includes(pseudoArgToMatch);\n }\n\n return isTextContentMatched;\n};\n\n/**\n * Validates number arg for :nth-ancestor() and :upward() pseudo-classes.\n *\n * @param rawArg Raw arg of pseudo-class.\n * @param pseudoName Pseudo-class name.\n *\n * @returns Valid number arg for :nth-ancestor() and :upward().\n * @throws An error on invalid `rawArg`.\n */\nconst getValidNumberAncestorArg = (rawArg, pseudoName) => {\n const deep = Number(rawArg);\n\n if (Number.isNaN(deep) || deep < 1 || deep >= 256) {\n throw new Error(`Invalid argument of :${pseudoName} pseudo-class: '${rawArg}'`);\n }\n\n return deep;\n};\n/**\n * Returns nth ancestor by 'deep' number arg OR undefined if ancestor range limit exceeded.\n *\n * @param domElement DOM element to find ancestor for.\n * @param nth Depth up to needed ancestor.\n * @param pseudoName Pseudo-class name.\n *\n * @returns Ancestor element found in DOM, or null if not found.\n * @throws An error on invalid `nth` arg.\n */\n\nconst getNthAncestor = (domElement, nth, pseudoName) => {\n let ancestor = null;\n let i = 0;\n\n while (i < nth) {\n ancestor = domElement.parentElement;\n\n if (!ancestor) {\n throw new Error(`Out of DOM: Argument of :${pseudoName}() pseudo-class is too big — '${nth}'.`);\n }\n\n domElement = ancestor;\n i += 1;\n }\n\n return ancestor;\n};\n/**\n * Validates standard CSS selector.\n *\n * @param selector Standard selector.\n *\n * @returns True if standard CSS selector is valid.\n */\n\nconst validateStandardSelector = selector => {\n let isValid;\n\n try {\n document.querySelectorAll(selector);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n\n return isValid;\n};\n\n/**\n * Wrapper to run matcher `callback` with `args`\n * and throw error with `errorMessage` if `callback` run fails.\n *\n * @param callback Matcher callback.\n * @param argsData Args needed for matcher callback.\n * @param errorMessage Error message.\n *\n * @returns True if `callback` returns true.\n * @throws An error if `callback` fails.\n */\nconst matcherWrapper = (callback, argsData, errorMessage) => {\n let isMatched;\n\n try {\n isMatched = callback(argsData);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(errorMessage);\n }\n\n return isMatched;\n};\n/**\n * Generates common error message to throw while matching element `propDesc`.\n *\n * @param propDesc Text to describe what element 'prop' pseudo-class is trying to match.\n * @param pseudoName Pseudo-class name.\n * @param pseudoArg Pseudo-class arg.\n *\n * @returns Generated error message string.\n */\n\n\nconst getAbsolutePseudoError = (propDesc, pseudoName, pseudoArg) => {\n // eslint-disable-next-line max-len\n return `${MATCHING_ELEMENT_ERROR_PREFIX} ${propDesc}, may be invalid :${pseudoName}() pseudo-class arg: '${pseudoArg}'`;\n};\n/**\n * Checks whether the domElement is matched by absolute extended pseudo-class argument.\n *\n * @param domElement Page element.\n * @param pseudoName Pseudo-class name.\n * @param pseudoArg Pseudo-class arg.\n *\n * @returns True if `domElement` is matched by absolute pseudo-class.\n * @throws An error on unknown absolute pseudo-class.\n */\n\n\nconst isMatchedByAbsolutePseudo = (domElement, pseudoName, pseudoArg) => {\n let argsData;\n let errorMessage;\n let callback;\n\n switch (pseudoName) {\n case CONTAINS_PSEUDO:\n case HAS_TEXT_PSEUDO:\n case ABP_CONTAINS_PSEUDO:\n callback = isTextMatched;\n argsData = {\n pseudoName,\n pseudoArg,\n domElement\n };\n errorMessage = getAbsolutePseudoError('text content', pseudoName, pseudoArg);\n break;\n\n case MATCHES_CSS_PSEUDO:\n case MATCHES_CSS_AFTER_PSEUDO:\n case MATCHES_CSS_BEFORE_PSEUDO:\n callback = isStyleMatched;\n argsData = {\n pseudoName,\n pseudoArg,\n domElement\n };\n errorMessage = getAbsolutePseudoError('style', pseudoName, pseudoArg);\n break;\n\n case MATCHES_ATTR_PSEUDO_CLASS_MARKER:\n callback = isAttributeMatched;\n argsData = {\n domElement,\n pseudoName,\n pseudoArg\n };\n errorMessage = getAbsolutePseudoError('attributes', pseudoName, pseudoArg);\n break;\n\n case MATCHES_PROPERTY_PSEUDO_CLASS_MARKER:\n callback = isPropertyMatched;\n argsData = {\n domElement,\n pseudoName,\n pseudoArg\n };\n errorMessage = getAbsolutePseudoError('properties', pseudoName, pseudoArg);\n break;\n\n default:\n throw new Error(`Unknown absolute pseudo-class :${pseudoName}()`);\n }\n\n return matcherWrapper(callback, argsData, errorMessage);\n};\nconst findByAbsolutePseudoPseudo = {\n /**\n * Returns list of nth ancestors relative to every dom node from domElements list.\n *\n * @param domElements DOM elements.\n * @param rawPseudoArg Number arg of :nth-ancestor() or :upward() pseudo-class.\n * @param pseudoName Pseudo-class name.\n *\n * @returns Array of ancestor DOM elements.\n */\n nthAncestor: (domElements, rawPseudoArg, pseudoName) => {\n const deep = getValidNumberAncestorArg(rawPseudoArg, pseudoName);\n const ancestors = domElements.map(domElement => {\n let ancestor = null;\n\n try {\n ancestor = getNthAncestor(domElement, deep, pseudoName);\n } catch (e) {\n logger.error(getErrorMessage(e));\n }\n\n return ancestor;\n }).filter(isHtmlElement);\n return ancestors;\n },\n\n /**\n * Returns list of elements by xpath expression, evaluated on every dom node from domElements list.\n *\n * @param domElements DOM elements.\n * @param rawPseudoArg Arg of :xpath() pseudo-class.\n *\n * @returns Array of DOM elements matched by xpath expression.\n */\n xpath: (domElements, rawPseudoArg) => {\n const foundElements = domElements.map(domElement => {\n const result = [];\n let xpathResult;\n\n try {\n xpathResult = document.evaluate(rawPseudoArg, domElement, null, window.XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`Invalid argument of :xpath() pseudo-class: '${rawPseudoArg}'`);\n }\n\n let node = xpathResult.iterateNext();\n\n while (node) {\n if (isHtmlElement(node)) {\n result.push(node);\n }\n\n node = xpathResult.iterateNext();\n }\n\n return result;\n });\n return flatten(foundElements);\n },\n\n /**\n * Returns list of closest ancestors relative to every dom node from domElements list.\n *\n * @param domElements DOM elements.\n * @param rawPseudoArg Standard selector arg of :upward() pseudo-class.\n *\n * @returns Array of closest ancestor DOM elements.\n * @throws An error if `rawPseudoArg` is not a valid standard selector.\n */\n upward: (domElements, rawPseudoArg) => {\n if (!validateStandardSelector(rawPseudoArg)) {\n throw new Error(`Invalid argument of :upward pseudo-class: '${rawPseudoArg}'`);\n }\n\n const closestAncestors = domElements.map(domElement => {\n // closest to parent element should be found\n // otherwise `.base:upward(.base)` will return itself too, not only ancestor\n const parent = domElement.parentElement;\n\n if (!parent) {\n return null;\n }\n\n return parent.closest(rawPseudoArg);\n }).filter(isHtmlElement);\n return closestAncestors;\n }\n};\n\n/**\n * Calculated selector text which is needed to :has(), :is() and :not() pseudo-classes.\n * Contains calculated part (depends on the processed element)\n * and value of RegularSelector which is next to selector by.\n *\n * Native Document.querySelectorAll() does not select exact descendant elements\n * but match all page elements satisfying the selector,\n * so extra specification is needed for proper descendants selection\n * e.g. 'div:has(> img)'.\n *\n * Its calculation depends on extended selector.\n */\n\n/**\n * Combined `:scope` pseudo-class and **child** combinator — `:scope>`.\n */\nconst scopeDirectChildren = `${SCOPE_CSS_PSEUDO_CLASS}${CHILD_COMBINATOR}`;\n/**\n * Combined `:scope` pseudo-class and **descendant** combinator — `:scope `.\n */\n\nconst scopeAnyChildren = `${SCOPE_CSS_PSEUDO_CLASS}${DESCENDANT_COMBINATOR}`;\n/**\n * Type for relative pseudo-class helpers args.\n */\n\n/**\n * Returns the first of RegularSelector child node for `selectorNode`.\n *\n * @param selectorNode Ast Selector node.\n * @param pseudoName Name of relative pseudo-class.\n *\n * @returns Ast RegularSelector node.\n */\nconst getFirstInnerRegularChild = (selectorNode, pseudoName) => {\n return getFirstRegularChild(selectorNode.children, `RegularSelector is missing for :${pseudoName}() pseudo-class`);\n}; // TODO: fix for \n// https://github.com/AdguardTeam/ExtendedCss/issues/154\n\n/**\n * Checks whether the element has all relative elements specified by pseudo-class arg.\n * Used for :has() pseudo-class.\n *\n * @param argsData Relative pseudo-class helpers args data.\n *\n * @returns True if **all selectors** from argsData.relativeSelectorList is **matched** for argsData.element.\n */\n\n\nconst hasRelativesBySelectorList = argsData => {\n const {\n element,\n relativeSelectorList,\n pseudoName\n } = argsData;\n return relativeSelectorList.children // Array.every() is used here as each Selector node from SelectorList should exist on page\n .every(selectorNode => {\n // selectorList.children always starts with regular selector as any selector generally\n const relativeRegularSelector = getFirstInnerRegularChild(selectorNode, pseudoName);\n let specifiedSelector = '';\n let rootElement = null;\n const regularSelector = getNodeValue(relativeRegularSelector);\n\n if (regularSelector.startsWith(NEXT_SIBLING_COMBINATOR) || regularSelector.startsWith(SUBSEQUENT_SIBLING_COMBINATOR)) {\n /**\n * For matching the element by \"element:has(+ next-sibling)\" and \"element:has(~ sibling)\"\n * we check whether the element's parentElement has specific direct child combination,\n * e.g. 'h1:has(+ .share)' -> `h1Node.parentElement.querySelectorAll(':scope > h1 + .share')`.\n *\n * @see {@link https://www.w3.org/TR/selectors-4/#relational}\n */\n rootElement = element.parentElement;\n const elementSelectorText = getElementSelectorDesc(element);\n specifiedSelector = `${scopeDirectChildren}${elementSelectorText}${regularSelector}`;\n } else if (regularSelector === ASTERISK) {\n /**\n * :scope specification is needed for proper descendants selection\n * as native element.querySelectorAll() does not select exact element descendants\n * e.g. 'a:has(> img)' -> `aNode.querySelectorAll(':scope > img')`.\n *\n * For 'any selector' as arg of relative simplicity should be set for all inner elements\n * e.g. 'div:has(*)' -> `divNode.querySelectorAll(':scope *')`\n * which means empty div with no child element.\n */\n rootElement = element;\n specifiedSelector = `${scopeAnyChildren}${ASTERISK}`;\n } else {\n /**\n * As it described above, inner elements should be found using `:scope` pseudo-class\n * e.g. 'a:has(> img)' -> `aNode.querySelectorAll(':scope > img')`\n * OR '.block(div > span)' -> `blockClassNode.querySelectorAll(':scope div > span')`.\n */\n specifiedSelector = `${scopeAnyChildren}${regularSelector}`;\n rootElement = element;\n }\n\n if (!rootElement) {\n throw new Error(`Selection by :${pseudoName}() pseudo-class is not possible`);\n }\n\n let relativeElements;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n relativeElements = getElementsForSelectorNode(selectorNode, rootElement, specifiedSelector);\n } catch (e) {\n logger.error(getErrorMessage(e)); // fail for invalid selector\n\n throw new Error(`Invalid selector for :${pseudoName}() pseudo-class: '${regularSelector}'`);\n }\n\n return relativeElements.length > 0;\n });\n};\n/**\n * Checks whether the element is an any element specified by pseudo-class arg.\n * Used for :is() pseudo-class.\n *\n * @param argsData Relative pseudo-class helpers args data.\n *\n * @returns True if **any selector** from argsData.relativeSelectorList is **matched** for argsData.element.\n */\n\n\nconst isAnyElementBySelectorList = argsData => {\n const {\n element,\n relativeSelectorList,\n pseudoName\n } = argsData;\n return relativeSelectorList.children // Array.some() is used here as any selector from selector list should exist on page\n .some(selectorNode => {\n // selectorList.children always starts with regular selector\n const relativeRegularSelector = getFirstInnerRegularChild(selectorNode, pseudoName);\n /**\n * For checking the element by 'div:is(.banner)'\n * we check whether the element's parentElement has any specific direct child.\n */\n\n const rootElement = getParent(element, `Selection by :${pseudoName}() pseudo-class is not possible`);\n /**\n * So we calculate the element \"description\" by it's tagname and attributes for targeting\n * and use it to specify the selection\n * e.g. `div:is(.banner)` --> `divNode.parentElement.querySelectorAll(':scope > .banner')`.\n */\n\n const specifiedSelector = `${scopeDirectChildren}${getNodeValue(relativeRegularSelector)}`;\n let anyElements;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n anyElements = getElementsForSelectorNode(selectorNode, rootElement, specifiedSelector);\n } catch (e) {\n // do not fail on invalid selectors for :is()\n return false;\n } // TODO: figure out how to handle complex selectors with extended pseudo-classes\n // (check readme - extended-css-is-limitations)\n // because `element` and `anyElements` may be from different DOM levels\n\n\n return anyElements.includes(element);\n });\n};\n/**\n * Checks whether the element is not an element specified by pseudo-class arg.\n * Used for :not() pseudo-class.\n *\n * @param argsData Relative pseudo-class helpers args data.\n *\n * @returns True if **any selector** from argsData.relativeSelectorList is **not matched** for argsData.element.\n */\n\n\nconst notElementBySelectorList = argsData => {\n const {\n element,\n relativeSelectorList,\n pseudoName\n } = argsData;\n return relativeSelectorList.children // Array.every() is used here as element should not be selected by any selector from selector list\n .every(selectorNode => {\n // selectorList.children always starts with regular selector\n const relativeRegularSelector = getFirstInnerRegularChild(selectorNode, pseudoName);\n /**\n * For checking the element by 'div:not([data=\"content\"])\n * we check whether the element's parentElement has any specific direct child.\n */\n\n const rootElement = getParent(element, `Selection by :${pseudoName}() pseudo-class is not possible`);\n /**\n * So we calculate the element \"description\" by it's tagname and attributes for targeting\n * and use it to specify the selection\n * e.g. `div:not(.banner)` --> `divNode.parentElement.querySelectorAll(':scope > .banner')`.\n */\n\n const specifiedSelector = `${scopeDirectChildren}${getNodeValue(relativeRegularSelector)}`;\n let anyElements;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n anyElements = getElementsForSelectorNode(selectorNode, rootElement, specifiedSelector);\n } catch (e) {\n // fail on invalid selectors for :not()\n logger.error(getErrorMessage(e)); // eslint-disable-next-line max-len\n\n throw new Error(`Invalid selector for :${pseudoName}() pseudo-class: '${getNodeValue(relativeRegularSelector)}'`);\n } // TODO: figure out how to handle up-looking pseudo-classes inside :not()\n // (check readme - extended-css-not-limitations)\n // because `element` and `anyElements` may be from different DOM levels\n\n\n return !anyElements.includes(element);\n });\n};\n/**\n * Selects dom elements by value of RegularSelector.\n *\n * @param regularSelectorNode RegularSelector node.\n * @param root Root DOM element.\n * @param specifiedSelector @see {@link SpecifiedSelector}.\n *\n * @returns Array of DOM elements.\n * @throws An error if RegularSelector node value is an invalid selector.\n */\n\n\nconst getByRegularSelector = (regularSelectorNode, root, specifiedSelector) => {\n const selectorText = specifiedSelector ? specifiedSelector : getNodeValue(regularSelectorNode);\n let selectedElements = [];\n\n try {\n selectedElements = Array.from(root.querySelectorAll(selectorText));\n } catch (e) {\n throw new Error(`Error: unable to select by '${selectorText}' — ${getErrorMessage(e)}`);\n }\n\n return selectedElements;\n};\n/**\n * Returns list of dom elements filtered or selected by ExtendedSelector node.\n *\n * @param domElements Array of DOM elements.\n * @param extendedSelectorNode ExtendedSelector node.\n *\n * @returns Array of DOM elements.\n * @throws An error on unknown pseudo-class,\n * absent or invalid arg of extended pseudo-class, etc.\n */\n\nconst getByExtendedSelector = (domElements, extendedSelectorNode) => {\n let foundElements = [];\n const extendedPseudoClassNode = getPseudoClassNode(extendedSelectorNode);\n const pseudoName = getNodeName(extendedPseudoClassNode);\n\n if (isAbsolutePseudoClass(pseudoName)) {\n // absolute extended pseudo-classes should have an argument\n const absolutePseudoArg = getNodeValue(extendedPseudoClassNode, `Missing arg for :${pseudoName}() pseudo-class`);\n\n if (pseudoName === NTH_ANCESTOR_PSEUDO_CLASS_MARKER) {\n // :nth-ancestor()\n foundElements = findByAbsolutePseudoPseudo.nthAncestor(domElements, absolutePseudoArg, pseudoName);\n } else if (pseudoName === XPATH_PSEUDO_CLASS_MARKER) {\n // :xpath()\n try {\n document.createExpression(absolutePseudoArg, null);\n } catch (e) {\n throw new Error(`Invalid argument of :${pseudoName}() pseudo-class: '${absolutePseudoArg}'`);\n }\n\n foundElements = findByAbsolutePseudoPseudo.xpath(domElements, absolutePseudoArg);\n } else if (pseudoName === UPWARD_PSEUDO_CLASS_MARKER) {\n // :upward()\n if (Number.isNaN(Number(absolutePseudoArg))) {\n // so arg is selector, not a number\n foundElements = findByAbsolutePseudoPseudo.upward(domElements, absolutePseudoArg);\n } else {\n foundElements = findByAbsolutePseudoPseudo.nthAncestor(domElements, absolutePseudoArg, pseudoName);\n }\n } else {\n // all other absolute extended pseudo-classes\n // e.g. contains, matches-attr, etc.\n foundElements = domElements.filter(element => {\n return isMatchedByAbsolutePseudo(element, pseudoName, absolutePseudoArg);\n });\n }\n } else if (isRelativePseudoClass(pseudoName)) {\n const relativeSelectorList = getRelativeSelectorListNode(extendedPseudoClassNode);\n let relativePredicate;\n\n switch (pseudoName) {\n case HAS_PSEUDO_CLASS_MARKER:\n case ABP_HAS_PSEUDO_CLASS_MARKER:\n relativePredicate = element => hasRelativesBySelectorList({\n element,\n relativeSelectorList,\n pseudoName\n });\n\n break;\n\n case IS_PSEUDO_CLASS_MARKER:\n relativePredicate = element => isAnyElementBySelectorList({\n element,\n relativeSelectorList,\n pseudoName\n });\n\n break;\n\n case NOT_PSEUDO_CLASS_MARKER:\n relativePredicate = element => notElementBySelectorList({\n element,\n relativeSelectorList,\n pseudoName\n });\n\n break;\n\n default:\n throw new Error(`Unknown relative pseudo-class: '${pseudoName}'`);\n }\n\n foundElements = domElements.filter(relativePredicate);\n } else {\n // extra check is parser missed something\n throw new Error(`Unknown extended pseudo-class: '${pseudoName}'`);\n }\n\n return foundElements;\n};\n/**\n * Returns list of dom elements which is selected by RegularSelector value.\n *\n * @param domElements Array of DOM elements.\n * @param regularSelectorNode RegularSelector node.\n *\n * @returns Array of DOM elements.\n * @throws An error if RegularSelector has not value.\n */\n\nconst getByFollowingRegularSelector = (domElements, regularSelectorNode) => {\n // array of arrays because of Array.map() later\n let foundElements = [];\n const value = getNodeValue(regularSelectorNode);\n\n if (value.startsWith(CHILD_COMBINATOR)) {\n // e.g. div:has(> img) > .banner\n foundElements = domElements.map(root => {\n const specifiedSelector = `${SCOPE_CSS_PSEUDO_CLASS}${value}`;\n return getByRegularSelector(regularSelectorNode, root, specifiedSelector);\n });\n } else if (value.startsWith(NEXT_SIBLING_COMBINATOR) || value.startsWith(SUBSEQUENT_SIBLING_COMBINATOR)) {\n // e.g. div:has(> img) + .banner\n // or div:has(> img) ~ .banner\n foundElements = domElements.map(element => {\n const rootElement = element.parentElement;\n\n if (!rootElement) {\n // do not throw error if there in no parent for element\n // e.g. '*:contains(text)' selects `html` which has no parentElement\n return [];\n }\n\n const elementSelectorText = getElementSelectorDesc(element);\n const specifiedSelector = `${scopeDirectChildren}${elementSelectorText}${value}`;\n const selected = getByRegularSelector(regularSelectorNode, rootElement, specifiedSelector);\n return selected;\n });\n } else {\n // space-separated regular selector after extended one\n // e.g. div:has(> img) .banner\n foundElements = domElements.map(root => {\n const specifiedSelector = `${scopeAnyChildren}${getNodeValue(regularSelectorNode)}`;\n return getByRegularSelector(regularSelectorNode, root, specifiedSelector);\n });\n } // foundElements should be flattened\n // as getByRegularSelector() returns elements array, and Array.map() collects them to array\n\n\n return flatten(foundElements);\n};\n/**\n * Returns elements nodes for Selector node.\n * As far as any selector always starts with regular part,\n * it selects by RegularSelector first and checks found elements later.\n *\n * Relative pseudo-classes has it's own subtree so getElementsForSelectorNode is called recursively.\n *\n * 'specifiedSelector' is needed for :has(), :is(), and :not() pseudo-classes\n * as native querySelectorAll() does not select exact element descendants even if it is called on 'div'\n * e.g. ':scope' specification is needed for proper descendants selection for 'div:has(> img)'.\n * So we check `divNode.querySelectorAll(':scope > img').length > 0`.\n *\n * @param selectorNode Selector node.\n * @param root Root DOM element.\n * @param specifiedSelector Needed element specification.\n *\n * @returns Array of DOM elements.\n * @throws An error if there is no selectorNodeChild.\n */\n\nconst getElementsForSelectorNode = (selectorNode, root, specifiedSelector) => {\n let selectedElements = [];\n let i = 0;\n\n while (i < selectorNode.children.length) {\n const selectorNodeChild = getItemByIndex(selectorNode.children, i, 'selectorNodeChild should be specified');\n\n if (i === 0) {\n // any selector always starts with regular selector\n selectedElements = getByRegularSelector(selectorNodeChild, root, specifiedSelector);\n } else if (isExtendedSelectorNode(selectorNodeChild)) {\n // filter previously selected elements by next selector nodes\n selectedElements = getByExtendedSelector(selectedElements, selectorNodeChild);\n } else if (isRegularSelectorNode(selectorNodeChild)) {\n selectedElements = getByFollowingRegularSelector(selectedElements, selectorNodeChild);\n }\n\n i += 1;\n }\n\n return selectedElements;\n};\n\n/**\n * Selects elements by ast.\n *\n * @param ast Ast of parsed selector.\n * @param doc Document.\n *\n * @returns Array of DOM elements.\n */\n\nconst selectElementsByAst = function (ast) {\n let doc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;\n const selectedElements = []; // ast root is SelectorList node;\n // it has Selector nodes as children which should be processed separately\n\n ast.children.forEach(selectorNode => {\n selectedElements.push(...getElementsForSelectorNode(selectorNode, doc));\n }); // selectedElements should be flattened as it is array of arrays with elements\n\n const uniqueElements = [...new Set(flatten(selectedElements))];\n return uniqueElements;\n};\n/**\n * Class of ExtCssDocument is needed for caching.\n * For making cache related to each new instance of class, not global.\n */\n\nclass ExtCssDocument {\n /**\n * Cache with selectors and their AST parsing results.\n */\n\n /**\n * Creates new ExtCssDocument and inits new `astCache`.\n */\n constructor() {\n this.astCache = new Map();\n }\n /**\n * Saves selector and it's ast to cache.\n *\n * @param selector Standard or extended selector.\n * @param ast Selector ast.\n */\n\n\n saveAstToCache(selector, ast) {\n this.astCache.set(selector, ast);\n }\n /**\n * Returns ast from cache for given selector.\n *\n * @param selector Standard or extended selector.\n *\n * @returns Previously parsed ast found in cache, or null if not found.\n */\n\n\n getAstFromCache(selector) {\n const cachedAst = this.astCache.get(selector) || null;\n return cachedAst;\n }\n /**\n * Returns selector ast:\n * - if cached ast exists — returns it;\n * - if no cached ast — saves newly parsed ast to cache and returns it.\n *\n * @param selector Standard or extended selector.\n *\n * @returns Ast for `selector`.\n */\n\n\n getSelectorAst(selector) {\n let ast = this.getAstFromCache(selector);\n\n if (!ast) {\n ast = parse(selector);\n }\n\n this.saveAstToCache(selector, ast);\n return ast;\n }\n /**\n * Selects elements by selector.\n *\n * @param selector Standard or extended selector.\n *\n * @returns Array of DOM elements.\n */\n\n\n querySelectorAll(selector) {\n const ast = this.getSelectorAst(selector);\n return selectElementsByAst(ast);\n }\n\n}\nconst extCssDocument = new ExtCssDocument();\n\n/**\n * Converts array of `entries` to object.\n * Object.fromEntries() polyfill because it is not supported by old browsers, e.g. Chrome 55.\n * Only first two elements of `entries` array matter, other will be skipped silently.\n *\n * @see {@link https://caniuse.com/?search=Object.fromEntries}\n *\n * @param entries Array of pairs.\n *\n * @returns Object converted from `entries`.\n */\nconst getObjectFromEntries = entries => {\n const object = {};\n entries.forEach(el => {\n const [key, value] = el;\n object[key] = value;\n });\n return object;\n};\n\nconst DEBUG_PSEUDO_PROPERTY_KEY = 'debug';\n/**\n * Checks the presence of :remove() pseudo-class and validates it while parsing the selector part of css rule.\n *\n * @param rawSelector Selector which may contain :remove() pseudo-class.\n *\n * @returns Parsed selector data with selector and styles.\n * @throws An error on invalid :remove() position.\n */\n\nconst parseRemoveSelector = rawSelector => {\n /**\n * No error will be thrown on invalid selector as it will be validated later\n * so it's better to explicitly specify 'any' selector for :remove() pseudo-class by '*',\n * e.g. '.banner > *:remove()' instead of '.banner > :remove()'.\n */\n // ':remove()'\n // eslint-disable-next-line max-len\n const VALID_REMOVE_MARKER = `${COLON}${REMOVE_PSEUDO_MARKER}${BRACKET.PARENTHESES.LEFT}${BRACKET.PARENTHESES.RIGHT}`; // ':remove(' - needed for validation rules like 'div:remove(2)'\n\n const INVALID_REMOVE_MARKER = `${COLON}${REMOVE_PSEUDO_MARKER}${BRACKET.PARENTHESES.LEFT}`;\n let selector;\n let shouldRemove = false;\n const firstIndex = rawSelector.indexOf(VALID_REMOVE_MARKER);\n\n if (firstIndex === 0) {\n // e.g. ':remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.NO_TARGET_SELECTOR}: '${rawSelector}'`);\n } else if (firstIndex > 0) {\n if (firstIndex !== rawSelector.lastIndexOf(VALID_REMOVE_MARKER)) {\n // rule with more than one :remove() pseudo-class is invalid\n // e.g. '.block:remove() > .banner:remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.MULTIPLE_USAGE}: '${rawSelector}'`);\n } else if (firstIndex + VALID_REMOVE_MARKER.length < rawSelector.length) {\n // remove pseudo-class should be last in the rule\n // e.g. '.block:remove():upward(2)'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_POSITION}: '${rawSelector}'`);\n } else {\n // valid :remove() pseudo-class position\n selector = rawSelector.substring(0, firstIndex);\n shouldRemove = true;\n }\n } else if (rawSelector.includes(INVALID_REMOVE_MARKER)) {\n // it is not valid if ':remove()' is absent in rule but just ':remove(' is present\n // e.g. 'div:remove(0)'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${rawSelector}'`);\n } else {\n // there is no :remove() pseudo-class in rule\n selector = rawSelector;\n }\n\n const stylesOfSelector = shouldRemove ? [{\n property: REMOVE_PSEUDO_MARKER,\n value: PSEUDO_PROPERTY_POSITIVE_VALUE\n }] : [];\n return {\n selector,\n stylesOfSelector\n };\n};\n/**\n * Parses cropped selector part found before `{`.\n *\n * @param selectorBuffer Buffered selector to parse.\n * @param extCssDoc Needed for caching of selector ast.\n *\n * @returns Parsed validation data for cropped part of stylesheet which may be a selector.\n * @throws An error on unsupported CSS features, e.g. at-rules.\n */\n\nconst parseSelectorRulePart = (selectorBuffer, extCssDoc) => {\n let selector = selectorBuffer.trim();\n\n if (selector.startsWith(AT_RULE_MARKER)) {\n throw new Error(`${NO_AT_RULE_ERROR_PREFIX}: '${selector}'.`);\n }\n\n let removeSelectorData;\n\n try {\n removeSelectorData = parseRemoveSelector(selector);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n }\n\n let stylesOfSelector = [];\n let success = false;\n let ast;\n\n try {\n selector = removeSelectorData.selector;\n stylesOfSelector = removeSelectorData.stylesOfSelector; // validate found selector by parsing it to ast\n // so if it is invalid error will be thrown\n\n ast = extCssDoc.getSelectorAst(selector);\n success = true;\n } catch (e) {\n success = false;\n }\n\n return {\n success,\n selector,\n ast,\n stylesOfSelector\n };\n};\n/**\n * Creates a map for storing raw results of css rules parsing.\n * Used for merging styles for same selector.\n *\n * @returns Map where **key** is `selector`\n * and **value** is object with `ast` and `styles`.\n */\n\nconst createRawResultsMap = () => {\n return new Map();\n};\n/**\n * Saves rules data for unique selectors.\n *\n * @param rawResults Previously collected results of parsing.\n * @param rawRuleData Parsed rule data.\n *\n * @throws An error if there is no rawRuleData.styles or rawRuleData.ast.\n */\n\nconst saveToRawResults = (rawResults, rawRuleData) => {\n const {\n selector,\n ast,\n rawStyles\n } = rawRuleData;\n\n if (!rawStyles) {\n throw new Error(`No style declaration for selector: '${selector}'`);\n }\n\n if (!ast) {\n throw new Error(`No ast parsed for selector: '${selector}'`);\n }\n\n const storedRuleData = rawResults.get(selector);\n\n if (!storedRuleData) {\n rawResults.set(selector, {\n ast,\n styles: rawStyles\n });\n } else {\n storedRuleData.styles.push(...rawStyles);\n }\n};\n/**\n * Checks whether the 'remove' property positively set in styles\n * with only one positive value - 'true'.\n *\n * @param styles Array of styles.\n *\n * @returns True if there is 'remove' property with 'true' value in `styles`.\n */\n\nconst isRemoveSetInStyles = styles => {\n return styles.some(s => {\n return s.property === REMOVE_PSEUDO_MARKER && s.value === PSEUDO_PROPERTY_POSITIVE_VALUE;\n });\n};\n/**\n * Returns 'debug' property value which is set in styles.\n *\n * @param styles Array of styles.\n *\n * @returns Value of 'debug' property if it is set in `styles`,\n * or `undefined` if the property is not found.\n */\n\n\nconst getDebugStyleValue = styles => {\n const debugStyle = styles.find(s => {\n return s.property === DEBUG_PSEUDO_PROPERTY_KEY;\n });\n return debugStyle === null || debugStyle === void 0 ? void 0 : debugStyle.value;\n};\n/**\n * Prepares final RuleData.\n * Handles `debug` and `remove` in raw rule data styles.\n *\n * @param rawRuleData Raw data of selector css rule parsing.\n *\n * @returns Parsed ExtendedCss rule data.\n * @throws An error if rawRuleData.ast or rawRuleData.rawStyles not defined.\n */\n\n\nconst prepareRuleData = rawRuleData => {\n const {\n selector,\n ast,\n rawStyles\n } = rawRuleData;\n\n if (!ast) {\n throw new Error(`AST should be parsed for selector: '${selector}'`);\n }\n\n if (!rawStyles) {\n throw new Error(`Styles should be parsed for selector: '${selector}'`);\n }\n\n const ruleData = {\n selector,\n ast\n };\n const debugValue = getDebugStyleValue(rawStyles);\n const shouldRemove = isRemoveSetInStyles(rawStyles);\n let styles = rawStyles;\n\n if (debugValue) {\n // get rid of 'debug' from styles\n styles = rawStyles.filter(s => s.property !== DEBUG_PSEUDO_PROPERTY_KEY); // and set it as separate property only if its value is valid\n // which is 'true' or 'global'\n\n if (debugValue === PSEUDO_PROPERTY_POSITIVE_VALUE || debugValue === DEBUG_PSEUDO_PROPERTY_GLOBAL_VALUE) {\n ruleData.debug = debugValue;\n }\n }\n\n if (shouldRemove) {\n // no other styles are needed to apply if 'remove' is set\n ruleData.style = {\n [REMOVE_PSEUDO_MARKER]: PSEUDO_PROPERTY_POSITIVE_VALUE\n };\n /**\n * 'content' property is needed for ExtCssConfiguration.beforeStyleApplied().\n *\n * @see {@link BeforeStyleAppliedCallback}\n */\n\n const contentStyle = styles.find(s => s.property === CONTENT_CSS_PROPERTY);\n\n if (contentStyle) {\n ruleData.style[CONTENT_CSS_PROPERTY] = contentStyle.value;\n }\n } else {\n // otherwise all styles should be applied.\n // every style property will be unique because of their converting into object\n if (styles.length > 0) {\n const stylesAsEntries = styles.map(style => {\n const {\n property,\n value\n } = style;\n return [property, value];\n });\n const preparedStyleData = getObjectFromEntries(stylesAsEntries);\n ruleData.style = preparedStyleData;\n }\n }\n\n return ruleData;\n};\n/**\n * Combines previously parsed css rules data objects\n * into rules which are ready to apply.\n *\n * @param rawResults Previously parsed css rules data objects.\n *\n * @returns Parsed ExtendedCss rule data.\n */\n\nconst combineRulesData = rawResults => {\n const results = [];\n rawResults.forEach((value, key) => {\n const selector = key;\n const {\n ast,\n styles: rawStyles\n } = value;\n results.push(prepareRuleData({\n selector,\n ast,\n rawStyles\n }));\n });\n return results;\n};\n\n/**\n * Trims `rawStyle` and splits it into tokens.\n *\n * @param rawStyle Style declaration block content inside curly bracket — `{` and `}` —\n * can be a single style declaration or a list of declarations.\n *\n * @returns Array of tokens supported for style declaration block.\n */\n\nconst tokenizeStyleBlock = rawStyle => {\n const styleDeclaration = rawStyle.trim();\n return tokenize(styleDeclaration, SUPPORTED_STYLE_DECLARATION_MARKS);\n};\n\n/**\n * Describes possible style declaration parts.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\n\nconst DECLARATION_PART = {\n PROPERTY: 'property',\n VALUE: 'value'\n};\n\n/**\n * Checks whether the quotes has been opened for style value.\n *\n * @param context Style block parser context.\n *\n * @returns True if style value has already opened quotes.\n */\nconst isValueQuotesOpen = context => {\n return context.bufferValue !== '' && context.valueQuoteMark !== null;\n};\n/**\n * Saves parsed property and value to collection of parsed styles.\n * Prunes context buffers for property and value.\n *\n * @param context Style block parser context.\n */\n\n\nconst collectStyle = context => {\n context.styles.push({\n property: context.bufferProperty.trim(),\n value: context.bufferValue.trim()\n }); // reset buffers\n\n context.bufferProperty = '';\n context.bufferValue = '';\n};\n/**\n * Handles token which is supposed to be a part of style **property**.\n *\n * @param context Style block parser context.\n * @param styleBlock Whole style block which is being parsed.\n * @param token Current token.\n *\n * @throws An error on invalid token.\n */\n\n\nconst processPropertyToken = (context, styleBlock, token) => {\n const {\n value: tokenValue\n } = token;\n\n switch (token.type) {\n case TOKEN_TYPE.WORD:\n if (context.bufferProperty.length > 0) {\n // e.g. 'padding top: 0;' - current tokenValue is 'top' which is not valid\n throw new Error(`Invalid style property in style block: '${styleBlock}'`);\n }\n\n context.bufferProperty += tokenValue;\n break;\n\n case TOKEN_TYPE.MARK:\n // only colon and whitespaces are allowed while style property parsing\n if (tokenValue === COLON) {\n if (context.bufferProperty.trim().length === 0) {\n // e.g. such style block: '{ : none; }'\n throw new Error(`Missing style property before ':' in style block: '${styleBlock}'`);\n } // the property successfully collected\n\n\n context.bufferProperty = context.bufferProperty.trim(); // prepare for value collecting\n\n context.processing = DECLARATION_PART.VALUE; // the property buffer shall be reset after the value is successfully collected\n } else if (WHITE_SPACE_CHARACTERS.includes(tokenValue)) ; else {\n // if after the property there is anything other than ':' except whitespace, this is a parse error\n // https://www.w3.org/TR/css-syntax-3/#consume-declaration\n throw new Error(`Invalid style declaration in style block: '${styleBlock}'`);\n }\n\n break;\n\n default:\n throw new Error(`Unsupported style property character: '${tokenValue}' in style block: '${styleBlock}'`);\n }\n};\n/**\n * Handles token which is supposed to be a part of style **value**.\n *\n * @param context Style block parser context.\n * @param styleBlock Whole style block which is being parsed.\n * @param token Current token.\n *\n * @throws An error on invalid token.\n */\n\n\nconst processValueToken = (context, styleBlock, token) => {\n const {\n value: tokenValue\n } = token;\n\n if (token.type === TOKEN_TYPE.WORD) {\n // simply collect to buffer\n context.bufferValue += tokenValue;\n } else {\n // otherwise check the mark\n switch (tokenValue) {\n case COLON:\n // the ':' character inside of the value should be inside of quotes\n // otherwise the value is not valid\n // e.g. 'content: display: none'\n // parser is here ↑\n if (!isValueQuotesOpen(context)) {\n // eslint-disable-next-line max-len\n throw new Error(`Invalid style value for property '${context.bufferProperty}' in style block: '${styleBlock}'`);\n } // collect the colon inside quotes\n // e.g. 'content: \"test:123\"'\n // parser is here ↑\n\n\n context.bufferValue += tokenValue;\n break;\n\n case SEMICOLON:\n if (isValueQuotesOpen(context)) {\n // ';' inside quotes is part of style value\n // e.g. 'content: \"test;\"'\n context.bufferValue += tokenValue;\n } else {\n // otherwise the value is successfully collected\n // save parsed style\n collectStyle(context); // prepare for value collecting\n\n context.processing = DECLARATION_PART.PROPERTY;\n }\n\n break;\n\n case SINGLE_QUOTE:\n case DOUBLE_QUOTE:\n // if quotes are not open\n if (context.valueQuoteMark === null) {\n // save the opening quote mark for later comparison\n context.valueQuoteMark = tokenValue;\n } else if (!context.bufferValue.endsWith(BACKSLASH) // otherwise a quote appeared in the value earlier,\n // and non-escaped quote should be checked whether it is a closing quote\n && context.valueQuoteMark === tokenValue) {\n context.valueQuoteMark = null;\n } // always save the quote to the buffer\n // but after the context.bufferValue is checked for BACKSLASH above\n // e.g. 'content: \"test:123\"'\n // 'content: \"\\\"\"'\n\n\n context.bufferValue += tokenValue;\n break;\n\n case BACKSLASH:\n if (!isValueQuotesOpen(context)) {\n // eslint-disable-next-line max-len\n throw new Error(`Invalid style value for property '${context.bufferProperty}' in style block: '${styleBlock}'`);\n } // collect the backslash inside quotes\n // e.g. ' content: \"\\\"\" '\n // parser is here ↑\n\n\n context.bufferValue += tokenValue;\n break;\n\n case SPACE:\n case TAB:\n case CARRIAGE_RETURN:\n case LINE_FEED:\n case FORM_FEED:\n // whitespace should be collected only if the value collecting started\n // which means inside of the value\n // e.g. 'width: 100% !important'\n // parser is here ↑\n if (context.bufferValue.length > 0) {\n context.bufferValue += tokenValue;\n } // otherwise it can be omitted\n // e.g. 'width: 100% !important'\n // here ↑\n\n\n break;\n\n default:\n throw new Error(`Unknown style declaration token: '${tokenValue}'`);\n }\n }\n};\n/**\n * Parses css rule style block.\n *\n * @param rawStyleBlock Style block to parse.\n *\n * @returns Array of style declarations.\n * @throws An error on invalid style block.\n */\n\n\nconst parseStyleBlock = rawStyleBlock => {\n const styleBlock = rawStyleBlock.trim();\n const tokens = tokenizeStyleBlock(styleBlock);\n const context = {\n // style declaration parsing always starts with 'property'\n processing: DECLARATION_PART.PROPERTY,\n styles: [],\n bufferProperty: '',\n bufferValue: '',\n valueQuoteMark: null\n };\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n if (!token) {\n break;\n }\n\n if (context.processing === DECLARATION_PART.PROPERTY) {\n processPropertyToken(context, styleBlock, token);\n } else if (context.processing === DECLARATION_PART.VALUE) {\n processValueToken(context, styleBlock, token);\n } else {\n throw new Error('Style declaration parsing failed');\n }\n\n i += 1;\n } // unbalanced value quotes\n // e.g. 'content: \"test} '\n\n\n if (isValueQuotesOpen(context)) {\n throw new Error(`Unbalanced style declaration quotes in style block: '${styleBlock}'`);\n } // collected property and value have not been saved to styles;\n // it is possible for style block with no semicolon at the end\n // e.g. such style block: '{ display: none }'\n\n\n if (context.bufferProperty.length > 0) {\n if (context.bufferValue.length === 0) {\n // e.g. such style blocks:\n // '{ display: }'\n // '{ remove }'\n // eslint-disable-next-line max-len\n throw new Error(`Missing style value for property '${context.bufferProperty}' in style block '${styleBlock}'`);\n }\n\n collectStyle(context);\n } // rule with empty style block\n // e.g. 'div { }'\n\n\n if (context.styles.length === 0) {\n throw new Error(STYLE_ERROR_PREFIX.NO_STYLE);\n }\n\n return context.styles;\n};\n\n/**\n * Returns array of positions of `{` in `cssRule`.\n *\n * @param cssRule CSS rule.\n *\n * @returns Array of left curly bracket indexes.\n */\n\nconst getLeftCurlyBracketIndexes = cssRule => {\n const indexes = [];\n\n for (let i = 0; i < cssRule.length; i += 1) {\n if (cssRule[i] === BRACKET.CURLY.LEFT) {\n indexes.push(i);\n }\n }\n\n return indexes;\n}; // TODO: use `extCssDoc` for caching of style block parser results\n\n/**\n * Parses CSS rule into rules data object:\n * 1. Find the last `{` mark in the rule\n * which supposed to be a divider between selector and style block.\n * 2. Validates found string part before the `{` via selector parser; and if:\n * - parsing failed – get the previous `{` in the rule,\n * and validates a new rule part again [2];\n * - parsing successful — saves a found rule part as selector and parses the style block.\n *\n * @param rawCssRule Single CSS rule to parse.\n * @param extCssDoc ExtCssDocument which is used for selector ast caching.\n *\n * @returns Array of rules data which contains:\n * - selector as string;\n * - ast to query elements by;\n * - map of styles to apply.\n * @throws An error on invalid css rule syntax:\n * - unsupported CSS features – comments and at-rules\n * - invalid selector or style block.\n */\n\n\nconst parseRule = (rawCssRule, extCssDoc) => {\n var _rawRuleData$selector;\n\n const cssRule = rawCssRule.trim();\n\n if (cssRule.includes(`${SLASH}${ASTERISK}`) && cssRule.includes(`${ASTERISK}${SLASH}`)) {\n throw new Error(STYLE_ERROR_PREFIX.NO_COMMENT);\n }\n\n const leftCurlyBracketIndexes = getLeftCurlyBracketIndexes(cssRule); // rule with style block but no selector\n // e.g. '{ display: none; }'\n\n if (getFirst(leftCurlyBracketIndexes) === 0) {\n throw new Error(NO_SELECTOR_ERROR_PREFIX);\n }\n\n let selectorData; // if rule has `{` but there is no `}`\n\n if (leftCurlyBracketIndexes.length > 0 && !cssRule.includes(BRACKET.CURLY.RIGHT)) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_STYLE} OR ${STYLE_ERROR_PREFIX.UNCLOSED_STYLE}`);\n }\n\n if ( // if rule has no `{`\n leftCurlyBracketIndexes.length === 0 // or `}`\n || !cssRule.includes(BRACKET.CURLY.RIGHT)) {\n try {\n // the whole css rule considered as \"selector part\"\n // which may contain :remove() pseudo-class\n selectorData = parseSelectorRulePart(cssRule, extCssDoc);\n\n if (selectorData.success) {\n var _selectorData$stylesO;\n\n // rule with no style block has valid :remove() pseudo-class\n // which is parsed into \"styles\"\n // e.g. 'div:remove()'\n // but also it can be just selector with no styles\n // e.g. 'div'\n // which should not be considered as valid css rule\n if (((_selectorData$stylesO = selectorData.stylesOfSelector) === null || _selectorData$stylesO === void 0 ? void 0 : _selectorData$stylesO.length) === 0) {\n throw new Error(STYLE_ERROR_PREFIX.NO_STYLE_OR_REMOVE);\n }\n\n return {\n selector: selectorData.selector.trim(),\n ast: selectorData.ast,\n rawStyles: selectorData.stylesOfSelector\n };\n } else {\n // not valid selector\n throw new Error('Invalid selector');\n }\n } catch (e) {\n throw new Error(getErrorMessage(e));\n }\n }\n\n let selectorBuffer;\n let styleBlockBuffer;\n const rawRuleData = {\n selector: ''\n }; // css rule should be parsed from its end\n\n for (let i = leftCurlyBracketIndexes.length - 1; i > -1; i -= 1) {\n const index = leftCurlyBracketIndexes[i];\n\n if (!index) {\n throw new Error(`Impossible to continue, no '{' to process for rule: '${cssRule}'`);\n } // selector is before `{`, style block is after it\n\n\n selectorBuffer = cssRule.slice(0, index); // skip curly brackets\n\n styleBlockBuffer = cssRule.slice(index + 1, cssRule.length - 1);\n selectorData = parseSelectorRulePart(selectorBuffer, extCssDoc);\n\n if (selectorData.success) {\n var _rawRuleData$rawStyle;\n\n // selector successfully parsed\n rawRuleData.selector = selectorData.selector.trim();\n rawRuleData.ast = selectorData.ast;\n rawRuleData.rawStyles = selectorData.stylesOfSelector; // style block should be parsed\n // TODO: add cache for style block parsing\n\n const parsedStyles = parseStyleBlock(styleBlockBuffer);\n (_rawRuleData$rawStyle = rawRuleData.rawStyles) === null || _rawRuleData$rawStyle === void 0 ? void 0 : _rawRuleData$rawStyle.push(...parsedStyles); // stop rule parsing\n\n break;\n } else {\n // if selector was not parsed successfully\n // continue with next index of `{`\n continue;\n }\n }\n\n if (((_rawRuleData$selector = rawRuleData.selector) === null || _rawRuleData$selector === void 0 ? void 0 : _rawRuleData$selector.length) === 0) {\n // skip the rule as selector\n throw new Error('Selector in not valid');\n }\n\n return rawRuleData;\n};\n/**\n * Parses array of CSS rules into array of rules data objects.\n * Invalid rules are skipped and not applied,\n * and the errors are logged.\n *\n * @param rawCssRules Array of rules to parse.\n * @param extCssDoc Needed for selector ast caching.\n *\n * @returns Array of parsed valid rules data.\n */\n\nconst parseRules = (rawCssRules, extCssDoc) => {\n const rawResults = createRawResultsMap();\n const warnings = []; // trim all rules and find unique ones\n\n const uniqueRules = [...new Set(rawCssRules.map(r => r.trim()))];\n uniqueRules.forEach(rule => {\n try {\n saveToRawResults(rawResults, parseRule(rule, extCssDoc));\n } catch (e) {\n // skip the invalid rule\n const errorMessage = getErrorMessage(e);\n warnings.push(`'${rule}' - error: '${errorMessage}'`);\n }\n }); // log info about skipped invalid rules\n\n if (warnings.length > 0) {\n logger.info(`Invalid rules:\\n ${warnings.join('\\n ')}`);\n }\n\n return combineRulesData(rawResults);\n};\n\nconst REGEXP_DECLARATION_END = /[;}]/g;\nconst REGEXP_DECLARATION_DIVIDER = /[;:}]/g;\nconst REGEXP_NON_WHITESPACE = /\\S/g;\n/**\n * Interface for stylesheet parser context.\n */\n\n/**\n * Resets rule data buffer to init value after rule successfully collected.\n *\n * @param context Stylesheet parser context.\n */\nconst restoreRuleAcc = context => {\n context.rawRuleData = {\n selector: ''\n };\n};\n/**\n * Parses cropped selector part found before `{` previously.\n *\n * @param context Stylesheet parser context.\n * @param extCssDoc Needed for caching of selector ast.\n *\n * @returns Parsed validation data for cropped part of stylesheet which may be a selector.\n * @throws An error on unsupported CSS features, e.g. at-rules.\n */\n\n\nconst parseSelectorPart = (context, extCssDoc) => {\n let selector = context.selectorBuffer.trim();\n\n if (selector.startsWith(AT_RULE_MARKER)) {\n throw new Error(`${NO_AT_RULE_ERROR_PREFIX}: '${selector}'.`);\n }\n\n let removeSelectorData;\n\n try {\n removeSelectorData = parseRemoveSelector(selector);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n }\n\n if (context.nextIndex === -1) {\n if (selector === removeSelectorData.selector) {\n // rule should have style or pseudo-class :remove()\n throw new Error(`${STYLE_ERROR_PREFIX.NO_STYLE_OR_REMOVE}: '${context.cssToParse}'`);\n } // stop parsing as there is no style declaration and selector parsed fine\n\n\n context.cssToParse = '';\n }\n\n let stylesOfSelector = [];\n let success = false;\n let ast;\n\n try {\n selector = removeSelectorData.selector;\n stylesOfSelector = removeSelectorData.stylesOfSelector; // validate found selector by parsing it to ast\n // so if it is invalid error will be thrown\n\n ast = extCssDoc.getSelectorAst(selector);\n success = true;\n } catch (e) {\n success = false;\n }\n\n if (context.nextIndex > 0) {\n // slice found valid selector part off\n // and parse rest of stylesheet later\n context.cssToParse = context.cssToParse.slice(context.nextIndex);\n }\n\n return {\n success,\n selector,\n ast,\n stylesOfSelector\n };\n};\n/**\n * Recursively parses style declaration string into `Style`s.\n *\n * @param context Stylesheet parser context.\n * @param styles Array of styles.\n *\n * @throws An error on invalid style declaration.\n * @returns A number index of the next `}` in `this.cssToParse`.\n */\n\n\nconst parseUntilClosingBracket = (context, styles) => {\n // Expects \":\", \";\", and \"}\".\n REGEXP_DECLARATION_DIVIDER.lastIndex = context.nextIndex;\n let match = REGEXP_DECLARATION_DIVIDER.exec(context.cssToParse);\n\n if (match === null) {\n throw new Error(`${STYLE_ERROR_PREFIX.INVALID_STYLE}: '${context.cssToParse}'`);\n }\n\n let matchPos = match.index;\n let matched = match[0];\n\n if (matched === BRACKET.CURLY.RIGHT) {\n const declarationChunk = context.cssToParse.slice(context.nextIndex, matchPos);\n\n if (declarationChunk.trim().length === 0) {\n // empty style declaration\n // e.g. 'div { }'\n if (styles.length === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_STYLE}: '${context.cssToParse}'`);\n } // else valid style parsed before it\n // e.g. '{ display: none; }' -- position is after ';'\n\n } else {\n // closing curly bracket '}' is matched before colon ':'\n // trimmed declarationChunk is not a space, between ';' and '}',\n // e.g. 'visible }' in style '{ display: none; visible }' after part before ';' is parsed\n throw new Error(`${STYLE_ERROR_PREFIX.INVALID_STYLE}: '${context.cssToParse}'`);\n }\n\n return matchPos;\n }\n\n if (matched === COLON) {\n const colonIndex = matchPos; // Expects \";\" and \"}\".\n\n REGEXP_DECLARATION_END.lastIndex = colonIndex;\n match = REGEXP_DECLARATION_END.exec(context.cssToParse);\n\n if (match === null) {\n throw new Error(`${STYLE_ERROR_PREFIX.UNCLOSED_STYLE}: '${context.cssToParse}'`);\n }\n\n matchPos = match.index;\n matched = match[0]; // Populates the `styleMap` key-value map.\n\n const property = context.cssToParse.slice(context.nextIndex, colonIndex).trim();\n\n if (property.length === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_PROPERTY}: '${context.cssToParse}'`);\n }\n\n const value = context.cssToParse.slice(colonIndex + 1, matchPos).trim();\n\n if (value.length === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_VALUE}: '${context.cssToParse}'`);\n }\n\n styles.push({\n property,\n value\n }); // finish style parsing if '}' is found\n // e.g. '{ display: none }' -- no ';' at the end of declaration\n\n if (matched === BRACKET.CURLY.RIGHT) {\n return matchPos;\n }\n } // matchPos is the position of the next ';'\n // crop 'cssToParse' and re-run the loop\n\n\n context.cssToParse = context.cssToParse.slice(matchPos + 1);\n context.nextIndex = 0;\n return parseUntilClosingBracket(context, styles); // Should be a subject of tail-call optimization.\n};\n/**\n * Parses next style declaration part in stylesheet.\n *\n * @param context Stylesheet parser context.\n *\n * @returns Array of style data objects.\n */\n\n\nconst parseNextStyle = context => {\n const styles = [];\n const styleEndPos = parseUntilClosingBracket(context, styles); // find next rule after the style declaration\n\n REGEXP_NON_WHITESPACE.lastIndex = styleEndPos + 1;\n const match = REGEXP_NON_WHITESPACE.exec(context.cssToParse);\n\n if (match === null) {\n context.cssToParse = '';\n return styles;\n }\n\n const matchPos = match.index; // cut out matched style declaration for previous selector\n\n context.cssToParse = context.cssToParse.slice(matchPos);\n return styles;\n};\n/**\n * Parses stylesheet of rules into rules data objects (non-recursively):\n * 1. Iterates through stylesheet string.\n * 2. Finds first `{` which can be style declaration start or part of selector.\n * 3. Validates found string part via selector parser; and if:\n * - it throws error — saves string part to buffer as part of selector,\n * slice next stylesheet part to `{` [2] and validates again [3];\n * - no error — saves found string part as selector and starts to parse styles (recursively).\n *\n * @param rawStylesheet Raw stylesheet as string.\n * @param extCssDoc ExtCssDocument which uses cache while selectors parsing.\n * @throws An error on unsupported CSS features, e.g. comments or invalid stylesheet syntax.\n * @returns Array of rules data which contains:\n * - selector as string;\n * - ast to query elements by;\n * - map of styles to apply.\n */\n\n\nconst parseStylesheet = (rawStylesheet, extCssDoc) => {\n const stylesheet = rawStylesheet.trim();\n\n if (stylesheet.includes(`${SLASH}${ASTERISK}`) && stylesheet.includes(`${ASTERISK}${SLASH}`)) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_COMMENT} in stylesheet: '${stylesheet}'`);\n }\n\n const context = {\n // any stylesheet should start with selector\n isSelector: true,\n // init value of parser position\n nextIndex: 0,\n // init value of cssToParse\n cssToParse: stylesheet,\n // buffer for collecting selector part\n selectorBuffer: '',\n // accumulator for rules\n rawRuleData: {\n selector: ''\n }\n };\n const rawResults = createRawResultsMap();\n let selectorData; // context.cssToParse is going to be cropped while its parsing\n\n while (context.cssToParse) {\n if (context.isSelector) {\n // find index of first opening curly bracket\n // which may mean start of style part and end of selector one\n context.nextIndex = context.cssToParse.indexOf(BRACKET.CURLY.LEFT); // rule should not start with style, selector is required\n // e.g. '{ display: none; }'\n\n if (context.selectorBuffer.length === 0 && context.nextIndex === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_SELECTOR}: '${context.cssToParse}'`);\n }\n\n if (context.nextIndex === -1) {\n // no style declaration in rule\n // but rule still may contain :remove() pseudo-class\n context.selectorBuffer = context.cssToParse;\n } else {\n // collect string parts before opening curly bracket\n // until valid selector collected\n context.selectorBuffer += context.cssToParse.slice(0, context.nextIndex);\n }\n\n selectorData = parseSelectorPart(context, extCssDoc);\n\n if (selectorData.success) {\n // selector successfully parsed\n context.rawRuleData.selector = selectorData.selector.trim();\n context.rawRuleData.ast = selectorData.ast;\n context.rawRuleData.rawStyles = selectorData.stylesOfSelector;\n context.isSelector = false; // save rule data if there is no style declaration\n\n if (context.nextIndex === -1) {\n saveToRawResults(rawResults, context.rawRuleData); // clean up ruleContext\n\n restoreRuleAcc(context);\n } else {\n // skip the opening curly bracket at the start of style declaration part\n context.nextIndex = 1;\n context.selectorBuffer = '';\n }\n } else {\n // if selector was not successfully parsed parseSelectorPart(), continue stylesheet parsing:\n // save the found bracket to buffer and proceed to next loop iteration\n context.selectorBuffer += BRACKET.CURLY.LEFT; // delete `{` from cssToParse\n\n context.cssToParse = context.cssToParse.slice(1);\n }\n } else {\n var _context$rawRuleData$;\n\n // style declaration should be parsed\n const parsedStyles = parseNextStyle(context); // styles can be parsed from selector part if it has :remove() pseudo-class\n // e.g. '.banner:remove() { debug: true; }'\n\n (_context$rawRuleData$ = context.rawRuleData.rawStyles) === null || _context$rawRuleData$ === void 0 ? void 0 : _context$rawRuleData$.push(...parsedStyles); // save rule data to results\n\n saveToRawResults(rawResults, context.rawRuleData);\n context.nextIndex = 0; // clean up ruleContext\n\n restoreRuleAcc(context); // parse next rule selector after style successfully parsed\n\n context.isSelector = true;\n }\n }\n\n return combineRulesData(rawResults);\n};\n\n/**\n * Checks whether passed `arg` is number type.\n *\n * @param arg Value to check.\n *\n * @returns True if `arg` is number and not NaN.\n */\nconst isNumber = arg => {\n return typeof arg === 'number' && !Number.isNaN(arg);\n};\n\n/**\n * The purpose of ThrottleWrapper is to throttle calls of the function\n * that applies ExtendedCss rules. The reasoning here is that the function calls\n * are triggered by MutationObserver and there may be many mutations in a short period of time.\n * We do not want to apply rules on every mutation so we use this helper to make sure\n * that there is only one call in the given amount of time.\n */\n\nclass ThrottleWrapper {\n /**\n * Creates new ThrottleWrapper.\n * The {@link callback} should be executed not more often than {@link ThrottleWrapper.THROTTLE_DELAY_MS}.\n *\n * @param callback The callback.\n */\n constructor(callback) {\n this.callback = callback;\n this.executeCallback = this.executeCallback.bind(this);\n }\n /**\n * Calls the {@link callback} function and update bounded throttle wrapper properties.\n */\n\n\n executeCallback() {\n this.lastRunTime = performance.now();\n\n if (isNumber(this.timerId)) {\n clearTimeout(this.timerId);\n delete this.timerId;\n }\n\n this.callback();\n }\n /**\n * Schedules the {@link executeCallback} function execution via setTimeout.\n * It may triggered by MutationObserver job which may occur too ofter, so we limit the function execution:\n *\n * 1. If {@link timerId} is set, ignore the call, because the function is already scheduled to be executed;\n *\n * 2. If {@link lastRunTime} is set, we need to check the time elapsed time since the last call. If it is\n * less than {@link ThrottleWrapper.THROTTLE_DELAY_MS}, we schedule the function execution after the remaining time.\n * \n * Otherwise, we execute the function asynchronously to ensure that it is executed \n * in the correct order with respect to DOM events, by deferring its execution until after \n * those tasks have completed.\n */\n\n\n run() {\n if (isNumber(this.timerId)) {\n // there is a pending execution scheduled\n return;\n }\n\n if (isNumber(this.lastRunTime)) {\n const elapsedTime = performance.now() - this.lastRunTime;\n\n if (elapsedTime < ThrottleWrapper.THROTTLE_DELAY_MS) {\n this.timerId = window.setTimeout(this.executeCallback, ThrottleWrapper.THROTTLE_DELAY_MS - elapsedTime);\n return;\n }\n }\n /**\n * We use `setTimeout` instead `requestAnimationFrame`\n * here because requestAnimationFrame can be delayed for a long time\n * when the browser saves battery or the engine is heavily loaded.\n */\n\n\n this.timerId = window.setTimeout(this.executeCallback);\n }\n\n}\n\n_defineProperty(ThrottleWrapper, \"THROTTLE_DELAY_MS\", 150);\n\nconst LAST_EVENT_TIMEOUT_MS = 10;\nconst IGNORED_EVENTS = ['mouseover', 'mouseleave', 'mouseenter', 'mouseout'];\nconst SUPPORTED_EVENTS = [// keyboard events\n'keydown', 'keypress', 'keyup', // mouse events\n'auxclick', 'click', 'contextmenu', 'dblclick', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseover', 'mouseout', 'mouseup', 'pointerlockchange', 'pointerlockerror', 'select', 'wheel']; // 'wheel' event makes scrolling in Safari twitchy\n// https://github.com/AdguardTeam/ExtendedCss/issues/120\n\nconst SAFARI_PROBLEMATIC_EVENTS = ['wheel'];\n/**\n * We use EventTracker to track the event that is likely to cause the mutation.\n * The problem is that we cannot use `window.event` directly from the mutation observer call\n * as we're not in the event handler context anymore.\n */\n\nclass EventTracker {\n /**\n * Creates new EventTracker.\n */\n constructor() {\n _defineProperty(this, \"getLastEventType\", () => this.lastEventType);\n\n _defineProperty(this, \"getTimeSinceLastEvent\", () => {\n if (!this.lastEventTime) {\n return null;\n }\n\n return Date.now() - this.lastEventTime;\n });\n\n this.trackedEvents = isSafariBrowser ? SUPPORTED_EVENTS.filter(event => !SAFARI_PROBLEMATIC_EVENTS.includes(event)) : SUPPORTED_EVENTS;\n this.trackedEvents.forEach(eventName => {\n document.documentElement.addEventListener(eventName, this.trackEvent, true);\n });\n }\n /**\n * Callback for event listener for events tracking.\n *\n * @param event Any event.\n */\n\n\n trackEvent(event) {\n this.lastEventType = event.type;\n this.lastEventTime = Date.now();\n }\n\n /**\n * Checks whether the last caught event should be ignored.\n *\n * @returns True if event should be ignored.\n */\n isIgnoredEventType() {\n const lastEventType = this.getLastEventType();\n const sinceLastEventTime = this.getTimeSinceLastEvent();\n return !!lastEventType && IGNORED_EVENTS.includes(lastEventType) && !!sinceLastEventTime && sinceLastEventTime < LAST_EVENT_TIMEOUT_MS;\n }\n /**\n * Stops event tracking by removing event listener.\n */\n\n\n stopTracking() {\n this.trackedEvents.forEach(eventName => {\n document.documentElement.removeEventListener(eventName, this.trackEvent, true);\n });\n }\n\n}\n\n/**\n * We are trying to limit the number of callback calls by not calling it on all kind of \"hover\" events.\n * The rationale behind this is that \"hover\" events often cause attributes modification,\n * but re-applying extCSS rules will be useless as these attribute changes are usually transient.\n *\n * @param mutations DOM elements mutation records.\n * @returns True if all mutations are about attributes changes, otherwise false.\n */\n\nfunction shouldIgnoreMutations(mutations) {\n // ignore if all mutations are about attributes changes\n return !mutations.some(m => m.type !== 'attributes');\n}\n/**\n * Adds new {@link context.domMutationObserver} instance and connect it to document.\n * \n * @param context ExtendedCss context.\n */\n\n\nfunction observeDocument(context) {\n if (context.isDomObserved) {\n return;\n } // enable dynamically added elements handling\n\n\n context.isDomObserved = true;\n context.domMutationObserver = new natives.MutationObserver(mutations => {\n if (!mutations || mutations.length === 0) {\n return;\n }\n\n const eventTracker = new EventTracker();\n\n if (eventTracker.isIgnoredEventType() && shouldIgnoreMutations(mutations)) {\n return;\n } // save instance of EventTracker to context\n // for removing its event listeners on disconnectDocument() while mainDisconnect()\n\n\n context.eventTracker = eventTracker;\n context.scheduler.run();\n });\n context.domMutationObserver.observe(document, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['id', 'class']\n });\n}\n/**\n * Disconnect from {@link context.domMutationObserver}.\n * \n * @param context ExtendedCss context.\n */\n\nfunction disconnectDocument(context) {\n if (!context.isDomObserved) {\n return;\n } // disable dynamically added elements handling\n\n\n context.isDomObserved = false;\n\n if (context.domMutationObserver) {\n context.domMutationObserver.disconnect();\n } // clean up event listeners\n\n\n if (context.eventTracker) {\n context.eventTracker.stopTracking();\n }\n}\n\nconst CONTENT_ATTR_PREFIX_REGEXP = /^(\"|')adguard.+?/;\n/**\n * Removes affectedElement.node from DOM.\n *\n * @param context ExtendedCss context.\n * @param affectedElement Affected element.\n */\n\nconst removeElement = (context, affectedElement) => {\n const {\n node\n } = affectedElement;\n affectedElement.removed = true;\n const elementSelector = getElementSelectorPath(node); // check if the element has been already removed earlier\n\n const elementRemovalsCounter = context.removalsStatistic[elementSelector] || 0; // if removals attempts happened more than specified we do not try to remove node again\n\n if (elementRemovalsCounter > MAX_STYLE_PROTECTION_COUNT) {\n logger.error(`ExtendedCss: infinite loop protection for selector: '${elementSelector}'`);\n return;\n }\n\n if (node.parentElement) {\n node.parentElement.removeChild(node);\n context.removalsStatistic[elementSelector] = elementRemovalsCounter + 1;\n }\n};\n/**\n * Sets style to the specified DOM node.\n *\n * @param node DOM element.\n * @param style Style to set.\n */\n\n\nconst setStyleToElement = (node, style) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n Object.keys(style).forEach(prop => {\n // Apply this style only to existing properties\n // We cannot use hasOwnProperty here (does not work in FF)\n if (typeof node.style.getPropertyValue(prop.toString()) !== 'undefined') {\n let value = style[prop];\n\n if (!value) {\n return;\n } // do not apply 'content' style given by tsurlfilter\n // which is needed only for BeforeStyleAppliedCallback\n\n\n if (prop === CONTENT_CSS_PROPERTY && value.match(CONTENT_ATTR_PREFIX_REGEXP)) {\n return;\n } // First we should remove !important attribute (or it won't be applied')\n\n\n value = removeSuffix(value.trim(), '!important').trim();\n node.style.setProperty(prop, value, 'important');\n }\n });\n};\n/**\n * Checks the required properties of `affectedElement`\n * **before** `beforeStyleApplied()` execution.\n *\n * @param affectedElement Affected element.\n *\n * @returns False if there is no `node` or `rules`\n * or `rules` is not an array.\n */\n\nconst isIAffectedElement = affectedElement => {\n return 'node' in affectedElement && 'rules' in affectedElement && affectedElement.rules instanceof Array;\n};\n/**\n * Checks the required properties of `affectedElement`\n * **after** `beforeStyleApplied()` execution.\n * These properties are needed for proper internal usage.\n *\n * @param affectedElement Affected element.\n *\n * @returns False if there is no `node` or `rules`\n * or `rules` is not an array.\n */\n\n\nconst isAffectedElement = affectedElement => {\n return 'node' in affectedElement && 'originalStyle' in affectedElement && 'rules' in affectedElement && affectedElement.rules instanceof Array;\n};\n/**\n * Applies style to the specified DOM node.\n *\n * @param context ExtendedCss context.\n * @param rawAffectedElement Object containing DOM node and rule to be applied.\n *\n * @throws An error if affectedElement has no style to apply.\n */\n\n\nconst applyStyle = (context, rawAffectedElement) => {\n if (rawAffectedElement.protectionObserver) {\n // style is already applied and protected by the observer\n return;\n }\n\n let affectedElement;\n\n if (context.beforeStyleApplied) {\n if (!isIAffectedElement(rawAffectedElement)) {\n throw new Error(\"Returned IAffectedElement should have 'node' and 'rules' properties\");\n }\n\n affectedElement = context.beforeStyleApplied(rawAffectedElement);\n\n if (!affectedElement) {\n throw new Error(\"Callback 'beforeStyleApplied' should return IAffectedElement\");\n }\n } else {\n affectedElement = rawAffectedElement;\n }\n\n if (!isAffectedElement(affectedElement)) {\n throw new Error(\"Returned IAffectedElement should have 'node' and 'rules' properties\");\n }\n\n const {\n node,\n rules\n } = affectedElement;\n\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n const selector = rule === null || rule === void 0 ? void 0 : rule.selector;\n const style = rule === null || rule === void 0 ? void 0 : rule.style;\n const debug = rule === null || rule === void 0 ? void 0 : rule.debug; // rule may not have style to apply\n // e.g. 'div:has(> a) { debug: true }' -> means no style to apply, and enable debug mode\n\n if (style) {\n if (style[REMOVE_PSEUDO_MARKER] === PSEUDO_PROPERTY_POSITIVE_VALUE) {\n removeElement(context, affectedElement);\n return;\n }\n\n setStyleToElement(node, style);\n } else if (!debug) {\n // but rule should not have both style and debug properties\n throw new Error(`No style declaration in rule for selector: '${selector}'`);\n }\n }\n};\n/**\n * Reverts style for the affected object.\n *\n * @param affectedElement Affected element.\n */\n\nconst revertStyle = affectedElement => {\n if (affectedElement.protectionObserver) {\n affectedElement.protectionObserver.disconnect();\n }\n\n affectedElement.node.style.cssText = affectedElement.originalStyle;\n};\n\n/**\n * ExtMutationObserver is a wrapper over regular MutationObserver with one additional function:\n * it keeps track of the number of times we called the \"ProtectionCallback\".\n *\n * We use an instance of this to monitor styles added by ExtendedCss\n * and to make sure these styles are recovered if the page script attempts to modify them.\n *\n * However, we want to avoid endless loops of modification if the page script repeatedly modifies the styles.\n * So we keep track of the number of calls and observe() makes a decision\n * whether to continue recovering the styles or not.\n */\n\nclass ExtMutationObserver {\n /**\n * Extra property for keeping 'style fix counts'.\n */\n\n /**\n * Creates new ExtMutationObserver.\n *\n * @param protectionCallback Callback which execution should be counted.\n */\n constructor(protectionCallback) {\n this.styleProtectionCount = 0;\n this.observer = new natives.MutationObserver(mutations => {\n if (!mutations.length) {\n return;\n }\n\n this.styleProtectionCount += 1;\n protectionCallback(mutations, this);\n });\n }\n /**\n * Starts to observe target element,\n * prevents infinite loop of observing due to the limited number of times of callback runs.\n *\n * @param target Target to observe.\n * @param options Mutation observer options.\n */\n\n\n observe(target, options) {\n if (this.styleProtectionCount < MAX_STYLE_PROTECTION_COUNT) {\n this.observer.observe(target, options);\n } else {\n logger.error('ExtendedCss: infinite loop protection for style');\n }\n }\n /**\n * Stops ExtMutationObserver from observing any mutations.\n * Until the `observe()` is used again, `protectionCallback` will not be invoked.\n */\n\n\n disconnect() {\n this.observer.disconnect();\n }\n\n}\n\nconst PROTECTION_OBSERVER_OPTIONS = {\n attributes: true,\n attributeOldValue: true,\n attributeFilter: ['style']\n};\n/**\n * Creates MutationObserver protection callback.\n *\n * @param styles Styles data object.\n *\n * @returns Callback for styles protection.\n */\n\nconst createProtectionCallback = styles => {\n const protectionCallback = (mutations, extObserver) => {\n if (!mutations[0]) {\n return;\n }\n\n const {\n target\n } = mutations[0];\n extObserver.disconnect();\n styles.forEach(style => {\n setStyleToElement(target, style);\n });\n extObserver.observe(target, PROTECTION_OBSERVER_OPTIONS);\n };\n\n return protectionCallback;\n};\n/**\n * Sets up a MutationObserver which protects style attributes from changes.\n *\n * @param node DOM node.\n * @param rules Rule data objects.\n * @returns Mutation observer used to protect attribute or null if there's nothing to protect.\n */\n\n\nconst protectStyleAttribute = (node, rules) => {\n if (!natives.MutationObserver) {\n return null;\n }\n\n const styles = [];\n rules.forEach(ruleData => {\n const {\n style\n } = ruleData; // some rules might have only debug property in style declaration\n // e.g. 'div:has(> a) { debug: true }' -> parsed to boolean `ruleData.debug`\n // so no style is fine, and here we should collect only valid styles to protect\n\n if (style) {\n styles.push(style);\n }\n });\n const protectionObserver = new ExtMutationObserver(createProtectionCallback(styles));\n protectionObserver.observe(node, PROTECTION_OBSERVER_OPTIONS);\n return protectionObserver;\n};\n\nconst STATS_DECIMAL_DIGITS_COUNT = 4;\n\n/**\n * A helper class for applied rule stats.\n */\nclass TimingStats {\n /**\n * Creates new TimingStats.\n */\n constructor() {\n this.appliesTimings = [];\n this.appliesCount = 0;\n this.timingsSum = 0;\n this.meanTiming = 0;\n this.squaredSum = 0;\n this.standardDeviation = 0;\n }\n /**\n * Observe target element and mark observer as active.\n *\n * @param elapsedTimeMs Time in ms.\n */\n\n\n push(elapsedTimeMs) {\n this.appliesTimings.push(elapsedTimeMs);\n this.appliesCount += 1;\n this.timingsSum += elapsedTimeMs;\n this.meanTiming = this.timingsSum / this.appliesCount;\n this.squaredSum += elapsedTimeMs * elapsedTimeMs;\n this.standardDeviation = Math.sqrt(this.squaredSum / this.appliesCount - Math.pow(this.meanTiming, 2));\n }\n\n}\n\n/**\n * Makes the timestamps more readable.\n *\n * @param timestamp Raw timestamp.\n *\n * @returns Fine-looking timestamps.\n */\nconst beautifyTimingNumber = timestamp => {\n return Number(timestamp.toFixed(STATS_DECIMAL_DIGITS_COUNT));\n};\n/**\n * Improves timing stats readability.\n *\n * @param rawTimings Collected timings with raw timestamp.\n *\n * @returns Fine-looking timing stats.\n */\n\n\nconst beautifyTimings = rawTimings => {\n return {\n appliesTimings: rawTimings.appliesTimings.map(t => beautifyTimingNumber(t)),\n appliesCount: beautifyTimingNumber(rawTimings.appliesCount),\n timingsSum: beautifyTimingNumber(rawTimings.timingsSum),\n meanTiming: beautifyTimingNumber(rawTimings.meanTiming),\n standardDeviation: beautifyTimingNumber(rawTimings.standardDeviation)\n };\n};\n/**\n * Prints timing information if debugging mode is enabled.\n *\n * @param context ExtendedCss context.\n */\n\n\nconst printTimingInfo = context => {\n if (context.areTimingsPrinted) {\n return;\n }\n\n context.areTimingsPrinted = true;\n const timingsLogData = {};\n context.parsedRules.forEach(ruleData => {\n if (ruleData.timingStats) {\n const {\n selector,\n style,\n debug,\n matchedElements\n } = ruleData; // style declaration for some rules is parsed to debug property and no style to apply\n // e.g. 'div:has(> a) { debug: true }'\n\n if (!style && !debug) {\n throw new Error(`Rule should have style declaration for selector: '${selector}'`);\n }\n\n const selectorData = {\n selectorParsed: selector,\n timings: beautifyTimings(ruleData.timingStats)\n }; // `ruleData.style` may contain `remove` pseudo-property\n // and make logs look better\n\n if (style && style[REMOVE_PSEUDO_MARKER] === PSEUDO_PROPERTY_POSITIVE_VALUE) {\n selectorData.removed = true; // no matchedElements for such case as they are removed after ExtendedCss applied\n } else {\n selectorData.styleApplied = style || null;\n selectorData.matchedElements = matchedElements;\n }\n\n timingsLogData[selector] = selectorData;\n }\n });\n\n if (Object.keys(timingsLogData).length === 0) {\n return;\n } // add location.href to the message to distinguish frames\n\n\n logger.info('[ExtendedCss] Timings in milliseconds for %o:\\n%o', window.location.href, timingsLogData);\n};\n\n/**\n * Finds affectedElement object for the specified DOM node.\n *\n * @param affElements Array of affected elements — context.affectedElements.\n * @param domNode DOM node.\n * @returns Found affectedElement or undefined.\n */\n\nconst findAffectedElement = (affElements, domNode) => {\n return affElements.find(affEl => affEl.node === domNode);\n};\n/**\n * Applies specified rule and returns list of elements affected.\n *\n * @param context ExtendedCss context.\n * @param ruleData Rule to apply.\n * @returns List of elements affected by the rule.\n */\n\n\nconst applyRule = (context, ruleData) => {\n // debugging mode can be enabled in two ways:\n // 1. for separate rules - by `{ debug: true; }`\n // 2. for all rules simultaneously by:\n // - `{ debug: global; }` in any rule\n // - positive `debug` property in ExtCssConfiguration\n const isDebuggingMode = !!ruleData.debug || context.debug;\n let startTime;\n\n if (isDebuggingMode) {\n startTime = performance.now();\n }\n\n const {\n ast\n } = ruleData;\n const nodes = []; // selector can be successfully parser into ast with no error\n // but its applying by native Document.querySelectorAll() still may throw an error\n // e.g. 'div[..banner]'\n\n try {\n nodes.push(...selectElementsByAst(ast));\n } catch (e) {\n // log the error only in debug mode\n if (context.debug) {\n logger.error(getErrorMessage(e));\n }\n }\n\n nodes.forEach(node => {\n let affectedElement = findAffectedElement(context.affectedElements, node);\n\n if (affectedElement) {\n affectedElement.rules.push(ruleData);\n applyStyle(context, affectedElement);\n } else {\n // Applying style first time\n const originalStyle = node.style.cssText;\n affectedElement = {\n node,\n // affected DOM node\n rules: [ruleData],\n // rule to be applied\n originalStyle,\n // original node style\n protectionObserver: null // style attribute observer\n\n };\n applyStyle(context, affectedElement);\n context.affectedElements.push(affectedElement);\n }\n });\n\n if (isDebuggingMode && startTime) {\n const elapsedTimeMs = performance.now() - startTime;\n\n if (!ruleData.timingStats) {\n ruleData.timingStats = new TimingStats();\n }\n\n ruleData.timingStats.push(elapsedTimeMs);\n }\n\n return nodes;\n};\n/**\n * Applies filtering rules.\n *\n * @param context ExtendedCss context.\n */\n\n\nconst applyRules = context => {\n const newSelectedElements = []; // some rules could make call - selector.querySelectorAll() temporarily to change node id attribute\n // this caused MutationObserver to call recursively\n // https://github.com/AdguardTeam/ExtendedCss/issues/81\n\n disconnectDocument(context);\n context.parsedRules.forEach(ruleData => {\n const nodes = applyRule(context, ruleData);\n Array.prototype.push.apply(newSelectedElements, nodes); // save matched elements to ruleData as linked to applied rule\n // only for debugging purposes\n\n if (ruleData.debug) {\n ruleData.matchedElements = nodes;\n }\n }); // Now revert styles for elements which are no more affected\n\n let affLength = context.affectedElements.length; // do nothing if there is no elements to process\n\n while (affLength) {\n const affectedElement = context.affectedElements[affLength - 1];\n\n if (!affectedElement) {\n break;\n }\n\n if (!newSelectedElements.includes(affectedElement.node)) {\n // Time to revert style\n revertStyle(affectedElement);\n context.affectedElements.splice(affLength - 1, 1);\n } else if (!affectedElement.removed) {\n // Add style protection observer\n // Protect \"style\" attribute from changes\n if (!affectedElement.protectionObserver) {\n affectedElement.protectionObserver = protectStyleAttribute(affectedElement.node, affectedElement.rules);\n }\n }\n\n affLength -= 1;\n } // After styles are applied we can start observe again\n\n\n observeDocument(context);\n printTimingInfo(context);\n};\n\n/**\n * Result of selector validation.\n */\n\n/**\n * Main class of ExtendedCss lib.\n *\n * Parses css stylesheet with any selectors (passed to its argument as styleSheet),\n * and guarantee its applying as mutation observer is used to prevent the restyling of needed elements by other scripts.\n * This style protection is limited to 50 times to avoid infinite loop (MAX_STYLE_PROTECTION_COUNT).\n * Our own ThrottleWrapper is used for styles applying to avoid too often lib reactions on page mutations.\n *\n * Constructor creates the instance of class which should be run be `apply()` method to apply the rules,\n * and the applying can be stopped by `dispose()`.\n *\n * Can be used to select page elements by selector with `query()` method (similar to `Document.querySelectorAll()`),\n * which does not require instance creating.\n */\nclass ExtendedCss {\n /**\n * Creates new ExtendedCss.\n *\n * @param configuration ExtendedCss configuration.\n */\n constructor(configuration) {\n if (!configuration) {\n throw new Error('ExtendedCss configuration should be provided.');\n }\n\n this.applyRulesCallbackListener = this.applyRulesCallbackListener.bind(this);\n this.context = {\n beforeStyleApplied: configuration.beforeStyleApplied,\n debug: false,\n affectedElements: [],\n isDomObserved: false,\n removalsStatistic: {},\n parsedRules: [],\n scheduler: new ThrottleWrapper(this.applyRulesCallbackListener)\n }; // TODO: throw an error instead of logging and handle it in related products.\n\n if (!isBrowserSupported()) {\n logger.error('Browser is not supported by ExtendedCss');\n return;\n } // at least 'styleSheet' or 'cssRules' should be provided\n\n\n if (!configuration.styleSheet && !configuration.cssRules) {\n throw new Error(\"ExtendedCss configuration should have 'styleSheet' or 'cssRules' defined.\");\n } // 'styleSheet' and 'cssRules' are optional\n // and both can be provided at the same time\n // so both should be parsed and applied in such case\n\n\n if (configuration.styleSheet) {\n // stylesheet parsing can fail on some invalid selectors\n try {\n this.context.parsedRules.push(...parseStylesheet(configuration.styleSheet, extCssDocument));\n } catch (e) {\n // eslint-disable-next-line max-len\n throw new Error(`Pass the rules as configuration.cssRules since configuration.styleSheet cannot be parsed because of: '${getErrorMessage(e)}'`);\n }\n }\n\n if (configuration.cssRules) {\n this.context.parsedRules.push(...parseRules(configuration.cssRules, extCssDocument));\n } // true if set in configuration\n // or any rule in styleSheet has `debug: global`\n\n\n this.context.debug = configuration.debug || this.context.parsedRules.some(ruleData => {\n return ruleData.debug === DEBUG_PSEUDO_PROPERTY_GLOBAL_VALUE;\n });\n\n if (this.context.beforeStyleApplied && typeof this.context.beforeStyleApplied !== 'function') {\n // eslint-disable-next-line max-len\n throw new Error(`Invalid configuration. Type of 'beforeStyleApplied' should be a function, received: '${typeof this.context.beforeStyleApplied}'`);\n }\n }\n /**\n * Invokes {@link applyRules} function with current app context.\n * \n * This method is bound to the class instance in the constructor because it is called\n * in {@link ThrottleWrapper} and on the DOMContentLoaded event.\n */\n\n\n applyRulesCallbackListener() {\n applyRules(this.context);\n }\n /**\n * Initializes ExtendedCss.\n *\n * Should be executed on page ASAP,\n * otherwise the :contains() pseudo-class may work incorrectly.\n */\n\n\n init() {\n /**\n * Native Node textContent getter must be intercepted as soon as possible,\n * and stored as it is needed for proper work of :contains() pseudo-class\n * because DOM Node prototype 'textContent' property may be mocked.\n *\n * @see {@link https://github.com/AdguardTeam/ExtendedCss/issues/127}\n */\n nativeTextContent.setGetter();\n }\n /**\n * Applies stylesheet rules on page.\n */\n\n\n apply() {\n applyRules(this.context);\n\n if (document.readyState !== 'complete') {\n document.addEventListener('DOMContentLoaded', this.applyRulesCallbackListener, false);\n }\n }\n /**\n * Disposes ExtendedCss and removes our styles from matched elements.\n */\n\n\n dispose() {\n disconnectDocument(this.context);\n this.context.affectedElements.forEach(el => {\n revertStyle(el);\n });\n document.removeEventListener('DOMContentLoaded', this.applyRulesCallbackListener, false);\n }\n /**\n * Exposed for testing purposes only.\n *\n * @returns Array of AffectedElement data objects.\n */\n\n\n getAffectedElements() {\n return this.context.affectedElements;\n }\n /**\n * Returns a list of the document's elements that match the specified selector.\n * Uses ExtCssDocument.querySelectorAll().\n *\n * @param selector Selector text.\n * @param [noTiming=true] If true — do not print the timings to the console.\n *\n * @throws An error if selector is not valid.\n * @returns A list of elements that match the selector.\n */\n\n\n static query(selector) {\n let noTiming = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (typeof selector !== 'string') {\n throw new Error('Selector should be defined as a string.');\n }\n\n const start = performance.now();\n\n try {\n return extCssDocument.querySelectorAll(selector);\n } finally {\n const end = performance.now();\n\n if (!noTiming) {\n logger.info(`[ExtendedCss] Elapsed: ${Math.round((end - start) * 1000)} μs.`);\n }\n }\n }\n /**\n * Validates selector.\n *\n * @param inputSelector Selector text to validate.\n *\n * @returns Result of selector validation.\n */\n\n\n static validate(inputSelector) {\n try {\n // ExtendedCss in general supports :remove() in selector\n // but ExtendedCss.query() does not support it as it should be parsed by stylesheet parser.\n // so for validation we have to handle selectors with `:remove()` in it\n const {\n selector\n } = parseRemoveSelector(inputSelector);\n ExtendedCss.query(selector);\n return {\n ok: true,\n error: null\n };\n } catch (e) {\n // not valid input `selector` should be logged eventually\n const error = `Error: Invalid selector: '${inputSelector}' -- ${getErrorMessage(e)}`;\n return {\n ok: false,\n error\n };\n }\n }\n\n}\n\nexport { ExtendedCss };\n","import browser from 'webextension-polyfill';\nimport { ExtendedCss } from '@adguard/extended-css';\n\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\n/**\n * @file\n * This file contains constants for communication between background and content scripts.\n * This constants are separated from message.ts to reduce bundle size,\n * because rollup cannot tree-shake tswebextension library code.\n */\n/**\n * Name of the message handler.\n * It is needed for determining specific tswebextension message from other messages.\n */\nconst MESSAGE_HANDLER_NAME = 'tsWebExtension';\n/**\n * Message types for communication between background and content scripts.\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"ProcessShouldCollapse\"] = \"processShouldCollapse\";\n MessageType[\"GetCosmeticData\"] = \"getCosmeticData\";\n MessageType[\"GetCss\"] = \"getCss\";\n MessageType[\"GetCookieRules\"] = \"getCookieRules\";\n MessageType[\"SaveCookieLogEvent\"] = \"saveCookieLogEvent\";\n MessageType[\"InitAssistant\"] = \"initAssistant\";\n MessageType[\"CloseAssistant\"] = \"closeAssistant\";\n MessageType[\"AssistantCreateRule\"] = \"assistantCreateRule\";\n MessageType[\"SaveCssHitsStats\"] = \"saveCssHitsStats\";\n})(MessageType || (MessageType = {}));\n\n// TODO check if we can return typed message here\n/**\n * Sends message to the background page.\n *\n * @param message Message to send.\n * @param message.payload Payload of the message.\n * @param message.type Message type.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst sendAppMessage = (message) => __awaiter(void 0, void 0, void 0, function* () {\n return browser.runtime.sendMessage(Object.assign({ handlerName: MESSAGE_HANDLER_NAME }, message));\n});\n\n/**\n * This class applies cookie rules in page context.\n *\n * - Removes cookies matching rules\n * - Listens to new cookies, then tries to apply rules to them.\n */\nclass CookieController {\n /**\n * Constructor.\n *\n * @param callback On rule applied callback.\n */\n constructor(callback) {\n /**\n * Default cookie polling interval.\n */\n this.DEFAULT_COOKIE_POLLING_INTERVAL_MS = 1000;\n /**\n * Is current context third-party.\n */\n this.isThirdPartyContext = false;\n this.onRuleAppliedCallback = callback;\n this.isThirdPartyContext = this.isThirdPartyFrame();\n }\n /**\n * Applies rules.\n *\n * @param rules Rules to apply.\n */\n apply(rules) {\n this.applyRules(rules);\n let lastCookie = document.cookie;\n this.listenCookieChange((oldValue, newValue) => {\n if (newValue === lastCookie) {\n // Skip changes made by this class\n return;\n }\n this.applyRules(rules);\n lastCookie = document.cookie;\n });\n window.addEventListener('beforeunload', () => {\n this.applyRules(rules);\n });\n }\n /**\n * Polling document cookie.\n *\n * @param callback Callback to be called periodically.\n * @param interval Polling interval.\n */\n listenCookieChange(callback, interval = this.DEFAULT_COOKIE_POLLING_INTERVAL_MS) {\n let lastCookie = document.cookie;\n setInterval(() => {\n const { cookie } = document;\n if (cookie !== lastCookie) {\n try {\n callback(lastCookie, cookie);\n }\n finally {\n lastCookie = cookie;\n }\n }\n }, interval);\n }\n /**\n * Checks if current context is third-party.\n *\n * @returns True if current context is third-party.\n */\n // eslint-disable-next-line class-methods-use-this\n isThirdPartyFrame() {\n try {\n return window.self !== window.top && document.location.hostname !== window.parent.location.hostname;\n }\n catch (e) {\n return true;\n }\n }\n /**\n * Applies rules to document cookies.\n *\n * @param rules Rules to apply.\n *\n * Inspired by remove-cookie scriptlet.\n * @see {@link https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/remove-cookie.js}\n */\n applyRules(rules) {\n document.cookie.split(';').forEach((cookieStr) => {\n const pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n const matchingRules = rules.filter((r) => {\n if (this.isThirdPartyContext !== r.isThirdParty) {\n return false;\n }\n const regex = r.match ? CookieController.toRegExp(r.match) : CookieController.toRegExp('/.?/');\n return regex.test(cookieName);\n });\n const importantRules = matchingRules.filter((r) => r.ruleText.includes('important'));\n if (importantRules.length > 0) {\n importantRules.forEach((rule) => {\n this.applyRule(rule, cookieName, cookieValue);\n });\n }\n else {\n const allowlistRules = matchingRules.filter((r) => r.isAllowlist);\n if (allowlistRules.length > 0) {\n allowlistRules.forEach((rule) => {\n this.applyRule(rule, cookieName, cookieValue);\n });\n }\n else {\n matchingRules.forEach((rule) => {\n this.applyRule(rule, cookieName, cookieValue);\n });\n }\n }\n });\n }\n /**\n * Applies rule.\n *\n * @param rule Rule to apply.\n * @param cookieName Cookie name.\n * @param cookieValue Cookie value.\n */\n applyRule(rule, cookieName, cookieValue) {\n if (!rule.isAllowlist) {\n const hostParts = document.location.hostname.split('.');\n for (let i = 0; i <= hostParts.length - 1; i += 1) {\n const hostName = hostParts.slice(i).join('.');\n if (hostName) {\n CookieController.removeCookieFromHost(cookieName, hostName);\n }\n }\n }\n this.onRuleAppliedCallback({\n cookieName,\n cookieValue,\n cookieDomain: document.location.hostname,\n cookieRuleText: rule.ruleText,\n thirdParty: rule.isThirdParty,\n filterId: rule.filterId,\n });\n }\n /**\n * Removes cookie for host.\n *\n * @param cookieName Cookie name.\n * @param hostName Host name.\n */\n static removeCookieFromHost(cookieName, hostName) {\n const cookieSpec = `${cookieName}=`;\n const domain1 = `; domain=${hostName}`;\n const domain2 = `; domain=.${hostName}`;\n const path = '; path=/';\n const expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n }\n /**\n * Converts cookie rule match to regular expression.\n *\n * @param str String to convert.\n * @returns Regular expression.\n */\n static toRegExp(str) {\n if (str[0] === '/' && str[str.length - 1] === '/') {\n return new RegExp(str.slice(1, -1));\n }\n const escaped = str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`^${escaped}$`);\n }\n}\n\n/**\n * Utils class.\n */\nclass ElementUtils {\n /**\n * Serialize HTML element.\n *\n * @param element Element to serialize.\n *\n * @returns String representation of the element.\n */\n static elementToString(element) {\n const s = [];\n s.push('<');\n s.push(element.localName);\n const { attributes } = element;\n for (let i = 0; i < attributes.length; i += 1) {\n const attr = attributes[i];\n s.push(' ');\n s.push(attr.name);\n s.push('=\"');\n const value = attr.value === null ? '' : attr.value.replace(/\"/g, '\\\\\"');\n s.push(value);\n s.push('\"');\n }\n s.push('>');\n return s.join('');\n }\n /**\n * Appends node children to the array.\n *\n * @param node Element whose children we would like to add.\n * @param arrayWithNodes Array where we add children.\n */\n static appendChildren(node, arrayWithNodes) {\n const children = node.querySelectorAll('*');\n if (children && children.length > 0) {\n for (let i = 0; i < children.length; i += 1) {\n arrayWithNodes.push(children[i]);\n }\n }\n }\n /**\n * Adds elements into array if they are not in the array yet.\n *\n * @param targetArray Array where we add elements.\n * @param sourceArray Array with elements.\n */\n static addUnique(targetArray, sourceArray) {\n if (sourceArray.length > 0) {\n for (let i = 0; i < sourceArray.length; i += 1) {\n const sourceElement = sourceArray[i];\n if (targetArray.indexOf(sourceElement) === -1) {\n targetArray.push(sourceElement);\n }\n }\n }\n }\n /**\n * Removes all elements in array.\n *\n * @param elements Array with elements.\n */\n static removeElements(elements) {\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n element.remove();\n }\n }\n /**\n * Parses hits info from style content.\n *\n * @param content Style.\n * @param attributeMarker Attribute marker.\n *\n * @returns Info with filterId, ruleText or null.\n */\n static parseInfo(content, attributeMarker) {\n if (!content || content.indexOf(attributeMarker) < 0) {\n return null;\n }\n let filterIdAndRuleText = decodeURIComponent(content);\n // 'content' value may include open and close quotes.\n filterIdAndRuleText = ElementUtils.removeQuotes(filterIdAndRuleText);\n // Remove prefix\n filterIdAndRuleText = filterIdAndRuleText.substring(attributeMarker.length);\n // Attribute 'content' in css looks like: {content: 'adguard{filterId};{ruleText}'}\n const index = filterIdAndRuleText.indexOf(';');\n if (index < 0) {\n return null;\n }\n const filterId = parseInt(filterIdAndRuleText.substring(0, index), 10);\n if (Number.isNaN(filterId)) {\n return null;\n }\n const ruleText = filterIdAndRuleText.substring(index + 1);\n return { filterId, ruleText };\n }\n /**\n * Parses hits info from style content.\n *\n * @param content Style.\n * @param attributeMarker Attribute marker.\n *\n * @returns Info with filterId, ruleText or null.\n */\n static parseExtendedStyleInfo(content, attributeMarker) {\n const important = '!important';\n const indexOfImportant = content.lastIndexOf(important);\n if (indexOfImportant === -1) {\n return ElementUtils.parseInfo(content, attributeMarker);\n }\n const contentWithoutImportant = content.substring(0, indexOfImportant).trim();\n return ElementUtils.parseInfo(contentWithoutImportant, attributeMarker);\n }\n /**\n * Unquotes specified value.\n *\n * @param value Value to unquote.\n *\n * @returns Unquoted value.\n */\n static removeQuotes(value) {\n if (value.length > 1\n && ((value[0] === '\"' && value[value.length - 1] === '\"')\n || (value[0] === '\\'' && value[value.length - 1] === '\\''))) {\n // Remove double-quotes or single-quotes\n return value.substring(1, value.length - 1);\n }\n return value;\n }\n}\n\n// TODO remove the comment turning off the rule\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * This storage is used to keep track of counted rules received from node elements.\n */\nclass HitsStorage {\n constructor() {\n /**\n * Start count number.\n */\n this.counter = 0;\n /**\n * Storage random identificator.\n */\n this.randomKey = HitsStorage.generateRandomKey();\n /**\n * Map storage.\n */\n this.map = new Map();\n }\n /**\n * Checks if element is counted.\n *\n * @param element Html element.\n * @param rule Rule text.\n *\n * @returns True if element is counted.\n */\n isCounted(element, rule) {\n const hitAddress = element[this.randomKey];\n if (hitAddress) {\n const countedHit = this.map.get(hitAddress);\n if (countedHit) {\n return countedHit.element === element && countedHit.rule === rule;\n }\n }\n return false;\n }\n /**\n * Stores rule-element info in storage.\n *\n * @param element Html element.\n * @param rule Rule text.\n */\n setCounted(element, rule) {\n const counter = this.getCounter();\n // eslint-disable-next-line no-param-reassign\n element[this.randomKey] = counter;\n this.map.set(counter, { element, rule });\n }\n /**\n * Returns current counter value and increments it.\n *\n * @returns Count number.\n */\n getCounter() {\n this.counter += 1;\n return this.counter;\n }\n // TODO replace with nanoid\n /**\n * Random id generator.\n *\n * @returns Random key with 10 characters length.\n */\n static generateRandomKey() {\n const keyLength = 10;\n const possibleValues = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < keyLength; i += 1) {\n result += possibleValues.charAt(Math.floor(Math.random() * possibleValues.length));\n }\n return result;\n }\n}\n\n/**\n * Class represents collecting css style hits process.\n *\n * During applying css styles to element we add special 'content:' attribute\n * e.g.: \".selector -> .selector { content: 'adguard{filterId};{ruleText} !important;}\".\n * After the style is applied we parse this \"content\" attribute and call provided via constructor callback function.\n */\nclass CssHitsCounter {\n /**\n * This function prepares calculation of css hits.\n * We are waiting for 'load' event and start calculation.\n *\n * @param callback Which receives {@link ICountedElement} and handles counted css hits.\n */\n constructor(callback) {\n /**\n * Hits storage.\n */\n this.hitsStorage = new HitsStorage();\n /**\n * Mutation observer.\n */\n this.observer = null;\n /**\n * Counting on process flag.\n */\n this.countIsWorking = false;\n this.onCssHitsFoundCallback = callback;\n if (document.readyState === 'complete'\n || document.readyState === 'interactive') {\n this.countCssHits();\n }\n else {\n document.addEventListener('readystatechange', this.startCounter.bind(this));\n }\n }\n /**\n * Stops css hits counting process.\n */\n stop() {\n this.onCssHitsFoundCallback = () => { };\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n /**\n * Callback used to collect statistics of elements affected by extended css rules.\n *\n * @param affectedEl Affected element.\n * @returns Affected element.\n */\n countAffectedByExtendedCss(affectedEl) {\n if (affectedEl && affectedEl.rules && affectedEl.rules.length > 0) {\n const result = [];\n for (const rule of affectedEl.rules) {\n if (rule.style && rule.style.content) {\n const styleInfo = ElementUtils.parseExtendedStyleInfo(rule.style.content, CssHitsCounter.CONTENT_ATTR_PREFIX);\n if (styleInfo === null) {\n continue;\n }\n const { filterId, ruleText } = styleInfo;\n if (filterId !== undefined && ruleText !== undefined) {\n result.push({\n filterId,\n ruleText,\n element: ElementUtils.elementToString(affectedEl.node),\n });\n // clear style content to avoid duplicate counting\n rule.style.content = '';\n }\n }\n }\n this.onCssHitsFoundCallback(result);\n }\n return affectedEl;\n }\n /**\n * Starts counting process.\n */\n startCounter() {\n if (document.readyState === 'interactive'\n || document.readyState === 'complete') {\n this.countCssHits();\n document.removeEventListener('readystatechange', this.startCounter);\n }\n }\n /**\n * Counts css hits.\n */\n countCssHits() {\n this.countAllCssHits();\n this.countCssHitsForMutations();\n }\n /**\n * Counts css hits for already affected elements.\n */\n countAllCssHits() {\n // we don't start counting again all css hits till previous count process wasn't finished\n if (this.countIsWorking) {\n return;\n }\n this.countIsWorking = true;\n const elements = document.querySelectorAll('*');\n this.countCssHitsBatch(elements, 0, CssHitsCounter.CSS_HITS_BATCH_SIZE, CssHitsCounter.CSS_HITS_BATCH_SIZE, [], (result) => {\n if (result.length > 0) {\n this.onCssHitsFoundCallback(result);\n }\n this.countIsWorking = false;\n });\n }\n /**\n * Main calculation function.\n * 1. Selects sub collection from elements.\n * 2. For each element from sub collection: retrieves calculated css 'content'\n * attribute and if it contains 'adguard'\n * marker then retrieves rule text and filter identifier.\n * 3. Starts next task with some delay.\n *\n * @param elements Collection of all elements.\n * @param start Start of batch.\n * @param end End of batch.\n * @param step Size of batch.\n * @param result Collection for save result.\n * @param callback Finish callback.\n */\n // eslint-disable-next-line max-len\n countCssHitsBatch(elements, start, end, step, result, callback) {\n const length = Math.min(end, elements.length);\n result = result.concat(this.countCssHitsForElements(elements, start, length));\n if (length === elements.length) {\n callback(result);\n return;\n }\n start = end;\n end += step;\n // Start next task with some delay\n window.setTimeout(() => {\n this.countCssHitsBatch(elements, start, end, step, result, callback);\n }, CssHitsCounter.COUNT_CSS_HITS_BATCH_DELAY);\n }\n /**\n * Counts css hits for array of elements.\n *\n * @param elements Array of elements.\n * @param start Start of batch.\n * @param length Length of batch.\n *\n * @returns Data with information about filter id, rule text and element.\n */\n countCssHitsForElements(elements, start, length) {\n const RULE_FILTER_SEPARATOR = ';';\n start = start || 0;\n length = length || elements.length;\n const result = [];\n for (let i = start; i < length; i += 1) {\n const element = elements[i];\n const cssHitData = CssHitsCounter.getCssHitData(element);\n if (!cssHitData) {\n continue;\n }\n const { filterId, ruleText } = cssHitData;\n const ruleAndFilterString = filterId + RULE_FILTER_SEPARATOR + ruleText;\n if (this.hitsStorage.isCounted(element, ruleAndFilterString)) {\n continue;\n }\n this.hitsStorage.setCounted(element, ruleAndFilterString);\n result.push({\n filterId,\n ruleText,\n element: ElementUtils.elementToString(element),\n });\n }\n return result;\n }\n /**\n * Counts css hits for mutations.\n */\n countCssHitsForMutations() {\n // eslint-disable-next-line prefer-destructuring\n const MutationObserver = window.MutationObserver;\n if (!MutationObserver) {\n return;\n }\n if (this.observer) {\n this.observer.disconnect();\n }\n /**\n * To avoid cases where two css hits counters try to append and remove the\n * same elements one after the other, we do not append already met nodes.\n */\n const probesWeakSet = new WeakSet();\n let timeoutId = null;\n this.observer = new MutationObserver(((mutationRecords) => {\n // Collect probe elements, count them, then remove from their targets\n const probeElements = [];\n const childrenOfProbeElements = [];\n const potentialProbeElements = [];\n mutationRecords.forEach((mutationRecord) => {\n if (mutationRecord.addedNodes.length === 0) {\n return;\n }\n for (let i = 0; i < mutationRecord.addedNodes.length; i += 1) {\n const node = mutationRecord.addedNodes[i];\n if (!(node instanceof Element) || CssHitsCounter.isIgnoredNodeTag(node.tagName)) {\n continue;\n }\n const { target } = mutationRecord;\n if (!node.parentNode && target) {\n // If this node has been appended to the DOM and counted once, do not add\n // it again.\n if (probesWeakSet.has(node)) {\n return;\n }\n // Most likely this is a \"probe\" element that was added and then\n // immediately removed from DOM.\n // We re-add it and check if any rule matched it\n probeElements.push(node);\n // To ensure that this \"probe\" node has only been added once to the DOM,\n // we add it to the weak set.\n probesWeakSet.add(node);\n // CSS rules could be applied to the nodes inside probe element\n // that's why we get all child elements of added node\n ElementUtils.appendChildren(node, childrenOfProbeElements);\n if (this.observer) {\n this.observer.disconnect();\n }\n mutationRecord.target.appendChild(node);\n }\n else if (node.parentNode && target) {\n // Sometimes probe elements are appended to the DOM\n potentialProbeElements.push(node);\n ElementUtils.appendChildren(node, potentialProbeElements);\n }\n }\n });\n // If the list of potential probe elements is relatively small,\n // we can count CSS hits immediately\n if (potentialProbeElements.length > 0\n && potentialProbeElements.length <= CssHitsCounter.CSS_HITS_BATCH_SIZE) {\n const result = this.countCssHitsForElements(potentialProbeElements, 0, null);\n if (result.length > 0) {\n this.onCssHitsFoundCallback(result);\n }\n }\n const allProbeElements = [];\n ElementUtils.addUnique(allProbeElements, childrenOfProbeElements);\n ElementUtils.addUnique(allProbeElements, probeElements);\n if (allProbeElements.length > 0) {\n const result = this.countCssHitsForElements(allProbeElements, 0, null);\n if (result.length > 0) {\n this.onCssHitsFoundCallback(result);\n }\n /**\n * Don't remove child elements of probe elements\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1096.\n */\n ElementUtils.removeElements(probeElements);\n this.startObserver();\n }\n // debounce counting all css hits when mutation record fires\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n timeoutId = window.setTimeout(() => {\n this.countAllCssHits();\n window.clearTimeout(timeoutId);\n }, CssHitsCounter.COUNT_ALL_CSS_HITS_TIMEOUT_MS);\n }));\n this.startObserver();\n }\n /**\n * Starts mutation observer.\n */\n startObserver() {\n if (this.observer) {\n // TODO: Check, maybe we should observer for 'characterData' and\n // 'characterDataOldValue' like it was in the old extension code\n this.observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n }\n }\n /**\n * Function retrieves css hits data from element style content attribute contains data injected with AdGuard.\n *\n * @param element Element to check.\n * @returns Filter id and rule text or null.\n */\n static getCssHitData(element) {\n const style = getComputedStyle(element);\n return ElementUtils.parseInfo(style.content, CssHitsCounter.CONTENT_ATTR_PREFIX);\n }\n /**\n * Checks if tag is ignored.\n *\n * @param nodeTag Tag name to check.\n * @returns True if tag is ignored.\n */\n static isIgnoredNodeTag(nodeTag) {\n const ignoredTags = ['script'];\n return ignoredTags.includes(nodeTag.toLowerCase());\n }\n}\n/**\n * We split CSS hits counting into smaller batches of elements and schedule them one by one using setTimeout.\n */\nCssHitsCounter.COUNT_CSS_HITS_BATCH_DELAY = 5;\n/**\n * Size of small batches of elements we count.\n */\nCssHitsCounter.CSS_HITS_BATCH_SIZE = 25;\n/**\n * In order to find elements hidden by AdGuard we look for a `:content` pseudo-class\n * with values starting with this prefix. Filter information will be\n * encoded in this value as well.\n */\nCssHitsCounter.CONTENT_ATTR_PREFIX = 'adguard';\n/**\n * We delay countAllCssHits function if it was called too frequently from mutationObserver.\n */\nCssHitsCounter.COUNT_ALL_CSS_HITS_TIMEOUT_MS = 500;\n\nvar RequestType = {\n Document: 1,\n SubDocument: 2,\n Script: 4,\n Stylesheet: 8,\n Object: 16,\n Image: 32,\n XmlHttpRequest: 64,\n Media: 128,\n Font: 256,\n WebSocket: 512,\n Ping: 1024,\n Other: 2048,\n};\n\n/**\n * Hides broken items after blocking a network request.\n */\nclass ElementCollapser {\n /**\n * Start listening for error events.\n */\n static start() {\n document.addEventListener('error', ElementCollapser.shouldCollapseElement, true);\n // We need to listen for load events to hide blocked iframes (they don't raise error event)\n document.addEventListener('load', ElementCollapser.shouldCollapseElement, true);\n }\n /**\n * Stop listening for error events.\n */\n static stop() {\n document.removeEventListener('error', ElementCollapser.shouldCollapseElement, true);\n // We need to listen for load events to hide blocked iframes (they don't raise error event)\n document.removeEventListener('load', ElementCollapser.shouldCollapseElement, true);\n }\n /**\n * Returns request type by tag name.\n *\n * @param tagName Tag name.\n * @returns Request type or null.\n */\n static getRequestTypeByInitiatorTagName(tagName) {\n switch (tagName) {\n case 'img':\n case 'input': {\n return RequestType.Image;\n }\n case 'audio':\n case 'video': {\n return RequestType.Media;\n }\n case 'object':\n case 'embed': {\n return RequestType.Object;\n }\n case 'frame':\n case 'iframe':\n return RequestType.SubDocument;\n default:\n return null;\n }\n }\n /**\n * Extracts element URL from the dom node.\n *\n * @param element Dom node.\n * @returns Element URL or null.\n */\n static getElementUrl(element) {\n let elementUrl = element.src || element.data;\n if (!elementUrl\n || elementUrl.indexOf('http') !== 0\n // Some sources could not be set yet, lazy loaded images or smth.\n // In some cases like on gog.com, collapsing these elements could break\n // the page script loading their sources\n || elementUrl === element.baseURI) {\n return null;\n }\n // truncate too long urls\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1493\n const MAX_URL_LENGTH = 16 * 1024;\n if (elementUrl.length > MAX_URL_LENGTH) {\n elementUrl = elementUrl.slice(0, MAX_URL_LENGTH);\n }\n return elementUrl;\n }\n /**\n * Checks if element is already collapsed.\n *\n * @param element DOM element.\n * @returns True if element is collapsed.\n */\n static isElementCollapsed(element) {\n const computedStyle = window.getComputedStyle(element);\n return (computedStyle && computedStyle.display === 'none');\n }\n /**\n * Checks if element should be collapsed by requirements.\n *\n * @param event Error or load event.\n */\n static shouldCollapseElement(event) {\n return __awaiter(this, void 0, void 0, function* () {\n const eventType = event.type;\n const element = event.target;\n const tagName = element.tagName.toLowerCase();\n const expectedEventType = (tagName === 'iframe'\n || tagName === 'frame'\n || tagName === 'embed') ? 'load' : 'error';\n if (eventType !== expectedEventType) {\n return;\n }\n const requestType = ElementCollapser.getRequestTypeByInitiatorTagName(element.localName);\n if (!requestType) {\n return;\n }\n const elementUrl = ElementCollapser.getElementUrl(element);\n if (!elementUrl) {\n return;\n }\n if (ElementCollapser.isElementCollapsed(element)) {\n return;\n }\n const payload = {\n elementUrl,\n documentUrl: document.URL,\n requestType,\n };\n const shouldCollapse = yield sendAppMessage({\n type: MessageType.ProcessShouldCollapse,\n payload,\n });\n if (!shouldCollapse) {\n return;\n }\n element.setAttribute('style', 'display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important;');\n });\n }\n}\n\n/**\n * This class applies cosmetic rules in page context.\n */\nclass CosmeticController {\n /**\n * Creates new {@link CosmeticController} instance.\n */\n constructor() {\n /**\n * Number of {@link MessageType.GetCosmeticData} requests.\n */\n this.tries = 0;\n this.process = this.process.bind(this);\n this.beforeStyleApplied = this.beforeStyleApplied.bind(this);\n }\n /**\n * Init cosmetic processing.\n */\n init() {\n ElementCollapser.start();\n this.process();\n }\n /**\n * Sends {@link MessageType.GetCosmeticData} message to background and process response.\n */\n process() {\n return __awaiter(this, void 0, void 0, function* () {\n const res = yield sendAppMessage({\n type: MessageType.GetCosmeticData,\n payload: {\n documentUrl: window.location.href,\n },\n });\n if (res) {\n this.applyCosmetic(res);\n }\n });\n }\n /**\n * Process {@link MessageType.GetCosmeticData} response from background.\n *\n * If {@link cosmeticData.isAppStarted} is false, retry\n * request after {@link GET_COSMETIC_DATA_RETRY_TIMEOUT_MS} milliseconds.\n * Else apply extended css rules from {@link cosmeticData.extCssText}\n * and enable {@link CssHitsCounter} if {@link cosmeticData.areHitsStatsCollected} is true.\n *\n * @param cosmeticData Response cosmetic data from background.\n */\n applyCosmetic(cosmeticData) {\n const { isAppStarted, extCssRules, areHitsStatsCollected, } = cosmeticData;\n if (!isAppStarted\n && this.tries <= CosmeticController.MAX_GET_COSMETIC_DATA_TRIES) {\n this.tries += 1;\n setTimeout(this.process, CosmeticController.GET_COSMETIC_DATA_RETRY_TIMEOUT_MS);\n return;\n }\n if (areHitsStatsCollected) {\n this.cssHitsCounter = CosmeticController.createCssHitsCounter();\n }\n if (!extCssRules || extCssRules.length === 0) {\n return;\n }\n const extendedCssConfig = {\n cssRules: extCssRules,\n };\n if (areHitsStatsCollected) {\n extendedCssConfig.beforeStyleApplied = this.beforeStyleApplied;\n }\n const extendedCss = new ExtendedCss(extendedCssConfig);\n extendedCss.apply();\n }\n /**\n * Preprocess {@link IAffectedElement} for {@link ExtendedCss} instance.\n *\n * @param el Record with required 'content' style property in rules.\n * @returns Affected element record.\n */\n beforeStyleApplied(el) {\n if (!this.cssHitsCounter) {\n return el;\n }\n return this.cssHitsCounter.countAffectedByExtendedCss(el);\n }\n /**\n * Create new {@link CssHitsCounter} instance.\n *\n * @returns CssHitsCounter instance.\n */\n static createCssHitsCounter() {\n return new CssHitsCounter((stats) => {\n sendAppMessage({\n type: MessageType.SaveCssHitsStats,\n payload: stats,\n });\n });\n }\n}\n/**\n * Retry timeout for {@link MessageType.GetCosmeticData} request to background in milliseconds.\n */\nCosmeticController.GET_COSMETIC_DATA_RETRY_TIMEOUT_MS = 100;\n/**\n * Max {@link MessageType.GetCosmeticData} request limit.\n */\nCosmeticController.MAX_GET_COSMETIC_DATA_TRIES = 200;\n\n/**\n * Initializes assistant object and create messages listener for assistant.\n */\nconst initAssistant = () => {\n if (window.top !== window || !(document.documentElement instanceof HTMLElement)) {\n return;\n }\n browser.runtime.onMessage.addListener((message) => __awaiter(void 0, void 0, void 0, function* () {\n switch (message.type) {\n case MessageType.InitAssistant: {\n // If there is no assistant on the window after execute\n // loading script - throw error.\n if (window.adguardAssistant === undefined) {\n throw new Error('adguardAssistant not found in the window object.');\n }\n else {\n window.adguardAssistant.close();\n }\n window.adguardAssistant.start(null, (rules) => {\n sendAppMessage({\n type: MessageType.AssistantCreateRule,\n payload: { ruleText: rules },\n });\n });\n break;\n }\n case MessageType.CloseAssistant: {\n if (window.adguardAssistant) {\n window.adguardAssistant.close();\n }\n break;\n }\n }\n }));\n};\n\n// Disable jest coverage for this file, because it will insert\n// line comments, and code to count lines covered by tests, for example:\n// /* istanbul ignore next */\n// cov_uqm40oh03().f[0]++;\n// cov_uqm40oh03().s[2]++;\n// And we cannot test these strings correctly, because the names of these\n// functions with counters are generated at runtime\n/* istanbul ignore file */\n/**\n * This module applies stealth actions in page context.\n */\nclass StealthHelper {\n /**\n * Sends a Global Privacy Control DOM signal.\n */\n static setDomSignal() {\n try {\n if ('globalPrivacyControl' in Navigator.prototype) {\n return;\n }\n Object.defineProperty(Navigator.prototype, 'globalPrivacyControl', {\n get: () => true,\n configurable: true,\n enumerable: true,\n });\n }\n catch (ex) {\n // Ignore\n }\n }\n}\n\nconst cosmeticController = new CosmeticController();\ncosmeticController.init();\ninitAssistant();\n/**\n * TODO: wait for engine starts (like in {@link CosmeticController}).\n *\n * Runs CookieController.\n *\n * Steps:\n * - content script requests matching cookie rules for the frame(in which this script is executed)\n * - service returns matching set of rules data to content script\n * - the rules are applied with TSUrlFilterContentScript.CookieController\n * - filtering log receives callback with applied rules data.\n *\n * The important point is:\n * - there is no way to run cookie controller script via chrome.tabs.executeScript cause one only could be executed\n * for all frames or main frame only. But it's not correct cause there should be different rules\n * for each frame.\n */\n(() => __awaiter(void 0, void 0, void 0, function* () {\n const response = yield sendAppMessage({\n type: MessageType.GetCookieRules,\n payload: {\n documentUrl: window.location.href,\n },\n });\n if (!response) {\n return;\n }\n if (response.rulesData) {\n try {\n const cookieController = new CookieController(({ cookieName, cookieValue, cookieDomain, cookieRuleText, thirdParty, filterId, }) => {\n sendAppMessage({\n type: MessageType.SaveCookieLogEvent,\n payload: {\n cookieName,\n cookieValue,\n cookieDomain,\n cookieRuleText,\n thirdParty,\n filterId,\n },\n });\n });\n cookieController.apply(response.rulesData);\n }\n catch (e) {\n // Ignore exceptions\n }\n }\n}))();\n\nexport { CookieController, CssHitsCounter, StealthHelper };\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport \"@adguard/tswebextension/content-script\";\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"adguard-content.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;ACVA;AACA,MAAM,IAA0C;AAChD,IAAI,iCAAgC,CAAC,MAAQ,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AACxD,IAAI,KAAK,YAQN;AACH,CAAC;AACD;;AAEA,sCAAsC;;AAEtC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,wHAAwH;AACxH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,GAAG;AACpB,mBAAmB,SAAS;AAC5B;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,UAAU;AAC3B;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;;;AAGA;AACA;AACA;AACA,iDAAiD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC5I;;AAEA;AACA,gDAAgD,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC3I;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB,gCAAgC,MAAM;AACtC,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA,iBAAiB,UAAU;AAC3B;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA,6DAA6D,gBAAgB;AAC7E;AACA,iBAAiB,QAAQ,cAAc;AACvC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,mBAAmB;AACnB;;AAEA,+CAA+C,eAAe;AAC9D;AACA;AACA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA,eAAe;AACf;AACA;;AAEA;AACA;AACA,WAAW;;AAEX;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA,WAAW;;AAEX;AACA;AACA;;AAEA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,oCAAoC;AACrD;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;;AAGA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,GAAG;AACtB;AACA,mBAAmB,QAAQ;AAC3B;AACA,mBAAmB,aAAa;AAChC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA,0EAA0E;AAC1E;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA,aAAa;AACb,aAAa;AACb;AACA;;;AAGA;AACA;AACA,YAAY;AACZ;AACA,YAAY;;;AAGZ;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,+CAA+C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AAC1I;;AAEA;AACA,8CAA8C,kBAAkB,EAAE,sCAAsC,MAAM,KAAK,UAAU,YAAY;AACzI;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,IAAI;AACJ;AACA;AACA,CAAC;AACD;;;;;;;UCpvCA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;;AAEpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,wEAAwE;AACjF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,0BAA0B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,0BAA0B;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C,UAAU;AACpD,0CAA0C,UAAU;AACpD,aAAa,KAAK,GAAG,MAAM;AAC3B,GAAG;AACH;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,oBAAoB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,kMAAkM;AAClM;;AAEA;AACA,kEAAkE,SAAS;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,GAAG;;AAEZ;AACA,QAAQ;;;AAGR;AACA;AACA;AACA,OAAO;AACP;AACA,MAAM;;;AAGN;AACA,GAAG,GAAG;;AAEN;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oEAAoE,MAAM;AAC1E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+DAA+D,6BAA6B;AAC5F;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA,0DAA0D,gBAAgB;AAC1E,mDAAmD,4BAA4B,kBAAkB,WAAW;AAC5G,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;;AAGA,qEAAqE;;AAErE;AACA;AACA;AACA,oHAAoH;AACpH;;AAEA;AACA;AACA;AACA;AACA,yBAAyB,wBAAwB,sCAAsC,oBAAoB;AAC3G;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,wBAAwB,sCAAsC,WAAW;AAClG;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA,gEAAgE;;AAEhE,qHAAqH;AACrH;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;;;AAGA,yBAAyB,wBAAwB;AACjD,IAAI;AACJ;AACA;;;AAGA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oDAAoD,QAAQ;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kEAAkE,SAAS;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mCAAmC,KAAK,SAAS;AAC1E,MAAM;AACN;AACA;;;AAGA,2CAA2C;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,mCAAmC,eAAe,yDAAyD,0CAA0C;AACrJ,MAAM;AACN;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;;AAEA;;AAEA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,sCAAsC,MAAM,EAAE,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA;AACA,+GAA+G;;AAE/G;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA,QAAQ;AACR;;;AAGA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6DAA6D;;AAE7D,oCAAoC,MAAM,EAAE,WAAW,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,0BAA0B;AACxI,uCAAuC,sCAAsC,EAAE,qBAAqB;AACpG;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,sBAAsB,uBAAuB,EAAE,MAAM,EAAE,sBAAsB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,yDAAyD;;AAEzD;AACA,wBAAwB;;AAExB;AACA,oHAAoH;;AAEpH;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,8CAA8C;;AAE9C,iFAAiF;AACjF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,iEAAiE;;AAEjE;AACA,yEAAyE;AACzE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA,MAAM,SAAS;;AAEf;AACA;AACA,kGAAkG;AAClG;AACA;AACA;;AAEA;AACA,0HAA0H;AAC1H;AACA;;AAEA;AACA;AACA,8GAA8G;AAC9G;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,+BAA+B,2BAA2B,KAAK,SAAS;AACxE;;AAEA,gEAAgE;;AAEhE,sEAAsE;AACtE;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA,wFAAwF;;AAExF;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C,cAAc;AACd;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,eAAe;AAC7E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS;AAC7C,gBAAgB;AAChB;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS;AAC7C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,+BAA+B;AAC/B,oCAAoC,SAAS;AAC7C,gBAAgB;;;AAGhB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,qDAAqD;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,wDAAwD;;AAExD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,SAAS,oCAAoC,WAAW,WAAW,yBAAyB;AAChI,gBAAgB;AAChB;;;AAGA;AACA,yDAAyD;;AAEzD;AACA,gBAAgB;;;AAGhB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC,2BAA2B,KAAK,SAAS;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mCAAmC,0BAA0B,UAAU,eAAe;AACtF,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;;;AAGhB;AACA;;AAEA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;;AAEA,gEAAgE;;AAEhE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,8EAA8E,SAAS;AACvF,gBAAgB;AAChB;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mCAAmC,mCAAmC,KAAK,SAAS;AACpF,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0FAA0F,SAAS;AACnG,gBAAgB;AAChB;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,qFAAqF,SAAS;AAC9F,gBAAgB;AAChB;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA,uDAAuD;AACvD;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF;AACrF;AACA,gBAAgB;AAChB;AACA;AACA,sEAAsE;;AAEtE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0DAA0D;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uDAAuD;;AAEvD;AACA;;AAEA;AACA;AACA;AACA,sEAAsE,SAAS;AAC/E,kBAAkB;AAClB;;;AAGA;AACA;AACA;AACA;AACA;AACA,+CAA+C,qBAAqB,oEAAoE,mBAAmB;AAC3J;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,SAAS;;AAEzC;AACA;AACA;AACA,qDAAqD,iBAAiB;AACtE;AACA;AACA;AACA,cAAc;AACd;AACA,kCAAkC,SAAS;AAC3C;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD,WAAW;AAC9D;;AAEA;AACA;;AAEA;AACA,wBAAwB,SAAS;AACjC;;AAEA;AACA;AACA,uEAAuE,0CAA0C;AACjH;;AAEA;AACA,mEAAmE,SAAS;AAC5E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,UAAU,IAAI,gCAAgC;AAC7D,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;;AAEA;AACA,sBAAsB,MAAM;AAC5B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,IAAI;AACtC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iDAAiD,EAAE;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,0BAA0B,EAAE,OAAO,EAAE;AACrC,uCAAuC;AACvC;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;AACA,0CAA0C,KAAK;AAC/C,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4EAA4E,WAAW,WAAW,OAAO;AACzG,IAAI;;;AAGJ;AACA;AACA;AACA;AACA,8BAA8B,MAAM,EAAE,MAAM,EAAE,qBAAqB;AACnE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;;AAEJ;AACA,sEAAsE,WAAW,WAAW,cAAc;AAC1G;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,4CAA4C,WAAW,oBAAoB,cAAc;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,0CAA0C,OAAO;AACjD;AACA,IAAI;AACJ;AACA;AACA,+DAA+D,OAAO;AACtE;;AAEA;AACA;AACA,IAAI;AACJ;AACA,4CAA4C,OAAO;AACnD;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,8DAA8D,YAAY,OAAO,UAAU;AAC3F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,mDAAmD;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+EAA+E,MAAM;;AAErF;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN,+BAA+B;AAC/B,0BAA0B,IAAI;;AAE9B,2BAA2B,MAAM;AACjC;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,wDAAwD,MAAM;AAC9D;;AAEA;AACA;AACA;AACA,wCAAwC,QAAQ,yBAAyB,MAAM;AAC/E;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA,mDAAmD,QAAQ,uBAAuB,MAAM;AACxF;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA,IAAI;AACJ;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI,6CAA6C;AACjD;;AAEA;AACA,gCAAgC,YAAY,gBAAgB,gBAAgB;AAC5E;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,wBAAwB;AAC9C;;AAEA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN,8CAA8C,WAAW,mBAAmB,UAAU;AACtF;;AAEA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,YAAY,iBAAiB,OAAO;AAChF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kDAAkD,WAAW,gCAAgC,IAAI;AACjG;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,YAAY,+BAA+B,EAAE,SAAS,oBAAoB,WAAW,wBAAwB,UAAU;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wDAAwD,WAAW;AACnE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,uEAAuE,aAAa;AACpF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,aAAa;AACjF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B,uBAAuB,EAAE,iBAAiB;AACzE;AACA;AACA;;AAEA,4BAA4B,uBAAuB,EAAE,sBAAsB;AAC3E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,WAAW;AACnG,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,6BAA6B,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB;AACzF,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB,EAAE,SAAS;AACzD,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB,EAAE,gBAAgB;AAChE;AACA;;AAEA;AACA,uCAAuC,WAAW;AAClD;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN,wCAAwC;;AAExC,+CAA+C,WAAW,oBAAoB,gBAAgB;AAC9F;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4DAA4D,WAAW;AACvE;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,oBAAoB,EAAE,sCAAsC;AAC7F;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;;;AAGA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4DAA4D,WAAW;AACvE;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,oBAAoB,EAAE,sCAAsC;AAC7F;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,wCAAwC;;AAExC,+CAA+C,WAAW,oBAAoB,sCAAsC;AACpH,MAAM;AACN;AACA;;;AAGA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,wBAAwB;AAC1D;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,mDAAmD,aAAa,MAAM,mBAAmB;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,wFAAwF,WAAW;;AAEnG;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR,gDAAgD,WAAW,oBAAoB,kBAAkB;AACjG;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA,2DAA2D,WAAW;AACtE;;AAEA;AACA,IAAI;AACJ;AACA,uDAAuD,WAAW;AAClE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC,uBAAuB,EAAE,MAAM;AAClE;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,oBAAoB,EAAE,oBAAoB,EAAE,MAAM;AACrF;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,mCAAmC,iBAAiB,EAAE,kCAAkC;AACxF;AACA,KAAK;AACL,IAAI;AACJ;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA,GAAG,GAAG;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,MAAM,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,0BAA0B,GAAG;;AAExH,mCAAmC,MAAM,EAAE,qBAAqB,EAAE,yBAAyB;AAC3F;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,uCAAuC,KAAK,YAAY;AAC/E,IAAI;AACJ;AACA;AACA;AACA,yBAAyB,mCAAmC,KAAK,YAAY;AAC7E,MAAM;AACN;AACA;AACA,yBAAyB,qCAAqC,KAAK,YAAY;AAC/E,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,uBAAuB,mCAAmC,KAAK,YAAY;AAC3E,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,uBAAuB,wBAAwB,KAAK,SAAS;AAC7D;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,uBAAuB,mCAAmC,KAAK,SAAS;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,2DAA2D,SAAS;AACpE;;AAEA;AACA,oDAAoD,SAAS;AAC7D;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,2DAA2D,SAAS;AACpE;;AAEA;AACA,8DAA8D,SAAS;AACvE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8EAA8E;AAC9E;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,4EAA4E,QAAQ;AACpF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,GAAG,GAAG;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,gCAAgC;AAChC,mEAAmE,WAAW;AAC9E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,uCAAuC,SAAS;AAChD,gFAAgF,WAAW;AAC3F,UAAU;;;AAGV,gEAAgE;;AAEhE,qDAAqD;AACrD,QAAQ,wDAAwD;AAChE;AACA;AACA,sEAAsE,WAAW;AACjF;;AAEA;;AAEA;AACA,gEAAgE,WAAW,qBAAqB,WAAW;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uBAAuB,qBAAqB,WAAW;AACtH,UAAU;AACV;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,eAAe;AACf,kCAAkC;AAClC;AACA,UAAU;AACV;AACA;AACA,iCAAiC;;AAEjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,+DAA+D,uBAAuB,qBAAqB,WAAW;AACtH,UAAU;AACV;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;;AAGA;;AAEA;AACA,6DAA6D,WAAW;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA,IAAI;AACJ,2BAA2B;;;AAG3B;AACA,4EAA4E,WAAW;AACvF,IAAI;AACJ;AACA,+BAA+B,eAAe;;;AAG9C;AACA;AACA;AACA,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB;AACA,2DAA2D,uBAAuB,oBAAoB,WAAW;AACjH;;AAEA;AACA,IAAI;AACJ,kBAAkB;;;AAGlB;AACA;AACA;;AAEA;AACA;;AAEA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA,sBAAsB;AACtB;AACA,+CAA+C,uBAAuB;AACtE,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA,0BAA0B,MAAM,EAAE,SAAS,0BAA0B,SAAS,EAAE,MAAM;AACtF;AACA;;AAEA,uEAAuE;AACvE,aAAa,gBAAgB;;AAE7B;AACA;AACA;;AAEA,oBAAoB,iBAAiB,oBAAoB;;AAEzD;AACA,uBAAuB,6BAA6B,KAAK,kCAAkC;AAC3F;;AAEA,2BAA2B;AAC3B,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL,mDAAmD,QAAQ;AAC3D;;AAEA;AACA,oDAAoD,0BAA0B,QAAQ;AACtF,MAAM,wBAAwB;;;AAG9B,8CAA8C;;AAE9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,6DAA6D;AAC7D;;AAEA;AACA,2JAA2J;;AAE3J;AACA,MAAM;AACN;AACA,uCAAuC;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,wBAAwB,KAAK,cAAc,aAAa;AACxD;AACA,GAAG,GAAG;;AAEN;AACA,qCAAqC,sBAAsB;AAC3D;;AAEA;AACA;;AAEA,mCAAmC;AACnC,sCAAsC,EAAE;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA,uBAAuB,wBAAwB,KAAK,SAAS;AAC7D;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,uBAAuB,mCAAmC,KAAK,SAAS;AACxE;;AAEA;AACA;AACA;AACA,yBAAyB,sCAAsC,KAAK,mBAAmB;AACvF,MAAM;;;AAGN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;;AAGA;AACA,oBAAoB,SAAS;AAC7B;AACA;;AAEA;AACA,uBAAuB,iCAAiC,KAAK,mBAAmB;AAChF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA,2BAA2B,4BAA4B,KAAK,mBAAmB;AAC/E,QAAQ;AACR,iBAAiB,gBAAgB,yBAAyB;;AAE1D,MAAM;AACN,iCAAiC;AACjC,4DAA4D,QAAQ;AACpE,wBAAwB,cAAc,eAAe,SAAS,sBAAsB;AACpF,yBAAyB,iCAAiC,KAAK,mBAAmB;AAClF;;AAEA;AACA;;AAEA;AACA,iCAAiC,aAAa,QAAQ;;AAEtD;AACA;;AAEA;AACA,yBAAyB,kCAAkC,KAAK,mBAAmB;AACnF;;AAEA;AACA,wBAAwB;;AAExB;;AAEA;AACA,yBAAyB,+BAA+B,KAAK,mBAAmB;AAChF;;AAEA;;AAEA;AACA,yBAAyB,4BAA4B,KAAK,mBAAmB;AAC7E;;AAEA;AACA;AACA;AACA,KAAK,GAAG,6BAA6B;AACrC,eAAe,eAAe,UAAU;;AAExC;AACA;AACA;AACA,IAAI,0CAA0C;AAC9C;;;AAGA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,iEAAiE;;AAEjE;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gCAAgC;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,uDAAuD;AACvD;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA,6BAA6B,MAAM,EAAE,SAAS,6BAA6B,SAAS,EAAE,MAAM;AAC5F,uBAAuB,+BAA+B,kBAAkB,WAAW;AACnF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA,0EAA0E;AAC1E,iBAAiB,gBAAgB;;AAEjC;AACA,2BAA2B,+BAA+B,KAAK,mBAAmB;AAClF;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA,6DAA6D;;AAE7D;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,sDAAsD,YAAY;;AAElE;AACA;AACA,MAAM;AACN;;AAEA;AACA,oDAAoD;AACpD,kCAAkC,cAAc;;AAEhD,mKAAmK;;AAEnK;AACA,6BAA6B;;AAE7B,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU,gBAAgB,wCAAwC,wCAAwC;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gBAAgB;AAChC;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA,YAAY,eAAe;AAC3B;AACA,YAAY,mBAAmB;AAC/B,gBAAgB,wCAAwC;AACxD;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,uMAAuM;AACvM;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,mCAAmC;AAChD;AACA;AACA;;;AAGA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,oBAAoB,kCAAkC;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;;AAGJ;;AAEA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,wDAAwD;;AAExD,kFAAkF;;AAElF;AACA,yEAAyE,gBAAgB;AACzF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;;;AAGA;AACA;AACA,QAAQ;;;AAGR;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA,0EAA0E;AAC1E,4BAA4B,aAAa;;AAEzC;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA,qEAAqE,SAAS;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,YAAY;AAClB,4BAA4B,aAAa;AACzC;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,YAAY;AACpB,8BAA8B,aAAa;;AAE3C;AACA,6EAA6E,SAAS;AACtF;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA,qCAAqC;AACrC,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,IAAI;;;AAGJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,mCAAmC,cAAc;AACjD;AACA,YAAY,gBAAgB;AAC5B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA;AACA,GAAG,GAAG;;AAEN,mDAAmD;;AAEnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;;AAGJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA,MAAM;AACN;AACA;;;AAGA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,iIAAiI,mBAAmB;AACpJ;AACA;;AAEA;AACA;AACA,MAAM;AACN;;;AAGA;AACA;AACA,KAAK;;AAEL;AACA;AACA,8GAA8G,uCAAuC;AACrJ;AACA;AACA;AACA,cAAc,kBAAkB;AAChC;AACA;AACA,SAAS,uBAAuB;AAChC;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA,8CAA8C,kCAAkC;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,iDAAiD,cAAc,OAAO,mBAAmB;AACzF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEuB;;;ACvoMqB;AACQ;;AAEpD;AACA,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,8CAA2B,iBAAiB,mCAAmC;AAC1F,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,WAAW;AACzC,2BAA2B,SAAS,SAAS;AAC7C,2BAA2B,UAAU,SAAS;AAC9C,wBAAwB;AACxB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,wBAAwB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,kBAAkB,WAAW,SAAS;AACzF,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB,WAAW,UAAU,YAAY;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,uBAAuB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA,4BAA4B,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,sCAAsC;AACtE;AACA;AACA;AACA;AACA,4BAA4B,SAAS;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB,8BAA8B,uBAAuB,4BAA4B;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,IAAI,MAAM,SAAS,GAAG,IAAI,KAAK,aAAa;AAC1D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA,sBAAsB,mCAAmC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,mCAAmC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB,mCAAmC;AACnD;AACA,WAAW,iCAAiC;AAC5C,sBAAsB,0CAA0C;AAChE,2CAA2C;AAC3C,mBAAmB,sBAAsB,IAAI,0CAA0C;AACvF;AACA;AACA;AACA;AACA,gBAAgB,oDAAoD;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,WAAW;AAC3C;AACA;AACA;AACA,mBAAmB,wBAAwB,KAAK,mBAAmB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,sBAAsB,mCAAmC;AACzD;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,wDAAqC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB;AACpD,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAA0C,yBAAyB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,6DAA6D,8EAA8E;AAC3I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE0D;;;AChqC3D;;;;;;;;;;;;;;;;CAgBC,GAE+C","sources":["webpack://@adguard/api/webpack/universalModuleDefinition","webpack://@adguard/api/../tswebextension/node_modules/webextension-polyfill/dist/browser-polyfill.js","webpack://@adguard/api/webpack/bootstrap","webpack://@adguard/api/webpack/runtime/compat get default export","webpack://@adguard/api/webpack/runtime/define property getters","webpack://@adguard/api/webpack/runtime/hasOwnProperty shorthand","webpack://@adguard/api/webpack/runtime/make namespace object","webpack://@adguard/api/../tswebextension/node_modules/@adguard/extended-css/dist/extended-css.esm.js","webpack://@adguard/api/../tswebextension/dist/content-script.js","webpack://@adguard/api/./src/content-script/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.10.0 - Fri Aug 12 2022 19:42:44 */\n\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n\n /* vim: set sts=2 sw=2 et tw=80: */\n\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!globalThis.chrome?.runtime?.id) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n\n if (typeof globalThis.browser === \"undefined\" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n\n\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n\n return super.get(key);\n }\n\n }\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n\n\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n\n\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n\n\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args); // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n\n\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n\n });\n };\n\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy}\n */\n\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n\n if (!(prop in target)) {\n return undefined;\n }\n\n let value = target[prop];\n\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n\n get() {\n return target[prop];\n },\n\n set(value) {\n target[prop] = value;\n }\n\n });\n return value;\n }\n\n cache[prop] = value;\n return value;\n },\n\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n\n return true;\n },\n\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n\n }; // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n\n\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n\n });\n\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n\n\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {}\n /* wrappers */\n , {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n\n\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n\n const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n } // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n\n\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n }; // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n\n\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n } // Let Chrome know that the listener is replying.\n\n\n return true;\n };\n });\n\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n }; // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n\n\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @adguard/extended-css - v2.0.52 - Fri Apr 14 2023\n * https://github.com/AdguardTeam/ExtendedCss#homepage\n * Copyright (c) 2023 AdGuard. Licensed GPL-3.0\n */\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\n/**\n * Possible ast node types.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\nconst NODE = {\n SELECTOR_LIST: 'SelectorList',\n SELECTOR: 'Selector',\n REGULAR_SELECTOR: 'RegularSelector',\n EXTENDED_SELECTOR: 'ExtendedSelector',\n ABSOLUTE_PSEUDO_CLASS: 'AbsolutePseudoClass',\n RELATIVE_PSEUDO_CLASS: 'RelativePseudoClass'\n};\n\n/**\n * Class needed for creating ast nodes while selector parsing.\n * Used for SelectorList, Selector, ExtendedSelector.\n */\nclass AnySelectorNode {\n /**\n * Creates new ast node.\n *\n * @param type Ast node type.\n */\n constructor(type) {\n _defineProperty(this, \"children\", []);\n\n this.type = type;\n }\n /**\n * Adds child node to children array.\n *\n * @param child Ast node.\n */\n\n\n addChild(child) {\n this.children.push(child);\n }\n\n}\n/**\n * Class needed for creating RegularSelector ast node while selector parsing.\n */\n\nclass RegularSelectorNode extends AnySelectorNode {\n /**\n * Creates RegularSelector ast node.\n *\n * @param value Value of RegularSelector node.\n */\n constructor(value) {\n super(NODE.REGULAR_SELECTOR);\n this.value = value;\n }\n\n}\n/**\n * Class needed for creating RelativePseudoClass ast node while selector parsing.\n */\n\nclass RelativePseudoClassNode extends AnySelectorNode {\n /**\n * Creates RegularSelector ast node.\n *\n * @param name Name of RelativePseudoClass node.\n */\n constructor(name) {\n super(NODE.RELATIVE_PSEUDO_CLASS);\n this.name = name;\n }\n\n}\n/**\n * Class needed for creating AbsolutePseudoClass ast node while selector parsing.\n */\n\nclass AbsolutePseudoClassNode extends AnySelectorNode {\n /**\n * Creates AbsolutePseudoClass ast node.\n *\n * @param name Name of AbsolutePseudoClass node.\n */\n constructor(name) {\n super(NODE.ABSOLUTE_PSEUDO_CLASS);\n\n _defineProperty(this, \"value\", '');\n\n this.name = name;\n }\n\n}\n/* eslint-disable jsdoc/require-description-complete-sentence */\n\n/**\n * Root node.\n *\n * SelectorList\n * : Selector\n * ...\n * ;\n */\n\n/**\n * Selector node.\n *\n * Selector\n * : RegularSelector\n * | ExtendedSelector\n * ...\n * ;\n */\n\n/**\n * Regular selector node.\n * It can be selected by querySelectorAll().\n *\n * RegularSelector\n * : type\n * : value\n * ;\n */\n\n/**\n * Extended selector node.\n *\n * ExtendedSelector\n * : AbsolutePseudoClass\n * | RelativePseudoClass\n * ;\n */\n\n/**\n * Absolute extended pseudo-class node,\n * i.e. none-selector args.\n *\n * AbsolutePseudoClass\n * : type\n * : name\n * : value\n * ;\n */\n\n/**\n * Relative extended pseudo-class node\n * i.e. selector as arg.\n *\n * RelativePseudoClass\n * : type\n * : name\n * : SelectorList\n * ;\n */\n//\n// ast example\n//\n// div.banner > div:has(span, p), a img.ad\n//\n// SelectorList - div.banner > div:has(span, p), a img.ad\n// Selector - div.banner > div:has(span, p)\n// RegularSelector - div.banner > div\n// ExtendedSelector - :has(span, p)\n// PseudoClassSelector - :has\n// SelectorList - span, p\n// Selector - span\n// RegularSelector - span\n// Selector - p\n// RegularSelector - p\n// Selector - a img.ad\n// RegularSelector - a img.ad\n//\n\nconst LEFT_SQUARE_BRACKET = '[';\nconst RIGHT_SQUARE_BRACKET = ']';\nconst LEFT_PARENTHESIS = '(';\nconst RIGHT_PARENTHESIS = ')';\nconst LEFT_CURLY_BRACKET = '{';\nconst RIGHT_CURLY_BRACKET = '}';\nconst BRACKET = {\n SQUARE: {\n LEFT: LEFT_SQUARE_BRACKET,\n RIGHT: RIGHT_SQUARE_BRACKET\n },\n PARENTHESES: {\n LEFT: LEFT_PARENTHESIS,\n RIGHT: RIGHT_PARENTHESIS\n },\n CURLY: {\n LEFT: LEFT_CURLY_BRACKET,\n RIGHT: RIGHT_CURLY_BRACKET\n }\n};\nconst SLASH = '/';\nconst BACKSLASH = '\\\\';\nconst SPACE = ' ';\nconst COMMA = ',';\nconst DOT = '.';\nconst SEMICOLON = ';';\nconst COLON = ':';\nconst SINGLE_QUOTE = '\\'';\nconst DOUBLE_QUOTE = '\"'; // do not consider hyphen `-` as separated mark\n// to avoid pseudo-class names splitting\n// e.g. 'matches-css' or 'if-not'\n\nconst CARET = '^';\nconst DOLLAR_SIGN = '$';\nconst EQUAL_SIGN = '=';\nconst TAB = '\\t';\nconst CARRIAGE_RETURN = '\\r';\nconst LINE_FEED = '\\n';\nconst FORM_FEED = '\\f';\nconst WHITE_SPACE_CHARACTERS = [SPACE, TAB, CARRIAGE_RETURN, LINE_FEED, FORM_FEED]; // for universal selector and attributes\n\nconst ASTERISK = '*';\nconst ID_MARKER = '#';\nconst CLASS_MARKER = DOT;\nconst DESCENDANT_COMBINATOR = SPACE;\nconst CHILD_COMBINATOR = '>';\nconst NEXT_SIBLING_COMBINATOR = '+';\nconst SUBSEQUENT_SIBLING_COMBINATOR = '~';\nconst COMBINATORS = [DESCENDANT_COMBINATOR, CHILD_COMBINATOR, NEXT_SIBLING_COMBINATOR, SUBSEQUENT_SIBLING_COMBINATOR];\nconst SUPPORTED_SELECTOR_MARKS = [LEFT_SQUARE_BRACKET, RIGHT_SQUARE_BRACKET, LEFT_PARENTHESIS, RIGHT_PARENTHESIS, LEFT_CURLY_BRACKET, RIGHT_CURLY_BRACKET, SLASH, BACKSLASH, SEMICOLON, COLON, COMMA, SINGLE_QUOTE, DOUBLE_QUOTE, CARET, DOLLAR_SIGN, ASTERISK, ID_MARKER, CLASS_MARKER, DESCENDANT_COMBINATOR, CHILD_COMBINATOR, NEXT_SIBLING_COMBINATOR, SUBSEQUENT_SIBLING_COMBINATOR, TAB, CARRIAGE_RETURN, LINE_FEED, FORM_FEED];\nconst SUPPORTED_STYLE_DECLARATION_MARKS = [// divider between property and value in declaration\nCOLON, // divider between declarations\nSEMICOLON, // sometimes is needed for value wrapping\n// e.g. 'content: \"-\"'\nSINGLE_QUOTE, DOUBLE_QUOTE, // needed for quote escaping inside the same-type quotes\nBACKSLASH, // whitespaces\nSPACE, TAB, CARRIAGE_RETURN, LINE_FEED, FORM_FEED]; // absolute:\n\nconst CONTAINS_PSEUDO = 'contains';\nconst HAS_TEXT_PSEUDO = 'has-text';\nconst ABP_CONTAINS_PSEUDO = '-abp-contains';\nconst MATCHES_CSS_PSEUDO = 'matches-css';\nconst MATCHES_CSS_BEFORE_PSEUDO = 'matches-css-before';\nconst MATCHES_CSS_AFTER_PSEUDO = 'matches-css-after';\nconst MATCHES_ATTR_PSEUDO_CLASS_MARKER = 'matches-attr';\nconst MATCHES_PROPERTY_PSEUDO_CLASS_MARKER = 'matches-property';\nconst XPATH_PSEUDO_CLASS_MARKER = 'xpath';\nconst NTH_ANCESTOR_PSEUDO_CLASS_MARKER = 'nth-ancestor';\nconst CONTAINS_PSEUDO_NAMES = [CONTAINS_PSEUDO, HAS_TEXT_PSEUDO, ABP_CONTAINS_PSEUDO];\n/**\n * Pseudo-class :upward() can get number or selector arg\n * and if the arg is selector it should be standard, not extended\n * so :upward pseudo-class is always absolute.\n */\n\nconst UPWARD_PSEUDO_CLASS_MARKER = 'upward';\n/**\n * Pseudo-class `:remove()` and pseudo-property `remove`\n * are used for element actions, not for element selecting.\n *\n * Selector text should not contain the pseudo-class\n * so selector parser should consider it as invalid\n * and both are handled by stylesheet parser.\n */\n\nconst REMOVE_PSEUDO_MARKER = 'remove'; // relative:\n\nconst HAS_PSEUDO_CLASS_MARKER = 'has';\nconst ABP_HAS_PSEUDO_CLASS_MARKER = '-abp-has';\nconst HAS_PSEUDO_CLASS_MARKERS = [HAS_PSEUDO_CLASS_MARKER, ABP_HAS_PSEUDO_CLASS_MARKER];\nconst IS_PSEUDO_CLASS_MARKER = 'is';\nconst NOT_PSEUDO_CLASS_MARKER = 'not';\nconst ABSOLUTE_PSEUDO_CLASSES = [CONTAINS_PSEUDO, HAS_TEXT_PSEUDO, ABP_CONTAINS_PSEUDO, MATCHES_CSS_PSEUDO, MATCHES_CSS_BEFORE_PSEUDO, MATCHES_CSS_AFTER_PSEUDO, MATCHES_ATTR_PSEUDO_CLASS_MARKER, MATCHES_PROPERTY_PSEUDO_CLASS_MARKER, XPATH_PSEUDO_CLASS_MARKER, NTH_ANCESTOR_PSEUDO_CLASS_MARKER, UPWARD_PSEUDO_CLASS_MARKER];\nconst RELATIVE_PSEUDO_CLASSES = [...HAS_PSEUDO_CLASS_MARKERS, IS_PSEUDO_CLASS_MARKER, NOT_PSEUDO_CLASS_MARKER];\nconst SUPPORTED_PSEUDO_CLASSES = [...ABSOLUTE_PSEUDO_CLASSES, ...RELATIVE_PSEUDO_CLASSES]; // these pseudo-classes should be part of RegularSelector value\n// if its arg does not contain extended selectors.\n// the ast will be checked after the selector is completely parsed\n\nconst OPTIMIZATION_PSEUDO_CLASSES = [NOT_PSEUDO_CLASS_MARKER, IS_PSEUDO_CLASS_MARKER];\n/**\n * ':scope' is used for extended pseudo-class :has(), if-not(), :is() and :not().\n */\n\nconst SCOPE_CSS_PSEUDO_CLASS = ':scope';\n/**\n * ':after' and ':before' are needed for :matches-css() pseudo-class\n * all other are needed for :has() limitation after regular pseudo-elements.\n *\n * @see {@link https://bugs.chromium.org/p/chromium/issues/detail?id=669058#c54} [case 3]\n */\n\nconst REGULAR_PSEUDO_ELEMENTS = {\n AFTER: 'after',\n BACKDROP: 'backdrop',\n BEFORE: 'before',\n CUE: 'cue',\n CUE_REGION: 'cue-region',\n FIRST_LETTER: 'first-letter',\n FIRST_LINE: 'first-line',\n FILE_SELECTION_BUTTON: 'file-selector-button',\n GRAMMAR_ERROR: 'grammar-error',\n MARKER: 'marker',\n PART: 'part',\n PLACEHOLDER: 'placeholder',\n SELECTION: 'selection',\n SLOTTED: 'slotted',\n SPELLING_ERROR: 'spelling-error',\n TARGET_TEXT: 'target-text'\n}; // ExtendedCss does not support at-rules\n// https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule\n\nconst AT_RULE_MARKER = '@';\nconst CONTENT_CSS_PROPERTY = 'content';\nconst PSEUDO_PROPERTY_POSITIVE_VALUE = 'true';\nconst DEBUG_PSEUDO_PROPERTY_GLOBAL_VALUE = 'global';\nconst NO_SELECTOR_ERROR_PREFIX = 'Selector should be defined';\nconst STYLE_ERROR_PREFIX = {\n NO_STYLE: 'No style declaration found',\n NO_SELECTOR: `${NO_SELECTOR_ERROR_PREFIX} before style declaration in stylesheet`,\n INVALID_STYLE: 'Invalid style declaration',\n UNCLOSED_STYLE: 'Unclosed style declaration',\n NO_PROPERTY: 'Missing style property in declaration',\n NO_VALUE: 'Missing style value in declaration',\n NO_STYLE_OR_REMOVE: 'Style should be declared or :remove() pseudo-class should used',\n NO_COMMENT: 'Comments are not supported'\n};\nconst NO_AT_RULE_ERROR_PREFIX = 'At-rules are not supported';\nconst REMOVE_ERROR_PREFIX = {\n INVALID_REMOVE: 'Invalid :remove() pseudo-class in selector',\n NO_TARGET_SELECTOR: `${NO_SELECTOR_ERROR_PREFIX} before :remove() pseudo-class`,\n MULTIPLE_USAGE: 'Pseudo-class :remove() appears more than once in selector',\n INVALID_POSITION: 'Pseudo-class :remove() should be at the end of selector'\n};\nconst MATCHING_ELEMENT_ERROR_PREFIX = 'Error while matching element';\nconst MAX_STYLE_PROTECTION_COUNT = 50;\n\n/**\n * Regexp that matches backward compatible syntaxes.\n */\n\nconst REGEXP_VALID_OLD_SYNTAX = /\\[-(?:ext)-([a-z-_]+)=([\"'])((?:(?=(\\\\?))\\4.)*?)\\2\\]/g;\n/**\n * Marker for checking invalid selector after old-syntax normalizing by selector converter.\n */\n\nconst INVALID_OLD_SYNTAX_MARKER = '[-ext-';\n/**\n * Complex replacement function.\n * Undo quote escaping inside of an extended selector.\n *\n * @param match Whole matched string.\n * @param name Group 1.\n * @param quoteChar Group 2.\n * @param rawValue Group 3.\n *\n * @returns Converted string.\n */\n\nconst evaluateMatch = (match, name, quoteChar, rawValue) => {\n // Unescape quotes\n const re = new RegExp(`([^\\\\\\\\]|^)\\\\\\\\${quoteChar}`, 'g');\n const value = rawValue.replace(re, `$1${quoteChar}`);\n return `:${name}(${value})`;\n}; // ':scope' pseudo may be at start of :has() argument\n// but ExtCssDocument.querySelectorAll() already use it for selecting exact element descendants\n\n\nconst SCOPE_MARKER_REGEXP = /\\(:scope >/g;\nconst SCOPE_REPLACER = '(>';\nconst MATCHES_CSS_PSEUDO_ELEMENT_REGEXP = /(:matches-css)-(before|after)\\(/g;\n\nconst convertMatchesCss = (match, extendedPseudoClass, regularPseudoElement) => {\n // ':matches-css-before(' --> ':matches-css(before, '\n // ':matches-css-after(' --> ':matches-css(after, '\n return `${extendedPseudoClass}${BRACKET.PARENTHESES.LEFT}${regularPseudoElement}${COMMA}`;\n};\n/**\n * Handles old syntax and :scope inside :has().\n *\n * @param selector Trimmed selector to normalize.\n *\n * @returns Normalized selector.\n * @throws An error on invalid old extended syntax selector.\n */\n\n\nconst normalize = selector => {\n const normalizedSelector = selector.replace(REGEXP_VALID_OLD_SYNTAX, evaluateMatch).replace(SCOPE_MARKER_REGEXP, SCOPE_REPLACER).replace(MATCHES_CSS_PSEUDO_ELEMENT_REGEXP, convertMatchesCss); // validate old syntax after normalizing\n // e.g. '[-ext-matches-css-before=\\'content: /^[A-Z][a-z]'\n\n if (normalizedSelector.includes(INVALID_OLD_SYNTAX_MARKER)) {\n throw new Error(`Invalid extended-css old syntax selector: '${selector}'`);\n }\n\n return normalizedSelector;\n};\n/**\n * Prepares the rawSelector before tokenization:\n * 1. Trims it.\n * 2. Converts old syntax `[-ext-pseudo-class=\"...\"]` to new one `:pseudo-class(...)`.\n * 3. Handles :scope pseudo inside :has() pseudo-class arg.\n *\n * @param rawSelector Selector with no style declaration.\n * @returns Prepared selector with no style declaration.\n */\n\n\nconst convert = rawSelector => {\n const trimmedSelector = rawSelector.trim();\n return normalize(trimmedSelector);\n};\n\n/**\n * Possible token types.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\nconst TOKEN_TYPE = {\n MARK: 'mark',\n WORD: 'word'\n};\n\n/**\n * Splits `input` string into tokens.\n *\n * @param input Input string to tokenize.\n * @param supportedMarks Array of supported marks to considered as `TOKEN_TYPE.MARK`;\n * all other will be considered as `TOKEN_TYPE.WORD`.\n *\n * @returns Array of tokens.\n */\nconst tokenize = (input, supportedMarks) => {\n // buffer is needed for words collecting while iterating\n let wordBuffer = ''; // result collection\n\n const tokens = [];\n const selectorSymbols = input.split(''); // iterate through selector chars and collect tokens\n\n selectorSymbols.forEach(symbol => {\n if (supportedMarks.includes(symbol)) {\n // if anything was collected to the buffer before\n if (wordBuffer.length > 0) {\n // now it is time to stop buffer collecting and save is as \"word\"\n tokens.push({\n type: TOKEN_TYPE.WORD,\n value: wordBuffer\n }); // reset the buffer\n\n wordBuffer = '';\n } // save current symbol as \"mark\"\n\n\n tokens.push({\n type: TOKEN_TYPE.MARK,\n value: symbol\n });\n return;\n } // otherwise collect symbol to the buffer\n\n\n wordBuffer += symbol;\n }); // save the last collected word\n\n if (wordBuffer.length > 0) {\n tokens.push({\n type: TOKEN_TYPE.WORD,\n value: wordBuffer\n });\n }\n\n return tokens;\n};\n\n/**\n * Prepares `rawSelector` and splits it into tokens.\n *\n * @param rawSelector Raw css selector.\n *\n * @returns Array of tokens supported for selector.\n */\n\nconst tokenizeSelector = rawSelector => {\n const selector = convert(rawSelector);\n return tokenize(selector, SUPPORTED_SELECTOR_MARKS);\n};\n/**\n * Splits `attribute` into tokens.\n *\n * @param attribute Input attribute.\n *\n * @returns Array of tokens supported for attribute.\n */\n\nconst tokenizeAttribute = attribute => {\n // equal sigh `=` in attribute is considered as `TOKEN_TYPE.MARK`\n return tokenize(attribute, [...SUPPORTED_SELECTOR_MARKS, EQUAL_SIGN]);\n};\n\n/**\n * Some browsers do not support Array.prototype.flat()\n * e.g. Opera 42 which is used for browserstack tests.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat}\n *\n * @param input Array needed to be flatten.\n *\n * @returns Flatten array.\n * @throws An error if array cannot be flatten.\n */\nconst flatten = input => {\n const stack = [];\n input.forEach(el => stack.push(el));\n const res = [];\n\n while (stack.length) {\n // pop value from stack\n const next = stack.pop();\n\n if (!next) {\n throw new Error('Unable to make array flat');\n }\n\n if (Array.isArray(next)) {\n // push back array items, won't modify the original input\n next.forEach(el => stack.push(el));\n } else {\n res.push(next);\n }\n } // reverse to restore input order\n\n\n return res.reverse();\n};\n/**\n * Returns first item from `array`.\n *\n * @param array Input array.\n *\n * @returns First array item, or `undefined` if there is no such item.\n */\n\nconst getFirst = array => {\n return array[0];\n};\n/**\n * Returns last item from array.\n *\n * @param array Input array.\n *\n * @returns Last array item, or `undefined` if there is no such item.\n */\n\nconst getLast = array => {\n return array[array.length - 1];\n};\n/**\n * Returns array item which is previous to the last one\n * e.g. for `[5, 6, 7, 8]` returns `7`.\n *\n * @param array Input array.\n *\n * @returns Previous to last array item, or `undefined` if there is no such item.\n */\n\nconst getPrevToLast = array => {\n return array[array.length - 2];\n};\n/**\n * Takes array of ast node `children` and returns the child by the `index`.\n *\n * @param array Array of ast node children.\n * @param index Index of needed child in the array.\n * @param errorMessage Optional error message to throw.\n *\n * @returns Array item at `index` position.\n * @throws An error if there is no child with specified `index` in array.\n */\n\nconst getItemByIndex = (array, index, errorMessage) => {\n const indexChild = array[index];\n\n if (!indexChild) {\n throw new Error(errorMessage || `No array item found by index ${index}`);\n }\n\n return indexChild;\n};\n\nconst NO_REGULAR_SELECTOR_ERROR = 'At least one of Selector node children should be RegularSelector';\n/**\n * Checks whether the type of `astNode` is SelectorList.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === SelectorList.\n */\n\nconst isSelectorListNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.SELECTOR_LIST;\n};\n/**\n * Checks whether the type of `astNode` is Selector.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === Selector.\n */\n\nconst isSelectorNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.SELECTOR;\n};\n/**\n * Checks whether the type of `astNode` is RegularSelector.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === RegularSelector.\n */\n\nconst isRegularSelectorNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.REGULAR_SELECTOR;\n};\n/**\n * Checks whether the type of `astNode` is ExtendedSelector.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === ExtendedSelector.\n */\n\nconst isExtendedSelectorNode = astNode => {\n return astNode.type === NODE.EXTENDED_SELECTOR;\n};\n/**\n * Checks whether the type of `astNode` is AbsolutePseudoClass.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === AbsolutePseudoClass.\n */\n\nconst isAbsolutePseudoClassNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.ABSOLUTE_PSEUDO_CLASS;\n};\n/**\n * Checks whether the type of `astNode` is RelativePseudoClass.\n *\n * @param astNode Ast node.\n *\n * @returns True if astNode.type === RelativePseudoClass.\n */\n\nconst isRelativePseudoClassNode = astNode => {\n return (astNode === null || astNode === void 0 ? void 0 : astNode.type) === NODE.RELATIVE_PSEUDO_CLASS;\n};\n/**\n * Returns name of `astNode`.\n *\n * @param astNode AbsolutePseudoClass or RelativePseudoClass node.\n *\n * @returns Name of `astNode`.\n * @throws An error on unsupported ast node or no name found.\n */\n\nconst getNodeName = astNode => {\n if (astNode === null) {\n throw new Error('Ast node should be defined');\n }\n\n if (!isAbsolutePseudoClassNode(astNode) && !isRelativePseudoClassNode(astNode)) {\n throw new Error('Only AbsolutePseudoClass or RelativePseudoClass ast node can have a name');\n }\n\n if (!astNode.name) {\n throw new Error('Extended pseudo-class should have a name');\n }\n\n return astNode.name;\n};\n/**\n * Returns value of `astNode`.\n *\n * @param astNode RegularSelector or AbsolutePseudoClass node.\n * @param errorMessage Optional error message if no value found.\n *\n * @returns Value of `astNode`.\n * @throws An error on unsupported ast node or no value found.\n */\n\nconst getNodeValue = (astNode, errorMessage) => {\n if (astNode === null) {\n throw new Error('Ast node should be defined');\n }\n\n if (!isRegularSelectorNode(astNode) && !isAbsolutePseudoClassNode(astNode)) {\n throw new Error('Only RegularSelector ot AbsolutePseudoClass ast node can have a value');\n }\n\n if (!astNode.value) {\n throw new Error(errorMessage || 'Ast RegularSelector ot AbsolutePseudoClass node should have a value');\n }\n\n return astNode.value;\n};\n/**\n * Returns only RegularSelector nodes from `children`.\n *\n * @param children Array of ast node children.\n *\n * @returns Array of RegularSelector nodes.\n */\n\nconst getRegularSelectorNodes = children => {\n return children.filter(isRegularSelectorNode);\n};\n/**\n * Returns the first RegularSelector node from `children`.\n *\n * @param children Array of ast node children.\n * @param errorMessage Optional error message if no value found.\n *\n * @returns Ast RegularSelector node.\n * @throws An error if no RegularSelector node found.\n */\n\n\nconst getFirstRegularChild = (children, errorMessage) => {\n const regularSelectorNodes = getRegularSelectorNodes(children);\n const firstRegularSelectorNode = getFirst(regularSelectorNodes);\n\n if (!firstRegularSelectorNode) {\n throw new Error(errorMessage || NO_REGULAR_SELECTOR_ERROR);\n }\n\n return firstRegularSelectorNode;\n};\n/**\n * Returns the last RegularSelector node from `children`.\n *\n * @param children Array of ast node children.\n *\n * @returns Ast RegularSelector node.\n * @throws An error if no RegularSelector node found.\n */\n\nconst getLastRegularChild = children => {\n const regularSelectorNodes = getRegularSelectorNodes(children);\n const lastRegularSelectorNode = getLast(regularSelectorNodes);\n\n if (!lastRegularSelectorNode) {\n throw new Error(NO_REGULAR_SELECTOR_ERROR);\n }\n\n return lastRegularSelectorNode;\n};\n/**\n * Returns the only child of `node`.\n *\n * @param node Ast node.\n * @param errorMessage Error message.\n *\n * @returns The only child of ast node.\n * @throws An error if none or more than one child found.\n */\n\nconst getNodeOnlyChild = (node, errorMessage) => {\n if (node.children.length !== 1) {\n throw new Error(errorMessage);\n }\n\n const onlyChild = getFirst(node.children);\n\n if (!onlyChild) {\n throw new Error(errorMessage);\n }\n\n return onlyChild;\n};\n/**\n * Takes ExtendedSelector node and returns its only child.\n *\n * @param extendedSelectorNode ExtendedSelector ast node.\n *\n * @returns AbsolutePseudoClass or RelativePseudoClass.\n * @throws An error if there is no specific pseudo-class ast node.\n */\n\nconst getPseudoClassNode = extendedSelectorNode => {\n return getNodeOnlyChild(extendedSelectorNode, 'Extended selector should be specified');\n};\n/**\n * Takes RelativePseudoClass node and returns its only child\n * which is relative SelectorList node.\n *\n * @param pseudoClassNode RelativePseudoClass.\n *\n * @returns Relative SelectorList node.\n * @throws An error if no selector list found.\n */\n\nconst getRelativeSelectorListNode = pseudoClassNode => {\n if (!isRelativePseudoClassNode(pseudoClassNode)) {\n throw new Error('Only RelativePseudoClass node can have relative SelectorList node as child');\n }\n\n return getNodeOnlyChild(pseudoClassNode, `Missing arg for :${getNodeName(pseudoClassNode)}() pseudo-class`);\n};\n\nconst ATTRIBUTE_CASE_INSENSITIVE_FLAG = 'i';\n/**\n * Limited list of available symbols before slash `/`\n * to check whether it is valid regexp pattern opening.\n */\n\nconst POSSIBLE_MARKS_BEFORE_REGEXP = {\n COMMON: [// e.g. ':matches-attr(/data-/)'\n BRACKET.PARENTHESES.LEFT, // e.g. `:matches-attr('/data-/')`\n SINGLE_QUOTE, // e.g. ':matches-attr(\"/data-/\")'\n DOUBLE_QUOTE, // e.g. ':matches-attr(check=/data-v-/)'\n EQUAL_SIGN, // e.g. ':matches-property(inner./_test/=null)'\n DOT, // e.g. ':matches-css(height:/20px/)'\n COLON, // ':matches-css-after( content : /(\\\\d+\\\\s)*me/ )'\n SPACE],\n CONTAINS: [// e.g. ':contains(/text/)'\n BRACKET.PARENTHESES.LEFT, // e.g. `:contains('/text/')`\n SINGLE_QUOTE, // e.g. ':contains(\"/text/\")'\n DOUBLE_QUOTE]\n};\n/**\n * Checks whether the passed token is supported extended pseudo-class.\n *\n * @param tokenValue Token value to check.\n *\n * @returns True if `tokenValue` is one of supported extended pseudo-class names.\n */\n\nconst isSupportedPseudoClass = tokenValue => {\n return SUPPORTED_PSEUDO_CLASSES.includes(tokenValue);\n};\n/**\n * Checks whether the passed pseudo-class `name` should be optimized,\n * i.e. :not() and :is().\n *\n * @param name Pseudo-class name.\n *\n * @returns True if `name` is one if pseudo-class which should be optimized.\n */\n\nconst isOptimizationPseudoClass = name => {\n return OPTIMIZATION_PSEUDO_CLASSES.includes(name);\n};\n/**\n * Checks whether next to \"space\" token is a continuation of regular selector being processed.\n *\n * @param nextTokenType Type of token next to current one.\n * @param nextTokenValue Value of token next to current one.\n *\n * @returns True if next token seems to be a part of current regular selector.\n */\n\nconst doesRegularContinueAfterSpace = (nextTokenType, nextTokenValue) => {\n // regular selector does not continues after the current token\n if (!nextTokenType || !nextTokenValue) {\n return false;\n }\n\n return COMBINATORS.includes(nextTokenValue) || nextTokenType === TOKEN_TYPE.WORD // e.g. '#main *:has(> .ad)'\n || nextTokenValue === ASTERISK || nextTokenValue === ID_MARKER || nextTokenValue === CLASS_MARKER // e.g. 'div :where(.content)'\n || nextTokenValue === COLON // e.g. \"div[class*=' ']\"\n || nextTokenValue === SINGLE_QUOTE // e.g. 'div[class*=\" \"]'\n || nextTokenValue === DOUBLE_QUOTE || nextTokenValue === BRACKET.SQUARE.LEFT;\n};\n/**\n * Checks whether the regexp pattern for pseudo-class arg starts.\n * Needed for `context.isRegexpOpen` flag.\n *\n * @param context Selector parser context.\n * @param prevTokenValue Value of previous token.\n * @param bufferNodeValue Value of bufferNode.\n *\n * @returns True if current token seems to be a start of regexp pseudo-class arg pattern.\n * @throws An error on invalid regexp pattern.\n */\n\nconst isRegexpOpening = (context, prevTokenValue, bufferNodeValue) => {\n const lastExtendedPseudoClassName = getLast(context.extendedPseudoNamesStack);\n\n if (!lastExtendedPseudoClassName) {\n throw new Error('Regexp pattern allowed only in arg of extended pseudo-class');\n } // for regexp pattens the slash should not be escaped\n // const isRegexpPatternSlash = prevTokenValue !== BACKSLASH;\n // regexp pattern can be set as arg of pseudo-class\n // which means limited list of available symbols before slash `/`;\n // for :contains() pseudo-class regexp pattern should be at the beginning of arg\n\n\n if (CONTAINS_PSEUDO_NAMES.includes(lastExtendedPseudoClassName)) {\n return POSSIBLE_MARKS_BEFORE_REGEXP.CONTAINS.includes(prevTokenValue);\n }\n\n if (prevTokenValue === SLASH && lastExtendedPseudoClassName !== XPATH_PSEUDO_CLASS_MARKER) {\n const rawArgDesc = bufferNodeValue ? `in arg part: '${bufferNodeValue}'` : 'arg';\n throw new Error(`Invalid regexp pattern for :${lastExtendedPseudoClassName}() pseudo-class ${rawArgDesc}`);\n } // for other pseudo-classes regexp pattern can be either the whole arg or its part\n\n\n return POSSIBLE_MARKS_BEFORE_REGEXP.COMMON.includes(prevTokenValue);\n};\n/**\n * Checks whether the attribute starts.\n *\n * @param tokenValue Value of current token.\n * @param prevTokenValue Previous token value.\n *\n * @returns True if combination of current and previous token seems to be **a start** of attribute.\n */\n\nconst isAttributeOpening = (tokenValue, prevTokenValue) => {\n return tokenValue === BRACKET.SQUARE.LEFT && prevTokenValue !== BACKSLASH;\n};\n/**\n * Checks whether the attribute ends.\n *\n * @param context Selector parser context.\n *\n * @returns True if combination of current and previous token seems to be **an end** of attribute.\n * @throws An error on invalid attribute.\n */\n\nconst isAttributeClosing = context => {\n var _getPrevToLast;\n\n if (!context.isAttributeBracketsOpen) {\n return false;\n } // valid attributes may have extra spaces inside.\n // we get rid of them just to simplify the checking and they are skipped only here:\n // - spaces will be collected to the ast with spaces as they were declared is selector\n // - extra spaces in attribute are not relevant to attribute syntax validity\n // e.g. 'a[ title ]' is the same as 'a[title]'\n // 'div[style *= \"MARGIN\" i]' is the same as 'div[style*=\"MARGIN\"i]'\n\n\n const noSpaceAttr = context.attributeBuffer.split(SPACE).join(''); // tokenize the prepared attribute string\n\n const attrTokens = tokenizeAttribute(noSpaceAttr);\n const firstAttrToken = getFirst(attrTokens);\n const firstAttrTokenType = firstAttrToken === null || firstAttrToken === void 0 ? void 0 : firstAttrToken.type;\n const firstAttrTokenValue = firstAttrToken === null || firstAttrToken === void 0 ? void 0 : firstAttrToken.value; // signal an error on any mark-type token except backslash\n // e.g. '[=\"margin\"]'\n\n if (firstAttrTokenType === TOKEN_TYPE.MARK // backslash is allowed at start of attribute\n // e.g. '[\\\\:data-service-slot]'\n && firstAttrTokenValue !== BACKSLASH) {\n // eslint-disable-next-line max-len\n throw new Error(`'[${context.attributeBuffer}]' is not a valid attribute due to '${firstAttrTokenValue}' at start of it`);\n }\n\n const lastAttrToken = getLast(attrTokens);\n const lastAttrTokenType = lastAttrToken === null || lastAttrToken === void 0 ? void 0 : lastAttrToken.type;\n const lastAttrTokenValue = lastAttrToken === null || lastAttrToken === void 0 ? void 0 : lastAttrToken.value;\n\n if (lastAttrTokenValue === EQUAL_SIGN) {\n // e.g. '[style=]'\n throw new Error(`'[${context.attributeBuffer}]' is not a valid attribute due to '${EQUAL_SIGN}'`);\n }\n\n const equalSignIndex = attrTokens.findIndex(token => {\n return token.type === TOKEN_TYPE.MARK && token.value === EQUAL_SIGN;\n });\n const prevToLastAttrTokenValue = (_getPrevToLast = getPrevToLast(attrTokens)) === null || _getPrevToLast === void 0 ? void 0 : _getPrevToLast.value;\n\n if (equalSignIndex === -1) {\n // if there is no '=' inside attribute,\n // it must be just attribute name which means the word-type token before closing bracket\n // e.g. 'div[style]'\n if (lastAttrTokenType === TOKEN_TYPE.WORD) {\n return true;\n }\n\n return prevToLastAttrTokenValue === BACKSLASH // some weird attribute are valid too\n // e.g. '[class\\\\\"ads-article\\\\\"]'\n && (lastAttrTokenValue === DOUBLE_QUOTE // e.g. \"[class\\\\'ads-article\\\\']\"\n || lastAttrTokenValue === SINGLE_QUOTE);\n } // get the value of token next to `=`\n\n\n const nextToEqualSignToken = getItemByIndex(attrTokens, equalSignIndex + 1);\n const nextToEqualSignTokenValue = nextToEqualSignToken.value; // check whether the attribute value wrapper in quotes\n\n const isAttrValueQuote = nextToEqualSignTokenValue === SINGLE_QUOTE || nextToEqualSignTokenValue === DOUBLE_QUOTE; // for no quotes after `=` the last token before `]` should be a word-type one\n // e.g. 'div[style*=margin]'\n // 'div[style*=MARGIN i]'\n\n if (!isAttrValueQuote) {\n if (lastAttrTokenType === TOKEN_TYPE.WORD) {\n return true;\n } // otherwise signal an error\n // e.g. 'table[style*=border: 0px\"]'\n\n\n throw new Error(`'[${context.attributeBuffer}]' is not a valid attribute`);\n } // otherwise if quotes for value are present\n // the last token before `]` can still be word-type token\n // e.g. 'div[style*=\"MARGIN\" i]'\n\n\n if (lastAttrTokenType === TOKEN_TYPE.WORD && (lastAttrTokenValue === null || lastAttrTokenValue === void 0 ? void 0 : lastAttrTokenValue.toLocaleLowerCase()) === ATTRIBUTE_CASE_INSENSITIVE_FLAG) {\n return prevToLastAttrTokenValue === nextToEqualSignTokenValue;\n } // eventually if there is quotes for attribute value and last token is not a word,\n // the closing mark should be the same quote as opening one\n\n\n return lastAttrTokenValue === nextToEqualSignTokenValue;\n};\n/**\n * Checks whether the `tokenValue` is a whitespace character.\n *\n * @param tokenValue Token value.\n *\n * @returns True if `tokenValue` is a whitespace character.\n */\n\nconst isWhiteSpaceChar = tokenValue => {\n if (!tokenValue) {\n return false;\n }\n\n return WHITE_SPACE_CHARACTERS.includes(tokenValue);\n};\n\n/**\n * Checks whether the passed `str` is a name of supported absolute extended pseudo-class,\n * e.g. :contains(), :matches-css() etc.\n *\n * @param str Token value to check.\n *\n * @returns True if `str` is one of absolute extended pseudo-class names.\n */\n\nconst isAbsolutePseudoClass = str => {\n return ABSOLUTE_PSEUDO_CLASSES.includes(str);\n};\n/**\n * Checks whether the passed `str` is a name of supported relative extended pseudo-class,\n * e.g. :has(), :not() etc.\n *\n * @param str Token value to check.\n *\n * @returns True if `str` is one of relative extended pseudo-class names.\n */\n\nconst isRelativePseudoClass = str => {\n return RELATIVE_PSEUDO_CLASSES.includes(str);\n};\n\n/**\n * Returns the node which is being collected\n * or null if there is no such one.\n *\n * @param context Selector parser context.\n *\n * @returns Buffer node or null.\n */\n\nconst getBufferNode = context => {\n if (context.pathToBufferNode.length === 0) {\n return null;\n } // buffer node is always the last in the pathToBufferNode stack\n\n\n return getLast(context.pathToBufferNode) || null;\n};\n/**\n * Returns the parent node to the 'buffer node' — which is the one being collected —\n * or null if there is no such one.\n *\n * @param context Selector parser context.\n *\n * @returns Parent node of buffer node or null.\n */\n\nconst getBufferNodeParent = context => {\n // at least two nodes should exist — the buffer node and its parent\n // otherwise return null\n if (context.pathToBufferNode.length < 2) {\n return null;\n } // since the buffer node is always the last in the pathToBufferNode stack\n // its parent is previous to it in the stack\n\n\n return getPrevToLast(context.pathToBufferNode) || null;\n};\n/**\n * Returns last RegularSelector ast node.\n * Needed for parsing of the complex selector with extended pseudo-class inside it.\n *\n * @param context Selector parser context.\n *\n * @returns Ast RegularSelector node.\n * @throws An error if:\n * - bufferNode is absent;\n * - type of bufferNode is unsupported;\n * - no RegularSelector in bufferNode.\n */\n\nconst getContextLastRegularSelectorNode = context => {\n const bufferNode = getBufferNode(context);\n\n if (!bufferNode) {\n throw new Error('No bufferNode found');\n }\n\n if (!isSelectorNode(bufferNode)) {\n throw new Error('Unsupported bufferNode type');\n }\n\n const lastRegularSelectorNode = getLastRegularChild(bufferNode.children);\n context.pathToBufferNode.push(lastRegularSelectorNode);\n return lastRegularSelectorNode;\n};\n/**\n * Updates needed buffer node value while tokens iterating.\n * For RegularSelector also collects token values to context.attributeBuffer\n * for proper attribute parsing.\n *\n * @param context Selector parser context.\n * @param tokenValue Value of current token.\n *\n * @throws An error if:\n * - no bufferNode;\n * - bufferNode.type is not RegularSelector or AbsolutePseudoClass.\n */\n\nconst updateBufferNode = (context, tokenValue) => {\n const bufferNode = getBufferNode(context);\n\n if (bufferNode === null) {\n throw new Error('No bufferNode to update');\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n bufferNode.value += tokenValue;\n } else if (isRegularSelectorNode(bufferNode)) {\n bufferNode.value += tokenValue;\n\n if (context.isAttributeBracketsOpen) {\n context.attributeBuffer += tokenValue;\n }\n } else {\n // eslint-disable-next-line max-len\n throw new Error(`${bufferNode.type} node cannot be updated. Only RegularSelector and AbsolutePseudoClass are supported`);\n }\n};\n/**\n * Adds SelectorList node to context.ast at the start of ast collecting.\n *\n * @param context Selector parser context.\n */\n\nconst addSelectorListNode = context => {\n const selectorListNode = new AnySelectorNode(NODE.SELECTOR_LIST);\n context.ast = selectorListNode;\n context.pathToBufferNode.push(selectorListNode);\n};\n/**\n * Adds new node to buffer node children.\n * New added node will be considered as buffer node after it.\n *\n * @param context Selector parser context.\n * @param type Type of node to add.\n * @param tokenValue Optional, defaults to `''`, value of processing token.\n *\n * @throws An error if no bufferNode.\n */\n\nconst addAstNodeByType = function (context, type) {\n let tokenValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n const bufferNode = getBufferNode(context);\n\n if (bufferNode === null) {\n throw new Error('No buffer node');\n }\n\n let node;\n\n if (type === NODE.REGULAR_SELECTOR) {\n node = new RegularSelectorNode(tokenValue);\n } else if (type === NODE.ABSOLUTE_PSEUDO_CLASS) {\n node = new AbsolutePseudoClassNode(tokenValue);\n } else if (type === NODE.RELATIVE_PSEUDO_CLASS) {\n node = new RelativePseudoClassNode(tokenValue);\n } else {\n // SelectorList || Selector || ExtendedSelector\n node = new AnySelectorNode(type);\n }\n\n bufferNode.addChild(node);\n context.pathToBufferNode.push(node);\n};\n/**\n * The very beginning of ast collecting.\n *\n * @param context Selector parser context.\n * @param tokenValue Value of regular selector.\n */\n\nconst initAst = (context, tokenValue) => {\n addSelectorListNode(context);\n addAstNodeByType(context, NODE.SELECTOR); // RegularSelector node is always the first child of Selector node\n\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n};\n/**\n * Inits selector list subtree for relative extended pseudo-classes, e.g. :has(), :not().\n *\n * @param context Selector parser context.\n * @param tokenValue Optional, defaults to `''`, value of inner regular selector.\n */\n\nconst initRelativeSubtree = function (context) {\n let tokenValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n addAstNodeByType(context, NODE.SELECTOR_LIST);\n addAstNodeByType(context, NODE.SELECTOR);\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n};\n/**\n * Goes to closest parent specified by type.\n * Actually updates path to buffer node for proper ast collecting of selectors while parsing.\n *\n * @param context Selector parser context.\n * @param parentType Type of needed parent node in ast.\n */\n\nconst upToClosest = (context, parentType) => {\n for (let i = context.pathToBufferNode.length - 1; i >= 0; i -= 1) {\n var _context$pathToBuffer;\n\n if (((_context$pathToBuffer = context.pathToBufferNode[i]) === null || _context$pathToBuffer === void 0 ? void 0 : _context$pathToBuffer.type) === parentType) {\n context.pathToBufferNode = context.pathToBufferNode.slice(0, i + 1);\n break;\n }\n }\n};\n/**\n * Returns needed buffer node updated due to complex selector parsing.\n *\n * @param context Selector parser context.\n *\n * @returns Ast node for following selector parsing.\n * @throws An error if there is no upper SelectorNode is ast.\n */\n\nconst getUpdatedBufferNode = context => {\n // it may happen during the parsing of selector list\n // which is an argument of relative pseudo-class\n // e.g. '.banner:has(~span, ~p)'\n // parser position is here ↑\n // so if after the comma the buffer node type is SelectorList and parent type is RelativePseudoClass\n // we should simply return the current buffer node\n const bufferNode = getBufferNode(context);\n\n if (bufferNode && isSelectorListNode(bufferNode) && isRelativePseudoClassNode(getBufferNodeParent(context))) {\n return bufferNode;\n }\n\n upToClosest(context, NODE.SELECTOR);\n const selectorNode = getBufferNode(context);\n\n if (!selectorNode) {\n throw new Error('No SelectorNode, impossible to continue selector parsing by ExtendedCss');\n }\n\n const lastSelectorNodeChild = getLast(selectorNode.children);\n const hasExtended = lastSelectorNodeChild && isExtendedSelectorNode(lastSelectorNodeChild) // parser position might be inside standard pseudo-class brackets which has space\n // e.g. 'div:contains(/а/):nth-child(100n + 2)'\n && context.standardPseudoBracketsStack.length === 0;\n const supposedPseudoClassNode = hasExtended && getFirst(lastSelectorNodeChild.children);\n let newNeededBufferNode = selectorNode;\n\n if (supposedPseudoClassNode) {\n // name of pseudo-class for last extended-node child for Selector node\n const lastExtendedPseudoName = hasExtended && supposedPseudoClassNode.name;\n const isLastExtendedNameRelative = lastExtendedPseudoName && isRelativePseudoClass(lastExtendedPseudoName);\n const isLastExtendedNameAbsolute = lastExtendedPseudoName && isAbsolutePseudoClass(lastExtendedPseudoName);\n const hasRelativeExtended = isLastExtendedNameRelative && context.extendedPseudoBracketsStack.length > 0 && context.extendedPseudoBracketsStack.length === context.extendedPseudoNamesStack.length;\n const hasAbsoluteExtended = isLastExtendedNameAbsolute && lastExtendedPseudoName === getLast(context.extendedPseudoNamesStack);\n\n if (hasRelativeExtended) {\n // return relative selector node to update later\n context.pathToBufferNode.push(lastSelectorNodeChild);\n newNeededBufferNode = supposedPseudoClassNode;\n } else if (hasAbsoluteExtended) {\n // return absolute selector node to update later\n context.pathToBufferNode.push(lastSelectorNodeChild);\n newNeededBufferNode = supposedPseudoClassNode;\n }\n } else if (hasExtended) {\n // return selector node to add new regular selector node later\n newNeededBufferNode = selectorNode;\n } else {\n // otherwise return last regular selector node to update later\n newNeededBufferNode = getContextLastRegularSelectorNode(context);\n } // update the path to buffer node properly\n\n\n context.pathToBufferNode.push(newNeededBufferNode);\n return newNeededBufferNode;\n};\n/**\n * Checks values of few next tokens on colon token `:` and:\n * - updates buffer node for following standard pseudo-class;\n * - adds extended selector ast node for following extended pseudo-class;\n * - validates some cases of `:remove()` and `:has()` usage.\n *\n * @param context Selector parser context.\n * @param selector Selector.\n * @param tokenValue Value of current token.\n * @param nextTokenValue Value of token next to current one.\n * @param nextToNextTokenValue Value of token next to next to current one.\n *\n * @throws An error on :remove() pseudo-class in selector\n * or :has() inside regular pseudo limitation.\n */\n\nconst handleNextTokenOnColon = (context, selector, tokenValue, nextTokenValue, nextToNextTokenValue) => {\n if (!nextTokenValue) {\n throw new Error(`Invalid colon ':' at the end of selector: '${selector}'`);\n }\n\n if (!isSupportedPseudoClass(nextTokenValue.toLowerCase())) {\n if (nextTokenValue.toLowerCase() === REMOVE_PSEUDO_MARKER) {\n // :remove() pseudo-class should be handled before\n // as it is not about element selecting but actions with elements\n // e.g. 'body > div:empty:remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n } // if following token is not an extended pseudo\n // the colon should be collected to value of RegularSelector\n // e.g. '.entry_text:nth-child(2)'\n\n\n updateBufferNode(context, tokenValue); // check the token after the pseudo and do balance parentheses later\n // only if it is functional pseudo-class (standard with brackets, e.g. ':lang()').\n // no brackets balance needed for such case,\n // parser position is on first colon after the 'div':\n // e.g. 'div:last-child:has(button.privacy-policy__btn)'\n\n if (nextToNextTokenValue && nextToNextTokenValue === BRACKET.PARENTHESES.LEFT // no brackets balance needed for parentheses inside attribute value\n // e.g. 'a[href=\"javascript:void(0)\"]' <-- parser position is on colon `:`\n // before `void` ↑\n && !context.isAttributeBracketsOpen) {\n context.standardPseudoNamesStack.push(nextTokenValue);\n }\n } else {\n // it is supported extended pseudo-class.\n // Disallow :has() inside the pseudos accepting only compound selectors\n // https://bugs.chromium.org/p/chromium/issues/detail?id=669058#c54 [2]\n if (HAS_PSEUDO_CLASS_MARKERS.includes(nextTokenValue) && context.standardPseudoNamesStack.length > 0) {\n // eslint-disable-next-line max-len\n throw new Error(`Usage of :${nextTokenValue}() pseudo-class is not allowed inside regular pseudo: '${getLast(context.standardPseudoNamesStack)}'`);\n } else {\n // stop RegularSelector value collecting\n upToClosest(context, NODE.SELECTOR); // add ExtendedSelector to Selector children\n\n addAstNodeByType(context, NODE.EXTENDED_SELECTOR);\n }\n }\n};\n\n// e.g. ':is(.page, .main) > .banner' or '*:not(span):not(p)'\n\nconst IS_OR_NOT_PSEUDO_SELECTING_ROOT = `html ${ASTERISK}`;\n/**\n * Checks if there are any ExtendedSelector node in selector list.\n *\n * @param selectorList Ast SelectorList node.\n *\n * @returns True if `selectorList` has any inner ExtendedSelector node.\n */\n\nconst hasExtendedSelector = selectorList => {\n return selectorList.children.some(selectorNode => {\n return selectorNode.children.some(selectorNodeChild => {\n return isExtendedSelectorNode(selectorNodeChild);\n });\n });\n};\n/**\n * Converts selector list of RegularSelector nodes to string.\n *\n * @param selectorList Ast SelectorList node.\n *\n * @returns String representation for selector list of regular selectors.\n */\n\n\nconst selectorListOfRegularsToString = selectorList => {\n // if there is no ExtendedSelector in relative SelectorList\n // it means that each Selector node has single child — RegularSelector node\n // and their values should be combined to string\n const standardCssSelectors = selectorList.children.map(selectorNode => {\n const selectorOnlyChild = getNodeOnlyChild(selectorNode, 'Ast Selector node should have RegularSelector node');\n return getNodeValue(selectorOnlyChild);\n });\n return standardCssSelectors.join(`${COMMA}${SPACE}`);\n};\n/**\n * Updates children of `node` replacing them with `newChildren`.\n * Important: modifies input `node` which is passed by reference.\n *\n * @param node Ast node to update.\n * @param newChildren Array of new children for ast node.\n *\n * @returns Updated ast node.\n */\n\n\nconst updateNodeChildren = (node, newChildren) => {\n node.children = newChildren;\n return node;\n};\n/**\n * Recursively checks whether the ExtendedSelector node should be optimized.\n * It has to be recursive because RelativePseudoClass has inner SelectorList node.\n *\n * @param currExtendedSelectorNode Ast ExtendedSelector node.\n *\n * @returns True is ExtendedSelector should be optimized.\n */\n\n\nconst shouldOptimizeExtendedSelector = currExtendedSelectorNode => {\n if (currExtendedSelectorNode === null) {\n return false;\n }\n\n const extendedPseudoClassNode = getPseudoClassNode(currExtendedSelectorNode);\n const pseudoName = getNodeName(extendedPseudoClassNode);\n\n if (isAbsolutePseudoClass(pseudoName)) {\n return false;\n }\n\n const relativeSelectorList = getRelativeSelectorListNode(extendedPseudoClassNode);\n const innerSelectorNodes = relativeSelectorList.children; // simple checking for standard selectors in arg of :not() or :is() pseudo-class\n // e.g. 'div > *:is(div, a, span)'\n\n if (isOptimizationPseudoClass(pseudoName)) {\n const areAllSelectorNodeChildrenRegular = innerSelectorNodes.every(selectorNode => {\n try {\n const selectorOnlyChild = getNodeOnlyChild(selectorNode, 'Selector node should have RegularSelector'); // it means that the only child is RegularSelector and it can be optimized\n\n return isRegularSelectorNode(selectorOnlyChild);\n } catch (e) {\n return false;\n }\n });\n\n if (areAllSelectorNodeChildrenRegular) {\n return true;\n }\n } // for other extended pseudo-classes than :not() and :is()\n\n\n return innerSelectorNodes.some(selectorNode => {\n return selectorNode.children.some(selectorNodeChild => {\n if (!isExtendedSelectorNode(selectorNodeChild)) {\n return false;\n } // check inner ExtendedSelector recursively\n // e.g. 'div:has(*:not(.header))'\n\n\n return shouldOptimizeExtendedSelector(selectorNodeChild);\n });\n });\n};\n/**\n * Returns optimized ExtendedSelector node if it can be optimized\n * or null if ExtendedSelector is fully optimized while function execution\n * which means that value of `prevRegularSelectorNode` is updated.\n *\n * @param currExtendedSelectorNode Current ExtendedSelector node to optimize.\n * @param prevRegularSelectorNode Previous RegularSelector node.\n *\n * @returns Ast node or null.\n */\n\n\nconst getOptimizedExtendedSelector = (currExtendedSelectorNode, prevRegularSelectorNode) => {\n if (!currExtendedSelectorNode) {\n return null;\n }\n\n const extendedPseudoClassNode = getPseudoClassNode(currExtendedSelectorNode);\n const relativeSelectorList = getRelativeSelectorListNode(extendedPseudoClassNode);\n const hasInnerExtendedSelector = hasExtendedSelector(relativeSelectorList);\n\n if (!hasInnerExtendedSelector) {\n // if there is no extended selectors for :not() or :is()\n // e.g. 'div:not(.content, .main)'\n const relativeSelectorListStr = selectorListOfRegularsToString(relativeSelectorList);\n const pseudoName = getNodeName(extendedPseudoClassNode); // eslint-disable-next-line max-len\n\n const optimizedExtendedStr = `${COLON}${pseudoName}${BRACKET.PARENTHESES.LEFT}${relativeSelectorListStr}${BRACKET.PARENTHESES.RIGHT}`;\n prevRegularSelectorNode.value = `${getNodeValue(prevRegularSelectorNode)}${optimizedExtendedStr}`;\n return null;\n } // eslint-disable-next-line @typescript-eslint/no-use-before-define\n\n\n const optimizedRelativeSelectorList = optimizeSelectorListNode(relativeSelectorList);\n const optimizedExtendedPseudoClassNode = updateNodeChildren(extendedPseudoClassNode, [optimizedRelativeSelectorList]);\n return updateNodeChildren(currExtendedSelectorNode, [optimizedExtendedPseudoClassNode]);\n};\n/**\n * Combines values of `previous` and `current` RegularSelector nodes.\n * It may happen during the optimization when ExtendedSelector between RegularSelector node was optimized.\n *\n * @param current Current RegularSelector node.\n * @param previous Previous RegularSelector node.\n */\n\n\nconst optimizeCurrentRegularSelector = (current, previous) => {\n previous.value = `${getNodeValue(previous)}${SPACE}${getNodeValue(current)}`;\n};\n/**\n * Optimizes ast Selector node.\n *\n * @param selectorNode Ast Selector node.\n *\n * @returns Optimized ast node.\n * @throws An error while collecting optimized nodes.\n */\n\n\nconst optimizeSelectorNode = selectorNode => {\n // non-optimized list of SelectorNode children\n const rawSelectorNodeChildren = selectorNode.children; // for collecting optimized children list\n\n const optimizedChildrenList = [];\n let currentIndex = 0; // iterate through all children in non-optimized ast Selector node\n\n while (currentIndex < rawSelectorNodeChildren.length) {\n const currentChild = getItemByIndex(rawSelectorNodeChildren, currentIndex, 'currentChild should be specified'); // no need to optimize the very first child which is always RegularSelector node\n\n if (currentIndex === 0) {\n optimizedChildrenList.push(currentChild);\n } else {\n const prevRegularChild = getLastRegularChild(optimizedChildrenList);\n\n if (isExtendedSelectorNode(currentChild)) {\n // start checking with point is null\n let optimizedExtendedSelector = null; // check whether the optimization is needed\n\n let isOptimizationNeeded = shouldOptimizeExtendedSelector(currentChild); // update optimizedExtendedSelector so it can be optimized recursively\n // i.e. `getOptimizedExtendedSelector(optimizedExtendedSelector)` below\n\n optimizedExtendedSelector = currentChild;\n\n while (isOptimizationNeeded) {\n // recursively optimize ExtendedSelector until no optimization needed\n // e.g. div > *:is(.banner:not(.block))\n optimizedExtendedSelector = getOptimizedExtendedSelector(optimizedExtendedSelector, prevRegularChild);\n isOptimizationNeeded = shouldOptimizeExtendedSelector(optimizedExtendedSelector);\n } // if it was simple :not() of :is() with standard selector arg\n // e.g. 'div:not([class][id])'\n // or '.main > *:is([data-loaded], .banner)'\n // after the optimization the ExtendedSelector node become part of RegularSelector\n // so nothing to save eventually\n // otherwise the optimized ExtendedSelector should be saved\n // e.g. 'div:has(:not([class]))'\n\n\n if (optimizedExtendedSelector !== null) {\n optimizedChildrenList.push(optimizedExtendedSelector); // if optimization is not needed\n\n const optimizedPseudoClass = getPseudoClassNode(optimizedExtendedSelector);\n const optimizedPseudoName = getNodeName(optimizedPseudoClass); // parent element checking is used to apply :is() and :not() pseudo-classes as extended.\n // as there is no parentNode for root element (html)\n // so element selection should be limited to it's children\n // e.g. '*:is(:has(.page))' -> 'html *:is(has(.page))'\n // or '*:not(:has(span))' -> 'html *:not(:has(span))'\n\n if (getNodeValue(prevRegularChild) === ASTERISK && isOptimizationPseudoClass(optimizedPseudoName)) {\n prevRegularChild.value = IS_OR_NOT_PSEUDO_SELECTING_ROOT;\n }\n }\n } else if (isRegularSelectorNode(currentChild)) {\n // in non-optimized ast, RegularSelector node may follow ExtendedSelector which should be optimized\n // for example, for 'div:not(.content) > .banner' schematically it looks like\n // non-optimized ast: [\n // 1. RegularSelector: 'div'\n // 2. ExtendedSelector: 'not(.content)'\n // 3. RegularSelector: '> .banner'\n // ]\n // which after the ExtendedSelector looks like\n // partly optimized ast: [\n // 1. RegularSelector: 'div:not(.content)'\n // 2. RegularSelector: '> .banner'\n // ]\n // so second RegularSelector value should be combined with first one\n // optimized ast: [\n // 1. RegularSelector: 'div:not(.content) > .banner'\n // ]\n // here we check **children of selectorNode** after previous optimization if it was\n const lastOptimizedChild = getLast(optimizedChildrenList) || null;\n\n if (isRegularSelectorNode(lastOptimizedChild)) {\n optimizeCurrentRegularSelector(currentChild, prevRegularChild);\n }\n }\n }\n\n currentIndex += 1;\n }\n\n return updateNodeChildren(selectorNode, optimizedChildrenList);\n};\n/**\n * Optimizes ast SelectorList node.\n *\n * @param selectorListNode SelectorList node.\n *\n * @returns Optimized ast node.\n */\n\n\nconst optimizeSelectorListNode = selectorListNode => {\n return updateNodeChildren(selectorListNode, selectorListNode.children.map(s => optimizeSelectorNode(s)));\n};\n/**\n * Optimizes ast:\n * If arg of :not() and :is() pseudo-classes does not contain extended selectors,\n * native Document.querySelectorAll() can be used to query elements.\n * It means that ExtendedSelector ast nodes can be removed\n * and value of relevant RegularSelector node should be updated accordingly.\n *\n * @param ast Non-optimized ast.\n *\n * @returns Optimized ast.\n */\n\n\nconst optimizeAst = ast => {\n // ast is basically the selector list of selectors\n return optimizeSelectorListNode(ast);\n};\n\n// https://github.com/AdguardTeam/ExtendedCss/issues/115\n\nconst XPATH_PSEUDO_SELECTING_ROOT = 'body';\nconst NO_WHITESPACE_ERROR_PREFIX = 'No white space is allowed before or after extended pseudo-class name in selector';\n/**\n * Parses selector into ast for following element selection.\n *\n * @param selector Selector to parse.\n *\n * @returns Parsed ast.\n * @throws An error on invalid selector.\n */\n\nconst parse = selector => {\n const tokens = tokenizeSelector(selector);\n const context = {\n ast: null,\n pathToBufferNode: [],\n extendedPseudoNamesStack: [],\n extendedPseudoBracketsStack: [],\n standardPseudoNamesStack: [],\n standardPseudoBracketsStack: [],\n isAttributeBracketsOpen: false,\n attributeBuffer: '',\n isRegexpOpen: false,\n shouldOptimize: false\n };\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n if (!token) {\n break;\n } // Token to process\n\n\n const {\n type: tokenType,\n value: tokenValue\n } = token; // needed for SPACE and COLON tokens checking\n\n const nextToken = tokens[i + 1];\n const nextTokenType = nextToken === null || nextToken === void 0 ? void 0 : nextToken.type;\n const nextTokenValue = nextToken === null || nextToken === void 0 ? void 0 : nextToken.value; // needed for limitations\n // - :not() and :is() root element\n // - :has() usage\n // - white space before and after pseudo-class name\n\n const nextToNextToken = tokens[i + 2];\n const nextToNextTokenValue = nextToNextToken === null || nextToNextToken === void 0 ? void 0 : nextToNextToken.value; // needed for COLON token checking for none-specified regular selector before extended one\n // e.g. 'p, :hover'\n // or '.banner, :contains(ads)'\n\n const previousToken = tokens[i - 1];\n const prevTokenType = previousToken === null || previousToken === void 0 ? void 0 : previousToken.type;\n const prevTokenValue = previousToken === null || previousToken === void 0 ? void 0 : previousToken.value; // needed for proper parsing of regexp pattern arg\n // e.g. ':matches-css(background-image: /^url\\(https:\\/\\/example\\.org\\//)'\n\n const previousToPreviousToken = tokens[i - 2];\n const prevToPrevTokenValue = previousToPreviousToken === null || previousToPreviousToken === void 0 ? void 0 : previousToPreviousToken.value;\n let bufferNode = getBufferNode(context);\n\n switch (tokenType) {\n case TOKEN_TYPE.WORD:\n if (bufferNode === null) {\n // there is no buffer node only in one case — no ast collecting has been started\n initAst(context, tokenValue);\n } else if (isSelectorListNode(bufferNode)) {\n // add new selector to selector list\n addAstNodeByType(context, NODE.SELECTOR);\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n } else if (isRegularSelectorNode(bufferNode)) {\n updateBufferNode(context, tokenValue);\n } else if (isExtendedSelectorNode(bufferNode)) {\n // No white space is allowed between the name of extended pseudo-class\n // and its opening parenthesis\n // https://www.w3.org/TR/selectors-4/#pseudo-classes\n // e.g. 'span:contains (text)'\n if (isWhiteSpaceChar(nextTokenValue) && nextToNextTokenValue === BRACKET.PARENTHESES.LEFT) {\n throw new Error(`${NO_WHITESPACE_ERROR_PREFIX}: '${selector}'`);\n }\n\n const lowerCaseTokenValue = tokenValue.toLowerCase(); // save pseudo-class name for brackets balance checking\n\n context.extendedPseudoNamesStack.push(lowerCaseTokenValue); // extended pseudo-class name are parsed in lower case\n // as they should be case-insensitive\n // https://www.w3.org/TR/selectors-4/#pseudo-classes\n\n if (isAbsolutePseudoClass(lowerCaseTokenValue)) {\n addAstNodeByType(context, NODE.ABSOLUTE_PSEUDO_CLASS, lowerCaseTokenValue);\n } else {\n // if it is not absolute pseudo-class, it must be relative one\n // add RelativePseudoClass with tokenValue as pseudo-class name to ExtendedSelector children\n addAstNodeByType(context, NODE.RELATIVE_PSEUDO_CLASS, lowerCaseTokenValue); // for :not() and :is() pseudo-classes parsed ast should be optimized later\n\n if (isOptimizationPseudoClass(lowerCaseTokenValue)) {\n context.shouldOptimize = true;\n }\n }\n } else if (isAbsolutePseudoClassNode(bufferNode)) {\n // collect absolute pseudo-class arg\n updateBufferNode(context, tokenValue);\n } else if (isRelativePseudoClassNode(bufferNode)) {\n initRelativeSubtree(context, tokenValue);\n }\n\n break;\n\n case TOKEN_TYPE.MARK:\n switch (tokenValue) {\n case COMMA:\n if (!bufferNode || typeof bufferNode !== 'undefined' && !nextTokenValue) {\n // consider the selector is invalid if there is no bufferNode yet (e.g. ', a')\n // or there is nothing after the comma while bufferNode is defined (e.g. 'div, ')\n throw new Error(`'${selector}' is not a valid selector`);\n } else if (isRegularSelectorNode(bufferNode)) {\n if (context.isAttributeBracketsOpen) {\n // the comma might be inside element attribute value\n // e.g. 'div[data-comma=\"0,1\"]'\n updateBufferNode(context, tokenValue);\n } else {\n // new Selector should be collected to upper SelectorList\n upToClosest(context, NODE.SELECTOR_LIST);\n }\n } else if (isAbsolutePseudoClassNode(bufferNode)) {\n // the comma inside arg of absolute extended pseudo\n // e.g. 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n updateBufferNode(context, tokenValue);\n } else if (isSelectorNode(bufferNode)) {\n // new Selector should be collected to upper SelectorList\n // if parser position is on Selector node\n upToClosest(context, NODE.SELECTOR_LIST);\n }\n\n break;\n\n case SPACE:\n // it might be complex selector with extended pseudo-class inside it\n // and the space is between that complex selector and following regular selector\n // parser position is on ` ` before `span` now:\n // e.g. 'div:has(img).banner span'\n // so we need to check whether the new ast node should be added (example above)\n // or previous regular selector node should be updated\n if (isRegularSelectorNode(bufferNode) // no need to update the buffer node if attribute value is being parsed\n // e.g. 'div:not([id])[style=\"position: absolute; z-index: 10000;\"]'\n // parser position inside attribute ↑\n && !context.isAttributeBracketsOpen) {\n bufferNode = getUpdatedBufferNode(context);\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n // standard selectors with white space between colon and name of pseudo\n // are invalid for native document.querySelectorAll() anyway,\n // so throwing the error here is better\n // than proper parsing of invalid selector and passing it further.\n // first of all do not check attributes\n // e.g. div[style=\"text-align: center\"]\n if (!context.isAttributeBracketsOpen // check the space after the colon and before the pseudo\n // e.g. '.block: nth-child(2)\n && (prevTokenValue === COLON && nextTokenType === TOKEN_TYPE.WORD // or after the pseudo and before the opening parenthesis\n // e.g. '.block:nth-child (2)\n || prevTokenType === TOKEN_TYPE.WORD && nextTokenValue === BRACKET.PARENTHESES.LEFT)) {\n throw new Error(`'${selector}' is not a valid selector`);\n } // collect current tokenValue to value of RegularSelector\n // if it is the last token or standard selector continues after the space.\n // otherwise it will be skipped\n\n\n if (!nextTokenValue || doesRegularContinueAfterSpace(nextTokenType, nextTokenValue) // we also should collect space inside attribute value\n // e.g. `[onclick^=\"window.open ('https://example.com/share?url=\"]`\n // parser position ↑\n || context.isAttributeBracketsOpen) {\n updateBufferNode(context, tokenValue);\n }\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // space inside extended pseudo-class arg\n // e.g. 'span:contains(some text)'\n updateBufferNode(context, tokenValue);\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n // init with empty value RegularSelector\n // as the space is not needed for selector value\n // e.g. 'p:not( .content )'\n initRelativeSubtree(context);\n }\n\n if (isSelectorNode(bufferNode)) {\n // do NOT add RegularSelector if parser position on space BEFORE the comma in selector list\n // e.g. '.block:has(> img) , .banner)'\n if (doesRegularContinueAfterSpace(nextTokenType, nextTokenValue)) {\n // regular selector might be after the extended one.\n // extra space before combinator or selector should not be collected\n // e.g. '.banner:upward(2) .block'\n // '.banner:upward(2) > .block'\n // so no tokenValue passed to addAnySelectorNode()\n addAstNodeByType(context, NODE.REGULAR_SELECTOR);\n }\n }\n\n break;\n\n case DESCENDANT_COMBINATOR:\n case CHILD_COMBINATOR:\n case NEXT_SIBLING_COMBINATOR:\n case SUBSEQUENT_SIBLING_COMBINATOR:\n case SEMICOLON:\n case SLASH:\n case BACKSLASH:\n case SINGLE_QUOTE:\n case DOUBLE_QUOTE:\n case CARET:\n case DOLLAR_SIGN:\n case BRACKET.CURLY.LEFT:\n case BRACKET.CURLY.RIGHT:\n case ASTERISK:\n case ID_MARKER:\n case CLASS_MARKER:\n case BRACKET.SQUARE.LEFT:\n // it might be complex selector with extended pseudo-class inside it\n // and the space is between that complex selector and following regular selector\n // e.g. 'div:has(img).banner' // parser position is on `.` before `banner` now\n // 'div:has(img)[attr]' // parser position is on `[` before `attr` now\n // so we need to check whether the new ast node should be added (example above)\n // or previous regular selector node should be updated\n if (COMBINATORS.includes(tokenValue)) {\n if (bufferNode === null) {\n // cases where combinator at very beginning of a selector\n // e.g. '> div'\n // or '~ .banner'\n // or even '+js(overlay-buster)' which not a selector at all\n // but may be validated by FilterCompiler so error message should be appropriate\n throw new Error(`'${selector}' is not a valid selector`);\n }\n\n bufferNode = getUpdatedBufferNode(context);\n }\n\n if (bufferNode === null) {\n // no ast collecting has been started\n // e.g. '.banner > p'\n // or '#top > div.ad'\n // or '[class][style][attr]'\n // or '*:not(span)'\n initAst(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // e.g. '[class^=\"banner-\"]'\n context.isAttributeBracketsOpen = true;\n }\n } else if (isRegularSelectorNode(bufferNode)) {\n if (tokenValue === BRACKET.CURLY.LEFT && !(context.isAttributeBracketsOpen || context.isRegexpOpen)) {\n // e.g. 'div { content: \"'\n throw new Error(`'${selector}' is not a valid selector`);\n } // collect the mark to the value of RegularSelector node\n\n\n updateBufferNode(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // needed for proper handling element attribute value with comma\n // e.g. 'div[data-comma=\"0,1\"]'\n context.isAttributeBracketsOpen = true;\n }\n } else if (isAbsolutePseudoClassNode(bufferNode)) {\n // collect the mark to the arg of AbsolutePseudoClass node\n updateBufferNode(context, tokenValue); // 'isRegexpOpen' flag is needed for brackets balancing inside extended pseudo-class arg\n\n if (tokenValue === SLASH && context.extendedPseudoNamesStack.length > 0) {\n if (prevTokenValue === SLASH && prevToPrevTokenValue === BACKSLASH) {\n // it may be specific url regexp pattern in arg of pseudo-class\n // e.g. ':matches-css(background-image: /^url\\(https:\\/\\/example\\.org\\//)'\n // parser position is on final slash before `)` ↑\n context.isRegexpOpen = false;\n } else if (prevTokenValue && prevTokenValue !== BACKSLASH) {\n if (isRegexpOpening(context, prevTokenValue, getNodeValue(bufferNode))) {\n context.isRegexpOpen = !context.isRegexpOpen;\n } else {\n // otherwise force `isRegexpOpen` flag to `false`\n context.isRegexpOpen = false;\n }\n }\n }\n } else if (isRelativePseudoClassNode(bufferNode)) {\n // add SelectorList to children of RelativePseudoClass node\n initRelativeSubtree(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // besides of creating the relative subtree\n // opening square bracket means start of attribute\n // e.g. 'div:not([class=\"content\"])'\n // 'div:not([href*=\"window.print()\"])'\n context.isAttributeBracketsOpen = true;\n }\n } else if (isSelectorNode(bufferNode)) {\n // after the extended pseudo closing parentheses\n // parser position is on Selector node\n // and regular selector can be after the extended one\n // e.g. '.banner:upward(2)> .block'\n // or '.inner:nth-ancestor(1)~ .banner'\n if (COMBINATORS.includes(tokenValue)) {\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n } else if (!context.isRegexpOpen) {\n // it might be complex selector with extended pseudo-class inside it.\n // parser position is on `.` now:\n // e.g. 'div:has(img).banner'\n // so we need to get last regular selector node and update its value\n bufferNode = getContextLastRegularSelectorNode(context);\n updateBufferNode(context, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // handle attribute in compound selector after extended pseudo-class\n // e.g. 'div:not(.top)[style=\"z-index: 10000;\"]'\n // parser position ↑\n context.isAttributeBracketsOpen = true;\n }\n }\n } else if (isSelectorListNode(bufferNode)) {\n // add Selector to SelectorList\n addAstNodeByType(context, NODE.SELECTOR); // and RegularSelector as it is always the first child of Selector\n\n addAstNodeByType(context, NODE.REGULAR_SELECTOR, tokenValue);\n\n if (isAttributeOpening(tokenValue, prevTokenValue)) {\n // handle simple attribute selector in selector list\n // e.g. '.banner, [class^=\"ad-\"]'\n context.isAttributeBracketsOpen = true;\n }\n }\n\n break;\n\n case BRACKET.SQUARE.RIGHT:\n if (isRegularSelectorNode(bufferNode)) {\n // unescaped `]` in regular selector allowed only inside attribute value\n if (!context.isAttributeBracketsOpen && prevTokenValue !== BACKSLASH) {\n // e.g. 'div]'\n // eslint-disable-next-line max-len\n throw new Error(`'${selector}' is not a valid selector due to '${tokenValue}' after '${getNodeValue(bufferNode)}'`);\n } // needed for proper parsing regular selectors after the attributes with comma\n // e.g. 'div[data-comma=\"0,1\"] > img'\n\n\n if (isAttributeClosing(context)) {\n context.isAttributeBracketsOpen = false; // reset attribute buffer on closing `]`\n\n context.attributeBuffer = '';\n } // collect the bracket to the value of RegularSelector node\n\n\n updateBufferNode(context, tokenValue);\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // :xpath() expended pseudo-class arg might contain square bracket\n // so it should be collected\n // e.g. 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n updateBufferNode(context, tokenValue);\n }\n\n break;\n\n case COLON:\n // No white space is allowed between the colon and the following name of the pseudo-class\n // https://www.w3.org/TR/selectors-4/#pseudo-classes\n // e.g. 'span: contains(text)'\n if (isWhiteSpaceChar(nextTokenValue) && nextToNextTokenValue && SUPPORTED_PSEUDO_CLASSES.includes(nextToNextTokenValue)) {\n throw new Error(`${NO_WHITESPACE_ERROR_PREFIX}: '${selector}'`);\n }\n\n if (bufferNode === null) {\n // no ast collecting has been started\n if (nextTokenValue === XPATH_PSEUDO_CLASS_MARKER) {\n // limit applying of \"naked\" :xpath pseudo-class\n // https://github.com/AdguardTeam/ExtendedCss/issues/115\n initAst(context, XPATH_PSEUDO_SELECTING_ROOT);\n } else if (nextTokenValue === UPWARD_PSEUDO_CLASS_MARKER || nextTokenValue === NTH_ANCESTOR_PSEUDO_CLASS_MARKER) {\n // selector should be specified before :nth-ancestor() or :upward()\n // e.g. ':nth-ancestor(3)'\n // or ':upward(span)'\n throw new Error(`${NO_SELECTOR_ERROR_PREFIX} before :${nextTokenValue}() pseudo-class`);\n } else {\n // make it more obvious if selector starts with pseudo with no tag specified\n // e.g. ':has(a)' -> '*:has(a)'\n // or ':empty' -> '*:empty'\n initAst(context, ASTERISK);\n } // bufferNode should be updated for following checking\n\n\n bufferNode = getBufferNode(context);\n }\n\n if (isSelectorListNode(bufferNode)) {\n // bufferNode is SelectorList after comma has been parsed.\n // parser position is on colon now:\n // e.g. 'img,:not(.content)'\n addAstNodeByType(context, NODE.SELECTOR); // add empty value RegularSelector anyway as any selector should start with it\n // and check previous token on the next step\n\n addAstNodeByType(context, NODE.REGULAR_SELECTOR); // bufferNode should be updated for following checking\n\n bufferNode = getBufferNode(context);\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n // it can be extended or standard pseudo\n // e.g. '#share, :contains(share it)'\n // or 'div,:hover'\n // of 'div:has(+:contains(text))' // position is after '+'\n if (prevTokenValue && COMBINATORS.includes(prevTokenValue) || prevTokenValue === COMMA) {\n // case with colon at the start of string - e.g. ':contains(text)'\n // is covered by 'bufferNode === null' above at start of COLON checking\n updateBufferNode(context, ASTERISK);\n }\n\n handleNextTokenOnColon(context, selector, tokenValue, nextTokenValue, nextToNextTokenValue);\n }\n\n if (isSelectorNode(bufferNode)) {\n // e.g. 'div:contains(text):'\n if (!nextTokenValue) {\n throw new Error(`Invalid colon ':' at the end of selector: '${selector}'`);\n } // after the extended pseudo closing parentheses\n // parser position is on Selector node\n // and there is might be another extended selector.\n // parser position is on colon before 'upward':\n // e.g. 'p:contains(PR):upward(2)'\n\n\n if (isSupportedPseudoClass(nextTokenValue.toLowerCase())) {\n // if supported extended pseudo-class is next to colon\n // add ExtendedSelector to Selector children\n addAstNodeByType(context, NODE.EXTENDED_SELECTOR);\n } else if (nextTokenValue.toLowerCase() === REMOVE_PSEUDO_MARKER) {\n // :remove() pseudo-class should be handled before\n // as it is not about element selecting but actions with elements\n // e.g. '#banner:upward(2):remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n } else {\n // otherwise it is standard pseudo after extended pseudo-class in complex selector\n // and colon should be collected to value of previous RegularSelector\n // e.g. 'body *:not(input)::selection'\n // 'input:matches-css(padding: 10):checked'\n bufferNode = getContextLastRegularSelectorNode(context);\n handleNextTokenOnColon(context, selector, tokenValue, nextTokenType, nextToNextTokenValue);\n }\n }\n\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // :xpath() pseudo-class should be the last of extended pseudo-classes\n if (getNodeName(bufferNode) === XPATH_PSEUDO_CLASS_MARKER && nextTokenValue && SUPPORTED_PSEUDO_CLASSES.includes(nextTokenValue) && nextToNextTokenValue === BRACKET.PARENTHESES.LEFT) {\n throw new Error(`:xpath() pseudo-class should be the last in selector: '${selector}'`);\n } // collecting arg for absolute pseudo-class\n // e.g. 'div:matches-css(width:400px)'\n\n\n updateBufferNode(context, tokenValue);\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n if (!nextTokenValue) {\n // e.g. 'div:has(:'\n throw new Error(`Invalid pseudo-class arg at the end of selector: '${selector}'`);\n } // make it more obvious if selector starts with pseudo with no tag specified\n // parser position is on colon inside :has() arg\n // e.g. 'div:has(:contains(text))'\n // or 'div:not(:empty)'\n\n\n initRelativeSubtree(context, ASTERISK);\n\n if (!isSupportedPseudoClass(nextTokenValue.toLowerCase())) {\n // collect the colon to value of RegularSelector\n // e.g. 'div:not(:empty)'\n updateBufferNode(context, tokenValue); // parentheses should be balanced only for functional pseudo-classes\n // e.g. '.yellow:not(:nth-child(3))'\n\n if (nextToNextTokenValue === BRACKET.PARENTHESES.LEFT) {\n context.standardPseudoNamesStack.push(nextTokenValue);\n }\n } else {\n // add ExtendedSelector to Selector children\n // e.g. 'div:has(:contains(text))'\n upToClosest(context, NODE.SELECTOR);\n addAstNodeByType(context, NODE.EXTENDED_SELECTOR);\n }\n }\n\n break;\n\n case BRACKET.PARENTHESES.LEFT:\n // start of pseudo-class arg\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // no brackets balancing needed inside\n // 1. :xpath() extended pseudo-class arg\n // 2. regexp arg for other extended pseudo-classes\n if (getNodeName(bufferNode) !== XPATH_PSEUDO_CLASS_MARKER && context.isRegexpOpen) {\n // if the parentheses is escaped it should be part of regexp\n // collect it to arg of AbsolutePseudoClass\n // e.g. 'div:matches-css(background-image: /^url\\\\(\"data:image\\\\/gif;base64.+/)'\n updateBufferNode(context, tokenValue);\n } else {\n // otherwise brackets should be balanced\n // e.g. 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n context.extendedPseudoBracketsStack.push(tokenValue); // eslint-disable-next-line max-len\n\n if (context.extendedPseudoBracketsStack.length > context.extendedPseudoNamesStack.length) {\n updateBufferNode(context, tokenValue);\n }\n }\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n // continue RegularSelector value collecting for standard pseudo-classes\n // e.g. '.banner:where(div)'\n if (context.standardPseudoNamesStack.length > 0) {\n updateBufferNode(context, tokenValue);\n context.standardPseudoBracketsStack.push(tokenValue);\n } // parentheses inside attribute value should be part of RegularSelector value\n // e.g. 'div:not([href*=\"window.print()\"])' <-- parser position\n // is on the `(` after `print` ↑\n\n\n if (context.isAttributeBracketsOpen) {\n updateBufferNode(context, tokenValue);\n }\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n // save opening bracket for balancing\n // e.g. 'div:not()' // position is on `(`\n context.extendedPseudoBracketsStack.push(tokenValue);\n }\n\n break;\n\n case BRACKET.PARENTHESES.RIGHT:\n if (isAbsolutePseudoClassNode(bufferNode)) {\n // no brackets balancing needed inside\n // 1. :xpath() extended pseudo-class arg\n // 2. regexp arg for other extended pseudo-classes\n if (getNodeName(bufferNode) !== XPATH_PSEUDO_CLASS_MARKER && context.isRegexpOpen) {\n // if closing bracket is part of regexp\n // simply save it to pseudo-class arg\n updateBufferNode(context, tokenValue);\n } else {\n // remove stacked open parentheses for brackets balance\n // e.g. 'h3:contains((Ads))'\n // or 'div:xpath(//h3[contains(text(),\"Share it!\")]/..)'\n context.extendedPseudoBracketsStack.pop();\n\n if (getNodeName(bufferNode) !== XPATH_PSEUDO_CLASS_MARKER) {\n // for all other absolute pseudo-classes except :xpath()\n // remove stacked name of extended pseudo-class\n context.extendedPseudoNamesStack.pop(); // eslint-disable-next-line max-len\n\n if (context.extendedPseudoBracketsStack.length > context.extendedPseudoNamesStack.length) {\n // if brackets stack is not empty yet,\n // save tokenValue to arg of AbsolutePseudoClass\n // parser position on first closing bracket after 'Ads':\n // e.g. 'h3:contains((Ads))'\n updateBufferNode(context, tokenValue);\n } else if (context.extendedPseudoBracketsStack.length >= 0 && context.extendedPseudoNamesStack.length >= 0) {\n // assume it is combined extended pseudo-classes\n // parser position on first closing bracket after 'advert':\n // e.g. 'div:has(.banner, :contains(advert))'\n upToClosest(context, NODE.SELECTOR);\n }\n } else {\n // for :xpath()\n // eslint-disable-next-line max-len\n if (context.extendedPseudoBracketsStack.length < context.extendedPseudoNamesStack.length) {\n // remove stacked name of extended pseudo-class\n // if there are less brackets than pseudo-class names\n // with means last removes bracket was closing for pseudo-class\n context.extendedPseudoNamesStack.pop();\n } else {\n // otherwise the bracket is part of arg\n updateBufferNode(context, tokenValue);\n }\n }\n }\n }\n\n if (isRegularSelectorNode(bufferNode)) {\n if (context.isAttributeBracketsOpen) {\n // parentheses inside attribute value should be part of RegularSelector value\n // e.g. 'div:not([href*=\"window.print()\"])' <-- parser position\n // is on the `)` after `print(` ↑\n updateBufferNode(context, tokenValue);\n } else if (context.standardPseudoNamesStack.length > 0 && context.standardPseudoBracketsStack.length > 0) {\n // standard pseudo-class was processing.\n // collect the closing bracket to value of RegularSelector\n // parser position is on bracket after 'class' now:\n // e.g. 'div:where(.class)'\n updateBufferNode(context, tokenValue); // remove bracket and pseudo name from stacks\n\n context.standardPseudoBracketsStack.pop();\n const lastStandardPseudo = context.standardPseudoNamesStack.pop();\n\n if (!lastStandardPseudo) {\n // standard pseudo should be in standardPseudoNamesStack\n // as related to standardPseudoBracketsStack\n throw new Error(`Parsing error. Invalid selector: ${selector}`);\n } // Disallow :has() after regular pseudo-elements\n // https://bugs.chromium.org/p/chromium/issues/detail?id=669058#c54 [3]\n\n\n if (Object.values(REGULAR_PSEUDO_ELEMENTS).includes(lastStandardPseudo) // check token which is next to closing parentheses and token after it\n // parser position is on bracket after 'foo' now:\n // e.g. '::part(foo):has(.a)'\n && nextTokenValue === COLON && nextToNextTokenValue && HAS_PSEUDO_CLASS_MARKERS.includes(nextToNextTokenValue)) {\n // eslint-disable-next-line max-len\n throw new Error(`Usage of :${nextToNextTokenValue}() pseudo-class is not allowed after any regular pseudo-element: '${lastStandardPseudo}'`);\n }\n } else {\n // extended pseudo-class was processing.\n // e.g. 'div:has(h3)'\n // remove bracket and pseudo name from stacks\n context.extendedPseudoBracketsStack.pop();\n context.extendedPseudoNamesStack.pop();\n upToClosest(context, NODE.EXTENDED_SELECTOR); // go to upper selector for possible selector continuation after extended pseudo-class\n // e.g. 'div:has(h3) > img'\n\n upToClosest(context, NODE.SELECTOR);\n }\n }\n\n if (isSelectorNode(bufferNode)) {\n // after inner extended pseudo-class bufferNode is Selector.\n // parser position is on last bracket now:\n // e.g. 'div:has(.banner, :contains(ads))'\n context.extendedPseudoBracketsStack.pop();\n context.extendedPseudoNamesStack.pop();\n upToClosest(context, NODE.EXTENDED_SELECTOR);\n upToClosest(context, NODE.SELECTOR);\n }\n\n if (isRelativePseudoClassNode(bufferNode)) {\n // save opening bracket for balancing\n // e.g. 'div:not()' // position is on `)`\n // context.extendedPseudoBracketsStack.push(tokenValue);\n if (context.extendedPseudoNamesStack.length > 0 && context.extendedPseudoBracketsStack.length > 0) {\n context.extendedPseudoBracketsStack.pop();\n context.extendedPseudoNamesStack.pop();\n }\n }\n\n break;\n\n case LINE_FEED:\n case FORM_FEED:\n case CARRIAGE_RETURN:\n // such characters at start and end of selector should be trimmed\n // so is there is one them among tokens, it is not valid selector\n throw new Error(`'${selector}' is not a valid selector`);\n\n case TAB:\n // allow tab only inside attribute value\n // as there are such valid rules in filter lists\n // e.g. 'div[style^=\"margin-right: auto;\ttext-align: left;',\n // parser position ↑\n if (isRegularSelectorNode(bufferNode) && context.isAttributeBracketsOpen) {\n updateBufferNode(context, tokenValue);\n } else {\n // otherwise not valid\n throw new Error(`'${selector}' is not a valid selector`);\n }\n\n }\n\n break;\n // no default statement for Marks as they are limited to SUPPORTED_SELECTOR_MARKS\n // and all other symbol combinations are tokenized as Word\n // so error for invalid Word will be thrown later while element selecting by parsed ast\n\n default:\n throw new Error(`Unknown type of token: '${tokenValue}'`);\n }\n\n i += 1;\n }\n\n if (context.ast === null) {\n throw new Error(`'${selector}' is not a valid selector`);\n }\n\n if (context.extendedPseudoNamesStack.length > 0 || context.extendedPseudoBracketsStack.length > 0) {\n // eslint-disable-next-line max-len\n throw new Error(`Unbalanced brackets for extended pseudo-class: '${getLast(context.extendedPseudoNamesStack)}'`);\n }\n\n if (context.isAttributeBracketsOpen) {\n throw new Error(`Unbalanced attribute brackets in selector: '${selector}'`);\n }\n\n return context.shouldOptimize ? optimizeAst(context.ast) : context.ast;\n};\n\nconst natives = {\n MutationObserver: window.MutationObserver || window.WebKitMutationObserver\n};\n/**\n * Class NativeTextContent is needed to intercept and save the native Node textContent getter\n * for proper work of :contains() pseudo-class as it may be mocked.\n *\n * @see {@link https://github.com/AdguardTeam/ExtendedCss/issues/127}\n */\n\nclass NativeTextContent {\n /**\n * Native Node.\n */\n\n /**\n * Native Node textContent getter.\n */\n\n /**\n * Stores native node.\n */\n constructor() {\n this.nativeNode = window.Node || Node;\n }\n /**\n * Sets native Node textContext getter to `getter` class field.\n */\n\n\n setGetter() {\n var _Object$getOwnPropert;\n\n this.getter = (_Object$getOwnPropert = Object.getOwnPropertyDescriptor(this.nativeNode.prototype, 'textContent')) === null || _Object$getOwnPropert === void 0 ? void 0 : _Object$getOwnPropert.get;\n }\n\n}\nconst nativeTextContent = new NativeTextContent();\n\n/**\n * Returns textContent of passed domElement.\n *\n * @param domElement DOM element.\n *\n * @returns DOM element textContent.\n */\n\nconst getNodeTextContent = domElement => {\n if (nativeTextContent.getter) {\n return nativeTextContent.getter.apply(domElement);\n } // if ExtendedCss.init() has not been executed and there is no nodeTextContentGetter,\n // use simple approach, especially when init() is not really needed, e.g. local tests\n\n\n return domElement.textContent || '';\n};\n/**\n * Returns element selector text based on it's tagName and attributes.\n *\n * @param element DOM element.\n *\n * @returns String representation of `element`.\n */\n\nconst getElementSelectorDesc = element => {\n let selectorText = element.tagName.toLowerCase();\n selectorText += Array.from(element.attributes).map(attr => {\n return `[${attr.name}=\"${element.getAttribute(attr.name)}\"]`;\n }).join('');\n return selectorText;\n};\n/**\n * Returns path to a DOM element as a selector string.\n *\n * @param inputEl Input element.\n *\n * @returns String path to a DOM element.\n * @throws An error if `inputEl` in not instance of `Element`.\n */\n\nconst getElementSelectorPath = inputEl => {\n if (!(inputEl instanceof Element)) {\n throw new Error('Function received argument with wrong type');\n }\n\n let el;\n el = inputEl;\n const path = []; // we need to check '!!el' first because it is possible\n // that some ancestor of the inputEl was removed before it\n\n while (!!el && el.nodeType === Node.ELEMENT_NODE) {\n let selector = el.nodeName.toLowerCase();\n\n if (el.id && typeof el.id === 'string') {\n selector += `#${el.id}`;\n path.unshift(selector);\n break;\n }\n\n let sibling = el;\n let nth = 1;\n\n while (sibling.previousElementSibling) {\n sibling = sibling.previousElementSibling;\n\n if (sibling.nodeType === Node.ELEMENT_NODE && sibling.nodeName.toLowerCase() === selector) {\n nth += 1;\n }\n }\n\n if (nth !== 1) {\n selector += `:nth-of-type(${nth})`;\n }\n\n path.unshift(selector);\n el = el.parentElement;\n }\n\n return path.join(' > ');\n};\n/**\n * Checks whether the element is instance of HTMLElement.\n *\n * @param element Element to check.\n *\n * @returns True if `element` is HTMLElement.\n */\n\nconst isHtmlElement = element => {\n return element instanceof HTMLElement;\n};\n/**\n * Takes `element` and returns its parent element.\n *\n * @param element Element.\n * @param errorMessage Optional error message to throw.\n *\n * @returns Parent of `element`.\n * @throws An error if element has no parent element.\n */\n\nconst getParent = (element, errorMessage) => {\n const {\n parentElement\n } = element;\n\n if (!parentElement) {\n throw new Error(errorMessage || 'Element does no have parent element');\n }\n\n return parentElement;\n};\n\n/**\n * Checks whether the `error` has `message` property which type is string.\n *\n * @param error Error object.\n *\n * @returns True if `error` has message.\n */\nconst isErrorWithMessage = error => {\n return typeof error === 'object' && error !== null && 'message' in error && typeof error.message === 'string';\n};\n/**\n * Converts `maybeError` to error object with message.\n *\n * @param maybeError Possible error.\n *\n * @returns Error object with defined `message` property.\n */\n\n\nconst toErrorWithMessage = maybeError => {\n if (isErrorWithMessage(maybeError)) {\n return maybeError;\n }\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case if there is an error happened during the maybeError stringifying\n // like with circular references for example\n return new Error(String(maybeError));\n }\n};\n/**\n * Returns error message from `error`.\n * May be helpful to handle caught errors.\n *\n * @param error Error object.\n *\n * @returns Message of `error`.\n */\n\n\nconst getErrorMessage = error => {\n return toErrorWithMessage(error).message;\n};\n\nconst logger = {\n /**\n * Safe console.error version.\n */\n error: typeof console !== 'undefined' && console.error && console.error.bind ? console.error.bind(window.console) : console.error,\n\n /**\n * Safe console.info version.\n */\n info: typeof console !== 'undefined' && console.info && console.info.bind ? console.info.bind(window.console) : console.info\n};\n\n/**\n * Returns string without suffix.\n *\n * @param str Input string.\n * @param suffix Needed to remove.\n *\n * @returns String without suffix.\n */\n\nconst removeSuffix = (str, suffix) => {\n const index = str.indexOf(suffix, str.length - suffix.length);\n\n if (index >= 0) {\n return str.substring(0, index);\n }\n\n return str;\n};\n/**\n * Replaces all `pattern`s with `replacement` in `input` string.\n * String.replaceAll() polyfill because it is not supported by old browsers, e.g. Chrome 55.\n *\n * @see {@link https://caniuse.com/?search=String.replaceAll}\n *\n * @param input Input string to process.\n * @param pattern Find in the input string.\n * @param replacement Replace the pattern with.\n *\n * @returns Modified string.\n */\n\nconst replaceAll = (input, pattern, replacement) => {\n if (!input) {\n return input;\n }\n\n return input.split(pattern).join(replacement);\n};\n/**\n * Converts string pattern to regular expression.\n *\n * @param str String to convert.\n *\n * @returns Regular expression converted from pattern `str`.\n */\n\nconst toRegExp = str => {\n if (str.startsWith(SLASH) && str.endsWith(SLASH)) {\n return new RegExp(str.slice(1, -1));\n }\n\n const escaped = str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(escaped);\n};\n/**\n * Converts any simple type value to string type,\n * e.g. `undefined` -> `'undefined'`.\n *\n * @param value Any type value.\n *\n * @returns String representation of `value`.\n */\n\nconst convertTypeIntoString = value => {\n let output;\n\n switch (value) {\n case undefined:\n output = 'undefined';\n break;\n\n case null:\n output = 'null';\n break;\n\n default:\n output = value.toString();\n }\n\n return output;\n};\n/**\n * Converts instance of string value into other simple types,\n * e.g. `'null'` -> `null`, `'true'` -> `true`.\n *\n * @param value String-type value.\n *\n * @returns Its own type representation of string-type `value`.\n */\n\nconst convertTypeFromString = value => {\n const numValue = Number(value);\n let output;\n\n if (!Number.isNaN(numValue)) {\n output = numValue;\n } else {\n switch (value) {\n case 'undefined':\n output = undefined;\n break;\n\n case 'null':\n output = null;\n break;\n\n case 'true':\n output = true;\n break;\n\n case 'false':\n output = false;\n break;\n\n default:\n output = value;\n }\n }\n\n return output;\n};\n\nconst SAFARI_USER_AGENT_REGEXP = /\\sVersion\\/(\\d{2}\\.\\d)(.+\\s|\\s)(Safari)\\//;\nconst isSafariBrowser = SAFARI_USER_AGENT_REGEXP.test(navigator.userAgent);\n/**\n * Checks whether the browser userAgent is supported.\n *\n * @param userAgent User agent of browser.\n *\n * @returns False only for Internet Explorer.\n */\n\nconst isUserAgentSupported = userAgent => {\n // do not support Internet Explorer\n if (userAgent.includes('MSIE') || userAgent.includes('Trident/')) {\n return false;\n }\n\n return true;\n};\n/**\n * Checks whether the current browser is supported.\n *\n * @returns False for Internet Explorer, otherwise true.\n */\n\nconst isBrowserSupported = () => {\n return isUserAgentSupported(navigator.userAgent);\n};\n\n/**\n * CSS_PROPERTY is needed for style values normalization.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\n\nconst CSS_PROPERTY = {\n BACKGROUND: 'background',\n BACKGROUND_IMAGE: 'background-image',\n CONTENT: 'content',\n OPACITY: 'opacity'\n};\nconst REGEXP_ANY_SYMBOL = '.*';\nconst REGEXP_WITH_FLAGS_REGEXP = /^\\s*\\/.*\\/[gmisuy]*\\s*$/;\n\n/**\n * Removes quotes for specified content value.\n *\n * For example, content style declaration with `::before` can be set as '-' (e.g. unordered list)\n * which displayed as simple dash `-` with no quotes.\n * But CSSStyleDeclaration.getPropertyValue('content') will return value\n * wrapped into quotes, e.g. '\"-\"', which should be removed\n * because filters maintainers does not use any quotes in real rules.\n *\n * @param str Input string.\n *\n * @returns String with no quotes for content value.\n */\nconst removeContentQuotes = str => {\n return str.replace(/^([\"'])([\\s\\S]*)\\1$/, '$2');\n};\n/**\n * Adds quotes for specified background url value.\n *\n * If background-image is specified **without** quotes:\n * e.g. 'background: url(data:image/gif;base64,R0lGODlhAQA7)'.\n *\n * CSSStyleDeclaration.getPropertyValue('background-image') may return value **with** quotes:\n * e.g. 'background: url(\"data:image/gif;base64,R0lGODlhAQA7\")'.\n *\n * So we add quotes for compatibility since filters maintainers might use quotes in real rules.\n *\n * @param str Input string.\n *\n * @returns String with unified quotes for background url value.\n */\n\n\nconst addUrlPropertyQuotes = str => {\n if (!str.includes('url(\"')) {\n const re = /url\\((.*?)\\)/g;\n return str.replace(re, 'url(\"$1\")');\n }\n\n return str;\n};\n/**\n * Adds quotes to url arg for consistent property value matching.\n */\n\n\nconst addUrlQuotesTo = {\n regexpArg: str => {\n // e.g. /^url\\\\([a-z]{4}:[a-z]{5}/\n // or /^url\\\\(data\\\\:\\\\image\\\\/gif;base64.+/\n const re = /(\\^)?url(\\\\)?\\\\\\((\\w|\\[\\w)/g;\n return str.replace(re, '$1url$2\\\\(\\\\\"?$3');\n },\n noneRegexpArg: addUrlPropertyQuotes\n};\n/**\n * Escapes regular expression string.\n *\n * @see {@link https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp}\n *\n * @param str Input string.\n *\n * @returns Escaped regular expression string.\n */\n\nconst escapeRegExp = str => {\n // should be escaped . * + ? ^ $ { } ( ) | [ ] / \\\n // except of * | ^\n const specials = ['.', '+', '?', '$', '{', '}', '(', ')', '[', ']', '\\\\', '/'];\n const specialsRegex = new RegExp(`[${specials.join('\\\\')}]`, 'g');\n return str.replace(specialsRegex, '\\\\$&');\n};\n/**\n * Converts :matches-css() arg property value match to regexp.\n *\n * @param rawValue Style match value pattern.\n *\n * @returns Arg of :matches-css() converted to regular expression.\n */\n\n\nconst convertStyleMatchValueToRegexp = rawValue => {\n let value;\n\n if (rawValue.startsWith(SLASH) && rawValue.endsWith(SLASH)) {\n // For regex patterns double quotes `\"` and backslashes `\\` should be escaped\n value = addUrlQuotesTo.regexpArg(rawValue);\n value = value.slice(1, -1);\n } else {\n // For non-regex patterns parentheses `(` `)` and square brackets `[` `]`\n // should be unescaped, because their escaping in filter rules is required\n value = addUrlQuotesTo.noneRegexpArg(rawValue);\n value = value.replace(/\\\\([\\\\()[\\]\"])/g, '$1');\n value = escapeRegExp(value); // e.g. div:matches-css(background-image: url(data:*))\n\n value = replaceAll(value, ASTERISK, REGEXP_ANY_SYMBOL);\n }\n\n return new RegExp(value, 'i');\n};\n/**\n * Makes some properties values compatible.\n *\n * @param propertyName Name of style property.\n * @param propertyValue Value of style property.\n *\n * @returns Normalized values for some CSS properties.\n */\n\n\nconst normalizePropertyValue = (propertyName, propertyValue) => {\n let normalized = '';\n\n switch (propertyName) {\n case CSS_PROPERTY.BACKGROUND:\n case CSS_PROPERTY.BACKGROUND_IMAGE:\n // sometimes url property does not have quotes\n // so we add them for consistent matching\n normalized = addUrlPropertyQuotes(propertyValue);\n break;\n\n case CSS_PROPERTY.CONTENT:\n normalized = removeContentQuotes(propertyValue);\n break;\n\n case CSS_PROPERTY.OPACITY:\n // https://bugs.webkit.org/show_bug.cgi?id=93445\n normalized = isSafariBrowser ? (Math.round(parseFloat(propertyValue) * 100) / 100).toString() : propertyValue;\n break;\n\n default:\n normalized = propertyValue;\n }\n\n return normalized;\n};\n/**\n * Returns domElement style property value\n * by css property name and standard pseudo-element.\n *\n * @param domElement DOM element.\n * @param propertyName CSS property name.\n * @param regularPseudoElement Standard pseudo-element — '::before', '::after' etc.\n *\n * @returns String containing the value of a specified CSS property.\n */\n\n\nconst getComputedStylePropertyValue = (domElement, propertyName, regularPseudoElement) => {\n const style = window.getComputedStyle(domElement, regularPseudoElement);\n const propertyValue = style.getPropertyValue(propertyName);\n return normalizePropertyValue(propertyName, propertyValue);\n};\n\n/**\n * Parses arg of absolute pseudo-class into 'name' and 'value' if set.\n *\n * Used for :matches-css() - with COLON as separator,\n * for :matches-attr() and :matches-property() - with EQUAL_SIGN as separator.\n *\n * @param pseudoArg Arg of pseudo-class.\n * @param separator Divider symbol.\n *\n * @returns Parsed 'matches' pseudo-class arg data.\n */\nconst getPseudoArgData = (pseudoArg, separator) => {\n const index = pseudoArg.indexOf(separator);\n let name;\n let value;\n\n if (index > -1) {\n name = pseudoArg.substring(0, index).trim();\n value = pseudoArg.substring(index + 1).trim();\n } else {\n name = pseudoArg;\n }\n\n return {\n name,\n value\n };\n};\n\n/**\n * Parses :matches-css() pseudo-class arg\n * where regular pseudo-element can be a part of arg\n * e.g. 'div:matches-css(before, color: rgb(255, 255, 255))' <-- obsolete `:matches-css-before()`.\n *\n * @param pseudoName Pseudo-class name.\n * @param rawArg Pseudo-class arg.\n *\n * @returns Parsed :matches-css() pseudo-class arg data.\n * @throws An error on invalid `rawArg`.\n */\nconst parseStyleMatchArg = (pseudoName, rawArg) => {\n const {\n name,\n value\n } = getPseudoArgData(rawArg, COMMA);\n let regularPseudoElement = name;\n let styleMatchArg = value; // check whether the string part before the separator is valid regular pseudo-element,\n // otherwise `regularPseudoElement` is null, and `styleMatchArg` is rawArg\n\n if (!Object.values(REGULAR_PSEUDO_ELEMENTS).includes(name)) {\n regularPseudoElement = null;\n styleMatchArg = rawArg;\n }\n\n if (!styleMatchArg) {\n throw new Error(`Required style property argument part is missing in :${pseudoName}() arg: '${rawArg}'`);\n } // if regularPseudoElement is not `null`\n\n\n if (regularPseudoElement) {\n // pseudo-element should have two colon marks for Window.getComputedStyle() due to the syntax:\n // https://www.w3.org/TR/selectors-4/#pseudo-element-syntax\n // ':matches-css(before, content: ads)' ->> '::before'\n regularPseudoElement = `${COLON}${COLON}${regularPseudoElement}`;\n }\n\n return {\n regularPseudoElement,\n styleMatchArg\n };\n};\n/**\n * Checks whether the domElement is matched by :matches-css() arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid pseudo-class arg.\n */\n\n\nconst isStyleMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const {\n regularPseudoElement,\n styleMatchArg\n } = parseStyleMatchArg(pseudoName, pseudoArg);\n const {\n name: matchName,\n value: matchValue\n } = getPseudoArgData(styleMatchArg, COLON);\n\n if (!matchName || !matchValue) {\n throw new Error(`Required property name or value is missing in :${pseudoName}() arg: '${styleMatchArg}'`);\n }\n\n let valueRegexp;\n\n try {\n valueRegexp = convertStyleMatchValueToRegexp(matchValue);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`Invalid argument of :${pseudoName}() pseudo-class: '${styleMatchArg}'`);\n }\n\n const value = getComputedStylePropertyValue(domElement, matchName, regularPseudoElement);\n return valueRegexp && valueRegexp.test(value);\n};\n/**\n * Validates string arg for :matches-attr() and :matches-property().\n *\n * @param arg Pseudo-class arg.\n *\n * @returns True if 'matches' pseudo-class string arg is valid.\n */\n\nconst validateStrMatcherArg = arg => {\n if (arg.includes(SLASH)) {\n return false;\n }\n\n if (!/^[\\w-]+$/.test(arg)) {\n return false;\n }\n\n return true;\n};\n/**\n * Returns valid arg for :matches-attr() and :matcher-property().\n *\n * @param rawArg Arg pattern.\n * @param [isWildcardAllowed=false] Flag for wildcard (`*`) using as pseudo-class arg.\n *\n * @returns Valid arg for :matches-attr() and :matcher-property().\n * @throws An error on invalid `rawArg`.\n */\n\n\nconst getValidMatcherArg = function (rawArg) {\n let isWildcardAllowed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n // if rawArg is missing for pseudo-class\n // e.g. :matches-attr()\n // error will be thrown before getValidMatcherArg() is called:\n // name or arg is missing in AbsolutePseudoClass\n let arg;\n\n if (rawArg.length > 1 && rawArg.startsWith(DOUBLE_QUOTE) && rawArg.endsWith(DOUBLE_QUOTE)) {\n rawArg = rawArg.slice(1, -1);\n }\n\n if (rawArg === '') {\n // e.g. :matches-property(\"\")\n throw new Error('Argument should be specified. Empty arg is invalid.');\n }\n\n if (rawArg.startsWith(SLASH) && rawArg.endsWith(SLASH)) {\n // e.g. :matches-property(\"//\")\n if (rawArg.length > 2) {\n arg = toRegExp(rawArg);\n } else {\n throw new Error(`Invalid regexp: '${rawArg}'`);\n }\n } else if (rawArg.includes(ASTERISK)) {\n if (rawArg === ASTERISK && !isWildcardAllowed) {\n // e.g. :matches-attr(*)\n throw new Error(`Argument should be more specific than ${rawArg}`);\n }\n\n arg = replaceAll(rawArg, ASTERISK, REGEXP_ANY_SYMBOL);\n arg = new RegExp(arg);\n } else {\n if (!validateStrMatcherArg(rawArg)) {\n throw new Error(`Invalid argument: '${rawArg}'`);\n }\n\n arg = rawArg;\n }\n\n return arg;\n};\n\n/**\n * Parses pseudo-class argument and returns parsed data.\n *\n * @param pseudoName Extended pseudo-class name.\n * @param pseudoArg Extended pseudo-class argument.\n *\n * @returns Parsed pseudo-class argument data.\n * @throws An error if attribute name is missing in pseudo-class arg.\n */\nconst getRawMatchingData = (pseudoName, pseudoArg) => {\n const {\n name: rawName,\n value: rawValue\n } = getPseudoArgData(pseudoArg, EQUAL_SIGN);\n\n if (!rawName) {\n throw new Error(`Required attribute name is missing in :${pseudoName} arg: ${pseudoArg}`);\n }\n\n return {\n rawName,\n rawValue\n };\n};\n/**\n * Checks whether the domElement is matched by :matches-attr() arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid arg of pseudo-class.\n */\n\nconst isAttributeMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const elementAttributes = domElement.attributes; // no match if dom element has no attributes\n\n if (elementAttributes.length === 0) {\n return false;\n }\n\n const {\n rawName: rawAttrName,\n rawValue: rawAttrValue\n } = getRawMatchingData(pseudoName, pseudoArg);\n let attrNameMatch;\n\n try {\n attrNameMatch = getValidMatcherArg(rawAttrName);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n let isMatched = false;\n let i = 0;\n\n while (i < elementAttributes.length && !isMatched) {\n const attr = elementAttributes[i];\n\n if (!attr) {\n break;\n }\n\n const isNameMatched = attrNameMatch instanceof RegExp ? attrNameMatch.test(attr.name) : attrNameMatch === attr.name;\n\n if (!rawAttrValue) {\n // for rules with no attribute value specified\n // e.g. :matches-attr(\"/regex/\") or :matches-attr(\"attr-name\")\n isMatched = isNameMatched;\n } else {\n let attrValueMatch;\n\n try {\n attrValueMatch = getValidMatcherArg(rawAttrValue);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n const isValueMatched = attrValueMatch instanceof RegExp ? attrValueMatch.test(attr.value) : attrValueMatch === attr.value;\n isMatched = isNameMatched && isValueMatched;\n }\n\n i += 1;\n }\n\n return isMatched;\n};\n/**\n * Parses raw :matches-property() arg which may be chain of properties.\n *\n * @param input Argument of :matches-property().\n *\n * @returns Arg of :matches-property() as array of strings or regular expressions.\n * @throws An error on invalid chain.\n */\n\nconst parseRawPropChain = input => {\n if (input.length > 1 && input.startsWith(DOUBLE_QUOTE) && input.endsWith(DOUBLE_QUOTE)) {\n input = input.slice(1, -1);\n }\n\n const chainChunks = input.split(DOT);\n const chainPatterns = [];\n let patternBuffer = '';\n let isRegexpPattern = false;\n let i = 0;\n\n while (i < chainChunks.length) {\n const chunk = getItemByIndex(chainChunks, i, `Invalid pseudo-class arg: '${input}'`);\n\n if (chunk.startsWith(SLASH) && chunk.endsWith(SLASH) && chunk.length > 2) {\n // regexp pattern with no dot in it, e.g. /propName/\n chainPatterns.push(chunk);\n } else if (chunk.startsWith(SLASH)) {\n // if chunk is a start of regexp pattern\n isRegexpPattern = true;\n patternBuffer += chunk;\n } else if (chunk.endsWith(SLASH)) {\n isRegexpPattern = false; // restore dot removed while splitting\n // e.g. testProp./.{1,5}/\n\n patternBuffer += `.${chunk}`;\n chainPatterns.push(patternBuffer);\n patternBuffer = '';\n } else {\n // if there are few dots in regexp pattern\n // so chunk might be in the middle of it\n if (isRegexpPattern) {\n patternBuffer += chunk;\n } else {\n // otherwise it is string pattern\n chainPatterns.push(chunk);\n }\n }\n\n i += 1;\n }\n\n if (patternBuffer.length > 0) {\n throw new Error(`Invalid regexp property pattern '${input}'`);\n }\n\n const chainMatchPatterns = chainPatterns.map(pattern => {\n if (pattern.length === 0) {\n // e.g. '.prop.id' or 'nested..test'\n throw new Error(`Empty pattern '${pattern}' is invalid in chain '${input}'`);\n }\n\n let validPattern;\n\n try {\n validPattern = getValidMatcherArg(pattern, true);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`Invalid property pattern '${pattern}' in property chain '${input}'`);\n }\n\n return validPattern;\n });\n return chainMatchPatterns;\n};\n\n/**\n * Checks if the property exists in the base object (recursively).\n *\n * @param base Element to check.\n * @param chain Array of objects - parsed string property chain.\n * @param [output=[]] Result acc.\n *\n * @returns Array of parsed data — representation of `base`-related `chain`.\n */\nconst filterRootsByRegexpChain = function (base, chain) {\n let output = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n const tempProp = getFirst(chain);\n\n if (chain.length === 1) {\n let key;\n\n for (key in base) {\n if (tempProp instanceof RegExp) {\n if (tempProp.test(key)) {\n output.push({\n base,\n prop: key,\n value: base[key]\n });\n }\n } else if (tempProp === key) {\n output.push({\n base,\n prop: tempProp,\n value: base[key]\n });\n }\n }\n\n return output;\n } // if there is a regexp prop in input chain\n // e.g. 'unit./^ad.+/.src' for 'unit.ad-1gf2.src unit.ad-fgd34.src'),\n // every base keys should be tested by regexp and it can be more that one results\n\n\n if (tempProp instanceof RegExp) {\n const nextProp = chain.slice(1);\n const baseKeys = [];\n\n for (const key in base) {\n if (tempProp.test(key)) {\n baseKeys.push(key);\n }\n }\n\n baseKeys.forEach(key => {\n var _Object$getOwnPropert;\n\n const item = (_Object$getOwnPropert = Object.getOwnPropertyDescriptor(base, key)) === null || _Object$getOwnPropert === void 0 ? void 0 : _Object$getOwnPropert.value;\n filterRootsByRegexpChain(item, nextProp, output);\n });\n }\n\n if (base && typeof tempProp === 'string') {\n var _Object$getOwnPropert2;\n\n const nextBase = (_Object$getOwnPropert2 = Object.getOwnPropertyDescriptor(base, tempProp)) === null || _Object$getOwnPropert2 === void 0 ? void 0 : _Object$getOwnPropert2.value;\n chain = chain.slice(1);\n\n if (nextBase !== undefined) {\n filterRootsByRegexpChain(nextBase, chain, output);\n }\n }\n\n return output;\n};\n/**\n * Checks whether the domElement is matched by :matches-property() arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid prop in chain.\n */\n\n\nconst isPropertyMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const {\n rawName: rawPropertyName,\n rawValue: rawPropertyValue\n } = getRawMatchingData(pseudoName, pseudoArg); // chained property name cannot include '/' or '.'\n // so regex prop names with such escaped characters are invalid\n\n if (rawPropertyName.includes('\\\\/') || rawPropertyName.includes('\\\\.')) {\n throw new Error(`Invalid :${pseudoName} name pattern: ${rawPropertyName}`);\n }\n\n let propChainMatches;\n\n try {\n propChainMatches = parseRawPropChain(rawPropertyName);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n const ownerObjArr = filterRootsByRegexpChain(domElement, propChainMatches);\n\n if (ownerObjArr.length === 0) {\n return false;\n }\n\n let isMatched = true;\n\n if (rawPropertyValue) {\n let propValueMatch;\n\n try {\n propValueMatch = getValidMatcherArg(rawPropertyValue);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n logger.error(errorMessage);\n throw new SyntaxError(errorMessage);\n }\n\n if (propValueMatch) {\n for (let i = 0; i < ownerObjArr.length; i += 1) {\n var _ownerObjArr$i;\n\n const realValue = (_ownerObjArr$i = ownerObjArr[i]) === null || _ownerObjArr$i === void 0 ? void 0 : _ownerObjArr$i.value;\n\n if (propValueMatch instanceof RegExp) {\n isMatched = propValueMatch.test(convertTypeIntoString(realValue));\n } else {\n // handle 'null' and 'undefined' property values set as string\n if (realValue === 'null' || realValue === 'undefined') {\n isMatched = propValueMatch === realValue;\n break;\n }\n\n isMatched = convertTypeFromString(propValueMatch) === realValue;\n }\n\n if (isMatched) {\n break;\n }\n }\n }\n }\n\n return isMatched;\n};\n/**\n * Checks whether the textContent is matched by :contains arg.\n *\n * @param argsData Pseudo-class name, arg, and dom element to check.\n *\n @returns True if DOM element is matched.\n * @throws An error on invalid arg of pseudo-class.\n */\n\nconst isTextMatched = argsData => {\n const {\n pseudoName,\n pseudoArg,\n domElement\n } = argsData;\n const textContent = getNodeTextContent(domElement);\n let isTextContentMatched;\n let pseudoArgToMatch = pseudoArg;\n\n if (pseudoArgToMatch.startsWith(SLASH) && REGEXP_WITH_FLAGS_REGEXP.test(pseudoArgToMatch)) {\n // regexp arg\n const flagsIndex = pseudoArgToMatch.lastIndexOf('/');\n const flagsStr = pseudoArgToMatch.substring(flagsIndex + 1);\n pseudoArgToMatch = pseudoArgToMatch.substring(0, flagsIndex + 1).slice(1, -1).replace(/\\\\([\\\\\"])/g, '$1');\n let regex;\n\n try {\n regex = new RegExp(pseudoArgToMatch, flagsStr);\n } catch (e) {\n throw new Error(`Invalid argument of :${pseudoName}() pseudo-class: ${pseudoArg}`);\n }\n\n isTextContentMatched = regex.test(textContent);\n } else {\n // none-regexp arg\n pseudoArgToMatch = pseudoArgToMatch.replace(/\\\\([\\\\()[\\]\"])/g, '$1');\n isTextContentMatched = textContent.includes(pseudoArgToMatch);\n }\n\n return isTextContentMatched;\n};\n\n/**\n * Validates number arg for :nth-ancestor() and :upward() pseudo-classes.\n *\n * @param rawArg Raw arg of pseudo-class.\n * @param pseudoName Pseudo-class name.\n *\n * @returns Valid number arg for :nth-ancestor() and :upward().\n * @throws An error on invalid `rawArg`.\n */\nconst getValidNumberAncestorArg = (rawArg, pseudoName) => {\n const deep = Number(rawArg);\n\n if (Number.isNaN(deep) || deep < 1 || deep >= 256) {\n throw new Error(`Invalid argument of :${pseudoName} pseudo-class: '${rawArg}'`);\n }\n\n return deep;\n};\n/**\n * Returns nth ancestor by 'deep' number arg OR undefined if ancestor range limit exceeded.\n *\n * @param domElement DOM element to find ancestor for.\n * @param nth Depth up to needed ancestor.\n * @param pseudoName Pseudo-class name.\n *\n * @returns Ancestor element found in DOM, or null if not found.\n * @throws An error on invalid `nth` arg.\n */\n\nconst getNthAncestor = (domElement, nth, pseudoName) => {\n let ancestor = null;\n let i = 0;\n\n while (i < nth) {\n ancestor = domElement.parentElement;\n\n if (!ancestor) {\n throw new Error(`Out of DOM: Argument of :${pseudoName}() pseudo-class is too big — '${nth}'.`);\n }\n\n domElement = ancestor;\n i += 1;\n }\n\n return ancestor;\n};\n/**\n * Validates standard CSS selector.\n *\n * @param selector Standard selector.\n *\n * @returns True if standard CSS selector is valid.\n */\n\nconst validateStandardSelector = selector => {\n let isValid;\n\n try {\n document.querySelectorAll(selector);\n isValid = true;\n } catch (e) {\n isValid = false;\n }\n\n return isValid;\n};\n\n/**\n * Wrapper to run matcher `callback` with `args`\n * and throw error with `errorMessage` if `callback` run fails.\n *\n * @param callback Matcher callback.\n * @param argsData Args needed for matcher callback.\n * @param errorMessage Error message.\n *\n * @returns True if `callback` returns true.\n * @throws An error if `callback` fails.\n */\nconst matcherWrapper = (callback, argsData, errorMessage) => {\n let isMatched;\n\n try {\n isMatched = callback(argsData);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(errorMessage);\n }\n\n return isMatched;\n};\n/**\n * Generates common error message to throw while matching element `propDesc`.\n *\n * @param propDesc Text to describe what element 'prop' pseudo-class is trying to match.\n * @param pseudoName Pseudo-class name.\n * @param pseudoArg Pseudo-class arg.\n *\n * @returns Generated error message string.\n */\n\n\nconst getAbsolutePseudoError = (propDesc, pseudoName, pseudoArg) => {\n // eslint-disable-next-line max-len\n return `${MATCHING_ELEMENT_ERROR_PREFIX} ${propDesc}, may be invalid :${pseudoName}() pseudo-class arg: '${pseudoArg}'`;\n};\n/**\n * Checks whether the domElement is matched by absolute extended pseudo-class argument.\n *\n * @param domElement Page element.\n * @param pseudoName Pseudo-class name.\n * @param pseudoArg Pseudo-class arg.\n *\n * @returns True if `domElement` is matched by absolute pseudo-class.\n * @throws An error on unknown absolute pseudo-class.\n */\n\n\nconst isMatchedByAbsolutePseudo = (domElement, pseudoName, pseudoArg) => {\n let argsData;\n let errorMessage;\n let callback;\n\n switch (pseudoName) {\n case CONTAINS_PSEUDO:\n case HAS_TEXT_PSEUDO:\n case ABP_CONTAINS_PSEUDO:\n callback = isTextMatched;\n argsData = {\n pseudoName,\n pseudoArg,\n domElement\n };\n errorMessage = getAbsolutePseudoError('text content', pseudoName, pseudoArg);\n break;\n\n case MATCHES_CSS_PSEUDO:\n case MATCHES_CSS_AFTER_PSEUDO:\n case MATCHES_CSS_BEFORE_PSEUDO:\n callback = isStyleMatched;\n argsData = {\n pseudoName,\n pseudoArg,\n domElement\n };\n errorMessage = getAbsolutePseudoError('style', pseudoName, pseudoArg);\n break;\n\n case MATCHES_ATTR_PSEUDO_CLASS_MARKER:\n callback = isAttributeMatched;\n argsData = {\n domElement,\n pseudoName,\n pseudoArg\n };\n errorMessage = getAbsolutePseudoError('attributes', pseudoName, pseudoArg);\n break;\n\n case MATCHES_PROPERTY_PSEUDO_CLASS_MARKER:\n callback = isPropertyMatched;\n argsData = {\n domElement,\n pseudoName,\n pseudoArg\n };\n errorMessage = getAbsolutePseudoError('properties', pseudoName, pseudoArg);\n break;\n\n default:\n throw new Error(`Unknown absolute pseudo-class :${pseudoName}()`);\n }\n\n return matcherWrapper(callback, argsData, errorMessage);\n};\nconst findByAbsolutePseudoPseudo = {\n /**\n * Returns list of nth ancestors relative to every dom node from domElements list.\n *\n * @param domElements DOM elements.\n * @param rawPseudoArg Number arg of :nth-ancestor() or :upward() pseudo-class.\n * @param pseudoName Pseudo-class name.\n *\n * @returns Array of ancestor DOM elements.\n */\n nthAncestor: (domElements, rawPseudoArg, pseudoName) => {\n const deep = getValidNumberAncestorArg(rawPseudoArg, pseudoName);\n const ancestors = domElements.map(domElement => {\n let ancestor = null;\n\n try {\n ancestor = getNthAncestor(domElement, deep, pseudoName);\n } catch (e) {\n logger.error(getErrorMessage(e));\n }\n\n return ancestor;\n }).filter(isHtmlElement);\n return ancestors;\n },\n\n /**\n * Returns list of elements by xpath expression, evaluated on every dom node from domElements list.\n *\n * @param domElements DOM elements.\n * @param rawPseudoArg Arg of :xpath() pseudo-class.\n *\n * @returns Array of DOM elements matched by xpath expression.\n */\n xpath: (domElements, rawPseudoArg) => {\n const foundElements = domElements.map(domElement => {\n const result = [];\n let xpathResult;\n\n try {\n xpathResult = document.evaluate(rawPseudoArg, domElement, null, window.XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`Invalid argument of :xpath() pseudo-class: '${rawPseudoArg}'`);\n }\n\n let node = xpathResult.iterateNext();\n\n while (node) {\n if (isHtmlElement(node)) {\n result.push(node);\n }\n\n node = xpathResult.iterateNext();\n }\n\n return result;\n });\n return flatten(foundElements);\n },\n\n /**\n * Returns list of closest ancestors relative to every dom node from domElements list.\n *\n * @param domElements DOM elements.\n * @param rawPseudoArg Standard selector arg of :upward() pseudo-class.\n *\n * @returns Array of closest ancestor DOM elements.\n * @throws An error if `rawPseudoArg` is not a valid standard selector.\n */\n upward: (domElements, rawPseudoArg) => {\n if (!validateStandardSelector(rawPseudoArg)) {\n throw new Error(`Invalid argument of :upward pseudo-class: '${rawPseudoArg}'`);\n }\n\n const closestAncestors = domElements.map(domElement => {\n // closest to parent element should be found\n // otherwise `.base:upward(.base)` will return itself too, not only ancestor\n const parent = domElement.parentElement;\n\n if (!parent) {\n return null;\n }\n\n return parent.closest(rawPseudoArg);\n }).filter(isHtmlElement);\n return closestAncestors;\n }\n};\n\n/**\n * Calculated selector text which is needed to :has(), :is() and :not() pseudo-classes.\n * Contains calculated part (depends on the processed element)\n * and value of RegularSelector which is next to selector by.\n *\n * Native Document.querySelectorAll() does not select exact descendant elements\n * but match all page elements satisfying the selector,\n * so extra specification is needed for proper descendants selection\n * e.g. 'div:has(> img)'.\n *\n * Its calculation depends on extended selector.\n */\n\n/**\n * Combined `:scope` pseudo-class and **child** combinator — `:scope>`.\n */\nconst scopeDirectChildren = `${SCOPE_CSS_PSEUDO_CLASS}${CHILD_COMBINATOR}`;\n/**\n * Combined `:scope` pseudo-class and **descendant** combinator — `:scope `.\n */\n\nconst scopeAnyChildren = `${SCOPE_CSS_PSEUDO_CLASS}${DESCENDANT_COMBINATOR}`;\n/**\n * Type for relative pseudo-class helpers args.\n */\n\n/**\n * Returns the first of RegularSelector child node for `selectorNode`.\n *\n * @param selectorNode Ast Selector node.\n * @param pseudoName Name of relative pseudo-class.\n *\n * @returns Ast RegularSelector node.\n */\nconst getFirstInnerRegularChild = (selectorNode, pseudoName) => {\n return getFirstRegularChild(selectorNode.children, `RegularSelector is missing for :${pseudoName}() pseudo-class`);\n}; // TODO: fix for \n// https://github.com/AdguardTeam/ExtendedCss/issues/154\n\n/**\n * Checks whether the element has all relative elements specified by pseudo-class arg.\n * Used for :has() pseudo-class.\n *\n * @param argsData Relative pseudo-class helpers args data.\n *\n * @returns True if **all selectors** from argsData.relativeSelectorList is **matched** for argsData.element.\n */\n\n\nconst hasRelativesBySelectorList = argsData => {\n const {\n element,\n relativeSelectorList,\n pseudoName\n } = argsData;\n return relativeSelectorList.children // Array.every() is used here as each Selector node from SelectorList should exist on page\n .every(selectorNode => {\n // selectorList.children always starts with regular selector as any selector generally\n const relativeRegularSelector = getFirstInnerRegularChild(selectorNode, pseudoName);\n let specifiedSelector = '';\n let rootElement = null;\n const regularSelector = getNodeValue(relativeRegularSelector);\n\n if (regularSelector.startsWith(NEXT_SIBLING_COMBINATOR) || regularSelector.startsWith(SUBSEQUENT_SIBLING_COMBINATOR)) {\n /**\n * For matching the element by \"element:has(+ next-sibling)\" and \"element:has(~ sibling)\"\n * we check whether the element's parentElement has specific direct child combination,\n * e.g. 'h1:has(+ .share)' -> `h1Node.parentElement.querySelectorAll(':scope > h1 + .share')`.\n *\n * @see {@link https://www.w3.org/TR/selectors-4/#relational}\n */\n rootElement = element.parentElement;\n const elementSelectorText = getElementSelectorDesc(element);\n specifiedSelector = `${scopeDirectChildren}${elementSelectorText}${regularSelector}`;\n } else if (regularSelector === ASTERISK) {\n /**\n * :scope specification is needed for proper descendants selection\n * as native element.querySelectorAll() does not select exact element descendants\n * e.g. 'a:has(> img)' -> `aNode.querySelectorAll(':scope > img')`.\n *\n * For 'any selector' as arg of relative simplicity should be set for all inner elements\n * e.g. 'div:has(*)' -> `divNode.querySelectorAll(':scope *')`\n * which means empty div with no child element.\n */\n rootElement = element;\n specifiedSelector = `${scopeAnyChildren}${ASTERISK}`;\n } else {\n /**\n * As it described above, inner elements should be found using `:scope` pseudo-class\n * e.g. 'a:has(> img)' -> `aNode.querySelectorAll(':scope > img')`\n * OR '.block(div > span)' -> `blockClassNode.querySelectorAll(':scope div > span')`.\n */\n specifiedSelector = `${scopeAnyChildren}${regularSelector}`;\n rootElement = element;\n }\n\n if (!rootElement) {\n throw new Error(`Selection by :${pseudoName}() pseudo-class is not possible`);\n }\n\n let relativeElements;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n relativeElements = getElementsForSelectorNode(selectorNode, rootElement, specifiedSelector);\n } catch (e) {\n logger.error(getErrorMessage(e)); // fail for invalid selector\n\n throw new Error(`Invalid selector for :${pseudoName}() pseudo-class: '${regularSelector}'`);\n }\n\n return relativeElements.length > 0;\n });\n};\n/**\n * Checks whether the element is an any element specified by pseudo-class arg.\n * Used for :is() pseudo-class.\n *\n * @param argsData Relative pseudo-class helpers args data.\n *\n * @returns True if **any selector** from argsData.relativeSelectorList is **matched** for argsData.element.\n */\n\n\nconst isAnyElementBySelectorList = argsData => {\n const {\n element,\n relativeSelectorList,\n pseudoName\n } = argsData;\n return relativeSelectorList.children // Array.some() is used here as any selector from selector list should exist on page\n .some(selectorNode => {\n // selectorList.children always starts with regular selector\n const relativeRegularSelector = getFirstInnerRegularChild(selectorNode, pseudoName);\n /**\n * For checking the element by 'div:is(.banner)'\n * we check whether the element's parentElement has any specific direct child.\n */\n\n const rootElement = getParent(element, `Selection by :${pseudoName}() pseudo-class is not possible`);\n /**\n * So we calculate the element \"description\" by it's tagname and attributes for targeting\n * and use it to specify the selection\n * e.g. `div:is(.banner)` --> `divNode.parentElement.querySelectorAll(':scope > .banner')`.\n */\n\n const specifiedSelector = `${scopeDirectChildren}${getNodeValue(relativeRegularSelector)}`;\n let anyElements;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n anyElements = getElementsForSelectorNode(selectorNode, rootElement, specifiedSelector);\n } catch (e) {\n // do not fail on invalid selectors for :is()\n return false;\n } // TODO: figure out how to handle complex selectors with extended pseudo-classes\n // (check readme - extended-css-is-limitations)\n // because `element` and `anyElements` may be from different DOM levels\n\n\n return anyElements.includes(element);\n });\n};\n/**\n * Checks whether the element is not an element specified by pseudo-class arg.\n * Used for :not() pseudo-class.\n *\n * @param argsData Relative pseudo-class helpers args data.\n *\n * @returns True if **any selector** from argsData.relativeSelectorList is **not matched** for argsData.element.\n */\n\n\nconst notElementBySelectorList = argsData => {\n const {\n element,\n relativeSelectorList,\n pseudoName\n } = argsData;\n return relativeSelectorList.children // Array.every() is used here as element should not be selected by any selector from selector list\n .every(selectorNode => {\n // selectorList.children always starts with regular selector\n const relativeRegularSelector = getFirstInnerRegularChild(selectorNode, pseudoName);\n /**\n * For checking the element by 'div:not([data=\"content\"])\n * we check whether the element's parentElement has any specific direct child.\n */\n\n const rootElement = getParent(element, `Selection by :${pseudoName}() pseudo-class is not possible`);\n /**\n * So we calculate the element \"description\" by it's tagname and attributes for targeting\n * and use it to specify the selection\n * e.g. `div:not(.banner)` --> `divNode.parentElement.querySelectorAll(':scope > .banner')`.\n */\n\n const specifiedSelector = `${scopeDirectChildren}${getNodeValue(relativeRegularSelector)}`;\n let anyElements;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n anyElements = getElementsForSelectorNode(selectorNode, rootElement, specifiedSelector);\n } catch (e) {\n // fail on invalid selectors for :not()\n logger.error(getErrorMessage(e)); // eslint-disable-next-line max-len\n\n throw new Error(`Invalid selector for :${pseudoName}() pseudo-class: '${getNodeValue(relativeRegularSelector)}'`);\n } // TODO: figure out how to handle up-looking pseudo-classes inside :not()\n // (check readme - extended-css-not-limitations)\n // because `element` and `anyElements` may be from different DOM levels\n\n\n return !anyElements.includes(element);\n });\n};\n/**\n * Selects dom elements by value of RegularSelector.\n *\n * @param regularSelectorNode RegularSelector node.\n * @param root Root DOM element.\n * @param specifiedSelector @see {@link SpecifiedSelector}.\n *\n * @returns Array of DOM elements.\n * @throws An error if RegularSelector node value is an invalid selector.\n */\n\n\nconst getByRegularSelector = (regularSelectorNode, root, specifiedSelector) => {\n const selectorText = specifiedSelector ? specifiedSelector : getNodeValue(regularSelectorNode);\n let selectedElements = [];\n\n try {\n selectedElements = Array.from(root.querySelectorAll(selectorText));\n } catch (e) {\n throw new Error(`Error: unable to select by '${selectorText}' — ${getErrorMessage(e)}`);\n }\n\n return selectedElements;\n};\n/**\n * Returns list of dom elements filtered or selected by ExtendedSelector node.\n *\n * @param domElements Array of DOM elements.\n * @param extendedSelectorNode ExtendedSelector node.\n *\n * @returns Array of DOM elements.\n * @throws An error on unknown pseudo-class,\n * absent or invalid arg of extended pseudo-class, etc.\n */\n\nconst getByExtendedSelector = (domElements, extendedSelectorNode) => {\n let foundElements = [];\n const extendedPseudoClassNode = getPseudoClassNode(extendedSelectorNode);\n const pseudoName = getNodeName(extendedPseudoClassNode);\n\n if (isAbsolutePseudoClass(pseudoName)) {\n // absolute extended pseudo-classes should have an argument\n const absolutePseudoArg = getNodeValue(extendedPseudoClassNode, `Missing arg for :${pseudoName}() pseudo-class`);\n\n if (pseudoName === NTH_ANCESTOR_PSEUDO_CLASS_MARKER) {\n // :nth-ancestor()\n foundElements = findByAbsolutePseudoPseudo.nthAncestor(domElements, absolutePseudoArg, pseudoName);\n } else if (pseudoName === XPATH_PSEUDO_CLASS_MARKER) {\n // :xpath()\n try {\n document.createExpression(absolutePseudoArg, null);\n } catch (e) {\n throw new Error(`Invalid argument of :${pseudoName}() pseudo-class: '${absolutePseudoArg}'`);\n }\n\n foundElements = findByAbsolutePseudoPseudo.xpath(domElements, absolutePseudoArg);\n } else if (pseudoName === UPWARD_PSEUDO_CLASS_MARKER) {\n // :upward()\n if (Number.isNaN(Number(absolutePseudoArg))) {\n // so arg is selector, not a number\n foundElements = findByAbsolutePseudoPseudo.upward(domElements, absolutePseudoArg);\n } else {\n foundElements = findByAbsolutePseudoPseudo.nthAncestor(domElements, absolutePseudoArg, pseudoName);\n }\n } else {\n // all other absolute extended pseudo-classes\n // e.g. contains, matches-attr, etc.\n foundElements = domElements.filter(element => {\n return isMatchedByAbsolutePseudo(element, pseudoName, absolutePseudoArg);\n });\n }\n } else if (isRelativePseudoClass(pseudoName)) {\n const relativeSelectorList = getRelativeSelectorListNode(extendedPseudoClassNode);\n let relativePredicate;\n\n switch (pseudoName) {\n case HAS_PSEUDO_CLASS_MARKER:\n case ABP_HAS_PSEUDO_CLASS_MARKER:\n relativePredicate = element => hasRelativesBySelectorList({\n element,\n relativeSelectorList,\n pseudoName\n });\n\n break;\n\n case IS_PSEUDO_CLASS_MARKER:\n relativePredicate = element => isAnyElementBySelectorList({\n element,\n relativeSelectorList,\n pseudoName\n });\n\n break;\n\n case NOT_PSEUDO_CLASS_MARKER:\n relativePredicate = element => notElementBySelectorList({\n element,\n relativeSelectorList,\n pseudoName\n });\n\n break;\n\n default:\n throw new Error(`Unknown relative pseudo-class: '${pseudoName}'`);\n }\n\n foundElements = domElements.filter(relativePredicate);\n } else {\n // extra check is parser missed something\n throw new Error(`Unknown extended pseudo-class: '${pseudoName}'`);\n }\n\n return foundElements;\n};\n/**\n * Returns list of dom elements which is selected by RegularSelector value.\n *\n * @param domElements Array of DOM elements.\n * @param regularSelectorNode RegularSelector node.\n *\n * @returns Array of DOM elements.\n * @throws An error if RegularSelector has not value.\n */\n\nconst getByFollowingRegularSelector = (domElements, regularSelectorNode) => {\n // array of arrays because of Array.map() later\n let foundElements = [];\n const value = getNodeValue(regularSelectorNode);\n\n if (value.startsWith(CHILD_COMBINATOR)) {\n // e.g. div:has(> img) > .banner\n foundElements = domElements.map(root => {\n const specifiedSelector = `${SCOPE_CSS_PSEUDO_CLASS}${value}`;\n return getByRegularSelector(regularSelectorNode, root, specifiedSelector);\n });\n } else if (value.startsWith(NEXT_SIBLING_COMBINATOR) || value.startsWith(SUBSEQUENT_SIBLING_COMBINATOR)) {\n // e.g. div:has(> img) + .banner\n // or div:has(> img) ~ .banner\n foundElements = domElements.map(element => {\n const rootElement = element.parentElement;\n\n if (!rootElement) {\n // do not throw error if there in no parent for element\n // e.g. '*:contains(text)' selects `html` which has no parentElement\n return [];\n }\n\n const elementSelectorText = getElementSelectorDesc(element);\n const specifiedSelector = `${scopeDirectChildren}${elementSelectorText}${value}`;\n const selected = getByRegularSelector(regularSelectorNode, rootElement, specifiedSelector);\n return selected;\n });\n } else {\n // space-separated regular selector after extended one\n // e.g. div:has(> img) .banner\n foundElements = domElements.map(root => {\n const specifiedSelector = `${scopeAnyChildren}${getNodeValue(regularSelectorNode)}`;\n return getByRegularSelector(regularSelectorNode, root, specifiedSelector);\n });\n } // foundElements should be flattened\n // as getByRegularSelector() returns elements array, and Array.map() collects them to array\n\n\n return flatten(foundElements);\n};\n/**\n * Returns elements nodes for Selector node.\n * As far as any selector always starts with regular part,\n * it selects by RegularSelector first and checks found elements later.\n *\n * Relative pseudo-classes has it's own subtree so getElementsForSelectorNode is called recursively.\n *\n * 'specifiedSelector' is needed for :has(), :is(), and :not() pseudo-classes\n * as native querySelectorAll() does not select exact element descendants even if it is called on 'div'\n * e.g. ':scope' specification is needed for proper descendants selection for 'div:has(> img)'.\n * So we check `divNode.querySelectorAll(':scope > img').length > 0`.\n *\n * @param selectorNode Selector node.\n * @param root Root DOM element.\n * @param specifiedSelector Needed element specification.\n *\n * @returns Array of DOM elements.\n * @throws An error if there is no selectorNodeChild.\n */\n\nconst getElementsForSelectorNode = (selectorNode, root, specifiedSelector) => {\n let selectedElements = [];\n let i = 0;\n\n while (i < selectorNode.children.length) {\n const selectorNodeChild = getItemByIndex(selectorNode.children, i, 'selectorNodeChild should be specified');\n\n if (i === 0) {\n // any selector always starts with regular selector\n selectedElements = getByRegularSelector(selectorNodeChild, root, specifiedSelector);\n } else if (isExtendedSelectorNode(selectorNodeChild)) {\n // filter previously selected elements by next selector nodes\n selectedElements = getByExtendedSelector(selectedElements, selectorNodeChild);\n } else if (isRegularSelectorNode(selectorNodeChild)) {\n selectedElements = getByFollowingRegularSelector(selectedElements, selectorNodeChild);\n }\n\n i += 1;\n }\n\n return selectedElements;\n};\n\n/**\n * Selects elements by ast.\n *\n * @param ast Ast of parsed selector.\n * @param doc Document.\n *\n * @returns Array of DOM elements.\n */\n\nconst selectElementsByAst = function (ast) {\n let doc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;\n const selectedElements = []; // ast root is SelectorList node;\n // it has Selector nodes as children which should be processed separately\n\n ast.children.forEach(selectorNode => {\n selectedElements.push(...getElementsForSelectorNode(selectorNode, doc));\n }); // selectedElements should be flattened as it is array of arrays with elements\n\n const uniqueElements = [...new Set(flatten(selectedElements))];\n return uniqueElements;\n};\n/**\n * Class of ExtCssDocument is needed for caching.\n * For making cache related to each new instance of class, not global.\n */\n\nclass ExtCssDocument {\n /**\n * Cache with selectors and their AST parsing results.\n */\n\n /**\n * Creates new ExtCssDocument and inits new `astCache`.\n */\n constructor() {\n this.astCache = new Map();\n }\n /**\n * Saves selector and it's ast to cache.\n *\n * @param selector Standard or extended selector.\n * @param ast Selector ast.\n */\n\n\n saveAstToCache(selector, ast) {\n this.astCache.set(selector, ast);\n }\n /**\n * Returns ast from cache for given selector.\n *\n * @param selector Standard or extended selector.\n *\n * @returns Previously parsed ast found in cache, or null if not found.\n */\n\n\n getAstFromCache(selector) {\n const cachedAst = this.astCache.get(selector) || null;\n return cachedAst;\n }\n /**\n * Returns selector ast:\n * - if cached ast exists — returns it;\n * - if no cached ast — saves newly parsed ast to cache and returns it.\n *\n * @param selector Standard or extended selector.\n *\n * @returns Ast for `selector`.\n */\n\n\n getSelectorAst(selector) {\n let ast = this.getAstFromCache(selector);\n\n if (!ast) {\n ast = parse(selector);\n }\n\n this.saveAstToCache(selector, ast);\n return ast;\n }\n /**\n * Selects elements by selector.\n *\n * @param selector Standard or extended selector.\n *\n * @returns Array of DOM elements.\n */\n\n\n querySelectorAll(selector) {\n const ast = this.getSelectorAst(selector);\n return selectElementsByAst(ast);\n }\n\n}\nconst extCssDocument = new ExtCssDocument();\n\n/**\n * Converts array of `entries` to object.\n * Object.fromEntries() polyfill because it is not supported by old browsers, e.g. Chrome 55.\n * Only first two elements of `entries` array matter, other will be skipped silently.\n *\n * @see {@link https://caniuse.com/?search=Object.fromEntries}\n *\n * @param entries Array of pairs.\n *\n * @returns Object converted from `entries`.\n */\nconst getObjectFromEntries = entries => {\n const object = {};\n entries.forEach(el => {\n const [key, value] = el;\n object[key] = value;\n });\n return object;\n};\n\nconst DEBUG_PSEUDO_PROPERTY_KEY = 'debug';\n/**\n * Checks the presence of :remove() pseudo-class and validates it while parsing the selector part of css rule.\n *\n * @param rawSelector Selector which may contain :remove() pseudo-class.\n *\n * @returns Parsed selector data with selector and styles.\n * @throws An error on invalid :remove() position.\n */\n\nconst parseRemoveSelector = rawSelector => {\n /**\n * No error will be thrown on invalid selector as it will be validated later\n * so it's better to explicitly specify 'any' selector for :remove() pseudo-class by '*',\n * e.g. '.banner > *:remove()' instead of '.banner > :remove()'.\n */\n // ':remove()'\n // eslint-disable-next-line max-len\n const VALID_REMOVE_MARKER = `${COLON}${REMOVE_PSEUDO_MARKER}${BRACKET.PARENTHESES.LEFT}${BRACKET.PARENTHESES.RIGHT}`; // ':remove(' - needed for validation rules like 'div:remove(2)'\n\n const INVALID_REMOVE_MARKER = `${COLON}${REMOVE_PSEUDO_MARKER}${BRACKET.PARENTHESES.LEFT}`;\n let selector;\n let shouldRemove = false;\n const firstIndex = rawSelector.indexOf(VALID_REMOVE_MARKER);\n\n if (firstIndex === 0) {\n // e.g. ':remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.NO_TARGET_SELECTOR}: '${rawSelector}'`);\n } else if (firstIndex > 0) {\n if (firstIndex !== rawSelector.lastIndexOf(VALID_REMOVE_MARKER)) {\n // rule with more than one :remove() pseudo-class is invalid\n // e.g. '.block:remove() > .banner:remove()'\n throw new Error(`${REMOVE_ERROR_PREFIX.MULTIPLE_USAGE}: '${rawSelector}'`);\n } else if (firstIndex + VALID_REMOVE_MARKER.length < rawSelector.length) {\n // remove pseudo-class should be last in the rule\n // e.g. '.block:remove():upward(2)'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_POSITION}: '${rawSelector}'`);\n } else {\n // valid :remove() pseudo-class position\n selector = rawSelector.substring(0, firstIndex);\n shouldRemove = true;\n }\n } else if (rawSelector.includes(INVALID_REMOVE_MARKER)) {\n // it is not valid if ':remove()' is absent in rule but just ':remove(' is present\n // e.g. 'div:remove(0)'\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${rawSelector}'`);\n } else {\n // there is no :remove() pseudo-class in rule\n selector = rawSelector;\n }\n\n const stylesOfSelector = shouldRemove ? [{\n property: REMOVE_PSEUDO_MARKER,\n value: PSEUDO_PROPERTY_POSITIVE_VALUE\n }] : [];\n return {\n selector,\n stylesOfSelector\n };\n};\n/**\n * Parses cropped selector part found before `{`.\n *\n * @param selectorBuffer Buffered selector to parse.\n * @param extCssDoc Needed for caching of selector ast.\n *\n * @returns Parsed validation data for cropped part of stylesheet which may be a selector.\n * @throws An error on unsupported CSS features, e.g. at-rules.\n */\n\nconst parseSelectorRulePart = (selectorBuffer, extCssDoc) => {\n let selector = selectorBuffer.trim();\n\n if (selector.startsWith(AT_RULE_MARKER)) {\n throw new Error(`${NO_AT_RULE_ERROR_PREFIX}: '${selector}'.`);\n }\n\n let removeSelectorData;\n\n try {\n removeSelectorData = parseRemoveSelector(selector);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n }\n\n let stylesOfSelector = [];\n let success = false;\n let ast;\n\n try {\n selector = removeSelectorData.selector;\n stylesOfSelector = removeSelectorData.stylesOfSelector; // validate found selector by parsing it to ast\n // so if it is invalid error will be thrown\n\n ast = extCssDoc.getSelectorAst(selector);\n success = true;\n } catch (e) {\n success = false;\n }\n\n return {\n success,\n selector,\n ast,\n stylesOfSelector\n };\n};\n/**\n * Creates a map for storing raw results of css rules parsing.\n * Used for merging styles for same selector.\n *\n * @returns Map where **key** is `selector`\n * and **value** is object with `ast` and `styles`.\n */\n\nconst createRawResultsMap = () => {\n return new Map();\n};\n/**\n * Saves rules data for unique selectors.\n *\n * @param rawResults Previously collected results of parsing.\n * @param rawRuleData Parsed rule data.\n *\n * @throws An error if there is no rawRuleData.styles or rawRuleData.ast.\n */\n\nconst saveToRawResults = (rawResults, rawRuleData) => {\n const {\n selector,\n ast,\n rawStyles\n } = rawRuleData;\n\n if (!rawStyles) {\n throw new Error(`No style declaration for selector: '${selector}'`);\n }\n\n if (!ast) {\n throw new Error(`No ast parsed for selector: '${selector}'`);\n }\n\n const storedRuleData = rawResults.get(selector);\n\n if (!storedRuleData) {\n rawResults.set(selector, {\n ast,\n styles: rawStyles\n });\n } else {\n storedRuleData.styles.push(...rawStyles);\n }\n};\n/**\n * Checks whether the 'remove' property positively set in styles\n * with only one positive value - 'true'.\n *\n * @param styles Array of styles.\n *\n * @returns True if there is 'remove' property with 'true' value in `styles`.\n */\n\nconst isRemoveSetInStyles = styles => {\n return styles.some(s => {\n return s.property === REMOVE_PSEUDO_MARKER && s.value === PSEUDO_PROPERTY_POSITIVE_VALUE;\n });\n};\n/**\n * Returns 'debug' property value which is set in styles.\n *\n * @param styles Array of styles.\n *\n * @returns Value of 'debug' property if it is set in `styles`,\n * or `undefined` if the property is not found.\n */\n\n\nconst getDebugStyleValue = styles => {\n const debugStyle = styles.find(s => {\n return s.property === DEBUG_PSEUDO_PROPERTY_KEY;\n });\n return debugStyle === null || debugStyle === void 0 ? void 0 : debugStyle.value;\n};\n/**\n * Prepares final RuleData.\n * Handles `debug` and `remove` in raw rule data styles.\n *\n * @param rawRuleData Raw data of selector css rule parsing.\n *\n * @returns Parsed ExtendedCss rule data.\n * @throws An error if rawRuleData.ast or rawRuleData.rawStyles not defined.\n */\n\n\nconst prepareRuleData = rawRuleData => {\n const {\n selector,\n ast,\n rawStyles\n } = rawRuleData;\n\n if (!ast) {\n throw new Error(`AST should be parsed for selector: '${selector}'`);\n }\n\n if (!rawStyles) {\n throw new Error(`Styles should be parsed for selector: '${selector}'`);\n }\n\n const ruleData = {\n selector,\n ast\n };\n const debugValue = getDebugStyleValue(rawStyles);\n const shouldRemove = isRemoveSetInStyles(rawStyles);\n let styles = rawStyles;\n\n if (debugValue) {\n // get rid of 'debug' from styles\n styles = rawStyles.filter(s => s.property !== DEBUG_PSEUDO_PROPERTY_KEY); // and set it as separate property only if its value is valid\n // which is 'true' or 'global'\n\n if (debugValue === PSEUDO_PROPERTY_POSITIVE_VALUE || debugValue === DEBUG_PSEUDO_PROPERTY_GLOBAL_VALUE) {\n ruleData.debug = debugValue;\n }\n }\n\n if (shouldRemove) {\n // no other styles are needed to apply if 'remove' is set\n ruleData.style = {\n [REMOVE_PSEUDO_MARKER]: PSEUDO_PROPERTY_POSITIVE_VALUE\n };\n /**\n * 'content' property is needed for ExtCssConfiguration.beforeStyleApplied().\n *\n * @see {@link BeforeStyleAppliedCallback}\n */\n\n const contentStyle = styles.find(s => s.property === CONTENT_CSS_PROPERTY);\n\n if (contentStyle) {\n ruleData.style[CONTENT_CSS_PROPERTY] = contentStyle.value;\n }\n } else {\n // otherwise all styles should be applied.\n // every style property will be unique because of their converting into object\n if (styles.length > 0) {\n const stylesAsEntries = styles.map(style => {\n const {\n property,\n value\n } = style;\n return [property, value];\n });\n const preparedStyleData = getObjectFromEntries(stylesAsEntries);\n ruleData.style = preparedStyleData;\n }\n }\n\n return ruleData;\n};\n/**\n * Combines previously parsed css rules data objects\n * into rules which are ready to apply.\n *\n * @param rawResults Previously parsed css rules data objects.\n *\n * @returns Parsed ExtendedCss rule data.\n */\n\nconst combineRulesData = rawResults => {\n const results = [];\n rawResults.forEach((value, key) => {\n const selector = key;\n const {\n ast,\n styles: rawStyles\n } = value;\n results.push(prepareRuleData({\n selector,\n ast,\n rawStyles\n }));\n });\n return results;\n};\n\n/**\n * Trims `rawStyle` and splits it into tokens.\n *\n * @param rawStyle Style declaration block content inside curly bracket — `{` and `}` —\n * can be a single style declaration or a list of declarations.\n *\n * @returns Array of tokens supported for style declaration block.\n */\n\nconst tokenizeStyleBlock = rawStyle => {\n const styleDeclaration = rawStyle.trim();\n return tokenize(styleDeclaration, SUPPORTED_STYLE_DECLARATION_MARKS);\n};\n\n/**\n * Describes possible style declaration parts.\n *\n * IMPORTANT: it is used as 'const' instead of 'enum' to avoid side effects\n * during ExtendedCss import into other libraries.\n */\n\nconst DECLARATION_PART = {\n PROPERTY: 'property',\n VALUE: 'value'\n};\n\n/**\n * Checks whether the quotes has been opened for style value.\n *\n * @param context Style block parser context.\n *\n * @returns True if style value has already opened quotes.\n */\nconst isValueQuotesOpen = context => {\n return context.bufferValue !== '' && context.valueQuoteMark !== null;\n};\n/**\n * Saves parsed property and value to collection of parsed styles.\n * Prunes context buffers for property and value.\n *\n * @param context Style block parser context.\n */\n\n\nconst collectStyle = context => {\n context.styles.push({\n property: context.bufferProperty.trim(),\n value: context.bufferValue.trim()\n }); // reset buffers\n\n context.bufferProperty = '';\n context.bufferValue = '';\n};\n/**\n * Handles token which is supposed to be a part of style **property**.\n *\n * @param context Style block parser context.\n * @param styleBlock Whole style block which is being parsed.\n * @param token Current token.\n *\n * @throws An error on invalid token.\n */\n\n\nconst processPropertyToken = (context, styleBlock, token) => {\n const {\n value: tokenValue\n } = token;\n\n switch (token.type) {\n case TOKEN_TYPE.WORD:\n if (context.bufferProperty.length > 0) {\n // e.g. 'padding top: 0;' - current tokenValue is 'top' which is not valid\n throw new Error(`Invalid style property in style block: '${styleBlock}'`);\n }\n\n context.bufferProperty += tokenValue;\n break;\n\n case TOKEN_TYPE.MARK:\n // only colon and whitespaces are allowed while style property parsing\n if (tokenValue === COLON) {\n if (context.bufferProperty.trim().length === 0) {\n // e.g. such style block: '{ : none; }'\n throw new Error(`Missing style property before ':' in style block: '${styleBlock}'`);\n } // the property successfully collected\n\n\n context.bufferProperty = context.bufferProperty.trim(); // prepare for value collecting\n\n context.processing = DECLARATION_PART.VALUE; // the property buffer shall be reset after the value is successfully collected\n } else if (WHITE_SPACE_CHARACTERS.includes(tokenValue)) ; else {\n // if after the property there is anything other than ':' except whitespace, this is a parse error\n // https://www.w3.org/TR/css-syntax-3/#consume-declaration\n throw new Error(`Invalid style declaration in style block: '${styleBlock}'`);\n }\n\n break;\n\n default:\n throw new Error(`Unsupported style property character: '${tokenValue}' in style block: '${styleBlock}'`);\n }\n};\n/**\n * Handles token which is supposed to be a part of style **value**.\n *\n * @param context Style block parser context.\n * @param styleBlock Whole style block which is being parsed.\n * @param token Current token.\n *\n * @throws An error on invalid token.\n */\n\n\nconst processValueToken = (context, styleBlock, token) => {\n const {\n value: tokenValue\n } = token;\n\n if (token.type === TOKEN_TYPE.WORD) {\n // simply collect to buffer\n context.bufferValue += tokenValue;\n } else {\n // otherwise check the mark\n switch (tokenValue) {\n case COLON:\n // the ':' character inside of the value should be inside of quotes\n // otherwise the value is not valid\n // e.g. 'content: display: none'\n // parser is here ↑\n if (!isValueQuotesOpen(context)) {\n // eslint-disable-next-line max-len\n throw new Error(`Invalid style value for property '${context.bufferProperty}' in style block: '${styleBlock}'`);\n } // collect the colon inside quotes\n // e.g. 'content: \"test:123\"'\n // parser is here ↑\n\n\n context.bufferValue += tokenValue;\n break;\n\n case SEMICOLON:\n if (isValueQuotesOpen(context)) {\n // ';' inside quotes is part of style value\n // e.g. 'content: \"test;\"'\n context.bufferValue += tokenValue;\n } else {\n // otherwise the value is successfully collected\n // save parsed style\n collectStyle(context); // prepare for value collecting\n\n context.processing = DECLARATION_PART.PROPERTY;\n }\n\n break;\n\n case SINGLE_QUOTE:\n case DOUBLE_QUOTE:\n // if quotes are not open\n if (context.valueQuoteMark === null) {\n // save the opening quote mark for later comparison\n context.valueQuoteMark = tokenValue;\n } else if (!context.bufferValue.endsWith(BACKSLASH) // otherwise a quote appeared in the value earlier,\n // and non-escaped quote should be checked whether it is a closing quote\n && context.valueQuoteMark === tokenValue) {\n context.valueQuoteMark = null;\n } // always save the quote to the buffer\n // but after the context.bufferValue is checked for BACKSLASH above\n // e.g. 'content: \"test:123\"'\n // 'content: \"\\\"\"'\n\n\n context.bufferValue += tokenValue;\n break;\n\n case BACKSLASH:\n if (!isValueQuotesOpen(context)) {\n // eslint-disable-next-line max-len\n throw new Error(`Invalid style value for property '${context.bufferProperty}' in style block: '${styleBlock}'`);\n } // collect the backslash inside quotes\n // e.g. ' content: \"\\\"\" '\n // parser is here ↑\n\n\n context.bufferValue += tokenValue;\n break;\n\n case SPACE:\n case TAB:\n case CARRIAGE_RETURN:\n case LINE_FEED:\n case FORM_FEED:\n // whitespace should be collected only if the value collecting started\n // which means inside of the value\n // e.g. 'width: 100% !important'\n // parser is here ↑\n if (context.bufferValue.length > 0) {\n context.bufferValue += tokenValue;\n } // otherwise it can be omitted\n // e.g. 'width: 100% !important'\n // here ↑\n\n\n break;\n\n default:\n throw new Error(`Unknown style declaration token: '${tokenValue}'`);\n }\n }\n};\n/**\n * Parses css rule style block.\n *\n * @param rawStyleBlock Style block to parse.\n *\n * @returns Array of style declarations.\n * @throws An error on invalid style block.\n */\n\n\nconst parseStyleBlock = rawStyleBlock => {\n const styleBlock = rawStyleBlock.trim();\n const tokens = tokenizeStyleBlock(styleBlock);\n const context = {\n // style declaration parsing always starts with 'property'\n processing: DECLARATION_PART.PROPERTY,\n styles: [],\n bufferProperty: '',\n bufferValue: '',\n valueQuoteMark: null\n };\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n if (!token) {\n break;\n }\n\n if (context.processing === DECLARATION_PART.PROPERTY) {\n processPropertyToken(context, styleBlock, token);\n } else if (context.processing === DECLARATION_PART.VALUE) {\n processValueToken(context, styleBlock, token);\n } else {\n throw new Error('Style declaration parsing failed');\n }\n\n i += 1;\n } // unbalanced value quotes\n // e.g. 'content: \"test} '\n\n\n if (isValueQuotesOpen(context)) {\n throw new Error(`Unbalanced style declaration quotes in style block: '${styleBlock}'`);\n } // collected property and value have not been saved to styles;\n // it is possible for style block with no semicolon at the end\n // e.g. such style block: '{ display: none }'\n\n\n if (context.bufferProperty.length > 0) {\n if (context.bufferValue.length === 0) {\n // e.g. such style blocks:\n // '{ display: }'\n // '{ remove }'\n // eslint-disable-next-line max-len\n throw new Error(`Missing style value for property '${context.bufferProperty}' in style block '${styleBlock}'`);\n }\n\n collectStyle(context);\n } // rule with empty style block\n // e.g. 'div { }'\n\n\n if (context.styles.length === 0) {\n throw new Error(STYLE_ERROR_PREFIX.NO_STYLE);\n }\n\n return context.styles;\n};\n\n/**\n * Returns array of positions of `{` in `cssRule`.\n *\n * @param cssRule CSS rule.\n *\n * @returns Array of left curly bracket indexes.\n */\n\nconst getLeftCurlyBracketIndexes = cssRule => {\n const indexes = [];\n\n for (let i = 0; i < cssRule.length; i += 1) {\n if (cssRule[i] === BRACKET.CURLY.LEFT) {\n indexes.push(i);\n }\n }\n\n return indexes;\n}; // TODO: use `extCssDoc` for caching of style block parser results\n\n/**\n * Parses CSS rule into rules data object:\n * 1. Find the last `{` mark in the rule\n * which supposed to be a divider between selector and style block.\n * 2. Validates found string part before the `{` via selector parser; and if:\n * - parsing failed – get the previous `{` in the rule,\n * and validates a new rule part again [2];\n * - parsing successful — saves a found rule part as selector and parses the style block.\n *\n * @param rawCssRule Single CSS rule to parse.\n * @param extCssDoc ExtCssDocument which is used for selector ast caching.\n *\n * @returns Array of rules data which contains:\n * - selector as string;\n * - ast to query elements by;\n * - map of styles to apply.\n * @throws An error on invalid css rule syntax:\n * - unsupported CSS features – comments and at-rules\n * - invalid selector or style block.\n */\n\n\nconst parseRule = (rawCssRule, extCssDoc) => {\n var _rawRuleData$selector;\n\n const cssRule = rawCssRule.trim();\n\n if (cssRule.includes(`${SLASH}${ASTERISK}`) && cssRule.includes(`${ASTERISK}${SLASH}`)) {\n throw new Error(STYLE_ERROR_PREFIX.NO_COMMENT);\n }\n\n const leftCurlyBracketIndexes = getLeftCurlyBracketIndexes(cssRule); // rule with style block but no selector\n // e.g. '{ display: none; }'\n\n if (getFirst(leftCurlyBracketIndexes) === 0) {\n throw new Error(NO_SELECTOR_ERROR_PREFIX);\n }\n\n let selectorData; // if rule has `{` but there is no `}`\n\n if (leftCurlyBracketIndexes.length > 0 && !cssRule.includes(BRACKET.CURLY.RIGHT)) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_STYLE} OR ${STYLE_ERROR_PREFIX.UNCLOSED_STYLE}`);\n }\n\n if ( // if rule has no `{`\n leftCurlyBracketIndexes.length === 0 // or `}`\n || !cssRule.includes(BRACKET.CURLY.RIGHT)) {\n try {\n // the whole css rule considered as \"selector part\"\n // which may contain :remove() pseudo-class\n selectorData = parseSelectorRulePart(cssRule, extCssDoc);\n\n if (selectorData.success) {\n var _selectorData$stylesO;\n\n // rule with no style block has valid :remove() pseudo-class\n // which is parsed into \"styles\"\n // e.g. 'div:remove()'\n // but also it can be just selector with no styles\n // e.g. 'div'\n // which should not be considered as valid css rule\n if (((_selectorData$stylesO = selectorData.stylesOfSelector) === null || _selectorData$stylesO === void 0 ? void 0 : _selectorData$stylesO.length) === 0) {\n throw new Error(STYLE_ERROR_PREFIX.NO_STYLE_OR_REMOVE);\n }\n\n return {\n selector: selectorData.selector.trim(),\n ast: selectorData.ast,\n rawStyles: selectorData.stylesOfSelector\n };\n } else {\n // not valid selector\n throw new Error('Invalid selector');\n }\n } catch (e) {\n throw new Error(getErrorMessage(e));\n }\n }\n\n let selectorBuffer;\n let styleBlockBuffer;\n const rawRuleData = {\n selector: ''\n }; // css rule should be parsed from its end\n\n for (let i = leftCurlyBracketIndexes.length - 1; i > -1; i -= 1) {\n const index = leftCurlyBracketIndexes[i];\n\n if (!index) {\n throw new Error(`Impossible to continue, no '{' to process for rule: '${cssRule}'`);\n } // selector is before `{`, style block is after it\n\n\n selectorBuffer = cssRule.slice(0, index); // skip curly brackets\n\n styleBlockBuffer = cssRule.slice(index + 1, cssRule.length - 1);\n selectorData = parseSelectorRulePart(selectorBuffer, extCssDoc);\n\n if (selectorData.success) {\n var _rawRuleData$rawStyle;\n\n // selector successfully parsed\n rawRuleData.selector = selectorData.selector.trim();\n rawRuleData.ast = selectorData.ast;\n rawRuleData.rawStyles = selectorData.stylesOfSelector; // style block should be parsed\n // TODO: add cache for style block parsing\n\n const parsedStyles = parseStyleBlock(styleBlockBuffer);\n (_rawRuleData$rawStyle = rawRuleData.rawStyles) === null || _rawRuleData$rawStyle === void 0 ? void 0 : _rawRuleData$rawStyle.push(...parsedStyles); // stop rule parsing\n\n break;\n } else {\n // if selector was not parsed successfully\n // continue with next index of `{`\n continue;\n }\n }\n\n if (((_rawRuleData$selector = rawRuleData.selector) === null || _rawRuleData$selector === void 0 ? void 0 : _rawRuleData$selector.length) === 0) {\n // skip the rule as selector\n throw new Error('Selector in not valid');\n }\n\n return rawRuleData;\n};\n/**\n * Parses array of CSS rules into array of rules data objects.\n * Invalid rules are skipped and not applied,\n * and the errors are logged.\n *\n * @param rawCssRules Array of rules to parse.\n * @param extCssDoc Needed for selector ast caching.\n *\n * @returns Array of parsed valid rules data.\n */\n\nconst parseRules = (rawCssRules, extCssDoc) => {\n const rawResults = createRawResultsMap();\n const warnings = []; // trim all rules and find unique ones\n\n const uniqueRules = [...new Set(rawCssRules.map(r => r.trim()))];\n uniqueRules.forEach(rule => {\n try {\n saveToRawResults(rawResults, parseRule(rule, extCssDoc));\n } catch (e) {\n // skip the invalid rule\n const errorMessage = getErrorMessage(e);\n warnings.push(`'${rule}' - error: '${errorMessage}'`);\n }\n }); // log info about skipped invalid rules\n\n if (warnings.length > 0) {\n logger.info(`Invalid rules:\\n ${warnings.join('\\n ')}`);\n }\n\n return combineRulesData(rawResults);\n};\n\nconst REGEXP_DECLARATION_END = /[;}]/g;\nconst REGEXP_DECLARATION_DIVIDER = /[;:}]/g;\nconst REGEXP_NON_WHITESPACE = /\\S/g;\n/**\n * Interface for stylesheet parser context.\n */\n\n/**\n * Resets rule data buffer to init value after rule successfully collected.\n *\n * @param context Stylesheet parser context.\n */\nconst restoreRuleAcc = context => {\n context.rawRuleData = {\n selector: ''\n };\n};\n/**\n * Parses cropped selector part found before `{` previously.\n *\n * @param context Stylesheet parser context.\n * @param extCssDoc Needed for caching of selector ast.\n *\n * @returns Parsed validation data for cropped part of stylesheet which may be a selector.\n * @throws An error on unsupported CSS features, e.g. at-rules.\n */\n\n\nconst parseSelectorPart = (context, extCssDoc) => {\n let selector = context.selectorBuffer.trim();\n\n if (selector.startsWith(AT_RULE_MARKER)) {\n throw new Error(`${NO_AT_RULE_ERROR_PREFIX}: '${selector}'.`);\n }\n\n let removeSelectorData;\n\n try {\n removeSelectorData = parseRemoveSelector(selector);\n } catch (e) {\n logger.error(getErrorMessage(e));\n throw new Error(`${REMOVE_ERROR_PREFIX.INVALID_REMOVE}: '${selector}'`);\n }\n\n if (context.nextIndex === -1) {\n if (selector === removeSelectorData.selector) {\n // rule should have style or pseudo-class :remove()\n throw new Error(`${STYLE_ERROR_PREFIX.NO_STYLE_OR_REMOVE}: '${context.cssToParse}'`);\n } // stop parsing as there is no style declaration and selector parsed fine\n\n\n context.cssToParse = '';\n }\n\n let stylesOfSelector = [];\n let success = false;\n let ast;\n\n try {\n selector = removeSelectorData.selector;\n stylesOfSelector = removeSelectorData.stylesOfSelector; // validate found selector by parsing it to ast\n // so if it is invalid error will be thrown\n\n ast = extCssDoc.getSelectorAst(selector);\n success = true;\n } catch (e) {\n success = false;\n }\n\n if (context.nextIndex > 0) {\n // slice found valid selector part off\n // and parse rest of stylesheet later\n context.cssToParse = context.cssToParse.slice(context.nextIndex);\n }\n\n return {\n success,\n selector,\n ast,\n stylesOfSelector\n };\n};\n/**\n * Recursively parses style declaration string into `Style`s.\n *\n * @param context Stylesheet parser context.\n * @param styles Array of styles.\n *\n * @throws An error on invalid style declaration.\n * @returns A number index of the next `}` in `this.cssToParse`.\n */\n\n\nconst parseUntilClosingBracket = (context, styles) => {\n // Expects \":\", \";\", and \"}\".\n REGEXP_DECLARATION_DIVIDER.lastIndex = context.nextIndex;\n let match = REGEXP_DECLARATION_DIVIDER.exec(context.cssToParse);\n\n if (match === null) {\n throw new Error(`${STYLE_ERROR_PREFIX.INVALID_STYLE}: '${context.cssToParse}'`);\n }\n\n let matchPos = match.index;\n let matched = match[0];\n\n if (matched === BRACKET.CURLY.RIGHT) {\n const declarationChunk = context.cssToParse.slice(context.nextIndex, matchPos);\n\n if (declarationChunk.trim().length === 0) {\n // empty style declaration\n // e.g. 'div { }'\n if (styles.length === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_STYLE}: '${context.cssToParse}'`);\n } // else valid style parsed before it\n // e.g. '{ display: none; }' -- position is after ';'\n\n } else {\n // closing curly bracket '}' is matched before colon ':'\n // trimmed declarationChunk is not a space, between ';' and '}',\n // e.g. 'visible }' in style '{ display: none; visible }' after part before ';' is parsed\n throw new Error(`${STYLE_ERROR_PREFIX.INVALID_STYLE}: '${context.cssToParse}'`);\n }\n\n return matchPos;\n }\n\n if (matched === COLON) {\n const colonIndex = matchPos; // Expects \";\" and \"}\".\n\n REGEXP_DECLARATION_END.lastIndex = colonIndex;\n match = REGEXP_DECLARATION_END.exec(context.cssToParse);\n\n if (match === null) {\n throw new Error(`${STYLE_ERROR_PREFIX.UNCLOSED_STYLE}: '${context.cssToParse}'`);\n }\n\n matchPos = match.index;\n matched = match[0]; // Populates the `styleMap` key-value map.\n\n const property = context.cssToParse.slice(context.nextIndex, colonIndex).trim();\n\n if (property.length === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_PROPERTY}: '${context.cssToParse}'`);\n }\n\n const value = context.cssToParse.slice(colonIndex + 1, matchPos).trim();\n\n if (value.length === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_VALUE}: '${context.cssToParse}'`);\n }\n\n styles.push({\n property,\n value\n }); // finish style parsing if '}' is found\n // e.g. '{ display: none }' -- no ';' at the end of declaration\n\n if (matched === BRACKET.CURLY.RIGHT) {\n return matchPos;\n }\n } // matchPos is the position of the next ';'\n // crop 'cssToParse' and re-run the loop\n\n\n context.cssToParse = context.cssToParse.slice(matchPos + 1);\n context.nextIndex = 0;\n return parseUntilClosingBracket(context, styles); // Should be a subject of tail-call optimization.\n};\n/**\n * Parses next style declaration part in stylesheet.\n *\n * @param context Stylesheet parser context.\n *\n * @returns Array of style data objects.\n */\n\n\nconst parseNextStyle = context => {\n const styles = [];\n const styleEndPos = parseUntilClosingBracket(context, styles); // find next rule after the style declaration\n\n REGEXP_NON_WHITESPACE.lastIndex = styleEndPos + 1;\n const match = REGEXP_NON_WHITESPACE.exec(context.cssToParse);\n\n if (match === null) {\n context.cssToParse = '';\n return styles;\n }\n\n const matchPos = match.index; // cut out matched style declaration for previous selector\n\n context.cssToParse = context.cssToParse.slice(matchPos);\n return styles;\n};\n/**\n * Parses stylesheet of rules into rules data objects (non-recursively):\n * 1. Iterates through stylesheet string.\n * 2. Finds first `{` which can be style declaration start or part of selector.\n * 3. Validates found string part via selector parser; and if:\n * - it throws error — saves string part to buffer as part of selector,\n * slice next stylesheet part to `{` [2] and validates again [3];\n * - no error — saves found string part as selector and starts to parse styles (recursively).\n *\n * @param rawStylesheet Raw stylesheet as string.\n * @param extCssDoc ExtCssDocument which uses cache while selectors parsing.\n * @throws An error on unsupported CSS features, e.g. comments or invalid stylesheet syntax.\n * @returns Array of rules data which contains:\n * - selector as string;\n * - ast to query elements by;\n * - map of styles to apply.\n */\n\n\nconst parseStylesheet = (rawStylesheet, extCssDoc) => {\n const stylesheet = rawStylesheet.trim();\n\n if (stylesheet.includes(`${SLASH}${ASTERISK}`) && stylesheet.includes(`${ASTERISK}${SLASH}`)) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_COMMENT} in stylesheet: '${stylesheet}'`);\n }\n\n const context = {\n // any stylesheet should start with selector\n isSelector: true,\n // init value of parser position\n nextIndex: 0,\n // init value of cssToParse\n cssToParse: stylesheet,\n // buffer for collecting selector part\n selectorBuffer: '',\n // accumulator for rules\n rawRuleData: {\n selector: ''\n }\n };\n const rawResults = createRawResultsMap();\n let selectorData; // context.cssToParse is going to be cropped while its parsing\n\n while (context.cssToParse) {\n if (context.isSelector) {\n // find index of first opening curly bracket\n // which may mean start of style part and end of selector one\n context.nextIndex = context.cssToParse.indexOf(BRACKET.CURLY.LEFT); // rule should not start with style, selector is required\n // e.g. '{ display: none; }'\n\n if (context.selectorBuffer.length === 0 && context.nextIndex === 0) {\n throw new Error(`${STYLE_ERROR_PREFIX.NO_SELECTOR}: '${context.cssToParse}'`);\n }\n\n if (context.nextIndex === -1) {\n // no style declaration in rule\n // but rule still may contain :remove() pseudo-class\n context.selectorBuffer = context.cssToParse;\n } else {\n // collect string parts before opening curly bracket\n // until valid selector collected\n context.selectorBuffer += context.cssToParse.slice(0, context.nextIndex);\n }\n\n selectorData = parseSelectorPart(context, extCssDoc);\n\n if (selectorData.success) {\n // selector successfully parsed\n context.rawRuleData.selector = selectorData.selector.trim();\n context.rawRuleData.ast = selectorData.ast;\n context.rawRuleData.rawStyles = selectorData.stylesOfSelector;\n context.isSelector = false; // save rule data if there is no style declaration\n\n if (context.nextIndex === -1) {\n saveToRawResults(rawResults, context.rawRuleData); // clean up ruleContext\n\n restoreRuleAcc(context);\n } else {\n // skip the opening curly bracket at the start of style declaration part\n context.nextIndex = 1;\n context.selectorBuffer = '';\n }\n } else {\n // if selector was not successfully parsed parseSelectorPart(), continue stylesheet parsing:\n // save the found bracket to buffer and proceed to next loop iteration\n context.selectorBuffer += BRACKET.CURLY.LEFT; // delete `{` from cssToParse\n\n context.cssToParse = context.cssToParse.slice(1);\n }\n } else {\n var _context$rawRuleData$;\n\n // style declaration should be parsed\n const parsedStyles = parseNextStyle(context); // styles can be parsed from selector part if it has :remove() pseudo-class\n // e.g. '.banner:remove() { debug: true; }'\n\n (_context$rawRuleData$ = context.rawRuleData.rawStyles) === null || _context$rawRuleData$ === void 0 ? void 0 : _context$rawRuleData$.push(...parsedStyles); // save rule data to results\n\n saveToRawResults(rawResults, context.rawRuleData);\n context.nextIndex = 0; // clean up ruleContext\n\n restoreRuleAcc(context); // parse next rule selector after style successfully parsed\n\n context.isSelector = true;\n }\n }\n\n return combineRulesData(rawResults);\n};\n\n/**\n * Checks whether passed `arg` is number type.\n *\n * @param arg Value to check.\n *\n * @returns True if `arg` is number and not NaN.\n */\nconst isNumber = arg => {\n return typeof arg === 'number' && !Number.isNaN(arg);\n};\n\n/**\n * The purpose of ThrottleWrapper is to throttle calls of the function\n * that applies ExtendedCss rules. The reasoning here is that the function calls\n * are triggered by MutationObserver and there may be many mutations in a short period of time.\n * We do not want to apply rules on every mutation so we use this helper to make sure\n * that there is only one call in the given amount of time.\n */\n\nclass ThrottleWrapper {\n /**\n * Creates new ThrottleWrapper.\n * The {@link callback} should be executed not more often than {@link ThrottleWrapper.THROTTLE_DELAY_MS}.\n *\n * @param callback The callback.\n */\n constructor(callback) {\n this.callback = callback;\n this.executeCallback = this.executeCallback.bind(this);\n }\n /**\n * Calls the {@link callback} function and update bounded throttle wrapper properties.\n */\n\n\n executeCallback() {\n this.lastRunTime = performance.now();\n\n if (isNumber(this.timerId)) {\n clearTimeout(this.timerId);\n delete this.timerId;\n }\n\n this.callback();\n }\n /**\n * Schedules the {@link executeCallback} function execution via setTimeout.\n * It may triggered by MutationObserver job which may occur too ofter, so we limit the function execution:\n *\n * 1. If {@link timerId} is set, ignore the call, because the function is already scheduled to be executed;\n *\n * 2. If {@link lastRunTime} is set, we need to check the time elapsed time since the last call. If it is\n * less than {@link ThrottleWrapper.THROTTLE_DELAY_MS}, we schedule the function execution after the remaining time.\n * \n * Otherwise, we execute the function asynchronously to ensure that it is executed \n * in the correct order with respect to DOM events, by deferring its execution until after \n * those tasks have completed.\n */\n\n\n run() {\n if (isNumber(this.timerId)) {\n // there is a pending execution scheduled\n return;\n }\n\n if (isNumber(this.lastRunTime)) {\n const elapsedTime = performance.now() - this.lastRunTime;\n\n if (elapsedTime < ThrottleWrapper.THROTTLE_DELAY_MS) {\n this.timerId = window.setTimeout(this.executeCallback, ThrottleWrapper.THROTTLE_DELAY_MS - elapsedTime);\n return;\n }\n }\n /**\n * We use `setTimeout` instead `requestAnimationFrame`\n * here because requestAnimationFrame can be delayed for a long time\n * when the browser saves battery or the engine is heavily loaded.\n */\n\n\n this.timerId = window.setTimeout(this.executeCallback);\n }\n\n}\n\n_defineProperty(ThrottleWrapper, \"THROTTLE_DELAY_MS\", 150);\n\nconst LAST_EVENT_TIMEOUT_MS = 10;\nconst IGNORED_EVENTS = ['mouseover', 'mouseleave', 'mouseenter', 'mouseout'];\nconst SUPPORTED_EVENTS = [// keyboard events\n'keydown', 'keypress', 'keyup', // mouse events\n'auxclick', 'click', 'contextmenu', 'dblclick', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseover', 'mouseout', 'mouseup', 'pointerlockchange', 'pointerlockerror', 'select', 'wheel']; // 'wheel' event makes scrolling in Safari twitchy\n// https://github.com/AdguardTeam/ExtendedCss/issues/120\n\nconst SAFARI_PROBLEMATIC_EVENTS = ['wheel'];\n/**\n * We use EventTracker to track the event that is likely to cause the mutation.\n * The problem is that we cannot use `window.event` directly from the mutation observer call\n * as we're not in the event handler context anymore.\n */\n\nclass EventTracker {\n /**\n * Creates new EventTracker.\n */\n constructor() {\n _defineProperty(this, \"getLastEventType\", () => this.lastEventType);\n\n _defineProperty(this, \"getTimeSinceLastEvent\", () => {\n if (!this.lastEventTime) {\n return null;\n }\n\n return Date.now() - this.lastEventTime;\n });\n\n this.trackedEvents = isSafariBrowser ? SUPPORTED_EVENTS.filter(event => !SAFARI_PROBLEMATIC_EVENTS.includes(event)) : SUPPORTED_EVENTS;\n this.trackedEvents.forEach(eventName => {\n document.documentElement.addEventListener(eventName, this.trackEvent, true);\n });\n }\n /**\n * Callback for event listener for events tracking.\n *\n * @param event Any event.\n */\n\n\n trackEvent(event) {\n this.lastEventType = event.type;\n this.lastEventTime = Date.now();\n }\n\n /**\n * Checks whether the last caught event should be ignored.\n *\n * @returns True if event should be ignored.\n */\n isIgnoredEventType() {\n const lastEventType = this.getLastEventType();\n const sinceLastEventTime = this.getTimeSinceLastEvent();\n return !!lastEventType && IGNORED_EVENTS.includes(lastEventType) && !!sinceLastEventTime && sinceLastEventTime < LAST_EVENT_TIMEOUT_MS;\n }\n /**\n * Stops event tracking by removing event listener.\n */\n\n\n stopTracking() {\n this.trackedEvents.forEach(eventName => {\n document.documentElement.removeEventListener(eventName, this.trackEvent, true);\n });\n }\n\n}\n\n/**\n * We are trying to limit the number of callback calls by not calling it on all kind of \"hover\" events.\n * The rationale behind this is that \"hover\" events often cause attributes modification,\n * but re-applying extCSS rules will be useless as these attribute changes are usually transient.\n *\n * @param mutations DOM elements mutation records.\n * @returns True if all mutations are about attributes changes, otherwise false.\n */\n\nfunction shouldIgnoreMutations(mutations) {\n // ignore if all mutations are about attributes changes\n return !mutations.some(m => m.type !== 'attributes');\n}\n/**\n * Adds new {@link context.domMutationObserver} instance and connect it to document.\n * \n * @param context ExtendedCss context.\n */\n\n\nfunction observeDocument(context) {\n if (context.isDomObserved) {\n return;\n } // enable dynamically added elements handling\n\n\n context.isDomObserved = true;\n context.domMutationObserver = new natives.MutationObserver(mutations => {\n if (!mutations || mutations.length === 0) {\n return;\n }\n\n const eventTracker = new EventTracker();\n\n if (eventTracker.isIgnoredEventType() && shouldIgnoreMutations(mutations)) {\n return;\n } // save instance of EventTracker to context\n // for removing its event listeners on disconnectDocument() while mainDisconnect()\n\n\n context.eventTracker = eventTracker;\n context.scheduler.run();\n });\n context.domMutationObserver.observe(document, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['id', 'class']\n });\n}\n/**\n * Disconnect from {@link context.domMutationObserver}.\n * \n * @param context ExtendedCss context.\n */\n\nfunction disconnectDocument(context) {\n if (!context.isDomObserved) {\n return;\n } // disable dynamically added elements handling\n\n\n context.isDomObserved = false;\n\n if (context.domMutationObserver) {\n context.domMutationObserver.disconnect();\n } // clean up event listeners\n\n\n if (context.eventTracker) {\n context.eventTracker.stopTracking();\n }\n}\n\nconst CONTENT_ATTR_PREFIX_REGEXP = /^(\"|')adguard.+?/;\n/**\n * Removes affectedElement.node from DOM.\n *\n * @param context ExtendedCss context.\n * @param affectedElement Affected element.\n */\n\nconst removeElement = (context, affectedElement) => {\n const {\n node\n } = affectedElement;\n affectedElement.removed = true;\n const elementSelector = getElementSelectorPath(node); // check if the element has been already removed earlier\n\n const elementRemovalsCounter = context.removalsStatistic[elementSelector] || 0; // if removals attempts happened more than specified we do not try to remove node again\n\n if (elementRemovalsCounter > MAX_STYLE_PROTECTION_COUNT) {\n logger.error(`ExtendedCss: infinite loop protection for selector: '${elementSelector}'`);\n return;\n }\n\n if (node.parentElement) {\n node.parentElement.removeChild(node);\n context.removalsStatistic[elementSelector] = elementRemovalsCounter + 1;\n }\n};\n/**\n * Sets style to the specified DOM node.\n *\n * @param node DOM element.\n * @param style Style to set.\n */\n\n\nconst setStyleToElement = (node, style) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n Object.keys(style).forEach(prop => {\n // Apply this style only to existing properties\n // We cannot use hasOwnProperty here (does not work in FF)\n if (typeof node.style.getPropertyValue(prop.toString()) !== 'undefined') {\n let value = style[prop];\n\n if (!value) {\n return;\n } // do not apply 'content' style given by tsurlfilter\n // which is needed only for BeforeStyleAppliedCallback\n\n\n if (prop === CONTENT_CSS_PROPERTY && value.match(CONTENT_ATTR_PREFIX_REGEXP)) {\n return;\n } // First we should remove !important attribute (or it won't be applied')\n\n\n value = removeSuffix(value.trim(), '!important').trim();\n node.style.setProperty(prop, value, 'important');\n }\n });\n};\n/**\n * Checks the required properties of `affectedElement`\n * **before** `beforeStyleApplied()` execution.\n *\n * @param affectedElement Affected element.\n *\n * @returns False if there is no `node` or `rules`\n * or `rules` is not an array.\n */\n\nconst isIAffectedElement = affectedElement => {\n return 'node' in affectedElement && 'rules' in affectedElement && affectedElement.rules instanceof Array;\n};\n/**\n * Checks the required properties of `affectedElement`\n * **after** `beforeStyleApplied()` execution.\n * These properties are needed for proper internal usage.\n *\n * @param affectedElement Affected element.\n *\n * @returns False if there is no `node` or `rules`\n * or `rules` is not an array.\n */\n\n\nconst isAffectedElement = affectedElement => {\n return 'node' in affectedElement && 'originalStyle' in affectedElement && 'rules' in affectedElement && affectedElement.rules instanceof Array;\n};\n/**\n * Applies style to the specified DOM node.\n *\n * @param context ExtendedCss context.\n * @param rawAffectedElement Object containing DOM node and rule to be applied.\n *\n * @throws An error if affectedElement has no style to apply.\n */\n\n\nconst applyStyle = (context, rawAffectedElement) => {\n if (rawAffectedElement.protectionObserver) {\n // style is already applied and protected by the observer\n return;\n }\n\n let affectedElement;\n\n if (context.beforeStyleApplied) {\n if (!isIAffectedElement(rawAffectedElement)) {\n throw new Error(\"Returned IAffectedElement should have 'node' and 'rules' properties\");\n }\n\n affectedElement = context.beforeStyleApplied(rawAffectedElement);\n\n if (!affectedElement) {\n throw new Error(\"Callback 'beforeStyleApplied' should return IAffectedElement\");\n }\n } else {\n affectedElement = rawAffectedElement;\n }\n\n if (!isAffectedElement(affectedElement)) {\n throw new Error(\"Returned IAffectedElement should have 'node' and 'rules' properties\");\n }\n\n const {\n node,\n rules\n } = affectedElement;\n\n for (let i = 0; i < rules.length; i += 1) {\n const rule = rules[i];\n const selector = rule === null || rule === void 0 ? void 0 : rule.selector;\n const style = rule === null || rule === void 0 ? void 0 : rule.style;\n const debug = rule === null || rule === void 0 ? void 0 : rule.debug; // rule may not have style to apply\n // e.g. 'div:has(> a) { debug: true }' -> means no style to apply, and enable debug mode\n\n if (style) {\n if (style[REMOVE_PSEUDO_MARKER] === PSEUDO_PROPERTY_POSITIVE_VALUE) {\n removeElement(context, affectedElement);\n return;\n }\n\n setStyleToElement(node, style);\n } else if (!debug) {\n // but rule should not have both style and debug properties\n throw new Error(`No style declaration in rule for selector: '${selector}'`);\n }\n }\n};\n/**\n * Reverts style for the affected object.\n *\n * @param affectedElement Affected element.\n */\n\nconst revertStyle = affectedElement => {\n if (affectedElement.protectionObserver) {\n affectedElement.protectionObserver.disconnect();\n }\n\n affectedElement.node.style.cssText = affectedElement.originalStyle;\n};\n\n/**\n * ExtMutationObserver is a wrapper over regular MutationObserver with one additional function:\n * it keeps track of the number of times we called the \"ProtectionCallback\".\n *\n * We use an instance of this to monitor styles added by ExtendedCss\n * and to make sure these styles are recovered if the page script attempts to modify them.\n *\n * However, we want to avoid endless loops of modification if the page script repeatedly modifies the styles.\n * So we keep track of the number of calls and observe() makes a decision\n * whether to continue recovering the styles or not.\n */\n\nclass ExtMutationObserver {\n /**\n * Extra property for keeping 'style fix counts'.\n */\n\n /**\n * Creates new ExtMutationObserver.\n *\n * @param protectionCallback Callback which execution should be counted.\n */\n constructor(protectionCallback) {\n this.styleProtectionCount = 0;\n this.observer = new natives.MutationObserver(mutations => {\n if (!mutations.length) {\n return;\n }\n\n this.styleProtectionCount += 1;\n protectionCallback(mutations, this);\n });\n }\n /**\n * Starts to observe target element,\n * prevents infinite loop of observing due to the limited number of times of callback runs.\n *\n * @param target Target to observe.\n * @param options Mutation observer options.\n */\n\n\n observe(target, options) {\n if (this.styleProtectionCount < MAX_STYLE_PROTECTION_COUNT) {\n this.observer.observe(target, options);\n } else {\n logger.error('ExtendedCss: infinite loop protection for style');\n }\n }\n /**\n * Stops ExtMutationObserver from observing any mutations.\n * Until the `observe()` is used again, `protectionCallback` will not be invoked.\n */\n\n\n disconnect() {\n this.observer.disconnect();\n }\n\n}\n\nconst PROTECTION_OBSERVER_OPTIONS = {\n attributes: true,\n attributeOldValue: true,\n attributeFilter: ['style']\n};\n/**\n * Creates MutationObserver protection callback.\n *\n * @param styles Styles data object.\n *\n * @returns Callback for styles protection.\n */\n\nconst createProtectionCallback = styles => {\n const protectionCallback = (mutations, extObserver) => {\n if (!mutations[0]) {\n return;\n }\n\n const {\n target\n } = mutations[0];\n extObserver.disconnect();\n styles.forEach(style => {\n setStyleToElement(target, style);\n });\n extObserver.observe(target, PROTECTION_OBSERVER_OPTIONS);\n };\n\n return protectionCallback;\n};\n/**\n * Sets up a MutationObserver which protects style attributes from changes.\n *\n * @param node DOM node.\n * @param rules Rule data objects.\n * @returns Mutation observer used to protect attribute or null if there's nothing to protect.\n */\n\n\nconst protectStyleAttribute = (node, rules) => {\n if (!natives.MutationObserver) {\n return null;\n }\n\n const styles = [];\n rules.forEach(ruleData => {\n const {\n style\n } = ruleData; // some rules might have only debug property in style declaration\n // e.g. 'div:has(> a) { debug: true }' -> parsed to boolean `ruleData.debug`\n // so no style is fine, and here we should collect only valid styles to protect\n\n if (style) {\n styles.push(style);\n }\n });\n const protectionObserver = new ExtMutationObserver(createProtectionCallback(styles));\n protectionObserver.observe(node, PROTECTION_OBSERVER_OPTIONS);\n return protectionObserver;\n};\n\nconst STATS_DECIMAL_DIGITS_COUNT = 4;\n\n/**\n * A helper class for applied rule stats.\n */\nclass TimingStats {\n /**\n * Creates new TimingStats.\n */\n constructor() {\n this.appliesTimings = [];\n this.appliesCount = 0;\n this.timingsSum = 0;\n this.meanTiming = 0;\n this.squaredSum = 0;\n this.standardDeviation = 0;\n }\n /**\n * Observe target element and mark observer as active.\n *\n * @param elapsedTimeMs Time in ms.\n */\n\n\n push(elapsedTimeMs) {\n this.appliesTimings.push(elapsedTimeMs);\n this.appliesCount += 1;\n this.timingsSum += elapsedTimeMs;\n this.meanTiming = this.timingsSum / this.appliesCount;\n this.squaredSum += elapsedTimeMs * elapsedTimeMs;\n this.standardDeviation = Math.sqrt(this.squaredSum / this.appliesCount - Math.pow(this.meanTiming, 2));\n }\n\n}\n\n/**\n * Makes the timestamps more readable.\n *\n * @param timestamp Raw timestamp.\n *\n * @returns Fine-looking timestamps.\n */\nconst beautifyTimingNumber = timestamp => {\n return Number(timestamp.toFixed(STATS_DECIMAL_DIGITS_COUNT));\n};\n/**\n * Improves timing stats readability.\n *\n * @param rawTimings Collected timings with raw timestamp.\n *\n * @returns Fine-looking timing stats.\n */\n\n\nconst beautifyTimings = rawTimings => {\n return {\n appliesTimings: rawTimings.appliesTimings.map(t => beautifyTimingNumber(t)),\n appliesCount: beautifyTimingNumber(rawTimings.appliesCount),\n timingsSum: beautifyTimingNumber(rawTimings.timingsSum),\n meanTiming: beautifyTimingNumber(rawTimings.meanTiming),\n standardDeviation: beautifyTimingNumber(rawTimings.standardDeviation)\n };\n};\n/**\n * Prints timing information if debugging mode is enabled.\n *\n * @param context ExtendedCss context.\n */\n\n\nconst printTimingInfo = context => {\n if (context.areTimingsPrinted) {\n return;\n }\n\n context.areTimingsPrinted = true;\n const timingsLogData = {};\n context.parsedRules.forEach(ruleData => {\n if (ruleData.timingStats) {\n const {\n selector,\n style,\n debug,\n matchedElements\n } = ruleData; // style declaration for some rules is parsed to debug property and no style to apply\n // e.g. 'div:has(> a) { debug: true }'\n\n if (!style && !debug) {\n throw new Error(`Rule should have style declaration for selector: '${selector}'`);\n }\n\n const selectorData = {\n selectorParsed: selector,\n timings: beautifyTimings(ruleData.timingStats)\n }; // `ruleData.style` may contain `remove` pseudo-property\n // and make logs look better\n\n if (style && style[REMOVE_PSEUDO_MARKER] === PSEUDO_PROPERTY_POSITIVE_VALUE) {\n selectorData.removed = true; // no matchedElements for such case as they are removed after ExtendedCss applied\n } else {\n selectorData.styleApplied = style || null;\n selectorData.matchedElements = matchedElements;\n }\n\n timingsLogData[selector] = selectorData;\n }\n });\n\n if (Object.keys(timingsLogData).length === 0) {\n return;\n } // add location.href to the message to distinguish frames\n\n\n logger.info('[ExtendedCss] Timings in milliseconds for %o:\\n%o', window.location.href, timingsLogData);\n};\n\n/**\n * Finds affectedElement object for the specified DOM node.\n *\n * @param affElements Array of affected elements — context.affectedElements.\n * @param domNode DOM node.\n * @returns Found affectedElement or undefined.\n */\n\nconst findAffectedElement = (affElements, domNode) => {\n return affElements.find(affEl => affEl.node === domNode);\n};\n/**\n * Applies specified rule and returns list of elements affected.\n *\n * @param context ExtendedCss context.\n * @param ruleData Rule to apply.\n * @returns List of elements affected by the rule.\n */\n\n\nconst applyRule = (context, ruleData) => {\n // debugging mode can be enabled in two ways:\n // 1. for separate rules - by `{ debug: true; }`\n // 2. for all rules simultaneously by:\n // - `{ debug: global; }` in any rule\n // - positive `debug` property in ExtCssConfiguration\n const isDebuggingMode = !!ruleData.debug || context.debug;\n let startTime;\n\n if (isDebuggingMode) {\n startTime = performance.now();\n }\n\n const {\n ast\n } = ruleData;\n const nodes = []; // selector can be successfully parser into ast with no error\n // but its applying by native Document.querySelectorAll() still may throw an error\n // e.g. 'div[..banner]'\n\n try {\n nodes.push(...selectElementsByAst(ast));\n } catch (e) {\n // log the error only in debug mode\n if (context.debug) {\n logger.error(getErrorMessage(e));\n }\n }\n\n nodes.forEach(node => {\n let affectedElement = findAffectedElement(context.affectedElements, node);\n\n if (affectedElement) {\n affectedElement.rules.push(ruleData);\n applyStyle(context, affectedElement);\n } else {\n // Applying style first time\n const originalStyle = node.style.cssText;\n affectedElement = {\n node,\n // affected DOM node\n rules: [ruleData],\n // rule to be applied\n originalStyle,\n // original node style\n protectionObserver: null // style attribute observer\n\n };\n applyStyle(context, affectedElement);\n context.affectedElements.push(affectedElement);\n }\n });\n\n if (isDebuggingMode && startTime) {\n const elapsedTimeMs = performance.now() - startTime;\n\n if (!ruleData.timingStats) {\n ruleData.timingStats = new TimingStats();\n }\n\n ruleData.timingStats.push(elapsedTimeMs);\n }\n\n return nodes;\n};\n/**\n * Applies filtering rules.\n *\n * @param context ExtendedCss context.\n */\n\n\nconst applyRules = context => {\n const newSelectedElements = []; // some rules could make call - selector.querySelectorAll() temporarily to change node id attribute\n // this caused MutationObserver to call recursively\n // https://github.com/AdguardTeam/ExtendedCss/issues/81\n\n disconnectDocument(context);\n context.parsedRules.forEach(ruleData => {\n const nodes = applyRule(context, ruleData);\n Array.prototype.push.apply(newSelectedElements, nodes); // save matched elements to ruleData as linked to applied rule\n // only for debugging purposes\n\n if (ruleData.debug) {\n ruleData.matchedElements = nodes;\n }\n }); // Now revert styles for elements which are no more affected\n\n let affLength = context.affectedElements.length; // do nothing if there is no elements to process\n\n while (affLength) {\n const affectedElement = context.affectedElements[affLength - 1];\n\n if (!affectedElement) {\n break;\n }\n\n if (!newSelectedElements.includes(affectedElement.node)) {\n // Time to revert style\n revertStyle(affectedElement);\n context.affectedElements.splice(affLength - 1, 1);\n } else if (!affectedElement.removed) {\n // Add style protection observer\n // Protect \"style\" attribute from changes\n if (!affectedElement.protectionObserver) {\n affectedElement.protectionObserver = protectStyleAttribute(affectedElement.node, affectedElement.rules);\n }\n }\n\n affLength -= 1;\n } // After styles are applied we can start observe again\n\n\n observeDocument(context);\n printTimingInfo(context);\n};\n\n/**\n * Result of selector validation.\n */\n\n/**\n * Main class of ExtendedCss lib.\n *\n * Parses css stylesheet with any selectors (passed to its argument as styleSheet),\n * and guarantee its applying as mutation observer is used to prevent the restyling of needed elements by other scripts.\n * This style protection is limited to 50 times to avoid infinite loop (MAX_STYLE_PROTECTION_COUNT).\n * Our own ThrottleWrapper is used for styles applying to avoid too often lib reactions on page mutations.\n *\n * Constructor creates the instance of class which should be run be `apply()` method to apply the rules,\n * and the applying can be stopped by `dispose()`.\n *\n * Can be used to select page elements by selector with `query()` method (similar to `Document.querySelectorAll()`),\n * which does not require instance creating.\n */\nclass ExtendedCss {\n /**\n * Creates new ExtendedCss.\n *\n * @param configuration ExtendedCss configuration.\n */\n constructor(configuration) {\n if (!configuration) {\n throw new Error('ExtendedCss configuration should be provided.');\n }\n\n this.applyRulesCallbackListener = this.applyRulesCallbackListener.bind(this);\n this.context = {\n beforeStyleApplied: configuration.beforeStyleApplied,\n debug: false,\n affectedElements: [],\n isDomObserved: false,\n removalsStatistic: {},\n parsedRules: [],\n scheduler: new ThrottleWrapper(this.applyRulesCallbackListener)\n }; // TODO: throw an error instead of logging and handle it in related products.\n\n if (!isBrowserSupported()) {\n logger.error('Browser is not supported by ExtendedCss');\n return;\n } // at least 'styleSheet' or 'cssRules' should be provided\n\n\n if (!configuration.styleSheet && !configuration.cssRules) {\n throw new Error(\"ExtendedCss configuration should have 'styleSheet' or 'cssRules' defined.\");\n } // 'styleSheet' and 'cssRules' are optional\n // and both can be provided at the same time\n // so both should be parsed and applied in such case\n\n\n if (configuration.styleSheet) {\n // stylesheet parsing can fail on some invalid selectors\n try {\n this.context.parsedRules.push(...parseStylesheet(configuration.styleSheet, extCssDocument));\n } catch (e) {\n // eslint-disable-next-line max-len\n throw new Error(`Pass the rules as configuration.cssRules since configuration.styleSheet cannot be parsed because of: '${getErrorMessage(e)}'`);\n }\n }\n\n if (configuration.cssRules) {\n this.context.parsedRules.push(...parseRules(configuration.cssRules, extCssDocument));\n } // true if set in configuration\n // or any rule in styleSheet has `debug: global`\n\n\n this.context.debug = configuration.debug || this.context.parsedRules.some(ruleData => {\n return ruleData.debug === DEBUG_PSEUDO_PROPERTY_GLOBAL_VALUE;\n });\n\n if (this.context.beforeStyleApplied && typeof this.context.beforeStyleApplied !== 'function') {\n // eslint-disable-next-line max-len\n throw new Error(`Invalid configuration. Type of 'beforeStyleApplied' should be a function, received: '${typeof this.context.beforeStyleApplied}'`);\n }\n }\n /**\n * Invokes {@link applyRules} function with current app context.\n * \n * This method is bound to the class instance in the constructor because it is called\n * in {@link ThrottleWrapper} and on the DOMContentLoaded event.\n */\n\n\n applyRulesCallbackListener() {\n applyRules(this.context);\n }\n /**\n * Initializes ExtendedCss.\n *\n * Should be executed on page ASAP,\n * otherwise the :contains() pseudo-class may work incorrectly.\n */\n\n\n init() {\n /**\n * Native Node textContent getter must be intercepted as soon as possible,\n * and stored as it is needed for proper work of :contains() pseudo-class\n * because DOM Node prototype 'textContent' property may be mocked.\n *\n * @see {@link https://github.com/AdguardTeam/ExtendedCss/issues/127}\n */\n nativeTextContent.setGetter();\n }\n /**\n * Applies stylesheet rules on page.\n */\n\n\n apply() {\n applyRules(this.context);\n\n if (document.readyState !== 'complete') {\n document.addEventListener('DOMContentLoaded', this.applyRulesCallbackListener, false);\n }\n }\n /**\n * Disposes ExtendedCss and removes our styles from matched elements.\n */\n\n\n dispose() {\n disconnectDocument(this.context);\n this.context.affectedElements.forEach(el => {\n revertStyle(el);\n });\n document.removeEventListener('DOMContentLoaded', this.applyRulesCallbackListener, false);\n }\n /**\n * Exposed for testing purposes only.\n *\n * @returns Array of AffectedElement data objects.\n */\n\n\n getAffectedElements() {\n return this.context.affectedElements;\n }\n /**\n * Returns a list of the document's elements that match the specified selector.\n * Uses ExtCssDocument.querySelectorAll().\n *\n * @param selector Selector text.\n * @param [noTiming=true] If true — do not print the timings to the console.\n *\n * @throws An error if selector is not valid.\n * @returns A list of elements that match the selector.\n */\n\n\n static query(selector) {\n let noTiming = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (typeof selector !== 'string') {\n throw new Error('Selector should be defined as a string.');\n }\n\n const start = performance.now();\n\n try {\n return extCssDocument.querySelectorAll(selector);\n } finally {\n const end = performance.now();\n\n if (!noTiming) {\n logger.info(`[ExtendedCss] Elapsed: ${Math.round((end - start) * 1000)} μs.`);\n }\n }\n }\n /**\n * Validates selector.\n *\n * @param inputSelector Selector text to validate.\n *\n * @returns Result of selector validation.\n */\n\n\n static validate(inputSelector) {\n try {\n // ExtendedCss in general supports :remove() in selector\n // but ExtendedCss.query() does not support it as it should be parsed by stylesheet parser.\n // so for validation we have to handle selectors with `:remove()` in it\n const {\n selector\n } = parseRemoveSelector(inputSelector);\n ExtendedCss.query(selector);\n return {\n ok: true,\n error: null\n };\n } catch (e) {\n // not valid input `selector` should be logged eventually\n const error = `Error: Invalid selector: '${inputSelector}' -- ${getErrorMessage(e)}`;\n return {\n ok: false,\n error\n };\n }\n }\n\n}\n\nexport { ExtendedCss };\n","import browser from 'webextension-polyfill';\nimport { ExtendedCss } from '@adguard/extended-css';\n\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\n/**\n * @file\n * This file contains constants for communication between background and content scripts.\n * This constants are separated from message.ts to reduce bundle size,\n * because rollup cannot tree-shake tswebextension library code.\n */\n/**\n * Name of the message handler.\n * It is needed for determining specific tswebextension message from other messages.\n */\nconst MESSAGE_HANDLER_NAME = 'tsWebExtension';\n/**\n * Message types for communication between background and content scripts.\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"ProcessShouldCollapse\"] = \"processShouldCollapse\";\n MessageType[\"GetCosmeticData\"] = \"getCosmeticData\";\n MessageType[\"GetCss\"] = \"getCss\";\n MessageType[\"GetCookieRules\"] = \"getCookieRules\";\n MessageType[\"SaveCookieLogEvent\"] = \"saveCookieLogEvent\";\n MessageType[\"InitAssistant\"] = \"initAssistant\";\n MessageType[\"CloseAssistant\"] = \"closeAssistant\";\n MessageType[\"AssistantCreateRule\"] = \"assistantCreateRule\";\n MessageType[\"SaveCssHitsStats\"] = \"saveCssHitsStats\";\n})(MessageType || (MessageType = {}));\n\n// TODO check if we can return typed message here\n/**\n * Sends message to the background page.\n *\n * @param message Message to send.\n * @param message.payload Payload of the message.\n * @param message.type Message type.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst sendAppMessage = (message) => __awaiter(void 0, void 0, void 0, function* () {\n return browser.runtime.sendMessage(Object.assign({ handlerName: MESSAGE_HANDLER_NAME }, message));\n});\n\n/**\n * This class applies cookie rules in page context.\n *\n * - Removes cookies matching rules\n * - Listens to new cookies, then tries to apply rules to them.\n */\nclass CookieController {\n /**\n * Constructor.\n *\n * @param callback On rule applied callback.\n */\n constructor(callback) {\n /**\n * Default cookie polling interval.\n */\n this.DEFAULT_COOKIE_POLLING_INTERVAL_MS = 1000;\n /**\n * Is current context third-party.\n */\n this.isThirdPartyContext = false;\n this.onRuleAppliedCallback = callback;\n this.isThirdPartyContext = this.isThirdPartyFrame();\n }\n /**\n * Applies rules.\n *\n * @param rules Rules to apply.\n */\n apply(rules) {\n this.applyRules(rules);\n let lastCookie = document.cookie;\n this.listenCookieChange((oldValue, newValue) => {\n if (newValue === lastCookie) {\n // Skip changes made by this class\n return;\n }\n this.applyRules(rules);\n lastCookie = document.cookie;\n });\n window.addEventListener('beforeunload', () => {\n this.applyRules(rules);\n });\n }\n /**\n * Polling document cookie.\n *\n * @param callback Callback to be called periodically.\n * @param interval Polling interval.\n */\n listenCookieChange(callback, interval = this.DEFAULT_COOKIE_POLLING_INTERVAL_MS) {\n let lastCookie = document.cookie;\n setInterval(() => {\n const { cookie } = document;\n if (cookie !== lastCookie) {\n try {\n callback(lastCookie, cookie);\n }\n finally {\n lastCookie = cookie;\n }\n }\n }, interval);\n }\n /**\n * Checks if current context is third-party.\n *\n * @returns True if current context is third-party.\n */\n // eslint-disable-next-line class-methods-use-this\n isThirdPartyFrame() {\n try {\n return window.self !== window.top && document.location.hostname !== window.parent.location.hostname;\n }\n catch (e) {\n return true;\n }\n }\n /**\n * Applies rules to document cookies.\n *\n * @param rules Rules to apply.\n *\n * Inspired by remove-cookie scriptlet.\n * @see {@link https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/remove-cookie.js}\n */\n applyRules(rules) {\n document.cookie.split(';').forEach((cookieStr) => {\n const pos = cookieStr.indexOf('=');\n if (pos === -1) {\n return;\n }\n const cookieName = cookieStr.slice(0, pos).trim();\n const cookieValue = cookieStr.slice(pos + 1).trim();\n const matchingRules = rules.filter((r) => {\n if (this.isThirdPartyContext !== r.isThirdParty) {\n return false;\n }\n const regex = r.match ? CookieController.toRegExp(r.match) : CookieController.toRegExp('/.?/');\n return regex.test(cookieName);\n });\n const importantRules = matchingRules.filter((r) => r.ruleText.includes('important'));\n if (importantRules.length > 0) {\n importantRules.forEach((rule) => {\n this.applyRule(rule, cookieName, cookieValue);\n });\n }\n else {\n const allowlistRules = matchingRules.filter((r) => r.isAllowlist);\n if (allowlistRules.length > 0) {\n allowlistRules.forEach((rule) => {\n this.applyRule(rule, cookieName, cookieValue);\n });\n }\n else {\n matchingRules.forEach((rule) => {\n this.applyRule(rule, cookieName, cookieValue);\n });\n }\n }\n });\n }\n /**\n * Applies rule.\n *\n * @param rule Rule to apply.\n * @param cookieName Cookie name.\n * @param cookieValue Cookie value.\n */\n applyRule(rule, cookieName, cookieValue) {\n if (!rule.isAllowlist) {\n const hostParts = document.location.hostname.split('.');\n for (let i = 0; i <= hostParts.length - 1; i += 1) {\n const hostName = hostParts.slice(i).join('.');\n if (hostName) {\n CookieController.removeCookieFromHost(cookieName, hostName);\n }\n }\n }\n this.onRuleAppliedCallback({\n cookieName,\n cookieValue,\n cookieDomain: document.location.hostname,\n cookieRuleText: rule.ruleText,\n thirdParty: rule.isThirdParty,\n filterId: rule.filterId,\n });\n }\n /**\n * Removes cookie for host.\n *\n * @param cookieName Cookie name.\n * @param hostName Host name.\n */\n static removeCookieFromHost(cookieName, hostName) {\n const cookieSpec = `${cookieName}=`;\n const domain1 = `; domain=${hostName}`;\n const domain2 = `; domain=.${hostName}`;\n const path = '; path=/';\n const expiration = '; expires=Thu, 01 Jan 1970 00:00:00 GMT';\n document.cookie = cookieSpec + expiration;\n document.cookie = cookieSpec + domain1 + expiration;\n document.cookie = cookieSpec + domain2 + expiration;\n document.cookie = cookieSpec + path + expiration;\n document.cookie = cookieSpec + domain1 + path + expiration;\n document.cookie = cookieSpec + domain2 + path + expiration;\n }\n /**\n * Converts cookie rule match to regular expression.\n *\n * @param str String to convert.\n * @returns Regular expression.\n */\n static toRegExp(str) {\n if (str[0] === '/' && str[str.length - 1] === '/') {\n return new RegExp(str.slice(1, -1));\n }\n const escaped = str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`^${escaped}$`);\n }\n}\n\n/**\n * Utils class.\n */\nclass ElementUtils {\n /**\n * Serialize HTML element.\n *\n * @param element Element to serialize.\n *\n * @returns String representation of the element.\n */\n static elementToString(element) {\n const s = [];\n s.push('<');\n s.push(element.localName);\n const { attributes } = element;\n for (let i = 0; i < attributes.length; i += 1) {\n const attr = attributes[i];\n s.push(' ');\n s.push(attr.name);\n s.push('=\"');\n const value = attr.value === null ? '' : attr.value.replace(/\"/g, '\\\\\"');\n s.push(value);\n s.push('\"');\n }\n s.push('>');\n return s.join('');\n }\n /**\n * Appends node children to the array.\n *\n * @param node Element whose children we would like to add.\n * @param arrayWithNodes Array where we add children.\n */\n static appendChildren(node, arrayWithNodes) {\n const children = node.querySelectorAll('*');\n if (children && children.length > 0) {\n for (let i = 0; i < children.length; i += 1) {\n arrayWithNodes.push(children[i]);\n }\n }\n }\n /**\n * Adds elements into array if they are not in the array yet.\n *\n * @param targetArray Array where we add elements.\n * @param sourceArray Array with elements.\n */\n static addUnique(targetArray, sourceArray) {\n if (sourceArray.length > 0) {\n for (let i = 0; i < sourceArray.length; i += 1) {\n const sourceElement = sourceArray[i];\n if (targetArray.indexOf(sourceElement) === -1) {\n targetArray.push(sourceElement);\n }\n }\n }\n }\n /**\n * Removes all elements in array.\n *\n * @param elements Array with elements.\n */\n static removeElements(elements) {\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n element.remove();\n }\n }\n /**\n * Parses hits info from style content.\n *\n * @param content Style.\n * @param attributeMarker Attribute marker.\n *\n * @returns Info with filterId, ruleText or null.\n */\n static parseInfo(content, attributeMarker) {\n if (!content || content.indexOf(attributeMarker) < 0) {\n return null;\n }\n let filterIdAndRuleText = decodeURIComponent(content);\n // 'content' value may include open and close quotes.\n filterIdAndRuleText = ElementUtils.removeQuotes(filterIdAndRuleText);\n // Remove prefix\n filterIdAndRuleText = filterIdAndRuleText.substring(attributeMarker.length);\n // Attribute 'content' in css looks like: {content: 'adguard{filterId};{ruleText}'}\n const index = filterIdAndRuleText.indexOf(';');\n if (index < 0) {\n return null;\n }\n const filterId = parseInt(filterIdAndRuleText.substring(0, index), 10);\n if (Number.isNaN(filterId)) {\n return null;\n }\n const ruleText = filterIdAndRuleText.substring(index + 1);\n return { filterId, ruleText };\n }\n /**\n * Parses hits info from style content.\n *\n * @param content Style.\n * @param attributeMarker Attribute marker.\n *\n * @returns Info with filterId, ruleText or null.\n */\n static parseExtendedStyleInfo(content, attributeMarker) {\n const important = '!important';\n const indexOfImportant = content.lastIndexOf(important);\n if (indexOfImportant === -1) {\n return ElementUtils.parseInfo(content, attributeMarker);\n }\n const contentWithoutImportant = content.substring(0, indexOfImportant).trim();\n return ElementUtils.parseInfo(contentWithoutImportant, attributeMarker);\n }\n /**\n * Unquotes specified value.\n *\n * @param value Value to unquote.\n *\n * @returns Unquoted value.\n */\n static removeQuotes(value) {\n if (value.length > 1\n && ((value[0] === '\"' && value[value.length - 1] === '\"')\n || (value[0] === '\\'' && value[value.length - 1] === '\\''))) {\n // Remove double-quotes or single-quotes\n return value.substring(1, value.length - 1);\n }\n return value;\n }\n}\n\n// TODO remove the comment turning off the rule\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * This storage is used to keep track of counted rules received from node elements.\n */\nclass HitsStorage {\n constructor() {\n /**\n * Start count number.\n */\n this.counter = 0;\n /**\n * Storage random identificator.\n */\n this.randomKey = HitsStorage.generateRandomKey();\n /**\n * Map storage.\n */\n this.map = new Map();\n }\n /**\n * Checks if element is counted.\n *\n * @param element Html element.\n * @param rule Rule text.\n *\n * @returns True if element is counted.\n */\n isCounted(element, rule) {\n const hitAddress = element[this.randomKey];\n if (hitAddress) {\n const countedHit = this.map.get(hitAddress);\n if (countedHit) {\n return countedHit.element === element && countedHit.rule === rule;\n }\n }\n return false;\n }\n /**\n * Stores rule-element info in storage.\n *\n * @param element Html element.\n * @param rule Rule text.\n */\n setCounted(element, rule) {\n const counter = this.getCounter();\n // eslint-disable-next-line no-param-reassign\n element[this.randomKey] = counter;\n this.map.set(counter, { element, rule });\n }\n /**\n * Returns current counter value and increments it.\n *\n * @returns Count number.\n */\n getCounter() {\n this.counter += 1;\n return this.counter;\n }\n // TODO replace with nanoid\n /**\n * Random id generator.\n *\n * @returns Random key with 10 characters length.\n */\n static generateRandomKey() {\n const keyLength = 10;\n const possibleValues = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < keyLength; i += 1) {\n result += possibleValues.charAt(Math.floor(Math.random() * possibleValues.length));\n }\n return result;\n }\n}\n\n/**\n * Class represents collecting css style hits process.\n *\n * During applying css styles to element we add special 'content:' attribute\n * e.g.: \".selector -> .selector { content: 'adguard{filterId};{ruleText} !important;}\".\n * After the style is applied we parse this \"content\" attribute and call provided via constructor callback function.\n */\nclass CssHitsCounter {\n /**\n * This function prepares calculation of css hits.\n * We are waiting for 'load' event and start calculation.\n *\n * @param callback Which receives {@link ICountedElement} and handles counted css hits.\n */\n constructor(callback) {\n /**\n * Hits storage.\n */\n this.hitsStorage = new HitsStorage();\n /**\n * Mutation observer.\n */\n this.observer = null;\n /**\n * Counting on process flag.\n */\n this.countIsWorking = false;\n this.onCssHitsFoundCallback = callback;\n if (document.readyState === 'complete'\n || document.readyState === 'interactive') {\n this.countCssHits();\n }\n else {\n document.addEventListener('readystatechange', this.startCounter.bind(this));\n }\n }\n /**\n * Stops css hits counting process.\n */\n stop() {\n this.onCssHitsFoundCallback = () => { };\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n /**\n * Callback used to collect statistics of elements affected by extended css rules.\n *\n * @param affectedEl Affected element.\n * @returns Affected element.\n */\n countAffectedByExtendedCss(affectedEl) {\n if (affectedEl && affectedEl.rules && affectedEl.rules.length > 0) {\n const result = [];\n for (const rule of affectedEl.rules) {\n if (rule.style && rule.style.content) {\n const styleInfo = ElementUtils.parseExtendedStyleInfo(rule.style.content, CssHitsCounter.CONTENT_ATTR_PREFIX);\n if (styleInfo === null) {\n continue;\n }\n const { filterId, ruleText } = styleInfo;\n if (filterId !== undefined && ruleText !== undefined) {\n result.push({\n filterId,\n ruleText,\n element: ElementUtils.elementToString(affectedEl.node),\n });\n // clear style content to avoid duplicate counting\n rule.style.content = '';\n }\n }\n }\n this.onCssHitsFoundCallback(result);\n }\n return affectedEl;\n }\n /**\n * Starts counting process.\n */\n startCounter() {\n if (document.readyState === 'interactive'\n || document.readyState === 'complete') {\n this.countCssHits();\n document.removeEventListener('readystatechange', this.startCounter);\n }\n }\n /**\n * Counts css hits.\n */\n countCssHits() {\n this.countAllCssHits();\n this.countCssHitsForMutations();\n }\n /**\n * Counts css hits for already affected elements.\n */\n countAllCssHits() {\n // we don't start counting again all css hits till previous count process wasn't finished\n if (this.countIsWorking) {\n return;\n }\n this.countIsWorking = true;\n const elements = document.querySelectorAll('*');\n this.countCssHitsBatch(elements, 0, CssHitsCounter.CSS_HITS_BATCH_SIZE, CssHitsCounter.CSS_HITS_BATCH_SIZE, [], (result) => {\n if (result.length > 0) {\n this.onCssHitsFoundCallback(result);\n }\n this.countIsWorking = false;\n });\n }\n /**\n * Main calculation function.\n * 1. Selects sub collection from elements.\n * 2. For each element from sub collection: retrieves calculated css 'content'\n * attribute and if it contains 'adguard'\n * marker then retrieves rule text and filter identifier.\n * 3. Starts next task with some delay.\n *\n * @param elements Collection of all elements.\n * @param start Start of batch.\n * @param end End of batch.\n * @param step Size of batch.\n * @param result Collection for save result.\n * @param callback Finish callback.\n */\n // eslint-disable-next-line max-len\n countCssHitsBatch(elements, start, end, step, result, callback) {\n const length = Math.min(end, elements.length);\n result = result.concat(this.countCssHitsForElements(elements, start, length));\n if (length === elements.length) {\n callback(result);\n return;\n }\n start = end;\n end += step;\n // Start next task with some delay\n window.setTimeout(() => {\n this.countCssHitsBatch(elements, start, end, step, result, callback);\n }, CssHitsCounter.COUNT_CSS_HITS_BATCH_DELAY);\n }\n /**\n * Counts css hits for array of elements.\n *\n * @param elements Array of elements.\n * @param start Start of batch.\n * @param length Length of batch.\n *\n * @returns Data with information about filter id, rule text and element.\n */\n countCssHitsForElements(elements, start, length) {\n const RULE_FILTER_SEPARATOR = ';';\n start = start || 0;\n length = length || elements.length;\n const result = [];\n for (let i = start; i < length; i += 1) {\n const element = elements[i];\n const cssHitData = CssHitsCounter.getCssHitData(element);\n if (!cssHitData) {\n continue;\n }\n const { filterId, ruleText } = cssHitData;\n const ruleAndFilterString = filterId + RULE_FILTER_SEPARATOR + ruleText;\n if (this.hitsStorage.isCounted(element, ruleAndFilterString)) {\n continue;\n }\n this.hitsStorage.setCounted(element, ruleAndFilterString);\n result.push({\n filterId,\n ruleText,\n element: ElementUtils.elementToString(element),\n });\n }\n return result;\n }\n /**\n * Counts css hits for mutations.\n */\n countCssHitsForMutations() {\n // eslint-disable-next-line prefer-destructuring\n const MutationObserver = window.MutationObserver;\n if (!MutationObserver) {\n return;\n }\n if (this.observer) {\n this.observer.disconnect();\n }\n /**\n * To avoid cases where two css hits counters try to append and remove the\n * same elements one after the other, we do not append already met nodes.\n */\n const probesWeakSet = new WeakSet();\n let timeoutId = null;\n this.observer = new MutationObserver(((mutationRecords) => {\n // Collect probe elements, count them, then remove from their targets\n const probeElements = [];\n const childrenOfProbeElements = [];\n const potentialProbeElements = [];\n mutationRecords.forEach((mutationRecord) => {\n if (mutationRecord.addedNodes.length === 0) {\n return;\n }\n for (let i = 0; i < mutationRecord.addedNodes.length; i += 1) {\n const node = mutationRecord.addedNodes[i];\n if (!(node instanceof Element) || CssHitsCounter.isIgnoredNodeTag(node.tagName)) {\n continue;\n }\n const { target } = mutationRecord;\n if (!node.parentNode && target) {\n // If this node has been appended to the DOM and counted once, do not add\n // it again.\n if (probesWeakSet.has(node)) {\n return;\n }\n // Most likely this is a \"probe\" element that was added and then\n // immediately removed from DOM.\n // We re-add it and check if any rule matched it\n probeElements.push(node);\n // To ensure that this \"probe\" node has only been added once to the DOM,\n // we add it to the weak set.\n probesWeakSet.add(node);\n // CSS rules could be applied to the nodes inside probe element\n // that's why we get all child elements of added node\n ElementUtils.appendChildren(node, childrenOfProbeElements);\n if (this.observer) {\n this.observer.disconnect();\n }\n mutationRecord.target.appendChild(node);\n }\n else if (node.parentNode && target) {\n // Sometimes probe elements are appended to the DOM\n potentialProbeElements.push(node);\n ElementUtils.appendChildren(node, potentialProbeElements);\n }\n }\n });\n // If the list of potential probe elements is relatively small,\n // we can count CSS hits immediately\n if (potentialProbeElements.length > 0\n && potentialProbeElements.length <= CssHitsCounter.CSS_HITS_BATCH_SIZE) {\n const result = this.countCssHitsForElements(potentialProbeElements, 0, null);\n if (result.length > 0) {\n this.onCssHitsFoundCallback(result);\n }\n }\n const allProbeElements = [];\n ElementUtils.addUnique(allProbeElements, childrenOfProbeElements);\n ElementUtils.addUnique(allProbeElements, probeElements);\n if (allProbeElements.length > 0) {\n const result = this.countCssHitsForElements(allProbeElements, 0, null);\n if (result.length > 0) {\n this.onCssHitsFoundCallback(result);\n }\n /**\n * Don't remove child elements of probe elements\n * https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1096.\n */\n ElementUtils.removeElements(probeElements);\n this.startObserver();\n }\n // debounce counting all css hits when mutation record fires\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n timeoutId = window.setTimeout(() => {\n this.countAllCssHits();\n window.clearTimeout(timeoutId);\n }, CssHitsCounter.COUNT_ALL_CSS_HITS_TIMEOUT_MS);\n }));\n this.startObserver();\n }\n /**\n * Starts mutation observer.\n */\n startObserver() {\n if (this.observer) {\n // TODO: Check, maybe we should observer for 'characterData' and\n // 'characterDataOldValue' like it was in the old extension code\n this.observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n }\n }\n /**\n * Function retrieves css hits data from element style content attribute contains data injected with AdGuard.\n *\n * @param element Element to check.\n * @returns Filter id and rule text or null.\n */\n static getCssHitData(element) {\n const style = getComputedStyle(element);\n return ElementUtils.parseInfo(style.content, CssHitsCounter.CONTENT_ATTR_PREFIX);\n }\n /**\n * Checks if tag is ignored.\n *\n * @param nodeTag Tag name to check.\n * @returns True if tag is ignored.\n */\n static isIgnoredNodeTag(nodeTag) {\n const ignoredTags = ['script'];\n return ignoredTags.includes(nodeTag.toLowerCase());\n }\n}\n/**\n * We split CSS hits counting into smaller batches of elements and schedule them one by one using setTimeout.\n */\nCssHitsCounter.COUNT_CSS_HITS_BATCH_DELAY = 5;\n/**\n * Size of small batches of elements we count.\n */\nCssHitsCounter.CSS_HITS_BATCH_SIZE = 25;\n/**\n * In order to find elements hidden by AdGuard we look for a `:content` pseudo-class\n * with values starting with this prefix. Filter information will be\n * encoded in this value as well.\n */\nCssHitsCounter.CONTENT_ATTR_PREFIX = 'adguard';\n/**\n * We delay countAllCssHits function if it was called too frequently from mutationObserver.\n */\nCssHitsCounter.COUNT_ALL_CSS_HITS_TIMEOUT_MS = 500;\n\nvar RequestType = {\n NotSet: 0,\n Document: 1,\n SubDocument: 2,\n Script: 4,\n Stylesheet: 8,\n Object: 16,\n Image: 32,\n XmlHttpRequest: 64,\n Media: 128,\n Font: 256,\n WebSocket: 512,\n Ping: 1024,\n Other: 2048,\n};\n\n/**\n * Css, injected to broken element for hiding.\n */\n// eslint-disable-next-line max-len\nconst HIDING_STYLE = '{ display: none!important; visibility: hidden!important; height: 0px!important; min-height: 0px!important; }';\n/**\n * Creates hiding css rule for specified tag with src attribute.\n *\n * @param tag Element tag for css selector.\n * @param src `src` attribute value for css selector. If value is the empty string\n * then the selector does not represent anything.\n * @param matching Attribute matching type. Currently support strict (=) and suffix ($=) matching.\n * Default to strict.\n *\n * @returns Css rule text.\n */\nfunction createHidingCssRule(tag, src, matching = \"=\" /* AttributeMatching.Strict */) {\n return `${tag}[src${matching}\"${src}\"] ${HIDING_STYLE}\\n`;\n}\n\n/**\n * Hides broken items after blocking a network request.\n */\nclass ElementCollapser {\n /**\n * Creates new element collapser.\n */\n constructor() {\n this.shouldCollapseElement = this.shouldCollapseElement.bind(this);\n }\n /**\n * Starts listening for error events.\n */\n start() {\n document.addEventListener('error', this.shouldCollapseElement, true);\n // We need to listen for load events to hide blocked iframes (they don't raise error event)\n document.addEventListener('load', this.shouldCollapseElement, true);\n }\n /**\n * Stops listening for error events.\n */\n stop() {\n document.removeEventListener('error', this.shouldCollapseElement, true);\n // We need to listen for load events to hide blocked iframes (they don't raise error event)\n document.removeEventListener('load', this.shouldCollapseElement, true);\n }\n /**\n * Appends Css rule to {@link #styleNode} sheet.\n *\n * @param rule - Css rule text.\n */\n appendCssRule(rule) {\n if (!this.styleNode) {\n this.styleNode = document.createElement('style');\n this.styleNode.setAttribute('type', 'text/css');\n (document.head || document.documentElement).appendChild(this.styleNode);\n }\n if (this.styleNode.sheet) {\n this.styleNode.sheet.insertRule(rule, this.styleNode.sheet.cssRules.length);\n }\n }\n /**\n * Checks if element should be collapsed by requirements.\n *\n * @param event Error or load event.\n */\n shouldCollapseElement(event) {\n return __awaiter(this, void 0, void 0, function* () {\n const eventType = event.type;\n const element = event.target;\n const tagName = element.tagName.toLowerCase();\n const expectedEventType = (tagName === 'iframe'\n || tagName === 'frame'\n || tagName === 'embed') ? 'load' : 'error';\n if (eventType !== expectedEventType) {\n return;\n }\n const requestType = ElementCollapser.getRequestTypeByInitiatorTagName(element.localName);\n if (!requestType) {\n return;\n }\n const elementUrl = ElementCollapser.getElementUrl(element);\n if (!elementUrl) {\n return;\n }\n if (ElementCollapser.isElementCollapsed(element)) {\n return;\n }\n const payload = {\n elementUrl,\n documentUrl: document.URL,\n requestType,\n };\n const shouldCollapse = yield sendAppMessage({\n type: MessageType.ProcessShouldCollapse,\n payload,\n });\n if (!shouldCollapse) {\n return;\n }\n const srcAttribute = element.getAttribute('src');\n if (srcAttribute) {\n const rule = createHidingCssRule(tagName, CSS.escape(srcAttribute));\n this.appendCssRule(rule);\n }\n else {\n element.setAttribute('style', HIDING_STYLE);\n }\n });\n }\n /**\n * Returns request type by tag name.\n *\n * @param tagName Tag name.\n * @returns Request type or null.\n */\n static getRequestTypeByInitiatorTagName(tagName) {\n switch (tagName) {\n case 'img':\n case 'input': {\n return RequestType.Image;\n }\n case 'audio':\n case 'video': {\n return RequestType.Media;\n }\n case 'object':\n case 'embed': {\n return RequestType.Object;\n }\n case 'frame':\n case 'iframe':\n return RequestType.SubDocument;\n default:\n return null;\n }\n }\n /**\n * Extracts element URL from the dom node.\n *\n * @param element Dom node.\n * @returns Element URL or null.\n */\n static getElementUrl(element) {\n let elementUrl = element.src || element.data;\n if (!elementUrl\n || elementUrl.indexOf('http') !== 0\n // Some sources could not be set yet, lazy loaded images or smth.\n // In some cases like on gog.com, collapsing these elements could break\n // the page script loading their sources\n || elementUrl === element.baseURI) {\n return null;\n }\n // truncate too long urls\n // https://github.com/AdguardTeam/AdguardBrowserExtension/issues/1493\n const MAX_URL_LENGTH = 16 * 1024;\n if (elementUrl.length > MAX_URL_LENGTH) {\n elementUrl = elementUrl.slice(0, MAX_URL_LENGTH);\n }\n return elementUrl;\n }\n /**\n * Checks if element is already collapsed.\n *\n * @param element DOM element.\n * @returns True if element is collapsed.\n */\n static isElementCollapsed(element) {\n const computedStyle = window.getComputedStyle(element);\n return (computedStyle && computedStyle.display === 'none');\n }\n}\n\n/**\n * This class applies cosmetic rules in page context.\n */\nclass CosmeticController {\n /**\n * Creates new {@link CosmeticController} instance.\n */\n constructor() {\n /**\n * Number of {@link MessageType.GetCosmeticData} requests.\n */\n this.tries = 0;\n this.process = this.process.bind(this);\n this.beforeStyleApplied = this.beforeStyleApplied.bind(this);\n }\n /**\n * Init cosmetic processing.\n */\n init() {\n const elementCollapser = new ElementCollapser();\n elementCollapser.start();\n this.process();\n }\n /**\n * Sends {@link MessageType.GetCosmeticData} message to background and process response.\n */\n process() {\n return __awaiter(this, void 0, void 0, function* () {\n const res = yield sendAppMessage({\n type: MessageType.GetCosmeticData,\n payload: {\n documentUrl: window.location.href,\n },\n });\n if (res) {\n this.applyCosmetic(res);\n }\n });\n }\n /**\n * Process {@link MessageType.GetCosmeticData} response from background.\n *\n * If {@link cosmeticData.isAppStarted} is false, retry\n * request after {@link GET_COSMETIC_DATA_RETRY_TIMEOUT_MS} milliseconds.\n * Else apply extended css rules from {@link cosmeticData.extCssText}\n * and enable {@link CssHitsCounter} if {@link cosmeticData.areHitsStatsCollected} is true.\n *\n * @param cosmeticData Response cosmetic data from background.\n */\n applyCosmetic(cosmeticData) {\n const { isAppStarted, extCssRules, areHitsStatsCollected, } = cosmeticData;\n if (!isAppStarted\n && this.tries <= CosmeticController.MAX_GET_COSMETIC_DATA_TRIES) {\n this.tries += 1;\n setTimeout(this.process, CosmeticController.GET_COSMETIC_DATA_RETRY_TIMEOUT_MS);\n return;\n }\n if (areHitsStatsCollected) {\n this.cssHitsCounter = CosmeticController.createCssHitsCounter();\n }\n if (!extCssRules || extCssRules.length === 0) {\n return;\n }\n const extendedCssConfig = {\n cssRules: extCssRules,\n };\n if (areHitsStatsCollected) {\n extendedCssConfig.beforeStyleApplied = this.beforeStyleApplied;\n }\n const extendedCss = new ExtendedCss(extendedCssConfig);\n extendedCss.apply();\n }\n /**\n * Preprocess {@link IAffectedElement} for {@link ExtendedCss} instance.\n *\n * @param el Record with required 'content' style property in rules.\n * @returns Affected element record.\n */\n beforeStyleApplied(el) {\n if (!this.cssHitsCounter) {\n return el;\n }\n return this.cssHitsCounter.countAffectedByExtendedCss(el);\n }\n /**\n * Create new {@link CssHitsCounter} instance.\n *\n * @returns CssHitsCounter instance.\n */\n static createCssHitsCounter() {\n return new CssHitsCounter((stats) => {\n sendAppMessage({\n type: MessageType.SaveCssHitsStats,\n payload: stats,\n });\n });\n }\n}\n/**\n * Retry timeout for {@link MessageType.GetCosmeticData} request to background in milliseconds.\n */\nCosmeticController.GET_COSMETIC_DATA_RETRY_TIMEOUT_MS = 100;\n/**\n * Max {@link MessageType.GetCosmeticData} request limit.\n */\nCosmeticController.MAX_GET_COSMETIC_DATA_TRIES = 200;\n\n/**\n * Initializes assistant object and create messages listener for assistant.\n */\nconst initAssistant = () => {\n if (window.top !== window || !(document.documentElement instanceof HTMLElement)) {\n return;\n }\n browser.runtime.onMessage.addListener((message) => __awaiter(void 0, void 0, void 0, function* () {\n switch (message.type) {\n case MessageType.InitAssistant: {\n // If there is no assistant on the window after execute\n // loading script - throw error.\n if (window.adguardAssistant === undefined) {\n throw new Error('adguardAssistant not found in the window object.');\n }\n else {\n window.adguardAssistant.close();\n }\n window.adguardAssistant.start(null, (rules) => {\n sendAppMessage({\n type: MessageType.AssistantCreateRule,\n payload: { ruleText: rules },\n });\n });\n break;\n }\n case MessageType.CloseAssistant: {\n if (window.adguardAssistant) {\n window.adguardAssistant.close();\n }\n break;\n }\n }\n }));\n};\n\n// Disable jest coverage for this file, because it will insert\n// line comments, and code to count lines covered by tests, for example:\n// /* istanbul ignore next */\n// cov_uqm40oh03().f[0]++;\n// cov_uqm40oh03().s[2]++;\n// And we cannot test these strings correctly, because the names of these\n// functions with counters are generated at runtime\n/* istanbul ignore file */\n/**\n * This module applies stealth actions in page context.\n */\nclass StealthHelper {\n /**\n * Sends a Global Privacy Control DOM signal.\n */\n static setDomSignal() {\n try {\n if ('globalPrivacyControl' in Navigator.prototype) {\n return;\n }\n Object.defineProperty(Navigator.prototype, 'globalPrivacyControl', {\n get: () => true,\n configurable: true,\n enumerable: true,\n });\n }\n catch (ex) {\n // Ignore\n }\n }\n}\n\nconst cosmeticController = new CosmeticController();\ncosmeticController.init();\ninitAssistant();\n/**\n * TODO: wait for engine starts (like in {@link CosmeticController}).\n *\n * Runs CookieController.\n *\n * Steps:\n * - content script requests matching cookie rules for the frame(in which this script is executed)\n * - service returns matching set of rules data to content script\n * - the rules are applied with TSUrlFilterContentScript.CookieController\n * - filtering log receives callback with applied rules data.\n *\n * The important point is:\n * - there is no way to run cookie controller script via chrome.tabs.executeScript cause one only could be executed\n * for all frames or main frame only. But it's not correct cause there should be different rules\n * for each frame.\n */\n(() => __awaiter(void 0, void 0, void 0, function* () {\n const response = yield sendAppMessage({\n type: MessageType.GetCookieRules,\n payload: {\n documentUrl: window.location.href,\n },\n });\n if (!response) {\n return;\n }\n if (response.rulesData) {\n try {\n const cookieController = new CookieController(({ cookieName, cookieValue, cookieDomain, cookieRuleText, thirdParty, filterId, }) => {\n sendAppMessage({\n type: MessageType.SaveCookieLogEvent,\n payload: {\n cookieName,\n cookieValue,\n cookieDomain,\n cookieRuleText,\n thirdParty,\n filterId,\n },\n });\n });\n cookieController.apply(response.rulesData);\n }\n catch (e) {\n // Ignore exceptions\n }\n }\n}))();\n\nexport { CookieController, CssHitsCounter, StealthHelper };\n","/**\n * @file\n * This file is part of Adguard API library (https://github.com/AdguardTeam/tsurlfilter/packages/adguard-api).\n *\n * Adguard API is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Adguard API is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adguard API. If not, see .\n */\n\nimport \"@adguard/tswebextension/content-script\";\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/packages/adguard-api/package.json b/packages/adguard-api/package.json index 830b55201..1263fa80e 100644 --- a/packages/adguard-api/package.json +++ b/packages/adguard-api/package.json @@ -32,10 +32,9 @@ "author": "Adguard", "license": "GPL-3.0-only", "dependencies": { - "@adguard/assistant": "^4.3.69", + "@adguard/assistant": "^4.3.70", "@adguard/filters-downloader": "^1.1.15", - "@adguard/tswebextension": "^0.2.1", - "url": "^0.11.0", + "@adguard/tswebextension": "^0.3.9", "webextension-polyfill": "0.10.0", "zod": "3.21.4" }, diff --git a/packages/adguard-api/src/background/network.ts b/packages/adguard-api/src/background/network.ts index b1d91e424..f07f15004 100644 --- a/packages/adguard-api/src/background/network.ts +++ b/packages/adguard-api/src/background/network.ts @@ -16,7 +16,7 @@ * along with Adguard API. If not, see . */ -import FiltersDownloader, { DefinedExpressions } from "@adguard/filters-downloader/browser"; +import FiltersDownloader, { type DefinedExpressions } from "@adguard/filters-downloader/browser"; import { UserAgent } from "./utils"; import { metadataValidator, Metadata, Configuration } from "./schemas"; diff --git a/packages/adguard-api/webpack.config.ts b/packages/adguard-api/webpack.config.ts index a3a4fea67..e40e32f17 100644 --- a/packages/adguard-api/webpack.config.ts +++ b/packages/adguard-api/webpack.config.ts @@ -59,7 +59,9 @@ export default { extensions: [".ts", ".js"], // Node modules polyfills fallback: { - url: require.resolve("url"), + // url required by @adguard/filters-downloader package, but we use browser submodule, + // so we can ignore url polyfill + url: false, }, }, optimization: { diff --git a/packages/examples/adguard-api/.babelrc b/packages/examples/adguard-api/.babelrc deleted file mode 100644 index 5df7e20fd..000000000 --- a/packages/examples/adguard-api/.babelrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-typescript" - ] -} diff --git a/packages/examples/adguard-api/package.json b/packages/examples/adguard-api/package.json index 755e6dc09..80c21067f 100644 --- a/packages/examples/adguard-api/package.json +++ b/packages/examples/adguard-api/package.json @@ -5,27 +5,21 @@ "author": "adguard@adguard.com", "license": "GPL-3.0", "scripts": { - "build": "node -r esbuild-register ./scripts/build/index.ts", + "build": "node -r @swc-node/register ./scripts/build/index.ts", "lint": "eslint 'extension/**/*.ts' 'scripts/**/*.ts'", "tswebextension": "tswebextension" }, "dependencies": { - "@adguard/api": "file:../../adguard-api" + "@adguard/api": "1.3.0" }, "devDependencies": { - "@adguard/tswebextension": "^0.1.2", - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-typescript": "^7.16.0", + "@adguard/tswebextension": "^0.3.9", + "@swc-node/register": "^1.6.6", + "@swc/core": "^1.3.75", "@typescript-eslint/eslint-plugin": "^5.41.0", "@typescript-eslint/parser": "^5.41.0", - "babel-loader": "^8.2.3", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^10.0.0", - "esbuild": "^0.14.1", - "esbuild-register": "^3.2.0", "eslint": "^8.6.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^16.1.0", @@ -36,6 +30,7 @@ "eslint-webpack-plugin": "^3.2.0", "html-webpack-plugin": "^5.5.0", "prettier": "^2.7.1", + "swc-loader": "^0.2.3", "webpack": "^5.64.2" } } diff --git a/packages/examples/adguard-api/scripts/build/webpack.config.ts b/packages/examples/adguard-api/scripts/build/webpack.config.ts index 90773398b..a5623c408 100644 --- a/packages/examples/adguard-api/scripts/build/webpack.config.ts +++ b/packages/examples/adguard-api/scripts/build/webpack.config.ts @@ -27,8 +27,16 @@ export const config: Configuration = { exclude: /node_modules/, use: [ { - loader: "babel-loader", - options: { babelrc: true }, + loader: "swc-loader", + options: { + env: { + targets: { + chrome: 79, + firefox: 78, + opera: 66, + }, + }, + }, }, ], }, diff --git a/packages/examples/adguard-api/tsconfig.json b/packages/examples/adguard-api/tsconfig.json index 6c910c0fd..0e39342cc 100644 --- a/packages/examples/adguard-api/tsconfig.json +++ b/packages/examples/adguard-api/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2022", "lib": [ "dom", "dom.iterable", diff --git a/packages/examples/adguard-api/yarn.lock b/packages/examples/adguard-api/yarn.lock index a8a0461fd..3fedad7ea 100644 --- a/packages/examples/adguard-api/yarn.lock +++ b/packages/examples/adguard-api/yarn.lock @@ -2,34 +2,70 @@ # yarn lockfile v1 -"@adguard/assistant@^4.3.69": - version "4.3.69" - resolved "https://registry.yarnpkg.com/@adguard/assistant/-/assistant-4.3.69.tgz#4a66acb9c127c41cc5fbca3c51e854ed3aaf79ba" - integrity sha512-mNC6bQ4VZmDqrC519H0J+ZUvjdlavQei3BMYWyPW3CBSrY823BY/S+yBwQglaDw5EYiWD1vdXDWwHMdNzFAEgw== +"@adguard/api@1.3.0": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@adguard/api/-/api-1.2.6.tgz#9c22c2e3d10f88cd5fbc3eb1c2650dd41e80a11e" + integrity sha512-gb+svemjZ+13uzdsYOy3KRlzlRe46abki/zy6VZbI1VxsrJacDB4XOE89UZg9toifRis4bCwW7/KZlWSazjQeg== + dependencies: + "@adguard/assistant" "^4.3.63" + "@adguard/filters-downloader" "^1.1.14" + "@adguard/tswebextension" "^0.0.x" + url "^0.11.0" + webextension-polyfill "0.10.0" + zod "3.19.1" + +"@adguard/assistant@^4.3.63", "@adguard/assistant@^4.3.68", "@adguard/assistant@^4.3.70": + version "4.3.70" + resolved "https://registry.yarnpkg.com/@adguard/assistant/-/assistant-4.3.70.tgz#7fdc072315b5ddc797ad91bf06bee3b20e911098" + integrity sha512-q5o4ejQgRQMFbtV49X1ark0Ytb+MP/3vC9XErHqAcvh6wHpN/Hm2Q1+jbhiHHIs/H2rCU20TyVwZlGs0xtQ60w== -"@adguard/extended-css@^2.0.52": +"@adguard/extended-css@^2.0.51", "@adguard/extended-css@^2.0.52": version "2.0.52" resolved "https://registry.yarnpkg.com/@adguard/extended-css/-/extended-css-2.0.52.tgz#f5e7c3df1796deb96404a1b6441e7a4c729f09ac" integrity sha512-T77MnFD/+A3q93MNEq13qPUXPQRBeOUO9LRyqslcaz7jD5qMcikX1nx436u3PXdZXZpa6R0nnwXQ7wwScDmVgw== -"@adguard/scriptlets@^1.9.7": - version "1.9.7" - resolved "https://registry.yarnpkg.com/@adguard/scriptlets/-/scriptlets-1.9.7.tgz#dff4637122ba07bec79e48eb88cbb02cd0ba7167" - integrity sha512-MZZde1vYfKLLAyVIQKEsuQC2Roc07jjjLsyymuUV3vhh9NhMDTgRG+mVWNp2qAg8zDYEHjm18/R7i0Ir1kj/bQ== +"@adguard/filters-downloader@^1.1.14": + version "1.1.15" + resolved "https://registry.yarnpkg.com/@adguard/filters-downloader/-/filters-downloader-1.1.15.tgz#1c7aff400566e99c39ebf809d83f60f8fb337304" + integrity sha512-1WoBi/CgHd1XJ+GLy7MFfHIqFfaOEqxR+n8P7/eGO98EvSoTSklwSnrY3CmhPLQMlwJtIpAtYdZSJQ1anfGM2Q== + dependencies: + axios "^0.21.1" + +"@adguard/scriptlets@^1.9.1", "@adguard/scriptlets@^1.9.62": + version "1.9.62" + resolved "https://registry.yarnpkg.com/@adguard/scriptlets/-/scriptlets-1.9.62.tgz#f60b83bb928c160f59153989c9491504e510498b" + integrity sha512-uWSlfMnAJUmIVsChl7KrECBXDJotSfq/N94iNLtfwnJI7br9Q5Gl65iuH89rh0Fs62OwexKlj3cnrzHL4TEFyw== dependencies: - "@babel/runtime" "^7.7.2" + "@babel/runtime" "^7.20.13" js-yaml "^3.13.1" -"@adguard/tswebextension@^0.1.2": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@adguard/tswebextension/-/tswebextension-0.1.4.tgz#f650ac9b3dc7b6cbaa6c202bedaced3e60cabb37" - integrity sha512-AuPB/zMMjEL3f42MmruWZSgiVU+Q4TFSnY1SxbHk5diLwEww9RWNtdJUl7mlcgqn6yzbX6ao3RLUN0TizEHo9w== +"@adguard/tsurlfilter@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@adguard/tsurlfilter/-/tsurlfilter-2.1.6.tgz#9cce7d9d561504fc754d97745489221e256d3b47" + integrity sha512-RNdZaf1fx4QvEfd8EKhznHOzcYcGyYvx3Njtkay4P7vEcLoTUcouyO1T0cEmVKB5DTk73tJ+bXkVhJSsh4BaXg== dependencies: - "@adguard/assistant" "^4.3.69" - "@adguard/extended-css" "^2.0.52" - "@adguard/scriptlets" "^1.9.7" + "@adguard/scriptlets" "^1.9.62" + commander "9.4.1" + ip6addr "0.2.3" + is-cidr "4.0.2" + is-ip "3.1.0" + lru_map "0.4.1" + netmask "2.0.2" + punycode "2.1.1" + tldts "5.6.45" + zod "3.19.1" + +"@adguard/tswebextension@^0.0.x": + version "0.0.68" + resolved "https://registry.yarnpkg.com/@adguard/tswebextension/-/tswebextension-0.0.68.tgz#71cbedc83717628a31d303dc059e5f6a3caa6e27" + integrity sha512-rMGJPEW7XM4Yfof7DiwF5ADIXD6Si8nAY8gploDqDAyinQqb1kBFECWXUIveKClMfZy2HPehEahg3RrbuBtffw== + dependencies: + "@adguard/assistant" "^4.3.68" + "@adguard/extended-css" "^2.0.51" + "@adguard/scriptlets" "^1.9.1" bowser "2.11.0" commander "9.4.1" + deepmerge "4.2.2" fs-extra "10.1.0" lru_map "0.4.1" nanoid "4.0.0" @@ -39,1015 +75,32 @@ webextension-polyfill "0.10.0" zod "3.19.1" -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" - integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== - -"@babel/core@^7.16.0": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" - integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.0" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helpers" "^7.22.0" - "@babel/parser" "^7.22.0" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== - dependencies: - "@babel/types" "^7.22.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" - integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" - integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== - dependencies: - "@babel/compat-data" "^7.22.0" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" - integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" - integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - semver "^6.3.0" - -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" - integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" - integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" - integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" - integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" - integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== - dependencies: - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.3" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" - integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - -"@babel/plugin-proposal-class-properties@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-syntax-import-attributes@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" - integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== +"@adguard/tswebextension@^0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@adguard/tswebextension/-/tswebextension-0.3.8.tgz#3a98a50693607cfccbe25669a77722409e40b52b" + integrity sha512-w595Fae19UV73eUvf8WeG3NtKvM7otzFNywj0KMjg355Sj13G+uChrFxpcWxdh3I92UL19ttW9pUZUhQx8NJSQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-async-generator-functions@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" - integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-class-properties@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" - integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-class-static-block@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" - integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" - -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-dynamic-import@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" - integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-export-namespace-from@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" - integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-json-strings@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" - integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" - integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== - dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" - -"@babel/plugin-transform-modules-systemjs@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" - integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" - integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-new-target@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" - integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" - integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" - integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" - integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.3" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-optional-catch-binding@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" - integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" - integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" - integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-private-methods@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" - integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-private-property-in-object@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" - integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - regenerator-transform "^0.15.1" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-runtime@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42" - integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typescript@^7.21.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz#8f662cec8ba88c873f1c7663c0c94e3f68592f09" - integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-typescript" "^7.21.4" - -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-unicode-property-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" - integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-unicode-sets-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" - integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/preset-env@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" - integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-attributes" "^7.22.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.3" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-class-properties" "^7.22.3" - "@babel/plugin-transform-class-static-block" "^7.22.3" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-dynamic-import" "^7.22.1" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-export-namespace-from" "^7.22.3" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-json-strings" "^7.22.3" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.3" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" - "@babel/plugin-transform-new-target" "^7.22.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" - "@babel/plugin-transform-numeric-separator" "^7.22.3" - "@babel/plugin-transform-object-rest-spread" "^7.22.3" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-optional-catch-binding" "^7.22.3" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - "@babel/plugin-transform-parameters" "^7.22.3" - "@babel/plugin-transform-private-methods" "^7.22.3" - "@babel/plugin-transform-private-property-in-object" "^7.22.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.3" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.4" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" + "@adguard/assistant" "^4.3.70" + "@adguard/extended-css" "^2.0.52" + "@adguard/scriptlets" "^1.9.62" + "@adguard/tsurlfilter" "^2.1.6" + bowser "2.11.0" + commander "11.0.0" + fs-extra "11.1.1" + lru_map "0.4.1" + nanoid "4.0.2" + text-encoding "git+https://github.com/AdguardTeam/text-encoding.git#v0.7.2" + tldts "^6.0.8" + tslib "2.5.3" + webextension-polyfill "0.10.0" + zod "3.21.4" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/runtime@^7.20.13": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-typescript@^7.16.0": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" - integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-typescript" "^7.21.3" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" - -"@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.4.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" - integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== - dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + regenerator-runtime "^0.14.0" "@es-joy/jsdoccomment@~0.36.1": version "0.36.1" @@ -1058,11 +111,6 @@ esquery "^1.4.0" jsdoc-type-pratt-parser "~3.1.0" -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1114,7 +162,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": +"@jridgewell/gen-mapping@^0.3.0": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== @@ -1180,6 +228,97 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@swc-node/core@^1.10.4": + version "1.10.4" + resolved "https://registry.yarnpkg.com/@swc-node/core/-/core-1.10.4.tgz#3cb5ddb0171bbf541c17c713c91423799e67e0ec" + integrity sha512-ixZCb4LsSUPflnOxj4a8T5yTPzKbgvP+tF0N59Rk2+68ikFRt9Qci2qy9xfuDIQbuiONzXersrNpd+p598uH0A== + +"@swc-node/register@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@swc-node/register/-/register-1.6.6.tgz#dfcf092b45c76d76d45949b1be8e17561566e2d9" + integrity sha512-KgnQrWLgtJzEgPpxvhOPUDonv1xreVumGdzXDQlDVIqU3vH+spW8ZYxxyjJVMh3G/mQG8E3bFvUMHIS+E3FL2w== + dependencies: + "@swc-node/core" "^1.10.4" + "@swc-node/sourcemap-support" "^0.3.0" + colorette "^2.0.19" + debug "^4.3.4" + pirates "^4.0.5" + tslib "^2.5.0" + +"@swc-node/sourcemap-support@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@swc-node/sourcemap-support/-/sourcemap-support-0.3.0.tgz#e8a0d139bd3e8db39635f63fde43dbe6c39237cc" + integrity sha512-gqBJSmJMWomZFxlppaKea7NeAqFrDrrS0RMt24No92M3nJWcyI9YKGEQKl+EyJqZ5gh6w1s0cTklMHMzRwA1NA== + dependencies: + source-map-support "^0.5.21" + tslib "^2.5.0" + +"@swc/core-darwin-arm64@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.75.tgz#f6b2fb9dd03839ff3153902e09f1772963a1bbb6" + integrity sha512-anDnx9L465lGbjB2mvcV54NGHW6illr0IDvVV7JmkabYUVneaRdQvTr0tbHv3xjHnjrK1wuwVOHKV0LcQF2tnQ== + +"@swc/core-darwin-x64@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.75.tgz#b5a4fcc668f15fe664c9bdddac12b7c0685e6c81" + integrity sha512-dIHDfrLmeZfr2xwi1whO7AmzdI3HdamgvxthaL+S8L1x8TeczAZEvsmZTjy3s8p3Va4rbGXcb3+uBhmfkqCbfw== + +"@swc/core-linux-arm-gnueabihf@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.75.tgz#a4b19babc256390790b50d75dd300a3201275f9f" + integrity sha512-qeJmvMGrjC6xt+G0R4kVqqxvlhxJx7tTzhcEoWgLJnfvGZiF6SJdsef4OSM7HuReXrlBoEtJbfGPrLJtbV+C0w== + +"@swc/core-linux-arm64-gnu@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.75.tgz#347e44d12a3fd71e9fc109b68a7fff81696ecbc3" + integrity sha512-sqA9JqHEJBF4AdNuwo5zRqq0HC3l31SPsG9zpRa4nRzG5daBBJ80H7fi6PZQud1rfNNq+Q08gjYrdrxwHstvjw== + +"@swc/core-linux-arm64-musl@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.75.tgz#ca21e597ff52c0a25848be1838cd923a32963584" + integrity sha512-95rQT5xTAL3eKhMJbJbLsZHHP9EUlh1rcrFoLf0gUApoVF8g94QjZ9hYZiI72mMP5WPjgTEXQVnVB9O2GxeaLw== + +"@swc/core-linux-x64-gnu@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.75.tgz#56abe19475a72bdc5333461b55ca3c2cd60e4611" + integrity sha512-If7UpAhnPduMmtC+TSgPpZ1UXZfp2hIpjUFxpeCmHHYLS6Fn/2GZC5hpEiu+wvFJF0hzPh93eNAHa9gUxGUG+w== + +"@swc/core-linux-x64-musl@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.75.tgz#bfa90d24071930effeb4514540f89266a6d6957a" + integrity sha512-HOhxX0YNHTElCZqIviquka3CGYTN8rSQ6BdFfSk/K0O+ZEHx3qGte0qr+gGLPF/237GxreUkp3OMaWKuURtuCg== + +"@swc/core-win32-arm64-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.75.tgz#2fd8ea75ffe1a9153c523b6135b7169266a60e54" + integrity sha512-7QPI+mvBXAerVfWahrgBNe+g7fK8PuetxFnZSEmXUcDXvWcdJXAndD7GjAJzbDyjQpLKHbsDKMiHYvfNxZoN/A== + +"@swc/core-win32-ia32-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.75.tgz#9dae46582027ffeb03f258d05ab797701250d465" + integrity sha512-EfABCy4Wlq7O5ShWsm32FgDkSjyeyj/SQ4wnUIvWpkXhgfT1iNXky7KRU1HtX+SmnVk/k/NnabVZpIklYbjtZA== + +"@swc/core-win32-x64-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.75.tgz#c8e6d30c5deed1ae0fa162a42d6d9ef165b8041f" + integrity sha512-cTvP0pOD9C3pSp1cwtt85ZsrUkQz8RZfSPhM+jCGxKxmoowDCnInoOQ4Ica/ehyuUnQ4/IstSdYtYpO5yzPDJg== + +"@swc/core@^1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.75.tgz#b06d32144a5be0b7b25dbbff09dcd1ab18e48b67" + integrity sha512-YLqd5oZVnaOq/OzkjRSsJUQqAfKYiD0fzUyVUPVlNNCoQEfVfSMcXH80hLmYe9aDH0T/a7qEMjWyIr/0kWqy1A== + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.75" + "@swc/core-darwin-x64" "1.3.75" + "@swc/core-linux-arm-gnueabihf" "1.3.75" + "@swc/core-linux-arm64-gnu" "1.3.75" + "@swc/core-linux-arm64-musl" "1.3.75" + "@swc/core-linux-x64-gnu" "1.3.75" + "@swc/core-linux-x64-musl" "1.3.75" + "@swc/core-win32-arm64-msvc" "1.3.75" + "@swc/core-win32-ia32-msvc" "1.3.75" + "@swc/core-win32-x64-msvc" "1.3.75" + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -1214,7 +353,7 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.12" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== @@ -1513,13 +652,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -1600,55 +732,28 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -babel-loader@^8.2.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" - -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" + follow-redirects "^1.14.0" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -1674,7 +779,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: +browserslist@^4.14.5: version "4.21.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== @@ -1715,15 +820,6 @@ caniuse-lite@^1.0.30001489: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001491.tgz#eab0e0f392de6f7411751d148de9b5bd6b203e46" integrity sha512-17EYIi4TLnPiTzVKMveIxU5ETlxbSO3B6iPvMbprqnKh4qJsQGk5Nh1Lp4jIMAE0XfrujsJuWZAM3oJdMHaKBA== -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1737,6 +833,13 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +cidr-regex@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" + integrity sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw== + dependencies: + ip-regex "^4.1.0" + clean-css@^5.2.2: version "5.3.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" @@ -1751,13 +854,6 @@ clean-webpack-plugin@^4.0.0: dependencies: del "^4.1.1" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1765,16 +861,21 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" + integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== + commander@9.4.1: version "9.4.1" resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" @@ -1795,11 +896,6 @@ comment-parser@1.3.1: resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b" integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1810,11 +906,6 @@ confusing-browser-globals@^1.0.10: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - copy-webpack-plugin@^10.0.0: version "10.2.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" @@ -1827,12 +918,10 @@ copy-webpack-plugin@^10.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== - dependencies: - browserslist "^4.21.5" +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== cross-spawn@^7.0.2: version "7.0.3" @@ -1866,7 +955,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1878,6 +967,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -1970,11 +1064,6 @@ electron-to-chromium@^1.4.411: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.414.tgz#f9eedb6fb01b50439d8228d8ee3a6fa5e0108437" integrity sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w== -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - enhanced-resolve@^5.14.1: version "5.14.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" @@ -2058,150 +1147,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - -esbuild-linux-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" - integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== - -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-register@^3.2.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.4.2.tgz#1e39ee0a77e8f320a9790e68c64c3559620b9175" - integrity sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q== - dependencies: - debug "^4.3.4" - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - -esbuild@^0.14.1: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" - integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== - optionalDependencies: - "@esbuild/linux-loong64" "0.14.54" - esbuild-android-64 "0.14.54" - esbuild-android-arm64 "0.14.54" - esbuild-darwin-64 "0.14.54" - esbuild-darwin-arm64 "0.14.54" - esbuild-freebsd-64 "0.14.54" - esbuild-freebsd-arm64 "0.14.54" - esbuild-linux-32 "0.14.54" - esbuild-linux-64 "0.14.54" - esbuild-linux-arm "0.14.54" - esbuild-linux-arm64 "0.14.54" - esbuild-linux-mips64le "0.14.54" - esbuild-linux-ppc64le "0.14.54" - esbuild-linux-riscv64 "0.14.54" - esbuild-linux-s390x "0.14.54" - esbuild-netbsd-64 "0.14.54" - esbuild-openbsd-64 "0.14.54" - esbuild-sunos-64 "0.14.54" - esbuild-windows-32 "0.14.54" - esbuild-windows-64 "0.14.54" - esbuild-windows-arm64 "0.14.54" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -2411,6 +1361,16 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2463,23 +1423,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -2501,6 +1444,11 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +follow-redirects@^1.14.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2517,6 +1465,15 @@ fs-extra@10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2542,11 +1499,6 @@ functions-have-names@^1.2.2, functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -2596,11 +1548,6 @@ glob@^7.0.3, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^13.19.0: version "13.20.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" @@ -2677,11 +1624,6 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -2797,6 +1739,19 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +ip-regex@^4.0.0, ip-regex@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip6addr@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ip6addr/-/ip6addr-0.2.3.tgz#660df0d27092434f0aadee025aba8337c6d7d4d4" + integrity sha512-qA9DXRAUW+lT47/i/4+Q3GHPwZjGt/atby1FH/THN6GVATA6+Pjp2nztH7k6iKeil7hzYnBwfSsxjthlJ8lJKw== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.4.0" + is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -2826,6 +1781,13 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-cidr@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814" + integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA== + dependencies: + cidr-regex "^3.1.1" + is-core-module@^2.11.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" @@ -2852,6 +1814,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-ip@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -2963,11 +1932,6 @@ jest-worker@^28.0.2: merge-stream "^2.0.0" supports-color "^8.0.0" -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -2988,16 +1952,6 @@ jsdoc-type-pratt-parser@~3.1.0: resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz#a4a56bdc6e82e5865ffd9febc5b1a227ff28e67e" integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw== -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -3013,6 +1967,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -3025,11 +1984,6 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -3039,6 +1993,16 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsprim@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -3052,22 +2016,6 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3075,11 +2023,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -3097,13 +2040,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -3116,13 +2052,6 @@ lru_map@0.4.1: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.4.1.tgz#f7b4046283c79fb7370c36f8fca6aee4324b0a98" integrity sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg== -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3180,6 +2109,11 @@ nanoid@4.0.0: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.0.tgz#6e144dee117609232c3f415c34b0e550e64999a5" integrity sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg== +nanoid@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e" + integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -3195,6 +2129,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +netmask@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -3282,13 +2221,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -3296,13 +2228,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -3315,11 +2240,6 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -3405,12 +2325,10 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" +pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== prelude-ls@^1.2.1: version "1.2.1" @@ -3437,11 +2355,28 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +punycode@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +qs@^6.11.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -3454,29 +2389,10 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== regexp.prototype.flags@^1.4.3: version "1.5.0" @@ -3487,25 +2403,6 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.2.0" functions-have-names "^1.2.3" -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -3532,7 +2429,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.14.2, resolve@^1.22.1: +resolve@^1.22.1: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -3581,15 +2478,6 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - schema-utils@^3.1.1, schema-utils@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" @@ -3609,7 +2497,7 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -3659,7 +2547,7 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -source-map-support@~0.5.20: +source-map-support@^0.5.21, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -3739,13 +2627,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -3765,6 +2646,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swc-loader@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.3.tgz#6792f1c2e4c9ae9bf9b933b3e010210e270c186d" + integrity sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A== + tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -3800,11 +2686,23 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -tldts-core@^5.7.112: +tldts-core@^5.6.45, tldts-core@^5.7.112: version "5.7.112" resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.112.tgz#168459aa79495f5d46407a685a7a9f0cdc9a272b" integrity sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q== +tldts-core@^6.0.13: + version "6.0.13" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.0.13.tgz#44dd9e661a34b8a0b7d26b59ae40d14d9ef0e7fb" + integrity sha512-LcXhi9dyMeMBTMhpOSUUG4QwiMSADkcdmTg59rXkQyxoWTnyXgvpzoqJGvrhWTDwcs2NseybtqDTA6TWZgNxOA== + +tldts@5.6.45: + version "5.6.45" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.6.45.tgz#346344ba7d0d4694c6fbaa4eeb0b485c121a1ff9" + integrity sha512-Arp9q296eI/ALgV1QjjMstjGV18In4WkwGoiY6ZtkqOeZ0KiSLEA+LkHk3YJv2BYqTgnrPUSsSOK6d1tfcCdBA== + dependencies: + tldts-core "^5.6.45" + tldts@^5.7.97: version "5.7.112" resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.7.112.tgz#f3d7a5ade3ee09a48a1ecb4f05f04335b0787c84" @@ -3812,10 +2710,12 @@ tldts@^5.7.97: dependencies: tldts-core "^5.7.112" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +tldts@^6.0.8: + version "6.0.13" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.0.13.tgz#2d2415bc9c20f4de05524e6cd89337a9a36f97d9" + integrity sha512-9v+ZsSU8yBywX6RjT6/pNmwPzTVIeIi7sEiaFDhgsbXZRtvKKrWSiP4K0NTLm1rEvlfKYM24wxxcq7wMr4JRDA== + dependencies: + tldts-core "^6.0.13" to-regex-range@^5.0.1: version "5.0.1" @@ -3839,6 +2739,11 @@ tslib@2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -3849,6 +2754,11 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== +tslib@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -3887,29 +2797,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -3930,11 +2817,28 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== + dependencies: + punycode "^1.4.1" + qs "^6.11.0" + utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -4023,11 +2927,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -4042,3 +2941,8 @@ zod@3.19.1: version "3.19.1" resolved "https://registry.yarnpkg.com/zod/-/zod-3.19.1.tgz#112f074a97b50bfc4772d4ad1576814bd8ac4473" integrity sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== diff --git a/packages/examples/tswebextension-mv2/.babelrc b/packages/examples/tswebextension-mv2/.babelrc deleted file mode 100644 index 018557fab..000000000 --- a/packages/examples/tswebextension-mv2/.babelrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-react", - "@babel/preset-typescript" - ], - "plugins": [ - "@babel/plugin-proposal-class-properties", - "@babel/plugin-transform-runtime" - ] -} diff --git a/packages/examples/tswebextension-mv2/package.json b/packages/examples/tswebextension-mv2/package.json index c485a3370..61be8ae64 100644 --- a/packages/examples/tswebextension-mv2/package.json +++ b/packages/examples/tswebextension-mv2/package.json @@ -6,15 +6,15 @@ "license": "GPL-3.0", "scripts": { "build": "yarn build:chrome", - "build:chrome": "node -r esbuild-register ./scripts/build/index.ts", - "build:ff": "BROWSER=firefox node -r esbuild-register ./scripts/build/index.ts", - "run:ff": "node -r esbuild-register ./scripts/launchFirefoxExtension.ts", - "test": "node -r esbuild-register ./scripts/browser-test/index.ts", + "build:chrome": "node -r @swc-node/register ./scripts/build/index.ts", + "build:ff": "BROWSER=firefox node -r @swc-node/register ./scripts/build/index.ts", + "run:ff": "node -r @swc-node/register ./scripts/launchFirefoxExtension.ts", + "test": "node -r @swc-node/register ./scripts/browser-test/index.ts", "lint": "eslint 'extension/**/*.ts' 'scripts/**/*.ts'", "tswebextension": "tswebextension" }, "dependencies": { - "@adguard/tswebextension": "^0.1.2", + "@adguard/tswebextension": "^0.3.9", "bowser": "^2.11.0", "formik": "^2.2.9", "react": "^17.0.2", @@ -22,22 +22,15 @@ "webextension-polyfill": "^0.10.0" }, "devDependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", + "@swc-node/register": "^1.6.6", + "@swc/core": "^1.3.76", "@types/react": "^17.0.34", "@types/react-dom": "^17.0.11", "axios": "^0.24.0", - "babel-loader": "^8.2.3", "chalk": "4.1.2", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^10.0.0", "css-loader": "^6.5.1", - "esbuild": "^0.14.1", - "esbuild-register": "^3.2.0", "eslint": "^8.6.0", "eslint-config-airbnb-typescript": "^16.1.0", "eslint-plugin-import": "^2.25.4", @@ -45,6 +38,7 @@ "jsdom": "^18.1.1", "playwright": "^1.19.0-alpha-jan-19-2022", "style-loader": "^3.3.1", + "swc-loader": "^0.2.3", "web-ext": "^6.6.0", "webpack": "^5.64.2" } diff --git a/packages/examples/tswebextension-mv2/scripts/build/webpack.config.ts b/packages/examples/tswebextension-mv2/scripts/build/webpack.config.ts index 9e76dc981..d136b58fe 100644 --- a/packages/examples/tswebextension-mv2/scripts/build/webpack.config.ts +++ b/packages/examples/tswebextension-mv2/scripts/build/webpack.config.ts @@ -37,10 +37,20 @@ export const config: Configuration = { { test: /\.(js|ts)x?$/, exclude: /node_modules/, - use: [{ - loader: 'babel-loader', - options: { babelrc: true }, - }], + use: [ + { + loader: "swc-loader", + options: { + env: { + targets: { + chrome: 79, + firefox: 78, + opera: 66, + }, + }, + }, + }, + ], }, { test: /\.css$/, diff --git a/packages/examples/tswebextension-mv2/tsconfig.json b/packages/examples/tswebextension-mv2/tsconfig.json index f2145f705..c6b0ffa51 100644 --- a/packages/examples/tswebextension-mv2/tsconfig.json +++ b/packages/examples/tswebextension-mv2/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2022", "lib": [ "dom", "dom.iterable", diff --git a/packages/examples/tswebextension-mv2/yarn.lock b/packages/examples/tswebextension-mv2/yarn.lock index 671cdd5ca..9023f5204 100644 --- a/packages/examples/tswebextension-mv2/yarn.lock +++ b/packages/examples/tswebextension-mv2/yarn.lock @@ -2,292 +2,72 @@ # yarn lockfile v1 -"@adguard/assistant@^4.3.69": - version "4.3.69" - resolved "https://registry.yarnpkg.com/@adguard/assistant/-/assistant-4.3.69.tgz#4a66acb9c127c41cc5fbca3c51e854ed3aaf79ba" - integrity sha512-mNC6bQ4VZmDqrC519H0J+ZUvjdlavQei3BMYWyPW3CBSrY823BY/S+yBwQglaDw5EYiWD1vdXDWwHMdNzFAEgw== +"@adguard/assistant@^4.3.70": + version "4.3.70" + resolved "https://registry.yarnpkg.com/@adguard/assistant/-/assistant-4.3.70.tgz#7fdc072315b5ddc797ad91bf06bee3b20e911098" + integrity sha512-q5o4ejQgRQMFbtV49X1ark0Ytb+MP/3vC9XErHqAcvh6wHpN/Hm2Q1+jbhiHHIs/H2rCU20TyVwZlGs0xtQ60w== "@adguard/extended-css@^2.0.52": version "2.0.52" resolved "https://registry.yarnpkg.com/@adguard/extended-css/-/extended-css-2.0.52.tgz#f5e7c3df1796deb96404a1b6441e7a4c729f09ac" integrity sha512-T77MnFD/+A3q93MNEq13qPUXPQRBeOUO9LRyqslcaz7jD5qMcikX1nx436u3PXdZXZpa6R0nnwXQ7wwScDmVgw== -"@adguard/scriptlets@^1.9.7": - version "1.9.7" - resolved "https://registry.yarnpkg.com/@adguard/scriptlets/-/scriptlets-1.9.7.tgz#dff4637122ba07bec79e48eb88cbb02cd0ba7167" - integrity sha512-MZZde1vYfKLLAyVIQKEsuQC2Roc07jjjLsyymuUV3vhh9NhMDTgRG+mVWNp2qAg8zDYEHjm18/R7i0Ir1kj/bQ== +"@adguard/scriptlets@^1.9.62": + version "1.9.62" + resolved "https://registry.yarnpkg.com/@adguard/scriptlets/-/scriptlets-1.9.62.tgz#f60b83bb928c160f59153989c9491504e510498b" + integrity sha512-uWSlfMnAJUmIVsChl7KrECBXDJotSfq/N94iNLtfwnJI7br9Q5Gl65iuH89rh0Fs62OwexKlj3cnrzHL4TEFyw== dependencies: - "@babel/runtime" "^7.7.2" + "@babel/runtime" "^7.20.13" js-yaml "^3.13.1" -"@adguard/tswebextension@^0.1.2": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@adguard/tswebextension/-/tswebextension-0.1.4.tgz#f650ac9b3dc7b6cbaa6c202bedaced3e60cabb37" - integrity sha512-AuPB/zMMjEL3f42MmruWZSgiVU+Q4TFSnY1SxbHk5diLwEww9RWNtdJUl7mlcgqn6yzbX6ao3RLUN0TizEHo9w== +"@adguard/tsurlfilter@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@adguard/tsurlfilter/-/tsurlfilter-2.1.6.tgz#9cce7d9d561504fc754d97745489221e256d3b47" + integrity sha512-RNdZaf1fx4QvEfd8EKhznHOzcYcGyYvx3Njtkay4P7vEcLoTUcouyO1T0cEmVKB5DTk73tJ+bXkVhJSsh4BaXg== dependencies: - "@adguard/assistant" "^4.3.69" - "@adguard/extended-css" "^2.0.52" - "@adguard/scriptlets" "^1.9.7" - bowser "2.11.0" + "@adguard/scriptlets" "^1.9.62" commander "9.4.1" - fs-extra "10.1.0" + ip6addr "0.2.3" + is-cidr "4.0.2" + is-ip "3.1.0" lru_map "0.4.1" - nanoid "4.0.0" - text-encoding "git+https://github.com/AdguardTeam/text-encoding.git#v0.7.2" - tldts "^5.7.97" - tslib "2.4.0" - webextension-polyfill "0.10.0" + netmask "2.0.2" + punycode "2.1.1" + tldts "5.6.45" zod "3.19.1" -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== +"@adguard/tswebextension@^0.3.9": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@adguard/tswebextension/-/tswebextension-0.3.8.tgz#3a98a50693607cfccbe25669a77722409e40b52b" + integrity sha512-w595Fae19UV73eUvf8WeG3NtKvM7otzFNywj0KMjg355Sj13G+uChrFxpcWxdh3I92UL19ttW9pUZUhQx8NJSQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@adguard/assistant" "^4.3.70" + "@adguard/extended-css" "^2.0.52" + "@adguard/scriptlets" "^1.9.62" + "@adguard/tsurlfilter" "^2.1.6" + bowser "2.11.0" + commander "11.0.0" + fs-extra "11.1.1" + lru_map "0.4.1" + nanoid "4.0.2" + text-encoding "git+https://github.com/AdguardTeam/text-encoding.git#v0.7.2" + tldts "^6.0.8" + tslib "2.5.3" + webextension-polyfill "0.10.0" + zod "3.21.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.21.4": +"@babel/code-frame@^7.0.0": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" - integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== - -"@babel/core@^7.16.0": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" - integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.0" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helpers" "^7.22.0" - "@babel/parser" "^7.22.0" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== - dependencies: - "@babel/types" "^7.22.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" - integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" - integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== - dependencies: - "@babel/compat-data" "^7.22.0" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" - integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" - integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - semver "^6.3.0" - -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" - integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" - integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" - integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" - integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": +"@babel/helper-validator-identifier@^7.18.6": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" - integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== - dependencies: - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.3" - "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -297,762 +77,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" - integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - -"@babel/plugin-proposal-class-properties@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-syntax-import-attributes@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" - integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-async-generator-functions@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" - integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-class-properties@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" - integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-class-static-block@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" - integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" - -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-dynamic-import@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" - integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-export-namespace-from@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" - integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-json-strings@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" - integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" - integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== - dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" - -"@babel/plugin-transform-modules-systemjs@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" - integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" - integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-new-target@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" - integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" - integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" - integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" - integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.3" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-optional-catch-binding@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" - integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" - integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" - integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-private-methods@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" - integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-private-property-in-object@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" - integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz#5a1f380df3703ba92eb1a930a539c6d88836f690" - integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/types" "^7.22.3" - -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - regenerator-transform "^0.15.1" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-runtime@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42" - integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typescript@^7.21.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz#8f662cec8ba88c873f1c7663c0c94e3f68592f09" - integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-typescript" "^7.21.4" - -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-unicode-property-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" - integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-unicode-sets-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" - integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/preset-env@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" - integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-attributes" "^7.22.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.3" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-class-properties" "^7.22.3" - "@babel/plugin-transform-class-static-block" "^7.22.3" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-dynamic-import" "^7.22.1" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-export-namespace-from" "^7.22.3" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-json-strings" "^7.22.3" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.3" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" - "@babel/plugin-transform-new-target" "^7.22.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" - "@babel/plugin-transform-numeric-separator" "^7.22.3" - "@babel/plugin-transform-object-rest-spread" "^7.22.3" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-optional-catch-binding" "^7.22.3" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - "@babel/plugin-transform-parameters" "^7.22.3" - "@babel/plugin-transform-private-methods" "^7.22.3" - "@babel/plugin-transform-private-property-in-object" "^7.22.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.3" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.4" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.16.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.3.tgz#2ec7f91d0c924fa2ea0c7cfbbf690bc62b79cd84" - integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.22.3" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.16.0": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" - integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-typescript" "^7.21.3" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - "@babel/runtime@7.13.9": version "7.13.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.9.tgz#97dbe2116e2630c489f22e0656decd60aaa1fcee" @@ -1060,46 +84,12 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" - -"@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.4.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" - integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== - dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" +"@babel/runtime@^7.20.13": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== + dependencies: + regenerator-runtime "^0.14.0" "@devicefarmer/adbkit-logcat@^1.1.0": version "1.1.0" @@ -1126,11 +116,6 @@ node-forge "^0.10.0" split "~0.3.3" -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1206,7 +191,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": +"@jridgewell/gen-mapping@^0.3.0": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== @@ -1282,6 +267,97 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@swc-node/core@^1.10.4": + version "1.10.4" + resolved "https://registry.yarnpkg.com/@swc-node/core/-/core-1.10.4.tgz#3cb5ddb0171bbf541c17c713c91423799e67e0ec" + integrity sha512-ixZCb4LsSUPflnOxj4a8T5yTPzKbgvP+tF0N59Rk2+68ikFRt9Qci2qy9xfuDIQbuiONzXersrNpd+p598uH0A== + +"@swc-node/register@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@swc-node/register/-/register-1.6.6.tgz#dfcf092b45c76d76d45949b1be8e17561566e2d9" + integrity sha512-KgnQrWLgtJzEgPpxvhOPUDonv1xreVumGdzXDQlDVIqU3vH+spW8ZYxxyjJVMh3G/mQG8E3bFvUMHIS+E3FL2w== + dependencies: + "@swc-node/core" "^1.10.4" + "@swc-node/sourcemap-support" "^0.3.0" + colorette "^2.0.19" + debug "^4.3.4" + pirates "^4.0.5" + tslib "^2.5.0" + +"@swc-node/sourcemap-support@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@swc-node/sourcemap-support/-/sourcemap-support-0.3.0.tgz#e8a0d139bd3e8db39635f63fde43dbe6c39237cc" + integrity sha512-gqBJSmJMWomZFxlppaKea7NeAqFrDrrS0RMt24No92M3nJWcyI9YKGEQKl+EyJqZ5gh6w1s0cTklMHMzRwA1NA== + dependencies: + source-map-support "^0.5.21" + tslib "^2.5.0" + +"@swc/core-darwin-arm64@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.76.tgz#757f10c6482a44b8cea3e85b8ae714ce9b31b4b5" + integrity sha512-ovviEhZ/1E81Z9OGrO0ivLWk4VCa3I3ZzM+cd3gugglRRwVwtlIaoIYqY5S3KiCAupDd1+UCl5X7Vbio7a/V8g== + +"@swc/core-darwin-x64@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.76.tgz#edba4a4dbbc7454bc914fc8cf61545a74622d46f" + integrity sha512-tcySTDqs0SHCebtW35sCdcLWsmTEo7bEwx0gNL/spetqVT9fpFi6qU8qcnt7i2KaZHbeNl9g1aadu+Yrni+GzA== + +"@swc/core-linux-arm-gnueabihf@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.76.tgz#d998f0e51ebec03e8666f02cee3fc6e40ceaf680" + integrity sha512-apgzpGWy1AwoMF4urAAASsAjE7rEzZFIF+p6utuxhS7cNHzE0AyEVDYJbo+pzBdlZ8orBdzzsHtFwoEgKOjebA== + +"@swc/core-linux-arm64-gnu@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.76.tgz#4f4d98f699e92ebafb10ed75e468384a81ab128c" + integrity sha512-c3c0zz6S0eludqidDpuqbadE0WT3OZczyQxe9Vw8lFFXES85mvNGtwYzyGK2o7TICpsuHrndwDIoYpmpWk879g== + +"@swc/core-linux-arm64-musl@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.76.tgz#4341ca15e4a398de73af149c52c4d45b8cf5c4c8" + integrity sha512-Is3bpq7F2qtlnkzEeOD6HIZJPpOmu3q6c82lKww90Q0NnrlSluVMozTHJgwVoFZyizH7uLnk0LuNcEAWLnmJIw== + +"@swc/core-linux-x64-gnu@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.76.tgz#cc2e6f0f90f0e9d6dcb8bc62cd31172e0967b396" + integrity sha512-iwCeRzd9oSvUzqt7nU6p/ztceAWfnO9XVxBn502R5gs6QCBbE1HCKrWHDO77aKPK7ss+0NcIGHvXTd9L8/wRzw== + +"@swc/core-linux-x64-musl@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.76.tgz#ebc327df5e07aa02e41309e56590f505f1fc64c0" + integrity sha512-a671g4tW8kyFeuICsgq4uB9ukQfiIyXJT4V6YSnmqhCTz5mazWuDxZ5wKnx/1g5nXTl+U5cWH2TZaCJatp4GKA== + +"@swc/core-win32-arm64-msvc@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.76.tgz#34fb884d2ee2eec3382c01f712bde0f05e058a3b" + integrity sha512-+swEFtjdMezS0vKUhJC3psdSDtOJGY5pEOt4e8XOPvn7aQpKQ9LfF49XVtIwDSk5SGuWtVoLFzkSY3reWUJCyg== + +"@swc/core-win32-ia32-msvc@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.76.tgz#a0dc94357d72eca6572522ed1202b6476222c249" + integrity sha512-5CqwAykpGBJ3PqGLOlWGLGIPpBAG1IwWVDUfro3hhjQ7XJxV5Z1aQf5V5OJ90HJVtrEAVx2xx59UV/Dh081LOg== + +"@swc/core-win32-x64-msvc@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.76.tgz#eea647407895a5a410a459b2abf8572adb147927" + integrity sha512-CiMpWLLlR3Cew9067E7XxaLBwYYJ90r9EhGSO6V1pvYSWj7ET/Ppmtj1ZhzPJMqRXAP6xflfl5R5o4ee1m4WLA== + +"@swc/core@^1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.76.tgz#f5259bd718e11854d9bd3a05f91f40bca21dffbc" + integrity sha512-aYYTA2aVYkwJAZepQXtPnkUthhOfn8qd6rsh+lrJxonFrjmpI7RHt2tMDVTXP6XDX7fvnvrVtT1bwZfmBFPh0Q== + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.76" + "@swc/core-darwin-x64" "1.3.76" + "@swc/core-linux-arm-gnueabihf" "1.3.76" + "@swc/core-linux-arm64-gnu" "1.3.76" + "@swc/core-linux-arm64-musl" "1.3.76" + "@swc/core-linux-x64-gnu" "1.3.76" + "@swc/core-linux-x64-musl" "1.3.76" + "@swc/core-win32-arm64-msvc" "1.3.76" + "@swc/core-win32-ia32-msvc" "1.3.76" + "@swc/core-win32-x64-msvc" "1.3.76" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -1328,7 +404,7 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.12" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== @@ -1841,40 +917,6 @@ axios@^0.24.0: dependencies: follow-redirects "^1.14.4" -babel-loader@^8.2.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" - -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1887,11 +929,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - bluebird@~2.9.24: version "2.9.34" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.9.34.tgz#2f7b4ec80216328a9fddebdf69c8d4942feff7d8" @@ -1941,7 +978,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: +browserslist@^4.14.5: version "4.21.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== @@ -2091,6 +1128,13 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cidr-regex@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" + integrity sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw== + dependencies: + ip-regex "^4.1.0" + clean-css@^5.2.2: version "5.3.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" @@ -2155,6 +1199,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + columnify@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" @@ -2170,6 +1219,11 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" + integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== + commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" @@ -2197,11 +1251,6 @@ common-tags@1.8.2: resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2234,11 +1283,6 @@ confusing-browser-globals@^1.0.10: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - copy-webpack-plugin@^10.0.0: version "10.2.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" @@ -2251,13 +1295,6 @@ copy-webpack-plugin@^10.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== - dependencies: - browserslist "^4.21.5" - core-js@3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.0.tgz#f479dbfc3dffb035a0827602dd056839a774aa71" @@ -2365,7 +1402,7 @@ debounce@1.2.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2607,11 +1644,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - end-of-stream@^1.1.0, end-of-stream@^1.4.1, end-of-stream@~1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2719,140 +1751,6 @@ es6-promisify@7.0.0: resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-7.0.0.tgz#9a710008dd6a4ab75a89e280bad787bfb749927b" integrity sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q== -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - -esbuild-linux-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" - integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== - -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-register@^3.2.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.4.2.tgz#1e39ee0a77e8f320a9790e68c64c3559620b9175" - integrity sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q== - dependencies: - debug "^4.3.4" - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - -esbuild@^0.14.1: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" - integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== - optionalDependencies: - "@esbuild/linux-loong64" "0.14.54" - esbuild-android-64 "0.14.54" - esbuild-android-arm64 "0.14.54" - esbuild-darwin-64 "0.14.54" - esbuild-darwin-arm64 "0.14.54" - esbuild-freebsd-64 "0.14.54" - esbuild-freebsd-arm64 "0.14.54" - esbuild-linux-32 "0.14.54" - esbuild-linux-64 "0.14.54" - esbuild-linux-arm "0.14.54" - esbuild-linux-arm64 "0.14.54" - esbuild-linux-mips64le "0.14.54" - esbuild-linux-ppc64le "0.14.54" - esbuild-linux-riscv64 "0.14.54" - esbuild-linux-s390x "0.14.54" - esbuild-netbsd-64 "0.14.54" - esbuild-openbsd-64 "0.14.54" - esbuild-sunos-64 "0.14.54" - esbuild-windows-32 "0.14.54" - esbuild-windows-64 "0.14.54" - esbuild-windows-arm64 "0.14.54" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -3226,23 +2124,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -3333,10 +2214,10 @@ formik@^2.2.9: tiny-warning "^1.0.2" tslib "^1.10.0" -fs-extra@10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== +fs-extra@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -3404,11 +2285,6 @@ fx-runner@1.2.0: which "1.2.4" winreg "0.0.12" -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -3514,11 +2390,6 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^13.19.0, globals@^13.6.0: version "13.20.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" @@ -3837,6 +2708,19 @@ invert-kv@^3.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== +ip-regex@^4.0.0, ip-regex@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip6addr@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ip6addr/-/ip6addr-0.2.3.tgz#660df0d27092434f0aadee025aba8337c6d7d4d4" + integrity sha512-qA9DXRAUW+lT47/i/4+Q3GHPwZjGt/atby1FH/THN6GVATA6+Pjp2nztH7k6iKeil7hzYnBwfSsxjthlJ8lJKw== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.4.0" + is-absolute@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" @@ -3893,6 +2777,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-cidr@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814" + integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA== + dependencies: + cidr-regex "^3.1.1" + is-core-module@^2.11.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" @@ -3937,6 +2828,13 @@ is-installed-globally@^0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-ip@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-mergeable-object@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-mergeable-object/-/is-mergeable-object-1.1.1.tgz#faaa3ed1cfce87d6f7d2f5885e92cc30af3e2ebf" @@ -4169,16 +3067,6 @@ jsdom@^18.1.1: ws "^8.2.3" xml-name-validator "^4.0.0" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" @@ -4228,11 +3116,6 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -4258,7 +3141,7 @@ jsonwebtoken@8.5.1: ms "^2.1.1" semver "^5.6.0" -jsprim@^1.2.2: +jsprim@^1.2.2, jsprim@^1.4.0: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== @@ -4357,22 +3240,6 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -4385,11 +3252,6 @@ lodash-es@^4.17.21: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -4459,13 +3321,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -4478,7 +3333,7 @@ lru_map@0.4.1: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.4.1.tgz#f7b4046283c79fb7370c36f8fca6aee4324b0a98" integrity sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg== -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -4629,10 +3484,10 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== -nanoid@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.0.tgz#6e144dee117609232c3f415c34b0e550e64999a5" - integrity sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg== +nanoid@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e" + integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw== nanoid@^3.3.1, nanoid@^3.3.6: version "3.3.6" @@ -4654,6 +3509,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +netmask@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -4849,13 +3709,6 @@ p-is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -4863,13 +3716,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -4882,11 +3728,6 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -5048,12 +3889,10 @@ pino@7.9.1: sonic-boom "^2.2.1" thread-stream "^0.13.0" -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" +pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== playwright-core@1.34.3: version "1.34.3" @@ -5179,6 +4018,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -5289,29 +4133,15 @@ real-require@^0.1.0: resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.4: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.5.0" @@ -5327,18 +4157,6 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - registry-auth-token@^4.0.0: version "4.2.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" @@ -5353,13 +4171,6 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -5430,7 +4241,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.14.2, resolve@^1.22.1: +resolve@^1.22.1: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -5533,15 +4344,6 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - schema-utils@^3.1.1, schema-utils@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" @@ -5580,7 +4382,7 @@ semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -5689,7 +4491,7 @@ source-map-support@0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@0.5.21, source-map-support@~0.5.20: +source-map-support@0.5.21, source-map-support@^0.5.21, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -5891,6 +4693,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swc-loader@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.3.tgz#6792f1c2e4c9ae9bf9b933b3e010210e270c186d" + integrity sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -5962,17 +4769,29 @@ tiny-warning@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tldts-core@^5.7.112: +tldts-core@^5.6.45: version "5.7.112" resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.7.112.tgz#168459aa79495f5d46407a685a7a9f0cdc9a272b" integrity sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q== -tldts@^5.7.97: - version "5.7.112" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.7.112.tgz#f3d7a5ade3ee09a48a1ecb4f05f04335b0787c84" - integrity sha512-6VSJ/C0uBtc2PQlLsp4IT8MIk2UUh6qVeXB1HZtK+0HiXlAPzNcfF3p2WM9RqCO/2X1PIa4danlBLPoC2/Tc7A== +tldts-core@^6.0.14: + version "6.0.14" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.0.14.tgz#66a325500fc46826b85719b588715f23e167b0e7" + integrity sha512-ESYhU/bgs6jiHlnl5h029f+0dB7EKRiTaxM/jHLZ6powScbmsgsrFcFjmyrjDgCvI/BRY79TEBBClmqLNEPyjQ== + +tldts@5.6.45: + version "5.6.45" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.6.45.tgz#346344ba7d0d4694c6fbaa4eeb0b485c121a1ff9" + integrity sha512-Arp9q296eI/ALgV1QjjMstjGV18In4WkwGoiY6ZtkqOeZ0KiSLEA+LkHk3YJv2BYqTgnrPUSsSOK6d1tfcCdBA== + dependencies: + tldts-core "^5.6.45" + +tldts@^6.0.8: + version "6.0.14" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.0.14.tgz#bd126027d456b61e833aa4a49b85f4e7074c3f97" + integrity sha512-mYU7xwVGfiiC4lkWr4h3Q6U4kfAq3aWP1KsJZyRlVVeDQ3ZSBLmE20543dWSqI0U799PNzhpHObex5n60TeBGw== dependencies: - tldts-core "^5.7.112" + tldts-core "^6.0.14" tmp@0.2.1: version "0.2.1" @@ -5981,11 +4800,6 @@ tmp@0.2.1: dependencies: rimraf "^3.0.0" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" @@ -6038,10 +4852,10 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== tslib@^1.10.0: version "1.14.1" @@ -6053,6 +4867,11 @@ tslib@^2.0.3, tslib@^2.2.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== +tslib@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -6120,29 +4939,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -6527,11 +5323,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -6598,3 +5389,8 @@ zod@3.19.1: version "3.19.1" resolved "https://registry.yarnpkg.com/zod/-/zod-3.19.1.tgz#112f074a97b50bfc4772d4ad1576814bd8ac4473" integrity sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== diff --git a/packages/examples/tswebextension-mv3/.babelrc b/packages/examples/tswebextension-mv3/.babelrc deleted file mode 100644 index 018557fab..000000000 --- a/packages/examples/tswebextension-mv3/.babelrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-react", - "@babel/preset-typescript" - ], - "plugins": [ - "@babel/plugin-proposal-class-properties", - "@babel/plugin-transform-runtime" - ] -} diff --git a/packages/examples/tswebextension-mv3/package.json b/packages/examples/tswebextension-mv3/package.json index b80006776..1be2dba9b 100644 --- a/packages/examples/tswebextension-mv3/package.json +++ b/packages/examples/tswebextension-mv3/package.json @@ -6,46 +6,34 @@ "license": "GPL-3.0", "scripts": { "build": "yarn lint && yarn build:precompile-rules && yarn build:extension", - "build:extension": "node -r esbuild-register ./scripts/build", + "build:extension": "node -r @swc-node/register ./scripts/build", "build:tsurl": "cd ../../tsurlfilter && yarn build", "build:tsweb": "cd ../../tswebextension && yarn build", - "build:precompile-rules": "node -r esbuild-register ./scripts/precompile-rules.ts", + "build:precompile-rules": "node -r @swc-node/register ./scripts/precompile-rules.ts", "lint": "eslint 'extension/**/*.ts' 'scripts/**/*.ts' && tsc --noEmit", "tswebextension": "tswebextension", - "test": "rimraf tmp && cross-env PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS=1 node -r esbuild-register ./scripts/browser-test/index.ts" + "test": "rimraf tmp && cross-env PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS=1 node -r @swc-node/register ./scripts/browser-test/index.ts" }, "dependencies": { - "@adguard/tswebextension": "^0.3.8", - "assert": "^2.0.0", - "buffer": "^6.0.3", - "crypto-browserify": "^3.12.0", + "@adguard/tswebextension": "^0.3.9", "react": "^17.0.2", - "react-dom": "^17.0.2", - "stream-browserify": "^3.0.0", - "url": "^0.11.1", - "util": "^0.12.5" + "react-dom": "^17.0.2" }, "devDependencies": { - "@adguard/tsurlfilter": "^2.0.1", - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.7", - "@babel/preset-typescript": "^7.16.0", + "@adguard/tsurlfilter": "^2.1.7", + "@swc-node/register": "^1.6.6", + "@swc/core": "^1.3.76", + "@types/fs-extra": "^11.0.1", "@types/react": "^17.0.41", "@types/react-dom": "^17.0.14", "@typescript-eslint/eslint-plugin": "^6.2.1", "@typescript-eslint/parser": "^6.2.1", "axios": "^0.26.0", - "babel-loader": "^8.2.3", - "chalk": "^5.0.1", + "chalk": "4.1.2", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^10.0.0", "cross-env": "^7.0.3", "css-loader": "^6.7.1", - "esbuild": "^0.14.1", - "esbuild-register": "^3.2.0", "eslint": "8.25.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.28.0", @@ -55,6 +43,7 @@ "playwright": "^1.27.1", "rimraf": "^3.0.2", "style-loader": "^3.3.1", + "swc-loader": "^0.2.3", "typescript": "4.7.4", "webpack": "^5.64.2" } diff --git a/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts b/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts index b16d7a18f..9598cd725 100644 --- a/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts +++ b/packages/examples/tswebextension-mv3/scripts/build/webpack.config.ts @@ -1,6 +1,6 @@ import path from 'path'; import fs from 'fs'; -import { Configuration, ProvidePlugin } from 'webpack'; +import { Configuration } from 'webpack'; import HtmlWebpackPlugin from 'html-webpack-plugin'; import CopyWebpackPlugin from 'copy-webpack-plugin'; import { CleanWebpackPlugin } from 'clean-webpack-plugin'; @@ -67,24 +67,26 @@ export const config: Configuration = { }, resolve: { extensions: ['*', '.tsx', '.ts', '.js'], - fallback: { - assert: require.resolve('assert'), - buffer: require.resolve('buffer'), - url: require.resolve('url'), - util: require.resolve('util'), - crypto: require.resolve('crypto-browserify'), - stream: require.resolve('stream-browserify'), - }, }, module: { rules: [ { test: /\.(js|ts)x?$/, exclude: /node_modules/, - use: [{ - loader: 'babel-loader', - options: { babelrc: true }, - }], + use: [ + { + loader: 'swc-loader', + options: { + env: { + targets: { + chrome: 79, + firefox: 78, + opera: 66, + }, + }, + }, + }, + ], }, { test: /\.css$/, @@ -94,12 +96,6 @@ export const config: Configuration = { }, plugins: [ new CleanWebpackPlugin(), - new ProvidePlugin({ - Buffer: ['buffer', 'Buffer'], - }), - new ProvidePlugin({ - process: 'process/browser', - }), new HtmlWebpackPlugin({ template: path.join(POPUP_PATH, 'index.html'), filename: 'pages/popup.html', diff --git a/packages/examples/tswebextension-mv3/tsconfig.json b/packages/examples/tswebextension-mv3/tsconfig.json index ba3fe548d..92df8e9cf 100644 --- a/packages/examples/tswebextension-mv3/tsconfig.json +++ b/packages/examples/tswebextension-mv3/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2022", "lib": [ "dom", "dom.iterable", @@ -17,8 +17,5 @@ "isolatedModules": true, "noEmit": true, "jsx": "react" - }, - "include": [ - "extension" - ] + } } diff --git a/packages/examples/tswebextension-mv3/yarn.lock b/packages/examples/tswebextension-mv3/yarn.lock index f7df20f7b..f30984266 100644 --- a/packages/examples/tswebextension-mv3/yarn.lock +++ b/packages/examples/tswebextension-mv3/yarn.lock @@ -20,7 +20,7 @@ "@babel/runtime" "^7.20.13" js-yaml "^3.13.1" -"@adguard/tsurlfilter@^2.0.1", "@adguard/tsurlfilter@^2.1.6": +"@adguard/tsurlfilter@^2.1.6", "@adguard/tsurlfilter@^2.1.7": version "2.1.6" resolved "https://registry.yarnpkg.com/@adguard/tsurlfilter/-/tsurlfilter-2.1.6.tgz#9cce7d9d561504fc754d97745489221e256d3b47" integrity sha512-RNdZaf1fx4QvEfd8EKhznHOzcYcGyYvx3Njtkay4P7vEcLoTUcouyO1T0cEmVKB5DTk73tJ+bXkVhJSsh4BaXg== @@ -36,7 +36,7 @@ tldts "5.6.45" zod "3.19.1" -"@adguard/tswebextension@^0.3.8": +"@adguard/tswebextension@^0.3.9": version "0.3.8" resolved "https://registry.yarnpkg.com/@adguard/tswebextension/-/tswebextension-0.3.8.tgz#3a98a50693607cfccbe25669a77722409e40b52b" integrity sha512-w595Fae19UV73eUvf8WeG3NtKvM7otzFNywj0KMjg355Sj13G+uChrFxpcWxdh3I92UL19ttW9pUZUhQx8NJSQ== @@ -56,1020 +56,6 @@ webextension-polyfill "0.10.0" zod "3.21.4" -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" - integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== - -"@babel/core@^7.16.0": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" - integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.0" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helpers" "^7.22.0" - "@babel/parser" "^7.22.0" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== - dependencies: - "@babel/types" "^7.22.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz#c9b83d1ba74e163e023f008a3d3204588a7ceb60" - integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" - integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== - dependencies: - "@babel/compat-data" "^7.22.0" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" - integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" - integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - semver "^6.3.0" - -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" - integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" - integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" - integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" - integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" - integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== - dependencies: - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.3" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" - integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - -"@babel/plugin-proposal-class-properties@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-syntax-import-attributes@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" - integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-async-generator-functions@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" - integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-class-properties@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" - integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-class-static-block@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" - integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" - -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-dynamic-import@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" - integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-export-namespace-from@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" - integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-json-strings@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" - integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" - integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== - dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" - -"@babel/plugin-transform-modules-systemjs@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" - integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" - integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-new-target@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" - integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" - integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" - integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" - integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.3" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-optional-catch-binding@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" - integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" - integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" - integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-private-methods@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" - integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-private-property-in-object@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" - integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz#5a1f380df3703ba92eb1a930a539c6d88836f690" - integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/types" "^7.22.3" - -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - regenerator-transform "^0.15.1" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-runtime@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42" - integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typescript@^7.21.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz#8f662cec8ba88c873f1c7663c0c94e3f68592f09" - integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-typescript" "^7.21.4" - -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-unicode-property-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" - integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-unicode-sets-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" - integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/preset-env@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" - integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-attributes" "^7.22.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.3" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-class-properties" "^7.22.3" - "@babel/plugin-transform-class-static-block" "^7.22.3" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-dynamic-import" "^7.22.1" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-export-namespace-from" "^7.22.3" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-json-strings" "^7.22.3" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.3" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" - "@babel/plugin-transform-new-target" "^7.22.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" - "@babel/plugin-transform-numeric-separator" "^7.22.3" - "@babel/plugin-transform-object-rest-spread" "^7.22.3" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-optional-catch-binding" "^7.22.3" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - "@babel/plugin-transform-parameters" "^7.22.3" - "@babel/plugin-transform-private-methods" "^7.22.3" - "@babel/plugin-transform-private-property-in-object" "^7.22.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.3" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.4" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.16.7": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.3.tgz#2ec7f91d0c924fa2ea0c7cfbbf690bc62b79cd84" - integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.22.3" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.16.0": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" - integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-typescript" "^7.21.3" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - "@babel/runtime@^7.20.13": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" @@ -1077,52 +63,6 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/runtime@^7.8.4": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" - -"@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.4.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" - integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== - dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== - "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1169,7 +109,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": +"@jridgewell/gen-mapping@^0.3.0": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== @@ -1235,6 +175,97 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@swc-node/core@^1.10.4": + version "1.10.4" + resolved "https://registry.yarnpkg.com/@swc-node/core/-/core-1.10.4.tgz#3cb5ddb0171bbf541c17c713c91423799e67e0ec" + integrity sha512-ixZCb4LsSUPflnOxj4a8T5yTPzKbgvP+tF0N59Rk2+68ikFRt9Qci2qy9xfuDIQbuiONzXersrNpd+p598uH0A== + +"@swc-node/register@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@swc-node/register/-/register-1.6.6.tgz#dfcf092b45c76d76d45949b1be8e17561566e2d9" + integrity sha512-KgnQrWLgtJzEgPpxvhOPUDonv1xreVumGdzXDQlDVIqU3vH+spW8ZYxxyjJVMh3G/mQG8E3bFvUMHIS+E3FL2w== + dependencies: + "@swc-node/core" "^1.10.4" + "@swc-node/sourcemap-support" "^0.3.0" + colorette "^2.0.19" + debug "^4.3.4" + pirates "^4.0.5" + tslib "^2.5.0" + +"@swc-node/sourcemap-support@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@swc-node/sourcemap-support/-/sourcemap-support-0.3.0.tgz#e8a0d139bd3e8db39635f63fde43dbe6c39237cc" + integrity sha512-gqBJSmJMWomZFxlppaKea7NeAqFrDrrS0RMt24No92M3nJWcyI9YKGEQKl+EyJqZ5gh6w1s0cTklMHMzRwA1NA== + dependencies: + source-map-support "^0.5.21" + tslib "^2.5.0" + +"@swc/core-darwin-arm64@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.76.tgz#757f10c6482a44b8cea3e85b8ae714ce9b31b4b5" + integrity sha512-ovviEhZ/1E81Z9OGrO0ivLWk4VCa3I3ZzM+cd3gugglRRwVwtlIaoIYqY5S3KiCAupDd1+UCl5X7Vbio7a/V8g== + +"@swc/core-darwin-x64@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.76.tgz#edba4a4dbbc7454bc914fc8cf61545a74622d46f" + integrity sha512-tcySTDqs0SHCebtW35sCdcLWsmTEo7bEwx0gNL/spetqVT9fpFi6qU8qcnt7i2KaZHbeNl9g1aadu+Yrni+GzA== + +"@swc/core-linux-arm-gnueabihf@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.76.tgz#d998f0e51ebec03e8666f02cee3fc6e40ceaf680" + integrity sha512-apgzpGWy1AwoMF4urAAASsAjE7rEzZFIF+p6utuxhS7cNHzE0AyEVDYJbo+pzBdlZ8orBdzzsHtFwoEgKOjebA== + +"@swc/core-linux-arm64-gnu@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.76.tgz#4f4d98f699e92ebafb10ed75e468384a81ab128c" + integrity sha512-c3c0zz6S0eludqidDpuqbadE0WT3OZczyQxe9Vw8lFFXES85mvNGtwYzyGK2o7TICpsuHrndwDIoYpmpWk879g== + +"@swc/core-linux-arm64-musl@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.76.tgz#4341ca15e4a398de73af149c52c4d45b8cf5c4c8" + integrity sha512-Is3bpq7F2qtlnkzEeOD6HIZJPpOmu3q6c82lKww90Q0NnrlSluVMozTHJgwVoFZyizH7uLnk0LuNcEAWLnmJIw== + +"@swc/core-linux-x64-gnu@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.76.tgz#cc2e6f0f90f0e9d6dcb8bc62cd31172e0967b396" + integrity sha512-iwCeRzd9oSvUzqt7nU6p/ztceAWfnO9XVxBn502R5gs6QCBbE1HCKrWHDO77aKPK7ss+0NcIGHvXTd9L8/wRzw== + +"@swc/core-linux-x64-musl@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.76.tgz#ebc327df5e07aa02e41309e56590f505f1fc64c0" + integrity sha512-a671g4tW8kyFeuICsgq4uB9ukQfiIyXJT4V6YSnmqhCTz5mazWuDxZ5wKnx/1g5nXTl+U5cWH2TZaCJatp4GKA== + +"@swc/core-win32-arm64-msvc@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.76.tgz#34fb884d2ee2eec3382c01f712bde0f05e058a3b" + integrity sha512-+swEFtjdMezS0vKUhJC3psdSDtOJGY5pEOt4e8XOPvn7aQpKQ9LfF49XVtIwDSk5SGuWtVoLFzkSY3reWUJCyg== + +"@swc/core-win32-ia32-msvc@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.76.tgz#a0dc94357d72eca6572522ed1202b6476222c249" + integrity sha512-5CqwAykpGBJ3PqGLOlWGLGIPpBAG1IwWVDUfro3hhjQ7XJxV5Z1aQf5V5OJ90HJVtrEAVx2xx59UV/Dh081LOg== + +"@swc/core-win32-x64-msvc@1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.76.tgz#eea647407895a5a410a459b2abf8572adb147927" + integrity sha512-CiMpWLLlR3Cew9067E7XxaLBwYYJ90r9EhGSO6V1pvYSWj7ET/Ppmtj1ZhzPJMqRXAP6xflfl5R5o4ee1m4WLA== + +"@swc/core@^1.3.76": + version "1.3.76" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.76.tgz#f5259bd718e11854d9bd3a05f91f40bca21dffbc" + integrity sha512-aYYTA2aVYkwJAZepQXtPnkUthhOfn8qd6rsh+lrJxonFrjmpI7RHt2tMDVTXP6XDX7fvnvrVtT1bwZfmBFPh0Q== + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.76" + "@swc/core-darwin-x64" "1.3.76" + "@swc/core-linux-arm-gnueabihf" "1.3.76" + "@swc/core-linux-arm64-gnu" "1.3.76" + "@swc/core-linux-arm64-musl" "1.3.76" + "@swc/core-linux-x64-gnu" "1.3.76" + "@swc/core-linux-x64-musl" "1.3.76" + "@swc/core-win32-arm64-msvc" "1.3.76" + "@swc/core-win32-ia32-msvc" "1.3.76" + "@swc/core-win32-x64-msvc" "1.3.76" + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -1256,6 +287,14 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== +"@types/fs-extra@^11.0.1": + version "11.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" + integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== + dependencies: + "@types/jsonfile" "*" + "@types/node" "*" + "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -1269,7 +308,7 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.12" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== @@ -1279,6 +318,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jsonfile@*": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" + integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== + dependencies: + "@types/node" "*" + "@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" @@ -1596,13 +642,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -1717,31 +756,11 @@ arraybuffer.prototype.slice@^1.0.1: is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -assert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== - dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -1754,65 +773,11 @@ axios@^0.26.0: dependencies: follow-redirects "^1.14.8" -babel-loader@^8.2.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" - -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -1838,66 +803,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: +browserslist@^4.14.5: version "4.21.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== @@ -1912,19 +818,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -1951,16 +844,7 @@ caniuse-lite@^1.0.30001489: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001491.tgz#eab0e0f392de6f7411751d148de9b5bd6b203e46" integrity sha512-17EYIi4TLnPiTzVKMveIxU5ETlxbSO3B6iPvMbprqnKh4qJsQGk5Nh1Lp4jIMAE0XfrujsJuWZAM3oJdMHaKBA== -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: +chalk@4.1.2, chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1968,11 +852,6 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== - chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -1985,14 +864,6 @@ cidr-regex@^3.1.1: dependencies: ip-regex "^4.1.0" -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - clean-css@^5.2.2: version "5.3.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" @@ -2007,13 +878,6 @@ clean-webpack-plugin@^4.0.0: dependencies: del "^4.1.1" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -2021,16 +885,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.19: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + commander@11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" @@ -2051,11 +915,6 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2066,11 +925,6 @@ confusing-browser-globals@^1.0.10: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - copy-webpack-plugin@^10.0.0: version "10.2.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" @@ -2083,49 +937,11 @@ copy-webpack-plugin@^10.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== - dependencies: - browserslist "^4.21.5" - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - cross-env@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -2142,23 +958,6 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - css-loader@^6.7.1: version "6.8.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" @@ -2206,7 +1005,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2239,23 +1038,6 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2327,24 +1109,6 @@ electron-to-chromium@^1.4.411: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.414.tgz#f9eedb6fb01b50439d8228d8ee3a6fa5e0108437" integrity sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w== -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - enhanced-resolve@^5.14.1: version "5.14.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" @@ -2473,155 +1237,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== - -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - -esbuild-linux-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" - integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== - -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-register@^3.2.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.4.2.tgz#1e39ee0a77e8f320a9790e68c64c3559620b9175" - integrity sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q== - dependencies: - debug "^4.3.4" - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - -esbuild@^0.14.1: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" - integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== - optionalDependencies: - "@esbuild/linux-loong64" "0.14.54" - esbuild-android-64 "0.14.54" - esbuild-android-arm64 "0.14.54" - esbuild-darwin-64 "0.14.54" - esbuild-darwin-arm64 "0.14.54" - esbuild-freebsd-64 "0.14.54" - esbuild-freebsd-arm64 "0.14.54" - esbuild-linux-32 "0.14.54" - esbuild-linux-64 "0.14.54" - esbuild-linux-arm "0.14.54" - esbuild-linux-arm64 "0.14.54" - esbuild-linux-mips64le "0.14.54" - esbuild-linux-ppc64le "0.14.54" - esbuild-linux-riscv64 "0.14.54" - esbuild-linux-s390x "0.14.54" - esbuild-netbsd-64 "0.14.54" - esbuild-openbsd-64 "0.14.54" - esbuild-sunos-64 "0.14.54" - esbuild-windows-32 "0.14.54" - esbuild-windows-64 "0.14.54" - esbuild-windows-arm64 "0.14.54" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -2830,14 +1450,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -2895,23 +1507,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -2988,11 +1583,6 @@ functions-have-names@^1.2.2, functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -3042,11 +1632,6 @@ glob@^7.0.3, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^13.15.0, globals@^13.19.0: version "13.20.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" @@ -3123,11 +1708,6 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -3164,37 +1744,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - html-minifier-terser@^6.0.2: version "6.1.0" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" @@ -3234,11 +1788,6 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.1.9, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -3265,7 +1814,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: +inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3292,14 +1841,6 @@ ip6addr@0.2.3: assert-plus "^1.0.0" jsprim "^1.4.0" -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -3336,13 +1877,6 @@ is-cidr@4.0.2: dependencies: cidr-regex "^3.1.1" -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - is-core-module@^2.12.1, is-core-module@^2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" @@ -3350,6 +1884,13 @@ is-core-module@^2.12.1, is-core-module@^2.13.0: dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -3362,13 +1903,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -3383,14 +1917,6 @@ is-ip@3.1.0: dependencies: ip-regex "^4.0.0" -is-nan@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -3467,13 +1993,6 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" -is-typed-array@^1.1.3: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -3505,7 +2024,7 @@ js-sdsl@^4.1.4: resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -3525,16 +2044,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -3567,11 +2076,6 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -3612,22 +2116,6 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3635,11 +2123,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -3664,13 +2147,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -3683,22 +2159,6 @@ lru_map@0.4.1: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.4.1.tgz#f7b4046283c79fb7370c36f8fca6aee4324b0a98" integrity sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg== -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3717,14 +2177,6 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -3737,16 +2189,6 @@ mime-types@^2.1.27: dependencies: mime-db "1.52.0" -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3834,14 +2276,6 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -3921,13 +2355,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -3935,13 +2362,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -3954,11 +2374,6 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -3974,17 +2389,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" @@ -4023,17 +2427,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4066,12 +2459,10 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" +pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== playwright-core@1.34.3: version "1.34.3" @@ -4157,60 +2548,28 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - punycode@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -qs@^6.11.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - react-dom@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -4233,39 +2592,11 @@ react@^17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" -readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - regenerator-runtime@^0.13.11: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" - regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" @@ -4280,25 +2611,6 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -4325,15 +2637,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.14.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@^1.22.3, resolve@^1.22.4: version "1.22.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" @@ -4371,14 +2674,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4396,7 +2691,7 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4410,11 +2705,6 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -4423,15 +2713,6 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - schema-utils@^3.1.1, schema-utils@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" @@ -4451,7 +2732,7 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -4482,14 +2763,6 @@ serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4526,7 +2799,7 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@~0.5.20: +source-map-support@^0.5.21, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -4544,14 +2817,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -4593,13 +2858,6 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4622,13 +2880,6 @@ style-loader@^3.3.1: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -4648,6 +2899,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swc-loader@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.3.tgz#6792f1c2e4c9ae9bf9b933b3e010210e270c186d" + integrity sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A== + tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -4707,11 +2963,6 @@ tldts@^6.0.8: dependencies: tldts-core "^6.0.13" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4744,6 +2995,11 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== +tslib@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4810,29 +3066,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -4853,30 +3086,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" - integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== - dependencies: - punycode "^1.4.1" - qs "^6.11.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.0, util@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -4950,7 +3164,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2: +which-typed-array@^1.1.10: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -4990,11 +3204,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" diff --git a/packages/tsurlfilter/CHANGELOG.md b/packages/tsurlfilter/CHANGELOG.md index 6c50a2041..6e2cb6412 100644 --- a/packages/tsurlfilter/CHANGELOG.md +++ b/packages/tsurlfilter/CHANGELOG.md @@ -8,12 +8,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 -## UNRELEASED +## [2.1.7] - 2023-08-10 ### Added - Support for `$to` modifier in the MV3 converter. - Support for `$method` modifier in the MV3 converter. +### Changed +- Replace the `ip6addr` and `netmask` dependencies with the platform-independent `cidr-tool'. +- Remove Node Api polyfills from the bundle. + ### Fixed - Bad conversion of `allowAllRequests` rules. diff --git a/packages/tsurlfilter/jest.config.ts b/packages/tsurlfilter/jest.config.ts index 22caffa2a..27c8c1f5c 100644 --- a/packages/tsurlfilter/jest.config.ts +++ b/packages/tsurlfilter/jest.config.ts @@ -1,9 +1,16 @@ import type { Config } from 'jest'; +const transformedModules = [ + 'cidr-tools', +]; + const config: Config = { transform: { - '.ts': '@swc/jest', + '.+\\.(js|ts)': '@swc/jest', }, + transformIgnorePatterns: [ + `/node_modules/(?!(${transformedModules.join('|')}))/`, + ], testEnvironment: 'node', testRegex: '(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$', moduleFileExtensions: ['js', 'ts'], diff --git a/packages/tsurlfilter/package.json b/packages/tsurlfilter/package.json index 0e865c118..95e0f4e4b 100644 --- a/packages/tsurlfilter/package.json +++ b/packages/tsurlfilter/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/tsurlfilter", - "version": "2.1.6", + "version": "2.1.7", "description": "This is a TypeScript library that implements AdGuard's content blocking rules", "main": "dist/es/index.js", "module": "dist/es/index.js", @@ -86,12 +86,11 @@ }, "dependencies": { "@adguard/scriptlets": "^1.9.62", + "cidr-tools": "^6.4.1", "commander": "9.4.1", - "ip6addr": "0.2.3", "is-cidr": "4.0.2", "is-ip": "3.1.0", "lru_map": "0.4.1", - "netmask": "2.0.2", "punycode": "2.1.1", "tldts": "5.6.45", "zod": "3.19.1" @@ -101,8 +100,8 @@ "@rollup/plugin-json": "4.1.0", "@rollup/plugin-node-resolve": "13.3.0", "@rollup/plugin-typescript": "8.3.4", - "@swc/core": "^1.3.27", - "@swc/jest": "^0.2.24", + "@swc/core": "^1.3.75", + "@swc/jest": "^0.2.28", "@types/ip6addr": "0.2.3", "@types/jest": "28.1.6", "@types/netmask": "1.0.30", @@ -124,7 +123,6 @@ "rollup": "2.77.3", "rollup-plugin-cleanup": "3.2.1", "rollup-plugin-node-globals": "1.4.0", - "rollup-plugin-polyfill-node": "0.10.2", "rollup-plugin-preserve-shebangs": "0.2.0", "rollup-plugin-terser": "7.0.2", "ts-node": "^10.9.1", diff --git a/packages/tsurlfilter/rollup.config.ts b/packages/tsurlfilter/rollup.config.ts index e7c35894c..68dfa88fa 100644 --- a/packages/tsurlfilter/rollup.config.ts +++ b/packages/tsurlfilter/rollup.config.ts @@ -4,7 +4,6 @@ import globals from 'rollup-plugin-node-globals'; import camelCase from 'lodash/camelCase'; import typescript from '@rollup/plugin-typescript'; import json from '@rollup/plugin-json'; -import nodePolyfills from 'rollup-plugin-polyfill-node'; import cleanup from 'rollup-plugin-cleanup'; import { terser } from 'rollup-plugin-terser'; import { preserveShebangs } from 'rollup-plugin-preserve-shebangs'; @@ -32,7 +31,6 @@ const commonConfig = { sourceMap: false, }), globals(), - nodePolyfills(), // Allow node_modules resolution, so you can use 'external' to control // which external modules to include in the bundle @@ -51,8 +49,7 @@ const commonExternal = [ 'punycode/', 'tldts', 'is-cidr', - 'netmask', - 'ip6addr', + 'cidr-tools', 'zod', 'commander', ]; @@ -131,7 +128,7 @@ const cliConfig = { external: [ 'fs', 'path', - ...commonExternal, + 'commander', ], plugins: [ // Allow json resolution @@ -140,6 +137,16 @@ const cliConfig = { // Compile TypeScript files typescript(), + // Allow bundling cjs modules (unlike webpack, rollup doesn't understand cjs) + commonjs({ + sourceMap: false, + }), + + // Allow node_modules resolution, so you can use 'external' to control + // which external modules to include in the bundle + // https://github.com/rollup/rollup-plugin-node-resolve#usage + resolve({ preferBuiltins: false }), + cleanup({ comments: ['srcmaps'], }), diff --git a/packages/tsurlfilter/src/modifiers/dns/client-modifier.ts b/packages/tsurlfilter/src/modifiers/dns/client-modifier.ts index a8d2e8835..efa92ad8b 100644 --- a/packages/tsurlfilter/src/modifiers/dns/client-modifier.ts +++ b/packages/tsurlfilter/src/modifiers/dns/client-modifier.ts @@ -1,17 +1,16 @@ // eslint-disable-next-line max-classes-per-file import isCidr from 'is-cidr'; import isIp from 'is-ip'; -import { Netmask } from 'netmask'; -import { CIDR, createCIDR } from 'ip6addr'; +import { contains } from 'cidr-tools'; import { BaseValuesModifier } from '../values-modifier'; /** * Netmasks class */ class NetmasksCollection { - ipv4Masks: Netmask[] = []; + ipv4Masks: string[] = []; - ipv6Masks: CIDR[] = []; + ipv6Masks: string[] = []; /** * Returns true if any of the containing masks contains provided value @@ -20,10 +19,10 @@ class NetmasksCollection { */ contains(value: string): boolean { if (isIp.v4(value)) { - return this.ipv4Masks.some((x) => x.contains(value)); + return this.ipv4Masks.some((x) => contains(x, value)); } - return this.ipv6Masks.some((x) => x.contains(value)); + return this.ipv6Masks.some((x) => contains(x, value)); } } @@ -131,9 +130,9 @@ export class ClientModifier extends BaseValuesModifier { values.forEach((x) => { const cidrVersion = isCidr(x); if (cidrVersion === 4) { - result.ipv4Masks.push(new Netmask(x)); + result.ipv4Masks.push(x); } else if (cidrVersion === 6) { - result.ipv6Masks.push(createCIDR(x)); + result.ipv6Masks.push(x); } }); diff --git a/packages/tsurlfilter/yarn.lock b/packages/tsurlfilter/yarn.lock index 982c48201..333e67458 100644 --- a/packages/tsurlfilter/yarn.lock +++ b/packages/tsurlfilter/yarn.lock @@ -689,15 +689,6 @@ magic-string "^0.25.7" resolve "^1.17.0" -"@rollup/plugin-inject@^4.0.0": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz#fbeee66e9a700782c4f65c8b0edbafe58678fbc2" - integrity sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ== - dependencies: - "@rollup/pluginutils" "^3.1.0" - estree-walker "^2.0.1" - magic-string "^0.25.7" - "@rollup/plugin-json@4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" @@ -758,76 +749,76 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@swc/core-darwin-arm64@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.61.tgz#5935e76df79596deac71a98afbbfe82d0a8e03ab" - integrity sha512-Ra1CZIYYyIp/Y64VcKyaLjIPUwT83JmGduvHu8vhUZOvWV4dWL4s5DrcxQVaQJjjb7Z2N/IUYYS55US1TGnxZw== - -"@swc/core-darwin-x64@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.61.tgz#14883499c59457a8a3f114f0f94004a37c743866" - integrity sha512-LUia75UByUFkYH1Ddw7IE0X9usNVGJ7aL6+cgOTju7P0dsU0f8h/OGc/GDfp1E4qnKxDCJE+GwDRLoi4SjIxpg== - -"@swc/core-linux-arm-gnueabihf@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.61.tgz#3b9b2ad3d1387ef12372f4fc9821e760b9ac36a2" - integrity sha512-aalPlicYxHAn2PxNlo3JFEZkMXzCtUwjP27AgMqnfV4cSz7Omo56OtC+413e/kGyCH86Er9gJRQQsxNKP8Qbsg== - -"@swc/core-linux-arm64-gnu@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.61.tgz#8d0ccdc2e45c0f8f4e270b5d144aeb3921ce5ed3" - integrity sha512-9hGdsbQrYNPo1c7YzWF57yl17bsIuuEQi3I1fOFSv3puL3l5M/C/oCD0Bz6IdKh6mEDC5UNJE4LWtV1gFA995A== - -"@swc/core-linux-arm64-musl@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.61.tgz#6983481a0e15fbc8ce60c536de82e39b8669d7c5" - integrity sha512-mVmcNfFQRP4SYbGC08IPB3B9Xox+VpGIQqA3Qg7LMCcejLAQLi4Lfe8CDvvBPlQzXHso0Cv+BicJnQVKs8JLOA== - -"@swc/core-linux-x64-gnu@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.61.tgz#9fe55668d1eccbce2739134d4a15436f4c17aba8" - integrity sha512-ZkRHs7GEikN6JiVL1/stvq9BVHKrSKoRn9ulVK2hMr+mAGNOKm3Y06NSzOO+BWwMaFOgnO2dWlszCUICsQ0kpg== - -"@swc/core-linux-x64-musl@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.61.tgz#5729aa85b039d40aa642867b520fdc96267e2aa4" - integrity sha512-zK7VqQ5JlK20+7fxI4AgvIUckeZyX0XIbliGXNMR3i+39SJq1vs9scYEmq8VnAfvNdMU5BG+DewbFJlMfCtkxQ== - -"@swc/core-win32-arm64-msvc@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.61.tgz#1e8f343b67e9c69aa55f8a3c19539f632be76b3f" - integrity sha512-e9kVVPk5iVNhO41TvLvcExDHn5iATQ5/M4U7/CdcC7s0fK19TKSEUqkdoTLIJvHBFhgR7w3JJSErfnauO0xXoA== - -"@swc/core-win32-ia32-msvc@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.61.tgz#e560de48ef13bebd9e7bc35c19c2c40e5a2d3d4b" - integrity sha512-7cJULfa6HvKqvFh6M/f7mKiNRhE2AjgFUCZfdOuy5r8vbtpk+qBK94TXwaDjJYDUGKzDVZw/tJ1eN4Y9n9Ls/Q== - -"@swc/core-win32-x64-msvc@1.3.61": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.61.tgz#07b75b5af65afd207c96ef5503e44767fe0239f5" - integrity sha512-Jx8S+21WcKF/wlhW+sYpystWUyymDTEsbBpOgBRpXZelakVcNBCIIYSZOKW/A9PwWTpu6S8yvbs9nUOzKiVPqA== - -"@swc/core@^1.3.27": - version "1.3.61" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.61.tgz#b526d6ca3f98f703d1d7f3e61c08da6da2ed3f17" - integrity sha512-p58Ltdjo7Yy8CU3zK0cp4/eAgy5qkHs35znGedqVGPiA67cuYZM63DuTfmyrOntMRwQnaFkMLklDAPCizDdDng== +"@swc/core-darwin-arm64@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.75.tgz#f6b2fb9dd03839ff3153902e09f1772963a1bbb6" + integrity sha512-anDnx9L465lGbjB2mvcV54NGHW6illr0IDvVV7JmkabYUVneaRdQvTr0tbHv3xjHnjrK1wuwVOHKV0LcQF2tnQ== + +"@swc/core-darwin-x64@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.75.tgz#b5a4fcc668f15fe664c9bdddac12b7c0685e6c81" + integrity sha512-dIHDfrLmeZfr2xwi1whO7AmzdI3HdamgvxthaL+S8L1x8TeczAZEvsmZTjy3s8p3Va4rbGXcb3+uBhmfkqCbfw== + +"@swc/core-linux-arm-gnueabihf@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.75.tgz#a4b19babc256390790b50d75dd300a3201275f9f" + integrity sha512-qeJmvMGrjC6xt+G0R4kVqqxvlhxJx7tTzhcEoWgLJnfvGZiF6SJdsef4OSM7HuReXrlBoEtJbfGPrLJtbV+C0w== + +"@swc/core-linux-arm64-gnu@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.75.tgz#347e44d12a3fd71e9fc109b68a7fff81696ecbc3" + integrity sha512-sqA9JqHEJBF4AdNuwo5zRqq0HC3l31SPsG9zpRa4nRzG5daBBJ80H7fi6PZQud1rfNNq+Q08gjYrdrxwHstvjw== + +"@swc/core-linux-arm64-musl@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.75.tgz#ca21e597ff52c0a25848be1838cd923a32963584" + integrity sha512-95rQT5xTAL3eKhMJbJbLsZHHP9EUlh1rcrFoLf0gUApoVF8g94QjZ9hYZiI72mMP5WPjgTEXQVnVB9O2GxeaLw== + +"@swc/core-linux-x64-gnu@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.75.tgz#56abe19475a72bdc5333461b55ca3c2cd60e4611" + integrity sha512-If7UpAhnPduMmtC+TSgPpZ1UXZfp2hIpjUFxpeCmHHYLS6Fn/2GZC5hpEiu+wvFJF0hzPh93eNAHa9gUxGUG+w== + +"@swc/core-linux-x64-musl@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.75.tgz#bfa90d24071930effeb4514540f89266a6d6957a" + integrity sha512-HOhxX0YNHTElCZqIviquka3CGYTN8rSQ6BdFfSk/K0O+ZEHx3qGte0qr+gGLPF/237GxreUkp3OMaWKuURtuCg== + +"@swc/core-win32-arm64-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.75.tgz#2fd8ea75ffe1a9153c523b6135b7169266a60e54" + integrity sha512-7QPI+mvBXAerVfWahrgBNe+g7fK8PuetxFnZSEmXUcDXvWcdJXAndD7GjAJzbDyjQpLKHbsDKMiHYvfNxZoN/A== + +"@swc/core-win32-ia32-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.75.tgz#9dae46582027ffeb03f258d05ab797701250d465" + integrity sha512-EfABCy4Wlq7O5ShWsm32FgDkSjyeyj/SQ4wnUIvWpkXhgfT1iNXky7KRU1HtX+SmnVk/k/NnabVZpIklYbjtZA== + +"@swc/core-win32-x64-msvc@1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.75.tgz#c8e6d30c5deed1ae0fa162a42d6d9ef165b8041f" + integrity sha512-cTvP0pOD9C3pSp1cwtt85ZsrUkQz8RZfSPhM+jCGxKxmoowDCnInoOQ4Ica/ehyuUnQ4/IstSdYtYpO5yzPDJg== + +"@swc/core@^1.3.75": + version "1.3.75" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.75.tgz#b06d32144a5be0b7b25dbbff09dcd1ab18e48b67" + integrity sha512-YLqd5oZVnaOq/OzkjRSsJUQqAfKYiD0fzUyVUPVlNNCoQEfVfSMcXH80hLmYe9aDH0T/a7qEMjWyIr/0kWqy1A== optionalDependencies: - "@swc/core-darwin-arm64" "1.3.61" - "@swc/core-darwin-x64" "1.3.61" - "@swc/core-linux-arm-gnueabihf" "1.3.61" - "@swc/core-linux-arm64-gnu" "1.3.61" - "@swc/core-linux-arm64-musl" "1.3.61" - "@swc/core-linux-x64-gnu" "1.3.61" - "@swc/core-linux-x64-musl" "1.3.61" - "@swc/core-win32-arm64-msvc" "1.3.61" - "@swc/core-win32-ia32-msvc" "1.3.61" - "@swc/core-win32-x64-msvc" "1.3.61" - -"@swc/jest@^0.2.24": - version "0.2.26" - resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.26.tgz#6ef2d6d31869e3aaddc132603bc21f2e4c57cc5d" - integrity sha512-7lAi7q7ShTO3E5Gt1Xqf3pIhRbERxR1DUxvtVa9WKzIB+HGQ7wZP5sYx86zqnaEoKKGhmOoZ7gyW0IRu8Br5+A== + "@swc/core-darwin-arm64" "1.3.75" + "@swc/core-darwin-x64" "1.3.75" + "@swc/core-linux-arm-gnueabihf" "1.3.75" + "@swc/core-linux-arm64-gnu" "1.3.75" + "@swc/core-linux-arm64-musl" "1.3.75" + "@swc/core-linux-x64-gnu" "1.3.75" + "@swc/core-linux-x64-musl" "1.3.75" + "@swc/core-win32-arm64-msvc" "1.3.75" + "@swc/core-win32-ia32-msvc" "1.3.75" + "@swc/core-win32-x64-msvc" "1.3.75" + +"@swc/jest@^0.2.28": + version "0.2.28" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.28.tgz#cf21200a6058ab0dd2555b3ee1164d149bd8534b" + integrity sha512-iCB3lvngkQldLga35krb8LPa+6gmkVXnlpfCTXOAgMaEYFagLxOIFbIO8II7dhHa8ApOv5ap8iFRETI4lVY0vw== dependencies: "@jest/create-cache-key-function" "^27.4.2" jsonc-parser "^3.2.0" @@ -1449,6 +1440,13 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== +cidr-regex@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-4.0.3.tgz#07b52c9762d1ff546a50740e92fc2b5b13a6d871" + integrity sha512-HOwDIy/rhKeMf6uOzxtv7FAbrz8zPjmVKfSpM+U7/bNBXC5rtOyr758jxcptiSx6ZZn5LOhPJT5WWxPAGDV8dw== + dependencies: + ip-regex "^5.0.0" + cidr-regex@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" @@ -1456,6 +1454,16 @@ cidr-regex@^3.1.1: dependencies: ip-regex "^4.1.0" +cidr-tools@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/cidr-tools/-/cidr-tools-6.4.1.tgz#ec0f286dd54bb00e90b5b28628fb7fb5e1c5ec61" + integrity sha512-s8JNDwWgc2e0roEF6KDkQfHkZgEnehoap5hK7swPlEQMb9f8msrWqpgVCVKiDm3ARxpesOru9Tu49N8UpJjmDA== + dependencies: + cidr-regex "4.0.3" + ip-bigint "7.2.1" + ip-regex "5.0.0" + string-natural-compare "3.0.1" + cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" @@ -2507,19 +2515,21 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +ip-bigint@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/ip-bigint/-/ip-bigint-7.2.1.tgz#f9fdce58b1f88c8e97e39f5c646200873bd75228" + integrity sha512-AftDIrlM5ZQM+qQ31IQ5MsL3tJWleeN3r0VqhmkB9oLvwcaDLeLNPtX4d9hahzExTFtz69eRv6LsGAoH20/8/g== + +ip-regex@5.0.0, ip-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-5.0.0.tgz#cd313b2ae9c80c07bd3851e12bf4fa4dc5480632" + integrity sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw== + ip-regex@^4.0.0, ip-regex@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip6addr@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ip6addr/-/ip6addr-0.2.3.tgz#660df0d27092434f0aadee025aba8337c6d7d4d4" - integrity sha512-qA9DXRAUW+lT47/i/4+Q3GHPwZjGt/atby1FH/THN6GVATA6+Pjp2nztH7k6iKeil7hzYnBwfSsxjthlJ8lJKw== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.4.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" @@ -3240,7 +3250,7 @@ jsonc-parser@^3.0.0, jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== -jsprim@^1.2.2, jsprim@^1.4.0: +jsprim@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== @@ -3496,11 +3506,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -netmask@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" - integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -3935,13 +3940,6 @@ rollup-plugin-node-globals@1.4.0: process-es6 "^0.11.6" rollup-pluginutils "^2.3.1" -rollup-plugin-polyfill-node@0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.10.2.tgz#b2128646851fcb9475ddfd5bc22ca1a8c568738d" - integrity sha512-5GMywXiLiuQP6ZzED/LO/Q0HyDi2W6b8VN+Zd3oB0opIjyRs494Me2ZMaqKWDNbGiW4jvvzl6L2n4zRgxS9cSQ== - dependencies: - "@rollup/plugin-inject" "^4.0.0" - rollup-plugin-preserve-shebangs@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rollup-plugin-preserve-shebangs/-/rollup-plugin-preserve-shebangs-0.2.0.tgz#e48894c1f68c6fd54b0de10bd26906224d5dc7cd" @@ -4193,6 +4191,11 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-natural-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" diff --git a/packages/tswebextension/CHANGELOG.md b/packages/tswebextension/CHANGELOG.md index 5cd9eda13..d46ef8c61 100644 --- a/packages/tswebextension/CHANGELOG.md +++ b/packages/tswebextension/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 +## [0.3.9] - 2023-08-10 + +### Changed +- Updated `@adguard/tsurlfilter` to `v2.1.7`. + + ## [0.3.8] - 2023-08-04 ### Changed diff --git a/packages/tswebextension/package.json b/packages/tswebextension/package.json index 6f706cd42..7b664c5f6 100644 --- a/packages/tswebextension/package.json +++ b/packages/tswebextension/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/tswebextension", - "version": "0.3.8", + "version": "0.3.9", "description": "This is a TypeScript library that implements AdGuard's extension API", "main": "dist/index.js", "typings": "dist/types/lib/mv2/background/index.d.ts", @@ -84,7 +84,7 @@ "@adguard/assistant": "^4.3.70", "@adguard/extended-css": "^2.0.52", "@adguard/scriptlets": "^1.9.62", - "@adguard/tsurlfilter": "^2.1.6", + "@adguard/tsurlfilter": "^2.1.7", "bowser": "2.11.0", "commander": "11.0.0", "fs-extra": "11.1.1", diff --git a/packages/tswebextension/rollup.config.ts b/packages/tswebextension/rollup.config.ts index 66ceff2d8..09c6c5bbe 100644 --- a/packages/tswebextension/rollup.config.ts +++ b/packages/tswebextension/rollup.config.ts @@ -141,9 +141,6 @@ const backgroundMv3Config = { 'deepmerge', 'tldts', 'webextension-polyfill', - 'util', - 'assert', - 'stream', ], plugins: [ ...commonPlugins, diff --git a/packages/tswebextension/yarn.lock b/packages/tswebextension/yarn.lock index 9cd8b32f8..a413fd870 100644 --- a/packages/tswebextension/yarn.lock +++ b/packages/tswebextension/yarn.lock @@ -12,10 +12,10 @@ resolved "https://registry.yarnpkg.com/@adguard/extended-css/-/extended-css-2.0.52.tgz#f5e7c3df1796deb96404a1b6441e7a4c729f09ac" integrity sha512-T77MnFD/+A3q93MNEq13qPUXPQRBeOUO9LRyqslcaz7jD5qMcikX1nx436u3PXdZXZpa6R0nnwXQ7wwScDmVgw== -"@adguard/scriptlets@^1.9.57": - version "1.9.57" - resolved "https://registry.yarnpkg.com/@adguard/scriptlets/-/scriptlets-1.9.57.tgz#186d611f4ee9315f01588c15a7d2ed11b2e8036e" - integrity sha512-CvQmszEnEjgrK68JOJ+cLRf3IFoN8tmF6e7yzJpEnSJvyopZH1e10R8bT8FjE+WtBeUyjrVs8jVMuGGa7RRfGg== +"@adguard/scriptlets@^1.9.62": + version "1.9.62" + resolved "https://registry.yarnpkg.com/@adguard/scriptlets/-/scriptlets-1.9.62.tgz#f60b83bb928c160f59153989c9491504e510498b" + integrity sha512-uWSlfMnAJUmIVsChl7KrECBXDJotSfq/N94iNLtfwnJI7br9Q5Gl65iuH89rh0Fs62OwexKlj3cnrzHL4TEFyw== dependencies: "@babel/runtime" "^7.20.13" js-yaml "^3.13.1"